PageSourceSearch

https://www.carsofchichester.co.uk/dist/js/app.js?v=1791540574128.1787561162

js carsofchichester.co.uk collected 2026-10-09 22:20:11 UTC 558,560 bytes, 5,763 lines download raw bytes

1'use strict';
2
3var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4
5var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
6
7function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8
9!function ($) {
10
11  "use strict";
12
13  var FOUNDATION_VERSION = '6.3.1';
14
15  // Global Foundation object
16  // This is attached to the window, or used as a module for AMD/Browserify
17  var Foundation = {
18    version: FOUNDATION_VERSION,
19
20    /**
21     * Stores initialized plugins.
22     */
23    _plugins: {},
24
25    /**
26     * Stores generated unique ids for plugin instances
27     */
28    _uuids: [],
29
30    /**
31     * Returns a boolean for RTL support
32     */
33    rtl: function rtl() {
34      return $('html').attr('dir') === 'rtl';
35    },
36    /**
37     * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing.
38     * @param {Object} plugin - The constructor of the plugin.
39     */
40    plugin: function plugin(_plugin, name) {
41      // Object key to use when adding to global Foundation object
42      // Examples: Foundation.Reveal, Foundation.OffCanvas
43      var className = name || functionName(_plugin);
44      // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin
45      // Examples: data-reveal, data-off-canvas
46      var attrName = hyphenate(className);
47
48      // Add to the Foundation object and the plugins list (for reflowing)
49      this._plugins[attrName] = this[className] = _plugin;
50    },
51    /**
52     * @function
53     * Populates the _uuids array with pointers to each individual plugin instance.
54     * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls.
55     * Also fires the initialization event for each plugin, consolidating repetitive code.
56     * @param {Object} plugin - an instance of a plugin, usually `this` in context.
57     * @param {String} name - the name of the plugin, passed as a camelCased string.
58     * @fires Plugin#init
59     */
60    registerPlugin: function registerPlugin(plugin, name) {
61      var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase();
62      plugin.uuid = this.GetYoDigits(6, pluginName);
63
64      if (!plugin.$element.attr('data-' + pluginName)) {
65        plugin.$element.attr('data-' + pluginName, plugin.uuid);
66      }
67      if (!plugin.$element.data('zfPlugin')) {
68        plugin.$element.data('zfPlugin', plugin);
69      }
70      /**
71       * Fires when the plugin has initialized.
72       * @event Plugin#init
73       */
74      plugin.$element.trigger('init.zf.' + pluginName);
75
76      this._uuids.push(plugin.uuid);
77
78      return;
79    },
80    /**
81     * @function
82     * Removes the plugins uuid from the _uuids array.
83     * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute.
84     * Also fires the destroyed event for the plugin, consolidating repetitive code.
85     * @param {Object} plugin - an instance of a plugin, usually `this` in context.
86     * @fires Plugin#destroyed
87     */
88    unregisterPlugin: function unregisterPlugin(plugin) {
89      var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor));
90
91      this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1);
92      plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin')
93      /**
94       * Fires when the plugin has been destroyed.
95       * @event Plugin#destroyed
96       */
97      .trigger('destroyed.zf.' + pluginName);
98      for (var prop in plugin) {
99        plugin[prop] = null; //clean up script to prep for garbage collection.
100      }
101      return;
102    },
103
104    /**
105     * @function
106     * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc.
107     * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'`
108     * @default If no argument is passed, reflow all currently active plugins.
109     */
110    reInit: function reInit(plugins) {
111      var isJQ = plugins instanceof $;
112      try {
113        if (isJQ) {
114          plugins.each(function () {
115            $(this).data('zfPlugin')._init();
116          });
117        } else {
118          var type = typeof plugins === 'undefined' ? 'undefined' : _typeof(plugins),
119              _this = this,
120              fns = {
121            'object': function object(plgs) {
122              plgs.forEach(function (p) {
123                p = hyphenate(p);
124                $('[data-' + p + ']').foundation('_init');
125              });
126            },
127            'string': function string() {
128              plugins = hyphenate(plugins);
129              $('[data-' + plugins + ']').foundation('_init');
130            },
131            'undefined': function undefined() {
132              this['object'](Object.keys(_this._plugins));
133            }
134          };
135          fns[type](plugins);
136        }
137      } catch (err) {
138        console.error(err);
139      } finally {
140        return plugins;
141      }
142    },
143
144    /**
145     * returns a random base-36 uid with namespacing
146     * @function
147     * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.
148     * @param {String} namespace - name of plugin to be incorporated in uid, optional.
149     * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.
150     * @returns {String} - unique id
151     */
152    GetYoDigits: function GetYoDigits(length, namespace) {
153      length = length || 6;
154      return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : '');
155    },
156    /**
157     * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized.
158     * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object.
159     * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything.
160     */
161    reflow: function reflow(elem, plugins) {
162
163      // If plugins is undefined, just grab everything
164      if (typeof plugins === 'undefined') {
165        plugins = Object.keys(this._plugins);
166      }
167      // If plugins is a string, convert it to an array with one item
168      else if (typeof plugins === 'string') {
169          plugins = [plugins];
170        }
171
172      var _this = this;
173
174      // Iterate through each plugin
175      $.each(plugins, function (i, name) {
176        // Get the current plugin
177        var plugin = _this._plugins[name];
178
179        // Localize the search to all elements inside elem, as well as elem itself, unless elem === document
180        var $elem = $(elem).find('[data-' + name + ']').addBack('[data-' + name + ']');
181
182        // For each plugin found, initialize it
183        $elem.each(function () {
184          var $el = $(this),
185              opts = {};
186          // Don't double-dip on plugins
187          if ($el.data('zfPlugin')) {
188            console.warn("Tried to initialize " + name + " on an element that already has a Foundation plugin.");
189            return;
190          }
191
192          if ($el.attr('data-options')) {
193            var thing = $el.attr('data-options').split(';').forEach(function (e, i) {
194              var opt = e.split(':').map(function (el) {
195                return el.trim();
196              });
197              if (opt[0]) opts[opt[0]] = parseValue(opt[1]);
198            });
199          }
200          try {
201            $el.data('zfPlugin', new plugin($(this), opts));
202          } catch (er) {
203            console.error(er);
204          } finally {
205            return;
206          }
207        });
208      });
209    },
210    getFnName: functionName,
211    transitionend: function transitionend($elem) {
212      var transitions = {
213        'transition': 'transitionend',
214        'WebkitTransition': 'webkitTransitionEnd',
215        'MozTransition': 'transitionend',
216        'OTransition': 'otransitionend'
217      };
218      var elem = document.createElement('div'),
219          end;
220
221      for (var t in transitions) {
222        if (typeof elem.style[t] !== 'undefined') {
223          end = transitions[t];
224        }
225      }
226      if (end) {
227        return end;
228      } else {
229        end = setTimeout(function () {
230          $elem.triggerHandler('transitionend', [$elem]);
231        }, 1);
232        return 'transitionend';
233      }
234    }
235  };
236
237  Foundation.util = {
238    /**
239     * Function for applying a debounce effect to a function call.
240     * @function
241     * @param {Function} func - Function to be called at end of timeout.
242     * @param {Number} delay - Time in ms to delay the call of `func`.
243     * @returns function
244     */
245    throttle: function throttle(func, delay) {
246      var timer = null;
247
248      return function () {
249        var context = this,
250            args = arguments;
251
252        if (timer === null) {
253          timer = setTimeout(function () {
254            func.apply(context, args);
255            timer = null;
256          }, delay);
257        }
258      };
259    }
260  };
261
262  // TODO: consider not making this a jQuery function
263  // TODO: need way to reflow vs. re-initialize
264  /**
265   * The Foundation jQuery method.
266   * @param {String|Array} method - An action to perform on the current jQuery object.
267   */
268  var foundation = function foundation(method) {
269    var type = typeof method === 'undefined' ? 'undefined' : _typeof(method),
270        $meta = $('meta.foundation-mq'),
271        $noJS = $('.no-js');
272
273    if (!$meta.length) {
274      $('<meta class="foundation-mq">').appendTo(document.head);
275    }
276    if ($noJS.length) {
277      $noJS.removeClass('no-js');
278    }
279
280    if (type === 'undefined') {
281      //needs to initialize the Foundation object, or an individual plugin.
282      Foundation.MediaQuery._init();
283      Foundation.reflow(this);
284    } else if (type === 'string') {
285      //an individual method to invoke on a plugin or group of plugins
286      var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary
287      var plugClass = this.data('zfPlugin'); //determine the class of plugin
288
289      if (plugClass !== undefined && plugClass[method] !== undefined) {
290        //make sure both the class and method exist
291        if (this.length === 1) {
292          //if there's only one, call it directly.
293          plugClass[method].apply(plugClass, args);
294        } else {
295          this.each(function (i, el) {
296            //otherwise loop through the jQuery collection and invoke the method on each
297            plugClass[method].apply($(el).data('zfPlugin'), args);
298          });
299        }
300      } else {
301        //error for no class or no method
302        throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.');
303      }
304    } else {
305      //error for invalid argument type
306      throw new TypeError('We\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.');
307    }
308    return this;
309  };
310
311  window.Foundation = Foundation;
312  $.fn.foundation = foundation;
313
314  // Polyfill for requestAnimationFrame
315  (function () {
316    if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () {
317      return new Date().getTime();
318    };
319
320    var vendors = ['webkit', 'moz'];
321    for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
322      var vp = vendors[i];
323      window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];
324      window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
325    }
326    if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
327      var lastTime = 0;
328      window.requestAnimationFrame = function (callback) {
329        var now = Date.now();
330        var nextTime = Math.max(lastTime + 16, now);
331        return setTimeout(function () {
332          callback(lastTime = nextTime);
333        }, nextTime - now);
334      };
335      window.cancelAnimationFrame = clearTimeout;
336    }
337    /**
338     * Polyfill for performance.now, required by rAF
339     */
340    if (!window.performance || !window.performance.now) {
341      window.performance = {
342        start: Date.now(),
343        now: function now() {
344          return Date.now() - this.start;
345        }
346      };
347    }
348  })();
349  if (!Function.prototype.bind) {
350    Function.prototype.bind = function (oThis) {
351      if (typeof this !== 'function') {
352        // closest thing possible to the ECMAScript 5
353        // internal IsCallable function
354        throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
355      }
356
357      var aArgs = Array.prototype.slice.call(arguments, 1),
358          fToBind = this,
359          fNOP = function fNOP() {},
360          fBound = function fBound() {
361        return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
362      };
363
364      if (this.prototype) {
365        // native functions don't have a prototype
366        fNOP.prototype = this.prototype;
367      }
368      fBound.prototype = new fNOP();
369
370      return fBound;
371    };
372  }
373  // Polyfill to get the name of a function in IE9
374  function functionName(fn) {
375    if (Function.prototype.name === undefined) {
376      var funcNameRegex = /function\s([^(]{1,})\(/;
377      var results = funcNameRegex.exec(fn.toString());
378      return results && results.length > 1 ? results[1].trim() : "";
379    } else if (fn.prototype === undefined) {
380      return fn.constructor.name;
381    } else {
382      return fn.prototype.constructor.name;
383    }
384  }
385  function parseValue(str) {
386    if ('true' === str) return true;else if ('false' === str) return false;else if (!isNaN(str * 1)) return parseFloat(str);
387    return str;
388  }
389  // Convert PascalCase to kebab-case
390  // Thank you: http://stackoverflow.com/a/8955580
391  function hyphenate(str) {
392    return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
393  }
394}(jQuery);
395
396'use strict';
397
398!function ($) {
399
400  Foundation.Box = {
401    ImNotTouchingYou: ImNotTouchingYou,
402    GetDimensions: GetDimensions,
403    GetOffsets: GetOffsets
404
405    /**
406     * Compares the dimensions of an element to a container and determines collision events with container.
407     * @function
408     * @param {jQuery} element - jQuery object to test for collisions.
409     * @param {jQuery}
409 parent - jQuery object to use as bounding container.
410     * @param {Boolean} lrOnly - set to true to check left and right values only.
411     * @param {Boolean} tbOnly - set to true to check top and bottom values only.
412     * @default if no parent object passed, detects collisions with `window`.
413     * @returns {Boolean} - true if collision free, false if a collision in any direction.
414     */
415  };function ImNotTouchingYou(element, parent, lrOnly, tbOnly) {
416    var eleDims = GetDimensions(element),
417        top,
418        bottom,
419        left,
420        right;
421
422    if (parent) {
423      var parDims = GetDimensions(parent);
424
425      bottom = eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top;
426      top = eleDims.offset.top >= parDims.offset.top;
427      left = eleDims.offset.left >= parDims.offset.left;
428      right = eleDims.offset.left + eleDims.width <= parDims.width + parDims.offset.left;
429    } else {
430      bottom = eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top;
431      top = eleDims.offset.top >= eleDims.windowDims.offset.top;
432      left = eleDims.offset.left >= eleDims.windowDims.offset.left;
433      right = eleDims.offset.left + eleDims.width <= eleDims.windowDims.width;
434    }
435
436    var allDirs = [bottom, top, left, right];
437
438    if (lrOnly) {
439      return left === right === true;
440    }
441
442    if (tbOnly) {
443      return top === bottom === true;
444    }
445
446    return allDirs.indexOf(false) === -1;
447  };
448
449  /**
450   * Uses native methods to return an object of dimension values.
451   * @function
452   * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window.
453   * @returns {Object} - nested object of integer pixel values
454   * TODO - if element is window, return only those values.
455   */
456  function GetDimensions(elem, test) {
457    elem = elem.length ? elem[0] : elem;
458
459    if (elem === window || elem === document) {
460      throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");
461    }
462
463    var rect = elem.getBoundingClientRect(),
464        parRect = elem.parentNode.getBoundingClientRect(),
465        winRect = document.body.getBoundingClientRect(),
466        winY = window.pageYOffset,
467        winX = window.pageXOffset;
468
469    return {
470      width: rect.width,
471      height: rect.height,
472      offset: {
473        top: rect.top + winY,
474        left: rect.left + winX
475      },
476      parentDims: {
477        width: parRect.width,
478        height: parRect.height,
479        offset: {
480          top: parRect.top + winY,
481          left: parRect.left + winX
482        }
483      },
484      windowDims: {
485        width: winRect.width,
486        height: winRect.height,
487        offset: {
488          top: winY,
489          left: winX
490        }
491      }
492    };
493  }
494
495  /**
496   * Returns an object of top and left integer pixel values for dynamically rendered elements,
497   * such as: Tooltip, Reveal, and Dropdown
498   * @function
499   * @param {jQuery} element - jQuery object for the element being positioned.
500   * @param {jQuery} anchor - jQuery object for the element's anchor point.
501   * @param {String} position - a string relating to the desired position of the element, relative to it's anchor
502   * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element.
503   * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element.
504   * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset.
505   * TODO alter/rewrite to work with `em` values as well/instead of pixels
506   */
507  function GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) {
508    var $eleDims = GetDimensions(element),
509        $anchorDims = anchor ? GetDimensions(anchor) : null;
510
511    switch (position) {
512      case 'top':
513        return {
514          left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left,
515          top: $anchorDims.offset.top - ($eleDims.height + vOffset)
516        };
517        break;
518      case 'left':
519        return {
520          left: $anchorDims.offset.left - ($eleDims.width + hOffset),
521          top: $anchorDims.offset.top
522        };
523        break;
524      case 'right':
525        return {
526          left: $anchorDims.offset.left + $anchorDims.width + hOffset,
527          top: $anchorDims.offset.top
528        };
529        break;
530      case 'center top':
531        return {
532          left: $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2,
533          top: $anchorDims.offset.top - ($eleDims.height + vOffset)
534        };
535        break;
536      case 'center bottom':
537        return {
538          left: isOverflow ? hOffset : $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2,
539          top: $anchorDims.offset.top + $anchorDims.height + vOffset
540        };
541        break;
542      case 'center left':
543        return {
544          left: $anchorDims.offset.left - ($eleDims.width + hOffset),
545          top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2
546        };
547        break;
548      case 'center right':
549        return {
550          left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1,
551          top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2
552        };
553        break;
554      case 'center':
555        return {
556          left: $eleDims.windowDims.offset.left + $eleDims.windowDims.width / 2 - $eleDims.width / 2,
557          top: $eleDims.windowDims.offset.top + $eleDims.windowDims.height / 2 - $eleDims.height / 2
558        };
559        break;
560      case 'reveal':
561        return {
562          left: ($eleDims.windowDims.width - $eleDims.width) / 2,
563          top: $eleDims.windowDims.offset.top + vOffset
564        };
565      case 'reveal full':
566        return {
567          left: $eleDims.windowDims.offset.left,
568          top: $eleDims.windowDims.offset.top
569        };
570        break;
571      case 'left bottom':
572        return {
573          left: $anchorDims.offset.left,
574          top: $anchorDims.offset.top + $anchorDims.height + vOffset
575        };
576        break;
577      case 'right bottom':
578        return {
579          left: $anchorDims.offset.left + $anchorDims.width + hOffset - $eleDims.width,
580          top: $anchorDims.offset.top + $anchorDims.height + vOffset
581        };
582        break;
583      default:
584        return {
585          left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left + hOffset,
586          top: $anchorDims.offset.top + $anchorDims.height + vOffset
587        };
588    }
589  }
590}(jQuery);
591
592/*******************************************
593 *                                         *
594 * This util was created by Marius Olbertz *
595 * Please thank Marius on GitHub /owlbertz *
596 * or the web http://www.mariusolbertz.de/ *
597 *                                         *
598 ******************************************/
599
600'use strict';
601
602!function ($) {
603
604  var keyCodes = {
605    9: 'TAB',
606    13: 'ENTER',
607    27: 'ESCAPE',
608    32: 'SPACE',
609    37: 'ARROW_LEFT',
610    38: 'ARROW_UP',
611    39: 'ARROW_RIGHT',
612    40: 'ARROW_DOWN'
613  };
614
615  var commands = {};
616
617  var Keyboard = {
618    keys: getKeyCodes(keyCodes),
619
620    /**
621     * Parses the (keyboard) event and returns a String that represents its key
622     * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE
623     * @param {Event} event - the event generated by the event handler
624     * @return String key - String that represents the key pressed
625     */
626    parseKey: function parseKey(event) {
627      var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase();
628
629      // Remove un-printable characters, e.g. for `fromCharCode` calls for CTRL only events
630      key = key.replace(/\W+/, '');
631
632      if (event.shiftKey) key = 'SHIFT_' + key;
633      if (event.ctrlKey) key = 'CTRL_' + key;
634      if (event.altKey) key = 'ALT_' + key;
635
636      // Remove trailing underscore, in case only modifiers were used (e.g. only `CTRL_ALT`)
637      key = key.replace(/_$/, '');
638
639      return key;
640    },
641
642
643    /**
644     * Handles the given (keyboard) event
645     * @param {Event} event - the event generated by the event handler
646     * @param {String} component - Foundation component's name, e.g. Slider or Reveal
647     * @param {Objects} functions - collection of functions that are to be executed
648     */
649    handleKey: function handleKey(event, component, functions) {
650      var commandList = commands[component],
651          keyCode = this.parseKey(event),
652          cmds,
653          command,
654          fn;
655
656      if (!commandList) return console.warn('Component not defined!');
657
658      if (typeof commandList.ltr === 'undefined') {
659        // this component does not differentiate between ltr and rtl
660        cmds = commandList; // use plain list
661      } else {
662        // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa
663        if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);else cmds = $.extend({}, commandList.rtl, commandList.ltr);
664      }
665      command = cmds[keyCode];
666
667      fn = functions[command];
668      if (fn && typeof fn === 'function') {
669        // execute function  if exists
670        var returnValue = fn.apply();
671        if (functions.handled || typeof functions.handled === 'function') {
672          // execute function when event was handled
673          functions.handled(returnValue);
674        }
675      } else {
676        if (functions.unhandled || typeof functions.unhandled === 'function') {
677          // execute function when event was not handled
678          functions.unhandled();
679        }
680      }
681    },
682
683
684    /**
685     * Finds all focusable elements within the given `$element`
686     * @param {jQuery} $element - jQuery object to search within
687     * @return {jQuery} $focusable - all focusable elements within `$element`
688     */
689    findFocusable: function findFocusable($element) {
690      if (!$element) {
691        return false;
692      }
693      return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function () {
694        if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) {
695          return false;
696        } //only have visible elements and those that have a tabindex greater or equal 0
697        return true;
698      });
699    },
700
701
702    /**
703     * Returns the component name name
704     * @param {Object} component - Foundation component, e.g. Slider or Reveal
705     * @return String componentName
706     */
707
708    register: function register(componentName, cmds) {
709      commands[componentName] = cmds;
710    },
711
712
713    /**
714     * Traps the focus in the given element.
715     * @param  {jQuery} $element  jQuery object to trap the foucs into.
716     */
717    trapFocus: function trapFocus($element) {
718      var $focusable = Foundation.Keyboard.findFocusable($element),
719          $firstFocusable = $focusable.eq(0),
720          $lastFocusable = $focusable.eq(-1);
721
722      $element.on('keydown.zf.trapfocus', function (event) {
723        if (event.target === $lastFocusable[0] && Foundation.Keyboard.parseKey(event) === 'TAB') {
724          event.preventDefault();
725          $firstFocusable.focus();
726        } else if (event.target === $firstFocusable[0] && Foundation.Keyboard.parseKey(event) === 'SHIFT_TAB') {
727          event.preventDefault();
728          $lastFocusable.focus();
729        }
730      });
731    },
732
733    /**
734     * Releases the trapped focus from the given element.
735     * @param  {jQuery} $element  jQuery object to release the focus for.
736     */
737    releaseFocus: function releaseFocus($element) {
738      $element.off('keydown.zf.trapfocus');
739    }
740  };
741
742  /*
743   * Constants for easier comparing.
744   * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE
745   */
746  function getKeyCodes(kcs) {
747    var k = {};
748    for (var kc in kcs) {
749      k[kcs[kc]] = kcs[kc];
750    }return k;
751  }
752
753  Foundation.Keyboard = Keyboard;
754}(jQuery);
755
756'use strict';
757
758!function ($) {
759
760  // Default set of media queries
761  var defaultQueries = {
762    'default': 'only screen',
763    landscape: 'only screen and (orientation: landscape)',
764    portrait: 'only screen and (orientation: portrait)',
765    retina: 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)'
766  };
767
768  var MediaQuery = {
769    queries: [],
770
771    current: '',
772
773    /**
774     * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher.
775     * @function
776     * @private
777     */
778    _init: function _init() {
779      var self = this;
780      var extractedStyles = $('.foundation-mq').css('font-family');
781      var namedQueries;
782
783      namedQueries = parseStyleToObject(extractedStyles);
784
785      for (var key in namedQueries) {
786        if (namedQueries.hasOwnProperty(key)) {
787          self.queries.push({
788            name: key,
789            value: 'only screen and (min-width: ' + namedQueries[key] + ')'
790          });
791        }
792      }
793
794      this.current = this._getCurrentSize();
795
796      this._watcher();
797    },
798
799
800    /**
801     * Checks if the screen is at least as wide as a breakpoint.
802     * @function
803     * @param {String} size - Name of the breakpoint to check.
804     * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller.
805     */
806    atLeast: function atLeast(size) {
807      var query = this.get(size);
808
809      if (query) {
810        return window.matchMedia(query).matches;
811      }
812
813      return false;
814    },
815
816
817    /**
818     * Checks if the screen matches to a breakpoint.
819     * @function
820     * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method.
821     * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not.
822     */
823    is: function is(size) {
824      size = size.trim().split(' ');
825      if (size.length > 1 && size[1] === 'only') {
826        if (size[0] === this._getCurrentSize()) return true;
827      } else {
828        return this.atLeast(size[0]);
829      }
830      return false;
831    },
832
833
834    /**
835     * Gets the media query of a breakpoint.
836     * @function
837     * @param {String} size - Name of the breakpoint to get.
838     * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist.
839     */
840    get: function get(size) {
841      for (var i in this.queries) {
842        if (this.queries.hasOwnProperty(i)) {
843          var query = this.queries[i];
844          if (size === query.name) return query.value;
845        }
846      }
847
848      return null;
849    },
850
851
852    /**
853     * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one).
854     * @function
855     * @private
856     * @returns {String} Name of the current breakpoint.
857     */
858    _getCurrentSize: function _getCurrentSize() {
859      var matched;
860
861      for (var i = 0; i < this.queries.length; i++) {
862        var query = this.queries[i];
863
864        if (window.matchMedia(query.value).matches) {
865          matched = query;
866        }
867      }
868
869      if ((typeof matched === 'undefined' ? 'undefined' : _typeof(matched)) === 'object') {
870        return matched.name;
871      } else {
872        return matched;
873      }
874    },
875
876
877    /**
878     * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes.
879     * @function
880     * @private
881     */
882    _watcher: function _watcher() {
883      var _this2 = this;
884
885      $(window).on('resize.zf.mediaquery', function () {
886        var newSize = _this2._getCurrentSize(),
887            currentSize = _this2.current;
888
889        if (newSize !== currentSize) {
890          // Change the current media query
891          _this2.current = newSize;
892
893          // Broadcast the media query change on the window
894          $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]);
895        }
896      });
897    }
898  };
899
900  Foundation.MediaQuery = MediaQuery;
901
902  // matchMedia() polyfill - Test a CSS media type/query in JS.
903  // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license
904  window.matchMedia || (window.matchMedia = function () {
905    'use strict';
906
907    // For browsers that support matchMedium api such as IE 9 and webkit
908
909    var styleMedia = window.styleMedia || window.media;
910
911    // For those that don't support matchMedium
912    if (!styleMedia) {
913      var style = document.createElement('style'),
914          script = document.getElementsByTagName('script')[0],
915          info = null;
916
917      style.type = 'text/css';
918      style.id = 'matchmediajs-test';
919
920      script && script.parentNode && script.parentNode.insertBefore(style, script);
921
922      // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
923      info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle;
924
925      styleMedia = {
926        matchMedium: function matchMedium(media) {
927          var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';
928
929          // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
930          if (style.styleSheet) {
931            style.styleSheet.cssText = text;
932          } else {
933            style.textContent = text;
934          }
935
936          // Test if media query is true or false
937          return info.width === '1px';
938        }
939      };
940    }
941
942    return function (media) {
943      return {
944        matches: styleMedia.matchMedium(media || 'all'),
945        media: media || 'all'
946      };
947    };
948  }());
949
950  // Thank you: https://github.com/sindresorhus/query-string
951  function parseStyleToObject(str) {
952    var styleObject = {};
953
954    if (typeof str !== 'string') {
955      return styleObject;
956    }
957
958    str = str.trim().slice(1, -1);
958 // browsers re-quote string style values
959
960    if (!str) {
961      return styleObject;
962    }
963
964    styleObject = str.split('&').reduce(function (ret, param) {
965      var parts = param.replace(/\+/g, ' ').split('=');
966      var key = parts[0];
967      var val = parts[1];
968      key = decodeURIComponent(key);
969
970      // missing `=` should be `null`:
971      // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
972      val = val === undefined ? null : decodeURIComponent(val);
973
974      if (!ret.hasOwnProperty(key)) {
975        ret[key] = val;
976      } else if (Array.isArray(ret[key])) {
977        ret[key].push(val);
978      } else {
979        ret[key] = [ret[key], val];
980      }
981      return ret;
982    }, {});
983
984    return styleObject;
985  }
986
987  Foundation.MediaQuery = MediaQuery;
988}(jQuery);
989
990'use strict';
991
992!function ($) {
993
994  /**
995   * Motion module.
996   * @module foundation.motion
997   */
998
999  var initClasses = ['mui-enter', 'mui-leave'];
1000  var activeClasses = ['mui-enter-active', 'mui-leave-active'];
1001
1002  var Motion = {
1003    animateIn: function animateIn(element, animation, cb) {
1004      animate(true, element, animation, cb);
1005    },
1006
1007    animateOut: function animateOut(element, animation, cb) {
1008      animate(false, element, animation, cb);
1009    }
1010  };
1011
1012  function Move(duration, elem, fn) {
1013    var anim,
1014        prog,
1015        start = null;
1016    // console.log('called');
1017
1018    if (duration === 0) {
1019      fn.apply(elem);
1020      elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);
1021      return;
1022    }
1023
1024    function move(ts) {
1025      if (!start) start = ts;
1026      // console.log(start, ts);
1027      prog = ts - start;
1028      fn.apply(elem);
1029
1030      if (prog < duration) {
1031        anim = window.requestAnimationFrame(move, elem);
1032      } else {
1033        window.cancelAnimationFrame(anim);
1034        elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);
1035      }
1036    }
1037    anim = window.requestAnimationFrame(move);
1038  }
1039
1040  /**
1041   * Animates an element in or out using a CSS transition class.
1042   * @function
1043   * @private
1044   * @param {Boolean} isIn - Defines if the animation is in or out.
1045   * @param {Object} element - jQuery or HTML object to animate.
1046   * @param {String} animation - CSS class to use.
1047   * @param {Function} cb - Callback to run when animation is finished.
1048   */
1049  function animate(isIn, element, animation, cb) {
1050    element = $(element).eq(0);
1051
1052    if (!element.length) return;
1053
1054    var initClass = isIn ? initClasses[0] : initClasses[1];
1055    var activeClass = isIn ? activeClasses[0] : activeClasses[1];
1056
1057    // Set up the animation
1058    reset();
1059
1060    element.addClass(animation).css('transition', 'none');
1061
1062    requestAnimationFrame(function () {
1063      element.addClass(initClass);
1064      if (isIn) element.show();
1065    });
1066
1067    // Start the animation
1068    requestAnimationFrame(function () {
1069      element[0].offsetWidth;
1070      element.css('transition', '').addClass(activeClass);
1071    });
1072
1073    // Clean up the animation when it finishes
1074    element.one(Foundation.transitionend(element), finish);
1075
1076    // Hides the element (for out animations), resets the element, and runs a callback
1077    function finish() {
1078      if (!isIn) element.hide();
1079      reset();
1080      if (cb) cb.apply(element);
1081    }
1082
1083    // Resets transitions and removes motion-specific classes
1084    function reset() {
1085      element[0].style.transitionDuration = 0;
1086      element.removeClass(initClass + ' ' + activeClass + ' ' + animation);
1087    }
1088  }
1089
1090  Foundation.Move = Move;
1091  Foundation.Motion = Motion;
1092}(jQuery);
1093
1094'use strict';
1095
1096!function ($) {
1097
1098  var Nest = {
1099    Feather: function Feather(menu) {
1100      var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'zf';
1101
1102      menu.attr('role', 'menubar');
1103
1104      var items = menu.find('li').attr({ 'role': 'menuitem' }),
1105          subMenuClass = 'is-' + type + '-submenu',
1106          subItemClass = subMenuClass + '-item',
1107          hasSubClass = 'is-' + type + '-submenu-parent';
1108
1109      items.each(function () {
1110        var $item = $(this),
1111            $sub = $item.children('ul');
1112
1113        if ($sub.length) {
1114          $item.addClass(hasSubClass).attr({
1115            'aria-haspopup': true,
1116            'aria-label': $item.children('a:first').text()
1117          });
1118          // Note:  Drilldowns behave differently in how they hide, and so need
1119          // additional attributes.  We should look if this possibly over-generalized
1120          // utility (Nest) is appropriate when we rework menus in 6.4
1121          if (type === 'drilldown') {
1122            $item.attr({ 'aria-expanded': false });
1123          }
1124
1125          $sub.addClass('submenu ' + subMenuClass).attr({
1126            'data-submenu': '',
1127            'role': 'menu'
1128          });
1129          if (type === 'drilldown') {
1130            $sub.attr({ 'aria-hidden': true });
1131          }
1132        }
1133
1134        if ($item.parent('[data-submenu]').length) {
1135          $item.addClass('is-submenu-item ' + subItemClass);
1136        }
1137      });
1138
1139      return;
1140    },
1141    Burn: function Burn(menu, type) {
1142      var //items = menu.find('li'),
1143      subMenuClass = 'is-' + type + '-submenu',
1144          subItemClass = subMenuClass + '-item',
1145          hasSubClass = 'is-' + type + '-submenu-parent';
1146
1147      menu.find('>li, .menu, .menu > li').removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active').removeAttr('data-submenu').css('display', '');
1148
1149      // console.log(      menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]')
1150      //           .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu')
1151      //           .removeAttr('data-submenu'));
1152      // items.each(function(){
1153      //   var $item = $(this),
1154      //       $sub = $item.children('ul');
1155      //   if($item.parent('[data-submenu]').length){
1156      //     $item.removeClass('is-submenu-item ' + subItemClass);
1157      //   }
1158      //   if($sub.length){
1159      //     $item.removeClass('has-submenu');
1160      //     $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu');
1161      //   }
1162      // });
1163    }
1164  };
1165
1166  Foundation.Nest = Nest;
1167}(jQuery);
1168
1169'use strict';
1170
1171!function ($) {
1172
1173  function Timer(elem, options, cb) {
1174    var _this = this,
1175        duration = options.duration,
1176        //options is an object for easily adding features later.
1177    nameSpace = Object.keys(elem.data())[0] || 'timer',
1178        remain = -1,
1179        start,
1180        timer;
1181
1182    this.isPaused = false;
1183
1184    this.restart = function () {
1185      remain = -1;
1186      clearTimeout(timer);
1187      this.start();
1188    };
1189
1190    this.start = function () {
1191      this.isPaused = false;
1192      // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.
1193      clearTimeout(timer);
1194      remain = remain <= 0 ? duration : remain;
1195      elem.data('paused', false);
1196      start = Date.now();
1197      timer = setTimeout(function () {
1198        if (options.infinite) {
1199          _this.restart(); //rerun the timer.
1200        }
1201        if (cb && typeof cb === 'function') {
1202          cb();
1203        }
1204      }, remain);
1205      elem.trigger('timerstart.zf.' + nameSpace);
1206    };
1207
1208    this.pause = function () {
1209      this.isPaused = true;
1210      //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.
1211      clearTimeout(timer);
1212      elem.data('paused', true);
1213      var end = Date.now();
1214      remain = remain - (end - start);
1215      elem.trigger('timerpaused.zf.' + nameSpace);
1216    };
1217  }
1218
1219  /**
1220   * Runs a callback function when images are fully loaded.
1221   * @param {Object} images - Image(s) to check if loaded.
1222   * @param {Func} callback - Function to execute when image is fully loaded.
1223   */
1224  function onImagesLoaded(images, callback) {
1225    var self = this,
1226        unloaded = images.length;
1227
1228    if (unloaded === 0) {
1229      callback();
1230    }
1231
1232    images.each(function () {
1233      // Check if image is loaded
1234      if (this.complete || this.readyState === 4 || this.readyState === 'complete') {
1235        singleImageLoaded();
1236      }
1237      // Force load the image
1238      else {
1239          // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/
1240          var src = $(this).attr('src');
1241          $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + new Date().getTime());
1242          $(this).one('load', function () {
1243            singleImageLoaded();
1244          });
1245        }
1246    });
1247
1248    function singleImageLoaded() {
1249      unloaded--;
1250      if (unloaded === 0) {
1251        callback();
1252      }
1253    }
1254  }
1255
1256  Foundation.Timer = Timer;
1257  Foundation.onImagesLoaded = onImagesLoaded;
1258}(jQuery);
1259
1260//**************************************************
1261//**Work inspired by multiple jquery swipe plugins**
1262//**Done by Yohai Ararat ***************************
1263//**************************************************
1264(function ($) {
1265
1266  $.spotSwipe = {
1267    version: '1.0.0',
1268    enabled: 'ontouchstart' in document.documentElement,
1269    preventDefault: false,
1270    moveThreshold: 75,
1271    timeThreshold: 200
1272  };
1273
1274  var startPosX,
1275      startPosY,
1276      startTime,
1277      elapsedTime,
1278      isMoving = false;
1279
1280  function onTouchEnd() {
1281    //  alert(this);
1282    this.removeEventListener('touchmove', onTouchMove);
1283    this.removeEventListener('touchend', onTouchEnd);
1284    isMoving = false;
1285  }
1286
1287  function onTouchMove(e) {
1288    if ($.spotSwipe.preventDefault) {
1289      e.preventDefault();
1290    }
1291    if (isMoving) {
1292      var x = e.touches[0].pageX;
1293      var y = e.touches[0].pageY;
1294      var dx = startPosX - x;
1295      var dy = startPosY - y;
1296      var dir;
1297      elapsedTime = new Date().getTime() - startTime;
1298      if (Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {
1299        dir = dx > 0 ? 'left' : 'right';
1300      }
1301      // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {
1302      //   dir = dy > 0 ? 'down' : 'up';
1303      // }
1304      if (dir) {
1305        e.preventDefault();
1306        onTouchEnd.call(this);
1307        $(this).trigger('swipe', dir).trigger('swipe' + dir);
1308      }
1309    }
1310  }
1311
1312  function onTouchStart(e) {
1313    if (e.touches.length == 1) {
1314      startPosX = e.touches[0].pageX;
1315      startPosY = e.touches[0].pageY;
1316      isMoving = true;
1317      startTime = new Date().getTime();
1318      this.addEventListener('touchmove', onTouchMove, false);
1319      this.addEventListener('touchend', onTouchEnd, false);
1320    }
1321  }
1322
1323  function init() {
1324    this.addEventListener && this.addEventListener('touchstart', onTouchStart, false);
1325  }
1326
1327  function teardown() {
1328    this.removeEventListener('touchstart', onTouchStart);
1329  }
1330
1331  $.event.special.swipe = { setup: init };
1332
1333  $.each(['left', 'up', 'down', 'right'], function () {
1334    $.event.special['swipe' + this] = { setup: function setup() {
1335        $(this).on('swipe', $.noop);
1336      } };
1337  });
1338})(jQuery);
1339/****************************************************
1340 * Method for adding psuedo drag events to elements *
1341 ***************************************************/
1342!function ($) {
1343  $.fn.addTouch = function () {
1344    this.each(function (i, el) {
1345      $(el).bind('touchstart touchmove touchend touchcancel', function () {
1346        //we pass the original event object because the jQuery event
1347        //object is normalized to w3c specs and does not provide the TouchList
1348        handleTouch(event);
1349      });
1350    });
1351
1352    var handleTouch = function handleTouch(event) {
1353      var touches = event.changedTouches,
1354          first = touches[0],
1355          eventTypes = {
1356        touchstart: 'mousedown',
1357        touchmove: 'mousemove',
1358        touchend: 'mouseup'
1359      },
1360          type = eventTypes[event.type],
1361          simulatedEvent;
1362
1363      if ('MouseEvent' in window && typeof window.MouseEvent === 'function') {
1364        simulatedEvent = new window.MouseEvent(type, {
1365          'bubbles': true,
1366          'cancelable': true,
1367          'screenX': first.screenX,
1368          'screenY': first.screenY,
1369          'clientX': first.clientX,
1370          'clientY': first.clientY
1371        });
1372      } else {
1373        simulatedEvent = document.createEvent('MouseEvent');
1374        simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0 /*left*/, null);
1375      }
1376      first.target.dispatchEvent(simulatedEvent);
1377    };
1378  };
1379}(jQuery);
1380
1381//**********************************
1382//**From the jQuery Mobile Library**
1383//**need to recreate functionality**
1384//**and try to improve if possible**
1385//**********************************
1386
1387/* Removing the jQuery function ****
1388************************************
1389
1390(function( $, window, undefined ) {
1391
1392	var $document = $( document ),
1393		// supportTouch = $.mobile.support.touch,
1394		touchStartEvent = 'touchstart'//supportTouch ? "touchstart" : "mousedown",
1395		touchStopEvent = 'touchend'//supportTouch ? "touchend" : "mouseup",
1396		touchMoveEvent = 'touchmove'//supportTouch ? "touchmove" : "mousemove";
1397
1398	// setup new event shortcuts
1399	$.each( ( "touchstart touchmove touchend " +
1400		"swipe swipeleft swiperight" ).split( " " ), function( i, name ) {
1401
1402		$.fn[ name ] = function( fn ) {
1403			return fn ? this.bind( name, fn ) : this.trigger( name );
1404		};
1405
1406		// jQuery < 1.8
1407		if ( $.attrFn ) {
1408			$.attrFn[ name ] = true;
1409		}
1410	});
1411
1412	function triggerCustomEvent( obj, eventType, event, bubble ) {
1413		var originalType = event.type;
1414		event.type = eventType;
1415		if ( bubble ) {
1416			$.event.trigger( event, undefined, obj );
1417		} else {
1418			$.event.dispatch.call( obj, event );
1419		}
1420		event.type = originalType;
1421	}
1422
1423	// also handles taphold
1424
1425	// Also handles swipeleft, swiperight
1426	$.event.special.swipe = {
1427
1428		// More than this horizontal displacement, and we will suppress scrolling.
1429		scrollSupressionThreshold: 30,
1430
1431		// More time than this, and it isn't a swipe.
1432		durationThreshold: 1000,
1433
1434		// Swipe horizontal displacement must be more than this.
1435		horizontalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30,
1436
1437		// Swipe vertical displacement must be less than this.
1438		verticalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30,
1439
1440		getLocation: function ( event ) {
1441			var winPageX = window.pageXOffset,
1442				winPageY = window.pageYOffset,
1443				x = event.clientX,
1444				y = event.clientY;
1445
1446			if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) ||
1447				event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) {
1448
1449				// iOS4 clientX/clientY have the value that should have been
1450				// in pageX/pageY. While pageX/page/ have the value 0
1451				x = x - winPageX;
1452				y = y - winPageY;
1453			} else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) {
1454
1455				// Some Android browsers have totally bogus values for clientX/Y
1456				// when scrolling/zooming a page. Detectable since clientX/clientY
1457				// should never be smaller than pageX/pageY minus page scroll
1458				x = event.pageX - winPageX;
1459				y = event.pageY - winPageY;
1460			}
1461
1462			return {
1463				x: x,
1464				y: y
1465			};
1466		},
1467
1468		start: function( event ) {
1469			var data = event.originalEvent.touches ?
1470					event.originalEvent.touches[ 0 ] : event,
1471				location = $.event.special.swipe.getLocation( data );
1472			return {
1473						time: ( new Date() ).getTime(),
1474						coords: [ location.x, location.y ],
1475						origin: $( event.target )
1476					};
1477		},
1478
1479		stop: function( event ) {
1480			var data = event.originalEvent.touches ?
1481					event.originalEvent.touches[ 0 ] : event,
1482				location = $.event.special.swipe.getLocation( data );
1483			return {
1484						time: ( new Date() ).getTime(),
1485						coords: [ location.x, location.y ]
1486					};
1487		},
1488
1489		handleSwipe: function( start, stop, thisObject, origTarget ) {
1490			if ( stop.time - start.time < $.event.special.swipe.durationThreshold &&
1491				Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&
1492				Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {
1493				var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight";
1494
1495				triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true );
1496				triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true );
1497				return true;
1498			}
1499			return false;
1500
1501		},
1502
1503		// This serves as a flag to ensure that at most one swipe event event is
1504		// in work at any given time
1505		eventInProgress: false,
1506
1507		setup: function() {
1508			var events,
1509				thisObject = this,
1510				$this = $( thisObject ),
1511				context = {};
1512
1513			// Retrieve the events data for this element and add the swipe context
1514			events = $.data( this, "mobile-events" );
1515			if ( !events ) {
1516				events = { length: 0 };
1517				$.data( this, "mobile-events", events );
1518			}
1519			events.length++;
1520			events.swipe = context;
1521
1522			context.start = function( event ) {
1523
1524				// Bail if we're already working on a swipe event
1525				if ( $.event.special.swipe.eventInProgress ) {
1526					return;
1527				}
1528				$.event.special.swipe.eventInProgress = true;
1529
1530				var stop,
1531					start = $.event.special.swipe.start( event ),
1532					origTarget = event.target,
1533					emitted = false;
1534
1535				context.move = function( event ) {
1536					if ( !start || event.isDefaultPrevented() ) {
1537						return;
1538					}
1539
1540					stop = $.event.special.swipe.stop( event );
1541					if ( !emitted ) {
1542						emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );
1543						if ( emitted ) {
1544
1545							// Reset the context to make way for the next swipe event
1546							$.event.special.swipe.eventInProgress = false;
1547						}
1548					}
1549					// prevent scrolling
1550					if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
1551						event.preventDefault();
1552					}
1553				};
1554
1555				context.stop = function() {
1556						emitted = true;
1557
1558						// Reset the context to make way for the next swipe event
1559						$.event.special.swipe.eventInProgress = false;
1560						$document.off( touchMoveEvent, context.move );
1561						context.move = null;
1562				};
1563
1564				$document.on( touchMoveEvent, context.move )
1565					.one( touchStopEvent, context.stop );
1566			};
1567			$this.on( touchStartEvent, context.start );
1568		},
1569
1570		teardown: function() {
1571			var events, context;
1572
1573			events = $.data( this, "mobile-events" );
1574			if ( events ) {
1575				context = events.swipe;
1576				delete events.swipe;
1577				events.length--;
1578				if ( events.length === 0 ) {
1579					$.removeData( this, "mobile-events" );
1580				}
1581			}
1582
1583			if ( context ) {
1584				if ( context.start ) {
1585					$( this ).off( touchStartEvent, context.start );
1586				}
1587				if ( context.move ) {
1588					$document.off( touchMoveEvent, context.move );
1589				}
1590				if ( context.stop ) {
1591					$document.off( touchStopEvent, context.stop );
1592				}
1593			}
1594		}
1595	};
1596	$.each({
1597		swipeleft: "swipe.left",
1598		swiperight: "swipe.right"
1599	}, function( event, sourceEvent ) {
1600
1601		$.event.special[ event ] = {
1602			setup: function() {
1603				$( this ).bind( sourceEvent, $.noop );
1604			},
1605			teardown: function() {
1606				$( this ).unbind( sourceEvent );
1607			}
1608		};
1609	});
1610})( jQuery, this );
1611*/
1612
1613'use strict';
1614
1615!function ($) {
1616
1617  var MutationObserver = function () {
1618    var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];
1619    for (var i = 0; i < prefixes.length; i++) {
1620      if (prefixes[i] + 'MutationObserver' in window) {
1621        return window[prefixes[i] + 'MutationObserver'];
1622      }
1623    }
1624    return false;
1625  }();
1626
1627  var triggers = function triggers(el, type) {
1628    el.data(type).split(' ').forEach(function (id) {
1629      $('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]);
1630    });
1631  };
1632  // Elements with [data-open] will reveal a plugin that supports it when clicked.
1633  $(document).on('click.zf.trigger', '[data-open]', function () {
1634    triggers($(this), 'open');
1635  });
1636
1637  // Elements with [data-close] will close a plugin that supports it when clicked.
1638  // If used without a value on [data-close], the event will bubble, allowing it to close a parent component.
1639  $(document).on('click.zf.trigger', '[data-close]', function () {
1640    var id = $(this).data('close');
1641    if (id) {
1642      triggers($(this), 'close');
1643    } else {
1644      $(this).trigger('close.zf.trigger');
1645    }
1646  });
1647
1648  // Elements with [data-toggle] will toggle a plugin that supports it when clicked.
1649  $(document).on('click.zf.trigger', '[data-toggle]', function () {
1650    var id = $(this).data('toggle');
1651    if (id) {
1652      triggers($(this), 'toggle');
1653    } else {
1654      $(this).trigger('toggle.zf.trigger');
1655    }
1656  });
1657
1658  // Elements with [data-closable] will respond to close.zf.trigger events.
1659  $(document).on('close.zf.trigger', '[data-closable]', function (e) {
1660    e.stopPropagation();
1661    var animation = $(this).data('closable');
1662
1663    if (animation !== '') {
1664      Foundation.Motion.animateOut($(this), animation, function () {
1665        $(this).trigger('closed.zf');
1666      });
1667    } else {
1668      $(this).fadeOut().trigger('closed.zf');
1669    }
1670  });
1671
1672  $(document).on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', function () {
1673    var id = $(this).data('toggle-focus');
1674    $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]);
1675  });
1676
1677  /**
1678  * Fires once after all other scripts have loaded
1679  * @function
1680  * @private
1681  */
1682  $(window).on('load', function () {
1683    checkListeners();
1684  });
1685
1686  function checkListeners() {
1687    eventsListener();
1688    resizeListener();
1689    scrollListener();
1690    closemeListener();
1691  }
1692
1693  //******** only fires this function once on load, if there's something to watch ********
1694  function closemeListener(pluginName) {
1695    var yetiBoxes = $('[data-yeti-box]'),
1696        plugNames = ['dropdown', 'tooltip', 'reveal'];
1697
1698    if (pluginName) {
1699      if (typeof pluginName === 'string') {
1700        plugNames.push(pluginName);
1701      } else if ((typeof pluginName === 'undefined' ? 'undefined' : _typeof(pluginName)) === 'object' && typeof pluginName[0] === 'string') {
1702        plugNames.concat(pluginName);
1703      } else {
1704        console.error('Plugin names must be strings');
1705      }
1706    }
1707    if (yetiBoxes.length) {
1708      var listeners = plugNames.map(function (name) {
1709        return 'closeme.zf.' + name;
1710      }).join(' ');
1711
1712      $(window).off(listeners).on(listeners, function (e, pluginId) {
1713        var plugin = e.namespace.split('.')[0];
1714        var plugins = $('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]');
1715
1716        plugins.each(function () {
1717          var _this = $(this);
1718
1719          _this.triggerHandler('close.zf.trigger', [_this]);
1720        });
1721      });
1722    }
1723  }
1724
1725  function resizeListener(debounce) {
1726    var timer = void 0,
1727        $nodes = $('[data-resize]');
1728    if ($nodes.length) {
1729      $(window).off('resize.zf.trigger').on('resize.zf.trigger', function (e) {
1730        if (timer) {
1731          clearTimeout(timer);
1732        }
1733
1734        timer = setTimeout(function () {
1735
1736          if (!MutationObserver) {
1737            //fallback for IE 9
1738            $nodes.each(function () {
1739              $(this).triggerHandler('resizeme.zf.trigger');
1740            });
1741          }
1742          //trigger all listening elements and signal a resize event
1743          $nodes.attr('data-events', "resize");
1744        }, debounce || 10); //default time to emit resize event
1745      });
1746    }
1747  }
1748
1749  function scrollListener(debounce) {
1750    var timer = void 0,
1751        $nodes = $('[data-scroll]');
1752    if ($nodes.length) {
1753      $(window).off('scroll.zf.trigger').on('scroll.zf.trigger', function (e) {
1754        if (timer) {
1755          clearTimeout(timer);
1756        }
1757
1758        timer = setTimeout(function () {
1759
1760          if (!MutationObserver) {
1761            //fallback for IE 9
1762            $nodes.each(function () {
1763              $(this).triggerHandler('scrollme.zf.trigger');
1764            });
1765          }
1766          //trigger all listening elements and signal a scroll event
1767          $nodes.attr('data-events', "scroll");
1768        }, debounce || 10); //default time to emit scroll event
1769      });
1770    }
1771  }
1772
1773  function eventsListener() {
1774    if (!MutationObserver) {
1775      return false;
1776    }
1777    var nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]');
1778
1779    //element callback
1780    var listeningElementsMutation = function listeningElementsMutation(mutationRecordsList) {
1781      var $target = $(mutationRecordsList[0].target);
1782
1783      //trigger the event handler for the element depending on type
1784      switch (mutationRecordsList[0].type) {
1785
1786        case "attributes":
1787          if ($target.attr("data-events") === "scroll" && mutationRecordsList[0].attributeName === "data-events") {
1788            $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);
1789          }
1790          if ($target.attr("data-events") === "resize" && mutationRecordsList[0].attributeName === "data-events") {
1791            $target.triggerHandler('resizeme.zf.trigger', [$target]);
1792          }
1793          if (mutationRecordsList[0].attributeName === "style") {
1794            $target.closest("[data-mutate]").attr("data-events", "mutate");
1795            $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]);
1796          }
1797          break;
1798
1799        case "childList":
1800          $target.closest("[data-mutate]").attr("data-events", "mutate");
1801          $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]);
1802          break;
1803
1804        default:
1805          return false;
1806        //nothing
1807      }
1808    };
1809
1810    if (nodes.length) {
1811      //for each element that needs to listen for resizing, scrolling, or mutation add a single observer
1812      for (var i = 0; i <= nodes.length - 1; i++) {
1813        var elementObserver = new MutationObserver(listeningElementsMutation);
1814        elementObserver.observe(nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: ["data-events", "style"] });
1815      }
1816    }
1817  }
1818
1819  // ------------------------------------
1820
1821  // [PH]
1822  // Foundation.CheckWatchers = checkWatchers;
1823  Foundation.IHearYou = checkListeners;
1824  // Foundation.ISeeYou = scrollListener;
1825  // Foundation.IFeelYou = closemeListener;
1826}(jQuery);
1827
1828'use strict';
1829
1830!function ($) {
1831
1832  /**
1833   * Accordion module.
1834   * @module foundation.accordion
1835   * @requires foundation.util.keyboard
1836   * @requires foundation.util.motion
1837   */
1838
1839  var Accordion = function () {
1840    /**
1841     * Creates a new instance of an accordion.
1842     * @class
1843     * @fires Accordion#init
1844     * @param {jQuery} element - jQuery object to make into an accordion.
1845     * @param {Object} options - a plain object with settings to override the default options.
1846     */
1847    function Accordion(element, options) {
1848      _classCallCheck(this, Accordion);
1849
1850      this.$element = element;
1851      this.options = $.extend({}, Accordion.defaults, this.$element.data(), options);
1852
1853      this._init();
1854
1855      Foundation.registerPlugin(this, 'Accordion');
1856      Foundation.Keyboard.register('Accordion', {
1857        'ENTER': 'toggle',
1858        'SPACE': 'toggle',
1859        'ARROW_DOWN': 'next',
1860        'ARROW_UP': 'previous'
1861      });
1862    }
1863
1864    /**
1865     * Initializes the accordion by animating the preset active pane(s).
1866     * @private
1867     */
1868
1869
1870    _createClass(Accordion, [{
1871      key: '_init',
1872      value: function _init() {
1873        var _this3 = this;
1874
1875        this.$element.attr('role', 'tablist');
1876        this.$tabs = this.$element.children('[data-accordion-item]');
1877
1878        this.$tabs.each(function (idx, el) {
1879          var $el = $(el),
1880              $content = $el.children('[data-tab-content]'),
1881              id = $content[0].id || Foundation.GetYoDigits(6, 'accordion'),
1882              linkId = el.id || id + '-label';
1883
1884          $el.find('a:first').attr({
1885            'aria-controls': id,
1886            'role': 'tab',
1887            'id': linkId,
1888            'aria-expanded': false,
1889            'aria-selected': false
1890          });
1891
1892          $content.attr({ 'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id });
1893        });
1894        var $initActive = this.$element.find('.is-active').children('[data-tab-content]');
1895        this.firstTimeInit = true;
1896        if ($initActive.length) {
1897          this.down($initActive, this.firstTimeInit);
1898          this.firstTimeInit = false;
1899        }
1900
1901        this._checkDeepLink = function () {
1902          var anchor = window.location.hash;
1903          //need a hash and a relevant anchor in this tabset
1904          if (anchor.length) {
1905            var $link = _this3.$element.find('[href$="' + anchor + '"]'),
1906                $anchor = $(anchor);
1907
1908            if ($link.length && $anchor) {
1909              if (!$link.parent('[data-accordion-item]').hasClass('is-active')) {
1910                _this3.down($anchor, _this3.firstTimeInit);
1911                _this3.firstTimeInit = false;
1912              };
1913
1914              //roll up a little to show the titles
1915              if (_this3.options.deepLinkSmudge) {
1916                var _this = _this3;
1917                $(window).load(function () {
1918                  var offset = _this.$element.offset();
1919                  $('html, body').animate({ scrollTop: offset.top }, _this.options.deepLinkSmudgeDelay);
1920                });
1921              }
1922
1923              /**
1924                * Fires when the zplugin has deeplinked at pageload
1925                * @event Accordion#deeplink
1926                */
1927              _this3.$element.trigger('deeplink.zf.accordion', [$link, $anchor]);
1928            }
1929          }
1930        };
1931
1932        //use browser to open a tab, if it exists in this tabset
1933        if (this.options.deepLink) {
1934          this._checkDeepLink();
1935        }
1936
1937        this._events();
1938      }
1939
1940      /**
1941       * Adds event handlers for items within the accordion.
1942       * @private
1943       */
1944
1945    }, {
1946      key: '_events',
1947      value: function _events() {
1948        var _this = this;
1949
1950        this.$tabs.each(function () {
1951          var $elem = $(this);
1952          var $tabContent = $elem.children('[data-tab-content]');
1953          if ($tabContent.length) {
1954            $elem.children('a').off('click.zf.accordion keydown.zf.accordion').on('click.zf.accordion', function (e) {
1955              e.preventDefault();
1956              _this.toggle($tabContent);
1957            }).on('keydown.zf.accordion', function (e) {
1958              Foundation.Keyboard.handleKey(e, 'Accordion', {
1959                toggle: function toggle() {
1960                  _this.toggle($tabContent);
1961                },
1962                next: function next() {
1963                  var $a = $elem.next().find('a').focus();
1964                  if (!_this.options.multiExpand) {
1965                    $a.trigger('click.zf.accordion');
1966                  }
1967                },
1968                previous: function previous() {
1969                  var $a = $elem.prev().find('a').focus();
1970                  if (!_this.options.multiExpand) {
1971                    $a.trigger('click.zf.accordion');
1972                  }
1973                },
1974                handled: function handled() {
1975                  e.preventDefault();
1976                  e.stopPropagation();
1977                }
1978              });
1979            });
1980          }
1981        });
1982        if (this.options.deepLink) {
1983          $(window).on('popstate', this._checkDeepLink);
1984        }
1985      }
1986
1987      /**
1988       * Toggles the selected content pane's open/close state.
1989       * @param {jQuery} $target - jQuery object of the pane to toggle (`.accordion-content`).
1990       * @function
1991       */
1992
1993    }, {
1994      key: 'toggle',
1995      value: function toggle($target) {
1996        if ($target.parent().hasClass('is-active')) {
1997          this.up($target);
1998        } else {
1999          this.down($target);
2000        }
2001        //either replace or update browser history
2002        if (this.options.deepLink) {
2003          var anchor = $target.prev('a').attr('href');
2004
2005          if (this.options.updateHistory) {
2006            history.pushState({}, '', anchor);
2007          } else {
2008            history.replaceState({}, '', anchor);
2009          }
2010        }
2011      }
2012
2013      /**
2014       * Opens the accordion tab defined by `$target`.
2015       * @param {jQuery} $target - Accordion pane to open (`.accordion-content`).
2016       * @param {Boolean} firstTime - flag to determine if reflow should happen.
2017       * @fires Accordion#down
2018       * @function
2019       */
2020
2021    }, {
2022      key: 'down',
2023      value: function down($target, firstTime) {
2024        var _this4 = this;
2025
2026        $target.attr('aria-hidden', false).parent('[data-tab-content]').addBack().parent().addClass('is-active');
2027
2028        if (!this.options.multiExpand && !firstTime) {
2029          var $currentActive = this.$element.children('.is-active').children('[data-tab-content]');
2030          if ($currentActive.length) {
2031            this.up($currentActive.not($target));
2032          }
2033        }
2034
2035        $target.slideDown(this.options.slideSpeed, function () {
2036          /**
2037           * Fires when the tab is done opening.
2038           * @event Accordion#down
2039           */
2040          _this4.$element.trigger('down.zf.accordion', [$target]);
2041        });
2042
2043        $('#' + $target.attr('aria-labelledby')).attr({
2044          'aria-expanded': true,
2045          'aria-selected': true
2046        });
2047      }
2048
2049      /**
2050       * Closes the tab defined by `$target`.
2051       * @param {jQuery} $target - Accordion tab to close (`.accordion-content`).
2052       * @fires Accordion#up
2053       * @function
2054       */
2055
2056    }, {
2057      key: 'up',
2058      value: function up($target) {
2059        var $aunts = $target.parent().siblings(),
2060            _this = this;
2061
2062        if (!this.options.allowAllClosed && !$aunts.hasClass('is-active') || !$target.parent().hasClass('is-active')) {
2063          return;
2064        }
2065
2066        // Foundation.Move(this.options.slideSpeed, $target, function(){
2067        $target.slideUp(_this.options.slideSpeed, function () {
2068          /**
2069           * Fires when the tab is done collapsing up.
2070           * @event Accordion#up
2071           */
2072          _this.$element.trigger('up.zf.accordion', [$target]);
2073        });
2074        // });
2075
2076        $target.attr('aria-hidden', true).parent().removeClass('is-active');
2077
2078        $('#' + $target.attr('aria-labelledby')).attr({
2079          'aria-expanded': false,
2080          'aria-selected': false
2081        });
2082      }
2083
2084      /**
2085       * Destroys an instance of an accordion.
2086       * @fires Accordion#destroyed
2087       * @function
2088       */
2089
2090    }, {
2091      key: 'destroy',
2092      value: function destroy() {
2093        this.$element.find('[data-tab-content]').stop(true).slideUp(0).css('display', '');
2094        this.$element.find('a').off('.zf.accordion');
2095        if (this.options.deepLink) {
2096          $(window).off('popstate', this._checkDeepLink);
2097        }
2098
2099        Foundation.unregisterPlugin(this);
2100      }
2101    }]);
2102
2103    return Accordion;
2104  }();
2105
2106  Accordion.defaults = {
2107    /**
2108     * Amount of time to animate the opening of an accordion pane.
2109     * @option
2110     * @type {number}
2111     * @default 250
2112     */
2113    slideSpeed: 250,
2114    /**
2115     * Allow the accordion to have multiple open panes.
2116     * @option
2117     * @type {boolean}
2118     * @default false
2119     */
2120    multiExpand: false,
2121    /**
2122     * Allow the accordion to close all panes.
2123     * @option
2124     * @type {boolean}
2125     * @default false
2126     */
2127    allowAllClosed: false,
2128    /**
2129     * Allows the window to scroll to content of pane specified by hash anchor
2130     * @option
2131     * @type {boolean}
2132     * @default false
2133     */
2134    deepLink: false,
2135
2136    /**
2137     * Adjust the deep link scroll to make sure the top of the accordion panel is visible
2138     * @option
2139     * @type {boolean}
2140     * @default false
2141     */
2142    deepLinkSmudge: false,
2143
2144    /**
2145     * Animation time (ms) for the deep link adjustment
2146     * @option
2147     * @type {number}
2148     * @default 300
2149     */
2150    deepLinkSmudgeDelay: 300,
2151
2152    /**
2153     * Update the browser history with the open accordion
2154     * @option
2155     * @type {boolean}
2156     * @default false
2157     */
2158    updateHistory: false
2159  };
2160
2161  // Window exports
2162  Foundation.plugin(Accordion, 'Accordion');
2163}(jQuery);
2164
2165'use strict';
2166
2167!function ($) {
2168
2169  /**
2170   * Drilldown module.
2171   * @module foundation.drilldown
2172   * @requires foundation.util.keyboard
2173   * @requires foundation.util.motion
2174   * @requires foundation.util.nest
2175   */
2176
2177  var Drilldown = function () {
2178    /**
2179     * Creates a new instance of a drilldown menu.
2180     * @class
2181     * @param {jQuery} element - jQuery object to make into an accordion menu.
2182     * @param {Object} options - Overrides to the default plugin settings.
2183     */
2184    function Drilldown(element, options) {
2185      _classCallCheck(this, Drilldown);
2186
2187      this.$element = element;
2188      this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options);
2189
2190      Foundation.Nest.Feather(this.$element, 'drilldown');
2191
2192      this._init();
2193
2194      Foundation.registerPlugin(this, 'Drilldown');
2195      Foundation.Keyboard.register('Drilldown', {
2196        'ENTER': 'open',
2197        'SPACE': 'open',
2198        'ARROW_RIGHT': 'next',
2199        'ARROW_UP': 'up',
2200        'ARROW_DOWN': 'down',
2201        'ARROW_LEFT': 'previous',
2202        'ESCAPE': 'close',
2203        'TAB': 'down',
2204        'SHIFT_TAB': 'up'
2205      });
2206    }
2207
2208    /**
2209     * Initializes the drilldown by creating jQuery collections of elements
2210     * @private
2211     */
2212
2213
2214    _createClass(Drilldown, [{
2215      key: '_init',
2216      value: function _init() {
2217        this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent').children('a');
2218        this.$submenus = this.$submenuAnchors.parent('li').children('[data-submenu]');
2219        this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem').find('a');
2220        this.$element.attr('data-mutate', this.$element.attr('data-drilldown') || Foundation.GetYoDigits(6, 'drilldown'));
2221
2222        this._prepareMenu();
2223        this._registerEvents();
2224
2225        this._keyboardEvents();
2226      }
2227
2228      /**
2229       * prepares drilldown menu by setting attributes to links and elements
2230       * sets a min height to prevent content jumping
2231       * wraps the element if not already wrapped
2232       * @private
2233       * @function
2234       */
2235
2236    }, {
vendor: 8,636 bytes, lines 2237-2466
2237      key: '_prepareMenu',
2238      value: function _prepareMenu() {
2239        var _this = this;
2240        // if(!this.options.holdOpen){
2241        //   this._menuLinkEvents();
2242        // }
2243        this.$submenuAnchors.each(function () {
2244          var $link = $(this);
2245          var $sub = $link.parent();
2246          if (_this.options.parentLink) {
2247            $link.clone().prependTo($sub.children('[data-submenu]')).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menu-item"></li>');
2248          }
2249          $link.data('savedHref', $link.attr('href')).removeAttr('href').attr('tabindex', 0);
2250          $link.children('[data-submenu]').attr({
2251            'aria-hidden': true,
2252            'tabindex': 0,
2253            'role': 'menu'
2254          });
2255          _this._events($link);
2256        });
2257        this.$submenus.each(function () {
2258          var $menu = $(this),
2259              $back = $menu.find('.js-drilldown-back');
2260          if (!$back.length) {
2261            switch (_this.options.backButtonPosition) {
2262              case "bottom":
2263                $menu.append(_this.options.backButton);
2264                break;
2265              case "top":
2266                $menu.prepend(_this.options.backButton);
2267                break;
2268              default:
2269                console.error("Unsupported backButtonPosition value '" + _this.options.backButtonPosition + "'");
2270            }
2271          }
2272          _this._back($menu);
2273        });
2274
2275        this.$submenus.addClass('invisible');
2276        if (!this.options.autoHeight) {
2277          this.$submenus.addClass('drilldown-submenu-cover-previous');
2278        }
2279
2280        // create a wrapper on element if it doesn't exist.
2281        if (!this.$element.parent().hasClass('is-drilldown')) {
2282          this.$wrapper = $(this.options.wrapper).addClass('is-drilldown');
2283          if (this.options.animateHeight) this.$wrapper.addClass('animate-height');
2284          this.$element.wrap(this.$wrapper);
2285        }
2286        // set wrapper
2287        this.$wrapper = this.$element.parent();
2288        this.$wrapper.css(this._getMaxDims());
2289      }
2290    }, {
2291      key: '_resize',
2292      value: function _resize() {
2293        this.$wrapper.css({ 'max-width': 'none', 'min-height': 'none' });
2294        // _getMaxDims has side effects (boo) but calling it should update all other necessary heights & widths
2295        this.$wrapper.css(this._getMaxDims());
2296      }
2297
2298      /**
2299       * Adds event handlers to elements in the menu.
2300       * @function
2301       * @private
2302       * @param {jQuery} $elem - the current menu item to add handlers to.
2303       */
2304
2305    }, {
2306      key: '_events',
2307      value: function _events($elem) {
2308        var _this = this;
2309
2310        $elem.off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
2311          if ($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')) {
2312            e.stopImmediatePropagation();
2313            e.preventDefault();
2314          }
2315
2316          // if(e.target !== e.currentTarget.firstElementChild){
2317          //   return false;
2318          // }
2319          _this._show($elem.parent('li'));
2320
2321          if (_this.options.closeOnClick) {
2322            var $body = $('body');
2323            $body.off('.zf.drilldown').on('click.zf.drilldown', function (e) {
2324              if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target)) {
2325                return;
2326              }
2327              e.preventDefault();
2328              _this._hideAll();
2329              $body.off('.zf.drilldown');
2330            });
2331          }
2332        });
2333        this.$element.on('mutateme.zf.trigger', this._resize.bind(this));
2334      }
2335
2336      /**
2337       * Adds event handlers to the menu element.
2338       * @function
2339       * @private
2340       */
2341
2342    }, {
2343      key: '_registerEvents',
2344      value: function _registerEvents() {
2345        if (this.options.scrollTop) {
2346          this._bindHandler = this._scrollTop.bind(this);
2347          this.$element.on('open.zf.drilldown hide.zf.drilldown closed.zf.drilldown', this._bindHandler);
2348        }
2349      }
2350
2351      /**
2352       * Scroll to Top of Element or data-scroll-top-element
2353       * @function
2354       * @fires Drilldown#scrollme
2355       */
2356
2357    }, {
2358      key: '_scrollTop',
2359      value: function _scrollTop() {
2360        var _this = this;
2361        var $scrollTopElement = _this.options.scrollTopElement != '' ? $(_this.options.scrollTopElement) : _this.$element,
2362            scrollPos = parseInt($scrollTopElement.offset().top + _this.options.scrollTopOffset);
2363        $('html, body').stop(true).animate({ scrollTop: scrollPos }, _this.options.animationDuration, _this.options.animationEasing, function () {
2364          /**
2365            * Fires after the menu has scrolled
2366            * @event Drilldown#scrollme
2367            */
2368          if (this === $('html')[0]) _this.$element.trigger('scrollme.zf.drilldown');
2369        });
2370      }
2371
2372      /**
2373       * Adds keydown event listener to `li`'s in the menu.
2374       * @private
2375       */
2376
2377    }, {
2378      key: '_keyboardEvents',
2379      value: function _keyboardEvents() {
2380        var _this = this;
2381
2382        this.$menuItems.add(this.$element.find('.js-drilldown-back > a, .is-submenu-parent-item > a')).on('keydown.zf.drilldown', function (e) {
2383          var $element = $(this),
2384              $elements = $element.parent('li').parent('ul').children('li').children('a'),
2385              $prevElement,
2386              $nextElement;
2387
2388          $elements.each(function (i) {
2389            if ($(this).is($element)) {
2390              $prevElement = $elements.eq(Math.max(0, i - 1));
2391              $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
2392              return;
2393            }
2394          });
2395
2396          Foundation.Keyboard.handleKey(e, 'Drilldown', {
2397            next: function next() {
2398              if ($element.is(_this.$submenuAnchors)) {
2399                _this._show($element.parent('li'));
2400                $element.parent('li').one(Foundation.transitionend($element), function () {
2401                  $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
2402                });
2403                return true;
2404              }
2405            },
2406            previous: function previous() {
2407              _this._hide($element.parent('li').parent('ul'));
2408              $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () {
2409                setTimeout(function () {
2410                  $element.parent('li').parent('ul').parent('li').children('a').first().focus();
2411                }, 1);
2412              });
2413              return true;
2414            },
2415            up: function up() {
2416              $prevElement.focus();
2417              // Don't tap focus on first element in root ul
2418              return !$element.is(_this.$element.find('> li:first-child > a'));
2419            },
2420            down: function down() {
2421              $nextElement.focus();
2422              // Don't tap focus on last element in root ul
2423              return !$element.is(_this.$element.find('> li:last-child > a'));
2424            },
2425            close: function close() {
2426              // Don't close on element in root ul
2427              if (!$element.is(_this.$element.find('> li > a'))) {
2428                _this._hide($element.parent().parent());
2429                $element.parent().parent().siblings('a').focus();
2430              }
2431            },
2432            open: function open() {
2433              if (!$element.is(_this.$menuItems)) {
2434                // not menu item means back button
2435                _this._hide($element.parent('li').parent('ul'));
2436                $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () {
2437                  setTimeout(function () {
2438                    $element.parent('li').parent('ul').parent('li').children('a').first().focus();
2439                  }, 1);
2440                });
2441                return true;
2442              } else if ($element.is(_this.$submenuAnchors)) {
2443                _this._show($element.parent('li'));
2444                $element.parent('li').one(Foundation.transitionend($element), function () {
2445                  $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
2446                });
2447                return true;
2448              }
2449            },
2450            handled: function handled(preventDefault) {
2451              if (preventDefault) {
2452                e.preventDefault();
2453              }
2454              e.stopImmediatePropagation();
2455            }
2456          });
2457        }); // end keyboardAccess
2458      }
2459
2460      /**
2461       * Closes all open elements, and returns to root menu.
2462       * @function
2463       * @fires Drilldown#closed
2464       */
2465
2466    }, {
2467      key: '_hideAll',
2468      value: function _hideAll() {
2469        var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing');
2470        if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') });
2471        $elem.one(Foundation.transitionend($elem), function (e) {
2472          $elem.removeClass('is-active is-closing');
2473        });
2474        /**
2475         * Fires when the menu is fully closed.
2476         * @event Drilldown#closed
2477         */
2478        this.$element.trigger('closed.zf.drilldown');
2479      }
2480
2481      /**
2482       * Adds event listener for each `back` button, and closes open menus.
2483       * @function
2484       * @fires Drilldown#back
2485       * @param {jQuery} $elem - the current sub-menu to add `back` event.
2486       */
2487
2488    }, {
2489      key: '_back',
2490      value: function _back($elem) {
2491        var _this = this;
2492        $elem.off('click.zf.drilldown');
2493        $elem.children('.js-drilldown-back').on('click.zf.drilldown', function (e) {
2494          e.stopImmediatePropagation();
2495          // console.log('mouseup on back');
2496          _this._hide($elem);
2497
2498          // If there is a parent submenu, call show
2499          var parentSubMenu = $elem.parent('li').parent('ul').parent('li');
2500          if (parentSubMenu.length) {
2501            _this._show(parentSubMenu);
2502          }
2503        });
2504      }
2505
2506      /**
2507       * Adds event listener to menu items w/o submenus to close open menus on click.
2508       * @function
2509       * @private
2510       */
2511
2512    }, {
2513      key: '_menuLinkEvents',
2514      value: function _menuLinkEvents() {
2515        var _this = this;
2516        this.$menuItems.not('.is-drilldown-submenu-parent').off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
2517          // e.stopImmediatePropagation();
2518          setTimeout(function () {
2519            _this._hideAll();
2520          }, 0);
2521        });
2522      }
2523
2524      /**
2525       * Opens a submenu.
2526       * @function
2527       * @fires Drilldown#open
2528       * @param {jQuery} $elem - the current element with a submenu to open, i.e. the `li` tag.
2529       */
2530
2531    }, {
2532      key: '_show',
2533      value: function _show($elem) {
2534        if (this.options.autoHeight) this.$wrapper.css({ height: $elem.children('[data-submenu]').data('calcHeight') });
2535        $elem.attr('aria-expanded', true);
2536        $elem.children('[data-submenu]').addClass('is-active').removeClass('invisible').attr('aria-hidden', false);
2537        /**
2538         * Fires when the submenu has opened.
2539         * @event Drilldown#open
2540         */
2541        this.$element.trigger('open.zf.drilldown', [$elem]);
2542      }
2543    }, {
2544      key: '_hide',
2545
2546
2547      /**
2548       * Hides a submenu
2549       * @function
2550       * @fires Drilldown#hide
2551       * @param {jQuery} $elem - the current sub-menu to hide, i.e. the `ul` tag.
2552       */
2553      value: function _hide($elem) {
2554        if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') });
2555        var _this = this;
2556        $elem.parent('li').attr('aria-expanded', false);
2557        $elem.attr('aria-hidden', true).addClass('is-closing');
2558        $elem.addClass('is-closing').one(Foundation.transitionend($elem), function () {
2559          $elem.removeClass('is-active is-closing');
2560          $elem.blur().addClass('invisible');
2561        });
2562        /**
2563         * Fires when the submenu has closed.
2564         * @event Drilldown#hide
2565         */
2566        $elem.trigger('hide.zf.drilldown', [$elem]);
2567      }
2568
2569      /**
2570       * Iterates through the nested menus to calculate the min-height, and max-width for the menu.
2571       * Prevents content jumping.
2572       * @function
2573       * @private
2574       */
2575
2576    }, {
2577      key: '_getMaxDims',
2578      value: function _getMaxDims() {
2579        var maxHeight = 0,
2580            result = {},
2581            _this = this;
2582        this.$submenus.add(this.$element).each(function () {
2583          var numOfElems = $(this).children('li').length;
2584          var height = Foundation.Box.GetDimensions(this).height;
2585          maxHeight = height > maxHeight ? height : maxHeight;
2586          if (_this.options.autoHeight) {
2587            $(this).data('calcHeight', height);
2588            if (!$(this).hasClass('is-drilldown-submenu')) result['height'] = height;
2589          }
2590        });
2591
2592        if (!this.options.autoHeight) result['min-height'] = maxHeight + 'px';
2593
2594        result['max-width'] = this.$element[0].getBoundingClientRect().width + 'px';
2595
2596        return result;
2597      }
2598
2599      /**
2600       * Destroys the Drilldown Menu
2601       * @function
2602       */
2603
2604    }, {
2605      key: 'destroy',
2606      value: function destroy() {
2607        if (this.options.scrollTop) this.$element.off('.zf.drilldown', this._bindHandler);
2608        this._hideAll();
2609        this.$element.off('mutateme.zf.trigger');
2610        Foundation.Nest.Burn(this.$element, 'drilldown');
2611        this.$element.unwrap().find('.js-drilldown-back, .is-submenu-parent-item').remove().end().find('.is-active, .is-closing, .is-drilldown-submenu').removeClass('is-active is-closing is-drilldown-submenu').end().find('[data-submenu]').removeAttr('aria-hidden tabindex role');
2612        this.$submenuAnchors.each(function () {
2613          $(this).off('.zf.drilldown');
2614        });
2615
2616        this.$submenus.removeClass('drilldown-submenu-cover-previous');
2617
2618        this.$element.find('a').each(function () {
2619          var $link = $(this);
2620          $link.removeAttr('tabindex');
2621          if ($link.data('savedHref')) {
2622            $link.attr('href', $link.data('savedHref')).removeData('savedHref');
2623          } else {
2624            return;
2625          }
2626        });
2627        Foundation.unregisterPlugin(this);
2628      }
2629    }]);
2630
2631    return Drilldown;
2632  }();
2633
2634  Drilldown.defaults = {
2635    /**
2636     * Markup used for JS generated back button. Prepended  or appended (see backButtonPosition) to submenu lists and deleted on `destroy` method, 'js-drilldown-back' class required. Remove the backslash (`\`) if copy and pasting.
2637     * @option
2638     * @type {string}
2639     * @default '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>'
2640     */
2641    backButton: '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>',
2642    /**
2643     * Position the back button either at the top or bottom of drilldown submenus. Can be `'left'` or `'bottom'`.
2644     * @option
2645     * @type {string}
2646     * @default top
2647     */
2648    backButtonPosition: 'top',
2649    /**
2650     * Markup used to wrap drilldown menu. Use a class name for independent styling; the JS applied class: `is-drilldown` is required. Remove the backslash (`\`) if copy and pasting.
2651     * @option
2652     * @type {string}
2653     * @default '<div></div>'
2654     */
2655    wrapper: '<div></div>',
2656    /**
2657     * Adds the parent link to the submenu.
2658     * @option
2659     * @type {boolean}
2660     * @default false
2661     */
2662    parentLink: false,
2663    /**
2664     * Allow the menu to return to root list on body click.
2665     * @option
2666     * @type {boolean}
2667     * @default false
2668     */
2669    closeOnClick: false,
2670    /**
2671     * Allow the menu to auto adjust height.
2672     * @option
2673     * @type {boolean}
2674     * @default false
2675     */
2676    autoHeight: false,
2677    /**
2678     * Animate the auto adjust height.
2679     * @option
2680     * @type {boolean}
2681     * @default false
2682     */
2683    animateHeight: false,
2684    /**
2685     * Scroll to the top of the menu after opening a submenu or navigating back using the menu back button
2686     * @option
2687     * @type {boolean}
2688     * @default false
2689     */
2690    scrollTop: false,
2691    /**
2692     * String jquery selector (for example 'body') of element to take offset().top from, if empty string the drilldown menu offset().top is taken
2693     * @option
2694     * @type {string}
2695     * @default ''
2696     */
2697    scrollTopElement: '',
2698    /**
2699     * ScrollTop offset
2700     * @option
2701     * @type {number}
2702     * @default 0
2703     */
2704    scrollTopOffset: 0,
2705    /**
2706     * Scroll animation duration
2707     * @option
2708     * @type {number}
2709     * @default 500
2710     */
2711    animationDuration: 500,
2712    /**
2713     * Scroll animation easing. Can be `'swing'` or `'linear'`.
2714     * @option
2715     * @type {string}
2716     * @see {@link https://api.jquery.com/animate|JQuery animate}
2717     * @default 'swing'
2718     */
2719    animationEasing: 'swing'
2720    // holdOpen: false
2721  };
2722
2723  // Window exports
2724  Foundation.plugin(Drilldown, 'Drilldown');
2725}(jQuery);
2726
2727'use strict';
2728
2729!function ($) {
2730
2731  /**
2732   * Dropdown module.
2733   * @module foundation.dropdown
2734   * @requires foundation.util.keyboard
2735   * @requires foundation.util.box
2736   * @requires foundation.util.triggers
2737   */
2738
2739  var Dropdown = function () {
2740    /**
2741     * Creates a new instance of a dropdown.
2742     * @class
2743     * @param {jQuery} element - jQuery object to make into a dropdown.
2744     *        Object should be of the dropdown panel, rather than 
2744its anchor.
2745     * @param {Object} options - Overrides to the default plugin settings.
2746     */
2747    function Dropdown(element, options) {
2748      _classCallCheck(this, Dropdown);
2749
2750      this.$element = element;
2751      this.options = $.extend({}, Dropdown.defaults, this.$element.data(), options);
2752      this._init();
2753
2754      Foundation.registerPlugin(this, 'Dropdown');
2755      Foundation.Keyboard.register('Dropdown', {
2756        'ENTER': 'open',
2757        'SPACE': 'open',
2758        'ESCAPE': 'close'
2759      });
2760    }
2761
2762    /**
2763     * Initializes the plugin by setting/checking options and attributes, adding helper variables, and saving the anchor.
2764     * @function
2765     * @private
2766     */
2767
2768
2769    _createClass(Dropdown, [{
2770      key: '_init',
2771      value: function _init() {
2772        var $id = this.$element.attr('id');
2773
2774        this.$anchor = $('[data-toggle="' + $id + '"]').length ? $('[data-toggle="' + $id + '"]') : $('[data-open="' + $id + '"]');
2775        this.$anchor.attr({
2776          'aria-controls': $id,
2777          'data-is-focus': false,
2778          'data-yeti-box': $id,
2779          'aria-haspopup': true,
2780          'aria-expanded': false
2781
2782        });
2783
2784        if (this.options.parentClass) {
2785          this.$parent = this.$element.parents('.' + this.options.parentClass);
2786        } else {
2787          this.$parent = null;
2788        }
2789        this.options.positionClass = this.getPositionClass();
2790        this.counter = 4;
2791        this.usedPositions = [];
2792        this.$element.attr({
2793          'aria-hidden': 'true',
2794          'data-yeti-box': $id,
2795          'data-resize': $id,
2796          'aria-labelledby': this.$anchor[0].id || Foundation.GetYoDigits(6, 'dd-anchor')
2797        });
2798        this._events();
2799      }
2800
2801      /**
2802       * Helper function to determine current orientation of dropdown pane.
2803       * @function
2804       * @returns {String} position - string value of a position class.
2805       */
2806
2807    }, {
2808      key: 'getPositionClass',
2809      value: function getPositionClass() {
2810        var verticalPosition = this.$element[0].className.match(/(top|left|right|bottom)/g);
2811        verticalPosition = verticalPosition ? verticalPosition[0] : '';
2812        var horizontalPosition = /float-(\S+)/.exec(this.$anchor[0].className);
2813        horizontalPosition = horizontalPosition ? horizontalPosition[1] : '';
2814        var position = horizontalPosition ? horizontalPosition + ' ' + verticalPosition : verticalPosition;
2815
2816        return position;
2817      }
2818
2819      /**
2820       * Adjusts the dropdown panes orientation by adding/removing positioning classes.
2821       * @function
2822       * @private
2823       * @param {String} position - position class to remove.
2824       */
2825
2826    }, {
2827      key: '_reposition',
2828      value: function _reposition(position) {
2829        this.usedPositions.push(position ? position : 'bottom');
2830        //default, try switching to opposite side
2831        if (!position && this.usedPositions.indexOf('top') < 0) {
2832          this.$element.addClass('top');
2833        } else if (position === 'top' && this.usedPositions.indexOf('bottom') < 0) {
2834          this.$element.removeClass(position);
2835        } else if (position === 'left' && this.usedPositions.indexOf('right') < 0) {
2836          this.$element.removeClass(position).addClass('right');
2837        } else if (position === 'right' && this.usedPositions.indexOf('left') < 0) {
2838          this.$element.removeClass(position).addClass('left');
2839        }
2840
2841        //if default change didn't work, try bottom or left first
2842        else if (!position && this.usedPositions.indexOf('top') > -1 && this.usedPositions.indexOf('left') < 0) {
2843            this.$element.addClass('left');
2844          } else if (position === 'top' && this.usedPositions.indexOf('bottom') > -1 && this.usedPositions.indexOf('left') < 0) {
2845            this.$element.removeClass(position).addClass('left');
2846          } else if (position === 'left' && this.usedPositions.indexOf('right') > -1 && this.usedPositions.indexOf('bottom') < 0) {
2847            this.$element.removeClass(position);
2848          } else if (position === 'right' && this.usedPositions.indexOf('left') > -1 && this.usedPositions.indexOf('bottom') < 0) {
2849            this.$element.removeClass(position);
2850          }
2851          //if nothing cleared, set to bottom
2852          else {
2853              this.$element.removeClass(position);
2854            }
2855        this.classChanged = true;
2856        this.counter--;
2857      }
2858
2859      /**
2860       * Sets the position and orientation of the dropdown pane, checks for c
2860ollisions.
2861       * Recursively calls itself if a collision is detected, with a new position class.
2862       * @function
2863       * @private
2864       */
2865
2866    }, {
2867      key: '_setPosition',
2868      value: function _setPosition() {
2869        if (this.$anchor.attr('aria-expanded') === 'false') {
2870          return false;
2871        }
2872        var position = this.getPositionClass(),
2873            $eleDims = Foundation.Box.GetDimensions(this.$element),
2874            $anchorDims = Foundation.Box.GetDimensions(this.$anchor),
2875            _this = this,
2876            direction = position === 'left' ? 'left' : position === 'right' ? 'left' : 'top',
2877            param = direction === 'top' ? 'height' : 'width',
2878            offset = param === 'height' ? this.options.vOffset : this.options.hOffset;
2879
2880        if ($eleDims.width >= $eleDims.windowDims.width || !this.counter && !Foundation.Box.ImNotTouchingYou(this.$element, this.$parent)) {
2881          var newWidth = $eleDims.windowDims.width,
2882              parentHOffset = 0;
2883          if (this.$parent) {
2884            var $parentDims = Foundation.Box.GetDimensions(this.$parent),
2885                parentHOffset = $parentDims.offset.left;
2886            if ($parentDims.width < newWidth) {
2887              newWidth = $parentDims.width;
2888            }
2889          }
2890
2891          this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, 'center bottom', this.options.vOffset, this.options.hOffset + parentHOffset, true)).css({
2892            'width': newWidth - this.options.hOffset * 2,
2893            'height': 'auto'
2894          });
2895          this.classChanged = true;
2896          return false;
2897        }
2898
2899        this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, position, this.options.vOffset, this.options.hOffset));
2900
2901        while (!Foundation.Box.ImNotTouchingYou(this.$element, this.$parent, true) && this.counter) {
2902          this._reposition(position);
2903          this._setPosition();
2904        }
2905      }
2906
2907      /**
2908       * Adds event listeners to the element utilizing the triggers utility library.
2909       * @function
2910       * @private
2911       */
2912
2913    }, {
2914      key: '_events',
2915      value: function _events() {
2916        var _this = this;
2917        this.$element.on({
2918          'open.zf.trigger': this.open.bind(this),
2919          'close.zf.trigger': this.close.bind(this),
2920          'toggle.zf.trigger': this.toggle.bind(this),
2921          'resizeme.zf.trigger': this._setPosition.bind(this)
2922        });
2923
2924        if (this.options.hover) {
2925          this.$anchor.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () {
2926            var bodyData = $('body').data();
2927            if (typeof bodyData.whatinput === 'undefined' || bodyData.whatinput === 'mouse') {
2928              clearTimeout(_this.timeout);
2929              _this.timeout = setTimeout(function () {
2930                _this.open();
2931                _this.$anchor.data('hover', true);
2932              }, _this.options.hoverDelay);
2933            }
2934          }).on('mouseleave.zf.dropdown', function () {
2935            clearTimeout(_this.timeout);
2936            _this.timeout = setTimeout(function () {
2937              _this.close();
2938              _this.$anchor.data('hover', false);
2939            }, _this.options.hoverDelay);
2940          });
2941          if (this.options.hoverPane) {
2942            this.$element.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () {
2943              clearTimeout(_this.timeout);
2944            }).on('mouseleave.zf.dropdown', function () {
2945              clearTimeout(_this.timeout);
2946              _this.timeout = setTimeout(function () {
2947                _this.close();
2948                _this.$anchor.data('hover', false);
2949              }, _this.options.hoverDelay);
2950            });
2951          }
2952        }
2953        this.$anchor.add(this.$element).on('keydown.zf.dropdown', function (e) {
2954
2955          var $target = $(this),
2956              visibleFocusableElements = Foundation.Keyboard.findFocusable(_this.$element);
2957
2958          Foundation.Keyboard.handleKey(e, 'Dropdown', {
2959            open: function open() {
2960              if ($target.is(_this.$anchor)) {
2961                _this.open();
2962                _this.$element.attr('tabindex', -1).focus();
2963                e.preventDefault();
2964              }
2965            },
2966            close: function close() {
2967              _this.close();
2968              _this.$anchor.focus();
2969            }
2970          });
2971        });
2972      }
2973
2974      /**
2975       * Adds an event handler to the body to close any dropdowns on a click.
2976       * @function
2977       * @private
2978       */
2979
2980    }, {
2981      key: '_addBodyHandler',
2982      value: function _addBodyHandler() {
2983        var $body = $(document.body).not(this.$element),
2984            _this = this;
2985        $body.off('click.zf.dropdown').on('click.zf.dropdown', function (e) {
2986          if (_this.$anchor.is(e.target) || _this.$anchor.find(e.target).length) {
2987            return;
2988          }
2989          if (_this.$element.find(e.target).length) {
2990            return;
2991          }
2992          _this.close();
2993          $body.off('click.zf.dropdown');
2994        });
2995      }
2996
2997      /**
2998       * Opens the dropdown pane, and fires a bubbling event to close other dropdowns.
2999       * @function
3000       * @fires Dropdown#closeme
3001       * @fires Dropdown#show
3002       */
3003
3004    }, {
3005      key: 'open',
3006      value: function open() {
3007        // var _this = this;
3008        /**
3009         * Fires to close other open dropdowns, typically when dropdown is opening
3010         * @event Dropdown#closeme
3011         */
3012        this.$element.trigger('closeme.zf.dropdown', this.$element.attr('id'));
3013        this.$anchor.addClass('hover').attr({ 'aria-expanded': true });
3014        // this.$element/*.show()*/;
3015        this._setPosition();
3016        this.$element.addClass('is-open').attr({ 'aria-hidden': false });
3017
3018        if (this.options.autoFocus) {
3019          var $focusable = Foundation.Keyboard.findFocusable(this.$element);
3020          if ($focusable.length) {
3021            $focusable.eq(0).focus();
3022          }
3023        }
3024
3025        if (this.options.closeOnClick) {
3026          this._addBodyHandler();
3027        }
3028
3029        if (this.options.trapFocus) {
3030          Foundation.Keyboard.trapFocus(this.$element);
3031        }
3032
3033        /**
3034         * Fires once the dropdown is visible.
3035         * @event Dropdown#show
3036         */
3037        this.$element.trigger('show.zf.dropdown', [this.$element]);
3038      }
3039
3040      /**
3041       * Closes the open dropdown pane.
3042       * @function
3043       * @fires Dropdown#hide
3044       */
3045
3046    }, {
3047      key: 'close',
3048      value: function close() {
3049        if (!this.$element.hasClass('is-open')) {
3050          return false;
3051        }
3052        this.$element.removeClass('is-open').attr({ 'aria-hidden': true });
3053
3054        this.$anchor.removeClass('hover').attr('aria-expanded', false);
3055
3056        if (this.classChanged) {
3057          var curPositionClass = this.getPositionClass();
3058          if (curPositionClass) {
3059            this.$element.removeClass(curPositionClass);
3060          }
3061          this.$element.addClass(this.options.positionClass)
3062          /*.hide()*/.css({ height: '', width: '' });
3063          this.classChanged = false;
3064          this.counter = 4;
3065          this.usedPositions.length = 0;
3066        }
3067        /**
3068         * Fires once the dropdown is no longer visible.
3069         * @event Dropdown#hide
3070         */
3071        this.$element.trigger('hide.zf.dropdown', [this.$element]);
3072
3073        if (this.options.trapFocus) {
3074          Foundation.Keyboard.releaseFocus(this.$element);
3075        }
3076      }
3077
3078      /**
3079       * Toggles the dropdown pane's visibility.
3080       * @function
3081       */
3082
3083    }, {
3084      key: 'toggle',
3085      value: function toggle() {
3086        if (this.$element.hasClass('is-open')) {
3087          if (this.$anchor.data('hover')) return;
3088          this.close();
3089        } else {
3090          this.open();
3091        }
3092      }
3093
3094      /**
3095       * Destroys the dropdown.
3096       * @function
3097       */
3098
3099    }, {
3100      key: 'destroy',
3101      value: function destroy() {
3102        this.$element.off('.zf.trigger').hide();
3103        this.$anchor.off('.zf.dropdown');
3104
3105        Foundation.unregisterPlugin(this);
3106      }
3107    }]);
3108
3109    return Dropdown;
3110  }();
3111
3112  Dropdown.defaults = {
3113    /**
3114     * Class that designates bounding container of Dropdown (default: window)
3115     * @option
3116     * @type {?string}
3117     * @default null
3118     */
3119    parentClass: null,
3120    /**
3121     * Amount of time to delay opening a submenu on hover event.
3122     * @option
3123     * @type {number}
3124     * @default 250
3125     */
3126    hoverDelay: 250,
3127    /**
3128     * Allow submenus to open on hover events
3129     * @option
3130     * @type {boolean}
3131     * @default false
3132     */
3133    hover: false,
3134    /**
3135     * Don't close dropdown when hovering over dropdown pane
3136     * @option
3137     * @type {boolean}
3138     * @default false
3139     */
3140    hoverPane: false,
3141    /**
3142     * Number of pixels between the dropdown pane and the triggering element on open.
3143     * @option
3144     * @type {number}
3145     * @default 1
3146     */
3147    vOffset: 1,
3148    /**
3149     * Number of pixels between the dropdown pane and the triggering element on open.
3150     * @option
3151     * @type {number}
3152     * @default 1
3153     */
3154    hOffset: 1,
3155    /**
3156     * Class applied to adjust open position. JS will test and fill this in.
3157     * @option
3158     * @type {string}
3159     * @default ''
3160     */
3161    positionClass: '',
3162    /**
3163     * Allow the plugin to trap focus to the dropdown pane if opened with keyboard commands.
3164     * @option
3165     * @type {boolean}
3166     * @default false
3167     */
3168    trapFocus: false,
3169    /**
3170     * Allow the plugin to set focus to the first focusable element within the pane, regardless of method of opening.
3171     * @option
3172     * @type {boolean}
3173     * @default false
3174     */
3175    autoFocus: false,
3176    /**
3177     * Allows a click on the body to close the dropdown.
3178     * @option
3179     * @type {boolean}
3180     * @default false
3181     */
3182    closeOnClick: false
3183
3184    // Window exports
3185  };Foundation.plugin(Dropdown, 'Dropdown');
3186}(jQuery);
3187
3188'use strict';
3189
3190!function ($) {
3191
3192  /**
3193   * DropdownMenu module.
3194   * @module foundation.dropdown-menu
3195   * @requires foundation.util.keyboard
3196   * @requires foundation.util.box
3197   * @requires foundation.util.nest
3198   */
3199
3200  var DropdownMenu = function () {
3201    /**
3202     * Creates a new instance of DropdownMenu.
3203     * @class
3204     * @fires DropdownMenu#init
3205     * @param {jQuery} element - jQuery object to make into a dropdown menu.
3206     * @param {Object} options - Overrides to the default plugin settings.
3207     */
3208    function DropdownMenu(element, options) {
3209      _classCallCheck(this, DropdownMenu);
3210
3211      this.$element = element;
3212      this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options);
3213
3214      Foundation.Nest.Feather(this.$element, 'dropdown');
3215      this._init();
3216
3217      Foundation.registerPlugin(this, 'DropdownMenu');
3218      Foundation.Keyboard.register('DropdownMenu', {
3219        'ENTER': 'open',
3220        'SPACE': 'open',
3221        'ARROW_RIGHT': 'next',
3222        'ARROW_UP': 'up',
3223        'ARROW_DOWN': 'down',
3224        'ARROW_LEFT': 'previous',
3225        'ESCAPE': 'close'
3226      });
3227    }
3228
3229    /**
3230     * Initializes the plugin, and calls _prepareMenu
3231     * @private
3232     * @function
3233     */
3234
3235
3236    _createClass(DropdownMenu, [{
3237      key: '_init',
3238      value: function _init() {
3239        var subs = this.$element.find('li.is-dropdown-submenu-parent');
3240        this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub');
3241
3242        this.$menuItems = this.$element.find('[role="menuitem"]');
3243        this.$tabs = this.$element.children('[role="menuitem"]');
3244        this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass);
3245
3246        if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) {
3247          this.options.alignment = 'right';
3248          subs.addClass('opens-left');
3249        } else {
3250          subs.addClass('opens-right');
3251        }
3252        this.changed = false;
3253        this._events();
3254      }
3255    }, {
3256      key: '_isVertical',
3257      value: function _isVertical() {
3258        return this.$tabs.css('display') === 'block';
3259      }
3260
3261      /**
3262       * Adds event listeners to elements within the menu
3263       * @private
3264       * @function
3265       */
3266
3267    }, {
3268      key: '_events',
3269      value: function _events() {
3270        var _this = this,
3271            hasTouch = 'ontouchstart' in window || typeof window.ontouchstart !== 'undefined',
3272            parClass = 'is-dropdown-submenu-parent';
3273
3274        // used for onClick and in the keyboard handlers
3275        var handleClickFn = function handleClickFn(e) {
3276          var $elem = $(e.target).parentsUntil('ul', '.' + parClass),
3277              hasSub = $elem.hasClass(parClass),
3278              hasClicked = $elem.attr('data-is-click') === 'true',
3279              $sub = $elem.children('.is-dropdown-submenu');
3280
3281          if (hasSub) {
3282            if (hasClicked) {
3283              if (!_this.options.closeOnClick || !_this.options.clickOpen && !hasTouch || _this.options.forceFollow && hasTouch) {
3284                return;
3285              } else {
3286                e.stopImmediatePropagation();
3287                e.preventDefault();
3288                _this._hide($elem);
3289              }
3290            } else {
3291              e.preventDefault();
3292              e.stopImmediatePropagation();
3293              _this._show($sub);
3294              $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true);
3295            }
3296          }
3297        };
3298
3299        if (this.options.clickOpen || hasTouch) {
3300          this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn);
3301        }
3302
3303        // Handle Leaf element Clicks
3304        if (_this.options.closeOnClickInside) {
3305          this.$menuItems.on('click.zf.dropdownmenu', function (e) {
3306            var $elem = $(this),
3307                hasSub = $elem.hasClass(parClass);
3308            if (!hasSub) {
3309              _this._hide();
3310            }
3311          });
3312        }
3313
3314        if (!this.options.disableHover) {
3315          this.$menuItems.on('mouseenter.zf.dropdownmenu', function (e) {
3316            var $elem = $(this),
3317                hasSub = $elem.hasClass(parClass);
3318
3319            if (hasSub) {
3320              clearTimeout($elem.data('_delay'));
3321              $elem.data('_delay', setTimeout(function () {
3322                _this._show($elem.children('.is-dropdown-submenu'));
3323              }, _this.options.hoverDelay));
3324            }
3325          }).on('mouseleave.zf.dropdownmenu', function (e) {
3326            var $elem = $(this),
3327                hasSub = $elem.hasClass(parClass);
3328            if (hasSub && _this.options.autoclose) {
3329              if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) {
3330                return false;
3331              }
3332
3333              clearTimeout($elem.data('_delay'));
3334              $elem.data('_delay', setTimeout(function () {
3335                _this._hide($elem);
3336              }, _this.options.closingTime));
3337            }
3338          });
3339        }
3340        this.$menuItems.on('keydown.zf.dropdownmenu', function (e) {
3341          var $element = $(e.target).parentsUntil('ul', '[role="menuitem"]'),
3342              isTab = _this.$tabs.index($element) > -1,
3343              $elements = isTab ? _this.$tabs : $element.siblings('li').add($element),
3344              $prevElement,
3345              $nextElement;
3346
3347          $elements.each(function (i) {
3348            if ($(this).is($element)) {
3349              $prevElement = $elements.eq(i - 1);
3350              $nextElement = $elements.eq(i + 1);
3351              return;
3352            }
3353          });
3354
3355          var nextSibling = function nextSibling() {
3356            if (!$element.is(':last-child')) {
3357              $nextElement.children('a:first').focus();
3358              e.preventDefault();
3359            }
3360          },
3361              prevSibling = function prevSibling() {
3362            $prevElement.children('a:first').focus();
3363            e.preventDefault();
3364          },
3365              openSub = function openSub() {
3366            var $sub = $element.children('ul.is-dropdown-submenu');
3367            if ($sub.length) {
3368              _this._show($sub);
3369              $element.find('li > a:first').focus();
3370              e.preventDefault();
3371            } else {
3372              return;
3373            }
3374          },
3375              closeSub = function closeSub() {
3376            //if ($element.is(':first-child')) {
3377            var close = $element.parent('ul').parent('li');
3378            close.children('a:first').focus();
3379            _this._hide(close);
3380            e.preventDefault();
3381            //}
3382          };
3383          var functions = {
3384            open: openSub,
3385            close: function close() {
3386              _this._hide(_this.$element);
3387              _this.$menuItems.find('a:first').focus(); // focus to first element
3388              e.preventDefault();
3389            },
3390            handled: function handled() {
3391              e.stopImmediatePropagation();
3392            }
3393          };
3394
3395          if (isTab) {
3396            if (_this._isVertical()) {
3397              // vertical menu
3398              if (Foundation.rtl()) {
3399                // right aligned
3400                $.extend(functions, {
3401                  down: nextSibling,
3402                  up: prevSibling,
3403                  next: closeSub,
3404                  previous: openSub
3405                });
3406              } else {
3407                // left aligned
3408                $.extend(functions, {
3409                  down: nextSibling,
3410                  up: prevSibling,
3411                  next: openSub,
3412                  previous: closeSub
3413                });
3414              }
3415            } else {
3416              // horizontal menu
3417              if (Foundation.rtl()) {
3418                // right aligned
3419                $.extend(functions, {
3420                  next: prevSibling,
3421                  previous: nextSibling,
3422                  down: openSub,
3423                  up: closeSub
3424                });
3425              } else {
3426                // left aligned
3427                $.extend(functions, {
3428                  next: nextSibling,
3429                  previous: prevSibling,
3430                  down: openSub,
3431                  up: closeSub
3432                });
3433              }
3434            }
3435          } else {
3436            // not tabs -> one sub
3437            if (Foundation.rtl()) {
3438              // right aligned
3439              $.extend(functions, {
3440                next: closeSub,
3441                previous: openSub,
3442                down: nextSibling,
3443                up: prevSibling
3444              });
3445            } else {
3446              // left aligned
3447              $.extend(functions, {
3448                next: openSub,
3449                previous: closeSub,
3450                down: nextSibling,
3451                up: prevSibling
3452              });
3453            }
3454          }
3455          Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions);
3456        });
3457      }
3458
3459      /**
3460       * Adds an event handler to the body to close any dropdowns on a click.
3461       * @function
3462       * @private
3463       */
3464
3465    }, {
3466      key: '_addBodyHandler',
3467      value: function _addBodyHandler() {
3468        var $body = $(document.body),
3469            _this = this;
3470        $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu').on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function (e) {
3471          var $link = _this.$element.find(e.target);
3472          if ($link.length) {
3473            return;
3474          }
3475
3476          _this._hide();
3477          $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu');
3478        });
3479      }
3480
3481      /**
3482       * Opens a dropdown pane, and checks for collisions first.
3483       * @param {jQuery} $sub - ul element that is a submenu to show
3484       * @function
3485       * @private
3486       * @fires DropdownMenu#show
3487       */
3488
3489    }, {
3490      key: '_show',
3491      value: function _show($sub) {
3492        var idx = this.$tabs.index(this.$tabs.filter(function (i, el) {
3493          return $(el).find($sub).length > 0;
3494        }));
3495        var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent');
3496        this._hide($sibs, idx);
3497        $sub.css('visibility', 'hidden').addClass('js-dropdown-active').parent('li.is-dropdown-submenu-parent').addClass('is-active');
3498        var clear = Foundation.Box.ImNotTouchingYou($sub, null, true);
3499        if (!clear) {
3500          var oldClass = this.options.alignment === 'left' ? '-right' : '-left',
3501              $parentLi = $sub.parent('.is-dropdown-submenu-parent');
3502          $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment);
3503          clear = Foundation.Box.ImNotTouchingYou($sub, null, true);
3504          if (!clear) {
3505            $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner');
3506          }
3507          this.changed = true;
3508        }
3509        $sub.css('visibility', '');
3510        if (this.options.closeOnClick) {
3511          this._addBodyHandler();
3512        }
3513        /**
3514         * Fires when the new dropdown pane is visible.
3515         * @event DropdownMenu#show
3516         */
3517        this.$element.trigger('show.zf.dropdownmenu', [$sub]);
3518      }
3519
3520      /**
3521       * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything.
3522       * @function
3523       * @param {jQuery} $elem - element with a submenu to hide
3524       * @param {Number} idx - index of the $tabs collection to hide
3525       * @private
3526       */
3527
3528    }, {
3529      key: '_hide',
3530      value: function _hide($elem, idx) {
3531        var $toClose;
3532        if ($elem && $elem.length) {
3533          $toClose = $elem;
3534        } else if (idx !== undefined) {
3535          $toClose = this.$tabs.not(function (i, el) {
3536            return i === idx;
3537          });
3538        } else {
3539          $toClose = this.$element;
3540        }
3541        var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0;
3542
3543        if (somethingToClose) {
3544          $toClose.find('li.is-active').add($toClose).attr({
3545            'data-is-click': false
3546          }).removeClass('is-active');
3547
3548          $toClose.find('ul.js-dropdown-active').removeClass('js-dropdown-active');
3549
3550          if (this.changed || $toClose.find('opens-inner').length) {
3551            var oldClass = this.options.alignment === 'left' ? 'right' : 'left';
3552            $toClose.find('li.is-dropdown-submenu-parent').add($toClose).removeClass('opens-inner opens-' + this.options.alignment).addClass('opens-' + oldClass);
3553            this.changed = false;
3554          }
3555          /**
3556           * Fires when the open menus are closed.
3557           * @event DropdownMenu#hide
3558           */
3559          this.$element.trigger('hide.zf.dropdownmenu', [$toClose]);
3560        }
3561      }
3562
3563      /**
3564       * Destroys the plugin.
3565       * @function
3566       */
3567
3568    }, {
3569      key: 'destroy',
3570      value: function destroy() {
3571        this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click').removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner');
3572        $(document.body).off('.zf.dropdownmenu');
3573        Foundation.Nest.Burn(this.$element, 'dropdown');
3574        Foundation.unregisterPlugin(this);
3575      }
3576    }]);
3577
3578    return DropdownMenu;
3579  }();
3580
3581  /**
3582   * Default settings for plugin
3583   */
3584
3585
3586  DropdownMenu.defaults = {
3587    /**
3588     * Disallows hover events from opening submenus
3589     * @option
3590     * @type {boolean}
3591     * @default false
3592     */
3593    disableHover: false,
3594    /**
3595     * Allow a submenu to automatically close on a mouseleave event, if not clicked open.
3596     * @option
3597     * @type {boolean}
3598     * @default true
3599     */
3600    autoclose: true,
3601    /**
3602     * Amount of time to delay opening a submenu on hover event.
3603     * @option
3604     * @type {number}
3605     * @default 50
3606     */
3607    hoverDelay: 50,
3608    /**
3609     * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu.
3610     * @option
3611     * @type {boolean}
3612     * @default false
3613     */
3614    clickOpen: false,
3615    /**
3616     * Amount of time to delay closing a submenu on a mouseleave event.
3617     * @option
3618     * @type {number}
3619     * @default 500
3620     */
3621
3622    closingTime: 500,
3623    /**
3624     * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'left'` or `'right'`.
3625     * @option
3626     * @type {string}
3627     * @default 'left'
3628     */
3629    alignment: 'left',
3630    /**
3631     * Allow clicks on the body to close any open submenus.
3632     * @option
3633     * @type {boolean}
3634     * @default true
3635     */
3636    closeOnClick: true,
3637    /**
3638     * Allow clicks on leaf anchor links to close any open submenus.
3639     * @option
3640     * @type {boolean}
3641     * @default true
3642     */
3643    closeOnClickInside: true,
3644    /**
3645     * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class.
3646     * @option
3647     * @type {string}
3648     * @default 'vertical'
3649     */
3650    verticalClass: 'vertical',
3651    /**
3652     * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class.
3653     * @option
3654     * @type {string}
3655     * @default 'align-right'
3656     */
3657    rightClass: 'align-right',
3658    /**
3659     * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile.
3660     * @option
3661     * @type {boolean}
3662     * @default true
3663     */
3664    forceFollow: true
3665  };
3666
3667  // Window exports
3668  Foundation.plugin(DropdownMenu, 'DropdownMenu');
3669}(jQuery);
3670
3671'use strict';
3672
3673!function ($) {
3674
3675  /**
3676   * ResponsiveMenu module.
3677   * @module foundation.responsiveMenu
3678   * @requires foundation.util.triggers
3679   * @requires foundation.util.mediaQuery
3680   */
3681
3682  var ResponsiveMenu = function () {
3683    /**
3684     * Creates a new instance of a responsive menu.
3685     * @class
3686     * @fires ResponsiveMenu#init
3687     * @param {jQuery} element - jQuery object to make into a dropdown menu.
3688     * @param {Object} options - Overrides to the default plugin settings.
3689     */
3690    function ResponsiveMenu(element, options) {
3691      _classCallCheck(this, ResponsiveMenu);
3692
3693      this.$element = $(element);
3694      this.rules = this.$element.data('responsive-menu');
3695      this.currentMq = null;
3696      this.currentPlugin = null;
3697
3698      this._init();
3699      this._events();
3700
3701      Foundation.registerPlugin(this, 'ResponsiveMenu');
3702    }
3703
3704    /**
3705     * Initializes the Menu by parsing the classes from the 'data-ResponsiveMenu' attribute on the element.
3706     * @function
3707     * @private
3708     */
3709
3710
3711    _createClass(ResponsiveMenu, [{
3712      key: '_init',
3713      value: function _init() {
3714        // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules
3715        if (typeof this.rules === 'string') {
3716          var rulesTree = {};
3717
3718          // Parse rules from "classes" pulled from data attribute
3719          var rules = this.rules.split(' ');
3720
3721          // Iterate through every rule found
3722          for (var i = 0; i < rules.length; i++) {
3723            var rule = rules[i].split('-');
3724            var ruleSize = rule.length > 1 ? rule[0] : 'small';
3725            var rulePlugin = rule.length > 1 ? rule[1] : rule[0];
3726
3727            if (MenuPlugins[rulePlugin] !== null) {
3728              rulesTree[ruleSize] = MenuPlugins[rulePlugin];
3729            }
3730          }
3731
3732          this.rules = rulesTree;
3733        }
3734
3735        if (!$.isEmptyObject(this.rules)) {
3736          this._checkMediaQueries();
3737        }
3738        // Add data-mutate since children may need it.
3739        this.$element.attr('data-mutate', this.$element.attr('data-mutate') || Foundation.GetYoDigits(6, 'responsive-menu'));
3740      }
3741
3742      /**
3743       * Initializes events for the Menu.
3744       * @function
3745       * @private
3746       */
3747
3748    }, {
3749      key: '_events',
3750      value: function _events() {
3751        var _this = this;
3752
3753        $(window).on('changed.zf.mediaquery', function () {
3754          _this._checkMediaQueries();
3755        });
3756        // $(window).on('resize.zf.ResponsiveMenu', function() {
3757        //   _this._checkMediaQueries();
3758        // });
3759      }
3760
3761      /**
3762       * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out.
3763       * @function
3764       * @private
3765       */
3766
3767    }, {
3768      key: '_checkMediaQueries',
3769      value: function _checkMediaQueries() {
3770        var matchedMq,
3771            _this = this;
3772        // Iterate through each rule and find the last matching rule
3773        $.each(this.rules, function (key) {
3774          if (Foundation.MediaQuery.atLeast(key)) {
3775            matchedMq = key;
3776          }
3777        });
3778
3779        // No match? No dice
3780        if (!matchedMq) return;
3781
3782        // Plugin already initialized? We good
3783        if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return;
3784
3785        // Remove existing plugin-specific CSS classes
3786        $.each(MenuPlugins, function (key, value) {
3787          _this.$element.removeClass(value.cssClass);
3788        });
3789
3790        // Add the CSS class for the new plugin
3791        this.$element.addClass(this.rules[matchedMq].cssClass);
3792
3793        // Create an instance of the new plugin
3794        if (this.currentPlugin) this.currentPlugin.destroy();
3795        this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {});
3796      }
3797
3798      /**
3799       * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out.
3800       * @function
3801       */
3802
3803    }, {
3804      key: 'destroy',
3805      value: function destroy() {
3806        this.currentPlugin.destroy();
3807        $(window).off('.zf.ResponsiveMenu');
3808        Foundation.unregisterPlugin(this);
3809      }
3810    }]);
3811
3812    return ResponsiveMenu;
3813  }();
3814
3815  ResponsiveMenu.defaults = {};
3816
3817  // The plugin matches the plugin classes with these plugin instances.
3818  var MenuPlugins = {
3819    dropdown: {
3820      cssClass: 'dropdown',
3821      plugin: Foundation._plugins['dropdown-menu'] || null
3822    },
3823    drilldown: {
3824      cssClass: 'drilldown',
3825      plugin: Foundation._plugins['drilldown'] || null
3826    },
3827    accordion: {
3828      cssClass: 'accordion-menu',
3829      plugin: Foundation._plugins['accordion-menu'] || null
3830    }
3831  };
3832
3833  // Window exports
3834  Foundation.plugin(ResponsiveMenu, 'ResponsiveMenu');
3835}(jQuery);
3836
3837'use strict';
3838
3839!function ($) {
3840
3841  /**
3842   * ResponsiveToggle module.
3843   * @module foundation.responsiveToggle
3844   * @requires foundation.util.mediaQuery
3845   */
3846
3847  var ResponsiveToggle = function () {
3848    /**
3849     * Creates a new instance of Tab Bar.
3850     * @class
3851     * @fires ResponsiveToggle#init
3852     * @param {jQuery} element - jQuery object to attach tab bar functionality to.
3853     * @param {Object} options - Overrides to the default plugin settings.
3854     */
3855    function ResponsiveToggle(element, options) {
3856      _classCallCheck(this, ResponsiveToggle);
3857
3858      this.$element = $(element);
3859      this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options);
3860
3861      this._init();
3862      this._events();
3863
3864      Foundation.registerPlugin(this, 'ResponsiveToggle');
3865    }
3866
3867    /**
3868     * Initializes the tab bar by finding the target element, toggling element, and running update().
3869     * @function
3870     * @private
3871     */
3872
3873
3874    _createClass(ResponsiveToggle, [{
3875      key: '_init',
3876      value: function _init() {
3877        var targetID = this.$element.data('responsive-toggle');
3878        if (!targetID) {
3879          console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.');
3880        }
3881
3882        this.$targetMenu = $('#' + targetID);
3883        this.$toggler = this.$element.find('[data-toggle]').filter(function () {
3884          var target = $(this).data('toggle');
3885          return target === targetID || target === "";
3886        });
3887        this.options = $.extend({}, this.options, this.$targetMenu.data());
3888
3889        // If they were set, parse the animation classes
3890        if (this.options.animate) {
3891          var input = this.options.animate.split(' ');
3892
3893          this.animationIn = input[0];
3894          this.animationOut = input[1] || null;
3895        }
3896
3897        this._update();
3898      }
3899
3900      /**
3901       * Adds necessary event handlers for the tab bar to work.
3902       * @function
3903       * @private
3904       */
3905
3906    }, {
3907      key: '_events',
3908      value: function _events() {
3909        var _this = this;
3910
3911        this._updateMqHandler = this._update.bind(this);
3912
3913        $(window).on('changed.zf.mediaquery', this._updateMqHandler);
3914
3915        this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this));
3916      }
3917
3918      /**
3919       * Checks the current media query to determine if the tab bar should be visible or hidden.
3920       * @function
3921       * @private
3922       */
3923
3924    }, {
3925      key: '_update',
3926      value: function _update() {
3927        // Mobile
3928        if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) {
3929          this.$element.show();
3930          this.$targetMenu.hide();
3931        }
3932
3933        // Desktop
3934        else {
3935            this.$element.hide();
3936            this.$targetMenu.show();
3937          }
3938      }
3939
3940      /**
3941       * Toggles the element attached to the tab bar. The toggle only happens if the screen is small enough to allow it.
3942       * @function
3943       * @fires ResponsiveToggle#toggled
3944       */
3945
3946    }, {
3947      key: 'toggleMenu',
3948      value: function toggleMenu() {
3949        var _this5 = this;
3950
3951        if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) {
3952          /**
3953           * Fires when the element attached to the tab bar toggles.
3954           * @event ResponsiveToggle#toggled
3955           */
3956          if (this.options.animate) {
3957            if (this.$targetMenu.is(':hidden')) {
3958              Foundation.Motion.animateIn(this.$targetMenu, this.animationIn, function () {
3959                _this5.$element.trigger('toggled.zf.responsiveToggle');
3960                _this5.$targetMenu.find('[data-mutate]').triggerHandler('mutateme.zf.trigger');
3961              });
3962            } else {
3963              Foundation.Motion.animateOut(this.$targetMenu, this.animationOut, function () {
3964                _this5.$element.trigger('toggled.zf.responsiveToggle');
3965              });
3966            }
3967          } else {
3968            this.$targetMenu.toggle(0);
3969            this.$targetMenu.find('[data-mutate]').trigger('mutateme.zf.trigger');
3970            this.$element.trigger('toggled.zf.responsiveToggle');
3971          }
3972        }
3973      }
3974    }, {
3975      key: 'destroy',
3976      value: function destroy() {
3977        this.$element.off('.zf.responsiveToggle');
3978        this.$toggler.off('.zf.responsiveToggle');
3979
3980        $(window).off('changed.zf.mediaquery', this._updateMqHandler);
3981
3982        Foundation.unregisterPlugin(this);
3983      }
3984    }]);
3985
3986    return ResponsiveToggle;
3987  }();
3988
3989  ResponsiveToggle.defaults = {
3990    /**
3991     * The breakpoint after which the menu is always shown, and the tab bar is hidden.
3992     * @option
3993     * @type {string}
3994     * @default 'medium'
3995     */
3996    hideFor: 'medium',
3997
3998    /**
3999     * To decide if the toggle should be animated or not.
4000     * @option
4001     * @type {boolean}
4002     * @default false
4003     */
4004    animate: false
4005  };
4006
4007  // Window exports
4008  Foundation.plugin(ResponsiveToggle, 'ResponsiveToggle');
4009}(jQuery);
4010
4011'use strict';
4012
4013!function ($) {
4014
4015  /**
4016   * Reveal module.
4017   * @module foundation.reveal
4018   * @requires foundation.util.keyboard
4019   * @requires foundation.util.box
4020   * @requires foundation.util.triggers
4021   * @requires foundation.util.mediaQuery
4022   * @requires foundation.util.motion if using animations
4023   */
4024
4025  var Reveal = function () {
4026    /**
4027     * Creates a new instance of Reveal.
4028     * @class
4029     * @param {jQuery} element - jQuery object to use for the modal.
4030     * @param {Object} options - optional parameters.
4031     */
4032    function Reveal(element, options) {
4033      _classCallCheck(this, Reveal);
4034
4035      this.$element = element;
4036      this.options = $.extend({}, Reveal.defaults, this.$element.data(), options);
4037      this._init();
4038
4039      Foundation.registerPlugin(this, 'Reveal');
4040      Foundation.Keyboard.register('Reveal', {
4041        'ENTER': 'open',
4042        'SPACE': 'open',
4043        'ESCAPE': 'close'
4044      });
4045    }
4046
4047    /**
4048     * Initializes the modal by adding the overlay and close buttons, (if selected).
4049     * @private
4050     */
4051
4052
4053    _createClass(Reveal, [{
4054      key: '_init',
4055      value: function _init() {
4056        this.id = this.$element.attr('id');
4057        this.isActive = false;
4058        this.cached = { mq: Foundation.MediaQuery.current };
4059        this.isMobile = mobileSniff();
4060
4061        this.$anchor = $('[data-open="' + this.id + '"]').length ? $('[data-open="' + this.id + '"]') : $('[data-toggle="' + this.id + '"]');
4062        this.$anchor.attr({
4063          'aria-controls': this.id,
4064          'aria-haspopup': true,
4065          'tabindex': 0
4066        });
4067
4068        if (this.options.fullScreen || this.$element.hasClass('full')) {
4069          this.options.fullScreen = true;
4070          this.options.overlay = false;
4071        }
4072        if (this.options.overlay && !this.$overlay) {
4073          this.$overlay = this._makeOverlay(this.id);
4074        }
4075
4076        this.$element.attr({
4077          'role': 'dialog',
4078          'aria-hidden': true,
4079          'data-yeti-box': this.id,
4080          'data-resize': this.id
4081        });
4082
4083        if (this.$overlay) {
4084          this.$element.detach().appendTo(this.$overlay);
4085        } else {
4086          this.$element.detach().appendTo($(this.options.appendTo));
4087          this.$element.addClass('without-overlay');
4088        }
4089        this._events();
4090        if (this.options.deepLink && window.location.hash === '#' + this.id) {
4091          $(window).one('load.zf.reveal', this.open.bind(this));
4092        }
4093      }
4094
4095      /**
4096       * Creates an overlay div to display behind the modal.
4097       * @private
4098       */
4099
4100    }, {
4101      key: '_makeOverlay',
4102      value: function _makeOverlay() {
4103        return $('<div></div>').addClass('reveal-overlay').appendTo(this.options.appendTo);
4104      }
4105
4106      /**
4107       * Updates position of modal
4108       * TODO:  Figure out if we actually need to cache these values or if it doesn't matter
4109       * @private
4110       */
4111
4112    }, {
4113      key: '_updatePosition',
4114      value: function _updatePosition() {
4115        var width = this.$element.outerWidth();
4116        var outerWidth = $(window).width();
4117        var height = this.$element.outerHeight();
4118        var outerHeight = $(window).height();
4119        var left, top;
4120        if (this.options.hOffset === 'auto') {
4121          left = parseInt((outerWidth - width) / 2, 10);
4122        } else {
4123          left = parseInt(this.options.hOffset, 10);
4124        }
4125        if (this.options.vOffset === 'auto') {
4126          if (height > outerHeight) {
4127            top = parseInt(Math.min(100, outerHeight / 10), 10);
4128          } else {
4129            top = parseInt((outerHeight - height) / 4, 10);
4130          }
4131        } else {
4132          top = parseInt(this.options.vOffset, 10);
4133        }
4134        this.$element.css({ top: top + 'px' });
4135        // only worry about left if we don't have an overlay or we havea  horizontal offset,
4136        // otherwise we're perfectly in the middle
4137        if (!this.$overlay || this.options.hOffset !== 'auto') {
4138          this.$element.css({ left: left + 'px' });
4139          this.$element.css({ margin: '0px' });
4140        }
4141      }
4142
4143      /**
4144       * Adds event handlers for the modal.
4145       * @private
4146       */
4147
4148    }, {
4149      key: '_events',
4150      value: function _events() {
4151        var _this6 = this;
4152
4153        var _this = this;
4154
4155        this.$element.on({
4156          'open.zf.trigger': this.open.bind(this),
4157          'close.zf.trigger': function closeZfTrigger(event, $element) {
4158            if (event.target === _this.$element[0] || $(event.target).parents('[data-closable]')[0] === $element) {
4159              // only close reveal when it's explicitly called
4160              return _this6.close.apply(_this6);
4161            }
4162          },
4163          'toggle.zf.trigger': this.toggle.bind(this),
4164          'resizeme.zf.trigger': function resizemeZfTrigger() {
4165            _this._updatePosition();
4166          }
4167        });
4168
4169        if (this.$anchor.length) {
4170          this.$anchor.on('keydown.zf.reveal', function (e) {
4171            if (e.which === 13 || e.which === 32) {
4172              e.stopPropagation();
4173              e.preventDefault();
4174              _this.open();
4175            }
4176          });
4177        }
4178
4179        if (this.options.closeOnClick && this.options.overlay) {
4180          this.$overlay.off('.zf.reveal').on('click.zf.reveal', function (e) {
4181            if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) {
4182              return;
4183            }
4184            _this.close();
4185          });
4186        }
4187        if (this.options.deepLink) {
4188          $(window).on('popstate.zf.reveal:' + this.id, this._handleState.bind(this));
4189        }
4190      }
4191
4192      /**
4193       * Handles modal methods on back/forward button clicks or any other event that triggers popstate.
4194       * @private
4195       */
4196
4197    }, {
4198      key: '_handleState',
4199      value: function _handleState(e) {
4200        if (window.location.hash === '#' + this.id && !this.isActive) {
4201          this.open();
4202        } else {
4203          this.close();
4204        }
4205      }
4206
4207      /**
4208       * Opens the modal controlled by `this.$anchor`, and closes all others by default.
4209       * @function
4210       * @fires Reveal#closeme
4211       * @fires Reveal#open
4212       */
4213
4214    }, {
4215      key: 'open',
4216      value: function open() {
4217        var _this7 = this;
4218
4219        if (this.options.deepLink) {
4220          var hash = '#' + this.id;
4221
4222          if (window.history.pushState) {
4223            window.history.pushState(null, null, hash);
4224          } else {
4225            window.location.hash = hash;
4226          }
4227        }
4228
4229        this.isActive = true;
4230
4231        // Make elements invisible, but remove display: none so we can get size and positioning
4232        this.$element.css({ 'visibility': 'hidden' }).show().scrollTop(0);
4233        if (this.options.overlay) {
4234          this.$overlay.css({ 'visibility': 'hidden' }).show();
4235        }
4236
4237        this._updatePosition();
4238
4239        this.$element.hide().css({ 'visibility': '' });
4240
4241        if (this.$overlay) {
4242          this.$overlay.css({ 'visibility': '' }).hide();
4243          if (this.$element.hasClass('fast')) {
4244            this.$overlay.addClass('fast');
4245          } else if (this.$element.hasClass('slow')) {
4246            this.$overlay.addClass('slow');
4247          }
4248        }
4249
4250        if (!this.options.multipleOpened) {
4251          /**
4252           * Fires immediately before the modal opens.
4253           * Closes any other modals that are currently open
4254           * @event Reveal#closeme
4255           */
4256          this.$element.trigger('closeme.zf.reveal', this.id);
4257        }
4258
4259        var _this = this;
4260
4261        function addRevealOpenClasses() {
4262          if (_this.isMobile) {
4263            if (!_this.originalScrollPos) {
4264              _this.originalScrollPos = window.pageYOffset;
4265            }
4266            $('html, body').addClass('is-reveal-open');
4267          } else {
4268            $('body').addClass('is-reveal-open');
4269          }
4270        }
4271        // Motion UI method of reveal
4272        if (this.options.animationIn) {
4273          var afterAnimation = function afterAnimation() {
4274            _this.$element.attr({
4275              'aria-hidden': false,
4276              'tabindex': -1
4277            }).focus();
4278            addRevealOpenClasses();
4279            Foundation.Keyboard.trapFocus(_this.$element);
4280          };
4281
4282          if (this.options.overlay) {
4283            Foundation.Motion.animateIn(this.$overlay, 'fade-in');
4284          }
4285          Foundation.Motion.animateIn(this.$element, this.options.animationIn, function () {
4286            if (_this7.$element) {
4287              // protect against object having been removed
4288              _this7.focusableElements = Foundation.Keyboard.findFocusable(_this7.$element);
4289              afterAnimation();
4290            }
4291          });
4292        }
4293        // jQuery method of reveal
4294        else {
4295            if (this.options.overlay) {
4296              this.$overlay.show(0);
4297            }
4298            this.$element.show(this.options.showDelay);
4299          }
4300
4301        // handle accessibility
4302        this.$element.attr({
4303          'aria-hidden': false,
4304          'tabindex': -1
4305        }).focus();
4306        Foundation.Keyboard.trapFocus(this.$element);
4307
4308        /**
4309         * Fires when the modal has successfully opened.
4310         * @event Reveal#open
4311         */
4312        this.$element.trigger('open.zf.reveal');
4313
4314        addRevealOpenClasses();
4315
4316        setTimeout(function () {
4317          _this7._extraHandlers();
4318        }, 0);
4319      }
4320
4321      /**
4322       * Adds extra event handlers for the body and window if necessary.
4323       * @private
4324       */
4325
4326    }, {
4327      key: '_extraHandlers',
4328      value: function _extraHandlers() {
4329        var _this = this;
4330        if (!this.$element) {
4331          return;
4332        } // If we're in the middle of cleanup, don't freak out
4333        this.focusableElements = Foundation.Keyboard.findFocusable(this.$element);
4334
4335        if (!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen) {
4336          $('body').on('click.zf.reveal', function (e) {
4337            if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) {
4338              return;
4339            }
4340            _this.close();
4341          });
4342        }
4343
4344        if (this.options.closeOnEsc) {
4345          $(window).on('keydown.zf.reveal', function (e) {
4346            Foundation.Keyboard.handleKey(e, 'Reveal', {
4347              close: function close() {
4348                if (_this.options.closeOnEsc) {
4349                  _this.close();
4350                  _this.$anchor.focus();
4351                }
4352              }
4353            });
4354          });
4355        }
4356
4357        // lock focus within modal while tabbing
4358        this.$element.on('keydown.zf.reveal', function (e) {
4359          var $target = $(this);
4360          // handle keyboard event with keyboard util
4361          Foundation.Keyboard.handleKey(e, 'Reveal', {
4362            open: function open() {
4363              if (_this.$element.find(':focus').is(_this.$element.find('[data-close]'))) {
4364                setTimeout(function () {
4365                  // set focus back to anchor if close button has been activated
4366                  _this.$anchor.focus();
4367                }, 1);
4368              } else if ($target.is(_this.focusableElements)) {
4369                // dont't trigger if acual element has focus (i.e. inputs, links, ...)
4370                _this.open();
4371              }
4372            },
4373            close: function close() {
4374              if (_this.options.closeOnEsc) {
4375                _this.close();
4376                _this.$anchor.focus();
4377              }
4378            },
4379            handled: function handled(preventDefault) {
4380              if (preventDefault) {
4381                e.preventDefault();
4382              }
4383            }
4384          });
4385        });
4386      }
4387
4388      /**
4389       * Closes the modal.
4390       * @function
4391       * @fires Reveal#closed
4392       */
4393
4394    }, {
4395      key: 'close',
4396      value: function close() {
4397        if (!this.isActive || !this.$element.is(':visible')) {
4398          return false;
4399        }
4400        var _this = this;
4401
4402        // Motion UI method of hiding
4403        if (this.options.animationOut) {
4404          if (this.options.overlay) {
4405            Foundation.Motion.animateOut(this.$overlay, 'fade-out', finishUp);
4406          } else {
4407            finishUp();
4408          }
4409
4410          Foundation.Motion.animateOut(this.$element, this.options.animationOut);
4411        }
4412        // jQuery method of hiding
4413        else {
4414
4415            this.$element.hide(this.options.hideDelay);
4416
4417            if (this.options.overlay) {
4418              this.$overlay.hide(0, finishUp);
4419            } else {
4420              finishUp();
4421            }
4422          }
4423
4424        // Conditionals to remove extra event listeners added on open
4425        if (this.options.closeOnEsc) {
4426          $(window).off('keydown.zf.reveal');
4427        }
4428
4429        if (!this.options.overlay && this.options.closeOnClick) {
4430          $('body').off('click.zf.reveal');
4431        }
4432
4433        this.$element.off('keydown.zf.reveal');
4434
4435        function finishUp() {
4436          if (_this.isMobile) {
4437            if ($('.reveal:visible').length === 0) {
4438              $('html, body').removeClass('is-reveal-open');
4439            }
4440            if (_this.originalScrollPos) {
4441              $('body').scrollTop(_this.originalScrollPos);
4442              _this.originalScrollPos = null;
4443            }
4444          } else {
4445            if ($('.reveal:visible').length === 0) {
4446              $('body').removeClass('is-reveal-open');
4447            }
4448          }
4449
4450          Foundation.Keyboard.releaseFocus(_this.$element);
4451
4452          _this.$element.attr('aria-hidden', true);
4453
4454          /**
4455          * Fires when the modal is done closing.
4456          * @event Reveal#closed
4457          */
4458          _this.$element.trigger('closed.zf.reveal');
4459        }
4460
4461        /**
4462        * Resets the modal content
4463        * This prevents a running video to keep going in the background
4464        */
4465        if (this.options.resetOnClose) {
4466          this.$element.html(this.$element.html());
4467        }
4468
4469        this.isActive = false;
4470        if (_this.options.deepLink) {
4471          if (window.history.replaceState) {
4472            window.history.replaceState('', document.title, window.location.href.replace('#' + this.id, ''));
4473          } else {
4474            window.location.hash = '';
4475          }
4476        }
4477      }
4478
4479      /**
4480       * Toggles the open/closed state of a modal.
4481       * @function
4482       */
4483
4484    }, {
4485      key: 'toggle',
4486      value: function toggle() {
4487        if (this.isActive) {
4488          this.close();
4489        } else {
4490          this.open();
4491        }
4492      }
4493    }, {
4494      key: 'destroy',
4495
4496
4497      /**
4498       * Destroys an instance of a modal.
4499       * @function
4500       */
4501      value: function destroy() {
4502        if (this.options.overlay) {
4503          this.$element.appendTo($(this.options.appendTo)); // move $element outside of $overlay to prevent error unregisterPlugin()
4504          this.$overlay.hide().off().remove();
4505        }
4506        this.$element.hide().off();
4507        this.$anchor.off('.zf');
4508        $(window).off('.zf.reveal:' + this.id);
4509
4510        Foundation.unregisterPlugin(this);
4511      }
4512    }]);
4513
4514    return Reveal;
4515  }();
4516
4517  Reveal.defaults = {
4518    /**
4519     * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide.
4520     * @option
4521     * @type {string}
4522     * @default ''
4523     */
4524    animationIn: '',
4525    /**
4526     * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide.
4527     * @option
4528     * @type {string}
4529     * @default ''
4530     */
4531    animationOut: '',
4532    /**
4533     * Time, in ms, to delay the opening of a modal after a click if no animation used.
4534     * @option
4535     * @type {number}
4536     * @default 0
4537     */
4538    showDelay: 0,
4539    /**
4540     * Time, in ms, to delay the closing of a modal after a click if no animation used.
4541     * @option
4542     * @type {number}
4543     * @default 0
4544     */
4545    hideDelay: 0,
4546    /**
4547     * Allows a click on the body/overlay to close the modal.
4548     * @option
4549     * @type {boolean}
4550     * @default true
4551     */
4552    closeOnClick: true,
4553    /**
4554     * Allows the modal to close if the user presses the `ESCAPE` key.
4555     * @option
4556     * @type {boolean}
4557     * @default true
4558     */
4559    closeOnEsc: true,
4560    /**
4561     * If true, allows multiple modals to be displayed at once.
4562     * @option
4563     * @type {boolean}
4564     * @default false
4565     */
4566    multipleOpened: false,
4567    /**
4568     * Distance, in pixels, the modal should push down from the top of the screen.
4569     * @option
4570     * @type {number|string}
4571     * @default auto
4572     */
4573    vOffset: 'auto',
4574    /**
4575     * Distance, in pixels, the modal should push in from the side of the screen.
4576     * @option
4577     * @type {number|string}
4578     * @default auto
4579     */
4580    hOffset: 'auto',
4581    /**
4582     * Allows the modal to be fullscreen, completely blocking out the rest of the view. JS checks for this as well.
4583     * @option
4584     * @type {boolean}
4585     * @default false
4586     */
4587    fullScreen: false,
4588    /**
4589     * Percentage of screen height the modal should push up from the bottom of the view.
4590     * @option
4591     * @type {number}
4592     * @default 10
4593     */
4594    btmOffsetPct: 10,
4595    /**
4596     * Allows the modal to generate an overlay div, which will cover the view when modal opens.
4597     * @option
4598     * @type {boolean}
4599     * @default true
4600     */
4601    overlay: true,
4602    /**
4603     * Allows the modal to remove and reinject markup on close. Should be true if using video elements w/o using provider's api, otherwise, videos will continue to play in the background.
4604     * @option
4605     * @type {boolean}
4606     * @default false
4607     */
4608    resetOnClose: false,
4609    /**
4610     * Allows the modal to alter the url on open/close, and allows the use of the `back` button to close modals. ALSO, allows a modal to auto-maniacally open on page load IF the hash === the modal'
4610s user-set id.
4611     * @option
4612     * @type {boolean}
4613     * @default false
4614     */
4615    deepLink: false,
4616    /**
4617    * Allows the modal to append to custom div.
4618    * @option
4619    * @type {string}
4620    * @default "body"
4621    */
4622    appendTo: "body"
4623
4624  };
4625
4626  // Window exports
4627  Foundation.plugin(Reveal, 'Reveal');
4628
4629  function iPhoneSniff() {
4630    return (/iP(ad|hone|od).*OS/.test(window.navigator.userAgent)
4631    );
4632  }
4633
4634  function androidSniff() {
4635    return (/Android/.test(window.navigator.userAgent)
4636    );
4637  }
4638
4639  function mobileSniff() {
4640    return iPhoneSniff() || androidSniff();
4641  }
4642}(jQuery);
4643
4644'use strict';
4645
4646!function ($) {
4647
4648  /**
4649   * Tabs module.
4650   * @module foundation.tabs
4651   * @requires foundation.util.keyboard
4652   * @requires foundation.util.timerAndImageLoader if tabs contain images
4653   */
4654
4655  var Tabs = function () {
4656    /**
4657     * Creates a new instance of tabs.
4658     * @class
4659     * @fires Tabs#init
4660     * @param {jQuery} element - jQuery object to make into tabs.
4661     * @param {Object} options - Overrides to the default plugin settings.
4662     */
4663    function Tabs(element, options) {
4664      _classCallCheck(this, Tabs);
4665
4666      this.$element = element;
4667      this.options = $.extend({}, Tabs.defaults, this.$element.data(), options);
4668
4669      this._init();
4670      Foundation.registerPlugin(this, 'Tabs');
4671      Foundation.Keyboard.register('Tabs', {
4672        'ENTER': 'open',
4673        'SPACE': 'open',
4674        'ARROW_RIGHT': 'next',
4675        'ARROW_UP': 'previous',
4676        'ARROW_DOWN': 'next',
4677        'ARROW_LEFT': 'previous'
4678        // 'TAB': 'next',
4679        // 'SHIFT_TAB': 'previous'
4680      });
4681    }
4682
4683    /**
4684     * Initializes the tabs by showing and focusing (if autoFocus=true) the preset active tab.
4685     * @private
4686     */
4687
4688
4689    _createClass(Tabs, [{
4690      key: '_init',
4691      value: function _init() {
4692        var _this8 = this;
4693
4694        var _this = this;
4695
4696        this.$element.attr({ 'role': 'tablist' });
4697        this.$tabTitles = this.$element.find('.' + this.options.linkClass);
4698        this.$tabContent = $('[data-tabs-content="' + this.$element[0].id + '"]');
4699
4700        this.$tabTitles.each(function () {
4701          var $elem = $(this),
4702              $link = $elem.find('a'),
4703              isActive = $elem.hasClass('' + _this.options.linkActiveClass),
4704              hash = $link[0].hash.slice(1),
4705              linkId = $link[0].id ? $link[0].id : hash + '-label',
4706              $tabContent = $('#' + hash);
4707
4708          $elem.attr({ 'role': 'presentation' });
4709
4710          $link.attr({
4711            'role': 'tab',
4712            'aria-controls': hash,
4713            'aria-selected': isActive,
4714            'id': linkId
4715          });
4716
4717          $tabContent.attr({
4718            'role': 'tabpanel',
4719            'aria-hidden': !isActive,
4720            'aria-labelledby': linkId
4721          });
4722
4723          if (isActive && _this.options.autoFocus) {
4724            $(window).load(function () {
4725              $('html, body').animate({ scrollTop: $elem.offset().top }, _this.options.deepLinkSmudgeDelay, function () {
4726                $link.focus();
4727              });
4728            });
4729          }
4730        });
4731        if (this.options.matchHeight) {
4732          var $images = this.$tabContent.find('img');
4733
4734          if ($images.length) {
4735            Foundation.onImagesLoaded($images, this._setHeight.bind(this));
4736          } else {
4737            this._setHeight();
4738          }
4739        }
4740
4741        //current context-bound function to open tabs on page load or history popstate
4742        this._checkDeepLink = function () {
4743          var anchor = window.location.hash;
4744          //need a hash and a relevant anchor in this tabset
4745          if (anchor.length) {
4746            var $link = _this8.$element.find('[href$="' + anchor + '"]');
4747            if ($link.length) {
4748              _this8.selectTab($(anchor), true);
4749
4750              //roll up a little to show the titles
4751              if (_this8.options.deepLinkSmudge) {
4752                var offset = _this8.$element.offset();
4753                $('html, body').animate({ scrollTop: offset.top }, _this8.options.deepLinkSmudgeDelay);
4754              }
4755
4756              /**
4757                * Fires when the zplugin has deeplinked at pageload
4758                * @event Tabs#deeplink
4759                */
4760              _this8.$element.trigger('deeplink.zf.tabs', [$link, $(anchor)]);
4761            }
4762          }
4763        };
4764
4765        //use browser to open a tab, if it exists in this tabset
4766        if (this.options.deepLink) {
4767          this._checkDeepLink();
4768        }
4769
4770        this._events();
4771      }
4772
4773      /**
4774       * Adds event handlers for items within the tabs.
4775       * @private
4776       */
4777
4778    }, {
4779      key: '_events',
4780      value: function _events() {
4781        this._addKeyHandler();
4782        this._addClickHandler();
4783        this._setHeightMqHandler = null;
4784
4785        if (this.options.matchHeight) {
4786          this._setHeightMqHandler = this._setHeight.bind(this);
4787
4788          $(window).on('changed.zf.mediaquery', this._setHeightMqHandler);
4789        }
4790
4791        if (this.options.deepLink) {
4792          $(window).on('popstate', this._checkDeepLink);
4793        }
4794      }
4795
4796      /**
4797       * Adds click handlers for items within the tabs.
4798       * @private
4799       */
4800
4801    }, {
4802      key: '_addClickHandler',
4803      value: function _addClickHandler() {
4804        var _this = this;
4805
4806        this.$element.off('click.zf.tabs').on('click.zf.tabs', '.' + this.options.linkClass, function (e) {
4807          e.preventDefault();
4808          e.stopPropagation();
4809          _this._handleTabChange($(this));
4810        });
4811      }
4812
4813      /**
4814       * Adds keyboard event handlers for items within the tabs.
4815       * @private
4816       */
4817
4818    }, {
4819      key: '_addKeyHandler',
4820      value: function _addKeyHandler() {
4821        var _this = this;
4822
4823        this.$tabTitles.off('keydown.zf.tabs').on('keydown.zf.tabs', function (e) {
4824          if (e.which === 9) return;
4825
4826          var $element = $(this),
4827              $elements = $element.parent('ul').children('li'),
4828              $prevElement,
4829              $nextElement;
4830
4831          $elements.each(function (i) {
4832            if ($(this).is($element)) {
4833              if (_this.options.wrapOnKeys) {
4834                $prevElement = i === 0 ? $elements.last() : $elements.eq(i - 1);
4835                $nextElement = i === $elements.length - 1 ? $elements.first() : $elements.eq(i + 1);
4836              } else {
4837                $prevElement = $elements.eq(Math.max(0, i - 1));
4838                $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
4839              }
4840              return;
4841            }
4842          });
4843
4844          // handle keyboard event with keyboard util
4845          Foundation.Keyboard.handleKey(e, 'Tabs', {
4846            open: function open() {
4847              $element.find('[role="tab"]').focus();
4848              _this._handleTabChange($element);
4849            },
4850            previous: function previous() {
4851              $prevElement.find('[role="tab"]').focus();
4852              _this._handleTabChange($prevElement);
4853            },
4854            next: function next() {
4855              $nextElement.find('[role="tab"]').focus();
4856              _this._handleTabChange($nextElement);
4857            },
4858            handled: function handled() {
4859              e.stopPropagation();
4860              e.preventDefault();
4861            }
4862          });
4863        });
4864      }
4865
4866      /**
4867       * Opens the tab `$targetContent` defined by `$target`. Collapses active tab.
4868       * @param {jQuery} $target - Tab to open.
4869       * @param {boolean} historyHandled - browser has already handled a history update
4870       * @fires Tabs#change
4871       * @function
4872       */
4873
4874    }, {
4875      key: '_handleTabChange',
4876      value: function _handleTabChange($target, historyHandled) {
4877
4878        /**
4879         * Check for active class on target. Collapse if exists.
4880         */
4881        if ($target.hasClass('' + this.options.linkActiveClass)) {
4882          if (this.options.activeCollapse) {
4883            this._collapseTab($target);
4884
4885            /**
4886             * Fires when the zplugin has successfully collapsed tabs.
4887             * @event Tabs#collapse
4888             */
4889            this.$element.trigger('collapse.zf.tabs', [$target]);
4890          }
4891          return;
4892        }
4893
4894        var $oldTab = this.$element.find('.' + this.options.linkClass + '.' + this.options.linkActiveClass),
4895            $tabLink = $target.find('[role="tab"]'),
4896            hash = $tabLink[0].hash,
4897            $targetContent = this.$tabContent.find(hash);
4898
4899        //close old tab
4900        this._collapseTab($oldTab);
4901
4902        //open new tab
4903        this._openTab($target);
4904
4905        //either replace or update browser history
4906        if (this.options.deepLink && !historyHandled) {
4907          var anchor = $target.find('a').attr('href');
4908
4909          if (this.options.updateHistory) {
4910            history.pushState({}, '', anchor);
4911          } else {
4912            history.replaceState({}, '', anchor);
4913          }
4914        }
4915
4916        /**
4917         * Fires when the plugin has successfully changed tabs.
4918         * @event Tabs#change
4919         */
4920        this.$element.trigger('change.zf.tabs', [$target, $targetContent]);
4921
4922        //fire to children a mutation event
4923        $targetContent.find("[data-mutate]").trigger("mutateme.zf.trigger");
4924      }
4925
4926      /**
4927       * Opens the tab `$targetContent` defined by `$target`.
4928       * @param {jQuery} $target - Tab to Open.
4929       * @function
4930       */
4931
4932    }, {
4933      key: '_openTab',
4934      value: function _openTab($target) {
4935        var $tabLink = $target.find('[role="tab"]'),
4936            hash = $tabLink[0].hash,
4937            $targetContent = this.$tabContent.find(hash);
4938
4939        $target.addClass('' + this.options.linkActiveClass);
4940
4941        $tabLink.attr({ 'aria-selected': 'true' });
4942
4943        $targetContent.addClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'false' });
4944      }
4945
4946      /**
4947       * Collapses `$targetContent` defined by `$target`.
4948       * @param {jQuery} $target - Tab to Open.
4949       * @function
4950       */
4951
4952    }, {
4953      key: '_collapseTab',
4954      value: function _collapseTab($target) {
4955        var $target_anchor = $target.removeClass('' + this.options.linkActiveClass).find('[role="tab"]').attr({ 'aria-selected': 'false' });
4956
4957        $('#' + $target_anchor.attr('aria-controls')).removeClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'true' });
4958      }
4959
4960      /**
4961       * Public method for selecting a content pane to display.
4962       * @param {jQuery | String} elem - jQuery object or string of the id of the pane to display.
4963       * @param {boolean} historyHandled - browser has already handled a history update
4964       * @function
4965       */
4966
4967    }, {
4968      key: 'selectTab',
4969      value: function selectTab(elem, historyHandled) {
4970        var idStr;
4971
4972        if ((typeof elem === 'undefined' ? 'undefined' : _typeof(elem)) === 'object') {
4973          idStr = elem[0].id;
4974        } else {
4975          idStr = elem;
4976        }
4977
4978        if (idStr.indexOf('#') < 0) {
4979          idStr = '#' + idStr;
4980        }
4981
4982        var $target = this.$tabTitles.find('[href$="' + idStr + '"]').parent('.' + this.options.linkClass);
4983
4984        this._handleTabChange($target, historyHandled);
4985      }
4986    }, {
4987      key: '_setHeight',
4988
4989      /**
4990       * Sets the height of each panel to the height of the tallest panel.
4991       * If enabled in options, gets called on media query change.
4992       * If loading content via external source, can be called directly or with _reflow.
4993       * If enabled with `data-match-height="true"`, tabs sets to equal height
4994       * @function
4995       * @private
4996       */
4997      value: function _setHeight() {
4998        var max = 0,
4999            _this = this; // Lock down the `this` value for the root tabs object
5000
5001        this.$tabContent.find('.' + this.options.panelClass).css('height', '').each(function () {
5002
5003          var panel = $(this),
5004              isActive = panel.hasClass('' + _this.options.panelActiveClass); // get the options from the parent instead of trying to get them from the child
5005
5006          if (!isActive) {
5007            panel.css({ 'visibility': 'hidden', 'display': 'block' });
5008          }
5009
5010          var temp = this.getBoundingClientRect().height;
5011
5012          if (!isActive) {
5013            panel.css({
5014              'visibility': '',
5015              'display': ''
5016            });
5017          }
5018
5019          max = temp > max ? temp : max;
5020        }).css('height', max + 'px');
5021      }
5022
5023      /**
5024       * Destroys an instance of an tabs.
5025       * @fires Tabs#destroyed
5026       */
5027
5028    }, {
5029      key: 'destroy',
5030      value: function destroy() {
5031        this.$element.find('.' + this.options.linkClass).off('.zf.tabs').hide().end().find('.' + this.options.panelClass).hide();
5032
5033        if (this.options.matchHeight) {
5034          if (this._setHeightMqHandler != null) {
5035            $(window).off('changed.zf.mediaquery', this._setHeightMqHandler);
5036          }
5037        }
5038
5039        if (this.options.deepLink) {
5040          $(window).off('popstate', this._checkDeepLink);
5041        }
5042
5043        Foundation.unregisterPlugin(this);
5044      }
5045    }]);
5046
5047    return Tabs;
5048  }();
5049
5050  Tabs.defaults = {
5051    /**
5052     * Allows the window to scroll to content of pane specified by hash anchor
5053     * @option
5054     * @type {boolean}
5055     * @default false
5056     */
5057    deepLink: false,
5058
5059    /**
5060     * Adjust the deep link scroll to make sure the top of the tab panel is visible
5061     * @option
5062     * @type {boolean}
5063     * @default false
5064     */
5065    deepLinkSmudge: false,
5066
5067    /**
5068     * Animation time (ms) for the deep link adjustment
5069     * @option
5070     * @type {number}
5071     * @default 300
5072     */
5073    deepLinkSmudgeDelay: 300,
5074
5075    /**
5076     * Update the browser history with the open tab
5077     * @option
5078     * @type {boolean}
5079     * @default false
5080     */
5081    updateHistory: false,
5082
5083    /**
5084     * Allows the window to scroll to content of active pane on load if set to true.
5085     * Not recommended if more than one tab panel per page.
5086     * @option
5087     * @type {boolean}
5088     * @default false
5089     */
5090    autoFocus: false,
5091
5092    /**
5093     * Allows keyboard input to 'wrap' around the tab links.
5094     * @option
5095     * @type {boolean}
5096     * @default true
5097     */
5098    wrapOnKeys: true,
5099
5100    /**
5101     * Allows the tab content panes to match heights if set to true.
5102     * @option
5103     * @type {boolean}
5104     * @default false
5105     */
5106    matchHeight: false,
5107
5108    /**
5109     * Allows active tabs to collapse when clicked.
5110     * @option
5111     * @type {boolean}
5112     * @default false
5113     */
5114    activeCollapse: false,
5115
5116    /**
5117     * Class applied to `li`'s in tab link list.
5118     * @option
5119     * @type {string}
5120     * @default 'tabs-title'
5121     */
5122    linkClass: 'tabs-title',
5123
5124    /**
5125     * Class applied to the active `li` in tab link list.
5126     * @option
5127     * @type {string}
5128     * @default 'is-active'
5129     */
5130    linkActiveClass: 'is-active',
5131
5132    /**
5133     * Class applied to the content containers.
5134     * @option
5135     * @type {string}
5136     * @default 'tabs-panel'
5137     */
5138    panelClass: 'tabs-panel',
5139
5140    /**
5141     * Class applied to the active content container.
5142     * @option
5143     * @type {string}
5144     * @default 'is-active'
5145     */
5146    panelActiveClass: 'is-active'
5147  };
5148
5149  // Window exports
5150  Foundation.plugin(Tabs, 'Tabs');
5151}(jQuery);
5152
5153'use strict';
5154
5155!function ($) {
5156
5157  /**
5158   * Toggler module.
5159   * @module foundation.toggler
5160   * @requires foundation.util.motion
5161   * @requires foundation.util.triggers
5162   */
5163
5164  var Toggler = function () {
5165    /**
5166     * Creates a new instance of Toggler.
5167     * @class
5168     * @fires Toggler#init
5169     * @param {Object} element - jQuery object to add the trigger to.
5170     * @param {Object} options - Overrides to the default plugin settings.
5171     */
5172    function Toggler(element, options) {
5173      _classCallCheck(this, Toggler);
5174
5175      this.$element = element;
5176      this.options = $.extend({}, Toggler.defaults, element.data(), options);
5177      this.className = '';
5178
5179      this._init();
5180      this._events();
5181
5182      Foundation.registerPlugin(this, 'Toggler');
5183    }
5184
5185    /**
5186     * Initializes the Toggler plugin by parsing the toggle class from data-toggler, or animation classes from data-animate.
5187     * @function
5188     * @private
5189     */
5190
5191
5192    _createClass(Toggler, [{
5193      key: '_init',
5194      value: function _init() {
5195        var input;
5196        // Parse animation classes if they were set
5197        if (this.options.animate) {
5198          input = this.options.animate.split(' ');
5199
5200          this.animationIn = input[0];
5201          this.animationOut = input[1] || null;
5202        }
5203        // Otherwise, parse toggle class
5204        else {
5205            input = this.$element.data('toggler');
5206            // Allow for a . at the beginning of the string
5207            this.className = input[0] === '.' ? input.slice(1) : input;
5208          }
5209
5210        // Add ARIA attributes to triggers
5211        var id = this.$element[0].id;
5212        $('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-controls', id);
5213        // If the target is hidden, add aria-hidden
5214        this.$element.attr('aria-expanded', this.$element.is(':hidden') ? false : true);
5215      }
5216
5217      /**
5218       * Initializes events for the toggle trigger.
5219       * @function
5220       * @private
5221       */
5222
5223    }, {
5224      key: '_events',
5225      value: function _events() {
5226        this.$element.off('toggle.zf.trigger').on('toggle.zf.trigger', this.toggle.bind(this));
5227      }
5228
5229      /**
5230       * Toggles the target class on the target element. An event is fired from the original trigger depending on if the resultant state was "on" or "off".
5231       * @function
5232       * @fires Toggler#on
5233       * @fires Toggler#off
5234       */
5235
5236    }, {
5237      key: 'toggle',
5238      value: function toggle() {
5239        this[this.options.animate ? '_toggleAnimate' : '_toggleClass']();
5240      }
5241    }, {
5242      key: '_toggleClass',
5243      value: function _toggleClass() {
5244        this.$element.toggleClass(this.className);
5245
5246        var isOn = this.$element.hasClass(this.className);
5247        if (isOn) {
5248          /**
5249           * Fires if the target element has the class after a toggle.
5250           * @event Toggler#on
5251           */
5252          this.$element.trigger('on.zf.toggler');
5253        } else {
5254          /**
5255           * Fires if the target element does not have the class after a toggle.
5256           * @event Toggler#off
5257           */
5258          this.$element.trigger('off.zf.toggler');
5259        }
5260
5261        this._updateARIA(isOn);
5262        this.$element.find('[data-mutate]').trigger('mutateme.zf.trigger');
5263      }
5264    }, {
5265      key: '_toggleAnimate',
5266      value: function _toggleAnimate() {
5267        var _this = this;
5268
5269        if (this.$element.is(':hidden')) {
5270          Foundation.Motion.animateIn(this.$element, this.animationIn, function () {
5271            _this._updateARIA(true);
5272            this.trigger('on.zf.toggler');
5273            this.find('[data-mutate]').trigger('mutateme.zf.trigger');
5274          });
5275        } else {
5276          Foundation.Motion.animateOut(this.$element, this.animationOut, function () {
5277            _this._updateARIA(false);
5278            this.trigger('off.zf.toggler');
5279            this.find('[data-mutate]').trigger('mutateme.zf.trigger');
5280          });
5281        }
5282      }
5283    }, {
5284      key: '_updateARIA',
5285      value: function _updateARIA(isOn) {
5286        this.$element.attr('aria-expanded', isOn ? true : false);
5287      }
5288
5289      /**
5290       * Destroys the instance of Toggler on the element.
5291       * @function
5292       */
5293
5294    }, {
5295      key: 'destroy',
5296      value: function destroy() {
5297        this.$element.off('.zf.toggler');
5298        Foundation.unregisterPlugin(this);
5299      }
5300    }]);
5301
5302    return Toggler;
5303  }();
5304
5305  Toggler.defaults = {
5306    /**
5307     * Tells the plugin if the element should animated when toggled.
5308     * @option
5309     * @type {boolean}
5310     * @default false
5311     */
5312    animate: false
5313  };
5314
5315  // Window exports
5316  Foundation.plugin(Toggler, 'Toggler');
5317}(jQuery);
5318
5319'use strict';
5320
5321!function ($) {
5322
5323  /**
5324   * ResponsiveAccordionTabs module.
5325   * @module foundation.responsiveAccordionTabs
5326   * @requires foundation.util.keyboard
5327   * @requires foundation.util.timerAndImageLoader
5328   * @requires foundation.util.motion
5329   * @requires foundation.accordion
5330   * @requires foundation.tabs
5331   */
5332
5333  var ResponsiveAccordionTabs = function () {
5334    /**
5335     * Creates a new instance of a responsive accordion tabs.
5336     * @class
5337     * @fires ResponsiveAccordionTabs#init
5338     * @param {jQuery} element - jQuery object to make into a dropdown menu.
5339     * @param {Object} options - Overrides to the default plugin settings.
5340     */
5341    function ResponsiveAccordionTabs(element, options) {
5342      _classCallCheck(this, ResponsiveAccordionTabs);
5343
5344      this.$element = $(element);
5345      this.options = $.extend({}, this.$element.data(), options);
5346      this.rules = this.$element.data('responsive-accordion-tabs');
5347      this.currentMq = null;
5348      this.currentPlugin = null;
5349      if (!this.$element.attr('id')) {
5350        this.$element.attr('id', Foundation.GetYoDigits(6, 'responsiveaccordiontabs'));
5351      };
5352
5353      this._init();
5354      this._events();
5355
5356      Foundation.registerPlugin(this, 'ResponsiveAccordionTabs');
5357    }
5358
5359    /**
5360     * Initializes the Menu by parsing the classes from the 'data-responsive-accordion-tabs' attribute on the element.
5361     * @function
5362     * @private
5363     */
5364
5365
5366    _createClass(ResponsiveAccordionTabs, [{
5367      key: '_init',
5368      value: function _init() {
5369        // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules
5370        if (typeof this.rules === 'string') {
5371          var rulesTree = {};
5372
5373          // Parse rules from "classes" pulled from data attribute
5374          var rules = this.rules.split(' ');
5375
5376          // Iterate through every rule found
5377          for (var i = 0; i < rules.length; i++) {
5378            var rule = rules[i].split('-');
5379            var ruleSize = rule.length > 1 ? rule[0] : 'small';
5380            var rulePlugin = rule.length > 1 ? rule[1] : rule[0];
5381
5382            if (MenuPlugins[rulePlugin] !== null) {
5383              rulesTree[ruleSize] = MenuPlugins[rulePlugin];
5384            }
5385          }
5386
5387          this.rules = rulesTree;
5388        }
5389
5390        this._getAllOptions();
5391
5392        if (!$.isEmptyObject(this.rules)) {
5393          this._checkMediaQueries();
5394        }
5395      }
5396    }, {
5397      key: '_getAllOptions',
5398      value: function _getAllOptions() {
5399        //get all defaults and options
5400        var _this = this;
5401        _this.allOptions = {};
5402        for (var key in MenuPlugins) {
5403          if (MenuPlugins.hasOwnProperty(key)) {
5404            var obj = MenuPlugins[key];
5405            try {
5406              var dummyPlugin = $('<ul></ul>');
5407              var tmpPlugin = new obj.plugin(dummyPlugin, _this.options);
5408              for (var keyKey in tmpPlugin.options) {
5409                if (tmpPlugin.options.hasOwnProperty(keyKey) && keyKey !== 'zfPlugin') {
5410                  var objObj = tmpPlugin.options[keyKey];
5411                  _this.allOptions[keyKey] = objObj;
5412                }
5413              }
5414              tmpPlugin.destroy();
5415            } catch (e) {}
5416          }
5417        }
5418      }
5419
5420      /**
5421       * Initializes events for the Menu.
5422       * @function
5423       * @private
5424       */
5425
5426    }, {
vendor: 5,391 bytes, lines 5427-5548
5427      key: '_events',
5428      value: function _events() {
5429        var _this = this;
5430
5431        $(window).on('changed.zf.mediaquery', function () {
5432          _this._checkMediaQueries();
5433        });
5434      }
5435
5436      /**
5437       * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out.
5438       * @function
5439       * @private
5440       */
5441
5442    }, {
5443      key: '_checkMediaQueries',
5444      value: function _checkMediaQueries() {
5445        var matchedMq,
5446            _this = this;
5447        // Iterate through each rule and find the last matching rule
5448        $.each(this.rules, function (key) {
5449          if (Foundation.MediaQuery.atLeast(key)) {
5450            matchedMq = key;
5451          }
5452        });
5453
5454        // No match? No dice
5455        if (!matchedMq) return;
5456
5457        // Plugin already initialized? We good
5458        if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return;
5459
5460        // Remove existing plugin-specific CSS classes
5461        $.each(MenuPlugins, function (key, value) {
5462          _this.$element.removeClass(value.cssClass);
5463        });
5464
5465        // Add the CSS class for the new plugin
5466        this.$element.addClass(this.rules[matchedMq].cssClass);
5467
5468        // Create an instance of the new plugin
5469        if (this.currentPlugin) {
5470          //don't know why but on nested elements data zfPlugin get's lost
5471          if (!this.currentPlugin.$element.data('zfPlugin') && this.storezfData) this.currentPlugin.$element.data('zfPlugin', this.storezfData);
5472          this.currentPlugin.destroy();
5473        }
5474        this._handleMarkup(this.rules[matchedMq].cssClass);
5475        this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {});
5476        this.storezfData = this.currentPlugin.$element.data('zfPlugin');
5477      }
5478    }, {
5479      key: '_handleMarkup',
5480      value: function _handleMarkup(toSet) {
5481        var _this = this,
5482            fromString = 'accordion';
5483        var $panels = $('[data-tabs-content=' + this.$element.attr('id') + ']');
5484        if ($panels.length) fromString = 'tabs';
5485        if (fromString === toSet) {
5486          return;
5487        };
5488
5489        var tabsTitle = _this.allOptions.linkClass ? _this.allOptions.linkClass : 'tabs-title';
5490        var tabsPanel = _this.allOptions.panelClass ? _this.allOptions.panelClass : 'tabs-panel';
5491
5492        this.$element.removeAttr('role');
5493        var $liHeads = this.$element.children('.' + tabsTitle + ',[data-accordion-item]').removeClass(tabsTitle).removeClass('accordion-item').removeAttr('data-accordion-item');
5494        var $liHeadsA = $liHeads.children('a').removeClass('accordion-title');
5495
5496        if (fromString === 'tabs') {
5497          $panels = $panels.children('.' + tabsPanel).removeClass(tabsPanel).removeAttr('role').removeAttr('aria-hidden').removeAttr('aria-labelledby');
5498          $panels.children('a').removeAttr('role').removeAttr('aria-controls').removeAttr('aria-selected');
5499        } else {
5500          $panels = $liHeads.children('[data-tab-content]').removeClass('accordion-content');
5501        };
5502
5503        $panels.css({ display: '', visibility: '' });
5504        $liHeads.css({ display: '', visibility: '' });
5505        if (toSet === 'accordion') {
5506          $panels.each(function (key, value) {
5507            $(value).appendTo($liHeads.get(key)).addClass('accordion-content').attr('data-tab-content', '').removeClass('is-active').css({ height: '' });
5508            $('[data-tabs-content=' + _this.$element.attr('id') + ']').after('<div id="tabs-placeholder-' + _this.$element.attr('id') + '"></div>').remove();
5509            $liHeads.addClass('accordion-item').attr('data-accordion-item', '');
5510            $liHeadsA.addClass('accordion-title');
5511          });
5512        } else if (toSet === 'tabs') {
5513          var $tabsContent = $('[data-tabs-content=' + _this.$element.attr('id') + ']');
5514          var $placeholder = $('#tabs-placeholder-' + _this.$element.attr('id'));
5515          if ($placeholder.length) {
5516            $tabsContent = $('<div class="tabs-content"></div>').insertAfter($placeholder).attr('data-tabs-content', _this.$element.attr('id'));
5517            $placeholder.remove();
5518          } else {
5519            $tabsContent = $('<div class="tabs-content"></div>').insertAfter(_this.$element).attr('data-tabs-content', _this.$element.attr('id'));
5520          };
5521          $panels.each(function (key, value) {
5522            var tempValue = $(value).appendTo($tabsContent).addClass(tabsPanel);
5523            var hash = $liHeadsA.get(key).hash.slice(1);
5524            var id = $(value).attr('id') || Foundation.GetYoDigits(6, 'accordion');
5525            if (hash !== id) {
5526              if (hash !== '') {
5527                $(value).attr('id', hash);
5528              } else {
5529                hash = id;
5530                $(value).attr('id', hash);
5531                $($liHeadsA.get(key)).attr('href', $($liHeadsA.get(key)).attr('href').replace('#', '') + '#' + hash);
5532              };
5533            };
5534            var isActive = $($liHeads.get(key)).hasClass('is-active');
5535            if (isActive) {
5536              tempValue.addClass('is-active');
5537            };
5538          });
5539          $liHeads.addClass(tabsTitle);
5540        };
5541      }
5542
5543      /**
5544       * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out.
5545       * @function
5546       */
5547
5548    }, {
5549      key: 'destroy',
5550      value: function destroy() {
5551        if (this.currentPlugin) this.currentPlugin.destroy();
5552        $(window).off('.zf.ResponsiveAccordionTabs');
5553        Foundation.unregisterPlugin(this);
5554      }
5555    }]);
5556
5557    return ResponsiveAccordionTabs;
5558  }();
5559
5560  ResponsiveAccordionTabs.defaults = {};
5561
5562  // The plugin matches the plugin classes with these plugin instances.
5563  var MenuPlugins = {
5564    tabs: {
5565      cssClass: 'tabs',
5566      plugin: Foundation._plugins.tabs || null
5567    },
5568    accordion: {
5569      cssClass: 'accordion',
5570      plugin: Foundation._plugins.accordion || null
5571    }
5572  };
5573
5574  // Window exports
5575  Foundation.plugin(ResponsiveAccordionTabs, 'ResponsiveAccordionTabs');
5576}(jQuery);
5577
5578$(document).foundation();
5579
5580$(document).ready(function () {
5581
5582  // Scroll to top of accordion item when active
5583  if (typeof themeAccordionItem === "function") {
5584    themeAccordionItem('.accordion');
5585  }
5586
5587  // Back to results
5588  if (typeof themeBackToResults === "function") {
5589    themeBackToResults('.js-back-to-results');
5590  }
5591
5592  // Cookie policy
5593  if (typeof themeCookiePolicy === "function") {
5594    themeCookiePolicy();
5595  }
5596
5597  // Department selection for opening hours
5598  if (typeof themeDepartmentOpeningHours === "function" && ($('.branch--teaser').length || $('.branch--full').length)) {
5599    themeDepartmentOpeningHours();
5600  }
5601
5602  // Adds a read more link if div over a certain height
5603  if (typeof themeExpand === "function" && Foundation.MediaQuery.current == 'small') {
5604    themeExpand('.page--home .page__description, .vehicle--full .vehicle__description', 300);
5605  }
5606
5607  // Click outside to close toggler
5608  if (typeof themeCloseToggler === "function" && $('#search').length && !Foundation.MediaQuery.atLeast('large')) {
5609    themeCloseToggler('#search');
5610  }
5611
5612  // Swap prices if searching by monthly price on vehicle results
5613  if (typeof themeSwapPrices === "function") {
5614    themeSwapPrices();
5615  }
5616
5617  // Ensures images load in tabs on vehicle details if video present
5618  if (typeof themeTabsVideo === "function") {
5619    themeTabsVideo();
5620  }
5621
5622  // Ensures map loads in tabs on vehicle details
5623  if (typeof themeTabsMap === "function") {
5624    themeTabsMap();
5625  }
5626
5627  // Fancybox lightbox
5628  $("[data-fancybox]").fancybox();
5629
5630  // Slick carousel
5631  $('.page__primary-images > ul, .post__primary-images > ul, .custom-entry__primary-images > ul, .branch__primary-images > ul').slick({
5632    autoplay: true,
5633    autoplaySpeed: 10000,
5634    infinite: true
5635  });
5636  $('.page__secondary-images > ul, .post__secondary-images > ul, .custom-entry__secondary-images > ul, .branch__secondary-images > ul, .branch__logos > ul').slick({
5637    infinite: false
5638  });
5639  if (Foundation.MediaQuery.current == 'small') {
5640    $('.listing--block > ul').slick({
5641      slidesToShow: 1,
5642      infinite: false
5643    });
5644  }
5645  $('.listing--vehicle-compare .listing__list').slick({
5646    slidesToShow: 1,
5647    infinite: false,
5648    mobileFirst: true,
5649    responsive: [{
5650      breakpoint: 639,
5651      settings: {
5652        slidesToShow: 2
5653      }
5654    }, {
5655      breakpoint: 1023,
5656      settings: {
5657        slidesToShow: 4
5658      }
5659    }]
5660  });
5661  $('.listing--vehicle-featured > ul, .listing--vehicle-latest > ul, .listing--vehicle-similar > ul').slick({
5662    adaptiveHeight: true,
5663    slidesToShow: 1,
5664    infinite: false,
5665    mobileFirst: true,
5666    responsive: [{
5667      breakpoint: 639,
5668      settings: {
5669        slidesToShow: 2
5670      }
5671    }, {
5672      breakpoint: 1023,
5673      settings: {
5674        slidesToShow: 3
5675      }
5676    }]
5677  });
5678  $('.listing--vehicle-featured-sidebar > ul, .listing--vehicle-latest-sidebar > ul').slick({
5679    adaptiveHeight: true,
5680    slidesToShow: 1,
5681    infinite: false
5682  });
5683  $('.vehicle--full .vehicle__primary-images > ul').slick({
5684    slidesToShow: 1,
5685    slidesToScroll: 1,
5686    adaptiveHeight: true,
5687    infinite: false,
5688    asNavFor: '.vehicle__primary-images-thumbnails > ul'
5689  });
5690  $('.vehicle--full .vehicle__primary-images-thumbnails > ul').slick({
5691    slidesToShow: 4,
5692    slidesToScroll: 4,
5693    focusOnSelect: true,
5694    infinite: false,
5695    asNavFor: '.vehicle__primary-images > ul',
5696    mobileFirst: true,
5697    responsive: [{
5698      breakpoint: 767,
5699      settings: {
5700        slidesToShow: 3,
5701        slidesToScroll: 3
5702      }
5703    }, {
5704      breakpoint: 1023,
5705      settings: {
5706        slidesToShow: 5,
5707        slidesToScroll: 5
5708      }
5709    }]
5710  });
5711  $('.vehicle--full .vehicle__secondary-images ul').slick({
5712    slidesToShow: 1,
5713    infinite: false,
5714    mobileFirst: true,
5715    responsive: [{
5716      breakpoint: 639,
5717      settings: {
5718        slidesToShow: 2
5719      }
5720    }, {
5721      breakpoint: 1023,
5722      settings: {
5723        slidesToShow: 3
5724      }
5725    }]
5726  });
5727
5728  // Swipe to close toggler
5729  if ($('#search').length && !Foundation.MediaQuery.atLeast('large')) {
5730    $('#search').swipe({
5731      swipeLeft: function swipeLeft(event, direction, distance, duration, fingerCount, fingerData) {
5732        $(this).foundation('toggle');
5733      }
5734    });
5735  }
5736
5737  // Vehicle results finance form toggle
5738  if ($(".listing__adjust-finance a").length) {
5739    $(".listing__adjust-finance a").click(function () {
5740      $(this).parent(".listing__adjust-finance").next(".listing__finance-form").slideToggle();
5741    });
5742  }
5743
5744  // Open reveal email vehicle form from url hash on vehicle details
5745  if (window.location.hash && window.location.hash == '#email-vehicle') {
5746    $('#email-vehicle').foundation('open');
5747  }
5748});
5749
5750// Vehicle search options toggle limit
5751var SearchBarOptionsLimitTo = 5;
5752
5753// Functions loaded after search filters updated on vehicle results
5754var afterReloadDealer = function afterReloadDealer() {
5755  // Swap prices if searching by monthly price on vehicle results
5756  if (typeof themeSwapPrices === "function") {
5757    themeSwapPrices();
5758  }
5759};
5760
5761// Disable fancybox lightbox hash module
5762$.fancybox.defaults.hash = false;
5763//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvdW5kYXRpb24uY29yZS5qcyIsImZvdW5kYXRpb24udXRpbC5ib3guanMiLCJmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmQuanMiLCJmb3VuZGF0aW9uLnV0aWwubWVkaWFRdWVyeS5qcyIsImZvdW5kYXRpb24udXRpbC5tb3Rpb24uanMiLCJmb3VuZGF0aW9uLnV0aWwubmVzdC5qcyIsImZvdW5kYXRpb24udXRpbC50aW1lckFuZEltYWdlTG9hZGVyLmpzIiwiZm91bmRhdGlvbi51dGlsLnRvdWNoLmpzIiwiZm91bmRhdGlvbi51dGlsLnRyaWdnZXJzLmpzIiwiZm91bmRhdGlvbi5hY2NvcmRpb24uanMiLCJmb3VuZGF0aW9uLmRyaWxsZG93bi5qcyIsImZvdW5kYXRpb24uZHJvcGRvd24uanMiLCJmb3VuZGF0aW9uLmRyb3Bkb3duTWVudS5qcyIsImZvdW5kYXRpb24ucmVzcG9uc2l2ZU1lbnUuanMiLCJmb3VuZGF0aW9uLnJlc3BvbnNpdmVUb2dnbGUuanMiLCJmb3VuZGF0aW9uLnJldmVhbC5qcyIsImZvdW5kYXRpb24udGFicy5qcyIsImZvdW5kYXRpb24udG9nZ2xlci5qcyIsImZvdW5kYXRpb24uemYucmVzcG9uc2l2ZUFjY29yZGlvblRhYnMuanMiLCJhcHAuanMiXSwibmFtZXMiOlsiJCIsIkZPVU5EQVRJT05fVkVSU0lPTiIsIkZvdW5kYXRpb24iLCJ2ZXJzaW9uIiwiX3BsdWdpbnMiLCJfdXVpZHMiLCJydGwiLCJhdHRyIiwicGx1Z2luIiwibmFtZSIsImNsYXNzTmFtZSIsImZ1bmN0aW9uTmFtZSIsImF0dHJOYW1lIiwiaHlwaGVuYXRlIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwiY29uc3RydWN0b3IiLCJ0b0xvd2VyQ2FzZSIsInV1aWQiLCJHZXRZb0RpZ2l0cyIsIiRlbGVtZW50IiwiZGF0YSIsInRyaWdnZXIiLCJwdXNoIiwidW5yZWdpc3RlclBsdWdpbiIsInNwbGljZSIsImluZGV4T2YiLCJyZW1vdmVBdHRyIiwicmVtb3ZlRGF0YSIsInByb3AiLCJyZUluaXQiLCJwbHVnaW5zIiwiaXNKUSIsImVhY2giLCJfaW5pdCIsInR5cGUiLCJfdGhpcyIsImZucyIsInBsZ3MiLCJmb3JFYWNoIiwicCIsImZvdW5kYXRpb24iLCJPYmplY3QiLCJrZXlzIiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwibGVuZ3RoIiwibmFtZXNwYWNlIiwiTWF0aCIsInJvdW5kIiwicG93IiwicmFuZG9tIiwidG9TdHJpbmciLCJzbGljZSIsInJlZmxvdyIsImVsZW0iLCJpIiwiJGVsZW0iLCJmaW5kIiwiYWRkQmFjayIsIiRlbCIsIm9wdHMiLCJ3YXJuIiwidGhpbmciLCJzcGxpdCIsImUiLCJvcHQiLCJtYXAiLCJlbCIsInRyaW0iLCJwYXJzZVZhbHVlIiwiZXIiLCJnZXRGbk5hbWUiLCJ0cmFuc2l0aW9uZW5kIiwidHJhbnNpdGlvbnMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJlbmQiLCJ0Iiwic3R5bGUiLCJzZXRUaW1lb3V0IiwidHJpZ2dlckhhbmRsZXIiLCJ1dGlsIiwidGhyb3R0bGUiLCJmdW5jIiwiZGVsYXkiLCJ0aW1lciIsImNvbnRleHQiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJtZXRob2QiLCIkbWV0YSIsIiRub0pTIiwiYXBwZW5kVG8iLCJoZWFkIiwicmVtb3ZlQ2xhc3MiLCJNZWRpYVF1ZXJ5IiwiQXJyYXkiLCJwcm90b3R5cGUiLCJjYWxsIiwicGx1Z0NsYXNzIiwidW5kZWZpbmVkIiwiUmVmZXJlbmNlRXJyb3IiLCJUeXBlRXJyb3IiLCJ3aW5kb3ciLCJmbiIsIkRhdGUiLCJub3ciLCJnZXRUaW1lIiwidmVuZG9ycyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInZwIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJ0ZXN0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibGFzdFRpbWUiLCJjYWxsYmFjayIsIm5leHRUaW1lIiwibWF4IiwiY2xlYXJUaW1lb3V0IiwicGVyZm9ybWFuY2UiLCJzdGFydCIsIkZ1bmN0aW9uIiwiYmluZCIsIm9UaGlzIiwiYUFyZ3MiLCJmVG9CaW5kIiwiZk5PUCIsImZCb3VuZCIsImNvbmNhdCIsImZ1bmNOYW1lUmVnZXgiLCJyZXN1bHRzIiwiZXhlYyIsInN0ciIsImlzTmFOIiwicGFyc2VGbG9hdCIsInJlcGxhY2UiLCJqUXVlcnkiLCJCb3giLCJJbU5vdFRvdWNoaW5nWW91IiwiR2V0RGltZW5zaW9ucyIsIkdldE9mZnNldHMiLCJlbGVtZW50IiwicGFyZW50IiwibHJPbmx5IiwidGJPbmx5IiwiZWxlRGltcyIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInBhckRpbXMiLCJvZmZzZXQiLCJoZWlnaHQiLCJ3aWR0aCIsIndpbmRvd0RpbXMiLCJhbGxEaXJzIiwiRXJyb3IiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGFyUmVjdCIsInBhcmVudE5vZGUiLCJ3aW5SZWN0IiwiYm9keSIsIndpblkiLCJwYWdlWU9mZnNldCIsIndpblgiLCJwYWdlWE9mZnNldCIsInBhcmVudERpbXMiLCJhbmNob3IiLCJwb3NpdGlvbiIsInZPZmZzZXQiLCJoT2Zmc2V0IiwiaXNPdmVyZmxvdyIsIiRlbGVEaW1zIiwiJGFuY2hvckRpbXMiLCJrZXlDb2RlcyIsImNvbW1hbmRzIiwiS2V5Ym9hcmQiLCJnZXRLZXlDb2RlcyIsInBhcnNlS2V5IiwiZXZlbnQiLCJrZXkiLCJ3aGljaCIsImtleUNvZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ0b1VwcGVyQ2FzZSIsInNoaWZ0S2V5IiwiY3RybEtleSIsImFsdEtleSIsImhhbmRsZUtleSIsImNvbXBvbmVudCIsImZ1bmN0aW9ucyIsImNvbW1hbmRMaXN0IiwiY21kcyIsIm
5763NvbW1hbmQiLCJsdHIiLCJleHRlbmQiLCJyZXR1cm5WYWx1ZSIsImhhbmRsZWQiLCJ1bmhhbmRsZWQiLCJmaW5kRm9jdXNhYmxlIiwiZmlsdGVyIiwiaXMiLCJyZWdpc3RlciIsImNvbXBvbmVudE5hbWUiLCJ0cmFwRm9jdXMiLCIkZm9jdXNhYmxlIiwiJGZpcnN0Rm9jdXNhYmxlIiwiZXEiLCIkbGFzdEZvY3VzYWJsZSIsIm9uIiwidGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJmb2N1cyIsInJlbGVhc2VGb2N1cyIsIm9mZiIsImtjcyIsImsiLCJrYyIsImRlZmF1bHRRdWVyaWVzIiwibGFuZHNjYXBlIiwicG9ydHJhaXQiLCJyZXRpbmEiLCJxdWVyaWVzIiwiY3VycmVudCIsInNlbGYiLCJleHRyYWN0ZWRTdHlsZXMiLCJjc3MiLCJuYW1lZFF1ZXJpZXMiLCJwYXJzZVN0eWxlVG9PYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInZhbHVlIiwiX2dldEN1cnJlbnRTaXplIiwiX3dhdGNoZXIiLCJhdExlYXN0Iiwic2l6ZSIsInF1ZXJ5IiwiZ2V0IiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJtYXRjaGVkIiwibmV3U2l6ZSIsImN1cnJlbnRTaXplIiwic3R5bGVNZWRpYSIsIm1lZGlhIiwic2NyaXB0IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbmZvIiwiaWQiLCJpbnNlcnRCZWZvcmUiLCJnZXRDb21wdXRlZFN0eWxlIiwiY3VycmVudFN0eWxlIiwibWF0Y2hNZWRpdW0iLCJ0ZXh0Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJ0ZXh0Q29udGVudCIsInN0eWxlT2JqZWN0IiwicmVkdWNlIiwicmV0IiwicGFyYW0iLCJwYXJ0cyIsInZhbCIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzQXJyYXkiLCJpbml0Q2xhc3NlcyIsImFjdGl2ZUNsYXNzZXMiLCJNb3Rpb24iLCJhbmltYXRlSW4iLCJhbmltYXRpb24iLCJjYiIsImFuaW1hdGUiLCJhbmltYXRlT3V0IiwiTW92ZSIsImR1cmF0aW9uIiwiYW5pbSIsInByb2ciLCJtb3ZlIiwidHMiLCJpc0luIiwiaW5pdENsYXNzIiwiYWN0aXZlQ2xhc3MiLCJyZXNldCIsImFkZENsYXNzIiwic2hvdyIsIm9mZnNldFdpZHRoIiwib25lIiwiZmluaXNoIiwiaGlkZSIsInRyYW5zaXRpb25EdXJhdGlvbiIsIk5lc3QiLCJGZWF0aGVyIiwibWVudSIsIml0ZW1zIiwic3ViTWVudUNsYXNzIiwic3ViSXRlbUNsYXNzIiwiaGFzU3ViQ2xhc3MiLCIkaXRlbSIsIiRzdWIiLCJjaGlsZHJlbiIsIkJ1cm4iLCJUaW1lciIsIm9wdGlvbnMiLCJuYW1lU3BhY2UiLCJyZW1haW4iLCJpc1BhdXNlZCIsInJlc3RhcnQiLCJpbmZpbml0ZSIsInBhdXNlIiwib25JbWFnZXNMb2FkZWQiLCJpbWFnZXMiLCJ1bmxvYWRlZCIsImNvbXBsZXRlIiwicmVhZHlTdGF0ZSIsInNpbmdsZUltYWdlTG9hZGVkIiwic3JjIiwic3BvdFN3aXBlIiwiZW5hYmxlZCIsImRvY3VtZW50RWxlbWVudCIsIm1vdmVUaHJlc2hvbGQiLCJ0aW1lVGhyZXNob2xkIiwic3RhcnRQb3NYIiwic3RhcnRQb3NZIiwic3RhcnRUaW1lIiwiZWxhcHNlZFRpbWUiLCJpc01vdmluZyIsIm9uVG91Y2hFbmQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25Ub3VjaE1vdmUiLCJ4IiwidG91Y2hlcyIsInBhZ2VYIiwieSIsInBhZ2VZIiwiZHgiLCJkeSIsImRpciIsImFicyIsIm9uVG91Y2hTdGFydCIsImFkZEV2ZW50TGlzdGVuZXIiLCJpbml0IiwidGVhcmRvd24iLCJzcGVjaWFsIiwic3dpcGUiLCJzZXR1cCIsIm5vb3AiLCJhZGRUb3VjaCIsImhhbmRsZVRvdWNoIiwiY2hhbmdlZFRvdWNoZXMiLCJmaXJzdCIsImV2ZW50VHlwZXMiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJzaW11bGF0ZWRFdmVudCIsIk1vdXNlRXZlbnQiLCJzY3JlZW5YIiwic2NyZWVuWSIsImNsaWVudFgiLCJjbGllbnRZIiwiY3JlYXRlRXZlbnQiLCJpbml0TW91c2VFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJNdXRhdGlvbk9ic2VydmVyIiwicHJlZml4ZXMiLCJ0cmlnZ2VycyIsInN0b3BQcm9wYWdhdGlvbiIsImZhZGVPdXQiLCJjaGVja0xpc3RlbmVycyIsImV2ZW50c0xpc3RlbmVyIiwicmVzaXplTGlzdGVuZXIiLCJzY3JvbGxMaXN0ZW5lciIsImNsb3NlbWVMaXN0ZW5lciIsInlldGlCb3hlcyIsInBsdWdOYW1lcyIsImxpc3RlbmVycyIsImpvaW4iLCJwbHVnaW5JZCIsIm5vdCIsImRlYm91bmNlIiwiJG5vZGVzIiwibm9kZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGlzdGVuaW5nRWxlbWVudHNNdXRhdGlvbiIsIm11dGF0aW9uUmVjb3Jkc0xpc3QiLCIkdGFyZ2V0IiwiYXR0cmlidXRlTmFtZSIsImNsb3Nlc3QiLCJlbGVtZW50T2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImNoaWxkTGlzdCIsImNoYXJhY3RlckRhdGEiLCJzdWJ0cmVlIiwiYXR0cmlidXRlRmlsdGVyIiwiSUhlYXJZb3UiLCJBY2NvcmRpb24iLCJkZWZhdWx0cyIsIiR0YWJzIiwiaWR4IiwiJGNvbnRlbnQiLCJsaW5rSWQiLCIkaW5pdEFjdGl2ZSIsImZpcnN0VGltZUluaXQiLCJkb3duIiwiX2NoZWNrRGVlcExpbmsiLCJsb2NhdGlvbiIsImhhc2giLCIkbGluayIsIiRhbmNob3IiLCJoYXNDbGFzcyIsImRlZXBMaW5rU211ZGdlIiwibG9hZCIsInNjcm9sbFRvcCIsImRlZXBMaW5rU211ZGdlRGVsYXkiLCJkZWVwTGluayIsIl9ldmVudHMiLCIkdGFiQ29udGVudCIsInRvZ2dsZSIsIm5leHQiLCIkYSIsIm11bHRpRXhwYW5kIiwicHJldmlvdXMiLCJwcmV2IiwidXAiLCJ1cGRhdGVIaXN0b3J5IiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsInJlcGxhY2VTdGF0ZSIsImZpcnN0VGltZSIsIiRjdXJyZW50QWN0aXZlIiwic2xpZGVEb3duIiwic2xpZGVTcGVlZCIsIiRhdW50cyIsInNpYmxpbmdzIiwiYWxsb3dBbGxDbG9zZWQiLCJzbGlkZVVwIiwic3RvcCIsIkRyaWxsZG93biIsIiRzdWJtZW51QW5jaG9ycyIsIiRzdWJtZW51cyIsIiRtZW51SXRlbXMiLCJfcHJlcGFyZU1lbnUiLCJfcmVnaXN0ZXJFdmVudHMiLCJfa2V5Ym9hcmRFdmVudHMiLCJwYXJlbnRMaW5rIiwiY2xvbmUiLCJwcmVwZW5kVG8iLCJ3cmFwIiwiJG1lbnUiLCIkYmFjayIsImJhY2tCdXR0b25Qb3NpdGlvbiIsImFwcGVuZCIsImJhY2tCdXR0b24iLCJwcmVwZW5kIiwiX2JhY2siLCJhdXRvSGVpZ2h0IiwiJHdyYXBwZXIiLCJ3cmFwcGVyIiwiYW5pbWF0ZUhlaWdodCIsIl9nZXRNYXhEaW1zIiwicGFyZW50c1VudGlsIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiX3Nob3ciLCJjbG9zZU9uQ2xpY2siLCIkYm9keSIsImNvbn
5763RhaW5zIiwiX2hpZGVBbGwiLCJfcmVzaXplIiwiX2JpbmRIYW5kbGVyIiwiX3Njcm9sbFRvcCIsIiRzY3JvbGxUb3BFbGVtZW50Iiwic2Nyb2xsVG9wRWxlbWVudCIsInNjcm9sbFBvcyIsInBhcnNlSW50Iiwic2Nyb2xsVG9wT2Zmc2V0IiwiYW5pbWF0aW9uRHVyYXRpb24iLCJhbmltYXRpb25FYXNpbmciLCJhZGQiLCIkZWxlbWVudHMiLCIkcHJldkVsZW1lbnQiLCIkbmV4dEVsZW1lbnQiLCJtaW4iLCJfaGlkZSIsImNsb3NlIiwib3BlbiIsInBhcmVudFN1Yk1lbnUiLCJibHVyIiwibWF4SGVpZ2h0IiwicmVzdWx0IiwibnVtT2ZFbGVtcyIsInVud3JhcCIsInJlbW92ZSIsIkRyb3Bkb3duIiwiJGlkIiwicGFyZW50Q2xhc3MiLCIkcGFyZW50IiwicGFyZW50cyIsInBvc2l0aW9uQ2xhc3MiLCJnZXRQb3NpdGlvbkNsYXNzIiwiY291bnRlciIsInVzZWRQb3NpdGlvbnMiLCJ2ZXJ0aWNhbFBvc2l0aW9uIiwibWF0Y2giLCJob3Jpem9udGFsUG9zaXRpb24iLCJjbGFzc0NoYW5nZWQiLCJkaXJlY3Rpb24iLCJuZXdXaWR0aCIsInBhcmVudEhPZmZzZXQiLCIkcGFyZW50RGltcyIsIl9yZXBvc2l0aW9uIiwiX3NldFBvc2l0aW9uIiwiaG92ZXIiLCJib2R5RGF0YSIsIndoYXRpbnB1dCIsInRpbWVvdXQiLCJob3ZlckRlbGF5IiwiaG92ZXJQYW5lIiwidmlzaWJsZUZvY3VzYWJsZUVsZW1lbnRzIiwiYXV0b0ZvY3VzIiwiX2FkZEJvZHlIYW5kbGVyIiwiY3VyUG9zaXRpb25DbGFzcyIsIkRyb3Bkb3duTWVudSIsInN1YnMiLCJ2ZXJ0aWNhbENsYXNzIiwicmlnaHRDbGFzcyIsImFsaWdubWVudCIsImNoYW5nZWQiLCJoYXNUb3VjaCIsIm9udG91Y2hzdGFydCIsInBhckNsYXNzIiwiaGFuZGxlQ2xpY2tGbiIsImhhc1N1YiIsImhhc0NsaWNrZWQiLCJjbGlja09wZW4iLCJmb3JjZUZvbGxvdyIsImNsb3NlT25DbGlja0luc2lkZSIsImRpc2FibGVIb3ZlciIsImF1dG9jbG9zZSIsImNsb3NpbmdUaW1lIiwiaXNUYWIiLCJpbmRleCIsIm5leHRTaWJsaW5nIiwicHJldlNpYmxpbmciLCJvcGVuU3ViIiwiY2xvc2VTdWIiLCJfaXNWZXJ0aWNhbCIsIiRzaWJzIiwiY2xlYXIiLCJvbGRDbGFzcyIsIiRwYXJlbnRMaSIsIiR0b0Nsb3NlIiwic29tZXRoaW5nVG9DbG9zZSIsIlJlc3BvbnNpdmVNZW51IiwicnVsZXMiLCJjdXJyZW50TXEiLCJjdXJyZW50UGx1Z2luIiwicnVsZXNUcmVlIiwicnVsZSIsInJ1bGVTaXplIiwicnVsZVBsdWdpbiIsIk1lbnVQbHVnaW5zIiwiaXNFbXB0eU9iamVjdCIsIl9jaGVja01lZGlhUXVlcmllcyIsIm1hdGNoZWRNcSIsImNzc0NsYXNzIiwiZGVzdHJveSIsImRyb3Bkb3duIiwiZHJpbGxkb3duIiwiYWNjb3JkaW9uIiwiUmVzcG9uc2l2ZVRvZ2dsZSIsInRhcmdldElEIiwiJHRhcmdldE1lbnUiLCIkdG9nZ2xlciIsImlucHV0IiwiYW5pbWF0aW9uSW4iLCJhbmltYXRpb25PdXQiLCJfdXBkYXRlIiwiX3VwZGF0ZU1xSGFuZGxlciIsInRvZ2dsZU1lbnUiLCJoaWRlRm9yIiwiUmV2ZWFsIiwiaXNBY3RpdmUiLCJjYWNoZWQiLCJtcSIsImlzTW9iaWxlIiwibW9iaWxlU25pZmYiLCJmdWxsU2NyZWVuIiwib3ZlcmxheSIsIiRvdmVybGF5IiwiX21ha2VPdmVybGF5IiwiZGV0YWNoIiwib3V0ZXJXaWR0aCIsIm91dGVySGVpZ2h0IiwibWFyZ2luIiwiX3VwZGF0ZVBvc2l0aW9uIiwiX2hhbmRsZVN0YXRlIiwibXVsdGlwbGVPcGVuZWQiLCJhZGRSZXZlYWxPcGVuQ2xhc3NlcyIsIm9yaWdpbmFsU2Nyb2xsUG9zIiwiYWZ0ZXJBbmltYXRpb24iLCJmb2N1c2FibGVFbGVtZW50cyIsInNob3dEZWxheSIsIl9leHRyYUhhbmRsZXJzIiwiY2xvc2VPbkVzYyIsImZpbmlzaFVwIiwiaGlkZURlbGF5IiwicmVzZXRPbkNsb3NlIiwiaHRtbCIsInRpdGxlIiwiaHJlZiIsImJ0bU9mZnNldFBjdCIsImlQaG9uZVNuaWZmIiwiYW5kcm9pZFNuaWZmIiwiVGFicyIsIiR0YWJUaXRsZXMiLCJsaW5rQ2xhc3MiLCJsaW5rQWN0aXZlQ2xhc3MiLCJtYXRjaEhlaWdodCIsIiRpbWFnZXMiLCJfc2V0SGVpZ2h0Iiwic2VsZWN0VGFiIiwiX2FkZEtleUhhbmRsZXIiLCJfYWRkQ2xpY2tIYW5kbGVyIiwiX3NldEhlaWdodE1xSGFuZGxlciIsIl9oYW5kbGVUYWJDaGFuZ2UiLCJ3cmFwT25LZXlzIiwibGFzdCIsImhpc3RvcnlIYW5kbGVkIiwiYWN0aXZlQ29sbGFwc2UiLCJfY29sbGFwc2VUYWIiLCIkb2xkVGFiIiwiJHRhYkxpbmsiLCIkdGFyZ2V0Q29udGVudCIsIl9vcGVuVGFiIiwicGFuZWxBY3RpdmVDbGFzcyIsIiR0YXJnZXRfYW5jaG9yIiwiaWRTdHIiLCJwYW5lbENsYXNzIiwicGFuZWwiLCJ0ZW1wIiwiVG9nZ2xlciIsInRvZ2dsZUNsYXNzIiwiaXNPbiIsIl91cGRhdGVBUklBIiwiUmVzcG9uc2l2ZUFjY29yZGlvblRhYnMiLCJfZ2V0QWxsT3B0aW9ucyIsImFsbE9wdGlvbnMiLCJvYmoiLCJkdW1teVBsdWdpbiIsInRtcFBsdWdpbiIsImtleUtleSIsIm9iak9iaiIsInN0b3JlemZEYXRhIiwiX2hhbmRsZU1hcmt1cCIsInRvU2V0IiwiZnJvbVN0cmluZyIsIiRwYW5lbHMiLCJ0YWJzVGl0bGUiLCJ0YWJzUGFuZWwiLCIkbGlIZWFkcyIsIiRsaUhlYWRzQSIsImRpc3BsYXkiLCJ2aXNpYmlsaXR5IiwiYWZ0ZXIiLCIkdGFic0NvbnRlbnQiLCIkcGxhY2Vob2xkZXIiLCJpbnNlcnRBZnRlciIsInRlbXBWYWx1ZSIsInRhYnMiLCJyZWFkeSIsInRoZW1lQWNjb3JkaW9uSXRlbSIsInRoZW1lQmFja1RvUmVzdWx0cyIsInRoZW1lQ29va2llUG9saWN5IiwidGhlbWVEZXBhcnRtZW50T3BlbmluZ0hvdXJzIiwidGhlbWVFeHBhbmQiLCJ0aGVtZUNsb3NlVG9nZ2xlciIsInRoZW1lU3dhcFByaWNlcyIsInRoZW1lVGFic1ZpZGVvIiwidGhlbWVUYWJzTWFwIiwiZmFuY3lib3giLCJzbGljayIsImF1dG9wbGF5IiwiYXV0b3BsYXlTcGVlZCIsInNsaWRlc1RvU2hvdyIsIm1vYmlsZUZpcnN0IiwicmVzcG9uc2l2ZSIsImJyZWFrcG9pbnQiLCJzZXR0aW5ncyIsImFkYXB0aXZlSGVpZ2h0Iiwic2xpZGVzVG9TY3JvbGwiLCJhc05hdkZvciIsImZvY3VzT25TZWxlY3QiLCJzd2lwZUxlZnQiLCJkaXN0YW5jZSIsImZpbmdlckNvdW50IiwiZmluZ2VyRGF0YSIsImNsaWNrIiwic2xpZGVUb2dnbGUiLCJTZWFyY2hCYXJPcHRpb25zTGltaXRUbyIsImFmdGVyUmVsb2FkRGVhbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLENBQUEsVUFBQUEsQ0FBQSxFQUFBOztBQUVBOztBQUVBLE1BQUFDLHFCQUFBLE9BQUE7O0FBRUE7QUFDQTtBQUNBLE1BQUFDLGFBQUE7QUFDQUMsYUFBQUYsa0JBREE7O0FBR0E7OztBQUdBRyxjQUFBLEVBTkE7O0FBUUE7OztBQUdBQyxZQUFBLEVBWEE7O0FBYUE7OztBQUdBQyxTQUFBLGVBQUE7QUFDQSxhQUFBTixFQU
5763FBLE1BQUEsRUFBQU8sSUFBQSxDQUFBLEtBQUEsTUFBQSxLQUFBO0FBQ0EsS0FsQkE7QUFtQkE7Ozs7QUFJQUMsWUFBQSxnQkFBQUEsT0FBQSxFQUFBQyxJQUFBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsVUFBQUMsWUFBQUQsUUFBQUUsYUFBQUgsT0FBQSxDQUFBO0FBQ0E7QUFDQTtBQUNBLFVBQUFJLFdBQUFDLFVBQUFILFNBQUEsQ0FBQTs7QUFFQTtBQUNBLFdBQUFOLFFBQUEsQ0FBQVEsUUFBQSxJQUFBLEtBQUFGLFNBQUEsSUFBQUYsT0FBQTtBQUNBLEtBakNBO0FBa0NBOzs7Ozs7Ozs7QUFTQU0sb0JBQUEsd0JBQUFOLE1BQUEsRUFBQUMsSUFBQSxFQUFBO0FBQ0EsVUFBQU0sYUFBQU4sT0FBQUksVUFBQUosSUFBQSxDQUFBLEdBQUFFLGFBQUFILE9BQUFRLFdBQUEsRUFBQUMsV0FBQSxFQUFBO0FBQ0FULGFBQUFVLElBQUEsR0FBQSxLQUFBQyxXQUFBLENBQUEsQ0FBQSxFQUFBSixVQUFBLENBQUE7O0FBRUEsVUFBQSxDQUFBUCxPQUFBWSxRQUFBLENBQUFiLElBQUEsV0FBQVEsVUFBQSxDQUFBLEVBQUE7QUFBQVAsZUFBQVksUUFBQSxDQUFBYixJQUFBLFdBQUFRLFVBQUEsRUFBQVAsT0FBQVUsSUFBQTtBQUFBO0FBQ0EsVUFBQSxDQUFBVixPQUFBWSxRQUFBLENBQUFDLElBQUEsQ0FBQSxVQUFBLENBQUEsRUFBQTtBQUFBYixlQUFBWSxRQUFBLENBQUFDLElBQUEsQ0FBQSxVQUFBLEVBQUFiLE1BQUE7QUFBQTtBQUNBOzs7O0FBSUFBLGFBQUFZLFFBQUEsQ0FBQUUsT0FBQSxjQUFBUCxVQUFBOztBQUVBLFdBQUFWLE1BQUEsQ0FBQWtCLElBQUEsQ0FBQWYsT0FBQVUsSUFBQTs7QUFFQTtBQUNBLEtBMURBO0FBMkRBOzs7Ozs7OztBQVFBTSxzQkFBQSwwQkFBQWhCLE1BQUEsRUFBQTtBQUNBLFVBQUFPLGFBQUFGLFVBQUFGLGFBQUFILE9BQUFZLFFBQUEsQ0FBQUMsSUFBQSxDQUFBLFVBQU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xVQUFBLENBQUEsUUFBQTtBQUNBO0FBSEEsS0FBQTtBQUtBOztBQUVBO0FBQ0EsTUFBQXpDLEVBQUEsNEJBQUEsRUFBQStDLE1BQUEsRUFBQTtBQUNBL0MsTUFBQSw0QkFBQSxFQUFBOHJCLEtBQUEsQ0FBQSxZQUFBO0FBQ0E5ckIsUUFBQSxJQUFBLEVBQUFrSixNQUFBLENBQUEsMEJBQUEsRUFBQXNSLElBQUEsQ0FBQSx3QkFBQSxFQUFBdVIsV0FBQTtBQUNBLEtBRkE7QUFHQTs7QUFFQTtBQUNBLE1BQUFybEIsT0FBQWlULFFBQUEsQ0FBQUMsSUFBQSxJQUFBbFQsT0FBQWlULFFBQUEsQ0FBQUMsSUFBQSxJQUFBLGdCQUFBLEVBQUE7QUFDQTVaLE1BQUEsZ0JBQUEsRUFBQXlDLFVBQUEsQ0FBQSxNQUFBO0FBQ0E7QUFFQSxDQXpLQTs7QUEyS0E7QUFDQSxJQUFBdXBCLDBCQUFBLENBQUE7O0FBRUE7QUFDQSxJQUFBQyxvQkFBQSxTQUFBQSxpQkFBQSxHQUFBO0FBQ0E7QUFDQSxNQUFBLE9BQUF2QixlQUFBLEtBQUEsVUFBQSxFQUFBO0FBQ0FBO0FBQ0E7QUFDQSxDQUx
5763BOztBQU9BO0FBQ0ExcUIsRUFBQTZxQixRQUFBLENBQUEzUixRQUFBLENBQUFVLElBQUEsR0FBQSxLQUFBIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbigkKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgRk9VTkRBVElPTl9WRVJTSU9OID0gJzYuMy4xJztcblxuLy8gR2xvYmFsIEZvdW5kYXRpb24gb2JqZWN0XG4vLyBUaGlzIGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIG9yIHVzZWQgYXMgYSBtb2R1bGUgZm9yIEFNRC9Ccm93c2VyaWZ5XG52YXIgRm91bmRhdGlvbiA9IHtcbiAgdmVyc2lvbjogRk9VTkRBVElPTl9WRVJTSU9OLFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgaW5pdGlhbGl6ZWQgcGx1Z2lucy5cbiAgICovXG4gIF9wbHVnaW5zOiB7fSxcblxuICAvKipcbiAgICogU3RvcmVzIGdlbmVyYXRlZCB1bmlxdWUgaWRzIGZvciBwbHVnaW4gaW5zdGFuY2VzXG4gICAqL1xuICBfdXVpZHM6IFtdLFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBmb3IgUlRMIHN1cHBvcnRcbiAgICovXG4gIHJ0bDogZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gJCgnaHRtbCcpLmF0dHIoJ2RpcicpID09PSAncnRsJztcbiAgfSxcbiAgLyoqXG4gICAqIERlZmluZXMgYSBGb3VuZGF0aW9uIHBsdWdpbiwgYWRkaW5nIGl0IHRvIHRoZSBgRm91bmRhdGlvbmAgbmFtZXNwYWNlIGFuZCB0aGUgbGlzdCBvZiBwbHVnaW5zIHRvIGluaXRpYWxpemUgd2hlbiByZWZsb3dpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW4gLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHBsdWdpbjogZnVuY3Rpb24ocGx1Z2luLCBuYW1lKSB7XG4gICAgLy8gT2JqZWN0IGtleSB0byB1c2Ugd2hlbiBhZGRpbmcgdG8gZ2xvYmFsIEZvdW5kYXRpb24gb2JqZWN0XG4gICAgLy8gRXhhbXBsZXM6IEZvdW5kYXRpb24uUmV2ZWFsLCBGb3VuZGF0aW9uLk9mZkNhbnZhc1xuICAgIHZhciBjbGFzc05hbWUgPSAobmFtZSB8fCBmdW5jdGlvbk5hbWUocGx1Z2luKSk7XG4gICAgLy8gT2JqZWN0IGtleSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBwbHVnaW4sIGFsc28gdXNlZCB0byBjcmVhdGUgdGhlIGlkZW50aWZ5aW5nIGRhdGEgYXR0cmlidXRlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gRXhhbXBsZXM6IGRhdGEtcmV2ZWFsLCBkYXRhLW9mZi1jYW52YXNcbiAgICB2YXIgYXR0ck5hbWUgID0gaHlwaGVuYXRlKGNsYXNzTmFtZSk7XG5cbiAgICAvLyBBZGQgdG8gdGhlIEZvdW5kYXRpb24gb2JqZWN0IGFuZCB0aGUgcGx1Z2lucyBsaXN0IChmb3IgcmVmbG93aW5nKVxuICAgIHRoaXMuX3BsdWdpbnNbYXR0ck5hbWVdID0gdGhpc1tjbGFzc05hbWVdID0gcGx1Z2luO1xuICB9LFxuICAvKipcbiAgICogQGZ1bmN0aW9uXG4gICAqIFBvcHVsYXRlcyB0aGUgX3V1aWRzIGFycmF5IHdpdGggcG9pbnRlcnMgdG8gZWFjaCBpbmRpdmlkdWFsIHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQWRkcyB0aGUgYHpmUGx1Z2luYCBkYXRhLWF0dHJpYnV0ZSB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgcGx1Z2lucyB0byBhbGxvdyB1c2Ugb2YgJChzZWxlY3RvcikuZm91bmRhdGlvbihtZXRob2QpIGNhbGxzLlxuICAgKiBBbHNvIGZpcmVzIHRoZSBpbml0aWFsaXphdGlvbiBldmVudCBmb3IgZWFjaCBwbHVnaW4sIGNvbnNvbGlkYXRpbmcgcmVwZXRpdGl2ZSBjb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luIC0gYW4gaW5zdGFuY2Ugb2YgYSBwbHVnaW4sIHVzdWFsbHkgYHRoaXNgIGluIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiwgcGFzc2VkIGFzIGEgY2FtZWxDYXNlZCBzdHJpbmcuXG4gICAqIEBmaXJlcyBQbHVnaW4jaW5pdFxuICAgKi9cbiAgcmVnaXN0ZXJQbHVnaW46IGZ1bmN0aW9uKHBsdWdpbiwgbmFtZSl7XG4gICAgdmFyIHBsdWdpbk5hbWUgPSBuYW1lID8gaHlwaGVuYXRlKG5hbWUpIDogZnVuY3Rpb25OYW1lKHBsdWdpbi5jb25zdHJ1Y3RvcikudG9Mb3dlckNhc2UoKTtcbiAgICBwbHVnaW4udXVpZCA9IHRoaXMuR2V0WW9EaWdpdHMoNiwgcGx1Z2luTmFtZSk7XG5cbiAgICBpZighcGx1Z2luLiRlbGVtZW50LmF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWApKXsgcGx1Z2luLiRlbGVtZW50LmF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWAsIHBsdWdpbi51dWlkKTsgfVxuICAgIGlmKCFwbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKSl7IHBsdWdpbi4kZWxlbWVudC5kYXRhKCd6ZlBsdWdpbicsIHBsdWdpbik7IH1cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBwbHVnaW4gaGFzIGluaXRpYWxpemVkLlxuICAgICAgICAgICAqIEBldmVudCBQbHVnaW4jaW5pdFxuICAgICAgICAgICAqL1xuICAgIHBsdWdpbi4kZWxlbWVudC50cmlnZ2VyKGBpbml0LnpmLiR7cGx1Z2luTmFtZX1gKTtcblxuICAgIHRoaXMuX3V1aWRzLnB1c2gocGx1Z2luLnV1aWQpO1xuXG4gICAgcmV0dXJuO1xuICB9LFxuICAvKipcbiAgICogQGZ1bmN0aW9uXG4gICAqIFJlbW92ZXMgdGhlIHBsdWdpbnMgdXVpZCBmcm9tIHRoZSBfdXVpZHMgYXJyYXkuXG4gICAqIFJlbW92ZXMgdGhlIHpmUGx1Z2luIGRhdGEgYXR0cmlidXRlLCBhcyB3ZWxsIGFzIHRoZSBkYXRhLXBsdWdpbi1uYW1lIGF0dHJpYnV0ZS5cbiAgICogQWxzbyBmaXJlcyB0aGUgZGVzdHJveWVkIGV2ZW50IGZvciB0aGUgcGx1Z2luLCBjb25zb2xpZGF0aW5nIHJlcGV0aXRpdmUgY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBsdWdpbiAtIGFuIGluc3RhbmNlIG9mIGEgcGx1Z2luLCB1c3VhbGx5IGB0aGlzYCBpbiBjb250ZXh0LlxuICAgKiBAZmlyZXMgUGx1Z2luI2Rlc3Ryb3llZFxuICAgKi9cbiAgdW5yZWdpc3RlclBsdWdpbjogZnVuY3Rpb24ocGx1Z2luKXtcbiAgICB2YXIgcGx1Z2luTmFtZSA9IGh5cGhlbmF0ZShmdW5jdGlvbk5hbWUocGx1Z2luLiRlbGVtZW50LmRhdGEoJ3pmUGx1Z2luJykuY29uc3RydWN0b3IpKTtcblxuICAgIHRoaXMuX3V1aWRzLnNwbGljZSh0aGlzLl91dWlkcy5pbmRleE9mKHBsdWdpbi51dWlkKSwgMSk7XG4gICAgcGx1Z2luLiRlbGVtZW50LnJlbW92ZUF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWApLnJlbW92ZURhdGEoJ3pmUGx1Z2luJylcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBwbHVnaW4gaGFzIGJlZW4gZGVzdHJveWVkLlxuICAgICAgICAgICAqIEBldmVudCBQbHVnaW4jZGVzdHJveWVkXG4gICAgICAgICAgICovXG4gICAgICAgICAgLnRyaWdnZXIoYGRlc3Ryb3llZC56Zi4ke3BsdWdpbk5hbWV9YCk7XG4gICAgZm9yKHZhciBwcm9wIGluIHBsdWdpbil7XG4gICAgICBwbHVnaW5bcHJvcF0gPSBudWxsOy8vY2xlYW4gdXAgc2NyaXB0IHRvIHByZXAgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb25cbiAgICogQ2F1c2VzIG9uZSBvciBtb3JlIGFjdGl2ZSBwbHVnaW5zIHRvIHJlLWluaXRpYWxpemUsIHJlc2V0dGluZyBldmVudCBsaXN0ZW5lcnMsIHJlY2FsY3VsYXRpbmcgcG9zaXRpb25zLCBldGMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5zIC0gb3B0aW9uYWwgc3RyaW5nIG9mIGFuIGluZGl2aWR1YWwgcGx1Z2luIGtleSwgYXR0YWluZWQgYnkgY2FsbGluZyBgJChlbGVtZW50KS5kYXRhKCdwbHVnaW5OYW1lJylgLCBvciBzdHJpbmcgb2YgYSBwbHVnaW4gY2xhc3MgaS5lLiBgJ2Ryb3Bkb3duJ2BcbiAgICogQGRlZmF1bHQgSWYgbm8gYXJndW1lbnQgaXMgcGFzc2VkLCByZWZsb3cgYWxsIGN1cnJlbnRseSBhY3RpdmUgcGx1Z2lucy5cbiAgICovXG4gICByZUluaXQ6IGZ1bmN0aW9uKHBsdWdpbnMpe1xuICAgICB2Y
5763XIgaXNKUSA9IHBsdWdpbnMgaW5zdGFuY2VvZiAkO1xuICAgICB0cnl7XG4gICAgICAgaWYoaXNKUSl7XG4gICAgICAgICBwbHVnaW5zLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgJCh0aGlzKS5kYXRhKCd6ZlBsdWdpbicpLl9pbml0KCk7XG4gICAgICAgICB9KTtcbiAgICAgICB9ZWxzZXtcbiAgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHBsdWdpbnMsXG4gICAgICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICAgICBmbnMgPSB7XG4gICAgICAgICAgICdvYmplY3QnOiBmdW5jdGlvbihwbGdzKXtcbiAgICAgICAgICAgICBwbGdzLmZvckVhY2goZnVuY3Rpb24ocCl7XG4gICAgICAgICAgICAgICBwID0gaHlwaGVuYXRlKHApO1xuICAgICAgICAgICAgICAgJCgnW2RhdGEtJysgcCArJ10nKS5mb3VuZGF0aW9uKCdfaW5pdCcpO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICB9LFxuICAgICAgICAgICAnc3RyaW5nJzogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICBwbHVnaW5zID0gaHlwaGVuYXRlKHBsdWdpbnMpO1xuICAgICAgICAgICAgICQoJ1tkYXRhLScrIHBsdWdpbnMgKyddJykuZm91bmRhdGlvbignX2luaXQnKTtcbiAgICAgICAgICAgfSxcbiAgICAgICAgICAgJ3VuZGVmaW5lZCc6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgdGhpc1snb2JqZWN0J10oT2JqZWN0LmtleXMoX3RoaXMuX3BsdWdpbnMpKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgfTtcbiAgICAgICAgIGZuc1t0eXBlXShwbHVnaW5zKTtcbiAgICAgICB9XG4gICAgIH1jYXRjaChlcnIpe1xuICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgfWZpbmFsbHl7XG4gICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgIH1cbiAgIH0sXG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSByYW5kb20gYmFzZS0zNiB1aWQgd2l0aCBuYW1lc3BhY2luZ1xuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCAtIG51bWJlciBvZiByYW5kb20gYmFzZS0zNiBkaWdpdHMgZGVzaXJlZC4gSW5jcmVhc2UgZm9yIG1vcmUgcmFuZG9tIHN0cmluZ3MuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgLSBuYW1lIG9mIHBsdWdpbiB0byBiZSBpbmNvcnBvcmF0ZWQgaW4gdWlkLCBvcHRpb25hbC5cbiAgICogQGRlZmF1bHQge1N0cmluZ30gJycgLSBpZiBubyBwbHVnaW4gbmFtZSBpcyBwcm92aWRlZCwgbm90aGluZyBpcyBhcHBlbmRlZCB0byB0aGUgdWlkLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtIHVuaXF1ZSBpZFxuICAgKi9cbiAgR2V0WW9EaWdpdHM6IGZ1bmN0aW9uKGxlbmd0aCwgbmFtZXNwYWNlKXtcbiAgICBsZW5ndGggPSBsZW5ndGggfHwgNjtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoTWF0aC5wb3coMzYsIGxlbmd0aCArIDEpIC0gTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDM2LCBsZW5ndGgpKSkudG9TdHJpbmcoMzYpLnNsaWNlKDEpICsgKG5hbWVzcGFjZSA/IGAtJHtuYW1lc3BhY2V9YCA6ICcnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcGx1Z2lucyBvbiBhbnkgZWxlbWVudHMgd2l0aGluIGBlbGVtYCAoYW5kIGBlbGVtYCBpdHNlbGYpIHRoYXQgYXJlbid0IGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIC0galF1ZXJ5IG9iamVjdCBjb250YWluaW5nIHRoZSBlbGVtZW50IHRvIGNoZWNrIGluc2lkZS4gQWxzbyBjaGVja3MgdGhlIGVsZW1lbnQgaXRzZWxmLCB1bmxlc3MgaXQncyB0aGUgYGRvY3VtZW50YCBvYmplY3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwbHVnaW5zIC0gQSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZS4gTGVhdmUgdGhpcyBvdXQgdG8gaW5pdGlhbGl6ZSBldmVyeXRoaW5nLlxuICAgKi9cbiAgcmVmbG93OiBmdW5jdGlvbihlbGVtLCBwbHVnaW5zKSB7XG5cbiAgICAvLyBJZiBwbHVnaW5zIGlzIHVuZGVmaW5lZCwganVzdCBncmFiIGV2ZXJ5dGhpbmdcbiAgICBpZiAodHlwZW9mIHBsdWdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwbHVnaW5zID0gT2JqZWN0LmtleXModGhpcy5fcGx1Z2lucyk7XG4gICAgfVxuICAgIC8vIElmIHBsdWdpbnMgaXMgYSBzdHJpbmcsIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBvbmUgaXRlbVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwbHVnaW5zID09PSAnc3RyaW5nJykge1xuICAgICAgcGx1Z2lucyA9IFtwbHVnaW5zXTtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGx1Z2luXG4gICAgJC5lYWNoKHBsdWdpbnMsIGZ1bmN0aW9uKGksIG5hbWUpIHtcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBwbHVnaW5cbiAgICAgIHZhciBwbHVnaW4gPSBfdGhpcy5fcGx1Z2luc1tuYW1lXTtcblxuICAgICAgLy8gTG9jYWxpemUgdGhlIHNlYXJjaCB0byBhbGwgZWxlbWVudHMgaW5zaWRlIGVsZW0sIGFzIHdlbGwgYXMgZWxlbSBpdHNlbGYsIHVubGVzcyBlbGVtID09PSBkb2N1bWVudFxuICAgICAgdmFyICRlbGVtID0gJChlbGVtKS5maW5kKCdbZGF0YS0nK25hbWUrJ10nKS5hZGRCYWNrKCdbZGF0YS0nK25hbWUrJ10nKTtcblxuICAgICAgLy8gRm9yIGVhY2ggcGx1Z2luIGZvdW5kLCBpbml0aWFsaXplIGl0XG4gICAgICAkZWxlbS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2Y
5763XIgJGVsID0gJCh0aGlzKSxcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgLy8gRG9uJ3QgZG91YmxlLWRpcCBvbiBwbHVnaW5zXG4gICAgICAgIGlmICgkZWwuZGF0YSgnemZQbHVnaW4nKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIlRyaWVkIHRvIGluaXRpYWxpemUgXCIrbmFtZStcIiBvbiBhbiBlbGVtZW50IHRoYXQgYWxyZWFkeSBoYXMgYSBGb3VuZGF0aW9uIHBsdWdpbi5cIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoJGVsLmF0dHIoJ2RhdGEtb3B0aW9ucycpKXtcbiAgICAgICAgICB2YXIgdGhpbmcgPSAkZWwuYXR0cignZGF0YS1vcHRpb25zJykuc3BsaXQoJzsnKS5mb3JFYWNoKGZ1bmN0aW9uKGUsIGkpe1xuICAgICAgICAgICAgdmFyIG9wdCA9IGUuc3BsaXQoJzonKS5tYXAoZnVuY3Rpb24oZWwpeyByZXR1cm4gZWwudHJpbSgpOyB9KTtcbiAgICAgICAgICAgIGlmKG9wdFswXSkgb3B0c1tvcHRbMF1dID0gcGFyc2VWYWx1ZShvcHRbMV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAkZWwuZGF0YSgnemZQbHVnaW4nLCBuZXcgcGx1Z2luKCQodGhpcyksIG9wdHMpKTtcbiAgICAgICAgfWNhdGNoKGVyKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyKTtcbiAgICAgICAgfWZpbmFsbHl7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Rm5OYW1lOiBmdW5jdGlvbk5hbWUsXG4gIHRyYW5zaXRpb25lbmQ6IGZ1bmN0aW9uKCRlbGVtKXtcbiAgICB2YXIgdHJhbnNpdGlvbnMgPSB7XG4gICAgICAndHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgICdXZWJraXRUcmFuc2l0aW9uJzogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICAgJ01velRyYW5zaXRpb24nOiAndHJhbnNpdGlvbmVuZCcsXG4gICAgICAnT1RyYW5zaXRpb24nOiAnb3RyYW5zaXRpb25lbmQnXG4gICAgfTtcbiAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgICAgICBlbmQ7XG5cbiAgICBmb3IgKHZhciB0IGluIHRyYW5zaXRpb25zKXtcbiAgICAgIGlmICh0eXBlb2YgZWxlbS5zdHlsZVt0XSAhPT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICBlbmQgPSB0cmFuc2l0aW9uc1t0XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZW5kKXtcbiAgICAgIHJldHVybiBlbmQ7XG4gICAgfWVsc2V7XG4gICAgICBlbmQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICRlbGVtLnRyaWdnZXJIYW5kbGVyKCd0cmFuc2l0aW9uZW5kJywgWyRlbGVtXSk7XG4gICAgICB9LCAxKTtcbiAgICAgIHJldHVybiAndHJhbnNpdGlvbmVuZCc7XG4gICAgfVxuICB9XG59O1xuXG5Gb3VuZGF0aW9uLnV0aWwgPSB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmb3IgYXBwbHlpbmcgYSBkZWJvdW5jZSBlZmZlY3QgdG8gYSBmdW5jdGlvbiBjYWxsLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgdGltZW91dC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5IC0gVGltZSBpbiBtcyB0byBkZWxheSB0aGUgY2FsbCBvZiBgZnVuY2AuXG4gICAqIEByZXR1cm5zIGZ1bmN0aW9uXG4gICAqL1xuICB0aHJvdHRsZTogZnVuY3Rpb24gKGZ1bmMsIGRlbGF5KSB7XG4gICAgdmFyIHRpbWVyID0gbnVsbDtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
5763XIgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgIGlmICh0aW1lciA9PT0gbnVsbCkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuLy8gVE9ETzogY29uc2lkZXIgbm90IG1ha2luZyB0aGlzIGEgalF1ZXJ5IGZ1bmN0aW9uXG4vLyBUT0RPOiBuZWVkIHdheSB0byByZWZsb3cgdnMuIHJlLWluaXRpYWxpemVcbi8qKlxuICogVGhlIEZvdW5kYXRpb24galF1ZXJ5IG1ldGhvZC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBtZXRob2QgLSBBbiBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgY3VycmVudCBqUXVlcnkgb2JqZWN0LlxuICovXG52YXIgZm91bmRhdGlvbiA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBtZXRob2QsXG4gICAgICAkbWV0YSA9ICQoJ21ldGEuZm91bmRhdGlvbi1tcScpLFxuICAgICAgJG5vSlMgPSAkKCcubm8tanMnKTtcblxuICBpZighJG1ldGEubGVuZ3RoKXtcbiAgICAkKCc8bWV0YSBjbGFzcz1cImZvdW5kYXRpb24tbXFcIj4nKS5hcHBlbmRUbyhkb2N1bWVudC5oZWFkKTtcbiAgfVxuICBpZigkbm9KUy5sZW5ndGgpe1xuICAgICRub0pTLnJlbW92ZUNsYXNzKCduby1qcycpO1xuICB9XG5cbiAgaWYodHlwZSA9PT0gJ3VuZGVmaW5lZCcpey8vbmVlZHMgdG8gaW5pdGlhbGl6ZSB0aGUgRm91bmRhdGlvbiBvYmplY3QsIG9yIGFuIGluZGl2aWR1YWwgcGx1Z2luLlxuICAgIEZvdW5kYXRpb24uTWVkaWFRdWVyeS5faW5pdCgpO1xuICAgIEZvdW5kYXRpb24ucmVmbG93KHRoaXMpO1xuICB9ZWxzZSBpZih0eXBlID09PSAnc3RyaW5nJyl7Ly9hbiBpbmRpdmlkdWFsIG1ldGhvZCB0byBpbnZva2Ugb24gYSBwbHVnaW4gb3IgZ3JvdXAgb2YgcGx1Z2luc1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsvL2NvbGxlY3QgYWxsIHRoZSBhcmd1bWVudHMsIGlmIG5lY2Vzc2FyeVxuICAgIHZhciBwbHVnQ2xhc3MgPSB0aGlzLmRhdGEoJ3pmUGx1Z2luJyk7Ly9kZXRlcm1pbmUgdGhlIGNsYXNzIG9mIHBsdWdpblxuXG4gICAgaWYocGx1Z0NsYXNzICE9PSB1bmRlZmluZWQgJiYgcGx1Z0NsYXNzW21ldGhvZF0gIT09IHVuZGVmaW5lZCl7Ly9tYWtlIHN1cmUgYm90aCB0aGUgY2xhc3MgYW5kIG1ldGhvZCBleGlzdFxuICAgICAgaWYodGhpcy5sZW5ndGggPT09IDEpey8vaWYgdGhlcmUncyBvbmx5IG9uZSwgY2FsbCBpdCBkaXJlY3RseS5cbiAgICAgICAgICBwbHVnQ2xhc3NbbWV0aG9kXS5hcHBseShwbHVnQ2xhc3MsIGFyZ3MpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihpLCBlbCl7Ly9vdGhlcndpc2UgbG9vcCB0aHJvdWdoIHRoZSBqUXVlcnkgY29sbGVjdGlvbiBhbmQgaW52b2tlIHRoZSBtZXRob2Qgb24gZWFjaFxuICAgICAgICAgIHBsdWdDbGFzc1ttZXRob2RdLmFwcGx5KCQoZWwpLmRhdGEoJ3pmUGx1Z2luJyksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9ZWxzZXsvL2Vycm9yIGZvciBubyBjbGFzcyBvciBubyBtZXRob2RcbiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcIldlJ3JlIHNvcnJ5LCAnXCIgKyBtZXRob2QgKyBcIicgaXMgbm90IGFuIGF2YWlsYWJsZSBtZXRob2QgZm9yIFwiICsgKHBsdWdDbGFzcyA/IGZ1bmN0aW9uTmFtZShwbHVnQ2xhc3MpIDogJ3RoaXMgZWxlbWVudCcpICsgJy4nKTtcbiAgICB9XG4gIH1lbHNley8vZXJyb3IgZm9yIGludmFsaWQgYXJndW1lbnQgdHlwZVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFdlJ3JlIHNvcnJ5LCAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIHBhcmFtZXRlci4gWW91IG11c3QgdXNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbWV0aG9kIHlvdSB3aXNoIHRvIGludm9rZS5gKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbndpbmRvdy5Gb3VuZGF0aW9uID0gRm91bmRhdGlvbjtcbiQuZm4uZm91bmRhdGlvbiA9IGZvdW5kYXRpb247XG5cbi8vIFBvbHlmaWxsIGZvciByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbihmdW5jdGlvbigpIHtcbiAgaWYgKCFEYXRlLm5vdyB8fCAhd2luZG93LkRhdGUubm93KVxuICAgIHdpbmRvdy5EYXRlLm5vdyA9IERhdGUubm93ID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfTtcblxuICB2YXIgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyArK2kpIHtcbiAgICAgIHZhciB2cCA9IHZlbmRvcnNbaV07XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93W3ZwKydSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9ICh3aW5kb3dbdnArJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvd1t2cCsnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ10pO1xuICB9XG4gIGlmICgvaVAoYWR8aG9uZXxvZCkuKk9TIDYvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgfHwgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgIHZhciBsYXN0VGltZSA9IDA7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB2Y
5763XIgbmV4dFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSArIDE2LCBub3cpO1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2sobGFzdFRpbWUgPSBuZXh0VGltZSk7IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lIC0gbm93KTtcbiAgICB9O1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGNsZWFyVGltZW91dDtcbiAgfVxuICAvKipcbiAgICogUG9seWZpbGwgZm9yIHBlcmZvcm1hbmNlLm5vdywgcmVxdWlyZWQgYnkgckFGXG4gICAqL1xuICBpZighd2luZG93LnBlcmZvcm1hbmNlIHx8ICF3aW5kb3cucGVyZm9ybWFuY2Uubm93KXtcbiAgICB3aW5kb3cucGVyZm9ybWFuY2UgPSB7XG4gICAgICBzdGFydDogRGF0ZS5ub3coKSxcbiAgICAgIG5vdzogZnVuY3Rpb24oKXsgcmV0dXJuIERhdGUubm93KCkgLSB0aGlzLnN0YXJ0OyB9XG4gICAgfTtcbiAgfVxufSkoKTtcbmlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHtcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihvVGhpcykge1xuICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1XG4gICAgICAvLyBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZScpO1xuICAgIH1cblxuICAgIHZhciBhQXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgZlRvQmluZCA9IHRoaXMsXG4gICAgICAgIGZOT1AgICAgPSBmdW5jdGlvbigpIHt9LFxuICAgICAgICBmQm91bmQgID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGZOT1BcbiAgICAgICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICAgICAgIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgIGFBcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgICAgIH07XG5cbiAgICBpZiAodGhpcy5wcm90b3R5cGUpIHtcbiAgICAgIC8vIG5hdGl2ZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIHByb3RvdHlwZVxuICAgICAgZk5PUC5wcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcbiAgICB9XG4gICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7XG5cbiAgICByZXR1cm4gZkJvdW5kO1xuICB9O1xufVxuLy8gUG9seWZpbGwgdG8gZ2V0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaW4gSUU5XG5mdW5jdGlvbiBmdW5jdGlvbk5hbWUoZm4pIHtcbiAgaWYgKEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZnVuY05hbWVSZWdleCA9IC9mdW5jdGlvblxccyhbXihdezEsfSlcXCgvO1xuICAgIHZhciByZXN1bHRzID0gKGZ1bmNOYW1lUmVnZXgpLmV4ZWMoKGZuKS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAxKSA/IHJlc3VsdHNbMV0udHJpbSgpIDogXCJcIjtcbiAgfVxuICBlbHNlIGlmIChmbi5wcm90b3R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmbi5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBmbi5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyc2VWYWx1ZShzdHIpe1xuICBpZiAoJ3RydWUnID09PSBzdHIpIHJldHVybiB0cnVlO1xuICBlbHNlIGlmICgnZmFsc2UnID09PSBzdHIpIHJldHVybiBmYWxzZTtcbiAgZWxzZSBpZiAoIWlzTmFOKHN0ciAqIDEpKSByZXR1cm4gcGFyc2VGbG9hdChzdHIpO1xuICByZXR1cm4gc3RyO1xufVxuLy8gQ29udmVydCBQYXNjYWxDYXNlIHRvIGtlYmFiLWNhc2Vcbi8vIFRoYW5rIHlvdTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvODk1NTU4MFxuZnVuY3Rpb24gaHlwaGVuYXRlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG59XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuRm91bmRhdGlvbi5Cb3ggPSB7XG4gIEltTm90VG91Y2hpbmdZb3U6IEltTm90VG91Y2hpbmdZb3UsXG4gIEdldERpbWVuc2lvbnM6IEdldERpbWVuc2lvbnMsXG4gIEdldE9mZnNldHM6IEdldE9mZnNldHNcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aGUgZGltZW5zaW9ucyBvZiBhbiBlbGVtZW50IHRvIGEgY29udGFpbmVyIGFuZCBkZXRlcm1pbmVzIGNvbGxpc2lvbiBldmVudHMgd2l0aCBjb250YWluZXIuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0byB0ZXN0IGZvciBjb2xsaXNpb25zLlxuICogQHBhcmFtIHtqUXVlcnl9IHBhcmVudCAtIGpRdWVyeSBvYmplY3QgdG8gdXNlIGFzIGJvdW5kaW5nIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbHJPbmx5IC0gc2V0IHRvIHRydWUgdG8gY2hlY2sgbGVmdCBhbmQgcmlnaHQgdmFsdWVzIG9ubHkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRiT25seSAtIHNldCB0byB0cnVlIHRvIGNoZWNrIHRvcCBhbmQgYm90dG9tIHZhbHVlcyBvbmx5LlxuICogQGRlZmF1bHQgaWYgbm8gcGFyZW50IG9iamVjdCBwYXNzZWQsIGRldGVjdHMgY29sbGlzaW9ucyB3aXRoIGB3aW5kb3dgLlxuICogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBjb2xsaXNpb24gZnJlZSwgZmFsc2UgaWYgYSBjb2xsaXNpb24gaW4gYW55IGRpcmVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gSW1Ob3RUb3VjaGluZ1lvdShlbGVtZW50LCBwYXJlbnQsIGxyT25seSwgdGJPbmx5KSB7XG4gIHZhciBlbGVEaW1zID0gR2V0RGltZW5zaW9ucyhlbGVtZW50KSxcbiAgICAgIHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodDtcblxuICBpZiAocGFyZW50KSB7XG4gICAgdmFyIHBhckRpbXMgPSBHZXREaW1lbnNpb25zKHBhcmVudCk7XG5cbiAgICBib3R0b20gPSAoZWxlRGltcy5vZmZzZXQudG9wICsgZWxlRGltcy5oZWlnaHQgPD0gcGFyRGltcy5oZWlnaHQgKyBwYXJEaW1zLm9mZnNldC50b3ApO1xuICAgIHRvcCAgICA9IChlbGVEaW1zLm9mZnNldC50b3AgPj0gcGFyRGltcy5vZmZzZXQudG9wKTtcbiAgICBsZWZ0ICAgPSAoZWxlRGltcy5vZmZzZXQubGVmdCA+PSBwYXJEaW1zLm9mZnNldC5sZWZ0KTtcbiAgICByaWdodCAgPSAoZWxlRGltcy5vZmZzZXQubGVmdCArIGVsZURpbXMud2lkdGggPD0gcGFyRGltcy53aWR0aCArIHBhckRpbXMub2Zmc2V0LmxlZnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIGJvdHRvbSA9IChlbGVEaW1zLm9mZnNldC50b3AgKyBlbGVEaW1zLmhlaWdodCA8PSBlbGVEaW1zLndpbmRvd0RpbXMuaGVpZ2h0ICsgZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3ApO1xuICAgIHRvcCAgICA9IChlbGVEaW1zLm9mZnNldC50b3AgPj0gZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3ApO1xuICAgIGxlZnQgICA9IChlbGVEaW1zLm9mZnNldC5sZWZ0ID49IGVsZURpbXMud2luZG93RGltcy5vZmZzZXQubGVmdCk7XG4gICAgcmlnaHQgID0gKGVsZURpbXMub2Zmc2V0LmxlZnQgKyBlbGVEaW1zLndpZHRoIDw9IGVsZURpbXMud2luZG93RGltcy53aWR0aCk7XG4gIH1cblxuICB2Y
5763XIgYWxsRGlycyA9IFtib3R0b20sIHRvcCwgbGVmdCwgcmlnaHRdO1xuXG4gIGlmIChsck9ubHkpIHtcbiAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgPT09IHRydWU7XG4gIH1cblxuICBpZiAodGJPbmx5KSB7XG4gICAgcmV0dXJuIHRvcCA9PT0gYm90dG9tID09PSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGFsbERpcnMuaW5kZXhPZihmYWxzZSkgPT09IC0xO1xufTtcblxuLyoqXG4gKiBVc2VzIG5hdGl2ZSBtZXRob2RzIHRvIHJldHVybiBhbiBvYmplY3Qgb2YgZGltZW5zaW9uIHZhbHVlcy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtqUXVlcnkgfHwgSFRNTH0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3Qgb3IgRE9NIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZGltZW5zaW9ucy4gQ2FuIGJlIGFueSBlbGVtZW50IG90aGVyIHRoYXQgZG9jdW1lbnQgb3Igd2luZG93LlxuICogQHJldHVybnMge09iamVjdH0gLSBuZXN0ZWQgb2JqZWN0IG9mIGludGVnZXIgcGl4ZWwgdmFsdWVzXG4gKiBUT0RPIC0gaWYgZWxlbWVudCBpcyB3aW5kb3csIHJldHVybiBvbmx5IHRob3NlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gR2V0RGltZW5zaW9ucyhlbGVtLCB0ZXN0KXtcbiAgZWxlbSA9IGVsZW0ubGVuZ3RoID8gZWxlbVswXSA6IGVsZW07XG5cbiAgaWYgKGVsZW0gPT09IHdpbmRvdyB8fCBlbGVtID09PSBkb2N1bWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkknbSBzb3JyeSwgRGF2ZS4gSSdtIGFmcmFpZCBJIGNhbid0IGRvIHRoYXQuXCIpO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgcGFyUmVjdCA9IGVsZW0ucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpblJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgd2luWSA9IHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgICAgIHdpblggPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgIG9mZnNldDoge1xuICAgICAgdG9wOiByZWN0LnRvcCArIHdpblksXG4gICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5YXG4gICAgfSxcbiAgICBwYXJlbnREaW1zOiB7XG4gICAgICB3aWR0aDogcGFyUmVjdC53aWR0aCxcbiAgICAgIGhlaWdodDogcGFyUmVjdC5oZWlnaHQsXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgdG9wOiBwYXJSZWN0LnRvcCArIHdpblksXG4gICAgICAgIGxlZnQ6IHBhclJlY3QubGVmdCArIHdpblhcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbmRvd0RpbXM6IHtcbiAgICAgIHdpZHRoOiB3aW5SZWN0LndpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5SZWN0LmhlaWdodCxcbiAgICAgIG9mZnNldDoge1xuICAgICAgICB0b3A6IHdpblksXG4gICAgICAgIGxlZnQ6IHdpblhcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBvZiB0b3AgYW5kIGxlZnQgaW50ZWdlciBwaXhlbCB2YWx1ZXMgZm9yIGR5bmFtaWNhbGx5IHJlbmRlcmVkIGVsZW1lbnRzLFxuICogc3VjaCBhczogVG9vbHRpcCwgUmV2ZWFsLCBhbmQgRHJvcGRvd25cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgZWxlbWVudCBiZWluZyBwb3NpdGlvbmVkLlxuICogQHBhcmFtIHtqUXVlcnl9IGFuY2hvciAtIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBlbGVtZW50J3MgYW5jaG9yIHBvaW50LlxuICogQHBhcmFtIHtTdHJpbmd9IHBvc2l0aW9uIC0gYSBzdHJpbmcgcmVsYXRpbmcgdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQsIHJlbGF0aXZlIHRvIGl0J3MgYW5jaG9yXG4gKiBAcGFyYW0ge051bWJlcn0gdk9mZnNldCAtIGludGVnZXIgcGl4ZWwgdmFsdWUgb2YgZGVzaXJlZCB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gYW5jaG9yIGFuZCBlbGVtZW50LlxuICogQHBhcmFtIHtOdW1iZXJ9IGhPZmZzZXQgLSBpbnRlZ2VyIHBpeGVsIHZhbHVlIG9mIGRlc2lyZWQgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gYW5jaG9yIGFuZCBlbGVtZW50LlxuICogQHBhcmFtIHtCb29sZWFufSBpc092ZXJmbG93IC0gaWYgYSBjb2xsaXNpb24gZXZlbnQgaXMgZGV0ZWN0ZWQsIHNldHMgdG8gdHJ1ZSB0byBkZWZhdWx0IHRoZSBlbGVtZW50IHRvIGZ1bGwgd2lkdGggLSBhbnkgZGVzaXJlZCBvZmZzZXQuXG4gKiBUT0RPIGFsdGVyL3Jld3JpdGUgdG8gd29yayB3aXRoIGBlbWAgdmFsdWVzIGFzIHdlbGwvaW5zdGVhZCBvZiBwaXhlbHNcbiAqL1xuZnVuY3Rpb24gR2V0T2Zmc2V0cyhlbGVtZW50LCBhbmNob3IsIHBvc2l0aW9uLCB2T2Zmc2V0LCBoT2Zmc2V0LCBpc092ZXJmbG93KSB7XG4gIHZhciAkZWxlRGltcyA9IEdldERpbWVuc2lvbnMoZWxlbWVudCksXG4gICAgICAkYW5jaG9yRGltcyA9IGFuY2hvciA/IEdldERpbWVuc2lvbnMoYW5jaG9yKSA6IG51bGw7XG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoRm91bmRhdGlvbi5ydGwoKSA/ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0IC0gJGVsZURpbXMud2lkdGggKyAkYW5jaG9yRGltcy53aWR0aCA6ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0KSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wIC0gKCRlbGVEaW1zLmhlaWdodCArIHZPZmZzZXQpXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0IC0gKCRlbGVEaW1zLndpZHRoICsgaE9mZnNldCksXG4gICAgICAgIHRvcDogJGFuY2hvckRpbXMub2Zmc2V0LnRvcFxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyAkYW5jaG9yRGltcy53aWR0aCArIGhPZmZzZXQsXG4gICAgICAgI
5763HRvcDogJGFuY2hvckRpbXMub2Zmc2V0LnRvcFxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyIHRvcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyAoJGFuY2hvckRpbXMud2lkdGggLyAyKSkgLSAoJGVsZURpbXMud2lkdGggLyAyKSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wIC0gKCRlbGVEaW1zLmhlaWdodCArIHZPZmZzZXQpXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXIgYm90dG9tJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGlzT3ZlcmZsb3cgPyBoT2Zmc2V0IDogKCgkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICgkYW5jaG9yRGltcy53aWR0aCAvIDIpKSAtICgkZWxlRGltcy53aWR0aCAvIDIpKSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyIGxlZnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgLSAoJGVsZURpbXMud2lkdGggKyBoT2Zmc2V0KSxcbiAgICAgICAgdG9wOiAoJGFuY2hvckRpbXMub2Zmc2V0LnRvcCArICgkYW5jaG9yRGltcy5oZWlnaHQgLyAyKSkgLSAoJGVsZURpbXMuaGVpZ2h0IC8gMilcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NlbnRlciByaWdodCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICRhbmNob3JEaW1zLndpZHRoICsgaE9mZnNldCArIDEsXG4gICAgICAgIHRvcDogKCRhbmNob3JEaW1zLm9mZnNldC50b3AgKyAoJGFuY2hvckRpbXMuaGVpZ2h0IC8gMikpIC0gKCRlbGVEaW1zLmhlaWdodCAvIDIpXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXInOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogKCRlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LmxlZnQgKyAoJGVsZURpbXMud2luZG93RGltcy53aWR0aCAvIDIpKSAtICgkZWxlRGltcy53aWR0aCAvIDIpLFxuICAgICAgICB0b3A6ICgkZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3AgKyAoJGVsZURpbXMud2luZG93RGltcy5oZWlnaHQgLyAyKSkgLSAoJGVsZURpbXMuaGVpZ2h0IC8gMilcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JldmVhbCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoJGVsZURpbXMud2luZG93RGltcy53aWR0aCAtICRlbGVEaW1zLndpZHRoKSAvIDIsXG4gICAgICAgIHRvcDogJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQudG9wICsgdk9mZnNldFxuICAgICAgfVxuICAgIGNhc2UgJ3JldmVhbCBmdWxsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICRlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LmxlZnQsXG4gICAgICAgIHRvcDogJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQudG9wXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0IGJvdHRvbSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0IGJvdHRvbSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICRhbmNob3JEaW1zLndpZHRoICsgaE9mZnNldCAtICRlbGVEaW1zLndpZHRoLFxuICAgICAgICB0b3A6ICRhbmNob3JEaW1zLm9mZnNldC50b3AgKyAkYW5jaG9yRGltcy5oZWlnaHQgKyB2T2Zmc2V0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IChGb3VuZGF0aW9uLnJ0bCgpID8gJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgLSAkZWxlRGltcy53aWR0aCArICRhbmNob3JEaW1zLndpZHRoIDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyBoT2Zmc2V0KSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfVxuICB9XG59XG5cbn0oalF1ZXJ5KTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogVGhpcyB1dGlsIHdhcyBjcmVhdGVkIGJ5IE1hcml1cyBPbGJlcnR6ICpcbiAqIFBsZWFzZSB0aGFuayBNYXJpdXMgb24gR2l0SHViIC9vd2xiZXJ0eiAqXG4gKiBvciB0aGUgd2ViIGh0dHA6Ly93d3cubWFyaXVzb2xiZXJ0ei5kZS8gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuY29uc3Qga2V5Q29kZXMgPSB7XG4gIDk6ICdUQUInLFxuICAxMzogJ0VOVEVSJyxcbiAgMjc6ICdFU0NBUEUnLFxuICAzMjogJ1NQQUNFJyxcbiAgMzc6ICdBUlJPV19MRUZUJyxcbiAgMzg6ICdBUlJPV19VUCcsXG4gIDM5OiAnQVJST1dfUklHSFQnLFxuICA0MDogJ0FSUk9XX0RPV04nXG59XG5cbnZhciBjb21tYW5kcyA9IHt9XG5cbnZhciBLZXlib2FyZCA9IHtcbiAga2V5czogZ2V0S2V5Q29kZXMoa2V5Q29kZXMpLFxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIChrZXlib2FyZCkgZXZlbnQgYW5kIHJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIGl0cyBrZXlcbiAgICogQ2FuIGJlIHVzZWQgbGlrZSBGb3VuZGF0aW9uLnBhcnNlS2V5KGV2ZW50KSA9PT0gRm91bmRhdGlvbi5rZXlzLlNQQUNFXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gdGhlIGV2ZW50IGdlbmVyYXRlZCBieSB0aGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcmV0dXJuIFN0cmluZyBrZXkgLSBTd
5763HJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBrZXkgcHJlc3NlZFxuICAgKi9cbiAgcGFyc2VLZXkoZXZlbnQpIHtcbiAgICB2YXIga2V5ID0ga2V5Q29kZXNbZXZlbnQud2hpY2ggfHwgZXZlbnQua2V5Q29kZV0gfHwgU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC53aGljaCkudG9VcHBlckNhc2UoKTtcblxuICAgIC8vIFJlbW92ZSB1bi1wcmludGFibGUgY2hhcmFjdGVycywgZS5nLiBmb3IgYGZyb21DaGFyQ29kZWAgY2FsbHMgZm9yIENUUkwgb25seSBldmVudHNcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxXKy8sICcnKTtcblxuICAgIGlmIChldmVudC5zaGlmdEtleSkga2V5ID0gYFNISUZUXyR7a2V5fWA7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpIGtleSA9IGBDVFJMXyR7a2V5fWA7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkga2V5ID0gYEFMVF8ke2tleX1gO1xuXG4gICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHVuZGVyc2NvcmUsIGluIGNhc2Ugb25seSBtb2RpZmllcnMgd2VyZSB1c2VkIChlLmcuIG9ubHkgYENUUkxfQUxUYClcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXyQvLCAnJyk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBnaXZlbiAoa2V5Ym9hcmQpIGV2ZW50XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gdGhlIGV2ZW50IGdlbmVyYXRlZCBieSB0aGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50IC0gRm91bmRhdGlvbiBjb21wb25lbnQncyBuYW1lLCBlLmcuIFNsaWRlciBvciBSZXZlYWxcbiAgICogQHBhcmFtIHtPYmplY3RzfSBmdW5jdGlvbnMgLSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSB0byBiZSBleGVjdXRlZFxuICAgKi9cbiAgaGFuZGxlS2V5KGV2ZW50LCBjb21wb25lbnQsIGZ1bmN0aW9ucykge1xuICAgIHZhciBjb21tYW5kTGlzdCA9IGNvbW1hbmRzW2NvbXBvbmVudF0sXG4gICAgICBrZXlDb2RlID0gdGhpcy5wYXJzZUtleShldmVudCksXG4gICAgICBjbWRzLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGZuO1xuXG4gICAgaWYgKCFjb21tYW5kTGlzdCkgcmV0dXJuIGNvbnNvbGUud2FybignQ29tcG9uZW50IG5vdCBkZWZpbmVkIScpO1xuXG4gICAgaWYgKHR5cGVvZiBjb21tYW5kTGlzdC5sdHIgPT09ICd1bmRlZmluZWQnKSB7IC8vIHRoaXMgY29tcG9uZW50IGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsdHIgYW5kIHJ0bFxuICAgICAgICBjbWRzID0gY29tbWFuZExpc3Q7IC8vIHVzZSBwbGFpbiBsaXN0XG4gICAgfSBlbHNlIHsgLy8gbWVyZ2UgbHRyIGFuZCBydGw6IGlmIGRvY3VtZW50IGlzIHJ0bCwgcnRsIG92ZXJ3cml0ZXMgbHRyIGFuZCB2aWNlIHZlcnNhXG4gICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCgpKSBjbWRzID0gJC5leHRlbmQoe30sIGNvbW1hbmRMaXN0Lmx0ciwgY29tbWFuZExpc3QucnRsKTtcblxuICAgICAgICBlbHNlIGNtZHMgPSAkLmV4dGVuZCh7fSwgY29tbWFuZExpc3QucnRsLCBjb21tYW5kTGlzdC5sdHIpO1xuICAgIH1cbiAgICBjb21tYW5kID0gY21kc1trZXlDb2RlXTtcblxuICAgIGZuID0gZnVuY3Rpb25zW2NvbW1hbmRdO1xuICAgIGlmIChmbiAmJiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHsgLy8gZXhlY3V0ZSBmdW5jdGlvbiAgaWYgZXhpc3RzXG4gICAgICB2Y
5763XIgcmV0dXJuVmFsdWUgPSBmbi5hcHBseSgpO1xuICAgICAgaWYgKGZ1bmN0aW9ucy5oYW5kbGVkIHx8IHR5cGVvZiBmdW5jdGlvbnMuaGFuZGxlZCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBleGVjdXRlIGZ1bmN0aW9uIHdoZW4gZXZlbnQgd2FzIGhhbmRsZWRcbiAgICAgICAgICBmdW5jdGlvbnMuaGFuZGxlZChyZXR1cm5WYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmdW5jdGlvbnMudW5oYW5kbGVkIHx8IHR5cGVvZiBmdW5jdGlvbnMudW5oYW5kbGVkID09PSAnZnVuY3Rpb24nKSB7IC8vIGV4ZWN1dGUgZnVuY3Rpb24gd2hlbiBldmVudCB3YXMgbm90IGhhbmRsZWRcbiAgICAgICAgICBmdW5jdGlvbnMudW5oYW5kbGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGhpbiB0aGUgZ2l2ZW4gYCRlbGVtZW50YFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIHNlYXJjaCB3aXRoaW5cbiAgICogQHJldHVybiB7alF1ZXJ5fSAkZm9jdXNhYmxlIC0gYWxsIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoaW4gYCRlbGVtZW50YFxuICAgKi9cbiAgZmluZEZvY3VzYWJsZSgkZWxlbWVudCkge1xuICAgIGlmKCEkZWxlbWVudCkge3JldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiAkZWxlbWVudC5maW5kKCdhW2hyZWZdLCBhcmVhW2hyZWZdLCBpbnB1dDpub3QoW2Rpc2FibGVkXSksIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBvYmplY3QsIGVtYmVkLCAqW3RhYmluZGV4XSwgKltjb250ZW50ZWRpdGFibGVdJykuZmlsdGVyKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCEkKHRoaXMpLmlzKCc6dmlzaWJsZScpIHx8ICQodGhpcykuYXR0cigndGFiaW5kZXgnKSA8IDApIHsgcmV0dXJuIGZhbHNlOyB9IC8vb25seSBoYXZlIHZpc2libGUgZWxlbWVudHMgYW5kIHRob3NlIHRoYXQgaGF2ZSBhIHRhYmluZGV4IGdyZWF0ZXIgb3IgZXF1YWwgMFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudCAtIEZvdW5kYXRpb24gY29tcG9uZW50LCBlLmcuIFNsaWRlciBvciBSZXZlYWxcbiAgICogQHJldHVybiBTdHJpbmcgY29tcG9uZW50TmFtZVxuICAgKi9cblxuICByZWdpc3Rlcihjb21wb25lbnROYW1lLCBjbWRzKSB7XG4gICAgY29tbWFuZHNbY29tcG9uZW50TmFtZV0gPSBjbWRzO1xuICB9LCAgXG5cbiAgLyoqXG4gICAqIFRyYXBzIHRoZSBmb2N1cyBpbiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtICB7alF1ZXJ5fSAkZWxlbWVudCAgalF1ZXJ5IG9iamVjdCB0byB0cmFwIHRoZSBmb3VjcyBpbnRvLlxuICAgKi9cbiAgdHJhcEZvY3VzKCRlbGVtZW50KSB7XG4gICAgdmFyICRmb2N1c2FibGUgPSBGb3VuZGF0aW9uLktleWJvYXJkLmZpbmRGb2N1c2FibGUoJGVsZW1lbnQpLFxuICAgICAgICAkZmlyc3RGb2N1c2FibGUgPSAkZm9jdXNhYmxlLmVxKDApLFxuICAgICAgICAkbGFzdEZvY3VzYWJsZSA9ICRmb2N1c2FibGUuZXEoLTEpO1xuXG4gICAgJGVsZW1lbnQub24oJ2tleWRvd24uemYudHJhcGZvY3VzJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09ICRsYXN0Rm9jdXNhYmxlWzBdICYmIEZvdW5kYXRpb24uS2V5Ym9hcmQucGFyc2VLZXkoZXZlbnQpID09PSAnVEFCJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZmlyc3RGb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGV2ZW50LnRhcmdldCA9PT0gJGZpcnN0Rm9jdXNhYmxlWzBdICYmIEZvdW5kYXRpb24uS2V5Ym9hcmQucGFyc2VLZXkoZXZlbnQpID09PSAnU0hJRlRfVEFCJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkbGFzdEZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIHRyYXBwZWQgZm9jdXMgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtICB7alF1ZXJ5fSAkZWxlbWVudCAgalF1ZXJ5IG9iamVjdCB0byByZWxlYXNlIHRoZSBmb2N1cyBmb3IuXG4gICAqL1xuICByZWxlYXNlRm9jdXMoJGVsZW1lbnQpIHtcbiAgICAkZWxlbWVudC5vZmYoJ2tleWRvd24uemYudHJhcGZvY3VzJyk7XG4gIH1cbn1cblxuLypcbiAqIENvbnN0YW50cyBmb3IgZWFzaWVyIGNvbXBhcmluZy5cbiAqIENhbiBiZSB1c2VkIGxpa2UgRm91bmRhdGlvbi5wYXJzZUtleShldmVudCkgPT09IEZvdW5kYXRpb24ua2V5cy5TUEFDRVxuICovXG5mdW5jdGlvbiBnZXRLZXlDb2RlcyhrY3MpIHtcbiAgdmFyIGsgPSB7fTtcbiAgZm9yICh2YXIga2MgaW4ga2NzKSBrW2tjc1trY11dID0ga2NzW2tjXTtcbiAgcmV0dXJuIGs7XG59XG5cbkZvdW5kYXRpb24uS2V5Ym9hcmQgPSBLZXlib2FyZDtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vLyBEZWZhdWx0IHNldCBvZiBtZWRpYSBxdWVyaWVzXG5jb25zdCBkZWZhdWx0UXVlcmllcyA9IHtcbiAgJ2RlZmF1bHQnIDogJ29ubHkgc2NyZWVuJyxcbiAgbGFuZHNjYXBlIDogJ29ubHkgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSknLFxuICBwb3J0cmFpdCA6ICdvbmx5IHNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknLFxuICByZXRpbmEgOiAnb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCcgK1xuICAgICdvbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMiksJyArXG4gICAgJ29ubHkgc2NyZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMi8xKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbj
5763ogMTkyZHBpKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpJ1xufTtcblxudmFyIE1lZGlhUXVlcnkgPSB7XG4gIHF1ZXJpZXM6IFtdLFxuXG4gIGN1cnJlbnQ6ICcnLFxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgbWVkaWEgcXVlcnkgaGVscGVyLCBieSBleHRyYWN0aW5nIHRoZSBicmVha3BvaW50IGxpc3QgZnJvbSB0aGUgQ1NTIGFuZCBhY3RpdmF0aW5nIHRoZSBicmVha3BvaW50IHdhdGNoZXIuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBleHRyYWN0ZWRTdHlsZXMgPSAkKCcuZm91bmRhdGlvbi1tcScpLmNzcygnZm9udC1mYW1pbHknKTtcbiAgICB2YXIgbmFtZWRRdWVyaWVzO1xuXG4gICAgbmFtZWRRdWVyaWVzID0gcGFyc2VTdHlsZVRvT2JqZWN0KGV4dHJhY3RlZFN0eWxlcyk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZWRRdWVyaWVzKSB7XG4gICAgICBpZihuYW1lZFF1ZXJpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBzZWxmLnF1ZXJpZXMucHVzaCh7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHZhbHVlOiBgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICR7bmFtZWRRdWVyaWVzW2tleV19KWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5fZ2V0Q3VycmVudFNpemUoKTtcblxuICAgIHRoaXMuX3dhdGNoZXIoKTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzY3JlZW4gaXMgYXQgbGVhc3QgYXMgd2lkZSBhcyBhIGJyZWFrcG9pbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIE5hbWUgb2YgdGhlIGJyZWFrcG9pbnQgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGJyZWFrcG9pbnQgbWF0Y2hlcywgYGZhbHNlYCBpZiBpdCdzIHNtYWxsZXIuXG4gICAqL1xuICBhdExlYXN0KHNpemUpIHtcbiAgICB2YXIgcXVlcnkgPSB0aGlzLmdldChzaXplKTtcblxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5KS5tYXRjaGVzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzY3JlZW4gbWF0Y2hlcyB0byBhIGJyZWFrcG9pbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIE5hbWUgb2YgdGhlIGJyZWFrcG9pbnQgdG8gY2hlY2ssIGVpdGhlciAnc21hbGwgb25seScgb3IgJ3NtYWxsJy4gT21pdHRpbmcgJ29ubHknIGZhbGxzIGJhY2sgdG8gdXNpbmcgYXRMZWFzdCgpIG1ldGhvZC5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYnJlYWtwb2ludCBtYXRjaGVzLCBgZmFsc2VgIGlmIGl0IGRvZXMgbm90LlxuICAgKi9cbiAgaXMoc2l6ZSkge1xuICAgIHNpemUgPSBzaXplLnRyaW0oKS5zcGxpdCgnICcpO1xuICAgIGlmKHNpemUubGVuZ3RoID4gMSAmJiBzaXplWzFdID09PSAnb25seScpIHtcbiAgICAgIGlmKHNpemVbMF0gPT09IHRoaXMuX2dldEN1cnJlbnRTaXplKCkpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5hdExlYXN0KHNpemVbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1lZGlhIHF1ZXJ5IG9mIGEgYnJlYWtwb2ludC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzaXplIC0gTmFtZSBvZiB0aGUgYnJlYWtwb2ludCB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd8bnVsbH0gLSBUaGUgbWVkaWEgcXVlcnkgb2YgdGhlIGJyZWFrcG9pbnQsIG9yIGBudWxsYCBpZiB0aGUgYnJlYWtwb2ludCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZ2V0KHNpemUpIHtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMucXVlcmllcykge1xuICAgICAgaWYodGhpcy5xdWVyaWVzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIHZhciBxdWVyeSA9IHRoaXMucXVlcmllc1tpXTtcbiAgICAgICAgaWYgKHNpemUgPT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBxdWVyeS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBicmVha3BvaW50IG5hbWUgYnkgdGVzdGluZyBldmVyeSBicmVha3BvaW50IGFuZCByZXR1cm5pbmcgdGhlIGxhc3Qgb25lIHRvIG1hdGNoICh0aGUgYmlnZ2VzdCBvbmUpLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1N0cmluZ30gTmFtZSBvZiB0aGUgY3VycmVudCBicmVha3BvaW50LlxuICAgKi9cbiAgX2dldEN1cnJlbnRTaXplKCkge1xuICAgIHZhciBtYXRjaGVkO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVyeSA9IHRoaXMucXVlcmllc1tpXTtcblxuICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5LnZhbHVlKS5tYXRjaGVzKSB7XG4gICAgICAgIG1hdGNoZWQgPSBxdWVyeTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgYnJlYWtwb2ludCB3YXRjaGVyLCB3aGljaCBmaXJlcyBhbiBldmVudCBvbiB0aGUgd2luZG93IHdoZW5ldmVyIHRoZSBicmVha3BvaW50IGNoYW5nZXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dhdGNoZXIoKSB7XG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuemYubWVkaWFxdWVyeScsICgpID0+IHtcbiAgICAgIHZhciBuZXdTaXplID0gdGhpcy5fZ2V0Q3VycmVudFNpemUoKSwgY3VycmVudFNpemUgPSB0aGlzLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChuZXdTaXplICE9PSBjdXJyZW50U2l6ZSkge1xuICAgICAgICAvLyBDaGFuZ2UgdGhlIGN1cnJlbnQgbWVkaWEgcXVlcnlcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3U2l6ZTtcblxuICAgICAgICAvLyBCcm9hZGNhc3QgdGhlIG1lZGlhIHF1ZXJ5IGNoYW5nZSBvbiB0aGUgd2luZG93XG4gICAgICAgICQo
5763d2luZG93KS50cmlnZ2VyKCdjaGFuZ2VkLnpmLm1lZGlhcXVlcnknLCBbbmV3U2l6ZSwgY3VycmVudFNpemVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuRm91bmRhdGlvbi5NZWRpYVF1ZXJ5ID0gTWVkaWFRdWVyeTtcblxuLy8gbWF0Y2hNZWRpYSgpIHBvbHlmaWxsIC0gVGVzdCBhIENTUyBtZWRpYSB0eXBlL3F1ZXJ5IGluIEpTLlxuLy8gQXV0aG9ycyAmIGNvcHlyaWdodCAoYykgMjAxMjogU2NvdHQgSmVobCwgUGF1bCBJcmlzaCwgTmljaG9sYXMgWmFrYXMsIERhdmlkIEtuaWdodC4gRHVhbCBNSVQvQlNEIGxpY2Vuc2VcbndpbmRvdy5tYXRjaE1lZGlhIHx8ICh3aW5kb3cubWF0Y2hNZWRpYSA9IGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gRm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBtYXRjaE1lZGl1bSBhcGkgc3VjaCBhcyBJRSA5IGFuZCB3ZWJraXRcbiAgdmFyIHN0eWxlTWVkaWEgPSAod2luZG93LnN0eWxlTWVkaWEgfHwgd2luZG93Lm1lZGlhKTtcblxuICAvLyBGb3IgdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IG1hdGNoTWVkaXVtXG4gIGlmICghc3R5bGVNZWRpYSkge1xuICAgIHZhciBzdHlsZSAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSxcbiAgICBzY3JpcHQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXSxcbiAgICBpbmZvICAgICAgICA9IG51bGw7XG5cbiAgICBzdHlsZS50eXBlICA9ICd0ZXh0L2Nzcyc7XG4gICAgc3R5bGUuaWQgICAgPSAnbWF0Y2htZWRpYWpzLXRlc3QnO1xuXG4gICAgc2NyaXB0ICYmIHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZSwgc2NyaXB0KTtcblxuICAgIC8vICdzdHlsZS5jdXJyZW50U3R5bGUnIGlzIHVzZWQgYnkgSUUgPD0gOCBhbmQgJ3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlJyBmb3IgYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgaW5mbyA9ICgnZ2V0Q29tcHV0ZWRTdHlsZScgaW4gd2luZG93KSAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSwgbnVsbCkgfHwgc3R5bGUuY3VycmVudFN0eWxlO1xuXG4gICAgc3R5bGVNZWRpYSA9IHtcbiAgICAgIG1hdGNoTWVkaXVtKG1lZGlhKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gYEBtZWRpYSAke21lZGlhfXsgI21hdGNobWVkaWFqcy10ZXN0IHsgd2lkdGg6IDFweDsgfSB9YDtcblxuICAgICAgICAvLyAnc3R5bGUuc3R5bGVTaGVldCcgaXMgdXNlZCBieSBJRSA8PSA4IGFuZCAnc3R5bGUudGV4dENvbnRlbnQnIGZvciBhbGwgb3RoZXIgYnJvd3NlcnNcbiAgICAgICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSB0ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlc3QgaWYgbWVkaWEgcXVlcnkgaXMgdHJ1ZSBvciBmYWxzZVxuICAgICAgICByZXR1cm4gaW5mby53aWR0aCA9PT0gJzFweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG1lZGlhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoZXM6IHN0eWxlTWVkaWEubWF0Y2hNZWRpdW0obWVkaWEgfHwgJ2FsbCcpLFxuICAgICAgbWVkaWE6IG1lZGlhIHx8ICdhbGwnXG4gICAgfTtcbiAgfVxufSgpKTtcblxuLy8gVGhhbmsgeW91OiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xuZnVuY3Rpb24gcGFyc2VTdHlsZVRvT2JqZWN0KHN0cikge1xuICB2YXIgc3R5bGVPYmplY3QgPSB7fTtcblxuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3R5bGVPYmplY3Q7XG4gIH1cblxuICBzdHIgPSBzdHIudHJpbSgpLnNsaWNlKDEsIC0xKTsgLy8gYnJvd3NlcnMgcmUtcXVvdGUgc3RyaW5nIHN0eWxlIHZhbHVlc1xuXG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuIHN0eWxlT2JqZWN0O1xuICB9XG5cbiAgc3R5bGVPYmplY3QgPSBzdHIuc3BsaXQoJyYnKS5yZWR1Y2UoZnVuY3Rpb24ocmV0LCBwYXJhbSkge1xuICAgIHZhciBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCc9Jyk7XG4gICAgdmFyIGtleSA9IHBhcnRzWzBdO1xuICAgIHZhciB2YWwgPSBwYXJ0c1sxXTtcbiAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcblxuICAgIC8vIG1pc3NpbmcgYD1gIHNob3VsZCBiZSBgbnVsbGA6XG4gICAgLy8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xuICAgIHZhbCA9IHZhbCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuXG4gICAgaWYgKCFyZXQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJldFtrZXldKSkge1xuICAgICAgcmV0W2tleV0ucHVzaCh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXRba2V5XSA9IFtyZXRba2V5XSwgdmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSwge30pO1xuXG4gIHJldHVybiBzdHlsZU9iamVjdDtcbn1cblxuRm91bmRhdGlvbi5NZWRpYVF1ZXJ5ID0gTWVkaWFRdWVyeTtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIE1vdGlvbiBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ubW90aW9uXG4gKi9cblxuY29uc3QgaW5pdENsYXNzZXMgICA9IFsnbXVpLWVudGVyJywgJ211aS1sZWF2ZSddO1xuY29uc3QgYWN0aXZlQ2xhc3NlcyA9IFsnbXVpLWVudGVyLWFjdGl2ZScsICdtdWktbGVhdmUtYWN0aXZlJ107XG5cbmNvbnN0IE1vdGlvbiA9IHtcbiAgYW5pbWF0ZUluOiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZSh0cnVlLCBlbGVtZW50LCBhbmltYXRpb24sIGNiKTtcbiAgfSxcblxuICBhbmltYXRlT3V0OiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZShmYWxzZSwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gTW92ZShkdXJhdGlvbiwgZWxlbSwgZm4pe1xuICB2YXIgYW5pbSwgcHJvZywgc3RhcnQgPSBudWxsO1xuICAvLyBjb25zb2xlLmxvZygnY2FsbGVkJyk7XG5cbiAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgZm4uYXBwbHkoZWxlbSk7XG4gICAgZWxlbS50cmlnZ2VyKCdmaW5pc2hlZC56Zi5hbmltYXRlJywgW2VsZW1dKS50cmlnZ2VySGFuZGxlcignZmluaXNoZWQuemYuYW5pbWF0ZScsIFtlbGVtXSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZSh0cyl7XG4gICAgaWYoIXN0YXJ0KSBzdGFydCA9IHRzO1
5763xuICAgIC8vIGNvbnNvbGUubG9nKHN0YXJ0LCB0cyk7XG4gICAgcHJvZyA9IHRzIC0gc3RhcnQ7XG4gICAgZm4uYXBwbHkoZWxlbSk7XG5cbiAgICBpZihwcm9nIDwgZHVyYXRpb24peyBhbmltID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShtb3ZlLCBlbGVtKTsgfVxuICAgIGVsc2V7XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbSk7XG4gICAgICBlbGVtLnRyaWdnZXIoJ2ZpbmlzaGVkLnpmLmFuaW1hdGUnLCBbZWxlbV0pLnRyaWdnZXJIYW5kbGVyKCdmaW5pc2hlZC56Zi5hbmltYXRlJywgW2VsZW1dKTtcbiAgICB9XG4gIH1cbiAgYW5pbSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobW92ZSk7XG59XG5cbi8qKlxuICogQW5pbWF0ZXMgYW4gZWxlbWVudCBpbiBvciBvdXQgdXNpbmcgYSBDU1MgdHJhbnNpdGlvbiBjbGFzcy5cbiAqIEBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbiAtIERlZmluZXMgaWYgdGhlIGFuaW1hdGlvbiBpcyBpbiBvciBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIGpRdWVyeSBvciBIVE1MIG9iamVjdCB0byBhbmltYXRlLlxuICogQHBhcmFtIHtTdHJpbmd9IGFuaW1hdGlvbiAtIENTUyBjbGFzcyB0byB1c2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiAtIENhbGxiYWNrIHRvIHJ1biB3aGVuIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5cbiAqL1xuZnVuY3Rpb24gYW5pbWF0ZShpc0luLCBlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gIGVsZW1lbnQgPSAkKGVsZW1lbnQpLmVxKDApO1xuXG4gIGlmICghZWxlbWVudC5sZW5ndGgpIHJldHVybjtcblxuICB2YXIgaW5pdENsYXNzID0gaXNJbiA/IGluaXRDbGFzc2VzWzBdIDogaW5pdENsYXNzZXNbMV07XG4gIHZhciBhY3RpdmVDbGFzcyA9IGlzSW4gPyBhY3RpdmVDbGFzc2VzWzBdIDogYWN0aXZlQ2xhc3Nlc1sxXTtcblxuICAvLyBTZXQgdXAgdGhlIGFuaW1hdGlvblxuICByZXNldCgpO1xuXG4gIGVsZW1lbnRcbiAgICAuYWRkQ2xhc3MoYW5pbWF0aW9uKVxuICAgIC5jc3MoJ3RyYW5zaXRpb24nLCAnbm9uZScpO1xuXG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhpbml0Q2xhc3MpO1xuICAgIGlmIChpc0luKSBlbGVtZW50LnNob3coKTtcbiAgfSk7XG5cbiAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvblxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGg7XG4gICAgZWxlbWVudFxuICAgICAgLmNzcygndHJhbnNpdGlvbicsICcnKVxuICAgICAgLmFkZENsYXNzKGFjdGl2ZUNsYXNzKTtcbiAgfSk7XG5cbiAgLy8gQ2xlYW4gdXAgdGhlIGFuaW1hdGlvbiB3aGVuIGl0IGZpbmlzaGVzXG4gIGVsZW1lbnQub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZChlbGVtZW50KSwgZmluaXNoKTtcblxuICAvLyBIaWRlcyB0aGUgZWxlbWVudCAoZm9yIG91dCBhbmltYXRpb25zKSwgcmVzZXRzIHRoZSBlbGVtZW50LCBhbmQgcnVucyBhIGNhbGxiYWNrXG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBpZiAoIWlzSW4pIGVsZW1lbnQuaGlkZSgpO1xuICAgIHJlc2V0KCk7XG4gICAgaWYgKGNiKSBjYi5hcHBseShlbGVtZW50KTtcbiAgfVxuXG4gIC8vIFJlc2V0cyB0cmFuc2l0aW9ucyBhbmQgcmVtb3ZlcyBtb3Rpb24tc3BlY2lmaWMgY2xhc3Nlc1xuICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBlbGVtZW50WzBdLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IDA7XG4gICAgZWxlbWVudC5yZW1vdmVDbGFzcyhgJHtpbml0Q2xhc3N9ICR7YWN0aXZlQ2xhc3N9ICR7YW5pbWF0aW9ufWApO1xuICB9XG59XG5cbkZvdW5kYXRpb24uTW92ZSA9IE1vdmU7XG5Gb3VuZGF0aW9uLk1vdGlvbiA9IE1vdGlvbjtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG5jb25zdCBOZXN0ID0ge1xuICBGZWF0aGVyKG1lbnUsIHR5cGUgPSAnemYnKSB7XG4gICAgbWVudS5hdHRyKCdyb2xlJywgJ21lbnViYXInKTtcblxuICAgIHZhciBpdGVtcyA9IG1lbnUuZmluZCgnbGknKS5hdHRyKHsncm9sZSc6ICdtZW51aXRlbSd9KSxcbiAgICAgICAgc3ViTWVudUNsYXNzID0gYGlzLSR7dHlwZX0tc3VibWVudWAsXG4gICAgICAgIHN1Ykl0ZW1DbGFzcyA9IGAke3N1Yk1lbnVDbGFzc30taXRlbWAsXG4gICAgICAgIGhhc1N1YkNsYXNzID0gYGlzLSR7dHlwZX0tc3VibWVudS1wYXJlbnRgO1xuXG4gICAgaXRlbXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkaXRlbSA9ICQodGhpcyksXG4gICAgICAgICAgJHN1YiA9ICRpdGVtLmNoaWxkcmVuKCd1bCcpO1xuXG4gICAgICBpZiAoJHN1Yi5sZW5ndGgpIHtcbiAgICAgICAgJGl0ZW1cbiAgICAgICAgICAuYWRkQ2xhc3MoaGFzU3ViQ2xhc3MpXG4gICAgICAgICAgLmF0dHIoe1xuICAgICAgICAgICAgJ2FyaWEtaGFzcG9wdXAnOiB0cnVlLFxuICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiAkaXRlbS5jaGlsZHJlbignYTpmaXJzdCcpLnRleHQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIE5vdGU6ICBEcmlsbGRvd25zIGJlaGF2ZSBkaWZmZXJlbnRseSBpbiBob3cgdGhleSBoaWRlLCBhbmQgc28gbmVlZFxuICAgICAgICAgIC8vIGFkZGl0aW9uYWwgYXR0cmlidXRlcy4gIFdlIHNob3VsZCBsb29rIGlmIHRoaXMgcG9zc2libHkgb3Zlci1nZW5lcmFsaXplZFxuICAgICAgICAgIC8vIHV0aWxpdHkgKE5lc3QpIGlzIGFwcHJvcHJpYXRlIHdoZW4gd2UgcmV3b3JrIG1lbnVzIGluIDYuNFxuICAgICAgICAgIGlmKHR5cGUgPT09ICdkcmlsbGRvd24nKSB7XG4gICAgICAgICAgICAkaXRlbS5hdHRyKHsnYXJpYS1leHBhbmRlZCc6IGZhbHNlfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICRzdWJcbiAgICAgICAgICAuYWRkQ2xhc3MoYHN1Ym1lbnUgJHtzdWJNZW51Q2xhc3N9YClcbiAgICAgICAgICAuYXR0cih7XG4gICAgICAgICAgICAnZGF0YS1zdWJtZW51JzogJycsXG4gICAgICAgICAgICAncm9sZSc6ICdtZW51J1xuICAgICAgICAgIH0pO1xuICAgICAgICBpZih0eXBlID09PSAnZHJpbGxkb3duJykge1xuICAgICAgICAgICRzdWIuYXR0cih7J2FyaWEtaGlkZGVuJzogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgkaXRlbS5wYXJlbnQoJ1tkYXRhLXN1Ym1lbnVdJykubGVuZ3RoKSB7XG4gICAgICAgICRpdGVtLmFkZENsYXNzKGBpcy1zdWJtZW51LWl0ZW0gJHtzdWJJdGVtQ2xhc3N9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgQnVybihtZW51LCB0eX
5763BlKSB7XG4gICAgdmFyIC8vaXRlbXMgPSBtZW51LmZpbmQoJ2xpJyksXG4gICAgICAgIHN1Yk1lbnVDbGFzcyA9IGBpcy0ke3R5cGV9LXN1Ym1lbnVgLFxuICAgICAgICBzdWJJdGVtQ2xhc3MgPSBgJHtzdWJNZW51Q2xhc3N9LWl0ZW1gLFxuICAgICAgICBoYXNTdWJDbGFzcyA9IGBpcy0ke3R5cGV9LXN1Ym1lbnUtcGFyZW50YDtcblxuICAgIG1lbnVcbiAgICAgIC5maW5kKCc+bGksIC5tZW51LCAubWVudSA+IGxpJylcbiAgICAgIC5yZW1vdmVDbGFzcyhgJHtzdWJNZW51Q2xhc3N9ICR7c3ViSXRlbUNsYXNzfSAke2hhc1N1YkNsYXNzfSBpcy1zdWJtZW51LWl0ZW0gc3VibWVudSBpcy1hY3RpdmVgKVxuICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3VibWVudScpLmNzcygnZGlzcGxheScsICcnKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCAgICAgIG1lbnUuZmluZCgnLicgKyBzdWJNZW51Q2xhc3MgKyAnLCAuJyArIHN1Ykl0ZW1DbGFzcyArICcsIC5oYXMtc3VibWVudSwgLmlzLXN1Ym1lbnUtaXRlbSwgLnN1Ym1lbnUsIFtkYXRhLXN1Ym1lbnVdJylcbiAgICAvLyAgICAgICAgICAgLnJlbW92ZUNsYXNzKHN1Yk1lbnVDbGFzcyArICcgJyArIHN1Ykl0ZW1DbGFzcyArICcgaGFzLXN1Ym1lbnUgaXMtc3VibWVudS1pdGVtIHN1Ym1lbnUnKVxuICAgIC8vICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS1zdWJtZW51JykpO1xuICAgIC8vIGl0ZW1zLmVhY2goZnVuY3Rpb24oKXtcbiAgICAvLyAgIHZhciAkaXRlbSA9ICQodGhpcyksXG4gICAgLy8gICAgICAgJHN1YiA9ICRpdGVtLmNoaWxkcmVuKCd1bCcpO1xuICAgIC8vICAgaWYoJGl0ZW0ucGFyZW50KCdbZGF0YS1zdWJtZW51XScpLmxlbmd0aCl7XG4gICAgLy8gICAgICRpdGVtLnJlbW92ZUNsYXNzKCdpcy1zdWJtZW51LWl0ZW0gJyArIHN1Ykl0ZW1DbGFzcyk7XG4gICAgLy8gICB9XG4gICAgLy8gICBpZigkc3ViLmxlbmd0aCl7XG4gICAgLy8gICAgICRpdGVtLnJlbW92ZUNsYXNzKCdoYXMtc3VibWVudScpO1xuICAgIC8vICAgICAkc3ViLnJlbW92ZUNsYXNzKCdzdWJtZW51ICcgKyBzdWJNZW51Q2xhc3MpLnJlbW92ZUF0dHIoJ2RhdGEtc3VibWVudScpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICB9XG59XG5cbkZvdW5kYXRpb24uTmVzdCA9IE5lc3Q7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuZnVuY3Rpb24gVGltZXIoZWxlbSwgb3B0aW9ucywgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgIGR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiwvL29wdGlvbnMgaXMgYW4gb2JqZWN0IGZvciBlYXNpbHkgYWRkaW5nIGZlYXR1cmVzIGxhdGVyLlxuICAgICAgbmFtZVNwYWNlID0gT2JqZWN0LmtleXMoZWxlbS5kYXRhKCkpWzBdIHx8ICd0aW1lcicsXG4gICAgICByZW1haW4gPSAtMSxcbiAgICAgIHN0YXJ0LFxuICAgICAgdGltZXI7XG5cbiAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuXG4gIHRoaXMucmVzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHJlbWFpbiA9IC0xO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcbiAgICAvLyBpZighZWxlbS5kYXRhKCdwYXVzZWQnKSl7IHJldHVybiBmYWxzZTsgfS8vbWF5YmUgaW1wbGVtZW50IHRoaXMgc2FuaXR5IGNoZWNrIGlmIHVzZWQgZm9yIG90aGVyIHRoaW5ncy5cbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHJlbWFpbiA9IHJlbWFpbiA8PSAwID8gZHVyYXRpb24gOiByZW1haW47XG4gICAgZWxlbS5kYXRhKCdwYXVzZWQnLCBmYWxzZSk7XG4gICAgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgaWYob3B0aW9ucy5pbmZpbml0ZSl7XG4gICAgICAgIF90aGlzLnJlc3RhcnQoKTsvL3JlcnVuIHRoZSB0aW1lci5cbiAgICAgIH1cbiAgICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHsgY2IoKTsgfVxuICAgIH0sIHJlbWFpbik7XG4gICAgZWxlbS50cmlnZ2VyKGB0aW1lcnN0YXJ0LnpmLiR7bmFtZVNwYWNlfWApO1xuICB9XG5cbiAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuICAgIC8vaWYoZWxlbS5kYXRhKCdwYXVzZWQnKSl7IHJldHVybiBmYWxzZTsgfS8vbWF5YmUgaW1wbGVtZW50IHRoaXMgc2FuaXR5IGNoZWNrIGlmIHVzZWQgZm9yIG90aGVyIHRoaW5ncy5cbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIGVsZW0uZGF0YSgncGF1c2VkJywgdHJ1ZSk7XG4gICAgdmFyIGVuZCA9IERhdGUubm93KCk7XG4gICAgcmVtYWluID0gcmVtYWluIC0gKGVuZCAtIHN0YXJ0KTtcbiAgICBlbGVtLnRyaWdnZXIoYHRpbWVycGF1c2VkLnpmLiR7bmFtZVNwYWNlfWApO1xuICB9XG59XG5cbi8qKlxuICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gaW1hZ2VzIGFyZSBmdWxseSBsb2FkZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW1hZ2VzIC0gSW1hZ2UocykgdG8gY2hlY2sgaWYgbG9hZGVkLlxuICogQHBhcmFtIHtGdW5jfSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiBpbWFnZSBpcyBmdWxseSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIG9uSW1hZ2VzTG9h
5763ZGVkKGltYWdlcywgY2FsbGJhY2spe1xuICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICB1bmxvYWRlZCA9IGltYWdlcy5sZW5ndGg7XG5cbiAgaWYgKHVubG9hZGVkID09PSAwKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGltYWdlcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIC8vIENoZWNrIGlmIGltYWdlIGlzIGxvYWRlZFxuICAgIGlmICh0aGlzLmNvbXBsZXRlIHx8ICh0aGlzLnJlYWR5U3RhdGUgPT09IDQpIHx8ICh0aGlzLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpKSB7XG4gICAgICBzaW5nbGVJbWFnZUxvYWRlZCgpO1xuICAgIH1cbiAgICAvLyBGb3JjZSBsb2FkIHRoZSBpbWFnZVxuICAgIGVsc2Uge1xuICAgICAgLy8gZml4IGZvciBJRS4gU2VlIGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vc25pcHBldHMvanF1ZXJ5L2ZpeGluZy1sb2FkLWluLWllLWZvci1jYWNoZWQtaW1hZ2VzL1xuICAgICAgdmFyIHNyYyA9ICQodGhpcykuYXR0cignc3JjJyk7XG4gICAgICAkKHRoaXMpLmF0dHIoJ3NyYycsIHNyYyArIChzcmMuaW5kZXhPZignPycpID49IDAgPyAnJicgOiAnPycpICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKSk7XG4gICAgICAkKHRoaXMpLm9uZSgnbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzaW5nbGVJbWFnZUxvYWRlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBzaW5nbGVJbWFnZUxvYWRlZCgpIHtcbiAgICB1bmxvYWRlZC0tO1xuICAgIGlmICh1bmxvYWRlZCA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbn1cblxuRm91bmRhdGlvbi5UaW1lciA9IFRpbWVyO1xuRm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZCA9IG9uSW1hZ2VzTG9h
5763ZGVkO1xuXG59KGpRdWVyeSk7XG4iLCIvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyoqV29yayBpbnNwaXJlZCBieSBtdWx0aXBsZSBqcXVlcnkgc3dpcGUgcGx1Z2lucyoqXG4vLyoqRG9uZSBieSBZb2hhaSBBcmFyYXQgKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4oZnVuY3Rpb24oJCkge1xuXG4gICQuc3BvdFN3aXBlID0ge1xuICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgZW5hYmxlZDogJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgIHByZXZlbnREZWZhdWx0OiBmYWxzZSxcbiAgICBtb3ZlVGhyZXNob2xkOiA3NSxcbiAgICB0aW1lVGhyZXNob2xkOiAyMDBcbiAgfTtcblxuICB2YXIgICBzdGFydFBvc1gsXG4gICAgICAgIHN0YXJ0UG9zWSxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbGFwc2VkVGltZSxcbiAgICAgICAgaXNNb3ZpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIC8vICBhbGVydCh0aGlzKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgaXNNb3ZpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAoJC5zcG90U3dpcGUucHJldmVudERlZmF1bHQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgaWYoaXNNb3ZpbmcpIHtcbiAgICAgIHZhciB4ID0gZS50b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgdmFyIHkgPSBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICB2Y
5763XIgZHggPSBzdGFydFBvc1ggLSB4O1xuICAgICAgdmFyIGR5ID0gc3RhcnRQb3NZIC0geTtcbiAgICAgIHZhciBkaXI7XG4gICAgICBlbGFwc2VkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lO1xuICAgICAgaWYoTWF0aC5hYnMoZHgpID49ICQuc3BvdFN3aXBlLm1vdmVUaHJlc2hvbGQgJiYgZWxhcHNlZFRpbWUgPD0gJC5zcG90U3dpcGUudGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXIgPSBkeCA+IDAgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBpZihNYXRoLmFicyhkeSkgPj0gJC5zcG90U3dpcGUubW92ZVRocmVzaG9sZCAmJiBlbGFwc2VkVGltZSA8PSAkLnNwb3RTd2lwZS50aW1lVGhyZXNob2xkKSB7XG4gICAgICAvLyAgIGRpciA9IGR5ID4gMCA/ICdkb3duJyA6ICd1cCc7XG4gICAgICAvLyB9XG4gICAgICBpZihkaXIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvblRvdWNoRW5kLmNhbGwodGhpcyk7XG4gICAgICAgICQodGhpcykudHJpZ2dlcignc3dpcGUnLCBkaXIpLnRyaWdnZXIoYHN3aXBlJHtkaXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICBzdGFydFBvc1ggPSBlLnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICBzdGFydFBvc1kgPSBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICBpc01vdmluZyA9IHRydWU7XG4gICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIGZhbHNlKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgJiYgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiB0ZWFyZG93bigpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICB9XG5cbiAgJC5ldmVudC5zcGVjaWFsLnN3aXBlID0geyBzZXR1cDogaW5pdCB9O1xuXG4gICQuZWFjaChbJ2xlZnQnLCAndXAnLCAnZG93bicsICdyaWdodCddLCBmdW5jdGlvbiAoKSB7XG4gICAgJC5ldmVudC5zcGVjaWFsW2Bzd2lwZSR7dGhpc31gXSA9IHsgc2V0dXA6IGZ1bmN0aW9uKCl7XG4gICAgICAkKHRoaXMpLm9uKCdzd2lwZScsICQubm9vcCk7XG4gICAgfSB9O1xuICB9KTtcbn0pKGpRdWVyeSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogTWV0aG9kIGZvciBhZGRpbmcgcHN1ZWRvIGRyYWcgZXZlbnRzIHRvIGVsZW1lbnRzICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4hZnVuY3Rpb24oJCl7XG4gICQuZm4uYWRkVG91Y2ggPSBmdW5jdGlvbigpe1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbihpLGVsKXtcbiAgICAgICQoZWwpLmJpbmQoJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJyxmdW5jdGlvbigpe1xuICAgICAgICAvL3dlIHBhc3MgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdCBiZWNhdXNlIHRoZSBqUXVlcnkgZXZlbnRcbiAgICAgICAgLy9vYmplY3QgaXMgbm9ybWFsaXplZCB0byB3M2Mgc3BlY3MgYW5kIGRvZXMgbm90IHByb3ZpZGUgdGhlIFRvdWNoTGlzdFxuICAgICAgICBoYW5kbGVUb3VjaChldmVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHZhciBoYW5kbGVUb3VjaCA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgICAgZmlyc3QgPSB0b3VjaGVzWzBdLFxuICAgICAgICAgIGV2ZW50VHlwZXMgPSB7XG4gICAgICAgICAgICB0b3VjaHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICAgICAgICAgIHRvdWNobW92ZTogJ21vdXNlbW92ZScsXG4gICAgICAgICAgICB0b3VjaGVuZDogJ21vdXNldXAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlID0gZXZlbnRUeXBlc1tldmVudC50eXBlXSxcbiAgICAgICAgICBzaW11bGF0ZWRFdmVudFxuICAgICAgICA7XG5cbiAgICAgIGlmKCdNb3VzZUV2ZW50JyBpbiB3aW5kb3cgJiYgdHlwZW9mIHdpbmRvdy5Nb3VzZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNpbXVsYXRlZEV2ZW50ID0gbmV3IHdpbmRvdy5Nb3VzZUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICAnYnViYmxlcyc6IHRydWUsXG4gICAgICAgICAgJ2NhbmNlbGFibG
5763UnOiB0cnVlLFxuICAgICAgICAgICdzY3JlZW5YJzogZmlyc3Quc2NyZWVuWCxcbiAgICAgICAgICAnc2NyZWVuWSc6IGZpcnN0LnNjcmVlblksXG4gICAgICAgICAgJ2NsaWVudFgnOiBmaXJzdC5jbGllbnRYLFxuICAgICAgICAgICdjbGllbnRZJzogZmlyc3QuY2xpZW50WVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpbXVsYXRlZEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnQnKTtcbiAgICAgICAgc2ltdWxhdGVkRXZlbnQuaW5pdE1vdXNlRXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAxLCBmaXJzdC5zY3JlZW5YLCBmaXJzdC5zY3JlZW5ZLCBmaXJzdC5jbGllbnRYLCBmaXJzdC5jbGllbnRZLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMC8qbGVmdCovLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGZpcnN0LnRhcmdldC5kaXNwYXRjaEV2ZW50KHNpbXVsYXRlZEV2ZW50KTtcbiAgICB9O1xuICB9O1xufShqUXVlcnkpO1xuXG5cbi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8qKkZyb20gdGhlIGpRdWVyeSBNb2JpbGUgTGlicmFyeSoqXG4vLyoqbmVlZCB0byByZWNyZWF0ZSBmdW5jdGlvbmFsaXR5Kipcbi8vKiphbmQgdHJ5IHRvIGltcHJvdmUgaWYgcG9zc2libGUqKlxuLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbi8qIFJlbW92aW5nIHRoZSBqUXVlcnkgZnVuY3Rpb24gKioqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbihmdW5jdGlvbiggJCwgd2luZG93LCB1bmRlZmluZWQgKSB7XG5cblx0dmFyICRkb2N1bWVudCA9ICQoIGRvY3VtZW50ICksXG5cdFx0Ly8gc3VwcG9ydFRvdWNoID0gJC5tb2JpbGUuc3VwcG9ydC50b3VjaCxcblx0XHR0b3VjaFN0YXJ0RXZlbnQgPSAndG91Y2hzdGFydCcvL3N1cHBvcnRUb3VjaCA/IFwidG91Y2hzdGFydFwiIDogXCJtb3VzZWRvd25cIixcblx0XHR0b3VjaFN0b3BFdmVudCA9ICd0b3VjaGVuZCcvL3N1cHBvcnRUb3VjaCA/IFwidG91Y2hlbmRcIiA6IFwibW91c2V1cFwiLFxuXHRcdHRvdWNoTW92ZUV2ZW50ID0gJ3RvdWNobW92ZScvL3N1cHBvcnRUb3VjaCA/IFwidG91Y2htb3ZlXCIgOiBcIm1vdXNlbW92ZVwiO1xuXG5cdC8vIHNldHVwIG5ldyBldmVudCBzaG9ydGN1dHNcblx0JC5lYWNoKCAoIFwidG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgXCIgK1xuXHRcdFwic3dpcGUgc3dpcGVsZWZ0IHN3aXBlcmlnaHRcIiApLnNwbGl0KCBcIiBcIiApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHRcdCQuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdHJldHVybiBmbiA/IHRoaXMuYmluZCggbmFtZSwgZm4gKSA6IHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHRcdH07XG5cblx0XHQvLyBqUXVlcnkgPCAxLjhcblx0XHRpZiAoICQuYXR0ckZuICkge1xuXHRcdFx0JC5hdHRyRm5bIG5hbWUgXSA9IHRydWU7XG5cdFx0fVxuXHR9KTtcblxuXHRmdW5jdGlvbiB0cmlnZ2VyQ3VzdG9tRXZlbnQoIG9iaiwgZXZlbnRUeXBlLCBldmVudCwgYnViYmxlICkge1xuXHRcdHZhciBvcmlnaW5hbFR5cGUgPSBldmVudC50eXBlO1xuXHRcdGV2ZW50LnR5cGUgPSBldmVudFR5cGU7XG5cdFx0aWYgKCBidWJibGUgKSB7XG5cdFx0XHQkLmV2ZW50LnRyaWdnZXIoIGV2ZW50LCB1bmRlZmluZWQsIG9iaiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkLmV2ZW50LmRpc3BhdGNoLmNhbGwoIG9iaiwgZXZlbnQgKTtcblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IG9yaWdpbmFsVHlwZTtcblx0fVxuXG5cdC8vIGFsc28gaGFuZGxlcyB0YXBob2xkXG5cblx0Ly8gQWxzbyBoYW5kbGVzIHN3aXBlbGVmdCwgc3dpcGVyaWdodFxuXHQkLmV2ZW50LnNwZWNpYWwuc3dpcGUgPSB7XG5cblx0XHQvLyBNb3JlIHRoYW4gdGhpcyBob3Jpem9udGFsIGRpc3BsYWNlbWVudCwgYW5kIHdlIHdpbGwgc3VwcHJlc3Mgc2Nyb2xsaW5nLlxuXHRcdHNjcm9sbFN1cHJlc3Npb25UaHJlc2hvbGQ6IDMwLFxuXG5cdFx0Ly8gTW9yZSB0aW1lIHRoYW4gdGhpcywgYW5kIGl0IGlzbid0IGEgc3dpcGUuXG5cdFx0ZHVyYXRpb25UaHJlc2hvbGQ6IDEwMDAsXG5cblx0XHQvLyBTd2lwZSBob3Jpem9udGFsIGRpc3BsYWNlbWVudCBtdXN0IGJlIG1vcmUgdGhhbiB0aGlzLlxuXHRcdGhvcml6b250YWxEaXN0YW5jZVRocmVzaG9sZDogd2luZG93LmRldmljZVBpeGVsUmF0aW8gPj0gMiA/IDE1IDogMzAsXG5cblx0XHQvLyBTd2lwZSB2ZXJ0aWNhbCBkaXNwbGFjZW1lbnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhpcy5cblx0XHR2ZXJ0aWNhbERpc3RhbmNlVGhyZXNob2xkOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyID8gMTUgOiAzMCxcblxuXHRcdGdldExvY2F0aW9uOiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXHRcdFx0dmFyIHdpblBhZ2VYID0gd2luZG93LnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHR3aW5QYWdlWSA9IHdpbmRvdy5wYWdlWU9mZnNldCxcblx0XHRcdFx0eCA9IGV2ZW50LmNsaWVudFgsXG5cdFx0XHRcdHkgPSBldmVudC5jbGllbnRZO1xuXG5cdFx0XHRpZiAoIGV2ZW50LnBhZ2VZID09PSAwICYmIE1hdGguZmxvb3IoIHkgKSA+IE1hdGguZmxvb3IoIGV2ZW50LnBhZ2VZICkgfHxcblx0XHRcdFx0ZXZlbnQucGFnZVggPT09IDAgJiYgTWF0aC5mbG9vciggeCApID4gTWF0aC5mbG9vciggZXZlbnQucGFnZVggKSApIHtcblxuXHRcdFx0XHQvLyBpT1M0IGNsaWVudFgvY2xpZW50WSBoYXZlIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBoYXZlIGJlZW5cblx0XHRcdFx0Ly8gaW4gcGFnZVgvcGFnZVkuIFdoaWxlIHBhZ2VYL3BhZ2UvIGhhdmUgdGhlIHZhbHVlIDBcblx0XHRcdFx0eCA9IHggLSB3aW5QYWdlWDtcblx0XHRcdFx0eSA9IHkgLSB3aW5QYWdlWTtcblx0XHRcdH0gZWxzZSBpZiAoIHkgPCAoIGV2ZW50LnBhZ2VZIC0gd2luUGFnZVkpIHx8IHggPCAoIGV2ZW50LnBhZ2VYIC0gd2luUGFnZVggKSApIHtcblxuXHRcdFx0XHQvLyBTb21lIEFuZHJvaWQgYnJvd3NlcnMgaGF2ZSB0b3RhbGx5IGJvZ3VzIHZhbHVlcyBmb3IgY2xpZW50WC9ZXG5cdFx0XHRcdC8vIHdoZW4gc2Nyb2xsaW5nL3pvb21pbmcgYSBwYWdlLiBEZXRlY3RhYmxlIHNpbmNlIGNsaWVudFgvY2xpZW50WVxuXHRcdFx0XHQvLyBzaG91bGQgbmV2ZXIgYmUgc21hbGxlciB0aGFuIHBhZ2VYL3BhZ2VZIG1pbnVzIHBhZ2Ugc2Nyb2xsXG5cdFx0XHRcdHggPSBldmVudC5wYWdlWCAtIHdpblBhZ2VYO1xuXHRcdFx0XHR5ID0gZXZlbnQucGFnZVkgLSB3aW5QYWdlWTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogeCxcblx0XHRcdFx0eTogeVxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0c3RhcnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciBkYXRhID0gZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzID9cblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbIDAgXSA6IGV2ZW50LFxuXHRcdFx0XHRsb2NhdGlvbiA9ICQuZXZlbnQuc3BlY2lhbC5zd2lwZS5nZXRMb2NhdGlvbiggZGF0YSApO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHRpbWU6ICggbmV3IERhdGUoKSApLmdldFRpbWUoKSxcblx0XHRcdFx0XHRcdGNvb3JkczogWyBsb2NhdGlvbi54LCBsb2NhdGlvbi55IF0sXG5cdFx0XHRcdFx0XHRvcmlnaW46ICQoIGV2ZW50LnRhcmdldCApXG5cdFx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0c3RvcDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIGRhdGEgPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgP1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1sgMCBdIDogZXZlbnQsXG5cdFx0XHRcdGxvY2F0aW9uID0gJC5ldmVudC5zcGVjaWFsLnN3aXBlLmdldExvY2F0aW9uKCBkYXRhICk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dGltZTogKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpLFxuXHRcdFx0XHRcdFx0Y29vcmRzOiBbIGxvY2F0aW9uLngsIGxvY2F0aW9uLnkgXVxuXHRcdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGhhbmRsZVN3aXBlOiBmdW5jdGlvbiggc3RhcnQsIHN0b3AsIHRoaXNPYmplY3QsIG9yaWdUYXJnZXQgKSB7XG5cdFx0XHRpZiAoIHN0b3AudGltZSAtIHN0YXJ0LnRpbWUgPCAkLmV2ZW50LnNwZWNpYWwuc3dpcGUuZHVyYXRpb25UaHJlc2hvbGQgJiZcblx0XHRcdFx0TWF0aC5hYnMoIHN0YXJ0LmNvb3Jkc1sgMCBdIC0gc3RvcC5jb29yZHNbIDAgXSApID4gJC5ldmVudC5zcGVjaWFsLnN3aXBlLmhvcml6b250YWxEaXN0YW5jZVRocmVzaG9sZCAmJlxuXHRcdFx0XHRNYXRoLmFicyggc3RhcnQuY29vcmRzW
5763yAxIF0gLSBzdG9wLmNvb3Jkc1sgMSBdICkgPCAkLmV2ZW50LnNwZWNpYWwuc3dpcGUudmVydGljYWxEaXN0YW5jZVRocmVzaG9sZCApIHtcblx0XHRcdFx0dmFyIGRpcmVjdGlvbiA9IHN0YXJ0LmNvb3Jkc1swXSA+IHN0b3AuY29vcmRzWyAwIF0gPyBcInN3aXBlbGVmdFwiIDogXCJzd2lwZXJpZ2h0XCI7XG5cblx0XHRcdFx0dHJpZ2dlckN1c3RvbUV2ZW50KCB0aGlzT2JqZWN0LCBcInN3aXBlXCIsICQuRXZlbnQoIFwic3dpcGVcIiwgeyB0YXJnZXQ6IG9yaWdUYXJnZXQsIHN3aXBlc3RhcnQ6IHN0YXJ0LCBzd2lwZXN0b3A6IHN0b3AgfSksIHRydWUgKTtcblx0XHRcdFx0dHJpZ2dlckN1c3RvbUV2ZW50KCB0aGlzT2JqZWN0LCBkaXJlY3Rpb24sJC5FdmVudCggZGlyZWN0aW9uLCB7IHRhcmdldDogb3JpZ1RhcmdldCwgc3dpcGVzdGFydDogc3RhcnQsIHN3aXBlc3RvcDogc3RvcCB9ICksIHRydWUgKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9LFxuXG5cdFx0Ly8gVGhpcyBzZXJ2ZXMgYXMgYSBmbGFnIHRvIGVuc3VyZSB0aGF0IGF0IG1vc3Qgb25lIHN3aXBlIGV2ZW50IGV2ZW50IGlzXG5cdFx0Ly8gaW4gd29yayBhdCBhbnkgZ2l2ZW4gdGltZVxuXHRcdGV2ZW50SW5Qcm9ncmVzczogZmFsc2UsXG5cblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZXZlbnRzLFxuXHRcdFx0XHR0aGlzT2JqZWN0ID0gdGhpcyxcblx0XHRcdFx0JHRoaXMgPSAkKCB0aGlzT2JqZWN0ICksXG5cdFx0XHRcdGNvbnRleHQgPSB7fTtcblxuXHRcdFx0Ly8gUmV0cmlldmUgdGhlIGV2ZW50cyBkYXRhIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFkZCB0aGUgc3dpcGUgY29udGV4dFxuXHRcdFx0ZXZlbnRzID0gJC5kYXRhKCB0aGlzLCBcIm1vYmlsZS1ldmVud
5763HNcIiApO1xuXHRcdFx0aWYgKCAhZXZlbnRzICkge1xuXHRcdFx0XHRldmVudHMgPSB7IGxlbmd0aDogMCB9O1xuXHRcdFx0XHQkLmRhdGEoIHRoaXMsIFwibW9iaWxlLWV2ZW50c1wiLCBldmVudHMgKTtcblx0XHRcdH1cblx0XHRcdGV2ZW50cy5sZW5ndGgrKztcblx0XHRcdGV2ZW50cy5zd2lwZSA9IGNvbnRleHQ7XG5cblx0XHRcdGNvbnRleHQuc3RhcnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gQmFpbCBpZiB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb24gYSBzd2lwZSBldmVudFxuXHRcdFx0XHRpZiAoICQuZXZlbnQuc3BlY2lhbC5zd2lwZS5ldmVudEluUHJvZ3Jlc3MgKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCQuZXZlbnQuc3BlY2lhbC5zd2lwZS5ldmVudEluUHJvZ3Jlc3MgPSB0cnVlO1xuXG5cdFx0XHRcdHZhciBzdG9wLFxuXHRcdFx0XHRcdHN0YXJ0ID0gJC5ldmVudC5zcGVjaWFsLnN3aXBlLnN0YXJ0KCBldmVudCApLFxuXHRcdFx0XHRcdG9yaWdUYXJnZXQgPSBldmVudC50YXJnZXQsXG5cdFx0XHRcdFx0ZW1pdHRlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGNvbnRleHQubW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0XHRpZiAoICFzdGFydCB8fCBldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzdG9wID0gJC5ldmVudC5zcGVjaWFsLnN3aXBlLnN0b3AoIGV2ZW50ICk7XG5cdFx0XHRcdFx0aWYgKCAhZW1pdHRlZCApIHtcblx0XHRcdFx0XHRcdGVtaXR0ZWQgPSAkLmV2ZW50LnNwZWNpYWwuc3dpcGUuaGFuZGxlU3dpcGUoIHN0YXJ0LCBzdG9wLCB0aGlzT2JqZWN0LCBvcmlnVGFyZ2V0ICk7XG5cdFx0XHRcdFx0XHRpZiAoIGVtaXR0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmVzZXQgdGhlIGNvbnRleHQgdG8gbWFrZSB3YXkgZm9yIHRoZSBuZXh0IHN3aXBlIGV2ZW50XG5cdFx0XHRcdFx0XHRcdCQuZXZlbnQuc3BlY2lhbC5zd2lwZS5ldmVudEluUHJvZ3Jlc3MgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gcHJldmVudCBzY3JvbGxpbmdcblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBzdGFydC5jb29yZHNbIDAgXSAtIHN0b3AuY29vcmRzWyAwIF0gKSA+ICQuZXZlbnQuc3BlY2lhbC5zd2lwZS5zY3JvbGxTdXByZXNzaW9uVGhyZXNob2xkICkge1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29udGV4dC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRlbWl0dGVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVzZXQgdGhlIGNvbnRleHQgdG8gbWFrZSB3YXkgZm9yIHRoZSBuZXh0IHN3aXBlIGV2ZW50XG5cdFx0XHRcdFx0XHQkLmV2ZW50LnNwZWNpYWwuc3dpcGUuZXZlbnRJblByb2dyZXNzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHQkZG9jdW1lbnQub2ZmKCB0b3VjaE1vdmVFdmVudCwgY29udGV4dC5tb3ZlICk7XG5cdFx0XHRcdFx0XHRjb250ZXh0Lm1vdmUgPSBudWxsO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdCRkb2N1bWVudC5vbiggdG91Y2hNb3ZlRXZlbnQsIGNvbnRleHQubW92ZSApXG5cdFx0XHRcdFx0Lm9uZSggdG91Y2hTdG9wRXZlbnQsIGNvbnRleHQuc3RvcCApO1xuXHRcdFx0fTtcblx0XHRcdCR0aGlzLm9uKCB0b3VjaFN0YXJ0RXZlbnQsIGNvbnRleHQuc3RhcnQgKTtcblx0XHR9LFxuXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGV2ZW50cywgY29udGV4dDtcblxuXHRcdFx0ZXZlbnRzID0gJC5kYXRhKCB0aGlzLCBcIm1vYmlsZS1ldmVud
5763HNcIiApO1xuXHRcdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBldmVudHMuc3dpcGU7XG5cdFx0XHRcdGRlbGV0ZSBldmVudHMuc3dpcGU7XG5cdFx0XHRcdGV2ZW50cy5sZW5ndGgtLTtcblx0XHRcdFx0aWYgKCBldmVudHMubGVuZ3RoID09PSAwICkge1xuXHRcdFx0XHRcdCQucmVtb3ZlRGF0YSggdGhpcywgXCJtb2JpbGUtZXZlbnRzXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbnRleHQgKSB7XG5cdFx0XHRcdGlmICggY29udGV4dC5zdGFydCApIHtcblx0XHRcdFx0XHQkKCB0aGlzICkub2ZmKCB0b3VjaFN0YXJ0RXZlbnQsIGNvbnRleHQuc3RhcnQgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGNvbnRleHQubW92ZSApIHtcblx0XHRcdFx0XHQkZG9jdW1lbnQub2ZmKCB0b3VjaE1vdmVFdmVudCwgY29udGV4dC5tb3ZlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBjb250ZXh0LnN0b3AgKSB7XG5cdFx0XHRcdFx0JGRvY3VtZW50Lm9mZiggdG91Y2hTdG9wRXZlbnQsIGNvbnRleHQuc3RvcCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQkLmVhY2goe1xuXHRcdHN3aXBlbGVmdDogXCJzd2lwZS5sZWZ0XCIsXG5cdFx0c3dpcGVyaWdodDogXCJzd2lwZS5yaWdodFwiXG5cdH0sIGZ1bmN0aW9uKCBldmVudCwgc291cmNlRXZlbnQgKSB7XG5cblx0XHQkLmV2ZW50LnNwZWNpYWxbIGV2ZW50IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCQoIHRoaXMgKS5iaW5kKCBzb3VyY2VFdmVudCwgJC5ub29wICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkKCB0aGlzICkudW5iaW5kKCBzb3VyY2VFdmVudCApO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufSkoIGpRdWVyeSwgdGhpcyApO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuY29uc3QgTXV0YXRpb25PYnNlcnZlciA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBwcmVmaXhlcyA9IFsnV2ViS2l0JywgJ01veicsICdPJywgJ01zJywgJyddO1xuICBmb3IgKHZhciBpPTA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChgJHtwcmVmaXhlc1tpXX1NdXRhdGlvbk9ic2VydmVyYCBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiB3aW5kb3dbYCR7cHJlZml4ZXNbaV19TXV0YXRpb25PYnNlcnZlcmBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KCkpO1xuXG5jb25zdCB0cmlnZ2VycyA9IChlbCwgdHlwZSkgPT4ge1xuICBlbC5kYXRhKHR5cGUpLnNwbGl0KCcgJykuZm9yRWFjaChpZCA9PiB7XG4gICAgJChgIyR7aWR9YClbIHR5cGUgPT09ICdjbG9zZScgPyAndHJpZ2dlcicgOiAndHJpZ2dlckhhbmRsZXInXShgJHt0eXBlfS56Zi50cmlnZ2VyYCwgW2VsXSk7XG4gIH0pO1xufTtcbi8vIEVsZW1lbnRzIHdpdGggW2RhdGEtb3Blbl0gd2lsbCByZXZlYWwgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyBpdCB3aGVuIGNsaWNrZWQuXG4kKGRvY3VtZW50KS5vbignY2xpY2suemYudHJpZ2dlcicsICdbZGF0YS1vcGVuXScsIGZ1bmN0aW9uKCkge1xuICB0cmlnZ2VycygkKHRoaXMpLCAnb3BlbicpO1xufSk7XG5cbi8vIEVsZW1lbnRzIHdpdGggW2RhdGEtY2xvc2VdIHdpbGwgY2xvc2UgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyBpdCB3aGVuIGNsaWNrZWQuXG4vLyBJZiB1c2VkIHdpdGhvdXQgYSB2YWx1ZSBvbiBbZGF0YS1jbG9zZV0sIHRoZSBldmVudCB3aWxsIGJ1YmJsZSwgYWxsb3dpbmcgaXQgdG8gY2xvc2UgYSBwYXJlbnQgY29tcG9uZW50LlxuJChkb2N1bWVudCkub24oJ2NsaWNrLnpmLnRyaWdnZXInLCAnW2RhdGEtY2xvc2VdJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpZCA9ICQodGhpcykuZGF0YSgnY2xvc2UnKTtcbiAgaWYgKGlkKSB7XG4gICAgdHJpZ2dlcnMoJCh0aGlzKSwgJ2Nsb3NlJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgJCh0aGlzKS50cmlnZ2VyKCdjbG9zZS56Zi50cmlnZ2VyJyk7XG4gIH1cbn0pO1xuXG4vLyBFbGVtZW50cyB3aXRoIFtkYXRhLXRvZ2dsZV0gd2lsbCB0b2dnbGUgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyBpdCB3aGVuIGNsaWNrZWQuXG4kKGRvY3VtZW50KS5vbignY2xpY2suemYudHJpZ2dlcicsICdbZGF0YS10b2dnbGVdJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpZCA9ICQodGhpcykuZGF0YSgndG9nZ2xlJyk7XG4gIGlmIChpZCkge1xuICAgIHRyaWdnZXJzKCQodGhpcyksICd0b2dnbGUnKTtcbiAgfSBlbHNlIHtcbiAgICAkKHRoaXMpLnRyaWdnZXIoJ3RvZ2dsZS56Zi50cmlnZ2VyJyk7XG4gIH1cbn0pO1xuXG4vLyBFbGVtZW50cyB3aXRoIFtkYXRhLWNsb3NhYmxlXSB3aWxsIHJlc3BvbmQgdG8gY2xvc2UuemYudHJpZ2dlciBldmVudHMuXG4kKGRvY3VtZW50KS5vbignY2xvc2UuemYudHJpZ2dlcicsICdbZGF0YS1jbG9zYWJsZV0nLCBmdW5jdGlvbihlKXtcbiAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgbGV0IGFuaW1hdGlvbiA9ICQodGhpcykuZGF0YSgnY2xvc2FibGUnKTtcblxuICBpZihhbmltYXRpb24gIT09ICcnKXtcbiAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KCQodGhpcyksIGFuaW1hdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLnRyaWdnZXIoJ2Nsb3NlZC56ZicpO1xuICAgIH0pO1xuICB9ZWxzZXtcbiAgICAkKHRoaXMpLmZhZGVPdXQoKS50cmlnZ2VyKCdjbG9zZWQuemYnKTtcbiAgfVxufSk7XG5cbiQoZG9jdW1lbnQpLm9uKCdmb2N1cy56Zi50cmlnZ2VyIGJsdXIuemYudHJpZ2dlcicsICdbZGF0YS10b2dnbGUtZm9jdXNdJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpZCA9ICQodGhpcykuZGF0YSgndG9nZ2xlLWZvY3VzJyk7XG4gICQoYCMke2lkfWApLnRyaWdnZXJIYW5kbGVyKCd0b2dnbGUuemYudHJpZ2dlcicsIFskKHRoaXMpXSk7XG59KTtcblxuLyoqXG4qIEZpcmVzIG9uY2UgYWZ0ZXIgYWxsIG90aGVyIHNjcmlwdHMgaGF2ZSBsb2FkZWRcbiogQGZ1bmN0aW9uXG4qIEBwcml2YXRlXG4qL1xuJCh3aW5kb3cpLm9uKCdsb2FkJywgKCkgPT4ge1xuICBjaGVja0xpc3RlbmVycygpO1xufSk7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXJzKCkge1xuICBldmVudHNMaXN0ZW5lcigpO1xuICByZXNpemVMaXN0ZW5lcigpO1xuICBzY3JvbGxMaXN0ZW5lcigpO1xuICBjbG9zZW1lTGlzdGVuZXIoKTtcbn1cblxuLy8qKioqKioqKiBvbmx5IGZpcmVzIHRoaXMgZnVuY3Rpb24gb25jZSBvbiBsb2FkLCBpZiB0aGVyZSdzIHNvbWV0aGluZyB0byB3YXRjaCAqKioqKioqKlxuZnVuY3Rpb24gY2xvc2VtZUxpc3RlbmVyKHBsdWdpbk5hbWUpIHtcbiAgdmFyIHlldGlCb3hlcyA9ICQoJ1tkYXRhLXlldGktYm94XScpLFxuICAgICAgcGx1Z05hbWVzID0gWydkcm9wZG93bicsICd0b29sdGlwJywgJ3JldmVhbCddO1xuXG4gIGlmKHBsdWdpbk5hbWUpe1xuICAgIGlmKHR5cGVvZiBwbHVnaW5OYW1lID09PSAnc3RyaW5nJyl7XG4gICAgICBwbHVnTmFtZXMucHVzaChwbHVnaW5OYW1lKTtcbiAgICB9ZWxzZSBpZih0eXBlb2YgcGx1Z2luTmFtZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBsdWdpbk5hbWVbMF0gPT09ICdzdHJpbmcnKXtcbiAgICAgIHBsdWdOYW1lcy5jb25jYXQocGx1Z2luTmFtZSk7XG4gICAgfWVsc2V7XG4gICAgICBjb25zb2xlLmVycm9yKCdQbHVnaW4gbmFtZXMgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICB9XG4gIGlmKHlldGlCb3hlcy5sZW5ndGgpe1xuICAgIGxldCBsaXN0ZW5lcnMgPSBwbHVnTmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICByZXR1cm4gYGNsb3NlbWUuemYuJHtuYW1lfWA7XG4gICAgfSkuam9pbignICcpO1xuXG4gICAgJCh3aW5kb3cpLm9mZihsaXN0ZW5lcnMpLm9uKGxpc3RlbmVycywgZnVuY3Rpb24oZSwgcGx1Z2luSWQpe1xuICAgICAgbGV0IHBsdWdpbiA9IGUubmFtZXNwYWNlLnNwbGl0KCcuJylbMF07XG4gICAgICBsZXQgcGx1Z2lucyA9ICQoYFtkYXRhLSR7cGx1Z2lufV1gKS5ub3QoYFtkYXRhLXlldGktYm94PVwiJHtwbHVnaW5JZH1cIl1gKTtcblxuICAgICAgcGx1Z2lucy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgIGxldCBfdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgICAgX3RoaXMudHJpZ2dlck
5763hhbmRsZXIoJ2Nsb3NlLnpmLnRyaWdnZXInLCBbX3RoaXNdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2l6ZUxpc3RlbmVyKGRlYm91bmNlKXtcbiAgbGV0IHRpbWVyLFxuICAgICAgJG5vZGVzID0gJCgnW2RhdGEtcmVzaXplXScpO1xuICBpZigkbm9kZXMubGVuZ3RoKXtcbiAgICAkKHdpbmRvdykub2ZmKCdyZXNpemUuemYudHJpZ2dlcicpXG4gICAgLm9uKCdyZXNpemUuemYudHJpZ2dlcicsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmICh0aW1lcikgeyBjbGVhclRpbWVvdXQodGltZXIpOyB9XG5cbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuXG4gICAgICAgIGlmKCFNdXRhdGlvbk9ic2VydmVyKXsvL2ZhbGxiYWNrIGZvciBJRSA5XG4gICAgICAgICAgJG5vZGVzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICQodGhpcykudHJpZ2dlckhhbmRsZXIoJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvL3RyaWdnZXIgYWxsIGxpc3RlbmluZyBlbGVtZW50cyBhbmQgc2lnbmFsIGEgcmVzaXplIGV2ZW50XG4gICAgICAgICRub2Rlcy5hdHRyKCdkYXRhLWV2ZW50cycsIFwicmVzaXplXCIpO1xuICAgICAgfSwgZGVib3VuY2UgfHwgMTApOy8vZGVmYXVsdCB0aW1lIHRvIGVtaXQgcmVzaXplIGV2ZW50XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2Nyb2xsTGlzdGVuZXIoZGVib3VuY2Upe1xuICBsZXQgdGltZXIsXG4gICAgICAkbm9kZXMgPSAkKCdbZGF0YS1zY3JvbGxdJyk7XG4gIGlmKCRub2Rlcy5sZW5ndGgpe1xuICAgICQod2luZG93KS5vZmYoJ3Njcm9sbC56Zi50cmlnZ2VyJylcbiAgICAub24oJ3Njcm9sbC56Zi50cmlnZ2VyJywgZnVuY3Rpb24oZSl7XG4gICAgICBpZih0aW1lcil7IGNsZWFyVGltZW91dCh0aW1lcik7IH1cblxuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgaWYoIU11dGF0aW9uT2JzZXJ2ZXIpey8vZmFsbGJhY2sgZm9yIElFIDlcbiAgICAgICAgICAkbm9kZXMuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VySGFuZGxlcignc2Nyb2xsbWUuemYudHJpZ2dlcicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vdHJpZ2dlciBhbGwgbGlzdGVuaW5nIGVsZW1lbnRzIGFuZCBzaWduYWwgYSBzY3JvbGwgZXZlbnRcbiAgICAgICAgJG5vZGVzLmF0dHIoJ2RhdGEtZXZlbnRzJywgXCJzY3JvbGxcIik7XG4gICAgICB9LCBkZWJvdW5jZSB8fCAxMCk7Ly9kZWZhdWx0IHRpbWUgdG8gZW1pdCBzY3JvbGwgZXZlbnRcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudHNMaXN0ZW5lcigpIHtcbiAgaWYoIU11dGF0aW9uT2JzZXJ2ZXIpeyByZXR1cm4gZmFsc2U7IH1cbiAgbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVzaXplXSwgW2RhdGEtc2Nyb2xsXSwgW2RhdGEtbXV0YXRlXScpO1xuXG4gIC8vZWxlbWVudCBjYWxsYmFja1xuICB2YXIgbGlzdGVuaW5nRWxlbWVudHNNdXRhdGlvbiA9IGZ1bmN0aW9uIChtdXRhdGlvblJlY29yZHNMaXN0KSB7XG4gICAgICB2Y
5763XIgJHRhcmdldCA9ICQobXV0YXRpb25SZWNvcmRzTGlzdFswXS50YXJnZXQpO1xuXG5cdCAgLy90cmlnZ2VyIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZWxlbWVudCBkZXBlbmRpbmcgb24gdHlwZVxuICAgICAgc3dpdGNoIChtdXRhdGlvblJlY29yZHNMaXN0WzBdLnR5cGUpIHtcblxuICAgICAgICBjYXNlIFwiYXR0cmlidXRlc1wiOlxuICAgICAgICAgIGlmICgkdGFyZ2V0LmF0dHIoXCJkYXRhLWV2ZW50c1wiKSA9PT0gXCJzY3JvbGxcIiAmJiBtdXRhdGlvblJlY29yZHNMaXN0WzBdLmF0dHJpYnV0ZU5hbWUgPT09IFwiZGF0YS1ldmVudHNcIikge1xuXHRcdCAgXHQkdGFyZ2V0LnRyaWdnZXJIYW5kbGVyKCdzY3JvbGxtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQsIHdpbmRvdy5wYWdlWU9mZnNldF0pO1xuXHRcdCAgfVxuXHRcdCAgaWYgKCR0YXJnZXQuYXR0cihcImRhdGEtZXZlbnRzXCIpID09PSBcInJlc2l6ZVwiICYmIG11dGF0aW9uUmVjb3Jkc0xpc3RbMF0uYXR0cmlidXRlTmFtZSA9PT0gXCJkYXRhLWV2ZW50c1wiKSB7XG5cdFx0ICBcdCR0YXJnZXQudHJpZ2dlckhhbmRsZXIoJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInLCBbJHRhcmdldF0pO1xuXHRcdCAgIH1cblx0XHQgIGlmIChtdXRhdGlvblJlY29yZHNMaXN0WzBdLmF0dHJpYnV0ZU5hbWUgPT09IFwic3R5bGVcIikge1xuXHRcdFx0ICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLmF0dHIoXCJkYXRhLWV2ZW50c1wiLFwibXV0YXRlXCIpO1xuXHRcdFx0ICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLnRyaWdnZXJIYW5kbGVyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIildKTtcblx0XHQgIH1cblx0XHQgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJjaGlsZExpc3RcIjpcblx0XHQgICR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIikuYXR0cihcImRhdGEtZXZlbnRzXCIsXCJtdXRhdGVcIik7XG5cdFx0ICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLnRyaWdnZXJIYW5kbGVyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIildKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy9ub3RoaW5nXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChub2Rlcy5sZW5ndGgpIHtcbiAgICAgIC8vZm9yIGVhY2ggZWxlbWVudCB0aGF0IG5lZWRzIHRvIGxpc3RlbiBmb3IgcmVzaXppbmcsIHNjcm9sbGluZywgb3IgbXV0YXRpb24gYWRkIGEgc2luZ2xlIG9ic2VydmVyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBub2Rlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnRPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGxpc3RlbmluZ0VsZW1lbnRzTXV0YXRpb24pO1xuICAgICAgICBlbGVtZW50T2JzZXJ2ZXIub2JzZXJ2ZShub2Rlc1tpXSwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IGZhbHNlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFtcImRhdGEtZXZlbnRzXCIsIFwic3R5bGVcIl0gfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBbUEhdXG4vLyBGb3VuZGF0aW9uLkNoZWNrV2F0Y2hlcnMgPSBjaGVja1dhdGNoZXJzO1xuRm91bmRhdGlvbi5JSGVhcllvdSA9IGNoZWNrTGlzdGVuZXJzO1xuLy8gRm91bmRhdGlvbi5JU2VlWW91ID0gc2Nyb2xsTGlzdGVuZXI7XG4vLyBGb3VuZGF0aW9uLklGZWVsWW91ID0gY2xvc2VtZUxpc3RlbmVyO1xuXG59KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbiFmdW5jdGlvbigkKSB7XG5cbi8qKlxuICogQWNjb3JkaW9uIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5hY2NvcmRpb25cbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwubW90aW9uXG4gKi9cblxuY2xhc3MgQWNjb3JkaW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gYWNjb3JkaW9uLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIEFjY29yZGlvbiNpbml0XG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0byBtYWtlIGludG8gYW4gYWNjb3JkaW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGEgcGxhaW4gb2JqZWN0IHdpdGggc2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQWNjb3JkaW9uLmRlZmF1bHRzLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICBGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsICdBY2NvcmRpb24nKTtcbiAgICBGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKCdBY2NvcmRpb24nLCB7XG4gICAgICAnRU5URVInOiAndG9nZ2xlJyxcbiAgICAgICdTUEFDRSc6ICd0b2dnbGUnLFxuICAgICAgJ0FSUk9XX0RPV04nOiAnbmV4dCcsXG4gICAgICAnQVJST1dfVVAnOiAncHJldmlvdXMnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGFjY29yZGlvbiBieSBhbmltYXRpbmcgdGhlIHByZXNldCBhY3RpdmUgcGFuZShzKS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHRoaXMuJGVsZW1lbnQuYXR0cigncm9sZScsICd0YWJsaXN0Jyk7XG4gICAgdGhpcy4kdGFicyA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJ1tkYXRhLWFjY29yZGlvbi1pdGVtXScpO1xuXG4gICAgdGhpcy4kdGFicy5lYWNoKGZ1bmN0aW9uKGlkeCwgZWwpIHtcbiAgICAgIHZhciAkZWwgPSAkKGVsKSxcbiAgICAgICAgICAkY29udGVudCA9ICRlbC5jaGlsZHJlbignW2RhdGEtdGFiLWNvbnRlbn
5763RdJyksXG4gICAgICAgICAgaWQgPSAkY29udGVudFswXS5pZCB8fCBGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsICdhY2NvcmRpb24nKSxcbiAgICAgICAgICBsaW5rSWQgPSBlbC5pZCB8fCBgJHtpZH0tbGFiZWxgO1xuXG4gICAgICAkZWwuZmluZCgnYTpmaXJzdCcpLmF0dHIoe1xuICAgICAgICAnYXJpYS1jb250cm9scyc6IGlkLFxuICAgICAgICAncm9sZSc6ICd0YWInLFxuICAgICAgICAnaWQnOiBsaW5rSWQsXG4gICAgICAgICdhcmlhLWV4cGFuZGVkJzogZmFsc2UsXG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICAkY29udGVudC5hdHRyKHsncm9sZSc6ICd0YWJwYW5lbCcsICdhcmlhLWxhYmVsbGVkYnknOiBsaW5rSWQsICdhcmlhLWhpZGRlbic6IHRydWUsICdpZCc6IGlkfSk7XG4gICAgfSk7XG4gICAgdmFyICRpbml0QWN0aXZlID0gdGhpcy4kZWxlbWVudC5maW5kKCcuaXMtYWN0aXZlJykuY2hpbGRyZW4oJ1tkYXRhLXRhYi1jb250ZW50XScpO1xuICAgIHRoaXMuZmlyc3RUaW1lSW5pdCA9IHRydWU7XG4gICAgaWYoJGluaXRBY3RpdmUubGVuZ3RoKXtcbiAgICAgIHRoaXMuZG93bigkaW5pdEFjdGl2ZSwgdGhpcy5maXJzdFRpbWVJbml0KTtcbiAgICAgIHRoaXMuZmlyc3RUaW1lSW5pdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX2NoZWNrRGVlcExpbmsgPSAoKSA9PiB7XG4gICAgICB2YXIgYW5jaG9yID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgICAvL25lZWQgYSBoYXNoIGFuZCBhIHJlbGV2YW50IGFuY2hvciBpbiB0aGlzIHRhYnNldFxuICAgICAgaWYoYW5jaG9yLmxlbmd0aCkge1xuICAgICAgICB2Y
5763XIgJGxpbmsgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ1tocmVmJD1cIicrYW5jaG9yKydcIl0nKSxcbiAgICAgICAgJGFuY2hvciA9ICQoYW5jaG9yKTtcblxuICAgICAgICBpZiAoJGxpbmsubGVuZ3RoICYmICRhbmNob3IpIHtcbiAgICAgICAgICBpZiAoISRsaW5rLnBhcmVudCgnW2RhdGEtYWNjb3JkaW9uLWl0ZW1dJykuaGFzQ2xhc3MoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICAgICAgICB0aGlzLmRvd24oJGFuY2hvciwgdGhpcy5maXJzdFRpbWVJbml0KTtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RUaW1lSW5pdCA9IGZhbHNlO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvL3JvbGwgdXAgYSBsaXR0bGUgdG8gc2hvdyB0aGUgdGl0bGVzXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWVwTGlua1NtdWRnZSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICQod2luZG93KS5sb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gX3RoaXMuJGVsZW1lbnQub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBvZmZzZXQudG9wIH0sIF90aGlzLm9wdGlvbnMuZGVlcExpbmtTbXVkZ2VEZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgenBsdWdpbiBoYXMgZGVlcGxpbmtlZCBhdCBwYWdlbG9hZFxuICAgICAgICAgICAgKiBAZXZlbnQgQWNjb3JkaW9uI2RlZXBsaW5rXG4gICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignZGVlcGxpbmsuemYuYWNjb3JkaW9uJywgWyRsaW5rLCAkYW5jaG9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3VzZSBicm93c2VyIHRvIG9wZW4gYSB0YWIsIGlmIGl0IGV4aXN0cyBpbiB0aGlzIHRhYnNldFxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmspIHtcbiAgICAgIHRoaXMuX2NoZWNrRGVlcExpbmsoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIGZvciBpdGVtcyB3aXRoaW4gdGhlIGFjY29yZGlvbi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuJHRhYnMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkZWxlbSA9ICQodGhpcyk7XG4gICAgICB2Y
5763XIgJHRhYkNvbnRlbnQgPSAkZWxlbS5jaGlsZHJlbignW2RhdGEtdGFiLWNvbnRlbnRdJyk7XG4gICAgICBpZiAoJHRhYkNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICRlbGVtLmNoaWxkcmVuKCdhJykub2ZmKCdjbGljay56Zi5hY2NvcmRpb24ga2V5ZG93bi56Zi5hY2NvcmRpb24nKVxuICAgICAgICAgICAgICAgLm9uKCdjbGljay56Zi5hY2NvcmRpb24nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIF90aGlzLnRvZ2dsZSgkdGFiQ29udGVudCk7XG4gICAgICAgIH0pLm9uKCdrZXlkb3duLnpmLmFjY29yZGlvbicsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdBY2NvcmRpb24nLCB7XG4gICAgICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBfdGhpcy50b2dnbGUoJHRhYkNvbnRlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgJGEgPSAkZWxlbS5uZXh0KCkuZmluZCgnYScpLmZvY3VzKCk7XG4gICAgICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5tdWx0aUV4cGFuZCkge1xuICAgICAgICAgICAgICAgICRhLnRyaWdnZXIoJ2NsaWNrLnpmLmFjY29yZGlvbicpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2aW91czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciAkYSA9ICRlbGVtLnByZXYoKS5maW5kKCdhJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLm11bHRpRXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgJGEudHJpZ2dlcignY2xpY2suemYuYWNjb3JkaW9uJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgJCh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRoaXMuX2NoZWNrRGVlcExpbmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBzZWxlY3RlZCBjb250ZW50IHBhbmUncyBvcGVuL2Nsb3NlIHN0YXRlLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIGpRdWVyeSBvYmplY3Qgb2YgdGhlIHBhbmUgdG8gdG9nZ2xlIChgLmFjY29yZGlvbi1jb250ZW50YCkuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgdG9nZ2xlKCR0YXJnZXQpIHtcbiAgICBpZigkdGFyZ2V0LnBhcmVudCgpLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSkge1xuICAgICAgdGhpcy51cCgkdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb3duKCR0YXJnZXQpO1xuICAgIH1cbiAgICAvL2VpdGhlciByZXBsYWNlIG9yIHVwZGF0ZSBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlZXBMaW5rKSB7XG4gICAgICB2Y
5763XIgYW5jaG9yID0gJHRhcmdldC5wcmV2KCdhJykuYXR0cignaHJlZicpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwZGF0ZUhpc3RvcnkpIHtcbiAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoe30sICcnLCBhbmNob3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCBhbmNob3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgYWNjb3JkaW9uIHRhYiBkZWZpbmVkIGJ5IGAkdGFyZ2V0YC5cbiAgICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXQgLSBBY2NvcmRpb24gcGFuZSB0byBvcGVuIChgLmFjY29yZGlvbi1jb250ZW50YCkuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmlyc3RUaW1lIC0gZmxhZyB0byBkZXRlcm1pbmUgaWYgcmVmbG93IHNob3VsZCBoYXBwZW4uXG4gICAqIEBmaXJlcyBBY2NvcmRpb24jZG93blxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRvd24oJHRhcmdldCwgZmlyc3RUaW1lKSB7XG4gICAgJHRhcmdldFxuICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgZmFsc2UpXG4gICAgICAucGFyZW50KCdbZGF0YS10YWItY29udGVudF0nKVxuICAgICAgLmFkZEJhY2soKVxuICAgICAgLnBhcmVudCgpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcblxuICAgIGlmICghdGhpcy5vcHRpb25zLm11bHRpRXhwYW5kICYmICFmaXJzdFRpbWUpIHtcbiAgICAgIHZhciAkY3VycmVudEFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJy5pcy1hY3RpdmUnKS5jaGlsZHJlbignW2RhdGEtdGFiLWNvbnRlbnRdJyk7XG4gICAgICBpZiAoJGN1cnJlbnRBY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudXAoJGN1cnJlbnRBY3RpdmUubm90KCR0YXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAkdGFyZ2V0LnNsaWRlRG93bih0aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCwgKCkgPT4ge1xuICAgICAgLyoqXG4gICAgICAgKiBGaXJlcyB3aGVuIHRoZSB0YWIgaXMgZG9uZSBvcGVuaW5nLlxuICAgICAgICogQGV2ZW50IEFjY29yZGlvbiNkb3duXG4gICAgICAgKi9cbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignZG93bi56Zi5hY2NvcmRpb24nLCBbJHRhcmdldF0pO1xuICAgIH0pO1xuXG4gICAgJChgIyR7JHRhcmdldC5hdHRyKCdhcmlhLWxhYmVsbGVkYnknKX1gKS5hdHRyKHtcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogdHJ1ZSxcbiAgICAgICdhcmlhLXNlbGVjdGVkJzogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdGFiIGRlZmluZWQgYnkgYCR0YXJnZXRgLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIEFjY29yZGlvbiB0YWIgdG8gY2xvc2UgKGAuYWNjb3JkaW9uLWNvbnRlbnRgKS5cbiAgICogQGZpcmVzIEFjY29yZGlvbiN1cFxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIHVwKCR0YXJnZXQpIHtcbiAgICB2YXIgJGF1bnRzID0gJHRhcmdldC5wYXJlbnQoKS5zaWJsaW5ncygpLFxuICAgICAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZigoIXRoaXMub3B0aW9ucy5hbGxvd0FsbENsb3NlZCAmJiAhJGF1bnRzLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSkgfHwgISR0YXJnZXQucGFyZW50KCkuaGFzQ2xhc3MoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm91bmRhdGlvbi5Nb3ZlKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkLCAkdGFyZ2V0LCBmdW5jdGlvbigpe1xuICAgICAgJHRhcmdldC5zbGlkZVVwKF90aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdGFiIGlzIGRvbmUgY29sbGFwc2luZyB1cC5cbiAgICAgICAgICogQGV2ZW50IEFjY29yZGlvbiN1cFxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuJGVsZW1lbnQudHJpZ2dlcigndXAuemYuYWNjb3JkaW9uJywgWyR0YXJnZXRdKTtcbiAgICAgIH0pO1xuICAgIC8vIH0pO1xuXG4gICAgJHRhcmdldC5hdHRyKCdhcmlhLWh
5763pZGRlbicsIHRydWUpXG4gICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XG5cbiAgICAkKGAjJHskdGFyZ2V0LmF0dHIoJ2FyaWEtbGFiZWxsZWRieScpfWApLmF0dHIoe1xuICAgICAnYXJpYS1leHBhbmRlZCc6IGZhbHNlLFxuICAgICAnYXJpYS1zZWxlY3RlZCc6IGZhbHNlXG4gICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbiBpbnN0YW5jZSBvZiBhbiBhY2NvcmRpb24uXG4gICAqIEBmaXJlcyBBY2NvcmRpb24jZGVzdHJveWVkXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJ1tkYXRhLXRhYi1jb250ZW50XScpLnN0b3AodHJ1ZSkuc2xpZGVVcCgwKS5jc3MoJ2Rpc3BsYXknLCAnJyk7XG4gICAgdGhpcy4kZWxlbWVudC5maW5kKCdhJykub2ZmKCcuemYuYWNjb3JkaW9uJyk7XG4gICAgaWYodGhpcy5vcHRpb25zLmRlZXBMaW5rKSB7XG4gICAgICAkKHdpbmRvdykub2ZmKCdwb3BzdGF0ZScsIHRoaXMuX2NoZWNrRGVlcExpbmspO1xuICAgIH1cblxuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5BY2NvcmRpb24uZGVmYXVsdHMgPSB7XG4gIC8qKlxuICAgKiBBbW91bnQgb2YgdGltZSB0byBhbmltYXRlIHRoZSBvcGVuaW5nIG9mIGFuIGFjY29yZGlvbiBwYW5lLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDI1MFxuICAgKi9cbiAgc2xpZGVTcGVlZDogMjUwLFxuICAvKipcbiAgICogQWxsb3cgdGhlIGFjY29yZGlvbiB0byBoYXZlIG11bHRpcGxlIG9wZW4gcGFuZXMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBtdWx0aUV4cGFuZDogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgYWNjb3JkaW9uIHRvIGNsb3NlIGFsbCBwYW5lcy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGFsbG93QWxsQ2xvc2VkOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgd2luZG93IHRvIHNjcm9sbCB0byBjb250ZW50IG9mIHBhbmUgc3BlY2lmaWVkIGJ5IGhhc2ggYW5jaG9yXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWVwTGluazogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEFkanVzdCB0aGUgZGVlcCBsaW5rIHNjcm9sbCB0byBtYWtlIHN1cmUgdGhlIHRvcCBvZiB0aGUgYWNjb3JkaW9uIHBhbmVsIGlzIHZpc2libGVcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlZXBMaW5rU211ZGdlOiBmYWxzZSxcblxuICAvKipcbiAgICogQW5pbWF0aW9uIHRpbWUgKG1zKSBmb3IgdGhlIGRlZXAgbGluayBhZGp1c3RtZW50XG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWVwTGlua1NtdWRnZURlbGF5OiAzMDAsXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYnJvd3NlciBoaXN0b3J5IHdpdGggdGhlIG9wZW4gYWNjb3JkaW9uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1cGRhdGVIaXN0b3J5OiBmYWxzZVxufTtcblxuLy8gV2luZG93IGV4cG9ydHNcbkZvdW5kYXRpb24ucGx1Z2luKEFjY29yZGlvbiwgJ0FjY29yZGlvbicpO1xuXG59KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbiFmdW5jdGlvbigkKSB7XG5cbi8qKlxuICogRHJpbGxkb3duIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5kcmlsbGRvd25cbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwubW90aW9uXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm5lc3RcbiAqL1xuXG5jbGFzcyBEcmlsbGRvd24ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIGRyaWxsZG93biBtZW51LlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhbiBhY2NvcmRpb24gbWVudS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBEcmlsbGRvd24uZGVmYXVsdHMsIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcblxuICAgIEZvdW5kYXRpb24uTmVzdC5GZWF0aGVyKHRoaXMuJGVsZW1lbnQsICdkcmlsbGRvd24nKTtcblxuICAgIHRoaXMuX2luaXQoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ0RyaWxsZG93bicpO1xuICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoJ0RyaWxsZG93bicsIHtcbiAgICAgICdFTlRFUic6ICdvcGVuJyxcbiAgICAgICdTUEFDRSc6ICdvcGVuJyxcbiAgICAgICdBUlJPV19SSUdIVCc6ICduZXh0JyxcbiAgICAgICdBUlJPV19VUCc6ICd1cCcsXG4gICAgICAnQVJST1dfRE9XTic6ICdkb3duJyxcbiAgICAgICdBUlJPV19MRUZUJzogJ3ByZXZpb3VzJyxcbiAgICAgICdFU0NBUEUnOiAnY2xvc2UnLFxuICAgICAgJ1RBQic6ICdkb3duJyxcbiAgICAgICdTSElGVF9UQUInOiAndXAnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGRyaWxsZG93biBieSBjcmVhdGluZyBqUXVlcnkgY29sbGVjdGlvbnMgb2YgZWxlbWVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHRoaXMuJHN1Ym1lbnVBbmNob3JzID0gdGhpcy4kZWxlbWVudC5maW5kKCdsaS5pcy1kcmlsbGRvd24tc3VibWVudS1wYXJlbnQnKS5jaGlsZHJlbignYScpO1xuICAgIHRoaXMuJHN1Ym1lbnVzID0gdGhpcy4kc3VibWVudUFuY2hvcnMucGFyZW50KCdsaScpLmNoaWxkcmVuKCdbZGF0YS1zdWJtZW51XScpO1xuICAgIHRoaXMuJG1lbnVJdGVtcyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnbGknKS5ub3QoJy5qcy1kcmlsbGRvd24tYmFjaycpLmF0dHIoJ3JvbGUnLCAnbWVudWl0ZW0nKS5maW5kKCdhJyk7XG4gICAgdGhpcy4kZWxlbWVudC5hdHRyKCdkYXRhLW11dGF0ZScsICh0aGlzLiRlbGVtZW50LmF0dHIoJ2RhdGEtZ
5763HJpbGxkb3duJykgfHwgRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LCAnZHJpbGxkb3duJykpKTtcblxuICAgIHRoaXMuX3ByZXBhcmVNZW51KCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJFdmVudHMoKTtcblxuICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogcHJlcGFyZXMgZHJpbGxkb3duIG1lbnUgYnkgc2V0dGluZyBhdHRyaWJ1dGVzIHRvIGxpbmtzIGFuZCBlbGVtZW50c1xuICAgKiBzZXRzIGEgbWluIGhlaWdodCB0byBwcmV2ZW50IGNvbnRlbnQganVtcGluZ1xuICAgKiB3cmFwcyB0aGUgZWxlbWVudCBpZiBub3QgYWxyZWFkeSB3cmFwcGVkXG4gICAqIEBwcml2YXRlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX3ByZXBhcmVNZW51KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gaWYoIXRoaXMub3B0aW9ucy5ob2xkT3Blbil7XG4gICAgLy8gICB0aGlzLl9tZW51TGlua0V2ZW50cygpO1xuICAgIC8vIH1cbiAgICB0aGlzLiRzdWJtZW51QW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgJGxpbmsgPSAkKHRoaXMpO1xuICAgICAgdmFyICRzdWIgPSAkbGluay5wYXJlbnQoKTtcbiAgICAgIGlmKF90aGlzLm9wdGlvbnMucGFyZW50TGluayl7XG4gICAgICAgICRsaW5rLmNsb25lKCkucHJlcGVuZFRvKCRzdWIuY2hpbGRyZW4oJ1tkYXRhLXN1Ym1lbnVdJykpLndyYXAoJzxsaSBjbGFzcz1cImlzLXN1Ym1lbnUtcGFyZW50LWl0ZW0gaXMtc3VibWVudS1pdGVtIGlzLWRyaWxsZG93bi1zdWJtZW51LWl0ZW1cIiByb2xlPVwibWVudS1pdGVtXCI+PC9saT4nKTtcbiAgICAgIH1cbiAgICAgICRsaW5rLmRhdGEoJ3NhdmVkSHJlZicsICRsaW5rLmF0dHIoJ2hyZWYnKSkucmVtb3ZlQXR0cignaHJlZicpLmF0dHIoJ3RhYmluZGV4JywgMCk7XG4gICAgICAkbGluay5jaGlsZHJlbignW2RhdGEtc3VibWVudV0nKVxuICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICdhcmlhLWh
5763pZGRlbic6IHRydWUsXG4gICAgICAgICAgICAndGFiaW5kZXgnOiAwLFxuICAgICAgICAgICAgJ3JvbGUnOiAnbWVudSdcbiAgICAgICAgICB9KTtcbiAgICAgIF90aGlzLl9ldmVudHMoJGxpbmspO1xuICAgIH0pO1xuICAgIHRoaXMuJHN1Ym1lbnVzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgIHZhciAkbWVudSA9ICQodGhpcyksXG4gICAgICAgICAgJGJhY2sgPSAkbWVudS5maW5kKCcuanMtZHJpbGxkb3duLWJhY2snKTtcbiAgICAgIGlmKCEkYmFjay5sZW5ndGgpe1xuICAgICAgICBzd2l0Y2ggKF90aGlzLm9wdGlvbnMuYmFja0J1dHRvblBvc2l0aW9uKSB7XG4gICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgJG1lbnUuYXBwZW5kKF90aGlzLm9wdGlvbnMuYmFja0J1dHRvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICAkbWVudS5wcmVwZW5kKF90aGlzLm9wdGlvbnMuYmFja0J1dHRvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuc3VwcG9ydGVkIGJhY2tCdXR0b25Qb3NpdGlvbiB2YWx1ZSAnXCIgKyBfdGhpcy5vcHRpb25zLmJhY2tCdXR0b25Qb3NpdGlvbiArIFwiJ1wiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX3RoaXMuX2JhY2soJG1lbnUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc3VibWVudXMuYWRkQ2xhc3MoJ2ludmlzaWJsZScpO1xuICAgIGlmKCF0aGlzLm9wdGlvbnMuYXV0b0hlaWdodCkge1xuICAgICAgdGhpcy4kc3VibWVudXMuYWRkQ2xhc3MoJ2RyaWxsZG93bi1zdWJtZW51LWNvdmVyLXByZXZpb3VzJyk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgd3JhcHBlciBvbiBlbGVtZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgaWYoIXRoaXMuJGVsZW1lbnQucGFyZW50KCkuaGFzQ2xhc3MoJ2lzLWRyaWxsZG93bicpKXtcbiAgICAgIHRoaXMuJHdyYXBwZXIgPSAkKHRoaXMub3B0aW9ucy53cmFwcGVyKS5hZGRDbGFzcygnaXMtZHJpbGxkb3duJyk7XG4gICAgICBpZih0aGlzLm9wdGlvbnMuYW5pbWF0ZUhlaWdodCkgdGhpcy4kd3JhcHBlci5hZGRDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKTtcbiAgICAgIHRoaXMuJGVsZW1lbnQud3JhcCh0aGlzLiR3cmFwcGVyKTtcbiAgICB9XG4gICAgLy8gc2V0IHdyYXBwZXJcbiAgICB0aGlzLiR3cmFwcGVyID0gdGhpcy4kZWxlbWVudC5wYXJlbnQoKTtcbiAgICB0aGlzLiR3cmFwcGVyLmNzcyh0aGlzLl9nZXRNYXhEaW1zKCkpO1xuICB9XG5cbiAgX3Jlc2l6ZSgpIHtcbiAgICB0aGlzLiR3cmFwcGVyLmNzcyh7J21heC13aWR0aCc6ICdub25lJywgJ21pbi1oZWlnaHQnOiAnbm9uZSd9KTtcbiAgICAvLyBfZ2V0TWF4RGltcyBoYXMgc2lkZSBlZmZlY3RzIChib28pIGJ1dCBjYWxsaW5nIGl0IHNob3VsZCB1cGRhdGUgYWxsIG90aGVyIG5lY2Vzc2FyeSBoZWlnaHRzICYgd2lkdGhzXG4gICAgdGhpcy4kd3JhcHBlci5jc3ModGhpcy5fZ2V0TWF4RGltcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIGVsZW1lbnRzIGluIHRoZSBtZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtIC0gdGhlIGN1cnJlbnQgbWVudSBpdGVtIHRvIGFkZCBoYW5kbGVycyB0by5cbiAgICovXG4gIF9ldmVudHMoJGVsZW0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgJGVsZW0ub2ZmKCdjbGljay56Zi5kcmlsbGRvd24nKVxuICAgIC5vbignY2xpY2suemYuZHJpbGxkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICBpZigkKGUudGFyZ2V0KS5wYXJlbnRzVW50aWwoJ3VsJywgJ2xpJykuaGFzQ2xhc3MoJ2lzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCcpKXtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZihlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LmZpcnN0RWxlbWVudENoaWxkKXtcbiAgICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gfVxuICAgICAgX3RoaXMuX3Nob3coJGVsZW0ucGFyZW50KCdsaScpKTtcblxuICAgICAgaWYoX3RoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spe1xuICAgICAgICB2Y
5763XIgJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgICAgICRib2R5Lm9mZignLnpmLmRyaWxsZG93bicpLm9uKCdjbGljay56Zi5kcmlsbGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IF90aGlzLiRlbGVtZW50WzBdIHx8ICQuY29udGFpbnMoX3RoaXMuJGVsZW1lbnRbMF0sIGUudGFyZ2V0KSkgeyByZXR1cm47IH1cbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgX3RoaXMuX2hpZGVBbGwoKTtcbiAgICAgICAgICAkYm9keS5vZmYoJy56Zi5kcmlsbGRvd24nKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cdCAgdGhpcy4kZWxlbWVudC5vbignbXV0YXRlbWUuemYudHJpZ2dlcicsIHRoaXMuX3Jlc2l6ZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSBtZW51IGVsZW1lbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlZ2lzdGVyRXZlbnRzKCkge1xuICAgIGlmKHRoaXMub3B0aW9ucy5zY3JvbGxUb3Ape1xuICAgICAgdGhpcy5fYmluZEhhbmRsZXIgPSB0aGlzLl9zY3JvbGxUb3AuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuJGVsZW1lbnQub24oJ29wZW4uemYuZHJpbGxkb3duIGhpZGUuemYuZHJpbGxkb3duIGNsb3NlZC56Zi5kcmlsbGRvd24nLHRoaXMuX2JpbmRIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRvIFRvcCBvZiBFbGVtZW50IG9yIGRhdGEtc2Nyb2xsLXRvcC1lbGVtZW50XG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJpbGxkb3duI3Njcm9sbG1lXG4gICAqL1xuICBfc2Nyb2xsVG9wKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyICRzY3JvbGxUb3BFbGVtZW50ID0gX3RoaXMub3B0aW9ucy5zY3JvbGxUb3BFbGVtZW50IT0nJz8kKF90aGlzLm9wdGlvbnMuc2Nyb2xsVG9wRWxlbWVudCk6X3RoaXMuJGVsZW1lbnQsXG4gICAgICAgIHNjcm9sbFBvcyA9IHBhcnNlSW50KCRzY3JvbGxUb3BFbGVtZW50Lm9mZnNldCgpLnRvcCtfdGhpcy5vcHRpb25zLnNjcm9sbFRvcE9mZnNldCk7XG4gICAgJCgnaHRtbCwgYm9keScpLnN0b3AodHJ1ZSkuYW5pbWF0ZSh7IHNjcm9sbFRvcDogc2Nyb2xsUG9zIH0sIF90aGlzLm9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sIF90aGlzLm9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nLGZ1bmN0aW9uKCl7XG4gICAgICAvKipcbiAgICAgICAgKiBGaXJlcyBhZnRlciB0aGUgbWVudSBoYXMgc2Nyb2xsZWRcbiAgICAgICAgKiBAZXZlbnQgRHJpbGxkb3duI3Njcm9sbG1lXG4gICAgICAgICovXG4gICAgICBpZih0aGlzPT09JCgnaHRtbCcpWzBdKV90aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3Njcm9sbG1lLnpmLmRyaWxsZG93bicpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMga2V5ZG93biBldmVudCBsaXN0ZW5lciB0byBgbGlgJ3MgaW4gdGhlIG1lbnUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfa2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuJG1lbnVJdGVtcy5hZGQodGhpcy4kZWxlbWVudC5maW5kKCcuanMtZHJpbGxkb3duLWJhY2sgPiBhLCAuaXMtc3VibWVudS1wYXJlbnQtaXRlbSA+IGEnKSkub24oJ2tleWRvd24uemYuZHJpbGxkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICB2Y
5763XIgJGVsZW1lbnQgPSAkKHRoaXMpLFxuICAgICAgICAgICRlbGVtZW50cyA9ICRlbGVtZW50LnBhcmVudCgnbGknKS5wYXJlbnQoJ3VsJykuY2hpbGRyZW4oJ2xpJykuY2hpbGRyZW4oJ2EnKSxcbiAgICAgICAgICAkcHJldkVsZW1lbnQsXG4gICAgICAgICAgJG5leHRFbGVtZW50O1xuXG4gICAgICAkZWxlbWVudHMuZWFjaChmdW5jdGlvbihpKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmlzKCRlbGVtZW50KSkge1xuICAgICAgICAgICRwcmV2RWxlbWVudCA9ICRlbGVtZW50cy5lcShNYXRoLm1heCgwLCBpLTEpKTtcbiAgICAgICAgICAkbmV4dEVsZW1lbnQgPSAkZWxlbWVudHMuZXEoTWF0aC5taW4oaSsxLCAkZWxlbWVudHMubGVuZ3RoLTEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLCAnRHJpbGxkb3duJywge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoJGVsZW1lbnQuaXMoX3RoaXMuJHN1Ym1lbnVBbmNob3JzKSkge1xuICAgICAgICAgICAgX3RoaXMuX3Nob3coJGVsZW1lbnQucGFyZW50KCdsaScpKTtcbiAgICAgICAgICAgICRlbGVtZW50LnBhcmVudCgnbGknKS5vbmUoRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kKCRlbGVtZW50KSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLmZpbmQoJ3VsIGxpIGEnKS5maWx0ZXIoX3RoaXMuJG1lbnVJdGVtcykuZmlyc3QoKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByZXZpb3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBfdGhpcy5faGlkZSgkZWxlbWVudC5wYXJlbnQoJ2xpJykucGFyZW50KCd1bCcpKTtcbiAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoJ2xpJykucGFyZW50KCd1bCcpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQoJGVsZW1lbnQpLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLnBhcmVudCgndWwnKS5wYXJlbnQoJ2xpJykuY2hpbGRyZW4oJ2EnKS5maXJzdCgpLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICRwcmV2RWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgIC8vIERvbid0IHRhcCBmb2N1cyBvbiBmaXJzdCBlbGVtZW50IGluIHJvb3QgdWxcbiAgICAgICAgICByZXR1cm4gISRlbGVtZW50LmlzKF90aGlzLiRlbGVtZW50LmZpbmQoJz4gbGk6Zmlyc3QtY2hpbGQgPiBhJykpO1xuICAgICAgICB9LFxuICAgICAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkbmV4dEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAvLyBEb24ndCB0YXAgZm9jdXMgb24gbGFzdCBlbGVtZW50IGluIHJvb3QgdWxcbiAgICAgICAgICByZXR1cm4gISRlbGVtZW50LmlzKF90aGlzLiRlbGVtZW50LmZpbmQoJz4gbGk6bGFzdC1jaGlsZCA+IGEnKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBEb24ndCBjbG9zZSBvbiBlbGVtZW50IGluIHJvb3QgdWxcbiAgICAgICAgICBpZiAoISRlbGVtZW50LmlzKF90aGlzLiRlbGVtZW50LmZpbmQoJz4gbGkgPiBhJykpKSB7XG4gICAgICAgICAgICBfdGhpcy5faGlkZSgkZWxlbWVudC5wYXJlbnQoKS5wYXJlbnQoKSk7XG4gICAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoKS5wYXJlbnQoKS5zaWJsaW5ncygnYScpLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoISRlbGVtZW50LmlzKF90aGlzLiRtZW51SXRlbXMpKSB7IC8vIG5vdCBtZW51IGl0ZW0gbWVhbnMgYmFjayBidXR0b25cbiAgICAgICAgICAgIF90aGlzLl9oaWRlKCRlbGVtZW50LnBhcmVudCgnbGknKS5wYXJlbnQoJ3VsJykpO1xuICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLnBhcmVudCgndWwnKS5vbmUoRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kKCRlbGVtZW50KSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoJ2xpJykucGFyZW50KCd1bCcpLnBhcmVudCgnbGknKS5jaGlsZHJlbignYScpLmZpcnN0KCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJGVsZW1lbnQuaXMoX3RoaXMuJHN1Ym1lbnVBbmNob3JzKSkge1xuICAgICAgICAgICAgX3RoaXMuX3Nob3coJGVsZW1lbnQucGFyZW50KCdsaScpKTtcbiAgICAgICAgICAgICRlbGVtZW50LnBhcmVudCgnbGknKS5vbmUoRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kKCRlbGVtZW50KSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLmZpbmQoJ3VsIGxpIGEnKS5maWx0ZXIoX3RoaXMuJG1lbnVJdGVtcykuZmlyc3QoKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pOyAvLyBlbmQga2V5Ym9hcmRBY2Nlc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYWxsIG9wZW4gZWxlbWVudHMsIGFuZCByZXR1cm5zIHRvIHJvb3QgbWVudS5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBEcmlsbGRvd24jY2xvc2VkXG4gICAqL1xuICBfaGlkZUFsbCgpIHtcbiAgICB2YXIgJGVsZW0gPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pcy1kcmlsbGRvd24tc3VibWVudS5pcy1hY3RpdmUnKS5hZGRDbGFzcygnaXMtY2xvc2luZycpO1xuICAgIGlmKHRoaXMub3B0aW9ucy5hdXRv
5763SGVpZ2h0KSB0aGlzLiR3cmFwcGVyLmNzcyh7aGVpZ2h0OiRlbGVtLnBhcmVudCgpLmNsb3Nlc3QoJ3VsJykuZGF0YSgnY2FsY0hlaWdodCcpfSk7XG4gICAgJGVsZW0ub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCgkZWxlbSksIGZ1bmN0aW9uKGUpe1xuICAgICAgJGVsZW0ucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZSBpcy1jbG9zaW5nJyk7XG4gICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBtZW51IGlzIGZ1bGx5IGNsb3NlZC5cbiAgICAgICAgICogQGV2ZW50IERyaWxsZG93biNjbG9zZWRcbiAgICAgICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdjbG9zZWQuemYuZHJpbGxkb3duJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBldmVudCBsaXN0ZW5lciBmb3IgZWFjaCBgYmFja2AgYnV0dG9uLCBhbmQgY2xvc2VzIG9wZW4gbWVudXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJpbGxkb3duI2JhY2tcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtIC0gdGhlIGN1cnJlbnQgc3ViLW1lbnUgdG8gYWRkIGBiYWNrYCBldmVudC5cbiAgICovXG4gIF9iYWNrKCRlbGVtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAkZWxlbS5vZmYoJ2NsaWNrLnpmLmRyaWxsZG93bicpO1xuICAgICRlbGVtLmNoaWxkcmVuKCcuanMtZHJpbGxkb3duLWJhY2snKVxuICAgICAgLm9uKCdjbGljay56Zi5kcmlsbGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ21vdXNldXAgb24gYmFjaycpO1xuICAgICAgICBfdGhpcy5faGlkZSgkZWxlbSk7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJlbnQgc3VibWVudSwgY2FsbCBzaG93XG4gICAgICAgIGxldCBwYXJlbnRTdWJNZW51ID0gJGVsZW0ucGFyZW50KCdsaScpLnBhcmVudCgndWwnKS5wYXJlbnQoJ2xpJyk7XG4gICAgICAgIGlmIChwYXJlbnRTdWJNZW51Lmxlbmd0aCkge1xuICAgICAgICAgIF90aGlzLl9zaG93KHBhcmVudFN1Yk1lbnUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGxpc3RlbmVyIHRvIG1lbnUgaXRlbXMgdy9vIHN1Ym1lbnVzIHRvIGNsb3NlIG9wZW4gbWVudXMgb24gY2xpY2suXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21lbnVMaW5rRXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy4kbWVudUl0ZW1zLm5vdCgnLmlzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCcpXG4gICAgICAgIC5vZmYoJ2NsaWNrLnpmLmRyaWxsZG93bicpXG4gICAgICAgIC5vbignY2xpY2suemYuZHJpbGxkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICAgICAgLy8gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBfdGhpcy5faGlkZUFsbCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSBzdWJtZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQGZpcmVzIERyaWxsZG93biNvcGVuXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgd2l0aCBhIHN1Ym1lbnUgdG8gb3BlbiwgaS5lLiB0aGUgYGxpYCB0YWcuXG4gICAqL1xuICBfc2hvdygkZWxlbSkge1xuICAgIGlmKHRoaXMub3B0aW9ucy5hdXRvSGVpZ2h0KSB0aGlzLiR3cmFwcGVyLmNzcyh7aGVpZ2h0OiRlbGVtLmNoaWxkcmVuKCdbZGF0YS1zdWJtZW51XScpLmRhdGEoJ2NhbGNIZWlnaHQnKX0pO1xuICAgICRlbGVtLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAkZWxlbS5jaGlsZHJlbignW2RhdGEtc3VibWVudV0nKS5hZGRDbGFzcygnaXMtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2ludmlzaWJsZScpLmF0dHIoJ2FyaWEtaGlkZGVuJywgZmFsc2UpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHN1Ym1lbnUgaGFzIG9wZW5lZC5cbiAgICAgKiBAZXZlbnQgRHJpbGxkb3duI29wZW5cbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ29wZW4uemYuZHJpbGxkb3duJywgWyRlbGVtXSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGVzIGEgc3VibWVudVxuICAgKiBAZnVuY3Rpb25cbiAgICogQGZpcmVzIERyaWxsZG93biNoaWRlXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbSAtIHRoZSBjdXJyZW50IHN1Yi1tZW51IHRvIGhpZGUsIGkuZS4gdGhlIGB1bGAgdGFnLlxuICAgKi9cbiAgX2hpZGUoJGVsZW0pIHtcbiAgICBpZih0aGlzLm9wdGlvbnMuYXV0b0hlaWdodCkgdGhpcy4kd3JhcHBlci5jc3Moe2hlaWdodDokZWxlbS5wYXJlbnQoKS5jbG9zZXN0KCd1bCcpLmRhdGEoJ2NhbGNIZWlnaHQnKX0pO1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgJGVsZW0ucGFyZW50KCdsaScpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gICAgJGVsZW0uYXR0cignYXJpYS1oaWRkZW4nLCB0cnVlKS5hZGRDbGFzcygnaXMtY2xvc2luZycpXG4gICAgJGVsZW0uYWRkQ2xhc3MoJ2lzLWNsb3NpbmcnKVxuICAgICAgICAgLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQoJGVsZW0pLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAkZWxlbS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlIGlzLWNsb3NpbmcnKTtcbiAgICAgICAgICAgJGVsZW0uYmx1cigpLmFkZENsYXNzKCdpbnZpc2libGUnKTtcbiAgICAgICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHN1Ym1lbnUgaGFzIGNsb3NlZC5cbiAgICAgKiBAZXZlbnQgRHJpbGxkb3duI2hpZGVcbiAgICAgKi9cbiAgICAkZWxlbS50cmlnZ2VyKCdoaWRlLnpmLmRyaWxsZG93bicsIFskZWxlbV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIG5lc3RlZCBtZW51cyB0byBjYWxjdWxhdGUgdGhlIG1pbi1oZWlnaHQsIGFuZCBtYXgtd2lkdGggZm9yIHRoZSBtZW51LlxuICAgKiBQcmV2ZW50cyBjb250ZW50IGp1bXBpbmcuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldE1heERpbXMoKSB7XG4gICAgdmFyICBtYXhIZWlnaHQgPSAwLCByZXN1bHQgPSB7fSwgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuJHN1Ym1lbnVzLmFkZCh0aGlzLiRlbGVtZW50KS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICB2Y
5763XIgbnVtT2ZFbGVtcyA9ICQodGhpcykuY2hpbGRyZW4oJ2xpJykubGVuZ3RoO1xuICAgICAgdmFyIGhlaWdodCA9IEZvdW5kYXRpb24uQm94LkdldERpbWVuc2lvbnModGhpcykuaGVpZ2h0O1xuICAgICAgbWF4SGVpZ2h0ID0gaGVpZ2h0ID4gbWF4SGVpZ2h0ID8gaGVpZ2h0IDogbWF4SGVpZ2h0O1xuICAgICAgaWYoX3RoaXMub3B0aW9ucy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICQodGhpcykuZGF0YSgnY2FsY0hlaWdodCcsaGVpZ2h0KTtcbiAgICAgICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdpcy1kcmlsbGRvd24tc3VibWVudScpKSByZXN1bHRbJ2hlaWdodCddID0gaGVpZ2h0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYoIXRoaXMub3B0aW9ucy5hdXRvSGVpZ2h0KSByZXN1bHRbJ21pbi1oZWlnaHQnXSA9IGAke21heEhlaWdodH1weGA7XG5cbiAgICByZXN1bHRbJ21heC13aWR0aCddID0gYCR7dGhpcy4kZWxlbWVudFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH1weGA7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBEcmlsbGRvd24gTWVudVxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbFRvcCkgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi5kcmlsbGRvd24nLHRoaXMuX2JpbmRIYW5kbGVyKTtcbiAgICB0aGlzLl9oaWRlQWxsKCk7XG5cdCAgdGhpcy4kZWxlbWVudC5vZmYoJ211dGF0ZW1lLnpmLnRyaWdnZXInKTtcbiAgICBGb3VuZGF0aW9uLk5lc3QuQnVybih0aGlzLiRlbGVtZW50LCAnZHJpbGxkb3duJyk7XG4gICAgdGhpcy4kZWxlbWVudC51bndyYXAoKVxuICAgICAgICAgICAgICAgICAuZmluZCgnLmpzLWRyaWxsZG93bi1iYWNrLCAuaXMtc3VibWVudS1wYXJlbnQtaXRlbScpLnJlbW92ZSgpXG4gICAgICAgICAgICAgICAgIC5lbmQoKS5maW5kKCcuaXMtYWN0aXZlLCAuaXMtY2xvc2luZywgLmlzLWRyaWxsZG93bi1zdWJtZW51JykucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZSBpcy1jbG9zaW5nIGlzLWRyaWxsZG93bi1zdWJtZW51JylcbiAgICAgICAgICAgICAgICAgLmVuZCgpLmZpbmQoJ1tkYXRhLXN1Ym1lbnVdJykucmVtb3ZlQXR0cignYXJpYS1oaWRkZW4gdGFiaW5kZXggcm9sZScpO1xuICAgIHRoaXMuJHN1Ym1lbnVBbmNob3JzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLm9mZignLnpmLmRyaWxsZG93bicpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc3VibWVudXMucmVtb3ZlQ2xhc3MoJ2RyaWxsZG93bi1zdWJtZW51LWNvdmVyLXByZXZpb3VzJyk7XG5cbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJ2EnKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICB2Y
5763XIgJGxpbmsgPSAkKHRoaXMpO1xuICAgICAgJGxpbmsucmVtb3ZlQXR0cigndGFiaW5kZXgnKTtcbiAgICAgIGlmKCRsaW5rLmRhdGEoJ3NhdmVkSHJlZicpKXtcbiAgICAgICAgJGxpbmsuYXR0cignaHJlZicsICRsaW5rLmRhdGEoJ3NhdmVkSHJlZicpKS5yZW1vdmVEYXRhKCdzYXZlZEhyZWYnKTtcbiAgICAgIH1lbHNleyByZXR1cm47IH1cbiAgICB9KTtcbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH07XG59XG5cbkRyaWxsZG93bi5kZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIE1hcmt1cCB1c2VkIGZvciBKUyBnZW5lcmF0ZWQgYmFjayBidXR0b24uIFByZXBlbmRlZCAgb3IgYXBwZW5kZWQgKHNlZSBiYWNrQnV0dG9uUG9zaXRpb24pIHRvIHN1Ym1lbnUgbGlzdHMgYW5kIGRlbGV0ZWQgb24gYGRlc3Ryb3lgIG1ldGhvZCwgJ2pzLWRyaWxsZG93bi1iYWNrJyBjbGFzcyByZXF1aXJlZC4gUmVtb3ZlIHRoZSBiYWNrc2xhc2ggKGBcXGApIGlmIGNvcHkgYW5kIHBhc3RpbmcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJzxsaSBjbGFzcz1cImpzLWRyaWxsZG93bi1iYWNrXCI+PGEgdGFiaW5kZXg9XCIwXCI+QmFjazwvYT48L2xpPidcbiAgICovXG4gIGJhY2tCdXR0b246ICc8bGkgY2xhc3M9XCJqcy1kcmlsbGRvd24tYmFja1wiPjxhIHRhYmluZGV4PVwiMFwiPkJhY2s8L2E+PC9saT4nLFxuICAvKipcbiAgICogUG9zaXRpb24gdGhlIGJhY2sgYnV0dG9uIGVpdGhlciBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBkcmlsbGRvd24gc3VibWVudXMuIENhbiBiZSBgJ2xlZnQnYCBvciBgJ2JvdHRvbSdgLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IHRvcFxuICAgKi9cbiAgYmFja0J1dHRvblBvc2l0aW9uOiAndG9wJyxcbiAgLyoqXG4gICAqIE1hcmt1cCB1c2VkIHRvIHdyYXAgZHJpbGxkb3duIG1lbnUuIFVzZSBhIGNsYXNzIG5hbWUgZm9yIGluZGVwZW5kZW50IHN0eWxpbmc7IHRoZSBKUyBhcHBsaWVkIGNsYXNzOiBgaXMtZHJpbGxkb3duYCBpcyByZXF1aXJlZC4gUmVtb3ZlIHRoZSBiYWNrc2xhc2ggKGBcXGApIGlmIGNvcHkgYW5kIHBhc3RpbmcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJzxkaXY+PC9kaXY+J1xuICAgKi9cbiAgd3JhcHBlcjogJzxkaXY+PC9kaXY+JyxcbiAgLyoqXG4gICAqIEFkZHMgdGhlIHBhcmVudCBsaW5rIHRvIHRoZSBzdWJtZW51LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcGFyZW50TGluazogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgbWVudSB0byByZXR1cm4gdG8gcm9vdCBsaXN0IG9uIGJvZHkgY2xpY2suXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2s6IGZhbHNlLFxuICAvKipcbiAgICogQWxsb3cgdGhlIG1lbnUgdG8gYXV0byBhZGp1c3QgaGVpZ2h0LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYXV0b0hlaWdodDogZmFsc2UsXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBhdXRvIGFkanVzdCBoZWlnaHQuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhbmltYXRlSGVpZ2h0OiBmYWxzZSxcbiAgLyoqXG4gICAqIFNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBtZW51IGFmdGVyIG9wZW5pbmcgYSBzdWJtZW51IG9yIG5hdmlnYXRpbmcgYmFjayB1c2luZyB0aGUgbWVudSBiYWNrIGJ1dHRvblxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2Nyb2xsVG9wOiBmYWxzZSxcbiAgLyoqXG4gICAqIFN0cmluZyBqcXVlcnkgc2VsZWN0b3IgKGZvciBleGFtcGxlICdib2R5Jykgb2YgZWxlbWVudCB0byB0YWtlIG9mZnNldCgpLnRvcCBmcm9tLCBpZiBlbXB0eSBzdHJpbmcgdGhlIGRyaWxsZG93biBtZW51IG9mZnNldCgpLnRvcCBpcyB0YWtlblxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBzY3JvbGxUb3BFbGVtZW50OiAnJyxcbiAgLyoqXG4gICAqIFNjcm9sbFRvcCBvZmZzZXRcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzY3JvbGxUb3BPZmZzZXQ6IDAsXG4gIC8qKlxuICAgKiBTY3JvbGwgYW5pbWF0aW9uIGR1cmF0aW9uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvKipcbiAgICogU2Nyb2xsIGFuaW1hdGlvbiBlYXNpbmcuIENhbiBiZSBgJ3N3aW5nJ2Agb3IgYCdsaW5lYXInYC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2FwaS5qcXVlcnkuY29tL2FuaW1hdGV8SlF1ZXJ5IGFuaW1hdGV9XG4gICAqIEBkZWZhdWx0ICdzd2luZydcbiAgICovXG4gIGFuaW1hdGlvbkVhc2luZzogJ3N3aW5nJ1xuICAvLyBob2xkT3BlbjogZmFsc2Vcbn07XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihEcmlsbGRvd24sICdEcmlsbGRvd24nKTtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIERyb3Bkb3duIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5kcm9wZG93blxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5rZXlib2FyZFxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5ib3hcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnNcbiAqL1xuXG5jbGFzcyBEcm9wZG93biB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGEgZHJvcGRvd24uXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIGEgZHJvcGRvd24uXG4gICAqICAgICAgICBPYmplY3Qgc2hvdWxkIGJlIG9mIHRoZSBkcm9wZG93biBwYW5lbCwgcmF0aGVyIHR
5763oYW4gaXRzIGFuY2hvci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBEcm9wZG93bi5kZWZhdWx0cywgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpO1xuICAgIHRoaXMuX2luaXQoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ0Ryb3Bkb3duJyk7XG4gICAgRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcignRHJvcGRvd24nLCB7XG4gICAgICAnRU5URVInOiAnb3BlbicsXG4gICAgICAnU1BBQ0UnOiAnb3BlbicsXG4gICAgICAnRVNDQVBFJzogJ2Nsb3NlJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gYnkgc2V0dGluZy9jaGVja2luZyBvcHRpb25zIGFuZCBhdHRyaWJ1dGVzLCBhZGRpbmcgaGVscGVyIHZhcmlhYmxlcywgYW5kIHNhdmluZyB0aGUgYW5jaG9yLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciAkaWQgPSB0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJyk7XG5cbiAgICB0aGlzLiRhbmNob3IgPSAkKGBbZGF0YS10b2dnbGU9XCIkeyRpZH1cIl1gKS5sZW5ndGggPyAkKGBbZGF0YS10b2dnbGU9XCIkeyRpZH1cIl1gKSA6ICQoYFtkYXRhLW9wZW49XCIkeyRpZH1cIl1gKTtcbiAgICB0aGlzLiRhbmNob3IuYXR0cih7XG4gICAgICAnYXJpYS1jb250cm9scyc6ICRpZCxcbiAgICAgICdkYXRhLWlzLWZvY3VzJzogZmFsc2UsXG4gICAgICAnZGF0YS15ZXRpLWJveCc6ICRpZCxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogZmFsc2VcblxuICAgIH0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLnBhcmVudENsYXNzKXtcbiAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJGVsZW1lbnQucGFyZW50cygnLicgKyB0aGlzLm9wdGlvbnMucGFyZW50Q2xhc3MpO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy4kcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uQ2xhc3MgPSB0aGlzLmdldFBvc2l0aW9uQ2xhc3MoKTtcbiAgICB0aGlzLmNvdW50ZXIgPSA0O1xuICAgIHRoaXMudXNlZFBvc2l0aW9ucyA9IFtdO1xuICAgIHRoaXMuJGVsZW1lbnQuYXR0cih7XG4gICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gICAgICAnZGF0YS15ZXRpLWJveCc6ICRpZCxcbiAgICAgICdkYXRhLXJlc2l6ZSc6ICRpZCxcbiAgICAgICdhcmlhLWxhYmVsbGVkYnknOiB0aGlzLiRhbmNob3JbMF0uaWQgfHwgRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LCAnZGQtYW5jaG9yJylcbiAgICB9KTtcbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGN1cnJlbnQgb3JpZW50YXRpb24gb2YgZHJvcGRvd24gcGFuZS5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IHBvc2l0aW9uIC0gc3RyaW5nIHZhbHVlIG9mIGEgcG9zaXRpb24gY2xhc3MuXG4gICAqL1xuICBnZXRQb3NpdGlvbkNsYXNzKCkge1xuICAgIHZhciB2ZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy4kZWxlbWVudFswXS5jbGFzc05hbWUubWF0Y2goLyh0b3B8bGVmdHxyaWdodHxib3R0b20pL2cpO1xuICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbiA/IHZlcnRpY2FsUG9zaXRpb25bMF0gOiAnJztcbiAgICB2YXIgaG9yaXpvbnRhbFBvc2l0aW9uID0gL2Zsb2F0LShcXFMrKS8uZXhlYyh0aGlzLiRhbmNob3JbMF0uY2xhc3NOYW1lKTtcbiAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uID8gaG9yaXpvbnRhbFBvc2l0aW9uWzFdIDogJyc7XG4gICAgdmFyIHBvc2l0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uID8gaG9yaXpvbnRhbFBvc2l0aW9uICsgJyAnICsgdmVydGljYWxQb3NpdGlvbiA6IHZlcnRpY2FsUG9zaXRpb247XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgZHJvcGRvd24gcGFuZXMgb3JpZW50YXRpb24gYnkgYWRkaW5nL3JlbW92aW5nIHBvc2l0aW9uaW5nIGNsYXNzZXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcG9zaXRpb24gLSBwb3NpdGlvbiBjbGFzcyB0byByZW1vdmUuXG4gICAqL1xuICBfcmVwb3NpdGlvbihwb3NpdGlvbikge1xuICAgIHRoaXMudXNlZFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uID8gcG9zaXRpb24gOiAnYm90dG9tJyk
57637XG4gICAgLy9kZWZhdWx0LCB0cnkgc3dpdGNoaW5nIHRvIG9wcG9zaXRlIHNpZGVcbiAgICBpZighcG9zaXRpb24gJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCd0b3AnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ3RvcCcpO1xuICAgIH1lbHNlIGlmKHBvc2l0aW9uID09PSAndG9wJyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2JvdHRvbScpIDwgMCkpe1xuICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhwb3NpdGlvbik7XG4gICAgfWVsc2UgaWYocG9zaXRpb24gPT09ICdsZWZ0JyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ3JpZ2h0JykgPCAwKSl7XG4gICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHBvc2l0aW9uKVxuICAgICAgICAgIC5hZGRDbGFzcygncmlnaHQnKTtcbiAgICB9ZWxzZSBpZihwb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2xlZnQnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocG9zaXRpb24pXG4gICAgICAgICAgLmFkZENsYXNzKCdsZWZ0Jyk7XG4gICAgfVxuXG4gICAgLy9pZiBkZWZhdWx0IGNoYW5nZSBkaWRuJ3Qgd29yaywgdHJ5IGJvdHRvbSBvciBsZWZ0IGZpcnN0XG4gICAgZWxzZSBpZighcG9zaXRpb24gJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCd0b3AnKSA+IC0xKSAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2xlZnQnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2xlZnQnKTtcbiAgICB9ZWxzZSBpZihwb3NpdGlvbiA9PT0gJ3RvcCcgJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCdib3R0b20nKSA+IC0xKSAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2xlZnQnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocG9zaXRpb24pXG4gICAgICAgICAgLmFkZENsYXNzKCdsZWZ0Jyk7XG4gICAgfWVsc2UgaWYocG9zaXRpb24gPT09ICdsZWZ0JyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ3JpZ2h0JykgPiAtMSkgJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCdib3R0b20nKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocG9zaXRpb24pO1xuICAgIH1lbHNlIGlmKHBvc2l0aW9uID09PSAncmlnaHQnICYmICh0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZignbGVmdCcpID4gLTEpICYmICh0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZignYm90dG9tJykgPCAwKSl7XG4gICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHBvc2l0aW9uKTtcbiAgICB9XG4gICAgLy9pZiBub3RoaW5nIGNsZWFyZWQsIHNldCB0byBib3R0b21cbiAgICBlbHNle1xuICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhwb3NpdGlvbik7XG4gICAgfVxuICAgIHRoaXMuY2xhc3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNvdW50ZXItLTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgdGhlIGRyb3Bkb3duIHBhbmUsIGNoZWNrcyBmb3IgY29sbGlzaW9ucy5cbiAgICogUmVjdXJzaXZlbHkgY2FsbHMgaXRzZWxmIGlmIGEgY29sbGlzaW9uIGlzIGRldGVjdGVkLCB3aXRoIGEgbmV3IHBvc2l0aW9uIGNsYXNzLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRQb3NpdGlvbigpIHtcbiAgICBpZih0aGlzLiRhbmNob3IuYXR0cignYXJpYS1leHBhbmRlZCcpID09PSAnZmFsc2UnKXsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkNsYXNzKCksXG4gICAgICAgICRlbGVEaW1zID0gRm91bmRhdGlvbi5Cb3guR2V0RGltZW5zaW9ucyh0aGlzLiRlbGVtZW50KSxcbiAgICAgICAgJGFuY2hvckRpbXMgPSBGb3VuZGF0aW9uLkJveC5HZXREaW1lbnNpb25zKHRoaXMuJGFuY2hvciksXG4gICAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgICAgZGlyZWN0aW9uID0gKHBvc2l0aW9uID09PSAnbGVmdCcgPyAnbGVmdCcgOiAoKHBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdsZWZ0JyA6ICd0b3AnKSksXG4gICAgICAgIHBhcmFtID0gKGRpcmVjdGlvbiA9PT0gJ3RvcCcpID8gJ2hlaWdodCcgOiAnd2lkdGgnLFxuICAgICAgICBvZmZzZXQgPSAocGFyYW0gPT09ICdoZWlnaHQnKSA/IHRoaXMub3B0aW9ucy52T2Zmc2V0IDogdGhpcy5vcHRpb25zLmhPZmZzZXQ7XG5cbiAgICBpZigoJGVsZURpbXMud2lkdGggPj0gJGVsZURpbXMud2luZG93RGltcy53aWR0aCkgfHwgKCF0aGlzLmNvdW50ZXIgJiYgIUZvdW5kYXRpb24uQm94LkltTm90VG91Y2hpbmdZb3UodGhpcy4kZWxlbWVudCwgdGhpcy4kcGFyZW50KSkpe1xuICAgICAgdmFyIG5ld1dpZHRoID0gJGVsZURpbXMud2luZG93RGltcy53aWR0aCxcbiAgICAgICAgICBwYXJlbnRIT2Zmc2V0ID0gMDtcbiAgICAgIGlmKHRoaXMuJHBhcmVudCl7XG4gICAgICAgIHZhciAkcGFyZW50RGltcyA9IEZvdW5kYXRpb24uQm94LkdldERpbWVuc2lvbnModGhpcy4kcGFyZW50KSxcbiAgICAgICAgICAgIHBhcmVudEhPZmZzZXQgPSAkcGFyZW50RGltcy5vZmZzZXQubGVmdDtcbiAgICAgICAgaWYgKCRwYXJlbnREaW1zLndpZHRoIDwgbmV3V2lkdGgpe1xuICAgICAgICAgIG5ld1dpZHRoID0gJHBhcmVudERpbXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy4kZWxlbWVudC5vZmZzZXQoRm91bmRhdGlvbi5Cb3guR2V0T2Zmc2V0cyh0aGlzLiRlbGVtZW50LCB0aGlzLiRhbmNob3IsICdjZW50ZXIgYm90dG9tJywgdGhpcy5vcHRpb25zLnZPZmZzZXQsIHRoaXMub3B0aW9ucy5oT2Zmc2V0ICsgcGFyZW50SE9mZnNldCwgdHJ1ZSkpLmNzcyh7XG4gICAgICAgICd3aWR0aCc6IG5ld1dpZHRoIC0gKHRoaXMub3B0aW9ucy5oT2Zmc2V0ICogMiksXG4gICAgICAgICdoZWlnaHQnOiAnYXV0bydcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbGFzc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgI
5763HRoaXMuJGVsZW1lbnQub2Zmc2V0KEZvdW5kYXRpb24uQm94LkdldE9mZnNldHModGhpcy4kZWxlbWVudCwgdGhpcy4kYW5jaG9yLCBwb3NpdGlvbiwgdGhpcy5vcHRpb25zLnZPZmZzZXQsIHRoaXMub3B0aW9ucy5oT2Zmc2V0KSk7XG5cbiAgICB3aGlsZSghRm91bmRhdGlvbi5Cb3guSW1Ob3RUb3VjaGluZ1lvdSh0aGlzLiRlbGVtZW50LCB0aGlzLiRwYXJlbnQsIHRydWUpICYmIHRoaXMuY291bnRlcil7XG4gICAgICB0aGlzLl9yZXBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuX3NldFBvc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBlbGVtZW50IHV0aWxpemluZyB0aGUgdHJpZ2dlcnMgdXRpbGl0eSBsaWJyYXJ5LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB0aGlzLiRlbGVtZW50Lm9uKHtcbiAgICAgICdvcGVuLnpmLnRyaWdnZXInOiB0aGlzLm9wZW4uYmluZCh0aGlzKSxcbiAgICAgICdjbG9zZS56Zi50cmlnZ2VyJzogdGhpcy5jbG9zZS5iaW5kKHRoaXMpLFxuICAgICAgJ3RvZ2dsZS56Zi50cmlnZ2VyJzogdGhpcy50b2dnbGUuYmluZCh0aGlzKSxcbiAgICAgICdyZXNpemVtZS56Zi50cmlnZ2VyJzogdGhpcy5fc2V0UG9zaXRpb24uYmluZCh0aGlzKVxuICAgIH0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLmhvdmVyKXtcbiAgICAgIHRoaXMuJGFuY2hvci5vZmYoJ21vdXNlZW50ZXIuemYuZHJvcGRvd24gbW91c2VsZWF2ZS56Zi5kcm9wZG93bicpXG4gICAgICAub24oJ21vdXNlZW50ZXIuemYuZHJvcGRvd24nLCBmdW5jdGlvbigpe1xuICAgICAgICB2Y
5763XIgYm9keURhdGEgPSAkKCdib2R5JykuZGF0YSgpO1xuICAgICAgICBpZih0eXBlb2YoYm9keURhdGEud2hhdGlucHV0KSA9PT0gJ3VuZGVmaW5lZCcgfHwgYm9keURhdGEud2hhdGlucHV0ID09PSAnbW91c2UnKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLnRpbWVvdXQpO1xuICAgICAgICAgIF90aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBfdGhpcy5vcGVuKCk7XG4gICAgICAgICAgICBfdGhpcy4kYW5jaG9yLmRhdGEoJ2hvdmVyJywgdHJ1ZSk7XG4gICAgICAgICAgfSwgX3RoaXMub3B0aW9ucy5ob3ZlckRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgfSkub24oJ21vdXNlbGVhdmUuemYuZHJvcGRvd24nLCBmdW5jdGlvbigpe1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICAgIF90aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgICBfdGhpcy4kYW5jaG9yLmRhdGEoJ2hvdmVyJywgZmFsc2UpO1xuICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpO1xuICAgICAgfSk7XG4gICAgICBpZih0aGlzLm9wdGlvbnMuaG92ZXJQYW5lKXtcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vZmYoJ21vdXNlZW50ZXIuemYuZHJvcGRvd24gbW91c2VsZWF2ZS56Zi5kcm9wZG93bicpXG4gICAgICAgICAgICAub24oJ21vdXNlZW50ZXIuemYuZHJvcGRvd24nLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICAgICAgICB9KS5vbignbW91c2VsZWF2ZS56Zi5kcm9wZG93bicsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy50aW1lb3V0KTtcbiAgICAgICAgICAgICAgX3RoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIF90aGlzLiRhbmNob3IuZGF0YSgnaG92ZXInLCBmYWxzZSk7XG4gICAgICAgICAgICAgIH0sIF90aGlzLm9wdGlvbnMuaG92ZXJEZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4kYW5jaG9yLmFkZCh0aGlzLiRlbGVtZW50KS5vbigna2V5ZG93bi56Zi5kcm9wZG93bicsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgdmFyICR0YXJnZXQgPSAkKHRoaXMpLFxuICAgICAgICB2aXNpYmxlRm9jdXNhYmxlRWxlbWVudHMgPSBGb3VuZGF0aW9uLktleWJvYXJkLmZpbmRGb2N1c2FibGUoX3RoaXMuJGVsZW1lbnQpO1xuXG4gICAgICBGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLCAnRHJvcGRvd24nLCB7XG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICgkdGFyZ2V0LmlzKF90aGlzLiRhbmNob3IpKSB7XG4gICAgICAgICAgICBfdGhpcy5vcGVuKCk7XG4gICAgICAgICAgICBfdGhpcy4kZWxlbWVudC5hdHRyKCd0YWJpbmRleCcsIC0xKS5mb2N1cygpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICAgICAgX3RoaXMuJGFuY2hvci5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGJvZHkgdG8gY2xvc2UgYW55IGRyb3Bkb3ducyBvbiBhIGNsaWNrLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hZGRCb2R5SGFuZGxlcigpIHtcbiAgICAgdmFyICRib2R5ID0gJChkb2N1bWVudC5ib2R5KS5ub3QodGhpcy4kZWxlbWVudCksXG4gICAgICAgICBfdGhpcyA9IHRoaXM7XG4gICAgICRib2R5Lm9mZignY2xpY2suemYuZHJvcGRvd24nKVxuICAgICAgICAgIC5vbignY2xpY2suemYuZHJvcGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgIGlmKF90aGlzLiRhbmNob3IuaXMoZS50YXJnZXQpIHx8IF90aGlzLiRhbmNob3IuZmluZChlLnRhcmdldCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKF90aGlzLiRlbGVtZW50LmZpbmQoZS50YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgJGJvZHkub2ZmKCdjbGljay56Zi5kcm9wZG93bicpO1xuICAgICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBkcm9wZG93biBwYW5lLCBhbmQgZmlyZXMgYSBidWJibGluZyBldmVudCB0byBjbG9zZSBvdGhlciBkcm9wZG93bnMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJvcGRvd24jY2xvc2VtZVxuICAgKiBAZmlyZXMgRHJvcGRvd24jc2hvd1xuICAgKi9cbiAgb3BlbigpIHtcbiAgICAvLyB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHRvIGNsb3NlIG90aGVyIG9wZW4gZHJvcGRvd25zLCB0eXBpY2FsbHkgd2hlbiBkcm9wZG93biBpcyBvcGVuaW5nXG4gICAgICogQGV2ZW50IERyb3Bkb3duI2Nsb3NlbWVcbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2Nsb3NlbWUuemYuZHJvcGRvd24nLCB0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykpO1xuICAgIHRoaXMuJGFuY2hvci5hZGRDbGFzcygnaG92ZXInKVxuICAgICAgICAuYXR0cih7J2FyaWEtZXhwYW5kZWQnOiB0cnVlfSk7XG4gICAgLy8gdGhpcy4kZWxlbWVudC8qLnNob3coKSovO1xuICAgIHRoaXMuX3NldFBvc2l0aW9uKCk7XG4gICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnaXMtb3BlbicpXG4gICAgICAgIC5hdHRyKHsnYXJpYS1oaWRkZW4nOiBmYWxzZX0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLmF1dG9Gb2N1cyl7XG4gICAgICB2Y
5763XIgJGZvY3VzYWJsZSA9IEZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZSh0aGlzLiRlbGVtZW50KTtcbiAgICAgIGlmKCRmb2N1c2FibGUubGVuZ3RoKXtcbiAgICAgICAgJGZvY3VzYWJsZS5lcSgwKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2speyB0aGlzLl9hZGRCb2R5SGFuZGxlcigpOyB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRyYXBGb2N1cykge1xuICAgICAgRm91bmRhdGlvbi5LZXlib2FyZC50cmFwRm9jdXModGhpcy4kZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyZXMgb25jZSB0aGUgZHJvcGRvd24gaXMgdmlzaWJsZS5cbiAgICAgKiBAZXZlbnQgRHJvcGRvd24jc2hvd1xuICAgICAqL1xuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignc2hvdy56Zi5kcm9wZG93bicsIFt0aGlzLiRlbGVtZW50XSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvcGVuIGRyb3Bkb3duIHBhbmUuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJvcGRvd24jaGlkZVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYoIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2lzLW9wZW4nKSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2lzLW9wZW4nKVxuICAgICAgICAuYXR0cih7J2FyaWEtaGlkZGVuJzogdHJ1ZX0pO1xuXG4gICAgdGhpcy4kYW5jaG9yLnJlbW92ZUNsYXNzKCdob3ZlcicpXG4gICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuXG4gICAgaWYodGhpcy5jbGFzc0NoYW5nZWQpe1xuICAgICAgdmFyIGN1clBvc2l0aW9uQ2xhc3MgPSB0aGlzLmdldFBvc2l0aW9uQ2xhc3MoKTtcbiAgICAgIGlmKGN1clBvc2l0aW9uQ2xhc3Mpe1xuICAgICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKGN1clBvc2l0aW9uQ2xhc3MpO1xuICAgICAgfVxuICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMucG9zaXRpb25DbGFzcylcbiAgICAgICAgICAvKi5oaWRlKCkqLy5jc3Moe2hlaWdodDogJycsIHdpZHRoOiAnJ30pO1xuICAgICAgdGhpcy5jbGFzc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY291bnRlciA9IDQ7XG4gICAgICB0aGlzLnVzZWRQb3NpdGlvbnMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmlyZXMgb25jZSB0aGUgZHJvcGRvd24gaXMgbm8gbG9uZ2VyIHZpc2libGUuXG4gICAgICogQGV2ZW50IERyb3Bkb3duI2hpZGVcbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2hpZGUuemYuZHJvcGRvd24nLCBbdGhpcy4kZWxlbWVudF0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50cmFwRm9jdXMpIHtcbiAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQucmVsZWFzZUZvY3VzKHRoaXMuJGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBkcm9wZG93biBwYW5lJ3MgdmlzaWJpbGl0eS5cbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICB0b2dnbGUoKSB7XG4gICAgaWYodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaXMtb3BlbicpKXtcbiAgICAgIGlmKHRoaXMuJGFuY2hvci5kYXRhKCdob3ZlcicpKSByZXR1cm47XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIGRyb3Bkb3duLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi50cmlnZ2VyJykuaGlkZSgpO1xuICAgIHRoaXMuJGFuY2hvci5vZmYoJy56Zi5kcm9wZG93bicpO1xuXG4gICAgRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpO1xuICB9XG59XG5cbkRyb3Bkb3duLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogQ2xhc3MgdGhhdCBkZXNpZ25hdGVzIGJvdW5kaW5nIGNvbnRhaW5lciBvZiBEcm9wZG93biAoZGVmYXVsdDogd2luZG93KVxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHs/c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBwYXJlbnRDbGFzczogbnVsbCxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IG9wZW5pbmcgYSBzdWJtZW51IG9uIGhvdmVyIGV2ZW50LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDI1MFxuICAgKi9cbiAgaG92ZXJEZWxheTogMjUwLFxuICAvKipcbiAgICogQWxsb3cgc3VibWVudXMgdG8gb3BlbiBvbiBob3ZlciBldmVudHNcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGhvdmVyOiBmYWxzZSxcbiAgLyoqXG4gICAqIERvbid0IGNsb3NlIGRyb3Bkb3duIHdoZW4gaG92ZXJpbmcgb3ZlciBkcm9wZG93biBwYW5lXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBob3ZlclBhbmU6IGZhbHNlLFxuICAvKipcbiAgICogTnVtYmVyIG9mIHBpeGVscyBiZXR3ZWVuIHRoZSBkcm9wZG93biBwYW5lIGFuZCB0aGUgdHJpZ2dlcmluZyBlbGVtZW50IG9uIG9wZW4uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgdk9mZnNldDogMSxcbiAgLyoqXG4gICAqIE51bWJlciBvZiBwaXhlbHMgYmV0d2VlbiB0aGUgZHJvcGRvd24gcGFuZSBhbmQgdGhlIHRyaWdnZXJpbmcgZWxlbWVudCBvbiBvcGVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIGhPZmZzZXQ6IDEsXG4gIC8qKlxuICAgKiBDbGFzcyBhcHBsaWVkIHRvIGFkanVzdCBvcGVuIHBvc2l0aW9uLiBKUyB3aWxsIHRlc3QgYW5kIGZpbGwgdGhpcyBpbi5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgcG9zaXRpb25DbGFzczogJycsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgcGx1Z2luIHRvIHRyYXAgZm9jdXMgdG8gdGhlIGRyb3Bkb3duI
5763HBhbmUgaWYgb3BlbmVkIHdpdGgga2V5Ym9hcmQgY29tbWFuZHMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0cmFwRm9jdXM6IGZhbHNlLFxuICAvKipcbiAgICogQWxsb3cgdGhlIHBsdWdpbiB0byBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IHdpdGhpbiB0aGUgcGFuZSwgcmVnYXJkbGVzcyBvZiBtZXRob2Qgb2Ygb3BlbmluZy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGF1dG9Gb2N1czogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBjbGljayBvbiB0aGUgYm9keSB0byBjbG9zZSB0aGUgZHJvcGRvd24uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2s6IGZhbHNlXG59XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihEcm9wZG93biwgJ0Ryb3Bkb3duJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBEcm9wZG93bk1lbnUgbW9kdWxlLlxuICogQG1vZHVsZSBmb3VuZGF0aW9uLmRyb3Bkb3duLW1lbnVcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwuYm94XG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm5lc3RcbiAqL1xuXG5jbGFzcyBEcm9wZG93bk1lbnUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBEcm9wZG93bk1lbnUuXG4gICAqIEBjbGFzc1xuICAgKiBAZmlyZXMgRHJvcGRvd25NZW51I2luaXRcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhIGRyb3Bkb3duIG1lbnUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgRHJvcGRvd25NZW51LmRlZmF1bHRzLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG5cbiAgICBGb3VuZGF0aW9uLk5lc3QuRmVhdGhlcih0aGlzLiRlbGVtZW50LCAnZHJvcGRvd24nKTtcbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICBGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsICdEcm9wZG93bk1lbnUnKTtcbiAgICBGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKCdEcm9wZG93bk1lbnUnLCB7XG4gICAgICAnRU5URVInOiAnb3BlbicsXG4gICAgICAnU1BBQ0UnOiAnb3BlbicsXG4gICAgICAnQVJST1dfUklHSFQnOiAnbmV4dCcsXG4gICAgICAnQVJST1dfVVAnOiAndXAnLFxuICAgICAgJ0FSUk9XX0RPV04nOiAnZG93bicsXG4gICAgICAnQVJST1dfTEVGVCc6ICdwcmV2aW91cycsXG4gICAgICAnRVNDQVBFJzogJ2Nsb3NlJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4sIGFuZCBjYWxscyBfcHJlcGFyZU1lbnVcbiAgICogQHByaXZhdGVcbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICBfaW5pdCgpIHtcbiAgICB2YXIgc3VicyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKTtcbiAgICB0aGlzLiRlbGVtZW50LmNoaWxkcmVuKCcuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5jaGlsZHJlbignLmlzLWRyb3Bkb3duLXN1Ym1lbnUnKS5hZGRDbGFzcygnZmlyc3Qtc3ViJyk7XG5cbiAgICB0aGlzLiRtZW51SXRlbXMgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ1tyb2xlPVwibWVudWl0ZW1cIl0nKTtcbiAgICB0aGlzLiR0YWJzID0gdGhpcy4kZWxlbWVudC5jaGlsZHJlbignW3JvbGU9XCJtZW51aXRlbVwiXScpO1xuICAgIHRoaXMuJHRhYnMuZmluZCgndWwuaXMtZHJvcGRvd24tc3VibWVudScpLmFkZENsYXNzKHRoaXMub3B0aW9ucy52ZXJ0aWNhbENsYXNzKTtcblxuICAgIGlmICh0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKHRoaXMub3B0aW9ucy5yaWdodENsYXNzKSB8fCB0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSAncmlnaHQnIHx8IEZvdW5kYXRpb24ucnRsKCkgfHwgdGhpcy4kZWxlbWVudC5wYXJlbnRzKCcudG9wLWJhci1yaWdodCcpLmlzKCcqJykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5hbGlnbm1lbnQgPSAncmlnaHQnO1xuICAgICAgc3Vicy5hZGRDbGFzcygnb3BlbnMtbGVmdCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJzLmFkZENsYXNzKCdvcGVucy1yaWdodCcpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfTtcblxuICBfaXNWZXJ0aWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy4kdGFicy5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50cyB3aXRoaW4gdGhlIG1lbnVcbiAgICogQHByaXZhdGVcbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGhhc1RvdWNoID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8ICh0eXBlb2Ygd2luZG93Lm9udG91Y2hzdGFydCAhPT0gJ3VuZGVmaW5lZCcpLFxuICAgICAgICBwYXJDbGFzcyA9ICdpcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCc7XG5cbiAgICAvLyB1c2VkIGZvciBvbkNsaWNrIGFuZCBpbiB0aGUga2V5Ym9hcmQgaGFuZGxlcnNcbiAgICB2YXIgaGFuZGxlQ2xpY2tGbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciAkZWxlbSA9ICQoZS50YXJnZXQpLnBhcmVudHNVbnRpbCgndWwnLCBgLiR7cGFyQ2xhc3N9YCksXG4gICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpLFxuICAgICAgICAgIGhhc0NsaWNrZWQgPSAkZWxlbS5hdHRyKCdkYXRhLWlzLWNsaWNrJykgPT09ICd0cnVlJyxcbiAgICAgICAgICAkc3ViID0gJGVsZW0uY2hpbGRyZW4oJy5pcy1kcm9wZG93bi1zdWJtZW51Jyk7XG5cbiAgICAgIGlmIChoYXNTdWIpIHtcbiAgICAgICAgaWYgKGhhc0NsaWNrZWQpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrIHx8ICghX3RoaXMub3B0aW9ucy5jbGlja09wZW4gJiYgIWhhc1RvdWNoKSB8fCAoX3RoaXMub3B0aW9ucy5mb3JjZUZvbGxvdyAmJiBoYXNUb3VjaCkpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgX3RoaXMuX2hpZGUoJGVsZW0pO1xuICAgICAgICAgI
5763H1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBfdGhpcy5fc2hvdygkc3ViKTtcbiAgICAgICAgICAkZWxlbS5hZGQoJGVsZW0ucGFyZW50c1VudGlsKF90aGlzLiRlbGVtZW50LCBgLiR7cGFyQ2xhc3N9YCkpLmF0dHIoJ2RhdGEtaXMtY2xpY2snLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsaWNrT3BlbiB8fCBoYXNUb3VjaCkge1xuICAgICAgdGhpcy4kbWVudUl0ZW1zLm9uKCdjbGljay56Zi5kcm9wZG93bm1lbnUgdG91Y2hzdGFydC56Zi5kcm9wZG93bm1lbnUnLCBoYW5kbGVDbGlja0ZuKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgTGVhZiBlbGVtZW50IENsaWNrc1xuICAgIGlmKF90aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrSW5zaWRlKXtcbiAgICAgIHRoaXMuJG1lbnVJdGVtcy5vbignY2xpY2suemYuZHJvcGRvd25tZW51JywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgJGVsZW0gPSAkKHRoaXMpLFxuICAgICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpO1xuICAgICAgICBpZighaGFzU3ViKXtcbiAgICAgICAgICBfdGhpcy5faGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlSG92ZXIpIHtcbiAgICAgIHRoaXMuJG1lbnVJdGVtcy5vbignbW91c2VlbnRlci56Zi5kcm9wZG93bm1lbnUnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciAkZWxlbSA9ICQodGhpcyksXG4gICAgICAgICAgICBoYXNTdWIgPSAkZWxlbS5oYXNDbGFzcyhwYXJDbGFzcyk7XG5cbiAgICAgICAgaWYgKGhhc1N1Yikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCgkZWxlbS5kYXRhKCdfZGVsYXknKSk7XG4gICAgICAgICAgJGVsZW0uZGF0YSgnX2RlbGF5Jywgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIF90aGlzLl9zaG93KCRlbGVtLmNoaWxkcmVuKCcuaXMtZHJvcGRvd24tc3VibWVudScpKTtcbiAgICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfSkub24oJ21vdXNlbGVhdmUuemYuZHJvcGRvd25tZW51JywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2Y
5763XIgJGVsZW0gPSAkKHRoaXMpLFxuICAgICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpO1xuICAgICAgICBpZiAoaGFzU3ViICYmIF90aGlzLm9wdGlvbnMuYXV0b2Nsb3NlKSB7XG4gICAgICAgICAgaWYgKCRlbGVtLmF0dHIoJ2RhdGEtaXMtY2xpY2snKSA9PT0gJ3RydWUnICYmIF90aGlzLm9wdGlvbnMuY2xpY2tPcGVuKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KCRlbGVtLmRhdGEoJ19kZWxheScpKTtcbiAgICAgICAgICAkZWxlbS5kYXRhKCdfZGVsYXknLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgX3RoaXMuX2hpZGUoJGVsZW0pO1xuICAgICAgICAgIH0sIF90aGlzLm9wdGlvbnMuY2xvc2luZ1RpbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuJG1lbnVJdGVtcy5vbigna2V5ZG93bi56Zi5kcm9wZG93bm1lbnUnLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgJGVsZW1lbnQgPSAkKGUudGFyZ2V0KS5wYXJlbnRzVW50aWwoJ3VsJywgJ1tyb2xlPVwibWVudWl0ZW1cIl0nKSxcbiAgICAgICAgICBpc1RhYiA9IF90aGlzLiR0YWJzLmluZGV4KCRlbGVtZW50KSA+IC0xLFxuICAgICAgICAgICRlbGVtZW50cyA9IGlzVGFiID8gX3RoaXMuJHRhYnMgOiAkZWxlbWVudC5zaWJsaW5ncygnbGknKS5hZGQoJGVsZW1lbnQpLFxuICAgICAgICAgICRwcmV2RWxlbWVudCxcbiAgICAgICAgICAkbmV4dEVsZW1lbnQ7XG5cbiAgICAgICRlbGVtZW50cy5lYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgaWYgKCQodGhpcykuaXMoJGVsZW1lbnQpKSB7XG4gICAgICAgICAgJHByZXZFbGVtZW50ID0gJGVsZW1lbnRzLmVxKGktMSk7XG4gICAgICAgICAgJG5leHRFbGVtZW50ID0gJGVsZW1lbnRzLmVxKGkrMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIG5leHRTaWJsaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghJGVsZW1lbnQuaXMoJzpsYXN0LWNoaWxkJykpIHtcbiAgICAgICAgICAkbmV4dEVsZW1lbnQuY2hpbGRyZW4oJ2E6Zmlyc3QnKS5mb2N1cygpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSwgcHJldlNpYmxpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgJHByZXZFbGVtZW50LmNoaWxkcmVuKCdhOmZpcnN0JykuZm9jdXMoKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwgb3BlblN1YiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2Y
5763XIgJHN1YiA9ICRlbGVtZW50LmNoaWxkcmVuKCd1bC5pcy1kcm9wZG93bi1zdWJtZW51Jyk7XG4gICAgICAgIGlmICgkc3ViLmxlbmd0aCkge1xuICAgICAgICAgIF90aGlzLl9zaG93KCRzdWIpO1xuICAgICAgICAgICRlbGVtZW50LmZpbmQoJ2xpID4gYTpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgeyByZXR1cm47IH1cbiAgICAgIH0sIGNsb3NlU3ViID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vaWYgKCRlbGVtZW50LmlzKCc6Zmlyc3QtY2hpbGQnKSkge1xuICAgICAgICB2YXIgY2xvc2UgPSAkZWxlbWVudC5wYXJlbnQoJ3VsJykucGFyZW50KCdsaScpO1xuICAgICAgICBjbG9zZS5jaGlsZHJlbignYTpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgIF90aGlzLl9oaWRlKGNsb3NlKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvL31cbiAgICAgIH07XG4gICAgICB2YXIgZnVuY3Rpb25zID0ge1xuICAgICAgICBvcGVuOiBvcGVuU3ViLFxuICAgICAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgX3RoaXMuX2hpZGUoX3RoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgIF90aGlzLiRtZW51SXRlbXMuZmluZCgnYTpmaXJzdCcpLmZvY3VzKCk7IC8vIGZvY3VzIHRvIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChpc1RhYikge1xuICAgICAgICBpZiAoX3RoaXMuX2lzVmVydGljYWwoKSkgeyAvLyB2ZXJ0aWNhbCBtZW51XG4gICAgICAgICAgaWYgKEZvdW5kYXRpb24ucnRsKCkpIHsgLy8gcmlnaHQgYWxpZ25lZFxuICAgICAgICAgICAgJC5leHRlbmQoZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgIGRvd246IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICB1cDogcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgIG5leHQ6IGNsb3NlU3ViLFxuICAgICAgICAgICAgICBwcmV2aW91czogb3BlblN1YlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gbGVmdCBhbGlnbmVkXG4gICAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgICAgZG93bjogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgIHVwOiBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgbmV4dDogb3BlblN1YixcbiAgICAgICAgICAgICAgcHJldmlvdXM6IGNsb3NlU3ViXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vIGhvcml6b250YWwgbWVudVxuICAgICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCgpKSB7IC8vIHJpZ2h0IGFsaWduZWRcbiAgICAgICAgICAgICQuZXh0ZW5kKGZ1bmN0aW9ucywge1xuICAgICAgICAgICAgICBuZXh0OiBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgcHJldmlvdXM6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICBkb3duOiBvcGVuU3ViLFxuICAgICAgICAgICAgICB1cDogY2xvc2VTdWJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIGxlZnQgYWxpZ25lZFxuICAgICAgICAgICAgJC5leHRlbmQoZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgIG5leHQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICBwcmV2aW91czogcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgIGRvd246IG9wZW5TdWIsXG4gICAgICAgICAgICAgIHVwOiBjbG9zZVN1YlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyBub3QgdGFicyAtPiBvbmUgc3ViXG4gICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCgpKSB7IC8vIHJpZ2h0IGFsaWduZWRcbiAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgIG5leHQ6IGNsb3NlU3ViLFxuICAgICAgICAgICAgcHJldmlvdXM6IG9wZW5TdWIsXG4gICAgICAgICAgICBkb3duOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgIHVwOiBwcmV2U2libGluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IGFsaWduZWRcbiAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgIG5leHQ6IG9wZW5TdWIsXG4gICAgICAgICAgICBwcmV2aW91czogY2xvc2VTdWIsXG4gICAgICAgICAgICBkb3duOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgIHVwOiBwcmV2U2libGluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLCAnRHJvcGRvd25NZW51JywgZnVuY3Rpb25zKTtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgYm9keSB0byBjbG9zZSBhbnkgZHJvcGRvd25zIG9uIGEgY2xpY2suXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FkZEJvZHlIYW5kbGVyKCkge1xuICAgIHZhciAkYm9keSA9ICQoZG9jdW1lbnQuYm9keSksXG4gICAgICAgIF90aGlzID0gdGhpcztcbiAgICAkYm9keS5vZmYoJ21vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudScpXG4gICAgICAgICAub24oJ21vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgdmFyICRsaW5rID0gX3RoaXMuJGVsZW1lbnQuZmluZChlLnRhcmdldCk7XG4gICAgICAgICAgIGlmICgkbGluay5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgX3RoaXMuX2hpZGUoKTtcbiAgICAgICAgICAgJGJvZHkub2ZmKCdtb3VzZXVwLnpmLmRyb3Bkb3dubWVudSB0b3VjaGVuZC56Zi5kcm9wZG93bm1lbnUnKTtcbiAgICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZHJvcGRvd24gcGFuZSwgYW5kIGNoZWNrcyBmb3IgY29sbGlzaW9ucyBmaXJzdC5cbiAgICogQHBhcmFtIHtqUXVlcnl9ICRzdWIgLSB1bCBlbGVtZW50IHRoYXQgaXMgYSBzdWJtZW51IHRvIHNob3dcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqIEBmaXJlcyBEcm9wZG93bk1lbnUjc2hvd1xuICAgKi9cbiAgX3Nob3coJHN1Yikge1xuICAgIHZhciBpZHggPSB0aGlzLiR0YWJzLmluZGV4KHRoaXMuJHRhYnMuZmlsdGVyKGZ1bmN0aW9uKGksIGVsKSB7XG4gICAgICByZXR1cm4gJChlbCkuZmluZCgkc3ViKS5sZW5ndGggPiAwO1xuICAgIH0pKTtcbiAgICB2YXIgJHNpYnMgPSAkc3ViLnBhcmVudCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5zaWJsaW5ncygnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKTtcbiAgICB0aGlzLl9oaWRlKCRzaWJzLCBpZHgpO1xuICAgICRzdWIuY3NzKCd2aXN
5763pYmlsaXR5JywgJ2hpZGRlbicpLmFkZENsYXNzKCdqcy1kcm9wZG93bi1hY3RpdmUnKVxuICAgICAgICAucGFyZW50KCdsaS5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCcpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICB2YXIgY2xlYXIgPSBGb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KCRzdWIsIG51bGwsIHRydWUpO1xuICAgIGlmICghY2xlYXIpIHtcbiAgICAgIHZhciBvbGRDbGFzcyA9IHRoaXMub3B0aW9ucy5hbGlnbm1lbnQgPT09ICdsZWZ0JyA/ICctcmlnaHQnIDogJy1sZWZ0JyxcbiAgICAgICAgICAkcGFyZW50TGkgPSAkc3ViLnBhcmVudCgnLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50Jyk7XG4gICAgICAkcGFyZW50TGkucmVtb3ZlQ2xhc3MoYG9wZW5zJHtvbGRDbGFzc31gKS5hZGRDbGFzcyhgb3BlbnMtJHt0aGlzLm9wdGlvbnMuYWxpZ25tZW50fWApO1xuICAgICAgY2xlYXIgPSBGb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KCRzdWIsIG51bGwsIHRydWUpO1xuICAgICAgaWYgKCFjbGVhcikge1xuICAgICAgICAkcGFyZW50TGkucmVtb3ZlQ2xhc3MoYG9wZW5zLSR7dGhpcy5vcHRpb25zLmFsaWdubWVudH1gKS5hZGRDbGFzcygnb3BlbnMtaW5uZXInKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgICRzdWIuY3NzKCd2aXNpYmlsaXR5JywgJycpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKSB7IHRoaXMuX2FkZEJvZHlIYW5kbGVyKCk7IH1cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBuZXcgZHJvcGRvd24gcGFuZSBpcyB2aXNpYmxlLlxuICAgICAqIEBldmVudCBEcm9wZG93bk1lbnUjc2hvd1xuICAgICAqL1xuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignc2hvdy56Zi5kcm9wZG93bm1lbnUnLCBbJHN1Yl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGEgc2luZ2xlLCBjdXJyZW50bHkgb3BlbiBkcm9wZG93biBwYW5lLCBpZiBwYXNzZWQgYSBwYXJhbWV0ZXIsIG90aGVyd2lzZSwgaGlkZXMgZXZlcnl0aGluZy5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbSAtIGVsZW1lbnQgd2l0aCBhIHN1Ym1lbnUgdG8gaGlkZVxuICAgKiBAcGFyYW0ge051bWJlcn0gaWR4IC0gaW5kZXggb2YgdGhlICR0YWJzIGNvbGxlY3Rpb24gdG8gaGlkZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hpZGUoJGVsZW0sIGlkeCkge1xuICAgIHZhciAkdG9DbG9zZTtcbiAgICBpZiAoJGVsZW0gJiYgJGVsZW0ubGVuZ3RoKSB7XG4gICAgICAkdG9DbG9zZSA9ICRlbGVtO1xuICAgIH0gZWxzZSBpZiAoaWR4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICR0b0Nsb3NlID0gdGhpcy4kdGFicy5ub3QoZnVuY3Rpb24oaSwgZWwpIHtcbiAgICAgICAgcmV0dXJuIGkgPT09IGlkeDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICR0b0Nsb3NlID0gdGhpcy4kZWxlbWVudDtcbiAgICB9XG4gICAgdmFyIHNvbWV0aGluZ1RvQ2xvc2UgPSAkdG9DbG9zZS5oYXNDbGFzcygnaXMtYWN0aXZlJykgfHwgJHRvQ2xvc2UuZmluZCgnLmlzLWFjdGl2ZScpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc29tZXRoaW5nVG9DbG9zZSkge1xuICAgICAgJHRvQ2xvc2UuZmluZCgnbGkuaXMtYWN0aXZlJykuYWRkKCR0b0Nsb3NlKS5hdHRyKHtcbiAgICAgICAgJ2RhdGEtaXMtY2xpY2snOiBmYWxzZVxuICAgICAgfSkucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAkdG9DbG9zZS5maW5kKCd1bC5qcy1kcm9wZG93bi1hY3RpdmUnKS5yZW1vdmVDbGFzcygnanMtZHJvcGRvd24tYWN0aXZlJyk7XG5cbiAgICAgIGlmICh0aGlzLmNoYW5nZWQgfHwgJHRvQ2xvc2UuZmluZCgnb3BlbnMtaW5uZXInKS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG9sZENsYXNzID0gdGhpcy5vcHRpb25zLmFsaWdubWVudCA9PT0gJ2xlZnQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICAgICAgJHRvQ2xvc2UuZmluZCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5hZGQoJHRvQ2xvc2UpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKGBvcGVucy1pbm5lciBvcGVucy0ke3RoaXMub3B0aW9ucy5hbGlnbm1lbnR9YClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoYG9wZW5zLSR7b2xkQ2xhc3N9YCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBGaXJlcyB3aGVuIHRoZSBvcGVuIG1lbnVzIGFyZSBjbG9zZWQuXG4gICAgICAgKiBAZXZlbnQgRHJvcGRvd25NZW51I2hpZGVcbiAgICAgICAqL1xuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdoaWRlLnpmLmRyb3Bkb3dubWVudScsIFskdG9DbG9zZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kbWVudUl0ZW1zLm9mZignLnpmLmRyb3Bkb3dubWVudScpLnJlbW92ZUF0dHIoJ2RhdGEtaXMtY2xpY2snKVxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLXJpZ2h0LWFycm93IGlzLWxlZnQtYXJyb3cgaXMtZG93bi1hcnJvdyBvcGVucy1yaWdodCBvcGVucy1sZWZ0IG9wZW5zLWlubmVyJyk7XG4gICAgJChkb2N1bWVudC5ib2R5KS5vZmYoJy56Zi5kcm9wZG93bm1lbnUnKTtcbiAgICBGb3VuZGF0aW9uLk5lc3QuQnVybih0aGlzLiRlbGVtZW50LCAnZHJvcGRvd24nKTtcbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNldHRpbmdzIGZvciBwbHVnaW5cbiAqL1xuRHJvcGRvd25NZW51LmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogRGlzYWxsb3dzIGhvdmVyIGV2ZW50cyBmcm9tIG9wZW5pbmcgc3VibWVudXNcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRpc2FibGVIb3ZlcjogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyBhIHN1Ym1lbnUgdG8gYXV0b21hdGljYWxseSBjbG9zZSBvbiBhIG1vdXNlbGVhdmUgZXZlbnQsIGlmIG5vdCBjbGlja2VkIG9wZW4uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGF1dG9jbG9zZTogdHJ1ZSxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIH
5763RvIGRlbGF5IG9wZW5pbmcgYSBzdWJtZW51IG9uIGhvdmVyIGV2ZW50LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDUwXG4gICAqL1xuICBob3ZlckRlbGF5OiA1MCxcbiAgLyoqXG4gICAqIEFsbG93IGEgc3VibWVudSB0byBvcGVuL3JlbWFpbiBvcGVuIG9uIHBhcmVudCBjbGljayBldmVudC4gQWxsb3dzIGN1cnNvciB0byBtb3ZlIGF3YXkgZnJvbSBtZW51LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY2xpY2tPcGVuOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IGNsb3NpbmcgYSBzdWJtZW51IG9uIGEgbW91c2VsZWF2ZSBldmVudC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG5cbiAgY2xvc2luZ1RpbWU6IDUwMCxcbiAgLyoqXG4gICAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHdoYXQgZGlyZWN0aW9uIHRoZSBzdWJtZW51cyBzaG91bGQgb3Blbi4gSGFuZGxlZCBieSBKUy4gQ2FuIGJlIGAnbGVmdCdgIG9yIGAncmlnaHQnYC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICovXG4gIGFsaWdubWVudDogJ2xlZnQnLFxuICAvKipcbiAgICogQWxsb3cgY2xpY2tzIG9uIHRoZSBib2R5IHRvIGNsb3NlIGFueSBvcGVuIHN1Ym1lbnVzLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2s6IHRydWUsXG4gIC8qKlxuICAgKiBBbGxvdyBjbGlja3Mgb24gbGVhZiBhbmNob3IgbGlua3MgdG8gY2xvc2UgYW55IG9wZW4gc3VibWVudXMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGNsb3NlT25DbGlja0luc2lkZTogdHJ1ZSxcbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gdmVydGljYWwgb3JpZW50ZWQgbWVudXMsIEZvdW5kYXRpb24gZGVmYXVsdCBpcyBgdmVydGljYWxgLiBVcGRhdGUgdGhpcyBpZiB1c2luZyB5b3VyIG93biBjbGFzcy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAndmVydGljYWwnXG4gICAqL1xuICB2ZXJ0aWNhbENsYXNzOiAndmVydGljYWwnLFxuICAvKipcbiAgICogQ2xhc3MgYXBwbGllZCB0byByaWdodC1zaWRlIG9yaWVudGVkIG1lbnVzLCBGb3VuZGF0aW9uIGRlZmF1bHQgaXMgYGFsaWduLXJpZ2h0YC4gVXBkYXRlIHRoaXMgaWYgdXNpbmcgeW91ciBvd24gY2xhc3MuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2FsaWduLXJpZ2h0J1xuICAgKi9cbiAgcmlnaHRDbGFzczogJ2FsaWduLXJpZ2h0JyxcbiAgLyoqXG4gICAqIEJvb2xlYW4gdG8gZm9yY2Ugb3ZlcmlkZSB0aGUgY2xpY2tpbmcgb2YgbGlua3MgdG8gcGVyZm9ybSBkZWZhdWx0IGFjdGlvbiwgb24gc2Vjb25kIHRvdWNoIGV2ZW50IGZvciBtb2JpbGUuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGZvcmNlRm9sbG93OiB0cnVlXG59O1xuXG4vLyBXaW5kb3cgZXhwb3J0c1xuRm91bmRhdGlvbi5wbHVnaW4oRHJvcGRvd25NZW51LCAnRHJvcGRvd25NZW51Jyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBSZXNwb25zaXZlTWVudSBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmVzcG9uc2l2ZU1lbnVcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnNcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwubWVkaWFRdWVyeVxuICovXG5cbmNsYXNzIFJlc3BvbnNpdmVNZW51IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZXNwb25zaXZlIG1lbnUuXG4gICAqIEBjbGFzc1xuICAgKiBAZmlyZXMgUmVzcG9uc2l2ZU1lbnUjaW5pdFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIGEgZHJvcGRvd24gbWVudS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIHRoaXMucnVsZXMgPSB0aGlzLiRlbGVtZW50LmRhdGEoJ3Jlc3BvbnNpdmUtbWVudScpO1xuICAgIHRoaXMuY3VycmVudE1xID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRQbHVnaW4gPSBudWxsO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX2V2ZW50cygpO1xuXG4gICAgRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLCAnUmVzcG9uc2l2ZU1lbnUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgTWVudSBieSBwYXJzaW5nIHRoZSBjbGFzc2VzIGZyb20gdGhlICdkYXRhLVJlc3BvbnNpdmVNZW51JyBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgLy8gVGhlIGZpcnN0IHRpbWUgYW4gSW50ZXJjaGFuZ2UgcGx1Z2luIGlzIGluaXRpYWxpemVkLCB0aGlzLnJ1bGVzIGlzIGNvbnZlcnRlZCBmcm9tIGEgc3RyaW5nIG9mIFwiY2xhc3Nlc1wiIHRvIGFuIG9iamVjdCBvZiBydWxlc1xuICAgIGlmICh0eXBlb2YgdGhpcy5ydWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBydWxlc1RyZWUgPSB7fTtcblxuICAgICAgLy8gUGFyc2UgcnVsZXMgZnJvbSBcImNsYXNzZXNcIiBwdWxsZWQgZnJvbSBkYXRhIGF0dHJpYnV0ZVxuICAgICAgbGV0IHJ1bGVzID0gdGhpcy5ydWxlcy5zcGxpdCgnICcpO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggZXZlcnkgcnVsZSBmb3VuZFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzW2ldLnNwbGl0KCctJyk7XG4gICAgICAgIGxldCBydWxlU2l6ZSA9IHJ1bGUubGVuZ3RoID4gMSA/IHJ1bGVbMF0gOiAnc21hbGwnO1xuICAgICAgICBsZXQgcnVsZVBsdWdpbiA9IHJ1bGUubGVuZ3RoID4gMSA/IHJ1bGVbMV0gOiBydWxlWzBdO1xuXG4gICAgICAgIGlmIChNZW51UGx1Z2luc1tydWxlUGx1Z2luXSAhPT0gbnVsbCkge1xuICAgICAgICAgI
5763HJ1bGVzVHJlZVtydWxlU2l6ZV0gPSBNZW51UGx1Z2luc1tydWxlUGx1Z2luXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJ1bGVzID0gcnVsZXNUcmVlO1xuICAgIH1cblxuICAgIGlmICghJC5pc0VtcHR5T2JqZWN0KHRoaXMucnVsZXMpKSB7XG4gICAgICB0aGlzLl9jaGVja01lZGlhUXVlcmllcygpO1xuICAgIH1cbiAgICAvLyBBZGQgZGF0YS1tdXRhdGUgc2luY2UgY2hpbGRyZW4gbWF5IG5lZWQgaXQuXG4gICAgdGhpcy4kZWxlbWVudC5hdHRyKCdkYXRhLW11dGF0ZScsICh0aGlzLiRlbGVtZW50LmF0dHIoJ2RhdGEtbXV0YXRlJykgfHwgRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LCAncmVzcG9uc2l2ZS1tZW51JykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudHMgZm9yIHRoZSBNZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICQod2luZG93KS5vbignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fY2hlY2tNZWRpYVF1ZXJpZXMoKTtcbiAgICB9KTtcbiAgICAvLyAkKHdpbmRvdykub24oJ3Jlc2l6ZS56Zi5SZXNwb25zaXZlTWVudScsIGZ1bmN0aW9uKCkge1xuICAgIC8vICAgX3RoaXMuX2NoZWNrTWVkaWFRdWVyaWVzKCk7XG4gICAgLy8gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBjdXJyZW50IHNjcmVlbiB3aWR0aCBhZ2FpbnN0IGF2YWlsYWJsZSBtZWRpYSBxdWVyaWVzLiBJZiB0aGUgbWVkaWEgcXVlcnkgaGFzIGNoYW5nZWQsIGFuZCB0aGUgcGx1Z2luIG5lZWRlZCBoYXMgY2hhbmdlZCwgdGhlIHBsdWdpbnMgd2lsbCBzd2FwIG91dC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tNZWRpYVF1ZXJpZXMoKSB7XG4gICAgdmFyIG1hdGNoZWRNcSwgX3RoaXMgPSB0aGlzO1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJ1bGUgYW5kIGZpbmQgdGhlIGxhc3QgbWF0Y2hpbmcgcnVsZVxuICAgICQuZWFjaCh0aGlzLnJ1bGVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIGlmIChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdChrZXkpKSB7XG4gICAgICAgIG1hdGNoZWRNcSA9IGtleTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE5vIG1hdGNoPyBObyBkaWNlXG4gICAgaWYgKCFtYXRjaGVkTXEpIHJldHVybjtcblxuICAgIC8vIFBsdWdpbiBhbHJlYWR5IGluaXRpYWxpemVkPyBXZSBnb29kXG4gICAgaWYgKHRoaXMuY3VycmVudFBsdWdpbiBpbnN0YW5jZW9mIHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5wbHVnaW4pIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBleGlzdGluZyBwbHVnaW4tc3BlY2lmaWMgQ1NTIGNsYXNzZXNcbiAgICAkLmVhY2goTWVudVBsdWdpbnMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIF90aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHZhbHVlLmNzc0NsYXNzKTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCB0aGUgQ1NTIGNsYXNzIGZvciB0aGUgbmV3IHBsdWdpblxuICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5ydWxlc1ttYXRjaGVkTXFdLmNzc0NsYXNzKTtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmV3IHBsdWdpblxuICAgIGlmICh0aGlzLmN1cnJlbnRQbHVnaW4pIHRoaXMuY3VycmVudFBsdWdpbi5kZXN0cm95KCk7XG4gICAgdGhpcy5jdXJyZW50UGx1Z2luID0gbmV3IHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5wbHVnaW4odGhpcy4kZWxlbWVudCwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4gb24gdGhpcyBlbGVtZW50LCBhcyB3ZWxsIGFzIHRoZSB3aW5kb3cgcmVzaXplIGhhbmRsZXIgdGhhdCBzd2l0Y2hlcyB0aGUgcGx1Z2lucyBvdXQuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmN1cnJlbnRQbHVnaW4uZGVzdHJveSgpO1xuICAgICQod2luZG93KS5vZmYoJy56Zi5SZXNwb25zaXZlTWVudScpO1xuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5SZXNwb25zaXZlTWVudS5kZWZhdWx0cyA9IHt9O1xuXG4vLyBUaGUgcGx1Z2luIG1hdGNoZXMgdGhlIHBsdWdpbiBjbGFzc2VzIHdpdGggdGhlc2UgcGx1Z2luIGluc3RhbmNlcy5cbnZhciBNZW51UGx1Z2lucyA9IHtcbiAgZHJvcGRvd246IHtcbiAgICBjc3NDbGFzczogJ2Ryb3Bkb3duJyxcbiAgICBwbHVnaW46IEZvdW5kYXRpb24uX3BsdWdpbnNbJ2Ryb3Bkb3duLW1lbnUnXSB8fCBudWxsXG4gIH0sXG4gZHJpbGxkb3duOiB7XG4gICAgY3NzQ2xhc3M6ICdkcmlsbGRvd24nLFxuICAgIHBsdWdpbjogRm91bmRhdGlvbi5fcGx1Z2luc1snZHJpbGxkb3duJ10gfHwgbnVsbFxuICB9LFxuICBhY2NvcmRpb246IHtcbiAgICBjc3NDbGFzczogJ2FjY29yZGlvbi1tZW51JyxcbiAgICBwbHVnaW46IEZvdW5kYXRpb24uX3BsdWdpbnNbJ2FjY29yZGlvbi1tZW51J10gfHwgbnVsbFxuICB9XG59O1xuXG4vLyBXaW5kb3cgZXhwb3J0c1xuRm91bmRhdGlvbi5wbHVnaW4oUmVzcG9uc2l2ZU1lbnUsICdSZXNwb25zaXZlTWVudScpO1xuXG59KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbiFmdW5jdGlvbigkKSB7XG5cbi8qKlxuICogUmVzcG9uc2l2ZVRvZ2dsZSBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmVzcG9uc2l2ZVRvZ2dsZVxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5tZWRpYVF1ZXJ5XG4gKi9cblxuY2xhc3MgUmVzcG9uc2l2ZVRvZ2dsZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFRhYiBCYXIuXG4gICAqIEBjbGFzc1xuICAgKiBAZmlyZXMgUmVzcG9uc2l2ZVRvZ2dsZSNpbml0XG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0byBhdHRhY2ggdGFiIGJhciBmdW5jdGlvbmFsaXR5IHRvLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE92ZXJyaWRlcyB0byB0aGUgZGVmYXVsdCBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFJl
5763c3BvbnNpdmVUb2dnbGUuZGVmYXVsdHMsIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcblxuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9ldmVudHMoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ1Jlc3BvbnNpdmVUb2dnbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdGFiIGJhciBieSBmaW5kaW5nIHRoZSB0YXJnZXQgZWxlbWVudCwgdG9nZ2xpbmcgZWxlbWVudCwgYW5kIHJ1bm5pbmcgdXBkYXRlKCkuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgdmFyIHRhcmdldElEID0gdGhpcy4kZWxlbWVudC5kYXRhKCdyZXNwb25zaXZlLXRvZ2dsZScpO1xuICAgIGlmICghdGFyZ2V0SUQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1lvdXIgdGFiIGJhciBuZWVkcyBhbiBJRCBvZiBhIE1lbnUgYXMgdGhlIHZhbHVlIG9mIGRhdGEtdGFiLWJhci4nKTtcbiAgICB9XG5cbiAgICB0aGlzLiR0YXJnZXRNZW51ID0gJChgIyR7dGFyZ2V0SUR9YCk7XG4gICAgdGhpcy4kdG9nZ2xlciA9IHRoaXMuJGVsZW1lbnQuZmluZCgnW2RhdGEtdG9nZ2xlXScpLmZpbHRlcihmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0YXJnZXQgPSAkKHRoaXMpLmRhdGEoJ3RvZ2dsZScpO1xuICAgICAgcmV0dXJuICh0YXJnZXQgPT09IHRhcmdldElEIHx8IHRhcmdldCA9PT0gXCJcIik7XG4gICAgfSk7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgdGhpcy4kdGFyZ2V0TWVudS5kYXRhKCkpO1xuXG4gICAgLy8gSWYgdGhleSB3ZXJlIHNldCwgcGFyc2UgdGhlIGFuaW1hdGlvbiBjbGFzc2VzXG4gICAgaWYodGhpcy5vcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgIGxldCBpbnB1dCA9IHRoaXMub3B0aW9ucy5hbmltYXRlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuYW5pbWF0aW9uSW4gPSBpbnB1dFswXTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uT3V0ID0gaW5wdXRbMV0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG5lY2Vzc2FyeSBldmVudCBoYW5kbGVycyBmb3IgdGhlIHRhYiBiYXIgdG8gd29yay5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl91cGRhdGVNcUhhbmRsZXIgPSB0aGlzLl91cGRhdGUuYmluZCh0aGlzKTtcblxuICAgICQod2luZG93KS5vbignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgdGhpcy5fdXBkYXRlTXFIYW5kbGVyKTtcblxuICAgIHRoaXMuJHRvZ2dsZXIub24oJ2NsaWNrLnpmLnJlc3BvbnNpdmVUb2dnbGUnLCB0aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBjdXJyZW50IG1lZGlhIHF1ZXJ5IHRvIGRldGVybWluZSBpZiB0aGUgdGFiIGJhciBzaG91bGQgYmUgdmlzaWJsZSBvciBoaWRkZW4uXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZSgpIHtcbiAgICAvLyBNb2JpbGVcbiAgICBpZiAoIUZvdW5kYXRpb24uTWVkaWFRdWVyeS5hdExlYXN0KHRoaXMub3B0aW9ucy5oaWRlRm9yKSkge1xuICAgICAgdGhpcy4kZWxlbWVudC5zaG93KCk7XG4gICAgICB0aGlzLiR0YXJnZXRNZW51LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvLyBEZXNrdG9wXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLiRlbGVtZW50LmhpZGUoKTtcbiAgICAgIHRoaXMuJHRhcmdldE1lbnUuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBlbGVtZW50IGF0dGFjaGVkIHRvIHRoZSB0YWIgYmFyLiBUaGUgdG9nZ2xlIG9ubHkgaGFwcGVucyBpZiB0aGUgc2NyZWVuIGlzIHNtYWxsIGVub3VnaCB0byBhbGxvdyBpdC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBSZXNwb25zaXZlVG9nZ2xlI3RvZ2dsZWRcbiAgICovXG4gIHRvZ2dsZU1lbnUoKSB7XG4gICAgaWYgKCFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuaGlkZUZvcikpIHtcbiAgICAgIC8qKlxuICAgICAgICogRmlyZXMgd2hlbiB0aGUgZWxlbWVudCBhdHRhY2hlZCB0byB0aGUgdGFiIGJhciB0b2dnbGVzLlxuICAgICAgICogQGV2ZW50IFJlc3BvbnNpdmVUb2dnbGUjdG9nZ2xlZFxuICAgICAgICovXG4gICAgICBpZih0aGlzLm9wdGlvbnMuYW5pbWF0ZSkge1xuICAgICAgICBpZiAodGhpcy4kdGFyZ2V0TWVudS5pcygnOmhpZGRlbicpKSB7XG4gICAgICAgICAgRm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZUluKHRoaXMuJHRhcmdldE1lbnUsIHRoaXMuYW5pbWF0aW9uSW4sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigndG9nZ2xlZC56Zi5yZXNwb25zaXZlVG9nZ2xlJyk7XG4gICAgICAgICAgICB0aGlzLiR0YXJnZXRNZW51LmZpbmQoJ1tkYXRhLW11dGF0ZV0nKS50cmlnZ2VySGFuZGxlcignbXV0YXRlbWUuemYudHJpZ2dlcicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIEZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVPdXQodGhpcy4kdGFyZ2V0TWVudSwgdGhpcy5hbmltYXRpb25PdXQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigndG9nZ2xlZC56Zi5yZXNwb25zaXZlVG9nZ2xlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLiR0YXJnZXRNZW51LnRvZ2dsZSgwKTtcbiAgICAgICAgdGhpcy4kdGFyZ2V0TWVudS5maW5kKCdbZGF0YS1tdXRhdGVdJykudHJpZ2dlcignbXV0YXRlbWUuemYudHJpZ2dlcicpO1xuICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3RvZ2dsZWQuemYucmVzcG9uc2l2ZVRvZ2dsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuJGVsZW1lbnQub2ZmKCcuemYucmVzcG9uc2l2ZVRvZ2dsZScpO1xuICAgIHRoaXMuJHRvZ2dsZXIub2ZmKCcuemYucmVzcG9uc2l2ZVRvZ2dsZScpO1xuXG4gICAgJCh3aW5kb3cpLm9mZignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgdGhpcy5fdXBkYXRlTXFIYW5kbGVyKTtcblxuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5SZXNwb25zaXZlVG9nZ2xlLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogVGhlIGJyZWFrcG9pbnQgYWZ0ZXIgd2hpY2ggdGhlIG1lbnUgaXMgYWx3YXlzIHNob3duLCBhbmQgdGhlI
5763HRhYiBiYXIgaXMgaGlkZGVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdtZWRpdW0nXG4gICAqL1xuICBoaWRlRm9yOiAnbWVkaXVtJyxcblxuICAvKipcbiAgICogVG8gZGVjaWRlIGlmIHRoZSB0b2dnbGUgc2hvdWxkIGJlIGFuaW1hdGVkIG9yIG5vdC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGFuaW1hdGU6IGZhbHNlXG59O1xuXG4vLyBXaW5kb3cgZXhwb3J0c1xuRm91bmRhdGlvbi5wbHVnaW4oUmVzcG9uc2l2ZVRvZ2dsZSwgJ1Jlc3BvbnNpdmVUb2dnbGUnKTtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIFJldmVhbCBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmV2ZWFsXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmtleWJvYXJkXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmJveFxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC50cmlnZ2Vyc1xuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5tZWRpYVF1ZXJ5XG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm1vdGlvbiBpZiB1c2luZyBhbmltYXRpb25zXG4gKi9cblxuY2xhc3MgUmV2ZWFsIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmV2ZWFsLlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIG1vZGFsLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFJldmVhbC5kZWZhdWx0cywgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpO1xuICAgIHRoaXMuX2luaXQoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ1JldmVhbCcpO1xuICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoJ1JldmVhbCcsIHtcbiAgICAgICdFTlRFUic6ICdvcGVuJyxcbiAgICAgICdTUEFDRSc6ICdvcGVuJyxcbiAgICAgICdFU0NBUEUnOiAnY2xvc2UnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBtb2RhbCBieSBhZGRpbmcgdGhlIG92ZXJsYXkgYW5kIGNsb3NlIGJ1dHRvbnMsIChpZiBzZWxlY3RlZCkuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdCgpIHtcbiAgICB0aGlzLmlkID0gdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpO1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNhY2hlZCA9IHttcTogRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnR9O1xuICAgIHRoaXMuaXNNb2JpbGUgPSBtb2JpbGVTbmlmZigpO1xuXG4gICAgdGhpcy4kYW5jaG9yID0gJ
5763ChgW2RhdGEtb3Blbj1cIiR7dGhpcy5pZH1cIl1gKS5sZW5ndGggPyAkKGBbZGF0YS1vcGVuPVwiJHt0aGlzLmlkfVwiXWApIDogJChgW2RhdGEtdG9nZ2xlPVwiJHt0aGlzLmlkfVwiXWApO1xuICAgIHRoaXMuJGFuY2hvci5hdHRyKHtcbiAgICAgICdhcmlhLWNvbnRyb2xzJzogdGhpcy5pZCxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICd0YWJpbmRleCc6IDBcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbiB8fCB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsJykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5mdWxsU2NyZWVuID0gdHJ1ZTtcbiAgICAgIHRoaXMub3B0aW9ucy5vdmVybGF5ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSAmJiAhdGhpcy4kb3ZlcmxheSkge1xuICAgICAgdGhpcy4kb3ZlcmxheSA9IHRoaXMuX21ha2VPdmVybGF5KHRoaXMuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQuYXR0cih7XG4gICAgICAgICdyb2xlJzogJ2RpYWxvZycsXG4gICAgICAgICdhcmlhLWhpZGRlbic6IHRydWUsXG4gICAgICAgICdkYXRhLXlldGktYm94JzogdGhpcy5pZCxcbiAgICAgICAgJ2RhdGEtcmVzaXplJzogdGhpcy5pZFxuICAgIH0pO1xuXG4gICAgaWYodGhpcy4kb3ZlcmxheSkge1xuICAgICAgdGhpcy4kZWxlbWVudC5kZXRhY2goKS5hcHBlbmRUbyh0aGlzLiRvdmVybGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4kZWxlbWVudC5kZXRhY2goKS5hcHBlbmRUbygkKHRoaXMub3B0aW9ucy5hcHBlbmRUbykpO1xuICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnd2l0aG91dC1vdmVybGF5Jyk7XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50cygpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmsgJiYgd2luZG93LmxvY2F0aW9uLmhhc2ggPT09ICggYCMke3RoaXMuaWR9YCkpIHtcbiAgICAgICQod2luZG93KS5vbmUoJ2xvYWQuemYucmV2ZWFsJywgdGhpcy5vcGVuLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG92ZXJsYXkgZGl2IHRvIGRpc3BsYXkgYmVoaW5kIHRoZSBtb2RhbC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlT3ZlcmxheSgpIHtcbiAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKVxuICAgICAgLmFkZENsYXNzKCdyZXZlYWwtb3ZlcmxheScpXG4gICAgICAuYXBwZW5kVG8odGhpcy5vcHRpb25zLmFwcGVuZFRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHBvc2l0aW9uIG9mIG1vZGFsXG4gICAqIFRPRE86ICBGaWd1cmUgb3V0IGlmIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2FjaGUgdGhlc2UgdmFsdWVzIG9yIGlmIGl0IGRvZXNuJ3QgbWF0dGVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy4kZWxlbWVudC5vdXRlcldpZHRoKCk7XG4gICAgdmFyIG91dGVyV2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWxlbWVudC5vdXRlckhlaWdodCgpO1xuICAgIHZhciBvdXRlckhlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcbiAgICB2YXIgbGVmdCwgdG9wO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaE9mZnNldCA9PT0gJ2F1dG8nKSB7XG4gICAgICBsZWZ0ID0gcGFyc2VJbnQoKG91dGVyV2lkdGggLSB3aWR0aCkgLyAyLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSBwYXJzZUludCh0aGlzLm9wdGlvbnMuaE9mZnNldCwgMTApO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnZPZmZzZXQgPT09ICdhdXRvJykge1xuICAgICAgaWYgKGhlaWdodCA+IG91dGVySGVpZ2h0KSB7XG4gICAgICAgIHRvcCA9IHBhcnNlSW50KE1hdGgubWluKDEwMCwgb3V0ZXJIZWlnaHQgLyAxMCksIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcCA9IHBhcnNlSW50KChvdXRlckhlaWdodCAtIGhlaWdodCkgLyA0LCAxMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy52T2Zmc2V0LCAxMCk7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQuY3NzKHt0b3A6IHRvcCArICdweCd9KTtcbiAgICAvLyBvbmx5IHdvcnJ5IGFib3V0IGxlZnQgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBvdmVybGF5IG9yIHdlIGhhdmVhICBob3Jpem9udGFsIG9mZnNldCxcbiAgICAvLyBvdGhlcndpc2Ugd2UncmUgcGVyZmVjdGx5IGluIHRoZSBtaWRkbGVcbiAgICBpZighdGhpcy4kb3ZlcmxheSB8fCAodGhpcy5vcHRpb25zLmhPZmZzZXQgIT09ICdhdXRvJykpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuY3NzKHtsZWZ0OiBsZWZ0ICsgJ3B4J30pO1xuICAgICAgdGhpcy4kZWxlbWVudC5jc3Moe21hcmdpbjogJzBweCd9KTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgbW9kYWwuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50Lm9uKHtcbiAgICAgICdvcGVuLnpmLnRyaWdnZXInOiB0aGlzLm9wZW4uYmluZCh0aGlzKSxcbiAgICAgICdjbG9zZS56Zi50cmlnZ2VyJzogKGV2ZW50LCAkZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCA9PT0gX3RoaXMuJGVsZW1lbnRbMF0pIHx8XG4gICAgICAgICAgICAoJChldmVudC50YXJnZXQpLnBhcmVudHMoJ1tkYXRhLWNsb3NhYmxlXScpWzBdID09PSAkZWxlbWVudCkpIHsgLy8gb25seSBjbG9zZSByZXZlYWwgd2hlbiBpdCdzIGV4cGxpY2l0bHkgY2FsbGVkXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UuYXBwbHkodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAndG9nZ2xlLnpmLnRyaWdnZXInOiB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpLFxuICAgICAgJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInOiBmdW5jdGlvbigpIHtcbiAgICAgICAgX3RoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy4kYW5jaG9yLmxlbmd0aCkge1xuICAgICAgdGhpcy4kYW5jaG9yLm9uKCdrZXlkb3duLnpmLnJldmVhbCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzIHx8IGUud2hpY2ggPT09IDMyKSB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbn
5763REZWZhdWx0KCk7XG4gICAgICAgICAgX3RoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25DbGljayAmJiB0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgdGhpcy4kb3ZlcmxheS5vZmYoJy56Zi5yZXZlYWwnKS5vbignY2xpY2suemYucmV2ZWFsJywgZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoZS50YXJnZXQgPT09IF90aGlzLiRlbGVtZW50WzBdIHx8XG4gICAgICAgICAgJC5jb250YWlucyhfdGhpcy4kZWxlbWVudFswXSwgZS50YXJnZXQpIHx8XG4gICAgICAgICAgICAhJC5jb250YWlucyhkb2N1bWVudCwgZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmspIHtcbiAgICAgICQod2luZG93KS5vbihgcG9wc3RhdGUuemYucmV2ZWFsOiR7dGhpcy5pZH1gLCB0aGlzLl9oYW5kbGVTdGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtb2RhbCBtZXRob2RzIG9uIGJhY2svZm9yd2FyZCBidXR0b24gY2xpY2tzIG9yIGFueSBvdGhlciBldmVudCB0aGF0IHRyaWdnZXJzIHBvcHN0YXRlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhbmRsZVN0YXRlKGUpIHtcbiAgICBpZih3aW5kb3cubG9jYXRpb24uaGFzaCA9PT0gKCAnIycgKyB0aGlzLmlkKSAmJiAhdGhpcy5pc0FjdGl2ZSl7IHRoaXMub3BlbigpOyB9XG4gICAgZWxzZXsgdGhpcy5jbG9zZSgpOyB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgbW9kYWwgY29udHJvbGxlZCBieSBgdGhpcy4kYW5jaG9yYCwgYW5kIGNsb3NlcyBhbGwgb3RoZXJzIGJ5IGRlZmF1bHQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgUmV2ZWFsI2Nsb3NlbWVcbiAgICogQGZpcmVzIFJldmVhbCNvcGVuXG4gICAqL1xuICBvcGVuKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmspIHtcbiAgICAgIHZhciBoYXNoID0gYCMke3RoaXMuaWR9YDtcblxuICAgICAgaWYgKHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSkge1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgaGFzaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAvLyBNYWtlIGVsZW1lbnRzIGludmlzaWJsZSwgYnV0IHJlbW92ZSBkaXNwbGF5OiBub25lIHNvIHdlIGNhbiBnZXQgc2l6ZSBhbmQgcG9zaXRpb25pbmdcbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5jc3MoeyAndmlzaWJpbGl0eSc6ICdoaWRkZW4nIH0pXG4gICAgICAgIC5zaG93KClcbiAgICAgICAgLnNjcm9sbFRvcCgwKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJsYXkpIHtcbiAgICAgIHRoaXMuJG92ZXJsYXkuY3NzKHsndmlzaWJpbGl0eSc6ICdoaWRkZW4nfSkuc2hvdygpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG5cbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAuaGlkZSgpXG4gICAgICAuY3NzKHsgJ3Zpc2liaWxpdHknOiAnJyB9KTtcblxuICAgIGlmKHRoaXMuJG92ZXJsYXkpIHtcbiAgICAgIHRoaXMuJG92ZXJsYXkuY3NzKHsndmlzaWJpbGl0eSc6ICcnfSkuaGlkZSgpO1xuICAgICAgaWYodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFzdCcpKSB7XG4gICAgICAgIHRoaXMuJG92ZXJsYXkuYWRkQ2xhc3MoJ2Zhc3QnKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnc2xvdycpKSB7XG4gICAgICAgIHRoaXMuJG92ZXJsYXkuYWRkQ2xhc3MoJ3Nsb3cnKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGlmICghdGhpcy5vcHRpb25zLm11bHRpcGxlT3BlbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIEZpcmVzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbW9kYWwgb3BlbnMuXG4gICAgICAgKiBDbG9zZXMgYW55IG90aGVyIG1vZGFscyB0aGF0IGFyZSBjdXJyZW50bHkgb3BlblxuICAgICAgICogQGV2ZW50IFJldmVhbCNjbG9zZW1lXG4gICAgICAgKi9cbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignY2xvc2VtZS56Zi5yZXZlYWwnLCB0aGlzLmlkKTtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gYWRkUmV2ZWFsT3BlbkNsYXNzZXMoKSB7XG4gICAgICBpZiAoX3RoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgaWYoIV90aGlzLm9yaWdpbmFsU2Nyb2xsUG9zKSB7XG4gICAgICAgICAgX3RoaXMub3JpZ2luYWxTY3JvbGxQb3MgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgJCgnaHRtbCwgYm9keScpLmFkZENsYXNzKCdpcy1yZXZlYWwtb3BlbicpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnaXMtcmV2ZWFsLW9wZW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTW90aW9uIFVJIG1ldGhvZCBvZiByZXZlYWxcbiAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbkluKSB7XG4gICAgICBmdW5jdGlvbiBhZnRlckFuaW1hdGlvbigpe1xuICAgICAgICBfdGhpcy4kZWxlbWVudFxuICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICdhcmlhLWh
5763pZGRlbic6IGZhbHNlLFxuICAgICAgICAgICAgJ3RhYmluZGV4JzogLTFcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb2N1cygpO1xuICAgICAgICBhZGRSZXZlYWxPcGVuQ2xhc3NlcygpO1xuICAgICAgICBGb3VuZGF0aW9uLktleWJvYXJkLnRyYXBGb2N1cyhfdGhpcy4kZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJsYXkpIHtcbiAgICAgICAgRm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZUluKHRoaXMuJG92ZXJsYXksICdmYWRlLWluJyk7XG4gICAgICB9XG4gICAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlSW4odGhpcy4kZWxlbWVudCwgdGhpcy5vcHRpb25zLmFuaW1hdGlvbkluLCAoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuJGVsZW1lbnQpIHsgLy8gcHJvdGVjdCBhZ2FpbnN0IG9iamVjdCBoYXZpbmcgYmVlbiByZW1vdmVkXG4gICAgICAgICAgdGhpcy5mb2N1c2FibGVFbGVtZW50cyA9IEZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZSh0aGlzLiRlbGVtZW50KTtcbiAgICAgICAgICBhZnRlckFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8galF1ZXJ5IG1ldGhvZCBvZiByZXZlYWxcbiAgICBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgICB0aGlzLiRvdmVybGF5LnNob3coMCk7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbGVtZW50LnNob3codGhpcy5vcHRpb25zLnNob3dEZWxheSk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGFjY2Vzc2liaWxpdHlcbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAuYXR0cih7XG4gICAgICAgICdhcmlhLWh
5763pZGRlbic6IGZhbHNlLFxuICAgICAgICAndGFiaW5kZXgnOiAtMVxuICAgICAgfSlcbiAgICAgIC5mb2N1cygpO1xuICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQudHJhcEZvY3VzKHRoaXMuJGVsZW1lbnQpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgbW9kYWwgaGFzIHN1Y2Nlc3NmdWxseSBvcGVuZWQuXG4gICAgICogQGV2ZW50IFJldmVhbCNvcGVuXG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdvcGVuLnpmLnJldmVhbCcpO1xuXG4gICAgYWRkUmV2ZWFsT3BlbkNsYXNzZXMoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fZXh0cmFIYW5kbGVycygpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXh0cmEgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBib2R5IGFuZCB3aW5kb3cgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2V4dHJhSGFuZGxlcnMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBpZighdGhpcy4kZWxlbWVudCkgeyByZXR1cm47IH0gLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBjbGVhbnVwLCBkb24ndCBmcmVhayBvdXRcbiAgICB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzID0gRm91bmRhdGlvbi5LZXlib2FyZC5maW5kRm9jdXNhYmxlKHRoaXMuJGVsZW1lbnQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMub3ZlcmxheSAmJiB0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrICYmICF0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbikge1xuICAgICAgJCgnYm9keScpLm9uKCdjbGljay56Zi5yZXZlYWwnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gX3RoaXMuJGVsZW1lbnRbMF0gfHxcbiAgICAgICAgICAkLmNvbnRhaW5zKF90aGlzLiRlbGVtZW50WzBdLCBlLnRhcmdldCkgfHxcbiAgICAgICAgICAgICEkLmNvbnRhaW5zKGRvY3VtZW50LCBlLnRhcmdldCkpIHsgcmV0dXJuOyB9XG4gICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25Fc2MpIHtcbiAgICAgICQod2luZG93KS5vbigna2V5ZG93bi56Zi5yZXZlYWwnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdSZXZlYWwnLCB7XG4gICAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuY2xvc2VPbkVzYykge1xuICAgICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICBfdGhpcy4kYW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGxvY2sgZm9jdXMgd2l0aGluIG1vZGFsIHdoaWxlIHRhYmJpbmdcbiAgICB0aGlzLiRlbGVtZW50Lm9uKCdrZXlkb3duLnpmLnJldmVhbCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciAkdGFyZ2V0ID0gJCh0aGlzKTtcbiAgICAgIC8vIGhhbmRsZSBrZXlib2FyZCBldmVudCB3aXRoIGtleWJvYXJkIHV0aWxcbiAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdSZXZlYWwnLCB7XG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChfdGhpcy4kZWxlbWVudC5maW5kKCc6Zm9jdXMnKS5pcyhfdGhpcy4kZWxlbWVudC5maW5kKCdbZGF0YS1jbG9zZV0nKSkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IC8vIHNldCBmb2N1cyBiYWNrIHRvIGFuY2hvciBpZiBjbG9zZSBidXR0b24gaGFzIGJlZW4gYWN0aXZhdGVkXG4gICAgICAgICAgICAgIF90aGlzLiRhbmNob3IuZm9jdXMoKTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJHRhcmdldC5pcyhfdGhpcy5mb2N1c2FibGVFbGVtZW50cykpIHsgLy8gZG9udCd0IHRyaWdnZXIgaWYgYWN1YWwgZWxlbWVudCBoYXMgZm9jdXMgKGkuZS4gaW5wdXRzLCBsaW5rcywgLi4uKVxuICAgICAgICAgICAgX3RoaXMub3BlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNsb3NlT25Fc2MpIHtcbiAgICAgICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICBfdGhpcy4kYW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVkOiBmdW5jdGlvbihwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIGlmIChwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBtb2RhbC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBSZXZlYWwjY2xvc2VkXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUgfHwgIXRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIE1vdGlvbiBVSSBtZXRob2Qgb2YgaGlkaW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb25PdXQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJG92ZXJsYXksICdmYWRlLW91dCcsIGZpbmlzaFVwKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmaW5pc2hVcCgpO1xuICAgICAgfVxuXG4gICAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJGVsZW1lbnQsIHRoaXMub3B0aW9ucy5hbmltYXRpb25PdXQpO1xuICAgIH1cbiAgICAvLyBqUXVlcnkgbWV0aG9kIG9mIGhpZGluZ1xuICAgIGVsc2Uge1xuXG4gICAgICB0aGlzLiRlbGVtZW50LmhpZGUodGhpcy5vcHRpb25zLmhpZGVEZWxheSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgICB0aGlzLiRvdmVybGF5LmhpZGUoMCwgZmluaXNoVXApO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGZpbmlzaFVwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uZGl0aW9uYWxzIHRvIHJlbW92ZSBleHRyYSBldmVudCBsaXN0ZW5lcnMgYWRkZWQgb24gb3BlblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkVzYykge1xuICAgICAgJCh3aW5kb3cpLm9mZigna2V5ZG93bi56Zi5yZXZlYWwnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5vdmVybGF5ICYmIHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spIHtcbiAgICAgICQoJ2JvZHknKS5vZmYoJ2NsaWNrLnpmLnJldmVhbCc
5763pO1xuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQub2ZmKCdrZXlkb3duLnpmLnJldmVhbCcpO1xuXG4gICAgZnVuY3Rpb24gZmluaXNoVXAoKSB7XG4gICAgICBpZiAoX3RoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgaWYgKCQoJy5yZXZlYWw6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5yZW1vdmVDbGFzcygnaXMtcmV2ZWFsLW9wZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZihfdGhpcy5vcmlnaW5hbFNjcm9sbFBvcykge1xuICAgICAgICAgICQoJ2JvZHknKS5zY3JvbGxUb3AoX3RoaXMub3JpZ2luYWxTY3JvbGxQb3MpO1xuICAgICAgICAgIF90aGlzLm9yaWdpbmFsU2Nyb2xsUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICgkKCcucmV2ZWFsOnZpc2libGUnKS5sZW5ndGggID09PSAwKSB7XG4gICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdpcy1yZXZlYWwtb3BlbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgRm91bmRhdGlvbi5LZXlib2FyZC5yZWxlYXNlRm9jdXMoX3RoaXMuJGVsZW1lbnQpO1xuXG4gICAgICBfdGhpcy4kZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuXG4gICAgICAvKipcbiAgICAgICogRmlyZXMgd2hlbiB0aGUgbW9kYWwgaXMgZG9uZSBjbG9zaW5nLlxuICAgICAgKiBAZXZlbnQgUmV2ZWFsI2Nsb3NlZFxuICAgICAgKi9cbiAgICAgIF90aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2Nsb3NlZC56Zi5yZXZlYWwnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlc2V0cyB0aGUgbW9kYWwgY29udGVudFxuICAgICogVGhpcyBwcmV2ZW50cyBhIHJ1bm5pbmcgdmlkZW8gdG8ga2VlcCBnb2luZyBpbiB0aGUgYmFja2dyb3VuZFxuICAgICovXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXNldE9uQ2xvc2UpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuaHRtbCh0aGlzLiRlbGVtZW50Lmh0bWwoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICBpZiAoX3RoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgIGlmICh3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUpIHtcbiAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywgZG9jdW1lbnQudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoYCMke3RoaXMuaWR9YCwgJycpKTtcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgICB9XG4gICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBvcGVuL2Nsb3NlZCBzdGF0ZSBvZiBhIG1vZGFsLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIGEgbW9kYWwuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJsYXkpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXBwZW5kVG8oJCh0aGlzLm9wdGlvbnMuYXBwZW5kVG8pKTsgLy8gbW92ZSAkZWxlbWVudCBvdXRzaWRlIG9mICRvdmVybGF5IHRvIHByZXZlbnQgZXJyb3IgdW5yZWdpc3RlclBsdWdpbigpXG4gICAgICB0aGlzLiRvdmVybGF5LmhpZGUoKS5vZmYoKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy4kZWxlbWVudC5oaWRlKCkub2ZmKCk7XG4gICAgdGhpcy4kYW5jaG9yLm9mZignLnpmJyk7XG4gICAgJCh3aW5kb3cpLm9mZihgLnpmLnJldmVhbDoke3RoaXMuaWR9YCk7XG5cbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH07XG59XG5cblJldmVhbC5kZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIE1vdGlvbi1VSSBjbGFzcyB0byB1c2UgZm9yIGFuaW1hdGVkIGVsZW1lbnRzLiBJZiBub25lIHVzZWQsIGRlZmF1bHRzIHRvIHNpbXBsZSBzaG93L2hpZGUuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIGFuaW1hdGlvbkluOiAnJyxcbiAgLyoqXG4gICAqIE1vdGlvbi1VSSBjbGFzcyB0byB1c2UgZm9yIGFuaW1hdGVkIGVsZW1lbnRzLiBJZiBub25lIHVzZWQsIGRlZmF1bHRzIHRvIHNpbXBsZSBzaG93L2hpZGUuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIGFuaW1hdGlvbk91dDogJycsXG4gIC8qKlxuICAgKiBUaW1lLCBpbiBtcywgdG8gZGVsYXkgdGhlIG9wZW5pbmcgb2YgYSBtb2RhbCBhZnRlciBhIGNsaWNrIGlmIG5vIGFuaW1hdGlvbiB1c2VkLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHNob3dEZWxheTogMCxcbiAgLyoqXG4gICAqIFRpbWUsIGluIG1zLCB0byBkZWxheSB0aGUgY2xvc2luZyBvZiBhIG1vZGFsIGFmdGVyIGEgY2xpY2sgaWYgbm8gYW5pbWF0aW9uIHVzZWQuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgaGlkZURlbGF5OiAwLFxuICAvKipcbiAgICogQWxsb3dzIGEgY2xpY2sgb24gdGhlIGJvZHkvb3ZlcmxheSB0byBjbG9zZSB0aGUgbW9kYWwuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGNsb3NlT25DbGljazogdHJ1ZSxcbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgbW9kYWwgdG8gY2xvc2UgaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgYEVTQ0FQRWAga2V5LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBjbG9zZU9uRXNjOiB0cnVlLFxuICAvKipcbiAgICogSWYgdHJ1ZSwgYWxsb3dzIG11bHRpcGxlIG1vZGFscyB0byBiZSBkaXNwbGF5ZWQgYXQgb25jZS5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG11bHRpcGxlT3BlbmVkOiBmYWxzZSxcbiAgLyoqXG4gICAqIERpc3RhbmNlLCBpbiBwaXhlbHMsIHRoZSBtb2RhbCBzaG91bGQgcHVzaCBkb3duIGZyb20gdGhlIHRvcCBvZiB0aGUgc2NyZWVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ8
5763c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBhdXRvXG4gICAqL1xuICB2T2Zmc2V0OiAnYXV0bycsXG4gIC8qKlxuICAgKiBEaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGUgbW9kYWwgc2hvdWxkIHB1c2ggaW4gZnJvbSB0aGUgc2lkZSBvZiB0aGUgc2NyZWVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ8c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBhdXRvXG4gICAqL1xuICBoT2Zmc2V0OiAnYXV0bycsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIGJlIGZ1bGxzY3JlZW4sIGNvbXBsZXRlbHkgYmxvY2tpbmcgb3V0IHRoZSByZXN0IG9mIHRoZSB2aWV3LiBKUyBjaGVja3MgZm9yIHRoaXMgYXMgd2VsbC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGZ1bGxTY3JlZW46IGZhbHNlLFxuICAvKipcbiAgICogUGVyY2VudGFnZSBvZiBzY3JlZW4gaGVpZ2h0IHRoZSBtb2RhbCBzaG91bGQgcHVzaCB1cCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHZpZXcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIGJ0bU9mZnNldFBjdDogMTAsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIGdlbmVyYXRlIGFuIG92ZXJsYXkgZGl2LCB3aGljaCB3aWxsIGNvdmVyIHRoZSB2aWV3IHdoZW4gbW9kYWwgb3BlbnMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIG92ZXJsYXk6IHRydWUsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIHJlbW92ZSBhbmQgcmVpbmplY3QgbWFya3VwIG9uIGNsb3NlLiBTaG91bGQgYmUgdHJ1ZSBpZiB1c2luZyB2aWRlbyBlbGVtZW50cyB3L28gdXNpbmcgcHJvdmlkZXIncyBhcGksIG90aGVyd2lzZSwgdmlkZW9zIHdpbGwgY29udGludWUgdG8gcGxheSBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlc2V0T25DbG9zZTogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIGFsdGVyIHRoZSB1cmwgb24gb3Blbi9jbG9zZSwgYW5kIGFsbG93cyB0aGUgdXNlIG9mIHRoZSBgYmFja2AgYnV0dG9uIHRvIGNsb3NlIG1vZGFscy4gQUxTTywgYWxsb3dzIGEgbW9kYWwgdG8gYXV0by1tYW5pYWNhbGx5IG9wZW4gb24gcGFnZSBsb2FkIElGIHRoZSBoYXNoID09PSB0aGUgbW9kYWwncyB1c2VyLXNldCBpZC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlZXBMaW5rOiBmYWxzZSxcbiAgICAvKipcbiAgICogQWxsb3dzIHRoZSBtb2RhbCB0byBhcHBlbmQgdG8gY3VzdG9tIGRpdi5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcImJvZHlcIlxuICAgKi9cbiAgYXBwZW5kVG86IFwiYm9keVwiXG5cbn07XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihSZXZlYWwsICdSZXZlYWwnKTtcblxuZnVuY3Rpb24gaVBob25lU25pZmYoKSB7XG4gIHJldHVybiAvaVAoYWR8aG9uZXxvZCkuKk9TLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTtcbn1cblxuZnVuY3Rpb24gYW5kcm9pZFNuaWZmKCkge1xuICByZXR1cm4gL0FuZHJvaWQvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xufVxuXG5mdW5jdGlvbiBtb2JpbGVTbmlmZigpIHtcbiAgcmV0dXJuIGlQaG9uZVNuaWZmKCkgfHwgYW5kcm9pZFNuaWZmKCk7XG59XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBUYWJzIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi50YWJzXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmtleWJvYXJkXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLnRpbWVyQW5kSW1hZ2VMb2FkZXIgaWYgdGFicyBjb250YWluIGltYWdlc1xuICovXG5cbmNsYXNzIFRhYnMge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0YWJzLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIFRhYnMjaW5pdFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIHRhYnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgVGFicy5kZWZhdWx0cywgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ1RhYnMnKTtcbiAgICBGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKCdUYWJzJywge1xuICAgICAgJ0VOVEVSJzogJ29wZW4nLFxuICAgICAgJ1NQQUNFJzogJ29wZW4nLFxuICAgICAgJ0FSUk9XX1JJR0hUJzogJ25leHQnLFxuICAgICAgJ0FSUk9XX1VQJzogJ3ByZXZpb3VzJyxcbiAgICAgICdBUlJPV19ET1dOJzogJ25leHQnLFxuICAgICAgJ0FSUk9XX0xFRlQnOiAncHJldmlvdXMnXG4gICAgICAvLyAnVEFCJzogJ25leHQnLFxuICAgICAgLy8gJ1NISUZUX1RBQic6ICdwcmV2aW91cydcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdGFicyBieSBzaG93aW5nIGFuZCBmb2N1c2luZyAoaWYgYXV0b0ZvY3VzPXRydWUpIHRoZSBwcmVzZXQgYWN0aXZlIHRhYi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50LmF0dHIoeydyb2xlJzogJ3RhYmxpc3QnfSk7XG4gICAgdGhpcy4kdGFiVGl0bGVzID0gdGhpcy4kZWxlbWVudC5maW5kKGAuJHt0aGlzLm9wdGlvbnMubGlua0NsYXNzfWApO1xuICAgIHRoaXMuJHRhYkNvbnRlbnQgPSAkKGBbZGF0YS10YWJzLWNvbnRlbnQ9XCIke3RoaXMuJGVsZW1lbnRbMF0uaWR9XCJdYCk7XG5cbiAgICB0aGlzLiR0YWJUaXRsZXMuZWFjaChmdW5jdGlvbigpe1xuICAgICAgdmFyICRlbGVtID0gJCh0aGlzKSxcbiAgICAgICAgICAkbGluayA9ICRlbGVtLmZpbmQoJ2EnKSxcbiAgICAgICAgICBpc0FjdGl2ZSA9ICRlbGVtLmhhc0NsYXNzKGAke190aGlzLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzfWApLFxuICAgICAgICAgIGhhc2ggPSAkbGlua1swXS5oYXNoLnNsaWNlKDEpLFxuICAgICAgICAgIGxpbmtJZCA9ICRsaW5rWzBdLmlkID8gJGxpbmtbMF0uaWQgOiBgJHtoYXNofS1sYWJlbGAsXG4gICAgICAgICAgJHRhYkNvbnRlbnQgPSAkKGAjJHtoYXNofWApO1xuXG4gICAgICAkZWxlbS5hdHRyKHsncm9sZSc6ICdwcmVzZW50YXRpb24nfSk7XG5cbiAgICAgICRsaW5rLmF0dHIoe1xuICAgICAgICAncm9sZSc6ICd0YWInLFxuICAgICAgICAnYXJpYS1jb250cm9scyc6IGhhc2gsXG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogaXNBY3RpdmUsXG4gICAgICAgICdpZCc6IGxpbmtJZFxuICAgICAgfSk7XG5cbiAgICAgICR0YWJDb250ZW50LmF0dHIoe1xuICAgICAgICAncm9sZSc6ICd0YWJwYW5lbCcsXG4gICAgICAgICdhcmlhLWh
5763pZGRlbic6ICFpc0FjdGl2ZSxcbiAgICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IGxpbmtJZFxuICAgICAgfSk7XG5cbiAgICAgIGlmKGlzQWN0aXZlICYmIF90aGlzLm9wdGlvbnMuYXV0b0ZvY3VzKXtcbiAgICAgICAgJCh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoeyBzY3JvbGxUb3A6ICRlbGVtLm9mZnNldCgpLnRvcCB9LCBfdGhpcy5vcHRpb25zLmRlZXBMaW5rU211ZGdlRGVsYXksICgpID0+IHtcbiAgICAgICAgICAgICRsaW5rLmZvY3VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKHRoaXMub3B0aW9ucy5tYXRjaEhlaWdodCkge1xuICAgICAgdmFyICRpbWFnZXMgPSB0aGlzLiR0YWJDb250ZW50LmZpbmQoJ2ltZycpO1xuXG4gICAgICBpZiAoJGltYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgRm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZCgkaW1hZ2VzLCB0aGlzLl9zZXRIZWlnaHQuYmluZCh0aGlzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXRIZWlnaHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAgLy9jdXJyZW50IGNvbnRleHQtYm91bmQgZnVuY3Rpb24gdG8gb3BlbiB0YWJzIG9uIHBhZ2UgbG9hZCBvciBoaXN0b3J5IHBvcHN0YXRlXG4gICAgdGhpcy5fY2hlY2tEZWVwTGluayA9ICgpID0+IHtcbiAgICAgIHZhciBhbmNob3IgPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcbiAgICAgIC8vbmVlZCBhIGhhc2ggYW5kIGEgcmVsZXZhbnQgYW5jaG9yIGluIHRoaXMgdGFic2V0XG4gICAgICBpZihhbmNob3IubGVuZ3RoKSB7XG4gICAgICAgIHZhciAkbGluayA9IHRoaXMuJGVsZW1lbnQuZmluZCgnW2hyZWYkPVwiJythbmNob3IrJ1wiXScpO1xuICAgICAgICBpZiAoJGxpbmsubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RUYWIoJChhbmNob3IpLCB0cnVlKTtcblxuICAgICAgICAgIC8vcm9sbCB1cCBhIGxpdHRsZSB0byBzaG93IHRoZSB0aXRsZXNcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlZXBMaW5rU211ZGdlKSB7XG4gICAgICAgICAgICB2Y
5763XIgb2Zmc2V0ID0gdGhpcy4kZWxlbWVudC5vZmZzZXQoKTtcbiAgICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBvZmZzZXQudG9wIH0sIHRoaXMub3B0aW9ucy5kZWVwTGlua1NtdWRnZURlbGF5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgenBsdWdpbiBoYXMgZGVlcGxpbmtlZCBhdCBwYWdlbG9hZFxuICAgICAgICAgICAgKiBAZXZlbnQgVGFicyNkZWVwbGlua1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdkZWVwbGluay56Zi50YWJzJywgWyRsaW5rLCAkKGFuY2hvcildKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cblxuICAgIC8vdXNlIGJyb3dzZXIgdG8gb3BlbiBhIHRhYiwgaWYgaXQgZXhpc3RzIGluIHRoaXMgdGFic2V0XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgdGhpcy5fY2hlY2tEZWVwTGluaygpO1xuICAgIH1cblxuICAgIHRoaXMuX2V2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgZm9yIGl0ZW1zIHdpdGhpbiB0aGUgdGFicy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdGhpcy5fYWRkS2V5SGFuZGxlcigpO1xuICAgIHRoaXMuX2FkZENsaWNrSGFuZGxlcigpO1xuICAgIHRoaXMuX3NldEhlaWdodE1xSGFuZGxlciA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0KSB7XG4gICAgICB0aGlzLl9zZXRIZWlnaHRNcUhhbmRsZXIgPSB0aGlzLl9zZXRIZWlnaHQuYmluZCh0aGlzKTtcblxuICAgICAgJCh3aW5kb3cpLm9uKCdjaGFuZ2VkLnpmLm1lZGlhcXVlcnknLCB0aGlzLl9zZXRIZWlnaHRNcUhhbmRsZXIpO1xuICAgIH1cblxuICAgIGlmKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgJCh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRoaXMuX2NoZWNrRGVlcExpbmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNsaWNrIGhhbmRsZXJzIGZvciBpdGVtcyB3aXRoaW4gdGhlIHRhYnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWRkQ2xpY2tIYW5kbGVyKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAub2ZmKCdjbGljay56Zi50YWJzJylcbiAgICAgIC5vbignY2xpY2suemYudGFicycsIGAuJHt0aGlzLm9wdGlvbnMubGlua0NsYXNzfWAsIGZ1bmN0aW9uKGUpe1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIF90aGlzLl9oYW5kbGVUYWJDaGFuZ2UoJCh0aGlzKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGZvciBpdGVtcyB3aXRoaW4gdGhlIHRhYnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWRkS2V5SGFuZGxlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy4kdGFiVGl0bGVzLm9mZigna2V5ZG93bi56Zi50YWJzJykub24oJ2tleWRvd24uemYudGFicycsIGZ1bmN0aW9uKGUpe1xuICAgICAgaWYgKGUud2hpY2ggPT09IDkpIHJldHVybjtcblxuXG4gICAgICB2Y
5763XIgJGVsZW1lbnQgPSAkKHRoaXMpLFxuICAgICAgICAkZWxlbWVudHMgPSAkZWxlbWVudC5wYXJlbnQoJ3VsJykuY2hpbGRyZW4oJ2xpJyksXG4gICAgICAgICRwcmV2RWxlbWVudCxcbiAgICAgICAgJG5leHRFbGVtZW50O1xuXG4gICAgICAkZWxlbWVudHMuZWFjaChmdW5jdGlvbihpKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmlzKCRlbGVtZW50KSkge1xuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLndyYXBPbktleXMpIHtcbiAgICAgICAgICAgICRwcmV2RWxlbWVudCA9IGkgPT09IDAgPyAkZWxlbWVudHMubGFzdCgpIDogJGVsZW1lbnRzLmVxKGktMSk7XG4gICAgICAgICAgICAkbmV4dEVsZW1lbnQgPSBpID09PSAkZWxlbWVudHMubGVuZ3RoIC0xID8gJGVsZW1lbnRzLmZpcnN0KCkgOiAkZWxlbWVudHMuZXEoaSsxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHByZXZFbGVtZW50ID0gJGVsZW1lbnRzLmVxKE1hdGgubWF4KDAsIGktMSkpO1xuICAgICAgICAgICAgJG5leHRFbGVtZW50ID0gJGVsZW1lbnRzLmVxKE1hdGgubWluKGkrMSwgJGVsZW1lbnRzLmxlbmd0aC0xKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGhhbmRsZSBrZXlib2FyZCBldmVudCB3aXRoIGtleWJvYXJkIHV0aWxcbiAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdUYWJzJywge1xuICAgICAgICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkZWxlbWVudC5maW5kKCdbcm9sZT1cInRhYlwiXScpLmZvY3VzKCk7XG4gICAgICAgICAgX3RoaXMuX2hhbmRsZVRhYkNoYW5nZSgkZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIHByZXZpb3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkcHJldkVsZW1lbnQuZmluZCgnW3JvbGU9XCJ0YWJcIl0nKS5mb2N1cygpO1xuICAgICAgICAgIF90aGlzLl9oYW5kbGVUYWJDaGFuZ2UoJHByZXZFbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJG5leHRFbGVtZW50LmZpbmQoJ1tyb2xlPVwidGFiXCJdJykuZm9jdXMoKTtcbiAgICAgICAgICBfdGhpcy5faGFuZGxlVGFiQ2hhbmdlKCRuZXh0RWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdGFiIGAkdGFyZ2V0Q29udGVudGAgZGVmaW5lZCBieSBgJHRhcmdldGAuIENvbGxhcHNlcyBhY3RpdmUgdGFiLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIFRhYiB0byBvcGVuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpc3RvcnlIYW5kbGVkIC0gYnJvd3NlciBoYXMgYWxyZWFkeSBoYW5kbGVkIGEgaGlzdG9yeSB1cGRhdGVcbiAgICogQGZpcmVzIFRhYnMjY2hhbmdlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX2hhbmRsZVRhYkNoYW5nZSgkdGFyZ2V0LCBoaXN0b3J5SGFuZGxlZCkge1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIGFjdGl2ZSBjbGFzcyBvbiB0YXJnZXQuIENvbGxhcHNlIGlmIGV4aXN0cy5cbiAgICAgKi9cbiAgICBpZiAoJHRhcmdldC5oYXNDbGFzcyhgJHt0aGlzLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzfWApKSB7XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5hY3RpdmVDb2xsYXBzZSkge1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VUYWIoJHRhcmdldCk7XG5cbiAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHpwbHVnaW4gaGFzIHN1Y2Nlc3NmdWxseSBjb2xsYXBzZWQgdGFicy5cbiAgICAgICAgICAgICogQGV2ZW50IFRhYnMjY29sbGFwc2VcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2NvbGxhcHNlLnpmLnRhYnMnLCBbJHRhcmdldF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgJG9sZFRhYiA9IHRoaXMuJGVsZW1lbnQuXG4gICAgICAgICAgZmluZChgLiR7dGhpcy5vcHRpb25zLmxpbmtDbGFzc30uJHt0aGlzLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzfWApLFxuICAgICAgICAgICR0YWJMaW5rID0gJHRhcmdldC5maW5kKCdbcm9sZT1cInRhYlwiXScpLFxuICAgICAgICAgIGhhc2ggPSAkdGFiTGlua1swXS5oYXNoLFxuICAgICAgICAgICR0YXJnZXRDb250ZW50ID0gdGhpcy4kdGFiQ29udGVudC5maW5kKGhhc2gpO1xuXG4gICAgLy9jbG9zZSBvbGQgdGFiXG4gICAgdGhpcy5fY29sbGFwc2VUYWIoJG9sZFRhYik7XG5cbiAgICAvL29wZW4gbmV3IHRhYlxuICAgIHRoaXMuX29wZW5UYWIoJHRhcmdldCk7XG5cbiAgICAvL2VpdGhlciByZXBsYWNlIG9yIHVwZGF0ZSBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlZXBMaW5rICYmICFoaXN0b3J5SGFuZGxlZCkge1xuICAgICAgdmFyIGFuY2hvciA9ICR0YXJnZXQuZmluZCgnYScpLmF0dHIoJ2hyZWYnKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGVIaXN0b3J5KSB7XG4gICAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHt9LCAnJywgYW5jaG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgYW5jaG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBwbHVnaW4gaGFzIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkIHRhYnMuXG4gICAgICogQGV2ZW50IFRhYnMjY2hhbmdlXG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UuemYudGFicycsIFskdGFyZ2V0LCAkdGFyZ2V0Q29udGVudF0pO1xuXG4gICAgLy9maXJlIHRvIGNoaWxkcmVuIGEgbXV0YXRpb24gZXZlbnRcbiAgICAkdGFyZ2V0Q29udGVudC5maW5kKFwiW2RhdGEtbXV0YXRlXVwiKS50cmlnZ2VyKFwibXV0YXRlbWUuemYudHJpZ2dlclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdGFiIGAkdGFyZ2V0Q29udGVudGAgZGVmaW5lZCBieSBgJHRhcmdldGAuXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gVGFiIHRvIE9wZW4uXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX29wZW5UYWIoJHRhcmdldCkge1xuICAgICAgdmFyICR0YWJMaW5rID0gJHRhcmdldC5maW5kKCdbcm9sZT1cInRhYlwiXScpLFxuICAgICAgICAgIGhhc2ggPSAkdGFiTGlua1swXS5oYXNoLFxuICAgICAgICAgICR0YXJnZXRDb250ZW50ID0gdGhpcy4kdGFiQ29udGVudC5maW5kKGhhc2gpO1xuXG4gICAgICAkdGFyZ2V0LmFkZENsYXNzKGAke3RoaXMub3B0aW9ucy5saW5rQWN0aXZlQ2xhc3N9YCk7XG5cbiAgICAgICR0YWJMaW5rLmF0dHIoey
5763dhcmlhLXNlbGVjdGVkJzogJ3RydWUnfSk7XG5cbiAgICAgICR0YXJnZXRDb250ZW50XG4gICAgICAgIC5hZGRDbGFzcyhgJHt0aGlzLm9wdGlvbnMucGFuZWxBY3RpdmVDbGFzc31gKVxuICAgICAgICAuYXR0cih7J2FyaWEtaGlkZGVuJzogJ2ZhbHNlJ30pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlcyBgJHRhcmdldENvbnRlbnRgIGRlZmluZWQgYnkgYCR0YXJnZXRgLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIFRhYiB0byBPcGVuLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIF9jb2xsYXBzZVRhYigkdGFyZ2V0KSB7XG4gICAgdmFyICR0YXJnZXRfYW5jaG9yID0gJHRhcmdldFxuICAgICAgLnJlbW92ZUNsYXNzKGAke3RoaXMub3B0aW9ucy5saW5rQWN0aXZlQ2xhc3N9YClcbiAgICAgIC5maW5kKCdbcm9sZT1cInRhYlwiXScpXG4gICAgICAuYXR0cih7ICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJyB9KTtcblxuICAgICQoYCMkeyR0YXJnZXRfYW5jaG9yLmF0dHIoJ2FyaWEtY29udHJvbHMnKX1gKVxuICAgICAgLnJlbW92ZUNsYXNzKGAke3RoaXMub3B0aW9ucy5wYW5lbEFjdGl2ZUNsYXNzfWApXG4gICAgICAuYXR0cih7ICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIGZvciBzZWxlY3RpbmcgYSBjb250ZW50IHBhbmUgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIHtqUXVlcnkgfCBTdHJpbmd9IGVsZW0gLSBqUXVlcnkgb2JqZWN0IG9yIHN0cmluZyBvZiB0aGUgaWQgb2YgdGhlIHBhbmUgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIHtib29sZWFufSBoaXN0b3J5SGFuZGxlZCAtIGJyb3dzZXIgaGFzIGFscmVhZHkgaGFuZGxlZCBhIGhpc3RvcnkgdXBkYXRlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgc2VsZWN0VGFiKGVsZW0sIGhpc3RvcnlIYW5kbGVkKSB7XG4gICAgdmFyIGlkU3RyO1xuXG4gICAgaWYgKHR5cGVvZiBlbGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgaWRTdHIgPSBlbGVtWzBdLmlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZFN0ciA9IGVsZW07XG4gICAgfVxuXG4gICAgaWYgKGlkU3RyLmluZGV4T2YoJyMnKSA8IDApIHtcbiAgICAgIGlkU3RyID0gYCMke2lkU3RyfWA7XG4gICAgfVxuXG4gICAgdmFyICR0YXJnZXQgPSB0aGlzLiR0YWJUaXRsZXMuZmluZChgW2hyZWYkPVwiJHtpZFN0cn1cIl1gKS5wYXJlbnQoYC4ke3RoaXMub3B0aW9ucy5saW5rQ2xhc3N9YCk7XG5cbiAgICB0aGlzLl9oYW5kbGVUYWJDaGFuZ2UoJHRhcmdldCwgaGlzdG9yeUhhbmRsZWQpO1xuICB9O1xuICAvKipcbiAgICogU2V0cyB0aGUgaGVpZ2h0IG9mIGVhY2ggcGFuZWwgdG8gdGhlIGhlaWdodCBvZiB0aGUgdGFsbGVzdCBwYW5lbC5cbiAgICogSWYgZW5hYmxlZCBpbiBvcHRpb25zLCBnZXRzIGNhbGxlZCBvbiBtZWRpYSBxdWVyeSBjaGFuZ2UuXG4gICAqIElmIGxvYWRpbmcgY29udGVudCB2aWEgZXh0ZXJuYWwgc291cmNlLCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IG9yIHdpdGggX3JlZmxvdy5cbiAgICogSWYgZW5hYmxlZCB3aXRoIGBkYXRhLW1hdGNoLWhlaWdodD1cInRydWVcImAsIHRhYnMgc2V0cyB0byBlcXVhbCBoZWlnaHRcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0SGVpZ2h0KCkge1xuICAgIHZhciBtYXggPSAwLFxuICAgICAgICBfdGhpcyA9IHRoaXM7IC8vIExvY2sgZG93biB0aGUgYHRoaXNgIHZhbHVlIGZvciB0aGUgcm9vdCB0YWJzIG9iamVjdFxuXG4gICAgdGhpcy4kdGFiQ29udGVudFxuICAgICAgLmZpbmQoYC4ke3RoaXMub3B0aW9ucy5wYW5lbENsYXNzfWApXG4gICAgICAuY3NzKCdoZWlnaHQnLCAnJylcbiAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciBwYW5lbCA9ICQodGhpcyksXG4gICAgICAgICAgICBpc0FjdGl2ZSA9IHBhbmVsLmhhc0NsYXNzKGAke190aGlzLm9wdGlvbnMucGFuZWxBY3RpdmVDbGFzc31gKTsgLy8gZ2V0IHRoZSBvcHRpb25zIGZyb20gdGhlIHBhcmVudCBpbnN0ZWFkIG9mIHRyeWluZyB0byBnZXQgdGhlbSBmcm9tIHRoZSBjaGlsZFxuXG4gICAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgICBwYW5lbC5jc3Moeyd2aXNpYmlsaXR5JzogJ2hpZGRlbicsICdkaXNwbGF5JzogJ2Jsb2NrJ30pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRlbXAgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAgICAgcGFuZWwuY3NzKHtcbiAgICAgICAgICAgICd2aXNpYmlsaXR5JzogJycsXG4gICAgICAgICAgICAnZGlzcGxheSc6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXggPSB0ZW1wID4gbWF4ID8gdGVtcCA6IG1heDtcbiAgICAgIH0pXG4gICAgICAuY3NzKCdoZWlnaHQnLCBgJHttYXh9cHhgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbiBpbnN0YW5jZSBvZiBhbiB0YWJzLlxuICAgKiBAZmlyZXMgVGFicyNkZXN0cm95ZWRcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLmZpbmQoYC4ke3RoaXMub3B0aW9ucy5saW5rQ2xhc3N9YClcbiAgICAgIC5vZmYoJy56Zi50YWJzJykuaGlkZSgpLmVuZCgpXG4gICAgICAuZmluZChgLiR7dGhpcy5vcHRpb25zLnBhbmVsQ2xhc3N9YClcbiAgICAgIC5oaWRlKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0KSB7XG4gICAgICBpZiAodGhpcy5fc2V0SGVpZ2h0TXFIYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICQod2luZG93KS5vZmYoJ2NoYW5nZWQuemYubWVkaWFxdWVyeScsIHRoaXMuX3NldEhlaWdodE1xSGFuZGxlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgJCh3aW5kb3cpLm9mZigncG9wc3RhdGUnLCB0aGlzLl9jaGVja0RlZXBMaW5rKTtcbiAgICB9XG5cbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH1cbn1cblxuVGFicy5kZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgd2luZG93IHRvIHNjcm9sbCB0byBjb250ZW50IG9mIHBhbmUgc3BlY2lmaWVkIGJ5IGhhc2ggYW5jaG9yXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWVwTGluazogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEFkanVzdCB0aGUgZGVlcCBsaW5rIHNjcm9sbCB0byBtYWtlIHN1cmUgdGhlIHRvcCBvZiB0aGUgdGFiIHBhbmVsIGlzIHZpc2libGVcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlZXBMaW5rU211ZGdlOiBmYWxzZSxcblxuICAvKipcbiAgICogQW5pbWF0aW9uIHRpbWUgKG1zKSBmb3IgdGhlIGRlZXAgbGluayBhZGp1c3RtZW50XG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWVwTGlua1NtdWRnZURlbGF5OiAzMDAsXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYnJvd3NlciBoaXN0b3J5IHdpdGggdGhlIG9wZW4gdGFiXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1cGRhdGVIaXN0b3J5OiBmYWxzZSxcblxuICAvKipcbiAgICogQWxsb3dzIHRoZSB3aW5kb3cgdG8gc2Nyb2xsIHRvIGNvbnRlbnQgb2YgYWN0aXZlIHBhbmUgb24gbG9hZCBpZiBzZXQgdG8gdHJ1ZS5cbiAgICogTm90IHJlY29tbWVuZGVkIGlmIG1vcmUgdGhhbiBvbmUgdGFiIHBhbmVsIHBlciBwYWdlLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYXV0b0ZvY3VzOiBmYWxzZSxcblxuICAvKipcbiAgICogQWxsb3dzIGtleWJvYXJkIGlucHV0IHRvICd3cmFwJyBhcm91bmQgdGhlI
5763HRhYiBsaW5rcy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgd3JhcE9uS2V5czogdHJ1ZSxcblxuICAvKipcbiAgICogQWxsb3dzIHRoZSB0YWIgY29udGVudCBwYW5lcyB0byBtYXRjaCBoZWlnaHRzIGlmIHNldCB0byB0cnVlLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbWF0Y2hIZWlnaHQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYWN0aXZlIHRhYnMgdG8gY29sbGFwc2Ugd2hlbiBjbGlja2VkLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWN0aXZlQ29sbGFwc2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDbGFzcyBhcHBsaWVkIHRvIGBsaWAncyBpbiB0YWIgbGluayBsaXN0LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICd0YWJzLXRpdGxlJ1xuICAgKi9cbiAgbGlua0NsYXNzOiAndGFicy10aXRsZScsXG5cbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gdGhlIGFjdGl2ZSBgbGlgIGluIHRhYiBsaW5rIGxpc3QuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2lzLWFjdGl2ZSdcbiAgICovXG4gIGxpbmtBY3RpdmVDbGFzczogJ2lzLWFjdGl2ZScsXG5cbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gdGhlIGNvbnRlbnQgY29udGFpbmVycy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAndGFicy1wYW5lbCdcbiAgICovXG4gIHBhbmVsQ2xhc3M6ICd0YWJzLXBhbmVsJyxcblxuICAvKipcbiAgICogQ2xhc3MgYXBwbGllZCB0byB0aGUgYWN0aXZlIGNvbnRlbnQgY29udGFpbmVyLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdpcy1hY3RpdmUnXG4gICAqL1xuICBwYW5lbEFjdGl2ZUNsYXNzOiAnaXMtYWN0aXZlJ1xufTtcblxuLy8gV2luZG93IGV4cG9ydHNcbkZvdW5kYXRpb24ucGx1Z2luKFRhYnMsICdUYWJzJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBUb2dnbGVyIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi50b2dnbGVyXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm1vdGlvblxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC50cmlnZ2Vyc1xuICovXG5cbmNsYXNzIFRvZ2dsZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBUb2dnbGVyLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIFRvZ2dsZXIjaW5pdF
5763xuICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gYWRkIHRoZSB0cmlnZ2VyIHRvLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE92ZXJyaWRlcyB0byB0aGUgZGVmYXVsdCBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFRvZ2dsZXIuZGVmYXVsdHMsIGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcbiAgICB0aGlzLmNsYXNzTmFtZSA9ICcnO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX2V2ZW50cygpO1xuXG4gICAgRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLCAnVG9nZ2xlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBUb2dnbGVyIHBsdWdpbiBieSBwYXJzaW5nIHRoZSB0b2dnbGUgY2xhc3MgZnJvbSBkYXRhLXRvZ2dsZXIsIG9yIGFuaW1hdGlvbiBjbGFzc2VzIGZyb20gZGF0YS1hbmltYXRlLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciBpbnB1dDtcbiAgICAvLyBQYXJzZSBhbmltYXRpb24gY2xhc3NlcyBpZiB0aGV5IHdlcmUgc2V0XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBpbnB1dCA9IHRoaXMub3B0aW9ucy5hbmltYXRlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuYW5pbWF0aW9uSW4gPSBpbnB1dFswXTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uT3V0ID0gaW5wdXRbMV0gfHwgbnVsbDtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCBwYXJzZSB0b2dnbGUgY2xhc3NcbiAgICBlbHNlIHtcbiAgICAgIGlucHV0ID0gdGhpcy4kZWxlbWVudC5kYXRhKCd0b2dnbGVyJyk7XG4gICAgICAvLyBBbGxvdyBmb3IgYSAuIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBpbnB1dFswXSA9PT0gJy4nID8gaW5wdXQuc2xpY2UoMSkgOiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBBZGQgQVJJQSBhdHRyaWJ1dGVzIHRvIHRyaWdnZXJzXG4gICAgdmFyIGlkID0gdGh
5763pcy4kZWxlbWVudFswXS5pZDtcbiAgICAkKGBbZGF0YS1vcGVuPVwiJHtpZH1cIl0sIFtkYXRhLWNsb3NlPVwiJHtpZH1cIl0sIFtkYXRhLXRvZ2dsZT1cIiR7aWR9XCJdYClcbiAgICAgIC5hdHRyKCdhcmlhLWNvbnRyb2xzJywgaWQpO1xuICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgaGlkZGVuLCBhZGQgYXJpYS1oaWRkZW5cbiAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0aGlzLiRlbGVtZW50LmlzKCc6aGlkZGVuJykgPyBmYWxzZSA6IHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGV2ZW50cyBmb3IgdGhlIHRvZ2dsZSB0cmlnZ2VyLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJ3RvZ2dsZS56Zi50cmlnZ2VyJykub24oJ3RvZ2dsZS56Zi50cmlnZ2VyJywgdGhpcy50b2dnbGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgdGFyZ2V0IGNsYXNzIG9uIHRoZSB0YXJnZXQgZWxlbWVudC4gQW4gZXZlbnQgaXMgZmlyZWQgZnJvbSB0aGUgb3JpZ2luYWwgdHJpZ2dlciBkZXBlbmRpbmcgb24gaWYgdGhlIHJlc3VsdGFudCBzdGF0ZSB3YXMgXCJvblwiIG9yIFwib2ZmXCIuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgVG9nZ2xlciNvblxuICAgKiBAZmlyZXMgVG9nZ2xlciNvZmZcbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzWyB0aGlzLm9wdGlvbnMuYW5pbWF0ZSA/ICdfdG9nZ2xlQW5pbWF0ZScgOiAnX3RvZ2dsZUNsYXNzJ10oKTtcbiAgfVxuXG4gIF90b2dnbGVDbGFzcygpIHtcbiAgICB0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3NOYW1lKTtcblxuICAgIHZhciBpc09uID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSk7XG4gICAgaWYgKGlzT24pIHtcbiAgICAgIC8qKlxuICAgICAgICogRmlyZXMgaWYgdGhlIHRhcmdldCBlbGVtZW50IGhhcyB0aGUgY2xhc3MgYWZ0ZXIgYSB0b2dnbGUuXG4gICAgICAgKiBAZXZlbnQgVG9nZ2xlciNvblxuICAgICAgICovXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ29uLnpmLnRvZ2dsZXInKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvKipcbiAgICAgICAqIEZpcmVzIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIHRoZSBjbGFzcyBhZnRlciBhIHRvZ2dsZS5cbiAgICAgICAqIEBldmVudCBUb2dnbGVyI29mZlxuICAgICAgICovXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ29mZi56Zi50b2dnbGVyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQVJJQShpc09uKTtcbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJ1tkYXRhLW11dGF0ZV0nKS50cmlnZ2VyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJyk7XG4gIH1cblxuICBfdG9nZ2xlQW5pbWF0ZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuJGVsZW1lbnQuaXMoJzpoaWRkZW4nKSkge1xuICAgICAgRm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZUluKHRoaXMuJGVsZW1lbnQsIHRoaXMuYW5pbWF0aW9uSW4sIGZ1bmN0aW9uKCkge1xuICAgICAgICBfdGhpcy5fdXBkYXRlQVJJQSh0cnVlKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdvbi56Zi50b2dnbGVyJyk7XG4gICAgICAgIHRoaXMuZmluZCgnW2RhdGEtbXV0YXRlXScpLnRyaWdnZXIoJ211dGF0ZW1lLnpmLnRyaWdnZXInKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIEZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVPdXQodGhpcy4kZWxlbWVudCwgdGhpcy5hbmltYXRpb25PdXQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBfdGhpcy5fdXBkYXRlQVJJQShmYWxzZSk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignb2ZmLnpmLnRvZ2dsZXInKTtcbiAgICAgICAgdGhpcy5maW5kKCdbZGF0YS1tdXRhdGVdJykudHJpZ2dlcignbXV0YXRlbWUuemYudHJpZ2dlcicpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUFSSUEoaXNPbikge1xuICAgIHRoaXMuJGVsZW1lbnQuYXR0cignYXJpYS1leHBhbmRlZCcsIGlzT24gPyB0cnVlIDogZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiBUb2dnbGVyIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi50b2dnbGVyJyk7XG4gICAgRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpO1xuICB9XG59XG5cblRvZ2dsZXIuZGVmYXVsdHMgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB0aGUgcGx1Z2luIGlmIHRoZSBlbGVtZW50IHNob3VsZCBhbmltYXRlZCB3aGVuIHRvZ2dsZWQuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhbmltYXRlOiBmYWxzZVxufTtcblxuLy8gV2luZG93IGV4cG9ydHNcbkZvdW5kYXRpb24ucGx1Z2luKFRvZ2dsZXIsICdUb2dnbGVyJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBSZXNwb25zaXZlQWNjb3JkaW9uVGFicyBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmVzcG9uc2l2ZUFjY29yZGlvblRhYnNcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudGltZXJBbmRJbWFnZUxvYWRlclxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5tb3Rpb25cbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLmFjY29yZGlvblxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udGFic1xuICovXG5cbmNsYXNzIFJlc3BvbnNpdmVBY2NvcmRpb25UYWJzIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZXNwb25zaXZlIGFjY29yZGlvbiB0YWJzLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIFJlc3BvbnNpdmVBY2NvcmRpb25UYWJzI2luaXRcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhIGRyb3Bkb3duIG1lbnUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICB0aGlzLm9wdGlvbnMgID0gJC5leHRlbmQoe30sIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcbiAgICB0aGlzLnJ1bGVzID0gdGhpcy4kZWxlbWVudC5kYXRhKCdyZXNwb25zaXZlLWFjY29yZGlvbi10YWJzJyk7XG4gICAgdGhpcy5jdXJyZW50TXEgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFBsdWdpbiA9IG51bGw7XG4gICAgaWYgKCF0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXR0cignaWQnLEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNiwgJ3Jlc3BvbnNpdmVhY2NvcmRpb250YWJzJykpO1xuICAgIH07XG5cbiAgICB0aGlzLl9pbml0KCk7XG4gICAgdGhpcy5fZXZlbnRzKCk7XG5cbiAgICBGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsICdSZXNwb25zaXZlQWNjb3JkaW9uVGFicycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBNZW51IGJ5IHBhcnNpbmcgdGhlIGNsYXNzZXMgZnJvbSB0aGUgJ2RhdGEtcmVzcG9uc2l2ZS1hY2NvcmRpb24tdGFicycgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIC8vIFRoZSBmaXJzdCB0aW1lIGFuIEludGVyY2hhbmdlIHBsdWdpbiBpcyBpbml0aWFsaXplZCwgdGhpcy5ydWxlcyBpcyBjb252ZXJ0ZWQgZnJvbSBhIHN0cmluZyBvZiBcImNsYXNzZXNcIiB0byBhbiBvYmplY3Qgb2YgcnVsZXNcbiAgICBpZiAodHlwZW9mIHRoaXMucnVsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgcnVsZXNUcmVlID0ge307XG5cbiAgICAgIC8vIFBhcnNlIHJ1bGVzIGZyb20gXCJjbGFzc2VzXCIgcHVsbGVkIGZyb20gZGF0YSBhdHRyaWJ1dGVcbiAgICAgIGxldCBydWxlcyA9IHRoaXMucnVsZXMuc3BsaXQoJyAnKTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IHJ1bGUgZm91bmRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJ1bGUgPSBydWxlc1tpXS5zcGxpdCgnLScpO1xuICAgICAgICBsZXQgcnVsZVNpemUgPSBydWxlLmxlbmd0aCA+IDEgPyBydWxlWzBdIDogJ3NtYWxsJztcbiAgICAgICAgbGV0IHJ1bGVQbHVnaW4gPSBydWxlLmxlbmd0aCA+IDEgPyBydWxlWzFdIDogcnVsZVswXTtcblxuICAgICAgICBpZiAoTWVudVBsdWdpbnNbcnVsZVBsdWdpbl0gIT09IG51bGwpIHtcbiAgICAgICAgICBydWxlc1RyZWVbcnVsZVNpemVdID0gTWVudVBsdWdpbnNbcnVsZVBsdWdpbl07XG4gICAgICAgI
5763H1cbiAgICAgIH1cblxuICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzVHJlZTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRBbGxPcHRpb25zKCk7XG5cbiAgICBpZiAoISQuaXNFbXB0eU9iamVjdCh0aGlzLnJ1bGVzKSkge1xuICAgICAgdGhpcy5fY2hlY2tNZWRpYVF1ZXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0QWxsT3B0aW9ucygpIHtcbiAgICAvL2dldCBhbGwgZGVmYXVsdHMgYW5kIG9wdGlvbnNcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLmFsbE9wdGlvbnMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gTWVudVBsdWdpbnMpIHtcbiAgICAgIGlmIChNZW51UGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHZhciBvYmogPSBNZW51UGx1Z2luc1trZXldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBkdW1teVBsdWdpbiA9ICQoJzx1bD48L3VsPicpO1xuICAgICAgICAgIHZhciB0bXBQbHVnaW4gPSBuZXcgb2JqLnBsdWdpbihkdW1teVBsdWdpbixfdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICBmb3IgKHZhciBrZXlLZXkgaW4gdG1wUGx1Z2luLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0bXBQbHVnaW4ub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXlLZXkpICYmIGtleUtleSAhPT0gJ3pmUGx1Z2luJykge1xuICAgICAgICAgICAgICB2YXIgb2JqT2JqID0gdG1wUGx1Z2luLm9wdGlvbnNba2V5S2V5XTtcbiAgICAgICAgICAgICAgX3RoaXMuYWxsT3B0aW9uc1trZXlLZXldID0gb2JqT2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0bXBQbHVnaW4uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudHMgZm9yIHRoZSBNZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICQod2luZG93KS5vbignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fY2hlY2tNZWRpYVF1ZXJpZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIGN1cnJlbnQgc2NyZWVuIHdpZHRoIGFnYWluc3QgYXZhaWxhYmxlIG1lZGlhIHF1ZXJpZXMuIElmIHRoZSBtZWRpYSBxdWVyeSBoYXMgY2hhbmdlZCwgYW5kIHRoZSBwbHVnaW4gbmVlZGVkIGhhcyBjaGFuZ2VkLCB0aGUgcGx1Z2lucyB3aWxsIHN3YXAgb3V0LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja01lZGlhUXVlcmllcygpIHtcbiAgICB2YXIgbWF0Y2hlZE1xLCBfdGhpcyA9IHRoaXM7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcnVsZSBhbmQgZmluZCB0aGUgbGFzdCBtYXRjaGluZyBydWxlXG4gICAgJC5lYWNoKHRoaXMucnVsZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgaWYgKEZvdW5kYXRpb24uTWVkaWFRdWVyeS5hdExlYXN0KGtleSkpIHtcbiAgICAgICAgbWF0Y2hlZE1xID0ga2V5O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTm8gbWF0Y2g/IE5vIGRpY2VcbiAgICBpZiAoIW1hdGNoZWRNcSkgcmV0dXJuO1xuXG4gICAgLy8gUGx1Z2luIGFscmVhZHkgaW5pdGlhbGl6ZWQ/IFdlIGdvb2RcbiAgICBpZiAodGhpcy5jdXJyZW50UGx1Z2luIGluc3RhbmNlb2YgdGhpcy5ydWxlc1ttYXRjaGVkTXFdLnBsdWdpbikgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHBsdWdpbi1zcGVjaWZpYyBDU1MgY2xhc3Nlc1xuICAgICQuZWFjaChNZW51UGx1Z2lucywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgX3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModmFsdWUuY3NzQ2xhc3MpO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSBDU1MgY2xhc3MgZm9yIHRoZSBuZXcgcGx1Z2luXG4gICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLnJ1bGVzW21hdGNoZWRNcV0uY3NzQ2xhc3MpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuZXcgcGx1Z2luXG4gICAgaWYgKHRoaXMuY3VycmVudFBsdWdpbikge1xuICAgICAgLy9kb24ndCBrbm93IHdoeSBidXQgb24gbmVzdGVkIGVsZW1lbnRzIGRhdGEgemZQbHVnaW4gZ2V0J3MgbG9zdFxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRQbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKSAmJiB0aGlzLnN0b3JlemZEYXRhKSB0aGlzLmN1cnJlbnRQbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nLHRoaXMuc3RvcmV6ZkRhdGEpO1xuICAgICAgdGhpcy5jdXJyZW50UGx1Z2luLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5faGFuZGxlTWFya3VwKHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5jc3NDbGFzcyk7XG4gICAgdGhpcy5jdXJyZW50UGx1Z2luID0gbmV3IHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5wbHVnaW4odGhpcy4kZWxlbWVudCwge30pO1xuICAgIHRoaXMuc3RvcmV6ZkRhdGEgPSB0aGlzLmN1cnJlbnRQbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKTtcblxuICB9XG5cbiAgX2hhbmRsZU1hcmt1cCh0b1NldCl7XG4gICAgdmFyIF90aGlzID0gdGhpcywgZnJvbVN0cmluZyA9ICdhY2NvcmRpb24nO1xuICAgIHZhciAkcGFuZWxzID0gJCgnW2RhdGEtdGFicy1jb250ZW50PScrdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpKyddJyk7XG4gICAgaWYgKCRwYW5lbHMubGVuZ3RoKSBmcm9tU3RyaW5nID0gJ3RhYnMnO1xuICAgIGlmIChmcm9tU3RyaW5nID09PSB0b1NldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH07XG5cbiAgICB2YXIgdGFic1RpdGxlID0gX3RoaXMuYWxsT3B0aW9ucy5saW5rQ2xhc3M/X3RoaXMuYWxsT3B0aW9ucy5saW5rQ2xhc3M6J3RhYnMtdGl0bGUnO1xuICAgIHZhciB0YWJzUGFuZWwgPSBfdGhpcy5hbGxPcHRpb25zLnBhbmVsQ2xhc3M/X3RoaXMuYWxsT3B0aW9ucy5wYW5lbENsYXNzOid0YWJzLXBhbmVsJztcblxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQXR0cigncm9sZScpO1xuICAgIHZhciAkbGlIZWFkcyA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJy4nK3RhYnNUaXRsZSsnLFtkYXRhLWFjY29yZGlvbi1pdGVtXScpLnJlbW92ZUNsYXNzKHRhYnNUaXRsZSkucmVtb3ZlQ2xhc3MoJ2FjY29yZGlvbi1pdGVtJykucmVtb3ZlQXR0cignZGF0YS1hY2NvcmRpb24taXRlbScpO1xuICAgIHZhciAkbGlIZWFkc0EgPSAkbGlIZWFkcy5jaGlsZHJlbignYScpLnJlbW92ZUNsYXNzKCdhY2NvcmRpb24tdGl0bGUnKTtcblxuICAgIGlmIChmcm9tU3RyaW5nID09PSAndGFicycpIHtcbiAgICAgICRwYW5lbHMgPSAkcGFuZWxzLmNoaWxkcmVuKCcuJyt0YWJzUGFuZWwpLnJlbW92ZUNsYXNzKHRhYnNQYW5lbCkucmVtb3ZlQXR0cigncm9sZScpLnJlbW92ZUF0dHIoJ2FyaWEtaGlkZGVuJykucmVtb3ZlQXR0cignYXJpYS1sYWJlbGxlZGJ5Jyk7XG4gICAgICAkcGFuZWxzLmNoaWxkcmVuKCdhJykucmVtb3ZlQXR0cigncm9sZScpLnJlbW92ZUF0dHIoJ2FyaWEtY29udHJvbHMnKS5yZW1vdmVBdHRyKCdhcmlhLXNlbGVjdGVkJyk7XG4gICAgfWVsc2V7XG4gICAgICAkcGFuZWxzID0gJGxpSGVhZHMuY2hpbGRyZW4oJ1tkYXRhLXRhYi1jb250ZW50XScpLnJlbW92ZUNsYXNzKCdhY2NvcmRpb24tY29udGVudCcpO1xuICAgIH07XG5cbiAgICAkcGFuZWxzLmNzcyh7ZGlzcGxheTonJyx2aXNpYmlsaXR5OicnfSk7XG4gICAgJGxpSGVhZHMuY3NzKHtkaXNwbGF5OicnLHZpc2liaWxpdHk6Jyd9KTtcbiAgICBpZiAodG9TZXQgPT09ICdhY2NvcmRpb24nKSB7XG4gICAgICAkcGFuZWxzLmVhY2goZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgJCh2YWx1ZSkuYXBwZW5kVG8oJGxpSGVhZHMuZ2V0KGtleSkpLmFkZENsYXNzKCdhY2NvcmRpb24tY29udGVudCcpLmF0dHIoJ2RhdGEtdGFiLWNvbnRlbnQnLCcnKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJykuY3NzKHtoZWlnaHQ6Jyd9KTtcbiAgICAgICAgJCgnW2RhdGEtdGFicy1jb250ZW50PScrX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSsnXScpLmFmdGVyKCc8ZGl2IGlkPVwidGFicy1wbGFjZWhvbGRlci0nK190aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykrJ1wiPjwvZGl2PicpLnJlbW92ZSgpO1xuICAgICAgICAkbGlIZWFkcy5hZGRDbGFzcygnYWNjb3JkaW9uLWl0ZW0nKS5hdHRyKCdkYXRhLWFjY29yZGlvbi1pdGVtJywnJyk7XG4gICAgICAgICRsaUhlYWRzQS5hZGRDbGFzcygnYWNjb3JkaW9uLXRpdGxlJyk7XG4gICAgICB9KTtcbiAgICB9ZWxzZSBpZiAodG9TZXQgPT09ICd0YWJzJyl7XG4gICAgICB2Y
5763XIgJHRhYnNDb250ZW50ID0gJCgnW2RhdGEtdGFicy1jb250ZW50PScrX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSsnXScpO1xuICAgICAgdmFyICRwbGFjZWhvbGRlciA9ICQoJyN0YWJzLXBsYWNlaG9sZGVyLScrX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSk7XG4gICAgICBpZiAoJHBsYWNlaG9sZGVyLmxlbmd0aCkge1xuICAgICAgICAkdGFic0NvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPVwidGFicy1jb250ZW50XCI+PC9kaXY+JykuaW5zZXJ0QWZ0ZXIoJHBsYWNlaG9sZGVyKS5hdHRyKCdkYXRhLXRhYnMtY29udGVudCcsX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSk7XG4gICAgICAgICRwbGFjZWhvbGRlci5yZW1vdmUoKTtcbiAgICAgIH1lbHNle1xuICAgICAgICAkdGFic0NvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPVwidGFicy1jb250ZW50XCI+PC9kaXY+JykuaW5zZXJ0QWZ0ZXIoX3RoaXMuJGVsZW1lbnQpLmF0dHIoJ2RhdGEtdGFicy1jb250ZW50JyxfdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpKTtcbiAgICAgIH07XG4gICAgICAkcGFuZWxzLmVhY2goZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgdmFyIHRlbXBWYWx1ZSA9ICQodmFsdWUpLmFwcGVuZFRvKCR0YWJzQ29udGVudCkuYWRkQ2xhc3ModGFic1BhbmVsKTtcbiAgICAgICAgdmFyIGhhc2ggPSAkbGlIZWFkc0EuZ2V0KGtleSkuaGFzaC5zbGljZSgxKTtcbiAgICAgICAgdmFyIGlkID0gJCh2YWx1ZSkuYXR0cignaWQnKSB8fCBGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsICdhY2NvcmRpb24nKTtcbiAgICAgICAgaWYgKGhhc2ggIT09IGlkKSB7XG4gICAgICAgICAgaWYgKGhhc2ggIT09ICcnKSB7XG4gICAgICAgICAgICAkKHZhbHVlKS5hdHRyKCdpZCcsaGFzaCk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBoYXNoID0gaWQ7XG4gICAgICAgICAgICAkKHZhbHVlKS5hdHRyKCdpZCcsaGFzaCk7XG4gICAgICAgICAgICAkKCRsaUhlYWRzQS5nZXQoa2V5KSkuYXR0cignaHJlZicsJCgkbGlIZWFkc0EuZ2V0KGtleSkpLmF0dHIoJ2hyZWYnKS5yZXBsYWNlKCcjJywnJykrJyMnK2hhc2gpO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHZhciBpc0FjdGl2ZSA9ICQoJGxpSGVhZHMuZ2V0KGtleSkpLmhhc0NsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgdGVtcFZhbHVlLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgJGxpSGVhZHMuYWRkQ2xhc3ModGFic1RpdGxlKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4gb24gdGhpcyBlbGVtZW50LCBhcyB3ZWxsIGFzIHRoZSB3aW5kb3cgcmVzaXplIGhhbmRsZXIgdGhhdCBzd2l0Y2hlcyB0aGUgcGx1Z2lucyBvdXQuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGx1Z2luKSB0aGlzLmN1cnJlbnRQbHVnaW4uZGVzdHJveSgpO1xuICAgICQod2luZG93KS5vZmYoJy56Zi5SZXNwb25zaXZlQWNjb3JkaW9uVGFicycpO1xuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5SZXNwb25zaXZlQWNjb3JkaW9uVGFicy5kZWZhdWx0cyA9IHt9O1xuXG4vLyBUaGUgcGx1Z2luIG1hdGNoZXMgdGhlIHBsdWdpbiBjbGFzc2VzIHdpdGggdGhlc2UgcGx1Z2luIGluc3RhbmNlcy5cbnZhciBNZW51UGx1Z2lucyA9IHtcbiAgdGFiczoge1xuICAgIGNzc0NsYXNzOiAndGFicycsXG4gICAgcGx1Z2luOiBGb3VuZGF0aW9uLl9wbHVnaW5zLnRhYnMgfHwgbnVsbFxuICB9LFxuICBhY2NvcmRpb246IHtcbiAgICBjc3NDbGFzczogJ2FjY29yZGlvbicsXG4gICAgcGx1Z2luOiBGb3VuZGF0aW9uLl9wbHVnaW5zLmFjY29yZGlvbiB8fCBudWxsXG4gIH1cbn07XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihSZXNwb25zaXZlQWNjb3JkaW9uVGFicywgJ1Jlc3BvbnNpdmVBY2NvcmRpb25UYWJzJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7XG5cbiAgLy8gU2Nyb2xsIHRvIHRvcCBvZiBhY2NvcmRpb24gaXRlbSB3aGVuIGFjdGl2ZVxuICBpZiAodHlwZW9mIHRoZW1lQWNjb3JkaW9uSXRlbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhlbWVBY2NvcmRpb25JdGVtKCcuYWNjb3JkaW9uJyk7XG4gIH1cblxuICAvLyBCYWNrIHRvIHJlc3VsdHNcbiAgaWYgKHR5cGVvZiB0aGVtZUJhY2tUb1Jlc3VsdHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoZW1lQmFja1RvUmVzdWx0cygnLmpzLWJhY2stdG8tcmVzdWx0cycpO1xuICB9XG5cbiAgLy8gQ29va2llIHBvbGljeVxuICBpZiAodHlwZW9mIHRoZW1lQ29va2llUG9saWN5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGVtZUNvb2tpZVBvbGljeSgpO1xuICB9XG5cbiAgLy8gRGVwYXJ0bWVudCBzZWxlY3Rpb24gZm9yIG9wZW5pbmcgaG91cnNcbiAgaWYgKHR5cGVvZiB0aGVtZURlcGFydG1lbnRPcGVuaW5nSG91cnMgPT09IFwiZnVuY3Rpb25cIiAmJiAoJCgnLmJyYW5jaC0tdGVhc2VyJykubGVuZ3RoIHx8ICQoJy5icmFuY2gtLWZ1bGwnKS5sZW5ndGgpKSB7XG4gICAgdGhlbWVEZXBhcnRtZW50T3BlbmluZ0hvdXJzKCk7XG4gIH1cblxuICAvLyBBZGRzIGEgcmVhZCBtb3JlIGxpbmsgaWYgZGl2IG92ZXIgYSBjZXJ0YWluIGhlaWdodFxuICBpZiAodHlwZW9mIHRoZW1lRXhwYW5kID09PSBcImZ1bmN0aW9uXCIgJiYgRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnQgPT0gJ3NtYWxsJykge1xuICAgIHRoZW1lRXhwYW5kKCcucGFnZS0taG9tZSAucGFnZV9fZGVzY3JpcHRpb24sIC52ZWhpY2xlLS1mdWxsIC52ZWhpY2xlX19kZXNjcmlwdGlvbicsMzAwKTtcbiAgfVxuXG4gIC8vIENsaWNrIG91dHNpZGUgdG8gY2xvc2UgdG9nZ2xlclxuICBpZiAodHlwZW9mIHRoZW1lQ2xvc2VUb2dnbGVyID09PSBcImZ1bmN0aW9uXCIgJiYgJCgnI3NlYXJjaCcpLmxlbmd0aCAmJiAhRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QoJ2xhcmdlJykpIHtcbiAgICB0aGVtZUNsb3NlVG9nZ2xlcign
5763I3NlYXJjaCcpO1xuICB9XG5cbiAgLy8gU3dhcCBwcmljZXMgaWYgc2VhcmNoaW5nIGJ5IG1vbnRobHkgcHJpY2Ugb24gdmVoaWNsZSByZXN1bHRzXG4gIGlmICh0eXBlb2YgdGhlbWVTd2FwUHJpY2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGVtZVN3YXBQcmljZXMoKTtcbiAgfVxuXG4gIC8vIEVuc3VyZXMgaW1hZ2VzIGxvYWQgaW4gdGFicyBvbiB2ZWhpY2xlIGRldGFpbHMgaWYgdmlkZW8gcHJlc2VudFxuICBpZiAodHlwZW9mIHRoZW1lVGFic1ZpZGVvID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGVtZVRhYnNWaWRlbygpO1xuICB9XG5cbiAgLy8gRW5zdXJlcyBtYXAgbG9hZHMgaW4gdGFicyBvbiB2ZWhpY2xlIGRldGFpbHNcbiAgaWYgKHR5cGVvZiB0aGVtZVRhYnNNYXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoZW1lVGFic01hcCgpO1xuICB9XG5cbiAgLy8gRmFuY3lib3ggbGlnaHRib3hcbiAgJChcIltkYXRhLWZhbmN5Ym94XVwiKS5mYW5jeWJveCgpO1xuXG4gIC8vIFNsaWNrIGNhcm91c2VsXG4gICQoJy5wYWdlX19wcmltYXJ5LWltYWdlcyA+IHVsLCAucG9zdF9fcHJpbWFyeS1pbWFnZXMgPiB1bCwgLmN1c3RvbS1lbnRyeV9fcHJpbWFyeS1pbWFnZXMgPiB1bCwgLmJyYW5jaF9fcHJpbWFyeS1pbWFnZXMgPiB1bCcpLnNsaWNrKHtcbiAgICBhdXRvcGxheTogdHJ1ZSxcbiAgICBhdXRvcGxheVNwZWVkOiAxMDAwMCxcbiAgICBpbmZpbml0ZTogdHJ1ZVxuICB9KTtcbiAgJCgnLnBhZ2VfX3NlY29uZGFyeS1pbWFnZXMgPiB1bCwgLnBvc3RfX3NlY29uZGFyeS1pbWFnZXMgPiB1bCwgLmN1c3RvbS1lbnRyeV9fc2Vjb25kYXJ5LWltYWdlcyA+IHVsLCAuYnJhbmNoX19zZWNvbmRhcnktaW1hZ2VzID4gdWwsIC5icmFuY2hfX2xvZ29zID4gdWwnKS5zbGljayh7XG4gICAgaW5maW5pdGU6IGZhbHNlXG4gIH0pO1xuICBpZiAoRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnQgPT0gJ3NtYWxsJykge1xuICAgICQoJy5saXN0aW5nLS1ibG9jayA+IHVsJykuc2xpY2soe1xuICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgaW5maW5pdGU6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgJCgnLmxpc3RpbmctLXZlaGljbGUtY29tcGFyZSAubGlzdGluZ19fbGlzdCcpLnNsaWNrKHtcbiAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgaW5maW5pdGU6IGZhbHNlLFxuICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiA2MzksXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBzbGlkZXNUb1Nob3c6IDJcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBicmVha3BvaW50OiAxMDIzLFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc2xpZGVzVG9TaG93OiA0XG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG4gICQoJy5saXN0aW5nLS12ZWhpY2xlLWZlYXR1cmVkID4gdWwsIC5saXN0aW5nLS12ZWhpY2xlLWxhdGVzdCA+IHVsLCAubGlzdGluZy0tdmVoaWNsZS1zaW1pbGFyID4gdWwnKS5zbGljayh7XG4gICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiBbe1xuICAgICAgYnJlYWtwb2ludDogNjM5LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc2xpZGVzVG9TaG93OiAyXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgYnJlYWtwb2ludDogMTAyMyxcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHNsaWRlc1RvU2hvdzogM1xuICAgICAgfVxuICAgIH1dXG4gIH0pO1xuICAkKCcubGlzdGluZy0tdmVoaWNsZS1mZWF0dXJlZC1zaWRlYmFyID4gdWwsIC5saXN0aW5nLS12ZWhpY2xlLWxhdGVzdC1zaWRlYmFyID4gdWwnKS5zbGljayh7XG4gICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIGluZmluaXRlOiBmYWxzZVxuICB9KTtcbiAgJCgnLnZlaGljbGUtLWZ1bGwgLnZlaGljbGVfX3ByaW1hcnktaW1hZ2VzID4gdWwnKS5zbGljayh7XG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgIGFkYXB0aXZlSGVpZ2h0OiB0cnVlLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBhc05hdkZvcjogJy52ZWhpY2xlX19wcmltYXJ5LWltYWdlcy10aHVtYm5haWxzID4gdWwnXG4gIH0pO1xuICAkKCcudmVoaWNsZS0tZnVsbCAudmVoaWNsZV9fcHJpbWFyeS1pbWFnZXMtdGh1bWJuYWlscyA+IHVsJykuc2xpY2soe1xuICAgIHNsaWRlc1RvU2hvdzogNCxcbiAgICBzbGlkZXNUb1Njcm9sbDogNCxcbiAgICBmb2N1c09uU2VsZWN0OiB0cnVlLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBhc05hdkZvcjogJy52ZWhpY2xlX19wcmltYXJ5LWltYWdlcyA+IHVsJyxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiBbe1xuICAgICAgYnJlYWtwb2ludDogNzY3LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc2xpZGVzVG9TaG93OiAzLFxuICAgICAgICBzbGlkZXNUb1Njcm9sbDogM1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjMsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBzbGlkZXNUb1Nob3c6IDUsXG4gICAgICAgIHNsaWRlc1RvU2Nyb2xsOiA1XG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG4gICQoJy52ZWhpY2xlLS1mdWxsIC52ZWhpY2xlX19zZWNvbmRhcnktaW1hZ2VzIHVsJykuc2xpY2soe1xuICAgIHNsaWRlc1RvU2hvdzogMSxcbiAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgcmVzcG9uc2l2ZTogW3tcbiAgICAgIGJyZWFrcG9pbnQ6IDYzOSxcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHNsaWRlc1RvU2hvdzogMlxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjMsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBzbGlkZXNUb1Nob3c6IDNcbiAgICAgIH1cbiAgICB9XVxuICB9KTtcblxuICAvLyBTd2lwZSB0byBjbG9zZSB0b2dnbGVyXG4gIGlmICgkKCcjc2VhcmNoJykubGVuZ3RoICYmICFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbGFyZ2UnKSkge1xuICAgICQoJyNzZWFyY2gnKS5zd2lwZSh7XG4gICAgICBzd2lwZUxlZnQ6IGZ1bmN0aW9uKGV2ZW50LCBkaXJlY3Rpb24sIGRpc3RhbmNlLCBkdXJhdGlvbiwgZmluZ2VyQ291bnQsIGZpbmdlckRhdGEpIHtcbiAgICAgICAgJCh0aGlzKS5mb3VuZGF0aW9uKCd0b2dnbGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFZlaGljbGUgcmVzdWx0cyBmaW5hbmNlIGZvcm0gdG9nZ2xlXG4gIGlmICgkKFwiLmxpc3RpbmdfX2FkanVzdC1maW5hbmNlIGFcIikubGVuZ3RoKSB7XG4gICAgJChcIi5saXN0aW5nX19hZGp1c3QtZmluYW5jZSBhXCIpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgJCh0aGlzKS5wYXJlbnQoXCIubGlzdGluZ19fYWRqdXN0LWZpbmFuY2VcIikubmV4dChcIi5saXN0aW5nX19maW5hbmNlLWZvcm1cIikuc2xpZGVUb2dnbGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE9wZW4gcmV2ZWFsIGVtYWlsIHZlaGljbGUgZm9ybSBmcm9tIHVybCBoYXNoIG9uIHZlaGljbGUgZGV0YWlsc1xuICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2ggPT0gJyNlbWFpbC12ZWhpY2xlJykge1xuICAgICQoJyNlbWFpbC12ZWhpY2xlJykuZm91bmRhdGlvbignb3BlbicpO1xuICB9XG5cbn0pO1xuXG4vLyBWZWhpY2xlIHNlYXJjaCBvcHRpb25zIHRvZ2dsZSBsaW1pdFxudmFyIFNlYXJjaEJhck9wdGlvbnNMaW1pdFRvID0gNTtcblxuLy8gRnVuY3Rpb25zIGxvYWRlZCBhZnRlciBzZWFyY2ggZmlsdGVycyB1cGRhdGVkIG9uIHZlaGljbGUgcmVzdWx0c1xudmFyIGFmdGVyUmVsb2FkRGVhbGVyID0gZnVuY3Rpb24oKSB7XG4gIC8vIFN3YXAgcHJpY2VzIGlmIHNlYXJjaGluZyBieSBtb250aGx5IHByaWNlIG9uIHZlaGljbGUgcmVzdWx0c1xuICBpZiAodHlwZW9mIHRoZW1lU3dhcFByaWNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhlbWVTd2FwUHJpY2VzKCk7XG4gIH1cbn1cblxuLy8gRGlzYWJsZSBmYW5jeWJveCBsaWdodGJveCBoYXNoIG1vZHVsZVxuJC5mYW5jeWJveC5kZWZhdWx0cy5oYXNoID0gZmFsc2U7XG4iXX0=

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.