(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["app"],{

/***/ "./assets/css/app.css":
/*!****************************!*\
  !*** ./assets/css/app.css ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./assets/css/common.css":
/*!*******************************!*\
  !*** ./assets/css/common.css ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./assets/css/global.scss":
/*!********************************!*\
  !*** ./assets/css/global.scss ***!
  \********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./assets/js/app.js":
/*!**************************!*\
  !*** ./assets/js/app.js ***!
  \**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global, jQuery) {/*
 * Welcome to your app's main JavaScript file!
 *
 * We recommend including the built version of this JavaScript file
 * (and its CSS file) in your base layout (base.html.twig).
 */
// any CSS you require will output into a single css file (app.css in this case)
// UTILISER LES FONT AWESOME POUR L'ICONOGRAPHIE
__webpack_require__(/*! ../../public/fontawesome/css/all.min.css */ "./public/fontawesome/css/all.min.css"); // CSS DU KOHINOS


__webpack_require__(/*! ../css/app.css */ "./assets/css/app.css"); // THEME BOOTSTRAP / BOOTSWATCH + CONFIGURATION GLOBALE (COULEURS, FONTS...)


__webpack_require__(/*! ../css/global.scss */ "./assets/css/global.scss"); // Need jQuery? Install it with "yarn add jquery", then uncomment to require it.
// require jQuery normally


var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); // create global $ and jQuery variables


global.$ = global.jQuery = $; // JS is equivalent to  the normal "bootstrap" package
// no need to set this to a variable, just require it
// require('popper.js/dist/popper.js');

__webpack_require__(/*! bootstrap */ "./node_modules/bootstrap/dist/js/bootstrap.js");

__webpack_require__(/*! ../css/common.css */ "./assets/css/common.css"); // BOOTSTRAP plugins


__webpack_require__(/*! bootstrap-slider */ "./node_modules/bootstrap-slider/dist/bootstrap-slider.js");

__webpack_require__(/*! bootstrap-slider/dist/css/bootstrap-slider.min.css */ "./node_modules/bootstrap-slider/dist/css/bootstrap-slider.min.css"); // @TODO : make boostrap-datepicker works !!
// require('bootstrap-datepicker-webpack')
// require('bootstrap-datepicker-webpack/dist/css/bootstrap-datepicker3.min.css')
// require('../../public/bundles/sonatacore/vendor/moment/min/moment-with-locales.min.js');
// require('../../public/bundles/sonatacore/vendor/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js');
// require('../../public/bundles/sonatacore/vendor/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css');
// leaftlet : for openstreetmap


__webpack_require__(/*! ../leaflet/leaflet.js */ "./assets/leaflet/leaflet.js"); // for flash message notification


__webpack_require__(/*! ../js/flash-messages.js */ "./assets/js/flash-messages.js");

__webpack_require__(/*! ../js/geoloc.js */ "./assets/js/geoloc.js");

$('#flash-messages').flashNotification('init');
var $collectionHolder; // setup an "add a groupe presta (marché amap" link

var $addGroupeButton = $('<button type="button" class="btn btn-secondary add_groupe_link"><i class="fa fa-plus-circle" aria-hidden="true"></i> Ajouter AMAP / Marché</button>');
var $newLinkLi = $('<p class="row mx-2"></p>').append($addGroupeButton);
var $addGeolocButton = $('<button type="button" class="btn btn-secondary add_groupe_link"><i class="fa fa-plus-circle" aria-hidden="true"></i> Ajouter Adresse</button>');
var $newLinkLiGeoloc = $('<p class="row mx-2"></p>').append($addGeolocButton);
/* */

function addGroupeForm($collectionHolder, $newLinkLi) {
  // Get the data-prototype explained earlier
  var prototype = $collectionHolder.data('prototype'); // get the new index

  var index = $collectionHolder.data('index'); // Replace '__name__' in the prototype's HTML to
  // instead be a number based on how many items we have

  var newForm = prototype.replace(/__name__/g, index); // increase the index with one for the next item

  $collectionHolder.data('index', index + 1); // Display the form in the page in an li, before the "Add a groupe" link li

  var $newFormLi = $('<p class="row mx-2"></p>').append(newForm);
  $newLinkLi.before($newFormLi); // add a delete link to the new form

  addGroupeFormDeleteLink($newFormLi);
}

function addGroupeFormDeleteLink($tagFormLi) {
  var $removeFormButton = $('<button type="button" class="col-3 btn btn-warning">Supprimer</button>');
  $tagFormLi.append($removeFormButton);
  $removeFormButton.on('click', function (e) {
    // remove the li for the tag form
    $tagFormLi.remove();
  });
}
/* */


function addGroupeFormGeoloc($collectionHolderGeoloc, $newLinkLiGeoloc) {
  // Get the data-prototype explained earlier
  var prototypeGeoloc = $collectionHolderGeoloc.data('prototype'); // get the new index

  var indexGeoloc = $collectionHolderGeoloc.find('.form-group').length; // Replace '__name__' in the prototype's HTML to
  // instead be a number based on how many items we have

  var newFormGeoloc = prototypeGeoloc.replace(/__name__/g, indexGeoloc); // increase the index with one for the next item

  $collectionHolderGeoloc.data('index', indexGeoloc + 1); // Display the form in the page in an li, before the "Add a groupe" link li

  var $newFormLiGeoloc = $('<p></p>').append(newFormGeoloc);
  $newLinkLiGeoloc.before($newFormLiGeoloc); // add a delete link to the new form

  addGroupeFormDeleteLinkGeoloc($newFormLiGeoloc);
}

function addGroupeFormDeleteLinkGeoloc($tagFormLiGeoloc) {
  var $removeFormButtonGeoloc = $('<button type="button" class="btn btn-warning">Supprimer</button>');
  $tagFormLiGeoloc.append($removeFormButtonGeoloc);
  $removeFormButtonGeoloc.on('click', function (e) {
    // remove the li for the tag form
    $tagFormLiGeoloc.remove();
  });
}

function showConfirmTransactionModal(div, form, montant) {
  var destinataire = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
  // Get modal
  var modal = $('#confirmTransactionModal'); // Get relevant confirmation message div

  var message = modal.find(div); // Set data in modal

  message.find('.montant_transaction').text(montant);

  if (destinataire != null) {
    message.find('.nom_destinataire').text(destinataire);
  } // Show modal and relevant confirmation message


  modal.find(div).show();
  modal.modal('show'); // Bind modal validation button with form submition

  $('#confirmTransactionModal #confirmTransactionButton').off();
  $('#confirmTransactionModal #confirmTransactionButton').on('click', function (e) {
    form.submit();
  });
}

jQuery(document).ready(function () {
  // Get the ul that holds the collection of groupes
  $collectionHolder = $('.groupeprestas'); // add a delete link to all of the existing tag form li elements

  $collectionHolder.find('div.form-group').each(function () {
    $(this).addClass('row mx-2');
    addGroupeFormDeleteLink($(this));
  }); // add the "add a groupe" anchor and li to the groupes ul

  $collectionHolder.append($newLinkLi); // count the current form inputs we have (e.g. 2), use that as the new
  // index when inserting a new item (e.g. 2)

  $collectionHolder.data('index', $collectionHolder.find(':input').length);
  $addGroupeButton.on('click', function (e) {
    // add a new groupe form (see next code block)
    addGroupeForm($collectionHolder, $newLinkLi);
  }); // Get the ul that holds the collection of groupes

  $collectionHolderGeoloc = $('.geolocs'); // add a delete link to all of the existing tag form li elements

  $collectionHolderGeoloc.find('li').each(function () {
    addGroupeFormDeleteLinkGeoloc($(this));
  }); // add the "add a groupe" anchor and li to the groupes ul

  $collectionHolderGeoloc.append($newLinkLiGeoloc); // count the current form inputs we have (e.g. 2), use that as the new
  // index when inserting a new item (e.g. 2)

  $collectionHolderGeoloc.data('index', $collectionHolderGeoloc.find(':input').length);
  $addGeolocButton.on('click', function (e) {
    // add a new groupe form (see next code block)
    addGroupeFormGeoloc($collectionHolderGeoloc, $newLinkLiGeoloc);
  }); // BOOTSTRAP TOOLTIPS

  $('[data-toggle="tooltip"]').tooltip();
  $("input:radio[name='formAchatMonnaieAdherent[montantradio]']").change(function () {
    var mySlider = $("input.achatmonnaie-montant-slider").slider(); // Set slider value like radio when radio changes

    mySlider.slider('setValue', this.value);
    $("span.achat_monnaie_montant_choisi").text(this.value + ' €');
  });
  $('input.achatmonnaie-montant-slider').slider().on('change', function (event) {
    var value = event.value.newValue;
    $("span.achat_monnaie_montant_choisi").text(value + ' €');
  });
  $('.transactionSubmit').on('click', function (e) {
    // Stop form submition
    e.preventDefault();
    var form = this.closest('form');

    if (form.checkValidity()) {
      // Get destinataire type : presta or adherent
      var destinataire_type = $('#' + form.name + '_destinataireType')[0].value;

      if (destinataire_type == 'prestataire') {
        var div = '.confirmTransactionPrestataire';
      } else {
        var div = '.confirmTransactionAdherent';
      } // Get destinataire


      var destinataire_select = $('#' + form.name + '_destinataire')[0];
      var destinataire_name = destinataire_select.options[destinataire_select.selectedIndex].text; // Get montant

      var montant_field = $('#' + form.name + '_montant')[0];
      var montant_value = montant_field.value;
      showConfirmTransactionModal(div, form, montant_value, destinataire_name);
    } else {
      // Use symfony validation
      form.submit();
    }
  });
  $('.cotisationMLCSubmit').on('click', function (e) {
    // Stop form submition
    e.preventDefault();
    var form = this.closest('form'); // Set form moyen

    $('#' + form.name + '_moyen')[0].value = 'mlc';

    if (form.checkValidity()) {
      var div = '.confirmCotisation'; // Get montant

      var montant_field = $('#' + form.name + '_montant')[0];
      var montant_value = montant_field.value;
      showConfirmTransactionModal(div, form, montant_value);
    } else {
      // Use symfony validation
      form.submit();
    }
  });
  $('.cotisationCBSubmit').on('click', function (e) {
    var form = this.closest('form'); // Set form moyen

    $('#' + form.name + '_moyen')[0].value = 'cb';
  });
  $("input:radio[name='formAchatMonnaieAConfirmerAdherent[moyen]']").change(function () {
    if ($("#demande_achat_text_" + this.value).length) {
      $(".demande_achat_text").hide();
      $("#demande_achat_text_" + this.value).show();
    }
  });
  $("input:radio[name='formAchatMonnaieAConfirmerPrestataire[moyen]']").change(function () {
    if ($("#demande_achat_text_" + this.value).length) {
      $(".demande_achat_text").hide();
      $("#demande_achat_text_" + this.value).show();
    }
  }); // $('.js-datepicker').datepicker({
  //     closeText: 'Fermer',
  //     prevText: '&#x3c;Préc',
  //     nextText: 'Suiv&#x3e;',
  //     currentText: 'Aujourd\'hui',
  //     monthNames: ['Janvier','Fevrier','Mars','Avril','Mai','Juin',
  //     'Juillet','Aout','Septembre','Octobre','Novembre','Decembre'],
  //     monthNamesShort: ['Jan','Fev','Mar','Avr','Mai','Jun',
  //     'Jul','Aou','Sep','Oct','Nov','Dec'],
  //     dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
  //     dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
  //     dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
  //     weekHeader: 'Sm',
  //     dateFormat: 'yy-mm-dd',
  //     format: 'yyyy-mm-dd',
  //     firstDay: 1,
  //     isRTL: false,
  //     showMonthAfterYear: false,
  //     yearSuffix: '',
  //     minDate: 0,
  //     maxDate: '+12M +0D',
  //     numberOfMonths: 2,
  //     showButtonPanel: true
  // });
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))

/***/ }),

/***/ "./assets/js/flash-messages.js":
/*!*************************************!*\
  !*** ./assets/js/flash-messages.js ***!
  \*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(jQuery) {function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/* JAVASCRIPT PERMETTANT L'AFFICHAGE DE MESSAGE FLASH / NOTIFICATION */
(function ($) {
  var methods = {
    init: function init(options) {
      methods.settings = $.extend({}, $.fn.flashNotification.defaults, options);
      setTimeout(function () {
        $('.alert').show('slow').delay(methods.settings.hideDelay).hide('fast');
      }, 500);
      methods.listenIncomingMessages();
    },

    /**
     * Listen to AJAX responses and display messages if they contain some
     */
    listenIncomingMessages: function listenIncomingMessages() {
      $(document).ajaxComplete(function (event, xhr, settings) {
        var data = $.parseJSON(xhr.responseText);

        if (data.messages) {
          var messages = data.messages;
          var i;

          if (messages.error) {
            for (i = 0; i < messages.error.length; i++) {
              methods.addError(messages.error[i]);
            }
          }

          if (messages.success) {
            for (i = 0; i < messages.success.length; i++) {
              methods.addSuccess(messages.success[i]);
            }
          }

          if (messages.info) {
            for (i = 0; i < messages.info.length; i++) {
              methods.addInfo(messages.info[i]);
            }
          }
        }
      });
    },
    addSuccess: function addSuccess(message) {
      var flashMessageElt = methods.getBasicFlash(message).addClass('alert-success');
      methods.addToList(flashMessageElt);
      methods.display(flashMessageElt);
    },
    addError: function addError(message) {
      var flashMessageElt = methods.getBasicFlash(message).addClass('alert-error');
      methods.addToList(flashMessageElt);
      methods.display(flashMessageElt);
    },
    addInfo: function addInfo(message) {
      var flashMessageElt = methods.getBasicFlash(message).addClass('alert-info');
      methods.addToList(flashMessageElt);
      methods.display(flashMessageElt);
    },
    getBasicFlash: function getBasicFlash(message) {
      var flashMessageElt = $('<div></div>').hide().addClass('alert').append(methods.getCloseButton()).append($('<div></div>').html(message));
      return flashMessageElt;
    },
    getCloseButton: function getCloseButton() {
      var closeButtonElt = $('<button></button>').addClass('close').attr('data-dismiss', 'alert').html('&times');
      return closeButtonElt;
    },
    addToList: function addToList(flashMessageElt) {
      flashMessageElt.appendTo($('#flash-messages'));
    },
    display: function display(flashMessageElt) {
      setTimeout(function () {
        flashMessageElt.show('slow').delay(methods.settings.hideDelay).hide('fast', function () {
          $(this).remove();
        });
      }, 500);
    }
  };

  $.fn.flashNotification = function (method) {
    // Method calling logic
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (_typeof(method) === 'object' || !method) {
      return methods.init.apply(this, arguments);
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.flashNotification');
    }
  };

  $.fn.flashNotification.defaults = {
    'hideDelay': 10000,
    'autoHide': true,
    'animate': true
  };
})(jQuery);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))

/***/ }),

/***/ "./assets/js/geoloc.js":
/*!*****************************!*\
  !*** ./assets/js/geoloc.js ***!
  \*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function($) {__webpack_require__(/*! ../leaflet/leaflet.js */ "./assets/leaflet/leaflet.js");

__webpack_require__(/*! ../js/flash-messages.js */ "./assets/js/flash-messages.js");

$(document).ready(function () {
  var mapMarkers = [];
  $(document).on('click', '.searchLatLon', function (e) {
    e.preventDefault();
    var self = $(this);
    $.ajax({
      url: self.data('url'),
      type: 'post',
      data: {
        'adresse': $('#' + self.attr('id').replace('_geoloc_search', '') + '_geoloc_adresse').val(),
        'cpostal': $('#' + self.attr('id').replace('_geoloc_search', '') + '_geoloc_cpostal').val(),
        'ville': $('#' + self.attr('id').replace('_geoloc_search', '') + '_geoloc_ville').val()
      },
      success: function success(response) {
        var divid = self.attr('id').replace('_geoloc_search', '');
        $('#' + divid + '_message').remove();
        $('#' + divid + '_map').remove();
        var marker_1 = null;

        if (response.status == 'success' && response.data && response.data.lat != '' && response.data.lon != '') {
          $('#' + divid + '_geoloc_lat').val(response.data.lat);
          $('#' + divid + '_geoloc_lon').val(response.data.lon);
          $('#' + divid + '_geoloc_lat').addClass('inputsuccess');
          $('#' + divid + '_geoloc_lon').addClass('inputsuccess');
          $('<p id="' + (divid + '_message') + '">Cliquez sur la carte si vous voulez affiner la géolocalisation</p><div id="' + (divid + '_map') + '" style="height: 250px;margin-top: 10px;"></div>').insertAfter('#' + self.attr('id'));
          var latlon = L.latLng(parseFloat(response.data.lat), parseFloat(response.data.lon));
          var mymap = L.map(divid + '_map').setView(latlon, 13);
          L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {
            maxZoom: 18,
            attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
          }).addTo(mymap);
          var marker_1 = L.marker(latlon).addTo(mymap);
        } else {
          $(this).addClass('inputerror');
          $('<p id="' + (divid + '_message') + '">ADRESSE INCONNUE : Cliquez sur la carte pour définir une adresse</p><div id="' + (divid + '_map') + '" style="height: 250px;margin-top: 10px;"></div>').insertAfter('#' + self.attr('id'));
          var mymap = L.map(divid + '_map').setView(JSON.parse($('#koh_map_center').val()), parseInt($('#koh_map_zoom').val()));
          L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {
            maxZoom: 18,
            attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
          }).addTo(mymap);
        }

        mymap.on('click', function (e) {
          if (marker_1 != null) {
            mymap.removeLayer(marker_1);
          }

          for (var i = 0; i < mapMarkers.length; i++) {
            mymap.removeLayer(mapMarkers[i]);
          } // Add marker to map at click location; add popup window


          var newMarker = new L.marker(e.latlng);
          newMarker.addTo(mymap);
          mapMarkers.push(newMarker);
          $('#' + divid + '_geoloc_lat').val(e.latlng.lat);
          $('#' + divid + '_geoloc_lon').val(e.latlng.lng);
          $('#' + divid + '_geoloc_lat').addClass('inputsuccess');
          $('#' + divid + '_geoloc_lon').addClass('inputsuccess');
        });
      }
    });
  });
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))

/***/ }),

/***/ "./assets/leaflet/leaflet.js":
/*!***********************************!*\
  !*** ./assets/leaflet/leaflet.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/* @preserve
 * Leaflet 1.4.0+Detached: 3337f36d2a2d2b33946779057619b31f674ff5dc.3337f36, a JS library for interactive maps. http://leafletjs.com
 * (c) 2010-2018 Vladimir Agafonkin, (c) 2010-2011 CloudMade
 */
!function (t, i) {
  "object" == ( false ? undefined : _typeof(exports)) && "undefined" != typeof module ? i(exports) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (i),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;
}(this, function (t) {
  "use strict";

  function i(t) {
    var i, e, n, o;

    for (e = 1, n = arguments.length; e < n; e++) {
      o = arguments[e];

      for (i in o) {
        t[i] = o[i];
      }
    }

    return t;
  }

  function e(t, i) {
    var e = Array.prototype.slice;
    if (t.bind) return t.bind.apply(t, e.call(arguments, 1));
    var n = e.call(arguments, 2);
    return function () {
      return t.apply(i, n.length ? n.concat(e.call(arguments)) : arguments);
    };
  }

  function n(t) {
    return t._leaflet_id = t._leaflet_id || ++ei, t._leaflet_id;
  }

  function o(t, i, e) {
    var n, o, s, r;
    return r = function r() {
      n = !1, o && (s.apply(e, o), o = !1);
    }, s = function s() {
      n ? o = arguments : (t.apply(e, arguments), setTimeout(r, i), n = !0);
    };
  }

  function s(t, i, e) {
    var n = i[1],
        o = i[0],
        s = n - o;
    return t === n && e ? t : ((t - o) % s + s) % s + o;
  }

  function r() {
    return !1;
  }

  function a(t, i) {
    var e = Math.pow(10, void 0 === i ? 6 : i);
    return Math.round(t * e) / e;
  }

  function h(t) {
    return t.trim ? t.trim() : t.replace(/^\s+|\s+$/g, "");
  }

  function u(t) {
    return h(t).split(/\s+/);
  }

  function l(t, i) {
    t.hasOwnProperty("options") || (t.options = t.options ? ii(t.options) : {});

    for (var e in i) {
      t.options[e] = i[e];
    }

    return t.options;
  }

  function c(t, i, e) {
    var n = [];

    for (var o in t) {
      n.push(encodeURIComponent(e ? o.toUpperCase() : o) + "=" + encodeURIComponent(t[o]));
    }

    return (i && -1 !== i.indexOf("?") ? "&" : "?") + n.join("&");
  }

  function _(t, i) {
    return t.replace(ni, function (t, e) {
      var n = i[e];
      if (void 0 === n) throw new Error("No value provided for variable " + t);
      return "function" == typeof n && (n = n(i)), n;
    });
  }

  function d(t, i) {
    for (var e = 0; e < t.length; e++) {
      if (t[e] === i) return e;
    }

    return -1;
  }

  function p(t) {
    return window["webkit" + t] || window["moz" + t] || window["ms" + t];
  }

  function m(t) {
    var i = +new Date(),
        e = Math.max(0, 16 - (i - ri));
    return ri = i + e, window.setTimeout(t, e);
  }

  function f(t, i, n) {
    if (!n || ai !== m) return ai.call(window, e(t, i));
    t.call(i);
  }

  function g(t) {
    t && hi.call(window, t);
  }

  function v() {}

  function y(t) {
    if ("undefined" != typeof L && L && L.Mixin) {
      t = oi(t) ? t : [t];

      for (var i = 0; i < t.length; i++) {
        t[i] === L.Mixin.Events && console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.", new Error().stack);
      }
    }
  }

  function x(t, i, e) {
    this.x = e ? Math.round(t) : t, this.y = e ? Math.round(i) : i;
  }

  function w(t, i, e) {
    return t instanceof x ? t : oi(t) ? new x(t[0], t[1]) : void 0 === t || null === t ? t : "object" == _typeof(t) && "x" in t && "y" in t ? new x(t.x, t.y) : new x(t, i, e);
  }

  function P(t, i) {
    if (t) for (var e = i ? [t, i] : t, n = 0, o = e.length; n < o; n++) {
      this.extend(e[n]);
    }
  }

  function b(t, i) {
    return !t || t instanceof P ? t : new P(t, i);
  }

  function T(t, i) {
    if (t) for (var e = i ? [t, i] : t, n = 0, o = e.length; n < o; n++) {
      this.extend(e[n]);
    }
  }

  function z(t, i) {
    return t instanceof T ? t : new T(t, i);
  }

  function M(t, i, e) {
    if (isNaN(t) || isNaN(i)) throw new Error("Invalid LatLng object: (" + t + ", " + i + ")");
    this.lat = +t, this.lng = +i, void 0 !== e && (this.alt = +e);
  }

  function C(t, i, e) {
    return t instanceof M ? t : oi(t) && "object" != _typeof(t[0]) ? 3 === t.length ? new M(t[0], t[1], t[2]) : 2 === t.length ? new M(t[0], t[1]) : null : void 0 === t || null === t ? t : "object" == _typeof(t) && "lat" in t ? new M(t.lat, "lng" in t ? t.lng : t.lon, t.alt) : void 0 === i ? null : new M(t, i, e);
  }

  function S(t, i, e, n) {
    if (oi(t)) return this._a = t[0], this._b = t[1], this._c = t[2], void (this._d = t[3]);
    this._a = t, this._b = i, this._c = e, this._d = n;
  }

  function Z(t, i, e, n) {
    return new S(t, i, e, n);
  }

  function E(t) {
    return document.createElementNS("http://www.w3.org/2000/svg", t);
  }

  function k(t, i) {
    var e,
        n,
        o,
        s,
        r,
        a,
        h = "";

    for (e = 0, o = t.length; e < o; e++) {
      for (n = 0, s = (r = t[e]).length; n < s; n++) {
        a = r[n], h += (n ? "L" : "M") + a.x + " " + a.y;
      }

      h += i ? Ji ? "z" : "x" : "";
    }

    return h || "M0 0";
  }

  function B(t) {
    return navigator.userAgent.toLowerCase().indexOf(t) >= 0;
  }

  function A(t, i, e, n) {
    return "touchstart" === i ? O(t, e, n) : "touchmove" === i ? W(t, e, n) : "touchend" === i && H(t, e, n), this;
  }

  function I(t, i, e) {
    var n = t["_leaflet_" + i + e];
    return "touchstart" === i ? t.removeEventListener(te, n, !1) : "touchmove" === i ? t.removeEventListener(ie, n, !1) : "touchend" === i && (t.removeEventListener(ee, n, !1), t.removeEventListener(ne, n, !1)), this;
  }

  function O(t, i, n) {
    var o = e(function (t) {
      if ("mouse" !== t.pointerType && t.MSPOINTER_TYPE_MOUSE && t.pointerType !== t.MSPOINTER_TYPE_MOUSE) {
        if (!(oe.indexOf(t.target.tagName) < 0)) return;
        Pt(t);
      }

      j(t, i);
    });
    t["_leaflet_touchstart" + n] = o, t.addEventListener(te, o, !1), re || (document.documentElement.addEventListener(te, R, !0), document.documentElement.addEventListener(ie, N, !0), document.documentElement.addEventListener(ee, D, !0), document.documentElement.addEventListener(ne, D, !0), re = !0);
  }

  function R(t) {
    se[t.pointerId] = t, ae++;
  }

  function N(t) {
    se[t.pointerId] && (se[t.pointerId] = t);
  }

  function D(t) {
    delete se[t.pointerId], ae--;
  }

  function j(t, i) {
    t.touches = [];

    for (var e in se) {
      t.touches.push(se[e]);
    }

    t.changedTouches = [t], i(t);
  }

  function W(t, i, e) {
    var n = function n(t) {
      (t.pointerType !== t.MSPOINTER_TYPE_MOUSE && "mouse" !== t.pointerType || 0 !== t.buttons) && j(t, i);
    };

    t["_leaflet_touchmove" + e] = n, t.addEventListener(ie, n, !1);
  }

  function H(t, i, e) {
    var n = function n(t) {
      j(t, i);
    };

    t["_leaflet_touchend" + e] = n, t.addEventListener(ee, n, !1), t.addEventListener(ne, n, !1);
  }

  function F(t, i, e) {
    function n(t) {
      var i;

      if (Vi) {
        if (!bi || "mouse" === t.pointerType) return;
        i = ae;
      } else i = t.touches.length;

      if (!(i > 1)) {
        var e = Date.now(),
            n = e - (s || e);
        r = t.touches ? t.touches[0] : t, a = n > 0 && n <= h, s = e;
      }
    }

    function o(t) {
      if (a && !r.cancelBubble) {
        if (Vi) {
          if (!bi || "mouse" === t.pointerType) return;
          var e,
              n,
              o = {};

          for (n in r) {
            e = r[n], o[n] = e && e.bind ? e.bind(r) : e;
          }

          r = o;
        }

        r.type = "dblclick", i(r), s = null;
      }
    }

    var s,
        r,
        a = !1,
        h = 250;
    return t[le + he + e] = n, t[le + ue + e] = o, t[le + "dblclick" + e] = i, t.addEventListener(he, n, !1), t.addEventListener(ue, o, !1), t.addEventListener("dblclick", i, !1), this;
  }

  function U(t, i) {
    var e = t[le + he + i],
        n = t[le + ue + i],
        o = t[le + "dblclick" + i];
    return t.removeEventListener(he, e, !1), t.removeEventListener(ue, n, !1), bi || t.removeEventListener("dblclick", o, !1), this;
  }

  function V(t) {
    return "string" == typeof t ? document.getElementById(t) : t;
  }

  function q(t, i) {
    var e = t.style[i] || t.currentStyle && t.currentStyle[i];

    if ((!e || "auto" === e) && document.defaultView) {
      var n = document.defaultView.getComputedStyle(t, null);
      e = n ? n[i] : null;
    }

    return "auto" === e ? null : e;
  }

  function G(t, i, e) {
    var n = document.createElement(t);
    return n.className = i || "", e && e.appendChild(n), n;
  }

  function K(t) {
    var i = t.parentNode;
    i && i.removeChild(t);
  }

  function Y(t) {
    for (; t.firstChild;) {
      t.removeChild(t.firstChild);
    }
  }

  function X(t) {
    var i = t.parentNode;
    i && i.lastChild !== t && i.appendChild(t);
  }

  function J(t) {
    var i = t.parentNode;
    i && i.firstChild !== t && i.insertBefore(t, i.firstChild);
  }

  function $(t, i) {
    if (void 0 !== t.classList) return t.classList.contains(i);
    var e = et(t);
    return e.length > 0 && new RegExp("(^|\\s)" + i + "(\\s|$)").test(e);
  }

  function Q(t, i) {
    if (void 0 !== t.classList) for (var e = u(i), n = 0, o = e.length; n < o; n++) {
      t.classList.add(e[n]);
    } else if (!$(t, i)) {
      var s = et(t);
      it(t, (s ? s + " " : "") + i);
    }
  }

  function tt(t, i) {
    void 0 !== t.classList ? t.classList.remove(i) : it(t, h((" " + et(t) + " ").replace(" " + i + " ", " ")));
  }

  function it(t, i) {
    void 0 === t.className.baseVal ? t.className = i : t.className.baseVal = i;
  }

  function et(t) {
    return t.correspondingElement && (t = t.correspondingElement), void 0 === t.className.baseVal ? t.className : t.className.baseVal;
  }

  function nt(t, i) {
    "opacity" in t.style ? t.style.opacity = i : "filter" in t.style && ot(t, i);
  }

  function ot(t, i) {
    var e = !1,
        n = "DXImageTransform.Microsoft.Alpha";

    try {
      e = t.filters.item(n);
    } catch (t) {
      if (1 === i) return;
    }

    i = Math.round(100 * i), e ? (e.Enabled = 100 !== i, e.Opacity = i) : t.style.filter += " progid:" + n + "(opacity=" + i + ")";
  }

  function st(t) {
    for (var i = document.documentElement.style, e = 0; e < t.length; e++) {
      if (t[e] in i) return t[e];
    }

    return !1;
  }

  function rt(t, i, e) {
    var n = i || new x(0, 0);
    t.style[ce] = (Ri ? "translate(" + n.x + "px," + n.y + "px)" : "translate3d(" + n.x + "px," + n.y + "px,0)") + (e ? " scale(" + e + ")" : "");
  }

  function at(t, i) {
    t._leaflet_pos = i, ji ? rt(t, i) : (t.style.left = i.x + "px", t.style.top = i.y + "px");
  }

  function ht(t) {
    return t._leaflet_pos || new x(0, 0);
  }

  function ut() {
    mt(window, "dragstart", Pt);
  }

  function lt() {
    ft(window, "dragstart", Pt);
  }

  function ct(t) {
    for (; -1 === t.tabIndex;) {
      t = t.parentNode;
    }

    t.style && (_t(), me = t, fe = t.style.outline, t.style.outline = "none", mt(window, "keydown", _t));
  }

  function _t() {
    me && (me.style.outline = fe, me = void 0, fe = void 0, ft(window, "keydown", _t));
  }

  function dt(t) {
    do {
      t = t.parentNode;
    } while (!(t.offsetWidth && t.offsetHeight || t === document.body));

    return t;
  }

  function pt(t) {
    var i = t.getBoundingClientRect();
    return {
      x: i.width / t.offsetWidth || 1,
      y: i.height / t.offsetHeight || 1,
      boundingClientRect: i
    };
  }

  function mt(t, i, e, n) {
    if ("object" == _typeof(i)) for (var o in i) {
      gt(t, o, i[o], e);
    } else for (var s = 0, r = (i = u(i)).length; s < r; s++) {
      gt(t, i[s], e, n);
    }
    return this;
  }

  function ft(t, i, e, n) {
    if ("object" == _typeof(i)) for (var o in i) {
      vt(t, o, i[o], e);
    } else if (i) for (var s = 0, r = (i = u(i)).length; s < r; s++) {
      vt(t, i[s], e, n);
    } else {
      for (var a in t[ye]) {
        vt(t, a, t[ye][a]);
      }

      delete t[ye];
    }
    return this;
  }

  function gt(t, i, e, o) {
    var s = i + n(e) + (o ? "_" + n(o) : "");
    if (t[ye] && t[ye][s]) return this;

    var r = function r(i) {
      return e.call(o || t, i || window.event);
    },
        a = r;

    Vi && 0 === i.indexOf("touch") ? A(t, i, r, s) : !qi || "dblclick" !== i || !F || Vi && Ei ? "addEventListener" in t ? "mousewheel" === i ? t.addEventListener("onwheel" in t ? "wheel" : "mousewheel", r, !1) : "mouseenter" === i || "mouseleave" === i ? (r = function r(i) {
      i = i || window.event, Ct(t, i) && a(i);
    }, t.addEventListener("mouseenter" === i ? "mouseover" : "mouseout", r, !1)) : ("click" === i && zi && (r = function r(t) {
      St(t, a);
    }), t.addEventListener(i, r, !1)) : "attachEvent" in t && t.attachEvent("on" + i, r) : F(t, r, s), t[ye] = t[ye] || {}, t[ye][s] = r;
  }

  function vt(t, i, e, o) {
    var s = i + n(e) + (o ? "_" + n(o) : ""),
        r = t[ye] && t[ye][s];
    if (!r) return this;
    Vi && 0 === i.indexOf("touch") ? I(t, i, s) : !qi || "dblclick" !== i || !U || Vi && Ei ? "removeEventListener" in t ? "mousewheel" === i ? t.removeEventListener("onwheel" in t ? "wheel" : "mousewheel", r, !1) : t.removeEventListener("mouseenter" === i ? "mouseover" : "mouseleave" === i ? "mouseout" : i, r, !1) : "detachEvent" in t && t.detachEvent("on" + i, r) : U(t, s), t[ye][s] = null;
  }

  function yt(t) {
    return t.stopPropagation ? t.stopPropagation() : t.originalEvent ? t.originalEvent._stopped = !0 : t.cancelBubble = !0, Mt(t), this;
  }

  function xt(t) {
    return gt(t, "mousewheel", yt), this;
  }

  function wt(t) {
    return mt(t, "mousedown touchstart dblclick", yt), gt(t, "click", zt), this;
  }

  function Pt(t) {
    return t.preventDefault ? t.preventDefault() : t.returnValue = !1, this;
  }

  function Lt(t) {
    return Pt(t), yt(t), this;
  }

  function bt(t, i) {
    if (!i) return new x(t.clientX, t.clientY);
    var e = pt(i),
        n = e.boundingClientRect;
    return new x((t.clientX - n.left) / e.x - i.clientLeft, (t.clientY - n.top) / e.y - i.clientTop);
  }

  function Tt(t) {
    return bi ? t.wheelDeltaY / 2 : t.deltaY && 0 === t.deltaMode ? -t.deltaY / xe : t.deltaY && 1 === t.deltaMode ? 20 * -t.deltaY : t.deltaY && 2 === t.deltaMode ? 60 * -t.deltaY : t.deltaX || t.deltaZ ? 0 : t.wheelDelta ? (t.wheelDeltaY || t.wheelDelta) / 2 : t.detail && Math.abs(t.detail) < 32765 ? 20 * -t.detail : t.detail ? t.detail / -32765 * 60 : 0;
  }

  function zt(t) {
    we[t.type] = !0;
  }

  function Mt(t) {
    var i = we[t.type];
    return we[t.type] = !1, i;
  }

  function Ct(t, i) {
    var e = i.relatedTarget;
    if (!e) return !0;

    try {
      for (; e && e !== t;) {
        e = e.parentNode;
      }
    } catch (t) {
      return !1;
    }

    return e !== t;
  }

  function St(t, i) {
    var e = t.timeStamp || t.originalEvent && t.originalEvent.timeStamp,
        n = ge && e - ge;
    n && n > 100 && n < 500 || t.target._simulatedClick && !t._simulated ? Lt(t) : (ge = e, i(t));
  }

  function Zt(t, i) {
    if (!i || !t.length) return t.slice();
    var e = i * i;
    return t = At(t, e), t = kt(t, e);
  }

  function Et(t, i, e) {
    return Math.sqrt(Dt(t, i, e, !0));
  }

  function kt(t, i) {
    var e = t.length,
        n = new ((typeof Uint8Array === "undefined" ? "undefined" : _typeof(Uint8Array)) != void 0 + "" ? Uint8Array : Array)(e);
    n[0] = n[e - 1] = 1, Bt(t, n, i, 0, e - 1);
    var o,
        s = [];

    for (o = 0; o < e; o++) {
      n[o] && s.push(t[o]);
    }

    return s;
  }

  function Bt(t, i, e, n, o) {
    var s,
        r,
        a,
        h = 0;

    for (r = n + 1; r <= o - 1; r++) {
      (a = Dt(t[r], t[n], t[o], !0)) > h && (s = r, h = a);
    }

    h > e && (i[s] = 1, Bt(t, i, e, n, s), Bt(t, i, e, s, o));
  }

  function At(t, i) {
    for (var e = [t[0]], n = 1, o = 0, s = t.length; n < s; n++) {
      Nt(t[n], t[o]) > i && (e.push(t[n]), o = n);
    }

    return o < s - 1 && e.push(t[s - 1]), e;
  }

  function It(t, i, e, n, o) {
    var s,
        r,
        a,
        h = n ? ke : Rt(t, e),
        u = Rt(i, e);

    for (ke = u;;) {
      if (!(h | u)) return [t, i];
      if (h & u) return !1;
      a = Rt(r = Ot(t, i, s = h || u, e, o), e), s === h ? (t = r, h = a) : (i = r, u = a);
    }
  }

  function Ot(t, i, e, n, o) {
    var s,
        r,
        a = i.x - t.x,
        h = i.y - t.y,
        u = n.min,
        l = n.max;
    return 8 & e ? (s = t.x + a * (l.y - t.y) / h, r = l.y) : 4 & e ? (s = t.x + a * (u.y - t.y) / h, r = u.y) : 2 & e ? (s = l.x, r = t.y + h * (l.x - t.x) / a) : 1 & e && (s = u.x, r = t.y + h * (u.x - t.x) / a), new x(s, r, o);
  }

  function Rt(t, i) {
    var e = 0;
    return t.x < i.min.x ? e |= 1 : t.x > i.max.x && (e |= 2), t.y < i.min.y ? e |= 4 : t.y > i.max.y && (e |= 8), e;
  }

  function Nt(t, i) {
    var e = i.x - t.x,
        n = i.y - t.y;
    return e * e + n * n;
  }

  function Dt(t, i, e, n) {
    var o,
        s = i.x,
        r = i.y,
        a = e.x - s,
        h = e.y - r,
        u = a * a + h * h;
    return u > 0 && ((o = ((t.x - s) * a + (t.y - r) * h) / u) > 1 ? (s = e.x, r = e.y) : o > 0 && (s += a * o, r += h * o)), a = t.x - s, h = t.y - r, n ? a * a + h * h : new x(s, r);
  }

  function jt(t) {
    return !oi(t[0]) || "object" != _typeof(t[0][0]) && void 0 !== t[0][0];
  }

  function Wt(t) {
    return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."), jt(t);
  }

  function Ht(t, i, e) {
    var n,
        o,
        s,
        r,
        a,
        h,
        u,
        l,
        c,
        _ = [1, 4, 2, 8];

    for (o = 0, u = t.length; o < u; o++) {
      t[o]._code = Rt(t[o], i);
    }

    for (r = 0; r < 4; r++) {
      for (l = _[r], n = [], o = 0, s = (u = t.length) - 1; o < u; s = o++) {
        a = t[o], h = t[s], a._code & l ? h._code & l || ((c = Ot(h, a, l, i, e))._code = Rt(c, i), n.push(c)) : (h._code & l && ((c = Ot(h, a, l, i, e))._code = Rt(c, i), n.push(c)), n.push(a));
      }

      t = n;
    }

    return t;
  }

  function Ft(t, i) {
    var e,
        n,
        o,
        s,
        r = "Feature" === t.type ? t.geometry : t,
        a = r ? r.coordinates : null,
        h = [],
        u = i && i.pointToLayer,
        l = i && i.coordsToLatLng || Ut;
    if (!a && !r) return null;

    switch (r.type) {
      case "Point":
        return e = l(a), u ? u(t, e) : new $e(e);

      case "MultiPoint":
        for (o = 0, s = a.length; o < s; o++) {
          e = l(a[o]), h.push(u ? u(t, e) : new $e(e));
        }

        return new Ke(h);

      case "LineString":
      case "MultiLineString":
        return n = Vt(a, "LineString" === r.type ? 0 : 1, l), new nn(n, i);

      case "Polygon":
      case "MultiPolygon":
        return n = Vt(a, "Polygon" === r.type ? 1 : 2, l), new on(n, i);

      case "GeometryCollection":
        for (o = 0, s = r.geometries.length; o < s; o++) {
          var c = Ft({
            geometry: r.geometries[o],
            type: "Feature",
            properties: t.properties
          }, i);
          c && h.push(c);
        }

        return new Ke(h);

      default:
        throw new Error("Invalid GeoJSON object.");
    }
  }

  function Ut(t) {
    return new M(t[1], t[0], t[2]);
  }

  function Vt(t, i, e) {
    for (var n, o = [], s = 0, r = t.length; s < r; s++) {
      n = i ? Vt(t[s], i - 1, e) : (e || Ut)(t[s]), o.push(n);
    }

    return o;
  }

  function qt(t, i) {
    return i = "number" == typeof i ? i : 6, void 0 !== t.alt ? [a(t.lng, i), a(t.lat, i), a(t.alt, i)] : [a(t.lng, i), a(t.lat, i)];
  }

  function Gt(t, i, e, n) {
    for (var o = [], s = 0, r = t.length; s < r; s++) {
      o.push(i ? Gt(t[s], i - 1, e, n) : qt(t[s], n));
    }

    return !i && e && o.push(o[0]), o;
  }

  function Kt(t, e) {
    return t.feature ? i({}, t.feature, {
      geometry: e
    }) : Yt(e);
  }

  function Yt(t) {
    return "Feature" === t.type || "FeatureCollection" === t.type ? t : {
      type: "Feature",
      properties: {},
      geometry: t
    };
  }

  function Xt(t, i) {
    return new sn(t, i);
  }

  function Jt(t, i) {
    return new mn(t, i);
  }

  function $t(t) {
    return Xi ? new vn(t) : null;
  }

  function Qt(t) {
    return Ji || $i ? new Pn(t) : null;
  }

  var ti = Object.freeze;

  Object.freeze = function (t) {
    return t;
  };

  var ii = Object.create || function () {
    function t() {}

    return function (i) {
      return t.prototype = i, new t();
    };
  }(),
      ei = 0,
      ni = /\{ *([\w_-]+) *\}/g,
      oi = Array.isArray || function (t) {
    return "[object Array]" === Object.prototype.toString.call(t);
  },
      si = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",
      ri = 0,
      ai = window.requestAnimationFrame || p("RequestAnimationFrame") || m,
      hi = window.cancelAnimationFrame || p("CancelAnimationFrame") || p("CancelRequestAnimationFrame") || function (t) {
    window.clearTimeout(t);
  },
      ui = (Object.freeze || Object)({
    freeze: ti,
    extend: i,
    create: ii,
    bind: e,
    lastId: ei,
    stamp: n,
    throttle: o,
    wrapNum: s,
    falseFn: r,
    formatNum: a,
    trim: h,
    splitWords: u,
    setOptions: l,
    getParamString: c,
    template: _,
    isArray: oi,
    indexOf: d,
    emptyImageUrl: si,
    requestFn: ai,
    cancelFn: hi,
    requestAnimFrame: f,
    cancelAnimFrame: g
  });

  v.extend = function (t) {
    var e = function e() {
      this.initialize && this.initialize.apply(this, arguments), this.callInitHooks();
    },
        n = e.__super__ = this.prototype,
        o = ii(n);

    o.constructor = e, e.prototype = o;

    for (var s in this) {
      this.hasOwnProperty(s) && "prototype" !== s && "__super__" !== s && (e[s] = this[s]);
    }

    return t.statics && (i(e, t.statics), delete t.statics), t.includes && (y(t.includes), i.apply(null, [o].concat(t.includes)), delete t.includes), o.options && (t.options = i(ii(o.options), t.options)), i(o, t), o._initHooks = [], o.callInitHooks = function () {
      if (!this._initHooksCalled) {
        n.callInitHooks && n.callInitHooks.call(this), this._initHooksCalled = !0;

        for (var t = 0, i = o._initHooks.length; t < i; t++) {
          o._initHooks[t].call(this);
        }
      }
    }, e;
  }, v.include = function (t) {
    return i(this.prototype, t), this;
  }, v.mergeOptions = function (t) {
    return i(this.prototype.options, t), this;
  }, v.addInitHook = function (t) {
    var i = Array.prototype.slice.call(arguments, 1),
        e = "function" == typeof t ? t : function () {
      this[t].apply(this, i);
    };
    return this.prototype._initHooks = this.prototype._initHooks || [], this.prototype._initHooks.push(e), this;
  };
  var li = {
    on: function on(t, i, e) {
      if ("object" == _typeof(t)) for (var n in t) {
        this._on(n, t[n], i);
      } else for (var o = 0, s = (t = u(t)).length; o < s; o++) {
        this._on(t[o], i, e);
      }
      return this;
    },
    off: function off(t, i, e) {
      if (t) {
        if ("object" == _typeof(t)) for (var n in t) {
          this._off(n, t[n], i);
        } else for (var o = 0, s = (t = u(t)).length; o < s; o++) {
          this._off(t[o], i, e);
        }
      } else delete this._events;
      return this;
    },
    _on: function _on(t, i, e) {
      this._events = this._events || {};
      var n = this._events[t];
      n || (n = [], this._events[t] = n), e === this && (e = void 0);

      for (var o = {
        fn: i,
        ctx: e
      }, s = n, r = 0, a = s.length; r < a; r++) {
        if (s[r].fn === i && s[r].ctx === e) return;
      }

      s.push(o);
    },
    _off: function _off(t, i, e) {
      var n, o, s;
      if (this._events && (n = this._events[t])) if (i) {
        if (e === this && (e = void 0), n) for (o = 0, s = n.length; o < s; o++) {
          var a = n[o];
          if (a.ctx === e && a.fn === i) return a.fn = r, this._firingCount && (this._events[t] = n = n.slice()), void n.splice(o, 1);
        }
      } else {
        for (o = 0, s = n.length; o < s; o++) {
          n[o].fn = r;
        }

        delete this._events[t];
      }
    },
    fire: function fire(t, e, n) {
      if (!this.listens(t, n)) return this;
      var o = i({}, e, {
        type: t,
        target: this,
        sourceTarget: e && e.sourceTarget || this
      });

      if (this._events) {
        var s = this._events[t];

        if (s) {
          this._firingCount = this._firingCount + 1 || 1;

          for (var r = 0, a = s.length; r < a; r++) {
            var h = s[r];
            h.fn.call(h.ctx || this, o);
          }

          this._firingCount--;
        }
      }

      return n && this._propagateEvent(o), this;
    },
    listens: function listens(t, i) {
      var e = this._events && this._events[t];
      if (e && e.length) return !0;
      if (i) for (var n in this._eventParents) {
        if (this._eventParents[n].listens(t, i)) return !0;
      }
      return !1;
    },
    once: function once(t, i, n) {
      if ("object" == _typeof(t)) {
        for (var o in t) {
          this.once(o, t[o], i);
        }

        return this;
      }

      var s = e(function () {
        this.off(t, i, n).off(t, s, n);
      }, this);
      return this.on(t, i, n).on(t, s, n);
    },
    addEventParent: function addEventParent(t) {
      return this._eventParents = this._eventParents || {}, this._eventParents[n(t)] = t, this;
    },
    removeEventParent: function removeEventParent(t) {
      return this._eventParents && delete this._eventParents[n(t)], this;
    },
    _propagateEvent: function _propagateEvent(t) {
      for (var e in this._eventParents) {
        this._eventParents[e].fire(t.type, i({
          layer: t.target,
          propagatedFrom: t.target
        }, t), !0);
      }
    }
  };
  li.addEventListener = li.on, li.removeEventListener = li.clearAllEventListeners = li.off, li.addOneTimeEventListener = li.once, li.fireEvent = li.fire, li.hasEventListeners = li.listens;

  var ci = v.extend(li),
      _i = Math.trunc || function (t) {
    return t > 0 ? Math.floor(t) : Math.ceil(t);
  };

  x.prototype = {
    clone: function clone() {
      return new x(this.x, this.y);
    },
    add: function add(t) {
      return this.clone()._add(w(t));
    },
    _add: function _add(t) {
      return this.x += t.x, this.y += t.y, this;
    },
    subtract: function subtract(t) {
      return this.clone()._subtract(w(t));
    },
    _subtract: function _subtract(t) {
      return this.x -= t.x, this.y -= t.y, this;
    },
    divideBy: function divideBy(t) {
      return this.clone()._divideBy(t);
    },
    _divideBy: function _divideBy(t) {
      return this.x /= t, this.y /= t, this;
    },
    multiplyBy: function multiplyBy(t) {
      return this.clone()._multiplyBy(t);
    },
    _multiplyBy: function _multiplyBy(t) {
      return this.x *= t, this.y *= t, this;
    },
    scaleBy: function scaleBy(t) {
      return new x(this.x * t.x, this.y * t.y);
    },
    unscaleBy: function unscaleBy(t) {
      return new x(this.x / t.x, this.y / t.y);
    },
    round: function round() {
      return this.clone()._round();
    },
    _round: function _round() {
      return this.x = Math.round(this.x), this.y = Math.round(this.y), this;
    },
    floor: function floor() {
      return this.clone()._floor();
    },
    _floor: function _floor() {
      return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this;
    },
    ceil: function ceil() {
      return this.clone()._ceil();
    },
    _ceil: function _ceil() {
      return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this;
    },
    trunc: function trunc() {
      return this.clone()._trunc();
    },
    _trunc: function _trunc() {
      return this.x = _i(this.x), this.y = _i(this.y), this;
    },
    distanceTo: function distanceTo(t) {
      var i = (t = w(t)).x - this.x,
          e = t.y - this.y;
      return Math.sqrt(i * i + e * e);
    },
    equals: function equals(t) {
      return (t = w(t)).x === this.x && t.y === this.y;
    },
    contains: function contains(t) {
      return t = w(t), Math.abs(t.x) <= Math.abs(this.x) && Math.abs(t.y) <= Math.abs(this.y);
    },
    toString: function toString() {
      return "Point(" + a(this.x) + ", " + a(this.y) + ")";
    }
  }, P.prototype = {
    extend: function extend(t) {
      return t = w(t), this.min || this.max ? (this.min.x = Math.min(t.x, this.min.x), this.max.x = Math.max(t.x, this.max.x), this.min.y = Math.min(t.y, this.min.y), this.max.y = Math.max(t.y, this.max.y)) : (this.min = t.clone(), this.max = t.clone()), this;
    },
    getCenter: function getCenter(t) {
      return new x((this.min.x + this.max.x) / 2, (this.min.y + this.max.y) / 2, t);
    },
    getBottomLeft: function getBottomLeft() {
      return new x(this.min.x, this.max.y);
    },
    getTopRight: function getTopRight() {
      return new x(this.max.x, this.min.y);
    },
    getTopLeft: function getTopLeft() {
      return this.min;
    },
    getBottomRight: function getBottomRight() {
      return this.max;
    },
    getSize: function getSize() {
      return this.max.subtract(this.min);
    },
    contains: function contains(t) {
      var i, e;
      return (t = "number" == typeof t[0] || t instanceof x ? w(t) : b(t)) instanceof P ? (i = t.min, e = t.max) : i = e = t, i.x >= this.min.x && e.x <= this.max.x && i.y >= this.min.y && e.y <= this.max.y;
    },
    intersects: function intersects(t) {
      t = b(t);
      var i = this.min,
          e = this.max,
          n = t.min,
          o = t.max,
          s = o.x >= i.x && n.x <= e.x,
          r = o.y >= i.y && n.y <= e.y;
      return s && r;
    },
    overlaps: function overlaps(t) {
      t = b(t);
      var i = this.min,
          e = this.max,
          n = t.min,
          o = t.max,
          s = o.x > i.x && n.x < e.x,
          r = o.y > i.y && n.y < e.y;
      return s && r;
    },
    isValid: function isValid() {
      return !(!this.min || !this.max);
    }
  }, T.prototype = {
    extend: function extend(t) {
      var i,
          e,
          n = this._southWest,
          o = this._northEast;
      if (t instanceof M) i = t, e = t;else {
        if (!(t instanceof T)) return t ? this.extend(C(t) || z(t)) : this;
        if (i = t._southWest, e = t._northEast, !i || !e) return this;
      }
      return n || o ? (n.lat = Math.min(i.lat, n.lat), n.lng = Math.min(i.lng, n.lng), o.lat = Math.max(e.lat, o.lat), o.lng = Math.max(e.lng, o.lng)) : (this._southWest = new M(i.lat, i.lng), this._northEast = new M(e.lat, e.lng)), this;
    },
    pad: function pad(t) {
      var i = this._southWest,
          e = this._northEast,
          n = Math.abs(i.lat - e.lat) * t,
          o = Math.abs(i.lng - e.lng) * t;
      return new T(new M(i.lat - n, i.lng - o), new M(e.lat + n, e.lng + o));
    },
    getCenter: function getCenter() {
      return new M((this._southWest.lat + this._northEast.lat) / 2, (this._southWest.lng + this._northEast.lng) / 2);
    },
    getSouthWest: function getSouthWest() {
      return this._southWest;
    },
    getNorthEast: function getNorthEast() {
      return this._northEast;
    },
    getNorthWest: function getNorthWest() {
      return new M(this.getNorth(), this.getWest());
    },
    getSouthEast: function getSouthEast() {
      return new M(this.getSouth(), this.getEast());
    },
    getWest: function getWest() {
      return this._southWest.lng;
    },
    getSouth: function getSouth() {
      return this._southWest.lat;
    },
    getEast: function getEast() {
      return this._northEast.lng;
    },
    getNorth: function getNorth() {
      return this._northEast.lat;
    },
    contains: function contains(t) {
      t = "number" == typeof t[0] || t instanceof M || "lat" in t ? C(t) : z(t);
      var i,
          e,
          n = this._southWest,
          o = this._northEast;
      return t instanceof T ? (i = t.getSouthWest(), e = t.getNorthEast()) : i = e = t, i.lat >= n.lat && e.lat <= o.lat && i.lng >= n.lng && e.lng <= o.lng;
    },
    intersects: function intersects(t) {
      t = z(t);
      var i = this._southWest,
          e = this._northEast,
          n = t.getSouthWest(),
          o = t.getNorthEast(),
          s = o.lat >= i.lat && n.lat <= e.lat,
          r = o.lng >= i.lng && n.lng <= e.lng;
      return s && r;
    },
    overlaps: function overlaps(t) {
      t = z(t);
      var i = this._southWest,
          e = this._northEast,
          n = t.getSouthWest(),
          o = t.getNorthEast(),
          s = o.lat > i.lat && n.lat < e.lat,
          r = o.lng > i.lng && n.lng < e.lng;
      return s && r;
    },
    toBBoxString: function toBBoxString() {
      return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(",");
    },
    equals: function equals(t, i) {
      return !!t && (t = z(t), this._southWest.equals(t.getSouthWest(), i) && this._northEast.equals(t.getNorthEast(), i));
    },
    isValid: function isValid() {
      return !(!this._southWest || !this._northEast);
    }
  }, M.prototype = {
    equals: function equals(t, i) {
      return !!t && (t = C(t), Math.max(Math.abs(this.lat - t.lat), Math.abs(this.lng - t.lng)) <= (void 0 === i ? 1e-9 : i));
    },
    toString: function toString(t) {
      return "LatLng(" + a(this.lat, t) + ", " + a(this.lng, t) + ")";
    },
    distanceTo: function distanceTo(t) {
      return pi.distance(this, C(t));
    },
    wrap: function wrap() {
      return pi.wrapLatLng(this);
    },
    toBounds: function toBounds(t) {
      var i = 180 * t / 40075017,
          e = i / Math.cos(Math.PI / 180 * this.lat);
      return z([this.lat - i, this.lng - e], [this.lat + i, this.lng + e]);
    },
    clone: function clone() {
      return new M(this.lat, this.lng, this.alt);
    }
  };
  var di = {
    latLngToPoint: function latLngToPoint(t, i) {
      var e = this.projection.project(t),
          n = this.scale(i);
      return this.transformation._transform(e, n);
    },
    pointToLatLng: function pointToLatLng(t, i) {
      var e = this.scale(i),
          n = this.transformation.untransform(t, e);
      return this.projection.unproject(n);
    },
    project: function project(t) {
      return this.projection.project(t);
    },
    unproject: function unproject(t) {
      return this.projection.unproject(t);
    },
    scale: function scale(t) {
      return 256 * Math.pow(2, t);
    },
    zoom: function zoom(t) {
      return Math.log(t / 256) / Math.LN2;
    },
    getProjectedBounds: function getProjectedBounds(t) {
      if (this.infinite) return null;
      var i = this.projection.bounds,
          e = this.scale(t);
      return new P(this.transformation.transform(i.min, e), this.transformation.transform(i.max, e));
    },
    infinite: !1,
    wrapLatLng: function wrapLatLng(t) {
      var i = this.wrapLng ? s(t.lng, this.wrapLng, !0) : t.lng;
      return new M(this.wrapLat ? s(t.lat, this.wrapLat, !0) : t.lat, i, t.alt);
    },
    wrapLatLngBounds: function wrapLatLngBounds(t) {
      var i = t.getCenter(),
          e = this.wrapLatLng(i),
          n = i.lat - e.lat,
          o = i.lng - e.lng;
      if (0 === n && 0 === o) return t;
      var s = t.getSouthWest(),
          r = t.getNorthEast();
      return new T(new M(s.lat - n, s.lng - o), new M(r.lat - n, r.lng - o));
    }
  },
      pi = i({}, di, {
    wrapLng: [-180, 180],
    R: 6371e3,
    distance: function distance(t, i) {
      var e = Math.PI / 180,
          n = t.lat * e,
          o = i.lat * e,
          s = Math.sin((i.lat - t.lat) * e / 2),
          r = Math.sin((i.lng - t.lng) * e / 2),
          a = s * s + Math.cos(n) * Math.cos(o) * r * r,
          h = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
      return this.R * h;
    }
  }),
      mi = {
    R: 6378137,
    MAX_LATITUDE: 85.0511287798,
    project: function project(t) {
      var i = Math.PI / 180,
          e = this.MAX_LATITUDE,
          n = Math.max(Math.min(e, t.lat), -e),
          o = Math.sin(n * i);
      return new x(this.R * t.lng * i, this.R * Math.log((1 + o) / (1 - o)) / 2);
    },
    unproject: function unproject(t) {
      var i = 180 / Math.PI;
      return new M((2 * Math.atan(Math.exp(t.y / this.R)) - Math.PI / 2) * i, t.x * i / this.R);
    },
    bounds: function () {
      var t = 6378137 * Math.PI;
      return new P([-t, -t], [t, t]);
    }()
  };
  S.prototype = {
    transform: function transform(t, i) {
      return this._transform(t.clone(), i);
    },
    _transform: function _transform(t, i) {
      return i = i || 1, t.x = i * (this._a * t.x + this._b), t.y = i * (this._c * t.y + this._d), t;
    },
    untransform: function untransform(t, i) {
      return i = i || 1, new x((t.x / i - this._b) / this._a, (t.y / i - this._d) / this._c);
    }
  };

  var fi,
      gi,
      vi,
      yi = i({}, pi, {
    code: "EPSG:3857",
    projection: mi,
    transformation: function () {
      var t = .5 / (Math.PI * mi.R);
      return Z(t, .5, -t, .5);
    }()
  }),
      xi = i({}, yi, {
    code: "EPSG:900913"
  }),
      wi = document.documentElement.style,
      Pi = ("ActiveXObject" in window),
      Li = Pi && !document.addEventListener,
      bi = "msLaunchUri" in navigator && !("documentMode" in document),
      Ti = B("webkit"),
      zi = B("android"),
      Mi = B("android 2") || B("android 3"),
      Ci = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10),
      Si = zi && B("Google") && Ci < 537 && !("AudioNode" in window),
      Zi = !!window.opera,
      Ei = B("chrome"),
      ki = B("gecko") && !Ti && !Zi && !Pi,
      Bi = !Ei && B("safari"),
      Ai = B("phantom"),
      Ii = ("OTransition" in wi),
      Oi = 0 === navigator.platform.indexOf("Win"),
      Ri = Pi && "transition" in wi,
      Ni = "WebKitCSSMatrix" in window && "m11" in new window.WebKitCSSMatrix() && !Mi,
      Di = ("MozPerspective" in wi),
      ji = !window.L_DISABLE_3D && (Ri || Ni || Di) && !Ii && !Ai,
      Wi = "undefined" != typeof orientation || B("mobile"),
      Hi = Wi && Ti,
      Fi = Wi && Ni,
      Ui = !window.PointerEvent && window.MSPointerEvent,
      Vi = !(!window.PointerEvent && !Ui),
      qi = !window.L_NO_TOUCH && (Vi || "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch),
      Gi = Wi && Zi,
      Ki = Wi && ki,
      Yi = (window.devicePixelRatio || window.screen.deviceXDPI / window.screen.logicalXDPI) > 1,
      Xi = !!document.createElement("canvas").getContext,
      Ji = !(!document.createElementNS || !E("svg").createSVGRect),
      $i = !Ji && function () {
    try {
      var t = document.createElement("div");
      t.innerHTML = '<v:shape adj="1"/>';
      var i = t.firstChild;
      return i.style.behavior = "url(#default#VML)", i && "object" == _typeof(i.adj);
    } catch (t) {
      return !1;
    }
  }(),
      Qi = (Object.freeze || Object)({
    ie: Pi,
    ielt9: Li,
    edge: bi,
    webkit: Ti,
    android: zi,
    android23: Mi,
    androidStock: Si,
    opera: Zi,
    chrome: Ei,
    gecko: ki,
    safari: Bi,
    phantom: Ai,
    opera12: Ii,
    win: Oi,
    ie3d: Ri,
    webkit3d: Ni,
    gecko3d: Di,
    any3d: ji,
    mobile: Wi,
    mobileWebkit: Hi,
    mobileWebkit3d: Fi,
    msPointer: Ui,
    pointer: Vi,
    touch: qi,
    mobileOpera: Gi,
    mobileGecko: Ki,
    retina: Yi,
    canvas: Xi,
    svg: Ji,
    vml: $i
  }),
      te = Ui ? "MSPointerDown" : "pointerdown",
      ie = Ui ? "MSPointerMove" : "pointermove",
      ee = Ui ? "MSPointerUp" : "pointerup",
      ne = Ui ? "MSPointerCancel" : "pointercancel",
      oe = ["INPUT", "SELECT", "OPTION"],
      se = {},
      re = !1,
      ae = 0,
      he = Ui ? "MSPointerDown" : Vi ? "pointerdown" : "touchstart",
      ue = Ui ? "MSPointerUp" : Vi ? "pointerup" : "touchend",
      le = "_leaflet_",
      ce = st(["transform", "webkitTransform", "OTransform", "MozTransform", "msTransform"]),
      _e = st(["webkitTransition", "transition", "OTransition", "MozTransition", "msTransition"]),
      de = "webkitTransition" === _e || "OTransition" === _e ? _e + "End" : "transitionend";

  if ("onselectstart" in document) fi = function fi() {
    mt(window, "selectstart", Pt);
  }, gi = function gi() {
    ft(window, "selectstart", Pt);
  };else {
    var pe = st(["userSelect", "WebkitUserSelect", "OUserSelect", "MozUserSelect", "msUserSelect"]);
    fi = function fi() {
      if (pe) {
        var t = document.documentElement.style;
        vi = t[pe], t[pe] = "none";
      }
    }, gi = function gi() {
      pe && (document.documentElement.style[pe] = vi, vi = void 0);
    };
  }

  var me,
      fe,
      ge,
      ve = (Object.freeze || Object)({
    TRANSFORM: ce,
    TRANSITION: _e,
    TRANSITION_END: de,
    get: V,
    getStyle: q,
    create: G,
    remove: K,
    empty: Y,
    toFront: X,
    toBack: J,
    hasClass: $,
    addClass: Q,
    removeClass: tt,
    setClass: it,
    getClass: et,
    setOpacity: nt,
    testProp: st,
    setTransform: rt,
    setPosition: at,
    getPosition: ht,
    disableTextSelection: fi,
    enableTextSelection: gi,
    disableImageDrag: ut,
    enableImageDrag: lt,
    preventOutline: ct,
    restoreOutline: _t,
    getSizedParentNode: dt,
    getScale: pt
  }),
      ye = "_leaflet_events",
      xe = Oi && Ei ? 2 * window.devicePixelRatio : ki ? window.devicePixelRatio : 1,
      we = {},
      Pe = (Object.freeze || Object)({
    on: mt,
    off: ft,
    stopPropagation: yt,
    disableScrollPropagation: xt,
    disableClickPropagation: wt,
    preventDefault: Pt,
    stop: Lt,
    getMousePosition: bt,
    getWheelDelta: Tt,
    fakeStop: zt,
    skipped: Mt,
    isExternalTarget: Ct,
    addListener: mt,
    removeListener: ft
  }),
      Le = ci.extend({
    run: function run(t, i, e, n) {
      this.stop(), this._el = t, this._inProgress = !0, this._duration = e || .25, this._easeOutPower = 1 / Math.max(n || .5, .2), this._startPos = ht(t), this._offset = i.subtract(this._startPos), this._startTime = +new Date(), this.fire("start"), this._animate();
    },
    stop: function stop() {
      this._inProgress && (this._step(!0), this._complete());
    },
    _animate: function _animate() {
      this._animId = f(this._animate, this), this._step();
    },
    _step: function _step(t) {
      var i = +new Date() - this._startTime,
          e = 1e3 * this._duration;
      i < e ? this._runFrame(this._easeOut(i / e), t) : (this._runFrame(1), this._complete());
    },
    _runFrame: function _runFrame(t, i) {
      var e = this._startPos.add(this._offset.multiplyBy(t));

      i && e._round(), at(this._el, e), this.fire("step");
    },
    _complete: function _complete() {
      g(this._animId), this._inProgress = !1, this.fire("end");
    },
    _easeOut: function _easeOut(t) {
      return 1 - Math.pow(1 - t, this._easeOutPower);
    }
  }),
      be = ci.extend({
    options: {
      crs: yi,
      center: void 0,
      zoom: void 0,
      minZoom: void 0,
      maxZoom: void 0,
      layers: [],
      maxBounds: void 0,
      renderer: void 0,
      zoomAnimation: !0,
      zoomAnimationThreshold: 4,
      fadeAnimation: !0,
      markerZoomAnimation: !0,
      transform3DLimit: 8388608,
      zoomSnap: 1,
      zoomDelta: 1,
      trackResize: !0
    },
    initialize: function initialize(t, i) {
      i = l(this, i), this._handlers = [], this._layers = {}, this._zoomBoundLayers = {}, this._sizeChanged = !0, this._initContainer(t), this._initLayout(), this._onResize = e(this._onResize, this), this._initEvents(), i.maxBounds && this.setMaxBounds(i.maxBounds), void 0 !== i.zoom && (this._zoom = this._limitZoom(i.zoom)), i.center && void 0 !== i.zoom && this.setView(C(i.center), i.zoom, {
        reset: !0
      }), this.callInitHooks(), this._zoomAnimated = _e && ji && !Gi && this.options.zoomAnimation, this._zoomAnimated && (this._createAnimProxy(), mt(this._proxy, de, this._catchTransitionEnd, this)), this._addLayers(this.options.layers);
    },
    setView: function setView(t, e, n) {
      return e = void 0 === e ? this._zoom : this._limitZoom(e), t = this._limitCenter(C(t), e, this.options.maxBounds), n = n || {}, this._stop(), this._loaded && !n.reset && !0 !== n && (void 0 !== n.animate && (n.zoom = i({
        animate: n.animate
      }, n.zoom), n.pan = i({
        animate: n.animate,
        duration: n.duration
      }, n.pan)), this._zoom !== e ? this._tryAnimatedZoom && this._tryAnimatedZoom(t, e, n.zoom) : this._tryAnimatedPan(t, n.pan)) ? (clearTimeout(this._sizeTimer), this) : (this._resetView(t, e), this);
    },
    setZoom: function setZoom(t, i) {
      return this._loaded ? this.setView(this.getCenter(), t, {
        zoom: i
      }) : (this._zoom = t, this);
    },
    zoomIn: function zoomIn(t, i) {
      return t = t || (ji ? this.options.zoomDelta : 1), this.setZoom(this._zoom + t, i);
    },
    zoomOut: function zoomOut(t, i) {
      return t = t || (ji ? this.options.zoomDelta : 1), this.setZoom(this._zoom - t, i);
    },
    setZoomAround: function setZoomAround(t, i, e) {
      var n = this.getZoomScale(i),
          o = this.getSize().divideBy(2),
          s = (t instanceof x ? t : this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1 - 1 / n),
          r = this.containerPointToLatLng(o.add(s));
      return this.setView(r, i, {
        zoom: e
      });
    },
    _getBoundsCenterZoom: function _getBoundsCenterZoom(t, i) {
      i = i || {}, t = t.getBounds ? t.getBounds() : z(t);
      var e = w(i.paddingTopLeft || i.padding || [0, 0]),
          n = w(i.paddingBottomRight || i.padding || [0, 0]),
          o = this.getBoundsZoom(t, !1, e.add(n));
      if ((o = "number" == typeof i.maxZoom ? Math.min(i.maxZoom, o) : o) === 1 / 0) return {
        center: t.getCenter(),
        zoom: o
      };
      var s = n.subtract(e).divideBy(2),
          r = this.project(t.getSouthWest(), o),
          a = this.project(t.getNorthEast(), o);
      return {
        center: this.unproject(r.add(a).divideBy(2).add(s), o),
        zoom: o
      };
    },
    fitBounds: function fitBounds(t, i) {
      if (!(t = z(t)).isValid()) throw new Error("Bounds are not valid.");

      var e = this._getBoundsCenterZoom(t, i);

      return this.setView(e.center, e.zoom, i);
    },
    fitWorld: function fitWorld(t) {
      return this.fitBounds([[-90, -180], [90, 180]], t);
    },
    panTo: function panTo(t, i) {
      return this.setView(t, this._zoom, {
        pan: i
      });
    },
    panBy: function panBy(t, i) {
      if (t = w(t).round(), i = i || {}, !t.x && !t.y) return this.fire("moveend");
      if (!0 !== i.animate && !this.getSize().contains(t)) return this._resetView(this.unproject(this.project(this.getCenter()).add(t)), this.getZoom()), this;

      if (this._panAnim || (this._panAnim = new Le(), this._panAnim.on({
        step: this._onPanTransitionStep,
        end: this._onPanTransitionEnd
      }, this)), i.noMoveStart || this.fire("movestart"), !1 !== i.animate) {
        Q(this._mapPane, "leaflet-pan-anim");

        var e = this._getMapPanePos().subtract(t).round();

        this._panAnim.run(this._mapPane, e, i.duration || .25, i.easeLinearity);
      } else this._rawPanBy(t), this.fire("move").fire("moveend");

      return this;
    },
    flyTo: function flyTo(t, i, e) {
      function n(t) {
        var i = (g * g - m * m + (t ? -1 : 1) * x * x * v * v) / (2 * (t ? g : m) * x * v),
            e = Math.sqrt(i * i + 1) - i;
        return e < 1e-9 ? -18 : Math.log(e);
      }

      function o(t) {
        return (Math.exp(t) - Math.exp(-t)) / 2;
      }

      function s(t) {
        return (Math.exp(t) + Math.exp(-t)) / 2;
      }

      function r(t) {
        return o(t) / s(t);
      }

      function a(t) {
        return m * (s(w) / s(w + y * t));
      }

      function h(t) {
        return m * (s(w) * r(w + y * t) - o(w)) / x;
      }

      function u(t) {
        return 1 - Math.pow(1 - t, 1.5);
      }

      function l() {
        var e = (Date.now() - P) / b,
            n = u(e) * L;
        e <= 1 ? (this._flyToFrame = f(l, this), this._move(this.unproject(c.add(_.subtract(c).multiplyBy(h(n) / v)), p), this.getScaleZoom(m / a(n), p), {
          flyTo: !0
        })) : this._move(t, i)._moveEnd(!0);
      }

      if (!1 === (e = e || {}).animate || !ji) return this.setView(t, i, e);

      this._stop();

      var c = this.project(this.getCenter()),
          _ = this.project(t),
          d = this.getSize(),
          p = this._zoom;

      t = C(t), i = void 0 === i ? p : i;
      var m = Math.max(d.x, d.y),
          g = m * this.getZoomScale(p, i),
          v = _.distanceTo(c) || 1,
          y = 1.42,
          x = y * y,
          w = n(0),
          P = Date.now(),
          L = (n(1) - w) / y,
          b = e.duration ? 1e3 * e.duration : 1e3 * L * .8;
      return this._moveStart(!0, e.noMoveStart), l.call(this), this;
    },
    flyToBounds: function flyToBounds(t, i) {
      var e = this._getBoundsCenterZoom(t, i);

      return this.flyTo(e.center, e.zoom, i);
    },
    setMaxBounds: function setMaxBounds(t) {
      return (t = z(t)).isValid() ? (this.options.maxBounds && this.off("moveend", this._panInsideMaxBounds), this.options.maxBounds = t, this._loaded && this._panInsideMaxBounds(), this.on("moveend", this._panInsideMaxBounds)) : (this.options.maxBounds = null, this.off("moveend", this._panInsideMaxBounds));
    },
    setMinZoom: function setMinZoom(t) {
      var i = this.options.minZoom;
      return this.options.minZoom = t, this._loaded && i !== t && (this.fire("zoomlevelschange"), this.getZoom() < this.options.minZoom) ? this.setZoom(t) : this;
    },
    setMaxZoom: function setMaxZoom(t) {
      var i = this.options.maxZoom;
      return this.options.maxZoom = t, this._loaded && i !== t && (this.fire("zoomlevelschange"), this.getZoom() > this.options.maxZoom) ? this.setZoom(t) : this;
    },
    panInsideBounds: function panInsideBounds(t, i) {
      this._enforcingBounds = !0;

      var e = this.getCenter(),
          n = this._limitCenter(e, this._zoom, z(t));

      return e.equals(n) || this.panTo(n, i), this._enforcingBounds = !1, this;
    },
    panInside: function panInside(t, i) {
      var e = w((i = i || {}).paddingTopLeft || i.padding || [0, 0]),
          n = w(i.paddingBottomRight || i.padding || [0, 0]),
          o = this.getCenter(),
          s = this.project(o),
          r = this.project(t),
          a = this.getPixelBounds(),
          h = a.getSize().divideBy(2),
          u = b([a.min.add(e), a.max.subtract(n)]);

      if (!u.contains(r)) {
        this._enforcingBounds = !0;
        var l = s.subtract(r),
            c = w(r.x + l.x, r.y + l.y);
        (r.x < u.min.x || r.x > u.max.x) && (c.x = s.x - l.x, l.x > 0 ? c.x += h.x - e.x : c.x -= h.x - n.x), (r.y < u.min.y || r.y > u.max.y) && (c.y = s.y - l.y, l.y > 0 ? c.y += h.y - e.y : c.y -= h.y - n.y), this.panTo(this.unproject(c), i), this._enforcingBounds = !1;
      }

      return this;
    },
    invalidateSize: function invalidateSize(t) {
      if (!this._loaded) return this;
      t = i({
        animate: !1,
        pan: !0
      }, !0 === t ? {
        animate: !0
      } : t);
      var n = this.getSize();
      this._sizeChanged = !0, this._lastCenter = null;
      var o = this.getSize(),
          s = n.divideBy(2).round(),
          r = o.divideBy(2).round(),
          a = s.subtract(r);
      return a.x || a.y ? (t.animate && t.pan ? this.panBy(a) : (t.pan && this._rawPanBy(a), this.fire("move"), t.debounceMoveend ? (clearTimeout(this._sizeTimer), this._sizeTimer = setTimeout(e(this.fire, this, "moveend"), 200)) : this.fire("moveend")), this.fire("resize", {
        oldSize: n,
        newSize: o
      })) : this;
    },
    stop: function stop() {
      return this.setZoom(this._limitZoom(this._zoom)), this.options.zoomSnap || this.fire("viewreset"), this._stop();
    },
    locate: function locate(t) {
      if (t = this._locateOptions = i({
        timeout: 1e4,
        watch: !1
      }, t), !("geolocation" in navigator)) return this._handleGeolocationError({
        code: 0,
        message: "Geolocation not supported."
      }), this;
      var n = e(this._handleGeolocationResponse, this),
          o = e(this._handleGeolocationError, this);
      return t.watch ? this._locationWatchId = navigator.geolocation.watchPosition(n, o, t) : navigator.geolocation.getCurrentPosition(n, o, t), this;
    },
    stopLocate: function stopLocate() {
      return navigator.geolocation && navigator.geolocation.clearWatch && navigator.geolocation.clearWatch(this._locationWatchId), this._locateOptions && (this._locateOptions.setView = !1), this;
    },
    _handleGeolocationError: function _handleGeolocationError(t) {
      var i = t.code,
          e = t.message || (1 === i ? "permission denied" : 2 === i ? "position unavailable" : "timeout");
      this._locateOptions.setView && !this._loaded && this.fitWorld(), this.fire("locationerror", {
        code: i,
        message: "Geolocation error: " + e + "."
      });
    },
    _handleGeolocationResponse: function _handleGeolocationResponse(t) {
      var i = new M(t.coords.latitude, t.coords.longitude),
          e = i.toBounds(2 * t.coords.accuracy),
          n = this._locateOptions;

      if (n.setView) {
        var o = this.getBoundsZoom(e);
        this.setView(i, n.maxZoom ? Math.min(o, n.maxZoom) : o);
      }

      var s = {
        latlng: i,
        bounds: e,
        timestamp: t.timestamp
      };

      for (var r in t.coords) {
        "number" == typeof t.coords[r] && (s[r] = t.coords[r]);
      }

      this.fire("locationfound", s);
    },
    addHandler: function addHandler(t, i) {
      if (!i) return this;
      var e = this[t] = new i(this);
      return this._handlers.push(e), this.options[t] && e.enable(), this;
    },
    remove: function remove() {
      if (this._initEvents(!0), this._containerId !== this._container._leaflet_id) throw new Error("Map container is being reused by another instance");

      try {
        delete this._container._leaflet_id, delete this._containerId;
      } catch (t) {
        this._container._leaflet_id = void 0, this._containerId = void 0;
      }

      void 0 !== this._locationWatchId && this.stopLocate(), this._stop(), K(this._mapPane), this._clearControlPos && this._clearControlPos(), this._resizeRequest && (g(this._resizeRequest), this._resizeRequest = null), this._clearHandlers(), this._loaded && this.fire("unload");
      var t;

      for (t in this._layers) {
        this._layers[t].remove();
      }

      for (t in this._panes) {
        K(this._panes[t]);
      }

      return this._layers = [], this._panes = [], delete this._mapPane, delete this._renderer, this;
    },
    createPane: function createPane(t, i) {
      var e = G("div", "leaflet-pane" + (t ? " leaflet-" + t.replace("Pane", "") + "-pane" : ""), i || this._mapPane);
      return t && (this._panes[t] = e), e;
    },
    getCenter: function getCenter() {
      return this._checkIfLoaded(), this._lastCenter && !this._moved() ? this._lastCenter : this.layerPointToLatLng(this._getCenterLayerPoint());
    },
    getZoom: function getZoom() {
      return this._zoom;
    },
    getBounds: function getBounds() {
      var t = this.getPixelBounds();
      return new T(this.unproject(t.getBottomLeft()), this.unproject(t.getTopRight()));
    },
    getMinZoom: function getMinZoom() {
      return void 0 === this.options.minZoom ? this._layersMinZoom || 0 : this.options.minZoom;
    },
    getMaxZoom: function getMaxZoom() {
      return void 0 === this.options.maxZoom ? void 0 === this._layersMaxZoom ? 1 / 0 : this._layersMaxZoom : this.options.maxZoom;
    },
    getBoundsZoom: function getBoundsZoom(t, i, e) {
      t = z(t), e = w(e || [0, 0]);

      var n = this.getZoom() || 0,
          o = this.getMinZoom(),
          s = this.getMaxZoom(),
          r = t.getNorthWest(),
          a = t.getSouthEast(),
          h = this.getSize().subtract(e),
          u = b(this.project(a, n), this.project(r, n)).getSize(),
          l = ji ? this.options.zoomSnap : 1,
          c = h.x / u.x,
          _ = h.y / u.y,
          d = i ? Math.max(c, _) : Math.min(c, _);

      return n = this.getScaleZoom(d, n), l && (n = Math.round(n / (l / 100)) * (l / 100), n = i ? Math.ceil(n / l) * l : Math.floor(n / l) * l), Math.max(o, Math.min(s, n));
    },
    getSize: function getSize() {
      return this._size && !this._sizeChanged || (this._size = new x(this._container.clientWidth || 0, this._container.clientHeight || 0), this._sizeChanged = !1), this._size.clone();
    },
    getPixelBounds: function getPixelBounds(t, i) {
      var e = this._getTopLeftPoint(t, i);

      return new P(e, e.add(this.getSize()));
    },
    getPixelOrigin: function getPixelOrigin() {
      return this._checkIfLoaded(), this._pixelOrigin;
    },
    getPixelWorldBounds: function getPixelWorldBounds(t) {
      return this.options.crs.getProjectedBounds(void 0 === t ? this.getZoom() : t);
    },
    getPane: function getPane(t) {
      return "string" == typeof t ? this._panes[t] : t;
    },
    getPanes: function getPanes() {
      return this._panes;
    },
    getContainer: function getContainer() {
      return this._container;
    },
    getZoomScale: function getZoomScale(t, i) {
      var e = this.options.crs;
      return i = void 0 === i ? this._zoom : i, e.scale(t) / e.scale(i);
    },
    getScaleZoom: function getScaleZoom(t, i) {
      var e = this.options.crs;
      i = void 0 === i ? this._zoom : i;
      var n = e.zoom(t * e.scale(i));
      return isNaN(n) ? 1 / 0 : n;
    },
    project: function project(t, i) {
      return i = void 0 === i ? this._zoom : i, this.options.crs.latLngToPoint(C(t), i);
    },
    unproject: function unproject(t, i) {
      return i = void 0 === i ? this._zoom : i, this.options.crs.pointToLatLng(w(t), i);
    },
    layerPointToLatLng: function layerPointToLatLng(t) {
      var i = w(t).add(this.getPixelOrigin());
      return this.unproject(i);
    },
    latLngToLayerPoint: function latLngToLayerPoint(t) {
      return this.project(C(t))._round()._subtract(this.getPixelOrigin());
    },
    wrapLatLng: function wrapLatLng(t) {
      return this.options.crs.wrapLatLng(C(t));
    },
    wrapLatLngBounds: function wrapLatLngBounds(t) {
      return this.options.crs.wrapLatLngBounds(z(t));
    },
    distance: function distance(t, i) {
      return this.options.crs.distance(C(t), C(i));
    },
    containerPointToLayerPoint: function containerPointToLayerPoint(t) {
      return w(t).subtract(this._getMapPanePos());
    },
    layerPointToContainerPoint: function layerPointToContainerPoint(t) {
      return w(t).add(this._getMapPanePos());
    },
    containerPointToLatLng: function containerPointToLatLng(t) {
      var i = this.containerPointToLayerPoint(w(t));
      return this.layerPointToLatLng(i);
    },
    latLngToContainerPoint: function latLngToContainerPoint(t) {
      return this.layerPointToContainerPoint(this.latLngToLayerPoint(C(t)));
    },
    mouseEventToContainerPoint: function mouseEventToContainerPoint(t) {
      return bt(t, this._container);
    },
    mouseEventToLayerPoint: function mouseEventToLayerPoint(t) {
      return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t));
    },
    mouseEventToLatLng: function mouseEventToLatLng(t) {
      return this.layerPointToLatLng(this.mouseEventToLayerPoint(t));
    },
    _initContainer: function _initContainer(t) {
      var i = this._container = V(t);
      if (!i) throw new Error("Map container not found.");
      if (i._leaflet_id) throw new Error("Map container is already initialized.");
      mt(i, "scroll", this._onScroll, this), this._containerId = n(i);
    },
    _initLayout: function _initLayout() {
      var t = this._container;
      this._fadeAnimated = this.options.fadeAnimation && ji, Q(t, "leaflet-container" + (qi ? " leaflet-touch" : "") + (Yi ? " leaflet-retina" : "") + (Li ? " leaflet-oldie" : "") + (Bi ? " leaflet-safari" : "") + (this._fadeAnimated ? " leaflet-fade-anim" : ""));
      var i = q(t, "position");
      "absolute" !== i && "relative" !== i && "fixed" !== i && (t.style.position = "relative"), this._initPanes(), this._initControlPos && this._initControlPos();
    },
    _initPanes: function _initPanes() {
      var t = this._panes = {};
      this._paneRenderers = {}, this._mapPane = this.createPane("mapPane", this._container), at(this._mapPane, new x(0, 0)), this.createPane("tilePane"), this.createPane("shadowPane"), this.createPane("overlayPane"), this.createPane("markerPane"), this.createPane("tooltipPane"), this.createPane("popupPane"), this.options.markerZoomAnimation || (Q(t.markerPane, "leaflet-zoom-hide"), Q(t.shadowPane, "leaflet-zoom-hide"));
    },
    _resetView: function _resetView(t, i) {
      at(this._mapPane, new x(0, 0));
      var e = !this._loaded;
      this._loaded = !0, i = this._limitZoom(i), this.fire("viewprereset");
      var n = this._zoom !== i;
      this._moveStart(n, !1)._move(t, i)._moveEnd(n), this.fire("viewreset"), e && this.fire("load");
    },
    _moveStart: function _moveStart(t, i) {
      return t && this.fire("zoomstart"), i || this.fire("movestart"), this;
    },
    _move: function _move(t, i, e) {
      void 0 === i && (i = this._zoom);
      var n = this._zoom !== i;
      return this._zoom = i, this._lastCenter = t, this._pixelOrigin = this._getNewPixelOrigin(t), (n || e && e.pinch) && this.fire("zoom", e), this.fire("move", e);
    },
    _moveEnd: function _moveEnd(t) {
      return t && this.fire("zoomend"), this.fire("moveend");
    },
    _stop: function _stop() {
      return g(this._flyToFrame), this._panAnim && this._panAnim.stop(), this;
    },
    _rawPanBy: function _rawPanBy(t) {
      at(this._mapPane, this._getMapPanePos().subtract(t));
    },
    _getZoomSpan: function _getZoomSpan() {
      return this.getMaxZoom() - this.getMinZoom();
    },
    _panInsideMaxBounds: function _panInsideMaxBounds() {
      this._enforcingBounds || this.panInsideBounds(this.options.maxBounds);
    },
    _checkIfLoaded: function _checkIfLoaded() {
      if (!this._loaded) throw new Error("Set map center and zoom first.");
    },
    _initEvents: function _initEvents(t) {
      this._targets = {}, this._targets[n(this._container)] = this;
      var i = t ? ft : mt;
      i(this._container, "click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress", this._handleDOMEvent, this), this.options.trackResize && i(window, "resize", this._onResize, this), ji && this.options.transform3DLimit && (t ? this.off : this.on).call(this, "moveend", this._onMoveEnd);
    },
    _onResize: function _onResize() {
      g(this._resizeRequest), this._resizeRequest = f(function () {
        this.invalidateSize({
          debounceMoveend: !0
        });
      }, this);
    },
    _onScroll: function _onScroll() {
      this._container.scrollTop = 0, this._container.scrollLeft = 0;
    },
    _onMoveEnd: function _onMoveEnd() {
      var t = this._getMapPanePos();

      Math.max(Math.abs(t.x), Math.abs(t.y)) >= this.options.transform3DLimit && this._resetView(this.getCenter(), this.getZoom());
    },
    _findEventTargets: function _findEventTargets(t, i) {
      for (var e, o = [], s = "mouseout" === i || "mouseover" === i, r = t.target || t.srcElement, a = !1; r;) {
        if ((e = this._targets[n(r)]) && ("click" === i || "preclick" === i) && !t._simulated && this._draggableMoved(e)) {
          a = !0;
          break;
        }

        if (e && e.listens(i, !0)) {
          if (s && !Ct(r, t)) break;
          if (o.push(e), s) break;
        }

        if (r === this._container) break;
        r = r.parentNode;
      }

      return o.length || a || s || !Ct(r, t) || (o = [this]), o;
    },
    _handleDOMEvent: function _handleDOMEvent(t) {
      if (this._loaded && !Mt(t)) {
        var i = t.type;
        "mousedown" !== i && "keypress" !== i || ct(t.target || t.srcElement), this._fireDOMEvent(t, i);
      }
    },
    _mouseEvents: ["click", "dblclick", "mouseover", "mouseout", "contextmenu"],
    _fireDOMEvent: function _fireDOMEvent(t, e, n) {
      if ("click" === t.type) {
        var o = i({}, t);
        o.type = "preclick", this._fireDOMEvent(o, o.type, n);
      }

      if (!t._stopped && (n = (n || []).concat(this._findEventTargets(t, e))).length) {
        var s = n[0];
        "contextmenu" === e && s.listens(e, !0) && Pt(t);
        var r = {
          originalEvent: t
        };

        if ("keypress" !== t.type) {
          var a = s.getLatLng && (!s._radius || s._radius <= 10);
          r.containerPoint = a ? this.latLngToContainerPoint(s.getLatLng()) : this.mouseEventToContainerPoint(t), r.layerPoint = this.containerPointToLayerPoint(r.containerPoint), r.latlng = a ? s.getLatLng() : this.layerPointToLatLng(r.layerPoint);
        }

        for (var h = 0; h < n.length; h++) {
          if (n[h].fire(e, r, !0), r.originalEvent._stopped || !1 === n[h].options.bubblingMouseEvents && -1 !== d(this._mouseEvents, e)) return;
        }
      }
    },
    _draggableMoved: function _draggableMoved(t) {
      return (t = t.dragging && t.dragging.enabled() ? t : this).dragging && t.dragging.moved() || this.boxZoom && this.boxZoom.moved();
    },
    _clearHandlers: function _clearHandlers() {
      for (var t = 0, i = this._handlers.length; t < i; t++) {
        this._handlers[t].disable();
      }
    },
    whenReady: function whenReady(t, i) {
      return this._loaded ? t.call(i || this, {
        target: this
      }) : this.on("load", t, i), this;
    },
    _getMapPanePos: function _getMapPanePos() {
      return ht(this._mapPane) || new x(0, 0);
    },
    _moved: function _moved() {
      var t = this._getMapPanePos();

      return t && !t.equals([0, 0]);
    },
    _getTopLeftPoint: function _getTopLeftPoint(t, i) {
      return (t && void 0 !== i ? this._getNewPixelOrigin(t, i) : this.getPixelOrigin()).subtract(this._getMapPanePos());
    },
    _getNewPixelOrigin: function _getNewPixelOrigin(t, i) {
      var e = this.getSize()._divideBy(2);

      return this.project(t, i)._subtract(e)._add(this._getMapPanePos())._round();
    },
    _latLngToNewLayerPoint: function _latLngToNewLayerPoint(t, i, e) {
      var n = this._getNewPixelOrigin(e, i);

      return this.project(t, i)._subtract(n);
    },
    _latLngBoundsToNewLayerBounds: function _latLngBoundsToNewLayerBounds(t, i, e) {
      var n = this._getNewPixelOrigin(e, i);

      return b([this.project(t.getSouthWest(), i)._subtract(n), this.project(t.getNorthWest(), i)._subtract(n), this.project(t.getSouthEast(), i)._subtract(n), this.project(t.getNorthEast(), i)._subtract(n)]);
    },
    _getCenterLayerPoint: function _getCenterLayerPoint() {
      return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
    },
    _getCenterOffset: function _getCenterOffset(t) {
      return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint());
    },
    _limitCenter: function _limitCenter(t, i, e) {
      if (!e) return t;

      var n = this.project(t, i),
          o = this.getSize().divideBy(2),
          s = new P(n.subtract(o), n.add(o)),
          r = this._getBoundsOffset(s, e, i);

      return r.round().equals([0, 0]) ? t : this.unproject(n.add(r), i);
    },
    _limitOffset: function _limitOffset(t, i) {
      if (!i) return t;
      var e = this.getPixelBounds(),
          n = new P(e.min.add(t), e.max.add(t));
      return t.add(this._getBoundsOffset(n, i));
    },
    _getBoundsOffset: function _getBoundsOffset(t, i, e) {
      var n = b(this.project(i.getNorthEast(), e), this.project(i.getSouthWest(), e)),
          o = n.min.subtract(t.min),
          s = n.max.subtract(t.max);
      return new x(this._rebound(o.x, -s.x), this._rebound(o.y, -s.y));
    },
    _rebound: function _rebound(t, i) {
      return t + i > 0 ? Math.round(t - i) / 2 : Math.max(0, Math.ceil(t)) - Math.max(0, Math.floor(i));
    },
    _limitZoom: function _limitZoom(t) {
      var i = this.getMinZoom(),
          e = this.getMaxZoom(),
          n = ji ? this.options.zoomSnap : 1;
      return n && (t = Math.round(t / n) * n), Math.max(i, Math.min(e, t));
    },
    _onPanTransitionStep: function _onPanTransitionStep() {
      this.fire("move");
    },
    _onPanTransitionEnd: function _onPanTransitionEnd() {
      tt(this._mapPane, "leaflet-pan-anim"), this.fire("moveend");
    },
    _tryAnimatedPan: function _tryAnimatedPan(t, i) {
      var e = this._getCenterOffset(t)._trunc();

      return !(!0 !== (i && i.animate) && !this.getSize().contains(e)) && (this.panBy(e, i), !0);
    },
    _createAnimProxy: function _createAnimProxy() {
      var t = this._proxy = G("div", "leaflet-proxy leaflet-zoom-animated");
      this._panes.mapPane.appendChild(t), this.on("zoomanim", function (t) {
        var i = ce,
            e = this._proxy.style[i];
        rt(this._proxy, this.project(t.center, t.zoom), this.getZoomScale(t.zoom, 1)), e === this._proxy.style[i] && this._animatingZoom && this._onZoomTransitionEnd();
      }, this), this.on("load moveend", function () {
        var t = this.getCenter(),
            i = this.getZoom();
        rt(this._proxy, this.project(t, i), this.getZoomScale(i, 1));
      }, this), this._on("unload", this._destroyAnimProxy, this);
    },
    _destroyAnimProxy: function _destroyAnimProxy() {
      K(this._proxy), delete this._proxy;
    },
    _catchTransitionEnd: function _catchTransitionEnd(t) {
      this._animatingZoom && t.propertyName.indexOf("transform") >= 0 && this._onZoomTransitionEnd();
    },
    _nothingToAnimate: function _nothingToAnimate() {
      return !this._container.getElementsByClassName("leaflet-zoom-animated").length;
    },
    _tryAnimatedZoom: function _tryAnimatedZoom(t, i, e) {
      if (this._animatingZoom) return !0;
      if (e = e || {}, !this._zoomAnimated || !1 === e.animate || this._nothingToAnimate() || Math.abs(i - this._zoom) > this.options.zoomAnimationThreshold) return !1;

      var n = this.getZoomScale(i),
          o = this._getCenterOffset(t)._divideBy(1 - 1 / n);

      return !(!0 !== e.animate && !this.getSize().contains(o)) && (f(function () {
        this._moveStart(!0, !1)._animateZoom(t, i, !0);
      }, this), !0);
    },
    _animateZoom: function _animateZoom(t, i, n, o) {
      this._mapPane && (n && (this._animatingZoom = !0, this._animateToCenter = t, this._animateToZoom = i, Q(this._mapPane, "leaflet-zoom-anim")), this.fire("zoomanim", {
        center: t,
        zoom: i,
        noUpdate: o
      }), setTimeout(e(this._onZoomTransitionEnd, this), 250));
    },
    _onZoomTransitionEnd: function _onZoomTransitionEnd() {
      this._animatingZoom && (this._mapPane && tt(this._mapPane, "leaflet-zoom-anim"), this._animatingZoom = !1, this._move(this._animateToCenter, this._animateToZoom), f(function () {
        this._moveEnd(!0);
      }, this));
    }
  }),
      Te = v.extend({
    options: {
      position: "topright"
    },
    initialize: function initialize(t) {
      l(this, t);
    },
    getPosition: function getPosition() {
      return this.options.position;
    },
    setPosition: function setPosition(t) {
      var i = this._map;
      return i && i.removeControl(this), this.options.position = t, i && i.addControl(this), this;
    },
    getContainer: function getContainer() {
      return this._container;
    },
    addTo: function addTo(t) {
      this.remove(), this._map = t;
      var i = this._container = this.onAdd(t),
          e = this.getPosition(),
          n = t._controlCorners[e];
      return Q(i, "leaflet-control"), -1 !== e.indexOf("bottom") ? n.insertBefore(i, n.firstChild) : n.appendChild(i), this;
    },
    remove: function remove() {
      return this._map ? (K(this._container), this.onRemove && this.onRemove(this._map), this._map = null, this) : this;
    },
    _refocusOnMap: function _refocusOnMap(t) {
      this._map && t && t.screenX > 0 && t.screenY > 0 && this._map.getContainer().focus();
    }
  }),
      ze = function ze(t) {
    return new Te(t);
  };

  be.include({
    addControl: function addControl(t) {
      return t.addTo(this), this;
    },
    removeControl: function removeControl(t) {
      return t.remove(), this;
    },
    _initControlPos: function _initControlPos() {
      function t(t, o) {
        var s = e + t + " " + e + o;
        i[t + o] = G("div", s, n);
      }

      var i = this._controlCorners = {},
          e = "leaflet-",
          n = this._controlContainer = G("div", e + "control-container", this._container);
      t("top", "left"), t("top", "right"), t("bottom", "left"), t("bottom", "right");
    },
    _clearControlPos: function _clearControlPos() {
      for (var t in this._controlCorners) {
        K(this._controlCorners[t]);
      }

      K(this._controlContainer), delete this._controlCorners, delete this._controlContainer;
    }
  });
  var Me = Te.extend({
    options: {
      collapsed: !0,
      position: "topright",
      autoZIndex: !0,
      hideSingleBase: !1,
      sortLayers: !1,
      sortFunction: function sortFunction(t, i, e, n) {
        return e < n ? -1 : n < e ? 1 : 0;
      }
    },
    initialize: function initialize(t, i, e) {
      l(this, e), this._layerControlInputs = [], this._layers = [], this._lastZIndex = 0, this._handlingClick = !1;

      for (var n in t) {
        this._addLayer(t[n], n);
      }

      for (n in i) {
        this._addLayer(i[n], n, !0);
      }
    },
    onAdd: function onAdd(t) {
      this._initLayout(), this._update(), this._map = t, t.on("zoomend", this._checkDisabledLayers, this);

      for (var i = 0; i < this._layers.length; i++) {
        this._layers[i].layer.on("add remove", this._onLayerChange, this);
      }

      return this._container;
    },
    addTo: function addTo(t) {
      return Te.prototype.addTo.call(this, t), this._expandIfNotCollapsed();
    },
    onRemove: function onRemove() {
      this._map.off("zoomend", this._checkDisabledLayers, this);

      for (var t = 0; t < this._layers.length; t++) {
        this._layers[t].layer.off("add remove", this._onLayerChange, this);
      }
    },
    addBaseLayer: function addBaseLayer(t, i) {
      return this._addLayer(t, i), this._map ? this._update() : this;
    },
    addOverlay: function addOverlay(t, i) {
      return this._addLayer(t, i, !0), this._map ? this._update() : this;
    },
    removeLayer: function removeLayer(t) {
      t.off("add remove", this._onLayerChange, this);

      var i = this._getLayer(n(t));

      return i && this._layers.splice(this._layers.indexOf(i), 1), this._map ? this._update() : this;
    },
    expand: function expand() {
      Q(this._container, "leaflet-control-layers-expanded"), this._section.style.height = null;
      var t = this._map.getSize().y - (this._container.offsetTop + 50);
      return t < this._section.clientHeight ? (Q(this._section, "leaflet-control-layers-scrollbar"), this._section.style.height = t + "px") : tt(this._section, "leaflet-control-layers-scrollbar"), this._checkDisabledLayers(), this;
    },
    collapse: function collapse() {
      return tt(this._container, "leaflet-control-layers-expanded"), this;
    },
    _initLayout: function _initLayout() {
      var t = "leaflet-control-layers",
          i = this._container = G("div", t),
          e = this.options.collapsed;
      i.setAttribute("aria-haspopup", !0), wt(i), xt(i);
      var n = this._section = G("section", t + "-list");
      e && (this._map.on("click", this.collapse, this), zi || mt(i, {
        mouseenter: this.expand,
        mouseleave: this.collapse
      }, this));
      var o = this._layersLink = G("a", t + "-toggle", i);
      o.href = "#", o.title = "Layers", qi ? (mt(o, "click", Lt), mt(o, "click", this.expand, this)) : mt(o, "focus", this.expand, this), e || this.expand(), this._baseLayersList = G("div", t + "-base", n), this._separator = G("div", t + "-separator", n), this._overlaysList = G("div", t + "-overlays", n), i.appendChild(n);
    },
    _getLayer: function _getLayer(t) {
      for (var i = 0; i < this._layers.length; i++) {
        if (this._layers[i] && n(this._layers[i].layer) === t) return this._layers[i];
      }
    },
    _addLayer: function _addLayer(t, i, n) {
      this._map && t.on("add remove", this._onLayerChange, this), this._layers.push({
        layer: t,
        name: i,
        overlay: n
      }), this.options.sortLayers && this._layers.sort(e(function (t, i) {
        return this.options.sortFunction(t.layer, i.layer, t.name, i.name);
      }, this)), this.options.autoZIndex && t.setZIndex && (this._lastZIndex++, t.setZIndex(this._lastZIndex)), this._expandIfNotCollapsed();
    },
    _update: function _update() {
      if (!this._container) return this;
      Y(this._baseLayersList), Y(this._overlaysList), this._layerControlInputs = [];
      var t,
          i,
          e,
          n,
          o = 0;

      for (e = 0; e < this._layers.length; e++) {
        n = this._layers[e], this._addItem(n), i = i || n.overlay, t = t || !n.overlay, o += n.overlay ? 0 : 1;
      }

      return this.options.hideSingleBase && (t = t && o > 1, this._baseLayersList.style.display = t ? "" : "none"), this._separator.style.display = i && t ? "" : "none", this;
    },
    _onLayerChange: function _onLayerChange(t) {
      this._handlingClick || this._update();

      var i = this._getLayer(n(t.target)),
          e = i.overlay ? "add" === t.type ? "overlayadd" : "overlayremove" : "add" === t.type ? "baselayerchange" : null;

      e && this._map.fire(e, i);
    },
    _createRadioElement: function _createRadioElement(t, i) {
      var e = '<input type="radio" class="leaflet-control-layers-selector" name="' + t + '"' + (i ? ' checked="checked"' : "") + "/>",
          n = document.createElement("div");
      return n.innerHTML = e, n.firstChild;
    },
    _addItem: function _addItem(t) {
      var i,
          e = document.createElement("label"),
          o = this._map.hasLayer(t.layer);

      t.overlay ? ((i = document.createElement("input")).type = "checkbox", i.className = "leaflet-control-layers-selector", i.defaultChecked = o) : i = this._createRadioElement("leaflet-base-layers", o), this._layerControlInputs.push(i), i.layerId = n(t.layer), mt(i, "click", this._onInputClick, this);
      var s = document.createElement("span");
      s.innerHTML = " " + t.name;
      var r = document.createElement("div");
      return e.appendChild(r), r.appendChild(i), r.appendChild(s), (t.overlay ? this._overlaysList : this._baseLayersList).appendChild(e), this._checkDisabledLayers(), e;
    },
    _onInputClick: function _onInputClick() {
      var t,
          i,
          e = this._layerControlInputs,
          n = [],
          o = [];
      this._handlingClick = !0;

      for (var s = e.length - 1; s >= 0; s--) {
        t = e[s], i = this._getLayer(t.layerId).layer, t.checked ? n.push(i) : t.checked || o.push(i);
      }

      for (s = 0; s < o.length; s++) {
        this._map.hasLayer(o[s]) && this._map.removeLayer(o[s]);
      }

      for (s = 0; s < n.length; s++) {
        this._map.hasLayer(n[s]) || this._map.addLayer(n[s]);
      }

      this._handlingClick = !1, this._refocusOnMap();
    },
    _checkDisabledLayers: function _checkDisabledLayers() {
      for (var t, i, e = this._layerControlInputs, n = this._map.getZoom(), o = e.length - 1; o >= 0; o--) {
        t = e[o], i = this._getLayer(t.layerId).layer, t.disabled = void 0 !== i.options.minZoom && n < i.options.minZoom || void 0 !== i.options.maxZoom && n > i.options.maxZoom;
      }
    },
    _expandIfNotCollapsed: function _expandIfNotCollapsed() {
      return this._map && !this.options.collapsed && this.expand(), this;
    },
    _expand: function _expand() {
      return this.expand();
    },
    _collapse: function _collapse() {
      return this.collapse();
    }
  }),
      Ce = Te.extend({
    options: {
      position: "topleft",
      zoomInText: "+",
      zoomInTitle: "Zoom in",
      zoomOutText: "&#x2212;",
      zoomOutTitle: "Zoom out"
    },
    onAdd: function onAdd(t) {
      var i = "leaflet-control-zoom",
          e = G("div", i + " leaflet-bar"),
          n = this.options;
      return this._zoomInButton = this._createButton(n.zoomInText, n.zoomInTitle, i + "-in", e, this._zoomIn), this._zoomOutButton = this._createButton(n.zoomOutText, n.zoomOutTitle, i + "-out", e, this._zoomOut), this._updateDisabled(), t.on("zoomend zoomlevelschange", this._updateDisabled, this), e;
    },
    onRemove: function onRemove(t) {
      t.off("zoomend zoomlevelschange", this._updateDisabled, this);
    },
    disable: function disable() {
      return this._disabled = !0, this._updateDisabled(), this;
    },
    enable: function enable() {
      return this._disabled = !1, this._updateDisabled(), this;
    },
    _zoomIn: function _zoomIn(t) {
      !this._disabled && this._map._zoom < this._map.getMaxZoom() && this._map.zoomIn(this._map.options.zoomDelta * (t.shiftKey ? 3 : 1));
    },
    _zoomOut: function _zoomOut(t) {
      !this._disabled && this._map._zoom > this._map.getMinZoom() && this._map.zoomOut(this._map.options.zoomDelta * (t.shiftKey ? 3 : 1));
    },
    _createButton: function _createButton(t, i, e, n, o) {
      var s = G("a", e, n);
      return s.innerHTML = t, s.href = "#", s.title = i, s.setAttribute("role", "button"), s.setAttribute("aria-label", i), wt(s), mt(s, "click", Lt), mt(s, "click", o, this), mt(s, "click", this._refocusOnMap, this), s;
    },
    _updateDisabled: function _updateDisabled() {
      var t = this._map,
          i = "leaflet-disabled";
      tt(this._zoomInButton, i), tt(this._zoomOutButton, i), (this._disabled || t._zoom === t.getMinZoom()) && Q(this._zoomOutButton, i), (this._disabled || t._zoom === t.getMaxZoom()) && Q(this._zoomInButton, i);
    }
  });
  be.mergeOptions({
    zoomControl: !0
  }), be.addInitHook(function () {
    this.options.zoomControl && (this.zoomControl = new Ce(), this.addControl(this.zoomControl));
  });
  var Se = Te.extend({
    options: {
      position: "bottomleft",
      maxWidth: 100,
      metric: !0,
      imperial: !0
    },
    onAdd: function onAdd(t) {
      var i = G("div", "leaflet-control-scale"),
          e = this.options;
      return this._addScales(e, "leaflet-control-scale-line", i), t.on(e.updateWhenIdle ? "moveend" : "move", this._update, this), t.whenReady(this._update, this), i;
    },
    onRemove: function onRemove(t) {
      t.off(this.options.updateWhenIdle ? "moveend" : "move", this._update, this);
    },
    _addScales: function _addScales(t, i, e) {
      t.metric && (this._mScale = G("div", i, e)), t.imperial && (this._iScale = G("div", i, e));
    },
    _update: function _update() {
      var t = this._map,
          i = t.getSize().y / 2,
          e = t.distance(t.containerPointToLatLng([0, i]), t.containerPointToLatLng([this.options.maxWidth, i]));

      this._updateScales(e);
    },
    _updateScales: function _updateScales(t) {
      this.options.metric && t && this._updateMetric(t), this.options.imperial && t && this._updateImperial(t);
    },
    _updateMetric: function _updateMetric(t) {
      var i = this._getRoundNum(t),
          e = i < 1e3 ? i + " m" : i / 1e3 + " km";

      this._updateScale(this._mScale, e, i / t);
    },
    _updateImperial: function _updateImperial(t) {
      var i,
          e,
          n,
          o = 3.2808399 * t;
      o > 5280 ? (i = o / 5280, e = this._getRoundNum(i), this._updateScale(this._iScale, e + " mi", e / i)) : (n = this._getRoundNum(o), this._updateScale(this._iScale, n + " ft", n / o));
    },
    _updateScale: function _updateScale(t, i, e) {
      t.style.width = Math.round(this.options.maxWidth * e) + "px", t.innerHTML = i;
    },
    _getRoundNum: function _getRoundNum(t) {
      var i = Math.pow(10, (Math.floor(t) + "").length - 1),
          e = t / i;
      return e = e >= 10 ? 10 : e >= 5 ? 5 : e >= 3 ? 3 : e >= 2 ? 2 : 1, i * e;
    }
  }),
      Ze = Te.extend({
    options: {
      position: "bottomright",
      prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
    },
    initialize: function initialize(t) {
      l(this, t), this._attributions = {};
    },
    onAdd: function onAdd(t) {
      t.attributionControl = this, this._container = G("div", "leaflet-control-attribution"), wt(this._container);

      for (var i in t._layers) {
        t._layers[i].getAttribution && this.addAttribution(t._layers[i].getAttribution());
      }

      return this._update(), this._container;
    },
    setPrefix: function setPrefix(t) {
      return this.options.prefix = t, this._update(), this;
    },
    addAttribution: function addAttribution(t) {
      return t ? (this._attributions[t] || (this._attributions[t] = 0), this._attributions[t]++, this._update(), this) : this;
    },
    removeAttribution: function removeAttribution(t) {
      return t ? (this._attributions[t] && (this._attributions[t]--, this._update()), this) : this;
    },
    _update: function _update() {
      if (this._map) {
        var t = [];

        for (var i in this._attributions) {
          this._attributions[i] && t.push(i);
        }

        var e = [];
        this.options.prefix && e.push(this.options.prefix), t.length && e.push(t.join(", ")), this._container.innerHTML = e.join(" | ");
      }
    }
  });
  be.mergeOptions({
    attributionControl: !0
  }), be.addInitHook(function () {
    this.options.attributionControl && new Ze().addTo(this);
  });
  Te.Layers = Me, Te.Zoom = Ce, Te.Scale = Se, Te.Attribution = Ze, ze.layers = function (t, i, e) {
    return new Me(t, i, e);
  }, ze.zoom = function (t) {
    return new Ce(t);
  }, ze.scale = function (t) {
    return new Se(t);
  }, ze.attribution = function (t) {
    return new Ze(t);
  };
  var Ee = v.extend({
    initialize: function initialize(t) {
      this._map = t;
    },
    enable: function enable() {
      return this._enabled ? this : (this._enabled = !0, this.addHooks(), this);
    },
    disable: function disable() {
      return this._enabled ? (this._enabled = !1, this.removeHooks(), this) : this;
    },
    enabled: function enabled() {
      return !!this._enabled;
    }
  });

  Ee.addTo = function (t, i) {
    return t.addHandler(i, this), this;
  };

  var ke,
      Be = {
    Events: li
  },
      Ae = qi ? "touchstart mousedown" : "mousedown",
      Ie = {
    mousedown: "mouseup",
    touchstart: "touchend",
    pointerdown: "touchend",
    MSPointerDown: "touchend"
  },
      Oe = {
    mousedown: "mousemove",
    touchstart: "touchmove",
    pointerdown: "touchmove",
    MSPointerDown: "touchmove"
  },
      Re = ci.extend({
    options: {
      clickTolerance: 3
    },
    initialize: function initialize(t, i, e, n) {
      l(this, n), this._element = t, this._dragStartTarget = i || t, this._preventOutline = e;
    },
    enable: function enable() {
      this._enabled || (mt(this._dragStartTarget, Ae, this._onDown, this), this._enabled = !0);
    },
    disable: function disable() {
      this._enabled && (Re._dragging === this && this.finishDrag(), ft(this._dragStartTarget, Ae, this._onDown, this), this._enabled = !1, this._moved = !1);
    },
    _onDown: function _onDown(t) {
      if (!t._simulated && this._enabled && (this._moved = !1, !$(this._element, "leaflet-zoom-anim") && !(Re._dragging || t.shiftKey || 1 !== t.which && 1 !== t.button && !t.touches || (Re._dragging = this, this._preventOutline && ct(this._element), ut(), fi(), this._moving)))) {
        this.fire("down");
        var i = t.touches ? t.touches[0] : t,
            e = dt(this._element);
        this._startPoint = new x(i.clientX, i.clientY), this._parentScale = pt(e), mt(document, Oe[t.type], this._onMove, this), mt(document, Ie[t.type], this._onUp, this);
      }
    },
    _onMove: function _onMove(t) {
      if (!t._simulated && this._enabled) if (t.touches && t.touches.length > 1) this._moved = !0;else {
        var i = t.touches && 1 === t.touches.length ? t.touches[0] : t,
            e = new x(i.clientX, i.clientY)._subtract(this._startPoint);

        (e.x || e.y) && (Math.abs(e.x) + Math.abs(e.y) < this.options.clickTolerance || (e.x /= this._parentScale.x, e.y /= this._parentScale.y, Pt(t), this._moved || (this.fire("dragstart"), this._moved = !0, this._startPos = ht(this._element).subtract(e), Q(document.body, "leaflet-dragging"), this._lastTarget = t.target || t.srcElement, window.SVGElementInstance && this._lastTarget instanceof SVGElementInstance && (this._lastTarget = this._lastTarget.correspondingUseElement), Q(this._lastTarget, "leaflet-drag-target")), this._newPos = this._startPos.add(e), this._moving = !0, g(this._animRequest), this._lastEvent = t, this._animRequest = f(this._updatePosition, this, !0)));
      }
    },
    _updatePosition: function _updatePosition() {
      var t = {
        originalEvent: this._lastEvent
      };
      this.fire("predrag", t), at(this._element, this._newPos), this.fire("drag", t);
    },
    _onUp: function _onUp(t) {
      !t._simulated && this._enabled && this.finishDrag();
    },
    finishDrag: function finishDrag() {
      tt(document.body, "leaflet-dragging"), this._lastTarget && (tt(this._lastTarget, "leaflet-drag-target"), this._lastTarget = null);

      for (var t in Oe) {
        ft(document, Oe[t], this._onMove, this), ft(document, Ie[t], this._onUp, this);
      }

      lt(), gi(), this._moved && this._moving && (g(this._animRequest), this.fire("dragend", {
        distance: this._newPos.distanceTo(this._startPos)
      })), this._moving = !1, Re._dragging = !1;
    }
  }),
      Ne = (Object.freeze || Object)({
    simplify: Zt,
    pointToSegmentDistance: Et,
    closestPointOnSegment: function closestPointOnSegment(t, i, e) {
      return Dt(t, i, e);
    },
    clipSegment: It,
    _getEdgeIntersection: Ot,
    _getBitCode: Rt,
    _sqClosestPointOnSegment: Dt,
    isFlat: jt,
    _flat: Wt
  }),
      De = (Object.freeze || Object)({
    clipPolygon: Ht
  }),
      je = {
    project: function project(t) {
      return new x(t.lng, t.lat);
    },
    unproject: function unproject(t) {
      return new M(t.y, t.x);
    },
    bounds: new P([-180, -90], [180, 90])
  },
      We = {
    R: 6378137,
    R_MINOR: 6356752.314245179,
    bounds: new P([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),
    project: function project(t) {
      var i = Math.PI / 180,
          e = this.R,
          n = t.lat * i,
          o = this.R_MINOR / e,
          s = Math.sqrt(1 - o * o),
          r = s * Math.sin(n),
          a = Math.tan(Math.PI / 4 - n / 2) / Math.pow((1 - r) / (1 + r), s / 2);
      return n = -e * Math.log(Math.max(a, 1e-10)), new x(t.lng * i * e, n);
    },
    unproject: function unproject(t) {
      for (var i, e = 180 / Math.PI, n = this.R, o = this.R_MINOR / n, s = Math.sqrt(1 - o * o), r = Math.exp(-t.y / n), a = Math.PI / 2 - 2 * Math.atan(r), h = 0, u = .1; h < 15 && Math.abs(u) > 1e-7; h++) {
        i = s * Math.sin(a), i = Math.pow((1 - i) / (1 + i), s / 2), a += u = Math.PI / 2 - 2 * Math.atan(r * i) - a;
      }

      return new M(a * e, t.x * e / n);
    }
  },
      He = (Object.freeze || Object)({
    LonLat: je,
    Mercator: We,
    SphericalMercator: mi
  }),
      Fe = i({}, pi, {
    code: "EPSG:3395",
    projection: We,
    transformation: function () {
      var t = .5 / (Math.PI * We.R);
      return Z(t, .5, -t, .5);
    }()
  }),
      Ue = i({}, pi, {
    code: "EPSG:4326",
    projection: je,
    transformation: Z(1 / 180, 1, -1 / 180, .5)
  }),
      Ve = i({}, di, {
    projection: je,
    transformation: Z(1, 0, -1, 0),
    scale: function scale(t) {
      return Math.pow(2, t);
    },
    zoom: function zoom(t) {
      return Math.log(t) / Math.LN2;
    },
    distance: function distance(t, i) {
      var e = i.lng - t.lng,
          n = i.lat - t.lat;
      return Math.sqrt(e * e + n * n);
    },
    infinite: !0
  });
  di.Earth = pi, di.EPSG3395 = Fe, di.EPSG3857 = yi, di.EPSG900913 = xi, di.EPSG4326 = Ue, di.Simple = Ve;
  var qe = ci.extend({
    options: {
      pane: "overlayPane",
      attribution: null,
      bubblingMouseEvents: !0
    },
    addTo: function addTo(t) {
      return t.addLayer(this), this;
    },
    remove: function remove() {
      return this.removeFrom(this._map || this._mapToAdd);
    },
    removeFrom: function removeFrom(t) {
      return t && t.removeLayer(this), this;
    },
    getPane: function getPane(t) {
      return this._map.getPane(t ? this.options[t] || t : this.options.pane);
    },
    addInteractiveTarget: function addInteractiveTarget(t) {
      return this._map._targets[n(t)] = this, this;
    },
    removeInteractiveTarget: function removeInteractiveTarget(t) {
      return delete this._map._targets[n(t)], this;
    },
    getAttribution: function getAttribution() {
      return this.options.attribution;
    },
    _layerAdd: function _layerAdd(t) {
      var i = t.target;

      if (i.hasLayer(this)) {
        if (this._map = i, this._zoomAnimated = i._zoomAnimated, this.getEvents) {
          var e = this.getEvents();
          i.on(e, this), this.once("remove", function () {
            i.off(e, this);
          }, this);
        }

        this.onAdd(i), this.getAttribution && i.attributionControl && i.attributionControl.addAttribution(this.getAttribution()), this.fire("add"), i.fire("layeradd", {
          layer: this
        });
      }
    }
  });
  be.include({
    addLayer: function addLayer(t) {
      if (!t._layerAdd) throw new Error("The provided object is not a Layer.");
      var i = n(t);
      return this._layers[i] ? this : (this._layers[i] = t, t._mapToAdd = this, t.beforeAdd && t.beforeAdd(this), this.whenReady(t._layerAdd, t), this);
    },
    removeLayer: function removeLayer(t) {
      var i = n(t);
      return this._layers[i] ? (this._loaded && t.onRemove(this), t.getAttribution && this.attributionControl && this.attributionControl.removeAttribution(t.getAttribution()), delete this._layers[i], this._loaded && (this.fire("layerremove", {
        layer: t
      }), t.fire("remove")), t._map = t._mapToAdd = null, this) : this;
    },
    hasLayer: function hasLayer(t) {
      return !!t && n(t) in this._layers;
    },
    eachLayer: function eachLayer(t, i) {
      for (var e in this._layers) {
        t.call(i, this._layers[e]);
      }

      return this;
    },
    _addLayers: function _addLayers(t) {
      for (var i = 0, e = (t = t ? oi(t) ? t : [t] : []).length; i < e; i++) {
        this.addLayer(t[i]);
      }
    },
    _addZoomLimit: function _addZoomLimit(t) {
      !isNaN(t.options.maxZoom) && isNaN(t.options.minZoom) || (this._zoomBoundLayers[n(t)] = t, this._updateZoomLevels());
    },
    _removeZoomLimit: function _removeZoomLimit(t) {
      var i = n(t);
      this._zoomBoundLayers[i] && (delete this._zoomBoundLayers[i], this._updateZoomLevels());
    },
    _updateZoomLevels: function _updateZoomLevels() {
      var t = 1 / 0,
          i = -1 / 0,
          e = this._getZoomSpan();

      for (var n in this._zoomBoundLayers) {
        var o = this._zoomBoundLayers[n].options;
        t = void 0 === o.minZoom ? t : Math.min(t, o.minZoom), i = void 0 === o.maxZoom ? i : Math.max(i, o.maxZoom);
      }

      this._layersMaxZoom = i === -1 / 0 ? void 0 : i, this._layersMinZoom = t === 1 / 0 ? void 0 : t, e !== this._getZoomSpan() && this.fire("zoomlevelschange"), void 0 === this.options.maxZoom && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom && this.setZoom(this._layersMaxZoom), void 0 === this.options.minZoom && this._layersMinZoom && this.getZoom() < this._layersMinZoom && this.setZoom(this._layersMinZoom);
    }
  });
  var Ge = qe.extend({
    initialize: function initialize(t, i) {
      l(this, i), this._layers = {};
      var e, n;
      if (t) for (e = 0, n = t.length; e < n; e++) {
        this.addLayer(t[e]);
      }
    },
    addLayer: function addLayer(t) {
      var i = this.getLayerId(t);
      return this._layers[i] = t, this._map && this._map.addLayer(t), this;
    },
    removeLayer: function removeLayer(t) {
      var i = t in this._layers ? t : this.getLayerId(t);
      return this._map && this._layers[i] && this._map.removeLayer(this._layers[i]), delete this._layers[i], this;
    },
    hasLayer: function hasLayer(t) {
      return !!t && (t in this._layers || this.getLayerId(t) in this._layers);
    },
    clearLayers: function clearLayers() {
      return this.eachLayer(this.removeLayer, this);
    },
    invoke: function invoke(t) {
      var i,
          e,
          n = Array.prototype.slice.call(arguments, 1);

      for (i in this._layers) {
        (e = this._layers[i])[t] && e[t].apply(e, n);
      }

      return this;
    },
    onAdd: function onAdd(t) {
      this.eachLayer(t.addLayer, t);
    },
    onRemove: function onRemove(t) {
      this.eachLayer(t.removeLayer, t);
    },
    eachLayer: function eachLayer(t, i) {
      for (var e in this._layers) {
        t.call(i, this._layers[e]);
      }

      return this;
    },
    getLayer: function getLayer(t) {
      return this._layers[t];
    },
    getLayers: function getLayers() {
      var t = [];
      return this.eachLayer(t.push, t), t;
    },
    setZIndex: function setZIndex(t) {
      return this.invoke("setZIndex", t);
    },
    getLayerId: function getLayerId(t) {
      return n(t);
    }
  }),
      Ke = Ge.extend({
    addLayer: function addLayer(t) {
      return this.hasLayer(t) ? this : (t.addEventParent(this), Ge.prototype.addLayer.call(this, t), this.fire("layeradd", {
        layer: t
      }));
    },
    removeLayer: function removeLayer(t) {
      return this.hasLayer(t) ? (t in this._layers && (t = this._layers[t]), t.removeEventParent(this), Ge.prototype.removeLayer.call(this, t), this.fire("layerremove", {
        layer: t
      })) : this;
    },
    setStyle: function setStyle(t) {
      return this.invoke("setStyle", t);
    },
    bringToFront: function bringToFront() {
      return this.invoke("bringToFront");
    },
    bringToBack: function bringToBack() {
      return this.invoke("bringToBack");
    },
    getBounds: function getBounds() {
      var t = new T();

      for (var i in this._layers) {
        var e = this._layers[i];
        t.extend(e.getBounds ? e.getBounds() : e.getLatLng());
      }

      return t;
    }
  }),
      Ye = v.extend({
    options: {
      popupAnchor: [0, 0],
      tooltipAnchor: [0, 0]
    },
    initialize: function initialize(t) {
      l(this, t);
    },
    createIcon: function createIcon(t) {
      return this._createIcon("icon", t);
    },
    createShadow: function createShadow(t) {
      return this._createIcon("shadow", t);
    },
    _createIcon: function _createIcon(t, i) {
      var e = this._getIconUrl(t);

      if (!e) {
        if ("icon" === t) throw new Error("iconUrl not set in Icon options (see the docs).");
        return null;
      }

      var n = this._createImg(e, i && "IMG" === i.tagName ? i : null);

      return this._setIconStyles(n, t), n;
    },
    _setIconStyles: function _setIconStyles(t, i) {
      var e = this.options,
          n = e[i + "Size"];
      "number" == typeof n && (n = [n, n]);
      var o = w(n),
          s = w("shadow" === i && e.shadowAnchor || e.iconAnchor || o && o.divideBy(2, !0));
      t.className = "leaflet-marker-" + i + " " + (e.className || ""), s && (t.style.marginLeft = -s.x + "px", t.style.marginTop = -s.y + "px"), o && (t.style.width = o.x + "px", t.style.height = o.y + "px");
    },
    _createImg: function _createImg(t, i) {
      return i = i || document.createElement("img"), i.src = t, i;
    },
    _getIconUrl: function _getIconUrl(t) {
      return Yi && this.options[t + "RetinaUrl"] || this.options[t + "Url"];
    }
  }),
      Xe = Ye.extend({
    options: {
      iconUrl: "marker-icon.png",
      iconRetinaUrl: "marker-icon-2x.png",
      shadowUrl: "marker-shadow.png",
      iconSize: [25, 41],
      iconAnchor: [12, 41],
      popupAnchor: [1, -34],
      tooltipAnchor: [16, -28],
      shadowSize: [41, 41]
    },
    _getIconUrl: function _getIconUrl(t) {
      return Xe.imagePath || (Xe.imagePath = this._detectIconPath()), (this.options.imagePath || Xe.imagePath) + Ye.prototype._getIconUrl.call(this, t);
    },
    _detectIconPath: function _detectIconPath() {
      var t = G("div", "leaflet-default-icon-path", document.body),
          i = q(t, "background-image") || q(t, "backgroundImage");
      return document.body.removeChild(t), i = null === i || 0 !== i.indexOf("url") ? "" : i.replace(/^url\(["']?/, "").replace(/marker-icon\.png["']?\)$/, "");
    }
  }),
      Je = Ee.extend({
    initialize: function initialize(t) {
      this._marker = t;
    },
    addHooks: function addHooks() {
      var t = this._marker._icon;
      this._draggable || (this._draggable = new Re(t, t, !0)), this._draggable.on({
        dragstart: this._onDragStart,
        predrag: this._onPreDrag,
        drag: this._onDrag,
        dragend: this._onDragEnd
      }, this).enable(), Q(t, "leaflet-marker-draggable");
    },
    removeHooks: function removeHooks() {
      this._draggable.off({
        dragstart: this._onDragStart,
        predrag: this._onPreDrag,
        drag: this._onDrag,
        dragend: this._onDragEnd
      }, this).disable(), this._marker._icon && tt(this._marker._icon, "leaflet-marker-draggable");
    },
    moved: function moved() {
      return this._draggable && this._draggable._moved;
    },
    _adjustPan: function _adjustPan(t) {
      var i = this._marker,
          e = i._map,
          n = this._marker.options.autoPanSpeed,
          o = this._marker.options.autoPanPadding,
          s = ht(i._icon),
          r = e.getPixelBounds(),
          a = e.getPixelOrigin(),
          h = b(r.min._subtract(a).add(o), r.max._subtract(a).subtract(o));

      if (!h.contains(s)) {
        var u = w((Math.max(h.max.x, s.x) - h.max.x) / (r.max.x - h.max.x) - (Math.min(h.min.x, s.x) - h.min.x) / (r.min.x - h.min.x), (Math.max(h.max.y, s.y) - h.max.y) / (r.max.y - h.max.y) - (Math.min(h.min.y, s.y) - h.min.y) / (r.min.y - h.min.y)).multiplyBy(n);
        e.panBy(u, {
          animate: !1
        }), this._draggable._newPos._add(u), this._draggable._startPos._add(u), at(i._icon, this._draggable._newPos), this._onDrag(t), this._panRequest = f(this._adjustPan.bind(this, t));
      }
    },
    _onDragStart: function _onDragStart() {
      this._oldLatLng = this._marker.getLatLng(), this._marker.closePopup().fire("movestart").fire("dragstart");
    },
    _onPreDrag: function _onPreDrag(t) {
      this._marker.options.autoPan && (g(this._panRequest), this._panRequest = f(this._adjustPan.bind(this, t)));
    },
    _onDrag: function _onDrag(t) {
      var i = this._marker,
          e = i._shadow,
          n = ht(i._icon),
          o = i._map.layerPointToLatLng(n);

      e && at(e, n), i._latlng = o, t.latlng = o, t.oldLatLng = this._oldLatLng, i.fire("move", t).fire("drag", t);
    },
    _onDragEnd: function _onDragEnd(t) {
      g(this._panRequest), delete this._oldLatLng, this._marker.fire("moveend").fire("dragend", t);
    }
  }),
      $e = qe.extend({
    options: {
      icon: new Xe(),
      interactive: !0,
      keyboard: !0,
      title: "",
      alt: "",
      zIndexOffset: 0,
      opacity: 1,
      riseOnHover: !1,
      riseOffset: 250,
      pane: "markerPane",
      bubblingMouseEvents: !1,
      draggable: !1,
      autoPan: !1,
      autoPanPadding: [50, 50],
      autoPanSpeed: 10
    },
    initialize: function initialize(t, i) {
      l(this, i), this._latlng = C(t);
    },
    onAdd: function onAdd(t) {
      this._zoomAnimated = this._zoomAnimated && t.options.markerZoomAnimation, this._zoomAnimated && t.on("zoomanim", this._animateZoom, this), this._initIcon(), this.update();
    },
    onRemove: function onRemove(t) {
      this.dragging && this.dragging.enabled() && (this.options.draggable = !0, this.dragging.removeHooks()), delete this.dragging, this._zoomAnimated && t.off("zoomanim", this._animateZoom, this), this._removeIcon(), this._removeShadow();
    },
    getEvents: function getEvents() {
      return {
        zoom: this.update,
        viewreset: this.update
      };
    },
    getLatLng: function getLatLng() {
      return this._latlng;
    },
    setLatLng: function setLatLng(t) {
      var i = this._latlng;
      return this._latlng = C(t), this.update(), this.fire("move", {
        oldLatLng: i,
        latlng: this._latlng
      });
    },
    setZIndexOffset: function setZIndexOffset(t) {
      return this.options.zIndexOffset = t, this.update();
    },
    setIcon: function setIcon(t) {
      return this.options.icon = t, this._map && (this._initIcon(), this.update()), this._popup && this.bindPopup(this._popup, this._popup.options), this;
    },
    getElement: function getElement() {
      return this._icon;
    },
    update: function update() {
      if (this._icon && this._map) {
        var t = this._map.latLngToLayerPoint(this._latlng).round();

        this._setPos(t);
      }

      return this;
    },
    _initIcon: function _initIcon() {
      var t = this.options,
          i = "leaflet-zoom-" + (this._zoomAnimated ? "animated" : "hide"),
          e = t.icon.createIcon(this._icon),
          n = !1;
      e !== this._icon && (this._icon && this._removeIcon(), n = !0, t.title && (e.title = t.title), "IMG" === e.tagName && (e.alt = t.alt || "")), Q(e, i), t.keyboard && (e.tabIndex = "0"), this._icon = e, t.riseOnHover && this.on({
        mouseover: this._bringToFront,
        mouseout: this._resetZIndex
      });
      var o = t.icon.createShadow(this._shadow),
          s = !1;
      o !== this._shadow && (this._removeShadow(), s = !0), o && (Q(o, i), o.alt = ""), this._shadow = o, t.opacity < 1 && this._updateOpacity(), n && this.getPane().appendChild(this._icon), this._initInteraction(), o && s && this.getPane("shadowPane").appendChild(this._shadow);
    },
    _removeIcon: function _removeIcon() {
      this.options.riseOnHover && this.off({
        mouseover: this._bringToFront,
        mouseout: this._resetZIndex
      }), K(this._icon), this.removeInteractiveTarget(this._icon), this._icon = null;
    },
    _removeShadow: function _removeShadow() {
      this._shadow && K(this._shadow), this._shadow = null;
    },
    _setPos: function _setPos(t) {
      at(this._icon, t), this._shadow && at(this._shadow, t), this._zIndex = t.y + this.options.zIndexOffset, this._resetZIndex();
    },
    _updateZIndex: function _updateZIndex(t) {
      this._icon.style.zIndex = this._zIndex + t;
    },
    _animateZoom: function _animateZoom(t) {
      var i = this._map._latLngToNewLayerPoint(this._latlng, t.zoom, t.center).round();

      this._setPos(i);
    },
    _initInteraction: function _initInteraction() {
      if (this.options.interactive && (Q(this._icon, "leaflet-interactive"), this.addInteractiveTarget(this._icon), Je)) {
        var t = this.options.draggable;
        this.dragging && (t = this.dragging.enabled(), this.dragging.disable()), this.dragging = new Je(this), t && this.dragging.enable();
      }
    },
    setOpacity: function setOpacity(t) {
      return this.options.opacity = t, this._map && this._updateOpacity(), this;
    },
    _updateOpacity: function _updateOpacity() {
      var t = this.options.opacity;
      nt(this._icon, t), this._shadow && nt(this._shadow, t);
    },
    _bringToFront: function _bringToFront() {
      this._updateZIndex(this.options.riseOffset);
    },
    _resetZIndex: function _resetZIndex() {
      this._updateZIndex(0);
    },
    _getPopupAnchor: function _getPopupAnchor() {
      return this.options.icon.options.popupAnchor;
    },
    _getTooltipAnchor: function _getTooltipAnchor() {
      return this.options.icon.options.tooltipAnchor;
    }
  }),
      Qe = qe.extend({
    options: {
      stroke: !0,
      color: "#3388ff",
      weight: 3,
      opacity: 1,
      lineCap: "round",
      lineJoin: "round",
      dashArray: null,
      dashOffset: null,
      fill: !1,
      fillColor: null,
      fillOpacity: .2,
      fillRule: "evenodd",
      interactive: !0,
      bubblingMouseEvents: !0
    },
    beforeAdd: function beforeAdd(t) {
      this._renderer = t.getRenderer(this);
    },
    onAdd: function onAdd() {
      this._renderer._initPath(this), this._reset(), this._renderer._addPath(this);
    },
    onRemove: function onRemove() {
      this._renderer._removePath(this);
    },
    redraw: function redraw() {
      return this._map && this._renderer._updatePath(this), this;
    },
    setStyle: function setStyle(t) {
      return l(this, t), this._renderer && this._renderer._updateStyle(this), this;
    },
    bringToFront: function bringToFront() {
      return this._renderer && this._renderer._bringToFront(this), this;
    },
    bringToBack: function bringToBack() {
      return this._renderer && this._renderer._bringToBack(this), this;
    },
    getElement: function getElement() {
      return this._path;
    },
    _reset: function _reset() {
      this._project(), this._update();
    },
    _clickTolerance: function _clickTolerance() {
      return (this.options.stroke ? this.options.weight / 2 : 0) + this._renderer.options.tolerance;
    }
  }),
      tn = Qe.extend({
    options: {
      fill: !0,
      radius: 10
    },
    initialize: function initialize(t, i) {
      l(this, i), this._latlng = C(t), this._radius = this.options.radius;
    },
    setLatLng: function setLatLng(t) {
      return this._latlng = C(t), this.redraw(), this.fire("move", {
        latlng: this._latlng
      });
    },
    getLatLng: function getLatLng() {
      return this._latlng;
    },
    setRadius: function setRadius(t) {
      return this.options.radius = this._radius = t, this.redraw();
    },
    getRadius: function getRadius() {
      return this._radius;
    },
    setStyle: function setStyle(t) {
      var i = t && t.radius || this._radius;
      return Qe.prototype.setStyle.call(this, t), this.setRadius(i), this;
    },
    _project: function _project() {
      this._point = this._map.latLngToLayerPoint(this._latlng), this._updateBounds();
    },
    _updateBounds: function _updateBounds() {
      var t = this._radius,
          i = this._radiusY || t,
          e = this._clickTolerance(),
          n = [t + e, i + e];

      this._pxBounds = new P(this._point.subtract(n), this._point.add(n));
    },
    _update: function _update() {
      this._map && this._updatePath();
    },
    _updatePath: function _updatePath() {
      this._renderer._updateCircle(this);
    },
    _empty: function _empty() {
      return this._radius && !this._renderer._bounds.intersects(this._pxBounds);
    },
    _containsPoint: function _containsPoint(t) {
      return t.distanceTo(this._point) <= this._radius + this._clickTolerance();
    }
  }),
      en = tn.extend({
    initialize: function initialize(t, e, n) {
      if ("number" == typeof e && (e = i({}, n, {
        radius: e
      })), l(this, e), this._latlng = C(t), isNaN(this.options.radius)) throw new Error("Circle radius cannot be NaN");
      this._mRadius = this.options.radius;
    },
    setRadius: function setRadius(t) {
      return this._mRadius = t, this.redraw();
    },
    getRadius: function getRadius() {
      return this._mRadius;
    },
    getBounds: function getBounds() {
      var t = [this._radius, this._radiusY || this._radius];
      return new T(this._map.layerPointToLatLng(this._point.subtract(t)), this._map.layerPointToLatLng(this._point.add(t)));
    },
    setStyle: Qe.prototype.setStyle,
    _project: function _project() {
      var t = this._latlng.lng,
          i = this._latlng.lat,
          e = this._map,
          n = e.options.crs;

      if (n.distance === pi.distance) {
        var o = Math.PI / 180,
            s = this._mRadius / pi.R / o,
            r = e.project([i + s, t]),
            a = e.project([i - s, t]),
            h = r.add(a).divideBy(2),
            u = e.unproject(h).lat,
            l = Math.acos((Math.cos(s * o) - Math.sin(i * o) * Math.sin(u * o)) / (Math.cos(i * o) * Math.cos(u * o))) / o;
        (isNaN(l) || 0 === l) && (l = s / Math.cos(Math.PI / 180 * i)), this._point = h.subtract(e.getPixelOrigin()), this._radius = isNaN(l) ? 0 : h.x - e.project([u, t - l]).x, this._radiusY = h.y - r.y;
      } else {
        var c = n.unproject(n.project(this._latlng).subtract([this._mRadius, 0]));
        this._point = e.latLngToLayerPoint(this._latlng), this._radius = this._point.x - e.latLngToLayerPoint(c).x;
      }

      this._updateBounds();
    }
  }),
      nn = Qe.extend({
    options: {
      smoothFactor: 1,
      noClip: !1
    },
    initialize: function initialize(t, i) {
      l(this, i), this._setLatLngs(t);
    },
    getLatLngs: function getLatLngs() {
      return this._latlngs;
    },
    setLatLngs: function setLatLngs(t) {
      return this._setLatLngs(t), this.redraw();
    },
    isEmpty: function isEmpty() {
      return !this._latlngs.length;
    },
    closestLayerPoint: function closestLayerPoint(t) {
      for (var i, e, n = 1 / 0, o = null, s = Dt, r = 0, a = this._parts.length; r < a; r++) {
        for (var h = this._parts[r], u = 1, l = h.length; u < l; u++) {
          var c = s(t, i = h[u - 1], e = h[u], !0);
          c < n && (n = c, o = s(t, i, e));
        }
      }

      return o && (o.distance = Math.sqrt(n)), o;
    },
    getCenter: function getCenter() {
      if (!this._map) throw new Error("Must add layer to map before using getCenter()");
      var t,
          i,
          e,
          n,
          o,
          s,
          r,
          a = this._rings[0],
          h = a.length;
      if (!h) return null;

      for (t = 0, i = 0; t < h - 1; t++) {
        i += a[t].distanceTo(a[t + 1]) / 2;
      }

      if (0 === i) return this._map.layerPointToLatLng(a[0]);

      for (t = 0, n = 0; t < h - 1; t++) {
        if (o = a[t], s = a[t + 1], e = o.distanceTo(s), (n += e) > i) return r = (n - i) / e, this._map.layerPointToLatLng([s.x - r * (s.x - o.x), s.y - r * (s.y - o.y)]);
      }
    },
    getBounds: function getBounds() {
      return this._bounds;
    },
    addLatLng: function addLatLng(t, i) {
      return i = i || this._defaultShape(), t = C(t), i.push(t), this._bounds.extend(t), this.redraw();
    },
    _setLatLngs: function _setLatLngs(t) {
      this._bounds = new T(), this._latlngs = this._convertLatLngs(t);
    },
    _defaultShape: function _defaultShape() {
      return jt(this._latlngs) ? this._latlngs : this._latlngs[0];
    },
    _convertLatLngs: function _convertLatLngs(t) {
      for (var i = [], e = jt(t), n = 0, o = t.length; n < o; n++) {
        e ? (i[n] = C(t[n]), this._bounds.extend(i[n])) : i[n] = this._convertLatLngs(t[n]);
      }

      return i;
    },
    _project: function _project() {
      var t = new P();
      this._rings = [], this._projectLatlngs(this._latlngs, this._rings, t);

      var i = this._clickTolerance(),
          e = new x(i, i);

      this._bounds.isValid() && t.isValid() && (t.min._subtract(e), t.max._add(e), this._pxBounds = t);
    },
    _projectLatlngs: function _projectLatlngs(t, i, e) {
      var n,
          o,
          s = t[0] instanceof M,
          r = t.length;

      if (s) {
        for (o = [], n = 0; n < r; n++) {
          o[n] = this._map.latLngToLayerPoint(t[n]), e.extend(o[n]);
        }

        i.push(o);
      } else for (n = 0; n < r; n++) {
        this._projectLatlngs(t[n], i, e);
      }
    },
    _clipPoints: function _clipPoints() {
      var t = this._renderer._bounds;
      if (this._parts = [], this._pxBounds && this._pxBounds.intersects(t)) if (this.options.noClip) this._parts = this._rings;else {
        var i,
            e,
            n,
            o,
            s,
            r,
            a,
            h = this._parts;

        for (i = 0, n = 0, o = this._rings.length; i < o; i++) {
          for (e = 0, s = (a = this._rings[i]).length; e < s - 1; e++) {
            (r = It(a[e], a[e + 1], t, e, !0)) && (h[n] = h[n] || [], h[n].push(r[0]), r[1] === a[e + 1] && e !== s - 2 || (h[n].push(r[1]), n++));
          }
        }
      }
    },
    _simplifyPoints: function _simplifyPoints() {
      for (var t = this._parts, i = this.options.smoothFactor, e = 0, n = t.length; e < n; e++) {
        t[e] = Zt(t[e], i);
      }
    },
    _update: function _update() {
      this._map && (this._clipPoints(), this._simplifyPoints(), this._updatePath());
    },
    _updatePath: function _updatePath() {
      this._renderer._updatePoly(this);
    },
    _containsPoint: function _containsPoint(t, i) {
      var e,
          n,
          o,
          s,
          r,
          a,
          h = this._clickTolerance();

      if (!this._pxBounds || !this._pxBounds.contains(t)) return !1;

      for (e = 0, s = this._parts.length; e < s; e++) {
        for (n = 0, o = (r = (a = this._parts[e]).length) - 1; n < r; o = n++) {
          if ((i || 0 !== n) && Et(t, a[o], a[n]) <= h) return !0;
        }
      }

      return !1;
    }
  });
  nn._flat = Wt;
  var on = nn.extend({
    options: {
      fill: !0
    },
    isEmpty: function isEmpty() {
      return !this._latlngs.length || !this._latlngs[0].length;
    },
    getCenter: function getCenter() {
      if (!this._map) throw new Error("Must add layer to map before using getCenter()");
      var t,
          i,
          e,
          n,
          o,
          s,
          r,
          a,
          h,
          u = this._rings[0],
          l = u.length;
      if (!l) return null;

      for (s = r = a = 0, t = 0, i = l - 1; t < l; i = t++) {
        e = u[t], n = u[i], o = e.y * n.x - n.y * e.x, r += (e.x + n.x) * o, a += (e.y + n.y) * o, s += 3 * o;
      }

      return h = 0 === s ? u[0] : [r / s, a / s], this._map.layerPointToLatLng(h);
    },
    _convertLatLngs: function _convertLatLngs(t) {
      var i = nn.prototype._convertLatLngs.call(this, t),
          e = i.length;

      return e >= 2 && i[0] instanceof M && i[0].equals(i[e - 1]) && i.pop(), i;
    },
    _setLatLngs: function _setLatLngs(t) {
      nn.prototype._setLatLngs.call(this, t), jt(this._latlngs) && (this._latlngs = [this._latlngs]);
    },
    _defaultShape: function _defaultShape() {
      return jt(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];
    },
    _clipPoints: function _clipPoints() {
      var t = this._renderer._bounds,
          i = this.options.weight,
          e = new x(i, i);
      if (t = new P(t.min.subtract(e), t.max.add(e)), this._parts = [], this._pxBounds && this._pxBounds.intersects(t)) if (this.options.noClip) this._parts = this._rings;else for (var n, o = 0, s = this._rings.length; o < s; o++) {
        (n = Ht(this._rings[o], t, !0)).length && this._parts.push(n);
      }
    },
    _updatePath: function _updatePath() {
      this._renderer._updatePoly(this, !0);
    },
    _containsPoint: function _containsPoint(t) {
      var i,
          e,
          n,
          o,
          s,
          r,
          a,
          h,
          u = !1;
      if (!this._pxBounds || !this._pxBounds.contains(t)) return !1;

      for (o = 0, a = this._parts.length; o < a; o++) {
        for (s = 0, r = (h = (i = this._parts[o]).length) - 1; s < h; r = s++) {
          e = i[s], n = i[r], e.y > t.y != n.y > t.y && t.x < (n.x - e.x) * (t.y - e.y) / (n.y - e.y) + e.x && (u = !u);
        }
      }

      return u || nn.prototype._containsPoint.call(this, t, !0);
    }
  }),
      sn = Ke.extend({
    initialize: function initialize(t, i) {
      l(this, i), this._layers = {}, t && this.addData(t);
    },
    addData: function addData(t) {
      var i,
          e,
          n,
          o = oi(t) ? t : t.features;

      if (o) {
        for (i = 0, e = o.length; i < e; i++) {
          ((n = o[i]).geometries || n.geometry || n.features || n.coordinates) && this.addData(n);
        }

        return this;
      }

      var s = this.options;
      if (s.filter && !s.filter(t)) return this;
      var r = Ft(t, s);
      return r ? (r.feature = Yt(t), r.defaultOptions = r.options, this.resetStyle(r), s.onEachFeature && s.onEachFeature(t, r), this.addLayer(r)) : this;
    },
    resetStyle: function resetStyle(t) {
      return t.options = i({}, t.defaultOptions), this._setLayerStyle(t, this.options.style), this;
    },
    setStyle: function setStyle(t) {
      return this.eachLayer(function (i) {
        this._setLayerStyle(i, t);
      }, this);
    },
    _setLayerStyle: function _setLayerStyle(t, i) {
      "function" == typeof i && (i = i(t.feature)), t.setStyle && t.setStyle(i);
    }
  }),
      rn = {
    toGeoJSON: function toGeoJSON(t) {
      return Kt(this, {
        type: "Point",
        coordinates: qt(this.getLatLng(), t)
      });
    }
  };
  $e.include(rn), en.include(rn), tn.include(rn), nn.include({
    toGeoJSON: function toGeoJSON(t) {
      var i = !jt(this._latlngs),
          e = Gt(this._latlngs, i ? 1 : 0, !1, t);
      return Kt(this, {
        type: (i ? "Multi" : "") + "LineString",
        coordinates: e
      });
    }
  }), on.include({
    toGeoJSON: function toGeoJSON(t) {
      var i = !jt(this._latlngs),
          e = i && !jt(this._latlngs[0]),
          n = Gt(this._latlngs, e ? 2 : i ? 1 : 0, !0, t);
      return i || (n = [n]), Kt(this, {
        type: (e ? "Multi" : "") + "Polygon",
        coordinates: n
      });
    }
  }), Ge.include({
    toMultiPoint: function toMultiPoint(t) {
      var i = [];
      return this.eachLayer(function (e) {
        i.push(e.toGeoJSON(t).geometry.coordinates);
      }), Kt(this, {
        type: "MultiPoint",
        coordinates: i
      });
    },
    toGeoJSON: function toGeoJSON(t) {
      var i = this.feature && this.feature.geometry && this.feature.geometry.type;
      if ("MultiPoint" === i) return this.toMultiPoint(t);
      var e = "GeometryCollection" === i,
          n = [];
      return this.eachLayer(function (i) {
        if (i.toGeoJSON) {
          var o = i.toGeoJSON(t);
          if (e) n.push(o.geometry);else {
            var s = Yt(o);
            "FeatureCollection" === s.type ? n.push.apply(n, s.features) : n.push(s);
          }
        }
      }), e ? Kt(this, {
        geometries: n,
        type: "GeometryCollection"
      }) : {
        type: "FeatureCollection",
        features: n
      };
    }
  });
  var an = Xt,
      hn = qe.extend({
    options: {
      opacity: 1,
      alt: "",
      interactive: !1,
      crossOrigin: !1,
      errorOverlayUrl: "",
      zIndex: 1,
      className: ""
    },
    initialize: function initialize(t, i, e) {
      this._url = t, this._bounds = z(i), l(this, e);
    },
    onAdd: function onAdd() {
      this._image || (this._initImage(), this.options.opacity < 1 && this._updateOpacity()), this.options.interactive && (Q(this._image, "leaflet-interactive"), this.addInteractiveTarget(this._image)), this.getPane().appendChild(this._image), this._reset();
    },
    onRemove: function onRemove() {
      K(this._image), this.options.interactive && this.removeInteractiveTarget(this._image);
    },
    setOpacity: function setOpacity(t) {
      return this.options.opacity = t, this._image && this._updateOpacity(), this;
    },
    setStyle: function setStyle(t) {
      return t.opacity && this.setOpacity(t.opacity), this;
    },
    bringToFront: function bringToFront() {
      return this._map && X(this._image), this;
    },
    bringToBack: function bringToBack() {
      return this._map && J(this._image), this;
    },
    setUrl: function setUrl(t) {
      return this._url = t, this._image && (this._image.src = t), this;
    },
    setBounds: function setBounds(t) {
      return this._bounds = z(t), this._map && this._reset(), this;
    },
    getEvents: function getEvents() {
      var t = {
        zoom: this._reset,
        viewreset: this._reset
      };
      return this._zoomAnimated && (t.zoomanim = this._animateZoom), t;
    },
    setZIndex: function setZIndex(t) {
      return this.options.zIndex = t, this._updateZIndex(), this;
    },
    getBounds: function getBounds() {
      return this._bounds;
    },
    getElement: function getElement() {
      return this._image;
    },
    _initImage: function _initImage() {
      var t = "IMG" === this._url.tagName,
          i = this._image = t ? this._url : G("img");
      Q(i, "leaflet-image-layer"), this._zoomAnimated && Q(i, "leaflet-zoom-animated"), this.options.className && Q(i, this.options.className), i.onselectstart = r, i.onmousemove = r, i.onload = e(this.fire, this, "load"), i.onerror = e(this._overlayOnError, this, "error"), (this.options.crossOrigin || "" === this.options.crossOrigin) && (i.crossOrigin = !0 === this.options.crossOrigin ? "" : this.options.crossOrigin), this.options.zIndex && this._updateZIndex(), t ? this._url = i.src : (i.src = this._url, i.alt = this.options.alt);
    },
    _animateZoom: function _animateZoom(t) {
      var i = this._map.getZoomScale(t.zoom),
          e = this._map._latLngBoundsToNewLayerBounds(this._bounds, t.zoom, t.center).min;

      rt(this._image, e, i);
    },
    _reset: function _reset() {
      var t = this._image,
          i = new P(this._map.latLngToLayerPoint(this._bounds.getNorthWest()), this._map.latLngToLayerPoint(this._bounds.getSouthEast())),
          e = i.getSize();
      at(t, i.min), t.style.width = e.x + "px", t.style.height = e.y + "px";
    },
    _updateOpacity: function _updateOpacity() {
      nt(this._image, this.options.opacity);
    },
    _updateZIndex: function _updateZIndex() {
      this._image && void 0 !== this.options.zIndex && null !== this.options.zIndex && (this._image.style.zIndex = this.options.zIndex);
    },
    _overlayOnError: function _overlayOnError() {
      this.fire("error");
      var t = this.options.errorOverlayUrl;
      t && this._url !== t && (this._url = t, this._image.src = t);
    }
  }),
      un = hn.extend({
    options: {
      autoplay: !0,
      loop: !0
    },
    _initImage: function _initImage() {
      var t = "VIDEO" === this._url.tagName,
          i = this._image = t ? this._url : G("video");

      if (Q(i, "leaflet-image-layer"), this._zoomAnimated && Q(i, "leaflet-zoom-animated"), i.onselectstart = r, i.onmousemove = r, i.onloadeddata = e(this.fire, this, "load"), t) {
        for (var n = i.getElementsByTagName("source"), o = [], s = 0; s < n.length; s++) {
          o.push(n[s].src);
        }

        this._url = n.length > 0 ? o : [i.src];
      } else {
        oi(this._url) || (this._url = [this._url]), i.autoplay = !!this.options.autoplay, i.loop = !!this.options.loop;

        for (var a = 0; a < this._url.length; a++) {
          var h = G("source");
          h.src = this._url[a], i.appendChild(h);
        }
      }
    }
  }),
      ln = qe.extend({
    options: {
      offset: [0, 7],
      className: "",
      pane: "popupPane"
    },
    initialize: function initialize(t, i) {
      l(this, t), this._source = i;
    },
    onAdd: function onAdd(t) {
      this._zoomAnimated = t._zoomAnimated, this._container || this._initLayout(), t._fadeAnimated && nt(this._container, 0), clearTimeout(this._removeTimeout), this.getPane().appendChild(this._container), this.update(), t._fadeAnimated && nt(this._container, 1), this.bringToFront();
    },
    onRemove: function onRemove(t) {
      t._fadeAnimated ? (nt(this._container, 0), this._removeTimeout = setTimeout(e(K, void 0, this._container), 200)) : K(this._container);
    },
    getLatLng: function getLatLng() {
      return this._latlng;
    },
    setLatLng: function setLatLng(t) {
      return this._latlng = C(t), this._map && (this._updatePosition(), this._adjustPan()), this;
    },
    getContent: function getContent() {
      return this._content;
    },
    setContent: function setContent(t) {
      return this._content = t, this.update(), this;
    },
    getElement: function getElement() {
      return this._container;
    },
    update: function update() {
      this._map && (this._container.style.visibility = "hidden", this._updateContent(), this._updateLayout(), this._updatePosition(), this._container.style.visibility = "", this._adjustPan());
    },
    getEvents: function getEvents() {
      var t = {
        zoom: this._updatePosition,
        viewreset: this._updatePosition
      };
      return this._zoomAnimated && (t.zoomanim = this._animateZoom), t;
    },
    isOpen: function isOpen() {
      return !!this._map && this._map.hasLayer(this);
    },
    bringToFront: function bringToFront() {
      return this._map && X(this._container), this;
    },
    bringToBack: function bringToBack() {
      return this._map && J(this._container), this;
    },
    _updateContent: function _updateContent() {
      if (this._content) {
        var t = this._contentNode,
            i = "function" == typeof this._content ? this._content(this._source || this) : this._content;
        if ("string" == typeof i) t.innerHTML = i;else {
          for (; t.hasChildNodes();) {
            t.removeChild(t.firstChild);
          }

          t.appendChild(i);
        }
        this.fire("contentupdate");
      }
    },
    _updatePosition: function _updatePosition() {
      if (this._map) {
        var t = this._map.latLngToLayerPoint(this._latlng),
            i = w(this.options.offset),
            e = this._getAnchor();

        this._zoomAnimated ? at(this._container, t.add(e)) : i = i.add(t).add(e);
        var n = this._containerBottom = -i.y,
            o = this._containerLeft = -Math.round(this._containerWidth / 2) + i.x;
        this._container.style.bottom = n + "px", this._container.style.left = o + "px";
      }
    },
    _getAnchor: function _getAnchor() {
      return [0, 0];
    }
  }),
      cn = ln.extend({
    options: {
      maxWidth: 300,
      minWidth: 50,
      maxHeight: null,
      autoPan: !0,
      autoPanPaddingTopLeft: null,
      autoPanPaddingBottomRight: null,
      autoPanPadding: [5, 5],
      keepInView: !1,
      closeButton: !0,
      autoClose: !0,
      closeOnEscapeKey: !0,
      className: ""
    },
    openOn: function openOn(t) {
      return t.openPopup(this), this;
    },
    onAdd: function onAdd(t) {
      ln.prototype.onAdd.call(this, t), t.fire("popupopen", {
        popup: this
      }), this._source && (this._source.fire("popupopen", {
        popup: this
      }, !0), this._source instanceof Qe || this._source.on("preclick", yt));
    },
    onRemove: function onRemove(t) {
      ln.prototype.onRemove.call(this, t), t.fire("popupclose", {
        popup: this
      }), this._source && (this._source.fire("popupclose", {
        popup: this
      }, !0), this._source instanceof Qe || this._source.off("preclick", yt));
    },
    getEvents: function getEvents() {
      var t = ln.prototype.getEvents.call(this);
      return (void 0 !== this.options.closeOnClick ? this.options.closeOnClick : this._map.options.closePopupOnClick) && (t.preclick = this._close), this.options.keepInView && (t.moveend = this._adjustPan), t;
    },
    _close: function _close() {
      this._map && this._map.closePopup(this);
    },
    _initLayout: function _initLayout() {
      var t = "leaflet-popup",
          i = this._container = G("div", t + " " + (this.options.className || "") + " leaflet-zoom-animated"),
          e = this._wrapper = G("div", t + "-content-wrapper", i);

      if (this._contentNode = G("div", t + "-content", e), wt(e), xt(this._contentNode), mt(e, "contextmenu", yt), this._tipContainer = G("div", t + "-tip-container", i), this._tip = G("div", t + "-tip", this._tipContainer), this.options.closeButton) {
        var n = this._closeButton = G("a", t + "-close-button", i);
        n.href = "#close", n.innerHTML = "&#215;", mt(n, "click", this._onCloseButtonClick, this);
      }
    },
    _updateLayout: function _updateLayout() {
      var t = this._contentNode,
          i = t.style;
      i.width = "", i.whiteSpace = "nowrap";
      var e = t.offsetWidth;
      e = Math.min(e, this.options.maxWidth), e = Math.max(e, this.options.minWidth), i.width = e + 1 + "px", i.whiteSpace = "", i.height = "";
      var n = t.offsetHeight,
          o = this.options.maxHeight;
      o && n > o ? (i.height = o + "px", Q(t, "leaflet-popup-scrolled")) : tt(t, "leaflet-popup-scrolled"), this._containerWidth = this._container.offsetWidth;
    },
    _animateZoom: function _animateZoom(t) {
      var i = this._map._latLngToNewLayerPoint(this._latlng, t.zoom, t.center),
          e = this._getAnchor();

      at(this._container, i.add(e));
    },
    _adjustPan: function _adjustPan() {
      if (this.options.autoPan) {
        this._map._panAnim && this._map._panAnim.stop();
        var t = this._map,
            i = parseInt(q(this._container, "marginBottom"), 10) || 0,
            e = this._container.offsetHeight + i,
            n = this._containerWidth,
            o = new x(this._containerLeft, -e - this._containerBottom);

        o._add(ht(this._container));

        var s = t.layerPointToContainerPoint(o),
            r = w(this.options.autoPanPadding),
            a = w(this.options.autoPanPaddingTopLeft || r),
            h = w(this.options.autoPanPaddingBottomRight || r),
            u = t.getSize(),
            l = 0,
            c = 0;
        s.x + n + h.x > u.x && (l = s.x + n - u.x + h.x), s.x - l - a.x < 0 && (l = s.x - a.x), s.y + e + h.y > u.y && (c = s.y + e - u.y + h.y), s.y - c - a.y < 0 && (c = s.y - a.y), (l || c) && t.fire("autopanstart").panBy([l, c]);
      }
    },
    _onCloseButtonClick: function _onCloseButtonClick(t) {
      this._close(), Lt(t);
    },
    _getAnchor: function _getAnchor() {
      return w(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);
    }
  });
  be.mergeOptions({
    closePopupOnClick: !0
  }), be.include({
    openPopup: function openPopup(t, i, e) {
      return t instanceof cn || (t = new cn(e).setContent(t)), i && t.setLatLng(i), this.hasLayer(t) ? this : (this._popup && this._popup.options.autoClose && this.closePopup(), this._popup = t, this.addLayer(t));
    },
    closePopup: function closePopup(t) {
      return t && t !== this._popup || (t = this._popup, this._popup = null), t && this.removeLayer(t), this;
    }
  }), qe.include({
    bindPopup: function bindPopup(t, i) {
      return t instanceof cn ? (l(t, i), this._popup = t, t._source = this) : (this._popup && !i || (this._popup = new cn(i, this)), this._popup.setContent(t)), this._popupHandlersAdded || (this.on({
        click: this._openPopup,
        keypress: this._onKeyPress,
        remove: this.closePopup,
        move: this._movePopup
      }), this._popupHandlersAdded = !0), this;
    },
    unbindPopup: function unbindPopup() {
      return this._popup && (this.off({
        click: this._openPopup,
        keypress: this._onKeyPress,
        remove: this.closePopup,
        move: this._movePopup
      }), this._popupHandlersAdded = !1, this._popup = null), this;
    },
    openPopup: function openPopup(t, i) {
      if (t instanceof qe || (i = t, t = this), t instanceof Ke) for (var e in this._layers) {
        t = this._layers[e];
        break;
      }
      return i || (i = t.getCenter ? t.getCenter() : t.getLatLng()), this._popup && this._map && (this._popup._source = t, this._popup.update(), this._map.openPopup(this._popup, i)), this;
    },
    closePopup: function closePopup() {
      return this._popup && this._popup._close(), this;
    },
    togglePopup: function togglePopup(t) {
      return this._popup && (this._popup._map ? this.closePopup() : this.openPopup(t)), this;
    },
    isPopupOpen: function isPopupOpen() {
      return !!this._popup && this._popup.isOpen();
    },
    setPopupContent: function setPopupContent(t) {
      return this._popup && this._popup.setContent(t), this;
    },
    getPopup: function getPopup() {
      return this._popup;
    },
    _openPopup: function _openPopup(t) {
      var i = t.layer || t.target;
      this._popup && this._map && (Lt(t), i instanceof Qe ? this.openPopup(t.layer || t.target, t.latlng) : this._map.hasLayer(this._popup) && this._popup._source === i ? this.closePopup() : this.openPopup(i, t.latlng));
    },
    _movePopup: function _movePopup(t) {
      this._popup.setLatLng(t.latlng);
    },
    _onKeyPress: function _onKeyPress(t) {
      13 === t.originalEvent.keyCode && this._openPopup(t);
    }
  });

  var _n = ln.extend({
    options: {
      pane: "tooltipPane",
      offset: [0, 0],
      direction: "auto",
      permanent: !1,
      sticky: !1,
      interactive: !1,
      opacity: .9
    },
    onAdd: function onAdd(t) {
      ln.prototype.onAdd.call(this, t), this.setOpacity(this.options.opacity), t.fire("tooltipopen", {
        tooltip: this
      }), this._source && this._source.fire("tooltipopen", {
        tooltip: this
      }, !0);
    },
    onRemove: function onRemove(t) {
      ln.prototype.onRemove.call(this, t), t.fire("tooltipclose", {
        tooltip: this
      }), this._source && this._source.fire("tooltipclose", {
        tooltip: this
      }, !0);
    },
    getEvents: function getEvents() {
      var t = ln.prototype.getEvents.call(this);
      return qi && !this.options.permanent && (t.preclick = this._close), t;
    },
    _close: function _close() {
      this._map && this._map.closeTooltip(this);
    },
    _initLayout: function _initLayout() {
      var t = "leaflet-tooltip " + (this.options.className || "") + " leaflet-zoom-" + (this._zoomAnimated ? "animated" : "hide");
      this._contentNode = this._container = G("div", t);
    },
    _updateLayout: function _updateLayout() {},
    _adjustPan: function _adjustPan() {},
    _setPosition: function _setPosition(t) {
      var i = this._map,
          e = this._container,
          n = i.latLngToContainerPoint(i.getCenter()),
          o = i.layerPointToContainerPoint(t),
          s = this.options.direction,
          r = e.offsetWidth,
          a = e.offsetHeight,
          h = w(this.options.offset),
          u = this._getAnchor();

      "top" === s ? t = t.add(w(-r / 2 + h.x, -a + h.y + u.y, !0)) : "bottom" === s ? t = t.subtract(w(r / 2 - h.x, -h.y, !0)) : "center" === s ? t = t.subtract(w(r / 2 + h.x, a / 2 - u.y + h.y, !0)) : "right" === s || "auto" === s && o.x < n.x ? (s = "right", t = t.add(w(h.x + u.x, u.y - a / 2 + h.y, !0))) : (s = "left", t = t.subtract(w(r + u.x - h.x, a / 2 - u.y - h.y, !0))), tt(e, "leaflet-tooltip-right"), tt(e, "leaflet-tooltip-left"), tt(e, "leaflet-tooltip-top"), tt(e, "leaflet-tooltip-bottom"), Q(e, "leaflet-tooltip-" + s), at(e, t);
    },
    _updatePosition: function _updatePosition() {
      var t = this._map.latLngToLayerPoint(this._latlng);

      this._setPosition(t);
    },
    setOpacity: function setOpacity(t) {
      this.options.opacity = t, this._container && nt(this._container, t);
    },
    _animateZoom: function _animateZoom(t) {
      var i = this._map._latLngToNewLayerPoint(this._latlng, t.zoom, t.center);

      this._setPosition(i);
    },
    _getAnchor: function _getAnchor() {
      return w(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);
    }
  });

  be.include({
    openTooltip: function openTooltip(t, i, e) {
      return t instanceof _n || (t = new _n(e).setContent(t)), i && t.setLatLng(i), this.hasLayer(t) ? this : this.addLayer(t);
    },
    closeTooltip: function closeTooltip(t) {
      return t && this.removeLayer(t), this;
    }
  }), qe.include({
    bindTooltip: function bindTooltip(t, i) {
      return t instanceof _n ? (l(t, i), this._tooltip = t, t._source = this) : (this._tooltip && !i || (this._tooltip = new _n(i, this)), this._tooltip.setContent(t)), this._initTooltipInteractions(), this._tooltip.options.permanent && this._map && this._map.hasLayer(this) && this.openTooltip(), this;
    },
    unbindTooltip: function unbindTooltip() {
      return this._tooltip && (this._initTooltipInteractions(!0), this.closeTooltip(), this._tooltip = null), this;
    },
    _initTooltipInteractions: function _initTooltipInteractions(t) {
      if (t || !this._tooltipHandlersAdded) {
        var i = t ? "off" : "on",
            e = {
          remove: this.closeTooltip,
          move: this._moveTooltip
        };
        this._tooltip.options.permanent ? e.add = this._openTooltip : (e.mouseover = this._openTooltip, e.mouseout = this.closeTooltip, this._tooltip.options.sticky && (e.mousemove = this._moveTooltip), qi && (e.click = this._openTooltip)), this[i](e), this._tooltipHandlersAdded = !t;
      }
    },
    openTooltip: function openTooltip(t, i) {
      if (t instanceof qe || (i = t, t = this), t instanceof Ke) for (var e in this._layers) {
        t = this._layers[e];
        break;
      }
      return i || (i = t.getCenter ? t.getCenter() : t.getLatLng()), this._tooltip && this._map && (this._tooltip._source = t, this._tooltip.update(), this._map.openTooltip(this._tooltip, i), this._tooltip.options.interactive && this._tooltip._container && (Q(this._tooltip._container, "leaflet-clickable"), this.addInteractiveTarget(this._tooltip._container))), this;
    },
    closeTooltip: function closeTooltip() {
      return this._tooltip && (this._tooltip._close(), this._tooltip.options.interactive && this._tooltip._container && (tt(this._tooltip._container, "leaflet-clickable"), this.removeInteractiveTarget(this._tooltip._container))), this;
    },
    toggleTooltip: function toggleTooltip(t) {
      return this._tooltip && (this._tooltip._map ? this.closeTooltip() : this.openTooltip(t)), this;
    },
    isTooltipOpen: function isTooltipOpen() {
      return this._tooltip.isOpen();
    },
    setTooltipContent: function setTooltipContent(t) {
      return this._tooltip && this._tooltip.setContent(t), this;
    },
    getTooltip: function getTooltip() {
      return this._tooltip;
    },
    _openTooltip: function _openTooltip(t) {
      var i = t.layer || t.target;
      this._tooltip && this._map && this.openTooltip(i, this._tooltip.options.sticky ? t.latlng : void 0);
    },
    _moveTooltip: function _moveTooltip(t) {
      var i,
          e,
          n = t.latlng;
      this._tooltip.options.sticky && t.originalEvent && (i = this._map.mouseEventToContainerPoint(t.originalEvent), e = this._map.containerPointToLayerPoint(i), n = this._map.layerPointToLatLng(e)), this._tooltip.setLatLng(n);
    }
  });
  var dn = Ye.extend({
    options: {
      iconSize: [12, 12],
      html: !1,
      bgPos: null,
      className: "leaflet-div-icon"
    },
    createIcon: function createIcon(t) {
      var i = t && "DIV" === t.tagName ? t : document.createElement("div"),
          e = this.options;

      if (i.innerHTML = !1 !== e.html ? e.html : "", e.bgPos) {
        var n = w(e.bgPos);
        i.style.backgroundPosition = -n.x + "px " + -n.y + "px";
      }

      return this._setIconStyles(i, "icon"), i;
    },
    createShadow: function createShadow() {
      return null;
    }
  });
  Ye.Default = Xe;
  var pn = qe.extend({
    options: {
      tileSize: 256,
      opacity: 1,
      updateWhenIdle: Wi,
      updateWhenZooming: !0,
      updateInterval: 200,
      zIndex: 1,
      bounds: null,
      minZoom: 0,
      maxZoom: void 0,
      maxNativeZoom: void 0,
      minNativeZoom: void 0,
      noWrap: !1,
      pane: "tilePane",
      className: "",
      keepBuffer: 2
    },
    initialize: function initialize(t) {
      l(this, t);
    },
    onAdd: function onAdd() {
      this._initContainer(), this._levels = {}, this._tiles = {}, this._resetView(), this._update();
    },
    beforeAdd: function beforeAdd(t) {
      t._addZoomLimit(this);
    },
    onRemove: function onRemove(t) {
      this._removeAllTiles(), K(this._container), t._removeZoomLimit(this), this._container = null, this._tileZoom = void 0;
    },
    bringToFront: function bringToFront() {
      return this._map && (X(this._container), this._setAutoZIndex(Math.max)), this;
    },
    bringToBack: function bringToBack() {
      return this._map && (J(this._container), this._setAutoZIndex(Math.min)), this;
    },
    getContainer: function getContainer() {
      return this._container;
    },
    setOpacity: function setOpacity(t) {
      return this.options.opacity = t, this._updateOpacity(), this;
    },
    setZIndex: function setZIndex(t) {
      return this.options.zIndex = t, this._updateZIndex(), this;
    },
    isLoading: function isLoading() {
      return this._loading;
    },
    redraw: function redraw() {
      return this._map && (this._removeAllTiles(), this._update()), this;
    },
    getEvents: function getEvents() {
      var t = {
        viewprereset: this._invalidateAll,
        viewreset: this._resetView,
        zoom: this._resetView,
        moveend: this._onMoveEnd
      };
      return this.options.updateWhenIdle || (this._onMove || (this._onMove = o(this._onMoveEnd, this.options.updateInterval, this)), t.move = this._onMove), this._zoomAnimated && (t.zoomanim = this._animateZoom), t;
    },
    createTile: function createTile() {
      return document.createElement("div");
    },
    getTileSize: function getTileSize() {
      var t = this.options.tileSize;
      return t instanceof x ? t : new x(t, t);
    },
    _updateZIndex: function _updateZIndex() {
      this._container && void 0 !== this.options.zIndex && null !== this.options.zIndex && (this._container.style.zIndex = this.options.zIndex);
    },
    _setAutoZIndex: function _setAutoZIndex(t) {
      for (var i, e = this.getPane().children, n = -t(-1 / 0, 1 / 0), o = 0, s = e.length; o < s; o++) {
        i = e[o].style.zIndex, e[o] !== this._container && i && (n = t(n, +i));
      }

      isFinite(n) && (this.options.zIndex = n + t(-1, 1), this._updateZIndex());
    },
    _updateOpacity: function _updateOpacity() {
      if (this._map && !Li) {
        nt(this._container, this.options.opacity);
        var t = +new Date(),
            i = !1,
            e = !1;

        for (var n in this._tiles) {
          var o = this._tiles[n];

          if (o.current && o.loaded) {
            var s = Math.min(1, (t - o.loaded) / 200);
            nt(o.el, s), s < 1 ? i = !0 : (o.active ? e = !0 : this._onOpaqueTile(o), o.active = !0);
          }
        }

        e && !this._noPrune && this._pruneTiles(), i && (g(this._fadeFrame), this._fadeFrame = f(this._updateOpacity, this));
      }
    },
    _onOpaqueTile: r,
    _initContainer: function _initContainer() {
      this._container || (this._container = G("div", "leaflet-layer " + (this.options.className || "")), this._updateZIndex(), this.options.opacity < 1 && this._updateOpacity(), this.getPane().appendChild(this._container));
    },
    _updateLevels: function _updateLevels() {
      var t = this._tileZoom,
          i = this.options.maxZoom;

      if (void 0 !== t) {
        for (var e in this._levels) {
          this._levels[e].el.children.length || e === t ? (this._levels[e].el.style.zIndex = i - Math.abs(t - e), this._onUpdateLevel(e)) : (K(this._levels[e].el), this._removeTilesAtZoom(e), this._onRemoveLevel(e), delete this._levels[e]);
        }

        var n = this._levels[t],
            o = this._map;
        return n || ((n = this._levels[t] = {}).el = G("div", "leaflet-tile-container leaflet-zoom-animated", this._container), n.el.style.zIndex = i, n.origin = o.project(o.unproject(o.getPixelOrigin()), t).round(), n.zoom = t, this._setZoomTransform(n, o.getCenter(), o.getZoom()), n.el.offsetWidth, this._onCreateLevel(n)), this._level = n, n;
      }
    },
    _onUpdateLevel: r,
    _onRemoveLevel: r,
    _onCreateLevel: r,
    _pruneTiles: function _pruneTiles() {
      if (this._map) {
        var t,
            i,
            e = this._map.getZoom();

        if (e > this.options.maxZoom || e < this.options.minZoom) this._removeAllTiles();else {
          for (t in this._tiles) {
            (i = this._tiles[t]).retain = i.current;
          }

          for (t in this._tiles) {
            if ((i = this._tiles[t]).current && !i.active) {
              var n = i.coords;
              this._retainParent(n.x, n.y, n.z, n.z - 5) || this._retainChildren(n.x, n.y, n.z, n.z + 2);
            }
          }

          for (t in this._tiles) {
            this._tiles[t].retain || this._removeTile(t);
          }
        }
      }
    },
    _removeTilesAtZoom: function _removeTilesAtZoom(t) {
      for (var i in this._tiles) {
        this._tiles[i].coords.z === t && this._removeTile(i);
      }
    },
    _removeAllTiles: function _removeAllTiles() {
      for (var t in this._tiles) {
        this._removeTile(t);
      }
    },
    _invalidateAll: function _invalidateAll() {
      for (var t in this._levels) {
        K(this._levels[t].el), this._onRemoveLevel(t), delete this._levels[t];
      }

      this._removeAllTiles(), this._tileZoom = void 0;
    },
    _retainParent: function _retainParent(t, i, e, n) {
      var o = Math.floor(t / 2),
          s = Math.floor(i / 2),
          r = e - 1,
          a = new x(+o, +s);
      a.z = +r;

      var h = this._tileCoordsToKey(a),
          u = this._tiles[h];

      return u && u.active ? (u.retain = !0, !0) : (u && u.loaded && (u.retain = !0), r > n && this._retainParent(o, s, r, n));
    },
    _retainChildren: function _retainChildren(t, i, e, n) {
      for (var o = 2 * t; o < 2 * t + 2; o++) {
        for (var s = 2 * i; s < 2 * i + 2; s++) {
          var r = new x(o, s);
          r.z = e + 1;

          var a = this._tileCoordsToKey(r),
              h = this._tiles[a];

          h && h.active ? h.retain = !0 : (h && h.loaded && (h.retain = !0), e + 1 < n && this._retainChildren(o, s, e + 1, n));
        }
      }
    },
    _resetView: function _resetView(t) {
      var i = t && (t.pinch || t.flyTo);

      this._setView(this._map.getCenter(), this._map.getZoom(), i, i);
    },
    _animateZoom: function _animateZoom(t) {
      this._setView(t.center, t.zoom, !0, t.noUpdate);
    },
    _clampZoom: function _clampZoom(t) {
      var i = this.options;
      return void 0 !== i.minNativeZoom && t < i.minNativeZoom ? i.minNativeZoom : void 0 !== i.maxNativeZoom && i.maxNativeZoom < t ? i.maxNativeZoom : t;
    },
    _setView: function _setView(t, i, e, n) {
      var o = this._clampZoom(Math.round(i));

      (void 0 !== this.options.maxZoom && o > this.options.maxZoom || void 0 !== this.options.minZoom && o < this.options.minZoom) && (o = void 0);
      var s = this.options.updateWhenZooming && o !== this._tileZoom;
      n && !s || (this._tileZoom = o, this._abortLoading && this._abortLoading(), this._updateLevels(), this._resetGrid(), void 0 !== o && this._update(t), e || this._pruneTiles(), this._noPrune = !!e), this._setZoomTransforms(t, i);
    },
    _setZoomTransforms: function _setZoomTransforms(t, i) {
      for (var e in this._levels) {
        this._setZoomTransform(this._levels[e], t, i);
      }
    },
    _setZoomTransform: function _setZoomTransform(t, i, e) {
      var n = this._map.getZoomScale(e, t.zoom),
          o = t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(i, e)).round();

      ji ? rt(t.el, o, n) : at(t.el, o);
    },
    _resetGrid: function _resetGrid() {
      var t = this._map,
          i = t.options.crs,
          e = this._tileSize = this.getTileSize(),
          n = this._tileZoom,
          o = this._map.getPixelWorldBounds(this._tileZoom);

      o && (this._globalTileRange = this._pxBoundsToTileRange(o)), this._wrapX = i.wrapLng && !this.options.noWrap && [Math.floor(t.project([0, i.wrapLng[0]], n).x / e.x), Math.ceil(t.project([0, i.wrapLng[1]], n).x / e.y)], this._wrapY = i.wrapLat && !this.options.noWrap && [Math.floor(t.project([i.wrapLat[0], 0], n).y / e.x), Math.ceil(t.project([i.wrapLat[1], 0], n).y / e.y)];
    },
    _onMoveEnd: function _onMoveEnd() {
      this._map && !this._map._animatingZoom && this._update();
    },
    _getTiledPixelBounds: function _getTiledPixelBounds(t) {
      var i = this._map,
          e = i._animatingZoom ? Math.max(i._animateToZoom, i.getZoom()) : i.getZoom(),
          n = i.getZoomScale(e, this._tileZoom),
          o = i.project(t, this._tileZoom).floor(),
          s = i.getSize().divideBy(2 * n);
      return new P(o.subtract(s), o.add(s));
    },
    _update: function _update(t) {
      var i = this._map;

      if (i) {
        var e = this._clampZoom(i.getZoom());

        if (void 0 === t && (t = i.getCenter()), void 0 !== this._tileZoom) {
          var n = this._getTiledPixelBounds(t),
              o = this._pxBoundsToTileRange(n),
              s = o.getCenter(),
              r = [],
              a = this.options.keepBuffer,
              h = new P(o.getBottomLeft().subtract([a, -a]), o.getTopRight().add([a, -a]));

          if (!(isFinite(o.min.x) && isFinite(o.min.y) && isFinite(o.max.x) && isFinite(o.max.y))) throw new Error("Attempted to load an infinite number of tiles");

          for (var u in this._tiles) {
            var l = this._tiles[u].coords;
            l.z === this._tileZoom && h.contains(new x(l.x, l.y)) || (this._tiles[u].current = !1);
          }

          if (Math.abs(e - this._tileZoom) > 1) this._setView(t, e);else {
            for (var c = o.min.y; c <= o.max.y; c++) {
              for (var _ = o.min.x; _ <= o.max.x; _++) {
                var d = new x(_, c);

                if (d.z = this._tileZoom, this._isValidTile(d)) {
                  var p = this._tiles[this._tileCoordsToKey(d)];

                  p ? p.current = !0 : r.push(d);
                }
              }
            }

            if (r.sort(function (t, i) {
              return t.distanceTo(s) - i.distanceTo(s);
            }), 0 !== r.length) {
              this._loading || (this._loading = !0, this.fire("loading"));
              var m = document.createDocumentFragment();

              for (_ = 0; _ < r.length; _++) {
                this._addTile(r[_], m);
              }

              this._level.el.appendChild(m);
            }
          }
        }
      }
    },
    _isValidTile: function _isValidTile(t) {
      var i = this._map.options.crs;

      if (!i.infinite) {
        var e = this._globalTileRange;
        if (!i.wrapLng && (t.x < e.min.x || t.x > e.max.x) || !i.wrapLat && (t.y < e.min.y || t.y > e.max.y)) return !1;
      }

      if (!this.options.bounds) return !0;

      var n = this._tileCoordsToBounds(t);

      return z(this.options.bounds).overlaps(n);
    },
    _keyToBounds: function _keyToBounds(t) {
      return this._tileCoordsToBounds(this._keyToTileCoords(t));
    },
    _tileCoordsToNwSe: function _tileCoordsToNwSe(t) {
      var i = this._map,
          e = this.getTileSize(),
          n = t.scaleBy(e),
          o = n.add(e);
      return [i.unproject(n, t.z), i.unproject(o, t.z)];
    },
    _tileCoordsToBounds: function _tileCoordsToBounds(t) {
      var i = this._tileCoordsToNwSe(t),
          e = new T(i[0], i[1]);

      return this.options.noWrap || (e = this._map.wrapLatLngBounds(e)), e;
    },
    _tileCoordsToKey: function _tileCoordsToKey(t) {
      return t.x + ":" + t.y + ":" + t.z;
    },
    _keyToTileCoords: function _keyToTileCoords(t) {
      var i = t.split(":"),
          e = new x(+i[0], +i[1]);
      return e.z = +i[2], e;
    },
    _removeTile: function _removeTile(t) {
      var i = this._tiles[t];
      i && (K(i.el), delete this._tiles[t], this.fire("tileunload", {
        tile: i.el,
        coords: this._keyToTileCoords(t)
      }));
    },
    _initTile: function _initTile(t) {
      Q(t, "leaflet-tile");
      var i = this.getTileSize();
      t.style.width = i.x + "px", t.style.height = i.y + "px", t.onselectstart = r, t.onmousemove = r, Li && this.options.opacity < 1 && nt(t, this.options.opacity), zi && !Mi && (t.style.WebkitBackfaceVisibility = "hidden");
    },
    _addTile: function _addTile(t, i) {
      var n = this._getTilePos(t),
          o = this._tileCoordsToKey(t),
          s = this.createTile(this._wrapCoords(t), e(this._tileReady, this, t));

      this._initTile(s), this.createTile.length < 2 && f(e(this._tileReady, this, t, null, s)), at(s, n), this._tiles[o] = {
        el: s,
        coords: t,
        current: !0
      }, i.appendChild(s), this.fire("tileloadstart", {
        tile: s,
        coords: t
      });
    },
    _tileReady: function _tileReady(t, i, n) {
      i && this.fire("tileerror", {
        error: i,
        tile: n,
        coords: t
      });

      var o = this._tileCoordsToKey(t);

      (n = this._tiles[o]) && (n.loaded = +new Date(), this._map._fadeAnimated ? (nt(n.el, 0), g(this._fadeFrame), this._fadeFrame = f(this._updateOpacity, this)) : (n.active = !0, this._pruneTiles()), i || (Q(n.el, "leaflet-tile-loaded"), this.fire("tileload", {
        tile: n.el,
        coords: t
      })), this._noTilesToLoad() && (this._loading = !1, this.fire("load"), Li || !this._map._fadeAnimated ? f(this._pruneTiles, this) : setTimeout(e(this._pruneTiles, this), 250)));
    },
    _getTilePos: function _getTilePos(t) {
      return t.scaleBy(this.getTileSize()).subtract(this._level.origin);
    },
    _wrapCoords: function _wrapCoords(t) {
      var i = new x(this._wrapX ? s(t.x, this._wrapX) : t.x, this._wrapY ? s(t.y, this._wrapY) : t.y);
      return i.z = t.z, i;
    },
    _pxBoundsToTileRange: function _pxBoundsToTileRange(t) {
      var i = this.getTileSize();
      return new P(t.min.unscaleBy(i).floor(), t.max.unscaleBy(i).ceil().subtract([1, 1]));
    },
    _noTilesToLoad: function _noTilesToLoad() {
      for (var t in this._tiles) {
        if (!this._tiles[t].loaded) return !1;
      }

      return !0;
    }
  }),
      mn = pn.extend({
    options: {
      minZoom: 0,
      maxZoom: 18,
      subdomains: "abc",
      errorTileUrl: "",
      zoomOffset: 0,
      tms: !1,
      zoomReverse: !1,
      detectRetina: !1,
      crossOrigin: !1
    },
    initialize: function initialize(t, i) {
      this._url = t, (i = l(this, i)).detectRetina && Yi && i.maxZoom > 0 && (i.tileSize = Math.floor(i.tileSize / 2), i.zoomReverse ? (i.zoomOffset--, i.minZoom++) : (i.zoomOffset++, i.maxZoom--), i.minZoom = Math.max(0, i.minZoom)), "string" == typeof i.subdomains && (i.subdomains = i.subdomains.split("")), zi || this.on("tileunload", this._onTileRemove);
    },
    setUrl: function setUrl(t, i) {
      return this._url === t && void 0 === i && (i = !0), this._url = t, i || this.redraw(), this;
    },
    createTile: function createTile(t, i) {
      var n = document.createElement("img");
      return mt(n, "load", e(this._tileOnLoad, this, i, n)), mt(n, "error", e(this._tileOnError, this, i, n)), (this.options.crossOrigin || "" === this.options.crossOrigin) && (n.crossOrigin = !0 === this.options.crossOrigin ? "" : this.options.crossOrigin), n.alt = "", n.setAttribute("role", "presentation"), n.src = this.getTileUrl(t), n;
    },
    getTileUrl: function getTileUrl(t) {
      var e = {
        r: Yi ? "@2x" : "",
        s: this._getSubdomain(t),
        x: t.x,
        y: t.y,
        z: this._getZoomForUrl()
      };

      if (this._map && !this._map.options.crs.infinite) {
        var n = this._globalTileRange.max.y - t.y;
        this.options.tms && (e.y = n), e["-y"] = n;
      }

      return _(this._url, i(e, this.options));
    },
    _tileOnLoad: function _tileOnLoad(t, i) {
      Li ? setTimeout(e(t, this, null, i), 0) : t(null, i);
    },
    _tileOnError: function _tileOnError(t, i, e) {
      var n = this.options.errorTileUrl;
      n && i.getAttribute("src") !== n && (i.src = n), t(e, i);
    },
    _onTileRemove: function _onTileRemove(t) {
      t.tile.onload = null;
    },
    _getZoomForUrl: function _getZoomForUrl() {
      var t = this._tileZoom,
          i = this.options.maxZoom,
          e = this.options.zoomReverse,
          n = this.options.zoomOffset;
      return e && (t = i - t), t + n;
    },
    _getSubdomain: function _getSubdomain(t) {
      var i = Math.abs(t.x + t.y) % this.options.subdomains.length;
      return this.options.subdomains[i];
    },
    _abortLoading: function _abortLoading() {
      var t, i;

      for (t in this._tiles) {
        this._tiles[t].coords.z !== this._tileZoom && ((i = this._tiles[t].el).onload = r, i.onerror = r, i.complete || (i.src = si, K(i), delete this._tiles[t]));
      }
    },
    _removeTile: function _removeTile(t) {
      var i = this._tiles[t];
      if (i) return Si || i.el.setAttribute("src", si), pn.prototype._removeTile.call(this, t);
    },
    _tileReady: function _tileReady(t, i, e) {
      if (this._map && (!e || e.getAttribute("src") !== si)) return pn.prototype._tileReady.call(this, t, i, e);
    }
  }),
      fn = mn.extend({
    defaultWmsParams: {
      service: "WMS",
      request: "GetMap",
      layers: "",
      styles: "",
      format: "image/jpeg",
      transparent: !1,
      version: "1.1.1"
    },
    options: {
      crs: null,
      uppercase: !1
    },
    initialize: function initialize(t, e) {
      this._url = t;
      var n = i({}, this.defaultWmsParams);

      for (var o in e) {
        o in this.options || (n[o] = e[o]);
      }

      var s = (e = l(this, e)).detectRetina && Yi ? 2 : 1,
          r = this.getTileSize();
      n.width = r.x * s, n.height = r.y * s, this.wmsParams = n;
    },
    onAdd: function onAdd(t) {
      this._crs = this.options.crs || t.options.crs, this._wmsVersion = parseFloat(this.wmsParams.version);
      var i = this._wmsVersion >= 1.3 ? "crs" : "srs";
      this.wmsParams[i] = this._crs.code, mn.prototype.onAdd.call(this, t);
    },
    getTileUrl: function getTileUrl(t) {
      var i = this._tileCoordsToNwSe(t),
          e = this._crs,
          n = b(e.project(i[0]), e.project(i[1])),
          o = n.min,
          s = n.max,
          r = (this._wmsVersion >= 1.3 && this._crs === Ue ? [o.y, o.x, s.y, s.x] : [o.x, o.y, s.x, s.y]).join(","),
          a = mn.prototype.getTileUrl.call(this, t);

      return a + c(this.wmsParams, a, this.options.uppercase) + (this.options.uppercase ? "&BBOX=" : "&bbox=") + r;
    },
    setParams: function setParams(t, e) {
      return i(this.wmsParams, t), e || this.redraw(), this;
    }
  });
  mn.WMS = fn, Jt.wms = function (t, i) {
    return new fn(t, i);
  };

  var gn = qe.extend({
    options: {
      padding: .1,
      tolerance: 0
    },
    initialize: function initialize(t) {
      l(this, t), n(this), this._layers = this._layers || {};
    },
    onAdd: function onAdd() {
      this._container || (this._initContainer(), this._zoomAnimated && Q(this._container, "leaflet-zoom-animated")), this.getPane().appendChild(this._container), this._update(), this.on("update", this._updatePaths, this);
    },
    onRemove: function onRemove() {
      this.off("update", this._updatePaths, this), this._destroyContainer();
    },
    getEvents: function getEvents() {
      var t = {
        viewreset: this._reset,
        zoom: this._onZoom,
        moveend: this._update,
        zoomend: this._onZoomEnd
      };
      return this._zoomAnimated && (t.zoomanim = this._onAnimZoom), t;
    },
    _onAnimZoom: function _onAnimZoom(t) {
      this._updateTransform(t.center, t.zoom);
    },
    _onZoom: function _onZoom() {
      this._updateTransform(this._map.getCenter(), this._map.getZoom());
    },
    _updateTransform: function _updateTransform(t, i) {
      var e = this._map.getZoomScale(i, this._zoom),
          n = ht(this._container),
          o = this._map.getSize().multiplyBy(.5 + this.options.padding),
          s = this._map.project(this._center, i),
          r = this._map.project(t, i).subtract(s),
          a = o.multiplyBy(-e).add(n).add(o).subtract(r);

      ji ? rt(this._container, a, e) : at(this._container, a);
    },
    _reset: function _reset() {
      this._update(), this._updateTransform(this._center, this._zoom);

      for (var t in this._layers) {
        this._layers[t]._reset();
      }
    },
    _onZoomEnd: function _onZoomEnd() {
      for (var t in this._layers) {
        this._layers[t]._project();
      }
    },
    _updatePaths: function _updatePaths() {
      for (var t in this._layers) {
        this._layers[t]._update();
      }
    },
    _update: function _update() {
      var t = this.options.padding,
          i = this._map.getSize(),
          e = this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();

      this._bounds = new P(e, e.add(i.multiplyBy(1 + 2 * t)).round()), this._center = this._map.getCenter(), this._zoom = this._map.getZoom();
    }
  }),
      vn = gn.extend({
    getEvents: function getEvents() {
      var t = gn.prototype.getEvents.call(this);
      return t.viewprereset = this._onViewPreReset, t;
    },
    _onViewPreReset: function _onViewPreReset() {
      this._postponeUpdatePaths = !0;
    },
    onAdd: function onAdd() {
      gn.prototype.onAdd.call(this), this._draw();
    },
    _initContainer: function _initContainer() {
      var t = this._container = document.createElement("canvas");
      mt(t, "mousemove", o(this._onMouseMove, 32, this), this), mt(t, "click dblclick mousedown mouseup contextmenu", this._onClick, this), mt(t, "mouseout", this._handleMouseOut, this), this._ctx = t.getContext("2d");
    },
    _destroyContainer: function _destroyContainer() {
      g(this._redrawRequest), delete this._ctx, K(this._container), ft(this._container), delete this._container;
    },
    _updatePaths: function _updatePaths() {
      if (!this._postponeUpdatePaths) {
        this._redrawBounds = null;

        for (var t in this._layers) {
          this._layers[t]._update();
        }

        this._redraw();
      }
    },
    _update: function _update() {
      if (!this._map._animatingZoom || !this._bounds) {
        gn.prototype._update.call(this);

        var t = this._bounds,
            i = this._container,
            e = t.getSize(),
            n = Yi ? 2 : 1;
        at(i, t.min), i.width = n * e.x, i.height = n * e.y, i.style.width = e.x + "px", i.style.height = e.y + "px", Yi && this._ctx.scale(2, 2), this._ctx.translate(-t.min.x, -t.min.y), this.fire("update");
      }
    },
    _reset: function _reset() {
      gn.prototype._reset.call(this), this._postponeUpdatePaths && (this._postponeUpdatePaths = !1, this._updatePaths());
    },
    _initPath: function _initPath(t) {
      this._updateDashArray(t), this._layers[n(t)] = t;
      var i = t._order = {
        layer: t,
        prev: this._drawLast,
        next: null
      };
      this._drawLast && (this._drawLast.next = i), this._drawLast = i, this._drawFirst = this._drawFirst || this._drawLast;
    },
    _addPath: function _addPath(t) {
      this._requestRedraw(t);
    },
    _removePath: function _removePath(t) {
      var i = t._order,
          e = i.next,
          o = i.prev;
      e ? e.prev = o : this._drawLast = o, o ? o.next = e : this._drawFirst = e, delete t._order, delete this._layers[n(t)], this._requestRedraw(t);
    },
    _updatePath: function _updatePath(t) {
      this._extendRedrawBounds(t), t._project(), t._update(), this._requestRedraw(t);
    },
    _updateStyle: function _updateStyle(t) {
      this._updateDashArray(t), this._requestRedraw(t);
    },
    _updateDashArray: function _updateDashArray(t) {
      if ("string" == typeof t.options.dashArray) {
        var i,
            e,
            n = t.options.dashArray.split(/[, ]+/),
            o = [];

        for (e = 0; e < n.length; e++) {
          if (i = Number(n[e]), isNaN(i)) return;
          o.push(i);
        }

        t.options._dashArray = o;
      } else t.options._dashArray = t.options.dashArray;
    },
    _requestRedraw: function _requestRedraw(t) {
      this._map && (this._extendRedrawBounds(t), this._redrawRequest = this._redrawRequest || f(this._redraw, this));
    },
    _extendRedrawBounds: function _extendRedrawBounds(t) {
      if (t._pxBounds) {
        var i = (t.options.weight || 0) + 1;
        this._redrawBounds = this._redrawBounds || new P(), this._redrawBounds.extend(t._pxBounds.min.subtract([i, i])), this._redrawBounds.extend(t._pxBounds.max.add([i, i]));
      }
    },
    _redraw: function _redraw() {
      this._redrawRequest = null, this._redrawBounds && (this._redrawBounds.min._floor(), this._redrawBounds.max._ceil()), this._clear(), this._draw(), this._redrawBounds = null;
    },
    _clear: function _clear() {
      var t = this._redrawBounds;

      if (t) {
        var i = t.getSize();

        this._ctx.clearRect(t.min.x, t.min.y, i.x, i.y);
      } else this._ctx.clearRect(0, 0, this._container.width, this._container.height);
    },
    _draw: function _draw() {
      var t,
          i = this._redrawBounds;

      if (this._ctx.save(), i) {
        var e = i.getSize();
        this._ctx.beginPath(), this._ctx.rect(i.min.x, i.min.y, e.x, e.y), this._ctx.clip();
      }

      this._drawing = !0;

      for (var n = this._drawFirst; n; n = n.next) {
        t = n.layer, (!i || t._pxBounds && t._pxBounds.intersects(i)) && t._updatePath();
      }

      this._drawing = !1, this._ctx.restore();
    },
    _updatePoly: function _updatePoly(t, i) {
      if (this._drawing) {
        var e,
            n,
            o,
            s,
            r = t._parts,
            a = r.length,
            h = this._ctx;

        if (a) {
          for (h.beginPath(), e = 0; e < a; e++) {
            for (n = 0, o = r[e].length; n < o; n++) {
              s = r[e][n], h[n ? "lineTo" : "moveTo"](s.x, s.y);
            }

            i && h.closePath();
          }

          this._fillStroke(h, t);
        }
      }
    },
    _updateCircle: function _updateCircle(t) {
      if (this._drawing && !t._empty()) {
        var i = t._point,
            e = this._ctx,
            n = Math.max(Math.round(t._radius), 1),
            o = (Math.max(Math.round(t._radiusY), 1) || n) / n;
        1 !== o && (e.save(), e.scale(1, o)), e.beginPath(), e.arc(i.x, i.y / o, n, 0, 2 * Math.PI, !1), 1 !== o && e.restore(), this._fillStroke(e, t);
      }
    },
    _fillStroke: function _fillStroke(t, i) {
      var e = i.options;
      e.fill && (t.globalAlpha = e.fillOpacity, t.fillStyle = e.fillColor || e.color, t.fill(e.fillRule || "evenodd")), e.stroke && 0 !== e.weight && (t.setLineDash && t.setLineDash(i.options && i.options._dashArray || []), t.globalAlpha = e.opacity, t.lineWidth = e.weight, t.strokeStyle = e.color, t.lineCap = e.lineCap, t.lineJoin = e.lineJoin, t.stroke());
    },
    _onClick: function _onClick(t) {
      for (var i, e, n = this._map.mouseEventToLayerPoint(t), o = this._drawFirst; o; o = o.next) {
        (i = o.layer).options.interactive && i._containsPoint(n) && !this._map._draggableMoved(i) && (e = i);
      }

      e && (zt(t), this._fireEvent([e], t));
    },
    _onMouseMove: function _onMouseMove(t) {
      if (this._map && !this._map.dragging.moving() && !this._map._animatingZoom) {
        var i = this._map.mouseEventToLayerPoint(t);

        this._handleMouseHover(t, i);
      }
    },
    _handleMouseOut: function _handleMouseOut(t) {
      var i = this._hoveredLayer;
      i && (tt(this._container, "leaflet-interactive"), this._fireEvent([i], t, "mouseout"), this._hoveredLayer = null);
    },
    _handleMouseHover: function _handleMouseHover(t, i) {
      for (var e, n, o = this._drawFirst; o; o = o.next) {
        (e = o.layer).options.interactive && e._containsPoint(i) && (n = e);
      }

      n !== this._hoveredLayer && (this._handleMouseOut(t), n && (Q(this._container, "leaflet-interactive"), this._fireEvent([n], t, "mouseover"), this._hoveredLayer = n)), this._hoveredLayer && this._fireEvent([this._hoveredLayer], t);
    },
    _fireEvent: function _fireEvent(t, i, e) {
      this._map._fireDOMEvent(i, e || i.type, t);
    },
    _bringToFront: function _bringToFront(t) {
      var i = t._order;

      if (i) {
        var e = i.next,
            n = i.prev;
        e && (e.prev = n, n ? n.next = e : e && (this._drawFirst = e), i.prev = this._drawLast, this._drawLast.next = i, i.next = null, this._drawLast = i, this._requestRedraw(t));
      }
    },
    _bringToBack: function _bringToBack(t) {
      var i = t._order;

      if (i) {
        var e = i.next,
            n = i.prev;
        n && (n.next = e, e ? e.prev = n : n && (this._drawLast = n), i.prev = null, i.next = this._drawFirst, this._drawFirst.prev = i, this._drawFirst = i, this._requestRedraw(t));
      }
    }
  }),
      yn = function () {
    try {
      return document.namespaces.add("lvml", "urn:schemas-microsoft-com:vml"), function (t) {
        return document.createElement("<lvml:" + t + ' class="lvml">');
      };
    } catch (t) {
      return function (t) {
        return document.createElement("<" + t + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
      };
    }
  }(),
      xn = {
    _initContainer: function _initContainer() {
      this._container = G("div", "leaflet-vml-container");
    },
    _update: function _update() {
      this._map._animatingZoom || (gn.prototype._update.call(this), this.fire("update"));
    },
    _initPath: function _initPath(t) {
      var i = t._container = yn("shape");
      Q(i, "leaflet-vml-shape " + (this.options.className || "")), i.coordsize = "1 1", t._path = yn("path"), i.appendChild(t._path), this._updateStyle(t), this._layers[n(t)] = t;
    },
    _addPath: function _addPath(t) {
      var i = t._container;
      this._container.appendChild(i), t.options.interactive && t.addInteractiveTarget(i);
    },
    _removePath: function _removePath(t) {
      var i = t._container;
      K(i), t.removeInteractiveTarget(i), delete this._layers[n(t)];
    },
    _updateStyle: function _updateStyle(t) {
      var i = t._stroke,
          e = t._fill,
          n = t.options,
          o = t._container;
      o.stroked = !!n.stroke, o.filled = !!n.fill, n.stroke ? (i || (i = t._stroke = yn("stroke")), o.appendChild(i), i.weight = n.weight + "px", i.color = n.color, i.opacity = n.opacity, n.dashArray ? i.dashStyle = oi(n.dashArray) ? n.dashArray.join(" ") : n.dashArray.replace(/( *, *)/g, " ") : i.dashStyle = "", i.endcap = n.lineCap.replace("butt", "flat"), i.joinstyle = n.lineJoin) : i && (o.removeChild(i), t._stroke = null), n.fill ? (e || (e = t._fill = yn("fill")), o.appendChild(e), e.color = n.fillColor || n.color, e.opacity = n.fillOpacity) : e && (o.removeChild(e), t._fill = null);
    },
    _updateCircle: function _updateCircle(t) {
      var i = t._point.round(),
          e = Math.round(t._radius),
          n = Math.round(t._radiusY || e);

      this._setPath(t, t._empty() ? "M0 0" : "AL " + i.x + "," + i.y + " " + e + "," + n + " 0,23592600");
    },
    _setPath: function _setPath(t, i) {
      t._path.v = i;
    },
    _bringToFront: function _bringToFront(t) {
      X(t._container);
    },
    _bringToBack: function _bringToBack(t) {
      J(t._container);
    }
  },
      wn = $i ? yn : E,
      Pn = gn.extend({
    getEvents: function getEvents() {
      var t = gn.prototype.getEvents.call(this);
      return t.zoomstart = this._onZoomStart, t;
    },
    _initContainer: function _initContainer() {
      this._container = wn("svg"), this._container.setAttribute("pointer-events", "none"), this._rootGroup = wn("g"), this._container.appendChild(this._rootGroup);
    },
    _destroyContainer: function _destroyContainer() {
      K(this._container), ft(this._container), delete this._container, delete this._rootGroup, delete this._svgSize;
    },
    _onZoomStart: function _onZoomStart() {
      this._update();
    },
    _update: function _update() {
      if (!this._map._animatingZoom || !this._bounds) {
        gn.prototype._update.call(this);

        var t = this._bounds,
            i = t.getSize(),
            e = this._container;
        this._svgSize && this._svgSize.equals(i) || (this._svgSize = i, e.setAttribute("width", i.x), e.setAttribute("height", i.y)), at(e, t.min), e.setAttribute("viewBox", [t.min.x, t.min.y, i.x, i.y].join(" ")), this.fire("update");
      }
    },
    _initPath: function _initPath(t) {
      var i = t._path = wn("path");
      t.options.className && Q(i, t.options.className), t.options.interactive && Q(i, "leaflet-interactive"), this._updateStyle(t), this._layers[n(t)] = t;
    },
    _addPath: function _addPath(t) {
      this._rootGroup || this._initContainer(), this._rootGroup.appendChild(t._path), t.addInteractiveTarget(t._path);
    },
    _removePath: function _removePath(t) {
      K(t._path), t.removeInteractiveTarget(t._path), delete this._layers[n(t)];
    },
    _updatePath: function _updatePath(t) {
      t._project(), t._update();
    },
    _updateStyle: function _updateStyle(t) {
      var i = t._path,
          e = t.options;
      i && (e.stroke ? (i.setAttribute("stroke", e.color), i.setAttribute("stroke-opacity", e.opacity), i.setAttribute("stroke-width", e.weight), i.setAttribute("stroke-linecap", e.lineCap), i.setAttribute("stroke-linejoin", e.lineJoin), e.dashArray ? i.setAttribute("stroke-dasharray", e.dashArray) : i.removeAttribute("stroke-dasharray"), e.dashOffset ? i.setAttribute("stroke-dashoffset", e.dashOffset) : i.removeAttribute("stroke-dashoffset")) : i.setAttribute("stroke", "none"), e.fill ? (i.setAttribute("fill", e.fillColor || e.color), i.setAttribute("fill-opacity", e.fillOpacity), i.setAttribute("fill-rule", e.fillRule || "evenodd")) : i.setAttribute("fill", "none"));
    },
    _updatePoly: function _updatePoly(t, i) {
      this._setPath(t, k(t._parts, i));
    },
    _updateCircle: function _updateCircle(t) {
      var i = t._point,
          e = Math.max(Math.round(t._radius), 1),
          n = "a" + e + "," + (Math.max(Math.round(t._radiusY), 1) || e) + " 0 1,0 ",
          o = t._empty() ? "M0 0" : "M" + (i.x - e) + "," + i.y + n + 2 * e + ",0 " + n + 2 * -e + ",0 ";

      this._setPath(t, o);
    },
    _setPath: function _setPath(t, i) {
      t._path.setAttribute("d", i);
    },
    _bringToFront: function _bringToFront(t) {
      X(t._path);
    },
    _bringToBack: function _bringToBack(t) {
      J(t._path);
    }
  });

  $i && Pn.include(xn), be.include({
    getRenderer: function getRenderer(t) {
      var i = t.options.renderer || this._getPaneRenderer(t.options.pane) || this.options.renderer || this._renderer;

      return i || (i = this._renderer = this._createRenderer()), this.hasLayer(i) || this.addLayer(i), i;
    },
    _getPaneRenderer: function _getPaneRenderer(t) {
      if ("overlayPane" === t || void 0 === t) return !1;
      var i = this._paneRenderers[t];
      return void 0 === i && (i = this._createRenderer({
        pane: t
      }), this._paneRenderers[t] = i), i;
    },
    _createRenderer: function _createRenderer(t) {
      return this.options.preferCanvas && $t(t) || Qt(t);
    }
  });
  var Ln = on.extend({
    initialize: function initialize(t, i) {
      on.prototype.initialize.call(this, this._boundsToLatLngs(t), i);
    },
    setBounds: function setBounds(t) {
      return this.setLatLngs(this._boundsToLatLngs(t));
    },
    _boundsToLatLngs: function _boundsToLatLngs(t) {
      return t = z(t), [t.getSouthWest(), t.getNorthWest(), t.getNorthEast(), t.getSouthEast()];
    }
  });
  Pn.create = wn, Pn.pointsToPath = k, sn.geometryToLayer = Ft, sn.coordsToLatLng = Ut, sn.coordsToLatLngs = Vt, sn.latLngToCoords = qt, sn.latLngsToCoords = Gt, sn.getFeature = Kt, sn.asFeature = Yt, be.mergeOptions({
    boxZoom: !0
  });
  var bn = Ee.extend({
    initialize: function initialize(t) {
      this._map = t, this._container = t._container, this._pane = t._panes.overlayPane, this._resetStateTimeout = 0, t.on("unload", this._destroy, this);
    },
    addHooks: function addHooks() {
      mt(this._container, "mousedown", this._onMouseDown, this);
    },
    removeHooks: function removeHooks() {
      ft(this._container, "mousedown", this._onMouseDown, this);
    },
    moved: function moved() {
      return this._moved;
    },
    _destroy: function _destroy() {
      K(this._pane), delete this._pane;
    },
    _resetState: function _resetState() {
      this._resetStateTimeout = 0, this._moved = !1;
    },
    _clearDeferredResetState: function _clearDeferredResetState() {
      0 !== this._resetStateTimeout && (clearTimeout(this._resetStateTimeout), this._resetStateTimeout = 0);
    },
    _onMouseDown: function _onMouseDown(t) {
      if (!t.shiftKey || 1 !== t.which && 1 !== t.button) return !1;
      this._clearDeferredResetState(), this._resetState(), fi(), ut(), this._startPoint = this._map.mouseEventToContainerPoint(t), mt(document, {
        contextmenu: Lt,
        mousemove: this._onMouseMove,
        mouseup: this._onMouseUp,
        keydown: this._onKeyDown
      }, this);
    },
    _onMouseMove: function _onMouseMove(t) {
      this._moved || (this._moved = !0, this._box = G("div", "leaflet-zoom-box", this._container), Q(this._container, "leaflet-crosshair"), this._map.fire("boxzoomstart")), this._point = this._map.mouseEventToContainerPoint(t);
      var i = new P(this._point, this._startPoint),
          e = i.getSize();
      at(this._box, i.min), this._box.style.width = e.x + "px", this._box.style.height = e.y + "px";
    },
    _finish: function _finish() {
      this._moved && (K(this._box), tt(this._container, "leaflet-crosshair")), gi(), lt(), ft(document, {
        contextmenu: Lt,
        mousemove: this._onMouseMove,
        mouseup: this._onMouseUp,
        keydown: this._onKeyDown
      }, this);
    },
    _onMouseUp: function _onMouseUp(t) {
      if ((1 === t.which || 1 === t.button) && (this._finish(), this._moved)) {
        this._clearDeferredResetState(), this._resetStateTimeout = setTimeout(e(this._resetState, this), 0);
        var i = new T(this._map.containerPointToLatLng(this._startPoint), this._map.containerPointToLatLng(this._point));

        this._map.fitBounds(i).fire("boxzoomend", {
          boxZoomBounds: i
        });
      }
    },
    _onKeyDown: function _onKeyDown(t) {
      27 === t.keyCode && this._finish();
    }
  });
  be.addInitHook("addHandler", "boxZoom", bn), be.mergeOptions({
    doubleClickZoom: !0
  });
  var Tn = Ee.extend({
    addHooks: function addHooks() {
      this._map.on("dblclick", this._onDoubleClick, this);
    },
    removeHooks: function removeHooks() {
      this._map.off("dblclick", this._onDoubleClick, this);
    },
    _onDoubleClick: function _onDoubleClick(t) {
      var i = this._map,
          e = i.getZoom(),
          n = i.options.zoomDelta,
          o = t.originalEvent.shiftKey ? e - n : e + n;
      "center" === i.options.doubleClickZoom ? i.setZoom(o) : i.setZoomAround(t.containerPoint, o);
    }
  });
  be.addInitHook("addHandler", "doubleClickZoom", Tn), be.mergeOptions({
    dragging: !0,
    inertia: !Mi,
    inertiaDeceleration: 3400,
    inertiaMaxSpeed: 1 / 0,
    easeLinearity: .2,
    worldCopyJump: !1,
    maxBoundsViscosity: 0
  });
  var zn = Ee.extend({
    addHooks: function addHooks() {
      if (!this._draggable) {
        var t = this._map;
        this._draggable = new Re(t._mapPane, t._container), this._draggable.on({
          dragstart: this._onDragStart,
          drag: this._onDrag,
          dragend: this._onDragEnd
        }, this), this._draggable.on("predrag", this._onPreDragLimit, this), t.options.worldCopyJump && (this._draggable.on("predrag", this._onPreDragWrap, this), t.on("zoomend", this._onZoomEnd, this), t.whenReady(this._onZoomEnd, this));
      }

      Q(this._map._container, "leaflet-grab leaflet-touch-drag"), this._draggable.enable(), this._positions = [], this._times = [];
    },
    removeHooks: function removeHooks() {
      tt(this._map._container, "leaflet-grab"), tt(this._map._container, "leaflet-touch-drag"), this._draggable.disable();
    },
    moved: function moved() {
      return this._draggable && this._draggable._moved;
    },
    moving: function moving() {
      return this._draggable && this._draggable._moving;
    },
    _onDragStart: function _onDragStart() {
      var t = this._map;

      if (t._stop(), this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {
        var i = z(this._map.options.maxBounds);
        this._offsetLimit = b(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1), this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())), this._viscosity = Math.min(1, Math.max(0, this._map.options.maxBoundsViscosity));
      } else this._offsetLimit = null;

      t.fire("movestart").fire("dragstart"), t.options.inertia && (this._positions = [], this._times = []);
    },
    _onDrag: function _onDrag(t) {
      if (this._map.options.inertia) {
        var i = this._lastTime = +new Date(),
            e = this._lastPos = this._draggable._absPos || this._draggable._newPos;
        this._positions.push(e), this._times.push(i), this._prunePositions(i);
      }

      this._map.fire("move", t).fire("drag", t);
    },
    _prunePositions: function _prunePositions(t) {
      for (; this._positions.length > 1 && t - this._times[0] > 50;) {
        this._positions.shift(), this._times.shift();
      }
    },
    _onZoomEnd: function _onZoomEnd() {
      var t = this._map.getSize().divideBy(2),
          i = this._map.latLngToLayerPoint([0, 0]);

      this._initialWorldOffset = i.subtract(t).x, this._worldWidth = this._map.getPixelWorldBounds().getSize().x;
    },
    _viscousLimit: function _viscousLimit(t, i) {
      return t - (t - i) * this._viscosity;
    },
    _onPreDragLimit: function _onPreDragLimit() {
      if (this._viscosity && this._offsetLimit) {
        var t = this._draggable._newPos.subtract(this._draggable._startPos),
            i = this._offsetLimit;

        t.x < i.min.x && (t.x = this._viscousLimit(t.x, i.min.x)), t.y < i.min.y && (t.y = this._viscousLimit(t.y, i.min.y)), t.x > i.max.x && (t.x = this._viscousLimit(t.x, i.max.x)), t.y > i.max.y && (t.y = this._viscousLimit(t.y, i.max.y)), this._draggable._newPos = this._draggable._startPos.add(t);
      }
    },
    _onPreDragWrap: function _onPreDragWrap() {
      var t = this._worldWidth,
          i = Math.round(t / 2),
          e = this._initialWorldOffset,
          n = this._draggable._newPos.x,
          o = (n - i + e) % t + i - e,
          s = (n + i + e) % t - i - e,
          r = Math.abs(o + e) < Math.abs(s + e) ? o : s;
      this._draggable._absPos = this._draggable._newPos.clone(), this._draggable._newPos.x = r;
    },
    _onDragEnd: function _onDragEnd(t) {
      var i = this._map,
          e = i.options,
          n = !e.inertia || this._times.length < 2;
      if (i.fire("dragend", t), n) i.fire("moveend");else {
        this._prunePositions(+new Date());

        var o = this._lastPos.subtract(this._positions[0]),
            s = (this._lastTime - this._times[0]) / 1e3,
            r = e.easeLinearity,
            a = o.multiplyBy(r / s),
            h = a.distanceTo([0, 0]),
            u = Math.min(e.inertiaMaxSpeed, h),
            l = a.multiplyBy(u / h),
            c = u / (e.inertiaDeceleration * r),
            _ = l.multiplyBy(-c / 2).round();

        _.x || _.y ? (_ = i._limitOffset(_, i.options.maxBounds), f(function () {
          i.panBy(_, {
            duration: c,
            easeLinearity: r,
            noMoveStart: !0,
            animate: !0
          });
        })) : i.fire("moveend");
      }
    }
  });
  be.addInitHook("addHandler", "dragging", zn), be.mergeOptions({
    keyboard: !0,
    keyboardPanDelta: 80
  });
  var Mn = Ee.extend({
    keyCodes: {
      left: [37],
      right: [39],
      down: [40],
      up: [38],
      zoomIn: [187, 107, 61, 171],
      zoomOut: [189, 109, 54, 173]
    },
    initialize: function initialize(t) {
      this._map = t, this._setPanDelta(t.options.keyboardPanDelta), this._setZoomDelta(t.options.zoomDelta);
    },
    addHooks: function addHooks() {
      var t = this._map._container;
      t.tabIndex <= 0 && (t.tabIndex = "0"), mt(t, {
        focus: this._onFocus,
        blur: this._onBlur,
        mousedown: this._onMouseDown
      }, this), this._map.on({
        focus: this._addHooks,
        blur: this._removeHooks
      }, this);
    },
    removeHooks: function removeHooks() {
      this._removeHooks(), ft(this._map._container, {
        focus: this._onFocus,
        blur: this._onBlur,
        mousedown: this._onMouseDown
      }, this), this._map.off({
        focus: this._addHooks,
        blur: this._removeHooks
      }, this);
    },
    _onMouseDown: function _onMouseDown() {
      if (!this._focused) {
        var t = document.body,
            i = document.documentElement,
            e = t.scrollTop || i.scrollTop,
            n = t.scrollLeft || i.scrollLeft;
        this._map._container.focus(), window.scrollTo(n, e);
      }
    },
    _onFocus: function _onFocus() {
      this._focused = !0, this._map.fire("focus");
    },
    _onBlur: function _onBlur() {
      this._focused = !1, this._map.fire("blur");
    },
    _setPanDelta: function _setPanDelta(t) {
      var i,
          e,
          n = this._panKeys = {},
          o = this.keyCodes;

      for (i = 0, e = o.left.length; i < e; i++) {
        n[o.left[i]] = [-1 * t, 0];
      }

      for (i = 0, e = o.right.length; i < e; i++) {
        n[o.right[i]] = [t, 0];
      }

      for (i = 0, e = o.down.length; i < e; i++) {
        n[o.down[i]] = [0, t];
      }

      for (i = 0, e = o.up.length; i < e; i++) {
        n[o.up[i]] = [0, -1 * t];
      }
    },
    _setZoomDelta: function _setZoomDelta(t) {
      var i,
          e,
          n = this._zoomKeys = {},
          o = this.keyCodes;

      for (i = 0, e = o.zoomIn.length; i < e; i++) {
        n[o.zoomIn[i]] = t;
      }

      for (i = 0, e = o.zoomOut.length; i < e; i++) {
        n[o.zoomOut[i]] = -t;
      }
    },
    _addHooks: function _addHooks() {
      mt(document, "keydown", this._onKeyDown, this);
    },
    _removeHooks: function _removeHooks() {
      ft(document, "keydown", this._onKeyDown, this);
    },
    _onKeyDown: function _onKeyDown(t) {
      if (!(t.altKey || t.ctrlKey || t.metaKey)) {
        var i,
            e = t.keyCode,
            n = this._map;
        if (e in this._panKeys) n._panAnim && n._panAnim._inProgress || (i = this._panKeys[e], t.shiftKey && (i = w(i).multiplyBy(3)), n.panBy(i), n.options.maxBounds && n.panInsideBounds(n.options.maxBounds));else if (e in this._zoomKeys) n.setZoom(n.getZoom() + (t.shiftKey ? 3 : 1) * this._zoomKeys[e]);else {
          if (27 !== e || !n._popup || !n._popup.options.closeOnEscapeKey) return;
          n.closePopup();
        }
        Lt(t);
      }
    }
  });
  be.addInitHook("addHandler", "keyboard", Mn), be.mergeOptions({
    scrollWheelZoom: !0,
    wheelDebounceTime: 40,
    wheelPxPerZoomLevel: 60
  });
  var Cn = Ee.extend({
    addHooks: function addHooks() {
      mt(this._map._container, "mousewheel", this._onWheelScroll, this), this._delta = 0;
    },
    removeHooks: function removeHooks() {
      ft(this._map._container, "mousewheel", this._onWheelScroll, this);
    },
    _onWheelScroll: function _onWheelScroll(t) {
      var i = Tt(t),
          n = this._map.options.wheelDebounceTime;
      this._delta += i, this._lastMousePos = this._map.mouseEventToContainerPoint(t), this._startTime || (this._startTime = +new Date());
      var o = Math.max(n - (+new Date() - this._startTime), 0);
      clearTimeout(this._timer), this._timer = setTimeout(e(this._performZoom, this), o), Lt(t);
    },
    _performZoom: function _performZoom() {
      var t = this._map,
          i = t.getZoom(),
          e = this._map.options.zoomSnap || 0;

      t._stop();

      var n = this._delta / (4 * this._map.options.wheelPxPerZoomLevel),
          o = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(n)))) / Math.LN2,
          s = e ? Math.ceil(o / e) * e : o,
          r = t._limitZoom(i + (this._delta > 0 ? s : -s)) - i;
      this._delta = 0, this._startTime = null, r && ("center" === t.options.scrollWheelZoom ? t.setZoom(i + r) : t.setZoomAround(this._lastMousePos, i + r));
    }
  });
  be.addInitHook("addHandler", "scrollWheelZoom", Cn), be.mergeOptions({
    tap: !0,
    tapTolerance: 15
  });
  var Sn = Ee.extend({
    addHooks: function addHooks() {
      mt(this._map._container, "touchstart", this._onDown, this);
    },
    removeHooks: function removeHooks() {
      ft(this._map._container, "touchstart", this._onDown, this);
    },
    _onDown: function _onDown(t) {
      if (t.touches) {
        if (Pt(t), this._fireClick = !0, t.touches.length > 1) return this._fireClick = !1, void clearTimeout(this._holdTimeout);
        var i = t.touches[0],
            n = i.target;
        this._startPos = this._newPos = new x(i.clientX, i.clientY), n.tagName && "a" === n.tagName.toLowerCase() && Q(n, "leaflet-active"), this._holdTimeout = setTimeout(e(function () {
          this._isTapValid() && (this._fireClick = !1, this._onUp(), this._simulateEvent("contextmenu", i));
        }, this), 1e3), this._simulateEvent("mousedown", i), mt(document, {
          touchmove: this._onMove,
          touchend: this._onUp
        }, this);
      }
    },
    _onUp: function _onUp(t) {
      if (clearTimeout(this._holdTimeout), ft(document, {
        touchmove: this._onMove,
        touchend: this._onUp
      }, this), this._fireClick && t && t.changedTouches) {
        var i = t.changedTouches[0],
            e = i.target;
        e && e.tagName && "a" === e.tagName.toLowerCase() && tt(e, "leaflet-active"), this._simulateEvent("mouseup", i), this._isTapValid() && this._simulateEvent("click", i);
      }
    },
    _isTapValid: function _isTapValid() {
      return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
    },
    _onMove: function _onMove(t) {
      var i = t.touches[0];
      this._newPos = new x(i.clientX, i.clientY), this._simulateEvent("mousemove", i);
    },
    _simulateEvent: function _simulateEvent(t, i) {
      var e = document.createEvent("MouseEvents");
      e._simulated = !0, i.target._simulatedClick = !0, e.initMouseEvent(t, !0, !0, window, 1, i.screenX, i.screenY, i.clientX, i.clientY, !1, !1, !1, !1, 0, null), i.target.dispatchEvent(e);
    }
  });
  qi && !Vi && be.addInitHook("addHandler", "tap", Sn), be.mergeOptions({
    touchZoom: qi && !Mi,
    bounceAtZoomLimits: !0
  });
  var Zn = Ee.extend({
    addHooks: function addHooks() {
      Q(this._map._container, "leaflet-touch-zoom"), mt(this._map._container, "touchstart", this._onTouchStart, this);
    },
    removeHooks: function removeHooks() {
      tt(this._map._container, "leaflet-touch-zoom"), ft(this._map._container, "touchstart", this._onTouchStart, this);
    },
    _onTouchStart: function _onTouchStart(t) {
      var i = this._map;

      if (t.touches && 2 === t.touches.length && !i._animatingZoom && !this._zooming) {
        var e = i.mouseEventToContainerPoint(t.touches[0]),
            n = i.mouseEventToContainerPoint(t.touches[1]);
        this._centerPoint = i.getSize()._divideBy(2), this._startLatLng = i.containerPointToLatLng(this._centerPoint), "center" !== i.options.touchZoom && (this._pinchStartLatLng = i.containerPointToLatLng(e.add(n)._divideBy(2))), this._startDist = e.distanceTo(n), this._startZoom = i.getZoom(), this._moved = !1, this._zooming = !0, i._stop(), mt(document, "touchmove", this._onTouchMove, this), mt(document, "touchend", this._onTouchEnd, this), Pt(t);
      }
    },
    _onTouchMove: function _onTouchMove(t) {
      if (t.touches && 2 === t.touches.length && this._zooming) {
        var i = this._map,
            n = i.mouseEventToContainerPoint(t.touches[0]),
            o = i.mouseEventToContainerPoint(t.touches[1]),
            s = n.distanceTo(o) / this._startDist;

        if (this._zoom = i.getScaleZoom(s, this._startZoom), !i.options.bounceAtZoomLimits && (this._zoom < i.getMinZoom() && s < 1 || this._zoom > i.getMaxZoom() && s > 1) && (this._zoom = i._limitZoom(this._zoom)), "center" === i.options.touchZoom) {
          if (this._center = this._startLatLng, 1 === s) return;
        } else {
          var r = n._add(o)._divideBy(2)._subtract(this._centerPoint);

          if (1 === s && 0 === r.x && 0 === r.y) return;
          this._center = i.unproject(i.project(this._pinchStartLatLng, this._zoom).subtract(r), this._zoom);
        }

        this._moved || (i._moveStart(!0, !1), this._moved = !0), g(this._animRequest);
        var a = e(i._move, i, this._center, this._zoom, {
          pinch: !0,
          round: !1
        });
        this._animRequest = f(a, this, !0), Pt(t);
      }
    },
    _onTouchEnd: function _onTouchEnd() {
      this._moved && this._zooming ? (this._zooming = !1, g(this._animRequest), ft(document, "touchmove", this._onTouchMove), ft(document, "touchend", this._onTouchEnd), this._map.options.zoomAnimation ? this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), !0, this._map.options.zoomSnap) : this._map._resetView(this._center, this._map._limitZoom(this._zoom))) : this._zooming = !1;
    }
  });
  be.addInitHook("addHandler", "touchZoom", Zn), be.BoxZoom = bn, be.DoubleClickZoom = Tn, be.Drag = zn, be.Keyboard = Mn, be.ScrollWheelZoom = Cn, be.Tap = Sn, be.TouchZoom = Zn, Object.freeze = ti, t.version = "1.4.0+HEAD.3337f36", t.Control = Te, t.control = ze, t.Browser = Qi, t.Evented = ci, t.Mixin = Be, t.Util = ui, t.Class = v, t.Handler = Ee, t.extend = i, t.bind = e, t.stamp = n, t.setOptions = l, t.DomEvent = Pe, t.DomUtil = ve, t.PosAnimation = Le, t.Draggable = Re, t.LineUtil = Ne, t.PolyUtil = De, t.Point = x, t.point = w, t.Bounds = P, t.bounds = b, t.Transformation = S, t.transformation = Z, t.Projection = He, t.LatLng = M, t.latLng = C, t.LatLngBounds = T, t.latLngBounds = z, t.CRS = di, t.GeoJSON = sn, t.geoJSON = Xt, t.geoJson = an, t.Layer = qe, t.LayerGroup = Ge, t.layerGroup = function (t, i) {
    return new Ge(t, i);
  }, t.FeatureGroup = Ke, t.featureGroup = function (t) {
    return new Ke(t);
  }, t.ImageOverlay = hn, t.imageOverlay = function (t, i, e) {
    return new hn(t, i, e);
  }, t.VideoOverlay = un, t.videoOverlay = function (t, i, e) {
    return new un(t, i, e);
  }, t.DivOverlay = ln, t.Popup = cn, t.popup = function (t, i) {
    return new cn(t, i);
  }, t.Tooltip = _n, t.tooltip = function (t, i) {
    return new _n(t, i);
  }, t.Icon = Ye, t.icon = function (t) {
    return new Ye(t);
  }, t.DivIcon = dn, t.divIcon = function (t) {
    return new dn(t);
  }, t.Marker = $e, t.marker = function (t, i) {
    return new $e(t, i);
  }, t.TileLayer = mn, t.tileLayer = Jt, t.GridLayer = pn, t.gridLayer = function (t) {
    return new pn(t);
  }, t.SVG = Pn, t.svg = Qt, t.Renderer = gn, t.Canvas = vn, t.canvas = $t, t.Path = Qe, t.CircleMarker = tn, t.circleMarker = function (t, i) {
    return new tn(t, i);
  }, t.Circle = en, t.circle = function (t, i, e) {
    return new en(t, i, e);
  }, t.Polyline = nn, t.polyline = function (t, i) {
    return new nn(t, i);
  }, t.Polygon = on, t.polygon = function (t, i) {
    return new on(t, i);
  }, t.Rectangle = Ln, t.rectangle = function (t, i) {
    return new Ln(t, i);
  }, t.Map = be, t.map = function (t, i) {
    return new be(t, i);
  };
  var En = window.L;
  t.noConflict = function () {
    return window.L = En, this;
  }, window.L = t;
});

/***/ }),

/***/ "./node_modules/bootstrap-slider/dist/bootstrap-slider.js":
/*!****************************************************************!*\
  !*** ./node_modules/bootstrap-slider/dist/bootstrap-slider.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! =======================================================
                      VERSION  11.0.2              
========================================================= */


var _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; };

/*! =========================================================
 * bootstrap-slider.js
 *
 * Maintainers:
 *		Kyle Kemp
 *			- Twitter: @seiyria
 *			- Github:  seiyria
 *		Rohit Kalkur
 *			- Twitter: @Rovolutionary
 *			- Github:  rovolution
 *
 * =========================================================
 *
 * bootstrap-slider is released under the MIT License
 * Copyright (c) 2019 Kyle Kemp, Rohit Kalkur, and contributors
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * ========================================================= */

/**
 * Bridget makes jQuery widgets
 * v1.0.1
 * MIT license
 */
var windowIsDefined = (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object";

(function (factory) {
	if (true) {
		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
	} else { var jQuery; }
})(function ($) {
	// Constants
	var NAMESPACE_MAIN = 'slider';
	var NAMESPACE_ALTERNATE = 'bootstrapSlider';

	// Polyfill console methods
	if (windowIsDefined && !window.console) {
		window.console = {};
	}
	if (windowIsDefined && !window.console.log) {
		window.console.log = function () {};
	}
	if (windowIsDefined && !window.console.warn) {
		window.console.warn = function () {};
	}

	// Reference to Slider constructor
	var Slider;

	(function ($) {

		'use strict';

		// -------------------------- utils -------------------------- //

		var slice = Array.prototype.slice;

		function noop() {}

		// -------------------------- definition -------------------------- //

		function defineBridget($) {

			// bail if no jQuery
			if (!$) {
				return;
			}

			// -------------------------- addOptionMethod -------------------------- //

			/**
    * adds option method -> $().plugin('option', {...})
    * @param {Function} PluginClass - constructor class
    */
			function addOptionMethod(PluginClass) {
				// don't overwrite original option method
				if (PluginClass.prototype.option) {
					return;
				}

				// option setter
				PluginClass.prototype.option = function (opts) {
					// bail out if not an object
					if (!$.isPlainObject(opts)) {
						return;
					}
					this.options = $.extend(true, this.options, opts);
				};
			}

			// -------------------------- plugin bridge -------------------------- //

			// helper function for logging errors
			// $.error breaks jQuery chaining
			var logError = typeof console === 'undefined' ? noop : function (message) {
				console.error(message);
			};

			/**
    * jQuery plugin bridge, access methods like $elem.plugin('method')
    * @param {String} namespace - plugin name
    * @param {Function} PluginClass - constructor class
    */
			function bridge(namespace, PluginClass) {
				// add to jQuery fn namespace
				$.fn[namespace] = function (options) {
					if (typeof options === 'string') {
						// call plugin method when first argument is a string
						// get arguments for method
						var args = slice.call(arguments, 1);

						for (var i = 0, len = this.length; i < len; i++) {
							var elem = this[i];
							var instance = $.data(elem, namespace);
							if (!instance) {
								logError("cannot call methods on " + namespace + " prior to initialization; " + "attempted to call '" + options + "'");
								continue;
							}
							if (!$.isFunction(instance[options]) || options.charAt(0) === '_') {
								logError("no such method '" + options + "' for " + namespace + " instance");
								continue;
							}

							// trigger method with arguments
							var returnValue = instance[options].apply(instance, args);

							// break look and return first value if provided
							if (returnValue !== undefined && returnValue !== instance) {
								return returnValue;
							}
						}
						// return this if no return value
						return this;
					} else {
						var objects = this.map(function () {
							var instance = $.data(this, namespace);
							if (instance) {
								// apply options & init
								instance.option(options);
								instance._init();
							} else {
								// initialize new instance
								instance = new PluginClass(this, options);
								$.data(this, namespace, instance);
							}
							return $(this);
						});

						if (objects.length === 1) {
							return objects[0];
						}
						return objects;
					}
				};
			}

			// -------------------------- bridget -------------------------- //

			/**
    * converts a Prototypical class into a proper jQuery plugin
    *   the class must have a ._init method
    * @param {String} namespace - plugin name, used in $().pluginName
    * @param {Function} PluginClass - constructor class
    */
			$.bridget = function (namespace, PluginClass) {
				addOptionMethod(PluginClass);
				bridge(namespace, PluginClass);
			};

			return $.bridget;
		}

		// get jquery from browser global
		defineBridget($);
	})($);

	/*************************************************
 			BOOTSTRAP-SLIDER SOURCE CODE
 	**************************************************/

	(function ($) {
		var autoRegisterNamespace = void 0;

		var ErrorMsgs = {
			formatInvalidInputErrorMsg: function formatInvalidInputErrorMsg(input) {
				return "Invalid input value '" + input + "' passed in";
			},
			callingContextNotSliderInstance: "Calling context element does not have instance of Slider bound to it. Check your code to make sure the JQuery object returned from the call to the slider() initializer is calling the method"
		};

		var SliderScale = {
			linear: {
				getValue: function getValue(value, options) {
					if (value < options.min) {
						return options.min;
					} else if (value > options.max) {
						return options.max;
					} else {
						return value;
					}
				},
				toValue: function toValue(percentage) {
					var rawValue = percentage / 100 * (this.options.max - this.options.min);
					var shouldAdjustWithBase = true;
					if (this.options.ticks_positions.length > 0) {
						var minv,
						    maxv,
						    minp,
						    maxp = 0;
						for (var i = 1; i < this.options.ticks_positions.length; i++) {
							if (percentage <= this.options.ticks_positions[i]) {
								minv = this.options.ticks[i - 1];
								minp = this.options.ticks_positions[i - 1];
								maxv = this.options.ticks[i];
								maxp = this.options.ticks_positions[i];

								break;
							}
						}
						var partialPercentage = (percentage - minp) / (maxp - minp);
						rawValue = minv + partialPercentage * (maxv - minv);
						shouldAdjustWithBase = false;
					}

					var adjustment = shouldAdjustWithBase ? this.options.min : 0;
					var value = adjustment + Math.round(rawValue / this.options.step) * this.options.step;
					return SliderScale.linear.getValue(value, this.options);
				},
				toPercentage: function toPercentage(value) {
					if (this.options.max === this.options.min) {
						return 0;
					}

					if (this.options.ticks_positions.length > 0) {
						var minv,
						    maxv,
						    minp,
						    maxp = 0;
						for (var i = 0; i < this.options.ticks.length; i++) {
							if (value <= this.options.ticks[i]) {
								minv = i > 0 ? this.options.ticks[i - 1] : 0;
								minp = i > 0 ? this.options.ticks_positions[i - 1] : 0;
								maxv = this.options.ticks[i];
								maxp = this.options.ticks_positions[i];

								break;
							}
						}
						if (i > 0) {
							var partialPercentage = (value - minv) / (maxv - minv);
							return minp + partialPercentage * (maxp - minp);
						}
					}

					return 100 * (value - this.options.min) / (this.options.max - this.options.min);
				}
			},

			logarithmic: {
				/* Based on http://stackoverflow.com/questions/846221/logarithmic-slider */
				toValue: function toValue(percentage) {
					var offset = 1 - this.options.min;
					var min = Math.log(this.options.min + offset);
					var max = Math.log(this.options.max + offset);
					var value = Math.exp(min + (max - min) * percentage / 100) - offset;
					if (Math.round(value) === max) {
						return max;
					}
					value = this.options.min + Math.round((value - this.options.min) / this.options.step) * this.options.step;
					/* Rounding to the nearest step could exceed the min or
      * max, so clip to those values. */
					return SliderScale.linear.getValue(value, this.options);
				},
				toPercentage: function toPercentage(value) {
					if (this.options.max === this.options.min) {
						return 0;
					} else {
						var offset = 1 - this.options.min;
						var max = Math.log(this.options.max + offset);
						var min = Math.log(this.options.min + offset);
						var v = Math.log(value + offset);
						return 100 * (v - min) / (max - min);
					}
				}
			}
		};

		/*************************************************
  						CONSTRUCTOR
  	**************************************************/
		Slider = function Slider(element, options) {
			createNewSlider.call(this, element, options);
			return this;
		};

		function createNewSlider(element, options) {

			/*
   	The internal state object is used to store data about the current 'state' of slider.
   	This includes values such as the `value`, `enabled`, etc...
   */
			this._state = {
				value: null,
				enabled: null,
				offset: null,
				size: null,
				percentage: null,
				inDrag: false,
				over: false,
				tickIndex: null
			};

			// The objects used to store the reference to the tick methods if ticks_tooltip is on
			this.ticksCallbackMap = {};
			this.handleCallbackMap = {};

			if (typeof element === "string") {
				this.element = document.querySelector(element);
			} else if (element instanceof HTMLElement) {
				this.element = element;
			}

			/*************************************************
   					Process Options
   	**************************************************/
			options = options ? options : {};
			var optionTypes = Object.keys(this.defaultOptions);

			var isMinSet = options.hasOwnProperty('min');
			var isMaxSet = options.hasOwnProperty('max');

			for (var i = 0; i < optionTypes.length; i++) {
				var optName = optionTypes[i];

				// First check if an option was passed in via the constructor
				var val = options[optName];
				// If no data attrib, then check data atrributes
				val = typeof val !== 'undefined' ? val : getDataAttrib(this.element, optName);
				// Finally, if nothing was specified, use the defaults
				val = val !== null ? val : this.defaultOptions[optName];

				// Set all options on the instance of the Slider
				if (!this.options) {
					this.options = {};
				}
				this.options[optName] = val;
			}

			this.ticksAreValid = Array.isArray(this.options.ticks) && this.options.ticks.length > 0;

			// Lock to ticks only when ticks[] is defined and set
			if (!this.ticksAreValid) {
				this.options.lock_to_ticks = false;
			}

			// Check options.rtl
			if (this.options.rtl === 'auto') {
				var computedStyle = window.getComputedStyle(this.element);
				if (computedStyle != null) {
					this.options.rtl = computedStyle.direction === 'rtl';
				} else {
					// Fix for Firefox bug in versions less than 62:
					// https://bugzilla.mozilla.org/show_bug.cgi?id=548397
					// https://bugzilla.mozilla.org/show_bug.cgi?id=1467722
					this.options.rtl = this.element.style.direction === 'rtl';
				}
			}

			/*
   	Validate `tooltip_position` against 'orientation`
   	- if `tooltip_position` is incompatible with orientation, switch it to a default compatible with specified `orientation`
   		-- default for "vertical" -> "right", "left" if rtl
   		-- default for "horizontal" -> "top"
   */
			if (this.options.orientation === "vertical" && (this.options.tooltip_position === "top" || this.options.tooltip_position === "bottom")) {
				if (this.options.rtl) {
					this.options.tooltip_position = "left";
				} else {
					this.options.tooltip_position = "right";
				}
			} else if (this.options.orientation === "horizontal" && (this.options.tooltip_position === "left" || this.options.tooltip_position === "right")) {

				this.options.tooltip_position = "top";
			}

			function getDataAttrib(element, optName) {
				var dataName = "data-slider-" + optName.replace(/_/g, '-');
				var dataValString = element.getAttribute(dataName);

				try {
					return JSON.parse(dataValString);
				} catch (err) {
					return dataValString;
				}
			}

			/*************************************************
   					Create Markup
   	**************************************************/

			var origWidth = this.element.style.width;
			var updateSlider = false;
			var parent = this.element.parentNode;
			var sliderTrackSelection;
			var sliderTrackLow, sliderTrackHigh;
			var sliderMinHandle;
			var sliderMaxHandle;

			if (this.sliderElem) {
				updateSlider = true;
			} else {
				/* Create elements needed for slider */
				this.sliderElem = document.createElement("div");
				this.sliderElem.className = "slider";

				/* Create slider track elements */
				var sliderTrack = document.createElement("div");
				sliderTrack.className = "slider-track";

				sliderTrackLow = document.createElement("div");
				sliderTrackLow.className = "slider-track-low";

				sliderTrackSelection = document.createElement("div");
				sliderTrackSelection.className = "slider-selection";

				sliderTrackHigh = document.createElement("div");
				sliderTrackHigh.className = "slider-track-high";

				sliderMinHandle = document.createElement("div");
				sliderMinHandle.className = "slider-handle min-slider-handle";
				sliderMinHandle.setAttribute('role', 'slider');
				sliderMinHandle.setAttribute('aria-valuemin', this.options.min);
				sliderMinHandle.setAttribute('aria-valuemax', this.options.max);

				sliderMaxHandle = document.createElement("div");
				sliderMaxHandle.className = "slider-handle max-slider-handle";
				sliderMaxHandle.setAttribute('role', 'slider');
				sliderMaxHandle.setAttribute('aria-valuemin', this.options.min);
				sliderMaxHandle.setAttribute('aria-valuemax', this.options.max);

				sliderTrack.appendChild(sliderTrackLow);
				sliderTrack.appendChild(sliderTrackSelection);
				sliderTrack.appendChild(sliderTrackHigh);

				/* Create highlight range elements */
				this.rangeHighlightElements = [];
				var rangeHighlightsOpts = this.options.rangeHighlights;
				if (Array.isArray(rangeHighlightsOpts) && rangeHighlightsOpts.length > 0) {
					for (var j = 0; j < rangeHighlightsOpts.length; j++) {
						var rangeHighlightElement = document.createElement("div");
						var customClassString = rangeHighlightsOpts[j].class || "";
						rangeHighlightElement.className = "slider-rangeHighlight slider-selection " + customClassString;
						this.rangeHighlightElements.push(rangeHighlightElement);
						sliderTrack.appendChild(rangeHighlightElement);
					}
				}

				/* Add aria-labelledby to handle's */
				var isLabelledbyArray = Array.isArray(this.options.labelledby);
				if (isLabelledbyArray && this.options.labelledby[0]) {
					sliderMinHandle.setAttribute('aria-labelledby', this.options.labelledby[0]);
				}
				if (isLabelledbyArray && this.options.labelledby[1]) {
					sliderMaxHandle.setAttribute('aria-labelledby', this.options.labelledby[1]);
				}
				if (!isLabelledbyArray && this.options.labelledby) {
					sliderMinHandle.setAttribute('aria-labelledby', this.options.labelledby);
					sliderMaxHandle.setAttribute('aria-labelledby', this.options.labelledby);
				}

				/* Create ticks */
				this.ticks = [];
				if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {
					this.ticksContainer = document.createElement('div');
					this.ticksContainer.className = 'slider-tick-container';

					for (i = 0; i < this.options.ticks.length; i++) {
						var tick = document.createElement('div');
						tick.className = 'slider-tick';
						if (this.options.ticks_tooltip) {
							var tickListenerReference = this._addTickListener();
							var enterCallback = tickListenerReference.addMouseEnter(this, tick, i);
							var leaveCallback = tickListenerReference.addMouseLeave(this, tick);

							this.ticksCallbackMap[i] = {
								mouseEnter: enterCallback,
								mouseLeave: leaveCallback
							};
						}
						this.ticks.push(tick);
						this.ticksContainer.appendChild(tick);
					}

					sliderTrackSelection.className += " tick-slider-selection";
				}

				this.tickLabels = [];
				if (Array.isArray(this.options.ticks_labels) && this.options.ticks_labels.length > 0) {
					this.tickLabelContainer = document.createElement('div');
					this.tickLabelContainer.className = 'slider-tick-label-container';

					for (i = 0; i < this.options.ticks_labels.length; i++) {
						var label = document.createElement('div');
						var noTickPositionsSpecified = this.options.ticks_positions.length === 0;
						var tickLabelsIndex = this.options.reversed && noTickPositionsSpecified ? this.options.ticks_labels.length - (i + 1) : i;
						label.className = 'slider-tick-label';
						label.innerHTML = this.options.ticks_labels[tickLabelsIndex];

						this.tickLabels.push(label);
						this.tickLabelContainer.appendChild(label);
					}
				}

				var createAndAppendTooltipSubElements = function createAndAppendTooltipSubElements(tooltipElem) {
					var arrow = document.createElement("div");
					arrow.className = "arrow";

					var inner = document.createElement("div");
					inner.className = "tooltip-inner";

					tooltipElem.appendChild(arrow);
					tooltipElem.appendChild(inner);
				};

				/* Create tooltip elements */
				var sliderTooltip = document.createElement("div");
				sliderTooltip.className = "tooltip tooltip-main";
				sliderTooltip.setAttribute('role', 'presentation');
				createAndAppendTooltipSubElements(sliderTooltip);

				var sliderTooltipMin = document.createElement("div");
				sliderTooltipMin.className = "tooltip tooltip-min";
				sliderTooltipMin.setAttribute('role', 'presentation');
				createAndAppendTooltipSubElements(sliderTooltipMin);

				var sliderTooltipMax = document.createElement("div");
				sliderTooltipMax.className = "tooltip tooltip-max";
				sliderTooltipMax.setAttribute('role', 'presentation');
				createAndAppendTooltipSubElements(sliderTooltipMax);

				/* Append components to sliderElem */
				this.sliderElem.appendChild(sliderTrack);
				this.sliderElem.appendChild(sliderTooltip);
				this.sliderElem.appendChild(sliderTooltipMin);
				this.sliderElem.appendChild(sliderTooltipMax);

				if (this.tickLabelContainer) {
					this.sliderElem.appendChild(this.tickLabelContainer);
				}
				if (this.ticksContainer) {
					this.sliderElem.appendChild(this.ticksContainer);
				}

				this.sliderElem.appendChild(sliderMinHandle);
				this.sliderElem.appendChild(sliderMaxHandle);

				/* Append slider element to parent container, right before the original <input> element */
				parent.insertBefore(this.sliderElem, this.element);

				/* Hide original <input> element */
				this.element.style.display = "none";
			}
			/* If JQuery exists, cache JQ references */
			if ($) {
				this.$element = $(this.element);
				this.$sliderElem = $(this.sliderElem);
			}

			/*************************************************
   						Setup
   	**************************************************/
			this.eventToCallbackMap = {};
			this.sliderElem.id = this.options.id;

			this.touchCapable = 'ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch;

			this.touchX = 0;
			this.touchY = 0;

			this.tooltip = this.sliderElem.querySelector('.tooltip-main');
			this.tooltipInner = this.tooltip.querySelector('.tooltip-inner');

			this.tooltip_min = this.sliderElem.querySelector('.tooltip-min');
			this.tooltipInner_min = this.tooltip_min.querySelector('.tooltip-inner');

			this.tooltip_max = this.sliderElem.querySelector('.tooltip-max');
			this.tooltipInner_max = this.tooltip_max.querySelector('.tooltip-inner');

			if (SliderScale[this.options.scale]) {
				this.options.scale = SliderScale[this.options.scale];
			}

			if (updateSlider === true) {
				// Reset classes
				this._removeClass(this.sliderElem, 'slider-horizontal');
				this._removeClass(this.sliderElem, 'slider-vertical');
				this._removeClass(this.sliderElem, 'slider-rtl');
				this._removeClass(this.tooltip, 'hide');
				this._removeClass(this.tooltip_min, 'hide');
				this._removeClass(this.tooltip_max, 'hide');

				// Undo existing inline styles for track
				["left", "right", "top", "width", "height"].forEach(function (prop) {
					this._removeProperty(this.trackLow, prop);
					this._removeProperty(this.trackSelection, prop);
					this._removeProperty(this.trackHigh, prop);
				}, this);

				// Undo inline styles on handles
				[this.handle1, this.handle2].forEach(function (handle) {
					this._removeProperty(handle, 'left');
					this._removeProperty(handle, 'right');
					this._removeProperty(handle, 'top');
				}, this);

				// Undo inline styles and classes on tooltips
				[this.tooltip, this.tooltip_min, this.tooltip_max].forEach(function (tooltip) {
					this._removeProperty(tooltip, 'bs-tooltip-left');
					this._removeProperty(tooltip, 'bs-tooltip-right');
					this._removeProperty(tooltip, 'bs-tooltip-top');

					this._removeClass(tooltip, 'bs-tooltip-right');
					this._removeClass(tooltip, 'bs-tooltip-left');
					this._removeClass(tooltip, 'bs-tooltip-top');
				}, this);
			}

			if (this.options.orientation === 'vertical') {
				this._addClass(this.sliderElem, 'slider-vertical');
				this.stylePos = 'top';
				this.mousePos = 'pageY';
				this.sizePos = 'offsetHeight';
			} else {
				this._addClass(this.sliderElem, 'slider-horizontal');
				this.sliderElem.style.width = origWidth;
				this.options.orientation = 'horizontal';
				if (this.options.rtl) {
					this.stylePos = 'right';
				} else {
					this.stylePos = 'left';
				}
				this.mousePos = 'clientX';
				this.sizePos = 'offsetWidth';
			}
			// specific rtl class
			if (this.options.rtl) {
				this._addClass(this.sliderElem, 'slider-rtl');
			}
			this._setTooltipPosition();
			/* In case ticks are specified, overwrite the min and max bounds */
			if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {
				if (!isMaxSet) {
					this.options.max = Math.max.apply(Math, this.options.ticks);
				}
				if (!isMinSet) {
					this.options.min = Math.min.apply(Math, this.options.ticks);
				}
			}

			if (Array.isArray(this.options.value)) {
				this.options.range = true;
				this._state.value = this.options.value;
			} else if (this.options.range) {
				// User wants a range, but value is not an array
				this._state.value = [this.options.value, this.options.max];
			} else {
				this._state.value = this.options.value;
			}

			this.trackLow = sliderTrackLow || this.trackLow;
			this.trackSelection = sliderTrackSelection || this.trackSelection;
			this.trackHigh = sliderTrackHigh || this.trackHigh;

			if (this.options.selection === 'none') {
				this._addClass(this.trackLow, 'hide');
				this._addClass(this.trackSelection, 'hide');
				this._addClass(this.trackHigh, 'hide');
			} else if (this.options.selection === 'after' || this.options.selection === 'before') {
				this._removeClass(this.trackLow, 'hide');
				this._removeClass(this.trackSelection, 'hide');
				this._removeClass(this.trackHigh, 'hide');
			}

			this.handle1 = sliderMinHandle || this.handle1;
			this.handle2 = sliderMaxHandle || this.handle2;

			if (updateSlider === true) {
				// Reset classes
				this._removeClass(this.handle1, 'round triangle');
				this._removeClass(this.handle2, 'round triangle hide');

				for (i = 0; i < this.ticks.length; i++) {
					this._removeClass(this.ticks[i], 'round triangle hide');
				}
			}

			var availableHandleModifiers = ['round', 'triangle', 'custom'];
			var isValidHandleType = availableHandleModifiers.indexOf(this.options.handle) !== -1;
			if (isValidHandleType) {
				this._addClass(this.handle1, this.options.handle);
				this._addClass(this.handle2, this.options.handle);

				for (i = 0; i < this.ticks.length; i++) {
					this._addClass(this.ticks[i], this.options.handle);
				}
			}

			this._state.offset = this._offset(this.sliderElem);
			this._state.size = this.sliderElem[this.sizePos];
			this.setValue(this._state.value);

			/******************************************
   				Bind Event Listeners
   	******************************************/

			// Bind keyboard handlers
			this.handle1Keydown = this._keydown.bind(this, 0);
			this.handle1.addEventListener("keydown", this.handle1Keydown, false);

			this.handle2Keydown = this._keydown.bind(this, 1);
			this.handle2.addEventListener("keydown", this.handle2Keydown, false);

			this.mousedown = this._mousedown.bind(this);
			this.touchstart = this._touchstart.bind(this);
			this.touchmove = this._touchmove.bind(this);

			if (this.touchCapable) {
				this.sliderElem.addEventListener("touchstart", this.touchstart, false);
				this.sliderElem.addEventListener("touchmove", this.touchmove, false);
			}

			this.sliderElem.addEventListener("mousedown", this.mousedown, false);

			// Bind window handlers
			this.resize = this._resize.bind(this);
			window.addEventListener("resize", this.resize, false);

			// Bind tooltip-related handlers
			if (this.options.tooltip === 'hide') {
				this._addClass(this.tooltip, 'hide');
				this._addClass(this.tooltip_min, 'hide');
				this._addClass(this.tooltip_max, 'hide');
			} else if (this.options.tooltip === 'always') {
				this._showTooltip();
				this._alwaysShowTooltip = true;
			} else {
				this.showTooltip = this._showTooltip.bind(this);
				this.hideTooltip = this._hideTooltip.bind(this);

				if (this.options.ticks_tooltip) {
					var callbackHandle = this._addTickListener();
					//create handle1 listeners and store references in map
					var mouseEnter = callbackHandle.addMouseEnter(this, this.handle1);
					var mouseLeave = callbackHandle.addMouseLeave(this, this.handle1);
					this.handleCallbackMap.handle1 = {
						mouseEnter: mouseEnter,
						mouseLeave: mouseLeave
					};
					//create handle2 listeners and store references in map
					mouseEnter = callbackHandle.addMouseEnter(this, this.handle2);
					mouseLeave = callbackHandle.addMouseLeave(this, this.handle2);
					this.handleCallbackMap.handle2 = {
						mouseEnter: mouseEnter,
						mouseLeave: mouseLeave
					};
				} else {
					this.sliderElem.addEventListener("mouseenter", this.showTooltip, false);
					this.sliderElem.addEventListener("mouseleave", this.hideTooltip, false);

					if (this.touchCapable) {
						this.sliderElem.addEventListener("touchstart", this.showTooltip, false);
						this.sliderElem.addEventListener("touchmove", this.showTooltip, false);
						this.sliderElem.addEventListener("touchend", this.hideTooltip, false);
					}
				}

				this.handle1.addEventListener("focus", this.showTooltip, false);
				this.handle1.addEventListener("blur", this.hideTooltip, false);

				this.handle2.addEventListener("focus", this.showTooltip, false);
				this.handle2.addEventListener("blur", this.hideTooltip, false);

				if (this.touchCapable) {
					this.handle1.addEventListener("touchstart", this.showTooltip, false);
					this.handle1.addEventListener("touchmove", this.showTooltip, false);
					this.handle1.addEventListener("touchend", this.hideTooltip, false);

					this.handle2.addEventListener("touchstart", this.showTooltip, false);
					this.handle2.addEventListener("touchmove", this.showTooltip, false);
					this.handle2.addEventListener("touchend", this.hideTooltip, false);
				}
			}

			if (this.options.enabled) {
				this.enable();
			} else {
				this.disable();
			}
		}

		/*************************************************
  				INSTANCE PROPERTIES/METHODS
  	- Any methods bound to the prototype are considered
  part of the plugin's `public` interface
  	**************************************************/
		Slider.prototype = {
			_init: function _init() {}, // NOTE: Must exist to support bridget

			constructor: Slider,

			defaultOptions: {
				id: "",
				min: 0,
				max: 10,
				step: 1,
				precision: 0,
				orientation: 'horizontal',
				value: 5,
				range: false,
				selection: 'before',
				tooltip: 'show',
				tooltip_split: false,
				lock_to_ticks: false,
				handle: 'round',
				reversed: false,
				rtl: 'auto',
				enabled: true,
				formatter: function formatter(val) {
					if (Array.isArray(val)) {
						return val[0] + " : " + val[1];
					} else {
						return val;
					}
				},
				natural_arrow_keys: false,
				ticks: [],
				ticks_positions: [],
				ticks_labels: [],
				ticks_snap_bounds: 0,
				ticks_tooltip: false,
				scale: 'linear',
				focus: false,
				tooltip_position: null,
				labelledby: null,
				rangeHighlights: []
			},

			getElement: function getElement() {
				return this.sliderElem;
			},

			getValue: function getValue() {
				if (this.options.range) {
					return this._state.value;
				} else {
					return this._state.value[0];
				}
			},

			setValue: function setValue(val, triggerSlideEvent, triggerChangeEvent) {
				if (!val) {
					val = 0;
				}
				var oldValue = this.getValue();
				this._state.value = this._validateInputValue(val);
				var applyPrecision = this._applyPrecision.bind(this);

				if (this.options.range) {
					this._state.value[0] = applyPrecision(this._state.value[0]);
					this._state.value[1] = applyPrecision(this._state.value[1]);

					if (this.ticksAreValid && this.options.lock_to_ticks) {
						this._state.value[0] = this.options.ticks[this._getClosestTickIndex(this._state.value[0])];
						this._state.value[1] = this.options.ticks[this._getClosestTickIndex(this._state.value[1])];
					}

					this._state.value[0] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[0]));
					this._state.value[1] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[1]));
				} else {
					this._state.value = applyPrecision(this._state.value);

					if (this.ticksAreValid && this.options.lock_to_ticks) {
						this._state.value = this.options.ticks[this._getClosestTickIndex(this._state.value)];
					}

					this._state.value = [Math.max(this.options.min, Math.min(this.options.max, this._state.value))];
					this._addClass(this.handle2, 'hide');
					if (this.options.selection === 'after') {
						this._state.value[1] = this.options.max;
					} else {
						this._state.value[1] = this.options.min;
					}
				}

				// Determine which ticks the handle(s) are set at (if applicable)
				this._setTickIndex();

				if (this.options.max > this.options.min) {
					this._state.percentage = [this._toPercentage(this._state.value[0]), this._toPercentage(this._state.value[1]), this.options.step * 100 / (this.options.max - this.options.min)];
				} else {
					this._state.percentage = [0, 0, 100];
				}

				this._layout();
				var newValue = this.options.range ? this._state.value : this._state.value[0];

				this._setDataVal(newValue);
				if (triggerSlideEvent === true) {
					this._trigger('slide', newValue);
				}

				var hasChanged = false;
				if (Array.isArray(newValue)) {
					hasChanged = oldValue[0] !== newValue[0] || oldValue[1] !== newValue[1];
				} else {
					hasChanged = oldValue !== newValue;
				}

				if (hasChanged && triggerChangeEvent === true) {
					this._trigger('change', {
						oldValue: oldValue,
						newValue: newValue
					});
				}

				return this;
			},

			destroy: function destroy() {
				// Remove event handlers on slider elements
				this._removeSliderEventHandlers();

				// Remove the slider from the DOM
				this.sliderElem.parentNode.removeChild(this.sliderElem);
				/* Show original <input> element */
				this.element.style.display = "";

				// Clear out custom event bindings
				this._cleanUpEventCallbacksMap();

				// Remove data values
				this.element.removeAttribute("data");

				// Remove JQuery handlers/data
				if ($) {
					this._unbindJQueryEventHandlers();
					if (autoRegisterNamespace === NAMESPACE_MAIN) {
						this.$element.removeData(autoRegisterNamespace);
					}
					this.$element.removeData(NAMESPACE_ALTERNATE);
				}
			},

			disable: function disable() {
				this._state.enabled = false;
				this.handle1.removeAttribute("tabindex");
				this.handle2.removeAttribute("tabindex");
				this._addClass(this.sliderElem, 'slider-disabled');
				this._trigger('slideDisabled');

				return this;
			},

			enable: function enable() {
				this._state.enabled = true;
				this.handle1.setAttribute("tabindex", 0);
				this.handle2.setAttribute("tabindex", 0);
				this._removeClass(this.sliderElem, 'slider-disabled');
				this._trigger('slideEnabled');

				return this;
			},

			toggle: function toggle() {
				if (this._state.enabled) {
					this.disable();
				} else {
					this.enable();
				}
				return this;
			},

			isEnabled: function isEnabled() {
				return this._state.enabled;
			},

			on: function on(evt, callback) {
				this._bindNonQueryEventHandler(evt, callback);
				return this;
			},

			off: function off(evt, callback) {
				if ($) {
					this.$element.off(evt, callback);
					this.$sliderElem.off(evt, callback);
				} else {
					this._unbindNonQueryEventHandler(evt, callback);
				}
			},

			getAttribute: function getAttribute(attribute) {
				if (attribute) {
					return this.options[attribute];
				} else {
					return this.options;
				}
			},

			setAttribute: function setAttribute(attribute, value) {
				this.options[attribute] = value;
				return this;
			},

			refresh: function refresh(options) {
				var currentValue = this.getValue();
				this._removeSliderEventHandlers();
				createNewSlider.call(this, this.element, this.options);
				// Don't reset slider's value on refresh if `useCurrentValue` is true
				if (options && options.useCurrentValue === true) {
					this.setValue(currentValue);
				}
				if ($) {
					// Bind new instance of slider to the element
					if (autoRegisterNamespace === NAMESPACE_MAIN) {
						$.data(this.element, NAMESPACE_MAIN, this);
						$.data(this.element, NAMESPACE_ALTERNATE, this);
					} else {
						$.data(this.element, NAMESPACE_ALTERNATE, this);
					}
				}
				return this;
			},

			relayout: function relayout() {
				this._resize();
				return this;
			},

			/******************************+
   				HELPERS
   	- Any method that is not part of the public interface.
   - Place it underneath this comment block and write its signature like so:
   		_fnName : function() {...}
   	********************************/
			_removeTooltipListener: function _removeTooltipListener(event, handler) {
				this.handle1.removeEventListener(event, handler, false);
				this.handle2.removeEventListener(event, handler, false);
			},
			_removeSliderEventHandlers: function _removeSliderEventHandlers() {
				// Remove keydown event listeners
				this.handle1.removeEventListener("keydown", this.handle1Keydown, false);
				this.handle2.removeEventListener("keydown", this.handle2Keydown, false);

				//remove the listeners from the ticks and handles if they had their own listeners
				if (this.options.ticks_tooltip) {
					var ticks = this.ticksContainer.getElementsByClassName('slider-tick');
					for (var i = 0; i < ticks.length; i++) {
						ticks[i].removeEventListener('mouseenter', this.ticksCallbackMap[i].mouseEnter, false);
						ticks[i].removeEventListener('mouseleave', this.ticksCallbackMap[i].mouseLeave, false);
					}
					if (this.handleCallbackMap.handle1 && this.handleCallbackMap.handle2) {
						this.handle1.removeEventListener('mouseenter', this.handleCallbackMap.handle1.mouseEnter, false);
						this.handle2.removeEventListener('mouseenter', this.handleCallbackMap.handle2.mouseEnter, false);
						this.handle1.removeEventListener('mouseleave', this.handleCallbackMap.handle1.mouseLeave, false);
						this.handle2.removeEventListener('mouseleave', this.handleCallbackMap.handle2.mouseLeave, false);
					}
				}

				this.handleCallbackMap = null;
				this.ticksCallbackMap = null;

				if (this.showTooltip) {
					this._removeTooltipListener("focus", this.showTooltip);
				}
				if (this.hideTooltip) {
					this._removeTooltipListener("blur", this.hideTooltip);
				}

				// Remove event listeners from sliderElem
				if (this.showTooltip) {
					this.sliderElem.removeEventListener("mouseenter", this.showTooltip, false);
				}
				if (this.hideTooltip) {
					this.sliderElem.removeEventListener("mouseleave", this.hideTooltip, false);
				}

				this.sliderElem.removeEventListener("mousedown", this.mousedown, false);

				if (this.touchCapable) {
					// Remove touch event listeners from handles
					if (this.showTooltip) {
						this.handle1.removeEventListener("touchstart", this.showTooltip, false);
						this.handle1.removeEventListener("touchmove", this.showTooltip, false);
						this.handle2.removeEventListener("touchstart", this.showTooltip, false);
						this.handle2.removeEventListener("touchmove", this.showTooltip, false);
					}
					if (this.hideTooltip) {
						this.handle1.removeEventListener("touchend", this.hideTooltip, false);
						this.handle2.removeEventListener("touchend", this.hideTooltip, false);
					}

					// Remove event listeners from sliderElem
					if (this.showTooltip) {
						this.sliderElem.removeEventListener("touchstart", this.showTooltip, false);
						this.sliderElem.removeEventListener("touchmove", this.showTooltip, false);
					}
					if (this.hideTooltip) {
						this.sliderElem.removeEventListener("touchend", this.hideTooltip, false);
					}

					this.sliderElem.removeEventListener("touchstart", this.touchstart, false);
					this.sliderElem.removeEventListener("touchmove", this.touchmove, false);
				}

				// Remove window event listener
				window.removeEventListener("resize", this.resize, false);
			},
			_bindNonQueryEventHandler: function _bindNonQueryEventHandler(evt, callback) {
				if (this.eventToCallbackMap[evt] === undefined) {
					this.eventToCallbackMap[evt] = [];
				}
				this.eventToCallbackMap[evt].push(callback);
			},
			_unbindNonQueryEventHandler: function _unbindNonQueryEventHandler(evt, callback) {
				var callbacks = this.eventToCallbackMap[evt];
				if (callbacks !== undefined) {
					for (var i = 0; i < callbacks.length; i++) {
						if (callbacks[i] === callback) {
							callbacks.splice(i, 1);
							break;
						}
					}
				}
			},
			_cleanUpEventCallbacksMap: function _cleanUpEventCallbacksMap() {
				var eventNames = Object.keys(this.eventToCallbackMap);
				for (var i = 0; i < eventNames.length; i++) {
					var eventName = eventNames[i];
					delete this.eventToCallbackMap[eventName];
				}
			},
			_showTooltip: function _showTooltip() {
				if (this.options.tooltip_split === false) {
					this._addClass(this.tooltip, 'show');
					this.tooltip_min.style.display = 'none';
					this.tooltip_max.style.display = 'none';
				} else {
					this._addClass(this.tooltip_min, 'show');
					this._addClass(this.tooltip_max, 'show');
					this.tooltip.style.display = 'none';
				}
				this._state.over = true;
			},
			_hideTooltip: function _hideTooltip() {
				if (this._state.inDrag === false && this._alwaysShowTooltip !== true) {
					this._removeClass(this.tooltip, 'show');
					this._removeClass(this.tooltip_min, 'show');
					this._removeClass(this.tooltip_max, 'show');
				}
				this._state.over = false;
			},
			_setToolTipOnMouseOver: function _setToolTipOnMouseOver(tempState) {
				var self = this;
				var formattedTooltipVal = this.options.formatter(!tempState ? this._state.value[0] : tempState.value[0]);
				var positionPercentages = !tempState ? getPositionPercentages(this._state, this.options.reversed) : getPositionPercentages(tempState, this.options.reversed);
				this._setText(this.tooltipInner, formattedTooltipVal);

				this.tooltip.style[this.stylePos] = positionPercentages[0] + "%";

				function getPositionPercentages(state, reversed) {
					if (reversed) {
						return [100 - state.percentage[0], self.options.range ? 100 - state.percentage[1] : state.percentage[1]];
					}
					return [state.percentage[0], state.percentage[1]];
				}
			},
			_copyState: function _copyState() {
				return {
					value: [this._state.value[0], this._state.value[1]],
					enabled: this._state.enabled,
					offset: this._state.offset,
					size: this._state.size,
					percentage: [this._state.percentage[0], this._state.percentage[1], this._state.percentage[2]],
					inDrag: this._state.inDrag,
					over: this._state.over,
					// deleted or null'd keys
					dragged: this._state.dragged,
					keyCtrl: this._state.keyCtrl
				};
			},
			_addTickListener: function _addTickListener() {
				return {
					addMouseEnter: function addMouseEnter(reference, element, index) {
						var enter = function enter() {
							var tempState = reference._copyState();
							// Which handle is being hovered over?
							var val = element === reference.handle1 ? tempState.value[0] : tempState.value[1];
							var per = void 0;

							// Setup value and percentage for tick's 'mouseenter'
							if (index !== undefined) {
								val = reference.options.ticks[index];
								per = reference.options.ticks_positions.length > 0 && reference.options.ticks_positions[index] || reference._toPercentage(reference.options.ticks[index]);
							} else {
								per = reference._toPercentage(val);
							}

							tempState.value[0] = val;
							tempState.percentage[0] = per;
							reference._setToolTipOnMouseOver(tempState);
							reference._showTooltip();
						};
						element.addEventListener("mouseenter", enter, false);
						return enter;
					},
					addMouseLeave: function addMouseLeave(reference, element) {
						var leave = function leave() {
							reference._hideTooltip();
						};
						element.addEventListener("mouseleave", leave, false);
						return leave;
					}
				};
			},
			_layout: function _layout() {
				var positionPercentages;
				var formattedValue;

				if (this.options.reversed) {
					positionPercentages = [100 - this._state.percentage[0], this.options.range ? 100 - this._state.percentage[1] : this._state.percentage[1]];
				} else {
					positionPercentages = [this._state.percentage[0], this._state.percentage[1]];
				}

				this.handle1.style[this.stylePos] = positionPercentages[0] + "%";
				this.handle1.setAttribute('aria-valuenow', this._state.value[0]);
				formattedValue = this.options.formatter(this._state.value[0]);
				if (isNaN(formattedValue)) {
					this.handle1.setAttribute('aria-valuetext', formattedValue);
				} else {
					this.handle1.removeAttribute('aria-valuetext');
				}

				this.handle2.style[this.stylePos] = positionPercentages[1] + "%";
				this.handle2.setAttribute('aria-valuenow', this._state.value[1]);
				formattedValue = this.options.formatter(this._state.value[1]);
				if (isNaN(formattedValue)) {
					this.handle2.setAttribute('aria-valuetext', formattedValue);
				} else {
					this.handle2.removeAttribute('aria-valuetext');
				}

				/* Position highlight range elements */
				if (this.rangeHighlightElements.length > 0 && Array.isArray(this.options.rangeHighlights) && this.options.rangeHighlights.length > 0) {
					for (var _i = 0; _i < this.options.rangeHighlights.length; _i++) {
						var startPercent = this._toPercentage(this.options.rangeHighlights[_i].start);
						var endPercent = this._toPercentage(this.options.rangeHighlights[_i].end);

						if (this.options.reversed) {
							var sp = 100 - endPercent;
							endPercent = 100 - startPercent;
							startPercent = sp;
						}

						var currentRange = this._createHighlightRange(startPercent, endPercent);

						if (currentRange) {
							if (this.options.orientation === 'vertical') {
								this.rangeHighlightElements[_i].style.top = currentRange.start + "%";
								this.rangeHighlightElements[_i].style.height = currentRange.size + "%";
							} else {
								if (this.options.rtl) {
									this.rangeHighlightElements[_i].style.right = currentRange.start + "%";
								} else {
									this.rangeHighlightElements[_i].style.left = currentRange.start + "%";
								}
								this.rangeHighlightElements[_i].style.width = currentRange.size + "%";
							}
						} else {
							this.rangeHighlightElements[_i].style.display = "none";
						}
					}
				}

				/* Position ticks and labels */
				if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {

					var styleSize = this.options.orientation === 'vertical' ? 'height' : 'width';
					var styleMargin;
					if (this.options.orientation === 'vertical') {
						styleMargin = 'marginTop';
					} else {
						if (this.options.rtl) {
							styleMargin = 'marginRight';
						} else {
							styleMargin = 'marginLeft';
						}
					}
					var labelSize = this._state.size / (this.options.ticks.length - 1);

					if (this.tickLabelContainer) {
						var extraMargin = 0;
						if (this.options.ticks_positions.length === 0) {
							if (this.options.orientation !== 'vertical') {
								this.tickLabelContainer.style[styleMargin] = -labelSize / 2 + "px";
							}

							extraMargin = this.tickLabelContainer.offsetHeight;
						} else {
							/* Chidren are position absolute, calculate height by finding the max offsetHeight of a child */
							for (i = 0; i < this.tickLabelContainer.childNodes.length; i++) {
								if (this.tickLabelContainer.childNodes[i].offsetHeight > extraMargin) {
									extraMargin = this.tickLabelContainer.childNodes[i].offsetHeight;
								}
							}
						}
						if (this.options.orientation === 'horizontal') {
							this.sliderElem.style.marginBottom = extraMargin + "px";
						}
					}
					for (var i = 0; i < this.options.ticks.length; i++) {

						var percentage = this.options.ticks_positions[i] || this._toPercentage(this.options.ticks[i]);

						if (this.options.reversed) {
							percentage = 100 - percentage;
						}

						this.ticks[i].style[this.stylePos] = percentage + "%";

						/* Set class labels to denote whether ticks are in the selection */
						this._removeClass(this.ticks[i], 'in-selection');
						if (!this.options.range) {
							if (this.options.selection === 'after' && percentage >= positionPercentages[0]) {
								this._addClass(this.ticks[i], 'in-selection');
							} else if (this.options.selection === 'before' && percentage <= positionPercentages[0]) {
								this._addClass(this.ticks[i], 'in-selection');
							}
						} else if (percentage >= positionPercentages[0] && percentage <= positionPercentages[1]) {
							this._addClass(this.ticks[i], 'in-selection');
						}

						if (this.tickLabels[i]) {
							this.tickLabels[i].style[styleSize] = labelSize + "px";

							if (this.options.orientation !== 'vertical' && this.options.ticks_positions[i] !== undefined) {
								this.tickLabels[i].style.position = 'absolute';
								this.tickLabels[i].style[this.stylePos] = percentage + "%";
								this.tickLabels[i].style[styleMargin] = -labelSize / 2 + 'px';
							} else if (this.options.orientation === 'vertical') {
								if (this.options.rtl) {
									this.tickLabels[i].style['marginRight'] = this.sliderElem.offsetWidth + "px";
								} else {
									this.tickLabels[i].style['marginLeft'] = this.sliderElem.offsetWidth + "px";
								}
								this.tickLabelContainer.style[styleMargin] = this.sliderElem.offsetWidth / 2 * -1 + 'px';
							}

							/* Set class labels to indicate tick labels are in the selection or selected */
							this._removeClass(this.tickLabels[i], 'label-in-selection label-is-selection');
							if (!this.options.range) {
								if (this.options.selection === 'after' && percentage >= positionPercentages[0]) {
									this._addClass(this.tickLabels[i], 'label-in-selection');
								} else if (this.options.selection === 'before' && percentage <= positionPercentages[0]) {
									this._addClass(this.tickLabels[i], 'label-in-selection');
								}
								if (percentage === positionPercentages[0]) {
									this._addClass(this.tickLabels[i], 'label-is-selection');
								}
							} else if (percentage >= positionPercentages[0] && percentage <= positionPercentages[1]) {
								this._addClass(this.tickLabels[i], 'label-in-selection');
								if (percentage === positionPercentages[0] || positionPercentages[1]) {
									this._addClass(this.tickLabels[i], 'label-is-selection');
								}
							}
						}
					}
				}

				var formattedTooltipVal;

				if (this.options.range) {
					formattedTooltipVal = this.options.formatter(this._state.value);
					this._setText(this.tooltipInner, formattedTooltipVal);
					this.tooltip.style[this.stylePos] = (positionPercentages[1] + positionPercentages[0]) / 2 + "%";

					var innerTooltipMinText = this.options.formatter(this._state.value[0]);
					this._setText(this.tooltipInner_min, innerTooltipMinText);

					var innerTooltipMaxText = this.options.formatter(this._state.value[1]);
					this._setText(this.tooltipInner_max, innerTooltipMaxText);

					this.tooltip_min.style[this.stylePos] = positionPercentages[0] + "%";

					this.tooltip_max.style[this.stylePos] = positionPercentages[1] + "%";
				} else {
					formattedTooltipVal = this.options.formatter(this._state.value[0]);
					this._setText(this.tooltipInner, formattedTooltipVal);

					this.tooltip.style[this.stylePos] = positionPercentages[0] + "%";
				}

				if (this.options.orientation === 'vertical') {
					this.trackLow.style.top = '0';
					this.trackLow.style.height = Math.min(positionPercentages[0], positionPercentages[1]) + '%';

					this.trackSelection.style.top = Math.min(positionPercentages[0], positionPercentages[1]) + '%';
					this.trackSelection.style.height = Math.abs(positionPercentages[0] - positionPercentages[1]) + '%';

					this.trackHigh.style.bottom = '0';
					this.trackHigh.style.height = 100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1]) + '%';
				} else {
					if (this.stylePos === 'right') {
						this.trackLow.style.right = '0';
					} else {
						this.trackLow.style.left = '0';
					}
					this.trackLow.style.width = Math.min(positionPercentages[0], positionPercentages[1]) + '%';

					if (this.stylePos === 'right') {
						this.trackSelection.style.right = Math.min(positionPercentages[0], positionPercentages[1]) + '%';
					} else {
						this.trackSelection.style.left = Math.min(positionPercentages[0], positionPercentages[1]) + '%';
					}
					this.trackSelection.style.width = Math.abs(positionPercentages[0] - positionPercentages[1]) + '%';

					if (this.stylePos === 'right') {
						this.trackHigh.style.left = '0';
					} else {
						this.trackHigh.style.right = '0';
					}
					this.trackHigh.style.width = 100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1]) + '%';

					var offset_min = this.tooltip_min.getBoundingClientRect();
					var offset_max = this.tooltip_max.getBoundingClientRect();

					if (this.options.tooltip_position === 'bottom') {
						if (offset_min.right > offset_max.left) {
							this._removeClass(this.tooltip_max, 'bs-tooltip-bottom');
							this._addClass(this.tooltip_max, 'bs-tooltip-top');
							this.tooltip_max.style.top = '';
							this.tooltip_max.style.bottom = 22 + 'px';
						} else {
							this._removeClass(this.tooltip_max, 'bs-tooltip-top');
							this._addClass(this.tooltip_max, 'bs-tooltip-bottom');
							this.tooltip_max.style.top = this.tooltip_min.style.top;
							this.tooltip_max.style.bottom = '';
						}
					} else {
						if (offset_min.right > offset_max.left) {
							this._removeClass(this.tooltip_max, 'bs-tooltip-top');
							this._addClass(this.tooltip_max, 'bs-tooltip-bottom');
							this.tooltip_max.style.top = 18 + 'px';
						} else {
							this._removeClass(this.tooltip_max, 'bs-tooltip-bottom');
							this._addClass(this.tooltip_max, 'bs-tooltip-top');
							this.tooltip_max.style.top = this.tooltip_min.style.top;
						}
					}
				}
			},
			_createHighlightRange: function _createHighlightRange(start, end) {
				if (this._isHighlightRange(start, end)) {
					if (start > end) {
						return { 'start': end, 'size': start - end };
					}
					return { 'start': start, 'size': end - start };
				}
				return null;
			},
			_isHighlightRange: function _isHighlightRange(start, end) {
				if (0 <= start && start <= 100 && 0 <= end && end <= 100) {
					return true;
				} else {
					return false;
				}
			},
			_resize: function _resize(ev) {
				/*jshint unused:false*/
				this._state.offset = this._offset(this.sliderElem);
				this._state.size = this.sliderElem[this.sizePos];
				this._layout();
			},
			_removeProperty: function _removeProperty(element, prop) {
				if (element.style.removeProperty) {
					element.style.removeProperty(prop);
				} else {
					element.style.removeAttribute(prop);
				}
			},
			_mousedown: function _mousedown(ev) {
				if (!this._state.enabled) {
					return false;
				}

				if (ev.preventDefault) {
					ev.preventDefault();
				}

				this._state.offset = this._offset(this.sliderElem);
				this._state.size = this.sliderElem[this.sizePos];

				var percentage = this._getPercentage(ev);

				if (this.options.range) {
					var diff1 = Math.abs(this._state.percentage[0] - percentage);
					var diff2 = Math.abs(this._state.percentage[1] - percentage);
					this._state.dragged = diff1 < diff2 ? 0 : 1;
					this._adjustPercentageForRangeSliders(percentage);
				} else {
					this._state.dragged = 0;
				}

				this._state.percentage[this._state.dragged] = percentage;

				if (this.touchCapable) {
					document.removeEventListener("touchmove", this.mousemove, false);
					document.removeEventListener("touchend", this.mouseup, false);
				}

				if (this.mousemove) {
					document.removeEventListener("mousemove", this.mousemove, false);
				}
				if (this.mouseup) {
					document.removeEventListener("mouseup", this.mouseup, false);
				}

				this.mousemove = this._mousemove.bind(this);
				this.mouseup = this._mouseup.bind(this);

				if (this.touchCapable) {
					// Touch: Bind touch events:
					document.addEventListener("touchmove", this.mousemove, false);
					document.addEventListener("touchend", this.mouseup, false);
				}
				// Bind mouse events:
				document.addEventListener("mousemove", this.mousemove, false);
				document.addEventListener("mouseup", this.mouseup, false);

				this._state.inDrag = true;
				var newValue = this._calculateValue();

				this._trigger('slideStart', newValue);

				this.setValue(newValue, false, true);

				ev.returnValue = false;

				if (this.options.focus) {
					this._triggerFocusOnHandle(this._state.dragged);
				}

				return true;
			},
			_touchstart: function _touchstart(ev) {
				this._mousedown(ev);
			},
			_triggerFocusOnHandle: function _triggerFocusOnHandle(handleIdx) {
				if (handleIdx === 0) {
					this.handle1.focus();
				}
				if (handleIdx === 1) {
					this.handle2.focus();
				}
			},
			_keydown: function _keydown(handleIdx, ev) {
				if (!this._state.enabled) {
					return false;
				}

				var dir;
				switch (ev.keyCode) {
					case 37: // left
					case 40:
						// down
						dir = -1;
						break;
					case 39: // right
					case 38:
						// up
						dir = 1;
						break;
				}
				if (!dir) {
					return;
				}

				// use natural arrow keys instead of from min to max
				if (this.options.natural_arrow_keys) {
					var isHorizontal = this.options.orientation === 'horizontal';
					var isVertical = this.options.orientation === 'vertical';
					var isRTL = this.options.rtl;
					var isReversed = this.options.reversed;

					if (isHorizontal) {
						if (isRTL) {
							if (!isReversed) {
								dir = -dir;
							}
						} else {
							if (isReversed) {
								dir = -dir;
							}
						}
					} else if (isVertical) {
						if (!isReversed) {
							dir = -dir;
						}
					}
				}

				var val;
				if (this.ticksAreValid && this.options.lock_to_ticks) {
					var index = void 0;
					// Find tick index that handle 1/2 is currently on
					index = this.options.ticks.indexOf(this._state.value[handleIdx]);
					if (index === -1) {
						// Set default to first tick
						index = 0;
						window.console.warn('(lock_to_ticks) _keydown: index should not be -1');
					}
					index += dir;
					index = Math.max(0, Math.min(this.options.ticks.length - 1, index));
					val = this.options.ticks[index];
				} else {
					val = this._state.value[handleIdx] + dir * this.options.step;
				}
				var percentage = this._toPercentage(val);
				this._state.keyCtrl = handleIdx;
				if (this.options.range) {
					this._adjustPercentageForRangeSliders(percentage);
					var val1 = !this._state.keyCtrl ? val : this._state.value[0];
					var val2 = this._state.keyCtrl ? val : this._state.value[1];
					// Restrict values within limits
					val = [Math.max(this.options.min, Math.min(this.options.max, val1)), Math.max(this.options.min, Math.min(this.options.max, val2))];
				} else {
					val = Math.max(this.options.min, Math.min(this.options.max, val));
				}

				this._trigger('slideStart', val);

				this.setValue(val, true, true);

				this._trigger('slideStop', val);

				this._pauseEvent(ev);
				delete this._state.keyCtrl;

				return false;
			},
			_pauseEvent: function _pauseEvent(ev) {
				if (ev.stopPropagation) {
					ev.stopPropagation();
				}
				if (ev.preventDefault) {
					ev.preventDefault();
				}
				ev.cancelBubble = true;
				ev.returnValue = false;
			},
			_mousemove: function _mousemove(ev) {
				if (!this._state.enabled) {
					return false;
				}

				var percentage = this._getPercentage(ev);
				this._adjustPercentageForRangeSliders(percentage);
				this._state.percentage[this._state.dragged] = percentage;

				var val = this._calculateValue(true);
				this.setValue(val, true, true);

				return false;
			},
			_touchmove: function _touchmove(ev) {
				if (ev.changedTouches === undefined) {
					return;
				}

				// Prevent page from scrolling and only drag the slider
				if (ev.preventDefault) {
					ev.preventDefault();
				}
			},
			_adjustPercentageForRangeSliders: function _adjustPercentageForRangeSliders(percentage) {
				if (this.options.range) {
					var precision = this._getNumDigitsAfterDecimalPlace(percentage);
					precision = precision ? precision - 1 : 0;
					var percentageWithAdjustedPrecision = this._applyToFixedAndParseFloat(percentage, precision);
					if (this._state.dragged === 0 && this._applyToFixedAndParseFloat(this._state.percentage[1], precision) < percentageWithAdjustedPrecision) {
						this._state.percentage[0] = this._state.percentage[1];
						this._state.dragged = 1;
					} else if (this._state.dragged === 1 && this._applyToFixedAndParseFloat(this._state.percentage[0], precision) > percentageWithAdjustedPrecision) {
						this._state.percentage[1] = this._state.percentage[0];
						this._state.dragged = 0;
					} else if (this._state.keyCtrl === 0 && this._toPercentage(this._state.value[1]) < percentage) {
						this._state.percentage[0] = this._state.percentage[1];
						this._state.keyCtrl = 1;
						this.handle2.focus();
					} else if (this._state.keyCtrl === 1 && this._toPercentage(this._state.value[0]) > percentage) {
						this._state.percentage[1] = this._state.percentage[0];
						this._state.keyCtrl = 0;
						this.handle1.focus();
					}
				}
			},
			_mouseup: function _mouseup(ev) {
				if (!this._state.enabled) {
					return false;
				}

				var percentage = this._getPercentage(ev);
				this._adjustPercentageForRangeSliders(percentage);
				this._state.percentage[this._state.dragged] = percentage;

				if (this.touchCapable) {
					// Touch: Unbind touch event handlers:
					document.removeEventListener("touchmove", this.mousemove, false);
					document.removeEventListener("touchend", this.mouseup, false);
				}
				// Unbind mouse event handlers:
				document.removeEventListener("mousemove", this.mousemove, false);
				document.removeEventListener("mouseup", this.mouseup, false);

				this._state.inDrag = false;
				if (this._state.over === false) {
					this._hideTooltip();
				}
				var val = this._calculateValue(true);

				this.setValue(val, false, true);
				this._trigger('slideStop', val);

				// No longer need 'dragged' after mouse up
				this._state.dragged = null;

				return false;
			},
			_setValues: function _setValues(index, val) {
				var comp = 0 === index ? 0 : 100;
				if (this._state.percentage[index] !== comp) {
					val.data[index] = this._toValue(this._state.percentage[index]);
					val.data[index] = this._applyPrecision(val.data[index]);
				}
			},
			_calculateValue: function _calculateValue(snapToClosestTick) {
				var val = {};
				if (this.options.range) {
					val.data = [this.options.min, this.options.max];
					this._setValues(0, val);
					this._setValues(1, val);
					if (snapToClosestTick) {
						val.data[0] = this._snapToClosestTick(val.data[0]);
						val.data[1] = this._snapToClosestTick(val.data[1]);
					}
				} else {
					val.data = this._toValue(this._state.percentage[0]);
					val.data = parseFloat(val.data);
					val.data = this._applyPrecision(val.data);
					if (snapToClosestTick) {
						val.data = this._snapToClosestTick(val.data);
					}
				}

				return val.data;
			},
			_snapToClosestTick: function _snapToClosestTick(val) {
				var min = [val, Infinity];
				for (var i = 0; i < this.options.ticks.length; i++) {
					var diff = Math.abs(this.options.ticks[i] - val);
					if (diff <= min[1]) {
						min = [this.options.ticks[i], diff];
					}
				}
				if (min[1] <= this.options.ticks_snap_bounds) {
					return min[0];
				}
				return val;
			},

			_applyPrecision: function _applyPrecision(val) {
				var precision = this.options.precision || this._getNumDigitsAfterDecimalPlace(this.options.step);
				return this._applyToFixedAndParseFloat(val, precision);
			},
			_getNumDigitsAfterDecimalPlace: function _getNumDigitsAfterDecimalPlace(num) {
				var match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
				if (!match) {
					return 0;
				}
				return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0));
			},
			_applyToFixedAndParseFloat: function _applyToFixedAndParseFloat(num, toFixedInput) {
				var truncatedNum = num.toFixed(toFixedInput);
				return parseFloat(truncatedNum);
			},
			/*
   	Credits to Mike Samuel for the following method!
   	Source: http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number
   */
			_getPercentage: function _getPercentage(ev) {
				if (this.touchCapable && (ev.type === 'touchstart' || ev.type === 'touchmove' || ev.type === 'touchend')) {
					ev = ev.changedTouches[0];
				}

				var eventPosition = ev[this.mousePos];
				var sliderOffset = this._state.offset[this.stylePos];
				var distanceToSlide = eventPosition - sliderOffset;
				if (this.stylePos === 'right') {
					distanceToSlide = -distanceToSlide;
				}
				// Calculate what percent of the length the slider handle has slid
				var percentage = distanceToSlide / this._state.size * 100;
				percentage = Math.round(percentage / this._state.percentage[2]) * this._state.percentage[2];
				if (this.options.reversed) {
					percentage = 100 - percentage;
				}

				// Make sure the percent is within the bounds of the slider.
				// 0% corresponds to the 'min' value of the slide
				// 100% corresponds to the 'max' value of the slide
				return Math.max(0, Math.min(100, percentage));
			},
			_validateInputValue: function _validateInputValue(val) {
				if (!isNaN(+val)) {
					return +val;
				} else if (Array.isArray(val)) {
					this._validateArray(val);
					return val;
				} else {
					throw new Error(ErrorMsgs.formatInvalidInputErrorMsg(val));
				}
			},
			_validateArray: function _validateArray(val) {
				for (var i = 0; i < val.length; i++) {
					var input = val[i];
					if (typeof input !== 'number') {
						throw new Error(ErrorMsgs.formatInvalidInputErrorMsg(input));
					}
				}
			},
			_setDataVal: function _setDataVal(val) {
				this.element.setAttribute('data-value', val);
				this.element.setAttribute('value', val);
				this.element.value = val;
			},
			_trigger: function _trigger(evt, val) {
				val = val || val === 0 ? val : undefined;

				var callbackFnArray = this.eventToCallbackMap[evt];
				if (callbackFnArray && callbackFnArray.length) {
					for (var i = 0; i < callbackFnArray.length; i++) {
						var callbackFn = callbackFnArray[i];
						callbackFn(val);
					}
				}

				/* If JQuery exists, trigger JQuery events */
				if ($) {
					this._triggerJQueryEvent(evt, val);
				}
			},
			_triggerJQueryEvent: function _triggerJQueryEvent(evt, val) {
				var eventData = {
					type: evt,
					value: val
				};
				this.$element.trigger(eventData);
				this.$sliderElem.trigger(eventData);
			},
			_unbindJQueryEventHandlers: function _unbindJQueryEventHandlers() {
				this.$element.off();
				this.$sliderElem.off();
			},
			_setText: function _setText(element, text) {
				if (typeof element.textContent !== "undefined") {
					element.textContent = text;
				} else if (typeof element.innerText !== "undefined") {
					element.innerText = text;
				}
			},
			_removeClass: function _removeClass(element, classString) {
				var classes = classString.split(" ");
				var newClasses = element.className;

				for (var i = 0; i < classes.length; i++) {
					var classTag = classes[i];
					var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)");
					newClasses = newClasses.replace(regex, " ");
				}

				element.className = newClasses.trim();
			},
			_addClass: function _addClass(element, classString) {
				var classes = classString.split(" ");
				var newClasses = element.className;

				for (var i = 0; i < classes.length; i++) {
					var classTag = classes[i];
					var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)");
					var ifClassExists = regex.test(newClasses);

					if (!ifClassExists) {
						newClasses += " " + classTag;
					}
				}

				element.className = newClasses.trim();
			},
			_offsetLeft: function _offsetLeft(obj) {
				return obj.getBoundingClientRect().left;
			},
			_offsetRight: function _offsetRight(obj) {
				return obj.getBoundingClientRect().right;
			},
			_offsetTop: function _offsetTop(obj) {
				var offsetTop = obj.offsetTop;
				while ((obj = obj.offsetParent) && !isNaN(obj.offsetTop)) {
					offsetTop += obj.offsetTop;
					if (obj.tagName !== 'BODY') {
						offsetTop -= obj.scrollTop;
					}
				}
				return offsetTop;
			},
			_offset: function _offset(obj) {
				return {
					left: this._offsetLeft(obj),
					right: this._offsetRight(obj),
					top: this._offsetTop(obj)
				};
			},
			_css: function _css(elementRef, styleName, value) {
				if ($) {
					$.style(elementRef, styleName, value);
				} else {
					var style = styleName.replace(/^-ms-/, "ms-").replace(/-([\da-z])/gi, function (all, letter) {
						return letter.toUpperCase();
					});
					elementRef.style[style] = value;
				}
			},
			_toValue: function _toValue(percentage) {
				return this.options.scale.toValue.apply(this, [percentage]);
			},
			_toPercentage: function _toPercentage(value) {
				return this.options.scale.toPercentage.apply(this, [value]);
			},
			_setTooltipPosition: function _setTooltipPosition() {
				var tooltips = [this.tooltip, this.tooltip_min, this.tooltip_max];
				if (this.options.orientation === 'vertical') {
					var tooltipPos;
					if (this.options.tooltip_position) {
						tooltipPos = this.options.tooltip_position;
					} else {
						if (this.options.rtl) {
							tooltipPos = 'left';
						} else {
							tooltipPos = 'right';
						}
					}
					var oppositeSide = tooltipPos === 'left' ? 'right' : 'left';
					tooltips.forEach(function (tooltip) {
						this._addClass(tooltip, 'bs-tooltip-' + tooltipPos);
						tooltip.style[oppositeSide] = '100%';
					}.bind(this));
				} else if (this.options.tooltip_position === 'bottom') {
					tooltips.forEach(function (tooltip) {
						this._addClass(tooltip, 'bs-tooltip-bottom');
						tooltip.style.top = 22 + 'px';
					}.bind(this));
				} else {
					tooltips.forEach(function (tooltip) {
						this._addClass(tooltip, 'bs-tooltip-top');
						tooltip.style.top = -this.tooltip.outerHeight - 14 + 'px';
					}.bind(this));
				}
			},
			_getClosestTickIndex: function _getClosestTickIndex(val) {
				var difference = Math.abs(val - this.options.ticks[0]);
				var index = 0;
				for (var i = 0; i < this.options.ticks.length; ++i) {
					var d = Math.abs(val - this.options.ticks[i]);
					if (d < difference) {
						difference = d;
						index = i;
					}
				}
				return index;
			},
			/**
    * Attempts to find the index in `ticks[]` the slider values are set at.
    * The indexes can be -1 to indicate the slider value is not set at a value in `ticks[]`.
    */
			_setTickIndex: function _setTickIndex() {
				if (this.ticksAreValid) {
					this._state.tickIndex = [this.options.ticks.indexOf(this._state.value[0]), this.options.ticks.indexOf(this._state.value[1])];
				}
			}
		};

		/*********************************
  		Attach to global namespace
  	*********************************/
		if ($ && $.fn) {
			if (!$.fn.slider) {
				$.bridget(NAMESPACE_MAIN, Slider);
				autoRegisterNamespace = NAMESPACE_MAIN;
			} else {
				if (windowIsDefined) {
					window.console.warn("bootstrap-slider.js - WARNING: $.fn.slider namespace is already bound. Use the $.fn.bootstrapSlider namespace instead.");
				}
				autoRegisterNamespace = NAMESPACE_ALTERNATE;
			}
			$.bridget(NAMESPACE_ALTERNATE, Slider);

			// Auto-Register data-provide="slider" Elements
			$(function () {
				$("input[data-provide=slider]")[autoRegisterNamespace]();
			});
		}
	})($);

	return Slider;
});


/***/ }),

/***/ "./node_modules/bootstrap-slider/dist/css/bootstrap-slider.min.css":
/*!*************************************************************************!*\
  !*** ./node_modules/bootstrap-slider/dist/css/bootstrap-slider.min.css ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/bootstrap/dist/js/bootstrap.js":
/*!*****************************************************!*\
  !*** ./node_modules/bootstrap/dist/js/bootstrap.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/*!
  * Bootstrap v4.5.3 (https://getbootstrap.com/)
  * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
(function (global, factory) {
   true ? factory(exports, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! popper.js */ "./node_modules/popper.js/dist/esm/popper.js")) :
  undefined;
}(this, (function (exports, $, Popper) { 'use strict';

  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

  var $__default = /*#__PURE__*/_interopDefaultLegacy($);
  var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);

  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);
    }
  }

  function _createClass(Constructor, protoProps, staticProps) {
    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
    if (staticProps) _defineProperties(Constructor, staticProps);
    return Constructor;
  }

  function _extends() {
    _extends = Object.assign || function (target) {
      for (var i = 1; i < arguments.length; i++) {
        var source = arguments[i];

        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }

      return target;
    };

    return _extends.apply(this, arguments);
  }

  function _inheritsLoose(subClass, superClass) {
    subClass.prototype = Object.create(superClass.prototype);
    subClass.prototype.constructor = subClass;
    subClass.__proto__ = superClass;
  }

  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.5.3): util.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
   * --------------------------------------------------------------------------
   */
  /**
   * ------------------------------------------------------------------------
   * Private TransitionEnd Helpers
   * ------------------------------------------------------------------------
   */

  var TRANSITION_END = 'transitionend';
  var MAX_UID = 1000000;
  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)

  function toType(obj) {
    if (obj === null || typeof obj === 'undefined') {
      return "" + obj;
    }

    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
  }

  function getSpecialTransitionEndEvent() {
    return {
      bindType: TRANSITION_END,
      delegateType: TRANSITION_END,
      handle: function handle(event) {
        if ($__default['default'](event.target).is(this)) {
          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
        }

        return undefined;
      }
    };
  }

  function transitionEndEmulator(duration) {
    var _this = this;

    var called = false;
    $__default['default'](this).one(Util.TRANSITION_END, function () {
      called = true;
    });
    setTimeout(function () {
      if (!called) {
        Util.triggerTransitionEnd(_this);
      }
    }, duration);
    return this;
  }

  function setTransitionEndSupport() {
    $__default['default'].fn.emulateTransitionEnd = transitionEndEmulator;
    $__default['default'].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
  }
  /**
   * --------------------------------------------------------------------------
   * Public Util Api
   * --------------------------------------------------------------------------
   */


  var Util = {
    TRANSITION_END: 'bsTransitionEnd',
    getUID: function getUID(prefix) {
      do {
        prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
      } while (document.getElementById(prefix));

      return prefix;
    },
    getSelectorFromElement: function getSelectorFromElement(element) {
      var selector = element.getAttribute('data-target');

      if (!selector || selector === '#') {
        var hrefAttr = element.getAttribute('href');
        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
      }

      try {
        return document.querySelector(selector) ? selector : null;
      } catch (_) {
        return null;
      }
    },
    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
      if (!element) {
        return 0;
      } // Get transition-duration of the element


      var transitionDuration = $__default['default'](element).css('transition-duration');
      var transitionDelay = $__default['default'](element).css('transition-delay');
      var floatTransitionDuration = parseFloat(transitionDuration);
      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found

      if (!floatTransitionDuration && !floatTransitionDelay) {
        return 0;
      } // If multiple durations are defined, take the first


      transitionDuration = transitionDuration.split(',')[0];
      transitionDelay = transitionDelay.split(',')[0];
      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
    },
    reflow: function reflow(element) {
      return element.offsetHeight;
    },
    triggerTransitionEnd: function triggerTransitionEnd(element) {
      $__default['default'](element).trigger(TRANSITION_END);
    },
    supportsTransitionEnd: function supportsTransitionEnd() {
      return Boolean(TRANSITION_END);
    },
    isElement: function isElement(obj) {
      return (obj[0] || obj).nodeType;
    },
    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
      for (var property in configTypes) {
        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
          var expectedTypes = configTypes[property];
          var value = config[property];
          var valueType = value && Util.isElement(value) ? 'element' : toType(value);

          if (!new RegExp(expectedTypes).test(valueType)) {
            throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
          }
        }
      }
    },
    findShadowRoot: function findShadowRoot(element) {
      if (!document.documentElement.attachShadow) {
        return null;
      } // Can find the shadow root otherwise it'll return the document


      if (typeof element.getRootNode === 'function') {
        var root = element.getRootNode();
        return root instanceof ShadowRoot ? root : null;
      }

      if (element instanceof ShadowRoot) {
        return element;
      } // when we don't find a shadow root


      if (!element.parentNode) {
        return null;
      }

      return Util.findShadowRoot(element.parentNode);
    },
    jQueryDetection: function jQueryDetection() {
      if (typeof $__default['default'] === 'undefined') {
        throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
      }

      var version = $__default['default'].fn.jquery.split(' ')[0].split('.');
      var minMajor = 1;
      var ltMajor = 2;
      var minMinor = 9;
      var minPatch = 1;
      var maxMajor = 4;

      if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
        throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
      }
    }
  };
  Util.jQueryDetection();
  setTransitionEndSupport();

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'alert';
  var VERSION = '4.5.3';
  var DATA_KEY = 'bs.alert';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
  var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
  var SELECTOR_DISMISS = '[data-dismiss="alert"]';
  var EVENT_CLOSE = "close" + EVENT_KEY;
  var EVENT_CLOSED = "closed" + EVENT_KEY;
  var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
  var CLASS_NAME_ALERT = 'alert';
  var CLASS_NAME_FADE = 'fade';
  var CLASS_NAME_SHOW = 'show';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Alert = /*#__PURE__*/function () {
    function Alert(element) {
      this._element = element;
    } // Getters


    var _proto = Alert.prototype;

    // Public
    _proto.close = function close(element) {
      var rootElement = this._element;

      if (element) {
        rootElement = this._getRootElement(element);
      }

      var customEvent = this._triggerCloseEvent(rootElement);

      if (customEvent.isDefaultPrevented()) {
        return;
      }

      this._removeElement(rootElement);
    };

    _proto.dispose = function dispose() {
      $__default['default'].removeData(this._element, DATA_KEY);
      this._element = null;
    } // Private
    ;

    _proto._getRootElement = function _getRootElement(element) {
      var selector = Util.getSelectorFromElement(element);
      var parent = false;

      if (selector) {
        parent = document.querySelector(selector);
      }

      if (!parent) {
        parent = $__default['default'](element).closest("." + CLASS_NAME_ALERT)[0];
      }

      return parent;
    };

    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
      var closeEvent = $__default['default'].Event(EVENT_CLOSE);
      $__default['default'](element).trigger(closeEvent);
      return closeEvent;
    };

    _proto._removeElement = function _removeElement(element) {
      var _this = this;

      $__default['default'](element).removeClass(CLASS_NAME_SHOW);

      if (!$__default['default'](element).hasClass(CLASS_NAME_FADE)) {
        this._destroyElement(element);

        return;
      }

      var transitionDuration = Util.getTransitionDurationFromElement(element);
      $__default['default'](element).one(Util.TRANSITION_END, function (event) {
        return _this._destroyElement(element, event);
      }).emulateTransitionEnd(transitionDuration);
    };

    _proto._destroyElement = function _destroyElement(element) {
      $__default['default'](element).detach().trigger(EVENT_CLOSED).remove();
    } // Static
    ;

    Alert._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var $element = $__default['default'](this);
        var data = $element.data(DATA_KEY);

        if (!data) {
          data = new Alert(this);
          $element.data(DATA_KEY, data);
        }

        if (config === 'close') {
          data[config](this);
        }
      });
    };

    Alert._handleDismiss = function _handleDismiss(alertInstance) {
      return function (event) {
        if (event) {
          event.preventDefault();
        }

        alertInstance.close(this);
      };
    };

    _createClass(Alert, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION;
      }
    }]);

    return Alert;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert._handleDismiss(new Alert()));
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME] = Alert._jQueryInterface;
  $__default['default'].fn[NAME].Constructor = Alert;

  $__default['default'].fn[NAME].noConflict = function () {
    $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
    return Alert._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$1 = 'button';
  var VERSION$1 = '4.5.3';
  var DATA_KEY$1 = 'bs.button';
  var EVENT_KEY$1 = "." + DATA_KEY$1;
  var DATA_API_KEY$1 = '.data-api';
  var JQUERY_NO_CONFLICT$1 = $__default['default'].fn[NAME$1];
  var CLASS_NAME_ACTIVE = 'active';
  var CLASS_NAME_BUTTON = 'btn';
  var CLASS_NAME_FOCUS = 'focus';
  var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]';
  var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]';
  var SELECTOR_DATA_TOGGLE = '[data-toggle="button"]';
  var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn';
  var SELECTOR_INPUT = 'input:not([type="hidden"])';
  var SELECTOR_ACTIVE = '.active';
  var SELECTOR_BUTTON = '.btn';
  var EVENT_CLICK_DATA_API$1 = "click" + EVENT_KEY$1 + DATA_API_KEY$1;
  var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1);
  var EVENT_LOAD_DATA_API = "load" + EVENT_KEY$1 + DATA_API_KEY$1;
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Button = /*#__PURE__*/function () {
    function Button(element) {
      this._element = element;
      this.shouldAvoidTriggerChange = false;
    } // Getters


    var _proto = Button.prototype;

    // Public
    _proto.toggle = function toggle() {
      var triggerChangeEvent = true;
      var addAriaPressed = true;
      var rootElement = $__default['default'](this._element).closest(SELECTOR_DATA_TOGGLES)[0];

      if (rootElement) {
        var input = this._element.querySelector(SELECTOR_INPUT);

        if (input) {
          if (input.type === 'radio') {
            if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
              triggerChangeEvent = false;
            } else {
              var activeElement = rootElement.querySelector(SELECTOR_ACTIVE);

              if (activeElement) {
                $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE);
              }
            }
          }

          if (triggerChangeEvent) {
            // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
            if (input.type === 'checkbox' || input.type === 'radio') {
              input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE);
            }

            if (!this.shouldAvoidTriggerChange) {
              $__default['default'](input).trigger('change');
            }
          }

          input.focus();
          addAriaPressed = false;
        }
      }

      if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
        if (addAriaPressed) {
          this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE));
        }

        if (triggerChangeEvent) {
          $__default['default'](this._element).toggleClass(CLASS_NAME_ACTIVE);
        }
      }
    };

    _proto.dispose = function dispose() {
      $__default['default'].removeData(this._element, DATA_KEY$1);
      this._element = null;
    } // Static
    ;

    Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) {
      return this.each(function () {
        var $element = $__default['default'](this);
        var data = $element.data(DATA_KEY$1);

        if (!data) {
          data = new Button(this);
          $element.data(DATA_KEY$1, data);
        }

        data.shouldAvoidTriggerChange = avoidTriggerChange;

        if (config === 'toggle') {
          data[config]();
        }
      });
    };

    _createClass(Button, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$1;
      }
    }]);

    return Button;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
    var button = event.target;
    var initialButton = button;

    if (!$__default['default'](button).hasClass(CLASS_NAME_BUTTON)) {
      button = $__default['default'](button).closest(SELECTOR_BUTTON)[0];
    }

    if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
      event.preventDefault(); // work around Firefox bug #1540995
    } else {
      var inputBtn = button.querySelector(SELECTOR_INPUT);

      if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
        event.preventDefault(); // work around Firefox bug #1540995

        return;
      }

      if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {
        Button._jQueryInterface.call($__default['default'](button), 'toggle', initialButton.tagName === 'INPUT');
      }
    }
  }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
    var button = $__default['default'](event.target).closest(SELECTOR_BUTTON)[0];
    $__default['default'](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type));
  });
  $__default['default'](window).on(EVENT_LOAD_DATA_API, function () {
    // ensure correct active class is set to match the controls' actual values/states
    // find all checkboxes/readio buttons inside data-toggle groups
    var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS));

    for (var i = 0, len = buttons.length; i < len; i++) {
      var button = buttons[i];
      var input = button.querySelector(SELECTOR_INPUT);

      if (input.checked || input.hasAttribute('checked')) {
        button.classList.add(CLASS_NAME_ACTIVE);
      } else {
        button.classList.remove(CLASS_NAME_ACTIVE);
      }
    } // find all button toggles


    buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));

    for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
      var _button = buttons[_i];

      if (_button.getAttribute('aria-pressed') === 'true') {
        _button.classList.add(CLASS_NAME_ACTIVE);
      } else {
        _button.classList.remove(CLASS_NAME_ACTIVE);
      }
    }
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$1] = Button._jQueryInterface;
  $__default['default'].fn[NAME$1].Constructor = Button;

  $__default['default'].fn[NAME$1].noConflict = function () {
    $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1;
    return Button._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$2 = 'carousel';
  var VERSION$2 = '4.5.3';
  var DATA_KEY$2 = 'bs.carousel';
  var EVENT_KEY$2 = "." + DATA_KEY$2;
  var DATA_API_KEY$2 = '.data-api';
  var JQUERY_NO_CONFLICT$2 = $__default['default'].fn[NAME$2];
  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key

  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key

  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch

  var SWIPE_THRESHOLD = 40;
  var Default = {
    interval: 5000,
    keyboard: true,
    slide: false,
    pause: 'hover',
    wrap: true,
    touch: true
  };
  var DefaultType = {
    interval: '(number|boolean)',
    keyboard: 'boolean',
    slide: '(boolean|string)',
    pause: '(string|boolean)',
    wrap: 'boolean',
    touch: 'boolean'
  };
  var DIRECTION_NEXT = 'next';
  var DIRECTION_PREV = 'prev';
  var DIRECTION_LEFT = 'left';
  var DIRECTION_RIGHT = 'right';
  var EVENT_SLIDE = "slide" + EVENT_KEY$2;
  var EVENT_SLID = "slid" + EVENT_KEY$2;
  var EVENT_KEYDOWN = "keydown" + EVENT_KEY$2;
  var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY$2;
  var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY$2;
  var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY$2;
  var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY$2;
  var EVENT_TOUCHEND = "touchend" + EVENT_KEY$2;
  var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY$2;
  var EVENT_POINTERUP = "pointerup" + EVENT_KEY$2;
  var EVENT_DRAG_START = "dragstart" + EVENT_KEY$2;
  var EVENT_LOAD_DATA_API$1 = "load" + EVENT_KEY$2 + DATA_API_KEY$2;
  var EVENT_CLICK_DATA_API$2 = "click" + EVENT_KEY$2 + DATA_API_KEY$2;
  var CLASS_NAME_CAROUSEL = 'carousel';
  var CLASS_NAME_ACTIVE$1 = 'active';
  var CLASS_NAME_SLIDE = 'slide';
  var CLASS_NAME_RIGHT = 'carousel-item-right';
  var CLASS_NAME_LEFT = 'carousel-item-left';
  var CLASS_NAME_NEXT = 'carousel-item-next';
  var CLASS_NAME_PREV = 'carousel-item-prev';
  var CLASS_NAME_POINTER_EVENT = 'pointer-event';
  var SELECTOR_ACTIVE$1 = '.active';
  var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
  var SELECTOR_ITEM = '.carousel-item';
  var SELECTOR_ITEM_IMG = '.carousel-item img';
  var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
  var SELECTOR_INDICATORS = '.carousel-indicators';
  var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';
  var SELECTOR_DATA_RIDE = '[data-ride="carousel"]';
  var PointerType = {
    TOUCH: 'touch',
    PEN: 'pen'
  };
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Carousel = /*#__PURE__*/function () {
    function Carousel(element, config) {
      this._items = null;
      this._interval = null;
      this._activeElement = null;
      this._isPaused = false;
      this._isSliding = false;
      this.touchTimeout = null;
      this.touchStartX = 0;
      this.touchDeltaX = 0;
      this._config = this._getConfig(config);
      this._element = element;
      this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS);
      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);

      this._addEventListeners();
    } // Getters


    var _proto = Carousel.prototype;

    // Public
    _proto.next = function next() {
      if (!this._isSliding) {
        this._slide(DIRECTION_NEXT);
      }
    };

    _proto.nextWhenVisible = function nextWhenVisible() {
      var $element = $__default['default'](this._element); // Don't call next when the page isn't visible
      // or the carousel or its parent isn't visible

      if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') {
        this.next();
      }
    };

    _proto.prev = function prev() {
      if (!this._isSliding) {
        this._slide(DIRECTION_PREV);
      }
    };

    _proto.pause = function pause(event) {
      if (!event) {
        this._isPaused = true;
      }

      if (this._element.querySelector(SELECTOR_NEXT_PREV)) {
        Util.triggerTransitionEnd(this._element);
        this.cycle(true);
      }

      clearInterval(this._interval);
      this._interval = null;
    };

    _proto.cycle = function cycle(event) {
      if (!event) {
        this._isPaused = false;
      }

      if (this._interval) {
        clearInterval(this._interval);
        this._interval = null;
      }

      if (this._config.interval && !this._isPaused) {
        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
      }
    };

    _proto.to = function to(index) {
      var _this = this;

      this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);

      var activeIndex = this._getItemIndex(this._activeElement);

      if (index > this._items.length - 1 || index < 0) {
        return;
      }

      if (this._isSliding) {
        $__default['default'](this._element).one(EVENT_SLID, function () {
          return _this.to(index);
        });
        return;
      }

      if (activeIndex === index) {
        this.pause();
        this.cycle();
        return;
      }

      var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;

      this._slide(direction, this._items[index]);
    };

    _proto.dispose = function dispose() {
      $__default['default'](this._element).off(EVENT_KEY$2);
      $__default['default'].removeData(this._element, DATA_KEY$2);
      this._items = null;
      this._config = null;
      this._element = null;
      this._interval = null;
      this._isPaused = null;
      this._isSliding = null;
      this._activeElement = null;
      this._indicatorsElement = null;
    } // Private
    ;

    _proto._getConfig = function _getConfig(config) {
      config = _extends({}, Default, config);
      Util.typeCheckConfig(NAME$2, config, DefaultType);
      return config;
    };

    _proto._handleSwipe = function _handleSwipe() {
      var absDeltax = Math.abs(this.touchDeltaX);

      if (absDeltax <= SWIPE_THRESHOLD) {
        return;
      }

      var direction = absDeltax / this.touchDeltaX;
      this.touchDeltaX = 0; // swipe left

      if (direction > 0) {
        this.prev();
      } // swipe right


      if (direction < 0) {
        this.next();
      }
    };

    _proto._addEventListeners = function _addEventListeners() {
      var _this2 = this;

      if (this._config.keyboard) {
        $__default['default'](this._element).on(EVENT_KEYDOWN, function (event) {
          return _this2._keydown(event);
        });
      }

      if (this._config.pause === 'hover') {
        $__default['default'](this._element).on(EVENT_MOUSEENTER, function (event) {
          return _this2.pause(event);
        }).on(EVENT_MOUSELEAVE, function (event) {
          return _this2.cycle(event);
        });
      }

      if (this._config.touch) {
        this._addTouchEventListeners();
      }
    };

    _proto._addTouchEventListeners = function _addTouchEventListeners() {
      var _this3 = this;

      if (!this._touchSupported) {
        return;
      }

      var start = function start(event) {
        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
          _this3.touchStartX = event.originalEvent.clientX;
        } else if (!_this3._pointerEvent) {
          _this3.touchStartX = event.originalEvent.touches[0].clientX;
        }
      };

      var move = function move(event) {
        // ensure swiping with one touch and not pinching
        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
          _this3.touchDeltaX = 0;
        } else {
          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
        }
      };

      var end = function end(event) {
        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
        }

        _this3._handleSwipe();

        if (_this3._config.pause === 'hover') {
          // If it's a touch-enabled device, mouseenter/leave are fired as
          // part of the mouse compatibility events on first tap - the carousel
          // would stop cycling until user tapped out of it;
          // here, we listen for touchend, explicitly pause the carousel
          // (as if it's the second time we tap on it, mouseenter compat event
          // is NOT fired) and after a timeout (to allow for mouse compatibility
          // events to fire) we explicitly restart cycling
          _this3.pause();

          if (_this3.touchTimeout) {
            clearTimeout(_this3.touchTimeout);
          }

          _this3.touchTimeout = setTimeout(function (event) {
            return _this3.cycle(event);
          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
        }
      };

      $__default['default'](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) {
        return e.preventDefault();
      });

      if (this._pointerEvent) {
        $__default['default'](this._element).on(EVENT_POINTERDOWN, function (event) {
          return start(event);
        });
        $__default['default'](this._element).on(EVENT_POINTERUP, function (event) {
          return end(event);
        });

        this._element.classList.add(CLASS_NAME_POINTER_EVENT);
      } else {
        $__default['default'](this._element).on(EVENT_TOUCHSTART, function (event) {
          return start(event);
        });
        $__default['default'](this._element).on(EVENT_TOUCHMOVE, function (event) {
          return move(event);
        });
        $__default['default'](this._element).on(EVENT_TOUCHEND, function (event) {
          return end(event);
        });
      }
    };

    _proto._keydown = function _keydown(event) {
      if (/input|textarea/i.test(event.target.tagName)) {
        return;
      }

      switch (event.which) {
        case ARROW_LEFT_KEYCODE:
          event.preventDefault();
          this.prev();
          break;

        case ARROW_RIGHT_KEYCODE:
          event.preventDefault();
          this.next();
          break;
      }
    };

    _proto._getItemIndex = function _getItemIndex(element) {
      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : [];
      return this._items.indexOf(element);
    };

    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
      var isNextDirection = direction === DIRECTION_NEXT;
      var isPrevDirection = direction === DIRECTION_PREV;

      var activeIndex = this._getItemIndex(activeElement);

      var lastItemIndex = this._items.length - 1;
      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;

      if (isGoingToWrap && !this._config.wrap) {
        return activeElement;
      }

      var delta = direction === DIRECTION_PREV ? -1 : 1;
      var itemIndex = (activeIndex + delta) % this._items.length;
      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
    };

    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
      var targetIndex = this._getItemIndex(relatedTarget);

      var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM));

      var slideEvent = $__default['default'].Event(EVENT_SLIDE, {
        relatedTarget: relatedTarget,
        direction: eventDirectionName,
        from: fromIndex,
        to: targetIndex
      });
      $__default['default'](this._element).trigger(slideEvent);
      return slideEvent;
    };

    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
      if (this._indicatorsElement) {
        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1));
        $__default['default'](indicators).removeClass(CLASS_NAME_ACTIVE$1);

        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];

        if (nextIndicator) {
          $__default['default'](nextIndicator).addClass(CLASS_NAME_ACTIVE$1);
        }
      }
    };

    _proto._slide = function _slide(direction, element) {
      var _this4 = this;

      var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);

      var activeElementIndex = this._getItemIndex(activeElement);

      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);

      var nextElementIndex = this._getItemIndex(nextElement);

      var isCycling = Boolean(this._interval);
      var directionalClassName;
      var orderClassName;
      var eventDirectionName;

      if (direction === DIRECTION_NEXT) {
        directionalClassName = CLASS_NAME_LEFT;
        orderClassName = CLASS_NAME_NEXT;
        eventDirectionName = DIRECTION_LEFT;
      } else {
        directionalClassName = CLASS_NAME_RIGHT;
        orderClassName = CLASS_NAME_PREV;
        eventDirectionName = DIRECTION_RIGHT;
      }

      if (nextElement && $__default['default'](nextElement).hasClass(CLASS_NAME_ACTIVE$1)) {
        this._isSliding = false;
        return;
      }

      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);

      if (slideEvent.isDefaultPrevented()) {
        return;
      }

      if (!activeElement || !nextElement) {
        // Some weirdness is happening, so we bail
        return;
      }

      this._isSliding = true;

      if (isCycling) {
        this.pause();
      }

      this._setActiveIndicatorElement(nextElement);

      var slidEvent = $__default['default'].Event(EVENT_SLID, {
        relatedTarget: nextElement,
        direction: eventDirectionName,
        from: activeElementIndex,
        to: nextElementIndex
      });

      if ($__default['default'](this._element).hasClass(CLASS_NAME_SLIDE)) {
        $__default['default'](nextElement).addClass(orderClassName);
        Util.reflow(nextElement);
        $__default['default'](activeElement).addClass(directionalClassName);
        $__default['default'](nextElement).addClass(directionalClassName);
        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);

        if (nextElementInterval) {
          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
          this._config.interval = nextElementInterval;
        } else {
          this._config.interval = this._config.defaultInterval || this._config.interval;
        }

        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
        $__default['default'](activeElement).one(Util.TRANSITION_END, function () {
          $__default['default'](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE$1);
          $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1 + " " + orderClassName + " " + directionalClassName);
          _this4._isSliding = false;
          setTimeout(function () {
            return $__default['default'](_this4._element).trigger(slidEvent);
          }, 0);
        }).emulateTransitionEnd(transitionDuration);
      } else {
        $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1);
        $__default['default'](nextElement).addClass(CLASS_NAME_ACTIVE$1);
        this._isSliding = false;
        $__default['default'](this._element).trigger(slidEvent);
      }

      if (isCycling) {
        this.cycle();
      }
    } // Static
    ;

    Carousel._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $__default['default'](this).data(DATA_KEY$2);

        var _config = _extends({}, Default, $__default['default'](this).data());

        if (typeof config === 'object') {
          _config = _extends({}, _config, config);
        }

        var action = typeof config === 'string' ? config : _config.slide;

        if (!data) {
          data = new Carousel(this, _config);
          $__default['default'](this).data(DATA_KEY$2, data);
        }

        if (typeof config === 'number') {
          data.to(config);
        } else if (typeof action === 'string') {
          if (typeof data[action] === 'undefined') {
            throw new TypeError("No method named \"" + action + "\"");
          }

          data[action]();
        } else if (_config.interval && _config.ride) {
          data.pause();
          data.cycle();
        }
      });
    };

    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
      var selector = Util.getSelectorFromElement(this);

      if (!selector) {
        return;
      }

      var target = $__default['default'](selector)[0];

      if (!target || !$__default['default'](target).hasClass(CLASS_NAME_CAROUSEL)) {
        return;
      }

      var config = _extends({}, $__default['default'](target).data(), $__default['default'](this).data());

      var slideIndex = this.getAttribute('data-slide-to');

      if (slideIndex) {
        config.interval = false;
      }

      Carousel._jQueryInterface.call($__default['default'](target), config);

      if (slideIndex) {
        $__default['default'](target).data(DATA_KEY$2).to(slideIndex);
      }

      event.preventDefault();
    };

    _createClass(Carousel, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$2;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default;
      }
    }]);

    return Carousel;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler);
  $__default['default'](window).on(EVENT_LOAD_DATA_API$1, function () {
    var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE));

    for (var i = 0, len = carousels.length; i < len; i++) {
      var $carousel = $__default['default'](carousels[i]);

      Carousel._jQueryInterface.call($carousel, $carousel.data());
    }
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$2] = Carousel._jQueryInterface;
  $__default['default'].fn[NAME$2].Constructor = Carousel;

  $__default['default'].fn[NAME$2].noConflict = function () {
    $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2;
    return Carousel._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$3 = 'collapse';
  var VERSION$3 = '4.5.3';
  var DATA_KEY$3 = 'bs.collapse';
  var EVENT_KEY$3 = "." + DATA_KEY$3;
  var DATA_API_KEY$3 = '.data-api';
  var JQUERY_NO_CONFLICT$3 = $__default['default'].fn[NAME$3];
  var Default$1 = {
    toggle: true,
    parent: ''
  };
  var DefaultType$1 = {
    toggle: 'boolean',
    parent: '(string|element)'
  };
  var EVENT_SHOW = "show" + EVENT_KEY$3;
  var EVENT_SHOWN = "shown" + EVENT_KEY$3;
  var EVENT_HIDE = "hide" + EVENT_KEY$3;
  var EVENT_HIDDEN = "hidden" + EVENT_KEY$3;
  var EVENT_CLICK_DATA_API$3 = "click" + EVENT_KEY$3 + DATA_API_KEY$3;
  var CLASS_NAME_SHOW$1 = 'show';
  var CLASS_NAME_COLLAPSE = 'collapse';
  var CLASS_NAME_COLLAPSING = 'collapsing';
  var CLASS_NAME_COLLAPSED = 'collapsed';
  var DIMENSION_WIDTH = 'width';
  var DIMENSION_HEIGHT = 'height';
  var SELECTOR_ACTIVES = '.show, .collapsing';
  var SELECTOR_DATA_TOGGLE$1 = '[data-toggle="collapse"]';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Collapse = /*#__PURE__*/function () {
    function Collapse(element, config) {
      this._isTransitioning = false;
      this._element = element;
      this._config = this._getConfig(config);
      this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
      var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$1));

      for (var i = 0, len = toggleList.length; i < len; i++) {
        var elem = toggleList[i];
        var selector = Util.getSelectorFromElement(elem);
        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
          return foundElem === element;
        });

        if (selector !== null && filterElement.length > 0) {
          this._selector = selector;

          this._triggerArray.push(elem);
        }
      }

      this._parent = this._config.parent ? this._getParent() : null;

      if (!this._config.parent) {
        this._addAriaAndCollapsedClass(this._element, this._triggerArray);
      }

      if (this._config.toggle) {
        this.toggle();
      }
    } // Getters


    var _proto = Collapse.prototype;

    // Public
    _proto.toggle = function toggle() {
      if ($__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) {
        this.hide();
      } else {
        this.show();
      }
    };

    _proto.show = function show() {
      var _this = this;

      if (this._isTransitioning || $__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) {
        return;
      }

      var actives;
      var activesData;

      if (this._parent) {
        actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) {
          if (typeof _this._config.parent === 'string') {
            return elem.getAttribute('data-parent') === _this._config.parent;
          }

          return elem.classList.contains(CLASS_NAME_COLLAPSE);
        });

        if (actives.length === 0) {
          actives = null;
        }
      }

      if (actives) {
        activesData = $__default['default'](actives).not(this._selector).data(DATA_KEY$3);

        if (activesData && activesData._isTransitioning) {
          return;
        }
      }

      var startEvent = $__default['default'].Event(EVENT_SHOW);
      $__default['default'](this._element).trigger(startEvent);

      if (startEvent.isDefaultPrevented()) {
        return;
      }

      if (actives) {
        Collapse._jQueryInterface.call($__default['default'](actives).not(this._selector), 'hide');

        if (!activesData) {
          $__default['default'](actives).data(DATA_KEY$3, null);
        }
      }

      var dimension = this._getDimension();

      $__default['default'](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);
      this._element.style[dimension] = 0;

      if (this._triggerArray.length) {
        $__default['default'](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true);
      }

      this.setTransitioning(true);

      var complete = function complete() {
        $__default['default'](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$1);
        _this._element.style[dimension] = '';

        _this.setTransitioning(false);

        $__default['default'](_this._element).trigger(EVENT_SHOWN);
      };

      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
      var scrollSize = "scroll" + capitalizedDimension;
      var transitionDuration = Util.getTransitionDurationFromElement(this._element);
      $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
      this._element.style[dimension] = this._element[scrollSize] + "px";
    };

    _proto.hide = function hide() {
      var _this2 = this;

      if (this._isTransitioning || !$__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) {
        return;
      }

      var startEvent = $__default['default'].Event(EVENT_HIDE);
      $__default['default'](this._element).trigger(startEvent);

      if (startEvent.isDefaultPrevented()) {
        return;
      }

      var dimension = this._getDimension();

      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
      Util.reflow(this._element);
      $__default['default'](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$1);
      var triggerArrayLength = this._triggerArray.length;

      if (triggerArrayLength > 0) {
        for (var i = 0; i < triggerArrayLength; i++) {
          var trigger = this._triggerArray[i];
          var selector = Util.getSelectorFromElement(trigger);

          if (selector !== null) {
            var $elem = $__default['default']([].slice.call(document.querySelectorAll(selector)));

            if (!$elem.hasClass(CLASS_NAME_SHOW$1)) {
              $__default['default'](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false);
            }
          }
        }
      }

      this.setTransitioning(true);

      var complete = function complete() {
        _this2.setTransitioning(false);

        $__default['default'](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN);
      };

      this._element.style[dimension] = '';
      var transitionDuration = Util.getTransitionDurationFromElement(this._element);
      $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
    };

    _proto.setTransitioning = function setTransitioning(isTransitioning) {
      this._isTransitioning = isTransitioning;
    };

    _proto.dispose = function dispose() {
      $__default['default'].removeData(this._element, DATA_KEY$3);
      this._config = null;
      this._parent = null;
      this._element = null;
      this._triggerArray = null;
      this._isTransitioning = null;
    } // Private
    ;

    _proto._getConfig = function _getConfig(config) {
      config = _extends({}, Default$1, config);
      config.toggle = Boolean(config.toggle); // Coerce string values

      Util.typeCheckConfig(NAME$3, config, DefaultType$1);
      return config;
    };

    _proto._getDimension = function _getDimension() {
      var hasWidth = $__default['default'](this._element).hasClass(DIMENSION_WIDTH);
      return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;
    };

    _proto._getParent = function _getParent() {
      var _this3 = this;

      var parent;

      if (Util.isElement(this._config.parent)) {
        parent = this._config.parent; // It's a jQuery object

        if (typeof this._config.parent.jquery !== 'undefined') {
          parent = this._config.parent[0];
        }
      } else {
        parent = document.querySelector(this._config.parent);
      }

      var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
      var children = [].slice.call(parent.querySelectorAll(selector));
      $__default['default'](children).each(function (i, element) {
        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
      });
      return parent;
    };

    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
      var isOpen = $__default['default'](element).hasClass(CLASS_NAME_SHOW$1);

      if (triggerArray.length) {
        $__default['default'](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
      }
    } // Static
    ;

    Collapse._getTargetFromElement = function _getTargetFromElement(element) {
      var selector = Util.getSelectorFromElement(element);
      return selector ? document.querySelector(selector) : null;
    };

    Collapse._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var $element = $__default['default'](this);
        var data = $element.data(DATA_KEY$3);

        var _config = _extends({}, Default$1, $element.data(), typeof config === 'object' && config ? config : {});

        if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
          _config.toggle = false;
        }

        if (!data) {
          data = new Collapse(this, _config);
          $element.data(DATA_KEY$3, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config]();
        }
      });
    };

    _createClass(Collapse, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$3;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$1;
      }
    }]);

    return Collapse;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$1, function (event) {
    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
    if (event.currentTarget.tagName === 'A') {
      event.preventDefault();
    }

    var $trigger = $__default['default'](this);
    var selector = Util.getSelectorFromElement(this);
    var selectors = [].slice.call(document.querySelectorAll(selector));
    $__default['default'](selectors).each(function () {
      var $target = $__default['default'](this);
      var data = $target.data(DATA_KEY$3);
      var config = data ? 'toggle' : $trigger.data();

      Collapse._jQueryInterface.call($target, config);
    });
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$3] = Collapse._jQueryInterface;
  $__default['default'].fn[NAME$3].Constructor = Collapse;

  $__default['default'].fn[NAME$3].noConflict = function () {
    $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3;
    return Collapse._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$4 = 'dropdown';
  var VERSION$4 = '4.5.3';
  var DATA_KEY$4 = 'bs.dropdown';
  var EVENT_KEY$4 = "." + DATA_KEY$4;
  var DATA_API_KEY$4 = '.data-api';
  var JQUERY_NO_CONFLICT$4 = $__default['default'].fn[NAME$4];
  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key

  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key

  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key

  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key

  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key

  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)

  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
  var EVENT_HIDE$1 = "hide" + EVENT_KEY$4;
  var EVENT_HIDDEN$1 = "hidden" + EVENT_KEY$4;
  var EVENT_SHOW$1 = "show" + EVENT_KEY$4;
  var EVENT_SHOWN$1 = "shown" + EVENT_KEY$4;
  var EVENT_CLICK = "click" + EVENT_KEY$4;
  var EVENT_CLICK_DATA_API$4 = "click" + EVENT_KEY$4 + DATA_API_KEY$4;
  var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY$4 + DATA_API_KEY$4;
  var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY$4 + DATA_API_KEY$4;
  var CLASS_NAME_DISABLED = 'disabled';
  var CLASS_NAME_SHOW$2 = 'show';
  var CLASS_NAME_DROPUP = 'dropup';
  var CLASS_NAME_DROPRIGHT = 'dropright';
  var CLASS_NAME_DROPLEFT = 'dropleft';
  var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
  var CLASS_NAME_POSITION_STATIC = 'position-static';
  var SELECTOR_DATA_TOGGLE$2 = '[data-toggle="dropdown"]';
  var SELECTOR_FORM_CHILD = '.dropdown form';
  var SELECTOR_MENU = '.dropdown-menu';
  var SELECTOR_NAVBAR_NAV = '.navbar-nav';
  var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
  var PLACEMENT_TOP = 'top-start';
  var PLACEMENT_TOPEND = 'top-end';
  var PLACEMENT_BOTTOM = 'bottom-start';
  var PLACEMENT_BOTTOMEND = 'bottom-end';
  var PLACEMENT_RIGHT = 'right-start';
  var PLACEMENT_LEFT = 'left-start';
  var Default$2 = {
    offset: 0,
    flip: true,
    boundary: 'scrollParent',
    reference: 'toggle',
    display: 'dynamic',
    popperConfig: null
  };
  var DefaultType$2 = {
    offset: '(number|string|function)',
    flip: 'boolean',
    boundary: '(string|element)',
    reference: '(string|element)',
    display: 'string',
    popperConfig: '(null|object)'
  };
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Dropdown = /*#__PURE__*/function () {
    function Dropdown(element, config) {
      this._element = element;
      this._popper = null;
      this._config = this._getConfig(config);
      this._menu = this._getMenuElement();
      this._inNavbar = this._detectNavbar();

      this._addEventListeners();
    } // Getters


    var _proto = Dropdown.prototype;

    // Public
    _proto.toggle = function toggle() {
      if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) {
        return;
      }

      var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2);

      Dropdown._clearMenus();

      if (isActive) {
        return;
      }

      this.show(true);
    };

    _proto.show = function show(usePopper) {
      if (usePopper === void 0) {
        usePopper = false;
      }

      if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) {
        return;
      }

      var relatedTarget = {
        relatedTarget: this._element
      };
      var showEvent = $__default['default'].Event(EVENT_SHOW$1, relatedTarget);

      var parent = Dropdown._getParentFromElement(this._element);

      $__default['default'](parent).trigger(showEvent);

      if (showEvent.isDefaultPrevented()) {
        return;
      } // Disable totally Popper.js for Dropdown in Navbar


      if (!this._inNavbar && usePopper) {
        /**
         * Check for Popper dependency
         * Popper - https://popper.js.org
         */
        if (typeof Popper__default['default'] === 'undefined') {
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
        }

        var referenceElement = this._element;

        if (this._config.reference === 'parent') {
          referenceElement = parent;
        } else if (Util.isElement(this._config.reference)) {
          referenceElement = this._config.reference; // Check if it's jQuery element

          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
          }
        } // If boundary is not `scrollParent`, then set position to `static`
        // to allow the menu to "escape" the scroll parent's boundaries
        // https://github.com/twbs/bootstrap/issues/24251


        if (this._config.boundary !== 'scrollParent') {
          $__default['default'](parent).addClass(CLASS_NAME_POSITION_STATIC);
        }

        this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig());
      } // If this is a touch-enabled device we add extra
      // empty mouseover listeners to the body's immediate children;
      // only needed because of broken event delegation on iOS
      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html


      if ('ontouchstart' in document.documentElement && $__default['default'](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
        $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop);
      }

      this._element.focus();

      this._element.setAttribute('aria-expanded', true);

      $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW$2);
      $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_SHOWN$1, relatedTarget));
    };

    _proto.hide = function hide() {
      if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) {
        return;
      }

      var relatedTarget = {
        relatedTarget: this._element
      };
      var hideEvent = $__default['default'].Event(EVENT_HIDE$1, relatedTarget);

      var parent = Dropdown._getParentFromElement(this._element);

      $__default['default'](parent).trigger(hideEvent);

      if (hideEvent.isDefaultPrevented()) {
        return;
      }

      if (this._popper) {
        this._popper.destroy();
      }

      $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW$2);
      $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget));
    };

    _proto.dispose = function dispose() {
      $__default['default'].removeData(this._element, DATA_KEY$4);
      $__default['default'](this._element).off(EVENT_KEY$4);
      this._element = null;
      this._menu = null;

      if (this._popper !== null) {
        this._popper.destroy();

        this._popper = null;
      }
    };

    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();

      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
    } // Private
    ;

    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;

      $__default['default'](this._element).on(EVENT_CLICK, function (event) {
        event.preventDefault();
        event.stopPropagation();

        _this.toggle();
      });
    };

    _proto._getConfig = function _getConfig(config) {
      config = _extends({}, this.constructor.Default, $__default['default'](this._element).data(), config);
      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
      return config;
    };

    _proto._getMenuElement = function _getMenuElement() {
      if (!this._menu) {
        var parent = Dropdown._getParentFromElement(this._element);

        if (parent) {
          this._menu = parent.querySelector(SELECTOR_MENU);
        }
      }

      return this._menu;
    };

    _proto._getPlacement = function _getPlacement() {
      var $parentDropdown = $__default['default'](this._element.parentNode);
      var placement = PLACEMENT_BOTTOM; // Handle dropup

      if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
        placement = $__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
      } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
        placement = PLACEMENT_RIGHT;
      } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
        placement = PLACEMENT_LEFT;
      } else if ($__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
        placement = PLACEMENT_BOTTOMEND;
      }

      return placement;
    };

    _proto._detectNavbar = function _detectNavbar() {
      return $__default['default'](this._element).closest('.navbar').length > 0;
    };

    _proto._getOffset = function _getOffset() {
      var _this2 = this;

      var offset = {};

      if (typeof this._config.offset === 'function') {
        offset.fn = function (data) {
          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
          return data;
        };
      } else {
        offset.offset = this._config.offset;
      }

      return offset;
    };

    _proto._getPopperConfig = function _getPopperConfig() {
      var popperConfig = {
        placement: this._getPlacement(),
        modifiers: {
          offset: this._getOffset(),
          flip: {
            enabled: this._config.flip
          },
          preventOverflow: {
            boundariesElement: this._config.boundary
          }
        }
      }; // Disable Popper.js if we have a static display

      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }

      return _extends({}, popperConfig, this._config.popperConfig);
    } // Static
    ;

    Dropdown._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $__default['default'](this).data(DATA_KEY$4);

        var _config = typeof config === 'object' ? config : null;

        if (!data) {
          data = new Dropdown(this, _config);
          $__default['default'](this).data(DATA_KEY$4, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config]();
        }
      });
    };

    Dropdown._clearMenus = function _clearMenus(event) {
      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
        return;
      }

      var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2));

      for (var i = 0, len = toggles.length; i < len; i++) {
        var parent = Dropdown._getParentFromElement(toggles[i]);

        var context = $__default['default'](toggles[i]).data(DATA_KEY$4);
        var relatedTarget = {
          relatedTarget: toggles[i]
        };

        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
        }

        if (!context) {
          continue;
        }

        var dropdownMenu = context._menu;

        if (!$__default['default'](parent).hasClass(CLASS_NAME_SHOW$2)) {
          continue;
        }

        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default['default'].contains(parent, event.target)) {
          continue;
        }

        var hideEvent = $__default['default'].Event(EVENT_HIDE$1, relatedTarget);
        $__default['default'](parent).trigger(hideEvent);

        if (hideEvent.isDefaultPrevented()) {
          continue;
        } // If this is a touch-enabled device we remove the extra
        // empty mouseover listeners we added for iOS support


        if ('ontouchstart' in document.documentElement) {
          $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop);
        }

        toggles[i].setAttribute('aria-expanded', 'false');

        if (context._popper) {
          context._popper.destroy();
        }

        $__default['default'](dropdownMenu).removeClass(CLASS_NAME_SHOW$2);
        $__default['default'](parent).removeClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget));
      }
    };

    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
      var selector = Util.getSelectorFromElement(element);

      if (selector) {
        parent = document.querySelector(selector);
      }

      return parent || element.parentNode;
    } // eslint-disable-next-line complexity
    ;

    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
      // If not input/textarea:
      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
      // If input/textarea:
      //  - If space key => not a dropdown command
      //  - If key is other than escape
      //    - If key is not up or down => not a dropdown command
      //    - If trigger inside the menu => not a dropdown command
      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default['default'](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
        return;
      }

      if (this.disabled || $__default['default'](this).hasClass(CLASS_NAME_DISABLED)) {
        return;
      }

      var parent = Dropdown._getParentFromElement(this);

      var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW$2);

      if (!isActive && event.which === ESCAPE_KEYCODE) {
        return;
      }

      event.preventDefault();
      event.stopPropagation();

      if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) {
        if (event.which === ESCAPE_KEYCODE) {
          $__default['default'](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus');
        }

        $__default['default'](this).trigger('click');
        return;
      }

      var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
        return $__default['default'](item).is(':visible');
      });

      if (items.length === 0) {
        return;
      }

      var index = items.indexOf(event.target);

      if (event.which === ARROW_UP_KEYCODE && index > 0) {
        // Up
        index--;
      }

      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
        // Down
        index++;
      }

      if (index < 0) {
        index = 0;
      }

      items[index].focus();
    };

    _createClass(Dropdown, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$4;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$2;
      }
    }, {
      key: "DefaultType",
      get: function get() {
        return DefaultType$2;
      }
    }]);

    return Dropdown;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$4 + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$2, function (event) {
    event.preventDefault();
    event.stopPropagation();

    Dropdown._jQueryInterface.call($__default['default'](this), 'toggle');
  }).on(EVENT_CLICK_DATA_API$4, SELECTOR_FORM_CHILD, function (e) {
    e.stopPropagation();
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$4] = Dropdown._jQueryInterface;
  $__default['default'].fn[NAME$4].Constructor = Dropdown;

  $__default['default'].fn[NAME$4].noConflict = function () {
    $__default['default'].fn[NAME$4] = JQUERY_NO_CONFLICT$4;
    return Dropdown._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$5 = 'modal';
  var VERSION$5 = '4.5.3';
  var DATA_KEY$5 = 'bs.modal';
  var EVENT_KEY$5 = "." + DATA_KEY$5;
  var DATA_API_KEY$5 = '.data-api';
  var JQUERY_NO_CONFLICT$5 = $__default['default'].fn[NAME$5];
  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key

  var Default$3 = {
    backdrop: true,
    keyboard: true,
    focus: true,
    show: true
  };
  var DefaultType$3 = {
    backdrop: '(boolean|string)',
    keyboard: 'boolean',
    focus: 'boolean',
    show: 'boolean'
  };
  var EVENT_HIDE$2 = "hide" + EVENT_KEY$5;
  var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY$5;
  var EVENT_HIDDEN$2 = "hidden" + EVENT_KEY$5;
  var EVENT_SHOW$2 = "show" + EVENT_KEY$5;
  var EVENT_SHOWN$2 = "shown" + EVENT_KEY$5;
  var EVENT_FOCUSIN = "focusin" + EVENT_KEY$5;
  var EVENT_RESIZE = "resize" + EVENT_KEY$5;
  var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY$5;
  var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY$5;
  var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY$5;
  var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY$5;
  var EVENT_CLICK_DATA_API$5 = "click" + EVENT_KEY$5 + DATA_API_KEY$5;
  var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable';
  var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';
  var CLASS_NAME_BACKDROP = 'modal-backdrop';
  var CLASS_NAME_OPEN = 'modal-open';
  var CLASS_NAME_FADE$1 = 'fade';
  var CLASS_NAME_SHOW$3 = 'show';
  var CLASS_NAME_STATIC = 'modal-static';
  var SELECTOR_DIALOG = '.modal-dialog';
  var SELECTOR_MODAL_BODY = '.modal-body';
  var SELECTOR_DATA_TOGGLE$3 = '[data-toggle="modal"]';
  var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]';
  var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
  var SELECTOR_STICKY_CONTENT = '.sticky-top';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Modal = /*#__PURE__*/function () {
    function Modal(element, config) {
      this._config = this._getConfig(config);
      this._element = element;
      this._dialog = element.querySelector(SELECTOR_DIALOG);
      this._backdrop = null;
      this._isShown = false;
      this._isBodyOverflowing = false;
      this._ignoreBackdropClick = false;
      this._isTransitioning = false;
      this._scrollbarWidth = 0;
    } // Getters


    var _proto = Modal.prototype;

    // Public
    _proto.toggle = function toggle(relatedTarget) {
      return this._isShown ? this.hide() : this.show(relatedTarget);
    };

    _proto.show = function show(relatedTarget) {
      var _this = this;

      if (this._isShown || this._isTransitioning) {
        return;
      }

      if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) {
        this._isTransitioning = true;
      }

      var showEvent = $__default['default'].Event(EVENT_SHOW$2, {
        relatedTarget: relatedTarget
      });
      $__default['default'](this._element).trigger(showEvent);

      if (this._isShown || showEvent.isDefaultPrevented()) {
        return;
      }

      this._isShown = true;

      this._checkScrollbar();

      this._setScrollbar();

      this._adjustDialog();

      this._setEscapeEvent();

      this._setResizeEvent();

      $__default['default'](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function (event) {
        return _this.hide(event);
      });
      $__default['default'](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () {
        $__default['default'](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) {
          if ($__default['default'](event.target).is(_this._element)) {
            _this._ignoreBackdropClick = true;
          }
        });
      });

      this._showBackdrop(function () {
        return _this._showElement(relatedTarget);
      });
    };

    _proto.hide = function hide(event) {
      var _this2 = this;

      if (event) {
        event.preventDefault();
      }

      if (!this._isShown || this._isTransitioning) {
        return;
      }

      var hideEvent = $__default['default'].Event(EVENT_HIDE$2);
      $__default['default'](this._element).trigger(hideEvent);

      if (!this._isShown || hideEvent.isDefaultPrevented()) {
        return;
      }

      this._isShown = false;
      var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1);

      if (transition) {
        this._isTransitioning = true;
      }

      this._setEscapeEvent();

      this._setResizeEvent();

      $__default['default'](document).off(EVENT_FOCUSIN);
      $__default['default'](this._element).removeClass(CLASS_NAME_SHOW$3);
      $__default['default'](this._element).off(EVENT_CLICK_DISMISS);
      $__default['default'](this._dialog).off(EVENT_MOUSEDOWN_DISMISS);

      if (transition) {
        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
        $__default['default'](this._element).one(Util.TRANSITION_END, function (event) {
          return _this2._hideModal(event);
        }).emulateTransitionEnd(transitionDuration);
      } else {
        this._hideModal();
      }
    };

    _proto.dispose = function dispose() {
      [window, this._element, this._dialog].forEach(function (htmlElement) {
        return $__default['default'](htmlElement).off(EVENT_KEY$5);
      });
      /**
       * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
       * Do not move `document` in `htmlElements` array
       * It will remove `EVENT_CLICK_DATA_API` event that should remain
       */

      $__default['default'](document).off(EVENT_FOCUSIN);
      $__default['default'].removeData(this._element, DATA_KEY$5);
      this._config = null;
      this._element = null;
      this._dialog = null;
      this._backdrop = null;
      this._isShown = null;
      this._isBodyOverflowing = null;
      this._ignoreBackdropClick = null;
      this._isTransitioning = null;
      this._scrollbarWidth = null;
    };

    _proto.handleUpdate = function handleUpdate() {
      this._adjustDialog();
    } // Private
    ;

    _proto._getConfig = function _getConfig(config) {
      config = _extends({}, Default$3, config);
      Util.typeCheckConfig(NAME$5, config, DefaultType$3);
      return config;
    };

    _proto._triggerBackdropTransition = function _triggerBackdropTransition() {
      var _this3 = this;

      if (this._config.backdrop === 'static') {
        var hideEventPrevented = $__default['default'].Event(EVENT_HIDE_PREVENTED);
        $__default['default'](this._element).trigger(hideEventPrevented);

        if (hideEventPrevented.isDefaultPrevented()) {
          return;
        }

        var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;

        if (!isModalOverflowing) {
          this._element.style.overflowY = 'hidden';
        }

        this._element.classList.add(CLASS_NAME_STATIC);

        var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog);
        $__default['default'](this._element).off(Util.TRANSITION_END);
        $__default['default'](this._element).one(Util.TRANSITION_END, function () {
          _this3._element.classList.remove(CLASS_NAME_STATIC);

          if (!isModalOverflowing) {
            $__default['default'](_this3._element).one(Util.TRANSITION_END, function () {
              _this3._element.style.overflowY = '';
            }).emulateTransitionEnd(_this3._element, modalTransitionDuration);
          }
        }).emulateTransitionEnd(modalTransitionDuration);

        this._element.focus();
      } else {
        this.hide();
      }
    };

    _proto._showElement = function _showElement(relatedTarget) {
      var _this4 = this;

      var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1);
      var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null;

      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
        // Don't move modal's DOM position
        document.body.appendChild(this._element);
      }

      this._element.style.display = 'block';

      this._element.removeAttribute('aria-hidden');

      this._element.setAttribute('aria-modal', true);

      this._element.setAttribute('role', 'dialog');

      if ($__default['default'](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {
        modalBody.scrollTop = 0;
      } else {
        this._element.scrollTop = 0;
      }

      if (transition) {
        Util.reflow(this._element);
      }

      $__default['default'](this._element).addClass(CLASS_NAME_SHOW$3);

      if (this._config.focus) {
        this._enforceFocus();
      }

      var shownEvent = $__default['default'].Event(EVENT_SHOWN$2, {
        relatedTarget: relatedTarget
      });

      var transitionComplete = function transitionComplete() {
        if (_this4._config.focus) {
          _this4._element.focus();
        }

        _this4._isTransitioning = false;
        $__default['default'](_this4._element).trigger(shownEvent);
      };

      if (transition) {
        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
        $__default['default'](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
      } else {
        transitionComplete();
      }
    };

    _proto._enforceFocus = function _enforceFocus() {
      var _this5 = this;

      $__default['default'](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop
      .on(EVENT_FOCUSIN, function (event) {
        if (document !== event.target && _this5._element !== event.target && $__default['default'](_this5._element).has(event.target).length === 0) {
          _this5._element.focus();
        }
      });
    };

    _proto._setEscapeEvent = function _setEscapeEvent() {
      var _this6 = this;

      if (this._isShown) {
        $__default['default'](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) {
          if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) {
            event.preventDefault();

            _this6.hide();
          } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) {
            _this6._triggerBackdropTransition();
          }
        });
      } else if (!this._isShown) {
        $__default['default'](this._element).off(EVENT_KEYDOWN_DISMISS);
      }
    };

    _proto._setResizeEvent = function _setResizeEvent() {
      var _this7 = this;

      if (this._isShown) {
        $__default['default'](window).on(EVENT_RESIZE, function (event) {
          return _this7.handleUpdate(event);
        });
      } else {
        $__default['default'](window).off(EVENT_RESIZE);
      }
    };

    _proto._hideModal = function _hideModal() {
      var _this8 = this;

      this._element.style.display = 'none';

      this._element.setAttribute('aria-hidden', true);

      this._element.removeAttribute('aria-modal');

      this._element.removeAttribute('role');

      this._isTransitioning = false;

      this._showBackdrop(function () {
        $__default['default'](document.body).removeClass(CLASS_NAME_OPEN);

        _this8._resetAdjustments();

        _this8._resetScrollbar();

        $__default['default'](_this8._element).trigger(EVENT_HIDDEN$2);
      });
    };

    _proto._removeBackdrop = function _removeBackdrop() {
      if (this._backdrop) {
        $__default['default'](this._backdrop).remove();
        this._backdrop = null;
      }
    };

    _proto._showBackdrop = function _showBackdrop(callback) {
      var _this9 = this;

      var animate = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1) ? CLASS_NAME_FADE$1 : '';

      if (this._isShown && this._config.backdrop) {
        this._backdrop = document.createElement('div');
        this._backdrop.className = CLASS_NAME_BACKDROP;

        if (animate) {
          this._backdrop.classList.add(animate);
        }

        $__default['default'](this._backdrop).appendTo(document.body);
        $__default['default'](this._element).on(EVENT_CLICK_DISMISS, function (event) {
          if (_this9._ignoreBackdropClick) {
            _this9._ignoreBackdropClick = false;
            return;
          }

          if (event.target !== event.currentTarget) {
            return;
          }

          _this9._triggerBackdropTransition();
        });

        if (animate) {
          Util.reflow(this._backdrop);
        }

        $__default['default'](this._backdrop).addClass(CLASS_NAME_SHOW$3);

        if (!callback) {
          return;
        }

        if (!animate) {
          callback();
          return;
        }

        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
        $__default['default'](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
      } else if (!this._isShown && this._backdrop) {
        $__default['default'](this._backdrop).removeClass(CLASS_NAME_SHOW$3);

        var callbackRemove = function callbackRemove() {
          _this9._removeBackdrop();

          if (callback) {
            callback();
          }
        };

        if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) {
          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);

          $__default['default'](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
        } else {
          callbackRemove();
        }
      } else if (callback) {
        callback();
      }
    } // ----------------------------------------------------------------------
    // the following methods are used to handle overflowing modals
    // todo (fat): these should probably be refactored out of modal.js
    // ----------------------------------------------------------------------
    ;

    _proto._adjustDialog = function _adjustDialog() {
      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;

      if (!this._isBodyOverflowing && isModalOverflowing) {
        this._element.style.paddingLeft = this._scrollbarWidth + "px";
      }

      if (this._isBodyOverflowing && !isModalOverflowing) {
        this._element.style.paddingRight = this._scrollbarWidth + "px";
      }
    };

    _proto._resetAdjustments = function _resetAdjustments() {
      this._element.style.paddingLeft = '';
      this._element.style.paddingRight = '';
    };

    _proto._checkScrollbar = function _checkScrollbar() {
      var rect = document.body.getBoundingClientRect();
      this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;
      this._scrollbarWidth = this._getScrollbarWidth();
    };

    _proto._setScrollbar = function _setScrollbar() {
      var _this10 = this;

      if (this._isBodyOverflowing) {
        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
        var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
        var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding

        $__default['default'](fixedContent).each(function (index, element) {
          var actualPadding = element.style.paddingRight;
          var calculatedPadding = $__default['default'](element).css('padding-right');
          $__default['default'](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
        }); // Adjust sticky content margin

        $__default['default'](stickyContent).each(function (index, element) {
          var actualMargin = element.style.marginRight;
          var calculatedMargin = $__default['default'](element).css('margin-right');
          $__default['default'](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
        }); // Adjust body padding

        var actualPadding = document.body.style.paddingRight;
        var calculatedPadding = $__default['default'](document.body).css('padding-right');
        $__default['default'](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
      }

      $__default['default'](document.body).addClass(CLASS_NAME_OPEN);
    };

    _proto._resetScrollbar = function _resetScrollbar() {
      // Restore fixed content padding
      var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
      $__default['default'](fixedContent).each(function (index, element) {
        var padding = $__default['default'](element).data('padding-right');
        $__default['default'](element).removeData('padding-right');
        element.style.paddingRight = padding ? padding : '';
      }); // Restore sticky content

      var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT));
      $__default['default'](elements).each(function (index, element) {
        var margin = $__default['default'](element).data('margin-right');

        if (typeof margin !== 'undefined') {
          $__default['default'](element).css('margin-right', margin).removeData('margin-right');
        }
      }); // Restore body padding

      var padding = $__default['default'](document.body).data('padding-right');
      $__default['default'](document.body).removeData('padding-right');
      document.body.style.paddingRight = padding ? padding : '';
    };

    _proto._getScrollbarWidth = function _getScrollbarWidth() {
      // thx d.walsh
      var scrollDiv = document.createElement('div');
      scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;
      document.body.appendChild(scrollDiv);
      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
      document.body.removeChild(scrollDiv);
      return scrollbarWidth;
    } // Static
    ;

    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
      return this.each(function () {
        var data = $__default['default'](this).data(DATA_KEY$5);

        var _config = _extends({}, Default$3, $__default['default'](this).data(), typeof config === 'object' && config ? config : {});

        if (!data) {
          data = new Modal(this, _config);
          $__default['default'](this).data(DATA_KEY$5, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config](relatedTarget);
        } else if (_config.show) {
          data.show(relatedTarget);
        }
      });
    };

    _createClass(Modal, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$5;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$3;
      }
    }]);

    return Modal;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE$3, function (event) {
    var _this11 = this;

    var target;
    var selector = Util.getSelectorFromElement(this);

    if (selector) {
      target = document.querySelector(selector);
    }

    var config = $__default['default'](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default['default'](target).data(), $__default['default'](this).data());

    if (this.tagName === 'A' || this.tagName === 'AREA') {
      event.preventDefault();
    }

    var $target = $__default['default'](target).one(EVENT_SHOW$2, function (showEvent) {
      if (showEvent.isDefaultPrevented()) {
        // Only register focus restorer if modal will actually get shown
        return;
      }

      $target.one(EVENT_HIDDEN$2, function () {
        if ($__default['default'](_this11).is(':visible')) {
          _this11.focus();
        }
      });
    });

    Modal._jQueryInterface.call($__default['default'](target), config, this);
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$5] = Modal._jQueryInterface;
  $__default['default'].fn[NAME$5].Constructor = Modal;

  $__default['default'].fn[NAME$5].noConflict = function () {
    $__default['default'].fn[NAME$5] = JQUERY_NO_CONFLICT$5;
    return Modal._jQueryInterface;
  };

  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.5.3): tools/sanitizer.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
   * --------------------------------------------------------------------------
   */
  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
  var DefaultWhitelist = {
    // Global attributes allowed on any supplied element below.
    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
    a: ['target', 'href', 'title', 'rel'],
    area: [],
    b: [],
    br: [],
    col: [],
    code: [],
    div: [],
    em: [],
    hr: [],
    h1: [],
    h2: [],
    h3: [],
    h4: [],
    h5: [],
    h6: [],
    i: [],
    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
    li: [],
    ol: [],
    p: [],
    pre: [],
    s: [],
    small: [],
    span: [],
    sub: [],
    sup: [],
    strong: [],
    u: [],
    ul: []
  };
  /**
   * A pattern that recognizes a commonly useful subset of URLs that are safe.
   *
   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
   */

  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi;
  /**
   * A pattern that matches safe data URLs. Only matches image, video and audio types.
   *
   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
   */

  var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;

  function allowedAttribute(attr, allowedAttributeList) {
    var attrName = attr.nodeName.toLowerCase();

    if (allowedAttributeList.indexOf(attrName) !== -1) {
      if (uriAttrs.indexOf(attrName) !== -1) {
        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
      }

      return true;
    }

    var regExp = allowedAttributeList.filter(function (attrRegex) {
      return attrRegex instanceof RegExp;
    }); // Check if a regular expression validates the attribute.

    for (var i = 0, len = regExp.length; i < len; i++) {
      if (attrName.match(regExp[i])) {
        return true;
      }
    }

    return false;
  }

  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
    if (unsafeHtml.length === 0) {
      return unsafeHtml;
    }

    if (sanitizeFn && typeof sanitizeFn === 'function') {
      return sanitizeFn(unsafeHtml);
    }

    var domParser = new window.DOMParser();
    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
    var whitelistKeys = Object.keys(whiteList);
    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));

    var _loop = function _loop(i, len) {
      var el = elements[i];
      var elName = el.nodeName.toLowerCase();

      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
        el.parentNode.removeChild(el);
        return "continue";
      }

      var attributeList = [].slice.call(el.attributes);
      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
      attributeList.forEach(function (attr) {
        if (!allowedAttribute(attr, whitelistedAttributes)) {
          el.removeAttribute(attr.nodeName);
        }
      });
    };

    for (var i = 0, len = elements.length; i < len; i++) {
      var _ret = _loop(i);

      if (_ret === "continue") continue;
    }

    return createdDocument.body.innerHTML;
  }

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$6 = 'tooltip';
  var VERSION$6 = '4.5.3';
  var DATA_KEY$6 = 'bs.tooltip';
  var EVENT_KEY$6 = "." + DATA_KEY$6;
  var JQUERY_NO_CONFLICT$6 = $__default['default'].fn[NAME$6];
  var CLASS_PREFIX = 'bs-tooltip';
  var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
  var DefaultType$4 = {
    animation: 'boolean',
    template: 'string',
    title: '(string|element|function)',
    trigger: 'string',
    delay: '(number|object)',
    html: 'boolean',
    selector: '(string|boolean)',
    placement: '(string|function)',
    offset: '(number|string|function)',
    container: '(string|element|boolean)',
    fallbackPlacement: '(string|array)',
    boundary: '(string|element)',
    sanitize: 'boolean',
    sanitizeFn: '(null|function)',
    whiteList: 'object',
    popperConfig: '(null|object)'
  };
  var AttachmentMap = {
    AUTO: 'auto',
    TOP: 'top',
    RIGHT: 'right',
    BOTTOM: 'bottom',
    LEFT: 'left'
  };
  var Default$4 = {
    animation: true,
    template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    selector: false,
    placement: 'top',
    offset: 0,
    container: false,
    fallbackPlacement: 'flip',
    boundary: 'scrollParent',
    sanitize: true,
    sanitizeFn: null,
    whiteList: DefaultWhitelist,
    popperConfig: null
  };
  var HOVER_STATE_SHOW = 'show';
  var HOVER_STATE_OUT = 'out';
  var Event = {
    HIDE: "hide" + EVENT_KEY$6,
    HIDDEN: "hidden" + EVENT_KEY$6,
    SHOW: "show" + EVENT_KEY$6,
    SHOWN: "shown" + EVENT_KEY$6,
    INSERTED: "inserted" + EVENT_KEY$6,
    CLICK: "click" + EVENT_KEY$6,
    FOCUSIN: "focusin" + EVENT_KEY$6,
    FOCUSOUT: "focusout" + EVENT_KEY$6,
    MOUSEENTER: "mouseenter" + EVENT_KEY$6,
    MOUSELEAVE: "mouseleave" + EVENT_KEY$6
  };
  var CLASS_NAME_FADE$2 = 'fade';
  var CLASS_NAME_SHOW$4 = 'show';
  var SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
  var SELECTOR_ARROW = '.arrow';
  var TRIGGER_HOVER = 'hover';
  var TRIGGER_FOCUS = 'focus';
  var TRIGGER_CLICK = 'click';
  var TRIGGER_MANUAL = 'manual';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Tooltip = /*#__PURE__*/function () {
    function Tooltip(element, config) {
      if (typeof Popper__default['default'] === 'undefined') {
        throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
      } // private


      this._isEnabled = true;
      this._timeout = 0;
      this._hoverState = '';
      this._activeTrigger = {};
      this._popper = null; // Protected

      this.element = element;
      this.config = this._getConfig(config);
      this.tip = null;

      this._setListeners();
    } // Getters


    var _proto = Tooltip.prototype;

    // Public
    _proto.enable = function enable() {
      this._isEnabled = true;
    };

    _proto.disable = function disable() {
      this._isEnabled = false;
    };

    _proto.toggleEnabled = function toggleEnabled() {
      this._isEnabled = !this._isEnabled;
    };

    _proto.toggle = function toggle(event) {
      if (!this._isEnabled) {
        return;
      }

      if (event) {
        var dataKey = this.constructor.DATA_KEY;
        var context = $__default['default'](event.currentTarget).data(dataKey);

        if (!context) {
          context = new this.constructor(event.currentTarget, this._getDelegateConfig());
          $__default['default'](event.currentTarget).data(dataKey, context);
        }

        context._activeTrigger.click = !context._activeTrigger.click;

        if (context._isWithActiveTrigger()) {
          context._enter(null, context);
        } else {
          context._leave(null, context);
        }
      } else {
        if ($__default['default'](this.getTipElement()).hasClass(CLASS_NAME_SHOW$4)) {
          this._leave(null, this);

          return;
        }

        this._enter(null, this);
      }
    };

    _proto.dispose = function dispose() {
      clearTimeout(this._timeout);
      $__default['default'].removeData(this.element, this.constructor.DATA_KEY);
      $__default['default'](this.element).off(this.constructor.EVENT_KEY);
      $__default['default'](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);

      if (this.tip) {
        $__default['default'](this.tip).remove();
      }

      this._isEnabled = null;
      this._timeout = null;
      this._hoverState = null;
      this._activeTrigger = null;

      if (this._popper) {
        this._popper.destroy();
      }

      this._popper = null;
      this.element = null;
      this.config = null;
      this.tip = null;
    };

    _proto.show = function show() {
      var _this = this;

      if ($__default['default'](this.element).css('display') === 'none') {
        throw new Error('Please use show on visible elements');
      }

      var showEvent = $__default['default'].Event(this.constructor.Event.SHOW);

      if (this.isWithContent() && this._isEnabled) {
        $__default['default'](this.element).trigger(showEvent);
        var shadowRoot = Util.findShadowRoot(this.element);
        var isInTheDom = $__default['default'].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);

        if (showEvent.isDefaultPrevented() || !isInTheDom) {
          return;
        }

        var tip = this.getTipElement();
        var tipId = Util.getUID(this.constructor.NAME);
        tip.setAttribute('id', tipId);
        this.element.setAttribute('aria-describedby', tipId);
        this.setContent();

        if (this.config.animation) {
          $__default['default'](tip).addClass(CLASS_NAME_FADE$2);
        }

        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;

        var attachment = this._getAttachment(placement);

        this.addAttachmentClass(attachment);

        var container = this._getContainer();

        $__default['default'](tip).data(this.constructor.DATA_KEY, this);

        if (!$__default['default'].contains(this.element.ownerDocument.documentElement, this.tip)) {
          $__default['default'](tip).appendTo(container);
        }

        $__default['default'](this.element).trigger(this.constructor.Event.INSERTED);
        this._popper = new Popper__default['default'](this.element, tip, this._getPopperConfig(attachment));
        $__default['default'](tip).addClass(CLASS_NAME_SHOW$4); // If this is a touch-enabled device we add extra
        // empty mouseover listeners to the body's immediate children;
        // only needed because of broken event delegation on iOS
        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html

        if ('ontouchstart' in document.documentElement) {
          $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop);
        }

        var complete = function complete() {
          if (_this.config.animation) {
            _this._fixTransition();
          }

          var prevHoverState = _this._hoverState;
          _this._hoverState = null;
          $__default['default'](_this.element).trigger(_this.constructor.Event.SHOWN);

          if (prevHoverState === HOVER_STATE_OUT) {
            _this._leave(null, _this);
          }
        };

        if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE$2)) {
          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
          $__default['default'](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
        } else {
          complete();
        }
      }
    };

    _proto.hide = function hide(callback) {
      var _this2 = this;

      var tip = this.getTipElement();
      var hideEvent = $__default['default'].Event(this.constructor.Event.HIDE);

      var complete = function complete() {
        if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
          tip.parentNode.removeChild(tip);
        }

        _this2._cleanTipClass();

        _this2.element.removeAttribute('aria-describedby');

        $__default['default'](_this2.element).trigger(_this2.constructor.Event.HIDDEN);

        if (_this2._popper !== null) {
          _this2._popper.destroy();
        }

        if (callback) {
          callback();
        }
      };

      $__default['default'](this.element).trigger(hideEvent);

      if (hideEvent.isDefaultPrevented()) {
        return;
      }

      $__default['default'](tip).removeClass(CLASS_NAME_SHOW$4); // If this is a touch-enabled device we remove the extra
      // empty mouseover listeners we added for iOS support

      if ('ontouchstart' in document.documentElement) {
        $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop);
      }

      this._activeTrigger[TRIGGER_CLICK] = false;
      this._activeTrigger[TRIGGER_FOCUS] = false;
      this._activeTrigger[TRIGGER_HOVER] = false;

      if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE$2)) {
        var transitionDuration = Util.getTransitionDurationFromElement(tip);
        $__default['default'](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
      } else {
        complete();
      }

      this._hoverState = '';
    };

    _proto.update = function update() {
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
    } // Protected
    ;

    _proto.isWithContent = function isWithContent() {
      return Boolean(this.getTitle());
    };

    _proto.addAttachmentClass = function addAttachmentClass(attachment) {
      $__default['default'](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
    };

    _proto.getTipElement = function getTipElement() {
      this.tip = this.tip || $__default['default'](this.config.template)[0];
      return this.tip;
    };

    _proto.setContent = function setContent() {
      var tip = this.getTipElement();
      this.setElementContent($__default['default'](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle());
      $__default['default'](tip).removeClass(CLASS_NAME_FADE$2 + " " + CLASS_NAME_SHOW$4);
    };

    _proto.setElementContent = function setElementContent($element, content) {
      if (typeof content === 'object' && (content.nodeType || content.jquery)) {
        // Content is a DOM node or a jQuery
        if (this.config.html) {
          if (!$__default['default'](content).parent().is($element)) {
            $element.empty().append(content);
          }
        } else {
          $element.text($__default['default'](content).text());
        }

        return;
      }

      if (this.config.html) {
        if (this.config.sanitize) {
          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
        }

        $element.html(content);
      } else {
        $element.text(content);
      }
    };

    _proto.getTitle = function getTitle() {
      var title = this.element.getAttribute('data-original-title');

      if (!title) {
        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
      }

      return title;
    } // Private
    ;

    _proto._getPopperConfig = function _getPopperConfig(attachment) {
      var _this3 = this;

      var defaultBsConfig = {
        placement: attachment,
        modifiers: {
          offset: this._getOffset(),
          flip: {
            behavior: this.config.fallbackPlacement
          },
          arrow: {
            element: SELECTOR_ARROW
          },
          preventOverflow: {
            boundariesElement: this.config.boundary
          }
        },
        onCreate: function onCreate(data) {
          if (data.originalPlacement !== data.placement) {
            _this3._handlePopperPlacementChange(data);
          }
        },
        onUpdate: function onUpdate(data) {
          return _this3._handlePopperPlacementChange(data);
        }
      };
      return _extends({}, defaultBsConfig, this.config.popperConfig);
    };

    _proto._getOffset = function _getOffset() {
      var _this4 = this;

      var offset = {};

      if (typeof this.config.offset === 'function') {
        offset.fn = function (data) {
          data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element) || {});
          return data;
        };
      } else {
        offset.offset = this.config.offset;
      }

      return offset;
    };

    _proto._getContainer = function _getContainer() {
      if (this.config.container === false) {
        return document.body;
      }

      if (Util.isElement(this.config.container)) {
        return $__default['default'](this.config.container);
      }

      return $__default['default'](document).find(this.config.container);
    };

    _proto._getAttachment = function _getAttachment(placement) {
      return AttachmentMap[placement.toUpperCase()];
    };

    _proto._setListeners = function _setListeners() {
      var _this5 = this;

      var triggers = this.config.trigger.split(' ');
      triggers.forEach(function (trigger) {
        if (trigger === 'click') {
          $__default['default'](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
            return _this5.toggle(event);
          });
        } else if (trigger !== TRIGGER_MANUAL) {
          var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
          var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
          $__default['default'](_this5.element).on(eventIn, _this5.config.selector, function (event) {
            return _this5._enter(event);
          }).on(eventOut, _this5.config.selector, function (event) {
            return _this5._leave(event);
          });
        }
      });

      this._hideModalHandler = function () {
        if (_this5.element) {
          _this5.hide();
        }
      };

      $__default['default'](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);

      if (this.config.selector) {
        this.config = _extends({}, this.config, {
          trigger: 'manual',
          selector: ''
        });
      } else {
        this._fixTitle();
      }
    };

    _proto._fixTitle = function _fixTitle() {
      var titleType = typeof this.element.getAttribute('data-original-title');

      if (this.element.getAttribute('title') || titleType !== 'string') {
        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
        this.element.setAttribute('title', '');
      }
    };

    _proto._enter = function _enter(event, context) {
      var dataKey = this.constructor.DATA_KEY;
      context = context || $__default['default'](event.currentTarget).data(dataKey);

      if (!context) {
        context = new this.constructor(event.currentTarget, this._getDelegateConfig());
        $__default['default'](event.currentTarget).data(dataKey, context);
      }

      if (event) {
        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
      }

      if ($__default['default'](context.getTipElement()).hasClass(CLASS_NAME_SHOW$4) || context._hoverState === HOVER_STATE_SHOW) {
        context._hoverState = HOVER_STATE_SHOW;
        return;
      }

      clearTimeout(context._timeout);
      context._hoverState = HOVER_STATE_SHOW;

      if (!context.config.delay || !context.config.delay.show) {
        context.show();
        return;
      }

      context._timeout = setTimeout(function () {
        if (context._hoverState === HOVER_STATE_SHOW) {
          context.show();
        }
      }, context.config.delay.show);
    };

    _proto._leave = function _leave(event, context) {
      var dataKey = this.constructor.DATA_KEY;
      context = context || $__default['default'](event.currentTarget).data(dataKey);

      if (!context) {
        context = new this.constructor(event.currentTarget, this._getDelegateConfig());
        $__default['default'](event.currentTarget).data(dataKey, context);
      }

      if (event) {
        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false;
      }

      if (context._isWithActiveTrigger()) {
        return;
      }

      clearTimeout(context._timeout);
      context._hoverState = HOVER_STATE_OUT;

      if (!context.config.delay || !context.config.delay.hide) {
        context.hide();
        return;
      }

      context._timeout = setTimeout(function () {
        if (context._hoverState === HOVER_STATE_OUT) {
          context.hide();
        }
      }, context.config.delay.hide);
    };

    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
      for (var trigger in this._activeTrigger) {
        if (this._activeTrigger[trigger]) {
          return true;
        }
      }

      return false;
    };

    _proto._getConfig = function _getConfig(config) {
      var dataAttributes = $__default['default'](this.element).data();
      Object.keys(dataAttributes).forEach(function (dataAttr) {
        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
          delete dataAttributes[dataAttr];
        }
      });
      config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});

      if (typeof config.delay === 'number') {
        config.delay = {
          show: config.delay,
          hide: config.delay
        };
      }

      if (typeof config.title === 'number') {
        config.title = config.title.toString();
      }

      if (typeof config.content === 'number') {
        config.content = config.content.toString();
      }

      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);

      if (config.sanitize) {
        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
      }

      return config;
    };

    _proto._getDelegateConfig = function _getDelegateConfig() {
      var config = {};

      if (this.config) {
        for (var key in this.config) {
          if (this.constructor.Default[key] !== this.config[key]) {
            config[key] = this.config[key];
          }
        }
      }

      return config;
    };

    _proto._cleanTipClass = function _cleanTipClass() {
      var $tip = $__default['default'](this.getTipElement());
      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);

      if (tabClass !== null && tabClass.length) {
        $tip.removeClass(tabClass.join(''));
      }
    };

    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
      this.tip = popperData.instance.popper;

      this._cleanTipClass();

      this.addAttachmentClass(this._getAttachment(popperData.placement));
    };

    _proto._fixTransition = function _fixTransition() {
      var tip = this.getTipElement();
      var initConfigAnimation = this.config.animation;

      if (tip.getAttribute('x-placement') !== null) {
        return;
      }

      $__default['default'](tip).removeClass(CLASS_NAME_FADE$2);
      this.config.animation = false;
      this.hide();
      this.show();
      this.config.animation = initConfigAnimation;
    } // Static
    ;

    Tooltip._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var $element = $__default['default'](this);
        var data = $element.data(DATA_KEY$6);

        var _config = typeof config === 'object' && config;

        if (!data && /dispose|hide/.test(config)) {
          return;
        }

        if (!data) {
          data = new Tooltip(this, _config);
          $element.data(DATA_KEY$6, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config]();
        }
      });
    };

    _createClass(Tooltip, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$6;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$4;
      }
    }, {
      key: "NAME",
      get: function get() {
        return NAME$6;
      }
    }, {
      key: "DATA_KEY",
      get: function get() {
        return DATA_KEY$6;
      }
    }, {
      key: "Event",
      get: function get() {
        return Event;
      }
    }, {
      key: "EVENT_KEY",
      get: function get() {
        return EVENT_KEY$6;
      }
    }, {
      key: "DefaultType",
      get: function get() {
        return DefaultType$4;
      }
    }]);

    return Tooltip;
  }();
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */


  $__default['default'].fn[NAME$6] = Tooltip._jQueryInterface;
  $__default['default'].fn[NAME$6].Constructor = Tooltip;

  $__default['default'].fn[NAME$6].noConflict = function () {
    $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6;
    return Tooltip._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$7 = 'popover';
  var VERSION$7 = '4.5.3';
  var DATA_KEY$7 = 'bs.popover';
  var EVENT_KEY$7 = "." + DATA_KEY$7;
  var JQUERY_NO_CONFLICT$7 = $__default['default'].fn[NAME$7];
  var CLASS_PREFIX$1 = 'bs-popover';
  var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');

  var Default$5 = _extends({}, Tooltip.Default, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
  });

  var DefaultType$5 = _extends({}, Tooltip.DefaultType, {
    content: '(string|element|function)'
  });

  var CLASS_NAME_FADE$3 = 'fade';
  var CLASS_NAME_SHOW$5 = 'show';
  var SELECTOR_TITLE = '.popover-header';
  var SELECTOR_CONTENT = '.popover-body';
  var Event$1 = {
    HIDE: "hide" + EVENT_KEY$7,
    HIDDEN: "hidden" + EVENT_KEY$7,
    SHOW: "show" + EVENT_KEY$7,
    SHOWN: "shown" + EVENT_KEY$7,
    INSERTED: "inserted" + EVENT_KEY$7,
    CLICK: "click" + EVENT_KEY$7,
    FOCUSIN: "focusin" + EVENT_KEY$7,
    FOCUSOUT: "focusout" + EVENT_KEY$7,
    MOUSEENTER: "mouseenter" + EVENT_KEY$7,
    MOUSELEAVE: "mouseleave" + EVENT_KEY$7
  };
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Popover = /*#__PURE__*/function (_Tooltip) {
    _inheritsLoose(Popover, _Tooltip);

    function Popover() {
      return _Tooltip.apply(this, arguments) || this;
    }

    var _proto = Popover.prototype;

    // Overrides
    _proto.isWithContent = function isWithContent() {
      return this.getTitle() || this._getContent();
    };

    _proto.addAttachmentClass = function addAttachmentClass(attachment) {
      $__default['default'](this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment);
    };

    _proto.getTipElement = function getTipElement() {
      this.tip = this.tip || $__default['default'](this.config.template)[0];
      return this.tip;
    };

    _proto.setContent = function setContent() {
      var $tip = $__default['default'](this.getTipElement()); // We use append for html objects to maintain js events

      this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle());

      var content = this._getContent();

      if (typeof content === 'function') {
        content = content.call(this.element);
      }

      this.setElementContent($tip.find(SELECTOR_CONTENT), content);
      $tip.removeClass(CLASS_NAME_FADE$3 + " " + CLASS_NAME_SHOW$5);
    } // Private
    ;

    _proto._getContent = function _getContent() {
      return this.element.getAttribute('data-content') || this.config.content;
    };

    _proto._cleanTipClass = function _cleanTipClass() {
      var $tip = $__default['default'](this.getTipElement());
      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);

      if (tabClass !== null && tabClass.length > 0) {
        $tip.removeClass(tabClass.join(''));
      }
    } // Static
    ;

    Popover._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $__default['default'](this).data(DATA_KEY$7);

        var _config = typeof config === 'object' ? config : null;

        if (!data && /dispose|hide/.test(config)) {
          return;
        }

        if (!data) {
          data = new Popover(this, _config);
          $__default['default'](this).data(DATA_KEY$7, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config]();
        }
      });
    };

    _createClass(Popover, null, [{
      key: "VERSION",
      // Getters
      get: function get() {
        return VERSION$7;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$5;
      }
    }, {
      key: "NAME",
      get: function get() {
        return NAME$7;
      }
    }, {
      key: "DATA_KEY",
      get: function get() {
        return DATA_KEY$7;
      }
    }, {
      key: "Event",
      get: function get() {
        return Event$1;
      }
    }, {
      key: "EVENT_KEY",
      get: function get() {
        return EVENT_KEY$7;
      }
    }, {
      key: "DefaultType",
      get: function get() {
        return DefaultType$5;
      }
    }]);

    return Popover;
  }(Tooltip);
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */


  $__default['default'].fn[NAME$7] = Popover._jQueryInterface;
  $__default['default'].fn[NAME$7].Constructor = Popover;

  $__default['default'].fn[NAME$7].noConflict = function () {
    $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7;
    return Popover._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$8 = 'scrollspy';
  var VERSION$8 = '4.5.3';
  var DATA_KEY$8 = 'bs.scrollspy';
  var EVENT_KEY$8 = "." + DATA_KEY$8;
  var DATA_API_KEY$6 = '.data-api';
  var JQUERY_NO_CONFLICT$8 = $__default['default'].fn[NAME$8];
  var Default$6 = {
    offset: 10,
    method: 'auto',
    target: ''
  };
  var DefaultType$6 = {
    offset: 'number',
    method: 'string',
    target: '(string|element)'
  };
  var EVENT_ACTIVATE = "activate" + EVENT_KEY$8;
  var EVENT_SCROLL = "scroll" + EVENT_KEY$8;
  var EVENT_LOAD_DATA_API$2 = "load" + EVENT_KEY$8 + DATA_API_KEY$6;
  var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
  var CLASS_NAME_ACTIVE$2 = 'active';
  var SELECTOR_DATA_SPY = '[data-spy="scroll"]';
  var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
  var SELECTOR_NAV_LINKS = '.nav-link';
  var SELECTOR_NAV_ITEMS = '.nav-item';
  var SELECTOR_LIST_ITEMS = '.list-group-item';
  var SELECTOR_DROPDOWN = '.dropdown';
  var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';
  var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
  var METHOD_OFFSET = 'offset';
  var METHOD_POSITION = 'position';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var ScrollSpy = /*#__PURE__*/function () {
    function ScrollSpy(element, config) {
      var _this = this;

      this._element = element;
      this._scrollElement = element.tagName === 'BODY' ? window : element;
      this._config = this._getConfig(config);
      this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS);
      this._offsets = [];
      this._targets = [];
      this._activeTarget = null;
      this._scrollHeight = 0;
      $__default['default'](this._scrollElement).on(EVENT_SCROLL, function (event) {
        return _this._process(event);
      });
      this.refresh();

      this._process();
    } // Getters


    var _proto = ScrollSpy.prototype;

    // Public
    _proto.refresh = function refresh() {
      var _this2 = this;

      var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
      var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
      this._offsets = [];
      this._targets = [];
      this._scrollHeight = this._getScrollHeight();
      var targets = [].slice.call(document.querySelectorAll(this._selector));
      targets.map(function (element) {
        var target;
        var targetSelector = Util.getSelectorFromElement(element);

        if (targetSelector) {
          target = document.querySelector(targetSelector);
        }

        if (target) {
          var targetBCR = target.getBoundingClientRect();

          if (targetBCR.width || targetBCR.height) {
            // TODO (fat): remove sketch reliance on jQuery position/offset
            return [$__default['default'](target)[offsetMethod]().top + offsetBase, targetSelector];
          }
        }

        return null;
      }).filter(function (item) {
        return item;
      }).sort(function (a, b) {
        return a[0] - b[0];
      }).forEach(function (item) {
        _this2._offsets.push(item[0]);

        _this2._targets.push(item[1]);
      });
    };

    _proto.dispose = function dispose() {
      $__default['default'].removeData(this._element, DATA_KEY$8);
      $__default['default'](this._scrollElement).off(EVENT_KEY$8);
      this._element = null;
      this._scrollElement = null;
      this._config = null;
      this._selector = null;
      this._offsets = null;
      this._targets = null;
      this._activeTarget = null;
      this._scrollHeight = null;
    } // Private
    ;

    _proto._getConfig = function _getConfig(config) {
      config = _extends({}, Default$6, typeof config === 'object' && config ? config : {});

      if (typeof config.target !== 'string' && Util.isElement(config.target)) {
        var id = $__default['default'](config.target).attr('id');

        if (!id) {
          id = Util.getUID(NAME$8);
          $__default['default'](config.target).attr('id', id);
        }

        config.target = "#" + id;
      }

      Util.typeCheckConfig(NAME$8, config, DefaultType$6);
      return config;
    };

    _proto._getScrollTop = function _getScrollTop() {
      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
    };

    _proto._getScrollHeight = function _getScrollHeight() {
      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
    };

    _proto._getOffsetHeight = function _getOffsetHeight() {
      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
    };

    _proto._process = function _process() {
      var scrollTop = this._getScrollTop() + this._config.offset;

      var scrollHeight = this._getScrollHeight();

      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();

      if (this._scrollHeight !== scrollHeight) {
        this.refresh();
      }

      if (scrollTop >= maxScroll) {
        var target = this._targets[this._targets.length - 1];

        if (this._activeTarget !== target) {
          this._activate(target);
        }

        return;
      }

      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
        this._activeTarget = null;

        this._clear();

        return;
      }

      for (var i = this._offsets.length; i--;) {
        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);

        if (isActiveTarget) {
          this._activate(this._targets[i]);
        }
      }
    };

    _proto._activate = function _activate(target) {
      this._activeTarget = target;

      this._clear();

      var queries = this._selector.split(',').map(function (selector) {
        return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
      });

      var $link = $__default['default']([].slice.call(document.querySelectorAll(queries.join(','))));

      if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {
        $link.closest(SELECTOR_DROPDOWN).find(SELECTOR_DROPDOWN_TOGGLE).addClass(CLASS_NAME_ACTIVE$2);
        $link.addClass(CLASS_NAME_ACTIVE$2);
      } else {
        // Set triggered link as active
        $link.addClass(CLASS_NAME_ACTIVE$2); // Set triggered links parents as active
        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor

        $link.parents(SELECTOR_NAV_LIST_GROUP).prev(SELECTOR_NAV_LINKS + ", " + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE$2); // Handle special case when .nav-link is inside .nav-item

        $link.parents(SELECTOR_NAV_LIST_GROUP).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE$2);
      }

      $__default['default'](this._scrollElement).trigger(EVENT_ACTIVATE, {
        relatedTarget: target
      });
    };

    _proto._clear = function _clear() {
      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
        return node.classList.contains(CLASS_NAME_ACTIVE$2);
      }).forEach(function (node) {
        return node.classList.remove(CLASS_NAME_ACTIVE$2);
      });
    } // Static
    ;

    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $__default['default'](this).data(DATA_KEY$8);

        var _config = typeof config === 'object' && config;

        if (!data) {
          data = new ScrollSpy(this, _config);
          $__default['default'](this).data(DATA_KEY$8, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config]();
        }
      });
    };

    _createClass(ScrollSpy, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$8;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$6;
      }
    }]);

    return ScrollSpy;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](window).on(EVENT_LOAD_DATA_API$2, function () {
    var scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY));
    var scrollSpysLength = scrollSpys.length;

    for (var i = scrollSpysLength; i--;) {
      var $spy = $__default['default'](scrollSpys[i]);

      ScrollSpy._jQueryInterface.call($spy, $spy.data());
    }
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$8] = ScrollSpy._jQueryInterface;
  $__default['default'].fn[NAME$8].Constructor = ScrollSpy;

  $__default['default'].fn[NAME$8].noConflict = function () {
    $__default['default'].fn[NAME$8] = JQUERY_NO_CONFLICT$8;
    return ScrollSpy._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$9 = 'tab';
  var VERSION$9 = '4.5.3';
  var DATA_KEY$9 = 'bs.tab';
  var EVENT_KEY$9 = "." + DATA_KEY$9;
  var DATA_API_KEY$7 = '.data-api';
  var JQUERY_NO_CONFLICT$9 = $__default['default'].fn[NAME$9];
  var EVENT_HIDE$3 = "hide" + EVENT_KEY$9;
  var EVENT_HIDDEN$3 = "hidden" + EVENT_KEY$9;
  var EVENT_SHOW$3 = "show" + EVENT_KEY$9;
  var EVENT_SHOWN$3 = "shown" + EVENT_KEY$9;
  var EVENT_CLICK_DATA_API$6 = "click" + EVENT_KEY$9 + DATA_API_KEY$7;
  var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
  var CLASS_NAME_ACTIVE$3 = 'active';
  var CLASS_NAME_DISABLED$1 = 'disabled';
  var CLASS_NAME_FADE$4 = 'fade';
  var CLASS_NAME_SHOW$6 = 'show';
  var SELECTOR_DROPDOWN$1 = '.dropdown';
  var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';
  var SELECTOR_ACTIVE$2 = '.active';
  var SELECTOR_ACTIVE_UL = '> li > .active';
  var SELECTOR_DATA_TOGGLE$4 = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]';
  var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
  var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Tab = /*#__PURE__*/function () {
    function Tab(element) {
      this._element = element;
    } // Getters


    var _proto = Tab.prototype;

    // Public
    _proto.show = function show() {
      var _this = this;

      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default['default'](this._element).hasClass(CLASS_NAME_ACTIVE$3) || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED$1)) {
        return;
      }

      var target;
      var previous;
      var listElement = $__default['default'](this._element).closest(SELECTOR_NAV_LIST_GROUP$1)[0];
      var selector = Util.getSelectorFromElement(this._element);

      if (listElement) {
        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE$2;
        previous = $__default['default'].makeArray($__default['default'](listElement).find(itemSelector));
        previous = previous[previous.length - 1];
      }

      var hideEvent = $__default['default'].Event(EVENT_HIDE$3, {
        relatedTarget: this._element
      });
      var showEvent = $__default['default'].Event(EVENT_SHOW$3, {
        relatedTarget: previous
      });

      if (previous) {
        $__default['default'](previous).trigger(hideEvent);
      }

      $__default['default'](this._element).trigger(showEvent);

      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
        return;
      }

      if (selector) {
        target = document.querySelector(selector);
      }

      this._activate(this._element, listElement);

      var complete = function complete() {
        var hiddenEvent = $__default['default'].Event(EVENT_HIDDEN$3, {
          relatedTarget: _this._element
        });
        var shownEvent = $__default['default'].Event(EVENT_SHOWN$3, {
          relatedTarget: previous
        });
        $__default['default'](previous).trigger(hiddenEvent);
        $__default['default'](_this._element).trigger(shownEvent);
      };

      if (target) {
        this._activate(target, target.parentNode, complete);
      } else {
        complete();
      }
    };

    _proto.dispose = function dispose() {
      $__default['default'].removeData(this._element, DATA_KEY$9);
      this._element = null;
    } // Private
    ;

    _proto._activate = function _activate(element, container, callback) {
      var _this2 = this;

      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default['default'](container).find(SELECTOR_ACTIVE_UL) : $__default['default'](container).children(SELECTOR_ACTIVE$2);
      var active = activeElements[0];
      var isTransitioning = callback && active && $__default['default'](active).hasClass(CLASS_NAME_FADE$4);

      var complete = function complete() {
        return _this2._transitionComplete(element, active, callback);
      };

      if (active && isTransitioning) {
        var transitionDuration = Util.getTransitionDurationFromElement(active);
        $__default['default'](active).removeClass(CLASS_NAME_SHOW$6).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
      } else {
        complete();
      }
    };

    _proto._transitionComplete = function _transitionComplete(element, active, callback) {
      if (active) {
        $__default['default'](active).removeClass(CLASS_NAME_ACTIVE$3);
        var dropdownChild = $__default['default'](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];

        if (dropdownChild) {
          $__default['default'](dropdownChild).removeClass(CLASS_NAME_ACTIVE$3);
        }

        if (active.getAttribute('role') === 'tab') {
          active.setAttribute('aria-selected', false);
        }
      }

      $__default['default'](element).addClass(CLASS_NAME_ACTIVE$3);

      if (element.getAttribute('role') === 'tab') {
        element.setAttribute('aria-selected', true);
      }

      Util.reflow(element);

      if (element.classList.contains(CLASS_NAME_FADE$4)) {
        element.classList.add(CLASS_NAME_SHOW$6);
      }

      if (element.parentNode && $__default['default'](element.parentNode).hasClass(CLASS_NAME_DROPDOWN_MENU)) {
        var dropdownElement = $__default['default'](element).closest(SELECTOR_DROPDOWN$1)[0];

        if (dropdownElement) {
          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE$1));
          $__default['default'](dropdownToggleList).addClass(CLASS_NAME_ACTIVE$3);
        }

        element.setAttribute('aria-expanded', true);
      }

      if (callback) {
        callback();
      }
    } // Static
    ;

    Tab._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var $this = $__default['default'](this);
        var data = $this.data(DATA_KEY$9);

        if (!data) {
          data = new Tab(this);
          $this.data(DATA_KEY$9, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config]();
        }
      });
    };

    _createClass(Tab, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$9;
      }
    }]);

    return Tab;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $__default['default'](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$4, function (event) {
    event.preventDefault();

    Tab._jQueryInterface.call($__default['default'](this), 'show');
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $__default['default'].fn[NAME$9] = Tab._jQueryInterface;
  $__default['default'].fn[NAME$9].Constructor = Tab;

  $__default['default'].fn[NAME$9].noConflict = function () {
    $__default['default'].fn[NAME$9] = JQUERY_NO_CONFLICT$9;
    return Tab._jQueryInterface;
  };

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME$a = 'toast';
  var VERSION$a = '4.5.3';
  var DATA_KEY$a = 'bs.toast';
  var EVENT_KEY$a = "." + DATA_KEY$a;
  var JQUERY_NO_CONFLICT$a = $__default['default'].fn[NAME$a];
  var EVENT_CLICK_DISMISS$1 = "click.dismiss" + EVENT_KEY$a;
  var EVENT_HIDE$4 = "hide" + EVENT_KEY$a;
  var EVENT_HIDDEN$4 = "hidden" + EVENT_KEY$a;
  var EVENT_SHOW$4 = "show" + EVENT_KEY$a;
  var EVENT_SHOWN$4 = "shown" + EVENT_KEY$a;
  var CLASS_NAME_FADE$5 = 'fade';
  var CLASS_NAME_HIDE = 'hide';
  var CLASS_NAME_SHOW$7 = 'show';
  var CLASS_NAME_SHOWING = 'showing';
  var DefaultType$7 = {
    animation: 'boolean',
    autohide: 'boolean',
    delay: 'number'
  };
  var Default$7 = {
    animation: true,
    autohide: true,
    delay: 500
  };
  var SELECTOR_DATA_DISMISS$1 = '[data-dismiss="toast"]';
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Toast = /*#__PURE__*/function () {
    function Toast(element, config) {
      this._element = element;
      this._config = this._getConfig(config);
      this._timeout = null;

      this._setListeners();
    } // Getters


    var _proto = Toast.prototype;

    // Public
    _proto.show = function show() {
      var _this = this;

      var showEvent = $__default['default'].Event(EVENT_SHOW$4);
      $__default['default'](this._element).trigger(showEvent);

      if (showEvent.isDefaultPrevented()) {
        return;
      }

      this._clearTimeout();

      if (this._config.animation) {
        this._element.classList.add(CLASS_NAME_FADE$5);
      }

      var complete = function complete() {
        _this._element.classList.remove(CLASS_NAME_SHOWING);

        _this._element.classList.add(CLASS_NAME_SHOW$7);

        $__default['default'](_this._element).trigger(EVENT_SHOWN$4);

        if (_this._config.autohide) {
          _this._timeout = setTimeout(function () {
            _this.hide();
          }, _this._config.delay);
        }
      };

      this._element.classList.remove(CLASS_NAME_HIDE);

      Util.reflow(this._element);

      this._element.classList.add(CLASS_NAME_SHOWING);

      if (this._config.animation) {
        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
        $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
      } else {
        complete();
      }
    };

    _proto.hide = function hide() {
      if (!this._element.classList.contains(CLASS_NAME_SHOW$7)) {
        return;
      }

      var hideEvent = $__default['default'].Event(EVENT_HIDE$4);
      $__default['default'](this._element).trigger(hideEvent);

      if (hideEvent.isDefaultPrevented()) {
        return;
      }

      this._close();
    };

    _proto.dispose = function dispose() {
      this._clearTimeout();

      if (this._element.classList.contains(CLASS_NAME_SHOW$7)) {
        this._element.classList.remove(CLASS_NAME_SHOW$7);
      }

      $__default['default'](this._element).off(EVENT_CLICK_DISMISS$1);
      $__default['default'].removeData(this._element, DATA_KEY$a);
      this._element = null;
      this._config = null;
    } // Private
    ;

    _proto._getConfig = function _getConfig(config) {
      config = _extends({}, Default$7, $__default['default'](this._element).data(), typeof config === 'object' && config ? config : {});
      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
      return config;
    };

    _proto._setListeners = function _setListeners() {
      var _this2 = this;

      $__default['default'](this._element).on(EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, function () {
        return _this2.hide();
      });
    };

    _proto._close = function _close() {
      var _this3 = this;

      var complete = function complete() {
        _this3._element.classList.add(CLASS_NAME_HIDE);

        $__default['default'](_this3._element).trigger(EVENT_HIDDEN$4);
      };

      this._element.classList.remove(CLASS_NAME_SHOW$7);

      if (this._config.animation) {
        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
        $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
      } else {
        complete();
      }
    };

    _proto._clearTimeout = function _clearTimeout() {
      clearTimeout(this._timeout);
      this._timeout = null;
    } // Static
    ;

    Toast._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var $element = $__default['default'](this);
        var data = $element.data(DATA_KEY$a);

        var _config = typeof config === 'object' && config;

        if (!data) {
          data = new Toast(this, _config);
          $element.data(DATA_KEY$a, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
          }

          data[config](this);
        }
      });
    };

    _createClass(Toast, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$a;
      }
    }, {
      key: "DefaultType",
      get: function get() {
        return DefaultType$7;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$7;
      }
    }]);

    return Toast;
  }();
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */


  $__default['default'].fn[NAME$a] = Toast._jQueryInterface;
  $__default['default'].fn[NAME$a].Constructor = Toast;

  $__default['default'].fn[NAME$a].noConflict = function () {
    $__default['default'].fn[NAME$a] = JQUERY_NO_CONFLICT$a;
    return Toast._jQueryInterface;
  };

  exports.Alert = Alert;
  exports.Button = Button;
  exports.Carousel = Carousel;
  exports.Collapse = Collapse;
  exports.Dropdown = Dropdown;
  exports.Modal = Modal;
  exports.Popover = Popover;
  exports.Scrollspy = ScrollSpy;
  exports.Tab = Tab;
  exports.Toast = Toast;
  exports.Tooltip = Tooltip;
  exports.Util = Util;

  Object.defineProperty(exports, '__esModule', { value: true });

})));
//# sourceMappingURL=bootstrap.js.map


/***/ }),

/***/ "./node_modules/jquery/dist/jquery.js":
/*!********************************************!*\
  !*** ./node_modules/jquery/dist/jquery.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
 * jQuery JavaScript Library v3.5.1
 * https://jquery.com/
 *
 * Includes Sizzle.js
 * https://sizzlejs.com/
 *
 * Copyright JS Foundation and other contributors
 * Released under the MIT license
 * https://jquery.org/license
 *
 * Date: 2020-05-04T22:49Z
 */
( function( global, factory ) {

	"use strict";

	if (  true && typeof module.exports === "object" ) {

		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}

// Pass this if window is not defined yet
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
// enough that all such attempts are guarded in a try block.
"use strict";

var arr = [];

var getProto = Object.getPrototypeOf;

var slice = arr.slice;

var flat = arr.flat ? function( array ) {
	return arr.flat.call( array );
} : function( array ) {
	return arr.concat.apply( [], array );
};


var push = arr.push;

var indexOf = arr.indexOf;

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;

var fnToString = hasOwn.toString;

var ObjectFunctionString = fnToString.call( Object );

var support = {};

var isFunction = function isFunction( obj ) {

      // Support: Chrome <=57, Firefox <=52
      // In some browsers, typeof returns "function" for HTML <object> elements
      // (i.e., `typeof document.createElement( "object" ) === "function"`).
      // We don't want to classify *any* DOM node as a function.
      return typeof obj === "function" && typeof obj.nodeType !== "number";
  };


var isWindow = function isWindow( obj ) {
		return obj != null && obj === obj.window;
	};


var document = window.document;



	var preservedScriptAttributes = {
		type: true,
		src: true,
		nonce: true,
		noModule: true
	};

	function DOMEval( code, node, doc ) {
		doc = doc || document;

		var i, val,
			script = doc.createElement( "script" );

		script.text = code;
		if ( node ) {
			for ( i in preservedScriptAttributes ) {

				// Support: Firefox 64+, Edge 18+
				// Some browsers don't support the "nonce" property on scripts.
				// On the other hand, just using `getAttribute` is not enough as
				// the `nonce` attribute is reset to an empty string whenever it
				// becomes browsing-context connected.
				// See https://github.com/whatwg/html/issues/2369
				// See https://html.spec.whatwg.org/#nonce-attributes
				// The `node.getAttribute` check was added for the sake of
				// `jQuery.globalEval` so that it can fake a nonce-containing node
				// via an object.
				val = node[ i ] || node.getAttribute && node.getAttribute( i );
				if ( val ) {
					script.setAttribute( i, val );
				}
			}
		}
		doc.head.appendChild( script ).parentNode.removeChild( script );
	}


function toType( obj ) {
	if ( obj == null ) {
		return obj + "";
	}

	// Support: Android <=2.3 only (functionish RegExp)
	return typeof obj === "object" || typeof obj === "function" ?
		class2type[ toString.call( obj ) ] || "object" :
		typeof obj;
}
/* global Symbol */
// Defining this global in .eslintrc.json would create a danger of using the global
// unguarded in another place, it seems safer to define global only for this module



var
	version = "3.5.1",

	// Define a local copy of jQuery
	jQuery = function( selector, context ) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init( selector, context );
	};

jQuery.fn = jQuery.prototype = {

	// The current version of jQuery being used
	jquery: version,

	constructor: jQuery,

	// The default length of a jQuery object is 0
	length: 0,

	toArray: function() {
		return slice.call( this );
	},

	// Get the Nth element in the matched element set OR
	// Get the whole matched element set as a clean array
	get: function( num ) {

		// Return all the elements in a clean array
		if ( num == null ) {
			return slice.call( this );
		}

		// Return just the one element from the set
		return num < 0 ? this[ num + this.length ] : this[ num ];
	},

	// Take an array of elements and push it onto the stack
	// (returning the new matched element set)
	pushStack: function( elems ) {

		// Build a new jQuery matched element set
		var ret = jQuery.merge( this.constructor(), elems );

		// Add the old object onto the stack (as a reference)
		ret.prevObject = this;

		// Return the newly-formed element set
		return ret;
	},

	// Execute a callback for every element in the matched set.
	each: function( callback ) {
		return jQuery.each( this, callback );
	},

	map: function( callback ) {
		return this.pushStack( jQuery.map( this, function( elem, i ) {
			return callback.call( elem, i, elem );
		} ) );
	},

	slice: function() {
		return this.pushStack( slice.apply( this, arguments ) );
	},

	first: function() {
		return this.eq( 0 );
	},

	last: function() {
		return this.eq( -1 );
	},

	even: function() {
		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
			return ( i + 1 ) % 2;
		} ) );
	},

	odd: function() {
		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
			return i % 2;
		} ) );
	},

	eq: function( i ) {
		var len = this.length,
			j = +i + ( i < 0 ? len : 0 );
		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
	},

	end: function() {
		return this.prevObject || this.constructor();
	},

	// For internal use only.
	// Behaves like an Array's method, not like a jQuery method.
	push: push,
	sort: arr.sort,
	splice: arr.splice
};

jQuery.extend = jQuery.fn.extend = function() {
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[ 0 ] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// Skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !isFunction( target ) ) {
		target = {};
	}

	// Extend jQuery itself if only one argument is passed
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {

		// Only deal with non-null/undefined values
		if ( ( options = arguments[ i ] ) != null ) {

			// Extend the base object
			for ( name in options ) {
				copy = options[ name ];

				// Prevent Object.prototype pollution
				// Prevent never-ending loop
				if ( name === "__proto__" || target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
					( copyIsArray = Array.isArray( copy ) ) ) ) {
					src = target[ name ];

					// Ensure proper type for the source value
					if ( copyIsArray && !Array.isArray( src ) ) {
						clone = [];
					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
						clone = {};
					} else {
						clone = src;
					}
					copyIsArray = false;

					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

jQuery.extend( {

	// Unique for each copy of jQuery on the page
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

	// Assume jQuery is ready without the ready module
	isReady: true,

	error: function( msg ) {
		throw new Error( msg );
	},

	noop: function() {},

	isPlainObject: function( obj ) {
		var proto, Ctor;

		// Detect obvious negatives
		// Use toString instead of jQuery.type to catch host objects
		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
			return false;
		}

		proto = getProto( obj );

		// Objects with no prototype (e.g., `Object.create( null )`) are plain
		if ( !proto ) {
			return true;
		}

		// Objects with prototype are plain iff they were constructed by a global Object function
		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
	},

	isEmptyObject: function( obj ) {
		var name;

		for ( name in obj ) {
			return false;
		}
		return true;
	},

	// Evaluates a script in a provided context; falls back to the global one
	// if not specified.
	globalEval: function( code, options, doc ) {
		DOMEval( code, { nonce: options && options.nonce }, doc );
	},

	each: function( obj, callback ) {
		var length, i = 0;

		if ( isArrayLike( obj ) ) {
			length = obj.length;
			for ( ; i < length; i++ ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		} else {
			for ( i in obj ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		}

		return obj;
	},

	// results is for internal usage only
	makeArray: function( arr, results ) {
		var ret = results || [];

		if ( arr != null ) {
			if ( isArrayLike( Object( arr ) ) ) {
				jQuery.merge( ret,
					typeof arr === "string" ?
					[ arr ] : arr
				);
			} else {
				push.call( ret, arr );
			}
		}

		return ret;
	},

	inArray: function( elem, arr, i ) {
		return arr == null ? -1 : indexOf.call( arr, elem, i );
	},

	// Support: Android <=4.0 only, PhantomJS 1 only
	// push.apply(_, arraylike) throws on ancient WebKit
	merge: function( first, second ) {
		var len = +second.length,
			j = 0,
			i = first.length;

		for ( ; j < len; j++ ) {
			first[ i++ ] = second[ j ];
		}

		first.length = i;

		return first;
	},

	grep: function( elems, callback, invert ) {
		var callbackInverse,
			matches = [],
			i = 0,
			length = elems.length,
			callbackExpect = !invert;

		// Go through the array, only saving the items
		// that pass the validator function
		for ( ; i < length; i++ ) {
			callbackInverse = !callback( elems[ i ], i );
			if ( callbackInverse !== callbackExpect ) {
				matches.push( elems[ i ] );
			}
		}

		return matches;
	},

	// arg is for internal usage only
	map: function( elems, callback, arg ) {
		var length, value,
			i = 0,
			ret = [];

		// Go through the array, translating each of the items to their new values
		if ( isArrayLike( elems ) ) {
			length = elems.length;
			for ( ; i < length; i++ ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}

		// Go through every key on the object,
		} else {
			for ( i in elems ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		}

		// Flatten any nested arrays
		return flat( ret );
	},

	// A global GUID counter for objects
	guid: 1,

	// jQuery.support is not used in Core but other projects attach their
	// properties to it so it needs to exist.
	support: support
} );

if ( typeof Symbol === "function" ) {
	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
}

// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( _i, name ) {
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );

function isArrayLike( obj ) {

	// Support: real iOS 8.2 only (not reproducible in simulator)
	// `in` check used to prevent JIT error (gh-2145)
	// hasOwn isn't used here due to false negatives
	// regarding Nodelist length in IE
	var length = !!obj && "length" in obj && obj.length,
		type = toType( obj );

	if ( isFunction( obj ) || isWindow( obj ) ) {
		return false;
	}

	return type === "array" || length === 0 ||
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
 * Sizzle CSS Selector Engine v2.3.5
 * https://sizzlejs.com/
 *
 * Copyright JS Foundation and other contributors
 * Released under the MIT license
 * https://js.foundation/
 *
 * Date: 2020-03-14
 */
( function( window ) {
var i,
	support,
	Expr,
	getText,
	isXML,
	tokenize,
	compile,
	select,
	outermostContext,
	sortInput,
	hasDuplicate,

	// Local document vars
	setDocument,
	document,
	docElem,
	documentIsHTML,
	rbuggyQSA,
	rbuggyMatches,
	matches,
	contains,

	// Instance-specific data
	expando = "sizzle" + 1 * new Date(),
	preferredDoc = window.document,
	dirruns = 0,
	done = 0,
	classCache = createCache(),
	tokenCache = createCache(),
	compilerCache = createCache(),
	nonnativeSelectorCache = createCache(),
	sortOrder = function( a, b ) {
		if ( a === b ) {
			hasDuplicate = true;
		}
		return 0;
	},

	// Instance methods
	hasOwn = ( {} ).hasOwnProperty,
	arr = [],
	pop = arr.pop,
	pushNative = arr.push,
	push = arr.push,
	slice = arr.slice,

	// Use a stripped-down indexOf as it's faster than native
	// https://jsperf.com/thor-indexof-vs-for/5
	indexOf = function( list, elem ) {
		var i = 0,
			len = list.length;
		for ( ; i < len; i++ ) {
			if ( list[ i ] === elem ) {
				return i;
			}
		}
		return -1;
	},

	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
		"ismap|loop|multiple|open|readonly|required|scoped",

	// Regular expressions

	// http://www.w3.org/TR/css3-selectors/#whitespace
	whitespace = "[\\x20\\t\\r\\n\\f]",

	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",

	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +

		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +

		// "Attribute values must be CSS identifiers [capture 5]
		// or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
		whitespace + "*\\]",

	pseudos = ":(" + identifier + ")(?:\\((" +

		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +

		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +

		// 3. anything else (capture 2)
		".*" +
		")\\)|)",

	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
	rwhitespace = new RegExp( whitespace + "+", "g" ),
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
		whitespace + "+$", "g" ),

	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
		"*" ),
	rdescend = new RegExp( whitespace + "|>" ),

	rpseudo = new RegExp( pseudos ),
	ridentifier = new RegExp( "^" + identifier + "$" ),

	matchExpr = {
		"ID": new RegExp( "^#(" + identifier + ")" ),
		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
		"ATTR": new RegExp( "^" + attributes ),
		"PSEUDO": new RegExp( "^" + pseudos ),
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),

		// For use in libraries implementing .is()
		// We use this for POS matching in `select`
		"needsContext": new RegExp( "^" + whitespace +
			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
	},

	rhtml = /HTML$/i,
	rinputs = /^(?:input|select|textarea|button)$/i,
	rheader = /^h\d$/i,

	rnative = /^[^{]+\{\s*\[native \w/,

	// Easily-parseable/retrievable ID or TAG or CLASS selectors
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

	rsibling = /[+~]/,

	// CSS escapes
	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
	funescape = function( escape, nonHex ) {
		var high = "0x" + escape.slice( 1 ) - 0x10000;

		return nonHex ?

			// Strip the backslash prefix from a non-hex escape sequence
			nonHex :

			// Replace a hexadecimal escape sequence with the encoded Unicode code point
			// Support: IE <=11+
			// For values outside the Basic Multilingual Plane (BMP), manually construct a
			// surrogate pair
			high < 0 ?
				String.fromCharCode( high + 0x10000 ) :
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
	},

	// CSS string/identifier serialization
	// https://drafts.csswg.org/cssom/#common-serializing-idioms
	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
	fcssescape = function( ch, asCodePoint ) {
		if ( asCodePoint ) {

			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
			if ( ch === "\0" ) {
				return "\uFFFD";
			}

			// Control characters and (dependent upon position) numbers get escaped as code points
			return ch.slice( 0, -1 ) + "\\" +
				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
		}

		// Other potentially-special ASCII characters get backslash-escaped
		return "\\" + ch;
	},

	// Used for iframes
	// See setDocument()
	// Removing the function wrapper causes a "Permission Denied"
	// error in IE
	unloadHandler = function() {
		setDocument();
	},

	inDisabledFieldset = addCombinator(
		function( elem ) {
			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
		},
		{ dir: "parentNode", next: "legend" }
	);

// Optimize for push.apply( _, NodeList )
try {
	push.apply(
		( arr = slice.call( preferredDoc.childNodes ) ),
		preferredDoc.childNodes
	);

	// Support: Android<4.0
	// Detect silently failing push.apply
	// eslint-disable-next-line no-unused-expressions
	arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
	push = { apply: arr.length ?

		// Leverage slice if possible
		function( target, els ) {
			pushNative.apply( target, slice.call( els ) );
		} :

		// Support: IE<9
		// Otherwise append directly
		function( target, els ) {
			var j = target.length,
				i = 0;

			// Can't trust NodeList.length
			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
			target.length = j - 1;
		}
	};
}

function Sizzle( selector, context, results, seed ) {
	var m, i, elem, nid, match, groups, newSelector,
		newContext = context && context.ownerDocument,

		// nodeType defaults to 9, since context defaults to document
		nodeType = context ? context.nodeType : 9;

	results = results || [];

	// Return early from calls with invalid selector or context
	if ( typeof selector !== "string" || !selector ||
		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {

		return results;
	}

	// Try to shortcut find operations (as opposed to filters) in HTML documents
	if ( !seed ) {
		setDocument( context );
		context = context || document;

		if ( documentIsHTML ) {

			// If the selector is sufficiently simple, try using a "get*By*" DOM method
			// (excepting DocumentFragment context, where the methods don't exist)
			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {

				// ID selector
				if ( ( m = match[ 1 ] ) ) {

					// Document context
					if ( nodeType === 9 ) {
						if ( ( elem = context.getElementById( m ) ) ) {

							// Support: IE, Opera, Webkit
							// TODO: identify versions
							// getElementById can match elements by name instead of ID
							if ( elem.id === m ) {
								results.push( elem );
								return results;
							}
						} else {
							return results;
						}

					// Element context
					} else {

						// Support: IE, Opera, Webkit
						// TODO: identify versions
						// getElementById can match elements by name instead of ID
						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
							contains( context, elem ) &&
							elem.id === m ) {

							results.push( elem );
							return results;
						}
					}

				// Type selector
				} else if ( match[ 2 ] ) {
					push.apply( results, context.getElementsByTagName( selector ) );
					return results;

				// Class selector
				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
					context.getElementsByClassName ) {

					push.apply( results, context.getElementsByClassName( m ) );
					return results;
				}
			}

			// Take advantage of querySelectorAll
			if ( support.qsa &&
				!nonnativeSelectorCache[ selector + " " ] &&
				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&

				// Support: IE 8 only
				// Exclude object elements
				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {

				newSelector = selector;
				newContext = context;

				// qSA considers elements outside a scoping root when evaluating child or
				// descendant combinators, which is not what we want.
				// In such cases, we work around the behavior by prefixing every selector in the
				// list with an ID selector referencing the scope context.
				// The technique has to be used as well when a leading combinator is used
				// as such selectors are not recognized by querySelectorAll.
				// Thanks to Andrew Dupont for this technique.
				if ( nodeType === 1 &&
					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {

					// Expand context for sibling selectors
					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
						context;

					// We can use :scope instead of the ID hack if the browser
					// supports it & if we're not changing the context.
					if ( newContext !== context || !support.scope ) {

						// Capture the context ID, setting it first if necessary
						if ( ( nid = context.getAttribute( "id" ) ) ) {
							nid = nid.replace( rcssescape, fcssescape );
						} else {
							context.setAttribute( "id", ( nid = expando ) );
						}
					}

					// Prefix every selector in the list
					groups = tokenize( selector );
					i = groups.length;
					while ( i-- ) {
						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
							toSelector( groups[ i ] );
					}
					newSelector = groups.join( "," );
				}

				try {
					push.apply( results,
						newContext.querySelectorAll( newSelector )
					);
					return results;
				} catch ( qsaError ) {
					nonnativeSelectorCache( selector, true );
				} finally {
					if ( nid === expando ) {
						context.removeAttribute( "id" );
					}
				}
			}
		}
	}

	// All others
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
}

/**
 * Create key-value caches of limited size
 * @returns {function(string, object)} Returns the Object data after storing it on itself with
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 *	deleting the oldest entry
 */
function createCache() {
	var keys = [];

	function cache( key, value ) {

		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
		if ( keys.push( key + " " ) > Expr.cacheLength ) {

			// Only keep the most recent entries
			delete cache[ keys.shift() ];
		}
		return ( cache[ key + " " ] = value );
	}
	return cache;
}

/**
 * Mark a function for special use by Sizzle
 * @param {Function} fn The function to mark
 */
function markFunction( fn ) {
	fn[ expando ] = true;
	return fn;
}

/**
 * Support testing using an element
 * @param {Function} fn Passed the created element and returns a boolean result
 */
function assert( fn ) {
	var el = document.createElement( "fieldset" );

	try {
		return !!fn( el );
	} catch ( e ) {
		return false;
	} finally {

		// Remove from its parent by default
		if ( el.parentNode ) {
			el.parentNode.removeChild( el );
		}

		// release memory in IE
		el = null;
	}
}

/**
 * Adds the same handler for all of the specified attrs
 * @param {String} attrs Pipe-separated list of attributes
 * @param {Function} handler The method that will be applied
 */
function addHandle( attrs, handler ) {
	var arr = attrs.split( "|" ),
		i = arr.length;

	while ( i-- ) {
		Expr.attrHandle[ arr[ i ] ] = handler;
	}
}

/**
 * Checks document order of two siblings
 * @param {Element} a
 * @param {Element} b
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 */
function siblingCheck( a, b ) {
	var cur = b && a,
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
			a.sourceIndex - b.sourceIndex;

	// Use IE sourceIndex if available on both nodes
	if ( diff ) {
		return diff;
	}

	// Check if b follows a
	if ( cur ) {
		while ( ( cur = cur.nextSibling ) ) {
			if ( cur === b ) {
				return -1;
			}
		}
	}

	return a ? 1 : -1;
}

/**
 * Returns a function to use in pseudos for input types
 * @param {String} type
 */
function createInputPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return name === "input" && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for buttons
 * @param {String} type
 */
function createButtonPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return ( name === "input" || name === "button" ) && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for :enabled/:disabled
 * @param {Boolean} disabled true for :disabled; false for :enabled
 */
function createDisabledPseudo( disabled ) {

	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
	return function( elem ) {

		// Only certain elements can match :enabled or :disabled
		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
		if ( "form" in elem ) {

			// Check for inherited disabledness on relevant non-disabled elements:
			// * listed form-associated elements in a disabled fieldset
			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
			// * option elements in a disabled optgroup
			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
			// All such elements have a "form" property.
			if ( elem.parentNode && elem.disabled === false ) {

				// Option elements defer to a parent optgroup if present
				if ( "label" in elem ) {
					if ( "label" in elem.parentNode ) {
						return elem.parentNode.disabled === disabled;
					} else {
						return elem.disabled === disabled;
					}
				}

				// Support: IE 6 - 11
				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
				return elem.isDisabled === disabled ||

					// Where there is no isDisabled, check manually
					/* jshint -W018 */
					elem.isDisabled !== !disabled &&
					inDisabledFieldset( elem ) === disabled;
			}

			return elem.disabled === disabled;

		// Try to winnow out elements that can't be disabled before trusting the disabled property.
		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
		// even exist on them, let alone have a boolean value.
		} else if ( "label" in elem ) {
			return elem.disabled === disabled;
		}

		// Remaining elements are neither :enabled nor :disabled
		return false;
	};
}

/**
 * Returns a function to use in pseudos for positionals
 * @param {Function} fn
 */
function createPositionalPseudo( fn ) {
	return markFunction( function( argument ) {
		argument = +argument;
		return markFunction( function( seed, matches ) {
			var j,
				matchIndexes = fn( [], seed.length, argument ),
				i = matchIndexes.length;

			// Match elements found at the specified indexes
			while ( i-- ) {
				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
					seed[ j ] = !( matches[ j ] = seed[ j ] );
				}
			}
		} );
	} );
}

/**
 * Checks a node for validity as a Sizzle context
 * @param {Element|Object=} context
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 */
function testContext( context ) {
	return context && typeof context.getElementsByTagName !== "undefined" && context;
}

// Expose support vars for convenience
support = Sizzle.support = {};

/**
 * Detects XML nodes
 * @param {Element|Object} elem An element or a document
 * @returns {Boolean} True iff elem is a non-HTML XML node
 */
isXML = Sizzle.isXML = function( elem ) {
	var namespace = elem.namespaceURI,
		docElem = ( elem.ownerDocument || elem ).documentElement;

	// Support: IE <=8
	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
	// https://bugs.jquery.com/ticket/4833
	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
};

/**
 * Sets document-related variables once based on the current document
 * @param {Element|Object} [doc] An element or document object to use to set the document
 * @returns {Object} Returns the current document
 */
setDocument = Sizzle.setDocument = function( node ) {
	var hasCompare, subWindow,
		doc = node ? node.ownerDocument || node : preferredDoc;

	// Return early if doc is invalid or already selected
	// Support: IE 11+, Edge 17 - 18+
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
	// two documents; shallow comparisons work.
	// eslint-disable-next-line eqeqeq
	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
		return document;
	}

	// Update global variables
	document = doc;
	docElem = document.documentElement;
	documentIsHTML = !isXML( document );

	// Support: IE 9 - 11+, Edge 12 - 18+
	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
	// Support: IE 11+, Edge 17 - 18+
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
	// two documents; shallow comparisons work.
	// eslint-disable-next-line eqeqeq
	if ( preferredDoc != document &&
		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {

		// Support: IE 11, Edge
		if ( subWindow.addEventListener ) {
			subWindow.addEventListener( "unload", unloadHandler, false );

		// Support: IE 9 - 10 only
		} else if ( subWindow.attachEvent ) {
			subWindow.attachEvent( "onunload", unloadHandler );
		}
	}

	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
	// IE/Edge & older browsers don't support the :scope pseudo-class.
	// Support: Safari 6.0 only
	// Safari 6.0 supports :scope but it's an alias of :root there.
	support.scope = assert( function( el ) {
		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
		return typeof el.querySelectorAll !== "undefined" &&
			!el.querySelectorAll( ":scope fieldset div" ).length;
	} );

	/* Attributes
	---------------------------------------------------------------------- */

	// Support: IE<8
	// Verify that getAttribute really returns attributes and not properties
	// (excepting IE8 booleans)
	support.attributes = assert( function( el ) {
		el.className = "i";
		return !el.getAttribute( "className" );
	} );

	/* getElement(s)By*
	---------------------------------------------------------------------- */

	// Check if getElementsByTagName("*") returns only elements
	support.getElementsByTagName = assert( function( el ) {
		el.appendChild( document.createComment( "" ) );
		return !el.getElementsByTagName( "*" ).length;
	} );

	// Support: IE<9
	support.getElementsByClassName = rnative.test( document.getElementsByClassName );

	// Support: IE<10
	// Check if getElementById returns elements by name
	// The broken getElementById methods don't pick up programmatically-set names,
	// so use a roundabout getElementsByName test
	support.getById = assert( function( el ) {
		docElem.appendChild( el ).id = expando;
		return !document.getElementsByName || !document.getElementsByName( expando ).length;
	} );

	// ID filter and find
	if ( support.getById ) {
		Expr.filter[ "ID" ] = function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				return elem.getAttribute( "id" ) === attrId;
			};
		};
		Expr.find[ "ID" ] = function( id, context ) {
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
				var elem = context.getElementById( id );
				return elem ? [ elem ] : [];
			}
		};
	} else {
		Expr.filter[ "ID" ] =  function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				var node = typeof elem.getAttributeNode !== "undefined" &&
					elem.getAttributeNode( "id" );
				return node && node.value === attrId;
			};
		};

		// Support: IE 6 - 7 only
		// getElementById is not reliable as a find shortcut
		Expr.find[ "ID" ] = function( id, context ) {
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
				var node, i, elems,
					elem = context.getElementById( id );

				if ( elem ) {

					// Verify the id attribute
					node = elem.getAttributeNode( "id" );
					if ( node && node.value === id ) {
						return [ elem ];
					}

					// Fall back on getElementsByName
					elems = context.getElementsByName( id );
					i = 0;
					while ( ( elem = elems[ i++ ] ) ) {
						node = elem.getAttributeNode( "id" );
						if ( node && node.value === id ) {
							return [ elem ];
						}
					}
				}

				return [];
			}
		};
	}

	// Tag
	Expr.find[ "TAG" ] = support.getElementsByTagName ?
		function( tag, context ) {
			if ( typeof context.getElementsByTagName !== "undefined" ) {
				return context.getElementsByTagName( tag );

			// DocumentFragment nodes don't have gEBTN
			} else if ( support.qsa ) {
				return context.querySelectorAll( tag );
			}
		} :

		function( tag, context ) {
			var elem,
				tmp = [],
				i = 0,

				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName( tag );

			// Filter out possible comments
			if ( tag === "*" ) {
				while ( ( elem = results[ i++ ] ) ) {
					if ( elem.nodeType === 1 ) {
						tmp.push( elem );
					}
				}

				return tmp;
			}
			return results;
		};

	// Class
	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
			return context.getElementsByClassName( className );
		}
	};

	/* QSA/matchesSelector
	---------------------------------------------------------------------- */

	// QSA and matchesSelector support

	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
	rbuggyMatches = [];

	// qSa(:focus) reports false when true (Chrome 21)
	// We allow this because of a bug in IE8/9 that throws an error
	// whenever `document.activeElement` is accessed on an iframe
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
	// See https://bugs.jquery.com/ticket/13378
	rbuggyQSA = [];

	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {

		// Build QSA regex
		// Regex strategy adopted from Diego Perini
		assert( function( el ) {

			var input;

			// Select is set to empty string on purpose
			// This is to test IE's treatment of not explicitly
			// setting a boolean content attribute,
			// since its presence should be enough
			// https://bugs.jquery.com/ticket/12359
			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
				"<option selected=''></option></select>";

			// Support: IE8, Opera 11-12.16
			// Nothing should be selected when empty strings follow ^= or $= or *=
			// The test attribute must be unknown in Opera but "safe" for WinRT
			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
			}

			// Support: IE8
			// Boolean attributes and "value" are not treated correctly
			if ( !el.querySelectorAll( "[selected]" ).length ) {
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
			}

			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
				rbuggyQSA.push( "~=" );
			}

			// Support: IE 11+, Edge 15 - 18+
			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
			// Adding a temporary attribute to the document before the selection works
			// around the issue.
			// Interestingly, IE 10 & older don't seem to have the issue.
			input = document.createElement( "input" );
			input.setAttribute( "name", "" );
			el.appendChild( input );
			if ( !el.querySelectorAll( "[name='']" ).length ) {
				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
					whitespace + "*(?:''|\"\")" );
			}

			// Webkit/Opera - :checked should return selected option elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			// IE8 throws error here and will not see later tests
			if ( !el.querySelectorAll( ":checked" ).length ) {
				rbuggyQSA.push( ":checked" );
			}

			// Support: Safari 8+, iOS 8+
			// https://bugs.webkit.org/show_bug.cgi?id=136851
			// In-page `selector#id sibling-combinator selector` fails
			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
				rbuggyQSA.push( ".#.+[+~]" );
			}

			// Support: Firefox <=3.6 - 5 only
			// Old Firefox doesn't throw on a badly-escaped identifier.
			el.querySelectorAll( "\\\f" );
			rbuggyQSA.push( "[\\r\\n\\f]" );
		} );

		assert( function( el ) {
			el.innerHTML = "<a href='' disabled='disabled'></a>" +
				"<select disabled='disabled'><option/></select>";

			// Support: Windows 8 Native Apps
			// The type and name attributes are restricted during .innerHTML assignment
			var input = document.createElement( "input" );
			input.setAttribute( "type", "hidden" );
			el.appendChild( input ).setAttribute( "name", "D" );

			// Support: IE8
			// Enforce case-sensitivity of name attribute
			if ( el.querySelectorAll( "[name=d]" ).length ) {
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
			}

			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
			// IE8 throws error here and will not see later tests
			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
				rbuggyQSA.push( ":enabled", ":disabled" );
			}

			// Support: IE9-11+
			// IE's :disabled selector does not pick up the children of disabled fieldsets
			docElem.appendChild( el ).disabled = true;
			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
				rbuggyQSA.push( ":enabled", ":disabled" );
			}

			// Support: Opera 10 - 11 only
			// Opera 10-11 does not throw on post-comma invalid pseudos
			el.querySelectorAll( "*,:x" );
			rbuggyQSA.push( ",.*:" );
		} );
	}

	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
		docElem.webkitMatchesSelector ||
		docElem.mozMatchesSelector ||
		docElem.oMatchesSelector ||
		docElem.msMatchesSelector ) ) ) ) {

		assert( function( el ) {

			// Check to see if it's possible to do matchesSelector
			// on a disconnected node (IE 9)
			support.disconnectedMatch = matches.call( el, "*" );

			// This should fail with an exception
			// Gecko does not error, returns false instead
			matches.call( el, "[s!='']:x" );
			rbuggyMatches.push( "!=", pseudos );
		} );
	}

	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );

	/* Contains
	---------------------------------------------------------------------- */
	hasCompare = rnative.test( docElem.compareDocumentPosition );

	// Element contains another
	// Purposefully self-exclusive
	// As in, an element does not contain itself
	contains = hasCompare || rnative.test( docElem.contains ) ?
		function( a, b ) {
			var adown = a.nodeType === 9 ? a.documentElement : a,
				bup = b && b.parentNode;
			return a === bup || !!( bup && bup.nodeType === 1 && (
				adown.contains ?
					adown.contains( bup ) :
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
			) );
		} :
		function( a, b ) {
			if ( b ) {
				while ( ( b = b.parentNode ) ) {
					if ( b === a ) {
						return true;
					}
				}
			}
			return false;
		};

	/* Sorting
	---------------------------------------------------------------------- */

	// Document order sorting
	sortOrder = hasCompare ?
	function( a, b ) {

		// Flag for duplicate removal
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		// Sort on method existence if only one input has compareDocumentPosition
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
		if ( compare ) {
			return compare;
		}

		// Calculate position if both inputs belong to the same document
		// Support: IE 11+, Edge 17 - 18+
		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
		// two documents; shallow comparisons work.
		// eslint-disable-next-line eqeqeq
		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
			a.compareDocumentPosition( b ) :

			// Otherwise we know they are disconnected
			1;

		// Disconnected nodes
		if ( compare & 1 ||
			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {

			// Choose the first element that is related to our preferred document
			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			// eslint-disable-next-line eqeqeq
			if ( a == document || a.ownerDocument == preferredDoc &&
				contains( preferredDoc, a ) ) {
				return -1;
			}

			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			// eslint-disable-next-line eqeqeq
			if ( b == document || b.ownerDocument == preferredDoc &&
				contains( preferredDoc, b ) ) {
				return 1;
			}

			// Maintain original order
			return sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;
		}

		return compare & 4 ? -1 : 1;
	} :
	function( a, b ) {

		// Exit early if the nodes are identical
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		var cur,
			i = 0,
			aup = a.parentNode,
			bup = b.parentNode,
			ap = [ a ],
			bp = [ b ];

		// Parentless nodes are either documents or disconnected
		if ( !aup || !bup ) {

			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			/* eslint-disable eqeqeq */
			return a == document ? -1 :
				b == document ? 1 :
				/* eslint-enable eqeqeq */
				aup ? -1 :
				bup ? 1 :
				sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;

		// If the nodes are siblings, we can do a quick check
		} else if ( aup === bup ) {
			return siblingCheck( a, b );
		}

		// Otherwise we need full lists of their ancestors for comparison
		cur = a;
		while ( ( cur = cur.parentNode ) ) {
			ap.unshift( cur );
		}
		cur = b;
		while ( ( cur = cur.parentNode ) ) {
			bp.unshift( cur );
		}

		// Walk down the tree looking for a discrepancy
		while ( ap[ i ] === bp[ i ] ) {
			i++;
		}

		return i ?

			// Do a sibling check if the nodes have a common ancestor
			siblingCheck( ap[ i ], bp[ i ] ) :

			// Otherwise nodes in our document sort first
			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			/* eslint-disable eqeqeq */
			ap[ i ] == preferredDoc ? -1 :
			bp[ i ] == preferredDoc ? 1 :
			/* eslint-enable eqeqeq */
			0;
	};

	return document;
};

Sizzle.matches = function( expr, elements ) {
	return Sizzle( expr, null, null, elements );
};

Sizzle.matchesSelector = function( elem, expr ) {
	setDocument( elem );

	if ( support.matchesSelector && documentIsHTML &&
		!nonnativeSelectorCache[ expr + " " ] &&
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {

		try {
			var ret = matches.call( elem, expr );

			// IE 9's matchesSelector returns false on disconnected nodes
			if ( ret || support.disconnectedMatch ||

				// As well, disconnected nodes are said to be in a document
				// fragment in IE 9
				elem.document && elem.document.nodeType !== 11 ) {
				return ret;
			}
		} catch ( e ) {
			nonnativeSelectorCache( expr, true );
		}
	}

	return Sizzle( expr, document, null, [ elem ] ).length > 0;
};

Sizzle.contains = function( context, elem ) {

	// Set document vars if needed
	// Support: IE 11+, Edge 17 - 18+
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
	// two documents; shallow comparisons work.
	// eslint-disable-next-line eqeqeq
	if ( ( context.ownerDocument || context ) != document ) {
		setDocument( context );
	}
	return contains( context, elem );
};

Sizzle.attr = function( elem, name ) {

	// Set document vars if needed
	// Support: IE 11+, Edge 17 - 18+
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
	// two documents; shallow comparisons work.
	// eslint-disable-next-line eqeqeq
	if ( ( elem.ownerDocument || elem ) != document ) {
		setDocument( elem );
	}

	var fn = Expr.attrHandle[ name.toLowerCase() ],

		// Don't get fooled by Object.prototype properties (jQuery #13807)
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
			fn( elem, name, !documentIsHTML ) :
			undefined;

	return val !== undefined ?
		val :
		support.attributes || !documentIsHTML ?
			elem.getAttribute( name ) :
			( val = elem.getAttributeNode( name ) ) && val.specified ?
				val.value :
				null;
};

Sizzle.escape = function( sel ) {
	return ( sel + "" ).replace( rcssescape, fcssescape );
};

Sizzle.error = function( msg ) {
	throw new Error( "Syntax error, unrecognized expression: " + msg );
};

/**
 * Document sorting and removing duplicates
 * @param {ArrayLike} results
 */
Sizzle.uniqueSort = function( results ) {
	var elem,
		duplicates = [],
		j = 0,
		i = 0;

	// Unless we *know* we can detect duplicates, assume their presence
	hasDuplicate = !support.detectDuplicates;
	sortInput = !support.sortStable && results.slice( 0 );
	results.sort( sortOrder );

	if ( hasDuplicate ) {
		while ( ( elem = results[ i++ ] ) ) {
			if ( elem === results[ i ] ) {
				j = duplicates.push( i );
			}
		}
		while ( j-- ) {
			results.splice( duplicates[ j ], 1 );
		}
	}

	// Clear input after sorting to release objects
	// See https://github.com/jquery/sizzle/pull/225
	sortInput = null;

	return results;
};

/**
 * Utility function for retrieving the text value of an array of DOM nodes
 * @param {Array|Element} elem
 */
getText = Sizzle.getText = function( elem ) {
	var node,
		ret = "",
		i = 0,
		nodeType = elem.nodeType;

	if ( !nodeType ) {

		// If no nodeType, this is expected to be an array
		while ( ( node = elem[ i++ ] ) ) {

			// Do not traverse comment nodes
			ret += getText( node );
		}
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {

		// Use textContent for elements
		// innerText usage removed for consistency of new lines (jQuery #11153)
		if ( typeof elem.textContent === "string" ) {
			return elem.textContent;
		} else {

			// Traverse its children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				ret += getText( elem );
			}
		}
	} else if ( nodeType === 3 || nodeType === 4 ) {
		return elem.nodeValue;
	}

	// Do not include comment or processing instruction nodes

	return ret;
};

Expr = Sizzle.selectors = {

	// Can be adjusted by the user
	cacheLength: 50,

	createPseudo: markFunction,

	match: matchExpr,

	attrHandle: {},

	find: {},

	relative: {
		">": { dir: "parentNode", first: true },
		" ": { dir: "parentNode" },
		"+": { dir: "previousSibling", first: true },
		"~": { dir: "previousSibling" }
	},

	preFilter: {
		"ATTR": function( match ) {
			match[ 1 ] = match[ 1 ].replace( runescape, funescape );

			// Move the given value to match[3] whether quoted or unquoted
			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
				match[ 5 ] || "" ).replace( runescape, funescape );

			if ( match[ 2 ] === "~=" ) {
				match[ 3 ] = " " + match[ 3 ] + " ";
			}

			return match.slice( 0, 4 );
		},

		"CHILD": function( match ) {

			/* matches from matchExpr["CHILD"]
				1 type (only|nth|...)
				2 what (child|of-type)
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
				4 xn-component of xn+y argument ([+-]?\d*n|)
				5 sign of xn-component
				6 x of xn-component
				7 sign of y-component
				8 y of y-component
			*/
			match[ 1 ] = match[ 1 ].toLowerCase();

			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {

				// nth-* requires argument
				if ( !match[ 3 ] ) {
					Sizzle.error( match[ 0 ] );
				}

				// numeric x and y parameters for Expr.filter.CHILD
				// remember that false/true cast respectively to 0/1
				match[ 4 ] = +( match[ 4 ] ?
					match[ 5 ] + ( match[ 6 ] || 1 ) :
					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );

				// other types prohibit arguments
			} else if ( match[ 3 ] ) {
				Sizzle.error( match[ 0 ] );
			}

			return match;
		},

		"PSEUDO": function( match ) {
			var excess,
				unquoted = !match[ 6 ] && match[ 2 ];

			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
				return null;
			}

			// Accept quoted arguments as-is
			if ( match[ 3 ] ) {
				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";

			// Strip excess characters from unquoted arguments
			} else if ( unquoted && rpseudo.test( unquoted ) &&

				// Get excess from tokenize (recursively)
				( excess = tokenize( unquoted, true ) ) &&

				// advance to the next closing parenthesis
				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {

				// excess is a negative index
				match[ 0 ] = match[ 0 ].slice( 0, excess );
				match[ 2 ] = unquoted.slice( 0, excess );
			}

			// Return only captures needed by the pseudo filter method (type and argument)
			return match.slice( 0, 3 );
		}
	},

	filter: {

		"TAG": function( nodeNameSelector ) {
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
			return nodeNameSelector === "*" ?
				function() {
					return true;
				} :
				function( elem ) {
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
				};
		},

		"CLASS": function( className ) {
			var pattern = classCache[ className + " " ];

			return pattern ||
				( pattern = new RegExp( "(^|" + whitespace +
					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
						className, function( elem ) {
							return pattern.test(
								typeof elem.className === "string" && elem.className ||
								typeof elem.getAttribute !== "undefined" &&
									elem.getAttribute( "class" ) ||
								""
							);
				} );
		},

		"ATTR": function( name, operator, check ) {
			return function( elem ) {
				var result = Sizzle.attr( elem, name );

				if ( result == null ) {
					return operator === "!=";
				}
				if ( !operator ) {
					return true;
				}

				result += "";

				/* eslint-disable max-len */

				return operator === "=" ? result === check :
					operator === "!=" ? result !== check :
					operator === "^=" ? check && result.indexOf( check ) === 0 :
					operator === "*=" ? check && result.indexOf( check ) > -1 :
					operator === "$=" ? check && result.slice( -check.length ) === check :
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
					false;
				/* eslint-enable max-len */

			};
		},

		"CHILD": function( type, what, _argument, first, last ) {
			var simple = type.slice( 0, 3 ) !== "nth",
				forward = type.slice( -4 ) !== "last",
				ofType = what === "of-type";

			return first === 1 && last === 0 ?

				// Shortcut for :nth-*(n)
				function( elem ) {
					return !!elem.parentNode;
				} :

				function( elem, _context, xml ) {
					var cache, uniqueCache, outerCache, node, nodeIndex, start,
						dir = simple !== forward ? "nextSibling" : "previousSibling",
						parent = elem.parentNode,
						name = ofType && elem.nodeName.toLowerCase(),
						useCache = !xml && !ofType,
						diff = false;

					if ( parent ) {

						// :(first|last|only)-(child|of-type)
						if ( simple ) {
							while ( dir ) {
								node = elem;
								while ( ( node = node[ dir ] ) ) {
									if ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) {

										return false;
									}
								}

								// Reverse direction for :only-* (if we haven't yet done so)
								start = dir = type === "only" && !start && "nextSibling";
							}
							return true;
						}

						start = [ forward ? parent.firstChild : parent.lastChild ];

						// non-xml :nth-child(...) stores cache data on `parent`
						if ( forward && useCache ) {

							// Seek `elem` from a previously-cached index

							// ...in a gzip-friendly way
							node = parent;
							outerCache = node[ expando ] || ( node[ expando ] = {} );

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[ node.uniqueID ] ||
								( outerCache[ node.uniqueID ] = {} );

							cache = uniqueCache[ type ] || [];
							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
							diff = nodeIndex && cache[ 2 ];
							node = nodeIndex && parent.childNodes[ nodeIndex ];

							while ( ( node = ++nodeIndex && node && node[ dir ] ||

								// Fallback to seeking `elem` from the start
								( diff = nodeIndex = 0 ) || start.pop() ) ) {

								// When found, cache indexes on `parent` and break
								if ( node.nodeType === 1 && ++diff && node === elem ) {
									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
									break;
								}
							}

						} else {

							// Use previously-cached element index if available
							if ( useCache ) {

								// ...in a gzip-friendly way
								node = elem;
								outerCache = node[ expando ] || ( node[ expando ] = {} );

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[ node.uniqueID ] ||
									( outerCache[ node.uniqueID ] = {} );

								cache = uniqueCache[ type ] || [];
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
								diff = nodeIndex;
							}

							// xml :nth-child(...)
							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
							if ( diff === false ) {

								// Use the same loop as above to seek `elem` from the start
								while ( ( node = ++nodeIndex && node && node[ dir ] ||
									( diff = nodeIndex = 0 ) || start.pop() ) ) {

									if ( ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) &&
										++diff ) {

										// Cache the index of each encountered element
										if ( useCache ) {
											outerCache = node[ expando ] ||
												( node[ expando ] = {} );

											// Support: IE <9 only
											// Defend against cloned attroperties (jQuery gh-1709)
											uniqueCache = outerCache[ node.uniqueID ] ||
												( outerCache[ node.uniqueID ] = {} );

											uniqueCache[ type ] = [ dirruns, diff ];
										}

										if ( node === elem ) {
											break;
										}
									}
								}
							}
						}

						// Incorporate the offset, then check against cycle size
						diff -= last;
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
					}
				};
		},

		"PSEUDO": function( pseudo, argument ) {

			// pseudo-class names are case-insensitive
			// http://www.w3.org/TR/selectors/#pseudo-classes
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
			// Remember that setFilters inherits from pseudos
			var args,
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
					Sizzle.error( "unsupported pseudo: " + pseudo );

			// The user may use createPseudo to indicate that
			// arguments are needed to create the filter function
			// just as Sizzle does
			if ( fn[ expando ] ) {
				return fn( argument );
			}

			// But maintain support for old signatures
			if ( fn.length > 1 ) {
				args = [ pseudo, pseudo, "", argument ];
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
					markFunction( function( seed, matches ) {
						var idx,
							matched = fn( seed, argument ),
							i = matched.length;
						while ( i-- ) {
							idx = indexOf( seed, matched[ i ] );
							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
						}
					} ) :
					function( elem ) {
						return fn( elem, 0, args );
					};
			}

			return fn;
		}
	},

	pseudos: {

		// Potentially complex pseudos
		"not": markFunction( function( selector ) {

			// Trim the selector passed to compile
			// to avoid treating leading and trailing
			// spaces as combinators
			var input = [],
				results = [],
				matcher = compile( selector.replace( rtrim, "$1" ) );

			return matcher[ expando ] ?
				markFunction( function( seed, matches, _context, xml ) {
					var elem,
						unmatched = matcher( seed, null, xml, [] ),
						i = seed.length;

					// Match elements unmatched by `matcher`
					while ( i-- ) {
						if ( ( elem = unmatched[ i ] ) ) {
							seed[ i ] = !( matches[ i ] = elem );
						}
					}
				} ) :
				function( elem, _context, xml ) {
					input[ 0 ] = elem;
					matcher( input, null, xml, results );

					// Don't keep the element (issue #299)
					input[ 0 ] = null;
					return !results.pop();
				};
		} ),

		"has": markFunction( function( selector ) {
			return function( elem ) {
				return Sizzle( selector, elem ).length > 0;
			};
		} ),

		"contains": markFunction( function( text ) {
			text = text.replace( runescape, funescape );
			return function( elem ) {
				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
			};
		} ),

		// "Whether an element is represented by a :lang() selector
		// is based solely on the element's language value
		// being equal to the identifier C,
		// or beginning with the identifier C immediately followed by "-".
		// The matching of C against the element's language value is performed case-insensitively.
		// The identifier C does not have to be a valid language name."
		// http://www.w3.org/TR/selectors/#lang-pseudo
		"lang": markFunction( function( lang ) {

			// lang value must be a valid identifier
			if ( !ridentifier.test( lang || "" ) ) {
				Sizzle.error( "unsupported lang: " + lang );
			}
			lang = lang.replace( runescape, funescape ).toLowerCase();
			return function( elem ) {
				var elemLang;
				do {
					if ( ( elemLang = documentIsHTML ?
						elem.lang :
						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {

						elemLang = elemLang.toLowerCase();
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
					}
				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
				return false;
			};
		} ),

		// Miscellaneous
		"target": function( elem ) {
			var hash = window.location && window.location.hash;
			return hash && hash.slice( 1 ) === elem.id;
		},

		"root": function( elem ) {
			return elem === docElem;
		},

		"focus": function( elem ) {
			return elem === document.activeElement &&
				( !document.hasFocus || document.hasFocus() ) &&
				!!( elem.type || elem.href || ~elem.tabIndex );
		},

		// Boolean properties
		"enabled": createDisabledPseudo( false ),
		"disabled": createDisabledPseudo( true ),

		"checked": function( elem ) {

			// In CSS3, :checked should return both checked and selected elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			var nodeName = elem.nodeName.toLowerCase();
			return ( nodeName === "input" && !!elem.checked ) ||
				( nodeName === "option" && !!elem.selected );
		},

		"selected": function( elem ) {

			// Accessing this property makes selected-by-default
			// options in Safari work properly
			if ( elem.parentNode ) {
				// eslint-disable-next-line no-unused-expressions
				elem.parentNode.selectedIndex;
			}

			return elem.selected === true;
		},

		// Contents
		"empty": function( elem ) {

			// http://www.w3.org/TR/selectors/#empty-pseudo
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
			//   but not by others (comment: 8; processing instruction: 7; etc.)
			// nodeType < 6 works because attributes (2) do not appear as children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				if ( elem.nodeType < 6 ) {
					return false;
				}
			}
			return true;
		},

		"parent": function( elem ) {
			return !Expr.pseudos[ "empty" ]( elem );
		},

		// Element/input types
		"header": function( elem ) {
			return rheader.test( elem.nodeName );
		},

		"input": function( elem ) {
			return rinputs.test( elem.nodeName );
		},

		"button": function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && elem.type === "button" || name === "button";
		},

		"text": function( elem ) {
			var attr;
			return elem.nodeName.toLowerCase() === "input" &&
				elem.type === "text" &&

				// Support: IE<8
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
				( ( attr = elem.getAttribute( "type" ) ) == null ||
					attr.toLowerCase() === "text" );
		},

		// Position-in-collection
		"first": createPositionalPseudo( function() {
			return [ 0 ];
		} ),

		"last": createPositionalPseudo( function( _matchIndexes, length ) {
			return [ length - 1 ];
		} ),

		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
			return [ argument < 0 ? argument + length : argument ];
		} ),

		"even": createPositionalPseudo( function( matchIndexes, length ) {
			var i = 0;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		} ),

		"odd": createPositionalPseudo( function( matchIndexes, length ) {
			var i = 1;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		} ),

		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
			var i = argument < 0 ?
				argument + length :
				argument > length ?
					length :
					argument;
			for ( ; --i >= 0; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		} ),

		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; ++i < length; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		} )
	}
};

Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];

// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
	Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
	Expr.pseudos[ i ] = createButtonPseudo( i );
}

// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();

tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
	var matched, match, tokens, type,
		soFar, groups, preFilters,
		cached = tokenCache[ selector + " " ];

	if ( cached ) {
		return parseOnly ? 0 : cached.slice( 0 );
	}

	soFar = selector;
	groups = [];
	preFilters = Expr.preFilter;

	while ( soFar ) {

		// Comma and first run
		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
			if ( match ) {

				// Don't consume trailing commas as valid
				soFar = soFar.slice( match[ 0 ].length ) || soFar;
			}
			groups.push( ( tokens = [] ) );
		}

		matched = false;

		// Combinators
		if ( ( match = rcombinators.exec( soFar ) ) ) {
			matched = match.shift();
			tokens.push( {
				value: matched,

				// Cast descendant combinators to space
				type: match[ 0 ].replace( rtrim, " " )
			} );
			soFar = soFar.slice( matched.length );
		}

		// Filters
		for ( type in Expr.filter ) {
			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
				( match = preFilters[ type ]( match ) ) ) ) {
				matched = match.shift();
				tokens.push( {
					value: matched,
					type: type,
					matches: match
				} );
				soFar = soFar.slice( matched.length );
			}
		}

		if ( !matched ) {
			break;
		}
	}

	// Return the length of the invalid excess
	// if we're just parsing
	// Otherwise, throw an error or return tokens
	return parseOnly ?
		soFar.length :
		soFar ?
			Sizzle.error( selector ) :

			// Cache the tokens
			tokenCache( selector, groups ).slice( 0 );
};

function toSelector( tokens ) {
	var i = 0,
		len = tokens.length,
		selector = "";
	for ( ; i < len; i++ ) {
		selector += tokens[ i ].value;
	}
	return selector;
}

function addCombinator( matcher, combinator, base ) {
	var dir = combinator.dir,
		skip = combinator.next,
		key = skip || dir,
		checkNonElements = base && key === "parentNode",
		doneName = done++;

	return combinator.first ?

		// Check against closest ancestor/preceding element
		function( elem, context, xml ) {
			while ( ( elem = elem[ dir ] ) ) {
				if ( elem.nodeType === 1 || checkNonElements ) {
					return matcher( elem, context, xml );
				}
			}
			return false;
		} :

		// Check against all ancestor/preceding elements
		function( elem, context, xml ) {
			var oldCache, uniqueCache, outerCache,
				newCache = [ dirruns, doneName ];

			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
			if ( xml ) {
				while ( ( elem = elem[ dir ] ) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						if ( matcher( elem, context, xml ) ) {
							return true;
						}
					}
				}
			} else {
				while ( ( elem = elem[ dir ] ) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						outerCache = elem[ expando ] || ( elem[ expando ] = {} );

						// Support: IE <9 only
						// Defend against cloned attroperties (jQuery gh-1709)
						uniqueCache = outerCache[ elem.uniqueID ] ||
							( outerCache[ elem.uniqueID ] = {} );

						if ( skip && skip === elem.nodeName.toLowerCase() ) {
							elem = elem[ dir ] || elem;
						} else if ( ( oldCache = uniqueCache[ key ] ) &&
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {

							// Assign to newCache so results back-propagate to previous elements
							return ( newCache[ 2 ] = oldCache[ 2 ] );
						} else {

							// Reuse newcache so results back-propagate to previous elements
							uniqueCache[ key ] = newCache;

							// A match means we're done; a fail means we have to keep checking
							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
								return true;
							}
						}
					}
				}
			}
			return false;
		};
}

function elementMatcher( matchers ) {
	return matchers.length > 1 ?
		function( elem, context, xml ) {
			var i = matchers.length;
			while ( i-- ) {
				if ( !matchers[ i ]( elem, context, xml ) ) {
					return false;
				}
			}
			return true;
		} :
		matchers[ 0 ];
}

function multipleContexts( selector, contexts, results ) {
	var i = 0,
		len = contexts.length;
	for ( ; i < len; i++ ) {
		Sizzle( selector, contexts[ i ], results );
	}
	return results;
}

function condense( unmatched, map, filter, context, xml ) {
	var elem,
		newUnmatched = [],
		i = 0,
		len = unmatched.length,
		mapped = map != null;

	for ( ; i < len; i++ ) {
		if ( ( elem = unmatched[ i ] ) ) {
			if ( !filter || filter( elem, context, xml ) ) {
				newUnmatched.push( elem );
				if ( mapped ) {
					map.push( i );
				}
			}
		}
	}

	return newUnmatched;
}

function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
	if ( postFilter && !postFilter[ expando ] ) {
		postFilter = setMatcher( postFilter );
	}
	if ( postFinder && !postFinder[ expando ] ) {
		postFinder = setMatcher( postFinder, postSelector );
	}
	return markFunction( function( seed, results, context, xml ) {
		var temp, i, elem,
			preMap = [],
			postMap = [],
			preexisting = results.length,

			// Get initial elements from seed or context
			elems = seed || multipleContexts(
				selector || "*",
				context.nodeType ? [ context ] : context,
				[]
			),

			// Prefilter to get matcher input, preserving a map for seed-results synchronization
			matcherIn = preFilter && ( seed || !selector ) ?
				condense( elems, preMap, preFilter, context, xml ) :
				elems,

			matcherOut = matcher ?

				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?

					// ...intermediate processing is necessary
					[] :

					// ...otherwise use results directly
					results :
				matcherIn;

		// Find primary matches
		if ( matcher ) {
			matcher( matcherIn, matcherOut, context, xml );
		}

		// Apply postFilter
		if ( postFilter ) {
			temp = condense( matcherOut, postMap );
			postFilter( temp, [], context, xml );

			// Un-match failing elements by moving them back to matcherIn
			i = temp.length;
			while ( i-- ) {
				if ( ( elem = temp[ i ] ) ) {
					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
				}
			}
		}

		if ( seed ) {
			if ( postFinder || preFilter ) {
				if ( postFinder ) {

					// Get the final matcherOut by condensing this intermediate into postFinder contexts
					temp = [];
					i = matcherOut.length;
					while ( i-- ) {
						if ( ( elem = matcherOut[ i ] ) ) {

							// Restore matcherIn since elem is not yet a final match
							temp.push( ( matcherIn[ i ] = elem ) );
						}
					}
					postFinder( null, ( matcherOut = [] ), temp, xml );
				}

				// Move matched elements from seed to results to keep them synchronized
				i = matcherOut.length;
				while ( i-- ) {
					if ( ( elem = matcherOut[ i ] ) &&
						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {

						seed[ temp ] = !( results[ temp ] = elem );
					}
				}
			}

		// Add elements to results, through postFinder if defined
		} else {
			matcherOut = condense(
				matcherOut === results ?
					matcherOut.splice( preexisting, matcherOut.length ) :
					matcherOut
			);
			if ( postFinder ) {
				postFinder( null, results, matcherOut, xml );
			} else {
				push.apply( results, matcherOut );
			}
		}
	} );
}

function matcherFromTokens( tokens ) {
	var checkContext, matcher, j,
		len = tokens.length,
		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
		implicitRelative = leadingRelative || Expr.relative[ " " ],
		i = leadingRelative ? 1 : 0,

		// The foundational matcher ensures that elements are reachable from top-level context(s)
		matchContext = addCombinator( function( elem ) {
			return elem === checkContext;
		}, implicitRelative, true ),
		matchAnyContext = addCombinator( function( elem ) {
			return indexOf( checkContext, elem ) > -1;
		}, implicitRelative, true ),
		matchers = [ function( elem, context, xml ) {
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
				( checkContext = context ).nodeType ?
					matchContext( elem, context, xml ) :
					matchAnyContext( elem, context, xml ) );

			// Avoid hanging onto element (issue #299)
			checkContext = null;
			return ret;
		} ];

	for ( ; i < len; i++ ) {
		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
		} else {
			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );

			// Return special upon seeing a positional matcher
			if ( matcher[ expando ] ) {

				// Find the next relative operator (if any) for proper handling
				j = ++i;
				for ( ; j < len; j++ ) {
					if ( Expr.relative[ tokens[ j ].type ] ) {
						break;
					}
				}
				return setMatcher(
					i > 1 && elementMatcher( matchers ),
					i > 1 && toSelector(

					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
					tokens
						.slice( 0, i - 1 )
						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
					).replace( rtrim, "$1" ),
					matcher,
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
					j < len && toSelector( tokens )
				);
			}
			matchers.push( matcher );
		}
	}

	return elementMatcher( matchers );
}

function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
	var bySet = setMatchers.length > 0,
		byElement = elementMatchers.length > 0,
		superMatcher = function( seed, context, xml, results, outermost ) {
			var elem, j, matcher,
				matchedCount = 0,
				i = "0",
				unmatched = seed && [],
				setMatched = [],
				contextBackup = outermostContext,

				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),

				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
				len = elems.length;

			if ( outermost ) {

				// Support: IE 11+, Edge 17 - 18+
				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
				// two documents; shallow comparisons work.
				// eslint-disable-next-line eqeqeq
				outermostContext = context == document || context || outermost;
			}

			// Add elements passing elementMatchers directly to results
			// Support: IE<9, Safari
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
				if ( byElement && elem ) {
					j = 0;

					// Support: IE 11+, Edge 17 - 18+
					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
					// two documents; shallow comparisons work.
					// eslint-disable-next-line eqeqeq
					if ( !context && elem.ownerDocument != document ) {
						setDocument( elem );
						xml = !documentIsHTML;
					}
					while ( ( matcher = elementMatchers[ j++ ] ) ) {
						if ( matcher( elem, context || document, xml ) ) {
							results.push( elem );
							break;
						}
					}
					if ( outermost ) {
						dirruns = dirrunsUnique;
					}
				}

				// Track unmatched elements for set filters
				if ( bySet ) {

					// They will have gone through all possible matchers
					if ( ( elem = !matcher && elem ) ) {
						matchedCount--;
					}

					// Lengthen the array for every element, matched or not
					if ( seed ) {
						unmatched.push( elem );
					}
				}
			}

			// `i` is now the count of elements visited above, and adding it to `matchedCount`
			// makes the latter nonnegative.
			matchedCount += i;

			// Apply set filters to unmatched elements
			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
			// no element matchers and no seed.
			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
			// numerically zero.
			if ( bySet && i !== matchedCount ) {
				j = 0;
				while ( ( matcher = setMatchers[ j++ ] ) ) {
					matcher( unmatched, setMatched, context, xml );
				}

				if ( seed ) {

					// Reintegrate element matches to eliminate the need for sorting
					if ( matchedCount > 0 ) {
						while ( i-- ) {
							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
								setMatched[ i ] = pop.call( results );
							}
						}
					}

					// Discard index placeholder values to get only actual matches
					setMatched = condense( setMatched );
				}

				// Add matches to results
				push.apply( results, setMatched );

				// Seedless set matches succeeding multiple successful matchers stipulate sorting
				if ( outermost && !seed && setMatched.length > 0 &&
					( matchedCount + setMatchers.length ) > 1 ) {

					Sizzle.uniqueSort( results );
				}
			}

			// Override manipulation of globals by nested matchers
			if ( outermost ) {
				dirruns = dirrunsUnique;
				outermostContext = contextBackup;
			}

			return unmatched;
		};

	return bySet ?
		markFunction( superMatcher ) :
		superMatcher;
}

compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
	var i,
		setMatchers = [],
		elementMatchers = [],
		cached = compilerCache[ selector + " " ];

	if ( !cached ) {

		// Generate a function of recursive functions that can be used to check each element
		if ( !match ) {
			match = tokenize( selector );
		}
		i = match.length;
		while ( i-- ) {
			cached = matcherFromTokens( match[ i ] );
			if ( cached[ expando ] ) {
				setMatchers.push( cached );
			} else {
				elementMatchers.push( cached );
			}
		}

		// Cache the compiled function
		cached = compilerCache(
			selector,
			matcherFromGroupMatchers( elementMatchers, setMatchers )
		);

		// Save selector and tokenization
		cached.selector = selector;
	}
	return cached;
};

/**
 * A low-level selection function that works with Sizzle's compiled
 *  selector functions
 * @param {String|Function} selector A selector or a pre-compiled
 *  selector function built with Sizzle.compile
 * @param {Element} context
 * @param {Array} [results]
 * @param {Array} [seed] A set of elements to match against
 */
select = Sizzle.select = function( selector, context, results, seed ) {
	var i, tokens, token, type, find,
		compiled = typeof selector === "function" && selector,
		match = !seed && tokenize( ( selector = compiled.selector || selector ) );

	results = results || [];

	// Try to minimize operations if there is only one selector in the list and no seed
	// (the latter of which guarantees us context)
	if ( match.length === 1 ) {

		// Reduce context if the leading compound selector is an ID
		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {

			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
				.replace( runescape, funescape ), context ) || [] )[ 0 ];
			if ( !context ) {
				return results;

			// Precompiled matchers will still verify ancestry, so step up a level
			} else if ( compiled ) {
				context = context.parentNode;
			}

			selector = selector.slice( tokens.shift().value.length );
		}

		// Fetch a seed set for right-to-left matching
		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
		while ( i-- ) {
			token = tokens[ i ];

			// Abort if we hit a combinator
			if ( Expr.relative[ ( type = token.type ) ] ) {
				break;
			}
			if ( ( find = Expr.find[ type ] ) ) {

				// Search, expanding context for leading sibling combinators
				if ( ( seed = find(
					token.matches[ 0 ].replace( runescape, funescape ),
					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
						context
				) ) ) {

					// If seed is empty or no tokens remain, we can return early
					tokens.splice( i, 1 );
					selector = seed.length && toSelector( tokens );
					if ( !selector ) {
						push.apply( results, seed );
						return results;
					}

					break;
				}
			}
		}
	}

	// Compile and execute a filtering function if one is not provided
	// Provide `match` to avoid retokenization if we modified the selector above
	( compiled || compile( selector, match ) )(
		seed,
		context,
		!documentIsHTML,
		results,
		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
	);
	return results;
};

// One-time assignments

// Sort stability
support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;

// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;

// Initialize against the default document
setDocument();

// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert( function( el ) {

	// Should return 1, but returns 4 (following)
	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
} );

// Support: IE<8
// Prevent attribute/property "interpolation"
// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert( function( el ) {
	el.innerHTML = "<a href='#'></a>";
	return el.firstChild.getAttribute( "href" ) === "#";
} ) ) {
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
		if ( !isXML ) {
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
		}
	} );
}

// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert( function( el ) {
	el.innerHTML = "<input/>";
	el.firstChild.setAttribute( "value", "" );
	return el.firstChild.getAttribute( "value" ) === "";
} ) ) {
	addHandle( "value", function( elem, _name, isXML ) {
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
			return elem.defaultValue;
		}
	} );
}

// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert( function( el ) {
	return el.getAttribute( "disabled" ) == null;
} ) ) {
	addHandle( booleans, function( elem, name, isXML ) {
		var val;
		if ( !isXML ) {
			return elem[ name ] === true ? name.toLowerCase() :
				( val = elem.getAttributeNode( name ) ) && val.specified ?
					val.value :
					null;
		}
	} );
}

return Sizzle;

} )( window );



jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;

// Deprecated
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
jQuery.escapeSelector = Sizzle.escape;




var dir = function( elem, dir, until ) {
	var matched = [],
		truncate = until !== undefined;

	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
		if ( elem.nodeType === 1 ) {
			if ( truncate && jQuery( elem ).is( until ) ) {
				break;
			}
			matched.push( elem );
		}
	}
	return matched;
};


var siblings = function( n, elem ) {
	var matched = [];

	for ( ; n; n = n.nextSibling ) {
		if ( n.nodeType === 1 && n !== elem ) {
			matched.push( n );
		}
	}

	return matched;
};


var rneedsContext = jQuery.expr.match.needsContext;



function nodeName( elem, name ) {

  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();

};
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );



// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
	if ( isFunction( qualifier ) ) {
		return jQuery.grep( elements, function( elem, i ) {
			return !!qualifier.call( elem, i, elem ) !== not;
		} );
	}

	// Single element
	if ( qualifier.nodeType ) {
		return jQuery.grep( elements, function( elem ) {
			return ( elem === qualifier ) !== not;
		} );
	}

	// Arraylike of elements (jQuery, arguments, Array)
	if ( typeof qualifier !== "string" ) {
		return jQuery.grep( elements, function( elem ) {
			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
		} );
	}

	// Filtered directly for both simple and complex selectors
	return jQuery.filter( qualifier, elements, not );
}

jQuery.filter = function( expr, elems, not ) {
	var elem = elems[ 0 ];

	if ( not ) {
		expr = ":not(" + expr + ")";
	}

	if ( elems.length === 1 && elem.nodeType === 1 ) {
		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
	}

	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
		return elem.nodeType === 1;
	} ) );
};

jQuery.fn.extend( {
	find: function( selector ) {
		var i, ret,
			len = this.length,
			self = this;

		if ( typeof selector !== "string" ) {
			return this.pushStack( jQuery( selector ).filter( function() {
				for ( i = 0; i < len; i++ ) {
					if ( jQuery.contains( self[ i ], this ) ) {
						return true;
					}
				}
			} ) );
		}

		ret = this.pushStack( [] );

		for ( i = 0; i < len; i++ ) {
			jQuery.find( selector, self[ i ], ret );
		}

		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
	},
	filter: function( selector ) {
		return this.pushStack( winnow( this, selector || [], false ) );
	},
	not: function( selector ) {
		return this.pushStack( winnow( this, selector || [], true ) );
	},
	is: function( selector ) {
		return !!winnow(
			this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test( selector ) ?
				jQuery( selector ) :
				selector || [],
			false
		).length;
	}
} );


// Initialize a jQuery object


// A central reference to the root jQuery(document)
var rootjQuery,

	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	// Shortcut simple #id case for speed
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,

	init = jQuery.fn.init = function( selector, context, root ) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if ( !selector ) {
			return this;
		}

		// Method init() accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// Handle HTML strings
		if ( typeof selector === "string" ) {
			if ( selector[ 0 ] === "<" &&
				selector[ selector.length - 1 ] === ">" &&
				selector.length >= 3 ) {

				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [ null, selector, null ];

			} else {
				match = rquickExpr.exec( selector );
			}

			// Match html or make sure no context is specified for #id
			if ( match && ( match[ 1 ] || !context ) ) {

				// HANDLE: $(html) -> $(array)
				if ( match[ 1 ] ) {
					context = context instanceof jQuery ? context[ 0 ] : context;

					// Option to run scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge( this, jQuery.parseHTML(
						match[ 1 ],
						context && context.nodeType ? context.ownerDocument || context : document,
						true
					) );

					// HANDLE: $(html, props)
					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
						for ( match in context ) {

							// Properties of context are called as methods if possible
							if ( isFunction( this[ match ] ) ) {
								this[ match ]( context[ match ] );

							// ...and otherwise set as attributes
							} else {
								this.attr( match, context[ match ] );
							}
						}
					}

					return this;

				// HANDLE: $(#id)
				} else {
					elem = document.getElementById( match[ 2 ] );

					if ( elem ) {

						// Inject the element directly into the jQuery object
						this[ 0 ] = elem;
						this.length = 1;
					}
					return this;
				}

			// HANDLE: $(expr, $(...))
			} else if ( !context || context.jquery ) {
				return ( context || root ).find( selector );

			// HANDLE: $(expr, context)
			// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor( context ).find( selector );
			}

		// HANDLE: $(DOMElement)
		} else if ( selector.nodeType ) {
			this[ 0 ] = selector;
			this.length = 1;
			return this;

		// HANDLE: $(function)
		// Shortcut for document ready
		} else if ( isFunction( selector ) ) {
			return root.ready !== undefined ?
				root.ready( selector ) :

				// Execute immediately if ready is not present
				selector( jQuery );
		}

		return jQuery.makeArray( selector, this );
	};

// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;

// Initialize central reference
rootjQuery = jQuery( document );


var rparentsprev = /^(?:parents|prev(?:Until|All))/,

	// Methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

jQuery.fn.extend( {
	has: function( target ) {
		var targets = jQuery( target, this ),
			l = targets.length;

		return this.filter( function() {
			var i = 0;
			for ( ; i < l; i++ ) {
				if ( jQuery.contains( this, targets[ i ] ) ) {
					return true;
				}
			}
		} );
	},

	closest: function( selectors, context ) {
		var cur,
			i = 0,
			l = this.length,
			matched = [],
			targets = typeof selectors !== "string" && jQuery( selectors );

		// Positional selectors never match, since there's no _selection_ context
		if ( !rneedsContext.test( selectors ) ) {
			for ( ; i < l; i++ ) {
				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {

					// Always skip document fragments
					if ( cur.nodeType < 11 && ( targets ?
						targets.index( cur ) > -1 :

						// Don't pass non-elements to Sizzle
						cur.nodeType === 1 &&
							jQuery.find.matchesSelector( cur, selectors ) ) ) {

						matched.push( cur );
						break;
					}
				}
			}
		}

		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
	},

	// Determine the position of an element within the set
	index: function( elem ) {

		// No argument, return index in parent
		if ( !elem ) {
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
		}

		// Index in selector
		if ( typeof elem === "string" ) {
			return indexOf.call( jQuery( elem ), this[ 0 ] );
		}

		// Locate the position of the desired element
		return indexOf.call( this,

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[ 0 ] : elem
		);
	},

	add: function( selector, context ) {
		return this.pushStack(
			jQuery.uniqueSort(
				jQuery.merge( this.get(), jQuery( selector, context ) )
			)
		);
	},

	addBack: function( selector ) {
		return this.add( selector == null ?
			this.prevObject : this.prevObject.filter( selector )
		);
	}
} );

function sibling( cur, dir ) {
	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
	return cur;
}

jQuery.each( {
	parent: function( elem ) {
		var parent = elem.parentNode;
		return parent && parent.nodeType !== 11 ? parent : null;
	},
	parents: function( elem ) {
		return dir( elem, "parentNode" );
	},
	parentsUntil: function( elem, _i, until ) {
		return dir( elem, "parentNode", until );
	},
	next: function( elem ) {
		return sibling( elem, "nextSibling" );
	},
	prev: function( elem ) {
		return sibling( elem, "previousSibling" );
	},
	nextAll: function( elem ) {
		return dir( elem, "nextSibling" );
	},
	prevAll: function( elem ) {
		return dir( elem, "previousSibling" );
	},
	nextUntil: function( elem, _i, until ) {
		return dir( elem, "nextSibling", until );
	},
	prevUntil: function( elem, _i, until ) {
		return dir( elem, "previousSibling", until );
	},
	siblings: function( elem ) {
		return siblings( ( elem.parentNode || {} ).firstChild, elem );
	},
	children: function( elem ) {
		return siblings( elem.firstChild );
	},
	contents: function( elem ) {
		if ( elem.contentDocument != null &&

			// Support: IE 11+
			// <object> elements with no `data` attribute has an object
			// `contentDocument` with a `null` prototype.
			getProto( elem.contentDocument ) ) {

			return elem.contentDocument;
		}

		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
		// Treat the template element as a regular one in browsers that
		// don't support it.
		if ( nodeName( elem, "template" ) ) {
			elem = elem.content || elem;
		}

		return jQuery.merge( [], elem.childNodes );
	}
}, function( name, fn ) {
	jQuery.fn[ name ] = function( until, selector ) {
		var matched = jQuery.map( this, fn, until );

		if ( name.slice( -5 ) !== "Until" ) {
			selector = until;
		}

		if ( selector && typeof selector === "string" ) {
			matched = jQuery.filter( selector, matched );
		}

		if ( this.length > 1 ) {

			// Remove duplicates
			if ( !guaranteedUnique[ name ] ) {
				jQuery.uniqueSort( matched );
			}

			// Reverse order for parents* and prev-derivatives
			if ( rparentsprev.test( name ) ) {
				matched.reverse();
			}
		}

		return this.pushStack( matched );
	};
} );
var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );



// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
	var object = {};
	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
		object[ flag ] = true;
	} );
	return object;
}

/*
 * Create a callback list using the following parameters:
 *
 *	options: an optional list of space-separated options that will change how
 *			the callback list behaves or a more traditional option object
 *
 * By default a callback list will act like an event callback list and can be
 * "fired" multiple times.
 *
 * Possible options:
 *
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
 *
 *	memory:			will keep track of previous values and will call any callback added
 *					after the list has been fired right away with the latest "memorized"
 *					values (like a Deferred)
 *
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
 *
 *	stopOnFalse:	interrupt callings when a callback returns false
 *
 */
jQuery.Callbacks = function( options ) {

	// Convert options from String-formatted to Object-formatted if needed
	// (we check in cache first)
	options = typeof options === "string" ?
		createOptions( options ) :
		jQuery.extend( {}, options );

	var // Flag to know if list is currently firing
		firing,

		// Last fire value for non-forgettable lists
		memory,

		// Flag to know if list was already fired
		fired,

		// Flag to prevent firing
		locked,

		// Actual callback list
		list = [],

		// Queue of execution data for repeatable lists
		queue = [],

		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,

		// Fire callbacks
		fire = function() {

			// Enforce single-firing
			locked = locked || options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			fired = firing = true;
			for ( ; queue.length; firingIndex = -1 ) {
				memory = queue.shift();
				while ( ++firingIndex < list.length ) {

					// Run callback and check for early termination
					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
						options.stopOnFalse ) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if ( !options.memory ) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if ( locked ) {

				// Keep an empty list if we have data for future add calls
				if ( memory ) {
					list = [];

				// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},

		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function() {
				if ( list ) {

					// If we have memory from a past run, we should fire after adding
					if ( memory && !firing ) {
						firingIndex = list.length - 1;
						queue.push( memory );
					}

					( function add( args ) {
						jQuery.each( args, function( _, arg ) {
							if ( isFunction( arg ) ) {
								if ( !options.unique || !self.has( arg ) ) {
									list.push( arg );
								}
							} else if ( arg && arg.length && toType( arg ) !== "string" ) {

								// Inspect recursively
								add( arg );
							}
						} );
					} )( arguments );

					if ( memory && !firing ) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function() {
				jQuery.each( arguments, function( _, arg ) {
					var index;
					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
						list.splice( index, 1 );

						// Handle firing indexes
						if ( index <= firingIndex ) {
							firingIndex--;
						}
					}
				} );
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function( fn ) {
				return fn ?
					jQuery.inArray( fn, list ) > -1 :
					list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function() {
				if ( list ) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function() {
				locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function() {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function() {
				locked = queue = [];
				if ( !memory && !firing ) {
					list = memory = "";
				}
				return this;
			},
			locked: function() {
				return !!locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function( context, args ) {
				if ( !locked ) {
					args = args || [];
					args = [ context, args.slice ? args.slice() : args ];
					queue.push( args );
					if ( !firing ) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function() {
				self.fireWith( this, arguments );
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function() {
				return !!fired;
			}
		};

	return self;
};


function Identity( v ) {
	return v;
}
function Thrower( ex ) {
	throw ex;
}

function adoptValue( value, resolve, reject, noValue ) {
	var method;

	try {

		// Check for promise aspect first to privilege synchronous behavior
		if ( value && isFunction( ( method = value.promise ) ) ) {
			method.call( value ).done( resolve ).fail( reject );

		// Other thenables
		} else if ( value && isFunction( ( method = value.then ) ) ) {
			method.call( value, resolve, reject );

		// Other non-thenables
		} else {

			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
			// * false: [ value ].slice( 0 ) => resolve( value )
			// * true: [ value ].slice( 1 ) => resolve()
			resolve.apply( undefined, [ value ].slice( noValue ) );
		}

	// For Promises/A+, convert exceptions into rejections
	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
	// Deferred#then to conditionally suppress rejection.
	} catch ( value ) {

		// Support: Android 4.0 only
		// Strict mode functions invoked without .call/.apply get global-object context
		reject.apply( undefined, [ value ] );
	}
}

jQuery.extend( {

	Deferred: function( func ) {
		var tuples = [

				// action, add listener, callbacks,
				// ... .then handlers, argument index, [final state]
				[ "notify", "progress", jQuery.Callbacks( "memory" ),
					jQuery.Callbacks( "memory" ), 2 ],
				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
			],
			state = "pending",
			promise = {
				state: function() {
					return state;
				},
				always: function() {
					deferred.done( arguments ).fail( arguments );
					return this;
				},
				"catch": function( fn ) {
					return promise.then( null, fn );
				},

				// Keep pipe for back-compat
				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
					var fns = arguments;

					return jQuery.Deferred( function( newDefer ) {
						jQuery.each( tuples, function( _i, tuple ) {

							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];

							// deferred.progress(function() { bind to newDefer or newDefer.notify })
							// deferred.done(function() { bind to newDefer or newDefer.resolve })
							// deferred.fail(function() { bind to newDefer or newDefer.reject })
							deferred[ tuple[ 1 ] ]( function() {
								var returned = fn && fn.apply( this, arguments );
								if ( returned && isFunction( returned.promise ) ) {
									returned.promise()
										.progress( newDefer.notify )
										.done( newDefer.resolve )
										.fail( newDefer.reject );
								} else {
									newDefer[ tuple[ 0 ] + "With" ](
										this,
										fn ? [ returned ] : arguments
									);
								}
							} );
						} );
						fns = null;
					} ).promise();
				},
				then: function( onFulfilled, onRejected, onProgress ) {
					var maxDepth = 0;
					function resolve( depth, deferred, handler, special ) {
						return function() {
							var that = this,
								args = arguments,
								mightThrow = function() {
									var returned, then;

									// Support: Promises/A+ section 2.3.3.3.3
									// https://promisesaplus.com/#point-59
									// Ignore double-resolution attempts
									if ( depth < maxDepth ) {
										return;
									}

									returned = handler.apply( that, args );

									// Support: Promises/A+ section 2.3.1
									// https://promisesaplus.com/#point-48
									if ( returned === deferred.promise() ) {
										throw new TypeError( "Thenable self-resolution" );
									}

									// Support: Promises/A+ sections 2.3.3.1, 3.5
									// https://promisesaplus.com/#point-54
									// https://promisesaplus.com/#point-75
									// Retrieve `then` only once
									then = returned &&

										// Support: Promises/A+ section 2.3.4
										// https://promisesaplus.com/#point-64
										// Only check objects and functions for thenability
										( typeof returned === "object" ||
											typeof returned === "function" ) &&
										returned.then;

									// Handle a returned thenable
									if ( isFunction( then ) ) {

										// Special processors (notify) just wait for resolution
										if ( special ) {
											then.call(
												returned,
												resolve( maxDepth, deferred, Identity, special ),
												resolve( maxDepth, deferred, Thrower, special )
											);

										// Normal processors (resolve) also hook into progress
										} else {

											// ...and disregard older resolution values
											maxDepth++;

											then.call(
												returned,
												resolve( maxDepth, deferred, Identity, special ),
												resolve( maxDepth, deferred, Thrower, special ),
												resolve( maxDepth, deferred, Identity,
													deferred.notifyWith )
											);
										}

									// Handle all other returned values
									} else {

										// Only substitute handlers pass on context
										// and multiple values (non-spec behavior)
										if ( handler !== Identity ) {
											that = undefined;
											args = [ returned ];
										}

										// Process the value(s)
										// Default process is resolve
										( special || deferred.resolveWith )( that, args );
									}
								},

								// Only normal processors (resolve) catch and reject exceptions
								process = special ?
									mightThrow :
									function() {
										try {
											mightThrow();
										} catch ( e ) {

											if ( jQuery.Deferred.exceptionHook ) {
												jQuery.Deferred.exceptionHook( e,
													process.stackTrace );
											}

											// Support: Promises/A+ section 2.3.3.3.4.1
											// https://promisesaplus.com/#point-61
											// Ignore post-resolution exceptions
											if ( depth + 1 >= maxDepth ) {

												// Only substitute handlers pass on context
												// and multiple values (non-spec behavior)
												if ( handler !== Thrower ) {
													that = undefined;
													args = [ e ];
												}

												deferred.rejectWith( that, args );
											}
										}
									};

							// Support: Promises/A+ section 2.3.3.3.1
							// https://promisesaplus.com/#point-57
							// Re-resolve promises immediately to dodge false rejection from
							// subsequent errors
							if ( depth ) {
								process();
							} else {

								// Call an optional hook to record the stack, in case of exception
								// since it's otherwise lost when execution goes async
								if ( jQuery.Deferred.getStackHook ) {
									process.stackTrace = jQuery.Deferred.getStackHook();
								}
								window.setTimeout( process );
							}
						};
					}

					return jQuery.Deferred( function( newDefer ) {

						// progress_handlers.add( ... )
						tuples[ 0 ][ 3 ].add(
							resolve(
								0,
								newDefer,
								isFunction( onProgress ) ?
									onProgress :
									Identity,
								newDefer.notifyWith
							)
						);

						// fulfilled_handlers.add( ... )
						tuples[ 1 ][ 3 ].add(
							resolve(
								0,
								newDefer,
								isFunction( onFulfilled ) ?
									onFulfilled :
									Identity
							)
						);

						// rejected_handlers.add( ... )
						tuples[ 2 ][ 3 ].add(
							resolve(
								0,
								newDefer,
								isFunction( onRejected ) ?
									onRejected :
									Thrower
							)
						);
					} ).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function( obj ) {
					return obj != null ? jQuery.extend( obj, promise ) : promise;
				}
			},
			deferred = {};

		// Add list-specific methods
		jQuery.each( tuples, function( i, tuple ) {
			var list = tuple[ 2 ],
				stateString = tuple[ 5 ];

			// promise.progress = list.add
			// promise.done = list.add
			// promise.fail = list.add
			promise[ tuple[ 1 ] ] = list.add;

			// Handle state
			if ( stateString ) {
				list.add(
					function() {

						// state = "resolved" (i.e., fulfilled)
						// state = "rejected"
						state = stateString;
					},

					// rejected_callbacks.disable
					// fulfilled_callbacks.disable
					tuples[ 3 - i ][ 2 ].disable,

					// rejected_handlers.disable
					// fulfilled_handlers.disable
					tuples[ 3 - i ][ 3 ].disable,

					// progress_callbacks.lock
					tuples[ 0 ][ 2 ].lock,

					// progress_handlers.lock
					tuples[ 0 ][ 3 ].lock
				);
			}

			// progress_handlers.fire
			// fulfilled_handlers.fire
			// rejected_handlers.fire
			list.add( tuple[ 3 ].fire );

			// deferred.notify = function() { deferred.notifyWith(...) }
			// deferred.resolve = function() { deferred.resolveWith(...) }
			// deferred.reject = function() { deferred.rejectWith(...) }
			deferred[ tuple[ 0 ] ] = function() {
				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
				return this;
			};

			// deferred.notifyWith = list.fireWith
			// deferred.resolveWith = list.fireWith
			// deferred.rejectWith = list.fireWith
			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
		} );

		// Make the deferred a promise
		promise.promise( deferred );

		// Call given func if any
		if ( func ) {
			func.call( deferred, deferred );
		}

		// All done!
		return deferred;
	},

	// Deferred helper
	when: function( singleValue ) {
		var

			// count of uncompleted subordinates
			remaining = arguments.length,

			// count of unprocessed arguments
			i = remaining,

			// subordinate fulfillment data
			resolveContexts = Array( i ),
			resolveValues = slice.call( arguments ),

			// the master Deferred
			master = jQuery.Deferred(),

			// subordinate callback factory
			updateFunc = function( i ) {
				return function( value ) {
					resolveContexts[ i ] = this;
					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
					if ( !( --remaining ) ) {
						master.resolveWith( resolveContexts, resolveValues );
					}
				};
			};

		// Single- and empty arguments are adopted like Promise.resolve
		if ( remaining <= 1 ) {
			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
				!remaining );

			// Use .then() to unwrap secondary thenables (cf. gh-3000)
			if ( master.state() === "pending" ||
				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {

				return master.then();
			}
		}

		// Multiple arguments are aggregated like Promise.all array elements
		while ( i-- ) {
			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
		}

		return master.promise();
	}
} );


// These usually indicate a programmer mistake during development,
// warn about them ASAP rather than swallowing them by default.
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;

jQuery.Deferred.exceptionHook = function( error, stack ) {

	// Support: IE 8 - 9 only
	// Console exists when dev tools are open, which can happen at any time
	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
	}
};




jQuery.readyException = function( error ) {
	window.setTimeout( function() {
		throw error;
	} );
};




// The deferred used on DOM ready
var readyList = jQuery.Deferred();

jQuery.fn.ready = function( fn ) {

	readyList
		.then( fn )

		// Wrap jQuery.readyException in a function so that the lookup
		// happens at the time of error handling instead of callback
		// registration.
		.catch( function( error ) {
			jQuery.readyException( error );
		} );

	return this;
};

jQuery.extend( {

	// Is the DOM ready to be used? Set to true once it occurs.
	isReady: false,

	// A counter to track how many items to wait for before
	// the ready event fires. See #6781
	readyWait: 1,

	// Handle when the DOM is ready
	ready: function( wait ) {

		// Abort if there are pending holds or we're already ready
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
			return;
		}

		// Remember that the DOM is ready
		jQuery.isReady = true;

		// If a normal DOM Ready event fired, decrement, and wait if need be
		if ( wait !== true && --jQuery.readyWait > 0 ) {
			return;
		}

		// If there are functions bound, to execute
		readyList.resolveWith( document, [ jQuery ] );
	}
} );

jQuery.ready.then = readyList.then;

// The ready event handler and self cleanup method
function completed() {
	document.removeEventListener( "DOMContentLoaded", completed );
	window.removeEventListener( "load", completed );
	jQuery.ready();
}

// Catch cases where $(document).ready() is called
// after the browser event has already occurred.
// Support: IE <=9 - 10 only
// Older IE sometimes signals "interactive" too soon
if ( document.readyState === "complete" ||
	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {

	// Handle it asynchronously to allow scripts the opportunity to delay ready
	window.setTimeout( jQuery.ready );

} else {

	// Use the handy event callback
	document.addEventListener( "DOMContentLoaded", completed );

	// A fallback to window.onload, that will always work
	window.addEventListener( "load", completed );
}




// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
	var i = 0,
		len = elems.length,
		bulk = key == null;

	// Sets many values
	if ( toType( key ) === "object" ) {
		chainable = true;
		for ( i in key ) {
			access( elems, fn, i, key[ i ], true, emptyGet, raw );
		}

	// Sets one value
	} else if ( value !== undefined ) {
		chainable = true;

		if ( !isFunction( value ) ) {
			raw = true;
		}

		if ( bulk ) {

			// Bulk operations run against the entire set
			if ( raw ) {
				fn.call( elems, value );
				fn = null;

			// ...except when executing function values
			} else {
				bulk = fn;
				fn = function( elem, _key, value ) {
					return bulk.call( jQuery( elem ), value );
				};
			}
		}

		if ( fn ) {
			for ( ; i < len; i++ ) {
				fn(
					elems[ i ], key, raw ?
					value :
					value.call( elems[ i ], i, fn( elems[ i ], key ) )
				);
			}
		}
	}

	if ( chainable ) {
		return elems;
	}

	// Gets
	if ( bulk ) {
		return fn.call( elems );
	}

	return len ? fn( elems[ 0 ], key ) : emptyGet;
};


// Matches dashed string for camelizing
var rmsPrefix = /^-ms-/,
	rdashAlpha = /-([a-z])/g;

// Used by camelCase as callback to replace()
function fcamelCase( _all, letter ) {
	return letter.toUpperCase();
}

// Convert dashed to camelCase; used by the css and data modules
// Support: IE <=9 - 11, Edge 12 - 15
// Microsoft forgot to hump their vendor prefix (#9572)
function camelCase( string ) {
	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
}
var acceptData = function( owner ) {

	// Accepts only:
	//  - Node
	//    - Node.ELEMENT_NODE
	//    - Node.DOCUMENT_NODE
	//  - Object
	//    - Any
	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
};




function Data() {
	this.expando = jQuery.expando + Data.uid++;
}

Data.uid = 1;

Data.prototype = {

	cache: function( owner ) {

		// Check if the owner object already has a cache
		var value = owner[ this.expando ];

		// If not, create one
		if ( !value ) {
			value = {};

			// We can accept data for non-element nodes in modern browsers,
			// but we should not, see #8335.
			// Always return an empty object.
			if ( acceptData( owner ) ) {

				// If it is a node unlikely to be stringify-ed or looped over
				// use plain assignment
				if ( owner.nodeType ) {
					owner[ this.expando ] = value;

				// Otherwise secure it in a non-enumerable property
				// configurable must be true to allow the property to be
				// deleted when data is removed
				} else {
					Object.defineProperty( owner, this.expando, {
						value: value,
						configurable: true
					} );
				}
			}
		}

		return value;
	},
	set: function( owner, data, value ) {
		var prop,
			cache = this.cache( owner );

		// Handle: [ owner, key, value ] args
		// Always use camelCase key (gh-2257)
		if ( typeof data === "string" ) {
			cache[ camelCase( data ) ] = value;

		// Handle: [ owner, { properties } ] args
		} else {

			// Copy the properties one-by-one to the cache object
			for ( prop in data ) {
				cache[ camelCase( prop ) ] = data[ prop ];
			}
		}
		return cache;
	},
	get: function( owner, key ) {
		return key === undefined ?
			this.cache( owner ) :

			// Always use camelCase key (gh-2257)
			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
	},
	access: function( owner, key, value ) {

		// In cases where either:
		//
		//   1. No key was specified
		//   2. A string key was specified, but no value provided
		//
		// Take the "read" path and allow the get method to determine
		// which value to return, respectively either:
		//
		//   1. The entire cache object
		//   2. The data stored at the key
		//
		if ( key === undefined ||
				( ( key && typeof key === "string" ) && value === undefined ) ) {

			return this.get( owner, key );
		}

		// When the key is not a string, or both a key and value
		// are specified, set or extend (existing objects) with either:
		//
		//   1. An object of properties
		//   2. A key and value
		//
		this.set( owner, key, value );

		// Since the "set" path can have two possible entry points
		// return the expected data based on which path was taken[*]
		return value !== undefined ? value : key;
	},
	remove: function( owner, key ) {
		var i,
			cache = owner[ this.expando ];

		if ( cache === undefined ) {
			return;
		}

		if ( key !== undefined ) {

			// Support array or space separated string of keys
			if ( Array.isArray( key ) ) {

				// If key is an array of keys...
				// We always set camelCase keys, so remove that.
				key = key.map( camelCase );
			} else {
				key = camelCase( key );

				// If a key with the spaces exists, use it.
				// Otherwise, create an array by matching non-whitespace
				key = key in cache ?
					[ key ] :
					( key.match( rnothtmlwhite ) || [] );
			}

			i = key.length;

			while ( i-- ) {
				delete cache[ key[ i ] ];
			}
		}

		// Remove the expando if there's no more data
		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {

			// Support: Chrome <=35 - 45
			// Webkit & Blink performance suffers when deleting properties
			// from DOM nodes, so set to undefined instead
			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
			if ( owner.nodeType ) {
				owner[ this.expando ] = undefined;
			} else {
				delete owner[ this.expando ];
			}
		}
	},
	hasData: function( owner ) {
		var cache = owner[ this.expando ];
		return cache !== undefined && !jQuery.isEmptyObject( cache );
	}
};
var dataPriv = new Data();

var dataUser = new Data();



//	Implementation Summary
//
//	1. Enforce API surface and semantic compatibility with 1.9.x branch
//	2. Improve the module's maintainability by reducing the storage
//		paths to a single mechanism.
//	3. Use the same single mechanism to support "private" and "user" data.
//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
//	5. Avoid exposing implementation details on user objects (eg. expando properties)
//	6. Provide a clear path for implementation upgrade to WeakMap in 2014

var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	rmultiDash = /[A-Z]/g;

function getData( data ) {
	if ( data === "true" ) {
		return true;
	}

	if ( data === "false" ) {
		return false;
	}

	if ( data === "null" ) {
		return null;
	}

	// Only convert to a number if it doesn't change the string
	if ( data === +data + "" ) {
		return +data;
	}

	if ( rbrace.test( data ) ) {
		return JSON.parse( data );
	}

	return data;
}

function dataAttr( elem, key, data ) {
	var name;

	// If nothing was found internally, try to fetch any
	// data from the HTML5 data-* attribute
	if ( data === undefined && elem.nodeType === 1 ) {
		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
		data = elem.getAttribute( name );

		if ( typeof data === "string" ) {
			try {
				data = getData( data );
			} catch ( e ) {}

			// Make sure we set the data so it isn't changed later
			dataUser.set( elem, key, data );
		} else {
			data = undefined;
		}
	}
	return data;
}

jQuery.extend( {
	hasData: function( elem ) {
		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
	},

	data: function( elem, name, data ) {
		return dataUser.access( elem, name, data );
	},

	removeData: function( elem, name ) {
		dataUser.remove( elem, name );
	},

	// TODO: Now that all calls to _data and _removeData have been replaced
	// with direct calls to dataPriv methods, these can be deprecated.
	_data: function( elem, name, data ) {
		return dataPriv.access( elem, name, data );
	},

	_removeData: function( elem, name ) {
		dataPriv.remove( elem, name );
	}
} );

jQuery.fn.extend( {
	data: function( key, value ) {
		var i, name, data,
			elem = this[ 0 ],
			attrs = elem && elem.attributes;

		// Gets all values
		if ( key === undefined ) {
			if ( this.length ) {
				data = dataUser.get( elem );

				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
					i = attrs.length;
					while ( i-- ) {

						// Support: IE 11 only
						// The attrs elements can be null (#14894)
						if ( attrs[ i ] ) {
							name = attrs[ i ].name;
							if ( name.indexOf( "data-" ) === 0 ) {
								name = camelCase( name.slice( 5 ) );
								dataAttr( elem, name, data[ name ] );
							}
						}
					}
					dataPriv.set( elem, "hasDataAttrs", true );
				}
			}

			return data;
		}

		// Sets multiple values
		if ( typeof key === "object" ) {
			return this.each( function() {
				dataUser.set( this, key );
			} );
		}

		return access( this, function( value ) {
			var data;

			// The calling jQuery object (element matches) is not empty
			// (and therefore has an element appears at this[ 0 ]) and the
			// `value` parameter was not undefined. An empty jQuery object
			// will result in `undefined` for elem = this[ 0 ] which will
			// throw an exception if an attempt to read a data cache is made.
			if ( elem && value === undefined ) {

				// Attempt to get data from the cache
				// The key will always be camelCased in Data
				data = dataUser.get( elem, key );
				if ( data !== undefined ) {
					return data;
				}

				// Attempt to "discover" the data in
				// HTML5 custom data-* attrs
				data = dataAttr( elem, key );
				if ( data !== undefined ) {
					return data;
				}

				// We tried really hard, but the data doesn't exist.
				return;
			}

			// Set the data...
			this.each( function() {

				// We always store the camelCased key
				dataUser.set( this, key, value );
			} );
		}, null, value, arguments.length > 1, null, true );
	},

	removeData: function( key ) {
		return this.each( function() {
			dataUser.remove( this, key );
		} );
	}
} );


jQuery.extend( {
	queue: function( elem, type, data ) {
		var queue;

		if ( elem ) {
			type = ( type || "fx" ) + "queue";
			queue = dataPriv.get( elem, type );

			// Speed up dequeue by getting out quickly if this is just a lookup
			if ( data ) {
				if ( !queue || Array.isArray( data ) ) {
					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
				} else {
					queue.push( data );
				}
			}
			return queue || [];
		}
	},

	dequeue: function( elem, type ) {
		type = type || "fx";

		var queue = jQuery.queue( elem, type ),
			startLength = queue.length,
			fn = queue.shift(),
			hooks = jQuery._queueHooks( elem, type ),
			next = function() {
				jQuery.dequeue( elem, type );
			};

		// If the fx queue is dequeued, always remove the progress sentinel
		if ( fn === "inprogress" ) {
			fn = queue.shift();
			startLength--;
		}

		if ( fn ) {

			// Add a progress sentinel to prevent the fx queue from being
			// automatically dequeued
			if ( type === "fx" ) {
				queue.unshift( "inprogress" );
			}

			// Clear up the last queue stop function
			delete hooks.stop;
			fn.call( elem, next, hooks );
		}

		if ( !startLength && hooks ) {
			hooks.empty.fire();
		}
	},

	// Not public - generate a queueHooks object, or return the current one
	_queueHooks: function( elem, type ) {
		var key = type + "queueHooks";
		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
			empty: jQuery.Callbacks( "once memory" ).add( function() {
				dataPriv.remove( elem, [ type + "queue", key ] );
			} )
		} );
	}
} );

jQuery.fn.extend( {
	queue: function( type, data ) {
		var setter = 2;

		if ( typeof type !== "string" ) {
			data = type;
			type = "fx";
			setter--;
		}

		if ( arguments.length < setter ) {
			return jQuery.queue( this[ 0 ], type );
		}

		return data === undefined ?
			this :
			this.each( function() {
				var queue = jQuery.queue( this, type, data );

				// Ensure a hooks for this queue
				jQuery._queueHooks( this, type );

				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
					jQuery.dequeue( this, type );
				}
			} );
	},
	dequeue: function( type ) {
		return this.each( function() {
			jQuery.dequeue( this, type );
		} );
	},
	clearQueue: function( type ) {
		return this.queue( type || "fx", [] );
	},

	// Get a promise resolved when queues of a certain type
	// are emptied (fx is the type by default)
	promise: function( type, obj ) {
		var tmp,
			count = 1,
			defer = jQuery.Deferred(),
			elements = this,
			i = this.length,
			resolve = function() {
				if ( !( --count ) ) {
					defer.resolveWith( elements, [ elements ] );
				}
			};

		if ( typeof type !== "string" ) {
			obj = type;
			type = undefined;
		}
		type = type || "fx";

		while ( i-- ) {
			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
			if ( tmp && tmp.empty ) {
				count++;
				tmp.empty.add( resolve );
			}
		}
		resolve();
		return defer.promise( obj );
	}
} );
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;

var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );


var cssExpand = [ "Top", "Right", "Bottom", "Left" ];

var documentElement = document.documentElement;



	var isAttached = function( elem ) {
			return jQuery.contains( elem.ownerDocument, elem );
		},
		composed = { composed: true };

	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
	// Check attachment across shadow DOM boundaries when possible (gh-3504)
	// Support: iOS 10.0-10.2 only
	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
	// leading to errors. We need to check for `getRootNode`.
	if ( documentElement.getRootNode ) {
		isAttached = function( elem ) {
			return jQuery.contains( elem.ownerDocument, elem ) ||
				elem.getRootNode( composed ) === elem.ownerDocument;
		};
	}
var isHiddenWithinTree = function( elem, el ) {

		// isHiddenWithinTree might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;

		// Inline style trumps all
		return elem.style.display === "none" ||
			elem.style.display === "" &&

			// Otherwise, check computed style
			// Support: Firefox <=43 - 45
			// Disconnected elements can have computed display: none, so first confirm that elem is
			// in the document.
			isAttached( elem ) &&

			jQuery.css( elem, "display" ) === "none";
	};



function adjustCSS( elem, prop, valueParts, tween ) {
	var adjusted, scale,
		maxIterations = 20,
		currentValue = tween ?
			function() {
				return tween.cur();
			} :
			function() {
				return jQuery.css( elem, prop, "" );
			},
		initial = currentValue(),
		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),

		// Starting value computation is required for potential unit mismatches
		initialInUnit = elem.nodeType &&
			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
			rcssNum.exec( jQuery.css( elem, prop ) );

	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {

		// Support: Firefox <=54
		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
		initial = initial / 2;

		// Trust units reported by jQuery.css
		unit = unit || initialInUnit[ 3 ];

		// Iteratively approximate from a nonzero starting point
		initialInUnit = +initial || 1;

		while ( maxIterations-- ) {

			// Evaluate and update our best guess (doubling guesses that zero out).
			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
			jQuery.style( elem, prop, initialInUnit + unit );
			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
				maxIterations = 0;
			}
			initialInUnit = initialInUnit / scale;

		}

		initialInUnit = initialInUnit * 2;
		jQuery.style( elem, prop, initialInUnit + unit );

		// Make sure we update the tween properties later on
		valueParts = valueParts || [];
	}

	if ( valueParts ) {
		initialInUnit = +initialInUnit || +initial || 0;

		// Apply relative offset (+=/-=) if specified
		adjusted = valueParts[ 1 ] ?
			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
			+valueParts[ 2 ];
		if ( tween ) {
			tween.unit = unit;
			tween.start = initialInUnit;
			tween.end = adjusted;
		}
	}
	return adjusted;
}


var defaultDisplayMap = {};

function getDefaultDisplay( elem ) {
	var temp,
		doc = elem.ownerDocument,
		nodeName = elem.nodeName,
		display = defaultDisplayMap[ nodeName ];

	if ( display ) {
		return display;
	}

	temp = doc.body.appendChild( doc.createElement( nodeName ) );
	display = jQuery.css( temp, "display" );

	temp.parentNode.removeChild( temp );

	if ( display === "none" ) {
		display = "block";
	}
	defaultDisplayMap[ nodeName ] = display;

	return display;
}

function showHide( elements, show ) {
	var display, elem,
		values = [],
		index = 0,
		length = elements.length;

	// Determine new display value for elements that need to change
	for ( ; index < length; index++ ) {
		elem = elements[ index ];
		if ( !elem.style ) {
			continue;
		}

		display = elem.style.display;
		if ( show ) {

			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
			// check is required in this first loop unless we have a nonempty display value (either
			// inline or about-to-be-restored)
			if ( display === "none" ) {
				values[ index ] = dataPriv.get( elem, "display" ) || null;
				if ( !values[ index ] ) {
					elem.style.display = "";
				}
			}
			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
				values[ index ] = getDefaultDisplay( elem );
			}
		} else {
			if ( display !== "none" ) {
				values[ index ] = "none";

				// Remember what we're overwriting
				dataPriv.set( elem, "display", display );
			}
		}
	}

	// Set the display of the elements in a second loop to avoid constant reflow
	for ( index = 0; index < length; index++ ) {
		if ( values[ index ] != null ) {
			elements[ index ].style.display = values[ index ];
		}
	}

	return elements;
}

jQuery.fn.extend( {
	show: function() {
		return showHide( this, true );
	},
	hide: function() {
		return showHide( this );
	},
	toggle: function( state ) {
		if ( typeof state === "boolean" ) {
			return state ? this.show() : this.hide();
		}

		return this.each( function() {
			if ( isHiddenWithinTree( this ) ) {
				jQuery( this ).show();
			} else {
				jQuery( this ).hide();
			}
		} );
	}
} );
var rcheckableType = ( /^(?:checkbox|radio)$/i );

var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );

var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );



( function() {
	var fragment = document.createDocumentFragment(),
		div = fragment.appendChild( document.createElement( "div" ) ),
		input = document.createElement( "input" );

	// Support: Android 4.0 - 4.3 only
	// Check state lost if the name is set (#11217)
	// Support: Windows Web Apps (WWA)
	// `name` and `type` must use .setAttribute for WWA (#14901)
	input.setAttribute( "type", "radio" );
	input.setAttribute( "checked", "checked" );
	input.setAttribute( "name", "t" );

	div.appendChild( input );

	// Support: Android <=4.1 only
	// Older WebKit doesn't clone checked state correctly in fragments
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;

	// Support: IE <=11 only
	// Make sure textarea (and checkbox) defaultValue is properly cloned
	div.innerHTML = "<textarea>x</textarea>";
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;

	// Support: IE <=9 only
	// IE <=9 replaces <option> tags with their contents when inserted outside of
	// the select element.
	div.innerHTML = "<option></option>";
	support.option = !!div.lastChild;
} )();


// We have to close these tags to support XHTML (#13200)
var wrapMap = {

	// XHTML parsers do not magically insert elements in the
	// same way that tag soup parsers do. So we cannot shorten
	// this by omitting <tbody> or other required elements.
	thead: [ 1, "<table>", "</table>" ],
	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],

	_default: [ 0, "", "" ]
};

wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;

// Support: IE <=9 only
if ( !support.option ) {
	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
}


function getAll( context, tag ) {

	// Support: IE <=9 - 11 only
	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
	var ret;

	if ( typeof context.getElementsByTagName !== "undefined" ) {
		ret = context.getElementsByTagName( tag || "*" );

	} else if ( typeof context.querySelectorAll !== "undefined" ) {
		ret = context.querySelectorAll( tag || "*" );

	} else {
		ret = [];
	}

	if ( tag === undefined || tag && nodeName( context, tag ) ) {
		return jQuery.merge( [ context ], ret );
	}

	return ret;
}


// Mark scripts as having already been evaluated
function setGlobalEval( elems, refElements ) {
	var i = 0,
		l = elems.length;

	for ( ; i < l; i++ ) {
		dataPriv.set(
			elems[ i ],
			"globalEval",
			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
		);
	}
}


var rhtml = /<|&#?\w+;/;

function buildFragment( elems, context, scripts, selection, ignored ) {
	var elem, tmp, tag, wrap, attached, j,
		fragment = context.createDocumentFragment(),
		nodes = [],
		i = 0,
		l = elems.length;

	for ( ; i < l; i++ ) {
		elem = elems[ i ];

		if ( elem || elem === 0 ) {

			// Add nodes directly
			if ( toType( elem ) === "object" ) {

				// Support: Android <=4.0 only, PhantomJS 1 only
				// push.apply(_, arraylike) throws on ancient WebKit
				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );

			// Convert non-html into a text node
			} else if ( !rhtml.test( elem ) ) {
				nodes.push( context.createTextNode( elem ) );

			// Convert html into DOM nodes
			} else {
				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );

				// Deserialize a standard representation
				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
				wrap = wrapMap[ tag ] || wrapMap._default;
				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];

				// Descend through wrappers to the right content
				j = wrap[ 0 ];
				while ( j-- ) {
					tmp = tmp.lastChild;
				}

				// Support: Android <=4.0 only, PhantomJS 1 only
				// push.apply(_, arraylike) throws on ancient WebKit
				jQuery.merge( nodes, tmp.childNodes );

				// Remember the top-level container
				tmp = fragment.firstChild;

				// Ensure the created nodes are orphaned (#12392)
				tmp.textContent = "";
			}
		}
	}

	// Remove wrapper from fragment
	fragment.textContent = "";

	i = 0;
	while ( ( elem = nodes[ i++ ] ) ) {

		// Skip elements already in the context collection (trac-4087)
		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
			if ( ignored ) {
				ignored.push( elem );
			}
			continue;
		}

		attached = isAttached( elem );

		// Append to fragment
		tmp = getAll( fragment.appendChild( elem ), "script" );

		// Preserve script evaluation history
		if ( attached ) {
			setGlobalEval( tmp );
		}

		// Capture executables
		if ( scripts ) {
			j = 0;
			while ( ( elem = tmp[ j++ ] ) ) {
				if ( rscriptType.test( elem.type || "" ) ) {
					scripts.push( elem );
				}
			}
		}
	}

	return fragment;
}


var
	rkeyEvent = /^key/,
	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

function returnTrue() {
	return true;
}

function returnFalse() {
	return false;
}

// Support: IE <=9 - 11+
// focus() and blur() are asynchronous, except when they are no-op.
// So expect focus to be synchronous when the element is already active,
// and blur to be synchronous when the element is not already active.
// (focus and blur are always synchronous in other supported browsers,
// this just defines when we can count on it).
function expectSync( elem, type ) {
	return ( elem === safeActiveElement() ) === ( type === "focus" );
}

// Support: IE <=9 only
// Accessing document.activeElement can throw unexpectedly
// https://bugs.jquery.com/ticket/13393
function safeActiveElement() {
	try {
		return document.activeElement;
	} catch ( err ) { }
}

function on( elem, types, selector, data, fn, one ) {
	var origFn, type;

	// Types can be a map of types/handlers
	if ( typeof types === "object" ) {

		// ( types-Object, selector, data )
		if ( typeof selector !== "string" ) {

			// ( types-Object, data )
			data = data || selector;
			selector = undefined;
		}
		for ( type in types ) {
			on( elem, type, selector, data, types[ type ], one );
		}
		return elem;
	}

	if ( data == null && fn == null ) {

		// ( types, fn )
		fn = selector;
		data = selector = undefined;
	} else if ( fn == null ) {
		if ( typeof selector === "string" ) {

			// ( types, selector, fn )
			fn = data;
			data = undefined;
		} else {

			// ( types, data, fn )
			fn = data;
			data = selector;
			selector = undefined;
		}
	}
	if ( fn === false ) {
		fn = returnFalse;
	} else if ( !fn ) {
		return elem;
	}

	if ( one === 1 ) {
		origFn = fn;
		fn = function( event ) {

			// Can use an empty set, since event contains the info
			jQuery().off( event );
			return origFn.apply( this, arguments );
		};

		// Use same guid so caller can remove using origFn
		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
	}
	return elem.each( function() {
		jQuery.event.add( this, types, fn, data, selector );
	} );
}

/*
 * Helper functions for managing events -- not part of the public interface.
 * Props to Dean Edwards' addEvent library for many of the ideas.
 */
jQuery.event = {

	global: {},

	add: function( elem, types, handler, data, selector ) {

		var handleObjIn, eventHandle, tmp,
			events, t, handleObj,
			special, handlers, type, namespaces, origType,
			elemData = dataPriv.get( elem );

		// Only attach events to objects that accept data
		if ( !acceptData( elem ) ) {
			return;
		}

		// Caller can pass in an object of custom data in lieu of the handler
		if ( handler.handler ) {
			handleObjIn = handler;
			handler = handleObjIn.handler;
			selector = handleObjIn.selector;
		}

		// Ensure that invalid selectors throw exceptions at attach time
		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
		if ( selector ) {
			jQuery.find.matchesSelector( documentElement, selector );
		}

		// Make sure that the handler has a unique ID, used to find/remove it later
		if ( !handler.guid ) {
			handler.guid = jQuery.guid++;
		}

		// Init the element's event structure and main handler, if this is the first
		if ( !( events = elemData.events ) ) {
			events = elemData.events = Object.create( null );
		}
		if ( !( eventHandle = elemData.handle ) ) {
			eventHandle = elemData.handle = function( e ) {

				// Discard the second event of a jQuery.event.trigger() and
				// when an event is called after a page has unloaded
				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
			};
		}

		// Handle multiple events separated by a space
		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// There *must* be a type, no attaching namespace-only handlers
			if ( !type ) {
				continue;
			}

			// If event changes its type, use the special event handlers for the changed type
			special = jQuery.event.special[ type ] || {};

			// If selector defined, determine special event api type, otherwise given type
			type = ( selector ? special.delegateType : special.bindType ) || type;

			// Update special based on newly reset type
			special = jQuery.event.special[ type ] || {};

			// handleObj is passed to all event handlers
			handleObj = jQuery.extend( {
				type: type,
				origType: origType,
				data: data,
				handler: handler,
				guid: handler.guid,
				selector: selector,
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
				namespace: namespaces.join( "." )
			}, handleObjIn );

			// Init the event handler queue if we're the first
			if ( !( handlers = events[ type ] ) ) {
				handlers = events[ type ] = [];
				handlers.delegateCount = 0;

				// Only use addEventListener if the special events handler returns false
				if ( !special.setup ||
					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {

					if ( elem.addEventListener ) {
						elem.addEventListener( type, eventHandle );
					}
				}
			}

			if ( special.add ) {
				special.add.call( elem, handleObj );

				if ( !handleObj.handler.guid ) {
					handleObj.handler.guid = handler.guid;
				}
			}

			// Add to the element's handler list, delegates in front
			if ( selector ) {
				handlers.splice( handlers.delegateCount++, 0, handleObj );
			} else {
				handlers.push( handleObj );
			}

			// Keep track of which events have ever been used, for event optimization
			jQuery.event.global[ type ] = true;
		}

	},

	// Detach an event or set of events from an element
	remove: function( elem, types, handler, selector, mappedTypes ) {

		var j, origCount, tmp,
			events, t, handleObj,
			special, handlers, type, namespaces, origType,
			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );

		if ( !elemData || !( events = elemData.events ) ) {
			return;
		}

		// Once for each type.namespace in types; type may be omitted
		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// Unbind all events (on this namespace, if provided) for the element
			if ( !type ) {
				for ( type in events ) {
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
				}
				continue;
			}

			special = jQuery.event.special[ type ] || {};
			type = ( selector ? special.delegateType : special.bindType ) || type;
			handlers = events[ type ] || [];
			tmp = tmp[ 2 ] &&
				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );

			// Remove matching events
			origCount = j = handlers.length;
			while ( j-- ) {
				handleObj = handlers[ j ];

				if ( ( mappedTypes || origType === handleObj.origType ) &&
					( !handler || handler.guid === handleObj.guid ) &&
					( !tmp || tmp.test( handleObj.namespace ) ) &&
					( !selector || selector === handleObj.selector ||
						selector === "**" && handleObj.selector ) ) {
					handlers.splice( j, 1 );

					if ( handleObj.selector ) {
						handlers.delegateCount--;
					}
					if ( special.remove ) {
						special.remove.call( elem, handleObj );
					}
				}
			}

			// Remove generic event handler if we removed something and no more handlers exist
			// (avoids potential for endless recursion during removal of special event handlers)
			if ( origCount && !handlers.length ) {
				if ( !special.teardown ||
					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {

					jQuery.removeEvent( elem, type, elemData.handle );
				}

				delete events[ type ];
			}
		}

		// Remove data and the expando if it's no longer used
		if ( jQuery.isEmptyObject( events ) ) {
			dataPriv.remove( elem, "handle events" );
		}
	},

	dispatch: function( nativeEvent ) {

		var i, j, ret, matched, handleObj, handlerQueue,
			args = new Array( arguments.length ),

			// Make a writable jQuery.Event from the native event object
			event = jQuery.event.fix( nativeEvent ),

			handlers = (
					dataPriv.get( this, "events" ) || Object.create( null )
				)[ event.type ] || [],
			special = jQuery.event.special[ event.type ] || {};

		// Use the fix-ed jQuery.Event rather than the (read-only) native event
		args[ 0 ] = event;

		for ( i = 1; i < arguments.length; i++ ) {
			args[ i ] = arguments[ i ];
		}

		event.delegateTarget = this;

		// Call the preDispatch hook for the mapped type, and let it bail if desired
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
			return;
		}

		// Determine handlers
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );

		// Run delegates first; they may want to stop propagation beneath us
		i = 0;
		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
			event.currentTarget = matched.elem;

			j = 0;
			while ( ( handleObj = matched.handlers[ j++ ] ) &&
				!event.isImmediatePropagationStopped() ) {

				// If the event is namespaced, then each handler is only invoked if it is
				// specially universal or its namespaces are a superset of the event's.
				if ( !event.rnamespace || handleObj.namespace === false ||
					event.rnamespace.test( handleObj.namespace ) ) {

					event.handleObj = handleObj;
					event.data = handleObj.data;

					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
						handleObj.handler ).apply( matched.elem, args );

					if ( ret !== undefined ) {
						if ( ( event.result = ret ) === false ) {
							event.preventDefault();
							event.stopPropagation();
						}
					}
				}
			}
		}

		// Call the postDispatch hook for the mapped type
		if ( special.postDispatch ) {
			special.postDispatch.call( this, event );
		}

		return event.result;
	},

	handlers: function( event, handlers ) {
		var i, handleObj, sel, matchedHandlers, matchedSelectors,
			handlerQueue = [],
			delegateCount = handlers.delegateCount,
			cur = event.target;

		// Find delegate handlers
		if ( delegateCount &&

			// Support: IE <=9
			// Black-hole SVG <use> instance trees (trac-13180)
			cur.nodeType &&

			// Support: Firefox <=42
			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
			// Support: IE 11 only
			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
			!( event.type === "click" && event.button >= 1 ) ) {

			for ( ; cur !== this; cur = cur.parentNode || this ) {

				// Don't check non-elements (#13208)
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
					matchedHandlers = [];
					matchedSelectors = {};
					for ( i = 0; i < delegateCount; i++ ) {
						handleObj = handlers[ i ];

						// Don't conflict with Object.prototype properties (#13203)
						sel = handleObj.selector + " ";

						if ( matchedSelectors[ sel ] === undefined ) {
							matchedSelectors[ sel ] = handleObj.needsContext ?
								jQuery( sel, this ).index( cur ) > -1 :
								jQuery.find( sel, this, null, [ cur ] ).length;
						}
						if ( matchedSelectors[ sel ] ) {
							matchedHandlers.push( handleObj );
						}
					}
					if ( matchedHandlers.length ) {
						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
					}
				}
			}
		}

		// Add the remaining (directly-bound) handlers
		cur = this;
		if ( delegateCount < handlers.length ) {
			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
		}

		return handlerQueue;
	},

	addProp: function( name, hook ) {
		Object.defineProperty( jQuery.Event.prototype, name, {
			enumerable: true,
			configurable: true,

			get: isFunction( hook ) ?
				function() {
					if ( this.originalEvent ) {
							return hook( this.originalEvent );
					}
				} :
				function() {
					if ( this.originalEvent ) {
							return this.originalEvent[ name ];
					}
				},

			set: function( value ) {
				Object.defineProperty( this, name, {
					enumerable: true,
					configurable: true,
					writable: true,
					value: value
				} );
			}
		} );
	},

	fix: function( originalEvent ) {
		return originalEvent[ jQuery.expando ] ?
			originalEvent :
			new jQuery.Event( originalEvent );
	},

	special: {
		load: {

			// Prevent triggered image.load events from bubbling to window.load
			noBubble: true
		},
		click: {

			// Utilize native event to ensure correct state for checkable inputs
			setup: function( data ) {

				// For mutual compressibility with _default, replace `this` access with a local var.
				// `|| data` is dead code meant only to preserve the variable through minification.
				var el = this || data;

				// Claim the first handler
				if ( rcheckableType.test( el.type ) &&
					el.click && nodeName( el, "input" ) ) {

					// dataPriv.set( el, "click", ... )
					leverageNative( el, "click", returnTrue );
				}

				// Return false to allow normal processing in the caller
				return false;
			},
			trigger: function( data ) {

				// For mutual compressibility with _default, replace `this` access with a local var.
				// `|| data` is dead code meant only to preserve the variable through minification.
				var el = this || data;

				// Force setup before triggering a click
				if ( rcheckableType.test( el.type ) &&
					el.click && nodeName( el, "input" ) ) {

					leverageNative( el, "click" );
				}

				// Return non-false to allow normal event-path propagation
				return true;
			},

			// For cross-browser consistency, suppress native .click() on links
			// Also prevent it if we're currently inside a leveraged native-event stack
			_default: function( event ) {
				var target = event.target;
				return rcheckableType.test( target.type ) &&
					target.click && nodeName( target, "input" ) &&
					dataPriv.get( target, "click" ) ||
					nodeName( target, "a" );
			}
		},

		beforeunload: {
			postDispatch: function( event ) {

				// Support: Firefox 20+
				// Firefox doesn't alert if the returnValue field is not set.
				if ( event.result !== undefined && event.originalEvent ) {
					event.originalEvent.returnValue = event.result;
				}
			}
		}
	}
};

// Ensure the presence of an event listener that handles manually-triggered
// synthetic events by interrupting progress until reinvoked in response to
// *native* events that it fires directly, ensuring that state changes have
// already occurred before other listeners are invoked.
function leverageNative( el, type, expectSync ) {

	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
	if ( !expectSync ) {
		if ( dataPriv.get( el, type ) === undefined ) {
			jQuery.event.add( el, type, returnTrue );
		}
		return;
	}

	// Register the controller as a special universal handler for all event namespaces
	dataPriv.set( el, type, false );
	jQuery.event.add( el, type, {
		namespace: false,
		handler: function( event ) {
			var notAsync, result,
				saved = dataPriv.get( this, type );

			if ( ( event.isTrigger & 1 ) && this[ type ] ) {

				// Interrupt processing of the outer synthetic .trigger()ed event
				// Saved data should be false in such cases, but might be a leftover capture object
				// from an async native handler (gh-4350)
				if ( !saved.length ) {

					// Store arguments for use when handling the inner native event
					// There will always be at least one argument (an event object), so this array
					// will not be confused with a leftover capture object.
					saved = slice.call( arguments );
					dataPriv.set( this, type, saved );

					// Trigger the native event and capture its result
					// Support: IE <=9 - 11+
					// focus() and blur() are asynchronous
					notAsync = expectSync( this, type );
					this[ type ]();
					result = dataPriv.get( this, type );
					if ( saved !== result || notAsync ) {
						dataPriv.set( this, type, false );
					} else {
						result = {};
					}
					if ( saved !== result ) {

						// Cancel the outer synthetic event
						event.stopImmediatePropagation();
						event.preventDefault();
						return result.value;
					}

				// If this is an inner synthetic event for an event with a bubbling surrogate
				// (focus or blur), assume that the surrogate already propagated from triggering the
				// native event and prevent that from happening again here.
				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
				// less bad than duplication.
				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
					event.stopPropagation();
				}

			// If this is a native event triggered above, everything is now in order
			// Fire an inner synthetic event with the original arguments
			} else if ( saved.length ) {

				// ...and capture the result
				dataPriv.set( this, type, {
					value: jQuery.event.trigger(

						// Support: IE <=9 - 11+
						// Extend with the prototype to reset the above stopImmediatePropagation()
						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
						saved.slice( 1 ),
						this
					)
				} );

				// Abort handling of the native event
				event.stopImmediatePropagation();
			}
		}
	} );
}

jQuery.removeEvent = function( elem, type, handle ) {

	// This "if" is needed for plain objects
	if ( elem.removeEventListener ) {
		elem.removeEventListener( type, handle );
	}
};

jQuery.Event = function( src, props ) {

	// Allow instantiation without the 'new' keyword
	if ( !( this instanceof jQuery.Event ) ) {
		return new jQuery.Event( src, props );
	}

	// Event object
	if ( src && src.type ) {
		this.originalEvent = src;
		this.type = src.type;

		// Events bubbling up the document may have been marked as prevented
		// by a handler lower down the tree; reflect the correct value.
		this.isDefaultPrevented = src.defaultPrevented ||
				src.defaultPrevented === undefined &&

				// Support: Android <=2.3 only
				src.returnValue === false ?
			returnTrue :
			returnFalse;

		// Create target properties
		// Support: Safari <=6 - 7 only
		// Target should not be a text node (#504, #13143)
		this.target = ( src.target && src.target.nodeType === 3 ) ?
			src.target.parentNode :
			src.target;

		this.currentTarget = src.currentTarget;
		this.relatedTarget = src.relatedTarget;

	// Event type
	} else {
		this.type = src;
	}

	// Put explicitly provided properties onto the event object
	if ( props ) {
		jQuery.extend( this, props );
	}

	// Create a timestamp if incoming event doesn't have one
	this.timeStamp = src && src.timeStamp || Date.now();

	// Mark it as fixed
	this[ jQuery.expando ] = true;
};

// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
	constructor: jQuery.Event,
	isDefaultPrevented: returnFalse,
	isPropagationStopped: returnFalse,
	isImmediatePropagationStopped: returnFalse,
	isSimulated: false,

	preventDefault: function() {
		var e = this.originalEvent;

		this.isDefaultPrevented = returnTrue;

		if ( e && !this.isSimulated ) {
			e.preventDefault();
		}
	},
	stopPropagation: function() {
		var e = this.originalEvent;

		this.isPropagationStopped = returnTrue;

		if ( e && !this.isSimulated ) {
			e.stopPropagation();
		}
	},
	stopImmediatePropagation: function() {
		var e = this.originalEvent;

		this.isImmediatePropagationStopped = returnTrue;

		if ( e && !this.isSimulated ) {
			e.stopImmediatePropagation();
		}

		this.stopPropagation();
	}
};

// Includes all common event props including KeyEvent and MouseEvent specific props
jQuery.each( {
	altKey: true,
	bubbles: true,
	cancelable: true,
	changedTouches: true,
	ctrlKey: true,
	detail: true,
	eventPhase: true,
	metaKey: true,
	pageX: true,
	pageY: true,
	shiftKey: true,
	view: true,
	"char": true,
	code: true,
	charCode: true,
	key: true,
	keyCode: true,
	button: true,
	buttons: true,
	clientX: true,
	clientY: true,
	offsetX: true,
	offsetY: true,
	pointerId: true,
	pointerType: true,
	screenX: true,
	screenY: true,
	targetTouches: true,
	toElement: true,
	touches: true,

	which: function( event ) {
		var button = event.button;

		// Add which for key events
		if ( event.which == null && rkeyEvent.test( event.type ) ) {
			return event.charCode != null ? event.charCode : event.keyCode;
		}

		// Add which for click: 1 === left; 2 === middle; 3 === right
		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
			if ( button & 1 ) {
				return 1;
			}

			if ( button & 2 ) {
				return 3;
			}

			if ( button & 4 ) {
				return 2;
			}

			return 0;
		}

		return event.which;
	}
}, jQuery.event.addProp );

jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
	jQuery.event.special[ type ] = {

		// Utilize native event if possible so blur/focus sequence is correct
		setup: function() {

			// Claim the first handler
			// dataPriv.set( this, "focus", ... )
			// dataPriv.set( this, "blur", ... )
			leverageNative( this, type, expectSync );

			// Return false to allow normal processing in the caller
			return false;
		},
		trigger: function() {

			// Force setup before trigger
			leverageNative( this, type );

			// Return non-false to allow normal event-path propagation
			return true;
		},

		delegateType: delegateType
	};
} );

// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
//
// Support: Safari 7 only
// Safari sends mouseenter too often; see:
// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
// for the description of the bug (it existed in older Chrome versions as well).
jQuery.each( {
	mouseenter: "mouseover",
	mouseleave: "mouseout",
	pointerenter: "pointerover",
	pointerleave: "pointerout"
}, function( orig, fix ) {
	jQuery.event.special[ orig ] = {
		delegateType: fix,
		bindType: fix,

		handle: function( event ) {
			var ret,
				target = this,
				related = event.relatedTarget,
				handleObj = event.handleObj;

			// For mouseenter/leave call the handler if related is outside the target.
			// NB: No relatedTarget if the mouse left/entered the browser window
			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
				event.type = handleObj.origType;
				ret = handleObj.handler.apply( this, arguments );
				event.type = fix;
			}
			return ret;
		}
	};
} );

jQuery.fn.extend( {

	on: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn );
	},
	one: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn, 1 );
	},
	off: function( types, selector, fn ) {
		var handleObj, type;
		if ( types && types.preventDefault && types.handleObj ) {

			// ( event )  dispatched jQuery.Event
			handleObj = types.handleObj;
			jQuery( types.delegateTarget ).off(
				handleObj.namespace ?
					handleObj.origType + "." + handleObj.namespace :
					handleObj.origType,
				handleObj.selector,
				handleObj.handler
			);
			return this;
		}
		if ( typeof types === "object" ) {

			// ( types-object [, selector] )
			for ( type in types ) {
				this.off( type, selector, types[ type ] );
			}
			return this;
		}
		if ( selector === false || typeof selector === "function" ) {

			// ( types [, fn] )
			fn = selector;
			selector = undefined;
		}
		if ( fn === false ) {
			fn = returnFalse;
		}
		return this.each( function() {
			jQuery.event.remove( this, types, fn, selector );
		} );
	}
} );


var

	// Support: IE <=10 - 11, Edge 12 - 13 only
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,

	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;

// Prefer a tbody over its parent table for containing new rows
function manipulationTarget( elem, content ) {
	if ( nodeName( elem, "table" ) &&
		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {

		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
	}

	return elem;
}

// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
	return elem;
}
function restoreScript( elem ) {
	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
		elem.type = elem.type.slice( 5 );
	} else {
		elem.removeAttribute( "type" );
	}

	return elem;
}

function cloneCopyEvent( src, dest ) {
	var i, l, type, pdataOld, udataOld, udataCur, events;

	if ( dest.nodeType !== 1 ) {
		return;
	}

	// 1. Copy private data: events, handlers, etc.
	if ( dataPriv.hasData( src ) ) {
		pdataOld = dataPriv.get( src );
		events = pdataOld.events;

		if ( events ) {
			dataPriv.remove( dest, "handle events" );

			for ( type in events ) {
				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
					jQuery.event.add( dest, type, events[ type ][ i ] );
				}
			}
		}
	}

	// 2. Copy user data
	if ( dataUser.hasData( src ) ) {
		udataOld = dataUser.access( src );
		udataCur = jQuery.extend( {}, udataOld );

		dataUser.set( dest, udataCur );
	}
}

// Fix IE bugs, see support tests
function fixInput( src, dest ) {
	var nodeName = dest.nodeName.toLowerCase();

	// Fails to persist the checked state of a cloned checkbox or radio button.
	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
		dest.checked = src.checked;

	// Fails to return the selected option to the default selected state when cloning options
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
		dest.defaultValue = src.defaultValue;
	}
}

function domManip( collection, args, callback, ignored ) {

	// Flatten any nested arrays
	args = flat( args );

	var fragment, first, scripts, hasScripts, node, doc,
		i = 0,
		l = collection.length,
		iNoClone = l - 1,
		value = args[ 0 ],
		valueIsFunction = isFunction( value );

	// We can't cloneNode fragments that contain checked, in WebKit
	if ( valueIsFunction ||
			( l > 1 && typeof value === "string" &&
				!support.checkClone && rchecked.test( value ) ) ) {
		return collection.each( function( index ) {
			var self = collection.eq( index );
			if ( valueIsFunction ) {
				args[ 0 ] = value.call( this, index, self.html() );
			}
			domManip( self, args, callback, ignored );
		} );
	}

	if ( l ) {
		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
		first = fragment.firstChild;

		if ( fragment.childNodes.length === 1 ) {
			fragment = first;
		}

		// Require either new content or an interest in ignored elements to invoke the callback
		if ( first || ignored ) {
			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
			hasScripts = scripts.length;

			// Use the original fragment for the last item
			// instead of the first because it can end up
			// being emptied incorrectly in certain situations (#8070).
			for ( ; i < l; i++ ) {
				node = fragment;

				if ( i !== iNoClone ) {
					node = jQuery.clone( node, true, true );

					// Keep references to cloned scripts for later restoration
					if ( hasScripts ) {

						// Support: Android <=4.0 only, PhantomJS 1 only
						// push.apply(_, arraylike) throws on ancient WebKit
						jQuery.merge( scripts, getAll( node, "script" ) );
					}
				}

				callback.call( collection[ i ], node, i );
			}

			if ( hasScripts ) {
				doc = scripts[ scripts.length - 1 ].ownerDocument;

				// Reenable scripts
				jQuery.map( scripts, restoreScript );

				// Evaluate executable scripts on first document insertion
				for ( i = 0; i < hasScripts; i++ ) {
					node = scripts[ i ];
					if ( rscriptType.test( node.type || "" ) &&
						!dataPriv.access( node, "globalEval" ) &&
						jQuery.contains( doc, node ) ) {

						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {

							// Optional AJAX dependency, but won't run scripts if not present
							if ( jQuery._evalUrl && !node.noModule ) {
								jQuery._evalUrl( node.src, {
									nonce: node.nonce || node.getAttribute( "nonce" )
								}, doc );
							}
						} else {
							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
						}
					}
				}
			}
		}
	}

	return collection;
}

function remove( elem, selector, keepData ) {
	var node,
		nodes = selector ? jQuery.filter( selector, elem ) : elem,
		i = 0;

	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
		if ( !keepData && node.nodeType === 1 ) {
			jQuery.cleanData( getAll( node ) );
		}

		if ( node.parentNode ) {
			if ( keepData && isAttached( node ) ) {
				setGlobalEval( getAll( node, "script" ) );
			}
			node.parentNode.removeChild( node );
		}
	}

	return elem;
}

jQuery.extend( {
	htmlPrefilter: function( html ) {
		return html;
	},

	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
		var i, l, srcElements, destElements,
			clone = elem.cloneNode( true ),
			inPage = isAttached( elem );

		// Fix IE cloning issues
		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
				!jQuery.isXMLDoc( elem ) ) {

			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
			destElements = getAll( clone );
			srcElements = getAll( elem );

			for ( i = 0, l = srcElements.length; i < l; i++ ) {
				fixInput( srcElements[ i ], destElements[ i ] );
			}
		}

		// Copy the events from the original to the clone
		if ( dataAndEvents ) {
			if ( deepDataAndEvents ) {
				srcElements = srcElements || getAll( elem );
				destElements = destElements || getAll( clone );

				for ( i = 0, l = srcElements.length; i < l; i++ ) {
					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
				}
			} else {
				cloneCopyEvent( elem, clone );
			}
		}

		// Preserve script evaluation history
		destElements = getAll( clone, "script" );
		if ( destElements.length > 0 ) {
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
		}

		// Return the cloned set
		return clone;
	},

	cleanData: function( elems ) {
		var data, elem, type,
			special = jQuery.event.special,
			i = 0;

		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
			if ( acceptData( elem ) ) {
				if ( ( data = elem[ dataPriv.expando ] ) ) {
					if ( data.events ) {
						for ( type in data.events ) {
							if ( special[ type ] ) {
								jQuery.event.remove( elem, type );

							// This is a shortcut to avoid jQuery.event.remove's overhead
							} else {
								jQuery.removeEvent( elem, type, data.handle );
							}
						}
					}

					// Support: Chrome <=35 - 45+
					// Assign undefined instead of using delete, see Data#remove
					elem[ dataPriv.expando ] = undefined;
				}
				if ( elem[ dataUser.expando ] ) {

					// Support: Chrome <=35 - 45+
					// Assign undefined instead of using delete, see Data#remove
					elem[ dataUser.expando ] = undefined;
				}
			}
		}
	}
} );

jQuery.fn.extend( {
	detach: function( selector ) {
		return remove( this, selector, true );
	},

	remove: function( selector ) {
		return remove( this, selector );
	},

	text: function( value ) {
		return access( this, function( value ) {
			return value === undefined ?
				jQuery.text( this ) :
				this.empty().each( function() {
					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
						this.textContent = value;
					}
				} );
		}, null, value, arguments.length );
	},

	append: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.appendChild( elem );
			}
		} );
	},

	prepend: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.insertBefore( elem, target.firstChild );
			}
		} );
	},

	before: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this );
			}
		} );
	},

	after: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this.nextSibling );
			}
		} );
	},

	empty: function() {
		var elem,
			i = 0;

		for ( ; ( elem = this[ i ] ) != null; i++ ) {
			if ( elem.nodeType === 1 ) {

				// Prevent memory leaks
				jQuery.cleanData( getAll( elem, false ) );

				// Remove any remaining nodes
				elem.textContent = "";
			}
		}

		return this;
	},

	clone: function( dataAndEvents, deepDataAndEvents ) {
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

		return this.map( function() {
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
		} );
	},

	html: function( value ) {
		return access( this, function( value ) {
			var elem = this[ 0 ] || {},
				i = 0,
				l = this.length;

			if ( value === undefined && elem.nodeType === 1 ) {
				return elem.innerHTML;
			}

			// See if we can take a shortcut and just use innerHTML
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {

				value = jQuery.htmlPrefilter( value );

				try {
					for ( ; i < l; i++ ) {
						elem = this[ i ] || {};

						// Remove element nodes and prevent memory leaks
						if ( elem.nodeType === 1 ) {
							jQuery.cleanData( getAll( elem, false ) );
							elem.innerHTML = value;
						}
					}

					elem = 0;

				// If using innerHTML throws an exception, use the fallback method
				} catch ( e ) {}
			}

			if ( elem ) {
				this.empty().append( value );
			}
		}, null, value, arguments.length );
	},

	replaceWith: function() {
		var ignored = [];

		// Make the changes, replacing each non-ignored context element with the new content
		return domManip( this, arguments, function( elem ) {
			var parent = this.parentNode;

			if ( jQuery.inArray( this, ignored ) < 0 ) {
				jQuery.cleanData( getAll( this ) );
				if ( parent ) {
					parent.replaceChild( elem, this );
				}
			}

		// Force callback invocation
		}, ignored );
	}
} );

jQuery.each( {
	appendTo: "append",
	prependTo: "prepend",
	insertBefore: "before",
	insertAfter: "after",
	replaceAll: "replaceWith"
}, function( name, original ) {
	jQuery.fn[ name ] = function( selector ) {
		var elems,
			ret = [],
			insert = jQuery( selector ),
			last = insert.length - 1,
			i = 0;

		for ( ; i <= last; i++ ) {
			elems = i === last ? this : this.clone( true );
			jQuery( insert[ i ] )[ original ]( elems );

			// Support: Android <=4.0 only, PhantomJS 1 only
			// .get() because push.apply(_, arraylike) throws on ancient WebKit
			push.apply( ret, elems.get() );
		}

		return this.pushStack( ret );
	};
} );
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );

var getStyles = function( elem ) {

		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if ( !view || !view.opener ) {
			view = window;
		}

		return view.getComputedStyle( elem );
	};

var swap = function( elem, options, callback ) {
	var ret, name,
		old = {};

	// Remember the old values, and insert the new ones
	for ( name in options ) {
		old[ name ] = elem.style[ name ];
		elem.style[ name ] = options[ name ];
	}

	ret = callback.call( elem );

	// Revert the old values
	for ( name in options ) {
		elem.style[ name ] = old[ name ];
	}

	return ret;
};


var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );



( function() {

	// Executing both pixelPosition & boxSizingReliable tests require only one layout
	// so they're executed at the same time to save the second computation.
	function computeStyleTests() {

		// This is a singleton, we need to execute it only once
		if ( !div ) {
			return;
		}

		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
			"margin-top:1px;padding:0;border:0";
		div.style.cssText =
			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
			"margin:auto;border:1px;padding:1px;" +
			"width:60%;top:1%";
		documentElement.appendChild( container ).appendChild( div );

		var divStyle = window.getComputedStyle( div );
		pixelPositionVal = divStyle.top !== "1%";

		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;

		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
		// Some styles come back with percentage values, even though they shouldn't
		div.style.right = "60%";
		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;

		// Support: IE 9 - 11 only
		// Detect misreporting of content dimensions for box-sizing:border-box elements
		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;

		// Support: IE 9 only
		// Detect overflow:scroll screwiness (gh-3699)
		// Support: Chrome <=64
		// Don't get tricked when zoom affects offsetWidth (gh-4029)
		div.style.position = "absolute";
		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;

		documentElement.removeChild( container );

		// Nullify the div so it wouldn't be stored in the memory and
		// it will also be a sign that checks already performed
		div = null;
	}

	function roundPixelMeasures( measure ) {
		return Math.round( parseFloat( measure ) );
	}

	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
		reliableTrDimensionsVal, reliableMarginLeftVal,
		container = document.createElement( "div" ),
		div = document.createElement( "div" );

	// Finish early in limited (non-browser) environments
	if ( !div.style ) {
		return;
	}

	// Support: IE <=9 - 11 only
	// Style of cloned element affects source element cloned (#8908)
	div.style.backgroundClip = "content-box";
	div.cloneNode( true ).style.backgroundClip = "";
	support.clearCloneStyle = div.style.backgroundClip === "content-box";

	jQuery.extend( support, {
		boxSizingReliable: function() {
			computeStyleTests();
			return boxSizingReliableVal;
		},
		pixelBoxStyles: function() {
			computeStyleTests();
			return pixelBoxStylesVal;
		},
		pixelPosition: function() {
			computeStyleTests();
			return pixelPositionVal;
		},
		reliableMarginLeft: function() {
			computeStyleTests();
			return reliableMarginLeftVal;
		},
		scrollboxSize: function() {
			computeStyleTests();
			return scrollboxSizeVal;
		},

		// Support: IE 9 - 11+, Edge 15 - 18+
		// IE/Edge misreport `getComputedStyle` of table rows with width/height
		// set in CSS while `offset*` properties report correct values.
		// Behavior in IE 9 is more subtle than in newer versions & it passes
		// some versions of this test; make sure not to make it pass there!
		reliableTrDimensions: function() {
			var table, tr, trChild, trStyle;
			if ( reliableTrDimensionsVal == null ) {
				table = document.createElement( "table" );
				tr = document.createElement( "tr" );
				trChild = document.createElement( "div" );

				table.style.cssText = "position:absolute;left:-11111px";
				tr.style.height = "1px";
				trChild.style.height = "9px";

				documentElement
					.appendChild( table )
					.appendChild( tr )
					.appendChild( trChild );

				trStyle = window.getComputedStyle( tr );
				reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;

				documentElement.removeChild( table );
			}
			return reliableTrDimensionsVal;
		}
	} );
} )();


function curCSS( elem, name, computed ) {
	var width, minWidth, maxWidth, ret,

		// Support: Firefox 51+
		// Retrieving style before computed somehow
		// fixes an issue with getting wrong values
		// on detached elements
		style = elem.style;

	computed = computed || getStyles( elem );

	// getPropertyValue is needed for:
	//   .css('filter') (IE 9 only, #12537)
	//   .css('--customProperty) (#3144)
	if ( computed ) {
		ret = computed.getPropertyValue( name ) || computed[ name ];

		if ( ret === "" && !isAttached( elem ) ) {
			ret = jQuery.style( elem, name );
		}

		// A tribute to the "awesome hack by Dean Edwards"
		// Android Browser returns percentage for some values,
		// but width seems to be reliably pixels.
		// This is against the CSSOM draft spec:
		// https://drafts.csswg.org/cssom/#resolved-values
		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {

			// Remember the original values
			width = style.width;
			minWidth = style.minWidth;
			maxWidth = style.maxWidth;

			// Put in the new values to get a computed value out
			style.minWidth = style.maxWidth = style.width = ret;
			ret = computed.width;

			// Revert the changed values
			style.width = width;
			style.minWidth = minWidth;
			style.maxWidth = maxWidth;
		}
	}

	return ret !== undefined ?

		// Support: IE <=9 - 11 only
		// IE returns zIndex value as an integer.
		ret + "" :
		ret;
}


function addGetHookIf( conditionFn, hookFn ) {

	// Define the hook, we'll check on the first run if it's really needed.
	return {
		get: function() {
			if ( conditionFn() ) {

				// Hook not needed (or it's not possible to use it due
				// to missing dependency), remove it.
				delete this.get;
				return;
			}

			// Hook needed; redefine it so that the support test is not executed again.
			return ( this.get = hookFn ).apply( this, arguments );
		}
	};
}


var cssPrefixes = [ "Webkit", "Moz", "ms" ],
	emptyStyle = document.createElement( "div" ).style,
	vendorProps = {};

// Return a vendor-prefixed property or undefined
function vendorPropName( name ) {

	// Check for vendor prefixed names
	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
		i = cssPrefixes.length;

	while ( i-- ) {
		name = cssPrefixes[ i ] + capName;
		if ( name in emptyStyle ) {
			return name;
		}
	}
}

// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
function finalPropName( name ) {
	var final = jQuery.cssProps[ name ] || vendorProps[ name ];

	if ( final ) {
		return final;
	}
	if ( name in emptyStyle ) {
		return name;
	}
	return vendorProps[ name ] = vendorPropName( name ) || name;
}


var

	// Swappable if display is none or starts with table
	// except "table", "table-cell", or "table-caption"
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
	rcustomProp = /^--/,
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	};

function setPositiveNumber( _elem, value, subtract ) {

	// Any relative (+/-) values have already been
	// normalized at this point
	var matches = rcssNum.exec( value );
	return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
		value;
}

function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
	var i = dimension === "width" ? 1 : 0,
		extra = 0,
		delta = 0;

	// Adjustment may not be necessary
	if ( box === ( isBorderBox ? "border" : "content" ) ) {
		return 0;
	}

	for ( ; i < 4; i += 2 ) {

		// Both box models exclude margin
		if ( box === "margin" ) {
			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
		}

		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
		if ( !isBorderBox ) {

			// Add padding
			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );

			// For "border" or "margin", add border
			if ( box !== "padding" ) {
				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );

			// But still keep track of it otherwise
			} else {
				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}

		// If we get here with a border-box (content + padding + border), we're seeking "content" or
		// "padding" or "margin"
		} else {

			// For "content", subtract padding
			if ( box === "content" ) {
				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
			}

			// For "content" or "padding", subtract border
			if ( box !== "margin" ) {
				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		}
	}

	// Account for positive content-box scroll gutter when requested by providing computedVal
	if ( !isBorderBox && computedVal >= 0 ) {

		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
		// Assuming integer scroll gutter, subtract the rest and round down
		delta += Math.max( 0, Math.ceil(
			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
			computedVal -
			delta -
			extra -
			0.5

		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
		// Use an explicit zero to avoid NaN (gh-3964)
		) ) || 0;
	}

	return delta;
}

function getWidthOrHeight( elem, dimension, extra ) {

	// Start with computed style
	var styles = getStyles( elem ),

		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
		// Fake content-box until we know it's needed to know the true value.
		boxSizingNeeded = !support.boxSizingReliable() || extra,
		isBorderBox = boxSizingNeeded &&
			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
		valueIsBorderBox = isBorderBox,

		val = curCSS( elem, dimension, styles ),
		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );

	// Support: Firefox <=54
	// Return a confounding non-pixel value or feign ignorance, as appropriate.
	if ( rnumnonpx.test( val ) ) {
		if ( !extra ) {
			return val;
		}
		val = "auto";
	}


	// Support: IE 9 - 11 only
	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
	// In those cases, the computed value can be trusted to be border-box.
	if ( ( !support.boxSizingReliable() && isBorderBox ||

		// Support: IE 10 - 11+, Edge 15 - 18+
		// IE/Edge misreport `getComputedStyle` of table rows with width/height
		// set in CSS while `offset*` properties report correct values.
		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||

		// Fall back to offsetWidth/offsetHeight when value is "auto"
		// This happens for inline elements with no explicit setting (gh-3571)
		val === "auto" ||

		// Support: Android <=4.1 - 4.3 only
		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&

		// Make sure the element is visible & connected
		elem.getClientRects().length ) {

		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";

		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
		// retrieved value as a content box dimension.
		valueIsBorderBox = offsetProp in elem;
		if ( valueIsBorderBox ) {
			val = elem[ offsetProp ];
		}
	}

	// Normalize "" and auto
	val = parseFloat( val ) || 0;

	// Adjust for the element's box model
	return ( val +
		boxModelAdjustment(
			elem,
			dimension,
			extra || ( isBorderBox ? "border" : "content" ),
			valueIsBorderBox,
			styles,

			// Provide the current computed size to request scroll gutter calculation (gh-3589)
			val
		)
	) + "px";
}

jQuery.extend( {

	// Add in style property hooks for overriding the default
	// behavior of getting and setting a style property
	cssHooks: {
		opacity: {
			get: function( elem, computed ) {
				if ( computed ) {

					// We should always get a number back from opacity
					var ret = curCSS( elem, "opacity" );
					return ret === "" ? "1" : ret;
				}
			}
		}
	},

	// Don't automatically add "px" to these possibly-unitless properties
	cssNumber: {
		"animationIterationCount": true,
		"columnCount": true,
		"fillOpacity": true,
		"flexGrow": true,
		"flexShrink": true,
		"fontWeight": true,
		"gridArea": true,
		"gridColumn": true,
		"gridColumnEnd": true,
		"gridColumnStart": true,
		"gridRow": true,
		"gridRowEnd": true,
		"gridRowStart": true,
		"lineHeight": true,
		"opacity": true,
		"order": true,
		"orphans": true,
		"widows": true,
		"zIndex": true,
		"zoom": true
	},

	// Add in properties whose names you wish to fix before
	// setting or getting the value
	cssProps: {},

	// Get and set the style property on a DOM Node
	style: function( elem, name, value, extra ) {

		// Don't set styles on text and comment nodes
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
			return;
		}

		// Make sure that we're working with the right name
		var ret, type, hooks,
			origName = camelCase( name ),
			isCustomProp = rcustomProp.test( name ),
			style = elem.style;

		// Make sure that we're working with the right name. We don't
		// want to query the value if it is a CSS custom property
		// since they are user-defined.
		if ( !isCustomProp ) {
			name = finalPropName( origName );
		}

		// Gets hook for the prefixed version, then unprefixed version
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

		// Check if we're setting a value
		if ( value !== undefined ) {
			type = typeof value;

			// Convert "+=" or "-=" to relative numbers (#7345)
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
				value = adjustCSS( elem, name, ret );

				// Fixes bug #9237
				type = "number";
			}

			// Make sure that null and NaN values aren't set (#7116)
			if ( value == null || value !== value ) {
				return;
			}

			// If a number was passed in, add the unit (except for certain CSS properties)
			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
			// "px" to a few hardcoded values.
			if ( type === "number" && !isCustomProp ) {
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
			}

			// background-* props affect original clone's values
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
				style[ name ] = "inherit";
			}

			// If a hook was provided, use that value, otherwise just set the specified value
			if ( !hooks || !( "set" in hooks ) ||
				( value = hooks.set( elem, value, extra ) ) !== undefined ) {

				if ( isCustomProp ) {
					style.setProperty( name, value );
				} else {
					style[ name ] = value;
				}
			}

		} else {

			// If a hook was provided get the non-computed value from there
			if ( hooks && "get" in hooks &&
				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {

				return ret;
			}

			// Otherwise just get the value from the style object
			return style[ name ];
		}
	},

	css: function( elem, name, extra, styles ) {
		var val, num, hooks,
			origName = camelCase( name ),
			isCustomProp = rcustomProp.test( name );

		// Make sure that we're working with the right name. We don't
		// want to modify the value if it is a CSS custom property
		// since they are user-defined.
		if ( !isCustomProp ) {
			name = finalPropName( origName );
		}

		// Try prefixed name followed by the unprefixed name
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

		// If a hook was provided get the computed value from there
		if ( hooks && "get" in hooks ) {
			val = hooks.get( elem, true, extra );
		}

		// Otherwise, if a way to get the computed value exists, use that
		if ( val === undefined ) {
			val = curCSS( elem, name, styles );
		}

		// Convert "normal" to computed value
		if ( val === "normal" && name in cssNormalTransform ) {
			val = cssNormalTransform[ name ];
		}

		// Make numeric if forced or a qualifier was provided and val looks numeric
		if ( extra === "" || extra ) {
			num = parseFloat( val );
			return extra === true || isFinite( num ) ? num || 0 : val;
		}

		return val;
	}
} );

jQuery.each( [ "height", "width" ], function( _i, dimension ) {
	jQuery.cssHooks[ dimension ] = {
		get: function( elem, computed, extra ) {
			if ( computed ) {

				// Certain elements can have dimension info if we invisibly show them
				// but it must have a current display style that would benefit
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&

					// Support: Safari 8+
					// Table columns in Safari have non-zero offsetWidth & zero
					// getBoundingClientRect().width unless display is changed.
					// Support: IE <=11 only
					// Running getBoundingClientRect on a disconnected node
					// in IE throws an error.
					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
						swap( elem, cssShow, function() {
							return getWidthOrHeight( elem, dimension, extra );
						} ) :
						getWidthOrHeight( elem, dimension, extra );
			}
		},

		set: function( elem, value, extra ) {
			var matches,
				styles = getStyles( elem ),

				// Only read styles.position if the test has a chance to fail
				// to avoid forcing a reflow.
				scrollboxSizeBuggy = !support.scrollboxSize() &&
					styles.position === "absolute",

				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
				boxSizingNeeded = scrollboxSizeBuggy || extra,
				isBorderBox = boxSizingNeeded &&
					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
				subtract = extra ?
					boxModelAdjustment(
						elem,
						dimension,
						extra,
						isBorderBox,
						styles
					) :
					0;

			// Account for unreliable border-box dimensions by comparing offset* to computed and
			// faking a content-box to get border and padding (gh-3699)
			if ( isBorderBox && scrollboxSizeBuggy ) {
				subtract -= Math.ceil(
					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
					parseFloat( styles[ dimension ] ) -
					boxModelAdjustment( elem, dimension, "border", false, styles ) -
					0.5
				);
			}

			// Convert to pixels if value adjustment is needed
			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
				( matches[ 3 ] || "px" ) !== "px" ) {

				elem.style[ dimension ] = value;
				value = jQuery.css( elem, dimension );
			}

			return setPositiveNumber( elem, value, subtract );
		}
	};
} );

jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
	function( elem, computed ) {
		if ( computed ) {
			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
				elem.getBoundingClientRect().left -
					swap( elem, { marginLeft: 0 }, function() {
						return elem.getBoundingClientRect().left;
					} )
				) + "px";
		}
	}
);

// These hooks are used by animate to expand properties
jQuery.each( {
	margin: "",
	padding: "",
	border: "Width"
}, function( prefix, suffix ) {
	jQuery.cssHooks[ prefix + suffix ] = {
		expand: function( value ) {
			var i = 0,
				expanded = {},

				// Assumes a single number if not a string
				parts = typeof value === "string" ? value.split( " " ) : [ value ];

			for ( ; i < 4; i++ ) {
				expanded[ prefix + cssExpand[ i ] + suffix ] =
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
			}

			return expanded;
		}
	};

	if ( prefix !== "margin" ) {
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
	}
} );

jQuery.fn.extend( {
	css: function( name, value ) {
		return access( this, function( elem, name, value ) {
			var styles, len,
				map = {},
				i = 0;

			if ( Array.isArray( name ) ) {
				styles = getStyles( elem );
				len = name.length;

				for ( ; i < len; i++ ) {
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
				}

				return map;
			}

			return value !== undefined ?
				jQuery.style( elem, name, value ) :
				jQuery.css( elem, name );
		}, name, value, arguments.length > 1 );
	}
} );


function Tween( elem, options, prop, end, easing ) {
	return new Tween.prototype.init( elem, options, prop, end, easing );
}
jQuery.Tween = Tween;

Tween.prototype = {
	constructor: Tween,
	init: function( elem, options, prop, end, easing, unit ) {
		this.elem = elem;
		this.prop = prop;
		this.easing = easing || jQuery.easing._default;
		this.options = options;
		this.start = this.now = this.cur();
		this.end = end;
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
	},
	cur: function() {
		var hooks = Tween.propHooks[ this.prop ];

		return hooks && hooks.get ?
			hooks.get( this ) :
			Tween.propHooks._default.get( this );
	},
	run: function( percent ) {
		var eased,
			hooks = Tween.propHooks[ this.prop ];

		if ( this.options.duration ) {
			this.pos = eased = jQuery.easing[ this.easing ](
				percent, this.options.duration * percent, 0, 1, this.options.duration
			);
		} else {
			this.pos = eased = percent;
		}
		this.now = ( this.end - this.start ) * eased + this.start;

		if ( this.options.step ) {
			this.options.step.call( this.elem, this.now, this );
		}

		if ( hooks && hooks.set ) {
			hooks.set( this );
		} else {
			Tween.propHooks._default.set( this );
		}
		return this;
	}
};

Tween.prototype.init.prototype = Tween.prototype;

Tween.propHooks = {
	_default: {
		get: function( tween ) {
			var result;

			// Use a property on the element directly when it is not a DOM element,
			// or when there is no matching style property that exists.
			if ( tween.elem.nodeType !== 1 ||
				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
				return tween.elem[ tween.prop ];
			}

			// Passing an empty string as a 3rd parameter to .css will automatically
			// attempt a parseFloat and fallback to a string if the parse fails.
			// Simple values such as "10px" are parsed to Float;
			// complex values such as "rotate(1rad)" are returned as-is.
			result = jQuery.css( tween.elem, tween.prop, "" );

			// Empty strings, null, undefined and "auto" are converted to 0.
			return !result || result === "auto" ? 0 : result;
		},
		set: function( tween ) {

			// Use step hook for back compat.
			// Use cssHook if its there.
			// Use .style if available and use plain properties where available.
			if ( jQuery.fx.step[ tween.prop ] ) {
				jQuery.fx.step[ tween.prop ]( tween );
			} else if ( tween.elem.nodeType === 1 && (
					jQuery.cssHooks[ tween.prop ] ||
					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
			} else {
				tween.elem[ tween.prop ] = tween.now;
			}
		}
	}
};

// Support: IE <=9 only
// Panic based approach to setting things on disconnected nodes
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
	set: function( tween ) {
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
			tween.elem[ tween.prop ] = tween.now;
		}
	}
};

jQuery.easing = {
	linear: function( p ) {
		return p;
	},
	swing: function( p ) {
		return 0.5 - Math.cos( p * Math.PI ) / 2;
	},
	_default: "swing"
};

jQuery.fx = Tween.prototype.init;

// Back compat <1.8 extension point
jQuery.fx.step = {};




var
	fxNow, inProgress,
	rfxtypes = /^(?:toggle|show|hide)$/,
	rrun = /queueHooks$/;

function schedule() {
	if ( inProgress ) {
		if ( document.hidden === false && window.requestAnimationFrame ) {
			window.requestAnimationFrame( schedule );
		} else {
			window.setTimeout( schedule, jQuery.fx.interval );
		}

		jQuery.fx.tick();
	}
}

// Animations created synchronously will run synchronously
function createFxNow() {
	window.setTimeout( function() {
		fxNow = undefined;
	} );
	return ( fxNow = Date.now() );
}

// Generate parameters to create a standard animation
function genFx( type, includeWidth ) {
	var which,
		i = 0,
		attrs = { height: type };

	// If we include width, step value is 1 to do all cssExpand values,
	// otherwise step value is 2 to skip over Left and Right
	includeWidth = includeWidth ? 1 : 0;
	for ( ; i < 4; i += 2 - includeWidth ) {
		which = cssExpand[ i ];
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
	}

	if ( includeWidth ) {
		attrs.opacity = attrs.width = type;
	}

	return attrs;
}

function createTween( value, prop, animation ) {
	var tween,
		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
		index = 0,
		length = collection.length;
	for ( ; index < length; index++ ) {
		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {

			// We're done with this property
			return tween;
		}
	}
}

function defaultPrefilter( elem, props, opts ) {
	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
		isBox = "width" in props || "height" in props,
		anim = this,
		orig = {},
		style = elem.style,
		hidden = elem.nodeType && isHiddenWithinTree( elem ),
		dataShow = dataPriv.get( elem, "fxshow" );

	// Queue-skipping animations hijack the fx hooks
	if ( !opts.queue ) {
		hooks = jQuery._queueHooks( elem, "fx" );
		if ( hooks.unqueued == null ) {
			hooks.unqueued = 0;
			oldfire = hooks.empty.fire;
			hooks.empty.fire = function() {
				if ( !hooks.unqueued ) {
					oldfire();
				}
			};
		}
		hooks.unqueued++;

		anim.always( function() {

			// Ensure the complete handler is called before this completes
			anim.always( function() {
				hooks.unqueued--;
				if ( !jQuery.queue( elem, "fx" ).length ) {
					hooks.empty.fire();
				}
			} );
		} );
	}

	// Detect show/hide animations
	for ( prop in props ) {
		value = props[ prop ];
		if ( rfxtypes.test( value ) ) {
			delete props[ prop ];
			toggle = toggle || value === "toggle";
			if ( value === ( hidden ? "hide" : "show" ) ) {

				// Pretend to be hidden if this is a "show" and
				// there is still data from a stopped show/hide
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
					hidden = true;

				// Ignore all other no-op show/hide data
				} else {
					continue;
				}
			}
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
		}
	}

	// Bail out if this is a no-op like .hide().hide()
	propTween = !jQuery.isEmptyObject( props );
	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
		return;
	}

	// Restrict "overflow" and "display" styles during box animations
	if ( isBox && elem.nodeType === 1 ) {

		// Support: IE <=9 - 11, Edge 12 - 15
		// Record all 3 overflow attributes because IE does not infer the shorthand
		// from identically-valued overflowX and overflowY and Edge just mirrors
		// the overflowX value there.
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];

		// Identify a display type, preferring old show/hide data over the CSS cascade
		restoreDisplay = dataShow && dataShow.display;
		if ( restoreDisplay == null ) {
			restoreDisplay = dataPriv.get( elem, "display" );
		}
		display = jQuery.css( elem, "display" );
		if ( display === "none" ) {
			if ( restoreDisplay ) {
				display = restoreDisplay;
			} else {

				// Get nonempty value(s) by temporarily forcing visibility
				showHide( [ elem ], true );
				restoreDisplay = elem.style.display || restoreDisplay;
				display = jQuery.css( elem, "display" );
				showHide( [ elem ] );
			}
		}

		// Animate inline elements as inline-block
		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
			if ( jQuery.css( elem, "float" ) === "none" ) {

				// Restore the original display value at the end of pure show/hide animations
				if ( !propTween ) {
					anim.done( function() {
						style.display = restoreDisplay;
					} );
					if ( restoreDisplay == null ) {
						display = style.display;
						restoreDisplay = display === "none" ? "" : display;
					}
				}
				style.display = "inline-block";
			}
		}
	}

	if ( opts.overflow ) {
		style.overflow = "hidden";
		anim.always( function() {
			style.overflow = opts.overflow[ 0 ];
			style.overflowX = opts.overflow[ 1 ];
			style.overflowY = opts.overflow[ 2 ];
		} );
	}

	// Implement show/hide animations
	propTween = false;
	for ( prop in orig ) {

		// General show/hide setup for this element animation
		if ( !propTween ) {
			if ( dataShow ) {
				if ( "hidden" in dataShow ) {
					hidden = dataShow.hidden;
				}
			} else {
				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
			}

			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
			if ( toggle ) {
				dataShow.hidden = !hidden;
			}

			// Show elements before animating them
			if ( hidden ) {
				showHide( [ elem ], true );
			}

			/* eslint-disable no-loop-func */

			anim.done( function() {

			/* eslint-enable no-loop-func */

				// The final step of a "hide" animation is actually hiding the element
				if ( !hidden ) {
					showHide( [ elem ] );
				}
				dataPriv.remove( elem, "fxshow" );
				for ( prop in orig ) {
					jQuery.style( elem, prop, orig[ prop ] );
				}
			} );
		}

		// Per-property setup
		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
		if ( !( prop in dataShow ) ) {
			dataShow[ prop ] = propTween.start;
			if ( hidden ) {
				propTween.end = propTween.start;
				propTween.start = 0;
			}
		}
	}
}

function propFilter( props, specialEasing ) {
	var index, name, easing, value, hooks;

	// camelCase, specialEasing and expand cssHook pass
	for ( index in props ) {
		name = camelCase( index );
		easing = specialEasing[ name ];
		value = props[ index ];
		if ( Array.isArray( value ) ) {
			easing = value[ 1 ];
			value = props[ index ] = value[ 0 ];
		}

		if ( index !== name ) {
			props[ name ] = value;
			delete props[ index ];
		}

		hooks = jQuery.cssHooks[ name ];
		if ( hooks && "expand" in hooks ) {
			value = hooks.expand( value );
			delete props[ name ];

			// Not quite $.extend, this won't overwrite existing keys.
			// Reusing 'index' because we have the correct "name"
			for ( index in value ) {
				if ( !( index in props ) ) {
					props[ index ] = value[ index ];
					specialEasing[ index ] = easing;
				}
			}
		} else {
			specialEasing[ name ] = easing;
		}
	}
}

function Animation( elem, properties, options ) {
	var result,
		stopped,
		index = 0,
		length = Animation.prefilters.length,
		deferred = jQuery.Deferred().always( function() {

			// Don't match elem in the :animated selector
			delete tick.elem;
		} ),
		tick = function() {
			if ( stopped ) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),

				// Support: Android 2.3 only
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
				temp = remaining / animation.duration || 0,
				percent = 1 - temp,
				index = 0,
				length = animation.tweens.length;

			for ( ; index < length; index++ ) {
				animation.tweens[ index ].run( percent );
			}

			deferred.notifyWith( elem, [ animation, percent, remaining ] );

			// If there's more to do, yield
			if ( percent < 1 && length ) {
				return remaining;
			}

			// If this was an empty animation, synthesize a final progress notification
			if ( !length ) {
				deferred.notifyWith( elem, [ animation, 1, 0 ] );
			}

			// Resolve the animation and report its conclusion
			deferred.resolveWith( elem, [ animation ] );
			return false;
		},
		animation = deferred.promise( {
			elem: elem,
			props: jQuery.extend( {}, properties ),
			opts: jQuery.extend( true, {
				specialEasing: {},
				easing: jQuery.easing._default
			}, options ),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function( prop, end ) {
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
				animation.tweens.push( tween );
				return tween;
			},
			stop: function( gotoEnd ) {
				var index = 0,

					// If we are going to the end, we want to run all the tweens
					// otherwise we skip this part
					length = gotoEnd ? animation.tweens.length : 0;
				if ( stopped ) {
					return this;
				}
				stopped = true;
				for ( ; index < length; index++ ) {
					animation.tweens[ index ].run( 1 );
				}

				// Resolve when we played the last frame; otherwise, reject
				if ( gotoEnd ) {
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
				} else {
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
				}
				return this;
			}
		} ),
		props = animation.props;

	propFilter( props, animation.opts.specialEasing );

	for ( ; index < length; index++ ) {
		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
		if ( result ) {
			if ( isFunction( result.stop ) ) {
				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
					result.stop.bind( result );
			}
			return result;
		}
	}

	jQuery.map( props, createTween, animation );

	if ( isFunction( animation.opts.start ) ) {
		animation.opts.start.call( elem, animation );
	}

	// Attach callbacks from options
	animation
		.progress( animation.opts.progress )
		.done( animation.opts.done, animation.opts.complete )
		.fail( animation.opts.fail )
		.always( animation.opts.always );

	jQuery.fx.timer(
		jQuery.extend( tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		} )
	);

	return animation;
}

jQuery.Animation = jQuery.extend( Animation, {

	tweeners: {
		"*": [ function( prop, value ) {
			var tween = this.createTween( prop, value );
			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
			return tween;
		} ]
	},

	tweener: function( props, callback ) {
		if ( isFunction( props ) ) {
			callback = props;
			props = [ "*" ];
		} else {
			props = props.match( rnothtmlwhite );
		}

		var prop,
			index = 0,
			length = props.length;

		for ( ; index < length; index++ ) {
			prop = props[ index ];
			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
			Animation.tweeners[ prop ].unshift( callback );
		}
	},

	prefilters: [ defaultPrefilter ],

	prefilter: function( callback, prepend ) {
		if ( prepend ) {
			Animation.prefilters.unshift( callback );
		} else {
			Animation.prefilters.push( callback );
		}
	}
} );

jQuery.speed = function( speed, easing, fn ) {
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
		complete: fn || !fn && easing ||
			isFunction( speed ) && speed,
		duration: speed,
		easing: fn && easing || easing && !isFunction( easing ) && easing
	};

	// Go to the end state if fx are off
	if ( jQuery.fx.off ) {
		opt.duration = 0;

	} else {
		if ( typeof opt.duration !== "number" ) {
			if ( opt.duration in jQuery.fx.speeds ) {
				opt.duration = jQuery.fx.speeds[ opt.duration ];

			} else {
				opt.duration = jQuery.fx.speeds._default;
			}
		}
	}

	// Normalize opt.queue - true/undefined/null -> "fx"
	if ( opt.queue == null || opt.queue === true ) {
		opt.queue = "fx";
	}

	// Queueing
	opt.old = opt.complete;

	opt.complete = function() {
		if ( isFunction( opt.old ) ) {
			opt.old.call( this );
		}

		if ( opt.queue ) {
			jQuery.dequeue( this, opt.queue );
		}
	};

	return opt;
};

jQuery.fn.extend( {
	fadeTo: function( speed, to, easing, callback ) {

		// Show any hidden elements after setting opacity to 0
		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()

			// Animate to the value specified
			.end().animate( { opacity: to }, speed, easing, callback );
	},
	animate: function( prop, speed, easing, callback ) {
		var empty = jQuery.isEmptyObject( prop ),
			optall = jQuery.speed( speed, easing, callback ),
			doAnimation = function() {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );

				// Empty animations, or finishing resolves immediately
				if ( empty || dataPriv.get( this, "finish" ) ) {
					anim.stop( true );
				}
			};
			doAnimation.finish = doAnimation;

		return empty || optall.queue === false ?
			this.each( doAnimation ) :
			this.queue( optall.queue, doAnimation );
	},
	stop: function( type, clearQueue, gotoEnd ) {
		var stopQueue = function( hooks ) {
			var stop = hooks.stop;
			delete hooks.stop;
			stop( gotoEnd );
		};

		if ( typeof type !== "string" ) {
			gotoEnd = clearQueue;
			clearQueue = type;
			type = undefined;
		}
		if ( clearQueue ) {
			this.queue( type || "fx", [] );
		}

		return this.each( function() {
			var dequeue = true,
				index = type != null && type + "queueHooks",
				timers = jQuery.timers,
				data = dataPriv.get( this );

			if ( index ) {
				if ( data[ index ] && data[ index ].stop ) {
					stopQueue( data[ index ] );
				}
			} else {
				for ( index in data ) {
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
						stopQueue( data[ index ] );
					}
				}
			}

			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this &&
					( type == null || timers[ index ].queue === type ) ) {

					timers[ index ].anim.stop( gotoEnd );
					dequeue = false;
					timers.splice( index, 1 );
				}
			}

			// Start the next in the queue if the last step wasn't forced.
			// Timers currently will call their complete callbacks, which
			// will dequeue but only if they were gotoEnd.
			if ( dequeue || !gotoEnd ) {
				jQuery.dequeue( this, type );
			}
		} );
	},
	finish: function( type ) {
		if ( type !== false ) {
			type = type || "fx";
		}
		return this.each( function() {
			var index,
				data = dataPriv.get( this ),
				queue = data[ type + "queue" ],
				hooks = data[ type + "queueHooks" ],
				timers = jQuery.timers,
				length = queue ? queue.length : 0;

			// Enable finishing flag on private data
			data.finish = true;

			// Empty the queue first
			jQuery.queue( this, type, [] );

			if ( hooks && hooks.stop ) {
				hooks.stop.call( this, true );
			}

			// Look for any active animations, and finish them
			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
					timers[ index ].anim.stop( true );
					timers.splice( index, 1 );
				}
			}

			// Look for any animations in the old queue and finish them
			for ( index = 0; index < length; index++ ) {
				if ( queue[ index ] && queue[ index ].finish ) {
					queue[ index ].finish.call( this );
				}
			}

			// Turn off finishing flag
			delete data.finish;
		} );
	}
} );

jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
	var cssFn = jQuery.fn[ name ];
	jQuery.fn[ name ] = function( speed, easing, callback ) {
		return speed == null || typeof speed === "boolean" ?
			cssFn.apply( this, arguments ) :
			this.animate( genFx( name, true ), speed, easing, callback );
	};
} );

// Generate shortcuts for custom animations
jQuery.each( {
	slideDown: genFx( "show" ),
	slideUp: genFx( "hide" ),
	slideToggle: genFx( "toggle" ),
	fadeIn: { opacity: "show" },
	fadeOut: { opacity: "hide" },
	fadeToggle: { opacity: "toggle" }
}, function( name, props ) {
	jQuery.fn[ name ] = function( speed, easing, callback ) {
		return this.animate( props, speed, easing, callback );
	};
} );

jQuery.timers = [];
jQuery.fx.tick = function() {
	var timer,
		i = 0,
		timers = jQuery.timers;

	fxNow = Date.now();

	for ( ; i < timers.length; i++ ) {
		timer = timers[ i ];

		// Run the timer and safely remove it when done (allowing for external removal)
		if ( !timer() && timers[ i ] === timer ) {
			timers.splice( i--, 1 );
		}
	}

	if ( !timers.length ) {
		jQuery.fx.stop();
	}
	fxNow = undefined;
};

jQuery.fx.timer = function( timer ) {
	jQuery.timers.push( timer );
	jQuery.fx.start();
};

jQuery.fx.interval = 13;
jQuery.fx.start = function() {
	if ( inProgress ) {
		return;
	}

	inProgress = true;
	schedule();
};

jQuery.fx.stop = function() {
	inProgress = null;
};

jQuery.fx.speeds = {
	slow: 600,
	fast: 200,

	// Default speed
	_default: 400
};


// Based off of the plugin by Clint Helfers, with permission.
// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) {
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
	type = type || "fx";

	return this.queue( type, function( next, hooks ) {
		var timeout = window.setTimeout( next, time );
		hooks.stop = function() {
			window.clearTimeout( timeout );
		};
	} );
};


( function() {
	var input = document.createElement( "input" ),
		select = document.createElement( "select" ),
		opt = select.appendChild( document.createElement( "option" ) );

	input.type = "checkbox";

	// Support: Android <=4.3 only
	// Default value for a checkbox should be "on"
	support.checkOn = input.value !== "";

	// Support: IE <=11 only
	// Must access selectedIndex to make default options select
	support.optSelected = opt.selected;

	// Support: IE <=11 only
	// An input loses its value after becoming a radio
	input = document.createElement( "input" );
	input.value = "t";
	input.type = "radio";
	support.radioValue = input.value === "t";
} )();


var boolHook,
	attrHandle = jQuery.expr.attrHandle;

jQuery.fn.extend( {
	attr: function( name, value ) {
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
	},

	removeAttr: function( name ) {
		return this.each( function() {
			jQuery.removeAttr( this, name );
		} );
	}
} );

jQuery.extend( {
	attr: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set attributes on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		// Fallback to prop when attributes are not supported
		if ( typeof elem.getAttribute === "undefined" ) {
			return jQuery.prop( elem, name, value );
		}

		// Attribute hooks are determined by the lowercase version
		// Grab necessary hook if one is defined
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
		}

		if ( value !== undefined ) {
			if ( value === null ) {
				jQuery.removeAttr( elem, name );
				return;
			}

			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			elem.setAttribute( name, value + "" );
			return value;
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		ret = jQuery.find.attr( elem, name );

		// Non-existent attributes return null, we normalize to undefined
		return ret == null ? undefined : ret;
	},

	attrHooks: {
		type: {
			set: function( elem, value ) {
				if ( !support.radioValue && value === "radio" &&
					nodeName( elem, "input" ) ) {
					var val = elem.value;
					elem.setAttribute( "type", value );
					if ( val ) {
						elem.value = val;
					}
					return value;
				}
			}
		}
	},

	removeAttr: function( elem, value ) {
		var name,
			i = 0,

			// Attribute names can contain non-HTML whitespace characters
			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
			attrNames = value && value.match( rnothtmlwhite );

		if ( attrNames && elem.nodeType === 1 ) {
			while ( ( name = attrNames[ i++ ] ) ) {
				elem.removeAttribute( name );
			}
		}
	}
} );

// Hooks for boolean attributes
boolHook = {
	set: function( elem, value, name ) {
		if ( value === false ) {

			// Remove boolean attributes when set to false
			jQuery.removeAttr( elem, name );
		} else {
			elem.setAttribute( name, name );
		}
		return name;
	}
};

jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
	var getter = attrHandle[ name ] || jQuery.find.attr;

	attrHandle[ name ] = function( elem, name, isXML ) {
		var ret, handle,
			lowercaseName = name.toLowerCase();

		if ( !isXML ) {

			// Avoid an infinite loop by temporarily removing this function from the getter
			handle = attrHandle[ lowercaseName ];
			attrHandle[ lowercaseName ] = ret;
			ret = getter( elem, name, isXML ) != null ?
				lowercaseName :
				null;
			attrHandle[ lowercaseName ] = handle;
		}
		return ret;
	};
} );




var rfocusable = /^(?:input|select|textarea|button)$/i,
	rclickable = /^(?:a|area)$/i;

jQuery.fn.extend( {
	prop: function( name, value ) {
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
	},

	removeProp: function( name ) {
		return this.each( function() {
			delete this[ jQuery.propFix[ name ] || name ];
		} );
	}
} );

jQuery.extend( {
	prop: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set properties on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {

			// Fix name and attach hooks
			name = jQuery.propFix[ name ] || name;
			hooks = jQuery.propHooks[ name ];
		}

		if ( value !== undefined ) {
			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			return ( elem[ name ] = value );
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		return elem[ name ];
	},

	propHooks: {
		tabIndex: {
			get: function( elem ) {

				// Support: IE <=9 - 11 only
				// elem.tabIndex doesn't always return the
				// correct value when it hasn't been explicitly set
				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
				// Use proper attribute retrieval(#12072)
				var tabindex = jQuery.find.attr( elem, "tabindex" );

				if ( tabindex ) {
					return parseInt( tabindex, 10 );
				}

				if (
					rfocusable.test( elem.nodeName ) ||
					rclickable.test( elem.nodeName ) &&
					elem.href
				) {
					return 0;
				}

				return -1;
			}
		}
	},

	propFix: {
		"for": "htmlFor",
		"class": "className"
	}
} );

// Support: IE <=11 only
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
// eslint rule "no-unused-expressions" is disabled for this code
// since it considers such accessions noop
if ( !support.optSelected ) {
	jQuery.propHooks.selected = {
		get: function( elem ) {

			/* eslint no-unused-expressions: "off" */

			var parent = elem.parentNode;
			if ( parent && parent.parentNode ) {
				parent.parentNode.selectedIndex;
			}
			return null;
		},
		set: function( elem ) {

			/* eslint no-unused-expressions: "off" */

			var parent = elem.parentNode;
			if ( parent ) {
				parent.selectedIndex;

				if ( parent.parentNode ) {
					parent.parentNode.selectedIndex;
				}
			}
		}
	};
}

jQuery.each( [
	"tabIndex",
	"readOnly",
	"maxLength",
	"cellSpacing",
	"cellPadding",
	"rowSpan",
	"colSpan",
	"useMap",
	"frameBorder",
	"contentEditable"
], function() {
	jQuery.propFix[ this.toLowerCase() ] = this;
} );




	// Strip and collapse whitespace according to HTML spec
	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
	function stripAndCollapse( value ) {
		var tokens = value.match( rnothtmlwhite ) || [];
		return tokens.join( " " );
	}


function getClass( elem ) {
	return elem.getAttribute && elem.getAttribute( "class" ) || "";
}

function classesToArray( value ) {
	if ( Array.isArray( value ) ) {
		return value;
	}
	if ( typeof value === "string" ) {
		return value.match( rnothtmlwhite ) || [];
	}
	return [];
}

jQuery.fn.extend( {
	addClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		classes = classesToArray( value );

		if ( classes.length ) {
			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );
				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
							cur += clazz + " ";
						}
					}

					// Only assign if different to avoid unneeded rendering.
					finalValue = stripAndCollapse( cur );
					if ( curValue !== finalValue ) {
						elem.setAttribute( "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	removeClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( !arguments.length ) {
			return this.attr( "class", "" );
		}

		classes = classesToArray( value );

		if ( classes.length ) {
			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );

				// This expression is here for better compressibility (see addClass)
				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {

						// Remove *all* instances
						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
							cur = cur.replace( " " + clazz + " ", " " );
						}
					}

					// Only assign if different to avoid unneeded rendering.
					finalValue = stripAndCollapse( cur );
					if ( curValue !== finalValue ) {
						elem.setAttribute( "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	toggleClass: function( value, stateVal ) {
		var type = typeof value,
			isValidValue = type === "string" || Array.isArray( value );

		if ( typeof stateVal === "boolean" && isValidValue ) {
			return stateVal ? this.addClass( value ) : this.removeClass( value );
		}

		if ( isFunction( value ) ) {
			return this.each( function( i ) {
				jQuery( this ).toggleClass(
					value.call( this, i, getClass( this ), stateVal ),
					stateVal
				);
			} );
		}

		return this.each( function() {
			var className, i, self, classNames;

			if ( isValidValue ) {

				// Toggle individual class names
				i = 0;
				self = jQuery( this );
				classNames = classesToArray( value );

				while ( ( className = classNames[ i++ ] ) ) {

					// Check each className given, space separated list
					if ( self.hasClass( className ) ) {
						self.removeClass( className );
					} else {
						self.addClass( className );
					}
				}

			// Toggle whole class name
			} else if ( value === undefined || type === "boolean" ) {
				className = getClass( this );
				if ( className ) {

					// Store className if set
					dataPriv.set( this, "__className__", className );
				}

				// If the element has a class name or if we're passed `false`,
				// then remove the whole classname (if there was one, the above saved it).
				// Otherwise bring back whatever was previously saved (if anything),
				// falling back to the empty string if nothing was stored.
				if ( this.setAttribute ) {
					this.setAttribute( "class",
						className || value === false ?
						"" :
						dataPriv.get( this, "__className__" ) || ""
					);
				}
			}
		} );
	},

	hasClass: function( selector ) {
		var className, elem,
			i = 0;

		className = " " + selector + " ";
		while ( ( elem = this[ i++ ] ) ) {
			if ( elem.nodeType === 1 &&
				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
					return true;
			}
		}

		return false;
	}
} );




var rreturn = /\r/g;

jQuery.fn.extend( {
	val: function( value ) {
		var hooks, ret, valueIsFunction,
			elem = this[ 0 ];

		if ( !arguments.length ) {
			if ( elem ) {
				hooks = jQuery.valHooks[ elem.type ] ||
					jQuery.valHooks[ elem.nodeName.toLowerCase() ];

				if ( hooks &&
					"get" in hooks &&
					( ret = hooks.get( elem, "value" ) ) !== undefined
				) {
					return ret;
				}

				ret = elem.value;

				// Handle most common string cases
				if ( typeof ret === "string" ) {
					return ret.replace( rreturn, "" );
				}

				// Handle cases where value is null/undef or number
				return ret == null ? "" : ret;
			}

			return;
		}

		valueIsFunction = isFunction( value );

		return this.each( function( i ) {
			var val;

			if ( this.nodeType !== 1 ) {
				return;
			}

			if ( valueIsFunction ) {
				val = value.call( this, i, jQuery( this ).val() );
			} else {
				val = value;
			}

			// Treat null/undefined as ""; convert numbers to string
			if ( val == null ) {
				val = "";

			} else if ( typeof val === "number" ) {
				val += "";

			} else if ( Array.isArray( val ) ) {
				val = jQuery.map( val, function( value ) {
					return value == null ? "" : value + "";
				} );
			}

			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];

			// If set returns undefined, fall back to normal setting
			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
				this.value = val;
			}
		} );
	}
} );

jQuery.extend( {
	valHooks: {
		option: {
			get: function( elem ) {

				var val = jQuery.find.attr( elem, "value" );
				return val != null ?
					val :

					// Support: IE <=10 - 11 only
					// option.text throws exceptions (#14686, #14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					stripAndCollapse( jQuery.text( elem ) );
			}
		},
		select: {
			get: function( elem ) {
				var value, option, i,
					options = elem.options,
					index = elem.selectedIndex,
					one = elem.type === "select-one",
					values = one ? null : [],
					max = one ? index + 1 : options.length;

				if ( index < 0 ) {
					i = max;

				} else {
					i = one ? index : 0;
				}

				// Loop through all the selected options
				for ( ; i < max; i++ ) {
					option = options[ i ];

					// Support: IE <=9 only
					// IE8-9 doesn't update selected after form reset (#2551)
					if ( ( option.selected || i === index ) &&

							// Don't return options that are disabled or in a disabled optgroup
							!option.disabled &&
							( !option.parentNode.disabled ||
								!nodeName( option.parentNode, "optgroup" ) ) ) {

						// Get the specific value for the option
						value = jQuery( option ).val();

						// We don't need an array for one selects
						if ( one ) {
							return value;
						}

						// Multi-Selects return an array
						values.push( value );
					}
				}

				return values;
			},

			set: function( elem, value ) {
				var optionSet, option,
					options = elem.options,
					values = jQuery.makeArray( value ),
					i = options.length;

				while ( i-- ) {
					option = options[ i ];

					/* eslint-disable no-cond-assign */

					if ( option.selected =
						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
					) {
						optionSet = true;
					}

					/* eslint-enable no-cond-assign */
				}

				// Force browsers to behave consistently when non-matching value is set
				if ( !optionSet ) {
					elem.selectedIndex = -1;
				}
				return values;
			}
		}
	}
} );

// Radios and checkboxes getter/setter
jQuery.each( [ "radio", "checkbox" ], function() {
	jQuery.valHooks[ this ] = {
		set: function( elem, value ) {
			if ( Array.isArray( value ) ) {
				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
			}
		}
	};
	if ( !support.checkOn ) {
		jQuery.valHooks[ this ].get = function( elem ) {
			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
		};
	}
} );




// Return jQuery for attributes-only inclusion


support.focusin = "onfocusin" in window;


var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
	stopPropagationCallback = function( e ) {
		e.stopPropagation();
	};

jQuery.extend( jQuery.event, {

	trigger: function( event, data, elem, onlyHandlers ) {

		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
			eventPath = [ elem || document ],
			type = hasOwn.call( event, "type" ) ? event.type : event,
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];

		cur = lastElement = tmp = elem = elem || document;

		// Don't do events on text and comment nodes
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
			return;
		}

		// focus/blur morphs to focusin/out; ensure we're not firing them right now
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
			return;
		}

		if ( type.indexOf( "." ) > -1 ) {

			// Namespaced trigger; create a regexp to match event type in handle()
			namespaces = type.split( "." );
			type = namespaces.shift();
			namespaces.sort();
		}
		ontype = type.indexOf( ":" ) < 0 && "on" + type;

		// Caller can pass in a jQuery.Event object, Object, or just an event type string
		event = event[ jQuery.expando ] ?
			event :
			new jQuery.Event( type, typeof event === "object" && event );

		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
		event.isTrigger = onlyHandlers ? 2 : 3;
		event.namespace = namespaces.join( "." );
		event.rnamespace = event.namespace ?
			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
			null;

		// Clean up the event in case it is being reused
		event.result = undefined;
		if ( !event.target ) {
			event.target = elem;
		}

		// Clone any incoming data and prepend the event, creating the handler arg list
		data = data == null ?
			[ event ] :
			jQuery.makeArray( data, [ event ] );

		// Allow special events to draw outside the lines
		special = jQuery.event.special[ type ] || {};
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
			return;
		}

		// Determine event propagation path in advance, per W3C events spec (#9951)
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {

			bubbleType = special.delegateType || type;
			if ( !rfocusMorph.test( bubbleType + type ) ) {
				cur = cur.parentNode;
			}
			for ( ; cur; cur = cur.parentNode ) {
				eventPath.push( cur );
				tmp = cur;
			}

			// Only add window if we got to document (e.g., not plain obj or detached DOM)
			if ( tmp === ( elem.ownerDocument || document ) ) {
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
			}
		}

		// Fire handlers on the event path
		i = 0;
		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
			lastElement = cur;
			event.type = i > 1 ?
				bubbleType :
				special.bindType || type;

			// jQuery handler
			handle = (
					dataPriv.get( cur, "events" ) || Object.create( null )
				)[ event.type ] &&
				dataPriv.get( cur, "handle" );
			if ( handle ) {
				handle.apply( cur, data );
			}

			// Native handler
			handle = ontype && cur[ ontype ];
			if ( handle && handle.apply && acceptData( cur ) ) {
				event.result = handle.apply( cur, data );
				if ( event.result === false ) {
					event.preventDefault();
				}
			}
		}
		event.type = type;

		// If nobody prevented the default action, do it now
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {

			if ( ( !special._default ||
				special._default.apply( eventPath.pop(), data ) === false ) &&
				acceptData( elem ) ) {

				// Call a native DOM method on the target with the same name as the event.
				// Don't do default actions on window, that's where global variables be (#6170)
				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {

					// Don't re-trigger an onFOO event when we call its FOO() method
					tmp = elem[ ontype ];

					if ( tmp ) {
						elem[ ontype ] = null;
					}

					// Prevent re-triggering of the same event, since we already bubbled it above
					jQuery.event.triggered = type;

					if ( event.isPropagationStopped() ) {
						lastElement.addEventListener( type, stopPropagationCallback );
					}

					elem[ type ]();

					if ( event.isPropagationStopped() ) {
						lastElement.removeEventListener( type, stopPropagationCallback );
					}

					jQuery.event.triggered = undefined;

					if ( tmp ) {
						elem[ ontype ] = tmp;
					}
				}
			}
		}

		return event.result;
	},

	// Piggyback on a donor event to simulate a different one
	// Used only for `focus(in | out)` events
	simulate: function( type, elem, event ) {
		var e = jQuery.extend(
			new jQuery.Event(),
			event,
			{
				type: type,
				isSimulated: true
			}
		);

		jQuery.event.trigger( e, null, elem );
	}

} );

jQuery.fn.extend( {

	trigger: function( type, data ) {
		return this.each( function() {
			jQuery.event.trigger( type, data, this );
		} );
	},
	triggerHandler: function( type, data ) {
		var elem = this[ 0 ];
		if ( elem ) {
			return jQuery.event.trigger( type, data, elem, true );
		}
	}
} );


// Support: Firefox <=44
// Firefox doesn't have focus(in | out) events
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
//
// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
// focus(in | out) events fire after focus & blur events,
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
if ( !support.focusin ) {
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {

		// Attach a single capturing handler on the document while someone wants focusin/focusout
		var handler = function( event ) {
			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
		};

		jQuery.event.special[ fix ] = {
			setup: function() {

				// Handle: regular nodes (via `this.ownerDocument`), window
				// (via `this.document`) & document (via `this`).
				var doc = this.ownerDocument || this.document || this,
					attaches = dataPriv.access( doc, fix );

				if ( !attaches ) {
					doc.addEventListener( orig, handler, true );
				}
				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
			},
			teardown: function() {
				var doc = this.ownerDocument || this.document || this,
					attaches = dataPriv.access( doc, fix ) - 1;

				if ( !attaches ) {
					doc.removeEventListener( orig, handler, true );
					dataPriv.remove( doc, fix );

				} else {
					dataPriv.access( doc, fix, attaches );
				}
			}
		};
	} );
}
var location = window.location;

var nonce = { guid: Date.now() };

var rquery = ( /\?/ );



// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
	var xml;
	if ( !data || typeof data !== "string" ) {
		return null;
	}

	// Support: IE 9 - 11 only
	// IE throws on parseFromString with invalid input.
	try {
		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
	} catch ( e ) {
		xml = undefined;
	}

	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
		jQuery.error( "Invalid XML: " + data );
	}
	return xml;
};


var
	rbracket = /\[\]$/,
	rCRLF = /\r?\n/g,
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	rsubmittable = /^(?:input|select|textarea|keygen)/i;

function buildParams( prefix, obj, traditional, add ) {
	var name;

	if ( Array.isArray( obj ) ) {

		// Serialize array item.
		jQuery.each( obj, function( i, v ) {
			if ( traditional || rbracket.test( prefix ) ) {

				// Treat each array item as a scalar.
				add( prefix, v );

			} else {

				// Item is non-scalar (array or object), encode its numeric index.
				buildParams(
					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
					v,
					traditional,
					add
				);
			}
		} );

	} else if ( !traditional && toType( obj ) === "object" ) {

		// Serialize object item.
		for ( name in obj ) {
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
		}

	} else {

		// Serialize scalar item.
		add( prefix, obj );
	}
}

// Serialize an array of form elements or a set of
// key/values into a query string
jQuery.param = function( a, traditional ) {
	var prefix,
		s = [],
		add = function( key, valueOrFunction ) {

			// If value is a function, invoke it and use its return value
			var value = isFunction( valueOrFunction ) ?
				valueOrFunction() :
				valueOrFunction;

			s[ s.length ] = encodeURIComponent( key ) + "=" +
				encodeURIComponent( value == null ? "" : value );
		};

	if ( a == null ) {
		return "";
	}

	// If an array was passed in, assume that it is an array of form elements.
	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {

		// Serialize the form elements
		jQuery.each( a, function() {
			add( this.name, this.value );
		} );

	} else {

		// If traditional, encode the "old" way (the way 1.3.2 or older
		// did it), otherwise encode params recursively.
		for ( prefix in a ) {
			buildParams( prefix, a[ prefix ], traditional, add );
		}
	}

	// Return the resulting serialization
	return s.join( "&" );
};

jQuery.fn.extend( {
	serialize: function() {
		return jQuery.param( this.serializeArray() );
	},
	serializeArray: function() {
		return this.map( function() {

			// Can add propHook for "elements" to filter or add form elements
			var elements = jQuery.prop( this, "elements" );
			return elements ? jQuery.makeArray( elements ) : this;
		} )
		.filter( function() {
			var type = this.type;

			// Use .is( ":disabled" ) so that fieldset[disabled] works
			return this.name && !jQuery( this ).is( ":disabled" ) &&
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
				( this.checked || !rcheckableType.test( type ) );
		} )
		.map( function( _i, elem ) {
			var val = jQuery( this ).val();

			if ( val == null ) {
				return null;
			}

			if ( Array.isArray( val ) ) {
				return jQuery.map( val, function( val ) {
					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
				} );
			}

			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
		} ).get();
	}
} );


var
	r20 = /%20/g,
	rhash = /#.*$/,
	rantiCache = /([?&])_=[^&]*/,
	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,

	// #7653, #8125, #8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	rnoContent = /^(?:GET|HEAD)$/,
	rprotocol = /^\/\//,

	/* Prefilters
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
	 * 2) These are called:
	 *    - BEFORE asking for a transport
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
	 * 3) key is the dataType
	 * 4) the catchall symbol "*" can be used
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
	 */
	prefilters = {},

	/* Transports bindings
	 * 1) key is the dataType
	 * 2) the catchall symbol "*" can be used
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
	 */
	transports = {},

	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
	allTypes = "*/".concat( "*" ),

	// Anchor tag for parsing the document origin
	originAnchor = document.createElement( "a" );
	originAnchor.href = location.href;

// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {

	// dataTypeExpression is optional and defaults to "*"
	return function( dataTypeExpression, func ) {

		if ( typeof dataTypeExpression !== "string" ) {
			func = dataTypeExpression;
			dataTypeExpression = "*";
		}

		var dataType,
			i = 0,
			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];

		if ( isFunction( func ) ) {

			// For each dataType in the dataTypeExpression
			while ( ( dataType = dataTypes[ i++ ] ) ) {

				// Prepend if requested
				if ( dataType[ 0 ] === "+" ) {
					dataType = dataType.slice( 1 ) || "*";
					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );

				// Otherwise append
				} else {
					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
				}
			}
		}
	};
}

// Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {

	var inspected = {},
		seekingTransport = ( structure === transports );

	function inspect( dataType ) {
		var selected;
		inspected[ dataType ] = true;
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
			if ( typeof dataTypeOrTransport === "string" &&
				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {

				options.dataTypes.unshift( dataTypeOrTransport );
				inspect( dataTypeOrTransport );
				return false;
			} else if ( seekingTransport ) {
				return !( selected = dataTypeOrTransport );
			}
		} );
		return selected;
	}

	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}

// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
	var key, deep,
		flatOptions = jQuery.ajaxSettings.flatOptions || {};

	for ( key in src ) {
		if ( src[ key ] !== undefined ) {
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
		}
	}
	if ( deep ) {
		jQuery.extend( true, target, deep );
	}

	return target;
}

/* Handles responses to an ajax request:
 * - finds the right dataType (mediates between content-type and expected dataType)
 * - returns the corresponding response
 */
function ajaxHandleResponses( s, jqXHR, responses ) {

	var ct, type, finalDataType, firstDataType,
		contents = s.contents,
		dataTypes = s.dataTypes;

	// Remove auto dataType and get content-type in the process
	while ( dataTypes[ 0 ] === "*" ) {
		dataTypes.shift();
		if ( ct === undefined ) {
			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
		}
	}

	// Check if we're dealing with a known content-type
	if ( ct ) {
		for ( type in contents ) {
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
				dataTypes.unshift( type );
				break;
			}
		}
	}

	// Check to see if we have a response for the expected dataType
	if ( dataTypes[ 0 ] in responses ) {
		finalDataType = dataTypes[ 0 ];
	} else {

		// Try convertible dataTypes
		for ( type in responses ) {
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
				finalDataType = type;
				break;
			}
			if ( !firstDataType ) {
				firstDataType = type;
			}
		}

		// Or just use first one
		finalDataType = finalDataType || firstDataType;
	}

	// If we found a dataType
	// We add the dataType to the list if needed
	// and return the corresponding response
	if ( finalDataType ) {
		if ( finalDataType !== dataTypes[ 0 ] ) {
			dataTypes.unshift( finalDataType );
		}
		return responses[ finalDataType ];
	}
}

/* Chain conversions given the request and the original response
 * Also sets the responseXXX fields on the jqXHR instance
 */
function ajaxConvert( s, response, jqXHR, isSuccess ) {
	var conv2, current, conv, tmp, prev,
		converters = {},

		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

	// Create converters map with lowercased keys
	if ( dataTypes[ 1 ] ) {
		for ( conv in s.converters ) {
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
		}
	}

	current = dataTypes.shift();

	// Convert to each sequential dataType
	while ( current ) {

		if ( s.responseFields[ current ] ) {
			jqXHR[ s.responseFields[ current ] ] = response;
		}

		// Apply the dataFilter if provided
		if ( !prev && isSuccess && s.dataFilter ) {
			response = s.dataFilter( response, s.dataType );
		}

		prev = current;
		current = dataTypes.shift();

		if ( current ) {

			// There's only work to do if current dataType is non-auto
			if ( current === "*" ) {

				current = prev;

			// Convert response if prev dataType is non-auto and differs from current
			} else if ( prev !== "*" && prev !== current ) {

				// Seek a direct converter
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];

				// If none found, seek a pair
				if ( !conv ) {
					for ( conv2 in converters ) {

						// If conv2 outputs current
						tmp = conv2.split( " " );
						if ( tmp[ 1 ] === current ) {

							// If prev can be converted to accepted input
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
								converters[ "* " + tmp[ 0 ] ];
							if ( conv ) {

								// Condense equivalence converters
								if ( conv === true ) {
									conv = converters[ conv2 ];

								// Otherwise, insert the intermediate dataType
								} else if ( converters[ conv2 ] !== true ) {
									current = tmp[ 0 ];
									dataTypes.unshift( tmp[ 1 ] );
								}
								break;
							}
						}
					}
				}

				// Apply converter (if not an equivalence)
				if ( conv !== true ) {

					// Unless errors are allowed to bubble, catch and return them
					if ( conv && s.throws ) {
						response = conv( response );
					} else {
						try {
							response = conv( response );
						} catch ( e ) {
							return {
								state: "parsererror",
								error: conv ? e : "No conversion from " + prev + " to " + current
							};
						}
					}
				}
			}
		}
	}

	return { state: "success", data: response };
}

jQuery.extend( {

	// Counter for holding the number of active queries
	active: 0,

	// Last-Modified header cache for next request
	lastModified: {},
	etag: {},

	ajaxSettings: {
		url: location.href,
		type: "GET",
		isLocal: rlocalProtocol.test( location.protocol ),
		global: true,
		processData: true,
		async: true,
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",

		/*
		timeout: 0,
		data: null,
		dataType: null,
		username: null,
		password: null,
		cache: null,
		throws: false,
		traditional: false,
		headers: {},
		*/

		accepts: {
			"*": allTypes,
			text: "text/plain",
			html: "text/html",
			xml: "application/xml, text/xml",
			json: "application/json, text/javascript"
		},

		contents: {
			xml: /\bxml\b/,
			html: /\bhtml/,
			json: /\bjson\b/
		},

		responseFields: {
			xml: "responseXML",
			text: "responseText",
			json: "responseJSON"
		},

		// Data converters
		// Keys separate source (or catchall "*") and destination types with a single space
		converters: {

			// Convert anything to text
			"* text": String,

			// Text to html (true = no transformation)
			"text html": true,

			// Evaluate text as a json expression
			"text json": JSON.parse,

			// Parse text as xml
			"text xml": jQuery.parseXML
		},

		// For options that shouldn't be deep extended:
		// you can add your own custom options here if
		// and when you create one that shouldn't be
		// deep extended (see ajaxExtend)
		flatOptions: {
			url: true,
			context: true
		}
	},

	// Creates a full fledged settings object into target
	// with both ajaxSettings and settings fields.
	// If target is omitted, writes into ajaxSettings.
	ajaxSetup: function( target, settings ) {
		return settings ?

			// Building a settings object
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :

			// Extending ajaxSettings
			ajaxExtend( jQuery.ajaxSettings, target );
	},

	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
	ajaxTransport: addToPrefiltersOrTransports( transports ),

	// Main method
	ajax: function( url, options ) {

		// If url is an object, simulate pre-1.5 signature
		if ( typeof url === "object" ) {
			options = url;
			url = undefined;
		}

		// Force options to be an object
		options = options || {};

		var transport,

			// URL without anti-cache param
			cacheURL,

			// Response headers
			responseHeadersString,
			responseHeaders,

			// timeout handle
			timeoutTimer,

			// Url cleanup var
			urlAnchor,

			// Request state (becomes false upon send and true upon completion)
			completed,

			// To know if global events are to be dispatched
			fireGlobals,

			// Loop variable
			i,

			// uncached part of the url
			uncached,

			// Create the final options object
			s = jQuery.ajaxSetup( {}, options ),

			// Callbacks context
			callbackContext = s.context || s,

			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context &&
				( callbackContext.nodeType || callbackContext.jquery ) ?
					jQuery( callbackContext ) :
					jQuery.event,

			// Deferreds
			deferred = jQuery.Deferred(),
			completeDeferred = jQuery.Callbacks( "once memory" ),

			// Status-dependent callbacks
			statusCode = s.statusCode || {},

			// Headers (they are sent all at once)
			requestHeaders = {},
			requestHeadersNames = {},

			// Default abort message
			strAbort = "canceled",

			// Fake xhr
			jqXHR = {
				readyState: 0,

				// Builds headers hashtable if needed
				getResponseHeader: function( key ) {
					var match;
					if ( completed ) {
						if ( !responseHeaders ) {
							responseHeaders = {};
							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
										.concat( match[ 2 ] );
							}
						}
						match = responseHeaders[ key.toLowerCase() + " " ];
					}
					return match == null ? null : match.join( ", " );
				},

				// Raw string
				getAllResponseHeaders: function() {
					return completed ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function( name, value ) {
					if ( completed == null ) {
						name = requestHeadersNames[ name.toLowerCase() ] =
							requestHeadersNames[ name.toLowerCase() ] || name;
						requestHeaders[ name ] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function( type ) {
					if ( completed == null ) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function( map ) {
					var code;
					if ( map ) {
						if ( completed ) {

							// Execute the appropriate callbacks
							jqXHR.always( map[ jqXHR.status ] );
						} else {

							// Lazy-add the new callbacks in a way that preserves old ones
							for ( code in map ) {
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
							}
						}
					}
					return this;
				},

				// Cancel the request
				abort: function( statusText ) {
					var finalText = statusText || strAbort;
					if ( transport ) {
						transport.abort( finalText );
					}
					done( 0, finalText );
					return this;
				}
			};

		// Attach deferreds
		deferred.promise( jqXHR );

		// Add protocol if not provided (prefilters might expect it)
		// Handle falsy url in the settings object (#10093: consistency with old signature)
		// We also use the url parameter if available
		s.url = ( ( url || s.url || location.href ) + "" )
			.replace( rprotocol, location.protocol + "//" );

		// Alias method option to type as per ticket #12004
		s.type = options.method || options.type || s.method || s.type;

		// Extract dataTypes list
		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];

		// A cross-domain request is in order when the origin doesn't match the current origin.
		if ( s.crossDomain == null ) {
			urlAnchor = document.createElement( "a" );

			// Support: IE <=8 - 11, Edge 12 - 15
			// IE throws exception on accessing the href property if url is malformed,
			// e.g. http://example.com:80x/
			try {
				urlAnchor.href = s.url;

				// Support: IE <=8 - 11 only
				// Anchor's host property isn't correctly set when s.url is relative
				urlAnchor.href = urlAnchor.href;
				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
					urlAnchor.protocol + "//" + urlAnchor.host;
			} catch ( e ) {

				// If there is an error parsing the URL, assume it is crossDomain,
				// it can be rejected by the transport if it is invalid
				s.crossDomain = true;
			}
		}

		// Convert data if not already a string
		if ( s.data && s.processData && typeof s.data !== "string" ) {
			s.data = jQuery.param( s.data, s.traditional );
		}

		// Apply prefilters
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );

		// If request was aborted inside a prefilter, stop there
		if ( completed ) {
			return jqXHR;
		}

		// We can fire global events as of now if asked to
		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
		fireGlobals = jQuery.event && s.global;

		// Watch for a new set of requests
		if ( fireGlobals && jQuery.active++ === 0 ) {
			jQuery.event.trigger( "ajaxStart" );
		}

		// Uppercase the type
		s.type = s.type.toUpperCase();

		// Determine if request has content
		s.hasContent = !rnoContent.test( s.type );

		// Save the URL in case we're toying with the If-Modified-Since
		// and/or If-None-Match header later on
		// Remove hash to simplify url manipulation
		cacheURL = s.url.replace( rhash, "" );

		// More options handling for requests with no content
		if ( !s.hasContent ) {

			// Remember the hash so we can put it back
			uncached = s.url.slice( cacheURL.length );

			// If data is available and should be processed, append data to url
			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;

				// #9682: remove data so that it's not used in an eventual retry
				delete s.data;
			}

			// Add or update anti-cache param if needed
			if ( s.cache === false ) {
				cacheURL = cacheURL.replace( rantiCache, "$1" );
				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
					uncached;
			}

			// Put hash and anti-cache on the URL that will be requested (gh-1732)
			s.url = cacheURL + uncached;

		// Change '%20' to '+' if this is encoded form body content (gh-2658)
		} else if ( s.data && s.processData &&
			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
			s.data = s.data.replace( r20, "+" );
		}

		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
		if ( s.ifModified ) {
			if ( jQuery.lastModified[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
			}
			if ( jQuery.etag[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
			}
		}

		// Set the correct header, if data is being sent
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
		}

		// Set the Accepts header for the server, depending on the dataType
		jqXHR.setRequestHeader(
			"Accept",
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
				s.accepts[ s.dataTypes[ 0 ] ] +
					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
				s.accepts[ "*" ]
		);

		// Check for headers option
		for ( i in s.headers ) {
			jqXHR.setRequestHeader( i, s.headers[ i ] );
		}

		// Allow custom headers/mimetypes and early abort
		if ( s.beforeSend &&
			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {

			// Abort if not done already and return
			return jqXHR.abort();
		}

		// Aborting is no longer a cancellation
		strAbort = "abort";

		// Install callbacks on deferreds
		completeDeferred.add( s.complete );
		jqXHR.done( s.success );
		jqXHR.fail( s.error );

		// Get transport
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );

		// If no transport, we auto-abort
		if ( !transport ) {
			done( -1, "No Transport" );
		} else {
			jqXHR.readyState = 1;

			// Send global event
			if ( fireGlobals ) {
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
			}

			// If request was aborted inside ajaxSend, stop there
			if ( completed ) {
				return jqXHR;
			}

			// Timeout
			if ( s.async && s.timeout > 0 ) {
				timeoutTimer = window.setTimeout( function() {
					jqXHR.abort( "timeout" );
				}, s.timeout );
			}

			try {
				completed = false;
				transport.send( requestHeaders, done );
			} catch ( e ) {

				// Rethrow post-completion exceptions
				if ( completed ) {
					throw e;
				}

				// Propagate others as results
				done( -1, e );
			}
		}

		// Callback for when everything is done
		function done( status, nativeStatusText, responses, headers ) {
			var isSuccess, success, error, response, modified,
				statusText = nativeStatusText;

			// Ignore repeat invocations
			if ( completed ) {
				return;
			}

			completed = true;

			// Clear timeout if it exists
			if ( timeoutTimer ) {
				window.clearTimeout( timeoutTimer );
			}

			// Dereference transport for early garbage collection
			// (no matter how long the jqXHR object will be used)
			transport = undefined;

			// Cache response headers
			responseHeadersString = headers || "";

			// Set readyState
			jqXHR.readyState = status > 0 ? 4 : 0;

			// Determine if successful
			isSuccess = status >= 200 && status < 300 || status === 304;

			// Get response data
			if ( responses ) {
				response = ajaxHandleResponses( s, jqXHR, responses );
			}

			// Use a noop converter for missing script
			if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
				s.converters[ "text script" ] = function() {};
			}

			// Convert no matter what (that way responseXXX fields are always set)
			response = ajaxConvert( s, response, jqXHR, isSuccess );

			// If successful, handle type chaining
			if ( isSuccess ) {

				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
				if ( s.ifModified ) {
					modified = jqXHR.getResponseHeader( "Last-Modified" );
					if ( modified ) {
						jQuery.lastModified[ cacheURL ] = modified;
					}
					modified = jqXHR.getResponseHeader( "etag" );
					if ( modified ) {
						jQuery.etag[ cacheURL ] = modified;
					}
				}

				// if no content
				if ( status === 204 || s.type === "HEAD" ) {
					statusText = "nocontent";

				// if not modified
				} else if ( status === 304 ) {
					statusText = "notmodified";

				// If we have data, let's convert it
				} else {
					statusText = response.state;
					success = response.data;
					error = response.error;
					isSuccess = !error;
				}
			} else {

				// Extract error from statusText and normalize for non-aborts
				error = statusText;
				if ( status || !statusText ) {
					statusText = "error";
					if ( status < 0 ) {
						status = 0;
					}
				}
			}

			// Set data for the fake xhr object
			jqXHR.status = status;
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";

			// Success/Error
			if ( isSuccess ) {
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
			} else {
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
			}

			// Status-dependent callbacks
			jqXHR.statusCode( statusCode );
			statusCode = undefined;

			if ( fireGlobals ) {
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
					[ jqXHR, s, isSuccess ? success : error ] );
			}

			// Complete
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );

			if ( fireGlobals ) {
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );

				// Handle the global AJAX counter
				if ( !( --jQuery.active ) ) {
					jQuery.event.trigger( "ajaxStop" );
				}
			}
		}

		return jqXHR;
	},

	getJSON: function( url, data, callback ) {
		return jQuery.get( url, data, callback, "json" );
	},

	getScript: function( url, callback ) {
		return jQuery.get( url, undefined, callback, "script" );
	}
} );

jQuery.each( [ "get", "post" ], function( _i, method ) {
	jQuery[ method ] = function( url, data, callback, type ) {

		// Shift arguments if data argument was omitted
		if ( isFunction( data ) ) {
			type = type || callback;
			callback = data;
			data = undefined;
		}

		// The url can be an options object (which then must have .url)
		return jQuery.ajax( jQuery.extend( {
			url: url,
			type: method,
			dataType: type,
			data: data,
			success: callback
		}, jQuery.isPlainObject( url ) && url ) );
	};
} );

jQuery.ajaxPrefilter( function( s ) {
	var i;
	for ( i in s.headers ) {
		if ( i.toLowerCase() === "content-type" ) {
			s.contentType = s.headers[ i ] || "";
		}
	}
} );


jQuery._evalUrl = function( url, options, doc ) {
	return jQuery.ajax( {
		url: url,

		// Make this explicit, since user can override this through ajaxSetup (#11264)
		type: "GET",
		dataType: "script",
		cache: true,
		async: false,
		global: false,

		// Only evaluate the response if it is successful (gh-4126)
		// dataFilter is not invoked for failure responses, so using it instead
		// of the default converter is kludgy but it works.
		converters: {
			"text script": function() {}
		},
		dataFilter: function( response ) {
			jQuery.globalEval( response, options, doc );
		}
	} );
};


jQuery.fn.extend( {
	wrapAll: function( html ) {
		var wrap;

		if ( this[ 0 ] ) {
			if ( isFunction( html ) ) {
				html = html.call( this[ 0 ] );
			}

			// The elements to wrap the target around
			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );

			if ( this[ 0 ].parentNode ) {
				wrap.insertBefore( this[ 0 ] );
			}

			wrap.map( function() {
				var elem = this;

				while ( elem.firstElementChild ) {
					elem = elem.firstElementChild;
				}

				return elem;
			} ).append( this );
		}

		return this;
	},

	wrapInner: function( html ) {
		if ( isFunction( html ) ) {
			return this.each( function( i ) {
				jQuery( this ).wrapInner( html.call( this, i ) );
			} );
		}

		return this.each( function() {
			var self = jQuery( this ),
				contents = self.contents();

			if ( contents.length ) {
				contents.wrapAll( html );

			} else {
				self.append( html );
			}
		} );
	},

	wrap: function( html ) {
		var htmlIsFunction = isFunction( html );

		return this.each( function( i ) {
			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
		} );
	},

	unwrap: function( selector ) {
		this.parent( selector ).not( "body" ).each( function() {
			jQuery( this ).replaceWith( this.childNodes );
		} );
		return this;
	}
} );


jQuery.expr.pseudos.hidden = function( elem ) {
	return !jQuery.expr.pseudos.visible( elem );
};
jQuery.expr.pseudos.visible = function( elem ) {
	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};




jQuery.ajaxSettings.xhr = function() {
	try {
		return new window.XMLHttpRequest();
	} catch ( e ) {}
};

var xhrSuccessStatus = {

		// File protocol always yields status code 0, assume 200
		0: 200,

		// Support: IE <=9 only
		// #1450: sometimes IE returns 1223 when it should be 204
		1223: 204
	},
	xhrSupported = jQuery.ajaxSettings.xhr();

support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
support.ajax = xhrSupported = !!xhrSupported;

jQuery.ajaxTransport( function( options ) {
	var callback, errorCallback;

	// Cross domain only allowed if supported through XMLHttpRequest
	if ( support.cors || xhrSupported && !options.crossDomain ) {
		return {
			send: function( headers, complete ) {
				var i,
					xhr = options.xhr();

				xhr.open(
					options.type,
					options.url,
					options.async,
					options.username,
					options.password
				);

				// Apply custom fields if provided
				if ( options.xhrFields ) {
					for ( i in options.xhrFields ) {
						xhr[ i ] = options.xhrFields[ i ];
					}
				}

				// Override mime type if needed
				if ( options.mimeType && xhr.overrideMimeType ) {
					xhr.overrideMimeType( options.mimeType );
				}

				// X-Requested-With header
				// For cross-domain requests, seeing as conditions for a preflight are
				// akin to a jigsaw puzzle, we simply never set it to be sure.
				// (it can always be set on a per-request basis or even using ajaxSetup)
				// For same-domain requests, won't change header if already provided.
				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
					headers[ "X-Requested-With" ] = "XMLHttpRequest";
				}

				// Set headers
				for ( i in headers ) {
					xhr.setRequestHeader( i, headers[ i ] );
				}

				// Callback
				callback = function( type ) {
					return function() {
						if ( callback ) {
							callback = errorCallback = xhr.onload =
								xhr.onerror = xhr.onabort = xhr.ontimeout =
									xhr.onreadystatechange = null;

							if ( type === "abort" ) {
								xhr.abort();
							} else if ( type === "error" ) {

								// Support: IE <=9 only
								// On a manual native abort, IE9 throws
								// errors on any property access that is not readyState
								if ( typeof xhr.status !== "number" ) {
									complete( 0, "error" );
								} else {
									complete(

										// File: protocol always yields status 0; see #8605, #14207
										xhr.status,
										xhr.statusText
									);
								}
							} else {
								complete(
									xhrSuccessStatus[ xhr.status ] || xhr.status,
									xhr.statusText,

									// Support: IE <=9 only
									// IE9 has no XHR2 but throws on binary (trac-11426)
									// For XHR2 non-text, let the caller handle it (gh-2498)
									( xhr.responseType || "text" ) !== "text"  ||
									typeof xhr.responseText !== "string" ?
										{ binary: xhr.response } :
										{ text: xhr.responseText },
									xhr.getAllResponseHeaders()
								);
							}
						}
					};
				};

				// Listen to events
				xhr.onload = callback();
				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );

				// Support: IE 9 only
				// Use onreadystatechange to replace onabort
				// to handle uncaught aborts
				if ( xhr.onabort !== undefined ) {
					xhr.onabort = errorCallback;
				} else {
					xhr.onreadystatechange = function() {

						// Check readyState before timeout as it changes
						if ( xhr.readyState === 4 ) {

							// Allow onerror to be called first,
							// but that will not handle a native abort
							// Also, save errorCallback to a variable
							// as xhr.onerror cannot be accessed
							window.setTimeout( function() {
								if ( callback ) {
									errorCallback();
								}
							} );
						}
					};
				}

				// Create the abort callback
				callback = callback( "abort" );

				try {

					// Do send the request (this may raise an exception)
					xhr.send( options.hasContent && options.data || null );
				} catch ( e ) {

					// #14683: Only rethrow if this hasn't been notified as an error yet
					if ( callback ) {
						throw e;
					}
				}
			},

			abort: function() {
				if ( callback ) {
					callback();
				}
			}
		};
	}
} );




// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
jQuery.ajaxPrefilter( function( s ) {
	if ( s.crossDomain ) {
		s.contents.script = false;
	}
} );

// Install script dataType
jQuery.ajaxSetup( {
	accepts: {
		script: "text/javascript, application/javascript, " +
			"application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /\b(?:java|ecma)script\b/
	},
	converters: {
		"text script": function( text ) {
			jQuery.globalEval( text );
			return text;
		}
	}
} );

// Handle cache's special case and crossDomain
jQuery.ajaxPrefilter( "script", function( s ) {
	if ( s.cache === undefined ) {
		s.cache = false;
	}
	if ( s.crossDomain ) {
		s.type = "GET";
	}
} );

// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {

	// This transport only deals with cross domain or forced-by-attrs requests
	if ( s.crossDomain || s.scriptAttrs ) {
		var script, callback;
		return {
			send: function( _, complete ) {
				script = jQuery( "<script>" )
					.attr( s.scriptAttrs || {} )
					.prop( { charset: s.scriptCharset, src: s.url } )
					.on( "load error", callback = function( evt ) {
						script.remove();
						callback = null;
						if ( evt ) {
							complete( evt.type === "error" ? 404 : 200, evt.type );
						}
					} );

				// Use native DOM manipulation to avoid our domManip AJAX trickery
				document.head.appendChild( script[ 0 ] );
			},
			abort: function() {
				if ( callback ) {
					callback();
				}
			}
		};
	}
} );




var oldCallbacks = [],
	rjsonp = /(=)\?(?=&|$)|\?\?/;

// Default jsonp settings
jQuery.ajaxSetup( {
	jsonp: "callback",
	jsonpCallback: function() {
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
		this[ callback ] = true;
		return callback;
	}
} );

// Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {

	var callbackName, overwritten, responseContainer,
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
			"url" :
			typeof s.data === "string" &&
				( s.contentType || "" )
					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
				rjsonp.test( s.data ) && "data"
		);

	// Handle iff the expected data type is "jsonp" or we have a parameter to set
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {

		// Get callback name, remembering preexisting value associated with it
		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
			s.jsonpCallback() :
			s.jsonpCallback;

		// Insert callback into url or form data
		if ( jsonProp ) {
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
		} else if ( s.jsonp !== false ) {
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
		}

		// Use data converter to retrieve json after script execution
		s.converters[ "script json" ] = function() {
			if ( !responseContainer ) {
				jQuery.error( callbackName + " was not called" );
			}
			return responseContainer[ 0 ];
		};

		// Force json dataType
		s.dataTypes[ 0 ] = "json";

		// Install callback
		overwritten = window[ callbackName ];
		window[ callbackName ] = function() {
			responseContainer = arguments;
		};

		// Clean-up function (fires after converters)
		jqXHR.always( function() {

			// If previous value didn't exist - remove it
			if ( overwritten === undefined ) {
				jQuery( window ).removeProp( callbackName );

			// Otherwise restore preexisting value
			} else {
				window[ callbackName ] = overwritten;
			}

			// Save back as free
			if ( s[ callbackName ] ) {

				// Make sure that re-using the options doesn't screw things around
				s.jsonpCallback = originalSettings.jsonpCallback;

				// Save the callback name for future use
				oldCallbacks.push( callbackName );
			}

			// Call if it was a function and we have a response
			if ( responseContainer && isFunction( overwritten ) ) {
				overwritten( responseContainer[ 0 ] );
			}

			responseContainer = overwritten = undefined;
		} );

		// Delegate to script
		return "script";
	}
} );




// Support: Safari 8 only
// In Safari 8 documents created via document.implementation.createHTMLDocument
// collapse sibling forms: the second one becomes a child of the first one.
// Because of that, this security measure has to be disabled in Safari 8.
// https://bugs.webkit.org/show_bug.cgi?id=137337
support.createHTMLDocument = ( function() {
	var body = document.implementation.createHTMLDocument( "" ).body;
	body.innerHTML = "<form></form><form></form>";
	return body.childNodes.length === 2;
} )();


// Argument "data" should be string of html
// context (optional): If specified, the fragment will be created in this context,
// defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
jQuery.parseHTML = function( data, context, keepScripts ) {
	if ( typeof data !== "string" ) {
		return [];
	}
	if ( typeof context === "boolean" ) {
		keepScripts = context;
		context = false;
	}

	var base, parsed, scripts;

	if ( !context ) {

		// Stop scripts or inline event handlers from being executed immediately
		// by using document.implementation
		if ( support.createHTMLDocument ) {
			context = document.implementation.createHTMLDocument( "" );

			// Set the base href for the created document
			// so any parsed elements with URLs
			// are based on the document's URL (gh-2965)
			base = context.createElement( "base" );
			base.href = document.location.href;
			context.head.appendChild( base );
		} else {
			context = document;
		}
	}

	parsed = rsingleTag.exec( data );
	scripts = !keepScripts && [];

	// Single tag
	if ( parsed ) {
		return [ context.createElement( parsed[ 1 ] ) ];
	}

	parsed = buildFragment( [ data ], context, scripts );

	if ( scripts && scripts.length ) {
		jQuery( scripts ).remove();
	}

	return jQuery.merge( [], parsed.childNodes );
};


/**
 * Load a url into a page
 */
jQuery.fn.load = function( url, params, callback ) {
	var selector, type, response,
		self = this,
		off = url.indexOf( " " );

	if ( off > -1 ) {
		selector = stripAndCollapse( url.slice( off ) );
		url = url.slice( 0, off );
	}

	// If it's a function
	if ( isFunction( params ) ) {

		// We assume that it's the callback
		callback = params;
		params = undefined;

	// Otherwise, build a param string
	} else if ( params && typeof params === "object" ) {
		type = "POST";
	}

	// If we have elements to modify, make the request
	if ( self.length > 0 ) {
		jQuery.ajax( {
			url: url,

			// If "type" variable is undefined, then "GET" method will be used.
			// Make value of this field explicit since
			// user can override it through ajaxSetup method
			type: type || "GET",
			dataType: "html",
			data: params
		} ).done( function( responseText ) {

			// Save response for use in complete callback
			response = arguments;

			self.html( selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :

				// Otherwise use the full result
				responseText );

		// If the request succeeds, this function gets "data", "status", "jqXHR"
		// but they are ignored because response was set above.
		// If it fails, this function gets "jqXHR", "status", "error"
		} ).always( callback && function( jqXHR, status ) {
			self.each( function() {
				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
			} );
		} );
	}

	return this;
};




jQuery.expr.pseudos.animated = function( elem ) {
	return jQuery.grep( jQuery.timers, function( fn ) {
		return elem === fn.elem;
	} ).length;
};




jQuery.offset = {
	setOffset: function( elem, options, i ) {
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
			position = jQuery.css( elem, "position" ),
			curElem = jQuery( elem ),
			props = {};

		// Set position first, in-case top/left are set even on static elem
		if ( position === "static" ) {
			elem.style.position = "relative";
		}

		curOffset = curElem.offset();
		curCSSTop = jQuery.css( elem, "top" );
		curCSSLeft = jQuery.css( elem, "left" );
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;

		// Need to be able to calculate position if either
		// top or left is auto and position is either absolute or fixed
		if ( calculatePosition ) {
			curPosition = curElem.position();
			curTop = curPosition.top;
			curLeft = curPosition.left;

		} else {
			curTop = parseFloat( curCSSTop ) || 0;
			curLeft = parseFloat( curCSSLeft ) || 0;
		}

		if ( isFunction( options ) ) {

			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
		}

		if ( options.top != null ) {
			props.top = ( options.top - curOffset.top ) + curTop;
		}
		if ( options.left != null ) {
			props.left = ( options.left - curOffset.left ) + curLeft;
		}

		if ( "using" in options ) {
			options.using.call( elem, props );

		} else {
			if ( typeof props.top === "number" ) {
				props.top += "px";
			}
			if ( typeof props.left === "number" ) {
				props.left += "px";
			}
			curElem.css( props );
		}
	}
};

jQuery.fn.extend( {

	// offset() relates an element's border box to the document origin
	offset: function( options ) {

		// Preserve chaining for setter
		if ( arguments.length ) {
			return options === undefined ?
				this :
				this.each( function( i ) {
					jQuery.offset.setOffset( this, options, i );
				} );
		}

		var rect, win,
			elem = this[ 0 ];

		if ( !elem ) {
			return;
		}

		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
		// Support: IE <=11 only
		// Running getBoundingClientRect on a
		// disconnected node in IE throws an error
		if ( !elem.getClientRects().length ) {
			return { top: 0, left: 0 };
		}

		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
		rect = elem.getBoundingClientRect();
		win = elem.ownerDocument.defaultView;
		return {
			top: rect.top + win.pageYOffset,
			left: rect.left + win.pageXOffset
		};
	},

	// position() relates an element's margin box to its offset parent's padding box
	// This corresponds to the behavior of CSS absolute positioning
	position: function() {
		if ( !this[ 0 ] ) {
			return;
		}

		var offsetParent, offset, doc,
			elem = this[ 0 ],
			parentOffset = { top: 0, left: 0 };

		// position:fixed elements are offset from the viewport, which itself always has zero offset
		if ( jQuery.css( elem, "position" ) === "fixed" ) {

			// Assume position:fixed implies availability of getBoundingClientRect
			offset = elem.getBoundingClientRect();

		} else {
			offset = this.offset();

			// Account for the *real* offset parent, which can be the document or its root element
			// when a statically positioned element is identified
			doc = elem.ownerDocument;
			offsetParent = elem.offsetParent || doc.documentElement;
			while ( offsetParent &&
				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
				jQuery.css( offsetParent, "position" ) === "static" ) {

				offsetParent = offsetParent.parentNode;
			}
			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {

				// Incorporate borders into its offset, since they are outside its content origin
				parentOffset = jQuery( offsetParent ).offset();
				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
			}
		}

		// Subtract parent offsets and element margins
		return {
			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
		};
	},

	// This method will return documentElement in the following cases:
	// 1) For the element inside the iframe without offsetParent, this method will return
	//    documentElement of the parent window
	// 2) For the hidden or detached element
	// 3) For body or html element, i.e. in case of the html node - it will return itself
	//
	// but those exceptions were never presented as a real life use-cases
	// and might be considered as more preferable results.
	//
	// This logic, however, is not guaranteed and can change at any point in the future
	offsetParent: function() {
		return this.map( function() {
			var offsetParent = this.offsetParent;

			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
				offsetParent = offsetParent.offsetParent;
			}

			return offsetParent || documentElement;
		} );
	}
} );

// Create scrollLeft and scrollTop methods
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
	var top = "pageYOffset" === prop;

	jQuery.fn[ method ] = function( val ) {
		return access( this, function( elem, method, val ) {

			// Coalesce documents and windows
			var win;
			if ( isWindow( elem ) ) {
				win = elem;
			} else if ( elem.nodeType === 9 ) {
				win = elem.defaultView;
			}

			if ( val === undefined ) {
				return win ? win[ prop ] : elem[ method ];
			}

			if ( win ) {
				win.scrollTo(
					!top ? val : win.pageXOffset,
					top ? val : win.pageYOffset
				);

			} else {
				elem[ method ] = val;
			}
		}, method, val, arguments.length );
	};
} );

// Support: Safari <=7 - 9.1, Chrome <=37 - 49
// Add the top/left cssHooks using jQuery.fn.position
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
// getComputedStyle returns percent when specified for top/left/bottom/right;
// rather than make the css module depend on the offset module, just check for it here
jQuery.each( [ "top", "left" ], function( _i, prop ) {
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
		function( elem, computed ) {
			if ( computed ) {
				computed = curCSS( elem, prop );

				// If curCSS returns percentage, fallback to offset
				return rnumnonpx.test( computed ) ?
					jQuery( elem ).position()[ prop ] + "px" :
					computed;
			}
		}
	);
} );


// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
		function( defaultExtra, funcName ) {

		// Margin is only for outerHeight, outerWidth
		jQuery.fn[ funcName ] = function( margin, value ) {
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );

			return access( this, function( elem, type, value ) {
				var doc;

				if ( isWindow( elem ) ) {

					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
					return funcName.indexOf( "outer" ) === 0 ?
						elem[ "inner" + name ] :
						elem.document.documentElement[ "client" + name ];
				}

				// Get document width or height
				if ( elem.nodeType === 9 ) {
					doc = elem.documentElement;

					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
					// whichever is greatest
					return Math.max(
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
						elem.body[ "offset" + name ], doc[ "offset" + name ],
						doc[ "client" + name ]
					);
				}

				return value === undefined ?

					// Get width or height on the element, requesting but not forcing parseFloat
					jQuery.css( elem, type, extra ) :

					// Set width or height on the element
					jQuery.style( elem, type, value, extra );
			}, type, chainable ? margin : undefined, chainable );
		};
	} );
} );


jQuery.each( [
	"ajaxStart",
	"ajaxStop",
	"ajaxComplete",
	"ajaxError",
	"ajaxSuccess",
	"ajaxSend"
], function( _i, type ) {
	jQuery.fn[ type ] = function( fn ) {
		return this.on( type, fn );
	};
} );




jQuery.fn.extend( {

	bind: function( types, data, fn ) {
		return this.on( types, null, data, fn );
	},
	unbind: function( types, fn ) {
		return this.off( types, null, fn );
	},

	delegate: function( selector, types, data, fn ) {
		return this.on( types, selector, data, fn );
	},
	undelegate: function( selector, types, fn ) {

		// ( namespace ) or ( selector, types [, fn] )
		return arguments.length === 1 ?
			this.off( selector, "**" ) :
			this.off( types, selector || "**", fn );
	},

	hover: function( fnOver, fnOut ) {
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
	}
} );

jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
	function( _i, name ) {

		// Handle event binding
		jQuery.fn[ name ] = function( data, fn ) {
			return arguments.length > 0 ?
				this.on( name, null, data, fn ) :
				this.trigger( name );
		};
	} );




// Support: Android <=4.0 only
// Make sure we trim BOM and NBSP
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

// Bind a function to a context, optionally partially applying any
// arguments.
// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
// However, it is not slated for removal any time soon
jQuery.proxy = function( fn, context ) {
	var tmp, args, proxy;

	if ( typeof context === "string" ) {
		tmp = fn[ context ];
		context = fn;
		fn = tmp;
	}

	// Quick check to determine if target is callable, in the spec
	// this throws a TypeError, but we will just return undefined.
	if ( !isFunction( fn ) ) {
		return undefined;
	}

	// Simulated bind
	args = slice.call( arguments, 2 );
	proxy = function() {
		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
	};

	// Set the guid of unique handler to the same of original handler, so it can be removed
	proxy.guid = fn.guid = fn.guid || jQuery.guid++;

	return proxy;
};

jQuery.holdReady = function( hold ) {
	if ( hold ) {
		jQuery.readyWait++;
	} else {
		jQuery.ready( true );
	}
};
jQuery.isArray = Array.isArray;
jQuery.parseJSON = JSON.parse;
jQuery.nodeName = nodeName;
jQuery.isFunction = isFunction;
jQuery.isWindow = isWindow;
jQuery.camelCase = camelCase;
jQuery.type = toType;

jQuery.now = Date.now;

jQuery.isNumeric = function( obj ) {

	// As of jQuery 3.0, isNumeric is limited to
	// strings and numbers (primitives or objects)
	// that can be coerced to finite numbers (gh-2662)
	var type = jQuery.type( obj );
	return ( type === "number" || type === "string" ) &&

		// parseFloat NaNs numeric-cast false positives ("")
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
		// subtraction forces infinities to NaN
		!isNaN( obj - parseFloat( obj ) );
};

jQuery.trim = function( text ) {
	return text == null ?
		"" :
		( text + "" ).replace( rtrim, "" );
};



// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

// Note that for maximum portability, libraries that are not jQuery should
// declare themselves as anonymous modules, and avoid setting a global if an
// AMD loader is present. jQuery is a special case. For more information, see
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

if ( true ) {
	!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {
		return jQuery;
	}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
}




var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,

	// Map over the $ in case of overwrite
	_$ = window.$;

jQuery.noConflict = function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}

	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}

	return jQuery;
};

// Expose jQuery and $ identifiers, even in AMD
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( typeof noGlobal === "undefined" ) {
	window.jQuery = window.$ = jQuery;
}




return jQuery;
} );


/***/ }),

/***/ "./node_modules/popper.js/dist/esm/popper.js":
/*!***************************************************!*\
  !*** ./node_modules/popper.js/dist/esm/popper.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/**!
 * @fileOverview Kickass library to create and place poppers near their reference elements.
 * @version 1.16.1
 * @license
 * Copyright (c) 2016 Federico Zivolo and contributors
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';

var timeoutDuration = function () {
  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
      return 1;
    }
  }
  return 0;
}();

function microtaskDebounce(fn) {
  var called = false;
  return function () {
    if (called) {
      return;
    }
    called = true;
    window.Promise.resolve().then(function () {
      called = false;
      fn();
    });
  };
}

function taskDebounce(fn) {
  var scheduled = false;
  return function () {
    if (!scheduled) {
      scheduled = true;
      setTimeout(function () {
        scheduled = false;
        fn();
      }, timeoutDuration);
    }
  };
}

var supportsMicroTasks = isBrowser && window.Promise;

/**
* Create a debounced version of a method, that's asynchronously deferred
* but called in the minimum time possible.
*
* @method
* @memberof Popper.Utils
* @argument {Function} fn
* @returns {Function}
*/
var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;

/**
 * Check if the given variable is a function
 * @method
 * @memberof Popper.Utils
 * @argument {Any} functionToCheck - variable to check
 * @returns {Boolean} answer to: is a function?
 */
function isFunction(functionToCheck) {
  var getType = {};
  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}

/**
 * Get CSS computed property of the given element
 * @method
 * @memberof Popper.Utils
 * @argument {Eement} element
 * @argument {String} property
 */
function getStyleComputedProperty(element, property) {
  if (element.nodeType !== 1) {
    return [];
  }
  // NOTE: 1 DOM access here
  var window = element.ownerDocument.defaultView;
  var css = window.getComputedStyle(element, null);
  return property ? css[property] : css;
}

/**
 * Returns the parentNode or the host of the element
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @returns {Element} parent
 */
function getParentNode(element) {
  if (element.nodeName === 'HTML') {
    return element;
  }
  return element.parentNode || element.host;
}

/**
 * Returns the scrolling parent of the given element
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @returns {Element} scroll parent
 */
function getScrollParent(element) {
  // Return body, `getScroll` will take care to get the correct `scrollTop` from it
  if (!element) {
    return document.body;
  }

  switch (element.nodeName) {
    case 'HTML':
    case 'BODY':
      return element.ownerDocument.body;
    case '#document':
      return element.body;
  }

  // Firefox want us to check `-x` and `-y` variations as well

  var _getStyleComputedProp = getStyleComputedProperty(element),
      overflow = _getStyleComputedProp.overflow,
      overflowX = _getStyleComputedProp.overflowX,
      overflowY = _getStyleComputedProp.overflowY;

  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
    return element;
  }

  return getScrollParent(getParentNode(element));
}

/**
 * Returns the reference node of the reference object, or the reference object itself.
 * @method
 * @memberof Popper.Utils
 * @param {Element|Object} reference - the reference element (the popper will be relative to this)
 * @returns {Element} parent
 */
function getReferenceNode(reference) {
  return reference && reference.referenceNode ? reference.referenceNode : reference;
}

var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);

/**
 * Determines if the browser is Internet Explorer
 * @method
 * @memberof Popper.Utils
 * @param {Number} version to check
 * @returns {Boolean} isIE
 */
function isIE(version) {
  if (version === 11) {
    return isIE11;
  }
  if (version === 10) {
    return isIE10;
  }
  return isIE11 || isIE10;
}

/**
 * Returns the offset parent of the given element
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @returns {Element} offset parent
 */
function getOffsetParent(element) {
  if (!element) {
    return document.documentElement;
  }

  var noOffsetParent = isIE(10) ? document.body : null;

  // NOTE: 1 DOM access here
  var offsetParent = element.offsetParent || null;
  // Skip hidden elements which don't have an offsetParent
  while (offsetParent === noOffsetParent && element.nextElementSibling) {
    offsetParent = (element = element.nextElementSibling).offsetParent;
  }

  var nodeName = offsetParent && offsetParent.nodeName;

  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
    return element ? element.ownerDocument.documentElement : document.documentElement;
  }

  // .offsetParent will return the closest TH, TD or TABLE in case
  // no offsetParent is present, I hate this job...
  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
    return getOffsetParent(offsetParent);
  }

  return offsetParent;
}

function isOffsetContainer(element) {
  var nodeName = element.nodeName;

  if (nodeName === 'BODY') {
    return false;
  }
  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
}

/**
 * Finds the root node (document, shadowDOM root) of the given element
 * @method
 * @memberof Popper.Utils
 * @argument {Element} node
 * @returns {Element} root node
 */
function getRoot(node) {
  if (node.parentNode !== null) {
    return getRoot(node.parentNode);
  }

  return node;
}

/**
 * Finds the offset parent common to the two provided nodes
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element1
 * @argument {Element} element2
 * @returns {Element} common offset parent
 */
function findCommonOffsetParent(element1, element2) {
  // This check is needed to avoid errors in case one of the elements isn't defined for any reason
  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
    return document.documentElement;
  }

  // Here we make sure to give as "start" the element that comes first in the DOM
  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
  var start = order ? element1 : element2;
  var end = order ? element2 : element1;

  // Get common ancestor container
  var range = document.createRange();
  range.setStart(start, 0);
  range.setEnd(end, 0);
  var commonAncestorContainer = range.commonAncestorContainer;

  // Both nodes are inside #document

  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
    if (isOffsetContainer(commonAncestorContainer)) {
      return commonAncestorContainer;
    }

    return getOffsetParent(commonAncestorContainer);
  }

  // one of the nodes is inside shadowDOM, find which one
  var element1root = getRoot(element1);
  if (element1root.host) {
    return findCommonOffsetParent(element1root.host, element2);
  } else {
    return findCommonOffsetParent(element1, getRoot(element2).host);
  }
}

/**
 * Gets the scroll value of the given element in the given side (top and left)
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @argument {String} side `top` or `left`
 * @returns {number} amount of scrolled pixels
 */
function getScroll(element) {
  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';

  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
  var nodeName = element.nodeName;

  if (nodeName === 'BODY' || nodeName === 'HTML') {
    var html = element.ownerDocument.documentElement;
    var scrollingElement = element.ownerDocument.scrollingElement || html;
    return scrollingElement[upperSide];
  }

  return element[upperSide];
}

/*
 * Sum or subtract the element scroll values (left and top) from a given rect object
 * @method
 * @memberof Popper.Utils
 * @param {Object} rect - Rect object you want to change
 * @param {HTMLElement} element - The element from the function reads the scroll values
 * @param {Boolean} subtract - set to true if you want to subtract the scroll values
 * @return {Object} rect - The modifier rect object
 */
function includeScroll(rect, element) {
  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

  var scrollTop = getScroll(element, 'top');
  var scrollLeft = getScroll(element, 'left');
  var modifier = subtract ? -1 : 1;
  rect.top += scrollTop * modifier;
  rect.bottom += scrollTop * modifier;
  rect.left += scrollLeft * modifier;
  rect.right += scrollLeft * modifier;
  return rect;
}

/*
 * Helper to detect borders of a given element
 * @method
 * @memberof Popper.Utils
 * @param {CSSStyleDeclaration} styles
 * Result of `getStyleComputedProperty` on the given element
 * @param {String} axis - `x` or `y`
 * @return {number} borders - The borders size of the given axis
 */

function getBordersSize(styles, axis) {
  var sideA = axis === 'x' ? 'Left' : 'Top';
  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';

  return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);
}

function getSize(axis, body, html, computedStyle) {
  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
}

function getWindowSizes(document) {
  var body = document.body;
  var html = document.documentElement;
  var computedStyle = isIE(10) && getComputedStyle(html);

  return {
    height: getSize('Height', body, html, computedStyle),
    width: getSize('Width', body, html, computedStyle)
  };
}

var classCallCheck = function (instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
};

var 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;
  };
}();





var defineProperty = function (obj, key, value) {
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }

  return obj;
};

var _extends = Object.assign || function (target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];

    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }

  return target;
};

/**
 * Given element offsets, generate an output similar to getBoundingClientRect
 * @method
 * @memberof Popper.Utils
 * @argument {Object} offsets
 * @returns {Object} ClientRect like output
 */
function getClientRect(offsets) {
  return _extends({}, offsets, {
    right: offsets.left + offsets.width,
    bottom: offsets.top + offsets.height
  });
}

/**
 * Get bounding client rect of given element
 * @method
 * @memberof Popper.Utils
 * @param {HTMLElement} element
 * @return {Object} client rect
 */
function getBoundingClientRect(element) {
  var rect = {};

  // IE10 10 FIX: Please, don't ask, the element isn't
  // considered in DOM in some circumstances...
  // This isn't reproducible in IE10 compatibility mode of IE11
  try {
    if (isIE(10)) {
      rect = element.getBoundingClientRect();
      var scrollTop = getScroll(element, 'top');
      var scrollLeft = getScroll(element, 'left');
      rect.top += scrollTop;
      rect.left += scrollLeft;
      rect.bottom += scrollTop;
      rect.right += scrollLeft;
    } else {
      rect = element.getBoundingClientRect();
    }
  } catch (e) {}

  var result = {
    left: rect.left,
    top: rect.top,
    width: rect.right - rect.left,
    height: rect.bottom - rect.top
  };

  // subtract scrollbar size from sizes
  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
  var width = sizes.width || element.clientWidth || result.width;
  var height = sizes.height || element.clientHeight || result.height;

  var horizScrollbar = element.offsetWidth - width;
  var vertScrollbar = element.offsetHeight - height;

  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
  // we make this check conditional for performance reasons
  if (horizScrollbar || vertScrollbar) {
    var styles = getStyleComputedProperty(element);
    horizScrollbar -= getBordersSize(styles, 'x');
    vertScrollbar -= getBordersSize(styles, 'y');

    result.width -= horizScrollbar;
    result.height -= vertScrollbar;
  }

  return getClientRect(result);
}

function getOffsetRectRelativeToArbitraryNode(children, parent) {
  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

  var isIE10 = isIE(10);
  var isHTML = parent.nodeName === 'HTML';
  var childrenRect = getBoundingClientRect(children);
  var parentRect = getBoundingClientRect(parent);
  var scrollParent = getScrollParent(children);

  var styles = getStyleComputedProperty(parent);
  var borderTopWidth = parseFloat(styles.borderTopWidth);
  var borderLeftWidth = parseFloat(styles.borderLeftWidth);

  // In cases where the parent is fixed, we must ignore negative scroll in offset calc
  if (fixedPosition && isHTML) {
    parentRect.top = Math.max(parentRect.top, 0);
    parentRect.left = Math.max(parentRect.left, 0);
  }
  var offsets = getClientRect({
    top: childrenRect.top - parentRect.top - borderTopWidth,
    left: childrenRect.left - parentRect.left - borderLeftWidth,
    width: childrenRect.width,
    height: childrenRect.height
  });
  offsets.marginTop = 0;
  offsets.marginLeft = 0;

  // Subtract margins of documentElement in case it's being used as parent
  // we do this only on HTML because it's the only element that behaves
  // differently when margins are applied to it. The margins are included in
  // the box of the documentElement, in the other cases not.
  if (!isIE10 && isHTML) {
    var marginTop = parseFloat(styles.marginTop);
    var marginLeft = parseFloat(styles.marginLeft);

    offsets.top -= borderTopWidth - marginTop;
    offsets.bottom -= borderTopWidth - marginTop;
    offsets.left -= borderLeftWidth - marginLeft;
    offsets.right -= borderLeftWidth - marginLeft;

    // Attach marginTop and marginLeft because in some circumstances we may need them
    offsets.marginTop = marginTop;
    offsets.marginLeft = marginLeft;
  }

  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
    offsets = includeScroll(offsets, parent);
  }

  return offsets;
}

function getViewportOffsetRectRelativeToArtbitraryNode(element) {
  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

  var html = element.ownerDocument.documentElement;
  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
  var width = Math.max(html.clientWidth, window.innerWidth || 0);
  var height = Math.max(html.clientHeight, window.innerHeight || 0);

  var scrollTop = !excludeScroll ? getScroll(html) : 0;
  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;

  var offset = {
    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
    width: width,
    height: height
  };

  return getClientRect(offset);
}

/**
 * Check if the given element is fixed or is inside a fixed parent
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @argument {Element} customContainer
 * @returns {Boolean} answer to "isFixed?"
 */
function isFixed(element) {
  var nodeName = element.nodeName;
  if (nodeName === 'BODY' || nodeName === 'HTML') {
    return false;
  }
  if (getStyleComputedProperty(element, 'position') === 'fixed') {
    return true;
  }
  var parentNode = getParentNode(element);
  if (!parentNode) {
    return false;
  }
  return isFixed(parentNode);
}

/**
 * Finds the first parent of an element that has a transformed property defined
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @returns {Element} first transformed parent or documentElement
 */

function getFixedPositionOffsetParent(element) {
  // This check is needed to avoid errors in case one of the elements isn't defined for any reason
  if (!element || !element.parentElement || isIE()) {
    return document.documentElement;
  }
  var el = element.parentElement;
  while (el && getStyleComputedProperty(el, 'transform') === 'none') {
    el = el.parentElement;
  }
  return el || document.documentElement;
}

/**
 * Computed the boundaries limits and return them
 * @method
 * @memberof Popper.Utils
 * @param {HTMLElement} popper
 * @param {HTMLElement} reference
 * @param {number} padding
 * @param {HTMLElement} boundariesElement - Element used to define the boundaries
 * @param {Boolean} fixedPosition - Is in fixed position mode
 * @returns {Object} Coordinates of the boundaries
 */
function getBoundaries(popper, reference, padding, boundariesElement) {
  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;

  // NOTE: 1 DOM access here

  var boundaries = { top: 0, left: 0 };
  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));

  // Handle viewport case
  if (boundariesElement === 'viewport') {
    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
  } else {
    // Handle other cases based on DOM element used as boundaries
    var boundariesNode = void 0;
    if (boundariesElement === 'scrollParent') {
      boundariesNode = getScrollParent(getParentNode(reference));
      if (boundariesNode.nodeName === 'BODY') {
        boundariesNode = popper.ownerDocument.documentElement;
      }
    } else if (boundariesElement === 'window') {
      boundariesNode = popper.ownerDocument.documentElement;
    } else {
      boundariesNode = boundariesElement;
    }

    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);

    // In case of HTML, we need a different computation
    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
      var _getWindowSizes = getWindowSizes(popper.ownerDocument),
          height = _getWindowSizes.height,
          width = _getWindowSizes.width;

      boundaries.top += offsets.top - offsets.marginTop;
      boundaries.bottom = height + offsets.top;
      boundaries.left += offsets.left - offsets.marginLeft;
      boundaries.right = width + offsets.left;
    } else {
      // for all the other DOM elements, this one is good
      boundaries = offsets;
    }
  }

  // Add paddings
  padding = padding || 0;
  var isPaddingNumber = typeof padding === 'number';
  boundaries.left += isPaddingNumber ? padding : padding.left || 0;
  boundaries.top += isPaddingNumber ? padding : padding.top || 0;
  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;

  return boundaries;
}

function getArea(_ref) {
  var width = _ref.width,
      height = _ref.height;

  return width * height;
}

/**
 * Utility used to transform the `auto` placement to the placement with more
 * available space.
 * @method
 * @memberof Popper.Utils
 * @argument {Object} data - The data object generated by update method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;

  if (placement.indexOf('auto') === -1) {
    return placement;
  }

  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);

  var rects = {
    top: {
      width: boundaries.width,
      height: refRect.top - boundaries.top
    },
    right: {
      width: boundaries.right - refRect.right,
      height: boundaries.height
    },
    bottom: {
      width: boundaries.width,
      height: boundaries.bottom - refRect.bottom
    },
    left: {
      width: refRect.left - boundaries.left,
      height: boundaries.height
    }
  };

  var sortedAreas = Object.keys(rects).map(function (key) {
    return _extends({
      key: key
    }, rects[key], {
      area: getArea(rects[key])
    });
  }).sort(function (a, b) {
    return b.area - a.area;
  });

  var filteredAreas = sortedAreas.filter(function (_ref2) {
    var width = _ref2.width,
        height = _ref2.height;
    return width >= popper.clientWidth && height >= popper.clientHeight;
  });

  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;

  var variation = placement.split('-')[1];

  return computedPlacement + (variation ? '-' + variation : '');
}

/**
 * Get offsets to the reference element
 * @method
 * @memberof Popper.Utils
 * @param {Object} state
 * @param {Element} popper - the popper element
 * @param {Element} reference - the reference element (the popper will be relative to this)
 * @param {Element} fixedPosition - is in fixed position mode
 * @returns {Object} An object containing the offsets which will be applied to the popper
 */
function getReferenceOffsets(state, popper, reference) {
  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;

  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
}

/**
 * Get the outer sizes of the given element (offset size + margins)
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element
 * @returns {Object} object containing width and height properties
 */
function getOuterSizes(element) {
  var window = element.ownerDocument.defaultView;
  var styles = window.getComputedStyle(element);
  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
  var result = {
    width: element.offsetWidth + y,
    height: element.offsetHeight + x
  };
  return result;
}

/**
 * Get the opposite placement of the given one
 * @method
 * @memberof Popper.Utils
 * @argument {String} placement
 * @returns {String} flipped placement
 */
function getOppositePlacement(placement) {
  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
  return placement.replace(/left|right|bottom|top/g, function (matched) {
    return hash[matched];
  });
}

/**
 * Get offsets to the popper
 * @method
 * @memberof Popper.Utils
 * @param {Object} position - CSS position the Popper will get applied
 * @param {HTMLElement} popper - the popper element
 * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
 * @param {String} placement - one of the valid placement options
 * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
 */
function getPopperOffsets(popper, referenceOffsets, placement) {
  placement = placement.split('-')[0];

  // Get popper node sizes
  var popperRect = getOuterSizes(popper);

  // Add position, width and height to our offsets object
  var popperOffsets = {
    width: popperRect.width,
    height: popperRect.height
  };

  // depending by the popper placement we have to compute its offsets slightly differently
  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
  var mainSide = isHoriz ? 'top' : 'left';
  var secondarySide = isHoriz ? 'left' : 'top';
  var measurement = isHoriz ? 'height' : 'width';
  var secondaryMeasurement = !isHoriz ? 'height' : 'width';

  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
  if (placement === secondarySide) {
    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
  } else {
    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
  }

  return popperOffsets;
}

/**
 * Mimics the `find` method of Array
 * @method
 * @memberof Popper.Utils
 * @argument {Array} arr
 * @argument prop
 * @argument value
 * @returns index or -1
 */
function find(arr, check) {
  // use native find if supported
  if (Array.prototype.find) {
    return arr.find(check);
  }

  // use `filter` to obtain the same behavior of `find`
  return arr.filter(check)[0];
}

/**
 * Return the index of the matching object
 * @method
 * @memberof Popper.Utils
 * @argument {Array} arr
 * @argument prop
 * @argument value
 * @returns index or -1
 */
function findIndex(arr, prop, value) {
  // use native findIndex if supported
  if (Array.prototype.findIndex) {
    return arr.findIndex(function (cur) {
      return cur[prop] === value;
    });
  }

  // use `find` + `indexOf` if `findIndex` isn't supported
  var match = find(arr, function (obj) {
    return obj[prop] === value;
  });
  return arr.indexOf(match);
}

/**
 * Loop trough the list of modifiers and run them in order,
 * each of them will then edit the data object.
 * @method
 * @memberof Popper.Utils
 * @param {dataObject} data
 * @param {Array} modifiers
 * @param {String} ends - Optional modifier name used as stopper
 * @returns {dataObject}
 */
function runModifiers(modifiers, data, ends) {
  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));

  modifiersToRun.forEach(function (modifier) {
    if (modifier['function']) {
      // eslint-disable-line dot-notation
      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
    }
    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation
    if (modifier.enabled && isFunction(fn)) {
      // Add properties to offsets to make them a complete clientRect object
      // we do this before each modifier to make sure the previous one doesn't
      // mess with these values
      data.offsets.popper = getClientRect(data.offsets.popper);
      data.offsets.reference = getClientRect(data.offsets.reference);

      data = fn(data, modifier);
    }
  });

  return data;
}

/**
 * Updates the position of the popper, computing the new offsets and applying
 * the new style.<br />
 * Prefer `scheduleUpdate` over `update` because of performance reasons.
 * @method
 * @memberof Popper
 */
function update() {
  // if popper is destroyed, don't perform any further update
  if (this.state.isDestroyed) {
    return;
  }

  var data = {
    instance: this,
    styles: {},
    arrowStyles: {},
    attributes: {},
    flipped: false,
    offsets: {}
  };

  // compute reference element offsets
  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);

  // compute auto placement, store placement inside the data object,
  // modifiers will be able to edit `placement` if needed
  // and refer to originalPlacement to know the original value
  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);

  // store the computed placement inside `originalPlacement`
  data.originalPlacement = data.placement;

  data.positionFixed = this.options.positionFixed;

  // compute the popper offsets
  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);

  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';

  // run the modifiers
  data = runModifiers(this.modifiers, data);

  // the first `update` will call `onCreate` callback
  // the other ones will call `onUpdate` callback
  if (!this.state.isCreated) {
    this.state.isCreated = true;
    this.options.onCreate(data);
  } else {
    this.options.onUpdate(data);
  }
}

/**
 * Helper used to know if the given modifier is enabled.
 * @method
 * @memberof Popper.Utils
 * @returns {Boolean}
 */
function isModifierEnabled(modifiers, modifierName) {
  return modifiers.some(function (_ref) {
    var name = _ref.name,
        enabled = _ref.enabled;
    return enabled && name === modifierName;
  });
}

/**
 * Get the prefixed supported property name
 * @method
 * @memberof Popper.Utils
 * @argument {String} property (camelCase)
 * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)
 */
function getSupportedPropertyName(property) {
  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];
  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);

  for (var i = 0; i < prefixes.length; i++) {
    var prefix = prefixes[i];
    var toCheck = prefix ? '' + prefix + upperProp : property;
    if (typeof document.body.style[toCheck] !== 'undefined') {
      return toCheck;
    }
  }
  return null;
}

/**
 * Destroys the popper.
 * @method
 * @memberof Popper
 */
function destroy() {
  this.state.isDestroyed = true;

  // touch DOM only if `applyStyle` modifier is enabled
  if (isModifierEnabled(this.modifiers, 'applyStyle')) {
    this.popper.removeAttribute('x-placement');
    this.popper.style.position = '';
    this.popper.style.top = '';
    this.popper.style.left = '';
    this.popper.style.right = '';
    this.popper.style.bottom = '';
    this.popper.style.willChange = '';
    this.popper.style[getSupportedPropertyName('transform')] = '';
  }

  this.disableEventListeners();

  // remove the popper if user explicitly asked for the deletion on destroy
  // do not use `remove` because IE11 doesn't support it
  if (this.options.removeOnDestroy) {
    this.popper.parentNode.removeChild(this.popper);
  }
  return this;
}

/**
 * Get the window associated with the element
 * @argument {Element} element
 * @returns {Window}
 */
function getWindow(element) {
  var ownerDocument = element.ownerDocument;
  return ownerDocument ? ownerDocument.defaultView : window;
}

function attachToScrollParents(scrollParent, event, callback, scrollParents) {
  var isBody = scrollParent.nodeName === 'BODY';
  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;
  target.addEventListener(event, callback, { passive: true });

  if (!isBody) {
    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);
  }
  scrollParents.push(target);
}

/**
 * Setup needed event listeners used to update the popper position
 * @method
 * @memberof Popper.Utils
 * @private
 */
function setupEventListeners(reference, options, state, updateBound) {
  // Resize event listener on window
  state.updateBound = updateBound;
  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });

  // Scroll event listener on scroll parents
  var scrollElement = getScrollParent(reference);
  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);
  state.scrollElement = scrollElement;
  state.eventsEnabled = true;

  return state;
}

/**
 * It will add resize/scroll events and start recalculating
 * position of the popper element when they are triggered.
 * @method
 * @memberof Popper
 */
function enableEventListeners() {
  if (!this.state.eventsEnabled) {
    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);
  }
}

/**
 * Remove event listeners used to update the popper position
 * @method
 * @memberof Popper.Utils
 * @private
 */
function removeEventListeners(reference, state) {
  // Remove resize event listener on window
  getWindow(reference).removeEventListener('resize', state.updateBound);

  // Remove scroll event listener on scroll parents
  state.scrollParents.forEach(function (target) {
    target.removeEventListener('scroll', state.updateBound);
  });

  // Reset state
  state.updateBound = null;
  state.scrollParents = [];
  state.scrollElement = null;
  state.eventsEnabled = false;
  return state;
}

/**
 * It will remove resize/scroll events and won't recalculate popper position
 * when they are triggered. It also won't trigger `onUpdate` callback anymore,
 * unless you call `update` method manually.
 * @method
 * @memberof Popper
 */
function disableEventListeners() {
  if (this.state.eventsEnabled) {
    cancelAnimationFrame(this.scheduleUpdate);
    this.state = removeEventListeners(this.reference, this.state);
  }
}

/**
 * Tells if a given input is a number
 * @method
 * @memberof Popper.Utils
 * @param {*} input to check
 * @return {Boolean}
 */
function isNumeric(n) {
  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
}

/**
 * Set the style to the given popper
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element - Element to apply the style to
 * @argument {Object} styles
 * Object with a list of properties and values which will be applied to the element
 */
function setStyles(element, styles) {
  Object.keys(styles).forEach(function (prop) {
    var unit = '';
    // add unit if the value is numeric and is one of the following
    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {
      unit = 'px';
    }
    element.style[prop] = styles[prop] + unit;
  });
}

/**
 * Set the attributes to the given popper
 * @method
 * @memberof Popper.Utils
 * @argument {Element} element - Element to apply the attributes to
 * @argument {Object} styles
 * Object with a list of properties and values which will be applied to the element
 */
function setAttributes(element, attributes) {
  Object.keys(attributes).forEach(function (prop) {
    var value = attributes[prop];
    if (value !== false) {
      element.setAttribute(prop, attributes[prop]);
    } else {
      element.removeAttribute(prop);
    }
  });
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by `update` method
 * @argument {Object} data.styles - List of style properties - values to apply to popper element
 * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The same data object
 */
function applyStyle(data) {
  // any property present in `data.styles` will be applied to the popper,
  // in this way we can make the 3rd party modifiers add custom styles to it
  // Be aware, modifiers could override the properties defined in the previous
  // lines of this modifier!
  setStyles(data.instance.popper, data.styles);

  // any property present in `data.attributes` will be applied to the popper,
  // they will be set as HTML attributes of the element
  setAttributes(data.instance.popper, data.attributes);

  // if arrowElement is defined and arrowStyles has some properties
  if (data.arrowElement && Object.keys(data.arrowStyles).length) {
    setStyles(data.arrowElement, data.arrowStyles);
  }

  return data;
}

/**
 * Set the x-placement attribute before everything else because it could be used
 * to add margins to the popper margins needs to be calculated to get the
 * correct popper offsets.
 * @method
 * @memberof Popper.modifiers
 * @param {HTMLElement} reference - The reference element used to position the popper
 * @param {HTMLElement} popper - The HTML element used as popper
 * @param {Object} options - Popper.js options
 */
function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {
  // compute reference element offsets
  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);

  // compute auto placement, store placement inside the data object,
  // modifiers will be able to edit `placement` if needed
  // and refer to originalPlacement to know the original value
  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);

  popper.setAttribute('x-placement', placement);

  // Apply `position` to popper before anything else because
  // without the position applied we can't guarantee correct computations
  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });

  return options;
}

/**
 * @function
 * @memberof Popper.Utils
 * @argument {Object} data - The data object generated by `update` method
 * @argument {Boolean} shouldRound - If the offsets should be rounded at all
 * @returns {Object} The popper's position offsets rounded
 *
 * The tale of pixel-perfect positioning. It's still not 100% perfect, but as
 * good as it can be within reason.
 * Discussion here: https://github.com/FezVrasta/popper.js/pull/715
 *
 * Low DPI screens cause a popper to be blurry if not using full pixels (Safari
 * as well on High DPI screens).
 *
 * Firefox prefers no rounding for positioning and does not have blurriness on
 * high DPI screens.
 *
 * Only horizontal placement and left/right values need to be considered.
 */
function getRoundedOffsets(data, shouldRound) {
  var _data$offsets = data.offsets,
      popper = _data$offsets.popper,
      reference = _data$offsets.reference;
  var round = Math.round,
      floor = Math.floor;

  var noRound = function noRound(v) {
    return v;
  };

  var referenceWidth = round(reference.width);
  var popperWidth = round(popper.width);

  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;
  var isVariation = data.placement.indexOf('-') !== -1;
  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;
  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;

  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;
  var verticalToInteger = !shouldRound ? noRound : round;

  return {
    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),
    top: verticalToInteger(popper.top),
    bottom: verticalToInteger(popper.bottom),
    right: horizontalToInteger(popper.right)
  };
}

var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by `update` method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function computeStyle(data, options) {
  var x = options.x,
      y = options.y;
  var popper = data.offsets.popper;

  // Remove this legacy support in Popper.js v2

  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {
    return modifier.name === 'applyStyle';
  }).gpuAcceleration;
  if (legacyGpuAccelerationOption !== undefined) {
    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
  }
  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;

  var offsetParent = getOffsetParent(data.instance.popper);
  var offsetParentRect = getBoundingClientRect(offsetParent);

  // Styles
  var styles = {
    position: popper.position
  };

  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);

  var sideA = x === 'bottom' ? 'top' : 'bottom';
  var sideB = y === 'right' ? 'left' : 'right';

  // if gpuAcceleration is set to `true` and transform is supported,
  //  we use `translate3d` to apply the position to the popper we
  // automatically use the supported prefixed version if needed
  var prefixedProperty = getSupportedPropertyName('transform');

  // now, let's make a step back and look at this code closely (wtf?)
  // If the content of the popper grows once it's been positioned, it
  // may happen that the popper gets misplaced because of the new content
  // overflowing its reference element
  // To avoid this problem, we provide two options (x and y), which allow
  // the consumer to define the offset origin.
  // If we position a popper on top of a reference element, we can set
  // `x` to `top` to make the popper grow towards its top instead of
  // its bottom.
  var left = void 0,
      top = void 0;
  if (sideA === 'bottom') {
    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
    // and not the bottom of the html element
    if (offsetParent.nodeName === 'HTML') {
      top = -offsetParent.clientHeight + offsets.bottom;
    } else {
      top = -offsetParentRect.height + offsets.bottom;
    }
  } else {
    top = offsets.top;
  }
  if (sideB === 'right') {
    if (offsetParent.nodeName === 'HTML') {
      left = -offsetParent.clientWidth + offsets.right;
    } else {
      left = -offsetParentRect.width + offsets.right;
    }
  } else {
    left = offsets.left;
  }
  if (gpuAcceleration && prefixedProperty) {
    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';
    styles[sideA] = 0;
    styles[sideB] = 0;
    styles.willChange = 'transform';
  } else {
    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
    var invertTop = sideA === 'bottom' ? -1 : 1;
    var invertLeft = sideB === 'right' ? -1 : 1;
    styles[sideA] = top * invertTop;
    styles[sideB] = left * invertLeft;
    styles.willChange = sideA + ', ' + sideB;
  }

  // Attributes
  var attributes = {
    'x-placement': data.placement
  };

  // Update `data` attributes, styles and arrowStyles
  data.attributes = _extends({}, attributes, data.attributes);
  data.styles = _extends({}, styles, data.styles);
  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);

  return data;
}

/**
 * Helper used to know if the given modifier depends from another one.<br />
 * It checks if the needed modifier is listed and enabled.
 * @method
 * @memberof Popper.Utils
 * @param {Array} modifiers - list of modifiers
 * @param {String} requestingName - name of requesting modifier
 * @param {String} requestedName - name of requested modifier
 * @returns {Boolean}
 */
function isModifierRequired(modifiers, requestingName, requestedName) {
  var requesting = find(modifiers, function (_ref) {
    var name = _ref.name;
    return name === requestingName;
  });

  var isRequired = !!requesting && modifiers.some(function (modifier) {
    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;
  });

  if (!isRequired) {
    var _requesting = '`' + requestingName + '`';
    var requested = '`' + requestedName + '`';
    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');
  }
  return isRequired;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by update method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function arrow(data, options) {
  var _data$offsets$arrow;

  // arrow depends on keepTogether in order to work
  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {
    return data;
  }

  var arrowElement = options.element;

  // if arrowElement is a string, suppose it's a CSS selector
  if (typeof arrowElement === 'string') {
    arrowElement = data.instance.popper.querySelector(arrowElement);

    // if arrowElement is not found, don't run the modifier
    if (!arrowElement) {
      return data;
    }
  } else {
    // if the arrowElement isn't a query selector we must check that the
    // provided DOM node is child of its popper node
    if (!data.instance.popper.contains(arrowElement)) {
      console.warn('WARNING: `arrow.element` must be child of its popper element!');
      return data;
    }
  }

  var placement = data.placement.split('-')[0];
  var _data$offsets = data.offsets,
      popper = _data$offsets.popper,
      reference = _data$offsets.reference;

  var isVertical = ['left', 'right'].indexOf(placement) !== -1;

  var len = isVertical ? 'height' : 'width';
  var sideCapitalized = isVertical ? 'Top' : 'Left';
  var side = sideCapitalized.toLowerCase();
  var altSide = isVertical ? 'left' : 'top';
  var opSide = isVertical ? 'bottom' : 'right';
  var arrowElementSize = getOuterSizes(arrowElement)[len];

  //
  // extends keepTogether behavior making sure the popper and its
  // reference have enough pixels in conjunction
  //

  // top/left side
  if (reference[opSide] - arrowElementSize < popper[side]) {
    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);
  }
  // bottom/right side
  if (reference[side] + arrowElementSize > popper[opSide]) {
    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];
  }
  data.offsets.popper = getClientRect(data.offsets.popper);

  // compute center of the popper
  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;

  // Compute the sideValue using the updated popper offsets
  // take popper margin in account because we don't have this info available
  var css = getStyleComputedProperty(data.instance.popper);
  var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);
  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);
  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;

  // prevent arrowElement from being placed not contiguously to its popper
  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);

  data.arrowElement = arrowElement;
  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);

  return data;
}

/**
 * Get the opposite placement variation of the given one
 * @method
 * @memberof Popper.Utils
 * @argument {String} placement variation
 * @returns {String} flipped placement variation
 */
function getOppositeVariation(variation) {
  if (variation === 'end') {
    return 'start';
  } else if (variation === 'start') {
    return 'end';
  }
  return variation;
}

/**
 * List of accepted placements to use as values of the `placement` option.<br />
 * Valid placements are:
 * - `auto`
 * - `top`
 * - `right`
 * - `bottom`
 * - `left`
 *
 * Each placement can have a variation from this list:
 * - `-start`
 * - `-end`
 *
 * Variations are interpreted easily if you think of them as the left to right
 * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`
 * is right.<br />
 * Vertically (`left` and `right`), `start` is top and `end` is bottom.
 *
 * Some valid examples are:
 * - `top-end` (on top of reference, right aligned)
 * - `right-start` (on right of reference, top aligned)
 * - `bottom` (on bottom, centered)
 * - `auto-end` (on the side with more space available, alignment depends by placement)
 *
 * @static
 * @type {Array}
 * @enum {String}
 * @readonly
 * @method placements
 * @memberof Popper
 */
var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];

// Get rid of `auto` `auto-start` and `auto-end`
var validPlacements = placements.slice(3);

/**
 * Given an initial placement, returns all the subsequent placements
 * clockwise (or counter-clockwise).
 *
 * @method
 * @memberof Popper.Utils
 * @argument {String} placement - A valid placement (it accepts variations)
 * @argument {Boolean} counter - Set to true to walk the placements counterclockwise
 * @returns {Array} placements including their variations
 */
function clockwise(placement) {
  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

  var index = validPlacements.indexOf(placement);
  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));
  return counter ? arr.reverse() : arr;
}

var BEHAVIORS = {
  FLIP: 'flip',
  CLOCKWISE: 'clockwise',
  COUNTERCLOCKWISE: 'counterclockwise'
};

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by update method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function flip(data, options) {
  // if `inner` modifier is enabled, we can't use the `flip` modifier
  if (isModifierEnabled(data.instance.modifiers, 'inner')) {
    return data;
  }

  if (data.flipped && data.placement === data.originalPlacement) {
    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
    return data;
  }

  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);

  var placement = data.placement.split('-')[0];
  var placementOpposite = getOppositePlacement(placement);
  var variation = data.placement.split('-')[1] || '';

  var flipOrder = [];

  switch (options.behavior) {
    case BEHAVIORS.FLIP:
      flipOrder = [placement, placementOpposite];
      break;
    case BEHAVIORS.CLOCKWISE:
      flipOrder = clockwise(placement);
      break;
    case BEHAVIORS.COUNTERCLOCKWISE:
      flipOrder = clockwise(placement, true);
      break;
    default:
      flipOrder = options.behavior;
  }

  flipOrder.forEach(function (step, index) {
    if (placement !== step || flipOrder.length === index + 1) {
      return data;
    }

    placement = data.placement.split('-')[0];
    placementOpposite = getOppositePlacement(placement);

    var popperOffsets = data.offsets.popper;
    var refOffsets = data.offsets.reference;

    // using floor because the reference offsets may contain decimals we are not going to consider here
    var floor = Math.floor;
    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);

    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);
    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);
    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);
    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);

    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;

    // flip the variation if required
    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;

    // flips variation if reference element overflows boundaries
    var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);

    // flips variation if popper content overflows boundaries
    var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);

    var flippedVariation = flippedVariationByRef || flippedVariationByContent;

    if (overlapsRef || overflowsBoundaries || flippedVariation) {
      // this boolean to detect any flip loop
      data.flipped = true;

      if (overlapsRef || overflowsBoundaries) {
        placement = flipOrder[index + 1];
      }

      if (flippedVariation) {
        variation = getOppositeVariation(variation);
      }

      data.placement = placement + (variation ? '-' + variation : '');

      // this object contains `position`, we want to preserve it along with
      // any additional property we may add in the future
      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));

      data = runModifiers(data.instance.modifiers, data, 'flip');
    }
  });
  return data;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by update method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function keepTogether(data) {
  var _data$offsets = data.offsets,
      popper = _data$offsets.popper,
      reference = _data$offsets.reference;

  var placement = data.placement.split('-')[0];
  var floor = Math.floor;
  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
  var side = isVertical ? 'right' : 'bottom';
  var opSide = isVertical ? 'left' : 'top';
  var measurement = isVertical ? 'width' : 'height';

  if (popper[side] < floor(reference[opSide])) {
    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
  }
  if (popper[opSide] > floor(reference[side])) {
    data.offsets.popper[opSide] = floor(reference[side]);
  }

  return data;
}

/**
 * Converts a string containing value + unit into a px value number
 * @function
 * @memberof {modifiers~offset}
 * @private
 * @argument {String} str - Value + unit string
 * @argument {String} measurement - `height` or `width`
 * @argument {Object} popperOffsets
 * @argument {Object} referenceOffsets
 * @returns {Number|String}
 * Value in pixels, or original string if no values were extracted
 */
function toValue(str, measurement, popperOffsets, referenceOffsets) {
  // separate value from unit
  var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);
  var value = +split[1];
  var unit = split[2];

  // If it's not a number it's an operator, I guess
  if (!value) {
    return str;
  }

  if (unit.indexOf('%') === 0) {
    var element = void 0;
    switch (unit) {
      case '%p':
        element = popperOffsets;
        break;
      case '%':
      case '%r':
      default:
        element = referenceOffsets;
    }

    var rect = getClientRect(element);
    return rect[measurement] / 100 * value;
  } else if (unit === 'vh' || unit === 'vw') {
    // if is a vh or vw, we calculate the size based on the viewport
    var size = void 0;
    if (unit === 'vh') {
      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
    } else {
      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
    }
    return size / 100 * value;
  } else {
    // if is an explicit pixel unit, we get rid of the unit and keep the value
    // if is an implicit unit, it's px, and we return just the value
    return value;
  }
}

/**
 * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.
 * @function
 * @memberof {modifiers~offset}
 * @private
 * @argument {String} offset
 * @argument {Object} popperOffsets
 * @argument {Object} referenceOffsets
 * @argument {String} basePlacement
 * @returns {Array} a two cells array with x and y offsets in numbers
 */
function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {
  var offsets = [0, 0];

  // Use height if placement is left or right and index is 0 otherwise use width
  // in this way the first offset will use an axis and the second one
  // will use the other one
  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;

  // Split the offset string to obtain a list of values and operands
  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)
  var fragments = offset.split(/(\+|\-)/).map(function (frag) {
    return frag.trim();
  });

  // Detect if the offset string contains a pair of values or a single one
  // they could be separated by comma or space
  var divider = fragments.indexOf(find(fragments, function (frag) {
    return frag.search(/,|\s/) !== -1;
  }));

  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {
    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
  }

  // If divider is found, we divide the list of values and operands to divide
  // them by ofset X and Y.
  var splitRegex = /\s*,\s*|\s+/;
  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];

  // Convert the values with units to absolute pixels to allow our computations
  ops = ops.map(function (op, index) {
    // Most of the units rely on the orientation of the popper
    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';
    var mergeWithPrevious = false;
    return op
    // This aggregates any `+` or `-` sign that aren't considered operators
    // e.g.: 10 + +5 => [10, +, +5]
    .reduce(function (a, b) {
      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {
        a[a.length - 1] = b;
        mergeWithPrevious = true;
        return a;
      } else if (mergeWithPrevious) {
        a[a.length - 1] += b;
        mergeWithPrevious = false;
        return a;
      } else {
        return a.concat(b);
      }
    }, [])
    // Here we convert the string values into number values (in px)
    .map(function (str) {
      return toValue(str, measurement, popperOffsets, referenceOffsets);
    });
  });

  // Loop trough the offsets arrays and execute the operations
  ops.forEach(function (op, index) {
    op.forEach(function (frag, index2) {
      if (isNumeric(frag)) {
        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);
      }
    });
  });
  return offsets;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by update method
 * @argument {Object} options - Modifiers configuration and options
 * @argument {Number|String} options.offset=0
 * The offset value as described in the modifier description
 * @returns {Object} The data object, properly modified
 */
function offset(data, _ref) {
  var offset = _ref.offset;
  var placement = data.placement,
      _data$offsets = data.offsets,
      popper = _data$offsets.popper,
      reference = _data$offsets.reference;

  var basePlacement = placement.split('-')[0];

  var offsets = void 0;
  if (isNumeric(+offset)) {
    offsets = [+offset, 0];
  } else {
    offsets = parseOffset(offset, popper, reference, basePlacement);
  }

  if (basePlacement === 'left') {
    popper.top += offsets[0];
    popper.left -= offsets[1];
  } else if (basePlacement === 'right') {
    popper.top += offsets[0];
    popper.left += offsets[1];
  } else if (basePlacement === 'top') {
    popper.left += offsets[0];
    popper.top -= offsets[1];
  } else if (basePlacement === 'bottom') {
    popper.left += offsets[0];
    popper.top += offsets[1];
  }

  data.popper = popper;
  return data;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by `update` method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function preventOverflow(data, options) {
  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);

  // If offsetParent is the reference element, we really want to
  // go one step up and use the next offsetParent as reference to
  // avoid to make this modifier completely useless and look like broken
  if (data.instance.reference === boundariesElement) {
    boundariesElement = getOffsetParent(boundariesElement);
  }

  // NOTE: DOM access here
  // resets the popper's position so that the document size can be calculated excluding
  // the size of the popper element itself
  var transformProp = getSupportedPropertyName('transform');
  var popperStyles = data.instance.popper.style; // assignment to help minification
  var top = popperStyles.top,
      left = popperStyles.left,
      transform = popperStyles[transformProp];

  popperStyles.top = '';
  popperStyles.left = '';
  popperStyles[transformProp] = '';

  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);

  // NOTE: DOM access here
  // restores the original style properties after the offsets have been computed
  popperStyles.top = top;
  popperStyles.left = left;
  popperStyles[transformProp] = transform;

  options.boundaries = boundaries;

  var order = options.priority;
  var popper = data.offsets.popper;

  var check = {
    primary: function primary(placement) {
      var value = popper[placement];
      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {
        value = Math.max(popper[placement], boundaries[placement]);
      }
      return defineProperty({}, placement, value);
    },
    secondary: function secondary(placement) {
      var mainSide = placement === 'right' ? 'left' : 'top';
      var value = popper[mainSide];
      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {
        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));
      }
      return defineProperty({}, mainSide, value);
    }
  };

  order.forEach(function (placement) {
    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';
    popper = _extends({}, popper, check[side](placement));
  });

  data.offsets.popper = popper;

  return data;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by `update` method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function shift(data) {
  var placement = data.placement;
  var basePlacement = placement.split('-')[0];
  var shiftvariation = placement.split('-')[1];

  // if shift shiftvariation is specified, run the modifier
  if (shiftvariation) {
    var _data$offsets = data.offsets,
        reference = _data$offsets.reference,
        popper = _data$offsets.popper;

    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
    var side = isVertical ? 'left' : 'top';
    var measurement = isVertical ? 'width' : 'height';

    var shiftOffsets = {
      start: defineProperty({}, side, reference[side]),
      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])
    };

    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);
  }

  return data;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by update method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function hide(data) {
  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {
    return data;
  }

  var refRect = data.offsets.reference;
  var bound = find(data.instance.modifiers, function (modifier) {
    return modifier.name === 'preventOverflow';
  }).boundaries;

  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {
    // Avoid unnecessary DOM access if visibility hasn't changed
    if (data.hide === true) {
      return data;
    }

    data.hide = true;
    data.attributes['x-out-of-boundaries'] = '';
  } else {
    // Avoid unnecessary DOM access if visibility hasn't changed
    if (data.hide === false) {
      return data;
    }

    data.hide = false;
    data.attributes['x-out-of-boundaries'] = false;
  }

  return data;
}

/**
 * @function
 * @memberof Modifiers
 * @argument {Object} data - The data object generated by `update` method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {Object} The data object, properly modified
 */
function inner(data) {
  var placement = data.placement;
  var basePlacement = placement.split('-')[0];
  var _data$offsets = data.offsets,
      popper = _data$offsets.popper,
      reference = _data$offsets.reference;

  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;

  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;

  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);

  data.placement = getOppositePlacement(placement);
  data.offsets.popper = getClientRect(popper);

  return data;
}

/**
 * Modifier function, each modifier can have a function of this type assigned
 * to its `fn` property.<br />
 * These functions will be called on each update, this means that you must
 * make sure they are performant enough to avoid performance bottlenecks.
 *
 * @function ModifierFn
 * @argument {dataObject} data - The data object generated by `update` method
 * @argument {Object} options - Modifiers configuration and options
 * @returns {dataObject} The data object, properly modified
 */

/**
 * Modifiers are plugins used to alter the behavior of your poppers.<br />
 * Popper.js uses a set of 9 modifiers to provide all the basic functionalities
 * needed by the library.
 *
 * Usually you don't want to override the `order`, `fn` and `onLoad` props.
 * All the other properties are configurations that could be tweaked.
 * @namespace modifiers
 */
var modifiers = {
  /**
   * Modifier used to shift the popper on the start or end of its reference
   * element.<br />
   * It will read the variation of the `placement` property.<br />
   * It can be one either `-end` or `-start`.
   * @memberof modifiers
   * @inner
   */
  shift: {
    /** @prop {number} order=100 - Index used to define the order of execution */
    order: 100,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: shift
  },

  /**
   * The `offset` modifier can shift your popper on both its axis.
   *
   * It accepts the following units:
   * - `px` or unit-less, interpreted as pixels
   * - `%` or `%r`, percentage relative to the length of the reference element
   * - `%p`, percentage relative to the length of the popper element
   * - `vw`, CSS viewport width unit
   * - `vh`, CSS viewport height unit
   *
   * For length is intended the main axis relative to the placement of the popper.<br />
   * This means that if the placement is `top` or `bottom`, the length will be the
   * `width`. In case of `left` or `right`, it will be the `height`.
   *
   * You can provide a single value (as `Number` or `String`), or a pair of values
   * as `String` divided by a comma or one (or more) white spaces.<br />
   * The latter is a deprecated method because it leads to confusion and will be
   * removed in v2.<br />
   * Additionally, it accepts additions and subtractions between different units.
   * Note that multiplications and divisions aren't supported.
   *
   * Valid examples are:
   * ```
   * 10
   * '10%'
   * '10, 10'
   * '10%, 10'
   * '10 + 10%'
   * '10 - 5vh + 3%'
   * '-10px + 5vh, 5px - 6%'
   * ```
   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
   *
   * @memberof modifiers
   * @inner
   */
  offset: {
    /** @prop {number} order=200 - Index used to define the order of execution */
    order: 200,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: offset,
    /** @prop {Number|String} offset=0
     * The offset value as described in the modifier description
     */
    offset: 0
  },

  /**
   * Modifier used to prevent the popper from being positioned outside the boundary.
   *
   * A scenario exists where the reference itself is not within the boundaries.<br />
   * We can say it has "escaped the boundaries" — or just "escaped".<br />
   * In this case we need to decide whether the popper should either:
   *
   * - detach from the reference and remain "trapped" in the boundaries, or
   * - if it should ignore the boundary and "escape with its reference"
   *
   * When `escapeWithReference` is set to`true` and reference is completely
   * outside its boundaries, the popper will overflow (or completely leave)
   * the boundaries in order to remain attached to the edge of the reference.
   *
   * @memberof modifiers
   * @inner
   */
  preventOverflow: {
    /** @prop {number} order=300 - Index used to define the order of execution */
    order: 300,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: preventOverflow,
    /**
     * @prop {Array} [priority=['left','right','top','bottom']]
     * Popper will try to prevent overflow following these priorities by default,
     * then, it could overflow on the left and on top of the `boundariesElement`
     */
    priority: ['left', 'right', 'top', 'bottom'],
    /**
     * @prop {number} padding=5
     * Amount of pixel used to define a minimum distance between the boundaries
     * and the popper. This makes sure the popper always has a little padding
     * between the edges of its container
     */
    padding: 5,
    /**
     * @prop {String|HTMLElement} boundariesElement='scrollParent'
     * Boundaries used by the modifier. Can be `scrollParent`, `window`,
     * `viewport` or any DOM element.
     */
    boundariesElement: 'scrollParent'
  },

  /**
   * Modifier used to make sure the reference and its popper stay near each other
   * without leaving any gap between the two. Especially useful when the arrow is
   * enabled and you want to ensure that it points to its reference element.
   * It cares only about the first axis. You can still have poppers with margin
   * between the popper and its reference element.
   * @memberof modifiers
   * @inner
   */
  keepTogether: {
    /** @prop {number} order=400 - Index used to define the order of execution */
    order: 400,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: keepTogether
  },

  /**
   * This modifier is used to move the `arrowElement` of the popper to make
   * sure it is positioned between the reference element and its popper element.
   * It will read the outer size of the `arrowElement` node to detect how many
   * pixels of conjunction are needed.
   *
   * It has no effect if no `arrowElement` is provided.
   * @memberof modifiers
   * @inner
   */
  arrow: {
    /** @prop {number} order=500 - Index used to define the order of execution */
    order: 500,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: arrow,
    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
    element: '[x-arrow]'
  },

  /**
   * Modifier used to flip the popper's placement when it starts to overlap its
   * reference element.
   *
   * Requires the `preventOverflow` modifier before it in order to work.
   *
   * **NOTE:** this modifier will interrupt the current update cycle and will
   * restart it if it detects the need to flip the placement.
   * @memberof modifiers
   * @inner
   */
  flip: {
    /** @prop {number} order=600 - Index used to define the order of execution */
    order: 600,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: flip,
    /**
     * @prop {String|Array} behavior='flip'
     * The behavior used to change the popper's placement. It can be one of
     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
     * placements (with optional variations)
     */
    behavior: 'flip',
    /**
     * @prop {number} padding=5
     * The popper will flip if it hits the edges of the `boundariesElement`
     */
    padding: 5,
    /**
     * @prop {String|HTMLElement} boundariesElement='viewport'
     * The element which will define the boundaries of the popper position.
     * The popper will never be placed outside of the defined boundaries
     * (except if `keepTogether` is enabled)
     */
    boundariesElement: 'viewport',
    /**
     * @prop {Boolean} flipVariations=false
     * The popper will switch placement variation between `-start` and `-end` when
     * the reference element overlaps its boundaries.
     *
     * The original placement should have a set variation.
     */
    flipVariations: false,
    /**
     * @prop {Boolean} flipVariationsByContent=false
     * The popper will switch placement variation between `-start` and `-end` when
     * the popper element overlaps its reference boundaries.
     *
     * The original placement should have a set variation.
     */
    flipVariationsByContent: false
  },

  /**
   * Modifier used to make the popper flow toward the inner of the reference element.
   * By default, when this modifier is disabled, the popper will be placed outside
   * the reference element.
   * @memberof modifiers
   * @inner
   */
  inner: {
    /** @prop {number} order=700 - Index used to define the order of execution */
    order: 700,
    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
    enabled: false,
    /** @prop {ModifierFn} */
    fn: inner
  },

  /**
   * Modifier used to hide the popper when its reference element is outside of the
   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can
   * be used to hide with a CSS selector the popper when its reference is
   * out of boundaries.
   *
   * Requires the `preventOverflow` modifier before it in order to work.
   * @memberof modifiers
   * @inner
   */
  hide: {
    /** @prop {number} order=800 - Index used to define the order of execution */
    order: 800,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: hide
  },

  /**
   * Computes the style that will be applied to the popper element to gets
   * properly positioned.
   *
   * Note that this modifier will not touch the DOM, it just prepares the styles
   * so that `applyStyle` modifier can apply it. This separation is useful
   * in case you need to replace `applyStyle` with a custom implementation.
   *
   * This modifier has `850` as `order` value to maintain backward compatibility
   * with previous versions of Popper.js. Expect the modifiers ordering method
   * to change in future major versions of the library.
   *
   * @memberof modifiers
   * @inner
   */
  computeStyle: {
    /** @prop {number} order=850 - Index used to define the order of execution */
    order: 850,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: computeStyle,
    /**
     * @prop {Boolean} gpuAcceleration=true
     * If true, it uses the CSS 3D transformation to position the popper.
     * Otherwise, it will use the `top` and `left` properties
     */
    gpuAcceleration: true,
    /**
     * @prop {string} [x='bottom']
     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.
     * Change this if your popper should grow in a direction different from `bottom`
     */
    x: 'bottom',
    /**
     * @prop {string} [x='left']
     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.
     * Change this if your popper should grow in a direction different from `right`
     */
    y: 'right'
  },

  /**
   * Applies the computed styles to the popper element.
   *
   * All the DOM manipulations are limited to this modifier. This is useful in case
   * you want to integrate Popper.js inside a framework or view library and you
   * want to delegate all the DOM manipulations to it.
   *
   * Note that if you disable this modifier, you must make sure the popper element
   * has its position set to `absolute` before Popper.js can do its work!
   *
   * Just disable this modifier and define your own to achieve the desired effect.
   *
   * @memberof modifiers
   * @inner
   */
  applyStyle: {
    /** @prop {number} order=900 - Index used to define the order of execution */
    order: 900,
    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
    enabled: true,
    /** @prop {ModifierFn} */
    fn: applyStyle,
    /** @prop {Function} */
    onLoad: applyStyleOnLoad,
    /**
     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
     * @prop {Boolean} gpuAcceleration=true
     * If true, it uses the CSS 3D transformation to position the popper.
     * Otherwise, it will use the `top` and `left` properties
     */
    gpuAcceleration: undefined
  }
};

/**
 * The `dataObject` is an object containing all the information used by Popper.js.
 * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
 * @name dataObject
 * @property {Object} data.instance The Popper.js instance
 * @property {String} data.placement Placement applied to popper
 * @property {String} data.originalPlacement Placement originally defined on init
 * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
 * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
 * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
 * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
 * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
 * @property {Object} data.boundaries Offsets of the popper boundaries
 * @property {Object} data.offsets The measurements of popper, reference and arrow elements
 * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
 * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
 * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
 */

/**
 * Default options provided to Popper.js constructor.<br />
 * These can be overridden using the `options` argument of Popper.js.<br />
 * To override an option, simply pass an object with the same
 * structure of the `options` object, as the 3rd argument. For example:
 * ```
 * new Popper(ref, pop, {
 *   modifiers: {
 *     preventOverflow: { enabled: false }
 *   }
 * })
 * ```
 * @type {Object}
 * @static
 * @memberof Popper
 */
var Defaults = {
  /**
   * Popper's placement.
   * @prop {Popper.placements} placement='bottom'
   */
  placement: 'bottom',

  /**
   * Set this to true if you want popper to position it self in 'fixed' mode
   * @prop {Boolean} positionFixed=false
   */
  positionFixed: false,

  /**
   * Whether events (resize, scroll) are initially enabled.
   * @prop {Boolean} eventsEnabled=true
   */
  eventsEnabled: true,

  /**
   * Set to true if you want to automatically remove the popper when
   * you call the `destroy` method.
   * @prop {Boolean} removeOnDestroy=false
   */
  removeOnDestroy: false,

  /**
   * Callback called when the popper is created.<br />
   * By default, it is set to no-op.<br />
   * Access Popper.js instance with `data.instance`.
   * @prop {onCreate}
   */
  onCreate: function onCreate() {},

  /**
   * Callback called when the popper is updated. This callback is not called
   * on the initialization/creation of the popper, but only on subsequent
   * updates.<br />
   * By default, it is set to no-op.<br />
   * Access Popper.js instance with `data.instance`.
   * @prop {onUpdate}
   */
  onUpdate: function onUpdate() {},

  /**
   * List of modifiers used to modify the offsets before they are applied to the popper.
   * They provide most of the functionalities of Popper.js.
   * @prop {modifiers}
   */
  modifiers: modifiers
};

/**
 * @callback onCreate
 * @param {dataObject} data
 */

/**
 * @callback onUpdate
 * @param {dataObject} data
 */

// Utils
// Methods
var Popper = function () {
  /**
   * Creates a new Popper.js instance.
   * @class Popper
   * @param {Element|referenceObject} reference - The reference element used to position the popper
   * @param {Element} popper - The HTML / XML element used as the popper
   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
   * @return {Object} instance - The generated Popper.js instance
   */
  function Popper(reference, popper) {
    var _this = this;

    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    classCallCheck(this, Popper);

    this.scheduleUpdate = function () {
      return requestAnimationFrame(_this.update);
    };

    // make update() debounced, so that it only runs at most once-per-tick
    this.update = debounce(this.update.bind(this));

    // with {} we create a new object with the options inside it
    this.options = _extends({}, Popper.Defaults, options);

    // init state
    this.state = {
      isDestroyed: false,
      isCreated: false,
      scrollParents: []
    };

    // get reference and popper elements (allow jQuery wrappers)
    this.reference = reference && reference.jquery ? reference[0] : reference;
    this.popper = popper && popper.jquery ? popper[0] : popper;

    // Deep merge modifiers options
    this.options.modifiers = {};
    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {
      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});
    });

    // Refactoring modifiers' list (Object => Array)
    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {
      return _extends({
        name: name
      }, _this.options.modifiers[name]);
    })
    // sort the modifiers by order
    .sort(function (a, b) {
      return a.order - b.order;
    });

    // modifiers have the ability to execute arbitrary code when Popper.js get inited
    // such code is executed in the same order of its modifier
    // they could add new properties to their options configuration
    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
    this.modifiers.forEach(function (modifierOptions) {
      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {
        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);
      }
    });

    // fire the first update to position the popper in the right place
    this.update();

    var eventsEnabled = this.options.eventsEnabled;
    if (eventsEnabled) {
      // setup event listeners, they will take care of update the position in specific situations
      this.enableEventListeners();
    }

    this.state.eventsEnabled = eventsEnabled;
  }

  // We can't use class properties because they don't get listed in the
  // class prototype and break stuff like Sinon stubs


  createClass(Popper, [{
    key: 'update',
    value: function update$$1() {
      return update.call(this);
    }
  }, {
    key: 'destroy',
    value: function destroy$$1() {
      return destroy.call(this);
    }
  }, {
    key: 'enableEventListeners',
    value: function enableEventListeners$$1() {
      return enableEventListeners.call(this);
    }
  }, {
    key: 'disableEventListeners',
    value: function disableEventListeners$$1() {
      return disableEventListeners.call(this);
    }

    /**
     * Schedules an update. It will run on the next UI update available.
     * @method scheduleUpdate
     * @memberof Popper
     */


    /**
     * Collection of utilities useful when writing custom modifiers.
     * Starting from version 1.7, this method is available only if you
     * include `popper-utils.js` before `popper.js`.
     *
     * **DEPRECATION**: This way to access PopperUtils is deprecated
     * and will be removed in v2! Use the PopperUtils module directly instead.
     * Due to the high instability of the methods contained in Utils, we can't
     * guarantee them to follow semver. Use them at your own risk!
     * @static
     * @private
     * @type {Object}
     * @deprecated since version 1.8
     * @member Utils
     * @memberof Popper
     */

  }]);
  return Popper;
}();

/**
 * The `referenceObject` is an object that provides an interface compatible with Popper.js
 * and lets you use it as replacement of a real DOM node.<br />
 * You can use this method to position a popper relatively to a set of coordinates
 * in case you don't have a DOM node to use as reference.
 *
 * ```
 * new Popper(referenceObject, popperNode);
 * ```
 *
 * NB: This feature isn't supported in Internet Explorer 10.
 * @name referenceObject
 * @property {Function} data.getBoundingClientRect
 * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.
 * @property {number} data.clientWidth
 * An ES6 getter that will return the width of the virtual reference element.
 * @property {number} data.clientHeight
 * An ES6 getter that will return the height of the virtual reference element.
 */


Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;
Popper.placements = placements;
Popper.Defaults = Defaults;

/* harmony default export */ __webpack_exports__["default"] = (Popper);
//# sourceMappingURL=popper.js.map

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || new Function("return this")();
} catch (e) {
	// This works if the window reference is available
	if (typeof window === "object") g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;


/***/ }),

/***/ "./public/fontawesome/css/all.min.css":
/*!********************************************!*\
  !*** ./public/fontawesome/css/all.min.css ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ })

},[["./assets/js/app.js","runtime"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvY3NzL2FwcC5jc3MiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2Nzcy9jb21tb24uY3NzIiwid2VicGFjazovLy8uL2Fzc2V0cy9jc3MvZ2xvYmFsLnNjc3MiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2pzL2FwcC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvZmxhc2gtbWVzc2FnZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2pzL2dlb2xvYy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvbGVhZmxldC9sZWFmbGV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAtc2xpZGVyL2Rpc3QvYm9vdHN0cmFwLXNsaWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwLXNsaWRlci9kaXN0L2Nzcy9ib290c3RyYXAtc2xpZGVyLm1pbi5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3BwZXIuanMvZGlzdC9lc20vcG9wcGVyLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vcHVibGljL2ZvbnRhd2Vzb21lL2Nzcy9hbGwubWluLmNzcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwiJCIsImdsb2JhbCIsImpRdWVyeSIsImZsYXNoTm90aWZpY2F0aW9uIiwiJGNvbGxlY3Rpb25Ib2xkZXIiLCIkYWRkR3JvdXBlQnV0dG9uIiwiJG5ld0xpbmtMaSIsImFwcGVuZCIsIiRhZGRHZW9sb2NCdXR0b24iLCIkbmV3TGlua0xpR2VvbG9jIiwiYWRkR3JvdXBlRm9ybSIsInByb3RvdHlwZSIsImRhdGEiLCJpbmRleCIsIm5ld0Zvcm0iLCJyZXBsYWNlIiwiJG5ld0Zvcm1MaSIsImJlZm9yZSIsImFkZEdyb3VwZUZvcm1EZWxldGVMaW5rIiwiJHRhZ0Zvcm1MaSIsIiRyZW1vdmVGb3JtQnV0dG9uIiwib24iLCJlIiwicmVtb3ZlIiwiYWRkR3JvdXBlRm9ybUdlb2xvYyIsIiRjb2xsZWN0aW9uSG9sZGVyR2VvbG9jIiwicHJvdG90eXBlR2VvbG9jIiwiaW5kZXhHZW9sb2MiLCJmaW5kIiwibGVuZ3RoIiwibmV3Rm9ybUdlb2xvYyIsIiRuZXdGb3JtTGlHZW9sb2MiLCJhZGRHcm91cGVGb3JtRGVsZXRlTGlua0dlb2xvYyIsIiR0YWdGb3JtTGlHZW9sb2MiLCIkcmVtb3ZlRm9ybUJ1dHRvbkdlb2xvYyIsInNob3dDb25maXJtVHJhbnNhY3Rpb25Nb2RhbCIsImRpdiIsImZvcm0iLCJtb250YW50IiwiZGVzdGluYXRhaXJlIiwibW9kYWwiLCJtZXNzYWdlIiwidGV4dCIsInNob3ciLCJvZmYiLCJzdWJtaXQiLCJkb2N1bWVudCIsInJlYWR5IiwiZWFjaCIsImFkZENsYXNzIiwidG9vbHRpcCIsImNoYW5nZSIsIm15U2xpZGVyIiwic2xpZGVyIiwidmFsdWUiLCJldmVudCIsIm5ld1ZhbHVlIiwicHJldmVudERlZmF1bHQiLCJjbG9zZXN0IiwiY2hlY2tWYWxpZGl0eSIsImRlc3RpbmF0YWlyZV90eXBlIiwibmFtZSIsImRlc3RpbmF0YWlyZV9zZWxlY3QiLCJkZXN0aW5hdGFpcmVfbmFtZSIsIm9wdGlvbnMiLCJzZWxlY3RlZEluZGV4IiwibW9udGFudF9maWVsZCIsIm1vbnRhbnRfdmFsdWUiLCJoaWRlIiwibWV0aG9kcyIsImluaXQiLCJzZXR0aW5ncyIsImV4dGVuZCIsImZuIiwiZGVmYXVsdHMiLCJzZXRUaW1lb3V0IiwiZGVsYXkiLCJoaWRlRGVsYXkiLCJsaXN0ZW5JbmNvbWluZ01lc3NhZ2VzIiwiYWpheENvbXBsZXRlIiwieGhyIiwicGFyc2VKU09OIiwicmVzcG9uc2VUZXh0IiwibWVzc2FnZXMiLCJpIiwiZXJyb3IiLCJhZGRFcnJvciIsInN1Y2Nlc3MiLCJhZGRTdWNjZXNzIiwiaW5mbyIsImFkZEluZm8iLCJmbGFzaE1lc3NhZ2VFbHQiLCJnZXRCYXNpY0ZsYXNoIiwiYWRkVG9MaXN0IiwiZGlzcGxheSIsImdldENsb3NlQnV0dG9uIiwiaHRtbCIsImNsb3NlQnV0dG9uRWx0IiwiYXR0ciIsImFwcGVuZFRvIiwibWV0aG9kIiwiYXBwbHkiLCJBcnJheSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsIm1hcE1hcmtlcnMiLCJzZWxmIiwiYWpheCIsInVybCIsInR5cGUiLCJ2YWwiLCJyZXNwb25zZSIsImRpdmlkIiwibWFya2VyXzEiLCJzdGF0dXMiLCJsYXQiLCJsb24iLCJpbnNlcnRBZnRlciIsImxhdGxvbiIsIkwiLCJsYXRMbmciLCJwYXJzZUZsb2F0IiwibXltYXAiLCJtYXAiLCJzZXRWaWV3IiwidGlsZUxheWVyIiwibWF4Wm9vbSIsImF0dHJpYnV0aW9uIiwiYWRkVG8iLCJtYXJrZXIiLCJKU09OIiwicGFyc2UiLCJwYXJzZUludCIsInJlbW92ZUxheWVyIiwibmV3TWFya2VyIiwibGF0bG5nIiwicHVzaCIsImxuZyIsInQiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwibiIsIm8iLCJiaW5kIiwiY29uY2F0IiwiX2xlYWZsZXRfaWQiLCJlaSIsInMiLCJyIiwiYSIsIk1hdGgiLCJwb3ciLCJyb3VuZCIsImgiLCJ0cmltIiwidSIsInNwbGl0IiwibCIsImhhc093blByb3BlcnR5IiwiaWkiLCJjIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidG9VcHBlckNhc2UiLCJpbmRleE9mIiwiam9pbiIsIl8iLCJuaSIsIkVycm9yIiwiZCIsInAiLCJ3aW5kb3ciLCJtIiwiRGF0ZSIsIm1heCIsInJpIiwiZiIsImFpIiwiZyIsImhpIiwidiIsInkiLCJNaXhpbiIsIm9pIiwiRXZlbnRzIiwiY29uc29sZSIsIndhcm4iLCJzdGFjayIsIngiLCJ3IiwiUCIsImIiLCJUIiwieiIsIk0iLCJpc05hTiIsImFsdCIsIkMiLCJTIiwiX2EiLCJfYiIsIl9jIiwiX2QiLCJaIiwiRSIsImNyZWF0ZUVsZW1lbnROUyIsImsiLCJKaSIsIkIiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsIkEiLCJPIiwiVyIsIkgiLCJJIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRlIiwiaWUiLCJlZSIsIm5lIiwicG9pbnRlclR5cGUiLCJNU1BPSU5URVJfVFlQRV9NT1VTRSIsIm9lIiwidGFyZ2V0IiwidGFnTmFtZSIsIlB0IiwiaiIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZSIsImRvY3VtZW50RWxlbWVudCIsIlIiLCJOIiwiRCIsInNlIiwicG9pbnRlcklkIiwiYWUiLCJ0b3VjaGVzIiwiY2hhbmdlZFRvdWNoZXMiLCJidXR0b25zIiwiRiIsIlZpIiwiYmkiLCJub3ciLCJjYW5jZWxCdWJibGUiLCJsZSIsImhlIiwidWUiLCJVIiwiViIsImdldEVsZW1lbnRCeUlkIiwicSIsInN0eWxlIiwiY3VycmVudFN0eWxlIiwiZGVmYXVsdFZpZXciLCJnZXRDb21wdXRlZFN0eWxlIiwiRyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJhcHBlbmRDaGlsZCIsIksiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJZIiwiZmlyc3RDaGlsZCIsIlgiLCJsYXN0Q2hpbGQiLCJKIiwiaW5zZXJ0QmVmb3JlIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJldCIsIlJlZ0V4cCIsInRlc3QiLCJRIiwiYWRkIiwiaXQiLCJ0dCIsImJhc2VWYWwiLCJjb3JyZXNwb25kaW5nRWxlbWVudCIsIm50Iiwib3BhY2l0eSIsIm90IiwiZmlsdGVycyIsIml0ZW0iLCJFbmFibGVkIiwiT3BhY2l0eSIsImZpbHRlciIsInN0IiwicnQiLCJjZSIsIlJpIiwiYXQiLCJfbGVhZmxldF9wb3MiLCJqaSIsImxlZnQiLCJ0b3AiLCJodCIsInV0IiwibXQiLCJsdCIsImZ0IiwiY3QiLCJ0YWJJbmRleCIsIl90IiwibWUiLCJmZSIsIm91dGxpbmUiLCJkdCIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwiYm9keSIsInB0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJib3VuZGluZ0NsaWVudFJlY3QiLCJndCIsInZ0IiwieWUiLCJxaSIsIkVpIiwiQ3QiLCJ6aSIsIlN0IiwiYXR0YWNoRXZlbnQiLCJkZXRhY2hFdmVudCIsInl0Iiwic3RvcFByb3BhZ2F0aW9uIiwib3JpZ2luYWxFdmVudCIsIl9zdG9wcGVkIiwiTXQiLCJ4dCIsInd0IiwienQiLCJyZXR1cm5WYWx1ZSIsIkx0IiwiYnQiLCJjbGllbnRYIiwiY2xpZW50WSIsImNsaWVudExlZnQiLCJjbGllbnRUb3AiLCJUdCIsIndoZWVsRGVsdGFZIiwiZGVsdGFZIiwiZGVsdGFNb2RlIiwieGUiLCJkZWx0YVgiLCJkZWx0YVoiLCJ3aGVlbERlbHRhIiwiZGV0YWlsIiwiYWJzIiwid2UiLCJyZWxhdGVkVGFyZ2V0IiwidGltZVN0YW1wIiwiZ2UiLCJfc2ltdWxhdGVkQ2xpY2siLCJfc2ltdWxhdGVkIiwiWnQiLCJBdCIsImt0IiwiRXQiLCJzcXJ0IiwiRHQiLCJVaW50OEFycmF5IiwiQnQiLCJOdCIsIkl0Iiwia2UiLCJSdCIsIk90IiwibWluIiwianQiLCJXdCIsIkh0IiwiX2NvZGUiLCJGdCIsImdlb21ldHJ5IiwiY29vcmRpbmF0ZXMiLCJwb2ludFRvTGF5ZXIiLCJjb29yZHNUb0xhdExuZyIsIlV0IiwiJGUiLCJLZSIsIlZ0Iiwibm4iLCJnZW9tZXRyaWVzIiwicHJvcGVydGllcyIsInF0IiwiR3QiLCJLdCIsImZlYXR1cmUiLCJZdCIsIlh0Iiwic24iLCJKdCIsIm1uIiwiJHQiLCJYaSIsInZuIiwiUXQiLCIkaSIsIlBuIiwidGkiLCJPYmplY3QiLCJmcmVlemUiLCJjcmVhdGUiLCJpc0FycmF5IiwidG9TdHJpbmciLCJzaSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiY2xlYXJUaW1lb3V0IiwidWkiLCJsYXN0SWQiLCJzdGFtcCIsInRocm90dGxlIiwid3JhcE51bSIsImZhbHNlRm4iLCJmb3JtYXROdW0iLCJzcGxpdFdvcmRzIiwic2V0T3B0aW9ucyIsImdldFBhcmFtU3RyaW5nIiwidGVtcGxhdGUiLCJlbXB0eUltYWdlVXJsIiwicmVxdWVzdEZuIiwiY2FuY2VsRm4iLCJyZXF1ZXN0QW5pbUZyYW1lIiwiY2FuY2VsQW5pbUZyYW1lIiwiaW5pdGlhbGl6ZSIsImNhbGxJbml0SG9va3MiLCJfX3N1cGVyX18iLCJjb25zdHJ1Y3RvciIsInN0YXRpY3MiLCJpbmNsdWRlcyIsIl9pbml0SG9va3MiLCJfaW5pdEhvb2tzQ2FsbGVkIiwiaW5jbHVkZSIsIm1lcmdlT3B0aW9ucyIsImFkZEluaXRIb29rIiwibGkiLCJfb24iLCJfb2ZmIiwiX2V2ZW50cyIsImN0eCIsIl9maXJpbmdDb3VudCIsInNwbGljZSIsImZpcmUiLCJsaXN0ZW5zIiwic291cmNlVGFyZ2V0IiwiX3Byb3BhZ2F0ZUV2ZW50IiwiX2V2ZW50UGFyZW50cyIsIm9uY2UiLCJhZGRFdmVudFBhcmVudCIsInJlbW92ZUV2ZW50UGFyZW50IiwibGF5ZXIiLCJwcm9wYWdhdGVkRnJvbSIsImNsZWFyQWxsRXZlbnRMaXN0ZW5lcnMiLCJhZGRPbmVUaW1lRXZlbnRMaXN0ZW5lciIsImZpcmVFdmVudCIsImhhc0V2ZW50TGlzdGVuZXJzIiwiY2kiLCJfaSIsInRydW5jIiwiZmxvb3IiLCJjZWlsIiwiY2xvbmUiLCJfYWRkIiwic3VidHJhY3QiLCJfc3VidHJhY3QiLCJkaXZpZGVCeSIsIl9kaXZpZGVCeSIsIm11bHRpcGx5QnkiLCJfbXVsdGlwbHlCeSIsInNjYWxlQnkiLCJ1bnNjYWxlQnkiLCJfcm91bmQiLCJfZmxvb3IiLCJfY2VpbCIsIl90cnVuYyIsImRpc3RhbmNlVG8iLCJlcXVhbHMiLCJnZXRDZW50ZXIiLCJnZXRCb3R0b21MZWZ0IiwiZ2V0VG9wUmlnaHQiLCJnZXRUb3BMZWZ0IiwiZ2V0Qm90dG9tUmlnaHQiLCJnZXRTaXplIiwiaW50ZXJzZWN0cyIsIm92ZXJsYXBzIiwiaXNWYWxpZCIsIl9zb3V0aFdlc3QiLCJfbm9ydGhFYXN0IiwicGFkIiwiZ2V0U291dGhXZXN0IiwiZ2V0Tm9ydGhFYXN0IiwiZ2V0Tm9ydGhXZXN0IiwiZ2V0Tm9ydGgiLCJnZXRXZXN0IiwiZ2V0U291dGhFYXN0IiwiZ2V0U291dGgiLCJnZXRFYXN0IiwidG9CQm94U3RyaW5nIiwicGkiLCJkaXN0YW5jZSIsIndyYXAiLCJ3cmFwTGF0TG5nIiwidG9Cb3VuZHMiLCJjb3MiLCJQSSIsImRpIiwibGF0TG5nVG9Qb2ludCIsInByb2plY3Rpb24iLCJwcm9qZWN0Iiwic2NhbGUiLCJ0cmFuc2Zvcm1hdGlvbiIsIl90cmFuc2Zvcm0iLCJwb2ludFRvTGF0TG5nIiwidW50cmFuc2Zvcm0iLCJ1bnByb2plY3QiLCJ6b29tIiwibG9nIiwiTE4yIiwiZ2V0UHJvamVjdGVkQm91bmRzIiwiaW5maW5pdGUiLCJib3VuZHMiLCJ0cmFuc2Zvcm0iLCJ3cmFwTG5nIiwid3JhcExhdCIsIndyYXBMYXRMbmdCb3VuZHMiLCJzaW4iLCJhdGFuMiIsIm1pIiwiTUFYX0xBVElUVURFIiwiYXRhbiIsImV4cCIsImZpIiwiZ2kiLCJ2aSIsInlpIiwiY29kZSIsInhpIiwid2kiLCJQaSIsIkxpIiwiVGkiLCJNaSIsIkNpIiwiZXhlYyIsIlNpIiwiWmkiLCJvcGVyYSIsImtpIiwiQmkiLCJBaSIsIklpIiwiT2kiLCJwbGF0Zm9ybSIsIk5pIiwiV2ViS2l0Q1NTTWF0cml4IiwiRGkiLCJMX0RJU0FCTEVfM0QiLCJXaSIsIm9yaWVudGF0aW9uIiwiSGkiLCJGaSIsIlVpIiwiUG9pbnRlckV2ZW50IiwiTVNQb2ludGVyRXZlbnQiLCJMX05PX1RPVUNIIiwiRG9jdW1lbnRUb3VjaCIsIkdpIiwiS2kiLCJZaSIsImRldmljZVBpeGVsUmF0aW8iLCJzY3JlZW4iLCJkZXZpY2VYRFBJIiwibG9naWNhbFhEUEkiLCJnZXRDb250ZXh0IiwiY3JlYXRlU1ZHUmVjdCIsImlubmVySFRNTCIsImJlaGF2aW9yIiwiYWRqIiwiUWkiLCJpZWx0OSIsImVkZ2UiLCJ3ZWJraXQiLCJhbmRyb2lkIiwiYW5kcm9pZDIzIiwiYW5kcm9pZFN0b2NrIiwiY2hyb21lIiwiZ2Vja28iLCJzYWZhcmkiLCJwaGFudG9tIiwib3BlcmExMiIsIndpbiIsImllM2QiLCJ3ZWJraXQzZCIsImdlY2tvM2QiLCJhbnkzZCIsIm1vYmlsZSIsIm1vYmlsZVdlYmtpdCIsIm1vYmlsZVdlYmtpdDNkIiwibXNQb2ludGVyIiwicG9pbnRlciIsInRvdWNoIiwibW9iaWxlT3BlcmEiLCJtb2JpbGVHZWNrbyIsInJldGluYSIsImNhbnZhcyIsInN2ZyIsInZtbCIsIl9lIiwiZGUiLCJwZSIsInZlIiwiVFJBTlNGT1JNIiwiVFJBTlNJVElPTiIsIlRSQU5TSVRJT05fRU5EIiwiZ2V0IiwiZ2V0U3R5bGUiLCJlbXB0eSIsInRvRnJvbnQiLCJ0b0JhY2siLCJoYXNDbGFzcyIsInJlbW92ZUNsYXNzIiwic2V0Q2xhc3MiLCJnZXRDbGFzcyIsInNldE9wYWNpdHkiLCJ0ZXN0UHJvcCIsInNldFRyYW5zZm9ybSIsInNldFBvc2l0aW9uIiwiZ2V0UG9zaXRpb24iLCJkaXNhYmxlVGV4dFNlbGVjdGlvbiIsImVuYWJsZVRleHRTZWxlY3Rpb24iLCJkaXNhYmxlSW1hZ2VEcmFnIiwiZW5hYmxlSW1hZ2VEcmFnIiwicHJldmVudE91dGxpbmUiLCJyZXN0b3JlT3V0bGluZSIsImdldFNpemVkUGFyZW50Tm9kZSIsImdldFNjYWxlIiwiUGUiLCJkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb24iLCJkaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbiIsInN0b3AiLCJnZXRNb3VzZVBvc2l0aW9uIiwiZ2V0V2hlZWxEZWx0YSIsImZha2VTdG9wIiwic2tpcHBlZCIsImlzRXh0ZXJuYWxUYXJnZXQiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiTGUiLCJydW4iLCJfZWwiLCJfaW5Qcm9ncmVzcyIsIl9kdXJhdGlvbiIsIl9lYXNlT3V0UG93ZXIiLCJfc3RhcnRQb3MiLCJfb2Zmc2V0IiwiX3N0YXJ0VGltZSIsIl9hbmltYXRlIiwiX3N0ZXAiLCJfY29tcGxldGUiLCJfYW5pbUlkIiwiX3J1bkZyYW1lIiwiX2Vhc2VPdXQiLCJiZSIsImNycyIsImNlbnRlciIsIm1pblpvb20iLCJsYXllcnMiLCJtYXhCb3VuZHMiLCJyZW5kZXJlciIsInpvb21BbmltYXRpb24iLCJ6b29tQW5pbWF0aW9uVGhyZXNob2xkIiwiZmFkZUFuaW1hdGlvbiIsIm1hcmtlclpvb21BbmltYXRpb24iLCJ0cmFuc2Zvcm0zRExpbWl0Iiwiem9vbVNuYXAiLCJ6b29tRGVsdGEiLCJ0cmFja1Jlc2l6ZSIsIl9oYW5kbGVycyIsIl9sYXllcnMiLCJfem9vbUJvdW5kTGF5ZXJzIiwiX3NpemVDaGFuZ2VkIiwiX2luaXRDb250YWluZXIiLCJfaW5pdExheW91dCIsIl9vblJlc2l6ZSIsIl9pbml0RXZlbnRzIiwic2V0TWF4Qm91bmRzIiwiX3pvb20iLCJfbGltaXRab29tIiwicmVzZXQiLCJfem9vbUFuaW1hdGVkIiwiX2NyZWF0ZUFuaW1Qcm94eSIsIl9wcm94eSIsIl9jYXRjaFRyYW5zaXRpb25FbmQiLCJfYWRkTGF5ZXJzIiwiX2xpbWl0Q2VudGVyIiwiX3N0b3AiLCJfbG9hZGVkIiwiYW5pbWF0ZSIsInBhbiIsImR1cmF0aW9uIiwiX3RyeUFuaW1hdGVkWm9vbSIsIl90cnlBbmltYXRlZFBhbiIsIl9zaXplVGltZXIiLCJfcmVzZXRWaWV3Iiwic2V0Wm9vbSIsInpvb21JbiIsInpvb21PdXQiLCJzZXRab29tQXJvdW5kIiwiZ2V0Wm9vbVNjYWxlIiwibGF0TG5nVG9Db250YWluZXJQb2ludCIsImNvbnRhaW5lclBvaW50VG9MYXRMbmciLCJfZ2V0Qm91bmRzQ2VudGVyWm9vbSIsImdldEJvdW5kcyIsInBhZGRpbmdUb3BMZWZ0IiwicGFkZGluZyIsInBhZGRpbmdCb3R0b21SaWdodCIsImdldEJvdW5kc1pvb20iLCJmaXRCb3VuZHMiLCJmaXRXb3JsZCIsInBhblRvIiwicGFuQnkiLCJnZXRab29tIiwiX3BhbkFuaW0iLCJzdGVwIiwiX29uUGFuVHJhbnNpdGlvblN0ZXAiLCJlbmQiLCJfb25QYW5UcmFuc2l0aW9uRW5kIiwibm9Nb3ZlU3RhcnQiLCJfbWFwUGFuZSIsIl9nZXRNYXBQYW5lUG9zIiwiZWFzZUxpbmVhcml0eSIsIl9yYXdQYW5CeSIsImZseVRvIiwiX2ZseVRvRnJhbWUiLCJfbW92ZSIsImdldFNjYWxlWm9vbSIsIl9tb3ZlRW5kIiwiX21vdmVTdGFydCIsImZseVRvQm91bmRzIiwiX3Bhbkluc2lkZU1heEJvdW5kcyIsInNldE1pblpvb20iLCJzZXRNYXhab29tIiwicGFuSW5zaWRlQm91bmRzIiwiX2VuZm9yY2luZ0JvdW5kcyIsInBhbkluc2lkZSIsImdldFBpeGVsQm91bmRzIiwiaW52YWxpZGF0ZVNpemUiLCJfbGFzdENlbnRlciIsImRlYm91bmNlTW92ZWVuZCIsIm9sZFNpemUiLCJuZXdTaXplIiwibG9jYXRlIiwiX2xvY2F0ZU9wdGlvbnMiLCJ0aW1lb3V0Iiwid2F0Y2giLCJfaGFuZGxlR2VvbG9jYXRpb25FcnJvciIsIl9oYW5kbGVHZW9sb2NhdGlvblJlc3BvbnNlIiwiX2xvY2F0aW9uV2F0Y2hJZCIsImdlb2xvY2F0aW9uIiwid2F0Y2hQb3NpdGlvbiIsImdldEN1cnJlbnRQb3NpdGlvbiIsInN0b3BMb2NhdGUiLCJjbGVhcldhdGNoIiwiY29vcmRzIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJhY2N1cmFjeSIsInRpbWVzdGFtcCIsImFkZEhhbmRsZXIiLCJlbmFibGUiLCJfY29udGFpbmVySWQiLCJfY29udGFpbmVyIiwiX2NsZWFyQ29udHJvbFBvcyIsIl9yZXNpemVSZXF1ZXN0IiwiX2NsZWFySGFuZGxlcnMiLCJfcGFuZXMiLCJfcmVuZGVyZXIiLCJjcmVhdGVQYW5lIiwiX2NoZWNrSWZMb2FkZWQiLCJfbW92ZWQiLCJsYXllclBvaW50VG9MYXRMbmciLCJfZ2V0Q2VudGVyTGF5ZXJQb2ludCIsImdldE1pblpvb20iLCJfbGF5ZXJzTWluWm9vbSIsImdldE1heFpvb20iLCJfbGF5ZXJzTWF4Wm9vbSIsIl9zaXplIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJfZ2V0VG9wTGVmdFBvaW50IiwiZ2V0UGl4ZWxPcmlnaW4iLCJfcGl4ZWxPcmlnaW4iLCJnZXRQaXhlbFdvcmxkQm91bmRzIiwiZ2V0UGFuZSIsImdldFBhbmVzIiwiZ2V0Q29udGFpbmVyIiwibGF0TG5nVG9MYXllclBvaW50IiwiY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQiLCJsYXllclBvaW50VG9Db250YWluZXJQb2ludCIsIm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50IiwibW91c2VFdmVudFRvTGF5ZXJQb2ludCIsIm1vdXNlRXZlbnRUb0xhdExuZyIsIl9vblNjcm9sbCIsIl9mYWRlQW5pbWF0ZWQiLCJwb3NpdGlvbiIsIl9pbml0UGFuZXMiLCJfaW5pdENvbnRyb2xQb3MiLCJfcGFuZVJlbmRlcmVycyIsIm1hcmtlclBhbmUiLCJzaGFkb3dQYW5lIiwiX2dldE5ld1BpeGVsT3JpZ2luIiwicGluY2giLCJfZ2V0Wm9vbVNwYW4iLCJfdGFyZ2V0cyIsIl9oYW5kbGVET01FdmVudCIsIl9vbk1vdmVFbmQiLCJzY3JvbGxUb3AiLCJzY3JvbGxMZWZ0IiwiX2ZpbmRFdmVudFRhcmdldHMiLCJzcmNFbGVtZW50IiwiX2RyYWdnYWJsZU1vdmVkIiwiX2ZpcmVET01FdmVudCIsIl9tb3VzZUV2ZW50cyIsImdldExhdExuZyIsIl9yYWRpdXMiLCJjb250YWluZXJQb2ludCIsImxheWVyUG9pbnQiLCJidWJibGluZ01vdXNlRXZlbnRzIiwiZHJhZ2dpbmciLCJlbmFibGVkIiwibW92ZWQiLCJib3hab29tIiwiZGlzYWJsZSIsIndoZW5SZWFkeSIsIl9sYXRMbmdUb05ld0xheWVyUG9pbnQiLCJfbGF0TG5nQm91bmRzVG9OZXdMYXllckJvdW5kcyIsIl9nZXRDZW50ZXJPZmZzZXQiLCJfZ2V0Qm91bmRzT2Zmc2V0IiwiX2xpbWl0T2Zmc2V0IiwiX3JlYm91bmQiLCJtYXBQYW5lIiwiX2FuaW1hdGluZ1pvb20iLCJfb25ab29tVHJhbnNpdGlvbkVuZCIsIl9kZXN0cm95QW5pbVByb3h5IiwicHJvcGVydHlOYW1lIiwiX25vdGhpbmdUb0FuaW1hdGUiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiX2FuaW1hdGVab29tIiwiX2FuaW1hdGVUb0NlbnRlciIsIl9hbmltYXRlVG9ab29tIiwibm9VcGRhdGUiLCJUZSIsIl9tYXAiLCJyZW1vdmVDb250cm9sIiwiYWRkQ29udHJvbCIsIm9uQWRkIiwiX2NvbnRyb2xDb3JuZXJzIiwib25SZW1vdmUiLCJfcmVmb2N1c09uTWFwIiwic2NyZWVuWCIsInNjcmVlblkiLCJmb2N1cyIsInplIiwiX2NvbnRyb2xDb250YWluZXIiLCJNZSIsImNvbGxhcHNlZCIsImF1dG9aSW5kZXgiLCJoaWRlU2luZ2xlQmFzZSIsInNvcnRMYXllcnMiLCJzb3J0RnVuY3Rpb24iLCJfbGF5ZXJDb250cm9sSW5wdXRzIiwiX2xhc3RaSW5kZXgiLCJfaGFuZGxpbmdDbGljayIsIl9hZGRMYXllciIsIl91cGRhdGUiLCJfY2hlY2tEaXNhYmxlZExheWVycyIsIl9vbkxheWVyQ2hhbmdlIiwiX2V4cGFuZElmTm90Q29sbGFwc2VkIiwiYWRkQmFzZUxheWVyIiwiYWRkT3ZlcmxheSIsIl9nZXRMYXllciIsImV4cGFuZCIsIl9zZWN0aW9uIiwib2Zmc2V0VG9wIiwiY29sbGFwc2UiLCJzZXRBdHRyaWJ1dGUiLCJtb3VzZWVudGVyIiwibW91c2VsZWF2ZSIsIl9sYXllcnNMaW5rIiwiaHJlZiIsInRpdGxlIiwiX2Jhc2VMYXllcnNMaXN0IiwiX3NlcGFyYXRvciIsIl9vdmVybGF5c0xpc3QiLCJvdmVybGF5Iiwic29ydCIsInNldFpJbmRleCIsIl9hZGRJdGVtIiwiX2NyZWF0ZVJhZGlvRWxlbWVudCIsImhhc0xheWVyIiwiZGVmYXVsdENoZWNrZWQiLCJsYXllcklkIiwiX29uSW5wdXRDbGljayIsImNoZWNrZWQiLCJhZGRMYXllciIsImRpc2FibGVkIiwiX2V4cGFuZCIsIl9jb2xsYXBzZSIsIkNlIiwiem9vbUluVGV4dCIsInpvb21JblRpdGxlIiwiem9vbU91dFRleHQiLCJ6b29tT3V0VGl0bGUiLCJfem9vbUluQnV0dG9uIiwiX2NyZWF0ZUJ1dHRvbiIsIl96b29tSW4iLCJfem9vbU91dEJ1dHRvbiIsIl96b29tT3V0IiwiX3VwZGF0ZURpc2FibGVkIiwiX2Rpc2FibGVkIiwic2hpZnRLZXkiLCJ6b29tQ29udHJvbCIsIlNlIiwibWF4V2lkdGgiLCJtZXRyaWMiLCJpbXBlcmlhbCIsIl9hZGRTY2FsZXMiLCJ1cGRhdGVXaGVuSWRsZSIsIl9tU2NhbGUiLCJfaVNjYWxlIiwiX3VwZGF0ZVNjYWxlcyIsIl91cGRhdGVNZXRyaWMiLCJfdXBkYXRlSW1wZXJpYWwiLCJfZ2V0Um91bmROdW0iLCJfdXBkYXRlU2NhbGUiLCJaZSIsInByZWZpeCIsIl9hdHRyaWJ1dGlvbnMiLCJhdHRyaWJ1dGlvbkNvbnRyb2wiLCJnZXRBdHRyaWJ1dGlvbiIsImFkZEF0dHJpYnV0aW9uIiwic2V0UHJlZml4IiwicmVtb3ZlQXR0cmlidXRpb24iLCJMYXllcnMiLCJab29tIiwiU2NhbGUiLCJBdHRyaWJ1dGlvbiIsIkVlIiwiX2VuYWJsZWQiLCJhZGRIb29rcyIsInJlbW92ZUhvb2tzIiwiQmUiLCJBZSIsIkllIiwibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInBvaW50ZXJkb3duIiwiTVNQb2ludGVyRG93biIsIk9lIiwiUmUiLCJjbGlja1RvbGVyYW5jZSIsIl9lbGVtZW50IiwiX2RyYWdTdGFydFRhcmdldCIsIl9wcmV2ZW50T3V0bGluZSIsIl9vbkRvd24iLCJfZHJhZ2dpbmciLCJmaW5pc2hEcmFnIiwid2hpY2giLCJidXR0b24iLCJfbW92aW5nIiwiX3N0YXJ0UG9pbnQiLCJfcGFyZW50U2NhbGUiLCJfb25Nb3ZlIiwiX29uVXAiLCJfbGFzdFRhcmdldCIsIlNWR0VsZW1lbnRJbnN0YW5jZSIsImNvcnJlc3BvbmRpbmdVc2VFbGVtZW50IiwiX25ld1BvcyIsIl9hbmltUmVxdWVzdCIsIl9sYXN0RXZlbnQiLCJfdXBkYXRlUG9zaXRpb24iLCJOZSIsInNpbXBsaWZ5IiwicG9pbnRUb1NlZ21lbnREaXN0YW5jZSIsImNsb3Nlc3RQb2ludE9uU2VnbWVudCIsImNsaXBTZWdtZW50IiwiX2dldEVkZ2VJbnRlcnNlY3Rpb24iLCJfZ2V0Qml0Q29kZSIsIl9zcUNsb3Nlc3RQb2ludE9uU2VnbWVudCIsImlzRmxhdCIsIl9mbGF0IiwiRGUiLCJjbGlwUG9seWdvbiIsImplIiwiV2UiLCJSX01JTk9SIiwidGFuIiwiSGUiLCJMb25MYXQiLCJNZXJjYXRvciIsIlNwaGVyaWNhbE1lcmNhdG9yIiwiRmUiLCJVZSIsIlZlIiwiRWFydGgiLCJFUFNHMzM5NSIsIkVQU0czODU3IiwiRVBTRzkwMDkxMyIsIkVQU0c0MzI2IiwiU2ltcGxlIiwicWUiLCJwYW5lIiwicmVtb3ZlRnJvbSIsIl9tYXBUb0FkZCIsImFkZEludGVyYWN0aXZlVGFyZ2V0IiwicmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQiLCJfbGF5ZXJBZGQiLCJnZXRFdmVudHMiLCJiZWZvcmVBZGQiLCJlYWNoTGF5ZXIiLCJfYWRkWm9vbUxpbWl0IiwiX3VwZGF0ZVpvb21MZXZlbHMiLCJfcmVtb3ZlWm9vbUxpbWl0IiwiR2UiLCJnZXRMYXllcklkIiwiY2xlYXJMYXllcnMiLCJpbnZva2UiLCJnZXRMYXllciIsImdldExheWVycyIsInNldFN0eWxlIiwiYnJpbmdUb0Zyb250IiwiYnJpbmdUb0JhY2siLCJZZSIsInBvcHVwQW5jaG9yIiwidG9vbHRpcEFuY2hvciIsImNyZWF0ZUljb24iLCJfY3JlYXRlSWNvbiIsImNyZWF0ZVNoYWRvdyIsIl9nZXRJY29uVXJsIiwiX2NyZWF0ZUltZyIsIl9zZXRJY29uU3R5bGVzIiwic2hhZG93QW5jaG9yIiwiaWNvbkFuY2hvciIsIm1hcmdpbkxlZnQiLCJtYXJnaW5Ub3AiLCJzcmMiLCJYZSIsImljb25VcmwiLCJpY29uUmV0aW5hVXJsIiwic2hhZG93VXJsIiwiaWNvblNpemUiLCJzaGFkb3dTaXplIiwiaW1hZ2VQYXRoIiwiX2RldGVjdEljb25QYXRoIiwiSmUiLCJfbWFya2VyIiwiX2ljb24iLCJfZHJhZ2dhYmxlIiwiZHJhZ3N0YXJ0IiwiX29uRHJhZ1N0YXJ0IiwicHJlZHJhZyIsIl9vblByZURyYWciLCJkcmFnIiwiX29uRHJhZyIsImRyYWdlbmQiLCJfb25EcmFnRW5kIiwiX2FkanVzdFBhbiIsImF1dG9QYW5TcGVlZCIsImF1dG9QYW5QYWRkaW5nIiwiX3BhblJlcXVlc3QiLCJfb2xkTGF0TG5nIiwiY2xvc2VQb3B1cCIsImF1dG9QYW4iLCJfc2hhZG93IiwiX2xhdGxuZyIsIm9sZExhdExuZyIsImljb24iLCJpbnRlcmFjdGl2ZSIsImtleWJvYXJkIiwiekluZGV4T2Zmc2V0IiwicmlzZU9uSG92ZXIiLCJyaXNlT2Zmc2V0IiwiZHJhZ2dhYmxlIiwiX2luaXRJY29uIiwidXBkYXRlIiwiX3JlbW92ZUljb24iLCJfcmVtb3ZlU2hhZG93Iiwidmlld3Jlc2V0Iiwic2V0TGF0TG5nIiwic2V0WkluZGV4T2Zmc2V0Iiwic2V0SWNvbiIsIl9wb3B1cCIsImJpbmRQb3B1cCIsImdldEVsZW1lbnQiLCJfc2V0UG9zIiwibW91c2VvdmVyIiwiX2JyaW5nVG9Gcm9udCIsIm1vdXNlb3V0IiwiX3Jlc2V0WkluZGV4IiwiX3VwZGF0ZU9wYWNpdHkiLCJfaW5pdEludGVyYWN0aW9uIiwiX3pJbmRleCIsIl91cGRhdGVaSW5kZXgiLCJ6SW5kZXgiLCJfZ2V0UG9wdXBBbmNob3IiLCJfZ2V0VG9vbHRpcEFuY2hvciIsIlFlIiwic3Ryb2tlIiwiY29sb3IiLCJ3ZWlnaHQiLCJsaW5lQ2FwIiwibGluZUpvaW4iLCJkYXNoQXJyYXkiLCJkYXNoT2Zmc2V0IiwiZmlsbCIsImZpbGxDb2xvciIsImZpbGxPcGFjaXR5IiwiZmlsbFJ1bGUiLCJnZXRSZW5kZXJlciIsIl9pbml0UGF0aCIsIl9yZXNldCIsIl9hZGRQYXRoIiwiX3JlbW92ZVBhdGgiLCJyZWRyYXciLCJfdXBkYXRlUGF0aCIsIl91cGRhdGVTdHlsZSIsIl9icmluZ1RvQmFjayIsIl9wYXRoIiwiX3Byb2plY3QiLCJfY2xpY2tUb2xlcmFuY2UiLCJ0b2xlcmFuY2UiLCJ0biIsInJhZGl1cyIsInNldFJhZGl1cyIsImdldFJhZGl1cyIsIl9wb2ludCIsIl91cGRhdGVCb3VuZHMiLCJfcmFkaXVzWSIsIl9weEJvdW5kcyIsIl91cGRhdGVDaXJjbGUiLCJfZW1wdHkiLCJfYm91bmRzIiwiX2NvbnRhaW5zUG9pbnQiLCJlbiIsIl9tUmFkaXVzIiwiYWNvcyIsInNtb290aEZhY3RvciIsIm5vQ2xpcCIsIl9zZXRMYXRMbmdzIiwiZ2V0TGF0TG5ncyIsIl9sYXRsbmdzIiwic2V0TGF0TG5ncyIsImlzRW1wdHkiLCJjbG9zZXN0TGF5ZXJQb2ludCIsIl9wYXJ0cyIsIl9yaW5ncyIsImFkZExhdExuZyIsIl9kZWZhdWx0U2hhcGUiLCJfY29udmVydExhdExuZ3MiLCJfcHJvamVjdExhdGxuZ3MiLCJfY2xpcFBvaW50cyIsIl9zaW1wbGlmeVBvaW50cyIsIl91cGRhdGVQb2x5IiwicG9wIiwiYWRkRGF0YSIsImZlYXR1cmVzIiwiZGVmYXVsdE9wdGlvbnMiLCJyZXNldFN0eWxlIiwib25FYWNoRmVhdHVyZSIsIl9zZXRMYXllclN0eWxlIiwicm4iLCJ0b0dlb0pTT04iLCJ0b011bHRpUG9pbnQiLCJhbiIsImhuIiwiY3Jvc3NPcmlnaW4iLCJlcnJvck92ZXJsYXlVcmwiLCJfdXJsIiwiX2ltYWdlIiwiX2luaXRJbWFnZSIsInNldFVybCIsInNldEJvdW5kcyIsInpvb21hbmltIiwib25zZWxlY3RzdGFydCIsIm9ubW91c2Vtb3ZlIiwib25sb2FkIiwib25lcnJvciIsIl9vdmVybGF5T25FcnJvciIsInVuIiwiYXV0b3BsYXkiLCJsb29wIiwib25sb2FkZWRkYXRhIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsbiIsIm9mZnNldCIsIl9zb3VyY2UiLCJfcmVtb3ZlVGltZW91dCIsImdldENvbnRlbnQiLCJfY29udGVudCIsInNldENvbnRlbnQiLCJ2aXNpYmlsaXR5IiwiX3VwZGF0ZUNvbnRlbnQiLCJfdXBkYXRlTGF5b3V0IiwiaXNPcGVuIiwiX2NvbnRlbnROb2RlIiwiaGFzQ2hpbGROb2RlcyIsIl9nZXRBbmNob3IiLCJfY29udGFpbmVyQm90dG9tIiwiX2NvbnRhaW5lckxlZnQiLCJfY29udGFpbmVyV2lkdGgiLCJib3R0b20iLCJjbiIsIm1pbldpZHRoIiwibWF4SGVpZ2h0IiwiYXV0b1BhblBhZGRpbmdUb3BMZWZ0IiwiYXV0b1BhblBhZGRpbmdCb3R0b21SaWdodCIsImtlZXBJblZpZXciLCJjbG9zZUJ1dHRvbiIsImF1dG9DbG9zZSIsImNsb3NlT25Fc2NhcGVLZXkiLCJvcGVuT24iLCJvcGVuUG9wdXAiLCJwb3B1cCIsImNsb3NlT25DbGljayIsImNsb3NlUG9wdXBPbkNsaWNrIiwicHJlY2xpY2siLCJfY2xvc2UiLCJtb3ZlZW5kIiwiX3dyYXBwZXIiLCJfdGlwQ29udGFpbmVyIiwiX3RpcCIsIl9jbG9zZUJ1dHRvbiIsIl9vbkNsb3NlQnV0dG9uQ2xpY2siLCJ3aGl0ZVNwYWNlIiwiX3BvcHVwSGFuZGxlcnNBZGRlZCIsImNsaWNrIiwiX29wZW5Qb3B1cCIsImtleXByZXNzIiwiX29uS2V5UHJlc3MiLCJtb3ZlIiwiX21vdmVQb3B1cCIsInVuYmluZFBvcHVwIiwidG9nZ2xlUG9wdXAiLCJpc1BvcHVwT3BlbiIsInNldFBvcHVwQ29udGVudCIsImdldFBvcHVwIiwia2V5Q29kZSIsIl9uIiwiZGlyZWN0aW9uIiwicGVybWFuZW50Iiwic3RpY2t5IiwiY2xvc2VUb29sdGlwIiwiX3NldFBvc2l0aW9uIiwib3BlblRvb2x0aXAiLCJiaW5kVG9vbHRpcCIsIl90b29sdGlwIiwiX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zIiwidW5iaW5kVG9vbHRpcCIsIl90b29sdGlwSGFuZGxlcnNBZGRlZCIsIl9tb3ZlVG9vbHRpcCIsIl9vcGVuVG9vbHRpcCIsIm1vdXNlbW92ZSIsInRvZ2dsZVRvb2x0aXAiLCJpc1Rvb2x0aXBPcGVuIiwic2V0VG9vbHRpcENvbnRlbnQiLCJnZXRUb29sdGlwIiwiZG4iLCJiZ1BvcyIsImJhY2tncm91bmRQb3NpdGlvbiIsIkRlZmF1bHQiLCJwbiIsInRpbGVTaXplIiwidXBkYXRlV2hlblpvb21pbmciLCJ1cGRhdGVJbnRlcnZhbCIsIm1heE5hdGl2ZVpvb20iLCJtaW5OYXRpdmVab29tIiwibm9XcmFwIiwia2VlcEJ1ZmZlciIsIl9sZXZlbHMiLCJfdGlsZXMiLCJfcmVtb3ZlQWxsVGlsZXMiLCJfdGlsZVpvb20iLCJfc2V0QXV0b1pJbmRleCIsImlzTG9hZGluZyIsIl9sb2FkaW5nIiwidmlld3ByZXJlc2V0IiwiX2ludmFsaWRhdGVBbGwiLCJjcmVhdGVUaWxlIiwiZ2V0VGlsZVNpemUiLCJjaGlsZHJlbiIsImlzRmluaXRlIiwiY3VycmVudCIsImxvYWRlZCIsImVsIiwiYWN0aXZlIiwiX29uT3BhcXVlVGlsZSIsIl9ub1BydW5lIiwiX3BydW5lVGlsZXMiLCJfZmFkZUZyYW1lIiwiX3VwZGF0ZUxldmVscyIsIl9vblVwZGF0ZUxldmVsIiwiX3JlbW92ZVRpbGVzQXRab29tIiwiX29uUmVtb3ZlTGV2ZWwiLCJvcmlnaW4iLCJfc2V0Wm9vbVRyYW5zZm9ybSIsIl9vbkNyZWF0ZUxldmVsIiwiX2xldmVsIiwicmV0YWluIiwiX3JldGFpblBhcmVudCIsIl9yZXRhaW5DaGlsZHJlbiIsIl9yZW1vdmVUaWxlIiwiX3RpbGVDb29yZHNUb0tleSIsIl9zZXRWaWV3IiwiX2NsYW1wWm9vbSIsIl9hYm9ydExvYWRpbmciLCJfcmVzZXRHcmlkIiwiX3NldFpvb21UcmFuc2Zvcm1zIiwiX3RpbGVTaXplIiwiX2dsb2JhbFRpbGVSYW5nZSIsIl9weEJvdW5kc1RvVGlsZVJhbmdlIiwiX3dyYXBYIiwiX3dyYXBZIiwiX2dldFRpbGVkUGl4ZWxCb3VuZHMiLCJfaXNWYWxpZFRpbGUiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiX2FkZFRpbGUiLCJfdGlsZUNvb3Jkc1RvQm91bmRzIiwiX2tleVRvQm91bmRzIiwiX2tleVRvVGlsZUNvb3JkcyIsIl90aWxlQ29vcmRzVG9Od1NlIiwidGlsZSIsIl9pbml0VGlsZSIsIldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eSIsIl9nZXRUaWxlUG9zIiwiX3dyYXBDb29yZHMiLCJfdGlsZVJlYWR5IiwiX25vVGlsZXNUb0xvYWQiLCJzdWJkb21haW5zIiwiZXJyb3JUaWxlVXJsIiwiem9vbU9mZnNldCIsInRtcyIsInpvb21SZXZlcnNlIiwiZGV0ZWN0UmV0aW5hIiwiX29uVGlsZVJlbW92ZSIsIl90aWxlT25Mb2FkIiwiX3RpbGVPbkVycm9yIiwiZ2V0VGlsZVVybCIsIl9nZXRTdWJkb21haW4iLCJfZ2V0Wm9vbUZvclVybCIsImdldEF0dHJpYnV0ZSIsImNvbXBsZXRlIiwiZGVmYXVsdFdtc1BhcmFtcyIsInNlcnZpY2UiLCJyZXF1ZXN0Iiwic3R5bGVzIiwiZm9ybWF0IiwidHJhbnNwYXJlbnQiLCJ2ZXJzaW9uIiwidXBwZXJjYXNlIiwid21zUGFyYW1zIiwiX2NycyIsIl93bXNWZXJzaW9uIiwic2V0UGFyYW1zIiwiV01TIiwid21zIiwiZ24iLCJfdXBkYXRlUGF0aHMiLCJfZGVzdHJveUNvbnRhaW5lciIsIl9vblpvb20iLCJ6b29tZW5kIiwiX29uWm9vbUVuZCIsIl9vbkFuaW1ab29tIiwiX3VwZGF0ZVRyYW5zZm9ybSIsIl9jZW50ZXIiLCJfb25WaWV3UHJlUmVzZXQiLCJfcG9zdHBvbmVVcGRhdGVQYXRocyIsIl9kcmF3IiwiX29uTW91c2VNb3ZlIiwiX29uQ2xpY2siLCJfaGFuZGxlTW91c2VPdXQiLCJfY3R4IiwiX3JlZHJhd1JlcXVlc3QiLCJfcmVkcmF3Qm91bmRzIiwiX3JlZHJhdyIsInRyYW5zbGF0ZSIsIl91cGRhdGVEYXNoQXJyYXkiLCJfb3JkZXIiLCJwcmV2IiwiX2RyYXdMYXN0IiwibmV4dCIsIl9kcmF3Rmlyc3QiLCJfcmVxdWVzdFJlZHJhdyIsIl9leHRlbmRSZWRyYXdCb3VuZHMiLCJOdW1iZXIiLCJfZGFzaEFycmF5IiwiX2NsZWFyIiwiY2xlYXJSZWN0Iiwic2F2ZSIsImJlZ2luUGF0aCIsInJlY3QiLCJjbGlwIiwiX2RyYXdpbmciLCJyZXN0b3JlIiwiY2xvc2VQYXRoIiwiX2ZpbGxTdHJva2UiLCJhcmMiLCJnbG9iYWxBbHBoYSIsImZpbGxTdHlsZSIsInNldExpbmVEYXNoIiwibGluZVdpZHRoIiwic3Ryb2tlU3R5bGUiLCJfZmlyZUV2ZW50IiwibW92aW5nIiwiX2hhbmRsZU1vdXNlSG92ZXIiLCJfaG92ZXJlZExheWVyIiwieW4iLCJuYW1lc3BhY2VzIiwieG4iLCJjb29yZHNpemUiLCJfc3Ryb2tlIiwiX2ZpbGwiLCJzdHJva2VkIiwiZmlsbGVkIiwiZGFzaFN0eWxlIiwiZW5kY2FwIiwiam9pbnN0eWxlIiwiX3NldFBhdGgiLCJ3biIsInpvb21zdGFydCIsIl9vblpvb21TdGFydCIsIl9yb290R3JvdXAiLCJfc3ZnU2l6ZSIsInJlbW92ZUF0dHJpYnV0ZSIsIl9nZXRQYW5lUmVuZGVyZXIiLCJfY3JlYXRlUmVuZGVyZXIiLCJwcmVmZXJDYW52YXMiLCJMbiIsIl9ib3VuZHNUb0xhdExuZ3MiLCJwb2ludHNUb1BhdGgiLCJnZW9tZXRyeVRvTGF5ZXIiLCJjb29yZHNUb0xhdExuZ3MiLCJsYXRMbmdUb0Nvb3JkcyIsImxhdExuZ3NUb0Nvb3JkcyIsImdldEZlYXR1cmUiLCJhc0ZlYXR1cmUiLCJibiIsIl9wYW5lIiwib3ZlcmxheVBhbmUiLCJfcmVzZXRTdGF0ZVRpbWVvdXQiLCJfZGVzdHJveSIsIl9vbk1vdXNlRG93biIsIl9yZXNldFN0YXRlIiwiX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlIiwiY29udGV4dG1lbnUiLCJtb3VzZXVwIiwiX29uTW91c2VVcCIsImtleWRvd24iLCJfb25LZXlEb3duIiwiX2JveCIsIl9maW5pc2giLCJib3hab29tQm91bmRzIiwiZG91YmxlQ2xpY2tab29tIiwiVG4iLCJfb25Eb3VibGVDbGljayIsImluZXJ0aWEiLCJpbmVydGlhRGVjZWxlcmF0aW9uIiwiaW5lcnRpYU1heFNwZWVkIiwid29ybGRDb3B5SnVtcCIsIm1heEJvdW5kc1Zpc2Nvc2l0eSIsInpuIiwiX29uUHJlRHJhZ0xpbWl0IiwiX29uUHJlRHJhZ1dyYXAiLCJfcG9zaXRpb25zIiwiX3RpbWVzIiwiX29mZnNldExpbWl0IiwiX3Zpc2Nvc2l0eSIsIl9sYXN0VGltZSIsIl9sYXN0UG9zIiwiX2Fic1BvcyIsIl9wcnVuZVBvc2l0aW9ucyIsInNoaWZ0IiwiX2luaXRpYWxXb3JsZE9mZnNldCIsIl93b3JsZFdpZHRoIiwiX3Zpc2NvdXNMaW1pdCIsImtleWJvYXJkUGFuRGVsdGEiLCJNbiIsImtleUNvZGVzIiwicmlnaHQiLCJkb3duIiwidXAiLCJfc2V0UGFuRGVsdGEiLCJfc2V0Wm9vbURlbHRhIiwiX29uRm9jdXMiLCJibHVyIiwiX29uQmx1ciIsIl9hZGRIb29rcyIsIl9yZW1vdmVIb29rcyIsIl9mb2N1c2VkIiwic2Nyb2xsVG8iLCJfcGFuS2V5cyIsIl96b29tS2V5cyIsImFsdEtleSIsImN0cmxLZXkiLCJtZXRhS2V5Iiwic2Nyb2xsV2hlZWxab29tIiwid2hlZWxEZWJvdW5jZVRpbWUiLCJ3aGVlbFB4UGVyWm9vbUxldmVsIiwiQ24iLCJfb25XaGVlbFNjcm9sbCIsIl9kZWx0YSIsIl9sYXN0TW91c2VQb3MiLCJfdGltZXIiLCJfcGVyZm9ybVpvb20iLCJ0YXAiLCJ0YXBUb2xlcmFuY2UiLCJTbiIsIl9maXJlQ2xpY2siLCJfaG9sZFRpbWVvdXQiLCJfaXNUYXBWYWxpZCIsIl9zaW11bGF0ZUV2ZW50IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJjcmVhdGVFdmVudCIsImluaXRNb3VzZUV2ZW50IiwiZGlzcGF0Y2hFdmVudCIsInRvdWNoWm9vbSIsImJvdW5jZUF0Wm9vbUxpbWl0cyIsIlpuIiwiX29uVG91Y2hTdGFydCIsIl96b29taW5nIiwiX2NlbnRlclBvaW50IiwiX3N0YXJ0TGF0TG5nIiwiX3BpbmNoU3RhcnRMYXRMbmciLCJfc3RhcnREaXN0IiwiX3N0YXJ0Wm9vbSIsIl9vblRvdWNoTW92ZSIsIl9vblRvdWNoRW5kIiwiQm94Wm9vbSIsIkRvdWJsZUNsaWNrWm9vbSIsIkRyYWciLCJLZXlib2FyZCIsIlNjcm9sbFdoZWVsWm9vbSIsIlRhcCIsIlRvdWNoWm9vbSIsIkNvbnRyb2wiLCJjb250cm9sIiwiQnJvd3NlciIsIkV2ZW50ZWQiLCJVdGlsIiwiQ2xhc3MiLCJIYW5kbGVyIiwiRG9tRXZlbnQiLCJEb21VdGlsIiwiUG9zQW5pbWF0aW9uIiwiRHJhZ2dhYmxlIiwiTGluZVV0aWwiLCJQb2x5VXRpbCIsIlBvaW50IiwicG9pbnQiLCJCb3VuZHMiLCJUcmFuc2Zvcm1hdGlvbiIsIlByb2plY3Rpb24iLCJMYXRMbmciLCJMYXRMbmdCb3VuZHMiLCJsYXRMbmdCb3VuZHMiLCJDUlMiLCJHZW9KU09OIiwiZ2VvSlNPTiIsImdlb0pzb24iLCJMYXllciIsIkxheWVyR3JvdXAiLCJsYXllckdyb3VwIiwiRmVhdHVyZUdyb3VwIiwiZmVhdHVyZUdyb3VwIiwiSW1hZ2VPdmVybGF5IiwiaW1hZ2VPdmVybGF5IiwiVmlkZW9PdmVybGF5IiwidmlkZW9PdmVybGF5IiwiRGl2T3ZlcmxheSIsIlBvcHVwIiwiVG9vbHRpcCIsIkljb24iLCJEaXZJY29uIiwiZGl2SWNvbiIsIk1hcmtlciIsIlRpbGVMYXllciIsIkdyaWRMYXllciIsImdyaWRMYXllciIsIlNWRyIsIlJlbmRlcmVyIiwiQ2FudmFzIiwiUGF0aCIsIkNpcmNsZU1hcmtlciIsImNpcmNsZU1hcmtlciIsIkNpcmNsZSIsImNpcmNsZSIsIlBvbHlsaW5lIiwicG9seWxpbmUiLCJQb2x5Z29uIiwicG9seWdvbiIsIlJlY3RhbmdsZSIsInJlY3RhbmdsZSIsIk1hcCIsIkVuIiwibm9Db25mbGljdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsdUM7Ozs7Ozs7Ozs7O0FDQUEsdUM7Ozs7Ozs7Ozs7O0FDQUEsdUM7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBQSxtQkFBTyxDQUFDLHNGQUFELENBQVAsQyxDQUNBOzs7QUFDQUEsbUJBQU8sQ0FBQyw0Q0FBRCxDQUFQLEMs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RUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsdUJBQXVCO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsdUJBQXVCO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQiwwQ0FBMEM7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLGtCQUFrQiwrQ0FBK0M7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLCtCQUErQjs7QUFFbkQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxt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QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkI7QUFDN0IsS0FBSztBQUNMOztBQUVBO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDLFNBQVM7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQSwyQ0FBMkMsV0FBVztBQUN0RDs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCLCtCQUErQjs7QUFFL0IsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRDtBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQSwrQkFBK0I7QUFDL0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDLFNBQVM7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QyxTQUFTO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qix3QkFBd0I7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGdGQUFnRjs7QUFFakg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQix5QkFBeUI7O0FBRXpCLHNCQUFzQjs7QUFFdEIsNEJBQTRCOztBQUU1Qiw4QkFBOEI7O0FBRTlCLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVCxvREFBb0Q7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0MsMEVBQTBFO0FBQzlHO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QixLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsMkNBQTJDLFNBQVM7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTOztBQUVUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEZBQThGOztBQUU5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLG1HQUFtRzs7QUFFcEk7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdGQUF3Rjs7QUFFeEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVJQUF1STs7QUFFdkk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVAsd0NBQXdDLFNBQVM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnRUFBZ0U7QUFDaEU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMEJBQTBCLCtEQUErRDs7QUFFekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0MsS0FBSztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBLG1JQUFtSTs7QUFFbkk7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxLQUFLO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSwwQkFBMEIsNEdBQTRHO0FBQ3RJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsY0FBYzs7QUFFOUQsQ0FBQztBQUNEOzs7Ozs7Ozs7Ozs7QUNqMElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTSxLQUEwQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLFlBQVk7O0FBRXBCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRixvQkFBb0I7O0FBRXBCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLDZDQUE2QztBQUM3QztBQUNBO0FBQ0Esa0JBQWtCLGtDQUFrQztBQUNwRCxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxZQUFZO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0MsSUFBSTtBQUN0Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLElBQUk7O0FBRXBCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxJQUFJO0FBQzlDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEseUJBQXlCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRLDZCQUE2QjtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsZUFBZTtBQUMxQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEM7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLGVBQWU7O0FBRWYsU0FBUzs7QUFFVDtBQUNBLFFBQVEsaUNBQWlDO0FBQ3pDLFFBQVEsb0JBQW9CO0FBQzVCLFFBQVEsc0NBQXNDO0FBQzlDLFFBQVE7QUFDUixFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhEQUE4RDs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0EsOENBQThDOztBQUU5QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQSxpRUFBaUUsVUFBVTtBQUMzRSxzQ0FBc0MsMkJBQTJCO0FBQ2pFO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxVQUFVO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsY0FBYztBQUN4QjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFlBQVksdUVBQXVFO0FBQ25GO0FBQ0E7QUFDQSxZQUFZLDRCQUE0QjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlEQUFpRDtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsVUFBVSw0Q0FBNEM7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLE1BQU07QUFDakIsV0FBVyxNQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBLENBQUM7Ozs7QUFJRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSxRQUFRLEdBQUc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7OztBQUlBOztBQUVBOztBQUVBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTs7QUFFQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQiwwQkFBMEIsd0JBQXdCOztBQUVsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxjQUFjO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0NBQXdDLHNDQUFzQztBQUM5RSxvQ0FBb0MsdUNBQXVDO0FBQzNFLG9DQUFvQyxzQ0FBc0M7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ04sS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQztBQUNwQyxxQ0FBcUM7QUFDckMsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7Ozs7O0FBS0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxTQUFTO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsYUFBYTtBQUNwQyxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOzs7QUFHQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsY0FBYzs7QUFFZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxnQkFBZ0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsRUFBRTtBQUNGOztBQUVBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxPQUFPO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsZ0JBQWdCO0FBQ2xCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGNBQWMsc0JBQXNCO0FBQ3BDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtEQUErRDtBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVUsY0FBYzs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixtQkFBbUI7QUFDcEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1Q0FBdUM7QUFDakU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHVEQUF1RDtBQUM5RTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSywrQ0FBK0M7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLGNBQWM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGNBQWMscUNBQXFDO0FBQ25EOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEOztBQUVBO0FBQ0E7QUFD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QTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGLENBQUM7OztBQUdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwrREFBK0Q7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxPQUFPOztBQUVmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUEsVUFBVSxPQUFPO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdCQUFnQjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osaURBQWlELDBCQUEwQjtBQUMzRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVUsZ0JBQWdCO0FBQzFCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCO0FBQ0E7O0FBRUEsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQSxRQUFRLGdCQUFnQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEOzs7QUFHQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLEtBQUs7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUNBQXFDOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsYUFBYTs7QUFFYjs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsS0FBSztBQUNMOztBQUVBLFdBQVc7QUFDWCxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0Esc0JBQXNCO0FBQ3RCLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUEsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyx5QkFBeUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsYUFBYSx1Q0FBdUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNIOztBQUVBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQSxjQUFjLHNEQUFzRDtBQUNwRTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBLGNBQWMsbUNBQW1DO0FBQ2pELGVBQWUsNkRBQTZEO0FBQzVFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7Ozs7O0FBS0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFjLE9BQU87QUFDckI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVlLHFFQUFNLEVBQUM7QUFDdEI7Ozs7Ozs7Ozs7Ozs7QUN2akZBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7O0FDbkJBLHVDIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsIi8qXG4gKiBXZWxjb21lIHRvIHlvdXIgYXBwJ3MgbWFpbiBKYXZhU2NyaXB0IGZpbGUhXG4gKlxuICogV2UgcmVjb21tZW5kIGluY2x1ZGluZyB0aGUgYnVpbHQgdmVyc2lvbiBvZiB0aGlzIEphdmFTY3JpcHQgZmlsZVxuICogKGFuZCBpdHMgQ1NTIGZpbGUpIGluIHlvdXIgYmFzZSBsYXlvdXQgKGJhc2UuaHRtbC50d2lnKS5cbiAqL1xuXG4vLyBhbnkgQ1NTIHlvdSByZXF1aXJlIHdpbGwgb3V0cHV0IGludG8gYSBzaW5nbGUgY3NzIGZpbGUgKGFwcC5jc3MgaW4gdGhpcyBjYXNlKVxuXG4vLyBVVElMSVNFUiBMRVMgRk9OVCBBV0VTT01FIFBPVVIgTCdJQ09OT0dSQVBISUVcbnJlcXVpcmUoJy4uLy4uL3B1YmxpYy9mb250YXdlc29tZS9jc3MvYWxsLm1pbi5jc3MnKTtcbi8vIENTUyBEVSBLT0hJTk9TXG5yZXF1aXJlKCcuLi9jc3MvYXBwLmNzcycpO1xuLy8gVEhFTUUgQk9PVFNUUkFQIC8gQk9PVFNXQVRDSCArIENPTkZJR1VSQVRJT04gR0xPQkFMRSAoQ09VTEVVUlMsIEZPTlRTLi4uKVxucmVxdWlyZSgnLi4vY3NzL2dsb2JhbC5zY3NzJyk7XG5cbi8vIE5lZWQgalF1ZXJ5PyBJbnN0YWxsIGl0IHdpdGggXCJ5YXJuIGFkZCBqcXVlcnlcIiwgdGhlbiB1bmNvbW1lbnQgdG8gcmVxdWlyZSBpdC5cbi8vIHJlcXVpcmUgalF1ZXJ5IG5vcm1hbGx5XG5jb25zdCAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XG5cbi8vIGNyZWF0ZSBnbG9iYWwgJCBhbmQgalF1ZXJ5IHZhcmlhYmxlc1xuZ2xvYmFsLiQgPSBnbG9iYWwualF1ZXJ5ID0gJDtcblxuLy8gSlMgaXMgZXF1aXZhbGVudCB0byAgdGhlIG5vcm1hbCBcImJvb3RzdHJhcFwiIHBhY2thZ2Vcbi8vIG5vIG5lZWQgdG8gc2V0IHRoaXMgdG8gYSB2YXJpYWJsZSwganVzdCByZXF1aXJlIGl0XG4vLyByZXF1aXJlKCdwb3BwZXIuanMvZGlzdC9wb3BwZXIuanMnKTtcbnJlcXVpcmUoJ2Jvb3RzdHJhcCcpO1xuXG5yZXF1aXJlKCcuLi9jc3MvY29tbW9uLmNzcycpO1xuLy8gQk9PVFNUUkFQIHBsdWdpbnNcbnJlcXVpcmUoJ2Jvb3RzdHJhcC1zbGlkZXInKVxucmVxdWlyZSgnYm9vdHN0cmFwLXNsaWRlci9kaXN0L2Nzcy9ib290c3RyYXAtc2xpZGVyLm1pbi5jc3MnKVxuXG4vLyBAVE9ETyA6IG1ha2UgYm9vc3RyYXAtZGF0ZXBpY2tlciB3b3JrcyAhIVxuLy8gcmVxdWlyZSgnYm9vdHN0cmFwLWRhdGVwaWNrZXItd2VicGFjaycpXG4vLyByZXF1aXJlKCdib290c3RyYXAtZGF0ZXBpY2tlci13ZWJwYWNrL2Rpc3QvY3NzL2Jvb3RzdHJhcC1kYXRlcGlja2VyMy5taW4uY3NzJylcbi8vIHJlcXVpcmUoJy4uLy4uL3B1YmxpYy9idW5kbGVzL3NvbmF0YWNvcmUvdmVuZG9yL21vbWVudC9taW4vbW9tZW50LXdpdGgtbG9jYWxlcy5taW4uanMnKTtcbi8vIHJlcXVpcmUoJy4uLy4uL3B1YmxpYy9idW5kbGVzL3NvbmF0YWNvcmUvdmVuZG9yL2VvbmFzZGFuLWJvb3RzdHJhcC1kYXRldGltZXBpY2tlci9idWlsZC9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzJyk7XG4vLyByZXF1aXJlKCcuLi8uLi9wdWJsaWMvYnVuZGxlcy9zb25hdGFjb3JlL3ZlbmRvci9lb25hc2Rhbi1ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvYnVpbGQvY3NzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci5taW4uY3NzJyk7XG5cbi8vIGxlYWZ0bGV0IDogZm9yIG9wZW5zdHJlZXRtYXBcbnJlcXVpcmUoJy4uL2xlYWZsZXQvbGVhZmxldC5qcycpO1xuLy8gZm9yIGZsYXNoIG1lc3NhZ2Ugbm90aWZpY2F0aW9uXG5yZXF1aXJlKCcuLi9qcy9mbGFzaC1tZXNzYWdlcy5qcycpO1xuXG5yZXF1aXJlKCcuLi9qcy9nZW9sb2MuanMnKTtcblxuJCgnI2ZsYXNoLW1lc3NhZ2VzJykuZmxhc2hOb3RpZmljYXRpb24oJ2luaXQnKTtcblxudmFyICRjb2xsZWN0aW9uSG9sZGVyO1xuLy8gc2V0dXAgYW4gXCJhZGQgYSBncm91cGUgcHJlc3RhIChtYXJjaMOpIGFtYXBcIiBsaW5rXG52YXIgJGFkZEdyb3VwZUJ1dHRvbiA9ICQoJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYWRkX2dyb3VwZV9saW5rXCI+PGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4gQWpvdXRlciBBTUFQIC8gTWFyY2jDqTwvYnV0dG9uPicpO1xudmFyICRuZXdMaW5rTGkgPSAkKCc8cCBjbGFzcz1cInJvdyBteC0yXCI+PC9wPicpLmFwcGVuZCgkYWRkR3JvdXBlQnV0dG9uKTtcbnZhciAkYWRkR2VvbG9jQnV0dG9uID0gJCgnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBhZGRfZ3JvdXBlX2xpbmtcIj48aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiBBam91dGVyIEFkcmVzc2U8L2J1dHRvbj4nKTtcbnZhciAkbmV3TGlua0xpR2VvbG9jID0gJCgnPHAgY2xhc3M9XCJyb3cgbXgtMlwiPjwvcD4nKS5hcHBlbmQoJGFkZEdlb2xvY0J1dHRvbik7XG5cbi8qICovXG5mdW5jdGlvbiBhZGRHcm91cGVGb3JtKCRjb2xsZWN0aW9uSG9sZGVyLCAkbmV3TGlua0xpKSB7XG4gICAgLy8gR2V0IHRoZSBkYXRhLXByb3RvdHlwZSBleHBsYWluZWQgZWFybGllclxuICAgIHZhciBwcm90b3R5cGUgPSAkY29sbGVjdGlvbkhvbGRlci5kYXRhKCdwcm90b3R5cGUnKTtcblxuICAgIC8vIGdldCB0aGUgbmV3IGluZGV4XG4gICAgdmFyIGluZGV4ID0gJGNvbGxlY3Rpb25Ib2xkZXIuZGF0YSgnaW5kZXgnKTtcblxuICAgIC8vIFJlcGxhY2UgJ19fbmFtZV9fJyBpbiB0aGUgcHJvdG90eXBlJ3MgSFRNTCB0b1xuICAgIC8vIGluc3RlYWQgYmUgYSBudW1iZXIgYmFzZWQgb24gaG93IG1hbnkgaXRlbXMgd2UgaGF2ZVxuICAgIHZhciBuZXdGb3JtID0gcHJvdG90eXBlLnJlcGxhY2UoL19fbmFtZV9fL2csIGluZGV4KTtcblxuICAgIC8vIGluY3JlYXNlIHRoZSBpbmRleCB3aXRoIG9uZSBmb3IgdGhlIG5leHQgaXRlbVxuICAgICRjb2xsZWN0aW9uSG9sZGVyLmRhdGEoJ2luZGV4JywgaW5kZXggKyAxKTtcblxuICAgIC8vIERpc3BsYXkgdGhlIGZvcm0gaW4gdGhlIHBhZ2UgaW4gYW4gbGksIGJlZm9yZSB0aGUgXCJBZGQgYSBncm91cGVcIiBsaW5rIGxpXG4gICAgdmFyICRuZXdGb3JtTGkgPSAkKCc8cCBjbGFzcz1cInJvdyBteC0yXCI+PC9wPicpLmFwcGVuZChuZXdGb3JtKTtcbiAgICAkbmV3TGlua0xpLmJlZm9yZSgkbmV3Rm9ybUxpKTtcblxuICAgIC8vIGFkZCBhIGRlbGV0ZSBsaW5rIHRvIHRoZSBuZXcgZm9ybVxuICAgIGFkZEdyb3VwZUZvcm1EZWxldGVMaW5rKCRuZXdGb3JtTGkpO1xufVxuXG5mdW5jdGlvbiBhZGRHcm91cGVGb3JtRGVsZXRlTGluaygkdGFnRm9ybUxpKSB7XG4gICAgdmFyICRyZW1vdmVGb3JtQnV0dG9uID0gJCgnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjb2wtMyBidG4gYnRuLXdhcm5pbmdcIj5TdXBwcmltZXI8L2J1dHRvbj4nKTtcbiAgICAkdGFnRm9ybUxpLmFwcGVuZCgkcmVtb3ZlRm9ybUJ1dHRvbik7XG5cbiAgICAkcmVtb3ZlRm9ybUJ1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgbGkgZm9yIHRoZSB0YWcgZm9ybVxuICAgICAgICAkdGFnRm9ybUxpLnJlbW92ZSgpO1xuICAgIH0pO1xufVxuXG5cbi8qICovXG5mdW5jdGlvbiBhZGRHcm91cGVGb3JtR2VvbG9jKCRjb2xsZWN0aW9uSG9sZGVyR2VvbG9jLCAkbmV3TGlua0xpR2VvbG9jKSB7XG4gICAgLy8gR2V0IHRoZSBkYXRhLXByb3RvdHlwZSBleHBsYWluZWQgZWFybGllclxuICAgIHZhciBwcm90b3R5cGVHZW9sb2MgPSAkY29sbGVjdGlvbkhvbGRlckdlb2xvYy5kYXRhKCdwcm90b3R5cGUnKTtcblxuICAgIC8vIGdldCB0aGUgbmV3IGluZGV4XG4gICAgdmFyIGluZGV4R2VvbG9jID0gJGNvbGxlY3Rpb25Ib2xkZXJHZW9sb2MuZmluZCgnLmZvcm0tZ3JvdXAnKS5sZW5ndGg7XG5cbiAgICAvLyBSZXBsYWNlICdfX25hbWVfXycgaW4gdGhlIHByb3RvdHlwZSdzIEhUTUwgdG9cbiAgICAvLyBpbnN0ZWFkIGJlIGEgbnVtYmVyIGJhc2VkIG9uIGhvdyBtYW55IGl0ZW1zIHdlIGhhdmVcbiAgICB2YXIgbmV3Rm9ybUdlb2xvYyA9IHByb3RvdHlwZUdlb2xvYy5yZXBsYWNlKC9fX25hbWVfXy9nLCBpbmRleEdlb2xvYyk7XG5cbiAgICAvLyBpbmNyZWFzZSB0aGUgaW5kZXggd2l0aCBvbmUgZm9yIHRoZSBuZXh0IGl0ZW1cbiAgICAkY29sbGVjdGlvbkhvbGRlckdlb2xvYy5kYXRhKCdpbmRleCcsIGluZGV4R2VvbG9jICsgMSk7XG5cbiAgICAvLyBEaXNwbGF5IHRoZSBmb3JtIGluIHRoZSBwYWdlIGluIGFuIGxpLCBiZWZvcmUgdGhlIFwiQWRkIGEgZ3JvdXBlXCIgbGluayBsaVxuICAgIHZhciAkbmV3Rm9ybUxpR2VvbG9jID0gJCgnPHA+PC9wPicpLmFwcGVuZChuZXdGb3JtR2VvbG9jKTtcbiAgICAkbmV3TGlua0xpR2VvbG9jLmJlZm9yZSgkbmV3Rm9ybUxpR2VvbG9jKTtcblxuICAgIC8vIGFkZCBhIGRlbGV0ZSBsaW5rIHRvIHRoZSBuZXcgZm9ybVxuICAgIGFkZEdyb3VwZUZvcm1EZWxldGVMaW5rR2VvbG9jKCRuZXdGb3JtTGlHZW9sb2MpO1xufVxuXG5mdW5jdGlvbiBhZGRHcm91cGVGb3JtRGVsZXRlTGlua0dlb2xvYygkdGFnRm9ybUxpR2VvbG9jKSB7XG4gICAgdmFyICRyZW1vdmVGb3JtQnV0dG9uR2VvbG9jID0gJCgnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdhcm5pbmdcIj5TdXBwcmltZXI8L2J1dHRvbj4nKTtcbiAgICAkdGFnRm9ybUxpR2VvbG9jLmFwcGVuZCgkcmVtb3ZlRm9ybUJ1dHRvbkdlb2xvYyk7XG5cbiAgICAkcmVtb3ZlRm9ybUJ1dHRvbkdlb2xvYy5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgbGkgZm9yIHRoZSB0YWcgZm9ybVxuICAgICAgICAkdGFnRm9ybUxpR2VvbG9jLnJlbW92ZSgpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzaG93Q29uZmlybVRyYW5zYWN0aW9uTW9kYWwoZGl2LCBmb3JtLCBtb250YW50LCBkZXN0aW5hdGFpcmUgPSBudWxsKSB7XG4gIC8vIEdldCBtb2RhbFxuICB2YXIgbW9kYWwgPSAkKCcjY29uZmlybVRyYW5zYWN0aW9uTW9kYWwnKVxuXG4gIC8vIEdldCByZWxldmFudCBjb25maXJtYXRpb24gbWVzc2FnZSBkaXZcbiAgdmFyIG1lc3NhZ2UgPSBtb2RhbC5maW5kKGRpdilcblxuICAvLyBTZXQgZGF0YSBpbiBtb2RhbFxuICBtZXNzYWdlLmZpbmQoJy5tb250YW50X3RyYW5zYWN0aW9uJykudGV4dChtb250YW50KVxuICBpZiAoZGVzdGluYXRhaXJlICE9IG51bGwpIHtcbiAgICBtZXNzYWdlLmZpbmQoJy5ub21fZGVzdGluYXRhaXJlJykudGV4dChkZXN0aW5hdGFpcmUpXG4gIH1cblxuICAvLyBTaG93IG1vZGFsIGFuZCByZWxldmFudCBjb25maXJtYXRpb24gbWVzc2FnZVxuICBtb2RhbC5maW5kKGRpdikuc2hvdygpXG4gIG1vZGFsLm1vZGFsKCdzaG93JylcblxuICAvLyBCaW5kIG1vZGFsIHZhbGlkYXRpb24gYnV0dG9uIHdpdGggZm9ybSBzdWJtaXRpb25cbiAgJCgnI2NvbmZpcm1UcmFuc2FjdGlvbk1vZGFsICNjb25maXJtVHJhbnNhY3Rpb25CdXR0b24nKS5vZmYoKVxuICAkKCcjY29uZmlybVRyYW5zYWN0aW9uTW9kYWwgI2NvbmZpcm1UcmFuc2FjdGlvbkJ1dHRvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgIGZvcm0uc3VibWl0KClcbiAgfSk7XG59XG5cbmpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7XG5cdC8vIEdldCB0aGUgdWwgdGhhdCBob2xkcyB0aGUgY29sbGVjdGlvbiBvZiBncm91cGVzXG5cdCRjb2xsZWN0aW9uSG9sZGVyID0gJCgnLmdyb3VwZXByZXN0YXMnKTtcblxuXHQvLyBhZGQgYSBkZWxldGUgbGluayB0byBhbGwgb2YgdGhlIGV4aXN0aW5nIHRhZyBmb3JtIGxpIGVsZW1lbnRzXG4gICAgJGNvbGxlY3Rpb25Ib2xkZXIuZmluZCgnZGl2LmZvcm0tZ3JvdXAnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIFx0JCh0aGlzKS5hZGRDbGFzcygncm93IG14LTInKTtcbiAgICAgICAgYWRkR3JvdXBlRm9ybURlbGV0ZUxpbmsoJCh0aGlzKSk7XG4gICAgfSk7XG5cblx0Ly8gYWRkIHRoZSBcImFkZCBhIGdyb3VwZVwiIGFuY2hvciBhbmQgbGkgdG8gdGhlIGdyb3VwZXMgdWxcblx0JGNvbGxlY3Rpb25Ib2xkZXIuYXBwZW5kKCRuZXdMaW5rTGkpO1xuXG5cdC8vIGNvdW50IHRoZSBjdXJyZW50IGZvcm0gaW5wdXRzIHdlIGhhdmUgKGUuZy4gMiksIHVzZSB0aGF0IGFzIHRoZSBuZXdcblx0Ly8gaW5kZXggd2hlbiBpbnNlcnRpbmcgYSBuZXcgaXRlbSAoZS5nLiAyKVxuXHQkY29sbGVjdGlvbkhvbGRlci5kYXRhKCdpbmRleCcsICRjb2xsZWN0aW9uSG9sZGVyLmZpbmQoJzppbnB1dCcpLmxlbmd0aCk7XG5cblx0JGFkZEdyb3VwZUJ1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cdCAgICAvLyBhZGQgYSBuZXcgZ3JvdXBlIGZvcm0gKHNlZSBuZXh0IGNvZGUgYmxvY2spXG5cdCAgICBhZGRHcm91cGVGb3JtKCRjb2xsZWN0aW9uSG9sZGVyLCAkbmV3TGlua0xpKTtcblx0fSk7XG5cblx0Ly8gR2V0IHRoZSB1bCB0aGF0IGhvbGRzIHRoZSBjb2xsZWN0aW9uIG9mIGdyb3VwZXNcblx0JGNvbGxlY3Rpb25Ib2xkZXJHZW9sb2MgPSAkKCcuZ2VvbG9jcycpO1xuXG5cdC8vIGFkZCBhIGRlbGV0ZSBsaW5rIHRvIGFsbCBvZiB0aGUgZXhpc3RpbmcgdGFnIGZvcm0gbGkgZWxlbWVudHNcbiAgICAkY29sbGVjdGlvbkhvbGRlckdlb2xvYy5maW5kKCdsaScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZEdyb3VwZUZvcm1EZWxldGVMaW5rR2VvbG9jKCQodGhpcykpO1xuICAgIH0pO1xuXG5cdC8vIGFkZCB0aGUgXCJhZGQgYSBncm91cGVcIiBhbmNob3IgYW5kIGxpIHRvIHRoZSBncm91cGVzIHVsXG5cdCRjb2xsZWN0aW9uSG9sZGVyR2VvbG9jLmFwcGVuZCgkbmV3TGlua0xpR2VvbG9jKTtcblxuXHQvLyBjb3VudCB0aGUgY3VycmVudCBmb3JtIGlucHV0cyB3ZSBoYXZlIChlLmcuIDIpLCB1c2UgdGhhdCBhcyB0aGUgbmV3XG5cdC8vIGluZGV4IHdoZW4gaW5zZXJ0aW5nIGEgbmV3IGl0ZW0gKGUuZy4gMilcblx0JGNvbGxlY3Rpb25Ib2xkZXJHZW9sb2MuZGF0YSgnaW5kZXgnLCAkY29sbGVjdGlvbkhvbGRlckdlb2xvYy5maW5kKCc6aW5wdXQnKS5sZW5ndGgpO1xuXG5cdCRhZGRHZW9sb2NCdXR0b24ub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXHQgICAgLy8gYWRkIGEgbmV3IGdyb3VwZSBmb3JtIChzZWUgbmV4dCBjb2RlIGJsb2NrKVxuXHQgICAgYWRkR3JvdXBlRm9ybUdlb2xvYygkY29sbGVjdGlvbkhvbGRlckdlb2xvYywgJG5ld0xpbmtMaUdlb2xvYyk7XG5cdH0pO1xuXG5cdC8vIEJPT1RTVFJBUCBUT09MVElQU1xuXHQkKCdbZGF0YS10b2dnbGU9XCJ0b29sdGlwXCJdJykudG9vbHRpcCgpXG5cbiAgJChcImlucHV0OnJhZGlvW25hbWU9J2Zvcm1BY2hhdE1vbm5haWVBZGhlcmVudFttb250YW50cmFkaW9dJ11cIikuY2hhbmdlKGZ1bmN0aW9uKCkge1xuICAgIHZhciBteVNsaWRlciA9ICQoXCJpbnB1dC5hY2hhdG1vbm5haWUtbW9udGFudC1zbGlkZXJcIikuc2xpZGVyKCk7XG5cbiAgICAvLyBTZXQgc2xpZGVyIHZhbHVlIGxpa2UgcmFkaW8gd2hlbiByYWRpbyBjaGFuZ2VzXG4gIFx0bXlTbGlkZXIuc2xpZGVyKCdzZXRWYWx1ZScsIHRoaXMudmFsdWUpXG5cbiAgICAkKFwic3Bhbi5hY2hhdF9tb25uYWllX21vbnRhbnRfY2hvaXNpXCIpLnRleHQodGhpcy52YWx1ZSArICcg4oKsJylcbiAgfSk7XG5cbiAgJCgnaW5wdXQuYWNoYXRtb25uYWllLW1vbnRhbnQtc2xpZGVyJykuc2xpZGVyKCkub24oJ2NoYW5nZScsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgIHZhciB2YWx1ZSA9IGV2ZW50LnZhbHVlLm5ld1ZhbHVlO1xuXG4gICAgICAkKFwic3Bhbi5hY2hhdF9tb25uYWllX21vbnRhbnRfY2hvaXNpXCIpLnRleHQodmFsdWUgKyAnIOKCrCcpXG4gIH0pO1xuXG4gICQoJy50cmFuc2FjdGlvblN1Ym1pdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgICAgLy8gU3RvcCBmb3JtIHN1Ym1pdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgZm9ybSA9IHRoaXMuY2xvc2VzdCgnZm9ybScpXG4gICAgICBpZiAoZm9ybS5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgLy8gR2V0IGRlc3RpbmF0YWlyZSB0eXBlIDogcHJlc3RhIG9yIGFkaGVyZW50XG4gICAgICAgIHZhciBkZXN0aW5hdGFpcmVfdHlwZSA9ICQoJyMnICsgZm9ybS5uYW1lICsgJ19kZXN0aW5hdGFpcmVUeXBlJylbMF0udmFsdWVcbiAgICAgICAgaWYgKGRlc3RpbmF0YWlyZV90eXBlID09ICdwcmVzdGF0YWlyZScpIHtcbiAgICAgICAgICB2YXIgZGl2ID0gJy5jb25maXJtVHJhbnNhY3Rpb25QcmVzdGF0YWlyZSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgZGl2ID0gJy5jb25maXJtVHJhbnNhY3Rpb25BZGhlcmVudCdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBkZXN0aW5hdGFpcmVcbiAgICAgICAgdmFyIGRlc3RpbmF0YWlyZV9zZWxlY3QgPSAkKCcjJyArIGZvcm0ubmFtZSArICdfZGVzdGluYXRhaXJlJylbMF1cbiAgICAgICAgdmFyIGRlc3RpbmF0YWlyZV9uYW1lID0gZGVzdGluYXRhaXJlX3NlbGVjdC5vcHRpb25zW2Rlc3RpbmF0YWlyZV9zZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dFxuXG4gICAgICAgIC8vIEdldCBtb250YW50XG4gICAgICAgIHZhciBtb250YW50X2ZpZWxkID0gJCgnIycgKyBmb3JtLm5hbWUgKyAnX21vbnRhbnQnKVswXVxuICAgICAgICB2YXIgbW9udGFudF92YWx1ZSA9IG1vbnRhbnRfZmllbGQudmFsdWVcblxuICAgICAgICBzaG93Q29uZmlybVRyYW5zYWN0aW9uTW9kYWwoZGl2LCBmb3JtLCBtb250YW50X3ZhbHVlLCBkZXN0aW5hdGFpcmVfbmFtZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBzeW1mb255IHZhbGlkYXRpb25cbiAgICAgICAgZm9ybS5zdWJtaXQoKVxuICAgICAgfVxuICB9KTtcblxuICAkKCcuY290aXNhdGlvbk1MQ1N1Ym1pdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgICAgLy8gU3RvcCBmb3JtIHN1Ym1pdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgZm9ybSA9IHRoaXMuY2xvc2VzdCgnZm9ybScpXG5cbiAgICAgIC8vIFNldCBmb3JtIG1veWVuXG4gICAgICAkKCcjJyArIGZvcm0ubmFtZSArICdfbW95ZW4nKVswXS52YWx1ZSA9ICdtbGMnXG5cbiAgICAgIGlmIChmb3JtLmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICB2YXIgZGl2ID0gJy5jb25maXJtQ290aXNhdGlvbidcblxuICAgICAgICAvLyBHZXQgbW9udGFudFxuICAgICAgICB2YXIgbW9udGFudF9maWVsZCA9ICQoJyMnICsgZm9ybS5uYW1lICsgJ19tb250YW50JylbMF1cbiAgICAgICAgdmFyIG1vbnRhbnRfdmFsdWUgPSBtb250YW50X2ZpZWxkLnZhbHVlXG5cbiAgICAgICAgc2hvd0NvbmZpcm1UcmFuc2FjdGlvbk1vZGFsKGRpdiwgZm9ybSwgbW9udGFudF92YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBzeW1mb255IHZhbGlkYXRpb25cbiAgICAgICAgZm9ybS5zdWJtaXQoKVxuICAgICAgfVxuICB9KTtcbiAgJCgnLmNvdGlzYXRpb25DQlN1Ym1pdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgICAgdmFyIGZvcm0gPSB0aGlzLmNsb3Nlc3QoJ2Zvcm0nKVxuXG4gICAgICAvLyBTZXQgZm9ybSBtb3llblxuICAgICAgJCgnIycgKyBmb3JtLm5hbWUgKyAnX21veWVuJylbMF0udmFsdWUgPSAnY2InXG4gIH0pO1xuXG4gICQoXCJpbnB1dDpyYWRpb1tuYW1lPSdmb3JtQWNoYXRNb25uYWllQUNvbmZpcm1lckFkaGVyZW50W21veWVuXSddXCIpLmNoYW5nZShmdW5jdGlvbigpIHtcbiAgICBpZiAoJChcIiNkZW1hbmRlX2FjaGF0X3RleHRfXCIrdGhpcy52YWx1ZSkubGVuZ3RoKSB7XG4gICAgICAkKFwiLmRlbWFuZGVfYWNoYXRfdGV4dFwiKS5oaWRlKCk7XG4gICAgICAkKFwiI2RlbWFuZGVfYWNoYXRfdGV4dF9cIit0aGlzLnZhbHVlKS5zaG93KCk7XG4gICAgfVxuICB9KTtcblxuICAkKFwiaW5wdXQ6cmFkaW9bbmFtZT0nZm9ybUFjaGF0TW9ubmFpZUFDb25maXJtZXJQcmVzdGF0YWlyZVttb3llbl0nXVwiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7XG4gICAgaWYgKCQoXCIjZGVtYW5kZV9hY2hhdF90ZXh0X1wiK3RoaXMudmFsdWUpLmxlbmd0aCkge1xuICAgICAgJChcIi5kZW1hbmRlX2FjaGF0X3RleHRcIikuaGlkZSgpO1xuICAgICAgJChcIiNkZW1hbmRlX2FjaGF0X3RleHRfXCIrdGhpcy52YWx1ZSkuc2hvdygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gJCgnLmpzLWRhdGVwaWNrZXInKS5kYXRlcGlja2VyKHtcbiAgLy8gICAgIGNsb3NlVGV4dDogJ0Zlcm1lcicsXG4gIC8vICAgICBwcmV2VGV4dDogJyYjeDNjO1Byw6ljJyxcbiAgLy8gICAgIG5leHRUZXh0OiAnU3VpdiYjeDNlOycsXG4gIC8vICAgICBjdXJyZW50VGV4dDogJ0F1am91cmRcXCdodWknLFxuICAvLyAgICAgbW9udGhOYW1lczogWydKYW52aWVyJywnRmV2cmllcicsJ01hcnMnLCdBdnJpbCcsJ01haScsJ0p1aW4nLFxuICAvLyAgICAgJ0p1aWxsZXQnLCdBb3V0JywnU2VwdGVtYnJlJywnT2N0b2JyZScsJ05vdmVtYnJlJywnRGVjZW1icmUnXSxcbiAgLy8gICAgIG1vbnRoTmFtZXNTaG9ydDogWydKYW4nLCdGZXYnLCdNYXInLCdBdnInLCdNYWknLCdKdW4nLFxuICAvLyAgICAgJ0p1bCcsJ0FvdScsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddLFxuICAvLyAgICAgZGF5TmFtZXM6IFsnRGltYW5jaGUnLCdMdW5kaScsJ01hcmRpJywnTWVyY3JlZGknLCdKZXVkaScsJ1ZlbmRyZWRpJywnU2FtZWRpJ10sXG4gIC8vICAgICBkYXlOYW1lc1Nob3J0OiBbJ0RpbScsJ0x1bicsJ01hcicsJ01lcicsJ0pldScsJ1ZlbicsJ1NhbSddLFxuICAvLyAgICAgZGF5TmFtZXNNaW46IFsnRGknLCdMdScsJ01hJywnTWUnLCdKZScsJ1ZlJywnU2EnXSxcbiAgLy8gICAgIHdlZWtIZWFkZXI6ICdTbScsXG4gIC8vICAgICBkYXRlRm9ybWF0OiAneXktbW0tZGQnLFxuICAvLyAgICAgZm9ybWF0OiAneXl5eS1tbS1kZCcsXG4gIC8vICAgICBmaXJzdERheTogMSxcbiAgLy8gICAgIGlzUlRMOiBmYWxzZSxcbiAgLy8gICAgIHNob3dNb250aEFmdGVyWWVhcjogZmFsc2UsXG4gIC8vICAgICB5ZWFyU3VmZml4OiAnJyxcbiAgLy8gICAgIG1pbkRhdGU6IDAsXG4gIC8vICAgICBtYXhEYXRlOiAnKzEyTSArMEQnLFxuICAvLyAgICAgbnVtYmVyT2ZNb250aHM6IDIsXG4gIC8vICAgICBzaG93QnV0dG9uUGFuZWw6IHRydWVcbiAgLy8gfSk7XG5cbn0pOyIsIi8qIEpBVkFTQ1JJUFQgUEVSTUVUVEFOVCBMJ0FGRklDSEFHRSBERSBNRVNTQUdFIEZMQVNIIC8gTk9USUZJQ0FUSU9OICovXG4oZnVuY3Rpb24oJCkge1xuICAgIHZhciBtZXRob2RzID0ge1xuICAgICAgICBpbml0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBtZXRob2RzLnNldHRpbmdzID0gJC5leHRlbmQoe30sICQuZm4uZmxhc2hOb3RpZmljYXRpb24uZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkKCcuYWxlcnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coJ3Nsb3cnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlbGF5KG1ldGhvZHMuc2V0dGluZ3MuaGlkZURlbGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoJ2Zhc3QnKVxuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICA1MDBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG1ldGhvZHMubGlzdGVuSW5jb21pbmdNZXNzYWdlcygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW4gdG8gQUpBWCByZXNwb25zZXMgYW5kIGRpc3BsYXkgbWVzc2FnZXMgaWYgdGhleSBjb250YWluIHNvbWVcbiAgICAgICAgICovXG4gICAgICAgIGxpc3RlbkluY29taW5nTWVzc2FnZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJChkb2N1bWVudCkuYWpheENvbXBsZXRlKGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAkLnBhcnNlSlNPTih4aHIucmVzcG9uc2VUZXh0KTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IGRhdGEubWVzc2FnZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVzc2FnZXMuZXJyb3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzLmFkZEVycm9yKG1lc3NhZ2VzLmVycm9yW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlcy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVzc2FnZXMuc3VjY2Vzcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkU3VjY2VzcyhtZXNzYWdlcy5zdWNjZXNzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlcy5pbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVzc2FnZXMuaW5mby5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkSW5mbyhtZXNzYWdlcy5pbmZvW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFkZFN1Y2Nlc3M6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhciBmbGFzaE1lc3NhZ2VFbHQgPSBtZXRob2RzLmdldEJhc2ljRmxhc2gobWVzc2FnZSkuYWRkQ2xhc3MoJ2FsZXJ0LXN1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgbWV0aG9kcy5hZGRUb0xpc3QoZmxhc2hNZXNzYWdlRWx0KTtcbiAgICAgICAgICAgIG1ldGhvZHMuZGlzcGxheShmbGFzaE1lc3NhZ2VFbHQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEVycm9yOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgICAgICB2YXIgZmxhc2hNZXNzYWdlRWx0ID0gbWV0aG9kcy5nZXRCYXNpY0ZsYXNoKG1lc3NhZ2UpLmFkZENsYXNzKCdhbGVydC1lcnJvcicpO1xuXG4gICAgICAgICAgICBtZXRob2RzLmFkZFRvTGlzdChmbGFzaE1lc3NhZ2VFbHQpO1xuICAgICAgICAgICAgbWV0aG9kcy5kaXNwbGF5KGZsYXNoTWVzc2FnZUVsdCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkSW5mbzogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGZsYXNoTWVzc2FnZUVsdCA9IG1ldGhvZHMuZ2V0QmFzaWNGbGFzaChtZXNzYWdlKS5hZGRDbGFzcygnYWxlcnQtaW5mbycpO1xuXG4gICAgICAgICAgICBtZXRob2RzLmFkZFRvTGlzdChmbGFzaE1lc3NhZ2VFbHQpO1xuICAgICAgICAgICAgbWV0aG9kcy5kaXNwbGF5KGZsYXNoTWVzc2FnZUVsdCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0QmFzaWNGbGFzaDogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGZsYXNoTWVzc2FnZUVsdCA9ICQoJzxkaXY+PC9kaXY+JylcbiAgICAgICAgICAgICAgICAuaGlkZSgpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhbGVydCcpXG4gICAgICAgICAgICAgICAgLmFwcGVuZChtZXRob2RzLmdldENsb3NlQnV0dG9uKCkpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8ZGl2PjwvZGl2PicpLmh0bWwobWVzc2FnZSkpXG4gICAgICAgICAgICA7XG5cbiAgICAgICAgICAgIHJldHVybiBmbGFzaE1lc3NhZ2VFbHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0Q2xvc2VCdXR0b246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNsb3NlQnV0dG9uRWx0ID0gJCgnPGJ1dHRvbj48L2J1dHRvbj4nKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnY2xvc2UnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWRpc21pc3MnLCAnYWxlcnQnKVxuICAgICAgICAgICAgICAgIC5odG1sKCcmdGltZXMnKVxuICAgICAgICAgICAgO1xuXG4gICAgICAgICAgICByZXR1cm4gY2xvc2VCdXR0b25FbHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkVG9MaXN0OiBmdW5jdGlvbihmbGFzaE1lc3NhZ2VFbHQpIHtcbiAgICAgICAgICAgIGZsYXNoTWVzc2FnZUVsdC5hcHBlbmRUbygkKCcjZmxhc2gtbWVzc2FnZXMnKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzcGxheTogZnVuY3Rpb24oZmxhc2hNZXNzYWdlRWx0KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBmbGFzaE1lc3NhZ2VFbHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCdzbG93JylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWxheShtZXRob2RzLnNldHRpbmdzLmhpZGVEZWxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCdmYXN0JywgZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKVxuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICA1MDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgJC5mbi5mbGFzaE5vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAvLyBNZXRob2QgY2FsbGluZyBsb2dpY1xuICAgICAgICBpZiAobWV0aG9kc1ttZXRob2RdKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kc1sgbWV0aG9kIF0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ29iamVjdCcgfHwgISBtZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXRob2RzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQuZXJyb3IoJ01ldGhvZCAnICsgIG1ldGhvZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmZsYXNoTm90aWZpY2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgJC5mbi5mbGFzaE5vdGlmaWNhdGlvbi5kZWZhdWx0cyA9IHtcbiAgICAgICAgJ2hpZGVEZWxheScgICAgICAgICA6IDEwMDAwLFxuICAgICAgICAnYXV0b0hpZGUnICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgJ2FuaW1hdGUnICAgICAgICAgICA6IHRydWVcbiAgICB9O1xufSkoalF1ZXJ5KTsiLCJyZXF1aXJlKCcuLi9sZWFmbGV0L2xlYWZsZXQuanMnKTtcbnJlcXVpcmUoJy4uL2pzL2ZsYXNoLW1lc3NhZ2VzLmpzJyk7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkge1xuXHR2YXIgbWFwTWFya2VycyA9IFtdO1xuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLnNlYXJjaExhdExvbicsIGZ1bmN0aW9uIChlKSB7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgdmFyIHNlbGYgPSAkKHRoaXMpO1xuXHQgICAgJC5hamF4KHtcblx0ICAgICAgICB1cmwgOiBzZWxmLmRhdGEoJ3VybCcpLFxuXHQgICAgICAgIHR5cGU6ICdwb3N0Jyxcblx0ICAgICAgICBkYXRhIDogeydhZHJlc3NlJyA6ICQoJyMnKyhzZWxmLmF0dHIoJ2lkJykucmVwbGFjZSgnX2dlb2xvY19zZWFyY2gnLCAnJykpKydfZ2VvbG9jX2FkcmVzc2UnKS52YWwoKSwgJ2Nwb3N0YWwnIDogJCgnIycrKHNlbGYuYXR0cignaWQnKS5yZXBsYWNlKCdfZ2VvbG9jX3NlYXJjaCcsICcnKSkrJ19nZW9sb2NfY3Bvc3RhbCcpLnZhbCgpLCAndmlsbGUnIDogJCgnIycrKHNlbGYuYXR0cignaWQnKS5yZXBsYWNlKCdfZ2VvbG9jX3NlYXJjaCcsICcnKSkrJ19nZW9sb2NfdmlsbGUnKS52YWwoKX0sXG5cdCAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0ICAgICAgICBcdHZhciBkaXZpZCA9IHNlbGYuYXR0cignaWQnKS5yZXBsYWNlKCdfZ2VvbG9jX3NlYXJjaCcsICcnKTtcblx0ICAgICAgICBcdCQoJyMnK2RpdmlkKydfbWVzc2FnZScpLnJlbW92ZSgpO1xuXHQgICAgICAgIFx0JCgnIycrZGl2aWQrJ19tYXAnKS5yZW1vdmUoKTtcblx0ICAgICAgICBcdHZhciBtYXJrZXJfMSA9IG51bGw7XG5cdCAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PSAnc3VjY2VzcycgJiYgcmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLmxhdCAhPSAnJyAmJiByZXNwb25zZS5kYXRhLmxvbiAhPSAnJykge1xuXHQgICAgICAgICAgICBcdCQoJyMnK2RpdmlkKydfZ2VvbG9jX2xhdCcpLnZhbChyZXNwb25zZS5kYXRhLmxhdCk7XG5cdCAgICAgICAgICAgIFx0JCgnIycrZGl2aWQrJ19nZW9sb2NfbG9uJykudmFsKHJlc3BvbnNlLmRhdGEubG9uKTtcblx0ICAgICAgICAgICAgICAgICQoJyMnK2RpdmlkKydfZ2VvbG9jX2xhdCcpLmFkZENsYXNzKCdpbnB1dHN1Y2Nlc3MnKTtcblx0ICAgICAgICAgICAgICAgICQoJyMnK2RpdmlkKydfZ2VvbG9jX2xvbicpLmFkZENsYXNzKCdpbnB1dHN1Y2Nlc3MnKTtcblx0ICAgICAgICAgICAgICAgICQoJzxwIGlkPVwiJysoZGl2aWQrJ19tZXNzYWdlJykrJ1wiPkNsaXF1ZXogc3VyIGxhIGNhcnRlIHNpIHZvdXMgdm91bGV6IGFmZmluZXIgbGEgZ8Opb2xvY2FsaXNhdGlvbjwvcD48ZGl2IGlkPVwiJysoZGl2aWQrJ19tYXAnKSsnXCIgc3R5bGU9XCJoZWlnaHQ6IDI1MHB4O21hcmdpbi10b3A6IDEwcHg7XCI+PC9kaXY+JykuaW5zZXJ0QWZ0ZXIoJyMnK3NlbGYuYXR0cignaWQnKSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgbGF0bG9uID0gTC5sYXRMbmcocGFyc2VGbG9hdChyZXNwb25zZS5kYXRhLmxhdCksIHBhcnNlRmxvYXQocmVzcG9uc2UuZGF0YS5sb24pKTtcblx0ICAgICAgICAgICAgICAgIHZhciBteW1hcCA9IEwubWFwKGRpdmlkKydfbWFwJykuc2V0VmlldyhsYXRsb24sIDEzKTtcblx0XHRcdFx0XHRMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLmZyL29zbWZyL3t6fS97eH0ve3l9LnBuZycsIHttYXhab29tOiAxOCwgYXR0cmlidXRpb246ICcmY29weTsgT3BlbnN0cmVldG1hcCBGcmFuY2UgfCAmY29weTsgPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycyd9KS5hZGRUbyhteW1hcCk7XG5cdFx0XHRcdFx0dmFyIG1hcmtlcl8xID0gTC5tYXJrZXIobGF0bG9uKS5hZGRUbyhteW1hcCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdpbnB1dGVycm9yJyk7XG5cdCAgICAgICAgICAgICAgICAkKCc8cCBpZD1cIicrKGRpdmlkKydfbWVzc2FnZScpKydcIj5BRFJFU1NFIElOQ09OTlVFIDogQ2xpcXVleiBzdXIgbGEgY2FydGUgcG91ciBkw6lmaW5pciB1bmUgYWRyZXNzZTwvcD48ZGl2IGlkPVwiJysoZGl2aWQrJ19tYXAnKSsnXCIgc3R5bGU9XCJoZWlnaHQ6IDI1MHB4O21hcmdpbi10b3A6IDEwcHg7XCI+PC9kaXY+JykuaW5zZXJ0QWZ0ZXIoJyMnK3NlbGYuYXR0cignaWQnKSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgbXltYXAgPSBMLm1hcChkaXZpZCsnX21hcCcpLnNldFZpZXcoSlNPTi5wYXJzZSgkKCcja29oX21hcF9jZW50ZXInKS52YWwoKSksIHBhcnNlSW50KCQoJyNrb2hfbWFwX3pvb20nKS52YWwoKSkpO1xuXHQgICAgICAgICAgICAgICAgTC50aWxlTGF5ZXIoJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5mci9vc21mci97en0ve3h9L3t5fS5wbmcnLCB7bWF4Wm9vbTogMTgsIGF0dHJpYnV0aW9uOiAnJmNvcHk7IE9wZW5zdHJlZXRtYXAgRnJhbmNlIHwgJmNvcHk7IDxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnfSkuYWRkVG8obXltYXApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG15bWFwLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHRcdGlmIChtYXJrZXJfMSAhPSBudWxsKSB7XG5cdFx0XHRcdFx0XHRteW1hcC5yZW1vdmVMYXllcihtYXJrZXJfMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtYXBNYXJrZXJzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHQgICAgbXltYXAucmVtb3ZlTGF5ZXIobWFwTWFya2Vyc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQgICAgLy8gQWRkIG1hcmtlciB0byBtYXAgYXQgY2xpY2sgbG9jYXRpb247IGFkZCBwb3B1cCB3aW5kb3dcblx0XHRcdFx0ICAgIHZhciBuZXdNYXJrZXIgPSBuZXcgTC5tYXJrZXIoZS5sYXRsbmcpO1xuXHRcdFx0XHQgICAgbmV3TWFya2VyLmFkZFRvKG15bWFwKTtcblx0XHRcdFx0ICAgIG1hcE1hcmtlcnMucHVzaChuZXdNYXJrZXIpO1xuXHRcdFx0XHQgICAgJCgnIycrZGl2aWQrJ19nZW9sb2NfbGF0JykudmFsKGUubGF0bG5nLmxhdCk7XG5cdFx0XHRcdCAgICAkKCcjJytkaXZpZCsnX2dlb2xvY19sb24nKS52YWwoZS5sYXRsbmcubG5nKTtcblx0XHRcdFx0ICAgICQoJyMnK2RpdmlkKydfZ2VvbG9jX2xhdCcpLmFkZENsYXNzKCdpbnB1dHN1Y2Nlc3MnKTtcblx0XHRcdFx0ICAgICQoJyMnK2RpdmlkKydfZ2VvbG9jX2xvbicpLmFkZENsYXNzKCdpbnB1dHN1Y2Nlc3MnKTtcblx0XHRcdFx0fSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0pO1xufSk7IiwiLyogQHByZXNlcnZlXG4gKiBMZWFmbGV0IDEuNC4wK0RldGFjaGVkOiAzMzM3ZjM2ZDJhMmQyYjMzOTQ2Nzc5MDU3NjE5YjMxZjY3NGZmNWRjLjMzMzdmMzYsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4gaHR0cDovL2xlYWZsZXRqcy5jb21cbiAqIChjKSAyMDEwLTIwMTggVmxhZGltaXIgQWdhZm9ua2luLCAoYykgMjAxMC0yMDExIENsb3VkTWFkZVxuICovXG4hZnVuY3Rpb24odCxpKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9pKGV4cG9ydHMpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wiZXhwb3J0c1wiXSxpKTppKHQuTD17fSl9KHRoaXMsZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaSh0KXt2YXIgaSxlLG4sbztmb3IoZT0xLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKXtvPWFyZ3VtZW50c1tlXTtmb3IoaSBpbiBvKXRbaV09b1tpXX1yZXR1cm4gdH1mdW5jdGlvbiBlKHQsaSl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlO2lmKHQuYmluZClyZXR1cm4gdC5iaW5kLmFwcGx5KHQsZS5jYWxsKGFyZ3VtZW50cywxKSk7dmFyIG49ZS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShpLG4ubGVuZ3RoP24uY29uY2F0KGUuY2FsbChhcmd1bWVudHMpKTphcmd1bWVudHMpfX1mdW5jdGlvbiBuKHQpe3JldHVybiB0Ll9sZWFmbGV0X2lkPXQuX2xlYWZsZXRfaWR8fCsrZWksdC5fbGVhZmxldF9pZH1mdW5jdGlvbiBvKHQsaSxlKXt2YXIgbixvLHMscjtyZXR1cm4gcj1mdW5jdGlvbigpe249ITEsbyYmKHMuYXBwbHkoZSxvKSxvPSExKX0scz1mdW5jdGlvbigpe24/bz1hcmd1bWVudHM6KHQuYXBwbHkoZSxhcmd1bWVudHMpLHNldFRpbWVvdXQocixpKSxuPSEwKX19ZnVuY3Rpb24gcyh0LGksZSl7dmFyIG49aVsxXSxvPWlbMF0scz1uLW87cmV0dXJuIHQ9PT1uJiZlP3Q6KCh0LW8pJXMrcyklcytvfWZ1bmN0aW9uIHIoKXtyZXR1cm4hMX1mdW5jdGlvbiBhKHQsaSl7dmFyIGU9TWF0aC5wb3coMTAsdm9pZCAwPT09aT82OmkpO3JldHVybiBNYXRoLnJvdW5kKHQqZSkvZX1mdW5jdGlvbiBoKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIGgodCkuc3BsaXQoL1xccysvKX1mdW5jdGlvbiBsKHQsaSl7dC5oYXNPd25Qcm9wZXJ0eShcIm9wdGlvbnNcIil8fCh0Lm9wdGlvbnM9dC5vcHRpb25zP2lpKHQub3B0aW9ucyk6e30pO2Zvcih2YXIgZSBpbiBpKXQub3B0aW9uc1tlXT1pW2VdO3JldHVybiB0Lm9wdGlvbnN9ZnVuY3Rpb24gYyh0LGksZSl7dmFyIG49W107Zm9yKHZhciBvIGluIHQpbi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChlP28udG9VcHBlckNhc2UoKTpvKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQodFtvXSkpO3JldHVybihpJiYtMSE9PWkuaW5kZXhPZihcIj9cIik/XCImXCI6XCI/XCIpK24uam9pbihcIiZcIil9ZnVuY3Rpb24gXyh0LGkpe3JldHVybiB0LnJlcGxhY2UobmksZnVuY3Rpb24odCxlKXt2YXIgbj1pW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKFwiTm8gdmFsdWUgcHJvdmlkZWQgZm9yIHZhcmlhYmxlIFwiK3QpO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJihuPW4oaSkpLG59KX1mdW5jdGlvbiBkKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXT09PWkpcmV0dXJuIGU7cmV0dXJuLTF9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gd2luZG93W1wid2Via2l0XCIrdF18fHdpbmRvd1tcIm1velwiK3RdfHx3aW5kb3dbXCJtc1wiK3RdfWZ1bmN0aW9uIG0odCl7dmFyIGk9K25ldyBEYXRlLGU9TWF0aC5tYXgoMCwxNi0oaS1yaSkpO3JldHVybiByaT1pK2Usd2luZG93LnNldFRpbWVvdXQodCxlKX1mdW5jdGlvbiBmKHQsaSxuKXtpZighbnx8YWkhPT1tKXJldHVybiBhaS5jYWxsKHdpbmRvdyxlKHQsaSkpO3QuY2FsbChpKX1mdW5jdGlvbiBnKHQpe3QmJmhpLmNhbGwod2luZG93LHQpfWZ1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSh0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgTCYmTCYmTC5NaXhpbil7dD1vaSh0KT90Olt0XTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldPT09TC5NaXhpbi5FdmVudHMmJmNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQgaW5jbHVkZSBvZiBMLk1peGluLkV2ZW50czogdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLCBwbGVhc2UgaW5oZXJpdCBmcm9tIEwuRXZlbnRlZCBpbnN0ZWFkLlwiLChuZXcgRXJyb3IpLnN0YWNrKX19ZnVuY3Rpb24geCh0LGksZSl7dGhpcy54PWU/TWF0aC5yb3VuZCh0KTp0LHRoaXMueT1lP01hdGgucm91bmQoaSk6aX1mdW5jdGlvbiB3KHQsaSxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHg/dDpvaSh0KT9uZXcgeCh0WzBdLHRbMV0pOnZvaWQgMD09PXR8fG51bGw9PT10P3Q6XCJvYmplY3RcIj09dHlwZW9mIHQmJlwieFwiaW4gdCYmXCJ5XCJpbiB0P25ldyB4KHQueCx0LnkpOm5ldyB4KHQsaSxlKX1mdW5jdGlvbiBQKHQsaSl7aWYodClmb3IodmFyIGU9aT9bdCxpXTp0LG49MCxvPWUubGVuZ3RoO248bztuKyspdGhpcy5leHRlbmQoZVtuXSl9ZnVuY3Rpb24gYih0LGkpe3JldHVybiF0fHx0IGluc3RhbmNlb2YgUD90Om5ldyBQKHQsaSl9ZnVuY3Rpb24gVCh0LGkpe2lmKHQpZm9yKHZhciBlPWk/W3QsaV06dCxuPTAsbz1lLmxlbmd0aDtuPG87bisrKXRoaXMuZXh0ZW5kKGVbbl0pfWZ1bmN0aW9uIHoodCxpKXtyZXR1cm4gdCBpbnN0YW5jZW9mIFQ/dDpuZXcgVCh0LGkpfWZ1bmN0aW9uIE0odCxpLGUpe2lmKGlzTmFOKHQpfHxpc05hTihpKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExhdExuZyBvYmplY3Q6IChcIit0K1wiLCBcIitpK1wiKVwiKTt0aGlzLmxhdD0rdCx0aGlzLmxuZz0raSx2b2lkIDAhPT1lJiYodGhpcy5hbHQ9K2UpfWZ1bmN0aW9uIEModCxpLGUpe3JldHVybiB0IGluc3RhbmNlb2YgTT90Om9pKHQpJiZcIm9iamVjdFwiIT10eXBlb2YgdFswXT8zPT09dC5sZW5ndGg/bmV3IE0odFswXSx0WzFdLHRbMl0pOjI9PT10Lmxlbmd0aD9uZXcgTSh0WzBdLHRbMV0pOm51bGw6dm9pZCAwPT09dHx8bnVsbD09PXQ/dDpcIm9iamVjdFwiPT10eXBlb2YgdCYmXCJsYXRcImluIHQ/bmV3IE0odC5sYXQsXCJsbmdcImluIHQ/dC5sbmc6dC5sb24sdC5hbHQpOnZvaWQgMD09PWk/bnVsbDpuZXcgTSh0LGksZSl9ZnVuY3Rpb24gUyh0LGksZSxuKXtpZihvaSh0KSlyZXR1cm4gdGhpcy5fYT10WzBdLHRoaXMuX2I9dFsxXSx0aGlzLl9jPXRbMl0sdm9pZCh0aGlzLl9kPXRbM10pO3RoaXMuX2E9dCx0aGlzLl9iPWksdGhpcy5fYz1lLHRoaXMuX2Q9bn1mdW5jdGlvbiBaKHQsaSxlLG4pe3JldHVybiBuZXcgUyh0LGksZSxuKX1mdW5jdGlvbiBFKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLHQpfWZ1bmN0aW9uIGsodCxpKXt2YXIgZSxuLG8scyxyLGEsaD1cIlwiO2ZvcihlPTAsbz10Lmxlbmd0aDtlPG87ZSsrKXtmb3Iobj0wLHM9KHI9dFtlXSkubGVuZ3RoO248cztuKyspYT1yW25dLGgrPShuP1wiTFwiOlwiTVwiKSthLngrXCIgXCIrYS55O2grPWk/Smk/XCJ6XCI6XCJ4XCI6XCJcIn1yZXR1cm4gaHx8XCJNMCAwXCJ9ZnVuY3Rpb24gQih0KXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YodCk+PTB9ZnVuY3Rpb24gQSh0LGksZSxuKXtyZXR1cm5cInRvdWNoc3RhcnRcIj09PWk/Tyh0LGUsbik6XCJ0b3VjaG1vdmVcIj09PWk/Vyh0LGUsbik6XCJ0b3VjaGVuZFwiPT09aSYmSCh0LGUsbiksdGhpc31mdW5jdGlvbiBJKHQsaSxlKXt2YXIgbj10W1wiX2xlYWZsZXRfXCIraStlXTtyZXR1cm5cInRvdWNoc3RhcnRcIj09PWk/dC5yZW1vdmVFdmVudExpc3RlbmVyKHRlLG4sITEpOlwidG91Y2htb3ZlXCI9PT1pP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihpZSxuLCExKTpcInRvdWNoZW5kXCI9PT1pJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKGVlLG4sITEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuZSxuLCExKSksdGhpc31mdW5jdGlvbiBPKHQsaSxuKXt2YXIgbz1lKGZ1bmN0aW9uKHQpe2lmKFwibW91c2VcIiE9PXQucG9pbnRlclR5cGUmJnQuTVNQT0lOVEVSX1RZUEVfTU9VU0UmJnQucG9pbnRlclR5cGUhPT10Lk1TUE9JTlRFUl9UWVBFX01PVVNFKXtpZighKG9lLmluZGV4T2YodC50YXJnZXQudGFnTmFtZSk8MCkpcmV0dXJuO1B0KHQpfWoodCxpKX0pO3RbXCJfbGVhZmxldF90b3VjaHN0YXJ0XCIrbl09byx0LmFkZEV2ZW50TGlzdGVuZXIodGUsbywhMSkscmV8fChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0ZSxSLCEwKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihpZSxOLCEwKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlZSxELCEwKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuZSxELCEwKSxyZT0hMCl9ZnVuY3Rpb24gUih0KXtzZVt0LnBvaW50ZXJJZF09dCxhZSsrfWZ1bmN0aW9uIE4odCl7c2VbdC5wb2ludGVySWRdJiYoc2VbdC5wb2ludGVySWRdPXQpfWZ1bmN0aW9uIEQodCl7ZGVsZXRlIHNlW3QucG9pbnRlcklkXSxhZS0tfWZ1bmN0aW9uIGoodCxpKXt0LnRvdWNoZXM9W107Zm9yKHZhciBlIGluIHNlKXQudG91Y2hlcy5wdXNoKHNlW2VdKTt0LmNoYW5nZWRUb3VjaGVzPVt0XSxpKHQpfWZ1bmN0aW9uIFcodCxpLGUpe3ZhciBuPWZ1bmN0aW9uKHQpeyh0LnBvaW50ZXJUeXBlIT09dC5NU1BPSU5URVJfVFlQRV9NT1VTRSYmXCJtb3VzZVwiIT09dC5wb2ludGVyVHlwZXx8MCE9PXQuYnV0dG9ucykmJmoodCxpKX07dFtcIl9sZWFmbGV0X3RvdWNobW92ZVwiK2VdPW4sdC5hZGRFdmVudExpc3RlbmVyKGllLG4sITEpfWZ1bmN0aW9uIEgodCxpLGUpe3ZhciBuPWZ1bmN0aW9uKHQpe2oodCxpKX07dFtcIl9sZWFmbGV0X3RvdWNoZW5kXCIrZV09bix0LmFkZEV2ZW50TGlzdGVuZXIoZWUsbiwhMSksdC5hZGRFdmVudExpc3RlbmVyKG5lLG4sITEpfWZ1bmN0aW9uIEYodCxpLGUpe2Z1bmN0aW9uIG4odCl7dmFyIGk7aWYoVmkpe2lmKCFiaXx8XCJtb3VzZVwiPT09dC5wb2ludGVyVHlwZSlyZXR1cm47aT1hZX1lbHNlIGk9dC50b3VjaGVzLmxlbmd0aDtpZighKGk+MSkpe3ZhciBlPURhdGUubm93KCksbj1lLShzfHxlKTtyPXQudG91Y2hlcz90LnRvdWNoZXNbMF06dCxhPW4+MCYmbjw9aCxzPWV9fWZ1bmN0aW9uIG8odCl7aWYoYSYmIXIuY2FuY2VsQnViYmxlKXtpZihWaSl7aWYoIWJpfHxcIm1vdXNlXCI9PT10LnBvaW50ZXJUeXBlKXJldHVybjt2YXIgZSxuLG89e307Zm9yKG4gaW4gcillPXJbbl0sb1tuXT1lJiZlLmJpbmQ/ZS5iaW5kKHIpOmU7cj1vfXIudHlwZT1cImRibGNsaWNrXCIsaShyKSxzPW51bGx9fXZhciBzLHIsYT0hMSxoPTI1MDtyZXR1cm4gdFtsZStoZStlXT1uLHRbbGUrdWUrZV09byx0W2xlK1wiZGJsY2xpY2tcIitlXT1pLHQuYWRkRXZlbnRMaXN0ZW5lcihoZSxuLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIodWUsbywhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIixpLCExKSx0aGlzfWZ1bmN0aW9uIFUodCxpKXt2YXIgZT10W2xlK2hlK2ldLG49dFtsZSt1ZStpXSxvPXRbbGUrXCJkYmxjbGlja1wiK2ldO3JldHVybiB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoaGUsZSwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKHVlLG4sITEpLGJpfHx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLG8sITEpLHRoaXN9ZnVuY3Rpb24gVih0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0fWZ1bmN0aW9uIHEodCxpKXt2YXIgZT10LnN0eWxlW2ldfHx0LmN1cnJlbnRTdHlsZSYmdC5jdXJyZW50U3R5bGVbaV07aWYoKCFlfHxcImF1dG9cIj09PWUpJiZkb2N1bWVudC5kZWZhdWx0Vmlldyl7dmFyIG49ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO2U9bj9uW2ldOm51bGx9cmV0dXJuXCJhdXRvXCI9PT1lP251bGw6ZX1mdW5jdGlvbiBHKHQsaSxlKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpO3JldHVybiBuLmNsYXNzTmFtZT1pfHxcIlwiLGUmJmUuYXBwZW5kQ2hpbGQobiksbn1mdW5jdGlvbiBLKHQpe3ZhciBpPXQucGFyZW50Tm9kZTtpJiZpLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIFkodCl7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKX1mdW5jdGlvbiBYKHQpe3ZhciBpPXQucGFyZW50Tm9kZTtpJiZpLmxhc3RDaGlsZCE9PXQmJmkuYXBwZW5kQ2hpbGQodCl9ZnVuY3Rpb24gSih0KXt2YXIgaT10LnBhcmVudE5vZGU7aSYmaS5maXJzdENoaWxkIT09dCYmaS5pbnNlcnRCZWZvcmUodCxpLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uICQodCxpKXtpZih2b2lkIDAhPT10LmNsYXNzTGlzdClyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoaSk7dmFyIGU9ZXQodCk7cmV0dXJuIGUubGVuZ3RoPjAmJm5ldyBSZWdFeHAoXCIoXnxcXFxccylcIitpK1wiKFxcXFxzfCQpXCIpLnRlc3QoZSl9ZnVuY3Rpb24gUSh0LGkpe2lmKHZvaWQgMCE9PXQuY2xhc3NMaXN0KWZvcih2YXIgZT11KGkpLG49MCxvPWUubGVuZ3RoO248bztuKyspdC5jbGFzc0xpc3QuYWRkKGVbbl0pO2Vsc2UgaWYoISQodCxpKSl7dmFyIHM9ZXQodCk7aXQodCwocz9zK1wiIFwiOlwiXCIpK2kpfX1mdW5jdGlvbiB0dCh0LGkpe3ZvaWQgMCE9PXQuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LnJlbW92ZShpKTppdCh0LGgoKFwiIFwiK2V0KHQpK1wiIFwiKS5yZXBsYWNlKFwiIFwiK2krXCIgXCIsXCIgXCIpKSl9ZnVuY3Rpb24gaXQodCxpKXt2b2lkIDA9PT10LmNsYXNzTmFtZS5iYXNlVmFsP3QuY2xhc3NOYW1lPWk6dC5jbGFzc05hbWUuYmFzZVZhbD1pfWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0LmNvcnJlc3BvbmRpbmdFbGVtZW50JiYodD10LmNvcnJlc3BvbmRpbmdFbGVtZW50KSx2b2lkIDA9PT10LmNsYXNzTmFtZS5iYXNlVmFsP3QuY2xhc3NOYW1lOnQuY2xhc3NOYW1lLmJhc2VWYWx9ZnVuY3Rpb24gbnQodCxpKXtcIm9wYWNpdHlcImluIHQuc3R5bGU/dC5zdHlsZS5vcGFjaXR5PWk6XCJmaWx0ZXJcImluIHQuc3R5bGUmJm90KHQsaSl9ZnVuY3Rpb24gb3QodCxpKXt2YXIgZT0hMSxuPVwiRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFcIjt0cnl7ZT10LmZpbHRlcnMuaXRlbShuKX1jYXRjaCh0KXtpZigxPT09aSlyZXR1cm59aT1NYXRoLnJvdW5kKDEwMCppKSxlPyhlLkVuYWJsZWQ9MTAwIT09aSxlLk9wYWNpdHk9aSk6dC5zdHlsZS5maWx0ZXIrPVwiIHByb2dpZDpcIituK1wiKG9wYWNpdHk9XCIraStcIilcIn1mdW5jdGlvbiBzdCh0KXtmb3IodmFyIGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdaW4gaSlyZXR1cm4gdFtlXTtyZXR1cm4hMX1mdW5jdGlvbiBydCh0LGksZSl7dmFyIG49aXx8bmV3IHgoMCwwKTt0LnN0eWxlW2NlXT0oUmk/XCJ0cmFuc2xhdGUoXCIrbi54K1wicHgsXCIrbi55K1wicHgpXCI6XCJ0cmFuc2xhdGUzZChcIituLngrXCJweCxcIituLnkrXCJweCwwKVwiKSsoZT9cIiBzY2FsZShcIitlK1wiKVwiOlwiXCIpfWZ1bmN0aW9uIGF0KHQsaSl7dC5fbGVhZmxldF9wb3M9aSxqaT9ydCh0LGkpOih0LnN0eWxlLmxlZnQ9aS54K1wicHhcIix0LnN0eWxlLnRvcD1pLnkrXCJweFwiKX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gdC5fbGVhZmxldF9wb3N8fG5ldyB4KDAsMCl9ZnVuY3Rpb24gdXQoKXttdCh3aW5kb3csXCJkcmFnc3RhcnRcIixQdCl9ZnVuY3Rpb24gbHQoKXtmdCh3aW5kb3csXCJkcmFnc3RhcnRcIixQdCl9ZnVuY3Rpb24gY3QodCl7Zm9yKDstMT09PXQudGFiSW5kZXg7KXQ9dC5wYXJlbnROb2RlO3Quc3R5bGUmJihfdCgpLG1lPXQsZmU9dC5zdHlsZS5vdXRsaW5lLHQuc3R5bGUub3V0bGluZT1cIm5vbmVcIixtdCh3aW5kb3csXCJrZXlkb3duXCIsX3QpKX1mdW5jdGlvbiBfdCgpe21lJiYobWUuc3R5bGUub3V0bGluZT1mZSxtZT12b2lkIDAsZmU9dm9pZCAwLGZ0KHdpbmRvdyxcImtleWRvd25cIixfdCkpfWZ1bmN0aW9uIGR0KHQpe2Rve3Q9dC5wYXJlbnROb2RlfXdoaWxlKCEodC5vZmZzZXRXaWR0aCYmdC5vZmZzZXRIZWlnaHR8fHQ9PT1kb2N1bWVudC5ib2R5KSk7cmV0dXJuIHR9ZnVuY3Rpb24gcHQodCl7dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDppLndpZHRoL3Qub2Zmc2V0V2lkdGh8fDEseTppLmhlaWdodC90Lm9mZnNldEhlaWdodHx8MSxib3VuZGluZ0NsaWVudFJlY3Q6aX19ZnVuY3Rpb24gbXQodCxpLGUsbil7aWYoXCJvYmplY3RcIj09dHlwZW9mIGkpZm9yKHZhciBvIGluIGkpZ3QodCxvLGlbb10sZSk7ZWxzZSBmb3IodmFyIHM9MCxyPShpPXUoaSkpLmxlbmd0aDtzPHI7cysrKWd0KHQsaVtzXSxlLG4pO3JldHVybiB0aGlzfWZ1bmN0aW9uIGZ0KHQsaSxlLG4pe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBpKWZvcih2YXIgbyBpbiBpKXZ0KHQsbyxpW29dLGUpO2Vsc2UgaWYoaSlmb3IodmFyIHM9MCxyPShpPXUoaSkpLmxlbmd0aDtzPHI7cysrKXZ0KHQsaVtzXSxlLG4pO2Vsc2V7Zm9yKHZhciBhIGluIHRbeWVdKXZ0KHQsYSx0W3llXVthXSk7ZGVsZXRlIHRbeWVdfXJldHVybiB0aGlzfWZ1bmN0aW9uIGd0KHQsaSxlLG8pe3ZhciBzPWkrbihlKSsobz9cIl9cIituKG8pOlwiXCIpO2lmKHRbeWVdJiZ0W3llXVtzXSlyZXR1cm4gdGhpczt2YXIgcj1mdW5jdGlvbihpKXtyZXR1cm4gZS5jYWxsKG98fHQsaXx8d2luZG93LmV2ZW50KX0sYT1yO1ZpJiYwPT09aS5pbmRleE9mKFwidG91Y2hcIik/QSh0LGkscixzKTohcWl8fFwiZGJsY2xpY2tcIiE9PWl8fCFGfHxWaSYmRWk/XCJhZGRFdmVudExpc3RlbmVyXCJpbiB0P1wibW91c2V3aGVlbFwiPT09aT90LmFkZEV2ZW50TGlzdGVuZXIoXCJvbndoZWVsXCJpbiB0P1wid2hlZWxcIjpcIm1vdXNld2hlZWxcIixyLCExKTpcIm1vdXNlZW50ZXJcIj09PWl8fFwibW91c2VsZWF2ZVwiPT09aT8ocj1mdW5jdGlvbihpKXtpPWl8fHdpbmRvdy5ldmVudCxDdCh0LGkpJiZhKGkpfSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCI9PT1pP1wibW91c2VvdmVyXCI6XCJtb3VzZW91dFwiLHIsITEpKTooXCJjbGlja1wiPT09aSYmemkmJihyPWZ1bmN0aW9uKHQpe1N0KHQsYSl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoaSxyLCExKSk6XCJhdHRhY2hFdmVudFwiaW4gdCYmdC5hdHRhY2hFdmVudChcIm9uXCIraSxyKTpGKHQscixzKSx0W3llXT10W3llXXx8e30sdFt5ZV1bc109cn1mdW5jdGlvbiB2dCh0LGksZSxvKXt2YXIgcz1pK24oZSkrKG8/XCJfXCIrbihvKTpcIlwiKSxyPXRbeWVdJiZ0W3llXVtzXTtpZighcilyZXR1cm4gdGhpcztWaSYmMD09PWkuaW5kZXhPZihcInRvdWNoXCIpP0kodCxpLHMpOiFxaXx8XCJkYmxjbGlja1wiIT09aXx8IVV8fFZpJiZFaT9cInJlbW92ZUV2ZW50TGlzdGVuZXJcImluIHQ/XCJtb3VzZXdoZWVsXCI9PT1pP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9ud2hlZWxcImluIHQ/XCJ3aGVlbFwiOlwibW91c2V3aGVlbFwiLHIsITEpOnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIj09PWk/XCJtb3VzZW92ZXJcIjpcIm1vdXNlbGVhdmVcIj09PWk/XCJtb3VzZW91dFwiOmksciwhMSk6XCJkZXRhY2hFdmVudFwiaW4gdCYmdC5kZXRhY2hFdmVudChcIm9uXCIraSxyKTpVKHQscyksdFt5ZV1bc109bnVsbH1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24/dC5zdG9wUHJvcGFnYXRpb24oKTp0Lm9yaWdpbmFsRXZlbnQ/dC5vcmlnaW5hbEV2ZW50Ll9zdG9wcGVkPSEwOnQuY2FuY2VsQnViYmxlPSEwLE10KHQpLHRoaXN9ZnVuY3Rpb24geHQodCl7cmV0dXJuIGd0KHQsXCJtb3VzZXdoZWVsXCIseXQpLHRoaXN9ZnVuY3Rpb24gd3QodCl7cmV0dXJuIG10KHQsXCJtb3VzZWRvd24gdG91Y2hzdGFydCBkYmxjbGlja1wiLHl0KSxndCh0LFwiY2xpY2tcIix6dCksdGhpc31mdW5jdGlvbiBQdCh0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMSx0aGlzfWZ1bmN0aW9uIEx0KHQpe3JldHVybiBQdCh0KSx5dCh0KSx0aGlzfWZ1bmN0aW9uIGJ0KHQsaSl7aWYoIWkpcmV0dXJuIG5ldyB4KHQuY2xpZW50WCx0LmNsaWVudFkpO3ZhciBlPXB0KGkpLG49ZS5ib3VuZGluZ0NsaWVudFJlY3Q7cmV0dXJuIG5ldyB4KCh0LmNsaWVudFgtbi5sZWZ0KS9lLngtaS5jbGllbnRMZWZ0LCh0LmNsaWVudFktbi50b3ApL2UueS1pLmNsaWVudFRvcCl9ZnVuY3Rpb24gVHQodCl7cmV0dXJuIGJpP3Qud2hlZWxEZWx0YVkvMjp0LmRlbHRhWSYmMD09PXQuZGVsdGFNb2RlPy10LmRlbHRhWS94ZTp0LmRlbHRhWSYmMT09PXQuZGVsdGFNb2RlPzIwKi10LmRlbHRhWTp0LmRlbHRhWSYmMj09PXQuZGVsdGFNb2RlPzYwKi10LmRlbHRhWTp0LmRlbHRhWHx8dC5kZWx0YVo/MDp0LndoZWVsRGVsdGE/KHQud2hlZWxEZWx0YVl8fHQud2hlZWxEZWx0YSkvMjp0LmRldGFpbCYmTWF0aC5hYnModC5kZXRhaWwpPDMyNzY1PzIwKi10LmRldGFpbDp0LmRldGFpbD90LmRldGFpbC8tMzI3NjUqNjA6MH1mdW5jdGlvbiB6dCh0KXt3ZVt0LnR5cGVdPSEwfWZ1bmN0aW9uIE10KHQpe3ZhciBpPXdlW3QudHlwZV07cmV0dXJuIHdlW3QudHlwZV09ITEsaX1mdW5jdGlvbiBDdCh0LGkpe3ZhciBlPWkucmVsYXRlZFRhcmdldDtpZighZSlyZXR1cm4hMDt0cnl7Zm9yKDtlJiZlIT09dDspZT1lLnBhcmVudE5vZGV9Y2F0Y2godCl7cmV0dXJuITF9cmV0dXJuIGUhPT10fWZ1bmN0aW9uIFN0KHQsaSl7dmFyIGU9dC50aW1lU3RhbXB8fHQub3JpZ2luYWxFdmVudCYmdC5vcmlnaW5hbEV2ZW50LnRpbWVTdGFtcCxuPWdlJiZlLWdlO24mJm4+MTAwJiZuPDUwMHx8dC50YXJnZXQuX3NpbXVsYXRlZENsaWNrJiYhdC5fc2ltdWxhdGVkP0x0KHQpOihnZT1lLGkodCkpfWZ1bmN0aW9uIFp0KHQsaSl7aWYoIWl8fCF0Lmxlbmd0aClyZXR1cm4gdC5zbGljZSgpO3ZhciBlPWkqaTtyZXR1cm4gdD1BdCh0LGUpLHQ9a3QodCxlKX1mdW5jdGlvbiBFdCh0LGksZSl7cmV0dXJuIE1hdGguc3FydChEdCh0LGksZSwhMCkpfWZ1bmN0aW9uIGt0KHQsaSl7dmFyIGU9dC5sZW5ndGgsbj1uZXcodHlwZW9mIFVpbnQ4QXJyYXkhPXZvaWQgMCtcIlwiP1VpbnQ4QXJyYXk6QXJyYXkpKGUpO25bMF09bltlLTFdPTEsQnQodCxuLGksMCxlLTEpO3ZhciBvLHM9W107Zm9yKG89MDtvPGU7bysrKW5bb10mJnMucHVzaCh0W29dKTtyZXR1cm4gc31mdW5jdGlvbiBCdCh0LGksZSxuLG8pe3ZhciBzLHIsYSxoPTA7Zm9yKHI9bisxO3I8PW8tMTtyKyspKGE9RHQodFtyXSx0W25dLHRbb10sITApKT5oJiYocz1yLGg9YSk7aD5lJiYoaVtzXT0xLEJ0KHQsaSxlLG4scyksQnQodCxpLGUscyxvKSl9ZnVuY3Rpb24gQXQodCxpKXtmb3IodmFyIGU9W3RbMF1dLG49MSxvPTAscz10Lmxlbmd0aDtuPHM7bisrKU50KHRbbl0sdFtvXSk+aSYmKGUucHVzaCh0W25dKSxvPW4pO3JldHVybiBvPHMtMSYmZS5wdXNoKHRbcy0xXSksZX1mdW5jdGlvbiBJdCh0LGksZSxuLG8pe3ZhciBzLHIsYSxoPW4/a2U6UnQodCxlKSx1PVJ0KGksZSk7Zm9yKGtlPXU7Oyl7aWYoIShofHUpKXJldHVyblt0LGldO2lmKGgmdSlyZXR1cm4hMTthPVJ0KHI9T3QodCxpLHM9aHx8dSxlLG8pLGUpLHM9PT1oPyh0PXIsaD1hKTooaT1yLHU9YSl9fWZ1bmN0aW9uIE90KHQsaSxlLG4sbyl7dmFyIHMscixhPWkueC10LngsaD1pLnktdC55LHU9bi5taW4sbD1uLm1heDtyZXR1cm4gOCZlPyhzPXQueCthKihsLnktdC55KS9oLHI9bC55KTo0JmU/KHM9dC54K2EqKHUueS10LnkpL2gscj11LnkpOjImZT8ocz1sLngscj10LnkraCoobC54LXQueCkvYSk6MSZlJiYocz11Lngscj10LnkraCoodS54LXQueCkvYSksbmV3IHgocyxyLG8pfWZ1bmN0aW9uIFJ0KHQsaSl7dmFyIGU9MDtyZXR1cm4gdC54PGkubWluLng/ZXw9MTp0Lng+aS5tYXgueCYmKGV8PTIpLHQueTxpLm1pbi55P2V8PTQ6dC55PmkubWF4LnkmJihlfD04KSxlfWZ1bmN0aW9uIE50KHQsaSl7dmFyIGU9aS54LXQueCxuPWkueS10Lnk7cmV0dXJuIGUqZStuKm59ZnVuY3Rpb24gRHQodCxpLGUsbil7dmFyIG8scz1pLngscj1pLnksYT1lLngtcyxoPWUueS1yLHU9YSphK2gqaDtyZXR1cm4gdT4wJiYoKG89KCh0LngtcykqYSsodC55LXIpKmgpL3UpPjE/KHM9ZS54LHI9ZS55KTpvPjAmJihzKz1hKm8scis9aCpvKSksYT10LngtcyxoPXQueS1yLG4/YSphK2gqaDpuZXcgeChzLHIpfWZ1bmN0aW9uIGp0KHQpe3JldHVybiFvaSh0WzBdKXx8XCJvYmplY3RcIiE9dHlwZW9mIHRbMF1bMF0mJnZvaWQgMCE9PXRbMF1bMF19ZnVuY3Rpb24gV3QodCl7cmV0dXJuIGNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQgdXNlIG9mIF9mbGF0LCBwbGVhc2UgdXNlIEwuTGluZVV0aWwuaXNGbGF0IGluc3RlYWQuXCIpLGp0KHQpfWZ1bmN0aW9uIEh0KHQsaSxlKXt2YXIgbixvLHMscixhLGgsdSxsLGMsXz1bMSw0LDIsOF07Zm9yKG89MCx1PXQubGVuZ3RoO288dTtvKyspdFtvXS5fY29kZT1SdCh0W29dLGkpO2ZvcihyPTA7cjw0O3IrKyl7Zm9yKGw9X1tyXSxuPVtdLG89MCxzPSh1PXQubGVuZ3RoKS0xO288dTtzPW8rKylhPXRbb10saD10W3NdLGEuX2NvZGUmbD9oLl9jb2RlJmx8fCgoYz1PdChoLGEsbCxpLGUpKS5fY29kZT1SdChjLGkpLG4ucHVzaChjKSk6KGguX2NvZGUmbCYmKChjPU90KGgsYSxsLGksZSkpLl9jb2RlPVJ0KGMsaSksbi5wdXNoKGMpKSxuLnB1c2goYSkpO3Q9bn1yZXR1cm4gdH1mdW5jdGlvbiBGdCh0LGkpe3ZhciBlLG4sbyxzLHI9XCJGZWF0dXJlXCI9PT10LnR5cGU/dC5nZW9tZXRyeTp0LGE9cj9yLmNvb3JkaW5hdGVzOm51bGwsaD1bXSx1PWkmJmkucG9pbnRUb0xheWVyLGw9aSYmaS5jb29yZHNUb0xhdExuZ3x8VXQ7aWYoIWEmJiFyKXJldHVybiBudWxsO3N3aXRjaChyLnR5cGUpe2Nhc2VcIlBvaW50XCI6cmV0dXJuIGU9bChhKSx1P3UodCxlKTpuZXcgJGUoZSk7Y2FzZVwiTXVsdGlQb2ludFwiOmZvcihvPTAscz1hLmxlbmd0aDtvPHM7bysrKWU9bChhW29dKSxoLnB1c2godT91KHQsZSk6bmV3ICRlKGUpKTtyZXR1cm4gbmV3IEtlKGgpO2Nhc2VcIkxpbmVTdHJpbmdcIjpjYXNlXCJNdWx0aUxpbmVTdHJpbmdcIjpyZXR1cm4gbj1WdChhLFwiTGluZVN0cmluZ1wiPT09ci50eXBlPzA6MSxsKSxuZXcgbm4obixpKTtjYXNlXCJQb2x5Z29uXCI6Y2FzZVwiTXVsdGlQb2x5Z29uXCI6cmV0dXJuIG49VnQoYSxcIlBvbHlnb25cIj09PXIudHlwZT8xOjIsbCksbmV3IG9uKG4saSk7Y2FzZVwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6Zm9yKG89MCxzPXIuZ2VvbWV0cmllcy5sZW5ndGg7bzxzO28rKyl7dmFyIGM9RnQoe2dlb21ldHJ5OnIuZ2VvbWV0cmllc1tvXSx0eXBlOlwiRmVhdHVyZVwiLHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzfSxpKTtjJiZoLnB1c2goYyl9cmV0dXJuIG5ldyBLZShoKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIkludmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpfX1mdW5jdGlvbiBVdCh0KXtyZXR1cm4gbmV3IE0odFsxXSx0WzBdLHRbMl0pfWZ1bmN0aW9uIFZ0KHQsaSxlKXtmb3IodmFyIG4sbz1bXSxzPTAscj10Lmxlbmd0aDtzPHI7cysrKW49aT9WdCh0W3NdLGktMSxlKTooZXx8VXQpKHRbc10pLG8ucHVzaChuKTtyZXR1cm4gb31mdW5jdGlvbiBxdCh0LGkpe3JldHVybiBpPVwibnVtYmVyXCI9PXR5cGVvZiBpP2k6Nix2b2lkIDAhPT10LmFsdD9bYSh0LmxuZyxpKSxhKHQubGF0LGkpLGEodC5hbHQsaSldOlthKHQubG5nLGkpLGEodC5sYXQsaSldfWZ1bmN0aW9uIEd0KHQsaSxlLG4pe2Zvcih2YXIgbz1bXSxzPTAscj10Lmxlbmd0aDtzPHI7cysrKW8ucHVzaChpP0d0KHRbc10saS0xLGUsbik6cXQodFtzXSxuKSk7cmV0dXJuIWkmJmUmJm8ucHVzaChvWzBdKSxvfWZ1bmN0aW9uIEt0KHQsZSl7cmV0dXJuIHQuZmVhdHVyZT9pKHt9LHQuZmVhdHVyZSx7Z2VvbWV0cnk6ZX0pOll0KGUpfWZ1bmN0aW9uIFl0KHQpe3JldHVyblwiRmVhdHVyZVwiPT09dC50eXBlfHxcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT10LnR5cGU/dDp7dHlwZTpcIkZlYXR1cmVcIixwcm9wZXJ0aWVzOnt9LGdlb21ldHJ5OnR9fWZ1bmN0aW9uIFh0KHQsaSl7cmV0dXJuIG5ldyBzbih0LGkpfWZ1bmN0aW9uIEp0KHQsaSl7cmV0dXJuIG5ldyBtbih0LGkpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBYaT9uZXcgdm4odCk6bnVsbH1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gSml8fCRpP25ldyBQbih0KTpudWxsfXZhciB0aT1PYmplY3QuZnJlZXplO09iamVjdC5mcmVlemU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciBpaT1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiB0LnByb3RvdHlwZT1pLG5ldyB0fX0oKSxlaT0wLG5pPS9cXHsgKihbXFx3Xy1dKykgKlxcfS9nLG9pPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVyblwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0sc2k9XCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHM9XCIscmk9MCxhaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxwKFwiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIpfHxtLGhpPXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8cChcIkNhbmNlbEFuaW1hdGlvbkZyYW1lXCIpfHxwKFwiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIpfHxmdW5jdGlvbih0KXt3aW5kb3cuY2xlYXJUaW1lb3V0KHQpfSx1aT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7ZnJlZXplOnRpLGV4dGVuZDppLGNyZWF0ZTppaSxiaW5kOmUsbGFzdElkOmVpLHN0YW1wOm4sdGhyb3R0bGU6byx3cmFwTnVtOnMsZmFsc2VGbjpyLGZvcm1hdE51bTphLHRyaW06aCxzcGxpdFdvcmRzOnUsc2V0T3B0aW9uczpsLGdldFBhcmFtU3RyaW5nOmMsdGVtcGxhdGU6Xyxpc0FycmF5Om9pLGluZGV4T2Y6ZCxlbXB0eUltYWdlVXJsOnNpLHJlcXVlc3RGbjphaSxjYW5jZWxGbjpoaSxyZXF1ZXN0QW5pbUZyYW1lOmYsY2FuY2VsQW5pbUZyYW1lOmd9KTt2LmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZSYmdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNhbGxJbml0SG9va3MoKX0sbj1lLl9fc3VwZXJfXz10aGlzLnByb3RvdHlwZSxvPWlpKG4pO28uY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZT1vO2Zvcih2YXIgcyBpbiB0aGlzKXRoaXMuaGFzT3duUHJvcGVydHkocykmJlwicHJvdG90eXBlXCIhPT1zJiZcIl9fc3VwZXJfX1wiIT09cyYmKGVbc109dGhpc1tzXSk7cmV0dXJuIHQuc3RhdGljcyYmKGkoZSx0LnN0YXRpY3MpLGRlbGV0ZSB0LnN0YXRpY3MpLHQuaW5jbHVkZXMmJih5KHQuaW5jbHVkZXMpLGkuYXBwbHkobnVsbCxbb10uY29uY2F0KHQuaW5jbHVkZXMpKSxkZWxldGUgdC5pbmNsdWRlcyksby5vcHRpb25zJiYodC5vcHRpb25zPWkoaWkoby5vcHRpb25zKSx0Lm9wdGlvbnMpKSxpKG8sdCksby5faW5pdEhvb2tzPVtdLG8uY2FsbEluaXRIb29rcz1mdW5jdGlvbigpe2lmKCF0aGlzLl9pbml0SG9va3NDYWxsZWQpe24uY2FsbEluaXRIb29rcyYmbi5jYWxsSW5pdEhvb2tzLmNhbGwodGhpcyksdGhpcy5faW5pdEhvb2tzQ2FsbGVkPSEwO2Zvcih2YXIgdD0wLGk9by5faW5pdEhvb2tzLmxlbmd0aDt0PGk7dCsrKW8uX2luaXRIb29rc1t0XS5jYWxsKHRoaXMpfX0sZX0sdi5pbmNsdWRlPWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucHJvdG90eXBlLHQpLHRoaXN9LHYubWVyZ2VPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucHJvdG90eXBlLm9wdGlvbnMsdCksdGhpc30sdi5hZGRJbml0SG9vaz1mdW5jdGlvbih0KXt2YXIgaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXt0aGlzW3RdLmFwcGx5KHRoaXMsaSl9O3JldHVybiB0aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzPXRoaXMucHJvdG90eXBlLl9pbml0SG9va3N8fFtdLHRoaXMucHJvdG90eXBlLl9pbml0SG9va3MucHVzaChlKSx0aGlzfTt2YXIgbGk9e29uOmZ1bmN0aW9uKHQsaSxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgdClmb3IodmFyIG4gaW4gdCl0aGlzLl9vbihuLHRbbl0saSk7ZWxzZSBmb3IodmFyIG89MCxzPSh0PXUodCkpLmxlbmd0aDtvPHM7bysrKXRoaXMuX29uKHRbb10saSxlKTtyZXR1cm4gdGhpc30sb2ZmOmZ1bmN0aW9uKHQsaSxlKXtpZih0KWlmKFwib2JqZWN0XCI9PXR5cGVvZiB0KWZvcih2YXIgbiBpbiB0KXRoaXMuX29mZihuLHRbbl0saSk7ZWxzZSBmb3IodmFyIG89MCxzPSh0PXUodCkpLmxlbmd0aDtvPHM7bysrKXRoaXMuX29mZih0W29dLGksZSk7ZWxzZSBkZWxldGUgdGhpcy5fZXZlbnRzO3JldHVybiB0aGlzfSxfb246ZnVuY3Rpb24odCxpLGUpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9O3ZhciBuPXRoaXMuX2V2ZW50c1t0XTtufHwobj1bXSx0aGlzLl9ldmVudHNbdF09biksZT09PXRoaXMmJihlPXZvaWQgMCk7Zm9yKHZhciBvPXtmbjppLGN0eDplfSxzPW4scj0wLGE9cy5sZW5ndGg7cjxhO3IrKylpZihzW3JdLmZuPT09aSYmc1tyXS5jdHg9PT1lKXJldHVybjtzLnB1c2gobyl9LF9vZmY6ZnVuY3Rpb24odCxpLGUpe3ZhciBuLG8scztpZih0aGlzLl9ldmVudHMmJihuPXRoaXMuX2V2ZW50c1t0XSkpaWYoaSl7aWYoZT09PXRoaXMmJihlPXZvaWQgMCksbilmb3Iobz0wLHM9bi5sZW5ndGg7bzxzO28rKyl7dmFyIGE9bltvXTtpZihhLmN0eD09PWUmJmEuZm49PT1pKXJldHVybiBhLmZuPXIsdGhpcy5fZmlyaW5nQ291bnQmJih0aGlzLl9ldmVudHNbdF09bj1uLnNsaWNlKCkpLHZvaWQgbi5zcGxpY2UobywxKX19ZWxzZXtmb3Iobz0wLHM9bi5sZW5ndGg7bzxzO28rKyluW29dLmZuPXI7ZGVsZXRlIHRoaXMuX2V2ZW50c1t0XX19LGZpcmU6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLmxpc3RlbnModCxuKSlyZXR1cm4gdGhpczt2YXIgbz1pKHt9LGUse3R5cGU6dCx0YXJnZXQ6dGhpcyxzb3VyY2VUYXJnZXQ6ZSYmZS5zb3VyY2VUYXJnZXR8fHRoaXN9KTtpZih0aGlzLl9ldmVudHMpe3ZhciBzPXRoaXMuX2V2ZW50c1t0XTtpZihzKXt0aGlzLl9maXJpbmdDb3VudD10aGlzLl9maXJpbmdDb3VudCsxfHwxO2Zvcih2YXIgcj0wLGE9cy5sZW5ndGg7cjxhO3IrKyl7dmFyIGg9c1tyXTtoLmZuLmNhbGwoaC5jdHh8fHRoaXMsbyl9dGhpcy5fZmlyaW5nQ291bnQtLX19cmV0dXJuIG4mJnRoaXMuX3Byb3BhZ2F0ZUV2ZW50KG8pLHRoaXN9LGxpc3RlbnM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1t0XTtpZihlJiZlLmxlbmd0aClyZXR1cm4hMDtpZihpKWZvcih2YXIgbiBpbiB0aGlzLl9ldmVudFBhcmVudHMpaWYodGhpcy5fZXZlbnRQYXJlbnRzW25dLmxpc3RlbnModCxpKSlyZXR1cm4hMDtyZXR1cm4hMX0sb25jZTpmdW5jdGlvbih0LGksbil7aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcih2YXIgbyBpbiB0KXRoaXMub25jZShvLHRbb10saSk7cmV0dXJuIHRoaXN9dmFyIHM9ZShmdW5jdGlvbigpe3RoaXMub2ZmKHQsaSxuKS5vZmYodCxzLG4pfSx0aGlzKTtyZXR1cm4gdGhpcy5vbih0LGksbikub24odCxzLG4pfSxhZGRFdmVudFBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRQYXJlbnRzPXRoaXMuX2V2ZW50UGFyZW50c3x8e30sdGhpcy5fZXZlbnRQYXJlbnRzW24odCldPXQsdGhpc30scmVtb3ZlRXZlbnRQYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50UGFyZW50cyYmZGVsZXRlIHRoaXMuX2V2ZW50UGFyZW50c1tuKHQpXSx0aGlzfSxfcHJvcGFnYXRlRXZlbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX2V2ZW50UGFyZW50cyl0aGlzLl9ldmVudFBhcmVudHNbZV0uZmlyZSh0LnR5cGUsaSh7bGF5ZXI6dC50YXJnZXQscHJvcGFnYXRlZEZyb206dC50YXJnZXR9LHQpLCEwKX19O2xpLmFkZEV2ZW50TGlzdGVuZXI9bGkub24sbGkucmVtb3ZlRXZlbnRMaXN0ZW5lcj1saS5jbGVhckFsbEV2ZW50TGlzdGVuZXJzPWxpLm9mZixsaS5hZGRPbmVUaW1lRXZlbnRMaXN0ZW5lcj1saS5vbmNlLGxpLmZpcmVFdmVudD1saS5maXJlLGxpLmhhc0V2ZW50TGlzdGVuZXJzPWxpLmxpc3RlbnM7dmFyIGNpPXYuZXh0ZW5kKGxpKSxfaT1NYXRoLnRydW5jfHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wP01hdGguZmxvb3IodCk6TWF0aC5jZWlsKHQpfTt4LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHgodGhpcy54LHRoaXMueSl9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQodyh0KSl9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LHN1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1YnRyYWN0KHcodCkpfSxfc3VidHJhY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LGRpdmlkZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2RpdmlkZUJ5KHQpfSxfZGl2aWRlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0aXBseUJ5KHQpfSxfbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxzY2FsZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeCh0aGlzLngqdC54LHRoaXMueSp0LnkpfSx1bnNjYWxlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHRoaXMueC90LngsdGhpcy55L3QueSl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfSxmbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2Zsb29yKCl9LF9mbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc30sY2VpbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2NlaWwoKX0sX2NlaWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfSx0cnVuYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3RydW5jKCl9LF90cnVuYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9X2kodGhpcy54KSx0aGlzLnk9X2kodGhpcy55KSx0aGlzfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3ZhciBpPSh0PXcodCkpLngtdGhpcy54LGU9dC55LXRoaXMueTtyZXR1cm4gTWF0aC5zcXJ0KGkqaStlKmUpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9dyh0KSkueD09PXRoaXMueCYmdC55PT09dGhpcy55fSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdD13KHQpLE1hdGguYWJzKHQueCk8PU1hdGguYWJzKHRoaXMueCkmJk1hdGguYWJzKHQueSk8PU1hdGguYWJzKHRoaXMueSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuXCJQb2ludChcIithKHRoaXMueCkrXCIsIFwiK2EodGhpcy55KStcIilcIn19LFAucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dyh0KSx0aGlzLm1pbnx8dGhpcy5tYXg/KHRoaXMubWluLng9TWF0aC5taW4odC54LHRoaXMubWluLngpLHRoaXMubWF4Lng9TWF0aC5tYXgodC54LHRoaXMubWF4LngpLHRoaXMubWluLnk9TWF0aC5taW4odC55LHRoaXMubWluLnkpLHRoaXMubWF4Lnk9TWF0aC5tYXgodC55LHRoaXMubWF4LnkpKToodGhpcy5taW49dC5jbG9uZSgpLHRoaXMubWF4PXQuY2xvbmUoKSksdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeCgodGhpcy5taW4ueCt0aGlzLm1heC54KS8yLCh0aGlzLm1pbi55K3RoaXMubWF4LnkpLzIsdCl9LGdldEJvdHRvbUxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHgodGhpcy5taW4ueCx0aGlzLm1heC55KX0sZ2V0VG9wUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHgodGhpcy5tYXgueCx0aGlzLm1pbi55KX0sZ2V0VG9wTGVmdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1pbn0sZ2V0Qm90dG9tUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXh9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXguc3VidHJhY3QodGhpcy5taW4pfSxjb250YWluczpmdW5jdGlvbih0KXt2YXIgaSxlO3JldHVybih0PVwibnVtYmVyXCI9PXR5cGVvZiB0WzBdfHx0IGluc3RhbmNlb2YgeD93KHQpOmIodCkpaW5zdGFuY2VvZiBQPyhpPXQubWluLGU9dC5tYXgpOmk9ZT10LGkueD49dGhpcy5taW4ueCYmZS54PD10aGlzLm1heC54JiZpLnk+PXRoaXMubWluLnkmJmUueTw9dGhpcy5tYXgueX0saW50ZXJzZWN0czpmdW5jdGlvbih0KXt0PWIodCk7dmFyIGk9dGhpcy5taW4sZT10aGlzLm1heCxuPXQubWluLG89dC5tYXgscz1vLng+PWkueCYmbi54PD1lLngscj1vLnk+PWkueSYmbi55PD1lLnk7cmV0dXJuIHMmJnJ9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9Yih0KTt2YXIgaT10aGlzLm1pbixlPXRoaXMubWF4LG49dC5taW4sbz10Lm1heCxzPW8ueD5pLngmJm4ueDxlLngscj1vLnk+aS55JiZuLnk8ZS55O3JldHVybiBzJiZyfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5taW58fCF0aGlzLm1heCl9fSxULnByb3RvdHlwZT17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10aGlzLl9zb3V0aFdlc3Qsbz10aGlzLl9ub3J0aEVhc3Q7aWYodCBpbnN0YW5jZW9mIE0paT10LGU9dDtlbHNle2lmKCEodCBpbnN0YW5jZW9mIFQpKXJldHVybiB0P3RoaXMuZXh0ZW5kKEModCl8fHoodCkpOnRoaXM7aWYoaT10Ll9zb3V0aFdlc3QsZT10Ll9ub3J0aEVhc3QsIWl8fCFlKXJldHVybiB0aGlzfXJldHVybiBufHxvPyhuLmxhdD1NYXRoLm1pbihpLmxhdCxuLmxhdCksbi5sbmc9TWF0aC5taW4oaS5sbmcsbi5sbmcpLG8ubGF0PU1hdGgubWF4KGUubGF0LG8ubGF0KSxvLmxuZz1NYXRoLm1heChlLmxuZyxvLmxuZykpOih0aGlzLl9zb3V0aFdlc3Q9bmV3IE0oaS5sYXQsaS5sbmcpLHRoaXMuX25vcnRoRWFzdD1uZXcgTShlLmxhdCxlLmxuZykpLHRoaXN9LHBhZDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj1NYXRoLmFicyhpLmxhdC1lLmxhdCkqdCxvPU1hdGguYWJzKGkubG5nLWUubG5nKSp0O3JldHVybiBuZXcgVChuZXcgTShpLmxhdC1uLGkubG5nLW8pLG5ldyBNKGUubGF0K24sZS5sbmcrbykpfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0oKHRoaXMuX3NvdXRoV2VzdC5sYXQrdGhpcy5fbm9ydGhFYXN0LmxhdCkvMiwodGhpcy5fc291dGhXZXN0LmxuZyt0aGlzLl9ub3J0aEVhc3QubG5nKS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdH0sZ2V0Tm9ydGhFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vcnRoRWFzdH0sZ2V0Tm9ydGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNKHRoaXMuZ2V0Tm9ydGgoKSx0aGlzLmdldFdlc3QoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTSh0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCkpfSxnZXRXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sbmd9LGdldFNvdXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxuZ30sZ2V0Tm9ydGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxhdH0sY29udGFpbnM6ZnVuY3Rpb24odCl7dD1cIm51bWJlclwiPT10eXBlb2YgdFswXXx8dCBpbnN0YW5jZW9mIE18fFwibGF0XCJpbiB0P0ModCk6eih0KTt2YXIgaSxlLG49dGhpcy5fc291dGhXZXN0LG89dGhpcy5fbm9ydGhFYXN0O3JldHVybiB0IGluc3RhbmNlb2YgVD8oaT10LmdldFNvdXRoV2VzdCgpLGU9dC5nZXROb3J0aEVhc3QoKSk6aT1lPXQsaS5sYXQ+PW4ubGF0JiZlLmxhdDw9by5sYXQmJmkubG5nPj1uLmxuZyYmZS5sbmc8PW8ubG5nfSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQpe3Q9eih0KTt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLG89dC5nZXROb3J0aEVhc3QoKSxzPW8ubGF0Pj1pLmxhdCYmbi5sYXQ8PWUubGF0LHI9by5sbmc+PWkubG5nJiZuLmxuZzw9ZS5sbmc7cmV0dXJuIHMmJnJ9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9eih0KTt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLG89dC5nZXROb3J0aEVhc3QoKSxzPW8ubGF0PmkubGF0JiZuLmxhdDxlLmxhdCxyPW8ubG5nPmkubG5nJiZuLmxuZzxlLmxuZztyZXR1cm4gcyYmcn0sdG9CQm94U3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZ2V0V2VzdCgpLHRoaXMuZ2V0U291dGgoKSx0aGlzLmdldEVhc3QoKSx0aGlzLmdldE5vcnRoKCldLmpvaW4oXCIsXCIpfSxlcXVhbHM6ZnVuY3Rpb24odCxpKXtyZXR1cm4hIXQmJih0PXoodCksdGhpcy5fc291dGhXZXN0LmVxdWFscyh0LmdldFNvdXRoV2VzdCgpLGkpJiZ0aGlzLl9ub3J0aEVhc3QuZXF1YWxzKHQuZ2V0Tm9ydGhFYXN0KCksaSkpfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5fc291dGhXZXN0fHwhdGhpcy5fbm9ydGhFYXN0KX19LE0ucHJvdG90eXBlPXtlcXVhbHM6ZnVuY3Rpb24odCxpKXtyZXR1cm4hIXQmJih0PUModCksTWF0aC5tYXgoTWF0aC5hYnModGhpcy5sYXQtdC5sYXQpLE1hdGguYWJzKHRoaXMubG5nLXQubG5nKSk8PSh2b2lkIDA9PT1pPzFlLTk6aSkpfSx0b1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm5cIkxhdExuZyhcIithKHRoaXMubGF0LHQpK1wiLCBcIithKHRoaXMubG5nLHQpK1wiKVwifSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBwaS5kaXN0YW5jZSh0aGlzLEModCkpfSx3cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHBpLndyYXBMYXRMbmcodGhpcyl9LHRvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBpPTE4MCp0LzQwMDc1MDE3LGU9aS9NYXRoLmNvcyhNYXRoLlBJLzE4MCp0aGlzLmxhdCk7cmV0dXJuIHooW3RoaXMubGF0LWksdGhpcy5sbmctZV0sW3RoaXMubGF0K2ksdGhpcy5sbmcrZV0pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgTSh0aGlzLmxhdCx0aGlzLmxuZyx0aGlzLmFsdCl9fTt2YXIgZGk9e2xhdExuZ1RvUG9pbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KSxuPXRoaXMuc2NhbGUoaSk7cmV0dXJuIHRoaXMudHJhbnNmb3JtYXRpb24uX3RyYW5zZm9ybShlLG4pfSxwb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5zY2FsZShpKSxuPXRoaXMudHJhbnNmb3JtYXRpb24udW50cmFuc2Zvcm0odCxlKTtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdChuKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QodCl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdCh0KX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDI1NipNYXRoLnBvdygyLHQpfSx6b29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0LzI1NikvTWF0aC5MTjJ9LGdldFByb2plY3RlZEJvdW5kczpmdW5jdGlvbih0KXtpZih0aGlzLmluZmluaXRlKXJldHVybiBudWxsO3ZhciBpPXRoaXMucHJvamVjdGlvbi5ib3VuZHMsZT10aGlzLnNjYWxlKHQpO3JldHVybiBuZXcgUCh0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShpLm1pbixlKSx0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShpLm1heCxlKSl9LGluZmluaXRlOiExLHdyYXBMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy53cmFwTG5nP3ModC5sbmcsdGhpcy53cmFwTG5nLCEwKTp0LmxuZztyZXR1cm4gbmV3IE0odGhpcy53cmFwTGF0P3ModC5sYXQsdGhpcy53cmFwTGF0LCEwKTp0LmxhdCxpLHQuYWx0KX0sd3JhcExhdExuZ0JvdW5kczpmdW5jdGlvbih0KXt2YXIgaT10LmdldENlbnRlcigpLGU9dGhpcy53cmFwTGF0TG5nKGkpLG49aS5sYXQtZS5sYXQsbz1pLmxuZy1lLmxuZztpZigwPT09biYmMD09PW8pcmV0dXJuIHQ7dmFyIHM9dC5nZXRTb3V0aFdlc3QoKSxyPXQuZ2V0Tm9ydGhFYXN0KCk7cmV0dXJuIG5ldyBUKG5ldyBNKHMubGF0LW4scy5sbmctbyksbmV3IE0oci5sYXQtbixyLmxuZy1vKSl9fSxwaT1pKHt9LGRpLHt3cmFwTG5nOlstMTgwLDE4MF0sUjo2MzcxZTMsZGlzdGFuY2U6ZnVuY3Rpb24odCxpKXt2YXIgZT1NYXRoLlBJLzE4MCxuPXQubGF0KmUsbz1pLmxhdCplLHM9TWF0aC5zaW4oKGkubGF0LXQubGF0KSplLzIpLHI9TWF0aC5zaW4oKGkubG5nLXQubG5nKSplLzIpLGE9cypzK01hdGguY29zKG4pKk1hdGguY29zKG8pKnIqcixoPTIqTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksTWF0aC5zcXJ0KDEtYSkpO3JldHVybiB0aGlzLlIqaH19KSxtaT17Ujo2Mzc4MTM3LE1BWF9MQVRJVFVERTo4NS4wNTExMjg3Nzk4LHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5QSS8xODAsZT10aGlzLk1BWF9MQVRJVFVERSxuPU1hdGgubWF4KE1hdGgubWluKGUsdC5sYXQpLC1lKSxvPU1hdGguc2luKG4qaSk7cmV0dXJuIG5ldyB4KHRoaXMuUip0LmxuZyppLHRoaXMuUipNYXRoLmxvZygoMStvKS8oMS1vKSkvMil9LHVucHJvamVjdDpmdW5jdGlvbih0KXt2YXIgaT0xODAvTWF0aC5QSTtyZXR1cm4gbmV3IE0oKDIqTWF0aC5hdGFuKE1hdGguZXhwKHQueS90aGlzLlIpKS1NYXRoLlBJLzIpKmksdC54KmkvdGhpcy5SKX0sYm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9NjM3ODEzNypNYXRoLlBJO3JldHVybiBuZXcgUChbLXQsLXRdLFt0LHRdKX0oKX07Uy5wcm90b3R5cGU9e3RyYW5zZm9ybTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl90cmFuc2Zvcm0odC5jbG9uZSgpLGkpfSxfdHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8MSx0Lng9aSoodGhpcy5fYSp0LngrdGhpcy5fYiksdC55PWkqKHRoaXMuX2MqdC55K3RoaXMuX2QpLHR9LHVudHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8MSxuZXcgeCgodC54L2ktdGhpcy5fYikvdGhpcy5fYSwodC55L2ktdGhpcy5fZCkvdGhpcy5fYyl9fTt2YXIgZmksZ2ksdmkseWk9aSh7fSxwaSx7Y29kZTpcIkVQU0c6Mzg1N1wiLHByb2plY3Rpb246bWksdHJhbnNmb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgdD0uNS8oTWF0aC5QSSptaS5SKTtyZXR1cm4gWih0LC41LC10LC41KX0oKX0pLHhpPWkoe30seWkse2NvZGU6XCJFUFNHOjkwMDkxM1wifSksd2k9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLFBpPVwiQWN0aXZlWE9iamVjdFwiaW4gd2luZG93LExpPVBpJiYhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcixiaT1cIm1zTGF1bmNoVXJpXCJpbiBuYXZpZ2F0b3ImJiEoXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50KSxUaT1CKFwid2Via2l0XCIpLHppPUIoXCJhbmRyb2lkXCIpLE1pPUIoXCJhbmRyb2lkIDJcIil8fEIoXCJhbmRyb2lkIDNcIiksQ2k9cGFyc2VJbnQoL1dlYktpdFxcLyhbMC05XSspfCQvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudClbMV0sMTApLFNpPXppJiZCKFwiR29vZ2xlXCIpJiZDaTw1MzcmJiEoXCJBdWRpb05vZGVcImluIHdpbmRvdyksWmk9ISF3aW5kb3cub3BlcmEsRWk9QihcImNocm9tZVwiKSxraT1CKFwiZ2Vja29cIikmJiFUaSYmIVppJiYhUGksQmk9IUVpJiZCKFwic2FmYXJpXCIpLEFpPUIoXCJwaGFudG9tXCIpLElpPVwiT1RyYW5zaXRpb25cImluIHdpLE9pPTA9PT1uYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZihcIldpblwiKSxSaT1QaSYmXCJ0cmFuc2l0aW9uXCJpbiB3aSxOaT1cIldlYktpdENTU01hdHJpeFwiaW4gd2luZG93JiZcIm0xMVwiaW4gbmV3IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgmJiFNaSxEaT1cIk1velBlcnNwZWN0aXZlXCJpbiB3aSxqaT0hd2luZG93LkxfRElTQUJMRV8zRCYmKFJpfHxOaXx8RGkpJiYhSWkmJiFBaSxXaT1cInVuZGVmaW5lZFwiIT10eXBlb2Ygb3JpZW50YXRpb258fEIoXCJtb2JpbGVcIiksSGk9V2kmJlRpLEZpPVdpJiZOaSxVaT0hd2luZG93LlBvaW50ZXJFdmVudCYmd2luZG93Lk1TUG9pbnRlckV2ZW50LFZpPSEoIXdpbmRvdy5Qb2ludGVyRXZlbnQmJiFVaSkscWk9IXdpbmRvdy5MX05PX1RPVUNIJiYoVml8fFwib250b3VjaHN0YXJ0XCJpbiB3aW5kb3d8fHdpbmRvdy5Eb2N1bWVudFRvdWNoJiZkb2N1bWVudCBpbnN0YW5jZW9mIHdpbmRvdy5Eb2N1bWVudFRvdWNoKSxHaT1XaSYmWmksS2k9V2kmJmtpLFlpPSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8d2luZG93LnNjcmVlbi5kZXZpY2VYRFBJL3dpbmRvdy5zY3JlZW4ubG9naWNhbFhEUEkpPjEsWGk9ISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQsSmk9ISghZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TfHwhRShcInN2Z1wiKS5jcmVhdGVTVkdSZWN0KSwkaT0hSmkmJmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj1cIjFcIi8+Jzt2YXIgaT10LmZpcnN0Q2hpbGQ7cmV0dXJuIGkuc3R5bGUuYmVoYXZpb3I9XCJ1cmwoI2RlZmF1bHQjVk1MKVwiLGkmJlwib2JqZWN0XCI9PXR5cGVvZiBpLmFkan1jYXRjaCh0KXtyZXR1cm4hMX19KCksUWk9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2llOlBpLGllbHQ5OkxpLGVkZ2U6Ymksd2Via2l0OlRpLGFuZHJvaWQ6emksYW5kcm9pZDIzOk1pLGFuZHJvaWRTdG9jazpTaSxvcGVyYTpaaSxjaHJvbWU6RWksZ2Vja286a2ksc2FmYXJpOkJpLHBoYW50b206QWksb3BlcmExMjpJaSx3aW46T2ksaWUzZDpSaSx3ZWJraXQzZDpOaSxnZWNrbzNkOkRpLGFueTNkOmppLG1vYmlsZTpXaSxtb2JpbGVXZWJraXQ6SGksbW9iaWxlV2Via2l0M2Q6RmksbXNQb2ludGVyOlVpLHBvaW50ZXI6VmksdG91Y2g6cWksbW9iaWxlT3BlcmE6R2ksbW9iaWxlR2Vja286S2kscmV0aW5hOllpLGNhbnZhczpYaSxzdmc6Smksdm1sOiRpfSksdGU9VWk/XCJNU1BvaW50ZXJEb3duXCI6XCJwb2ludGVyZG93blwiLGllPVVpP1wiTVNQb2ludGVyTW92ZVwiOlwicG9pbnRlcm1vdmVcIixlZT1VaT9cIk1TUG9pbnRlclVwXCI6XCJwb2ludGVydXBcIixuZT1VaT9cIk1TUG9pbnRlckNhbmNlbFwiOlwicG9pbnRlcmNhbmNlbFwiLG9lPVtcIklOUFVUXCIsXCJTRUxFQ1RcIixcIk9QVElPTlwiXSxzZT17fSxyZT0hMSxhZT0wLGhlPVVpP1wiTVNQb2ludGVyRG93blwiOlZpP1wicG9pbnRlcmRvd25cIjpcInRvdWNoc3RhcnRcIix1ZT1VaT9cIk1TUG9pbnRlclVwXCI6Vmk/XCJwb2ludGVydXBcIjpcInRvdWNoZW5kXCIsbGU9XCJfbGVhZmxldF9cIixjZT1zdChbXCJ0cmFuc2Zvcm1cIixcIndlYmtpdFRyYW5zZm9ybVwiLFwiT1RyYW5zZm9ybVwiLFwiTW96VHJhbnNmb3JtXCIsXCJtc1RyYW5zZm9ybVwiXSksX2U9c3QoW1wid2Via2l0VHJhbnNpdGlvblwiLFwidHJhbnNpdGlvblwiLFwiT1RyYW5zaXRpb25cIixcIk1velRyYW5zaXRpb25cIixcIm1zVHJhbnNpdGlvblwiXSksZGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCI9PT1fZXx8XCJPVHJhbnNpdGlvblwiPT09X2U/X2UrXCJFbmRcIjpcInRyYW5zaXRpb25lbmRcIjtpZihcIm9uc2VsZWN0c3RhcnRcImluIGRvY3VtZW50KWZpPWZ1bmN0aW9uKCl7bXQod2luZG93LFwic2VsZWN0c3RhcnRcIixQdCl9LGdpPWZ1bmN0aW9uKCl7ZnQod2luZG93LFwic2VsZWN0c3RhcnRcIixQdCl9O2Vsc2V7dmFyIHBlPXN0KFtcInVzZXJTZWxlY3RcIixcIldlYmtpdFVzZXJTZWxlY3RcIixcIk9Vc2VyU2VsZWN0XCIsXCJNb3pVc2VyU2VsZWN0XCIsXCJtc1VzZXJTZWxlY3RcIl0pO2ZpPWZ1bmN0aW9uKCl7aWYocGUpe3ZhciB0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTt2aT10W3BlXSx0W3BlXT1cIm5vbmVcIn19LGdpPWZ1bmN0aW9uKCl7cGUmJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGVbcGVdPXZpLHZpPXZvaWQgMCl9fXZhciBtZSxmZSxnZSx2ZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7VFJBTlNGT1JNOmNlLFRSQU5TSVRJT046X2UsVFJBTlNJVElPTl9FTkQ6ZGUsZ2V0OlYsZ2V0U3R5bGU6cSxjcmVhdGU6RyxyZW1vdmU6SyxlbXB0eTpZLHRvRnJvbnQ6WCx0b0JhY2s6SixoYXNDbGFzczokLGFkZENsYXNzOlEscmVtb3ZlQ2xhc3M6dHQsc2V0Q2xhc3M6aXQsZ2V0Q2xhc3M6ZXQsc2V0T3BhY2l0eTpudCx0ZXN0UHJvcDpzdCxzZXRUcmFuc2Zvcm06cnQsc2V0UG9zaXRpb246YXQsZ2V0UG9zaXRpb246aHQsZGlzYWJsZVRleHRTZWxlY3Rpb246ZmksZW5hYmxlVGV4dFNlbGVjdGlvbjpnaSxkaXNhYmxlSW1hZ2VEcmFnOnV0LGVuYWJsZUltYWdlRHJhZzpsdCxwcmV2ZW50T3V0bGluZTpjdCxyZXN0b3JlT3V0bGluZTpfdCxnZXRTaXplZFBhcmVudE5vZGU6ZHQsZ2V0U2NhbGU6cHR9KSx5ZT1cIl9sZWFmbGV0X2V2ZW50c1wiLHhlPU9pJiZFaT8yKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOmtpP3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjEsd2U9e30sUGU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe29uOm10LG9mZjpmdCxzdG9wUHJvcGFnYXRpb246eXQsZGlzYWJsZVNjcm9sbFByb3BhZ2F0aW9uOnh0LGRpc2FibGVDbGlja1Byb3BhZ2F0aW9uOnd0LHByZXZlbnREZWZhdWx0OlB0LHN0b3A6THQsZ2V0TW91c2VQb3NpdGlvbjpidCxnZXRXaGVlbERlbHRhOlR0LGZha2VTdG9wOnp0LHNraXBwZWQ6TXQsaXNFeHRlcm5hbFRhcmdldDpDdCxhZGRMaXN0ZW5lcjptdCxyZW1vdmVMaXN0ZW5lcjpmdH0pLExlPWNpLmV4dGVuZCh7cnVuOmZ1bmN0aW9uKHQsaSxlLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9kdXJhdGlvbj1lfHwuMjUsdGhpcy5fZWFzZU91dFBvd2VyPTEvTWF0aC5tYXgobnx8LjUsLjIpLHRoaXMuX3N0YXJ0UG9zPWh0KHQpLHRoaXMuX29mZnNldD1pLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9zKSx0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlLHRoaXMuZmlyZShcInN0YXJ0XCIpLHRoaXMuX2FuaW1hdGUoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2luUHJvZ3Jlc3MmJih0aGlzLl9zdGVwKCEwKSx0aGlzLl9jb21wbGV0ZSgpKX0sX2FuaW1hdGU6ZnVuY3Rpb24oKXt0aGlzLl9hbmltSWQ9Zih0aGlzLl9hbmltYXRlLHRoaXMpLHRoaXMuX3N0ZXAoKX0sX3N0ZXA6ZnVuY3Rpb24odCl7dmFyIGk9K25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSxlPTFlMyp0aGlzLl9kdXJhdGlvbjtpPGU/dGhpcy5fcnVuRnJhbWUodGhpcy5fZWFzZU91dChpL2UpLHQpOih0aGlzLl9ydW5GcmFtZSgxKSx0aGlzLl9jb21wbGV0ZSgpKX0sX3J1bkZyYW1lOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5fc3RhcnRQb3MuYWRkKHRoaXMuX29mZnNldC5tdWx0aXBseUJ5KHQpKTtpJiZlLl9yb3VuZCgpLGF0KHRoaXMuX2VsLGUpLHRoaXMuZmlyZShcInN0ZXBcIil9LF9jb21wbGV0ZTpmdW5jdGlvbigpe2codGhpcy5fYW5pbUlkKSx0aGlzLl9pblByb2dyZXNzPSExLHRoaXMuZmlyZShcImVuZFwiKX0sX2Vhc2VPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LHRoaXMuX2Vhc2VPdXRQb3dlcil9fSksYmU9Y2kuZXh0ZW5kKHtvcHRpb25zOntjcnM6eWksY2VudGVyOnZvaWQgMCx6b29tOnZvaWQgMCxtaW5ab29tOnZvaWQgMCxtYXhab29tOnZvaWQgMCxsYXllcnM6W10sbWF4Qm91bmRzOnZvaWQgMCxyZW5kZXJlcjp2b2lkIDAsem9vbUFuaW1hdGlvbjohMCx6b29tQW5pbWF0aW9uVGhyZXNob2xkOjQsZmFkZUFuaW1hdGlvbjohMCxtYXJrZXJab29tQW5pbWF0aW9uOiEwLHRyYW5zZm9ybTNETGltaXQ6ODM4ODYwOCx6b29tU25hcDoxLHpvb21EZWx0YToxLHRyYWNrUmVzaXplOiEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7aT1sKHRoaXMsaSksdGhpcy5faGFuZGxlcnM9W10sdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX3pvb21Cb3VuZExheWVycz17fSx0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLl9pbml0Q29udGFpbmVyKHQpLHRoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl9vblJlc2l6ZT1lKHRoaXMuX29uUmVzaXplLHRoaXMpLHRoaXMuX2luaXRFdmVudHMoKSxpLm1heEJvdW5kcyYmdGhpcy5zZXRNYXhCb3VuZHMoaS5tYXhCb3VuZHMpLHZvaWQgMCE9PWkuem9vbSYmKHRoaXMuX3pvb209dGhpcy5fbGltaXRab29tKGkuem9vbSkpLGkuY2VudGVyJiZ2b2lkIDAhPT1pLnpvb20mJnRoaXMuc2V0VmlldyhDKGkuY2VudGVyKSxpLnpvb20se3Jlc2V0OiEwfSksdGhpcy5jYWxsSW5pdEhvb2tzKCksdGhpcy5fem9vbUFuaW1hdGVkPV9lJiZqaSYmIUdpJiZ0aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvbix0aGlzLl96b29tQW5pbWF0ZWQmJih0aGlzLl9jcmVhdGVBbmltUHJveHkoKSxtdCh0aGlzLl9wcm94eSxkZSx0aGlzLl9jYXRjaFRyYW5zaXRpb25FbmQsdGhpcykpLHRoaXMuX2FkZExheWVycyh0aGlzLm9wdGlvbnMubGF5ZXJzKX0sc2V0VmlldzpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGU9dm9pZCAwPT09ZT90aGlzLl96b29tOnRoaXMuX2xpbWl0Wm9vbShlKSx0PXRoaXMuX2xpbWl0Q2VudGVyKEModCksZSx0aGlzLm9wdGlvbnMubWF4Qm91bmRzKSxuPW58fHt9LHRoaXMuX3N0b3AoKSx0aGlzLl9sb2FkZWQmJiFuLnJlc2V0JiYhMCE9PW4mJih2b2lkIDAhPT1uLmFuaW1hdGUmJihuLnpvb209aSh7YW5pbWF0ZTpuLmFuaW1hdGV9LG4uem9vbSksbi5wYW49aSh7YW5pbWF0ZTpuLmFuaW1hdGUsZHVyYXRpb246bi5kdXJhdGlvbn0sbi5wYW4pKSx0aGlzLl96b29tIT09ZT90aGlzLl90cnlBbmltYXRlZFpvb20mJnRoaXMuX3RyeUFuaW1hdGVkWm9vbSh0LGUsbi56b29tKTp0aGlzLl90cnlBbmltYXRlZFBhbih0LG4ucGFuKSk/KGNsZWFyVGltZW91dCh0aGlzLl9zaXplVGltZXIpLHRoaXMpOih0aGlzLl9yZXNldFZpZXcodCxlKSx0aGlzKX0sc2V0Wm9vbTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl9sb2FkZWQ/dGhpcy5zZXRWaWV3KHRoaXMuZ2V0Q2VudGVyKCksdCx7em9vbTppfSk6KHRoaXMuX3pvb209dCx0aGlzKX0sem9vbUluOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ9dHx8KGppP3RoaXMub3B0aW9ucy56b29tRGVsdGE6MSksdGhpcy5zZXRab29tKHRoaXMuX3pvb20rdCxpKX0sem9vbU91dDpmdW5jdGlvbih0LGkpe3JldHVybiB0PXR8fChqaT90aGlzLm9wdGlvbnMuem9vbURlbHRhOjEpLHRoaXMuc2V0Wm9vbSh0aGlzLl96b29tLXQsaSl9LHNldFpvb21Bcm91bmQ6ZnVuY3Rpb24odCxpLGUpe3ZhciBuPXRoaXMuZ2V0Wm9vbVNjYWxlKGkpLG89dGhpcy5nZXRTaXplKCkuZGl2aWRlQnkoMikscz0odCBpbnN0YW5jZW9mIHg/dDp0aGlzLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQodCkpLnN1YnRyYWN0KG8pLm11bHRpcGx5QnkoMS0xL24pLHI9dGhpcy5jb250YWluZXJQb2ludFRvTGF0TG5nKG8uYWRkKHMpKTtyZXR1cm4gdGhpcy5zZXRWaWV3KHIsaSx7em9vbTplfSl9LF9nZXRCb3VuZHNDZW50ZXJab29tOmZ1bmN0aW9uKHQsaSl7aT1pfHx7fSx0PXQuZ2V0Qm91bmRzP3QuZ2V0Qm91bmRzKCk6eih0KTt2YXIgZT13KGkucGFkZGluZ1RvcExlZnR8fGkucGFkZGluZ3x8WzAsMF0pLG49dyhpLnBhZGRpbmdCb3R0b21SaWdodHx8aS5wYWRkaW5nfHxbMCwwXSksbz10aGlzLmdldEJvdW5kc1pvb20odCwhMSxlLmFkZChuKSk7aWYoKG89XCJudW1iZXJcIj09dHlwZW9mIGkubWF4Wm9vbT9NYXRoLm1pbihpLm1heFpvb20sbyk6byk9PT0xLzApcmV0dXJue2NlbnRlcjp0LmdldENlbnRlcigpLHpvb206b307dmFyIHM9bi5zdWJ0cmFjdChlKS5kaXZpZGVCeSgyKSxyPXRoaXMucHJvamVjdCh0LmdldFNvdXRoV2VzdCgpLG8pLGE9dGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksbyk7cmV0dXJue2NlbnRlcjp0aGlzLnVucHJvamVjdChyLmFkZChhKS5kaXZpZGVCeSgyKS5hZGQocyksbyksem9vbTpvfX0sZml0Qm91bmRzOmZ1bmN0aW9uKHQsaSl7aWYoISh0PXoodCkpLmlzVmFsaWQoKSl0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZHMgYXJlIG5vdCB2YWxpZC5cIik7dmFyIGU9dGhpcy5fZ2V0Qm91bmRzQ2VudGVyWm9vbSh0LGkpO3JldHVybiB0aGlzLnNldFZpZXcoZS5jZW50ZXIsZS56b29tLGkpfSxmaXRXb3JsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maXRCb3VuZHMoW1stOTAsLTE4MF0sWzkwLDE4MF1dLHQpfSxwYW5UbzpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnNldFZpZXcodCx0aGlzLl96b29tLHtwYW46aX0pfSxwYW5CeTpmdW5jdGlvbih0LGkpe2lmKHQ9dyh0KS5yb3VuZCgpLGk9aXx8e30sIXQueCYmIXQueSlyZXR1cm4gdGhpcy5maXJlKFwibW92ZWVuZFwiKTtpZighMCE9PWkuYW5pbWF0ZSYmIXRoaXMuZ2V0U2l6ZSgpLmNvbnRhaW5zKHQpKXJldHVybiB0aGlzLl9yZXNldFZpZXcodGhpcy51bnByb2plY3QodGhpcy5wcm9qZWN0KHRoaXMuZ2V0Q2VudGVyKCkpLmFkZCh0KSksdGhpcy5nZXRab29tKCkpLHRoaXM7aWYodGhpcy5fcGFuQW5pbXx8KHRoaXMuX3BhbkFuaW09bmV3IExlLHRoaXMuX3BhbkFuaW0ub24oe3N0ZXA6dGhpcy5fb25QYW5UcmFuc2l0aW9uU3RlcCxlbmQ6dGhpcy5fb25QYW5UcmFuc2l0aW9uRW5kfSx0aGlzKSksaS5ub01vdmVTdGFydHx8dGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpLCExIT09aS5hbmltYXRlKXtRKHRoaXMuX21hcFBhbmUsXCJsZWFmbGV0LXBhbi1hbmltXCIpO3ZhciBlPXRoaXMuX2dldE1hcFBhbmVQb3MoKS5zdWJ0cmFjdCh0KS5yb3VuZCgpO3RoaXMuX3BhbkFuaW0ucnVuKHRoaXMuX21hcFBhbmUsZSxpLmR1cmF0aW9ufHwuMjUsaS5lYXNlTGluZWFyaXR5KX1lbHNlIHRoaXMuX3Jhd1BhbkJ5KHQpLHRoaXMuZmlyZShcIm1vdmVcIikuZmlyZShcIm1vdmVlbmRcIik7cmV0dXJuIHRoaXN9LGZseVRvOmZ1bmN0aW9uKHQsaSxlKXtmdW5jdGlvbiBuKHQpe3ZhciBpPShnKmctbSptKyh0Py0xOjEpKngqeCp2KnYpLygyKih0P2c6bSkqeCp2KSxlPU1hdGguc3FydChpKmkrMSktaTtyZXR1cm4gZTwxZS05Py0xODpNYXRoLmxvZyhlKX1mdW5jdGlvbiBvKHQpe3JldHVybihNYXRoLmV4cCh0KS1NYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gcyh0KXtyZXR1cm4oTWF0aC5leHAodCkrTWF0aC5leHAoLXQpKS8yfWZ1bmN0aW9uIHIodCl7cmV0dXJuIG8odCkvcyh0KX1mdW5jdGlvbiBhKHQpe3JldHVybiBtKihzKHcpL3Modyt5KnQpKX1mdW5jdGlvbiBoKHQpe3JldHVybiBtKihzKHcpKnIodyt5KnQpLW8odykpL3h9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsMS41KX1mdW5jdGlvbiBsKCl7dmFyIGU9KERhdGUubm93KCktUCkvYixuPXUoZSkqTDtlPD0xPyh0aGlzLl9mbHlUb0ZyYW1lPWYobCx0aGlzKSx0aGlzLl9tb3ZlKHRoaXMudW5wcm9qZWN0KGMuYWRkKF8uc3VidHJhY3QoYykubXVsdGlwbHlCeShoKG4pL3YpKSxwKSx0aGlzLmdldFNjYWxlWm9vbShtL2EobikscCkse2ZseVRvOiEwfSkpOnRoaXMuX21vdmUodCxpKS5fbW92ZUVuZCghMCl9aWYoITE9PT0oZT1lfHx7fSkuYW5pbWF0ZXx8IWppKXJldHVybiB0aGlzLnNldFZpZXcodCxpLGUpO3RoaXMuX3N0b3AoKTt2YXIgYz10aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSksXz10aGlzLnByb2plY3QodCksZD10aGlzLmdldFNpemUoKSxwPXRoaXMuX3pvb207dD1DKHQpLGk9dm9pZCAwPT09aT9wOmk7dmFyIG09TWF0aC5tYXgoZC54LGQueSksZz1tKnRoaXMuZ2V0Wm9vbVNjYWxlKHAsaSksdj1fLmRpc3RhbmNlVG8oYyl8fDEseT0xLjQyLHg9eSp5LHc9bigwKSxQPURhdGUubm93KCksTD0obigxKS13KS95LGI9ZS5kdXJhdGlvbj8xZTMqZS5kdXJhdGlvbjoxZTMqTCouODtyZXR1cm4gdGhpcy5fbW92ZVN0YXJ0KCEwLGUubm9Nb3ZlU3RhcnQpLGwuY2FsbCh0aGlzKSx0aGlzfSxmbHlUb0JvdW5kczpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX2dldEJvdW5kc0NlbnRlclpvb20odCxpKTtyZXR1cm4gdGhpcy5mbHlUbyhlLmNlbnRlcixlLnpvb20saSl9LHNldE1heEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4odD16KHQpKS5pc1ZhbGlkKCk/KHRoaXMub3B0aW9ucy5tYXhCb3VuZHMmJnRoaXMub2ZmKFwibW92ZWVuZFwiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcyksdGhpcy5vcHRpb25zLm1heEJvdW5kcz10LHRoaXMuX2xvYWRlZCYmdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzKCksdGhpcy5vbihcIm1vdmVlbmRcIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpKToodGhpcy5vcHRpb25zLm1heEJvdW5kcz1udWxsLHRoaXMub2ZmKFwibW92ZWVuZFwiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcykpfSxzZXRNaW5ab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5taW5ab29tO3JldHVybiB0aGlzLm9wdGlvbnMubWluWm9vbT10LHRoaXMuX2xvYWRlZCYmaSE9PXQmJih0aGlzLmZpcmUoXCJ6b29tbGV2ZWxzY2hhbmdlXCIpLHRoaXMuZ2V0Wm9vbSgpPHRoaXMub3B0aW9ucy5taW5ab29tKT90aGlzLnNldFpvb20odCk6dGhpc30sc2V0TWF4Wm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMubWF4Wm9vbTtyZXR1cm4gdGhpcy5vcHRpb25zLm1heFpvb209dCx0aGlzLl9sb2FkZWQmJmkhPT10JiYodGhpcy5maXJlKFwiem9vbWxldmVsc2NoYW5nZVwiKSx0aGlzLmdldFpvb20oKT50aGlzLm9wdGlvbnMubWF4Wm9vbSk/dGhpcy5zZXRab29tKHQpOnRoaXN9LHBhbkluc2lkZUJvdW5kczpmdW5jdGlvbih0LGkpe3RoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMDt2YXIgZT10aGlzLmdldENlbnRlcigpLG49dGhpcy5fbGltaXRDZW50ZXIoZSx0aGlzLl96b29tLHoodCkpO3JldHVybiBlLmVxdWFscyhuKXx8dGhpcy5wYW5UbyhuLGkpLHRoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMSx0aGlzfSxwYW5JbnNpZGU6ZnVuY3Rpb24odCxpKXt2YXIgZT13KChpPWl8fHt9KS5wYWRkaW5nVG9wTGVmdHx8aS5wYWRkaW5nfHxbMCwwXSksbj13KGkucGFkZGluZ0JvdHRvbVJpZ2h0fHxpLnBhZGRpbmd8fFswLDBdKSxvPXRoaXMuZ2V0Q2VudGVyKCkscz10aGlzLnByb2plY3Qobykscj10aGlzLnByb2plY3QodCksYT10aGlzLmdldFBpeGVsQm91bmRzKCksaD1hLmdldFNpemUoKS5kaXZpZGVCeSgyKSx1PWIoW2EubWluLmFkZChlKSxhLm1heC5zdWJ0cmFjdChuKV0pO2lmKCF1LmNvbnRhaW5zKHIpKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHM9ITA7dmFyIGw9cy5zdWJ0cmFjdChyKSxjPXcoci54K2wueCxyLnkrbC55KTsoci54PHUubWluLnh8fHIueD51Lm1heC54KSYmKGMueD1zLngtbC54LGwueD4wP2MueCs9aC54LWUueDpjLngtPWgueC1uLngpLChyLnk8dS5taW4ueXx8ci55PnUubWF4LnkpJiYoYy55PXMueS1sLnksbC55PjA/Yy55Kz1oLnktZS55OmMueS09aC55LW4ueSksdGhpcy5wYW5Ubyh0aGlzLnVucHJvamVjdChjKSxpKSx0aGlzLl9lbmZvcmNpbmdCb3VuZHM9ITF9cmV0dXJuIHRoaXN9LGludmFsaWRhdGVTaXplOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9sb2FkZWQpcmV0dXJuIHRoaXM7dD1pKHthbmltYXRlOiExLHBhbjohMH0sITA9PT10P3thbmltYXRlOiEwfTp0KTt2YXIgbj10aGlzLmdldFNpemUoKTt0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLl9sYXN0Q2VudGVyPW51bGw7dmFyIG89dGhpcy5nZXRTaXplKCkscz1uLmRpdmlkZUJ5KDIpLnJvdW5kKCkscj1vLmRpdmlkZUJ5KDIpLnJvdW5kKCksYT1zLnN1YnRyYWN0KHIpO3JldHVybiBhLnh8fGEueT8odC5hbmltYXRlJiZ0LnBhbj90aGlzLnBhbkJ5KGEpOih0LnBhbiYmdGhpcy5fcmF3UGFuQnkoYSksdGhpcy5maXJlKFwibW92ZVwiKSx0LmRlYm91bmNlTW92ZWVuZD8oY2xlYXJUaW1lb3V0KHRoaXMuX3NpemVUaW1lciksdGhpcy5fc2l6ZVRpbWVyPXNldFRpbWVvdXQoZSh0aGlzLmZpcmUsdGhpcyxcIm1vdmVlbmRcIiksMjAwKSk6dGhpcy5maXJlKFwibW92ZWVuZFwiKSksdGhpcy5maXJlKFwicmVzaXplXCIse29sZFNpemU6bixuZXdTaXplOm99KSk6dGhpc30sc3RvcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldFpvb20odGhpcy5fbGltaXRab29tKHRoaXMuX3pvb20pKSx0aGlzLm9wdGlvbnMuem9vbVNuYXB8fHRoaXMuZmlyZShcInZpZXdyZXNldFwiKSx0aGlzLl9zdG9wKCl9LGxvY2F0ZTpmdW5jdGlvbih0KXtpZih0PXRoaXMuX2xvY2F0ZU9wdGlvbnM9aSh7dGltZW91dDoxZTQsd2F0Y2g6ITF9LHQpLCEoXCJnZW9sb2NhdGlvblwiaW4gbmF2aWdhdG9yKSlyZXR1cm4gdGhpcy5faGFuZGxlR2VvbG9jYXRpb25FcnJvcih7Y29kZTowLG1lc3NhZ2U6XCJHZW9sb2NhdGlvbiBub3Qgc3VwcG9ydGVkLlwifSksdGhpczt2YXIgbj1lKHRoaXMuX2hhbmRsZUdlb2xvY2F0aW9uUmVzcG9uc2UsdGhpcyksbz1lKHRoaXMuX2hhbmRsZUdlb2xvY2F0aW9uRXJyb3IsdGhpcyk7cmV0dXJuIHQud2F0Y2g/dGhpcy5fbG9jYXRpb25XYXRjaElkPW5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKG4sbyx0KTpuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKG4sbyx0KSx0aGlzfSxzdG9wTG9jYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5nZW9sb2NhdGlvbiYmbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2gmJm5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHRoaXMuX2xvY2F0aW9uV2F0Y2hJZCksdGhpcy5fbG9jYXRlT3B0aW9ucyYmKHRoaXMuX2xvY2F0ZU9wdGlvbnMuc2V0Vmlldz0hMSksdGhpc30sX2hhbmRsZUdlb2xvY2F0aW9uRXJyb3I6ZnVuY3Rpb24odCl7dmFyIGk9dC5jb2RlLGU9dC5tZXNzYWdlfHwoMT09PWk/XCJwZXJtaXNzaW9uIGRlbmllZFwiOjI9PT1pP1wicG9zaXRpb24gdW5hdmFpbGFibGVcIjpcInRpbWVvdXRcIik7dGhpcy5fbG9jYXRlT3B0aW9ucy5zZXRWaWV3JiYhdGhpcy5fbG9hZGVkJiZ0aGlzLmZpdFdvcmxkKCksdGhpcy5maXJlKFwibG9jYXRpb25lcnJvclwiLHtjb2RlOmksbWVzc2FnZTpcIkdlb2xvY2F0aW9uIGVycm9yOiBcIitlK1wiLlwifSl9LF9oYW5kbGVHZW9sb2NhdGlvblJlc3BvbnNlOmZ1bmN0aW9uKHQpe3ZhciBpPW5ldyBNKHQuY29vcmRzLmxhdGl0dWRlLHQuY29vcmRzLmxvbmdpdHVkZSksZT1pLnRvQm91bmRzKDIqdC5jb29yZHMuYWNjdXJhY3kpLG49dGhpcy5fbG9jYXRlT3B0aW9ucztpZihuLnNldFZpZXcpe3ZhciBvPXRoaXMuZ2V0Qm91bmRzWm9vbShlKTt0aGlzLnNldFZpZXcoaSxuLm1heFpvb20/TWF0aC5taW4obyxuLm1heFpvb20pOm8pfXZhciBzPXtsYXRsbmc6aSxib3VuZHM6ZSx0aW1lc3RhbXA6dC50aW1lc3RhbXB9O2Zvcih2YXIgciBpbiB0LmNvb3JkcylcIm51bWJlclwiPT10eXBlb2YgdC5jb29yZHNbcl0mJihzW3JdPXQuY29vcmRzW3JdKTt0aGlzLmZpcmUoXCJsb2NhdGlvbmZvdW5kXCIscyl9LGFkZEhhbmRsZXI6ZnVuY3Rpb24odCxpKXtpZighaSlyZXR1cm4gdGhpczt2YXIgZT10aGlzW3RdPW5ldyBpKHRoaXMpO3JldHVybiB0aGlzLl9oYW5kbGVycy5wdXNoKGUpLHRoaXMub3B0aW9uc1t0XSYmZS5lbmFibGUoKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtpZih0aGlzLl9pbml0RXZlbnRzKCEwKSx0aGlzLl9jb250YWluZXJJZCE9PXRoaXMuX2NvbnRhaW5lci5fbGVhZmxldF9pZCl0aHJvdyBuZXcgRXJyb3IoXCJNYXAgY29udGFpbmVyIGlzIGJlaW5nIHJldXNlZCBieSBhbm90aGVyIGluc3RhbmNlXCIpO3RyeXtkZWxldGUgdGhpcy5fY29udGFpbmVyLl9sZWFmbGV0X2lkLGRlbGV0ZSB0aGlzLl9jb250YWluZXJJZH1jYXRjaCh0KXt0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQ9dm9pZCAwLHRoaXMuX2NvbnRhaW5lcklkPXZvaWQgMH12b2lkIDAhPT10aGlzLl9sb2NhdGlvbldhdGNoSWQmJnRoaXMuc3RvcExvY2F0ZSgpLHRoaXMuX3N0b3AoKSxLKHRoaXMuX21hcFBhbmUpLHRoaXMuX2NsZWFyQ29udHJvbFBvcyYmdGhpcy5fY2xlYXJDb250cm9sUG9zKCksdGhpcy5fcmVzaXplUmVxdWVzdCYmKGcodGhpcy5fcmVzaXplUmVxdWVzdCksdGhpcy5fcmVzaXplUmVxdWVzdD1udWxsKSx0aGlzLl9jbGVhckhhbmRsZXJzKCksdGhpcy5fbG9hZGVkJiZ0aGlzLmZpcmUoXCJ1bmxvYWRcIik7dmFyIHQ7Zm9yKHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5yZW1vdmUoKTtmb3IodCBpbiB0aGlzLl9wYW5lcylLKHRoaXMuX3BhbmVzW3RdKTtyZXR1cm4gdGhpcy5fbGF5ZXJzPVtdLHRoaXMuX3BhbmVzPVtdLGRlbGV0ZSB0aGlzLl9tYXBQYW5lLGRlbGV0ZSB0aGlzLl9yZW5kZXJlcix0aGlzfSxjcmVhdGVQYW5lOmZ1bmN0aW9uKHQsaSl7dmFyIGU9RyhcImRpdlwiLFwibGVhZmxldC1wYW5lXCIrKHQ/XCIgbGVhZmxldC1cIit0LnJlcGxhY2UoXCJQYW5lXCIsXCJcIikrXCItcGFuZVwiOlwiXCIpLGl8fHRoaXMuX21hcFBhbmUpO3JldHVybiB0JiYodGhpcy5fcGFuZXNbdF09ZSksZX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoZWNrSWZMb2FkZWQoKSx0aGlzLl9sYXN0Q2VudGVyJiYhdGhpcy5fbW92ZWQoKT90aGlzLl9sYXN0Q2VudGVyOnRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX2dldENlbnRlckxheWVyUG9pbnQoKSl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQaXhlbEJvdW5kcygpO3JldHVybiBuZXcgVCh0aGlzLnVucHJvamVjdCh0LmdldEJvdHRvbUxlZnQoKSksdGhpcy51bnByb2plY3QodC5nZXRUb3BSaWdodCgpKSl9LGdldE1pblpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20/dGhpcy5fbGF5ZXJzTWluWm9vbXx8MDp0aGlzLm9wdGlvbnMubWluWm9vbX0sZ2V0TWF4Wm9vbTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnMubWF4Wm9vbT92b2lkIDA9PT10aGlzLl9sYXllcnNNYXhab29tPzEvMDp0aGlzLl9sYXllcnNNYXhab29tOnRoaXMub3B0aW9ucy5tYXhab29tfSxnZXRCb3VuZHNab29tOmZ1bmN0aW9uKHQsaSxlKXt0PXoodCksZT13KGV8fFswLDBdKTt2YXIgbj10aGlzLmdldFpvb20oKXx8MCxvPXRoaXMuZ2V0TWluWm9vbSgpLHM9dGhpcy5nZXRNYXhab29tKCkscj10LmdldE5vcnRoV2VzdCgpLGE9dC5nZXRTb3V0aEVhc3QoKSxoPXRoaXMuZ2V0U2l6ZSgpLnN1YnRyYWN0KGUpLHU9Yih0aGlzLnByb2plY3QoYSxuKSx0aGlzLnByb2plY3QocixuKSkuZ2V0U2l6ZSgpLGw9amk/dGhpcy5vcHRpb25zLnpvb21TbmFwOjEsYz1oLngvdS54LF89aC55L3UueSxkPWk/TWF0aC5tYXgoYyxfKTpNYXRoLm1pbihjLF8pO3JldHVybiBuPXRoaXMuZ2V0U2NhbGVab29tKGQsbiksbCYmKG49TWF0aC5yb3VuZChuLyhsLzEwMCkpKihsLzEwMCksbj1pP01hdGguY2VpbChuL2wpKmw6TWF0aC5mbG9vcihuL2wpKmwpLE1hdGgubWF4KG8sTWF0aC5taW4ocyxuKSl9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZSYmIXRoaXMuX3NpemVDaGFuZ2VkfHwodGhpcy5fc2l6ZT1uZXcgeCh0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGh8fDAsdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodHx8MCksdGhpcy5fc2l6ZUNoYW5nZWQ9ITEpLHRoaXMuX3NpemUuY2xvbmUoKX0sZ2V0UGl4ZWxCb3VuZHM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRUb3BMZWZ0UG9pbnQodCxpKTtyZXR1cm4gbmV3IFAoZSxlLmFkZCh0aGlzLmdldFNpemUoKSkpfSxnZXRQaXhlbE9yaWdpbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5fcGl4ZWxPcmlnaW59LGdldFBpeGVsV29ybGRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMuZ2V0UHJvamVjdGVkQm91bmRzKHZvaWQgMD09PXQ/dGhpcy5nZXRab29tKCk6dCl9LGdldFBhbmU6ZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dGhpcy5fcGFuZXNbdF06dH0sZ2V0UGFuZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFuZXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LGdldFpvb21TY2FsZTpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMub3B0aW9ucy5jcnM7cmV0dXJuIGk9dm9pZCAwPT09aT90aGlzLl96b29tOmksZS5zY2FsZSh0KS9lLnNjYWxlKGkpfSxnZXRTY2FsZVpvb206ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLm9wdGlvbnMuY3JzO2k9dm9pZCAwPT09aT90aGlzLl96b29tOmk7dmFyIG49ZS56b29tKHQqZS5zY2FsZShpKSk7cmV0dXJuIGlzTmFOKG4pPzEvMDpufSxwcm9qZWN0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9dm9pZCAwPT09aT90aGlzLl96b29tOmksdGhpcy5vcHRpb25zLmNycy5sYXRMbmdUb1BvaW50KEModCksaSl9LHVucHJvamVjdDpmdW5jdGlvbih0LGkpe3JldHVybiBpPXZvaWQgMD09PWk/dGhpcy5fem9vbTppLHRoaXMub3B0aW9ucy5jcnMucG9pbnRUb0xhdExuZyh3KHQpLGkpfSxsYXllclBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dyh0KS5hZGQodGhpcy5nZXRQaXhlbE9yaWdpbigpKTtyZXR1cm4gdGhpcy51bnByb2plY3QoaSl9LGxhdExuZ1RvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0KEModCkpLl9yb3VuZCgpLl9zdWJ0cmFjdCh0aGlzLmdldFBpeGVsT3JpZ2luKCkpfSx3cmFwTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLndyYXBMYXRMbmcoQyh0KSl9LHdyYXBMYXRMbmdCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMud3JhcExhdExuZ0JvdW5kcyh6KHQpKX0sZGlzdGFuY2U6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy5kaXN0YW5jZShDKHQpLEMoaSkpfSxjb250YWluZXJQb2ludFRvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdyh0KS5zdWJ0cmFjdCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpfSxsYXllclBvaW50VG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdyh0KS5hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sY29udGFpbmVyUG9pbnRUb0xhdExuZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHcodCkpO3JldHVybiB0aGlzLmxheWVyUG9pbnRUb0xhdExuZyhpKX0sbGF0TG5nVG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9Db250YWluZXJQb2ludCh0aGlzLmxhdExuZ1RvTGF5ZXJQb2ludChDKHQpKSl9LG1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBidCh0LHRoaXMuX2NvbnRhaW5lcil9LG1vdXNlRXZlbnRUb0xheWVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSl9LG1vdXNlRXZlbnRUb0xhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9MYXRMbmcodGhpcy5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpKX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fY29udGFpbmVyPVYodCk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKFwiTWFwIGNvbnRhaW5lciBub3QgZm91bmQuXCIpO2lmKGkuX2xlYWZsZXRfaWQpdGhyb3cgbmV3IEVycm9yKFwiTWFwIGNvbnRhaW5lciBpcyBhbHJlYWR5IGluaXRpYWxpemVkLlwiKTttdChpLFwic2Nyb2xsXCIsdGhpcy5fb25TY3JvbGwsdGhpcyksdGhpcy5fY29udGFpbmVySWQ9bihpKX0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXI7dGhpcy5fZmFkZUFuaW1hdGVkPXRoaXMub3B0aW9ucy5mYWRlQW5pbWF0aW9uJiZqaSxRKHQsXCJsZWFmbGV0LWNvbnRhaW5lclwiKyhxaT9cIiBsZWFmbGV0LXRvdWNoXCI6XCJcIikrKFlpP1wiIGxlYWZsZXQtcmV0aW5hXCI6XCJcIikrKExpP1wiIGxlYWZsZXQtb2xkaWVcIjpcIlwiKSsoQmk/XCIgbGVhZmxldC1zYWZhcmlcIjpcIlwiKSsodGhpcy5fZmFkZUFuaW1hdGVkP1wiIGxlYWZsZXQtZmFkZS1hbmltXCI6XCJcIikpO3ZhciBpPXEodCxcInBvc2l0aW9uXCIpO1wiYWJzb2x1dGVcIiE9PWkmJlwicmVsYXRpdmVcIiE9PWkmJlwiZml4ZWRcIiE9PWkmJih0LnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIiksdGhpcy5faW5pdFBhbmVzKCksdGhpcy5faW5pdENvbnRyb2xQb3MmJnRoaXMuX2luaXRDb250cm9sUG9zKCl9LF9pbml0UGFuZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYW5lcz17fTt0aGlzLl9wYW5lUmVuZGVyZXJzPXt9LHRoaXMuX21hcFBhbmU9dGhpcy5jcmVhdGVQYW5lKFwibWFwUGFuZVwiLHRoaXMuX2NvbnRhaW5lciksYXQodGhpcy5fbWFwUGFuZSxuZXcgeCgwLDApKSx0aGlzLmNyZWF0ZVBhbmUoXCJ0aWxlUGFuZVwiKSx0aGlzLmNyZWF0ZVBhbmUoXCJzaGFkb3dQYW5lXCIpLHRoaXMuY3JlYXRlUGFuZShcIm92ZXJsYXlQYW5lXCIpLHRoaXMuY3JlYXRlUGFuZShcIm1hcmtlclBhbmVcIiksdGhpcy5jcmVhdGVQYW5lKFwidG9vbHRpcFBhbmVcIiksdGhpcy5jcmVhdGVQYW5lKFwicG9wdXBQYW5lXCIpLHRoaXMub3B0aW9ucy5tYXJrZXJab29tQW5pbWF0aW9ufHwoUSh0Lm1hcmtlclBhbmUsXCJsZWFmbGV0LXpvb20taGlkZVwiKSxRKHQuc2hhZG93UGFuZSxcImxlYWZsZXQtem9vbS1oaWRlXCIpKX0sX3Jlc2V0VmlldzpmdW5jdGlvbih0LGkpe2F0KHRoaXMuX21hcFBhbmUsbmV3IHgoMCwwKSk7dmFyIGU9IXRoaXMuX2xvYWRlZDt0aGlzLl9sb2FkZWQ9ITAsaT10aGlzLl9saW1pdFpvb20oaSksdGhpcy5maXJlKFwidmlld3ByZXJlc2V0XCIpO3ZhciBuPXRoaXMuX3pvb20hPT1pO3RoaXMuX21vdmVTdGFydChuLCExKS5fbW92ZSh0LGkpLl9tb3ZlRW5kKG4pLHRoaXMuZmlyZShcInZpZXdyZXNldFwiKSxlJiZ0aGlzLmZpcmUoXCJsb2FkXCIpfSxfbW92ZVN0YXJ0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQmJnRoaXMuZmlyZShcInpvb21zdGFydFwiKSxpfHx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpc30sX21vdmU6ZnVuY3Rpb24odCxpLGUpe3ZvaWQgMD09PWkmJihpPXRoaXMuX3pvb20pO3ZhciBuPXRoaXMuX3pvb20hPT1pO3JldHVybiB0aGlzLl96b29tPWksdGhpcy5fbGFzdENlbnRlcj10LHRoaXMuX3BpeGVsT3JpZ2luPXRoaXMuX2dldE5ld1BpeGVsT3JpZ2luKHQpLChufHxlJiZlLnBpbmNoKSYmdGhpcy5maXJlKFwiem9vbVwiLGUpLHRoaXMuZmlyZShcIm1vdmVcIixlKX0sX21vdmVFbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuZmlyZShcInpvb21lbmRcIiksdGhpcy5maXJlKFwibW92ZWVuZFwiKX0sX3N0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gZyh0aGlzLl9mbHlUb0ZyYW1lKSx0aGlzLl9wYW5BbmltJiZ0aGlzLl9wYW5BbmltLnN0b3AoKSx0aGlzfSxfcmF3UGFuQnk6ZnVuY3Rpb24odCl7YXQodGhpcy5fbWFwUGFuZSx0aGlzLl9nZXRNYXBQYW5lUG9zKCkuc3VidHJhY3QodCkpfSxfZ2V0Wm9vbVNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNYXhab29tKCktdGhpcy5nZXRNaW5ab29tKCl9LF9wYW5JbnNpZGVNYXhCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHN8fHRoaXMucGFuSW5zaWRlQm91bmRzKHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpfSxfY2hlY2tJZkxvYWRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKFwiU2V0IG1hcCBjZW50ZXIgYW5kIHpvb20gZmlyc3QuXCIpfSxfaW5pdEV2ZW50czpmdW5jdGlvbih0KXt0aGlzLl90YXJnZXRzPXt9LHRoaXMuX3RhcmdldHNbbih0aGlzLl9jb250YWluZXIpXT10aGlzO3ZhciBpPXQ/ZnQ6bXQ7aSh0aGlzLl9jb250YWluZXIsXCJjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vtb3ZlIGNvbnRleHRtZW51IGtleXByZXNzXCIsdGhpcy5faGFuZGxlRE9NRXZlbnQsdGhpcyksdGhpcy5vcHRpb25zLnRyYWNrUmVzaXplJiZpKHdpbmRvdyxcInJlc2l6ZVwiLHRoaXMuX29uUmVzaXplLHRoaXMpLGppJiZ0aGlzLm9wdGlvbnMudHJhbnNmb3JtM0RMaW1pdCYmKHQ/dGhpcy5vZmY6dGhpcy5vbikuY2FsbCh0aGlzLFwibW92ZWVuZFwiLHRoaXMuX29uTW92ZUVuZCl9LF9vblJlc2l6ZTpmdW5jdGlvbigpe2codGhpcy5fcmVzaXplUmVxdWVzdCksdGhpcy5fcmVzaXplUmVxdWVzdD1mKGZ1bmN0aW9uKCl7dGhpcy5pbnZhbGlkYXRlU2l6ZSh7ZGVib3VuY2VNb3ZlZW5kOiEwfSl9LHRoaXMpfSxfb25TY3JvbGw6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wPTAsdGhpcy5fY29udGFpbmVyLnNjcm9sbExlZnQ9MH0sX29uTW92ZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldE1hcFBhbmVQb3MoKTtNYXRoLm1heChNYXRoLmFicyh0LngpLE1hdGguYWJzKHQueSkpPj10aGlzLm9wdGlvbnMudHJhbnNmb3JtM0RMaW1pdCYmdGhpcy5fcmVzZXRWaWV3KHRoaXMuZ2V0Q2VudGVyKCksdGhpcy5nZXRab29tKCkpfSxfZmluZEV2ZW50VGFyZ2V0czpmdW5jdGlvbih0LGkpe2Zvcih2YXIgZSxvPVtdLHM9XCJtb3VzZW91dFwiPT09aXx8XCJtb3VzZW92ZXJcIj09PWkscj10LnRhcmdldHx8dC5zcmNFbGVtZW50LGE9ITE7cjspe2lmKChlPXRoaXMuX3RhcmdldHNbbihyKV0pJiYoXCJjbGlja1wiPT09aXx8XCJwcmVjbGlja1wiPT09aSkmJiF0Ll9zaW11bGF0ZWQmJnRoaXMuX2RyYWdnYWJsZU1vdmVkKGUpKXthPSEwO2JyZWFrfWlmKGUmJmUubGlzdGVucyhpLCEwKSl7aWYocyYmIUN0KHIsdCkpYnJlYWs7aWYoby5wdXNoKGUpLHMpYnJlYWt9aWYocj09PXRoaXMuX2NvbnRhaW5lcilicmVhaztyPXIucGFyZW50Tm9kZX1yZXR1cm4gby5sZW5ndGh8fGF8fHN8fCFDdChyLHQpfHwobz1bdGhpc10pLG99LF9oYW5kbGVET01FdmVudDpmdW5jdGlvbih0KXtpZih0aGlzLl9sb2FkZWQmJiFNdCh0KSl7dmFyIGk9dC50eXBlO1wibW91c2Vkb3duXCIhPT1pJiZcImtleXByZXNzXCIhPT1pfHxjdCh0LnRhcmdldHx8dC5zcmNFbGVtZW50KSx0aGlzLl9maXJlRE9NRXZlbnQodCxpKX19LF9tb3VzZUV2ZW50czpbXCJjbGlja1wiLFwiZGJsY2xpY2tcIixcIm1vdXNlb3ZlclwiLFwibW91c2VvdXRcIixcImNvbnRleHRtZW51XCJdLF9maXJlRE9NRXZlbnQ6ZnVuY3Rpb24odCxlLG4pe2lmKFwiY2xpY2tcIj09PXQudHlwZSl7dmFyIG89aSh7fSx0KTtvLnR5cGU9XCJwcmVjbGlja1wiLHRoaXMuX2ZpcmVET01FdmVudChvLG8udHlwZSxuKX1pZighdC5fc3RvcHBlZCYmKG49KG58fFtdKS5jb25jYXQodGhpcy5fZmluZEV2ZW50VGFyZ2V0cyh0LGUpKSkubGVuZ3RoKXt2YXIgcz1uWzBdO1wiY29udGV4dG1lbnVcIj09PWUmJnMubGlzdGVucyhlLCEwKSYmUHQodCk7dmFyIHI9e29yaWdpbmFsRXZlbnQ6dH07aWYoXCJrZXlwcmVzc1wiIT09dC50eXBlKXt2YXIgYT1zLmdldExhdExuZyYmKCFzLl9yYWRpdXN8fHMuX3JhZGl1czw9MTApO3IuY29udGFpbmVyUG9pbnQ9YT90aGlzLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQocy5nZXRMYXRMbmcoKSk6dGhpcy5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSxyLmxheWVyUG9pbnQ9dGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChyLmNvbnRhaW5lclBvaW50KSxyLmxhdGxuZz1hP3MuZ2V0TGF0TG5nKCk6dGhpcy5sYXllclBvaW50VG9MYXRMbmcoci5sYXllclBvaW50KX1mb3IodmFyIGg9MDtoPG4ubGVuZ3RoO2grKylpZihuW2hdLmZpcmUoZSxyLCEwKSxyLm9yaWdpbmFsRXZlbnQuX3N0b3BwZWR8fCExPT09bltoXS5vcHRpb25zLmJ1YmJsaW5nTW91c2VFdmVudHMmJi0xIT09ZCh0aGlzLl9tb3VzZUV2ZW50cyxlKSlyZXR1cm59fSxfZHJhZ2dhYmxlTW92ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9dC5kcmFnZ2luZyYmdC5kcmFnZ2luZy5lbmFibGVkKCk/dDp0aGlzKS5kcmFnZ2luZyYmdC5kcmFnZ2luZy5tb3ZlZCgpfHx0aGlzLmJveFpvb20mJnRoaXMuYm94Wm9vbS5tb3ZlZCgpfSxfY2xlYXJIYW5kbGVyczpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGk9dGhpcy5faGFuZGxlcnMubGVuZ3RoO3Q8aTt0KyspdGhpcy5faGFuZGxlcnNbdF0uZGlzYWJsZSgpfSx3aGVuUmVhZHk6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5fbG9hZGVkP3QuY2FsbChpfHx0aGlzLHt0YXJnZXQ6dGhpc30pOnRoaXMub24oXCJsb2FkXCIsdCxpKSx0aGlzfSxfZ2V0TWFwUGFuZVBvczpmdW5jdGlvbigpe3JldHVybiBodCh0aGlzLl9tYXBQYW5lKXx8bmV3IHgoMCwwKX0sX21vdmVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO3JldHVybiB0JiYhdC5lcXVhbHMoWzAsMF0pfSxfZ2V0VG9wTGVmdFBvaW50OmZ1bmN0aW9uKHQsaSl7cmV0dXJuKHQmJnZvaWQgMCE9PWk/dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4odCxpKTp0aGlzLmdldFBpeGVsT3JpZ2luKCkpLnN1YnRyYWN0KHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LF9nZXROZXdQaXhlbE9yaWdpbjpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKTtyZXR1cm4gdGhpcy5wcm9qZWN0KHQsaSkuX3N1YnRyYWN0KGUpLl9hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKS5fcm91bmQoKX0sX2xhdExuZ1RvTmV3TGF5ZXJQb2ludDpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4oZSxpKTtyZXR1cm4gdGhpcy5wcm9qZWN0KHQsaSkuX3N1YnRyYWN0KG4pfSxfbGF0TG5nQm91bmRzVG9OZXdMYXllckJvdW5kczpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4oZSxpKTtyZXR1cm4gYihbdGhpcy5wcm9qZWN0KHQuZ2V0U291dGhXZXN0KCksaSkuX3N1YnRyYWN0KG4pLHRoaXMucHJvamVjdCh0LmdldE5vcnRoV2VzdCgpLGkpLl9zdWJ0cmFjdChuKSx0aGlzLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSxpKS5fc3VidHJhY3QobiksdGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksaSkuX3N1YnRyYWN0KG4pXSl9LF9nZXRDZW50ZXJMYXllclBvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpKX0sX2dldENlbnRlck9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXRMbmdUb0xheWVyUG9pbnQodCkuc3VidHJhY3QodGhpcy5fZ2V0Q2VudGVyTGF5ZXJQb2ludCgpKX0sX2xpbWl0Q2VudGVyOmZ1bmN0aW9uKHQsaSxlKXtpZighZSlyZXR1cm4gdDt2YXIgbj10aGlzLnByb2plY3QodCxpKSxvPXRoaXMuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLHM9bmV3IFAobi5zdWJ0cmFjdChvKSxuLmFkZChvKSkscj10aGlzLl9nZXRCb3VuZHNPZmZzZXQocyxlLGkpO3JldHVybiByLnJvdW5kKCkuZXF1YWxzKFswLDBdKT90OnRoaXMudW5wcm9qZWN0KG4uYWRkKHIpLGkpfSxfbGltaXRPZmZzZXQ6ZnVuY3Rpb24odCxpKXtpZighaSlyZXR1cm4gdDt2YXIgZT10aGlzLmdldFBpeGVsQm91bmRzKCksbj1uZXcgUChlLm1pbi5hZGQodCksZS5tYXguYWRkKHQpKTtyZXR1cm4gdC5hZGQodGhpcy5fZ2V0Qm91bmRzT2Zmc2V0KG4saSkpfSxfZ2V0Qm91bmRzT2Zmc2V0OmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj1iKHRoaXMucHJvamVjdChpLmdldE5vcnRoRWFzdCgpLGUpLHRoaXMucHJvamVjdChpLmdldFNvdXRoV2VzdCgpLGUpKSxvPW4ubWluLnN1YnRyYWN0KHQubWluKSxzPW4ubWF4LnN1YnRyYWN0KHQubWF4KTtyZXR1cm4gbmV3IHgodGhpcy5fcmVib3VuZChvLngsLXMueCksdGhpcy5fcmVib3VuZChvLnksLXMueSkpfSxfcmVib3VuZDpmdW5jdGlvbih0LGkpe3JldHVybiB0K2k+MD9NYXRoLnJvdW5kKHQtaSkvMjpNYXRoLm1heCgwLE1hdGguY2VpbCh0KSktTWF0aC5tYXgoMCxNYXRoLmZsb29yKGkpKX0sX2xpbWl0Wm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmdldE1pblpvb20oKSxlPXRoaXMuZ2V0TWF4Wm9vbSgpLG49amk/dGhpcy5vcHRpb25zLnpvb21TbmFwOjE7cmV0dXJuIG4mJih0PU1hdGgucm91bmQodC9uKSpuKSxNYXRoLm1heChpLE1hdGgubWluKGUsdCkpfSxfb25QYW5UcmFuc2l0aW9uU3RlcDpmdW5jdGlvbigpe3RoaXMuZmlyZShcIm1vdmVcIil9LF9vblBhblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0dCh0aGlzLl9tYXBQYW5lLFwibGVhZmxldC1wYW4tYW5pbVwiKSx0aGlzLmZpcmUoXCJtb3ZlZW5kXCIpfSxfdHJ5QW5pbWF0ZWRQYW46ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRDZW50ZXJPZmZzZXQodCkuX3RydW5jKCk7cmV0dXJuISghMCE9PShpJiZpLmFuaW1hdGUpJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnMoZSkpJiYodGhpcy5wYW5CeShlLGkpLCEwKX0sX2NyZWF0ZUFuaW1Qcm94eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Byb3h5PUcoXCJkaXZcIixcImxlYWZsZXQtcHJveHkgbGVhZmxldC16b29tLWFuaW1hdGVkXCIpO3RoaXMuX3BhbmVzLm1hcFBhbmUuYXBwZW5kQ2hpbGQodCksdGhpcy5vbihcInpvb21hbmltXCIsZnVuY3Rpb24odCl7dmFyIGk9Y2UsZT10aGlzLl9wcm94eS5zdHlsZVtpXTtydCh0aGlzLl9wcm94eSx0aGlzLnByb2plY3QodC5jZW50ZXIsdC56b29tKSx0aGlzLmdldFpvb21TY2FsZSh0Lnpvb20sMSkpLGU9PT10aGlzLl9wcm94eS5zdHlsZVtpXSYmdGhpcy5fYW5pbWF0aW5nWm9vbSYmdGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCgpfSx0aGlzKSx0aGlzLm9uKFwibG9hZCBtb3ZlZW5kXCIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldENlbnRlcigpLGk9dGhpcy5nZXRab29tKCk7cnQodGhpcy5fcHJveHksdGhpcy5wcm9qZWN0KHQsaSksdGhpcy5nZXRab29tU2NhbGUoaSwxKSl9LHRoaXMpLHRoaXMuX29uKFwidW5sb2FkXCIsdGhpcy5fZGVzdHJveUFuaW1Qcm94eSx0aGlzKX0sX2Rlc3Ryb3lBbmltUHJveHk6ZnVuY3Rpb24oKXtLKHRoaXMuX3Byb3h5KSxkZWxldGUgdGhpcy5fcHJveHl9LF9jYXRjaFRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5pbWF0aW5nWm9vbSYmdC5wcm9wZXJ0eU5hbWUuaW5kZXhPZihcInRyYW5zZm9ybVwiKT49MCYmdGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCgpfSxfbm90aGluZ1RvQW5pbWF0ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxlYWZsZXQtem9vbS1hbmltYXRlZFwiKS5sZW5ndGh9LF90cnlBbmltYXRlZFpvb206ZnVuY3Rpb24odCxpLGUpe2lmKHRoaXMuX2FuaW1hdGluZ1pvb20pcmV0dXJuITA7aWYoZT1lfHx7fSwhdGhpcy5fem9vbUFuaW1hdGVkfHwhMT09PWUuYW5pbWF0ZXx8dGhpcy5fbm90aGluZ1RvQW5pbWF0ZSgpfHxNYXRoLmFicyhpLXRoaXMuX3pvb20pPnRoaXMub3B0aW9ucy56b29tQW5pbWF0aW9uVGhyZXNob2xkKXJldHVybiExO3ZhciBuPXRoaXMuZ2V0Wm9vbVNjYWxlKGkpLG89dGhpcy5fZ2V0Q2VudGVyT2Zmc2V0KHQpLl9kaXZpZGVCeSgxLTEvbik7cmV0dXJuISghMCE9PWUuYW5pbWF0ZSYmIXRoaXMuZ2V0U2l6ZSgpLmNvbnRhaW5zKG8pKSYmKGYoZnVuY3Rpb24oKXt0aGlzLl9tb3ZlU3RhcnQoITAsITEpLl9hbmltYXRlWm9vbSh0LGksITApfSx0aGlzKSwhMCl9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0LGksbixvKXt0aGlzLl9tYXBQYW5lJiYobiYmKHRoaXMuX2FuaW1hdGluZ1pvb209ITAsdGhpcy5fYW5pbWF0ZVRvQ2VudGVyPXQsdGhpcy5fYW5pbWF0ZVRvWm9vbT1pLFEodGhpcy5fbWFwUGFuZSxcImxlYWZsZXQtem9vbS1hbmltXCIpKSx0aGlzLmZpcmUoXCJ6b29tYW5pbVwiLHtjZW50ZXI6dCx6b29tOmksbm9VcGRhdGU6b30pLHNldFRpbWVvdXQoZSh0aGlzLl9vblpvb21UcmFuc2l0aW9uRW5kLHRoaXMpLDI1MCkpfSxfb25ab29tVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZ1pvb20mJih0aGlzLl9tYXBQYW5lJiZ0dCh0aGlzLl9tYXBQYW5lLFwibGVhZmxldC16b29tLWFuaW1cIiksdGhpcy5fYW5pbWF0aW5nWm9vbT0hMSx0aGlzLl9tb3ZlKHRoaXMuX2FuaW1hdGVUb0NlbnRlcix0aGlzLl9hbmltYXRlVG9ab29tKSxmKGZ1bmN0aW9uKCl7dGhpcy5fbW92ZUVuZCghMCl9LHRoaXMpKX19KSxUZT12LmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246XCJ0b3ByaWdodFwifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2wodGhpcyx0KX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9ufSxzZXRQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXA7cmV0dXJuIGkmJmkucmVtb3ZlQ29udHJvbCh0aGlzKSx0aGlzLm9wdGlvbnMucG9zaXRpb249dCxpJiZpLmFkZENvbnRyb2wodGhpcyksdGhpc30sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sYWRkVG86ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmUoKSx0aGlzLl9tYXA9dDt2YXIgaT10aGlzLl9jb250YWluZXI9dGhpcy5vbkFkZCh0KSxlPXRoaXMuZ2V0UG9zaXRpb24oKSxuPXQuX2NvbnRyb2xDb3JuZXJzW2VdO3JldHVybiBRKGksXCJsZWFmbGV0LWNvbnRyb2xcIiksLTEhPT1lLmluZGV4T2YoXCJib3R0b21cIik/bi5pbnNlcnRCZWZvcmUoaSxuLmZpcnN0Q2hpbGQpOm4uYXBwZW5kQ2hpbGQoaSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcD8oSyh0aGlzLl9jb250YWluZXIpLHRoaXMub25SZW1vdmUmJnRoaXMub25SZW1vdmUodGhpcy5fbWFwKSx0aGlzLl9tYXA9bnVsbCx0aGlzKTp0aGlzfSxfcmVmb2N1c09uTWFwOmZ1bmN0aW9uKHQpe3RoaXMuX21hcCYmdCYmdC5zY3JlZW5YPjAmJnQuc2NyZWVuWT4wJiZ0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkuZm9jdXMoKX19KSx6ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFRlKHQpfTtiZS5pbmNsdWRlKHthZGRDb250cm9sOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZFRvKHRoaXMpLHRoaXN9LHJlbW92ZUNvbnRyb2w6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVtb3ZlKCksdGhpc30sX2luaXRDb250cm9sUG9zOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG8pe3ZhciBzPWUrdCtcIiBcIitlK287aVt0K29dPUcoXCJkaXZcIixzLG4pfXZhciBpPXRoaXMuX2NvbnRyb2xDb3JuZXJzPXt9LGU9XCJsZWFmbGV0LVwiLG49dGhpcy5fY29udHJvbENvbnRhaW5lcj1HKFwiZGl2XCIsZStcImNvbnRyb2wtY29udGFpbmVyXCIsdGhpcy5fY29udGFpbmVyKTt0KFwidG9wXCIsXCJsZWZ0XCIpLHQoXCJ0b3BcIixcInJpZ2h0XCIpLHQoXCJib3R0b21cIixcImxlZnRcIiksdChcImJvdHRvbVwiLFwicmlnaHRcIil9LF9jbGVhckNvbnRyb2xQb3M6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fY29udHJvbENvcm5lcnMpSyh0aGlzLl9jb250cm9sQ29ybmVyc1t0XSk7Syh0aGlzLl9jb250cm9sQ29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udHJvbENvcm5lcnMsZGVsZXRlIHRoaXMuX2NvbnRyb2xDb250YWluZXJ9fSk7dmFyIE1lPVRlLmV4dGVuZCh7b3B0aW9uczp7Y29sbGFwc2VkOiEwLHBvc2l0aW9uOlwidG9wcmlnaHRcIixhdXRvWkluZGV4OiEwLGhpZGVTaW5nbGVCYXNlOiExLHNvcnRMYXllcnM6ITEsc29ydEZ1bmN0aW9uOmZ1bmN0aW9uKHQsaSxlLG4pe3JldHVybiBlPG4/LTE6bjxlPzE6MH19LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpLGUpe2wodGhpcyxlKSx0aGlzLl9sYXllckNvbnRyb2xJbnB1dHM9W10sdGhpcy5fbGF5ZXJzPVtdLHRoaXMuX2xhc3RaSW5kZXg9MCx0aGlzLl9oYW5kbGluZ0NsaWNrPSExO2Zvcih2YXIgbiBpbiB0KXRoaXMuX2FkZExheWVyKHRbbl0sbik7Zm9yKG4gaW4gaSl0aGlzLl9hZGRMYXllcihpW25dLG4sITApfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9pbml0TGF5b3V0KCksdGhpcy5fdXBkYXRlKCksdGhpcy5fbWFwPXQsdC5vbihcInpvb21lbmRcIix0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzLHRoaXMpO2Zvcih2YXIgaT0wO2k8dGhpcy5fbGF5ZXJzLmxlbmd0aDtpKyspdGhpcy5fbGF5ZXJzW2ldLmxheWVyLm9uKFwiYWRkIHJlbW92ZVwiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyk7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sYWRkVG86ZnVuY3Rpb24odCl7cmV0dXJuIFRlLnByb3RvdHlwZS5hZGRUby5jYWxsKHRoaXMsdCksdGhpcy5fZXhwYW5kSWZOb3RDb2xsYXBzZWQoKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKFwiem9vbWVuZFwiLHRoaXMuX2NoZWNrRGlzYWJsZWRMYXllcnMsdGhpcyk7Zm9yKHZhciB0PTA7dDx0aGlzLl9sYXllcnMubGVuZ3RoO3QrKyl0aGlzLl9sYXllcnNbdF0ubGF5ZXIub2ZmKFwiYWRkIHJlbW92ZVwiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyl9LGFkZEJhc2VMYXllcjpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl9hZGRMYXllcih0LGkpLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxhZGRPdmVybGF5OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuX2FkZExheWVyKHQsaSwhMCksdGhpcy5fbWFwP3RoaXMuX3VwZGF0ZSgpOnRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3Qub2ZmKFwiYWRkIHJlbW92ZVwiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyk7dmFyIGk9dGhpcy5fZ2V0TGF5ZXIobih0KSk7cmV0dXJuIGkmJnRoaXMuX2xheWVycy5zcGxpY2UodGhpcy5fbGF5ZXJzLmluZGV4T2YoaSksMSksdGhpcy5fbWFwP3RoaXMuX3VwZGF0ZSgpOnRoaXN9LGV4cGFuZDpmdW5jdGlvbigpe1EodGhpcy5fY29udGFpbmVyLFwibGVhZmxldC1jb250cm9sLWxheWVycy1leHBhbmRlZFwiKSx0aGlzLl9zZWN0aW9uLnN0eWxlLmhlaWdodD1udWxsO3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkueS0odGhpcy5fY29udGFpbmVyLm9mZnNldFRvcCs1MCk7cmV0dXJuIHQ8dGhpcy5fc2VjdGlvbi5jbGllbnRIZWlnaHQ/KFEodGhpcy5fc2VjdGlvbixcImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2Nyb2xsYmFyXCIpLHRoaXMuX3NlY3Rpb24uc3R5bGUuaGVpZ2h0PXQrXCJweFwiKTp0dCh0aGlzLl9zZWN0aW9uLFwibGVhZmxldC1jb250cm9sLWxheWVycy1zY3JvbGxiYXJcIiksdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycygpLHRoaXN9LGNvbGxhcHNlOmZ1bmN0aW9uKCl7cmV0dXJuIHR0KHRoaXMuX2NvbnRhaW5lcixcImxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWRcIiksdGhpc30sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD1cImxlYWZsZXQtY29udHJvbC1sYXllcnNcIixpPXRoaXMuX2NvbnRhaW5lcj1HKFwiZGl2XCIsdCksZT10aGlzLm9wdGlvbnMuY29sbGFwc2VkO2kuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCEwKSx3dChpKSx4dChpKTt2YXIgbj10aGlzLl9zZWN0aW9uPUcoXCJzZWN0aW9uXCIsdCtcIi1saXN0XCIpO2UmJih0aGlzLl9tYXAub24oXCJjbGlja1wiLHRoaXMuY29sbGFwc2UsdGhpcykseml8fG10KGkse21vdXNlZW50ZXI6dGhpcy5leHBhbmQsbW91c2VsZWF2ZTp0aGlzLmNvbGxhcHNlfSx0aGlzKSk7dmFyIG89dGhpcy5fbGF5ZXJzTGluaz1HKFwiYVwiLHQrXCItdG9nZ2xlXCIsaSk7by5ocmVmPVwiI1wiLG8udGl0bGU9XCJMYXllcnNcIixxaT8obXQobyxcImNsaWNrXCIsTHQpLG10KG8sXCJjbGlja1wiLHRoaXMuZXhwYW5kLHRoaXMpKTptdChvLFwiZm9jdXNcIix0aGlzLmV4cGFuZCx0aGlzKSxlfHx0aGlzLmV4cGFuZCgpLHRoaXMuX2Jhc2VMYXllcnNMaXN0PUcoXCJkaXZcIix0K1wiLWJhc2VcIixuKSx0aGlzLl9zZXBhcmF0b3I9RyhcImRpdlwiLHQrXCItc2VwYXJhdG9yXCIsbiksdGhpcy5fb3ZlcmxheXNMaXN0PUcoXCJkaXZcIix0K1wiLW92ZXJsYXlzXCIsbiksaS5hcHBlbmRDaGlsZChuKX0sX2dldExheWVyOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaT0wO2k8dGhpcy5fbGF5ZXJzLmxlbmd0aDtpKyspaWYodGhpcy5fbGF5ZXJzW2ldJiZuKHRoaXMuX2xheWVyc1tpXS5sYXllcik9PT10KXJldHVybiB0aGlzLl9sYXllcnNbaV19LF9hZGRMYXllcjpmdW5jdGlvbih0LGksbil7dGhpcy5fbWFwJiZ0Lm9uKFwiYWRkIHJlbW92ZVwiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyksdGhpcy5fbGF5ZXJzLnB1c2goe2xheWVyOnQsbmFtZTppLG92ZXJsYXk6bn0pLHRoaXMub3B0aW9ucy5zb3J0TGF5ZXJzJiZ0aGlzLl9sYXllcnMuc29ydChlKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3J0RnVuY3Rpb24odC5sYXllcixpLmxheWVyLHQubmFtZSxpLm5hbWUpfSx0aGlzKSksdGhpcy5vcHRpb25zLmF1dG9aSW5kZXgmJnQuc2V0WkluZGV4JiYodGhpcy5fbGFzdFpJbmRleCsrLHQuc2V0WkluZGV4KHRoaXMuX2xhc3RaSW5kZXgpKSx0aGlzLl9leHBhbmRJZk5vdENvbGxhcHNlZCgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2NvbnRhaW5lcilyZXR1cm4gdGhpcztZKHRoaXMuX2Jhc2VMYXllcnNMaXN0KSxZKHRoaXMuX292ZXJsYXlzTGlzdCksdGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzPVtdO3ZhciB0LGksZSxuLG89MDtmb3IoZT0wO2U8dGhpcy5fbGF5ZXJzLmxlbmd0aDtlKyspbj10aGlzLl9sYXllcnNbZV0sdGhpcy5fYWRkSXRlbShuKSxpPWl8fG4ub3ZlcmxheSx0PXR8fCFuLm92ZXJsYXksbys9bi5vdmVybGF5PzA6MTtyZXR1cm4gdGhpcy5vcHRpb25zLmhpZGVTaW5nbGVCYXNlJiYodD10JiZvPjEsdGhpcy5fYmFzZUxheWVyc0xpc3Quc3R5bGUuZGlzcGxheT10P1wiXCI6XCJub25lXCIpLHRoaXMuX3NlcGFyYXRvci5zdHlsZS5kaXNwbGF5PWkmJnQ/XCJcIjpcIm5vbmVcIix0aGlzfSxfb25MYXllckNoYW5nZTpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGluZ0NsaWNrfHx0aGlzLl91cGRhdGUoKTt2YXIgaT10aGlzLl9nZXRMYXllcihuKHQudGFyZ2V0KSksZT1pLm92ZXJsYXk/XCJhZGRcIj09PXQudHlwZT9cIm92ZXJsYXlhZGRcIjpcIm92ZXJsYXlyZW1vdmVcIjpcImFkZFwiPT09dC50eXBlP1wiYmFzZWxheWVyY2hhbmdlXCI6bnVsbDtlJiZ0aGlzLl9tYXAuZmlyZShlLGkpfSxfY3JlYXRlUmFkaW9FbGVtZW50OmZ1bmN0aW9uKHQsaSl7dmFyIGU9JzxpbnB1dCB0eXBlPVwicmFkaW9cIiBjbGFzcz1cImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2VsZWN0b3JcIiBuYW1lPVwiJyt0KydcIicrKGk/JyBjaGVja2VkPVwiY2hlY2tlZFwiJzpcIlwiKStcIi8+XCIsbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3JldHVybiBuLmlubmVySFRNTD1lLG4uZmlyc3RDaGlsZH0sX2FkZEl0ZW06ZnVuY3Rpb24odCl7dmFyIGksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiksbz10aGlzLl9tYXAuaGFzTGF5ZXIodC5sYXllcik7dC5vdmVybGF5PygoaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnR5cGU9XCJjaGVja2JveFwiLGkuY2xhc3NOYW1lPVwibGVhZmxldC1jb250cm9sLWxheWVycy1zZWxlY3RvclwiLGkuZGVmYXVsdENoZWNrZWQ9byk6aT10aGlzLl9jcmVhdGVSYWRpb0VsZW1lbnQoXCJsZWFmbGV0LWJhc2UtbGF5ZXJzXCIsbyksdGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzLnB1c2goaSksaS5sYXllcklkPW4odC5sYXllciksbXQoaSxcImNsaWNrXCIsdGhpcy5fb25JbnB1dENsaWNrLHRoaXMpO3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3MuaW5uZXJIVE1MPVwiIFwiK3QubmFtZTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3JldHVybiBlLmFwcGVuZENoaWxkKHIpLHIuYXBwZW5kQ2hpbGQoaSksci5hcHBlbmRDaGlsZChzKSwodC5vdmVybGF5P3RoaXMuX292ZXJsYXlzTGlzdDp0aGlzLl9iYXNlTGF5ZXJzTGlzdCkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycygpLGV9LF9vbklucHV0Q2xpY2s6ZnVuY3Rpb24oKXt2YXIgdCxpLGU9dGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzLG49W10sbz1bXTt0aGlzLl9oYW5kbGluZ0NsaWNrPSEwO2Zvcih2YXIgcz1lLmxlbmd0aC0xO3M+PTA7cy0tKXQ9ZVtzXSxpPXRoaXMuX2dldExheWVyKHQubGF5ZXJJZCkubGF5ZXIsdC5jaGVja2VkP24ucHVzaChpKTp0LmNoZWNrZWR8fG8ucHVzaChpKTtmb3Iocz0wO3M8by5sZW5ndGg7cysrKXRoaXMuX21hcC5oYXNMYXllcihvW3NdKSYmdGhpcy5fbWFwLnJlbW92ZUxheWVyKG9bc10pO2ZvcihzPTA7czxuLmxlbmd0aDtzKyspdGhpcy5fbWFwLmhhc0xheWVyKG5bc10pfHx0aGlzLl9tYXAuYWRkTGF5ZXIobltzXSk7dGhpcy5faGFuZGxpbmdDbGljaz0hMSx0aGlzLl9yZWZvY3VzT25NYXAoKX0sX2NoZWNrRGlzYWJsZWRMYXllcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQsaSxlPXRoaXMuX2xheWVyQ29udHJvbElucHV0cyxuPXRoaXMuX21hcC5nZXRab29tKCksbz1lLmxlbmd0aC0xO28+PTA7by0tKXQ9ZVtvXSxpPXRoaXMuX2dldExheWVyKHQubGF5ZXJJZCkubGF5ZXIsdC5kaXNhYmxlZD12b2lkIDAhPT1pLm9wdGlvbnMubWluWm9vbSYmbjxpLm9wdGlvbnMubWluWm9vbXx8dm9pZCAwIT09aS5vcHRpb25zLm1heFpvb20mJm4+aS5vcHRpb25zLm1heFpvb219LF9leHBhbmRJZk5vdENvbGxhcHNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJiF0aGlzLm9wdGlvbnMuY29sbGFwc2VkJiZ0aGlzLmV4cGFuZCgpLHRoaXN9LF9leHBhbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHBhbmQoKX0sX2NvbGxhcHNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sbGFwc2UoKX19KSxDZT1UZS5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOlwidG9wbGVmdFwiLHpvb21JblRleHQ6XCIrXCIsem9vbUluVGl0bGU6XCJab29tIGluXCIsem9vbU91dFRleHQ6XCImI3gyMjEyO1wiLHpvb21PdXRUaXRsZTpcIlpvb20gb3V0XCJ9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBpPVwibGVhZmxldC1jb250cm9sLXpvb21cIixlPUcoXCJkaXZcIixpK1wiIGxlYWZsZXQtYmFyXCIpLG49dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLl96b29tSW5CdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG4uem9vbUluVGV4dCxuLnpvb21JblRpdGxlLGkrXCItaW5cIixlLHRoaXMuX3pvb21JbiksdGhpcy5fem9vbU91dEJ1dHRvbj10aGlzLl9jcmVhdGVCdXR0b24obi56b29tT3V0VGV4dCxuLnpvb21PdXRUaXRsZSxpK1wiLW91dFwiLGUsdGhpcy5fem9vbU91dCksdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0Lm9uKFwiem9vbWVuZCB6b29tbGV2ZWxzY2hhbmdlXCIsdGhpcy5fdXBkYXRlRGlzYWJsZWQsdGhpcyksZX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dC5vZmYoXCJ6b29tZW5kIHpvb21sZXZlbHNjaGFuZ2VcIix0aGlzLl91cGRhdGVEaXNhYmxlZCx0aGlzKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZD0hMCx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHRoaXN9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHRoaXN9LF96b29tSW46ZnVuY3Rpb24odCl7IXRoaXMuX2Rpc2FibGVkJiZ0aGlzLl9tYXAuX3pvb208dGhpcy5fbWFwLmdldE1heFpvb20oKSYmdGhpcy5fbWFwLnpvb21Jbih0aGlzLl9tYXAub3B0aW9ucy56b29tRGVsdGEqKHQuc2hpZnRLZXk/MzoxKSl9LF96b29tT3V0OmZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNhYmxlZCYmdGhpcy5fbWFwLl96b29tPnRoaXMuX21hcC5nZXRNaW5ab29tKCkmJnRoaXMuX21hcC56b29tT3V0KHRoaXMuX21hcC5vcHRpb25zLnpvb21EZWx0YSoodC5zaGlmdEtleT8zOjEpKX0sX2NyZWF0ZUJ1dHRvbjpmdW5jdGlvbih0LGksZSxuLG8pe3ZhciBzPUcoXCJhXCIsZSxuKTtyZXR1cm4gcy5pbm5lckhUTUw9dCxzLmhyZWY9XCIjXCIscy50aXRsZT1pLHMuc2V0QXR0cmlidXRlKFwicm9sZVwiLFwiYnV0dG9uXCIpLHMuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLGkpLHd0KHMpLG10KHMsXCJjbGlja1wiLEx0KSxtdChzLFwiY2xpY2tcIixvLHRoaXMpLG10KHMsXCJjbGlja1wiLHRoaXMuX3JlZm9jdXNPbk1hcCx0aGlzKSxzfSxfdXBkYXRlRGlzYWJsZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsaT1cImxlYWZsZXQtZGlzYWJsZWRcIjt0dCh0aGlzLl96b29tSW5CdXR0b24saSksdHQodGhpcy5fem9vbU91dEJ1dHRvbixpKSwodGhpcy5fZGlzYWJsZWR8fHQuX3pvb209PT10LmdldE1pblpvb20oKSkmJlEodGhpcy5fem9vbU91dEJ1dHRvbixpKSwodGhpcy5fZGlzYWJsZWR8fHQuX3pvb209PT10LmdldE1heFpvb20oKSkmJlEodGhpcy5fem9vbUluQnV0dG9uLGkpfX0pO2JlLm1lcmdlT3B0aW9ucyh7em9vbUNvbnRyb2w6ITB9KSxiZS5hZGRJbml0SG9vayhmdW5jdGlvbigpe3RoaXMub3B0aW9ucy56b29tQ29udHJvbCYmKHRoaXMuem9vbUNvbnRyb2w9bmV3IENlLHRoaXMuYWRkQ29udHJvbCh0aGlzLnpvb21Db250cm9sKSl9KTt2YXIgU2U9VGUuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjpcImJvdHRvbWxlZnRcIixtYXhXaWR0aDoxMDAsbWV0cmljOiEwLGltcGVyaWFsOiEwfSxvbkFkZDpmdW5jdGlvbih0KXt2YXIgaT1HKFwiZGl2XCIsXCJsZWFmbGV0LWNvbnRyb2wtc2NhbGVcIiksZT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX2FkZFNjYWxlcyhlLFwibGVhZmxldC1jb250cm9sLXNjYWxlLWxpbmVcIixpKSx0Lm9uKGUudXBkYXRlV2hlbklkbGU/XCJtb3ZlZW5kXCI6XCJtb3ZlXCIsdGhpcy5fdXBkYXRlLHRoaXMpLHQud2hlblJlYWR5KHRoaXMuX3VwZGF0ZSx0aGlzKSxpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZih0aGlzLm9wdGlvbnMudXBkYXRlV2hlbklkbGU/XCJtb3ZlZW5kXCI6XCJtb3ZlXCIsdGhpcy5fdXBkYXRlLHRoaXMpfSxfYWRkU2NhbGVzOmZ1bmN0aW9uKHQsaSxlKXt0Lm1ldHJpYyYmKHRoaXMuX21TY2FsZT1HKFwiZGl2XCIsaSxlKSksdC5pbXBlcmlhbCYmKHRoaXMuX2lTY2FsZT1HKFwiZGl2XCIsaSxlKSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsaT10LmdldFNpemUoKS55LzIsZT10LmRpc3RhbmNlKHQuY29udGFpbmVyUG9pbnRUb0xhdExuZyhbMCxpXSksdC5jb250YWluZXJQb2ludFRvTGF0TG5nKFt0aGlzLm9wdGlvbnMubWF4V2lkdGgsaV0pKTt0aGlzLl91cGRhdGVTY2FsZXMoZSl9LF91cGRhdGVTY2FsZXM6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm1ldHJpYyYmdCYmdGhpcy5fdXBkYXRlTWV0cmljKHQpLHRoaXMub3B0aW9ucy5pbXBlcmlhbCYmdCYmdGhpcy5fdXBkYXRlSW1wZXJpYWwodCl9LF91cGRhdGVNZXRyaWM6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0Um91bmROdW0odCksZT1pPDFlMz9pK1wiIG1cIjppLzFlMytcIiBrbVwiO3RoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX21TY2FsZSxlLGkvdCl9LF91cGRhdGVJbXBlcmlhbDpmdW5jdGlvbih0KXt2YXIgaSxlLG4sbz0zLjI4MDgzOTkqdDtvPjUyODA/KGk9by81MjgwLGU9dGhpcy5fZ2V0Um91bmROdW0oaSksdGhpcy5fdXBkYXRlU2NhbGUodGhpcy5faVNjYWxlLGUrXCIgbWlcIixlL2kpKToobj10aGlzLl9nZXRSb3VuZE51bShvKSx0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9pU2NhbGUsbitcIiBmdFwiLG4vbykpfSxfdXBkYXRlU2NhbGU6ZnVuY3Rpb24odCxpLGUpe3Quc3R5bGUud2lkdGg9TWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMubWF4V2lkdGgqZSkrXCJweFwiLHQuaW5uZXJIVE1MPWl9LF9nZXRSb3VuZE51bTpmdW5jdGlvbih0KXt2YXIgaT1NYXRoLnBvdygxMCwoTWF0aC5mbG9vcih0KStcIlwiKS5sZW5ndGgtMSksZT10L2k7cmV0dXJuIGU9ZT49MTA/MTA6ZT49NT81OmU+PTM/MzplPj0yPzI6MSxpKmV9fSksWmU9VGUuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjpcImJvdHRvbXJpZ2h0XCIscHJlZml4Oic8YSBocmVmPVwiaHR0cDovL2xlYWZsZXRqcy5jb21cIiB0aXRsZT1cIkEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwc1wiPkxlYWZsZXQ8L2E+J30saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtsKHRoaXMsdCksdGhpcy5fYXR0cmlidXRpb25zPXt9fSxvbkFkZDpmdW5jdGlvbih0KXt0LmF0dHJpYnV0aW9uQ29udHJvbD10aGlzLHRoaXMuX2NvbnRhaW5lcj1HKFwiZGl2XCIsXCJsZWFmbGV0LWNvbnRyb2wtYXR0cmlidXRpb25cIiksd3QodGhpcy5fY29udGFpbmVyKTtmb3IodmFyIGkgaW4gdC5fbGF5ZXJzKXQuX2xheWVyc1tpXS5nZXRBdHRyaWJ1dGlvbiYmdGhpcy5hZGRBdHRyaWJ1dGlvbih0Ll9sYXllcnNbaV0uZ2V0QXR0cmlidXRpb24oKSk7cmV0dXJuIHRoaXMuX3VwZGF0ZSgpLHRoaXMuX2NvbnRhaW5lcn0sc2V0UHJlZml4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMucHJlZml4PXQsdGhpcy5fdXBkYXRlKCksdGhpc30sYWRkQXR0cmlidXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHRoaXMuX2F0dHJpYnV0aW9uc1t0XXx8KHRoaXMuX2F0dHJpYnV0aW9uc1t0XT0wKSx0aGlzLl9hdHRyaWJ1dGlvbnNbdF0rKyx0aGlzLl91cGRhdGUoKSx0aGlzKTp0aGlzfSxyZW1vdmVBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdD8odGhpcy5fYXR0cmlidXRpb25zW3RdJiYodGhpcy5fYXR0cmlidXRpb25zW3RdLS0sdGhpcy5fdXBkYXRlKCkpLHRoaXMpOnRoaXN9LF91cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0PVtdO2Zvcih2YXIgaSBpbiB0aGlzLl9hdHRyaWJ1dGlvbnMpdGhpcy5fYXR0cmlidXRpb25zW2ldJiZ0LnB1c2goaSk7dmFyIGU9W107dGhpcy5vcHRpb25zLnByZWZpeCYmZS5wdXNoKHRoaXMub3B0aW9ucy5wcmVmaXgpLHQubGVuZ3RoJiZlLnB1c2godC5qb2luKFwiLCBcIikpLHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUw9ZS5qb2luKFwiIHwgXCIpfX19KTtiZS5tZXJnZU9wdGlvbnMoe2F0dHJpYnV0aW9uQ29udHJvbDohMH0pLGJlLmFkZEluaXRIb29rKGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbCYmKG5ldyBaZSkuYWRkVG8odGhpcyl9KTtUZS5MYXllcnM9TWUsVGUuWm9vbT1DZSxUZS5TY2FsZT1TZSxUZS5BdHRyaWJ1dGlvbj1aZSx6ZS5sYXllcnM9ZnVuY3Rpb24odCxpLGUpe3JldHVybiBuZXcgTWUodCxpLGUpfSx6ZS56b29tPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQ2UodCl9LHplLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgU2UodCl9LHplLmF0dHJpYnV0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWmUodCl9O3ZhciBFZT12LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dH0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWQ/dGhpczoodGhpcy5fZW5hYmxlZD0hMCx0aGlzLmFkZEhvb2tzKCksdGhpcyl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5hYmxlZD8odGhpcy5fZW5hYmxlZD0hMSx0aGlzLnJlbW92ZUhvb2tzKCksdGhpcyk6dGhpc30sZW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fZW5hYmxlZH19KTtFZS5hZGRUbz1mdW5jdGlvbih0LGkpe3JldHVybiB0LmFkZEhhbmRsZXIoaSx0aGlzKSx0aGlzfTt2YXIga2UsQmU9e0V2ZW50czpsaX0sQWU9cWk/XCJ0b3VjaHN0YXJ0IG1vdXNlZG93blwiOlwibW91c2Vkb3duXCIsSWU9e21vdXNlZG93bjpcIm1vdXNldXBcIix0b3VjaHN0YXJ0OlwidG91Y2hlbmRcIixwb2ludGVyZG93bjpcInRvdWNoZW5kXCIsTVNQb2ludGVyRG93bjpcInRvdWNoZW5kXCJ9LE9lPXttb3VzZWRvd246XCJtb3VzZW1vdmVcIix0b3VjaHN0YXJ0OlwidG91Y2htb3ZlXCIscG9pbnRlcmRvd246XCJ0b3VjaG1vdmVcIixNU1BvaW50ZXJEb3duOlwidG91Y2htb3ZlXCJ9LFJlPWNpLmV4dGVuZCh7b3B0aW9uczp7Y2xpY2tUb2xlcmFuY2U6M30saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGksZSxuKXtsKHRoaXMsbiksdGhpcy5fZWxlbWVudD10LHRoaXMuX2RyYWdTdGFydFRhcmdldD1pfHx0LHRoaXMuX3ByZXZlbnRPdXRsaW5lPWV9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VuYWJsZWR8fChtdCh0aGlzLl9kcmFnU3RhcnRUYXJnZXQsQWUsdGhpcy5fb25Eb3duLHRoaXMpLHRoaXMuX2VuYWJsZWQ9ITApfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZCYmKFJlLl9kcmFnZ2luZz09PXRoaXMmJnRoaXMuZmluaXNoRHJhZygpLGZ0KHRoaXMuX2RyYWdTdGFydFRhcmdldCxBZSx0aGlzLl9vbkRvd24sdGhpcyksdGhpcy5fZW5hYmxlZD0hMSx0aGlzLl9tb3ZlZD0hMSl9LF9vbkRvd246ZnVuY3Rpb24odCl7aWYoIXQuX3NpbXVsYXRlZCYmdGhpcy5fZW5hYmxlZCYmKHRoaXMuX21vdmVkPSExLCEkKHRoaXMuX2VsZW1lbnQsXCJsZWFmbGV0LXpvb20tYW5pbVwiKSYmIShSZS5fZHJhZ2dpbmd8fHQuc2hpZnRLZXl8fDEhPT10LndoaWNoJiYxIT09dC5idXR0b24mJiF0LnRvdWNoZXN8fChSZS5fZHJhZ2dpbmc9dGhpcyx0aGlzLl9wcmV2ZW50T3V0bGluZSYmY3QodGhpcy5fZWxlbWVudCksdXQoKSxmaSgpLHRoaXMuX21vdmluZykpKSl7dGhpcy5maXJlKFwiZG93blwiKTt2YXIgaT10LnRvdWNoZXM/dC50b3VjaGVzWzBdOnQsZT1kdCh0aGlzLl9lbGVtZW50KTt0aGlzLl9zdGFydFBvaW50PW5ldyB4KGkuY2xpZW50WCxpLmNsaWVudFkpLHRoaXMuX3BhcmVudFNjYWxlPXB0KGUpLG10KGRvY3VtZW50LE9lW3QudHlwZV0sdGhpcy5fb25Nb3ZlLHRoaXMpLG10KGRvY3VtZW50LEllW3QudHlwZV0sdGhpcy5fb25VcCx0aGlzKX19LF9vbk1vdmU6ZnVuY3Rpb24odCl7aWYoIXQuX3NpbXVsYXRlZCYmdGhpcy5fZW5hYmxlZClpZih0LnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGg+MSl0aGlzLl9tb3ZlZD0hMDtlbHNle3ZhciBpPXQudG91Y2hlcyYmMT09PXQudG91Y2hlcy5sZW5ndGg/dC50b3VjaGVzWzBdOnQsZT1uZXcgeChpLmNsaWVudFgsaS5jbGllbnRZKS5fc3VidHJhY3QodGhpcy5fc3RhcnRQb2ludCk7KGUueHx8ZS55KSYmKE1hdGguYWJzKGUueCkrTWF0aC5hYnMoZS55KTx0aGlzLm9wdGlvbnMuY2xpY2tUb2xlcmFuY2V8fChlLngvPXRoaXMuX3BhcmVudFNjYWxlLngsZS55Lz10aGlzLl9wYXJlbnRTY2FsZS55LFB0KHQpLHRoaXMuX21vdmVkfHwodGhpcy5maXJlKFwiZHJhZ3N0YXJ0XCIpLHRoaXMuX21vdmVkPSEwLHRoaXMuX3N0YXJ0UG9zPWh0KHRoaXMuX2VsZW1lbnQpLnN1YnRyYWN0KGUpLFEoZG9jdW1lbnQuYm9keSxcImxlYWZsZXQtZHJhZ2dpbmdcIiksdGhpcy5fbGFzdFRhcmdldD10LnRhcmdldHx8dC5zcmNFbGVtZW50LHdpbmRvdy5TVkdFbGVtZW50SW5zdGFuY2UmJnRoaXMuX2xhc3RUYXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50SW5zdGFuY2UmJih0aGlzLl9sYXN0VGFyZ2V0PXRoaXMuX2xhc3RUYXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLFEodGhpcy5fbGFzdFRhcmdldCxcImxlYWZsZXQtZHJhZy10YXJnZXRcIikpLHRoaXMuX25ld1Bvcz10aGlzLl9zdGFydFBvcy5hZGQoZSksdGhpcy5fbW92aW5nPSEwLGcodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuX2xhc3RFdmVudD10LHRoaXMuX2FuaW1SZXF1ZXN0PWYodGhpcy5fdXBkYXRlUG9zaXRpb24sdGhpcywhMCkpKX19LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXtvcmlnaW5hbEV2ZW50OnRoaXMuX2xhc3RFdmVudH07dGhpcy5maXJlKFwicHJlZHJhZ1wiLHQpLGF0KHRoaXMuX2VsZW1lbnQsdGhpcy5fbmV3UG9zKSx0aGlzLmZpcmUoXCJkcmFnXCIsdCl9LF9vblVwOmZ1bmN0aW9uKHQpeyF0Ll9zaW11bGF0ZWQmJnRoaXMuX2VuYWJsZWQmJnRoaXMuZmluaXNoRHJhZygpfSxmaW5pc2hEcmFnOmZ1bmN0aW9uKCl7dHQoZG9jdW1lbnQuYm9keSxcImxlYWZsZXQtZHJhZ2dpbmdcIiksdGhpcy5fbGFzdFRhcmdldCYmKHR0KHRoaXMuX2xhc3RUYXJnZXQsXCJsZWFmbGV0LWRyYWctdGFyZ2V0XCIpLHRoaXMuX2xhc3RUYXJnZXQ9bnVsbCk7Zm9yKHZhciB0IGluIE9lKWZ0KGRvY3VtZW50LE9lW3RdLHRoaXMuX29uTW92ZSx0aGlzKSxmdChkb2N1bWVudCxJZVt0XSx0aGlzLl9vblVwLHRoaXMpO2x0KCksZ2koKSx0aGlzLl9tb3ZlZCYmdGhpcy5fbW92aW5nJiYoZyh0aGlzLl9hbmltUmVxdWVzdCksdGhpcy5maXJlKFwiZHJhZ2VuZFwiLHtkaXN0YW5jZTp0aGlzLl9uZXdQb3MuZGlzdGFuY2VUbyh0aGlzLl9zdGFydFBvcyl9KSksdGhpcy5fbW92aW5nPSExLFJlLl9kcmFnZ2luZz0hMX19KSxOZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7c2ltcGxpZnk6WnQscG9pbnRUb1NlZ21lbnREaXN0YW5jZTpFdCxjbG9zZXN0UG9pbnRPblNlZ21lbnQ6ZnVuY3Rpb24odCxpLGUpe3JldHVybiBEdCh0LGksZSl9LGNsaXBTZWdtZW50Okl0LF9nZXRFZGdlSW50ZXJzZWN0aW9uOk90LF9nZXRCaXRDb2RlOlJ0LF9zcUNsb3Nlc3RQb2ludE9uU2VnbWVudDpEdCxpc0ZsYXQ6anQsX2ZsYXQ6V3R9KSxEZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7Y2xpcFBvbHlnb246SHR9KSxqZT17cHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHgodC5sbmcsdC5sYXQpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNKHQueSx0LngpfSxib3VuZHM6bmV3IFAoWy0xODAsLTkwXSxbMTgwLDkwXSl9LFdlPXtSOjYzNzgxMzcsUl9NSU5PUjo2MzU2NzUyLjMxNDI0NTE3OSxib3VuZHM6bmV3IFAoWy0yMDAzNzUwOC4zNDI3OSwtMTU0OTY1NzAuNzM5NzJdLFsyMDAzNzUwOC4zNDI3OSwxODc2NDY1Ni4yMzEzOF0pLHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5QSS8xODAsZT10aGlzLlIsbj10LmxhdCppLG89dGhpcy5SX01JTk9SL2Uscz1NYXRoLnNxcnQoMS1vKm8pLHI9cypNYXRoLnNpbihuKSxhPU1hdGgudGFuKE1hdGguUEkvNC1uLzIpL01hdGgucG93KCgxLXIpLygxK3IpLHMvMik7cmV0dXJuIG49LWUqTWF0aC5sb2coTWF0aC5tYXgoYSwxZS0xMCkpLG5ldyB4KHQubG5nKmkqZSxuKX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxlPTE4MC9NYXRoLlBJLG49dGhpcy5SLG89dGhpcy5SX01JTk9SL24scz1NYXRoLnNxcnQoMS1vKm8pLHI9TWF0aC5leHAoLXQueS9uKSxhPU1hdGguUEkvMi0yKk1hdGguYXRhbihyKSxoPTAsdT0uMTtoPDE1JiZNYXRoLmFicyh1KT4xZS03O2grKylpPXMqTWF0aC5zaW4oYSksaT1NYXRoLnBvdygoMS1pKS8oMStpKSxzLzIpLGErPXU9TWF0aC5QSS8yLTIqTWF0aC5hdGFuKHIqaSktYTtyZXR1cm4gbmV3IE0oYSplLHQueCplL24pfX0sSGU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe0xvbkxhdDpqZSxNZXJjYXRvcjpXZSxTcGhlcmljYWxNZXJjYXRvcjptaX0pLEZlPWkoe30scGkse2NvZGU6XCJFUFNHOjMzOTVcIixwcm9qZWN0aW9uOldlLHRyYW5zZm9ybWF0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9LjUvKE1hdGguUEkqV2UuUik7cmV0dXJuIFoodCwuNSwtdCwuNSl9KCl9KSxVZT1pKHt9LHBpLHtjb2RlOlwiRVBTRzo0MzI2XCIscHJvamVjdGlvbjpqZSx0cmFuc2Zvcm1hdGlvbjpaKDEvMTgwLDEsLTEvMTgwLC41KX0pLFZlPWkoe30sZGkse3Byb2plY3Rpb246amUsdHJhbnNmb3JtYXRpb246WigxLDAsLTEsMCksc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsdCl9LHpvb206ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubG9nKHQpL01hdGguTE4yfSxkaXN0YW5jZTpmdW5jdGlvbih0LGkpe3ZhciBlPWkubG5nLXQubG5nLG49aS5sYXQtdC5sYXQ7cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX0saW5maW5pdGU6ITB9KTtkaS5FYXJ0aD1waSxkaS5FUFNHMzM5NT1GZSxkaS5FUFNHMzg1Nz15aSxkaS5FUFNHOTAwOTEzPXhpLGRpLkVQU0c0MzI2PVVlLGRpLlNpbXBsZT1WZTt2YXIgcWU9Y2kuZXh0ZW5kKHtvcHRpb25zOntwYW5lOlwib3ZlcmxheVBhbmVcIixhdHRyaWJ1dGlvbjpudWxsLGJ1YmJsaW5nTW91c2VFdmVudHM6ITB9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZExheWVyKHRoaXMpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUZyb20odGhpcy5fbWFwfHx0aGlzLl9tYXBUb0FkZCl9LHJlbW92ZUZyb206ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQucmVtb3ZlTGF5ZXIodGhpcyksdGhpc30sZ2V0UGFuZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmdldFBhbmUodD90aGlzLm9wdGlvbnNbdF18fHQ6dGhpcy5vcHRpb25zLnBhbmUpfSxhZGRJbnRlcmFjdGl2ZVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLl90YXJnZXRzW24odCldPXRoaXMsdGhpc30scmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGRlbGV0ZSB0aGlzLl9tYXAuX3RhcmdldHNbbih0KV0sdGhpc30sZ2V0QXR0cmlidXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9ufSxfbGF5ZXJBZGQ6ZnVuY3Rpb24odCl7dmFyIGk9dC50YXJnZXQ7aWYoaS5oYXNMYXllcih0aGlzKSl7aWYodGhpcy5fbWFwPWksdGhpcy5fem9vbUFuaW1hdGVkPWkuX3pvb21BbmltYXRlZCx0aGlzLmdldEV2ZW50cyl7dmFyIGU9dGhpcy5nZXRFdmVudHMoKTtpLm9uKGUsdGhpcyksdGhpcy5vbmNlKFwicmVtb3ZlXCIsZnVuY3Rpb24oKXtpLm9mZihlLHRoaXMpfSx0aGlzKX10aGlzLm9uQWRkKGkpLHRoaXMuZ2V0QXR0cmlidXRpb24mJmkuYXR0cmlidXRpb25Db250cm9sJiZpLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpLHRoaXMuZmlyZShcImFkZFwiKSxpLmZpcmUoXCJsYXllcmFkZFwiLHtsYXllcjp0aGlzfSl9fX0pO2JlLmluY2x1ZGUoe2FkZExheWVyOmZ1bmN0aW9uKHQpe2lmKCF0Ll9sYXllckFkZCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgb2JqZWN0IGlzIG5vdCBhIExheWVyLlwiKTt2YXIgaT1uKHQpO3JldHVybiB0aGlzLl9sYXllcnNbaV0/dGhpczoodGhpcy5fbGF5ZXJzW2ldPXQsdC5fbWFwVG9BZGQ9dGhpcyx0LmJlZm9yZUFkZCYmdC5iZWZvcmVBZGQodGhpcyksdGhpcy53aGVuUmVhZHkodC5fbGF5ZXJBZGQsdCksdGhpcyl9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3ZhciBpPW4odCk7cmV0dXJuIHRoaXMuX2xheWVyc1tpXT8odGhpcy5fbG9hZGVkJiZ0Lm9uUmVtb3ZlKHRoaXMpLHQuZ2V0QXR0cmlidXRpb24mJnRoaXMuYXR0cmlidXRpb25Db250cm9sJiZ0aGlzLmF0dHJpYnV0aW9uQ29udHJvbC5yZW1vdmVBdHRyaWJ1dGlvbih0LmdldEF0dHJpYnV0aW9uKCkpLGRlbGV0ZSB0aGlzLl9sYXllcnNbaV0sdGhpcy5fbG9hZGVkJiYodGhpcy5maXJlKFwibGF5ZXJyZW1vdmVcIix7bGF5ZXI6dH0pLHQuZmlyZShcInJlbW92ZVwiKSksdC5fbWFwPXQuX21hcFRvQWRkPW51bGwsdGhpcyk6dGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiZuKHQpaW4gdGhpcy5fbGF5ZXJzfSxlYWNoTGF5ZXI6ZnVuY3Rpb24odCxpKXtmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXQuY2FsbChpLHRoaXMuX2xheWVyc1tlXSk7cmV0dXJuIHRoaXN9LF9hZGRMYXllcnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPTAsZT0odD10P29pKHQpP3Q6W3RdOltdKS5sZW5ndGg7aTxlO2krKyl0aGlzLmFkZExheWVyKHRbaV0pfSxfYWRkWm9vbUxpbWl0OmZ1bmN0aW9uKHQpeyFpc05hTih0Lm9wdGlvbnMubWF4Wm9vbSkmJmlzTmFOKHQub3B0aW9ucy5taW5ab29tKXx8KHRoaXMuX3pvb21Cb3VuZExheWVyc1tuKHQpXT10LHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF9yZW1vdmVab29tTGltaXQ6ZnVuY3Rpb24odCl7dmFyIGk9bih0KTt0aGlzLl96b29tQm91bmRMYXllcnNbaV0mJihkZWxldGUgdGhpcy5fem9vbUJvdW5kTGF5ZXJzW2ldLHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF91cGRhdGVab29tTGV2ZWxzOmZ1bmN0aW9uKCl7dmFyIHQ9MS8wLGk9LTEvMCxlPXRoaXMuX2dldFpvb21TcGFuKCk7Zm9yKHZhciBuIGluIHRoaXMuX3pvb21Cb3VuZExheWVycyl7dmFyIG89dGhpcy5fem9vbUJvdW5kTGF5ZXJzW25dLm9wdGlvbnM7dD12b2lkIDA9PT1vLm1pblpvb20/dDpNYXRoLm1pbih0LG8ubWluWm9vbSksaT12b2lkIDA9PT1vLm1heFpvb20/aTpNYXRoLm1heChpLG8ubWF4Wm9vbSl9dGhpcy5fbGF5ZXJzTWF4Wm9vbT1pPT09LTEvMD92b2lkIDA6aSx0aGlzLl9sYXllcnNNaW5ab29tPXQ9PT0xLzA/dm9pZCAwOnQsZSE9PXRoaXMuX2dldFpvb21TcGFuKCkmJnRoaXMuZmlyZShcInpvb21sZXZlbHNjaGFuZ2VcIiksdm9pZCAwPT09dGhpcy5vcHRpb25zLm1heFpvb20mJnRoaXMuX2xheWVyc01heFpvb20mJnRoaXMuZ2V0Wm9vbSgpPnRoaXMuX2xheWVyc01heFpvb20mJnRoaXMuc2V0Wm9vbSh0aGlzLl9sYXllcnNNYXhab29tKSx2b2lkIDA9PT10aGlzLm9wdGlvbnMubWluWm9vbSYmdGhpcy5fbGF5ZXJzTWluWm9vbSYmdGhpcy5nZXRab29tKCk8dGhpcy5fbGF5ZXJzTWluWm9vbSYmdGhpcy5zZXRab29tKHRoaXMuX2xheWVyc01pblpvb20pfX0pO3ZhciBHZT1xZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF5ZXJzPXt9O3ZhciBlLG47aWYodClmb3IoZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmFkZExheWVyKHRbZV0pfSxhZGRMYXllcjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmdldExheWVySWQodCk7cmV0dXJuIHRoaXMuX2xheWVyc1tpXT10LHRoaXMuX21hcCYmdGhpcy5fbWFwLmFkZExheWVyKHQpLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3ZhciBpPXQgaW4gdGhpcy5fbGF5ZXJzP3Q6dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9tYXAmJnRoaXMuX2xheWVyc1tpXSYmdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2xheWVyc1tpXSksZGVsZXRlIHRoaXMuX2xheWVyc1tpXSx0aGlzfSxoYXNMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4hIXQmJih0IGluIHRoaXMuX2xheWVyc3x8dGhpcy5nZXRMYXllcklkKHQpaW4gdGhpcy5fbGF5ZXJzKX0sY2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIodGhpcy5yZW1vdmVMYXllcix0aGlzKX0saW52b2tlOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Zm9yKGkgaW4gdGhpcy5fbGF5ZXJzKShlPXRoaXMuX2xheWVyc1tpXSlbdF0mJmVbdF0uYXBwbHkoZSxuKTtyZXR1cm4gdGhpc30sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5lYWNoTGF5ZXIodC5hZGRMYXllcix0KX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5lYWNoTGF5ZXIodC5yZW1vdmVMYXllcix0KX0sZWFjaExheWVyOmZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl0LmNhbGwoaSx0aGlzLl9sYXllcnNbZV0pO3JldHVybiB0aGlzfSxnZXRMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5ZXJzW3RdfSxnZXRMYXllcnM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIodC5wdXNoLHQpLHR9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZva2UoXCJzZXRaSW5kZXhcIix0KX0sZ2V0TGF5ZXJJZDpmdW5jdGlvbih0KXtyZXR1cm4gbih0KX19KSxLZT1HZS5leHRlbmQoe2FkZExheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhhc0xheWVyKHQpP3RoaXM6KHQuYWRkRXZlbnRQYXJlbnQodGhpcyksR2UucHJvdG90eXBlLmFkZExheWVyLmNhbGwodGhpcyx0KSx0aGlzLmZpcmUoXCJsYXllcmFkZFwiLHtsYXllcjp0fSkpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNMYXllcih0KT8odCBpbiB0aGlzLl9sYXllcnMmJih0PXRoaXMuX2xheWVyc1t0XSksdC5yZW1vdmVFdmVudFBhcmVudCh0aGlzKSxHZS5wcm90b3R5cGUucmVtb3ZlTGF5ZXIuY2FsbCh0aGlzLHQpLHRoaXMuZmlyZShcImxheWVycmVtb3ZlXCIse2xheWVyOnR9KSk6dGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKFwic2V0U3R5bGVcIix0KX0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKFwiYnJpbmdUb0Zyb250XCIpfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZShcImJyaW5nVG9CYWNrXCIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgVDtmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXt2YXIgZT10aGlzLl9sYXllcnNbaV07dC5leHRlbmQoZS5nZXRCb3VuZHM/ZS5nZXRCb3VuZHMoKTplLmdldExhdExuZygpKX1yZXR1cm4gdH19KSxZZT12LmV4dGVuZCh7b3B0aW9uczp7cG9wdXBBbmNob3I6WzAsMF0sdG9vbHRpcEFuY2hvcjpbMCwwXX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtsKHRoaXMsdCl9LGNyZWF0ZUljb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUljb24oXCJpY29uXCIsdCl9LGNyZWF0ZVNoYWRvdzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlSWNvbihcInNoYWRvd1wiLHQpfSxfY3JlYXRlSWNvbjpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX2dldEljb25VcmwodCk7aWYoIWUpe2lmKFwiaWNvblwiPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJpY29uVXJsIG5vdCBzZXQgaW4gSWNvbiBvcHRpb25zIChzZWUgdGhlIGRvY3MpLlwiKTtyZXR1cm4gbnVsbH12YXIgbj10aGlzLl9jcmVhdGVJbWcoZSxpJiZcIklNR1wiPT09aS50YWdOYW1lP2k6bnVsbCk7cmV0dXJuIHRoaXMuX3NldEljb25TdHlsZXMobix0KSxufSxfc2V0SWNvblN0eWxlczpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMub3B0aW9ucyxuPWVbaStcIlNpemVcIl07XCJudW1iZXJcIj09dHlwZW9mIG4mJihuPVtuLG5dKTt2YXIgbz13KG4pLHM9dyhcInNoYWRvd1wiPT09aSYmZS5zaGFkb3dBbmNob3J8fGUuaWNvbkFuY2hvcnx8byYmby5kaXZpZGVCeSgyLCEwKSk7dC5jbGFzc05hbWU9XCJsZWFmbGV0LW1hcmtlci1cIitpK1wiIFwiKyhlLmNsYXNzTmFtZXx8XCJcIikscyYmKHQuc3R5bGUubWFyZ2luTGVmdD0tcy54K1wicHhcIix0LnN0eWxlLm1hcmdpblRvcD0tcy55K1wicHhcIiksbyYmKHQuc3R5bGUud2lkdGg9by54K1wicHhcIix0LnN0eWxlLmhlaWdodD1vLnkrXCJweFwiKX0sX2NyZWF0ZUltZzpmdW5jdGlvbih0LGkpe3JldHVybiBpPWl8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiksaS5zcmM9dCxpfSxfZ2V0SWNvblVybDpmdW5jdGlvbih0KXtyZXR1cm4gWWkmJnRoaXMub3B0aW9uc1t0K1wiUmV0aW5hVXJsXCJdfHx0aGlzLm9wdGlvbnNbdCtcIlVybFwiXX19KSxYZT1ZZS5leHRlbmQoe29wdGlvbnM6e2ljb25Vcmw6XCJtYXJrZXItaWNvbi5wbmdcIixpY29uUmV0aW5hVXJsOlwibWFya2VyLWljb24tMngucG5nXCIsc2hhZG93VXJsOlwibWFya2VyLXNoYWRvdy5wbmdcIixpY29uU2l6ZTpbMjUsNDFdLGljb25BbmNob3I6WzEyLDQxXSxwb3B1cEFuY2hvcjpbMSwtMzRdLHRvb2x0aXBBbmNob3I6WzE2LC0yOF0sc2hhZG93U2l6ZTpbNDEsNDFdfSxfZ2V0SWNvblVybDpmdW5jdGlvbih0KXtyZXR1cm4gWGUuaW1hZ2VQYXRofHwoWGUuaW1hZ2VQYXRoPXRoaXMuX2RldGVjdEljb25QYXRoKCkpLCh0aGlzLm9wdGlvbnMuaW1hZ2VQYXRofHxYZS5pbWFnZVBhdGgpK1llLnByb3RvdHlwZS5fZ2V0SWNvblVybC5jYWxsKHRoaXMsdCl9LF9kZXRlY3RJY29uUGF0aDpmdW5jdGlvbigpe3ZhciB0PUcoXCJkaXZcIixcImxlYWZsZXQtZGVmYXVsdC1pY29uLXBhdGhcIixkb2N1bWVudC5ib2R5KSxpPXEodCxcImJhY2tncm91bmQtaW1hZ2VcIil8fHEodCxcImJhY2tncm91bmRJbWFnZVwiKTtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxpPW51bGw9PT1pfHwwIT09aS5pbmRleE9mKFwidXJsXCIpP1wiXCI6aS5yZXBsYWNlKC9edXJsXFwoW1wiJ10/LyxcIlwiKS5yZXBsYWNlKC9tYXJrZXItaWNvblxcLnBuZ1tcIiddP1xcKSQvLFwiXCIpfX0pLEplPUVlLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXJrZXI9dH0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXJrZXIuX2ljb247dGhpcy5fZHJhZ2dhYmxlfHwodGhpcy5fZHJhZ2dhYmxlPW5ldyBSZSh0LHQsITApKSx0aGlzLl9kcmFnZ2FibGUub24oe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxwcmVkcmFnOnRoaXMuX29uUHJlRHJhZyxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcykuZW5hYmxlKCksUSh0LFwibGVhZmxldC1tYXJrZXItZHJhZ2dhYmxlXCIpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3RoaXMuX2RyYWdnYWJsZS5vZmYoe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxwcmVkcmFnOnRoaXMuX29uUHJlRHJhZyxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcykuZGlzYWJsZSgpLHRoaXMuX21hcmtlci5faWNvbiYmdHQodGhpcy5fbWFya2VyLl9pY29uLFwibGVhZmxldC1tYXJrZXItZHJhZ2dhYmxlXCIpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92ZWR9LF9hZGp1c3RQYW46ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFya2VyLGU9aS5fbWFwLG49dGhpcy5fbWFya2VyLm9wdGlvbnMuYXV0b1BhblNwZWVkLG89dGhpcy5fbWFya2VyLm9wdGlvbnMuYXV0b1BhblBhZGRpbmcscz1odChpLl9pY29uKSxyPWUuZ2V0UGl4ZWxCb3VuZHMoKSxhPWUuZ2V0UGl4ZWxPcmlnaW4oKSxoPWIoci5taW4uX3N1YnRyYWN0KGEpLmFkZChvKSxyLm1heC5fc3VidHJhY3QoYSkuc3VidHJhY3QobykpO2lmKCFoLmNvbnRhaW5zKHMpKXt2YXIgdT13KChNYXRoLm1heChoLm1heC54LHMueCktaC5tYXgueCkvKHIubWF4LngtaC5tYXgueCktKE1hdGgubWluKGgubWluLngscy54KS1oLm1pbi54KS8oci5taW4ueC1oLm1pbi54KSwoTWF0aC5tYXgoaC5tYXgueSxzLnkpLWgubWF4LnkpLyhyLm1heC55LWgubWF4LnkpLShNYXRoLm1pbihoLm1pbi55LHMueSktaC5taW4ueSkvKHIubWluLnktaC5taW4ueSkpLm11bHRpcGx5Qnkobik7ZS5wYW5CeSh1LHthbmltYXRlOiExfSksdGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MuX2FkZCh1KSx0aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zLl9hZGQodSksYXQoaS5faWNvbix0aGlzLl9kcmFnZ2FibGUuX25ld1BvcyksdGhpcy5fb25EcmFnKHQpLHRoaXMuX3BhblJlcXVlc3Q9Zih0aGlzLl9hZGp1c3RQYW4uYmluZCh0aGlzLHQpKX19LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3RoaXMuX29sZExhdExuZz10aGlzLl9tYXJrZXIuZ2V0TGF0TG5nKCksdGhpcy5fbWFya2VyLmNsb3NlUG9wdXAoKS5maXJlKFwibW92ZXN0YXJ0XCIpLmZpcmUoXCJkcmFnc3RhcnRcIil9LF9vblByZURyYWc6ZnVuY3Rpb24odCl7dGhpcy5fbWFya2VyLm9wdGlvbnMuYXV0b1BhbiYmKGcodGhpcy5fcGFuUmVxdWVzdCksdGhpcy5fcGFuUmVxdWVzdD1mKHRoaXMuX2FkanVzdFBhbi5iaW5kKHRoaXMsdCkpKX0sX29uRHJhZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXJrZXIsZT1pLl9zaGFkb3csbj1odChpLl9pY29uKSxvPWkuX21hcC5sYXllclBvaW50VG9MYXRMbmcobik7ZSYmYXQoZSxuKSxpLl9sYXRsbmc9byx0LmxhdGxuZz1vLHQub2xkTGF0TG5nPXRoaXMuX29sZExhdExuZyxpLmZpcmUoXCJtb3ZlXCIsdCkuZmlyZShcImRyYWdcIix0KX0sX29uRHJhZ0VuZDpmdW5jdGlvbih0KXtnKHRoaXMuX3BhblJlcXVlc3QpLGRlbGV0ZSB0aGlzLl9vbGRMYXRMbmcsdGhpcy5fbWFya2VyLmZpcmUoXCJtb3ZlZW5kXCIpLmZpcmUoXCJkcmFnZW5kXCIsdCl9fSksJGU9cWUuZXh0ZW5kKHtvcHRpb25zOntpY29uOm5ldyBYZSxpbnRlcmFjdGl2ZTohMCxrZXlib2FyZDohMCx0aXRsZTpcIlwiLGFsdDpcIlwiLHpJbmRleE9mZnNldDowLG9wYWNpdHk6MSxyaXNlT25Ib3ZlcjohMSxyaXNlT2Zmc2V0OjI1MCxwYW5lOlwibWFya2VyUGFuZVwiLGJ1YmJsaW5nTW91c2VFdmVudHM6ITEsZHJhZ2dhYmxlOiExLGF1dG9QYW46ITEsYXV0b1BhblBhZGRpbmc6WzUwLDUwXSxhdXRvUGFuU3BlZWQ6MTB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF0bG5nPUModCl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX3pvb21BbmltYXRlZD10aGlzLl96b29tQW5pbWF0ZWQmJnQub3B0aW9ucy5tYXJrZXJab29tQW5pbWF0aW9uLHRoaXMuX3pvb21BbmltYXRlZCYmdC5vbihcInpvb21hbmltXCIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyksdGhpcy5faW5pdEljb24oKSx0aGlzLnVwZGF0ZSgpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLmRyYWdnaW5nJiZ0aGlzLmRyYWdnaW5nLmVuYWJsZWQoKSYmKHRoaXMub3B0aW9ucy5kcmFnZ2FibGU9ITAsdGhpcy5kcmFnZ2luZy5yZW1vdmVIb29rcygpKSxkZWxldGUgdGhpcy5kcmFnZ2luZyx0aGlzLl96b29tQW5pbWF0ZWQmJnQub2ZmKFwiem9vbWFuaW1cIix0aGlzLl9hbmltYXRlWm9vbSx0aGlzKSx0aGlzLl9yZW1vdmVJY29uKCksdGhpcy5fcmVtb3ZlU2hhZG93KCl9LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybnt6b29tOnRoaXMudXBkYXRlLHZpZXdyZXNldDp0aGlzLnVwZGF0ZX19LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LHNldExhdExuZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9sYXRsbmc7cmV0dXJuIHRoaXMuX2xhdGxuZz1DKHQpLHRoaXMudXBkYXRlKCksdGhpcy5maXJlKFwibW92ZVwiLHtvbGRMYXRMbmc6aSxsYXRsbmc6dGhpcy5fbGF0bG5nfSl9LHNldFpJbmRleE9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldD10LHRoaXMudXBkYXRlKCl9LHNldEljb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uPXQsdGhpcy5fbWFwJiYodGhpcy5faW5pdEljb24oKSx0aGlzLnVwZGF0ZSgpKSx0aGlzLl9wb3B1cCYmdGhpcy5iaW5kUG9wdXAodGhpcy5fcG9wdXAsdGhpcy5fcG9wdXAub3B0aW9ucyksdGhpc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pY29ufSx1cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9pY29uJiZ0aGlzLl9tYXApe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKS5yb3VuZCgpO3RoaXMuX3NldFBvcyh0KX1yZXR1cm4gdGhpc30sX2luaXRJY29uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGk9XCJsZWFmbGV0LXpvb20tXCIrKHRoaXMuX3pvb21BbmltYXRlZD9cImFuaW1hdGVkXCI6XCJoaWRlXCIpLGU9dC5pY29uLmNyZWF0ZUljb24odGhpcy5faWNvbiksbj0hMTtlIT09dGhpcy5faWNvbiYmKHRoaXMuX2ljb24mJnRoaXMuX3JlbW92ZUljb24oKSxuPSEwLHQudGl0bGUmJihlLnRpdGxlPXQudGl0bGUpLFwiSU1HXCI9PT1lLnRhZ05hbWUmJihlLmFsdD10LmFsdHx8XCJcIikpLFEoZSxpKSx0LmtleWJvYXJkJiYoZS50YWJJbmRleD1cIjBcIiksdGhpcy5faWNvbj1lLHQucmlzZU9uSG92ZXImJnRoaXMub24oe21vdXNlb3Zlcjp0aGlzLl9icmluZ1RvRnJvbnQsbW91c2VvdXQ6dGhpcy5fcmVzZXRaSW5kZXh9KTt2YXIgbz10Lmljb24uY3JlYXRlU2hhZG93KHRoaXMuX3NoYWRvdykscz0hMTtvIT09dGhpcy5fc2hhZG93JiYodGhpcy5fcmVtb3ZlU2hhZG93KCkscz0hMCksbyYmKFEobyxpKSxvLmFsdD1cIlwiKSx0aGlzLl9zaGFkb3c9byx0Lm9wYWNpdHk8MSYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpLG4mJnRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2ljb24pLHRoaXMuX2luaXRJbnRlcmFjdGlvbigpLG8mJnMmJnRoaXMuZ2V0UGFuZShcInNoYWRvd1BhbmVcIikuYXBwZW5kQ2hpbGQodGhpcy5fc2hhZG93KX0sX3JlbW92ZUljb246ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMucmlzZU9uSG92ZXImJnRoaXMub2ZmKHttb3VzZW92ZXI6dGhpcy5fYnJpbmdUb0Zyb250LG1vdXNlb3V0OnRoaXMuX3Jlc2V0WkluZGV4fSksSyh0aGlzLl9pY29uKSx0aGlzLnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ljb24pLHRoaXMuX2ljb249bnVsbH0sX3JlbW92ZVNoYWRvdzpmdW5jdGlvbigpe3RoaXMuX3NoYWRvdyYmSyh0aGlzLl9zaGFkb3cpLHRoaXMuX3NoYWRvdz1udWxsfSxfc2V0UG9zOmZ1bmN0aW9uKHQpe2F0KHRoaXMuX2ljb24sdCksdGhpcy5fc2hhZG93JiZhdCh0aGlzLl9zaGFkb3csdCksdGhpcy5fekluZGV4PXQueSt0aGlzLm9wdGlvbnMuekluZGV4T2Zmc2V0LHRoaXMuX3Jlc2V0WkluZGV4KCl9LF91cGRhdGVaSW5kZXg6ZnVuY3Rpb24odCl7dGhpcy5faWNvbi5zdHlsZS56SW5kZXg9dGhpcy5fekluZGV4K3R9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKS5yb3VuZCgpO3RoaXMuX3NldFBvcyhpKX0sX2luaXRJbnRlcmFjdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmKFEodGhpcy5faWNvbixcImxlYWZsZXQtaW50ZXJhY3RpdmVcIiksdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pY29uKSxKZSkpe3ZhciB0PXRoaXMub3B0aW9ucy5kcmFnZ2FibGU7dGhpcy5kcmFnZ2luZyYmKHQ9dGhpcy5kcmFnZ2luZy5lbmFibGVkKCksdGhpcy5kcmFnZ2luZy5kaXNhYmxlKCkpLHRoaXMuZHJhZ2dpbmc9bmV3IEplKHRoaXMpLHQmJnRoaXMuZHJhZ2dpbmcuZW5hYmxlKCl9fSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX21hcCYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm9wYWNpdHk7bnQodGhpcy5faWNvbix0KSx0aGlzLl9zaGFkb3cmJm50KHRoaXMuX3NoYWRvdyx0KX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVpJbmRleCh0aGlzLm9wdGlvbnMucmlzZU9mZnNldCl9LF9yZXNldFpJbmRleDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVpJbmRleCgwKX0sX2dldFBvcHVwQW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMucG9wdXBBbmNob3J9LF9nZXRUb29sdGlwQW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMudG9vbHRpcEFuY2hvcn19KSxRZT1xZS5leHRlbmQoe29wdGlvbnM6e3N0cm9rZTohMCxjb2xvcjpcIiMzMzg4ZmZcIix3ZWlnaHQ6MyxvcGFjaXR5OjEsbGluZUNhcDpcInJvdW5kXCIsbGluZUpvaW46XCJyb3VuZFwiLGRhc2hBcnJheTpudWxsLGRhc2hPZmZzZXQ6bnVsbCxmaWxsOiExLGZpbGxDb2xvcjpudWxsLGZpbGxPcGFjaXR5Oi4yLGZpbGxSdWxlOlwiZXZlbm9kZFwiLGludGVyYWN0aXZlOiEwLGJ1YmJsaW5nTW91c2VFdmVudHM6ITB9LGJlZm9yZUFkZDpmdW5jdGlvbih0KXt0aGlzLl9yZW5kZXJlcj10LmdldFJlbmRlcmVyKHRoaXMpfSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9pbml0UGF0aCh0aGlzKSx0aGlzLl9yZXNldCgpLHRoaXMuX3JlbmRlcmVyLl9hZGRQYXRoKHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9yZW1vdmVQYXRoKHRoaXMpfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9yZW5kZXJlci5fdXBkYXRlUGF0aCh0aGlzKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gbCh0aGlzLHQpLHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fdXBkYXRlU3R5bGUodGhpcyksdGhpc30sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fYnJpbmdUb0Zyb250KHRoaXMpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fYnJpbmdUb0JhY2sodGhpcyksdGhpc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXRofSxfcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0KCksdGhpcy5fdXBkYXRlKCl9LF9jbGlja1RvbGVyYW5jZTpmdW5jdGlvbigpe3JldHVybih0aGlzLm9wdGlvbnMuc3Ryb2tlP3RoaXMub3B0aW9ucy53ZWlnaHQvMjowKSt0aGlzLl9yZW5kZXJlci5vcHRpb25zLnRvbGVyYW5jZX19KSx0bj1RZS5leHRlbmQoe29wdGlvbnM6e2ZpbGw6ITAscmFkaXVzOjEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7bCh0aGlzLGkpLHRoaXMuX2xhdGxuZz1DKHQpLHRoaXMuX3JhZGl1cz10aGlzLm9wdGlvbnMucmFkaXVzfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz1DKHQpLHRoaXMucmVkcmF3KCksdGhpcy5maXJlKFwibW92ZVwiLHtsYXRsbmc6dGhpcy5fbGF0bG5nfSl9LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJhZGl1cz10aGlzLl9yYWRpdXM9dCx0aGlzLnJlZHJhdygpfSxnZXRSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaXVzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXt2YXIgaT10JiZ0LnJhZGl1c3x8dGhpcy5fcmFkaXVzO3JldHVybiBRZS5wcm90b3R5cGUuc2V0U3R5bGUuY2FsbCh0aGlzLHQpLHRoaXMuc2V0UmFkaXVzKGkpLHRoaXN9LF9wcm9qZWN0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLHRoaXMuX3VwZGF0ZUJvdW5kcygpfSxfdXBkYXRlQm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmFkaXVzLGk9dGhpcy5fcmFkaXVzWXx8dCxlPXRoaXMuX2NsaWNrVG9sZXJhbmNlKCksbj1bdCtlLGkrZV07dGhpcy5fcHhCb3VuZHM9bmV3IFAodGhpcy5fcG9pbnQuc3VidHJhY3QobiksdGhpcy5fcG9pbnQuYWRkKG4pKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmdGhpcy5fdXBkYXRlUGF0aCgpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl91cGRhdGVDaXJjbGUodGhpcyl9LF9lbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpdXMmJiF0aGlzLl9yZW5kZXJlci5fYm91bmRzLmludGVyc2VjdHModGhpcy5fcHhCb3VuZHMpfSxfY29udGFpbnNQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuX3BvaW50KTw9dGhpcy5fcmFkaXVzK3RoaXMuX2NsaWNrVG9sZXJhbmNlKCl9fSksZW49dG4uZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSxuKXtpZihcIm51bWJlclwiPT10eXBlb2YgZSYmKGU9aSh7fSxuLHtyYWRpdXM6ZX0pKSxsKHRoaXMsZSksdGhpcy5fbGF0bG5nPUModCksaXNOYU4odGhpcy5vcHRpb25zLnJhZGl1cykpdGhyb3cgbmV3IEVycm9yKFwiQ2lyY2xlIHJhZGl1cyBjYW5ub3QgYmUgTmFOXCIpO3RoaXMuX21SYWRpdXM9dGhpcy5vcHRpb25zLnJhZGl1c30sc2V0UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tUmFkaXVzPXQsdGhpcy5yZWRyYXcoKX0sZ2V0UmFkaXVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21SYWRpdXN9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PVt0aGlzLl9yYWRpdXMsdGhpcy5fcmFkaXVzWXx8dGhpcy5fcmFkaXVzXTtyZXR1cm4gbmV3IFQodGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludC5zdWJ0cmFjdCh0KSksdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludC5hZGQodCkpKX0sc2V0U3R5bGU6UWUucHJvdG90eXBlLnNldFN0eWxlLF9wcm9qZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGF0bG5nLmxuZyxpPXRoaXMuX2xhdGxuZy5sYXQsZT10aGlzLl9tYXAsbj1lLm9wdGlvbnMuY3JzO2lmKG4uZGlzdGFuY2U9PT1waS5kaXN0YW5jZSl7dmFyIG89TWF0aC5QSS8xODAscz10aGlzLl9tUmFkaXVzL3BpLlIvbyxyPWUucHJvamVjdChbaStzLHRdKSxhPWUucHJvamVjdChbaS1zLHRdKSxoPXIuYWRkKGEpLmRpdmlkZUJ5KDIpLHU9ZS51bnByb2plY3QoaCkubGF0LGw9TWF0aC5hY29zKChNYXRoLmNvcyhzKm8pLU1hdGguc2luKGkqbykqTWF0aC5zaW4odSpvKSkvKE1hdGguY29zKGkqbykqTWF0aC5jb3ModSpvKSkpL287KGlzTmFOKGwpfHwwPT09bCkmJihsPXMvTWF0aC5jb3MoTWF0aC5QSS8xODAqaSkpLHRoaXMuX3BvaW50PWguc3VidHJhY3QoZS5nZXRQaXhlbE9yaWdpbigpKSx0aGlzLl9yYWRpdXM9aXNOYU4obCk/MDpoLngtZS5wcm9qZWN0KFt1LHQtbF0pLngsdGhpcy5fcmFkaXVzWT1oLnktci55fWVsc2V7dmFyIGM9bi51bnByb2plY3Qobi5wcm9qZWN0KHRoaXMuX2xhdGxuZykuc3VidHJhY3QoW3RoaXMuX21SYWRpdXMsMF0pKTt0aGlzLl9wb2ludD1lLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLHRoaXMuX3JhZGl1cz10aGlzLl9wb2ludC54LWUubGF0TG5nVG9MYXllclBvaW50KGMpLnh9dGhpcy5fdXBkYXRlQm91bmRzKCl9fSksbm49UWUuZXh0ZW5kKHtvcHRpb25zOntzbW9vdGhGYWN0b3I6MSxub0NsaXA6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fc2V0TGF0TG5ncyh0KX0sZ2V0TGF0TG5nczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmdzfSxzZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zZXRMYXRMbmdzKHQpLHRoaXMucmVkcmF3KCl9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fbGF0bG5ncy5sZW5ndGh9LGNsb3Nlc3RMYXllclBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxlLG49MS8wLG89bnVsbCxzPUR0LHI9MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDtyPGE7cisrKWZvcih2YXIgaD10aGlzLl9wYXJ0c1tyXSx1PTEsbD1oLmxlbmd0aDt1PGw7dSsrKXt2YXIgYz1zKHQsaT1oW3UtMV0sZT1oW3VdLCEwKTtjPG4mJihuPWMsbz1zKHQsaSxlKSl9cmV0dXJuIG8mJihvLmRpc3RhbmNlPU1hdGguc3FydChuKSksb30sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcCl0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGFkZCBsYXllciB0byBtYXAgYmVmb3JlIHVzaW5nIGdldENlbnRlcigpXCIpO3ZhciB0LGksZSxuLG8scyxyLGE9dGhpcy5fcmluZ3NbMF0saD1hLmxlbmd0aDtpZighaClyZXR1cm4gbnVsbDtmb3IodD0wLGk9MDt0PGgtMTt0KyspaSs9YVt0XS5kaXN0YW5jZVRvKGFbdCsxXSkvMjtpZigwPT09aSlyZXR1cm4gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhhWzBdKTtmb3IodD0wLG49MDt0PGgtMTt0KyspaWYobz1hW3RdLHM9YVt0KzFdLGU9by5kaXN0YW5jZVRvKHMpLChuKz1lKT5pKXJldHVybiByPShuLWkpL2UsdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhbcy54LXIqKHMueC1vLngpLHMueS1yKihzLnktby55KV0pfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxhZGRMYXRMbmc6ZnVuY3Rpb24odCxpKXtyZXR1cm4gaT1pfHx0aGlzLl9kZWZhdWx0U2hhcGUoKSx0PUModCksaS5wdXNoKHQpLHRoaXMuX2JvdW5kcy5leHRlbmQodCksdGhpcy5yZWRyYXcoKX0sX3NldExhdExuZ3M6ZnVuY3Rpb24odCl7dGhpcy5fYm91bmRzPW5ldyBULHRoaXMuX2xhdGxuZ3M9dGhpcy5fY29udmVydExhdExuZ3ModCl9LF9kZWZhdWx0U2hhcGU6ZnVuY3Rpb24oKXtyZXR1cm4ganQodGhpcy5fbGF0bG5ncyk/dGhpcy5fbGF0bG5nczp0aGlzLl9sYXRsbmdzWzBdfSxfY29udmVydExhdExuZ3M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPVtdLGU9anQodCksbj0wLG89dC5sZW5ndGg7bjxvO24rKyllPyhpW25dPUModFtuXSksdGhpcy5fYm91bmRzLmV4dGVuZChpW25dKSk6aVtuXT10aGlzLl9jb252ZXJ0TGF0TG5ncyh0W25dKTtyZXR1cm4gaX0sX3Byb2plY3Q6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgUDt0aGlzLl9yaW5ncz1bXSx0aGlzLl9wcm9qZWN0TGF0bG5ncyh0aGlzLl9sYXRsbmdzLHRoaXMuX3JpbmdzLHQpO3ZhciBpPXRoaXMuX2NsaWNrVG9sZXJhbmNlKCksZT1uZXcgeChpLGkpO3RoaXMuX2JvdW5kcy5pc1ZhbGlkKCkmJnQuaXNWYWxpZCgpJiYodC5taW4uX3N1YnRyYWN0KGUpLHQubWF4Ll9hZGQoZSksdGhpcy5fcHhCb3VuZHM9dCl9LF9wcm9qZWN0TGF0bG5nczpmdW5jdGlvbih0LGksZSl7dmFyIG4sbyxzPXRbMF1pbnN0YW5jZW9mIE0scj10Lmxlbmd0aDtpZihzKXtmb3Iobz1bXSxuPTA7bjxyO24rKylvW25dPXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodFtuXSksZS5leHRlbmQob1tuXSk7aS5wdXNoKG8pfWVsc2UgZm9yKG49MDtuPHI7bisrKXRoaXMuX3Byb2plY3RMYXRsbmdzKHRbbl0saSxlKX0sX2NsaXBQb2ludHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZW5kZXJlci5fYm91bmRzO2lmKHRoaXMuX3BhcnRzPVtdLHRoaXMuX3B4Qm91bmRzJiZ0aGlzLl9weEJvdW5kcy5pbnRlcnNlY3RzKHQpKWlmKHRoaXMub3B0aW9ucy5ub0NsaXApdGhpcy5fcGFydHM9dGhpcy5fcmluZ3M7ZWxzZXt2YXIgaSxlLG4sbyxzLHIsYSxoPXRoaXMuX3BhcnRzO2ZvcihpPTAsbj0wLG89dGhpcy5fcmluZ3MubGVuZ3RoO2k8bztpKyspZm9yKGU9MCxzPShhPXRoaXMuX3JpbmdzW2ldKS5sZW5ndGg7ZTxzLTE7ZSsrKShyPUl0KGFbZV0sYVtlKzFdLHQsZSwhMCkpJiYoaFtuXT1oW25dfHxbXSxoW25dLnB1c2goclswXSksclsxXT09PWFbZSsxXSYmZSE9PXMtMnx8KGhbbl0ucHVzaChyWzFdKSxuKyspKX19LF9zaW1wbGlmeVBvaW50czpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9wYXJ0cyxpPXRoaXMub3B0aW9ucy5zbW9vdGhGYWN0b3IsZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdPVp0KHRbZV0saSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jbGlwUG9pbnRzKCksdGhpcy5fc2ltcGxpZnlQb2ludHMoKSx0aGlzLl91cGRhdGVQYXRoKCkpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl91cGRhdGVQb2x5KHRoaXMpfSxfY29udGFpbnNQb2ludDpmdW5jdGlvbih0LGkpe3ZhciBlLG4sbyxzLHIsYSxoPXRoaXMuX2NsaWNrVG9sZXJhbmNlKCk7aWYoIXRoaXMuX3B4Qm91bmRzfHwhdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKGU9MCxzPXRoaXMuX3BhcnRzLmxlbmd0aDtlPHM7ZSsrKWZvcihuPTAsbz0ocj0oYT10aGlzLl9wYXJ0c1tlXSkubGVuZ3RoKS0xO248cjtvPW4rKylpZigoaXx8MCE9PW4pJiZFdCh0LGFbb10sYVtuXSk8PWgpcmV0dXJuITA7cmV0dXJuITF9fSk7bm4uX2ZsYXQ9V3Q7dmFyIG9uPW5uLmV4dGVuZCh7b3B0aW9uczp7ZmlsbDohMH0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9sYXRsbmdzLmxlbmd0aHx8IXRoaXMuX2xhdGxuZ3NbMF0ubGVuZ3RofSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtpZighdGhpcy5fbWFwKXRocm93IG5ldyBFcnJvcihcIk11c3QgYWRkIGxheWVyIHRvIG1hcCBiZWZvcmUgdXNpbmcgZ2V0Q2VudGVyKClcIik7dmFyIHQsaSxlLG4sbyxzLHIsYSxoLHU9dGhpcy5fcmluZ3NbMF0sbD11Lmxlbmd0aDtpZighbClyZXR1cm4gbnVsbDtmb3Iocz1yPWE9MCx0PTAsaT1sLTE7dDxsO2k9dCsrKWU9dVt0XSxuPXVbaV0sbz1lLnkqbi54LW4ueSplLngscis9KGUueCtuLngpKm8sYSs9KGUueStuLnkpKm8scys9MypvO3JldHVybiBoPTA9PT1zP3VbMF06W3IvcyxhL3NdLHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoaCl9LF9jb252ZXJ0TGF0TG5nczpmdW5jdGlvbih0KXt2YXIgaT1ubi5wcm90b3R5cGUuX2NvbnZlcnRMYXRMbmdzLmNhbGwodGhpcyx0KSxlPWkubGVuZ3RoO3JldHVybiBlPj0yJiZpWzBdaW5zdGFuY2VvZiBNJiZpWzBdLmVxdWFscyhpW2UtMV0pJiZpLnBvcCgpLGl9LF9zZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe25uLnByb3RvdHlwZS5fc2V0TGF0TG5ncy5jYWxsKHRoaXMsdCksanQodGhpcy5fbGF0bG5ncykmJih0aGlzLl9sYXRsbmdzPVt0aGlzLl9sYXRsbmdzXSl9LF9kZWZhdWx0U2hhcGU6ZnVuY3Rpb24oKXtyZXR1cm4ganQodGhpcy5fbGF0bG5nc1swXSk/dGhpcy5fbGF0bG5nc1swXTp0aGlzLl9sYXRsbmdzWzBdWzBdfSxfY2xpcFBvaW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMsaT10aGlzLm9wdGlvbnMud2VpZ2h0LGU9bmV3IHgoaSxpKTtpZih0PW5ldyBQKHQubWluLnN1YnRyYWN0KGUpLHQubWF4LmFkZChlKSksdGhpcy5fcGFydHM9W10sdGhpcy5fcHhCb3VuZHMmJnRoaXMuX3B4Qm91bmRzLmludGVyc2VjdHModCkpaWYodGhpcy5vcHRpb25zLm5vQ2xpcCl0aGlzLl9wYXJ0cz10aGlzLl9yaW5ncztlbHNlIGZvcih2YXIgbixvPTAscz10aGlzLl9yaW5ncy5sZW5ndGg7bzxzO28rKykobj1IdCh0aGlzLl9yaW5nc1tvXSx0LCEwKSkubGVuZ3RoJiZ0aGlzLl9wYXJ0cy5wdXNoKG4pfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl91cGRhdGVQb2x5KHRoaXMsITApfSxfY29udGFpbnNQb2ludDpmdW5jdGlvbih0KXt2YXIgaSxlLG4sbyxzLHIsYSxoLHU9ITE7aWYoIXRoaXMuX3B4Qm91bmRzfHwhdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKG89MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDtvPGE7bysrKWZvcihzPTAscj0oaD0oaT10aGlzLl9wYXJ0c1tvXSkubGVuZ3RoKS0xO3M8aDtyPXMrKyllPWlbc10sbj1pW3JdLGUueT50LnkhPW4ueT50LnkmJnQueDwobi54LWUueCkqKHQueS1lLnkpLyhuLnktZS55KStlLngmJih1PSF1KTtyZXR1cm4gdXx8bm4ucHJvdG90eXBlLl9jb250YWluc1BvaW50LmNhbGwodGhpcyx0LCEwKX19KSxzbj1LZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF5ZXJzPXt9LHQmJnRoaXMuYWRkRGF0YSh0KX0sYWRkRGF0YTpmdW5jdGlvbih0KXt2YXIgaSxlLG4sbz1vaSh0KT90OnQuZmVhdHVyZXM7aWYobyl7Zm9yKGk9MCxlPW8ubGVuZ3RoO2k8ZTtpKyspKChuPW9baV0pLmdlb21ldHJpZXN8fG4uZ2VvbWV0cnl8fG4uZmVhdHVyZXN8fG4uY29vcmRpbmF0ZXMpJiZ0aGlzLmFkZERhdGEobik7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5vcHRpb25zO2lmKHMuZmlsdGVyJiYhcy5maWx0ZXIodCkpcmV0dXJuIHRoaXM7dmFyIHI9RnQodCxzKTtyZXR1cm4gcj8oci5mZWF0dXJlPVl0KHQpLHIuZGVmYXVsdE9wdGlvbnM9ci5vcHRpb25zLHRoaXMucmVzZXRTdHlsZShyKSxzLm9uRWFjaEZlYXR1cmUmJnMub25FYWNoRmVhdHVyZSh0LHIpLHRoaXMuYWRkTGF5ZXIocikpOnRoaXN9LHJlc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQub3B0aW9ucz1pKHt9LHQuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX3NldExheWVyU3R5bGUodCx0aGlzLm9wdGlvbnMuc3R5bGUpLHRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihpKXt0aGlzLl9zZXRMYXllclN0eWxlKGksdCl9LHRoaXMpfSxfc2V0TGF5ZXJTdHlsZTpmdW5jdGlvbih0LGkpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGkmJihpPWkodC5mZWF0dXJlKSksdC5zZXRTdHlsZSYmdC5zZXRTdHlsZShpKX19KSxybj17dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBLdCh0aGlzLHt0eXBlOlwiUG9pbnRcIixjb29yZGluYXRlczpxdCh0aGlzLmdldExhdExuZygpLHQpfSl9fTskZS5pbmNsdWRlKHJuKSxlbi5pbmNsdWRlKHJuKSx0bi5pbmNsdWRlKHJuKSxubi5pbmNsdWRlKHt0b0dlb0pTT046ZnVuY3Rpb24odCl7dmFyIGk9IWp0KHRoaXMuX2xhdGxuZ3MpLGU9R3QodGhpcy5fbGF0bG5ncyxpPzE6MCwhMSx0KTtyZXR1cm4gS3QodGhpcyx7dHlwZTooaT9cIk11bHRpXCI6XCJcIikrXCJMaW5lU3RyaW5nXCIsY29vcmRpbmF0ZXM6ZX0pfX0pLG9uLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgaT0hanQodGhpcy5fbGF0bG5ncyksZT1pJiYhanQodGhpcy5fbGF0bG5nc1swXSksbj1HdCh0aGlzLl9sYXRsbmdzLGU/MjppPzE6MCwhMCx0KTtyZXR1cm4gaXx8KG49W25dKSxLdCh0aGlzLHt0eXBlOihlP1wiTXVsdGlcIjpcIlwiKStcIlBvbHlnb25cIixjb29yZGluYXRlczpufSl9fSksR2UuaW5jbHVkZSh7dG9NdWx0aVBvaW50OmZ1bmN0aW9uKHQpe3ZhciBpPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihlKXtpLnB1c2goZS50b0dlb0pTT04odCkuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpfSksS3QodGhpcyx7dHlwZTpcIk11bHRpUG9pbnRcIixjb29yZGluYXRlczppfSl9LHRvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmZlYXR1cmUmJnRoaXMuZmVhdHVyZS5nZW9tZXRyeSYmdGhpcy5mZWF0dXJlLmdlb21ldHJ5LnR5cGU7aWYoXCJNdWx0aVBvaW50XCI9PT1pKXJldHVybiB0aGlzLnRvTXVsdGlQb2ludCh0KTt2YXIgZT1cIkdlb21ldHJ5Q29sbGVjdGlvblwiPT09aSxuPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihpKXtpZihpLnRvR2VvSlNPTil7dmFyIG89aS50b0dlb0pTT04odCk7aWYoZSluLnB1c2goby5nZW9tZXRyeSk7ZWxzZXt2YXIgcz1ZdChvKTtcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1zLnR5cGU/bi5wdXNoLmFwcGx5KG4scy5mZWF0dXJlcyk6bi5wdXNoKHMpfX19KSxlP0t0KHRoaXMse2dlb21ldHJpZXM6bix0eXBlOlwiR2VvbWV0cnlDb2xsZWN0aW9uXCJ9KTp7dHlwZTpcIkZlYXR1cmVDb2xsZWN0aW9uXCIsZmVhdHVyZXM6bn19fSk7dmFyIGFuPVh0LGhuPXFlLmV4dGVuZCh7b3B0aW9uczp7b3BhY2l0eToxLGFsdDpcIlwiLGludGVyYWN0aXZlOiExLGNyb3NzT3JpZ2luOiExLGVycm9yT3ZlcmxheVVybDpcIlwiLHpJbmRleDoxLGNsYXNzTmFtZTpcIlwifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl91cmw9dCx0aGlzLl9ib3VuZHM9eihpKSxsKHRoaXMsZSl9LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5faW1hZ2V8fCh0aGlzLl9pbml0SW1hZ2UoKSx0aGlzLm9wdGlvbnMub3BhY2l0eTwxJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCkpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmKFEodGhpcy5faW1hZ2UsXCJsZWFmbGV0LWludGVyYWN0aXZlXCIpLHRoaXMuYWRkSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faW1hZ2UpKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9pbWFnZSksdGhpcy5fcmVzZXQoKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXtLKHRoaXMuX2ltYWdlKSx0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUmJnRoaXMucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faW1hZ2UpfSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX2ltYWdlJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQub3BhY2l0eSYmdGhpcy5zZXRPcGFjaXR5KHQub3BhY2l0eSksdGhpc30sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmWCh0aGlzLl9pbWFnZSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZKKHRoaXMuX2ltYWdlKSx0aGlzfSxzZXRVcmw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3VybD10LHRoaXMuX2ltYWdlJiYodGhpcy5faW1hZ2Uuc3JjPXQpLHRoaXN9LHNldEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYm91bmRzPXoodCksdGhpcy5fbWFwJiZ0aGlzLl9yZXNldCgpLHRoaXN9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt6b29tOnRoaXMuX3Jlc2V0LHZpZXdyZXNldDp0aGlzLl9yZXNldH07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleD10LHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXN9LGdldEJvdW5kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZHN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW1hZ2V9LF9pbml0SW1hZ2U6ZnVuY3Rpb24oKXt2YXIgdD1cIklNR1wiPT09dGhpcy5fdXJsLnRhZ05hbWUsaT10aGlzLl9pbWFnZT10P3RoaXMuX3VybDpHKFwiaW1nXCIpO1EoaSxcImxlYWZsZXQtaW1hZ2UtbGF5ZXJcIiksdGhpcy5fem9vbUFuaW1hdGVkJiZRKGksXCJsZWFmbGV0LXpvb20tYW5pbWF0ZWRcIiksdGhpcy5vcHRpb25zLmNsYXNzTmFtZSYmUShpLHRoaXMub3B0aW9ucy5jbGFzc05hbWUpLGkub25zZWxlY3RzdGFydD1yLGkub25tb3VzZW1vdmU9cixpLm9ubG9hZD1lKHRoaXMuZmlyZSx0aGlzLFwibG9hZFwiKSxpLm9uZXJyb3I9ZSh0aGlzLl9vdmVybGF5T25FcnJvcix0aGlzLFwiZXJyb3JcIiksKHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbnx8XCJcIj09PXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbikmJihpLmNyb3NzT3JpZ2luPSEwPT09dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luP1wiXCI6dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luKSx0aGlzLm9wdGlvbnMuekluZGV4JiZ0aGlzLl91cGRhdGVaSW5kZXgoKSx0P3RoaXMuX3VybD1pLnNyYzooaS5zcmM9dGhpcy5fdXJsLGkuYWx0PXRoaXMub3B0aW9ucy5hbHQpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLmdldFpvb21TY2FsZSh0Lnpvb20pLGU9dGhpcy5fbWFwLl9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzKHRoaXMuX2JvdW5kcyx0Lnpvb20sdC5jZW50ZXIpLm1pbjtydCh0aGlzLl9pbWFnZSxlLGkpfSxfcmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbWFnZSxpPW5ldyBQKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpKSx0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2JvdW5kcy5nZXRTb3V0aEVhc3QoKSkpLGU9aS5nZXRTaXplKCk7YXQodCxpLm1pbiksdC5zdHlsZS53aWR0aD1lLngrXCJweFwiLHQuc3R5bGUuaGVpZ2h0PWUueStcInB4XCJ9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7bnQodGhpcy5faW1hZ2UsdGhpcy5vcHRpb25zLm9wYWNpdHkpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5faW1hZ2UmJnZvaWQgMCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJm51bGwhPT10aGlzLm9wdGlvbnMuekluZGV4JiYodGhpcy5faW1hZ2Uuc3R5bGUuekluZGV4PXRoaXMub3B0aW9ucy56SW5kZXgpfSxfb3ZlcmxheU9uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoXCJlcnJvclwiKTt2YXIgdD10aGlzLm9wdGlvbnMuZXJyb3JPdmVybGF5VXJsO3QmJnRoaXMuX3VybCE9PXQmJih0aGlzLl91cmw9dCx0aGlzLl9pbWFnZS5zcmM9dCl9fSksdW49aG4uZXh0ZW5kKHtvcHRpb25zOnthdXRvcGxheTohMCxsb29wOiEwfSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9XCJWSURFT1wiPT09dGhpcy5fdXJsLnRhZ05hbWUsaT10aGlzLl9pbWFnZT10P3RoaXMuX3VybDpHKFwidmlkZW9cIik7aWYoUShpLFwibGVhZmxldC1pbWFnZS1sYXllclwiKSx0aGlzLl96b29tQW5pbWF0ZWQmJlEoaSxcImxlYWZsZXQtem9vbS1hbmltYXRlZFwiKSxpLm9uc2VsZWN0c3RhcnQ9cixpLm9ubW91c2Vtb3ZlPXIsaS5vbmxvYWRlZGRhdGE9ZSh0aGlzLmZpcmUsdGhpcyxcImxvYWRcIiksdCl7Zm9yKHZhciBuPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzb3VyY2VcIiksbz1bXSxzPTA7czxuLmxlbmd0aDtzKyspby5wdXNoKG5bc10uc3JjKTt0aGlzLl91cmw9bi5sZW5ndGg+MD9vOltpLnNyY119ZWxzZXtvaSh0aGlzLl91cmwpfHwodGhpcy5fdXJsPVt0aGlzLl91cmxdKSxpLmF1dG9wbGF5PSEhdGhpcy5vcHRpb25zLmF1dG9wbGF5LGkubG9vcD0hIXRoaXMub3B0aW9ucy5sb29wO2Zvcih2YXIgYT0wO2E8dGhpcy5fdXJsLmxlbmd0aDthKyspe3ZhciBoPUcoXCJzb3VyY2VcIik7aC5zcmM9dGhpcy5fdXJsW2FdLGkuYXBwZW5kQ2hpbGQoaCl9fX19KSxsbj1xZS5leHRlbmQoe29wdGlvbnM6e29mZnNldDpbMCw3XSxjbGFzc05hbWU6XCJcIixwYW5lOlwicG9wdXBQYW5lXCJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsdCksdGhpcy5fc291cmNlPWl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX3pvb21BbmltYXRlZD10Ll96b29tQW5pbWF0ZWQsdGhpcy5fY29udGFpbmVyfHx0aGlzLl9pbml0TGF5b3V0KCksdC5fZmFkZUFuaW1hdGVkJiZudCh0aGlzLl9jb250YWluZXIsMCksY2xlYXJUaW1lb3V0KHRoaXMuX3JlbW92ZVRpbWVvdXQpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy51cGRhdGUoKSx0Ll9mYWRlQW5pbWF0ZWQmJm50KHRoaXMuX2NvbnRhaW5lciwxKSx0aGlzLmJyaW5nVG9Gcm9udCgpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Ll9mYWRlQW5pbWF0ZWQ/KG50KHRoaXMuX2NvbnRhaW5lciwwKSx0aGlzLl9yZW1vdmVUaW1lb3V0PXNldFRpbWVvdXQoZShLLHZvaWQgMCx0aGlzLl9jb250YWluZXIpLDIwMCkpOksodGhpcy5fY29udGFpbmVyKX0sZ2V0TGF0TG5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ30sc2V0TGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXRsbmc9Qyh0KSx0aGlzLl9tYXAmJih0aGlzLl91cGRhdGVQb3NpdGlvbigpLHRoaXMuX2FkanVzdFBhbigpKSx0aGlzfSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9LHNldENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT1cImhpZGRlblwiLHRoaXMuX3VwZGF0ZUNvbnRlbnQoKSx0aGlzLl91cGRhdGVMYXlvdXQoKSx0aGlzLl91cGRhdGVQb3NpdGlvbigpLHRoaXMuX2NvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5PVwiXCIsdGhpcy5fYWRqdXN0UGFuKCkpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17em9vbTp0aGlzLl91cGRhdGVQb3NpdGlvbix2aWV3cmVzZXQ6dGhpcy5fdXBkYXRlUG9zaXRpb259O3JldHVybiB0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX2FuaW1hdGVab29tKSx0fSxpc09wZW46ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX21hcCYmdGhpcy5fbWFwLmhhc0xheWVyKHRoaXMpfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZYKHRoaXMuX2NvbnRhaW5lciksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZKKHRoaXMuX2NvbnRhaW5lciksdGhpc30sX3VwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9jb250ZW50KXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxpPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuX2NvbnRlbnQ/dGhpcy5fY29udGVudCh0aGlzLl9zb3VyY2V8fHRoaXMpOnRoaXMuX2NvbnRlbnQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkpdC5pbm5lckhUTUw9aTtlbHNle2Zvcig7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0LmFwcGVuZENoaWxkKGkpfXRoaXMuZmlyZShcImNvbnRlbnR1cGRhdGVcIil9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSxpPXcodGhpcy5vcHRpb25zLm9mZnNldCksZT10aGlzLl9nZXRBbmNob3IoKTt0aGlzLl96b29tQW5pbWF0ZWQ/YXQodGhpcy5fY29udGFpbmVyLHQuYWRkKGUpKTppPWkuYWRkKHQpLmFkZChlKTt2YXIgbj10aGlzLl9jb250YWluZXJCb3R0b209LWkueSxvPXRoaXMuX2NvbnRhaW5lckxlZnQ9LU1hdGgucm91bmQodGhpcy5fY29udGFpbmVyV2lkdGgvMikraS54O3RoaXMuX2NvbnRhaW5lci5zdHlsZS5ib3R0b209bitcInB4XCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmxlZnQ9bytcInB4XCJ9fSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuWzAsMF19fSksY249bG4uZXh0ZW5kKHtvcHRpb25zOnttYXhXaWR0aDozMDAsbWluV2lkdGg6NTAsbWF4SGVpZ2h0Om51bGwsYXV0b1BhbjohMCxhdXRvUGFuUGFkZGluZ1RvcExlZnQ6bnVsbCxhdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0Om51bGwsYXV0b1BhblBhZGRpbmc6WzUsNV0sa2VlcEluVmlldzohMSxjbG9zZUJ1dHRvbjohMCxhdXRvQ2xvc2U6ITAsY2xvc2VPbkVzY2FwZUtleTohMCxjbGFzc05hbWU6XCJcIn0sb3Blbk9uOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wZW5Qb3B1cCh0aGlzKSx0aGlzfSxvbkFkZDpmdW5jdGlvbih0KXtsbi5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpLHQuZmlyZShcInBvcHVwb3BlblwiLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmZpcmUoXCJwb3B1cG9wZW5cIix7cG9wdXA6dGhpc30sITApLHRoaXMuX3NvdXJjZSBpbnN0YW5jZW9mIFFlfHx0aGlzLl9zb3VyY2Uub24oXCJwcmVjbGlja1wiLHl0KSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe2xuLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKFwicG9wdXBjbG9zZVwiLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmZpcmUoXCJwb3B1cGNsb3NlXCIse3BvcHVwOnRoaXN9LCEwKSx0aGlzLl9zb3VyY2UgaW5zdGFuY2VvZiBRZXx8dGhpcy5fc291cmNlLm9mZihcInByZWNsaWNrXCIseXQpKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9bG4ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybih2b2lkIDAhPT10aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrP3RoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2s6dGhpcy5fbWFwLm9wdGlvbnMuY2xvc2VQb3B1cE9uQ2xpY2spJiYodC5wcmVjbGljaz10aGlzLl9jbG9zZSksdGhpcy5vcHRpb25zLmtlZXBJblZpZXcmJih0Lm1vdmVlbmQ9dGhpcy5fYWRqdXN0UGFuKSx0fSxfY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJnRoaXMuX21hcC5jbG9zZVBvcHVwKHRoaXMpfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PVwibGVhZmxldC1wb3B1cFwiLGk9dGhpcy5fY29udGFpbmVyPUcoXCJkaXZcIix0K1wiIFwiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKStcIiBsZWFmbGV0LXpvb20tYW5pbWF0ZWRcIiksZT10aGlzLl93cmFwcGVyPUcoXCJkaXZcIix0K1wiLWNvbnRlbnQtd3JhcHBlclwiLGkpO2lmKHRoaXMuX2NvbnRlbnROb2RlPUcoXCJkaXZcIix0K1wiLWNvbnRlbnRcIixlKSx3dChlKSx4dCh0aGlzLl9jb250ZW50Tm9kZSksbXQoZSxcImNvbnRleHRtZW51XCIseXQpLHRoaXMuX3RpcENvbnRhaW5lcj1HKFwiZGl2XCIsdCtcIi10aXAtY29udGFpbmVyXCIsaSksdGhpcy5fdGlwPUcoXCJkaXZcIix0K1wiLXRpcFwiLHRoaXMuX3RpcENvbnRhaW5lciksdGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKXt2YXIgbj10aGlzLl9jbG9zZUJ1dHRvbj1HKFwiYVwiLHQrXCItY2xvc2UtYnV0dG9uXCIsaSk7bi5ocmVmPVwiI2Nsb3NlXCIsbi5pbm5lckhUTUw9XCImIzIxNTtcIixtdChuLFwiY2xpY2tcIix0aGlzLl9vbkNsb3NlQnV0dG9uQ2xpY2ssdGhpcyl9fSxfdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGVudE5vZGUsaT10LnN0eWxlO2kud2lkdGg9XCJcIixpLndoaXRlU3BhY2U9XCJub3dyYXBcIjt2YXIgZT10Lm9mZnNldFdpZHRoO2U9TWF0aC5taW4oZSx0aGlzLm9wdGlvbnMubWF4V2lkdGgpLGU9TWF0aC5tYXgoZSx0aGlzLm9wdGlvbnMubWluV2lkdGgpLGkud2lkdGg9ZSsxK1wicHhcIixpLndoaXRlU3BhY2U9XCJcIixpLmhlaWdodD1cIlwiO3ZhciBuPXQub2Zmc2V0SGVpZ2h0LG89dGhpcy5vcHRpb25zLm1heEhlaWdodDtvJiZuPm8/KGkuaGVpZ2h0PW8rXCJweFwiLFEodCxcImxlYWZsZXQtcG9wdXAtc2Nyb2xsZWRcIikpOnR0KHQsXCJsZWFmbGV0LXBvcHVwLXNjcm9sbGVkXCIpLHRoaXMuX2NvbnRhaW5lcldpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aH0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpLGU9dGhpcy5fZ2V0QW5jaG9yKCk7YXQodGhpcy5fY29udGFpbmVyLGkuYWRkKGUpKX0sX2FkanVzdFBhbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5hdXRvUGFuKXt0aGlzLl9tYXAuX3BhbkFuaW0mJnRoaXMuX21hcC5fcGFuQW5pbS5zdG9wKCk7dmFyIHQ9dGhpcy5fbWFwLGk9cGFyc2VJbnQocSh0aGlzLl9jb250YWluZXIsXCJtYXJnaW5Cb3R0b21cIiksMTApfHwwLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCtpLG49dGhpcy5fY29udGFpbmVyV2lkdGgsbz1uZXcgeCh0aGlzLl9jb250YWluZXJMZWZ0LC1lLXRoaXMuX2NvbnRhaW5lckJvdHRvbSk7by5fYWRkKGh0KHRoaXMuX2NvbnRhaW5lcikpO3ZhciBzPXQubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQobykscj13KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZyksYT13KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZ1RvcExlZnR8fHIpLGg9dyh0aGlzLm9wdGlvbnMuYXV0b1BhblBhZGRpbmdCb3R0b21SaWdodHx8ciksdT10LmdldFNpemUoKSxsPTAsYz0wO3MueCtuK2gueD51LngmJihsPXMueCtuLXUueCtoLngpLHMueC1sLWEueDwwJiYobD1zLngtYS54KSxzLnkrZStoLnk+dS55JiYoYz1zLnkrZS11LnkraC55KSxzLnktYy1hLnk8MCYmKGM9cy55LWEueSksKGx8fGMpJiZ0LmZpcmUoXCJhdXRvcGFuc3RhcnRcIikucGFuQnkoW2wsY10pfX0sX29uQ2xvc2VCdXR0b25DbGljazpmdW5jdGlvbih0KXt0aGlzLl9jbG9zZSgpLEx0KHQpfSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHcodGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuX2dldFBvcHVwQW5jaG9yP3RoaXMuX3NvdXJjZS5fZ2V0UG9wdXBBbmNob3IoKTpbMCwwXSl9fSk7YmUubWVyZ2VPcHRpb25zKHtjbG9zZVBvcHVwT25DbGljazohMH0pLGJlLmluY2x1ZGUoe29wZW5Qb3B1cDpmdW5jdGlvbih0LGksZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBjbnx8KHQ9bmV3IGNuKGUpLnNldENvbnRlbnQodCkpLGkmJnQuc2V0TGF0TG5nKGkpLHRoaXMuaGFzTGF5ZXIodCk/dGhpczoodGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLm9wdGlvbnMuYXV0b0Nsb3NlJiZ0aGlzLmNsb3NlUG9wdXAoKSx0aGlzLl9wb3B1cD10LHRoaXMuYWRkTGF5ZXIodCkpfSxjbG9zZVBvcHVwOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0IT09dGhpcy5fcG9wdXB8fCh0PXRoaXMuX3BvcHVwLHRoaXMuX3BvcHVwPW51bGwpLHQmJnRoaXMucmVtb3ZlTGF5ZXIodCksdGhpc319KSxxZS5pbmNsdWRlKHtiaW5kUG9wdXA6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdCBpbnN0YW5jZW9mIGNuPyhsKHQsaSksdGhpcy5fcG9wdXA9dCx0Ll9zb3VyY2U9dGhpcyk6KHRoaXMuX3BvcHVwJiYhaXx8KHRoaXMuX3BvcHVwPW5ldyBjbihpLHRoaXMpKSx0aGlzLl9wb3B1cC5zZXRDb250ZW50KHQpKSx0aGlzLl9wb3B1cEhhbmRsZXJzQWRkZWR8fCh0aGlzLm9uKHtjbGljazp0aGlzLl9vcGVuUG9wdXAsa2V5cHJlc3M6dGhpcy5fb25LZXlQcmVzcyxyZW1vdmU6dGhpcy5jbG9zZVBvcHVwLG1vdmU6dGhpcy5fbW92ZVBvcHVwfSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkPSEwKSx0aGlzfSx1bmJpbmRQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmKHRoaXMub2ZmKHtjbGljazp0aGlzLl9vcGVuUG9wdXAsa2V5cHJlc3M6dGhpcy5fb25LZXlQcmVzcyxyZW1vdmU6dGhpcy5jbG9zZVBvcHVwLG1vdmU6dGhpcy5fbW92ZVBvcHVwfSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkPSExLHRoaXMuX3BvcHVwPW51bGwpLHRoaXN9LG9wZW5Qb3B1cDpmdW5jdGlvbih0LGkpe2lmKHQgaW5zdGFuY2VvZiBxZXx8KGk9dCx0PXRoaXMpLHQgaW5zdGFuY2VvZiBLZSlmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXt0PXRoaXMuX2xheWVyc1tlXTticmVha31yZXR1cm4gaXx8KGk9dC5nZXRDZW50ZXI/dC5nZXRDZW50ZXIoKTp0LmdldExhdExuZygpKSx0aGlzLl9wb3B1cCYmdGhpcy5fbWFwJiYodGhpcy5fcG9wdXAuX3NvdXJjZT10LHRoaXMuX3BvcHVwLnVwZGF0ZSgpLHRoaXMuX21hcC5vcGVuUG9wdXAodGhpcy5fcG9wdXAsaSkpLHRoaXN9LGNsb3NlUG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLl9jbG9zZSgpLHRoaXN9LHRvZ2dsZVBvcHVwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb3B1cCYmKHRoaXMuX3BvcHVwLl9tYXA/dGhpcy5jbG9zZVBvcHVwKCk6dGhpcy5vcGVuUG9wdXAodCkpLHRoaXN9LGlzUG9wdXBPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuaXNPcGVuKCl9LHNldFBvcHVwQ29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLnNldENvbnRlbnQodCksdGhpc30sZ2V0UG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXB9LF9vcGVuUG9wdXA6ZnVuY3Rpb24odCl7dmFyIGk9dC5sYXllcnx8dC50YXJnZXQ7dGhpcy5fcG9wdXAmJnRoaXMuX21hcCYmKEx0KHQpLGkgaW5zdGFuY2VvZiBRZT90aGlzLm9wZW5Qb3B1cCh0LmxheWVyfHx0LnRhcmdldCx0LmxhdGxuZyk6dGhpcy5fbWFwLmhhc0xheWVyKHRoaXMuX3BvcHVwKSYmdGhpcy5fcG9wdXAuX3NvdXJjZT09PWk/dGhpcy5jbG9zZVBvcHVwKCk6dGhpcy5vcGVuUG9wdXAoaSx0LmxhdGxuZykpfSxfbW92ZVBvcHVwOmZ1bmN0aW9uKHQpe3RoaXMuX3BvcHVwLnNldExhdExuZyh0LmxhdGxuZyl9LF9vbktleVByZXNzOmZ1bmN0aW9uKHQpezEzPT09dC5vcmlnaW5hbEV2ZW50LmtleUNvZGUmJnRoaXMuX29wZW5Qb3B1cCh0KX19KTt2YXIgX249bG4uZXh0ZW5kKHtvcHRpb25zOntwYW5lOlwidG9vbHRpcFBhbmVcIixvZmZzZXQ6WzAsMF0sZGlyZWN0aW9uOlwiYXV0b1wiLHBlcm1hbmVudDohMSxzdGlja3k6ITEsaW50ZXJhY3RpdmU6ITEsb3BhY2l0eTouOX0sb25BZGQ6ZnVuY3Rpb24odCl7bG4ucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyx0KSx0aGlzLnNldE9wYWNpdHkodGhpcy5vcHRpb25zLm9wYWNpdHkpLHQuZmlyZShcInRvb2x0aXBvcGVuXCIse3Rvb2x0aXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLmZpcmUoXCJ0b29sdGlwb3BlblwiLHt0b29sdGlwOnRoaXN9LCEwKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7bG4ucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyx0KSx0LmZpcmUoXCJ0b29sdGlwY2xvc2VcIix7dG9vbHRpcDp0aGlzfSksdGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuZmlyZShcInRvb2x0aXBjbG9zZVwiLHt0b29sdGlwOnRoaXN9LCEwKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9bG4ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiBxaSYmIXRoaXMub3B0aW9ucy5wZXJtYW5lbnQmJih0LnByZWNsaWNrPXRoaXMuX2Nsb3NlKSx0fSxfY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJnRoaXMuX21hcC5jbG9zZVRvb2x0aXAodGhpcyl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9XCJsZWFmbGV0LXRvb2x0aXAgXCIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fFwiXCIpK1wiIGxlYWZsZXQtem9vbS1cIisodGhpcy5fem9vbUFuaW1hdGVkP1wiYW5pbWF0ZWRcIjpcImhpZGVcIik7dGhpcy5fY29udGVudE5vZGU9dGhpcy5fY29udGFpbmVyPUcoXCJkaXZcIix0KX0sX3VwZGF0ZUxheW91dDpmdW5jdGlvbigpe30sX2FkanVzdFBhbjpmdW5jdGlvbigpe30sX3NldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcCxlPXRoaXMuX2NvbnRhaW5lcixuPWkubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldENlbnRlcigpKSxvPWkubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodCkscz10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLHI9ZS5vZmZzZXRXaWR0aCxhPWUub2Zmc2V0SGVpZ2h0LGg9dyh0aGlzLm9wdGlvbnMub2Zmc2V0KSx1PXRoaXMuX2dldEFuY2hvcigpO1widG9wXCI9PT1zP3Q9dC5hZGQodygtci8yK2gueCwtYStoLnkrdS55LCEwKSk6XCJib3R0b21cIj09PXM/dD10LnN1YnRyYWN0KHcoci8yLWgueCwtaC55LCEwKSk6XCJjZW50ZXJcIj09PXM/dD10LnN1YnRyYWN0KHcoci8yK2gueCxhLzItdS55K2gueSwhMCkpOlwicmlnaHRcIj09PXN8fFwiYXV0b1wiPT09cyYmby54PG4ueD8ocz1cInJpZ2h0XCIsdD10LmFkZCh3KGgueCt1LngsdS55LWEvMitoLnksITApKSk6KHM9XCJsZWZ0XCIsdD10LnN1YnRyYWN0KHcocit1LngtaC54LGEvMi11LnktaC55LCEwKSkpLHR0KGUsXCJsZWFmbGV0LXRvb2x0aXAtcmlnaHRcIiksdHQoZSxcImxlYWZsZXQtdG9vbHRpcC1sZWZ0XCIpLHR0KGUsXCJsZWFmbGV0LXRvb2x0aXAtdG9wXCIpLHR0KGUsXCJsZWFmbGV0LXRvb2x0aXAtYm90dG9tXCIpLFEoZSxcImxlYWZsZXQtdG9vbHRpcC1cIitzKSxhdChlLHQpfSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7dGhpcy5fc2V0UG9zaXRpb24odCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9jb250YWluZXImJm50KHRoaXMuX2NvbnRhaW5lcix0KX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpO3RoaXMuX3NldFBvc2l0aW9uKGkpfSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHcodGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuX2dldFRvb2x0aXBBbmNob3ImJiF0aGlzLm9wdGlvbnMuc3RpY2t5P3RoaXMuX3NvdXJjZS5fZ2V0VG9vbHRpcEFuY2hvcigpOlswLDBdKX19KTtiZS5pbmNsdWRlKHtvcGVuVG9vbHRpcDpmdW5jdGlvbih0LGksZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBfbnx8KHQ9bmV3IF9uKGUpLnNldENvbnRlbnQodCkpLGkmJnQuc2V0TGF0TG5nKGkpLHRoaXMuaGFzTGF5ZXIodCk/dGhpczp0aGlzLmFkZExheWVyKHQpfSxjbG9zZVRvb2x0aXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMucmVtb3ZlTGF5ZXIodCksdGhpc319KSxxZS5pbmNsdWRlKHtiaW5kVG9vbHRpcDpmdW5jdGlvbih0LGkpe3JldHVybiB0IGluc3RhbmNlb2YgX24/KGwodCxpKSx0aGlzLl90b29sdGlwPXQsdC5fc291cmNlPXRoaXMpOih0aGlzLl90b29sdGlwJiYhaXx8KHRoaXMuX3Rvb2x0aXA9bmV3IF9uKGksdGhpcykpLHRoaXMuX3Rvb2x0aXAuc2V0Q29udGVudCh0KSksdGhpcy5faW5pdFRvb2x0aXBJbnRlcmFjdGlvbnMoKSx0aGlzLl90b29sdGlwLm9wdGlvbnMucGVybWFuZW50JiZ0aGlzLl9tYXAmJnRoaXMuX21hcC5oYXNMYXllcih0aGlzKSYmdGhpcy5vcGVuVG9vbHRpcCgpLHRoaXN9LHVuYmluZFRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zKCEwKSx0aGlzLmNsb3NlVG9vbHRpcCgpLHRoaXMuX3Rvb2x0aXA9bnVsbCksdGhpc30sX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKHQpe2lmKHR8fCF0aGlzLl90b29sdGlwSGFuZGxlcnNBZGRlZCl7dmFyIGk9dD9cIm9mZlwiOlwib25cIixlPXtyZW1vdmU6dGhpcy5jbG9zZVRvb2x0aXAsbW92ZTp0aGlzLl9tb3ZlVG9vbHRpcH07dGhpcy5fdG9vbHRpcC5vcHRpb25zLnBlcm1hbmVudD9lLmFkZD10aGlzLl9vcGVuVG9vbHRpcDooZS5tb3VzZW92ZXI9dGhpcy5fb3BlblRvb2x0aXAsZS5tb3VzZW91dD10aGlzLmNsb3NlVG9vbHRpcCx0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5JiYoZS5tb3VzZW1vdmU9dGhpcy5fbW92ZVRvb2x0aXApLHFpJiYoZS5jbGljaz10aGlzLl9vcGVuVG9vbHRpcCkpLHRoaXNbaV0oZSksdGhpcy5fdG9vbHRpcEhhbmRsZXJzQWRkZWQ9IXR9fSxvcGVuVG9vbHRpcDpmdW5jdGlvbih0LGkpe2lmKHQgaW5zdGFuY2VvZiBxZXx8KGk9dCx0PXRoaXMpLHQgaW5zdGFuY2VvZiBLZSlmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXt0PXRoaXMuX2xheWVyc1tlXTticmVha31yZXR1cm4gaXx8KGk9dC5nZXRDZW50ZXI/dC5nZXRDZW50ZXIoKTp0LmdldExhdExuZygpKSx0aGlzLl90b29sdGlwJiZ0aGlzLl9tYXAmJih0aGlzLl90b29sdGlwLl9zb3VyY2U9dCx0aGlzLl90b29sdGlwLnVwZGF0ZSgpLHRoaXMuX21hcC5vcGVuVG9vbHRpcCh0aGlzLl90b29sdGlwLGkpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5fdG9vbHRpcC5fY29udGFpbmVyJiYoUSh0aGlzLl90b29sdGlwLl9jb250YWluZXIsXCJsZWFmbGV0LWNsaWNrYWJsZVwiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lcikpKSx0aGlzfSxjbG9zZVRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX3Rvb2x0aXAuX2Nsb3NlKCksdGhpcy5fdG9vbHRpcC5vcHRpb25zLmludGVyYWN0aXZlJiZ0aGlzLl90b29sdGlwLl9jb250YWluZXImJih0dCh0aGlzLl90b29sdGlwLl9jb250YWluZXIsXCJsZWFmbGV0LWNsaWNrYWJsZVwiKSx0aGlzLnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lcikpKSx0aGlzfSx0b2dnbGVUb29sdGlwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90b29sdGlwJiYodGhpcy5fdG9vbHRpcC5fbWFwP3RoaXMuY2xvc2VUb29sdGlwKCk6dGhpcy5vcGVuVG9vbHRpcCh0KSksdGhpc30saXNUb29sdGlwT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b29sdGlwLmlzT3BlbigpfSxzZXRUb29sdGlwQ29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmdGhpcy5fdG9vbHRpcC5zZXRDb250ZW50KHQpLHRoaXN9LGdldFRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcH0sX29wZW5Ub29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBpPXQubGF5ZXJ8fHQudGFyZ2V0O3RoaXMuX3Rvb2x0aXAmJnRoaXMuX21hcCYmdGhpcy5vcGVuVG9vbHRpcChpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5zdGlja3k/dC5sYXRsbmc6dm9pZCAwKX0sX21vdmVUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10LmxhdGxuZzt0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5JiZ0Lm9yaWdpbmFsRXZlbnQmJihpPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0Lm9yaWdpbmFsRXZlbnQpLGU9dGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGkpLG49dGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhlKSksdGhpcy5fdG9vbHRpcC5zZXRMYXRMbmcobil9fSk7dmFyIGRuPVllLmV4dGVuZCh7b3B0aW9uczp7aWNvblNpemU6WzEyLDEyXSxodG1sOiExLGJnUG9zOm51bGwsY2xhc3NOYW1lOlwibGVhZmxldC1kaXYtaWNvblwifSxjcmVhdGVJY29uOmZ1bmN0aW9uKHQpe3ZhciBpPXQmJlwiRElWXCI9PT10LnRhZ05hbWU/dDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGU9dGhpcy5vcHRpb25zO2lmKGkuaW5uZXJIVE1MPSExIT09ZS5odG1sP2UuaHRtbDpcIlwiLGUuYmdQb3Mpe3ZhciBuPXcoZS5iZ1Bvcyk7aS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249LW4ueCtcInB4IFwiKy1uLnkrXCJweFwifXJldHVybiB0aGlzLl9zZXRJY29uU3R5bGVzKGksXCJpY29uXCIpLGl9LGNyZWF0ZVNoYWRvdzpmdW5jdGlvbigpe3JldHVybiBudWxsfX0pO1llLkRlZmF1bHQ9WGU7dmFyIHBuPXFlLmV4dGVuZCh7b3B0aW9uczp7dGlsZVNpemU6MjU2LG9wYWNpdHk6MSx1cGRhdGVXaGVuSWRsZTpXaSx1cGRhdGVXaGVuWm9vbWluZzohMCx1cGRhdGVJbnRlcnZhbDoyMDAsekluZGV4OjEsYm91bmRzOm51bGwsbWluWm9vbTowLG1heFpvb206dm9pZCAwLG1heE5hdGl2ZVpvb206dm9pZCAwLG1pbk5hdGl2ZVpvb206dm9pZCAwLG5vV3JhcDohMSxwYW5lOlwidGlsZVBhbmVcIixjbGFzc05hbWU6XCJcIixrZWVwQnVmZmVyOjJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7bCh0aGlzLHQpfSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX2luaXRDb250YWluZXIoKSx0aGlzLl9sZXZlbHM9e30sdGhpcy5fdGlsZXM9e30sdGhpcy5fcmVzZXRWaWV3KCksdGhpcy5fdXBkYXRlKCl9LGJlZm9yZUFkZDpmdW5jdGlvbih0KXt0Ll9hZGRab29tTGltaXQodGhpcyl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuX3JlbW92ZUFsbFRpbGVzKCksSyh0aGlzLl9jb250YWluZXIpLHQuX3JlbW92ZVpvb21MaW1pdCh0aGlzKSx0aGlzLl9jb250YWluZXI9bnVsbCx0aGlzLl90aWxlWm9vbT12b2lkIDB9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJihYKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fc2V0QXV0b1pJbmRleChNYXRoLm1heCkpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKEoodGhpcy5fY29udGFpbmVyKSx0aGlzLl9zZXRBdXRvWkluZGV4KE1hdGgubWluKSksdGhpc30sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpc30sc2V0WkluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4PXQsdGhpcy5fdXBkYXRlWkluZGV4KCksdGhpc30saXNMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvYWRpbmd9LHJlZHJhdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJih0aGlzLl9yZW1vdmVBbGxUaWxlcygpLHRoaXMuX3VwZGF0ZSgpKSx0aGlzfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17dmlld3ByZXJlc2V0OnRoaXMuX2ludmFsaWRhdGVBbGwsdmlld3Jlc2V0OnRoaXMuX3Jlc2V0Vmlldyx6b29tOnRoaXMuX3Jlc2V0Vmlldyxtb3ZlZW5kOnRoaXMuX29uTW92ZUVuZH07cmV0dXJuIHRoaXMub3B0aW9ucy51cGRhdGVXaGVuSWRsZXx8KHRoaXMuX29uTW92ZXx8KHRoaXMuX29uTW92ZT1vKHRoaXMuX29uTW92ZUVuZCx0aGlzLm9wdGlvbnMudXBkYXRlSW50ZXJ2YWwsdGhpcykpLHQubW92ZT10aGlzLl9vbk1vdmUpLHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKX0sZ2V0VGlsZVNpemU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMudGlsZVNpemU7cmV0dXJuIHQgaW5zdGFuY2VvZiB4P3Q6bmV3IHgodCx0KX0sX3VwZGF0ZVpJbmRleDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lciYmdm9pZCAwIT09dGhpcy5vcHRpb25zLnpJbmRleCYmbnVsbCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJih0aGlzLl9jb250YWluZXIuc3R5bGUuekluZGV4PXRoaXMub3B0aW9ucy56SW5kZXgpfSxfc2V0QXV0b1pJbmRleDpmdW5jdGlvbih0KXtmb3IodmFyIGksZT10aGlzLmdldFBhbmUoKS5jaGlsZHJlbixuPS10KC0xLzAsMS8wKSxvPTAscz1lLmxlbmd0aDtvPHM7bysrKWk9ZVtvXS5zdHlsZS56SW5kZXgsZVtvXSE9PXRoaXMuX2NvbnRhaW5lciYmaSYmKG49dChuLCtpKSk7aXNGaW5pdGUobikmJih0aGlzLm9wdGlvbnMuekluZGV4PW4rdCgtMSwxKSx0aGlzLl91cGRhdGVaSW5kZXgoKSl9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwJiYhTGkpe250KHRoaXMuX2NvbnRhaW5lcix0aGlzLm9wdGlvbnMub3BhY2l0eSk7dmFyIHQ9K25ldyBEYXRlLGk9ITEsZT0hMTtmb3IodmFyIG4gaW4gdGhpcy5fdGlsZXMpe3ZhciBvPXRoaXMuX3RpbGVzW25dO2lmKG8uY3VycmVudCYmby5sb2FkZWQpe3ZhciBzPU1hdGgubWluKDEsKHQtby5sb2FkZWQpLzIwMCk7bnQoby5lbCxzKSxzPDE/aT0hMDooby5hY3RpdmU/ZT0hMDp0aGlzLl9vbk9wYXF1ZVRpbGUobyksby5hY3RpdmU9ITApfX1lJiYhdGhpcy5fbm9QcnVuZSYmdGhpcy5fcHJ1bmVUaWxlcygpLGkmJihnKHRoaXMuX2ZhZGVGcmFtZSksdGhpcy5fZmFkZUZyYW1lPWYodGhpcy5fdXBkYXRlT3BhY2l0eSx0aGlzKSl9fSxfb25PcGFxdWVUaWxlOnIsX2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXJ8fCh0aGlzLl9jb250YWluZXI9RyhcImRpdlwiLFwibGVhZmxldC1sYXllciBcIisodGhpcy5vcHRpb25zLmNsYXNzTmFtZXx8XCJcIikpLHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpKX0sX3VwZGF0ZUxldmVsczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpbGVab29tLGk9dGhpcy5vcHRpb25zLm1heFpvb207aWYodm9pZCAwIT09dCl7Zm9yKHZhciBlIGluIHRoaXMuX2xldmVscyl0aGlzLl9sZXZlbHNbZV0uZWwuY2hpbGRyZW4ubGVuZ3RofHxlPT09dD8odGhpcy5fbGV2ZWxzW2VdLmVsLnN0eWxlLnpJbmRleD1pLU1hdGguYWJzKHQtZSksdGhpcy5fb25VcGRhdGVMZXZlbChlKSk6KEsodGhpcy5fbGV2ZWxzW2VdLmVsKSx0aGlzLl9yZW1vdmVUaWxlc0F0Wm9vbShlKSx0aGlzLl9vblJlbW92ZUxldmVsKGUpLGRlbGV0ZSB0aGlzLl9sZXZlbHNbZV0pO3ZhciBuPXRoaXMuX2xldmVsc1t0XSxvPXRoaXMuX21hcDtyZXR1cm4gbnx8KChuPXRoaXMuX2xldmVsc1t0XT17fSkuZWw9RyhcImRpdlwiLFwibGVhZmxldC10aWxlLWNvbnRhaW5lciBsZWFmbGV0LXpvb20tYW5pbWF0ZWRcIix0aGlzLl9jb250YWluZXIpLG4uZWwuc3R5bGUuekluZGV4PWksbi5vcmlnaW49by5wcm9qZWN0KG8udW5wcm9qZWN0KG8uZ2V0UGl4ZWxPcmlnaW4oKSksdCkucm91bmQoKSxuLnpvb209dCx0aGlzLl9zZXRab29tVHJhbnNmb3JtKG4sby5nZXRDZW50ZXIoKSxvLmdldFpvb20oKSksbi5lbC5vZmZzZXRXaWR0aCx0aGlzLl9vbkNyZWF0ZUxldmVsKG4pKSx0aGlzLl9sZXZlbD1uLG59fSxfb25VcGRhdGVMZXZlbDpyLF9vblJlbW92ZUxldmVsOnIsX29uQ3JlYXRlTGV2ZWw6cixfcHJ1bmVUaWxlczpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQsaSxlPXRoaXMuX21hcC5nZXRab29tKCk7aWYoZT50aGlzLm9wdGlvbnMubWF4Wm9vbXx8ZTx0aGlzLm9wdGlvbnMubWluWm9vbSl0aGlzLl9yZW1vdmVBbGxUaWxlcygpO2Vsc2V7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpKGk9dGhpcy5fdGlsZXNbdF0pLnJldGFpbj1pLmN1cnJlbnQ7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpaWYoKGk9dGhpcy5fdGlsZXNbdF0pLmN1cnJlbnQmJiFpLmFjdGl2ZSl7dmFyIG49aS5jb29yZHM7dGhpcy5fcmV0YWluUGFyZW50KG4ueCxuLnksbi56LG4uei01KXx8dGhpcy5fcmV0YWluQ2hpbGRyZW4obi54LG4ueSxuLnosbi56KzIpfWZvcih0IGluIHRoaXMuX3RpbGVzKXRoaXMuX3RpbGVzW3RdLnJldGFpbnx8dGhpcy5fcmVtb3ZlVGlsZSh0KX19fSxfcmVtb3ZlVGlsZXNBdFpvb206ZnVuY3Rpb24odCl7Zm9yKHZhciBpIGluIHRoaXMuX3RpbGVzKXRoaXMuX3RpbGVzW2ldLmNvb3Jkcy56PT09dCYmdGhpcy5fcmVtb3ZlVGlsZShpKX0sX3JlbW92ZUFsbFRpbGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX3RpbGVzKXRoaXMuX3JlbW92ZVRpbGUodCl9LF9pbnZhbGlkYXRlQWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xldmVscylLKHRoaXMuX2xldmVsc1t0XS5lbCksdGhpcy5fb25SZW1vdmVMZXZlbCh0KSxkZWxldGUgdGhpcy5fbGV2ZWxzW3RdO3RoaXMuX3JlbW92ZUFsbFRpbGVzKCksdGhpcy5fdGlsZVpvb209dm9pZCAwfSxfcmV0YWluUGFyZW50OmZ1bmN0aW9uKHQsaSxlLG4pe3ZhciBvPU1hdGguZmxvb3IodC8yKSxzPU1hdGguZmxvb3IoaS8yKSxyPWUtMSxhPW5ldyB4KCtvLCtzKTthLno9K3I7dmFyIGg9dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KGEpLHU9dGhpcy5fdGlsZXNbaF07cmV0dXJuIHUmJnUuYWN0aXZlPyh1LnJldGFpbj0hMCwhMCk6KHUmJnUubG9hZGVkJiYodS5yZXRhaW49ITApLHI+biYmdGhpcy5fcmV0YWluUGFyZW50KG8scyxyLG4pKX0sX3JldGFpbkNoaWxkcmVuOmZ1bmN0aW9uKHQsaSxlLG4pe2Zvcih2YXIgbz0yKnQ7bzwyKnQrMjtvKyspZm9yKHZhciBzPTIqaTtzPDIqaSsyO3MrKyl7dmFyIHI9bmV3IHgobyxzKTtyLno9ZSsxO3ZhciBhPXRoaXMuX3RpbGVDb29yZHNUb0tleShyKSxoPXRoaXMuX3RpbGVzW2FdO2gmJmguYWN0aXZlP2gucmV0YWluPSEwOihoJiZoLmxvYWRlZCYmKGgucmV0YWluPSEwKSxlKzE8biYmdGhpcy5fcmV0YWluQ2hpbGRyZW4obyxzLGUrMSxuKSl9fSxfcmVzZXRWaWV3OmZ1bmN0aW9uKHQpe3ZhciBpPXQmJih0LnBpbmNofHx0LmZseVRvKTt0aGlzLl9zZXRWaWV3KHRoaXMuX21hcC5nZXRDZW50ZXIoKSx0aGlzLl9tYXAuZ2V0Wm9vbSgpLGksaSl9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt0aGlzLl9zZXRWaWV3KHQuY2VudGVyLHQuem9vbSwhMCx0Lm5vVXBkYXRlKX0sX2NsYW1wWm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnM7cmV0dXJuIHZvaWQgMCE9PWkubWluTmF0aXZlWm9vbSYmdDxpLm1pbk5hdGl2ZVpvb20/aS5taW5OYXRpdmVab29tOnZvaWQgMCE9PWkubWF4TmF0aXZlWm9vbSYmaS5tYXhOYXRpdmVab29tPHQ/aS5tYXhOYXRpdmVab29tOnR9LF9zZXRWaWV3OmZ1bmN0aW9uKHQsaSxlLG4pe3ZhciBvPXRoaXMuX2NsYW1wWm9vbShNYXRoLnJvdW5kKGkpKTsodm9pZCAwIT09dGhpcy5vcHRpb25zLm1heFpvb20mJm8+dGhpcy5vcHRpb25zLm1heFpvb218fHZvaWQgMCE9PXRoaXMub3B0aW9ucy5taW5ab29tJiZvPHRoaXMub3B0aW9ucy5taW5ab29tKSYmKG89dm9pZCAwKTt2YXIgcz10aGlzLm9wdGlvbnMudXBkYXRlV2hlblpvb21pbmcmJm8hPT10aGlzLl90aWxlWm9vbTtuJiYhc3x8KHRoaXMuX3RpbGVab29tPW8sdGhpcy5fYWJvcnRMb2FkaW5nJiZ0aGlzLl9hYm9ydExvYWRpbmcoKSx0aGlzLl91cGRhdGVMZXZlbHMoKSx0aGlzLl9yZXNldEdyaWQoKSx2b2lkIDAhPT1vJiZ0aGlzLl91cGRhdGUodCksZXx8dGhpcy5fcHJ1bmVUaWxlcygpLHRoaXMuX25vUHJ1bmU9ISFlKSx0aGlzLl9zZXRab29tVHJhbnNmb3Jtcyh0LGkpfSxfc2V0Wm9vbVRyYW5zZm9ybXM6ZnVuY3Rpb24odCxpKXtmb3IodmFyIGUgaW4gdGhpcy5fbGV2ZWxzKXRoaXMuX3NldFpvb21UcmFuc2Zvcm0odGhpcy5fbGV2ZWxzW2VdLHQsaSl9LF9zZXRab29tVHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj10aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGUsdC56b29tKSxvPXQub3JpZ2luLm11bHRpcGx5Qnkobikuc3VidHJhY3QodGhpcy5fbWFwLl9nZXROZXdQaXhlbE9yaWdpbihpLGUpKS5yb3VuZCgpO2ppP3J0KHQuZWwsbyxuKTphdCh0LmVsLG8pfSxfcmVzZXRHcmlkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGk9dC5vcHRpb25zLmNycyxlPXRoaXMuX3RpbGVTaXplPXRoaXMuZ2V0VGlsZVNpemUoKSxuPXRoaXMuX3RpbGVab29tLG89dGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHModGhpcy5fdGlsZVpvb20pO28mJih0aGlzLl9nbG9iYWxUaWxlUmFuZ2U9dGhpcy5fcHhCb3VuZHNUb1RpbGVSYW5nZShvKSksdGhpcy5fd3JhcFg9aS53cmFwTG5nJiYhdGhpcy5vcHRpb25zLm5vV3JhcCYmW01hdGguZmxvb3IodC5wcm9qZWN0KFswLGkud3JhcExuZ1swXV0sbikueC9lLngpLE1hdGguY2VpbCh0LnByb2plY3QoWzAsaS53cmFwTG5nWzFdXSxuKS54L2UueSldLHRoaXMuX3dyYXBZPWkud3JhcExhdCYmIXRoaXMub3B0aW9ucy5ub1dyYXAmJltNYXRoLmZsb29yKHQucHJvamVjdChbaS53cmFwTGF0WzBdLDBdLG4pLnkvZS54KSxNYXRoLmNlaWwodC5wcm9qZWN0KFtpLndyYXBMYXRbMV0sMF0sbikueS9lLnkpXX0sX29uTW92ZUVuZDpmdW5jdGlvbigpe3RoaXMuX21hcCYmIXRoaXMuX21hcC5fYW5pbWF0aW5nWm9vbSYmdGhpcy5fdXBkYXRlKCl9LF9nZXRUaWxlZFBpeGVsQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcCxlPWkuX2FuaW1hdGluZ1pvb20/TWF0aC5tYXgoaS5fYW5pbWF0ZVRvWm9vbSxpLmdldFpvb20oKSk6aS5nZXRab29tKCksbj1pLmdldFpvb21TY2FsZShlLHRoaXMuX3RpbGVab29tKSxvPWkucHJvamVjdCh0LHRoaXMuX3RpbGVab29tKS5mbG9vcigpLHM9aS5nZXRTaXplKCkuZGl2aWRlQnkoMipuKTtyZXR1cm4gbmV3IFAoby5zdWJ0cmFjdChzKSxvLmFkZChzKSl9LF91cGRhdGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwO2lmKGkpe3ZhciBlPXRoaXMuX2NsYW1wWm9vbShpLmdldFpvb20oKSk7aWYodm9pZCAwPT09dCYmKHQ9aS5nZXRDZW50ZXIoKSksdm9pZCAwIT09dGhpcy5fdGlsZVpvb20pe3ZhciBuPXRoaXMuX2dldFRpbGVkUGl4ZWxCb3VuZHModCksbz10aGlzLl9weEJvdW5kc1RvVGlsZVJhbmdlKG4pLHM9by5nZXRDZW50ZXIoKSxyPVtdLGE9dGhpcy5vcHRpb25zLmtlZXBCdWZmZXIsaD1uZXcgUChvLmdldEJvdHRvbUxlZnQoKS5zdWJ0cmFjdChbYSwtYV0pLG8uZ2V0VG9wUmlnaHQoKS5hZGQoW2EsLWFdKSk7aWYoIShpc0Zpbml0ZShvLm1pbi54KSYmaXNGaW5pdGUoby5taW4ueSkmJmlzRmluaXRlKG8ubWF4LngpJiZpc0Zpbml0ZShvLm1heC55KSkpdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIGxvYWQgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHRpbGVzXCIpO2Zvcih2YXIgdSBpbiB0aGlzLl90aWxlcyl7dmFyIGw9dGhpcy5fdGlsZXNbdV0uY29vcmRzO2wuej09PXRoaXMuX3RpbGVab29tJiZoLmNvbnRhaW5zKG5ldyB4KGwueCxsLnkpKXx8KHRoaXMuX3RpbGVzW3VdLmN1cnJlbnQ9ITEpfWlmKE1hdGguYWJzKGUtdGhpcy5fdGlsZVpvb20pPjEpdGhpcy5fc2V0Vmlldyh0LGUpO2Vsc2V7Zm9yKHZhciBjPW8ubWluLnk7Yzw9by5tYXgueTtjKyspZm9yKHZhciBfPW8ubWluLng7Xzw9by5tYXgueDtfKyspe3ZhciBkPW5ldyB4KF8sYyk7aWYoZC56PXRoaXMuX3RpbGVab29tLHRoaXMuX2lzVmFsaWRUaWxlKGQpKXt2YXIgcD10aGlzLl90aWxlc1t0aGlzLl90aWxlQ29vcmRzVG9LZXkoZCldO3A/cC5jdXJyZW50PSEwOnIucHVzaChkKX19aWYoci5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQuZGlzdGFuY2VUbyhzKS1pLmRpc3RhbmNlVG8ocyl9KSwwIT09ci5sZW5ndGgpe3RoaXMuX2xvYWRpbmd8fCh0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZmlyZShcImxvYWRpbmdcIikpO3ZhciBtPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IoXz0wO188ci5sZW5ndGg7XysrKXRoaXMuX2FkZFRpbGUocltfXSxtKTt0aGlzLl9sZXZlbC5lbC5hcHBlbmRDaGlsZChtKX19fX19LF9pc1ZhbGlkVGlsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAub3B0aW9ucy5jcnM7aWYoIWkuaW5maW5pdGUpe3ZhciBlPXRoaXMuX2dsb2JhbFRpbGVSYW5nZTtpZighaS53cmFwTG5nJiYodC54PGUubWluLnh8fHQueD5lLm1heC54KXx8IWkud3JhcExhdCYmKHQueTxlLm1pbi55fHx0Lnk+ZS5tYXgueSkpcmV0dXJuITF9aWYoIXRoaXMub3B0aW9ucy5ib3VuZHMpcmV0dXJuITA7dmFyIG49dGhpcy5fdGlsZUNvb3Jkc1RvQm91bmRzKHQpO3JldHVybiB6KHRoaXMub3B0aW9ucy5ib3VuZHMpLm92ZXJsYXBzKG4pfSxfa2V5VG9Cb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RpbGVDb29yZHNUb0JvdW5kcyh0aGlzLl9rZXlUb1RpbGVDb29yZHModCkpfSxfdGlsZUNvb3Jkc1RvTndTZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAsZT10aGlzLmdldFRpbGVTaXplKCksbj10LnNjYWxlQnkoZSksbz1uLmFkZChlKTtyZXR1cm5baS51bnByb2plY3Qobix0LnopLGkudW5wcm9qZWN0KG8sdC56KV19LF90aWxlQ29vcmRzVG9Cb3VuZHM6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fdGlsZUNvb3Jkc1RvTndTZSh0KSxlPW5ldyBUKGlbMF0saVsxXSk7cmV0dXJuIHRoaXMub3B0aW9ucy5ub1dyYXB8fChlPXRoaXMuX21hcC53cmFwTGF0TG5nQm91bmRzKGUpKSxlfSxfdGlsZUNvb3Jkc1RvS2V5OmZ1bmN0aW9uKHQpe3JldHVybiB0LngrXCI6XCIrdC55K1wiOlwiK3Quen0sX2tleVRvVGlsZUNvb3JkczpmdW5jdGlvbih0KXt2YXIgaT10LnNwbGl0KFwiOlwiKSxlPW5ldyB4KCtpWzBdLCtpWzFdKTtyZXR1cm4gZS56PStpWzJdLGV9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX3RpbGVzW3RdO2kmJihLKGkuZWwpLGRlbGV0ZSB0aGlzLl90aWxlc1t0XSx0aGlzLmZpcmUoXCJ0aWxldW5sb2FkXCIse3RpbGU6aS5lbCxjb29yZHM6dGhpcy5fa2V5VG9UaWxlQ29vcmRzKHQpfSkpfSxfaW5pdFRpbGU6ZnVuY3Rpb24odCl7USh0LFwibGVhZmxldC10aWxlXCIpO3ZhciBpPXRoaXMuZ2V0VGlsZVNpemUoKTt0LnN0eWxlLndpZHRoPWkueCtcInB4XCIsdC5zdHlsZS5oZWlnaHQ9aS55K1wicHhcIix0Lm9uc2VsZWN0c3RhcnQ9cix0Lm9ubW91c2Vtb3ZlPXIsTGkmJnRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJm50KHQsdGhpcy5vcHRpb25zLm9wYWNpdHkpLHppJiYhTWkmJih0LnN0eWxlLldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eT1cImhpZGRlblwiKX0sX2FkZFRpbGU6ZnVuY3Rpb24odCxpKXt2YXIgbj10aGlzLl9nZXRUaWxlUG9zKHQpLG89dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KHQpLHM9dGhpcy5jcmVhdGVUaWxlKHRoaXMuX3dyYXBDb29yZHModCksZSh0aGlzLl90aWxlUmVhZHksdGhpcyx0KSk7dGhpcy5faW5pdFRpbGUocyksdGhpcy5jcmVhdGVUaWxlLmxlbmd0aDwyJiZmKGUodGhpcy5fdGlsZVJlYWR5LHRoaXMsdCxudWxsLHMpKSxhdChzLG4pLHRoaXMuX3RpbGVzW29dPXtlbDpzLGNvb3Jkczp0LGN1cnJlbnQ6ITB9LGkuYXBwZW5kQ2hpbGQocyksdGhpcy5maXJlKFwidGlsZWxvYWRzdGFydFwiLHt0aWxlOnMsY29vcmRzOnR9KX0sX3RpbGVSZWFkeTpmdW5jdGlvbih0LGksbil7aSYmdGhpcy5maXJlKFwidGlsZWVycm9yXCIse2Vycm9yOmksdGlsZTpuLGNvb3Jkczp0fSk7dmFyIG89dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KHQpOyhuPXRoaXMuX3RpbGVzW29dKSYmKG4ubG9hZGVkPStuZXcgRGF0ZSx0aGlzLl9tYXAuX2ZhZGVBbmltYXRlZD8obnQobi5lbCwwKSxnKHRoaXMuX2ZhZGVGcmFtZSksdGhpcy5fZmFkZUZyYW1lPWYodGhpcy5fdXBkYXRlT3BhY2l0eSx0aGlzKSk6KG4uYWN0aXZlPSEwLHRoaXMuX3BydW5lVGlsZXMoKSksaXx8KFEobi5lbCxcImxlYWZsZXQtdGlsZS1sb2FkZWRcIiksdGhpcy5maXJlKFwidGlsZWxvYWRcIix7dGlsZTpuLmVsLGNvb3Jkczp0fSkpLHRoaXMuX25vVGlsZXNUb0xvYWQoKSYmKHRoaXMuX2xvYWRpbmc9ITEsdGhpcy5maXJlKFwibG9hZFwiKSxMaXx8IXRoaXMuX21hcC5fZmFkZUFuaW1hdGVkP2YodGhpcy5fcHJ1bmVUaWxlcyx0aGlzKTpzZXRUaW1lb3V0KGUodGhpcy5fcHJ1bmVUaWxlcyx0aGlzKSwyNTApKSl9LF9nZXRUaWxlUG9zOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNjYWxlQnkodGhpcy5nZXRUaWxlU2l6ZSgpKS5zdWJ0cmFjdCh0aGlzLl9sZXZlbC5vcmlnaW4pfSxfd3JhcENvb3JkczpmdW5jdGlvbih0KXt2YXIgaT1uZXcgeCh0aGlzLl93cmFwWD9zKHQueCx0aGlzLl93cmFwWCk6dC54LHRoaXMuX3dyYXBZP3ModC55LHRoaXMuX3dyYXBZKTp0LnkpO3JldHVybiBpLno9dC56LGl9LF9weEJvdW5kc1RvVGlsZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0VGlsZVNpemUoKTtyZXR1cm4gbmV3IFAodC5taW4udW5zY2FsZUJ5KGkpLmZsb29yKCksdC5tYXgudW5zY2FsZUJ5KGkpLmNlaWwoKS5zdWJ0cmFjdChbMSwxXSkpfSxfbm9UaWxlc1RvTG9hZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl90aWxlcylpZighdGhpcy5fdGlsZXNbdF0ubG9hZGVkKXJldHVybiExO3JldHVybiEwfX0pLG1uPXBuLmV4dGVuZCh7b3B0aW9uczp7bWluWm9vbTowLG1heFpvb206MTgsc3ViZG9tYWluczpcImFiY1wiLGVycm9yVGlsZVVybDpcIlwiLHpvb21PZmZzZXQ6MCx0bXM6ITEsem9vbVJldmVyc2U6ITEsZGV0ZWN0UmV0aW5hOiExLGNyb3NzT3JpZ2luOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7dGhpcy5fdXJsPXQsKGk9bCh0aGlzLGkpKS5kZXRlY3RSZXRpbmEmJllpJiZpLm1heFpvb20+MCYmKGkudGlsZVNpemU9TWF0aC5mbG9vcihpLnRpbGVTaXplLzIpLGkuem9vbVJldmVyc2U/KGkuem9vbU9mZnNldC0tLGkubWluWm9vbSsrKTooaS56b29tT2Zmc2V0KyssaS5tYXhab29tLS0pLGkubWluWm9vbT1NYXRoLm1heCgwLGkubWluWm9vbSkpLFwic3RyaW5nXCI9PXR5cGVvZiBpLnN1YmRvbWFpbnMmJihpLnN1YmRvbWFpbnM9aS5zdWJkb21haW5zLnNwbGl0KFwiXCIpKSx6aXx8dGhpcy5vbihcInRpbGV1bmxvYWRcIix0aGlzLl9vblRpbGVSZW1vdmUpfSxzZXRVcmw6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5fdXJsPT09dCYmdm9pZCAwPT09aSYmKGk9ITApLHRoaXMuX3VybD10LGl8fHRoaXMucmVkcmF3KCksdGhpc30sY3JlYXRlVGlsZTpmdW5jdGlvbih0LGkpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7cmV0dXJuIG10KG4sXCJsb2FkXCIsZSh0aGlzLl90aWxlT25Mb2FkLHRoaXMsaSxuKSksbXQobixcImVycm9yXCIsZSh0aGlzLl90aWxlT25FcnJvcix0aGlzLGksbikpLCh0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW58fFwiXCI9PT10aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pJiYobi5jcm9zc09yaWdpbj0hMD09PXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbj9cIlwiOnRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiksbi5hbHQ9XCJcIixuLnNldEF0dHJpYnV0ZShcInJvbGVcIixcInByZXNlbnRhdGlvblwiKSxuLnNyYz10aGlzLmdldFRpbGVVcmwodCksbn0sZ2V0VGlsZVVybDpmdW5jdGlvbih0KXt2YXIgZT17cjpZaT9cIkAyeFwiOlwiXCIsczp0aGlzLl9nZXRTdWJkb21haW4odCkseDp0LngseTp0Lnksejp0aGlzLl9nZXRab29tRm9yVXJsKCl9O2lmKHRoaXMuX21hcCYmIXRoaXMuX21hcC5vcHRpb25zLmNycy5pbmZpbml0ZSl7dmFyIG49dGhpcy5fZ2xvYmFsVGlsZVJhbmdlLm1heC55LXQueTt0aGlzLm9wdGlvbnMudG1zJiYoZS55PW4pLGVbXCIteVwiXT1ufXJldHVybiBfKHRoaXMuX3VybCxpKGUsdGhpcy5vcHRpb25zKSl9LF90aWxlT25Mb2FkOmZ1bmN0aW9uKHQsaSl7TGk/c2V0VGltZW91dChlKHQsdGhpcyxudWxsLGkpLDApOnQobnVsbCxpKX0sX3RpbGVPbkVycm9yOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj10aGlzLm9wdGlvbnMuZXJyb3JUaWxlVXJsO24mJmkuZ2V0QXR0cmlidXRlKFwic3JjXCIpIT09biYmKGkuc3JjPW4pLHQoZSxpKX0sX29uVGlsZVJlbW92ZTpmdW5jdGlvbih0KXt0LnRpbGUub25sb2FkPW51bGx9LF9nZXRab29tRm9yVXJsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlsZVpvb20saT10aGlzLm9wdGlvbnMubWF4Wm9vbSxlPXRoaXMub3B0aW9ucy56b29tUmV2ZXJzZSxuPXRoaXMub3B0aW9ucy56b29tT2Zmc2V0O3JldHVybiBlJiYodD1pLXQpLHQrbn0sX2dldFN1YmRvbWFpbjpmdW5jdGlvbih0KXt2YXIgaT1NYXRoLmFicyh0LngrdC55KSV0aGlzLm9wdGlvbnMuc3ViZG9tYWlucy5sZW5ndGg7cmV0dXJuIHRoaXMub3B0aW9ucy5zdWJkb21haW5zW2ldfSxfYWJvcnRMb2FkaW5nOmZ1bmN0aW9uKCl7dmFyIHQsaTtmb3IodCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5jb29yZHMueiE9PXRoaXMuX3RpbGVab29tJiYoKGk9dGhpcy5fdGlsZXNbdF0uZWwpLm9ubG9hZD1yLGkub25lcnJvcj1yLGkuY29tcGxldGV8fChpLnNyYz1zaSxLKGkpLGRlbGV0ZSB0aGlzLl90aWxlc1t0XSkpfSxfcmVtb3ZlVGlsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl90aWxlc1t0XTtpZihpKXJldHVybiBTaXx8aS5lbC5zZXRBdHRyaWJ1dGUoXCJzcmNcIixzaSkscG4ucHJvdG90eXBlLl9yZW1vdmVUaWxlLmNhbGwodGhpcyx0KX0sX3RpbGVSZWFkeTpmdW5jdGlvbih0LGksZSl7aWYodGhpcy5fbWFwJiYoIWV8fGUuZ2V0QXR0cmlidXRlKFwic3JjXCIpIT09c2kpKXJldHVybiBwbi5wcm90b3R5cGUuX3RpbGVSZWFkeS5jYWxsKHRoaXMsdCxpLGUpfX0pLGZuPW1uLmV4dGVuZCh7ZGVmYXVsdFdtc1BhcmFtczp7c2VydmljZTpcIldNU1wiLHJlcXVlc3Q6XCJHZXRNYXBcIixsYXllcnM6XCJcIixzdHlsZXM6XCJcIixmb3JtYXQ6XCJpbWFnZS9qcGVnXCIsdHJhbnNwYXJlbnQ6ITEsdmVyc2lvbjpcIjEuMS4xXCJ9LG9wdGlvbnM6e2NyczpudWxsLHVwcGVyY2FzZTohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3VybD10O3ZhciBuPWkoe30sdGhpcy5kZWZhdWx0V21zUGFyYW1zKTtmb3IodmFyIG8gaW4gZSlvIGluIHRoaXMub3B0aW9uc3x8KG5bb109ZVtvXSk7dmFyIHM9KGU9bCh0aGlzLGUpKS5kZXRlY3RSZXRpbmEmJllpPzI6MSxyPXRoaXMuZ2V0VGlsZVNpemUoKTtuLndpZHRoPXIueCpzLG4uaGVpZ2h0PXIueSpzLHRoaXMud21zUGFyYW1zPW59LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX2Nycz10aGlzLm9wdGlvbnMuY3JzfHx0Lm9wdGlvbnMuY3JzLHRoaXMuX3dtc1ZlcnNpb249cGFyc2VGbG9hdCh0aGlzLndtc1BhcmFtcy52ZXJzaW9uKTt2YXIgaT10aGlzLl93bXNWZXJzaW9uPj0xLjM/XCJjcnNcIjpcInNyc1wiO3RoaXMud21zUGFyYW1zW2ldPXRoaXMuX2Nycy5jb2RlLG1uLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCl9LGdldFRpbGVVcmw6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fdGlsZUNvb3Jkc1RvTndTZSh0KSxlPXRoaXMuX2NycyxuPWIoZS5wcm9qZWN0KGlbMF0pLGUucHJvamVjdChpWzFdKSksbz1uLm1pbixzPW4ubWF4LHI9KHRoaXMuX3dtc1ZlcnNpb24+PTEuMyYmdGhpcy5fY3JzPT09VWU/W28ueSxvLngscy55LHMueF06W28ueCxvLnkscy54LHMueV0pLmpvaW4oXCIsXCIpLGE9bW4ucHJvdG90eXBlLmdldFRpbGVVcmwuY2FsbCh0aGlzLHQpO3JldHVybiBhK2ModGhpcy53bXNQYXJhbXMsYSx0aGlzLm9wdGlvbnMudXBwZXJjYXNlKSsodGhpcy5vcHRpb25zLnVwcGVyY2FzZT9cIiZCQk9YPVwiOlwiJmJib3g9XCIpK3J9LHNldFBhcmFtczpmdW5jdGlvbih0LGUpe3JldHVybiBpKHRoaXMud21zUGFyYW1zLHQpLGV8fHRoaXMucmVkcmF3KCksdGhpc319KTttbi5XTVM9Zm4sSnQud21zPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyBmbih0LGkpfTt2YXIgZ249cWUuZXh0ZW5kKHtvcHRpb25zOntwYWRkaW5nOi4xLHRvbGVyYW5jZTowfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2wodGhpcyx0KSxuKHRoaXMpLHRoaXMuX2xheWVycz10aGlzLl9sYXllcnN8fHt9fSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2luaXRDb250YWluZXIoKSx0aGlzLl96b29tQW5pbWF0ZWQmJlEodGhpcy5fY29udGFpbmVyLFwibGVhZmxldC16b29tLWFuaW1hdGVkXCIpKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3VwZGF0ZSgpLHRoaXMub24oXCJ1cGRhdGVcIix0aGlzLl91cGRhdGVQYXRocyx0aGlzKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLm9mZihcInVwZGF0ZVwiLHRoaXMuX3VwZGF0ZVBhdGhzLHRoaXMpLHRoaXMuX2Rlc3Ryb3lDb250YWluZXIoKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdyZXNldDp0aGlzLl9yZXNldCx6b29tOnRoaXMuX29uWm9vbSxtb3ZlZW5kOnRoaXMuX3VwZGF0ZSx6b29tZW5kOnRoaXMuX29uWm9vbUVuZH07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fb25BbmltWm9vbSksdH0sX29uQW5pbVpvb206ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlVHJhbnNmb3JtKHQuY2VudGVyLHQuem9vbSl9LF9vblpvb206ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVUcmFuc2Zvcm0odGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX21hcC5nZXRab29tKCkpfSxfdXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5fbWFwLmdldFpvb21TY2FsZShpLHRoaXMuX3pvb20pLG49aHQodGhpcy5fY29udGFpbmVyKSxvPXRoaXMuX21hcC5nZXRTaXplKCkubXVsdGlwbHlCeSguNSt0aGlzLm9wdGlvbnMucGFkZGluZykscz10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9jZW50ZXIsaSkscj10aGlzLl9tYXAucHJvamVjdCh0LGkpLnN1YnRyYWN0KHMpLGE9by5tdWx0aXBseUJ5KC1lKS5hZGQobikuYWRkKG8pLnN1YnRyYWN0KHIpO2ppP3J0KHRoaXMuX2NvbnRhaW5lcixhLGUpOmF0KHRoaXMuX2NvbnRhaW5lcixhKX0sX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCksdGhpcy5fdXBkYXRlVHJhbnNmb3JtKHRoaXMuX2NlbnRlcix0aGlzLl96b29tKTtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5fcmVzZXQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl9wcm9qZWN0KCl9LF91cGRhdGVQYXRoczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl91cGRhdGUoKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5wYWRkaW5nLGk9dGhpcy5fbWFwLmdldFNpemUoKSxlPXRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChpLm11bHRpcGx5QnkoLXQpKS5yb3VuZCgpO3RoaXMuX2JvdW5kcz1uZXcgUChlLGUuYWRkKGkubXVsdGlwbHlCeSgxKzIqdCkpLnJvdW5kKCkpLHRoaXMuX2NlbnRlcj10aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fem9vbT10aGlzLl9tYXAuZ2V0Wm9vbSgpfX0pLHZuPWduLmV4dGVuZCh7Z2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9Z24ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiB0LnZpZXdwcmVyZXNldD10aGlzLl9vblZpZXdQcmVSZXNldCx0fSxfb25WaWV3UHJlUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzPSEwfSxvbkFkZDpmdW5jdGlvbigpe2duLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMpLHRoaXMuX2RyYXcoKX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTttdCh0LFwibW91c2Vtb3ZlXCIsbyh0aGlzLl9vbk1vdXNlTW92ZSwzMix0aGlzKSx0aGlzKSxtdCh0LFwiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgY29udGV4dG1lbnVcIix0aGlzLl9vbkNsaWNrLHRoaXMpLG10KHQsXCJtb3VzZW91dFwiLHRoaXMuX2hhbmRsZU1vdXNlT3V0LHRoaXMpLHRoaXMuX2N0eD10LmdldENvbnRleHQoXCIyZFwiKX0sX2Rlc3Ryb3lDb250YWluZXI6ZnVuY3Rpb24oKXtnKHRoaXMuX3JlZHJhd1JlcXVlc3QpLGRlbGV0ZSB0aGlzLl9jdHgsSyh0aGlzLl9jb250YWluZXIpLGZ0KHRoaXMuX2NvbnRhaW5lciksZGVsZXRlIHRoaXMuX2NvbnRhaW5lcn0sX3VwZGF0ZVBhdGhzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHMpe3RoaXMuX3JlZHJhd0JvdW5kcz1udWxsO2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl91cGRhdGUoKTt0aGlzLl9yZWRyYXcoKX19LF91cGRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5fbWFwLl9hbmltYXRpbmdab29tfHwhdGhpcy5fYm91bmRzKXtnbi5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpO3ZhciB0PXRoaXMuX2JvdW5kcyxpPXRoaXMuX2NvbnRhaW5lcixlPXQuZ2V0U2l6ZSgpLG49WWk/MjoxO2F0KGksdC5taW4pLGkud2lkdGg9biplLngsaS5oZWlnaHQ9biplLnksaS5zdHlsZS53aWR0aD1lLngrXCJweFwiLGkuc3R5bGUuaGVpZ2h0PWUueStcInB4XCIsWWkmJnRoaXMuX2N0eC5zY2FsZSgyLDIpLHRoaXMuX2N0eC50cmFuc2xhdGUoLXQubWluLngsLXQubWluLnkpLHRoaXMuZmlyZShcInVwZGF0ZVwiKX19LF9yZXNldDpmdW5jdGlvbigpe2duLnByb3RvdHlwZS5fcmVzZXQuY2FsbCh0aGlzKSx0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzJiYodGhpcy5fcG9zdHBvbmVVcGRhdGVQYXRocz0hMSx0aGlzLl91cGRhdGVQYXRocygpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZURhc2hBcnJheSh0KSx0aGlzLl9sYXllcnNbbih0KV09dDt2YXIgaT10Ll9vcmRlcj17bGF5ZXI6dCxwcmV2OnRoaXMuX2RyYXdMYXN0LG5leHQ6bnVsbH07dGhpcy5fZHJhd0xhc3QmJih0aGlzLl9kcmF3TGFzdC5uZXh0PWkpLHRoaXMuX2RyYXdMYXN0PWksdGhpcy5fZHJhd0ZpcnN0PXRoaXMuX2RyYXdGaXJzdHx8dGhpcy5fZHJhd0xhc3R9LF9hZGRQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF9yZW1vdmVQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX29yZGVyLGU9aS5uZXh0LG89aS5wcmV2O2U/ZS5wcmV2PW86dGhpcy5fZHJhd0xhc3Q9byxvP28ubmV4dD1lOnRoaXMuX2RyYXdGaXJzdD1lLGRlbGV0ZSB0Ll9vcmRlcixkZWxldGUgdGhpcy5fbGF5ZXJzW24odCldLHRoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX2V4dGVuZFJlZHJhd0JvdW5kcyh0KSx0Ll9wcm9qZWN0KCksdC5fdXBkYXRlKCksdGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZURhc2hBcnJheSh0KSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfdXBkYXRlRGFzaEFycmF5OmZ1bmN0aW9uKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0Lm9wdGlvbnMuZGFzaEFycmF5KXt2YXIgaSxlLG49dC5vcHRpb25zLmRhc2hBcnJheS5zcGxpdCgvWywgXSsvKSxvPVtdO2ZvcihlPTA7ZTxuLmxlbmd0aDtlKyspe2lmKGk9TnVtYmVyKG5bZV0pLGlzTmFOKGkpKXJldHVybjtvLnB1c2goaSl9dC5vcHRpb25zLl9kYXNoQXJyYXk9b31lbHNlIHQub3B0aW9ucy5fZGFzaEFycmF5PXQub3B0aW9ucy5kYXNoQXJyYXl9LF9yZXF1ZXN0UmVkcmF3OmZ1bmN0aW9uKHQpe3RoaXMuX21hcCYmKHRoaXMuX2V4dGVuZFJlZHJhd0JvdW5kcyh0KSx0aGlzLl9yZWRyYXdSZXF1ZXN0PXRoaXMuX3JlZHJhd1JlcXVlc3R8fGYodGhpcy5fcmVkcmF3LHRoaXMpKX0sX2V4dGVuZFJlZHJhd0JvdW5kczpmdW5jdGlvbih0KXtpZih0Ll9weEJvdW5kcyl7dmFyIGk9KHQub3B0aW9ucy53ZWlnaHR8fDApKzE7dGhpcy5fcmVkcmF3Qm91bmRzPXRoaXMuX3JlZHJhd0JvdW5kc3x8bmV3IFAsdGhpcy5fcmVkcmF3Qm91bmRzLmV4dGVuZCh0Ll9weEJvdW5kcy5taW4uc3VidHJhY3QoW2ksaV0pKSx0aGlzLl9yZWRyYXdCb3VuZHMuZXh0ZW5kKHQuX3B4Qm91bmRzLm1heC5hZGQoW2ksaV0pKX19LF9yZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9yZWRyYXdSZXF1ZXN0PW51bGwsdGhpcy5fcmVkcmF3Qm91bmRzJiYodGhpcy5fcmVkcmF3Qm91bmRzLm1pbi5fZmxvb3IoKSx0aGlzLl9yZWRyYXdCb3VuZHMubWF4Ll9jZWlsKCkpLHRoaXMuX2NsZWFyKCksdGhpcy5fZHJhdygpLHRoaXMuX3JlZHJhd0JvdW5kcz1udWxsfSxfY2xlYXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWRyYXdCb3VuZHM7aWYodCl7dmFyIGk9dC5nZXRTaXplKCk7dGhpcy5fY3R4LmNsZWFyUmVjdCh0Lm1pbi54LHQubWluLnksaS54LGkueSl9ZWxzZSB0aGlzLl9jdHguY2xlYXJSZWN0KDAsMCx0aGlzLl9jb250YWluZXIud2lkdGgsdGhpcy5fY29udGFpbmVyLmhlaWdodCl9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLl9yZWRyYXdCb3VuZHM7aWYodGhpcy5fY3R4LnNhdmUoKSxpKXt2YXIgZT1pLmdldFNpemUoKTt0aGlzLl9jdHguYmVnaW5QYXRoKCksdGhpcy5fY3R4LnJlY3QoaS5taW4ueCxpLm1pbi55LGUueCxlLnkpLHRoaXMuX2N0eC5jbGlwKCl9dGhpcy5fZHJhd2luZz0hMDtmb3IodmFyIG49dGhpcy5fZHJhd0ZpcnN0O247bj1uLm5leHQpdD1uLmxheWVyLCghaXx8dC5fcHhCb3VuZHMmJnQuX3B4Qm91bmRzLmludGVyc2VjdHMoaSkpJiZ0Ll91cGRhdGVQYXRoKCk7dGhpcy5fZHJhd2luZz0hMSx0aGlzLl9jdHgucmVzdG9yZSgpfSxfdXBkYXRlUG9seTpmdW5jdGlvbih0LGkpe2lmKHRoaXMuX2RyYXdpbmcpe3ZhciBlLG4sbyxzLHI9dC5fcGFydHMsYT1yLmxlbmd0aCxoPXRoaXMuX2N0eDtpZihhKXtmb3IoaC5iZWdpblBhdGgoKSxlPTA7ZTxhO2UrKyl7Zm9yKG49MCxvPXJbZV0ubGVuZ3RoO248bztuKyspcz1yW2VdW25dLGhbbj9cImxpbmVUb1wiOlwibW92ZVRvXCJdKHMueCxzLnkpO2kmJmguY2xvc2VQYXRoKCl9dGhpcy5fZmlsbFN0cm9rZShoLHQpfX19LF91cGRhdGVDaXJjbGU6ZnVuY3Rpb24odCl7aWYodGhpcy5fZHJhd2luZyYmIXQuX2VtcHR5KCkpe3ZhciBpPXQuX3BvaW50LGU9dGhpcy5fY3R4LG49TWF0aC5tYXgoTWF0aC5yb3VuZCh0Ll9yYWRpdXMpLDEpLG89KE1hdGgubWF4KE1hdGgucm91bmQodC5fcmFkaXVzWSksMSl8fG4pL247MSE9PW8mJihlLnNhdmUoKSxlLnNjYWxlKDEsbykpLGUuYmVnaW5QYXRoKCksZS5hcmMoaS54LGkueS9vLG4sMCwyKk1hdGguUEksITEpLDEhPT1vJiZlLnJlc3RvcmUoKSx0aGlzLl9maWxsU3Ryb2tlKGUsdCl9fSxfZmlsbFN0cm9rZTpmdW5jdGlvbih0LGkpe3ZhciBlPWkub3B0aW9ucztlLmZpbGwmJih0Lmdsb2JhbEFscGhhPWUuZmlsbE9wYWNpdHksdC5maWxsU3R5bGU9ZS5maWxsQ29sb3J8fGUuY29sb3IsdC5maWxsKGUuZmlsbFJ1bGV8fFwiZXZlbm9kZFwiKSksZS5zdHJva2UmJjAhPT1lLndlaWdodCYmKHQuc2V0TGluZURhc2gmJnQuc2V0TGluZURhc2goaS5vcHRpb25zJiZpLm9wdGlvbnMuX2Rhc2hBcnJheXx8W10pLHQuZ2xvYmFsQWxwaGE9ZS5vcGFjaXR5LHQubGluZVdpZHRoPWUud2VpZ2h0LHQuc3Ryb2tlU3R5bGU9ZS5jb2xvcix0LmxpbmVDYXA9ZS5saW5lQ2FwLHQubGluZUpvaW49ZS5saW5lSm9pbix0LnN0cm9rZSgpKX0sX29uQ2xpY2s6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLGUsbj10aGlzLl9tYXAubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSxvPXRoaXMuX2RyYXdGaXJzdDtvO289by5uZXh0KShpPW8ubGF5ZXIpLm9wdGlvbnMuaW50ZXJhY3RpdmUmJmkuX2NvbnRhaW5zUG9pbnQobikmJiF0aGlzLl9tYXAuX2RyYWdnYWJsZU1vdmVkKGkpJiYoZT1pKTtlJiYoenQodCksdGhpcy5fZmlyZUV2ZW50KFtlXSx0KSl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXtpZih0aGlzLl9tYXAmJiF0aGlzLl9tYXAuZHJhZ2dpbmcubW92aW5nKCkmJiF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20pe3ZhciBpPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpO3RoaXMuX2hhbmRsZU1vdXNlSG92ZXIodCxpKX19LF9oYW5kbGVNb3VzZU91dDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9ob3ZlcmVkTGF5ZXI7aSYmKHR0KHRoaXMuX2NvbnRhaW5lcixcImxlYWZsZXQtaW50ZXJhY3RpdmVcIiksdGhpcy5fZmlyZUV2ZW50KFtpXSx0LFwibW91c2VvdXRcIiksdGhpcy5faG92ZXJlZExheWVyPW51bGwpfSxfaGFuZGxlTW91c2VIb3ZlcjpmdW5jdGlvbih0LGkpe2Zvcih2YXIgZSxuLG89dGhpcy5fZHJhd0ZpcnN0O287bz1vLm5leHQpKGU9by5sYXllcikub3B0aW9ucy5pbnRlcmFjdGl2ZSYmZS5fY29udGFpbnNQb2ludChpKSYmKG49ZSk7biE9PXRoaXMuX2hvdmVyZWRMYXllciYmKHRoaXMuX2hhbmRsZU1vdXNlT3V0KHQpLG4mJihRKHRoaXMuX2NvbnRhaW5lcixcImxlYWZsZXQtaW50ZXJhY3RpdmVcIiksdGhpcy5fZmlyZUV2ZW50KFtuXSx0LFwibW91c2VvdmVyXCIpLHRoaXMuX2hvdmVyZWRMYXllcj1uKSksdGhpcy5faG92ZXJlZExheWVyJiZ0aGlzLl9maXJlRXZlbnQoW3RoaXMuX2hvdmVyZWRMYXllcl0sdCl9LF9maXJlRXZlbnQ6ZnVuY3Rpb24odCxpLGUpe3RoaXMuX21hcC5fZmlyZURPTUV2ZW50KGksZXx8aS50eXBlLHQpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKHQpe3ZhciBpPXQuX29yZGVyO2lmKGkpe3ZhciBlPWkubmV4dCxuPWkucHJldjtlJiYoZS5wcmV2PW4sbj9uLm5leHQ9ZTplJiYodGhpcy5fZHJhd0ZpcnN0PWUpLGkucHJldj10aGlzLl9kcmF3TGFzdCx0aGlzLl9kcmF3TGFzdC5uZXh0PWksaS5uZXh0PW51bGwsdGhpcy5fZHJhd0xhc3Q9aSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpKX19LF9icmluZ1RvQmFjazpmdW5jdGlvbih0KXt2YXIgaT10Ll9vcmRlcjtpZihpKXt2YXIgZT1pLm5leHQsbj1pLnByZXY7biYmKG4ubmV4dD1lLGU/ZS5wcmV2PW46biYmKHRoaXMuX2RyYXdMYXN0PW4pLGkucHJldj1udWxsLGkubmV4dD10aGlzLl9kcmF3Rmlyc3QsdGhpcy5fZHJhd0ZpcnN0LnByZXY9aSx0aGlzLl9kcmF3Rmlyc3Q9aSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpKX19fSkseW49ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKFwibHZtbFwiLFwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWxcIiksZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8bHZtbDpcIit0KycgY2xhc3M9XCJsdm1sXCI+Jyl9fWNhdGNoKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIjxcIit0KycgeG1sbnM9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQuY29tOnZtbFwiIGNsYXNzPVwibHZtbFwiPicpfX19KCkseG49e19pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyPUcoXCJkaXZcIixcImxlYWZsZXQtdm1sLWNvbnRhaW5lclwiKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcC5fYW5pbWF0aW5nWm9vbXx8KGduLnByb3RvdHlwZS5fdXBkYXRlLmNhbGwodGhpcyksdGhpcy5maXJlKFwidXBkYXRlXCIpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX2NvbnRhaW5lcj15bihcInNoYXBlXCIpO1EoaSxcImxlYWZsZXQtdm1sLXNoYXBlIFwiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKSksaS5jb29yZHNpemU9XCIxIDFcIix0Ll9wYXRoPXluKFwicGF0aFwiKSxpLmFwcGVuZENoaWxkKHQuX3BhdGgpLHRoaXMuX3VwZGF0ZVN0eWxlKHQpLHRoaXMuX2xheWVyc1tuKHQpXT10fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt2YXIgaT10Ll9jb250YWluZXI7dGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGkpLHQub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdC5hZGRJbnRlcmFjdGl2ZVRhcmdldChpKX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7dmFyIGk9dC5fY29udGFpbmVyO0soaSksdC5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldChpKSxkZWxldGUgdGhpcy5fbGF5ZXJzW24odCldfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5fc3Ryb2tlLGU9dC5fZmlsbCxuPXQub3B0aW9ucyxvPXQuX2NvbnRhaW5lcjtvLnN0cm9rZWQ9ISFuLnN0cm9rZSxvLmZpbGxlZD0hIW4uZmlsbCxuLnN0cm9rZT8oaXx8KGk9dC5fc3Ryb2tlPXluKFwic3Ryb2tlXCIpKSxvLmFwcGVuZENoaWxkKGkpLGkud2VpZ2h0PW4ud2VpZ2h0K1wicHhcIixpLmNvbG9yPW4uY29sb3IsaS5vcGFjaXR5PW4ub3BhY2l0eSxuLmRhc2hBcnJheT9pLmRhc2hTdHlsZT1vaShuLmRhc2hBcnJheSk/bi5kYXNoQXJyYXkuam9pbihcIiBcIik6bi5kYXNoQXJyYXkucmVwbGFjZSgvKCAqLCAqKS9nLFwiIFwiKTppLmRhc2hTdHlsZT1cIlwiLGkuZW5kY2FwPW4ubGluZUNhcC5yZXBsYWNlKFwiYnV0dFwiLFwiZmxhdFwiKSxpLmpvaW5zdHlsZT1uLmxpbmVKb2luKTppJiYoby5yZW1vdmVDaGlsZChpKSx0Ll9zdHJva2U9bnVsbCksbi5maWxsPyhlfHwoZT10Ll9maWxsPXluKFwiZmlsbFwiKSksby5hcHBlbmRDaGlsZChlKSxlLmNvbG9yPW4uZmlsbENvbG9yfHxuLmNvbG9yLGUub3BhY2l0eT1uLmZpbGxPcGFjaXR5KTplJiYoby5yZW1vdmVDaGlsZChlKSx0Ll9maWxsPW51bGwpfSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3BvaW50LnJvdW5kKCksZT1NYXRoLnJvdW5kKHQuX3JhZGl1cyksbj1NYXRoLnJvdW5kKHQuX3JhZGl1c1l8fGUpO3RoaXMuX3NldFBhdGgodCx0Ll9lbXB0eSgpP1wiTTAgMFwiOlwiQUwgXCIraS54K1wiLFwiK2kueStcIiBcIitlK1wiLFwiK24rXCIgMCwyMzU5MjYwMFwiKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxpKXt0Ll9wYXRoLnY9aX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXtYKHQuX2NvbnRhaW5lcil9LF9icmluZ1RvQmFjazpmdW5jdGlvbih0KXtKKHQuX2NvbnRhaW5lcil9fSx3bj0kaT95bjpFLFBuPWduLmV4dGVuZCh7Z2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9Z24ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiB0Lnpvb21zdGFydD10aGlzLl9vblpvb21TdGFydCx0fSxfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcj13bihcInN2Z1wiKSx0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKFwicG9pbnRlci1ldmVudHNcIixcIm5vbmVcIiksdGhpcy5fcm9vdEdyb3VwPXduKFwiZ1wiKSx0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcm9vdEdyb3VwKX0sX2Rlc3Ryb3lDb250YWluZXI6ZnVuY3Rpb24oKXtLKHRoaXMuX2NvbnRhaW5lciksZnQodGhpcy5fY29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udGFpbmVyLGRlbGV0ZSB0aGlzLl9yb290R3JvdXAsZGVsZXRlIHRoaXMuX3N2Z1NpemV9LF9vblpvb21TdGFydDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZSgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcC5fYW5pbWF0aW5nWm9vbXx8IXRoaXMuX2JvdW5kcyl7Z24ucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKTt2YXIgdD10aGlzLl9ib3VuZHMsaT10LmdldFNpemUoKSxlPXRoaXMuX2NvbnRhaW5lcjt0aGlzLl9zdmdTaXplJiZ0aGlzLl9zdmdTaXplLmVxdWFscyhpKXx8KHRoaXMuX3N2Z1NpemU9aSxlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsaS54KSxlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLGkueSkpLGF0KGUsdC5taW4pLGUuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLFt0Lm1pbi54LHQubWluLnksaS54LGkueV0uam9pbihcIiBcIikpLHRoaXMuZmlyZShcInVwZGF0ZVwiKX19LF9pbml0UGF0aDpmdW5jdGlvbih0KXt2YXIgaT10Ll9wYXRoPXduKFwicGF0aFwiKTt0Lm9wdGlvbnMuY2xhc3NOYW1lJiZRKGksdC5vcHRpb25zLmNsYXNzTmFtZSksdC5vcHRpb25zLmludGVyYWN0aXZlJiZRKGksXCJsZWFmbGV0LWludGVyYWN0aXZlXCIpLHRoaXMuX3VwZGF0ZVN0eWxlKHQpLHRoaXMuX2xheWVyc1tuKHQpXT10fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9yb290R3JvdXB8fHRoaXMuX2luaXRDb250YWluZXIoKSx0aGlzLl9yb290R3JvdXAuYXBwZW5kQ2hpbGQodC5fcGF0aCksdC5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0Ll9wYXRoKX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7Syh0Ll9wYXRoKSx0LnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHQuX3BhdGgpLGRlbGV0ZSB0aGlzLl9sYXllcnNbbih0KV19LF91cGRhdGVQYXRoOmZ1bmN0aW9uKHQpe3QuX3Byb2plY3QoKSx0Ll91cGRhdGUoKX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3BhdGgsZT10Lm9wdGlvbnM7aSYmKGUuc3Ryb2tlPyhpLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLGUuY29sb3IpLGkuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIixlLm9wYWNpdHkpLGkuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsZS53ZWlnaHQpLGkuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWxpbmVjYXBcIixlLmxpbmVDYXApLGkuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWxpbmVqb2luXCIsZS5saW5lSm9pbiksZS5kYXNoQXJyYXk/aS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtZGFzaGFycmF5XCIsZS5kYXNoQXJyYXkpOmkucmVtb3ZlQXR0cmlidXRlKFwic3Ryb2tlLWRhc2hhcnJheVwiKSxlLmRhc2hPZmZzZXQ/aS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtZGFzaG9mZnNldFwiLGUuZGFzaE9mZnNldCk6aS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHJva2UtZGFzaG9mZnNldFwiKSk6aS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIixcIm5vbmVcIiksZS5maWxsPyhpLnNldEF0dHJpYnV0ZShcImZpbGxcIixlLmZpbGxDb2xvcnx8ZS5jb2xvciksaS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIixlLmZpbGxPcGFjaXR5KSxpLnNldEF0dHJpYnV0ZShcImZpbGwtcnVsZVwiLGUuZmlsbFJ1bGV8fFwiZXZlbm9kZFwiKSk6aS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsXCJub25lXCIpKX0sX3VwZGF0ZVBvbHk6ZnVuY3Rpb24odCxpKXt0aGlzLl9zZXRQYXRoKHQsayh0Ll9wYXJ0cyxpKSl9LF91cGRhdGVDaXJjbGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5fcG9pbnQsZT1NYXRoLm1heChNYXRoLnJvdW5kKHQuX3JhZGl1cyksMSksbj1cImFcIitlK1wiLFwiKyhNYXRoLm1heChNYXRoLnJvdW5kKHQuX3JhZGl1c1kpLDEpfHxlKStcIiAwIDEsMCBcIixvPXQuX2VtcHR5KCk/XCJNMCAwXCI6XCJNXCIrKGkueC1lKStcIixcIitpLnkrbisyKmUrXCIsMCBcIituKzIqLWUrXCIsMCBcIjt0aGlzLl9zZXRQYXRoKHQsbyl9LF9zZXRQYXRoOmZ1bmN0aW9uKHQsaSl7dC5fcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsaSl9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24odCl7WCh0Ll9wYXRoKX0sX2JyaW5nVG9CYWNrOmZ1bmN0aW9uKHQpe0oodC5fcGF0aCl9fSk7JGkmJlBuLmluY2x1ZGUoeG4pLGJlLmluY2x1ZGUoe2dldFJlbmRlcmVyOmZ1bmN0aW9uKHQpe3ZhciBpPXQub3B0aW9ucy5yZW5kZXJlcnx8dGhpcy5fZ2V0UGFuZVJlbmRlcmVyKHQub3B0aW9ucy5wYW5lKXx8dGhpcy5vcHRpb25zLnJlbmRlcmVyfHx0aGlzLl9yZW5kZXJlcjtyZXR1cm4gaXx8KGk9dGhpcy5fcmVuZGVyZXI9dGhpcy5fY3JlYXRlUmVuZGVyZXIoKSksdGhpcy5oYXNMYXllcihpKXx8dGhpcy5hZGRMYXllcihpKSxpfSxfZ2V0UGFuZVJlbmRlcmVyOmZ1bmN0aW9uKHQpe2lmKFwib3ZlcmxheVBhbmVcIj09PXR8fHZvaWQgMD09PXQpcmV0dXJuITE7dmFyIGk9dGhpcy5fcGFuZVJlbmRlcmVyc1t0XTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9dGhpcy5fY3JlYXRlUmVuZGVyZXIoe3BhbmU6dH0pLHRoaXMuX3BhbmVSZW5kZXJlcnNbdF09aSksaX0sX2NyZWF0ZVJlbmRlcmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMucHJlZmVyQ2FudmFzJiYkdCh0KXx8UXQodCl9fSk7dmFyIExuPW9uLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGkpe29uLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyx0aGlzLl9ib3VuZHNUb0xhdExuZ3ModCksaSl9LHNldEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRMYXRMbmdzKHRoaXMuX2JvdW5kc1RvTGF0TG5ncyh0KSl9LF9ib3VuZHNUb0xhdExuZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9eih0KSxbdC5nZXRTb3V0aFdlc3QoKSx0LmdldE5vcnRoV2VzdCgpLHQuZ2V0Tm9ydGhFYXN0KCksdC5nZXRTb3V0aEVhc3QoKV19fSk7UG4uY3JlYXRlPXduLFBuLnBvaW50c1RvUGF0aD1rLHNuLmdlb21ldHJ5VG9MYXllcj1GdCxzbi5jb29yZHNUb0xhdExuZz1VdCxzbi5jb29yZHNUb0xhdExuZ3M9VnQsc24ubGF0TG5nVG9Db29yZHM9cXQsc24ubGF0TG5nc1RvQ29vcmRzPUd0LHNuLmdldEZlYXR1cmU9S3Qsc24uYXNGZWF0dXJlPVl0LGJlLm1lcmdlT3B0aW9ucyh7Ym94Wm9vbTohMH0pO3ZhciBibj1FZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPXQuX2NvbnRhaW5lcix0aGlzLl9wYW5lPXQuX3BhbmVzLm92ZXJsYXlQYW5lLHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0PTAsdC5vbihcInVubG9hZFwiLHRoaXMuX2Rlc3Ryb3ksdGhpcyl9LGFkZEhvb2tzOmZ1bmN0aW9uKCl7bXQodGhpcy5fY29udGFpbmVyLFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7ZnQodGhpcy5fY29udGFpbmVyLFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sdGhpcyl9LG1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmVkfSxfZGVzdHJveTpmdW5jdGlvbigpe0sodGhpcy5fcGFuZSksZGVsZXRlIHRoaXMuX3BhbmV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQ9MCx0aGlzLl9tb3ZlZD0hMX0sX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlOmZ1bmN0aW9uKCl7MCE9PXRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0KSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD0wKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKHQpe2lmKCF0LnNoaWZ0S2V5fHwxIT09dC53aGljaCYmMSE9PXQuYnV0dG9uKXJldHVybiExO3RoaXMuX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlKCksdGhpcy5fcmVzZXRTdGF0ZSgpLGZpKCksdXQoKSx0aGlzLl9zdGFydFBvaW50PXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSxtdChkb2N1bWVudCx7Y29udGV4dG1lbnU6THQsbW91c2Vtb3ZlOnRoaXMuX29uTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5fb25Nb3VzZVVwLGtleWRvd246dGhpcy5fb25LZXlEb3dufSx0aGlzKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuX21vdmVkfHwodGhpcy5fbW92ZWQ9ITAsdGhpcy5fYm94PUcoXCJkaXZcIixcImxlYWZsZXQtem9vbS1ib3hcIix0aGlzLl9jb250YWluZXIpLFEodGhpcy5fY29udGFpbmVyLFwibGVhZmxldC1jcm9zc2hhaXJcIiksdGhpcy5fbWFwLmZpcmUoXCJib3h6b29tc3RhcnRcIikpLHRoaXMuX3BvaW50PXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KTt2YXIgaT1uZXcgUCh0aGlzLl9wb2ludCx0aGlzLl9zdGFydFBvaW50KSxlPWkuZ2V0U2l6ZSgpO2F0KHRoaXMuX2JveCxpLm1pbiksdGhpcy5fYm94LnN0eWxlLndpZHRoPWUueCtcInB4XCIsdGhpcy5fYm94LnN0eWxlLmhlaWdodD1lLnkrXCJweFwifSxfZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJihLKHRoaXMuX2JveCksdHQodGhpcy5fY29udGFpbmVyLFwibGVhZmxldC1jcm9zc2hhaXJcIikpLGdpKCksbHQoKSxmdChkb2N1bWVudCx7Y29udGV4dG1lbnU6THQsbW91c2Vtb3ZlOnRoaXMuX29uTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5fb25Nb3VzZVVwLGtleWRvd246dGhpcy5fb25LZXlEb3dufSx0aGlzKX0sX29uTW91c2VVcDpmdW5jdGlvbih0KXtpZigoMT09PXQud2hpY2h8fDE9PT10LmJ1dHRvbikmJih0aGlzLl9maW5pc2goKSx0aGlzLl9tb3ZlZCkpe3RoaXMuX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlKCksdGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQ9c2V0VGltZW91dChlKHRoaXMuX3Jlc2V0U3RhdGUsdGhpcyksMCk7dmFyIGk9bmV3IFQodGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodGhpcy5fc3RhcnRQb2ludCksdGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodGhpcy5fcG9pbnQpKTt0aGlzLl9tYXAuZml0Qm91bmRzKGkpLmZpcmUoXCJib3h6b29tZW5kXCIse2JveFpvb21Cb3VuZHM6aX0pfX0sX29uS2V5RG93bjpmdW5jdGlvbih0KXsyNz09PXQua2V5Q29kZSYmdGhpcy5fZmluaXNoKCl9fSk7YmUuYWRkSW5pdEhvb2soXCJhZGRIYW5kbGVyXCIsXCJib3hab29tXCIsYm4pLGJlLm1lcmdlT3B0aW9ucyh7ZG91YmxlQ2xpY2tab29tOiEwfSk7dmFyIFRuPUVlLmV4dGVuZCh7YWRkSG9va3M6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub24oXCJkYmxjbGlja1wiLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZihcImRibGNsaWNrXCIsdGhpcy5fb25Eb3VibGVDbGljayx0aGlzKX0sX29uRG91YmxlQ2xpY2s6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLGU9aS5nZXRab29tKCksbj1pLm9wdGlvbnMuem9vbURlbHRhLG89dC5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5P2UtbjplK247XCJjZW50ZXJcIj09PWkub3B0aW9ucy5kb3VibGVDbGlja1pvb20/aS5zZXRab29tKG8pOmkuc2V0Wm9vbUFyb3VuZCh0LmNvbnRhaW5lclBvaW50LG8pfX0pO2JlLmFkZEluaXRIb29rKFwiYWRkSGFuZGxlclwiLFwiZG91YmxlQ2xpY2tab29tXCIsVG4pLGJlLm1lcmdlT3B0aW9ucyh7ZHJhZ2dpbmc6ITAsaW5lcnRpYTohTWksaW5lcnRpYURlY2VsZXJhdGlvbjozNDAwLGluZXJ0aWFNYXhTcGVlZDoxLzAsZWFzZUxpbmVhcml0eTouMix3b3JsZENvcHlKdW1wOiExLG1heEJvdW5kc1Zpc2Nvc2l0eTowfSk7dmFyIHpuPUVlLmV4dGVuZCh7YWRkSG9va3M6ZnVuY3Rpb24oKXtpZighdGhpcy5fZHJhZ2dhYmxlKXt2YXIgdD10aGlzLl9tYXA7dGhpcy5fZHJhZ2dhYmxlPW5ldyBSZSh0Ll9tYXBQYW5lLHQuX2NvbnRhaW5lciksdGhpcy5fZHJhZ2dhYmxlLm9uKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLHRoaXMuX2RyYWdnYWJsZS5vbihcInByZWRyYWdcIix0aGlzLl9vblByZURyYWdMaW1pdCx0aGlzKSx0Lm9wdGlvbnMud29ybGRDb3B5SnVtcCYmKHRoaXMuX2RyYWdnYWJsZS5vbihcInByZWRyYWdcIix0aGlzLl9vblByZURyYWdXcmFwLHRoaXMpLHQub24oXCJ6b29tZW5kXCIsdGhpcy5fb25ab29tRW5kLHRoaXMpLHQud2hlblJlYWR5KHRoaXMuX29uWm9vbUVuZCx0aGlzKSl9USh0aGlzLl9tYXAuX2NvbnRhaW5lcixcImxlYWZsZXQtZ3JhYiBsZWFmbGV0LXRvdWNoLWRyYWdcIiksdGhpcy5fZHJhZ2dhYmxlLmVuYWJsZSgpLHRoaXMuX3Bvc2l0aW9ucz1bXSx0aGlzLl90aW1lcz1bXX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt0dCh0aGlzLl9tYXAuX2NvbnRhaW5lcixcImxlYWZsZXQtZ3JhYlwiKSx0dCh0aGlzLl9tYXAuX2NvbnRhaW5lcixcImxlYWZsZXQtdG91Y2gtZHJhZ1wiKSx0aGlzLl9kcmFnZ2FibGUuZGlzYWJsZSgpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92ZWR9LG1vdmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92aW5nfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXA7aWYodC5fc3RvcCgpLHRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kcyYmdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KXt2YXIgaT16KHRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kcyk7dGhpcy5fb2Zmc2V0TGltaXQ9Yih0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldE5vcnRoV2VzdCgpKS5tdWx0aXBseUJ5KC0xKSx0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldFNvdXRoRWFzdCgpKS5tdWx0aXBseUJ5KC0xKS5hZGQodGhpcy5fbWFwLmdldFNpemUoKSkpLHRoaXMuX3Zpc2Nvc2l0eT1NYXRoLm1pbigxLE1hdGgubWF4KDAsdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KSl9ZWxzZSB0aGlzLl9vZmZzZXRMaW1pdD1udWxsO3QuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwiZHJhZ3N0YXJ0XCIpLHQub3B0aW9ucy5pbmVydGlhJiYodGhpcy5fcG9zaXRpb25zPVtdLHRoaXMuX3RpbWVzPVtdKX0sX29uRHJhZzpmdW5jdGlvbih0KXtpZih0aGlzLl9tYXAub3B0aW9ucy5pbmVydGlhKXt2YXIgaT10aGlzLl9sYXN0VGltZT0rbmV3IERhdGUsZT10aGlzLl9sYXN0UG9zPXRoaXMuX2RyYWdnYWJsZS5fYWJzUG9zfHx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvczt0aGlzLl9wb3NpdGlvbnMucHVzaChlKSx0aGlzLl90aW1lcy5wdXNoKGkpLHRoaXMuX3BydW5lUG9zaXRpb25zKGkpfXRoaXMuX21hcC5maXJlKFwibW92ZVwiLHQpLmZpcmUoXCJkcmFnXCIsdCl9LF9wcnVuZVBvc2l0aW9uczpmdW5jdGlvbih0KXtmb3IoO3RoaXMuX3Bvc2l0aW9ucy5sZW5ndGg+MSYmdC10aGlzLl90aW1lc1swXT41MDspdGhpcy5fcG9zaXRpb25zLnNoaWZ0KCksdGhpcy5fdGltZXMuc2hpZnQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksaT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KFswLDBdKTt0aGlzLl9pbml0aWFsV29ybGRPZmZzZXQ9aS5zdWJ0cmFjdCh0KS54LHRoaXMuX3dvcmxkV2lkdGg9dGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKS5nZXRTaXplKCkueH0sX3Zpc2NvdXNMaW1pdDpmdW5jdGlvbih0LGkpe3JldHVybiB0LSh0LWkpKnRoaXMuX3Zpc2Nvc2l0eX0sX29uUHJlRHJhZ0xpbWl0OmZ1bmN0aW9uKCl7aWYodGhpcy5fdmlzY29zaXR5JiZ0aGlzLl9vZmZzZXRMaW1pdCl7dmFyIHQ9dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3Muc3VidHJhY3QodGhpcy5fZHJhZ2dhYmxlLl9zdGFydFBvcyksaT10aGlzLl9vZmZzZXRMaW1pdDt0Lng8aS5taW4ueCYmKHQueD10aGlzLl92aXNjb3VzTGltaXQodC54LGkubWluLngpKSx0Lnk8aS5taW4ueSYmKHQueT10aGlzLl92aXNjb3VzTGltaXQodC55LGkubWluLnkpKSx0Lng+aS5tYXgueCYmKHQueD10aGlzLl92aXNjb3VzTGltaXQodC54LGkubWF4LngpKSx0Lnk+aS5tYXgueSYmKHQueT10aGlzLl92aXNjb3VzTGltaXQodC55LGkubWF4LnkpKSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcz10aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zLmFkZCh0KX19LF9vblByZURyYWdXcmFwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd29ybGRXaWR0aCxpPU1hdGgucm91bmQodC8yKSxlPXRoaXMuX2luaXRpYWxXb3JsZE9mZnNldCxuPXRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLngsbz0obi1pK2UpJXQraS1lLHM9KG4raStlKSV0LWktZSxyPU1hdGguYWJzKG8rZSk8TWF0aC5hYnMocytlKT9vOnM7dGhpcy5fZHJhZ2dhYmxlLl9hYnNQb3M9dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MuY2xvbmUoKSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy54PXJ9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLGU9aS5vcHRpb25zLG49IWUuaW5lcnRpYXx8dGhpcy5fdGltZXMubGVuZ3RoPDI7aWYoaS5maXJlKFwiZHJhZ2VuZFwiLHQpLG4paS5maXJlKFwibW92ZWVuZFwiKTtlbHNle3RoaXMuX3BydW5lUG9zaXRpb25zKCtuZXcgRGF0ZSk7dmFyIG89dGhpcy5fbGFzdFBvcy5zdWJ0cmFjdCh0aGlzLl9wb3NpdGlvbnNbMF0pLHM9KHRoaXMuX2xhc3RUaW1lLXRoaXMuX3RpbWVzWzBdKS8xZTMscj1lLmVhc2VMaW5lYXJpdHksYT1vLm11bHRpcGx5Qnkoci9zKSxoPWEuZGlzdGFuY2VUbyhbMCwwXSksdT1NYXRoLm1pbihlLmluZXJ0aWFNYXhTcGVlZCxoKSxsPWEubXVsdGlwbHlCeSh1L2gpLGM9dS8oZS5pbmVydGlhRGVjZWxlcmF0aW9uKnIpLF89bC5tdWx0aXBseUJ5KC1jLzIpLnJvdW5kKCk7Xy54fHxfLnk/KF89aS5fbGltaXRPZmZzZXQoXyxpLm9wdGlvbnMubWF4Qm91bmRzKSxmKGZ1bmN0aW9uKCl7aS5wYW5CeShfLHtkdXJhdGlvbjpjLGVhc2VMaW5lYXJpdHk6cixub01vdmVTdGFydDohMCxhbmltYXRlOiEwfSl9KSk6aS5maXJlKFwibW92ZWVuZFwiKX19fSk7YmUuYWRkSW5pdEhvb2soXCJhZGRIYW5kbGVyXCIsXCJkcmFnZ2luZ1wiLHpuKSxiZS5tZXJnZU9wdGlvbnMoe2tleWJvYXJkOiEwLGtleWJvYXJkUGFuRGVsdGE6ODB9KTt2YXIgTW49RWUuZXh0ZW5kKHtrZXlDb2Rlczp7bGVmdDpbMzddLHJpZ2h0OlszOV0sZG93bjpbNDBdLHVwOlszOF0sem9vbUluOlsxODcsMTA3LDYxLDE3MV0sem9vbU91dDpbMTg5LDEwOSw1NCwxNzNdfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX3NldFBhbkRlbHRhKHQub3B0aW9ucy5rZXlib2FyZFBhbkRlbHRhKSx0aGlzLl9zZXRab29tRGVsdGEodC5vcHRpb25zLnpvb21EZWx0YSl9LGFkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLl9jb250YWluZXI7dC50YWJJbmRleDw9MCYmKHQudGFiSW5kZXg9XCIwXCIpLG10KHQse2ZvY3VzOnRoaXMuX29uRm9jdXMsYmx1cjp0aGlzLl9vbkJsdXIsbW91c2Vkb3duOnRoaXMuX29uTW91c2VEb3dufSx0aGlzKSx0aGlzLl9tYXAub24oe2ZvY3VzOnRoaXMuX2FkZEhvb2tzLGJsdXI6dGhpcy5fcmVtb3ZlSG9va3N9LHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUhvb2tzKCksZnQodGhpcy5fbWFwLl9jb250YWluZXIse2ZvY3VzOnRoaXMuX29uRm9jdXMsYmx1cjp0aGlzLl9vbkJsdXIsbW91c2Vkb3duOnRoaXMuX29uTW91c2VEb3dufSx0aGlzKSx0aGlzLl9tYXAub2ZmKHtmb2N1czp0aGlzLl9hZGRIb29rcyxibHVyOnRoaXMuX3JlbW92ZUhvb2tzfSx0aGlzKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWQpe3ZhciB0PWRvY3VtZW50LmJvZHksaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT10LnNjcm9sbFRvcHx8aS5zY3JvbGxUb3Asbj10LnNjcm9sbExlZnR8fGkuc2Nyb2xsTGVmdDt0aGlzLl9tYXAuX2NvbnRhaW5lci5mb2N1cygpLHdpbmRvdy5zY3JvbGxUbyhuLGUpfX0sX29uRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkPSEwLHRoaXMuX21hcC5maXJlKFwiZm9jdXNcIil9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkPSExLHRoaXMuX21hcC5maXJlKFwiYmx1clwiKX0sX3NldFBhbkRlbHRhOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10aGlzLl9wYW5LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoaT0wLGU9by5sZWZ0Lmxlbmd0aDtpPGU7aSsrKW5bby5sZWZ0W2ldXT1bLTEqdCwwXTtmb3IoaT0wLGU9by5yaWdodC5sZW5ndGg7aTxlO2krKyluW28ucmlnaHRbaV1dPVt0LDBdO2ZvcihpPTAsZT1vLmRvd24ubGVuZ3RoO2k8ZTtpKyspbltvLmRvd25baV1dPVswLHRdO2ZvcihpPTAsZT1vLnVwLmxlbmd0aDtpPGU7aSsrKW5bby51cFtpXV09WzAsLTEqdF19LF9zZXRab29tRGVsdGE6ZnVuY3Rpb24odCl7dmFyIGksZSxuPXRoaXMuX3pvb21LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoaT0wLGU9by56b29tSW4ubGVuZ3RoO2k8ZTtpKyspbltvLnpvb21JbltpXV09dDtmb3IoaT0wLGU9by56b29tT3V0Lmxlbmd0aDtpPGU7aSsrKW5bby56b29tT3V0W2ldXT0tdH0sX2FkZEhvb2tzOmZ1bmN0aW9uKCl7bXQoZG9jdW1lbnQsXCJrZXlkb3duXCIsdGhpcy5fb25LZXlEb3duLHRoaXMpfSxfcmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtmdChkb2N1bWVudCxcImtleWRvd25cIix0aGlzLl9vbktleURvd24sdGhpcyl9LF9vbktleURvd246ZnVuY3Rpb24odCl7aWYoISh0LmFsdEtleXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXkpKXt2YXIgaSxlPXQua2V5Q29kZSxuPXRoaXMuX21hcDtpZihlIGluIHRoaXMuX3BhbktleXMpbi5fcGFuQW5pbSYmbi5fcGFuQW5pbS5faW5Qcm9ncmVzc3x8KGk9dGhpcy5fcGFuS2V5c1tlXSx0LnNoaWZ0S2V5JiYoaT13KGkpLm11bHRpcGx5QnkoMykpLG4ucGFuQnkoaSksbi5vcHRpb25zLm1heEJvdW5kcyYmbi5wYW5JbnNpZGVCb3VuZHMobi5vcHRpb25zLm1heEJvdW5kcykpO2Vsc2UgaWYoZSBpbiB0aGlzLl96b29tS2V5cyluLnNldFpvb20obi5nZXRab29tKCkrKHQuc2hpZnRLZXk/MzoxKSp0aGlzLl96b29tS2V5c1tlXSk7ZWxzZXtpZigyNyE9PWV8fCFuLl9wb3B1cHx8IW4uX3BvcHVwLm9wdGlvbnMuY2xvc2VPbkVzY2FwZUtleSlyZXR1cm47bi5jbG9zZVBvcHVwKCl9THQodCl9fX0pO2JlLmFkZEluaXRIb29rKFwiYWRkSGFuZGxlclwiLFwia2V5Ym9hcmRcIixNbiksYmUubWVyZ2VPcHRpb25zKHtzY3JvbGxXaGVlbFpvb206ITAsd2hlZWxEZWJvdW5jZVRpbWU6NDAsd2hlZWxQeFBlclpvb21MZXZlbDo2MH0pO3ZhciBDbj1FZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7bXQodGhpcy5fbWFwLl9jb250YWluZXIsXCJtb3VzZXdoZWVsXCIsdGhpcy5fb25XaGVlbFNjcm9sbCx0aGlzKSx0aGlzLl9kZWx0YT0wfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2Z0KHRoaXMuX21hcC5fY29udGFpbmVyLFwibW91c2V3aGVlbFwiLHRoaXMuX29uV2hlZWxTY3JvbGwsdGhpcyl9LF9vbldoZWVsU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBpPVR0KHQpLG49dGhpcy5fbWFwLm9wdGlvbnMud2hlZWxEZWJvdW5jZVRpbWU7dGhpcy5fZGVsdGErPWksdGhpcy5fbGFzdE1vdXNlUG9zPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSx0aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlKTt2YXIgbz1NYXRoLm1heChuLSgrbmV3IERhdGUtdGhpcy5fc3RhcnRUaW1lKSwwKTtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoZSh0aGlzLl9wZXJmb3JtWm9vbSx0aGlzKSxvKSxMdCh0KX0sX3BlcmZvcm1ab29tOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGk9dC5nZXRab29tKCksZT10aGlzLl9tYXAub3B0aW9ucy56b29tU25hcHx8MDt0Ll9zdG9wKCk7dmFyIG49dGhpcy5fZGVsdGEvKDQqdGhpcy5fbWFwLm9wdGlvbnMud2hlZWxQeFBlclpvb21MZXZlbCksbz00Kk1hdGgubG9nKDIvKDErTWF0aC5leHAoLU1hdGguYWJzKG4pKSkpL01hdGguTE4yLHM9ZT9NYXRoLmNlaWwoby9lKSplOm8scj10Ll9saW1pdFpvb20oaSsodGhpcy5fZGVsdGE+MD9zOi1zKSktaTt0aGlzLl9kZWx0YT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHImJihcImNlbnRlclwiPT09dC5vcHRpb25zLnNjcm9sbFdoZWVsWm9vbT90LnNldFpvb20oaStyKTp0LnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLGkrcikpfX0pO2JlLmFkZEluaXRIb29rKFwiYWRkSGFuZGxlclwiLFwic2Nyb2xsV2hlZWxab29tXCIsQ24pLGJlLm1lcmdlT3B0aW9ucyh7dGFwOiEwLHRhcFRvbGVyYW5jZToxNX0pO3ZhciBTbj1FZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7bXQodGhpcy5fbWFwLl9jb250YWluZXIsXCJ0b3VjaHN0YXJ0XCIsdGhpcy5fb25Eb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2Z0KHRoaXMuX21hcC5fY29udGFpbmVyLFwidG91Y2hzdGFydFwiLHRoaXMuX29uRG93bix0aGlzKX0sX29uRG93bjpmdW5jdGlvbih0KXtpZih0LnRvdWNoZXMpe2lmKFB0KHQpLHRoaXMuX2ZpcmVDbGljaz0hMCx0LnRvdWNoZXMubGVuZ3RoPjEpcmV0dXJuIHRoaXMuX2ZpcmVDbGljaz0hMSx2b2lkIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7dmFyIGk9dC50b3VjaGVzWzBdLG49aS50YXJnZXQ7dGhpcy5fc3RhcnRQb3M9dGhpcy5fbmV3UG9zPW5ldyB4KGkuY2xpZW50WCxpLmNsaWVudFkpLG4udGFnTmFtZSYmXCJhXCI9PT1uLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmUShuLFwibGVhZmxldC1hY3RpdmVcIiksdGhpcy5faG9sZFRpbWVvdXQ9c2V0VGltZW91dChlKGZ1bmN0aW9uKCl7dGhpcy5faXNUYXBWYWxpZCgpJiYodGhpcy5fZmlyZUNsaWNrPSExLHRoaXMuX29uVXAoKSx0aGlzLl9zaW11bGF0ZUV2ZW50KFwiY29udGV4dG1lbnVcIixpKSl9LHRoaXMpLDFlMyksdGhpcy5fc2ltdWxhdGVFdmVudChcIm1vdXNlZG93blwiLGkpLG10KGRvY3VtZW50LHt0b3VjaG1vdmU6dGhpcy5fb25Nb3ZlLHRvdWNoZW5kOnRoaXMuX29uVXB9LHRoaXMpfX0sX29uVXA6ZnVuY3Rpb24odCl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KSxmdChkb2N1bWVudCx7dG91Y2htb3ZlOnRoaXMuX29uTW92ZSx0b3VjaGVuZDp0aGlzLl9vblVwfSx0aGlzKSx0aGlzLl9maXJlQ2xpY2smJnQmJnQuY2hhbmdlZFRvdWNoZXMpe3ZhciBpPXQuY2hhbmdlZFRvdWNoZXNbMF0sZT1pLnRhcmdldDtlJiZlLnRhZ05hbWUmJlwiYVwiPT09ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJnR0KGUsXCJsZWFmbGV0LWFjdGl2ZVwiKSx0aGlzLl9zaW11bGF0ZUV2ZW50KFwibW91c2V1cFwiLGkpLHRoaXMuX2lzVGFwVmFsaWQoKSYmdGhpcy5fc2ltdWxhdGVFdmVudChcImNsaWNrXCIsaSl9fSxfaXNUYXBWYWxpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXdQb3MuZGlzdGFuY2VUbyh0aGlzLl9zdGFydFBvcyk8PXRoaXMuX21hcC5vcHRpb25zLnRhcFRvbGVyYW5jZX0sX29uTW92ZTpmdW5jdGlvbih0KXt2YXIgaT10LnRvdWNoZXNbMF07dGhpcy5fbmV3UG9zPW5ldyB4KGkuY2xpZW50WCxpLmNsaWVudFkpLHRoaXMuX3NpbXVsYXRlRXZlbnQoXCJtb3VzZW1vdmVcIixpKX0sX3NpbXVsYXRlRXZlbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO2UuX3NpbXVsYXRlZD0hMCxpLnRhcmdldC5fc2ltdWxhdGVkQ2xpY2s9ITAsZS5pbml0TW91c2VFdmVudCh0LCEwLCEwLHdpbmRvdywxLGkuc2NyZWVuWCxpLnNjcmVlblksaS5jbGllbnRYLGkuY2xpZW50WSwhMSwhMSwhMSwhMSwwLG51bGwpLGkudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZSl9fSk7cWkmJiFWaSYmYmUuYWRkSW5pdEhvb2soXCJhZGRIYW5kbGVyXCIsXCJ0YXBcIixTbiksYmUubWVyZ2VPcHRpb25zKHt0b3VjaFpvb206cWkmJiFNaSxib3VuY2VBdFpvb21MaW1pdHM6ITB9KTt2YXIgWm49RWUuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe1EodGhpcy5fbWFwLl9jb250YWluZXIsXCJsZWFmbGV0LXRvdWNoLXpvb21cIiksbXQodGhpcy5fbWFwLl9jb250YWluZXIsXCJ0b3VjaHN0YXJ0XCIsdGhpcy5fb25Ub3VjaFN0YXJ0LHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3R0KHRoaXMuX21hcC5fY29udGFpbmVyLFwibGVhZmxldC10b3VjaC16b29tXCIpLGZ0KHRoaXMuX21hcC5fY29udGFpbmVyLFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCx0aGlzKX0sX29uVG91Y2hTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXA7aWYodC50b3VjaGVzJiYyPT09dC50b3VjaGVzLmxlbmd0aCYmIWkuX2FuaW1hdGluZ1pvb20mJiF0aGlzLl96b29taW5nKXt2YXIgZT1pLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1swXSksbj1pLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1sxXSk7dGhpcy5fY2VudGVyUG9pbnQ9aS5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpLHRoaXMuX3N0YXJ0TGF0TG5nPWkuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9jZW50ZXJQb2ludCksXCJjZW50ZXJcIiE9PWkub3B0aW9ucy50b3VjaFpvb20mJih0aGlzLl9waW5jaFN0YXJ0TGF0TG5nPWkuY29udGFpbmVyUG9pbnRUb0xhdExuZyhlLmFkZChuKS5fZGl2aWRlQnkoMikpKSx0aGlzLl9zdGFydERpc3Q9ZS5kaXN0YW5jZVRvKG4pLHRoaXMuX3N0YXJ0Wm9vbT1pLmdldFpvb20oKSx0aGlzLl9tb3ZlZD0hMSx0aGlzLl96b29taW5nPSEwLGkuX3N0b3AoKSxtdChkb2N1bWVudCxcInRvdWNobW92ZVwiLHRoaXMuX29uVG91Y2hNb3ZlLHRoaXMpLG10KGRvY3VtZW50LFwidG91Y2hlbmRcIix0aGlzLl9vblRvdWNoRW5kLHRoaXMpLFB0KHQpfX0sX29uVG91Y2hNb3ZlOmZ1bmN0aW9uKHQpe2lmKHQudG91Y2hlcyYmMj09PXQudG91Y2hlcy5sZW5ndGgmJnRoaXMuX3pvb21pbmcpe3ZhciBpPXRoaXMuX21hcCxuPWkubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC50b3VjaGVzWzBdKSxvPWkubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC50b3VjaGVzWzFdKSxzPW4uZGlzdGFuY2VUbyhvKS90aGlzLl9zdGFydERpc3Q7aWYodGhpcy5fem9vbT1pLmdldFNjYWxlWm9vbShzLHRoaXMuX3N0YXJ0Wm9vbSksIWkub3B0aW9ucy5ib3VuY2VBdFpvb21MaW1pdHMmJih0aGlzLl96b29tPGkuZ2V0TWluWm9vbSgpJiZzPDF8fHRoaXMuX3pvb20+aS5nZXRNYXhab29tKCkmJnM+MSkmJih0aGlzLl96b29tPWkuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSksXCJjZW50ZXJcIj09PWkub3B0aW9ucy50b3VjaFpvb20pe2lmKHRoaXMuX2NlbnRlcj10aGlzLl9zdGFydExhdExuZywxPT09cylyZXR1cm59ZWxzZXt2YXIgcj1uLl9hZGQobykuX2RpdmlkZUJ5KDIpLl9zdWJ0cmFjdCh0aGlzLl9jZW50ZXJQb2ludCk7aWYoMT09PXMmJjA9PT1yLngmJjA9PT1yLnkpcmV0dXJuO3RoaXMuX2NlbnRlcj1pLnVucHJvamVjdChpLnByb2plY3QodGhpcy5fcGluY2hTdGFydExhdExuZyx0aGlzLl96b29tKS5zdWJ0cmFjdChyKSx0aGlzLl96b29tKX10aGlzLl9tb3ZlZHx8KGkuX21vdmVTdGFydCghMCwhMSksdGhpcy5fbW92ZWQ9ITApLGcodGhpcy5fYW5pbVJlcXVlc3QpO3ZhciBhPWUoaS5fbW92ZSxpLHRoaXMuX2NlbnRlcix0aGlzLl96b29tLHtwaW5jaDohMCxyb3VuZDohMX0pO3RoaXMuX2FuaW1SZXF1ZXN0PWYoYSx0aGlzLCEwKSxQdCh0KX19LF9vblRvdWNoRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJnRoaXMuX3pvb21pbmc/KHRoaXMuX3pvb21pbmc9ITEsZyh0aGlzLl9hbmltUmVxdWVzdCksZnQoZG9jdW1lbnQsXCJ0b3VjaG1vdmVcIix0aGlzLl9vblRvdWNoTW92ZSksZnQoZG9jdW1lbnQsXCJ0b3VjaGVuZFwiLHRoaXMuX29uVG91Y2hFbmQpLHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24/dGhpcy5fbWFwLl9hbmltYXRlWm9vbSh0aGlzLl9jZW50ZXIsdGhpcy5fbWFwLl9saW1pdFpvb20odGhpcy5fem9vbSksITAsdGhpcy5fbWFwLm9wdGlvbnMuem9vbVNuYXApOnRoaXMuX21hcC5fcmVzZXRWaWV3KHRoaXMuX2NlbnRlcix0aGlzLl9tYXAuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSkpOnRoaXMuX3pvb21pbmc9ITF9fSk7YmUuYWRkSW5pdEhvb2soXCJhZGRIYW5kbGVyXCIsXCJ0b3VjaFpvb21cIixabiksYmUuQm94Wm9vbT1ibixiZS5Eb3VibGVDbGlja1pvb209VG4sYmUuRHJhZz16bixiZS5LZXlib2FyZD1NbixiZS5TY3JvbGxXaGVlbFpvb209Q24sYmUuVGFwPVNuLGJlLlRvdWNoWm9vbT1abixPYmplY3QuZnJlZXplPXRpLHQudmVyc2lvbj1cIjEuNC4wK0hFQUQuMzMzN2YzNlwiLHQuQ29udHJvbD1UZSx0LmNvbnRyb2w9emUsdC5Ccm93c2VyPVFpLHQuRXZlbnRlZD1jaSx0Lk1peGluPUJlLHQuVXRpbD11aSx0LkNsYXNzPXYsdC5IYW5kbGVyPUVlLHQuZXh0ZW5kPWksdC5iaW5kPWUsdC5zdGFtcD1uLHQuc2V0T3B0aW9ucz1sLHQuRG9tRXZlbnQ9UGUsdC5Eb21VdGlsPXZlLHQuUG9zQW5pbWF0aW9uPUxlLHQuRHJhZ2dhYmxlPVJlLHQuTGluZVV0aWw9TmUsdC5Qb2x5VXRpbD1EZSx0LlBvaW50PXgsdC5wb2ludD13LHQuQm91bmRzPVAsdC5ib3VuZHM9Yix0LlRyYW5zZm9ybWF0aW9uPVMsdC50cmFuc2Zvcm1hdGlvbj1aLHQuUHJvamVjdGlvbj1IZSx0LkxhdExuZz1NLHQubGF0TG5nPUMsdC5MYXRMbmdCb3VuZHM9VCx0LmxhdExuZ0JvdW5kcz16LHQuQ1JTPWRpLHQuR2VvSlNPTj1zbix0Lmdlb0pTT049WHQsdC5nZW9Kc29uPWFuLHQuTGF5ZXI9cWUsdC5MYXllckdyb3VwPUdlLHQubGF5ZXJHcm91cD1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgR2UodCxpKX0sdC5GZWF0dXJlR3JvdXA9S2UsdC5mZWF0dXJlR3JvdXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBLZSh0KX0sdC5JbWFnZU92ZXJsYXk9aG4sdC5pbWFnZU92ZXJsYXk9ZnVuY3Rpb24odCxpLGUpe3JldHVybiBuZXcgaG4odCxpLGUpfSx0LlZpZGVvT3ZlcmxheT11bix0LnZpZGVvT3ZlcmxheT1mdW5jdGlvbih0LGksZSl7cmV0dXJuIG5ldyB1bih0LGksZSl9LHQuRGl2T3ZlcmxheT1sbix0LlBvcHVwPWNuLHQucG9wdXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IGNuKHQsaSl9LHQuVG9vbHRpcD1fbix0LnRvb2x0aXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IF9uKHQsaSl9LHQuSWNvbj1ZZSx0Lmljb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBZZSh0KX0sdC5EaXZJY29uPWRuLHQuZGl2SWNvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRuKHQpfSx0Lk1hcmtlcj0kZSx0Lm1hcmtlcj1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgJGUodCxpKX0sdC5UaWxlTGF5ZXI9bW4sdC50aWxlTGF5ZXI9SnQsdC5HcmlkTGF5ZXI9cG4sdC5ncmlkTGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwbih0KX0sdC5TVkc9UG4sdC5zdmc9UXQsdC5SZW5kZXJlcj1nbix0LkNhbnZhcz12bix0LmNhbnZhcz0kdCx0LlBhdGg9UWUsdC5DaXJjbGVNYXJrZXI9dG4sdC5jaXJjbGVNYXJrZXI9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IHRuKHQsaSl9LHQuQ2lyY2xlPWVuLHQuY2lyY2xlPWZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gbmV3IGVuKHQsaSxlKX0sdC5Qb2x5bGluZT1ubix0LnBvbHlsaW5lPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyBubih0LGkpfSx0LlBvbHlnb249b24sdC5wb2x5Z29uPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyBvbih0LGkpfSx0LlJlY3RhbmdsZT1Mbix0LnJlY3RhbmdsZT1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgTG4odCxpKX0sdC5NYXA9YmUsdC5tYXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IGJlKHQsaSl9O3ZhciBFbj13aW5kb3cuTDt0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93Lkw9RW4sdGhpc30sd2luZG93Lkw9dH0pOyIsIi8qISA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTiAgMTEuMC4yICAgICAgICAgICAgICBcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLyohID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogYm9vdHN0cmFwLXNsaWRlci5qc1xuICpcbiAqIE1haW50YWluZXJzOlxuICpcdFx0S3lsZSBLZW1wXG4gKlx0XHRcdC0gVHdpdHRlcjogQHNlaXlyaWFcbiAqXHRcdFx0LSBHaXRodWI6ICBzZWl5cmlhXG4gKlx0XHRSb2hpdCBLYWxrdXJcbiAqXHRcdFx0LSBUd2l0dGVyOiBAUm92b2x1dGlvbmFyeVxuICpcdFx0XHQtIEdpdGh1YjogIHJvdm9sdXRpb25cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBib290c3RyYXAtc2xpZGVyIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE5IEt5bGUgS2VtcCwgUm9oaXQgS2Fsa3VyLCBhbmQgY29udHJpYnV0b3JzXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXG4gKiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXRcbiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLFxuICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZVxuICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmdcbiAqIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVNcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4gKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksXG4gKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1JcbiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBCcmlkZ2V0IG1ha2VzIGpRdWVyeSB3aWRnZXRzXG4gKiB2MS4wLjFcbiAqIE1JVCBsaWNlbnNlXG4gKi9cbnZhciB3aW5kb3dJc0RlZmluZWQgPSAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKHdpbmRvdykpID09PSBcIm9iamVjdFwiO1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKFtcImpxdWVyeVwiXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSBpZiAoKHR5cGVvZiBtb2R1bGUgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihtb2R1bGUpKSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdHZhciBqUXVlcnk7XG5cdFx0dHJ5IHtcblx0XHRcdGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRqUXVlcnkgPSBudWxsO1xuXHRcdH1cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoalF1ZXJ5KTtcblx0fSBlbHNlIGlmICh3aW5kb3cpIHtcblx0XHR3aW5kb3cuU2xpZGVyID0gZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTtcblx0fVxufSkoZnVuY3Rpb24gKCQpIHtcblx0Ly8gQ29uc3RhbnRzXG5cdHZhciBOQU1FU1BBQ0VfTUFJTiA9ICdzbGlkZXInO1xuXHR2YXIgTkFNRVNQQUNFX0FMVEVSTkFURSA9ICdib290c3RyYXBTbGlkZXInO1xuXG5cdC8vIFBvbHlmaWxsIGNvbnNvbGUgbWV0aG9kc1xuXHRpZiAod2luZG93SXNEZWZpbmVkICYmICF3aW5kb3cuY29uc29sZSkge1xuXHRcdHdpbmRvdy5jb25zb2xlID0ge307XG5cdH1cblx0aWYgKHdpbmRvd0lzRGVmaW5lZCAmJiAhd2luZG93LmNvbnNvbGUubG9nKSB7XG5cdFx0d2luZG93LmNvbnNvbGUubG9nID0gZnVuY3Rpb24gKCkge307XG5cdH1cblx0aWYgKHdpbmRvd0lzRGVmaW5lZCAmJiAhd2luZG93LmNvbnNvbGUud2Fybikge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4gPSBmdW5jdGlvbiAoKSB7fTtcblx0fVxuXG5cdC8vIFJlZmVyZW5jZSB0byBTbGlkZXIgY29uc3RydWN0b3Jcblx0dmFyIFNsaWRlcjtcblxuXHQoZnVuY3Rpb24gKCQpIHtcblxuXHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblx0XHR2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cblx0XHRmdW5jdGlvbiBub29wKCkge31cblxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuXHRcdGZ1bmN0aW9uIGRlZmluZUJyaWRnZXQoJCkge1xuXG5cdFx0XHQvLyBiYWlsIGlmIG5vIGpRdWVyeVxuXHRcdFx0aWYgKCEkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWRkT3B0aW9uTWV0aG9kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblx0XHRcdC8qKlxuICAgICogYWRkcyBvcHRpb24gbWV0aG9kIC0+ICQoKS5wbHVnaW4oJ29wdGlvbicsIHsuLi59KVxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gUGx1Z2luQ2xhc3MgLSBjb25zdHJ1Y3RvciBjbGFzc1xuICAgICovXG5cdFx0XHRmdW5jdGlvbiBhZGRPcHRpb25NZXRob2QoUGx1Z2luQ2xhc3MpIHtcblx0XHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIG9yaWdpbmFsIG9wdGlvbiBtZXRob2Rcblx0XHRcdFx0aWYgKFBsdWdpbkNsYXNzLnByb3RvdHlwZS5vcHRpb24pIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBvcHRpb24gc2V0dGVyXG5cdFx0XHRcdFBsdWdpbkNsYXNzLnByb3RvdHlwZS5vcHRpb24gPSBmdW5jdGlvbiAob3B0cykge1xuXHRcdFx0XHRcdC8vIGJhaWwgb3V0IGlmIG5vdCBhbiBvYmplY3Rcblx0XHRcdFx0XHRpZiAoISQuaXNQbGFpbk9iamVjdChvcHRzKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB0aGlzLm9wdGlvbnMsIG9wdHMpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbHVnaW4gYnJpZGdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblx0XHRcdC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZyBlcnJvcnNcblx0XHRcdC8vICQuZXJyb3IgYnJlYWtzIGpRdWVyeSBjaGFpbmluZ1xuXHRcdFx0dmFyIGxvZ0Vycm9yID0gdHlwZW9mIGNvbnNvbGUgPT09ICd1bmRlZmluZWQnID8gbm9vcCA6IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcbiAgICAqIGpRdWVyeSBwbHVnaW4gYnJpZGdlLCBhY2Nlc3MgbWV0aG9kcyBsaWtlICRlbGVtLnBsdWdpbignbWV0aG9kJylcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgLSBwbHVnaW4gbmFtZVxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gUGx1Z2luQ2xhc3MgLSBjb25zdHJ1Y3RvciBjbGFzc1xuICAgICovXG5cdFx0XHRmdW5jdGlvbiBicmlkZ2UobmFtZXNwYWNlLCBQbHVnaW5DbGFzcykge1xuXHRcdFx0XHQvLyBhZGQgdG8galF1ZXJ5IGZuIG5hbWVzcGFjZVxuXHRcdFx0XHQkLmZuW25hbWVzcGFjZV0gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHRcdFx0XHRcdGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdC8vIGNhbGwgcGx1Z2luIG1ldGhvZCB3aGVuIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3RyaW5nXG5cdFx0XHRcdFx0XHQvLyBnZXQgYXJndW1lbnRzIGZvciBtZXRob2Rcblx0XHRcdFx0XHRcdHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG5cdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRcdFx0XHR2YXIgZWxlbSA9IHRoaXNbaV07XG5cdFx0XHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YShlbGVtLCBuYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWluc3RhbmNlKSB7XG5cdFx0XHRcdFx0XHRcdFx0bG9nRXJyb3IoXCJjYW5ub3QgY2FsbCBtZXRob2RzIG9uIFwiICsgbmFtZXNwYWNlICsgXCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICsgXCJhdHRlbXB0ZWQgdG8gY2FsbCAnXCIgKyBvcHRpb25zICsgXCInXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICghJC5pc0Z1bmN0aW9uKGluc3RhbmNlW29wdGlvbnNdKSB8fCBvcHRpb25zLmNoYXJBdCgwKSA9PT0gJ18nKSB7XG5cdFx0XHRcdFx0XHRcdFx0bG9nRXJyb3IoXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWVzcGFjZSArIFwiIGluc3RhbmNlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gdHJpZ2dlciBtZXRob2Qgd2l0aCBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0dmFyIHJldHVyblZhbHVlID0gaW5zdGFuY2Vbb3B0aW9uc10uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGJyZWFrIGxvb2sgYW5kIHJldHVybiBmaXJzdCB2YWx1ZSBpZiBwcm92aWRlZFxuXHRcdFx0XHRcdFx0XHRpZiAocmV0dXJuVmFsdWUgIT09IHVuZGVmaW5lZCAmJiByZXR1cm5WYWx1ZSAhPT0gaW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIHJldHVybiB0aGlzIGlmIG5vIHJldHVybiB2YWx1ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZhciBvYmplY3RzID0gdGhpcy5tYXAoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgaW5zdGFuY2UgPSAkLmRhdGEodGhpcywgbmFtZXNwYWNlKTtcblx0XHRcdFx0XHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYXBwbHkgb3B0aW9ucyAmIGluaXRcblx0XHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5vcHRpb24ob3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFuY2UuX2luaXQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbml0aWFsaXplIG5ldyBpbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHRcdGluc3RhbmNlID0gbmV3IFBsdWdpbkNsYXNzKHRoaXMsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0XHRcdCQuZGF0YSh0aGlzLCBuYW1lc3BhY2UsIGluc3RhbmNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gJCh0aGlzKTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRpZiAob2JqZWN0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdHNbMF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJyaWRnZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuXHRcdFx0LyoqXG4gICAgKiBjb252ZXJ0cyBhIFByb3RvdHlwaWNhbCBjbGFzcyBpbnRvIGEgcHJvcGVyIGpRdWVyeSBwbHVnaW5cbiAgICAqICAgdGhlIGNsYXNzIG11c3QgaGF2ZSBhIC5faW5pdCBtZXRob2RcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgLSBwbHVnaW4gbmFtZSwgdXNlZCBpbiAkKCkucGx1Z2luTmFtZVxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gUGx1Z2luQ2xhc3MgLSBjb25zdHJ1Y3RvciBjbGFzc1xuICAgICovXG5cdFx0XHQkLmJyaWRnZXQgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBQbHVnaW5DbGFzcykge1xuXHRcdFx0XHRhZGRPcHRpb25NZXRob2QoUGx1Z2luQ2xhc3MpO1xuXHRcdFx0XHRicmlkZ2UobmFtZXNwYWNlLCBQbHVnaW5DbGFzcyk7XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gJC5icmlkZ2V0O1xuXHRcdH1cblxuXHRcdC8vIGdldCBqcXVlcnkgZnJvbSBicm93c2VyIGdsb2JhbFxuXHRcdGRlZmluZUJyaWRnZXQoJCk7XG5cdH0pKCQpO1xuXG5cdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gXHRcdFx0Qk9PVFNUUkFQLVNMSURFUiBTT1VSQ0UgQ09ERVxuIFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblx0KGZ1bmN0aW9uICgkKSB7XG5cdFx0dmFyIGF1dG9SZWdpc3Rlck5hbWVzcGFjZSA9IHZvaWQgMDtcblxuXHRcdHZhciBFcnJvck1zZ3MgPSB7XG5cdFx0XHRmb3JtYXRJbnZhbGlkSW5wdXRFcnJvck1zZzogZnVuY3Rpb24gZm9ybWF0SW52YWxpZElucHV0RXJyb3JNc2coaW5wdXQpIHtcblx0XHRcdFx0cmV0dXJuIFwiSW52YWxpZCBpbnB1dCB2YWx1ZSAnXCIgKyBpbnB1dCArIFwiJyBwYXNzZWQgaW5cIjtcblx0XHRcdH0sXG5cdFx0XHRjYWxsaW5nQ29udGV4dE5vdFNsaWRlckluc3RhbmNlOiBcIkNhbGxpbmcgY29udGV4dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgaW5zdGFuY2Ugb2YgU2xpZGVyIGJvdW5kIHRvIGl0LiBDaGVjayB5b3VyIGNvZGUgdG8gbWFrZSBzdXJlIHRoZSBKUXVlcnkgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGNhbGwgdG8gdGhlIHNsaWRlcigpIGluaXRpYWxpemVyIGlzIGNhbGxpbmcgdGhlIG1ldGhvZFwiXG5cdFx0fTtcblxuXHRcdHZhciBTbGlkZXJTY2FsZSA9IHtcblx0XHRcdGxpbmVhcjoge1xuXHRcdFx0XHRnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIG9wdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUgPCBvcHRpb25zLm1pbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9wdGlvbnMubWluO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPiBvcHRpb25zLm1heCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9wdGlvbnMubWF4O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0b1ZhbHVlOiBmdW5jdGlvbiB0b1ZhbHVlKHBlcmNlbnRhZ2UpIHtcblx0XHRcdFx0XHR2YXIgcmF3VmFsdWUgPSBwZXJjZW50YWdlIC8gMTAwICogKHRoaXMub3B0aW9ucy5tYXggLSB0aGlzLm9wdGlvbnMubWluKTtcblx0XHRcdFx0XHR2YXIgc2hvdWxkQWRqdXN0V2l0aEJhc2UgPSB0cnVlO1xuXHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMudGlja3NfcG9zaXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHZhciBtaW52LFxuXHRcdFx0XHRcdFx0ICAgIG1heHYsXG5cdFx0XHRcdFx0XHQgICAgbWlucCxcblx0XHRcdFx0XHRcdCAgICBtYXhwID0gMDtcblx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5vcHRpb25zLnRpY2tzX3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRpZiAocGVyY2VudGFnZSA8PSB0aGlzLm9wdGlvbnMudGlja3NfcG9zaXRpb25zW2ldKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWludiA9IHRoaXMub3B0aW9ucy50aWNrc1tpIC0gMV07XG5cdFx0XHRcdFx0XHRcdFx0bWlucCA9IHRoaXMub3B0aW9ucy50aWNrc19wb3NpdGlvbnNbaSAtIDFdO1xuXHRcdFx0XHRcdFx0XHRcdG1heHYgPSB0aGlzLm9wdGlvbnMudGlja3NbaV07XG5cdFx0XHRcdFx0XHRcdFx0bWF4cCA9IHRoaXMub3B0aW9ucy50aWNrc19wb3NpdGlvbnNbaV07XG5cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dmFyIHBhcnRpYWxQZXJjZW50YWdlID0gKHBlcmNlbnRhZ2UgLSBtaW5wKSAvIChtYXhwIC0gbWlucCk7XG5cdFx0XHRcdFx0XHRyYXdWYWx1ZSA9IG1pbnYgKyBwYXJ0aWFsUGVyY2VudGFnZSAqIChtYXh2IC0gbWludik7XG5cdFx0XHRcdFx0XHRzaG91bGRBZGp1c3RXaXRoQmFzZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBhZGp1c3RtZW50ID0gc2hvdWxkQWRqdXN0V2l0aEJhc2UgPyB0aGlzLm9wdGlvbnMubWluIDogMDtcblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBhZGp1c3RtZW50ICsgTWF0aC5yb3VuZChyYXdWYWx1ZSAvIHRoaXMub3B0aW9ucy5zdGVwKSAqIHRoaXMub3B0aW9ucy5zdGVwO1xuXHRcdFx0XHRcdHJldHVybiBTbGlkZXJTY2FsZS5saW5lYXIuZ2V0VmFsdWUodmFsdWUsIHRoaXMub3B0aW9ucyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRvUGVyY2VudGFnZTogZnVuY3Rpb24gdG9QZXJjZW50YWdlKHZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5tYXggPT09IHRoaXMub3B0aW9ucy5taW4pIHtcblx0XHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMudGlja3NfcG9zaXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHZhciBtaW52LFxuXHRcdFx0XHRcdFx0ICAgIG1heHYsXG5cdFx0XHRcdFx0XHQgICAgbWlucCxcblx0XHRcdFx0XHRcdCAgICBtYXhwID0gMDtcblx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRpY2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSA8PSB0aGlzLm9wdGlvbnMudGlja3NbaV0pIHtcblx0XHRcdFx0XHRcdFx0XHRtaW52ID0gaSA+IDAgPyB0aGlzLm9wdGlvbnMudGlja3NbaSAtIDFdIDogMDtcblx0XHRcdFx0XHRcdFx0XHRtaW5wID0gaSA+IDAgPyB0aGlzLm9wdGlvbnMudGlja3NfcG9zaXRpb25zW2kgLSAxXSA6IDA7XG5cdFx0XHRcdFx0XHRcdFx0bWF4diA9IHRoaXMub3B0aW9ucy50aWNrc1tpXTtcblx0XHRcdFx0XHRcdFx0XHRtYXhwID0gdGhpcy5vcHRpb25zLnRpY2tzX3Bvc2l0aW9uc1tpXTtcblxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHBhcnRpYWxQZXJjZW50YWdlID0gKHZhbHVlIC0gbWludikgLyAobWF4diAtIG1pbnYpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWlucCArIHBhcnRpYWxQZXJjZW50YWdlICogKG1heHAgLSBtaW5wKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gMTAwICogKHZhbHVlIC0gdGhpcy5vcHRpb25zLm1pbikgLyAodGhpcy5vcHRpb25zLm1heCAtIHRoaXMub3B0aW9ucy5taW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRsb2dhcml0aG1pYzoge1xuXHRcdFx0XHQvKiBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg0NjIyMS9sb2dhcml0aG1pYy1zbGlkZXIgKi9cblx0XHRcdFx0dG9WYWx1ZTogZnVuY3Rpb24gdG9WYWx1ZShwZXJjZW50YWdlKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IDEgLSB0aGlzLm9wdGlvbnMubWluO1xuXHRcdFx0XHRcdHZhciBtaW4gPSBNYXRoLmxvZyh0aGlzLm9wdGlvbnMubWluICsgb2Zmc2V0KTtcblx0XHRcdFx0XHR2YXIgbWF4ID0gTWF0aC5sb2codGhpcy5vcHRpb25zLm1heCArIG9mZnNldCk7XG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gTWF0aC5leHAobWluICsgKG1heCAtIG1pbikgKiBwZXJjZW50YWdlIC8gMTAwKSAtIG9mZnNldDtcblx0XHRcdFx0XHRpZiAoTWF0aC5yb3VuZCh2YWx1ZSkgPT09IG1heCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1heDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFsdWUgPSB0aGlzLm9wdGlvbnMubWluICsgTWF0aC5yb3VuZCgodmFsdWUgLSB0aGlzLm9wdGlvbnMubWluKSAvIHRoaXMub3B0aW9ucy5zdGVwKSAqIHRoaXMub3B0aW9ucy5zdGVwO1xuXHRcdFx0XHRcdC8qIFJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IHN0ZXAgY291bGQgZXhjZWVkIHRoZSBtaW4gb3JcbiAgICAgICogbWF4LCBzbyBjbGlwIHRvIHRob3NlIHZhbHVlcy4gKi9cblx0XHRcdFx0XHRyZXR1cm4gU2xpZGVyU2NhbGUubGluZWFyLmdldFZhbHVlKHZhbHVlLCB0aGlzLm9wdGlvbnMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0b1BlcmNlbnRhZ2U6IGZ1bmN0aW9uIHRvUGVyY2VudGFnZSh2YWx1ZSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMubWF4ID09PSB0aGlzLm9wdGlvbnMubWluKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IDEgLSB0aGlzLm9wdGlvbnMubWluO1xuXHRcdFx0XHRcdFx0dmFyIG1heCA9IE1hdGgubG9nKHRoaXMub3B0aW9ucy5tYXggKyBvZmZzZXQpO1xuXHRcdFx0XHRcdFx0dmFyIG1pbiA9IE1hdGgubG9nKHRoaXMub3B0aW9ucy5taW4gKyBvZmZzZXQpO1xuXHRcdFx0XHRcdFx0dmFyIHYgPSBNYXRoLmxvZyh2YWx1ZSArIG9mZnNldCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMTAwICogKHYgLSBtaW4pIC8gKG1heCAtIG1pbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIFx0XHRcdFx0XHRcdENPTlNUUlVDVE9SXG4gIFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdFx0U2xpZGVyID0gZnVuY3Rpb24gU2xpZGVyKGVsZW1lbnQsIG9wdGlvbnMpIHtcblx0XHRcdGNyZWF0ZU5ld1NsaWRlci5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGNyZWF0ZU5ld1NsaWRlcihlbGVtZW50LCBvcHRpb25zKSB7XG5cblx0XHRcdC8qXG4gICBcdFRoZSBpbnRlcm5hbCBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGFib3V0IHRoZSBjdXJyZW50ICdzdGF0ZScgb2Ygc2xpZGVyLlxuICAgXHRUaGlzIGluY2x1ZGVzIHZhbHVlcyBzdWNoIGFzIHRoZSBgdmFsdWVgLCBgZW5hYmxlZGAsIGV0Yy4uLlxuICAgKi9cblx0XHRcdHRoaXMuX3N0YXRlID0ge1xuXHRcdFx0XHR2YWx1ZTogbnVsbCxcblx0XHRcdFx0ZW5hYmxlZDogbnVsbCxcblx0XHRcdFx0b2Zmc2V0OiBudWxsLFxuXHRcdFx0XHRzaXplOiBudWxsLFxuXHRcdFx0XHRwZXJjZW50YWdlOiBudWxsLFxuXHRcdFx0XHRpbkRyYWc6IGZhbHNlLFxuXHRcdFx0XHRvdmVyOiBmYWxzZSxcblx0XHRcdFx0dGlja0luZGV4OiBudWxsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBUaGUgb2JqZWN0cyB1c2VkIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHRpY2sgbWV0aG9kcyBpZiB0aWNrc190b29sdGlwIGlzIG9uXG5cdFx0XHR0aGlzLnRpY2tzQ2FsbGJhY2tNYXAgPSB7fTtcblx0XHRcdHRoaXMuaGFuZGxlQ2FsbGJhY2tNYXAgPSB7fTtcblxuXHRcdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXHRcdFx0fVxuXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgXHRcdFx0XHRcdFByb2Nlc3MgT3B0aW9uc1xuICAgXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zID8gb3B0aW9ucyA6IHt9O1xuXHRcdFx0dmFyIG9wdGlvblR5cGVzID0gT2JqZWN0LmtleXModGhpcy5kZWZhdWx0T3B0aW9ucyk7XG5cblx0XHRcdHZhciBpc01pblNldCA9IG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ21pbicpO1xuXHRcdFx0dmFyIGlzTWF4U2V0ID0gb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbWF4Jyk7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uVHlwZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIG9wdE5hbWUgPSBvcHRpb25UeXBlc1tpXTtcblxuXHRcdFx0XHQvLyBGaXJzdCBjaGVjayBpZiBhbiBvcHRpb24gd2FzIHBhc3NlZCBpbiB2aWEgdGhlIGNvbnN0cnVjdG9yXG5cdFx0XHRcdHZhciB2YWwgPSBvcHRpb25zW29wdE5hbWVdO1xuXHRcdFx0XHQvLyBJZiBubyBkYXRhIGF0dHJpYiwgdGhlbiBjaGVjayBkYXRhIGF0cnJpYnV0ZXNcblx0XHRcdFx0dmFsID0gdHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcgPyB2YWwgOiBnZXREYXRhQXR0cmliKHRoaXMuZWxlbWVudCwgb3B0TmFtZSk7XG5cdFx0XHRcdC8vIEZpbmFsbHksIGlmIG5vdGhpbmcgd2FzIHNwZWNpZmllZCwgdXNlIHRoZSBkZWZhdWx0c1xuXHRcdFx0XHR2YWwgPSB2YWwgIT09IG51bGwgPyB2YWwgOiB0aGlzLmRlZmF1bHRPcHRpb25zW29wdE5hbWVdO1xuXG5cdFx0XHRcdC8vIFNldCBhbGwgb3B0aW9ucyBvbiB0aGUgaW5zdGFuY2Ugb2YgdGhlIFNsaWRlclxuXHRcdFx0XHRpZiAoIXRoaXMub3B0aW9ucykge1xuXHRcdFx0XHRcdHRoaXMub3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMub3B0aW9uc1tvcHROYW1lXSA9IHZhbDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy50aWNrc0FyZVZhbGlkID0gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMudGlja3MpICYmIHRoaXMub3B0aW9ucy50aWNrcy5sZW5ndGggPiAwO1xuXG5cdFx0XHQvLyBMb2NrIHRvIHRpY2tzIG9ubHkgd2hlbiB0aWNrc1tdIGlzIGRlZmluZWQgYW5kIHNldFxuXHRcdFx0aWYgKCF0aGlzLnRpY2tzQXJlVmFsaWQpIHtcblx0XHRcdFx0dGhpcy5vcHRpb25zLmxvY2tfdG9fdGlja3MgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2sgb3B0aW9ucy5ydGxcblx0XHRcdGlmICh0aGlzLm9wdGlvbnMucnRsID09PSAnYXV0bycpIHtcblx0XHRcdFx0dmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpO1xuXHRcdFx0XHRpZiAoY29tcHV0ZWRTdHlsZSAhPSBudWxsKSB7XG5cdFx0XHRcdFx0dGhpcy5vcHRpb25zLnJ0bCA9IGNvbXB1dGVkU3R5bGUuZGlyZWN0aW9uID09PSAncnRsJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBGaXggZm9yIEZpcmVmb3ggYnVnIGluIHZlcnNpb25zIGxlc3MgdGhhbiA2Mjpcblx0XHRcdFx0XHQvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NDgzOTdcblx0XHRcdFx0XHQvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDY3NzIyXG5cdFx0XHRcdFx0dGhpcy5vcHRpb25zLnJ0bCA9IHRoaXMuZWxlbWVudC5zdHlsZS5kaXJlY3Rpb24gPT09ICdydGwnO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8qXG4gICBcdFZhbGlkYXRlIGB0b29sdGlwX3Bvc2l0aW9uYCBhZ2FpbnN0ICdvcmllbnRhdGlvbmBcbiAgIFx0LSBpZiBgdG9vbHRpcF9wb3NpdGlvbmAgaXMgaW5jb21wYXRpYmxlIHdpdGggb3JpZW50YXRpb24sIHN3aXRjaCBpdCB0byBhIGRlZmF1bHQgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBgb3JpZW50YXRpb25gXG4gICBcdFx0LS0gZGVmYXVsdCBmb3IgXCJ2ZXJ0aWNhbFwiIC0+IFwicmlnaHRcIiwgXCJsZWZ0XCIgaWYgcnRsXG4gICBcdFx0LS0gZGVmYXVsdCBmb3IgXCJob3Jpem9udGFsXCIgLT4gXCJ0b3BcIlxuICAgKi9cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiAmJiAodGhpcy5vcHRpb25zLnRvb2x0aXBfcG9zaXRpb24gPT09IFwidG9wXCIgfHwgdGhpcy5vcHRpb25zLnRvb2x0aXBfcG9zaXRpb24gPT09IFwiYm90dG9tXCIpKSB7XG5cdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG5cdFx0XHRcdFx0dGhpcy5vcHRpb25zLnRvb2x0aXBfcG9zaXRpb24gPSBcImxlZnRcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMudG9vbHRpcF9wb3NpdGlvbiA9IFwicmlnaHRcIjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiICYmICh0aGlzLm9wdGlvbnMudG9vbHRpcF9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnRvb2x0aXBfcG9zaXRpb24gPT09IFwicmlnaHRcIikpIHtcblxuXHRcdFx0XHR0aGlzLm9wdGlvbnMudG9vbHRpcF9wb3NpdGlvbiA9IFwidG9wXCI7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGdldERhdGFBdHRyaWIoZWxlbWVudCwgb3B0TmFtZSkge1xuXHRcdFx0XHR2YXIgZGF0YU5hbWUgPSBcImRhdGEtc2xpZGVyLVwiICsgb3B0TmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG5cdFx0XHRcdHZhciBkYXRhVmFsU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoZGF0YU5hbWUpO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmV0dXJuIEpTT04ucGFyc2UoZGF0YVZhbFN0cmluZyk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhVmFsU3RyaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICBcdFx0XHRcdFx0Q3JlYXRlIE1hcmt1cFxuICAgXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXHRcdFx0dmFyIG9yaWdXaWR0aCA9IHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aDtcblx0XHRcdHZhciB1cGRhdGVTbGlkZXIgPSBmYWxzZTtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZTtcblx0XHRcdHZhciBzbGlkZXJUcmFja1NlbGVjdGlvbjtcblx0XHRcdHZhciBzbGlkZXJUcmFja0xvdywgc2xpZGVyVHJhY2tIaWdoO1xuXHRcdFx0dmFyIHNsaWRlck1pbkhhbmRsZTtcblx0XHRcdHZhciBzbGlkZXJNYXhIYW5kbGU7XG5cblx0XHRcdGlmICh0aGlzLnNsaWRlckVsZW0pIHtcblx0XHRcdFx0dXBkYXRlU2xpZGVyID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8qIENyZWF0ZSBlbGVtZW50cyBuZWVkZWQgZm9yIHNsaWRlciAqL1xuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uY2xhc3NOYW1lID0gXCJzbGlkZXJcIjtcblxuXHRcdFx0XHQvKiBDcmVhdGUgc2xpZGVyIHRyYWNrIGVsZW1lbnRzICovXG5cdFx0XHRcdHZhciBzbGlkZXJUcmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdHNsaWRlclRyYWNrLmNsYXNzTmFtZSA9IFwic2xpZGVyLXRyYWNrXCI7XG5cblx0XHRcdFx0c2xpZGVyVHJhY2tMb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRzbGlkZXJUcmFja0xvdy5jbGFzc05hbWUgPSBcInNsaWRlci10cmFjay1sb3dcIjtcblxuXHRcdFx0XHRzbGlkZXJUcmFja1NlbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdHNsaWRlclRyYWNrU2VsZWN0aW9uLmNsYXNzTmFtZSA9IFwic2xpZGVyLXNlbGVjdGlvblwiO1xuXG5cdFx0XHRcdHNsaWRlclRyYWNrSGlnaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdHNsaWRlclRyYWNrSGlnaC5jbGFzc05hbWUgPSBcInNsaWRlci10cmFjay1oaWdoXCI7XG5cblx0XHRcdFx0c2xpZGVyTWluSGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0c2xpZGVyTWluSGFuZGxlLmNsYXNzTmFtZSA9IFwic2xpZGVyLWhhbmRsZSBtaW4tc2xpZGVyLWhhbmRsZVwiO1xuXHRcdFx0XHRzbGlkZXJNaW5IYW5kbGUuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NsaWRlcicpO1xuXHRcdFx0XHRzbGlkZXJNaW5IYW5kbGUuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWluJywgdGhpcy5vcHRpb25zLm1pbik7XG5cdFx0XHRcdHNsaWRlck1pbkhhbmRsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCB0aGlzLm9wdGlvbnMubWF4KTtcblxuXHRcdFx0XHRzbGlkZXJNYXhIYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRzbGlkZXJNYXhIYW5kbGUuY2xhc3NOYW1lID0gXCJzbGlkZXItaGFuZGxlIG1heC1zbGlkZXItaGFuZGxlXCI7XG5cdFx0XHRcdHNsaWRlck1heEhhbmRsZS5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc2xpZGVyJyk7XG5cdFx0XHRcdHNsaWRlck1heEhhbmRsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCB0aGlzLm9wdGlvbnMubWluKTtcblx0XHRcdFx0c2xpZGVyTWF4SGFuZGxlLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsIHRoaXMub3B0aW9ucy5tYXgpO1xuXG5cdFx0XHRcdHNsaWRlclRyYWNrLmFwcGVuZENoaWxkKHNsaWRlclRyYWNrTG93KTtcblx0XHRcdFx0c2xpZGVyVHJhY2suYXBwZW5kQ2hpbGQoc2xpZGVyVHJhY2tTZWxlY3Rpb24pO1xuXHRcdFx0XHRzbGlkZXJUcmFjay5hcHBlbmRDaGlsZChzbGlkZXJUcmFja0hpZ2gpO1xuXG5cdFx0XHRcdC8qIENyZWF0ZSBoaWdobGlnaHQgcmFuZ2UgZWxlbWVudHMgKi9cblx0XHRcdFx0dGhpcy5yYW5nZUhpZ2hsaWdodEVsZW1lbnRzID0gW107XG5cdFx0XHRcdHZhciByYW5nZUhpZ2hsaWdodHNPcHRzID0gdGhpcy5vcHRpb25zLnJhbmdlSGlnaGxpZ2h0cztcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkocmFuZ2VIaWdobGlnaHRzT3B0cykgJiYgcmFuZ2VIaWdobGlnaHRzT3B0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCByYW5nZUhpZ2hsaWdodHNPcHRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmFuZ2VIaWdobGlnaHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0XHRcdHZhciBjdXN0b21DbGFzc1N0cmluZyA9IHJhbmdlSGlnaGxpZ2h0c09wdHNbal0uY2xhc3MgfHwgXCJcIjtcblx0XHRcdFx0XHRcdHJhbmdlSGlnaGxpZ2h0RWxlbWVudC5jbGFzc05hbWUgPSBcInNsaWRlci1yYW5nZUhpZ2hsaWdodCBzbGlkZXItc2VsZWN0aW9uIFwiICsgY3VzdG9tQ2xhc3NTdHJpbmc7XG5cdFx0XHRcdFx0XHR0aGlzLnJhbmdlSGlnaGxpZ2h0RWxlbWVudHMucHVzaChyYW5nZUhpZ2hsaWdodEVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0c2xpZGVyVHJhY2suYXBwZW5kQ2hpbGQocmFuZ2VIaWdobGlnaHRFbGVtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKiBBZGQgYXJpYS1sYWJlbGxlZGJ5IHRvIGhhbmRsZSdzICovXG5cdFx0XHRcdHZhciBpc0xhYmVsbGVkYnlBcnJheSA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmxhYmVsbGVkYnkpO1xuXHRcdFx0XHRpZiAoaXNMYWJlbGxlZGJ5QXJyYXkgJiYgdGhpcy5vcHRpb25zLmxhYmVsbGVkYnlbMF0pIHtcblx0XHRcdFx0XHRzbGlkZXJNaW5IYW5kbGUuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCB0aGlzLm9wdGlvbnMubGFiZWxsZWRieVswXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlzTGFiZWxsZWRieUFycmF5ICYmIHRoaXMub3B0aW9ucy5sYWJlbGxlZGJ5WzFdKSB7XG5cdFx0XHRcdFx0c2xpZGVyTWF4SGFuZGxlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy5vcHRpb25zLmxhYmVsbGVkYnlbMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghaXNMYWJlbGxlZGJ5QXJyYXkgJiYgdGhpcy5vcHRpb25zLmxhYmVsbGVkYnkpIHtcblx0XHRcdFx0XHRzbGlkZXJNaW5IYW5kbGUuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCB0aGlzLm9wdGlvbnMubGFiZWxsZWRieSk7XG5cdFx0XHRcdFx0c2xpZGVyTWF4SGFuZGxlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy5vcHRpb25zLmxhYmVsbGVkYnkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyogQ3JlYXRlIHRpY2tzICovXG5cdFx0XHRcdHRoaXMudGlja3MgPSBbXTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLnRpY2tzKSAmJiB0aGlzLm9wdGlvbnMudGlja3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRoaXMudGlja3NDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHR0aGlzLnRpY2tzQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzbGlkZXItdGljay1jb250YWluZXInO1xuXG5cdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMub3B0aW9ucy50aWNrcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0dmFyIHRpY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHRcdHRpY2suY2xhc3NOYW1lID0gJ3NsaWRlci10aWNrJztcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMudGlja3NfdG9vbHRpcCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGlja0xpc3RlbmVyUmVmZXJlbmNlID0gdGhpcy5fYWRkVGlja0xpc3RlbmVyKCk7XG5cdFx0XHRcdFx0XHRcdHZhciBlbnRlckNhbGxiYWNrID0gdGlja0xpc3RlbmVyUmVmZXJlbmNlLmFkZE1vdXNlRW50ZXIodGhpcywgdGljaywgaSk7XG5cdFx0XHRcdFx0XHRcdHZhciBsZWF2ZUNhbGxiYWNrID0gdGlja0xpc3RlbmVyUmVmZXJlbmNlLmFkZE1vdXNlTGVhdmUodGhpcywgdGljayk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50aWNrc0NhbGxiYWNrTWFwW2ldID0ge1xuXHRcdFx0XHRcdFx0XHRcdG1vdXNlRW50ZXI6IGVudGVyQ2FsbGJhY2ssXG5cdFx0XHRcdFx0XHRcdFx0bW91c2VMZWF2ZTogbGVhdmVDYWxsYmFja1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy50aWNrcy5wdXNoKHRpY2spO1xuXHRcdFx0XHRcdFx0dGhpcy50aWNrc0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aWNrKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzbGlkZXJUcmFja1NlbGVjdGlvbi5jbGFzc05hbWUgKz0gXCIgdGljay1zbGlkZXItc2VsZWN0aW9uXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRpY2tMYWJlbHMgPSBbXTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLnRpY2tzX2xhYmVscykgJiYgdGhpcy5vcHRpb25zLnRpY2tzX2xhYmVscy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy50aWNrTGFiZWxDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHR0aGlzLnRpY2tMYWJlbENvbnRhaW5lci5jbGFzc05hbWUgPSAnc2xpZGVyLXRpY2stbGFiZWwtY29udGFpbmVyJztcblxuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMudGlja3NfbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHRcdHZhciBub1RpY2tQb3NpdGlvbnNTcGVjaWZpZWQgPSB0aGlzLm9wdGlvbnMudGlja3NfcG9zaXRpb25zLmxlbmd0aCA9PT0gMDtcblx0XHRcdFx0XHRcdHZhciB0aWNrTGFiZWxzSW5kZXggPSB0aGlzLm9wdGlvbnMucmV2ZXJzZWQgJiYgbm9UaWNrUG9zaXRpb25zU3BlY2lmaWVkID8gdGhpcy5vcHRpb25zLnRpY2tzX2xhYmVscy5sZW5ndGggLSAoaSArIDEpIDogaTtcblx0XHRcdFx0XHRcdGxhYmVsLmNsYXNzTmFtZSA9ICdzbGlkZXItdGljay1sYWJlbCc7XG5cdFx0XHRcdFx0XHRsYWJlbC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGlja3NfbGFiZWxzW3RpY2tMYWJlbHNJbmRleF07XG5cblx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVscy5wdXNoKGxhYmVsKTtcblx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVsQ29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY3JlYXRlQW5kQXBwZW5kVG9vbHRpcFN1YkVsZW1lbnRzID0gZnVuY3Rpb24gY3JlYXRlQW5kQXBwZW5kVG9vbHRpcFN1YkVsZW1lbnRzKHRvb2x0aXBFbGVtKSB7XG5cdFx0XHRcdFx0dmFyIGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0XHRhcnJvdy5jbGFzc05hbWUgPSBcImFycm93XCI7XG5cblx0XHRcdFx0XHR2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRcdGlubmVyLmNsYXNzTmFtZSA9IFwidG9vbHRpcC1pbm5lclwiO1xuXG5cdFx0XHRcdFx0dG9vbHRpcEVsZW0uYXBwZW5kQ2hpbGQoYXJyb3cpO1xuXHRcdFx0XHRcdHRvb2x0aXBFbGVtLmFwcGVuZENoaWxkKGlubmVyKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvKiBDcmVhdGUgdG9vbHRpcCBlbGVtZW50cyAqL1xuXHRcdFx0XHR2YXIgc2xpZGVyVG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdHNsaWRlclRvb2x0aXAuY2xhc3NOYW1lID0gXCJ0b29sdGlwIHRvb2x0aXAtbWFpblwiO1xuXHRcdFx0XHRzbGlkZXJUb29sdGlwLnNldEF0dHJpYnV0ZSgncm9sZScsICdwcmVzZW50YXRpb24nKTtcblx0XHRcdFx0Y3JlYXRlQW5kQXBwZW5kVG9vbHRpcFN1YkVsZW1lbnRzKHNsaWRlclRvb2x0aXApO1xuXG5cdFx0XHRcdHZhciBzbGlkZXJUb29sdGlwTWluID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0c2xpZGVyVG9vbHRpcE1pbi5jbGFzc05hbWUgPSBcInRvb2x0aXAgdG9vbHRpcC1taW5cIjtcblx0XHRcdFx0c2xpZGVyVG9vbHRpcE1pbi5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJlc2VudGF0aW9uJyk7XG5cdFx0XHRcdGNyZWF0ZUFuZEFwcGVuZFRvb2x0aXBTdWJFbGVtZW50cyhzbGlkZXJUb29sdGlwTWluKTtcblxuXHRcdFx0XHR2YXIgc2xpZGVyVG9vbHRpcE1heCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdHNsaWRlclRvb2x0aXBNYXguY2xhc3NOYW1lID0gXCJ0b29sdGlwIHRvb2x0aXAtbWF4XCI7XG5cdFx0XHRcdHNsaWRlclRvb2x0aXBNYXguc2V0QXR0cmlidXRlKCdyb2xlJywgJ3ByZXNlbnRhdGlvbicpO1xuXHRcdFx0XHRjcmVhdGVBbmRBcHBlbmRUb29sdGlwU3ViRWxlbWVudHMoc2xpZGVyVG9vbHRpcE1heCk7XG5cblx0XHRcdFx0LyogQXBwZW5kIGNvbXBvbmVudHMgdG8gc2xpZGVyRWxlbSAqL1xuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYXBwZW5kQ2hpbGQoc2xpZGVyVHJhY2spO1xuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYXBwZW5kQ2hpbGQoc2xpZGVyVG9vbHRpcCk7XG5cdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5hcHBlbmRDaGlsZChzbGlkZXJUb29sdGlwTWluKTtcblx0XHRcdFx0dGhpcy5zbGlkZXJFbGVtLmFwcGVuZENoaWxkKHNsaWRlclRvb2x0aXBNYXgpO1xuXG5cdFx0XHRcdGlmICh0aGlzLnRpY2tMYWJlbENvbnRhaW5lcikge1xuXHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnRpY2tMYWJlbENvbnRhaW5lcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMudGlja3NDb250YWluZXIpIHtcblx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYXBwZW5kQ2hpbGQodGhpcy50aWNrc0NvbnRhaW5lcik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYXBwZW5kQ2hpbGQoc2xpZGVyTWluSGFuZGxlKTtcblx0XHRcdFx0dGhpcy5zbGlkZXJFbGVtLmFwcGVuZENoaWxkKHNsaWRlck1heEhhbmRsZSk7XG5cblx0XHRcdFx0LyogQXBwZW5kIHNsaWRlciBlbGVtZW50IHRvIHBhcmVudCBjb250YWluZXIsIHJpZ2h0IGJlZm9yZSB0aGUgb3JpZ2luYWwgPGlucHV0PiBlbGVtZW50ICovXG5cdFx0XHRcdHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5zbGlkZXJFbGVtLCB0aGlzLmVsZW1lbnQpO1xuXG5cdFx0XHRcdC8qIEhpZGUgb3JpZ2luYWwgPGlucHV0PiBlbGVtZW50ICovXG5cdFx0XHRcdHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHR9XG5cdFx0XHQvKiBJZiBKUXVlcnkgZXhpc3RzLCBjYWNoZSBKUSByZWZlcmVuY2VzICovXG5cdFx0XHRpZiAoJCkge1xuXHRcdFx0XHR0aGlzLiRlbGVtZW50ID0gJCh0aGlzLmVsZW1lbnQpO1xuXHRcdFx0XHR0aGlzLiRzbGlkZXJFbGVtID0gJCh0aGlzLnNsaWRlckVsZW0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgXHRcdFx0XHRcdFx0U2V0dXBcbiAgIFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdFx0XHR0aGlzLmV2ZW50VG9DYWxsYmFja01hcCA9IHt9O1xuXHRcdFx0dGhpcy5zbGlkZXJFbGVtLmlkID0gdGhpcy5vcHRpb25zLmlkO1xuXG5cdFx0XHR0aGlzLnRvdWNoQ2FwYWJsZSA9ICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIHdpbmRvdy5Eb2N1bWVudFRvdWNoO1xuXG5cdFx0XHR0aGlzLnRvdWNoWCA9IDA7XG5cdFx0XHR0aGlzLnRvdWNoWSA9IDA7XG5cblx0XHRcdHRoaXMudG9vbHRpcCA9IHRoaXMuc2xpZGVyRWxlbS5xdWVyeVNlbGVjdG9yKCcudG9vbHRpcC1tYWluJyk7XG5cdFx0XHR0aGlzLnRvb2x0aXBJbm5lciA9IHRoaXMudG9vbHRpcC5xdWVyeVNlbGVjdG9yKCcudG9vbHRpcC1pbm5lcicpO1xuXG5cdFx0XHR0aGlzLnRvb2x0aXBfbWluID0gdGhpcy5zbGlkZXJFbGVtLnF1ZXJ5U2VsZWN0b3IoJy50b29sdGlwLW1pbicpO1xuXHRcdFx0dGhpcy50b29sdGlwSW5uZXJfbWluID0gdGhpcy50b29sdGlwX21pbi5xdWVyeVNlbGVjdG9yKCcudG9vbHRpcC1pbm5lcicpO1xuXG5cdFx0XHR0aGlzLnRvb2x0aXBfbWF4ID0gdGhpcy5zbGlkZXJFbGVtLnF1ZXJ5U2VsZWN0b3IoJy50b29sdGlwLW1heCcpO1xuXHRcdFx0dGhpcy50b29sdGlwSW5uZXJfbWF4ID0gdGhpcy50b29sdGlwX21heC5xdWVyeVNlbGVjdG9yKCcudG9vbHRpcC1pbm5lcicpO1xuXG5cdFx0XHRpZiAoU2xpZGVyU2NhbGVbdGhpcy5vcHRpb25zLnNjYWxlXSkge1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMuc2NhbGUgPSBTbGlkZXJTY2FsZVt0aGlzLm9wdGlvbnMuc2NhbGVdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodXBkYXRlU2xpZGVyID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIFJlc2V0IGNsYXNzZXNcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5zbGlkZXJFbGVtLCAnc2xpZGVyLWhvcml6b250YWwnKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5zbGlkZXJFbGVtLCAnc2xpZGVyLXZlcnRpY2FsJyk7XG5cdFx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMuc2xpZGVyRWxlbSwgJ3NsaWRlci1ydGwnKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50b29sdGlwLCAnaGlkZScpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXBfbWluLCAnaGlkZScpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXBfbWF4LCAnaGlkZScpO1xuXG5cdFx0XHRcdC8vIFVuZG8gZXhpc3RpbmcgaW5saW5lIHN0eWxlcyBmb3IgdHJhY2tcblx0XHRcdFx0W1wibGVmdFwiLCBcInJpZ2h0XCIsIFwidG9wXCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnR5KHRoaXMudHJhY2tMb3csIHByb3ApO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnR5KHRoaXMudHJhY2tTZWxlY3Rpb24sIHByb3ApO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnR5KHRoaXMudHJhY2tIaWdoLCBwcm9wKTtcblx0XHRcdFx0fSwgdGhpcyk7XG5cblx0XHRcdFx0Ly8gVW5kbyBpbmxpbmUgc3R5bGVzIG9uIGhhbmRsZXNcblx0XHRcdFx0W3RoaXMuaGFuZGxlMSwgdGhpcy5oYW5kbGUyXS5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGUpIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0eShoYW5kbGUsICdsZWZ0Jyk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydHkoaGFuZGxlLCAncmlnaHQnKTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0eShoYW5kbGUsICd0b3AnKTtcblx0XHRcdFx0fSwgdGhpcyk7XG5cblx0XHRcdFx0Ly8gVW5kbyBpbmxpbmUgc3R5bGVzIGFuZCBjbGFzc2VzIG9uIHRvb2x0aXBzXG5cdFx0XHRcdFt0aGlzLnRvb2x0aXAsIHRoaXMudG9vbHRpcF9taW4sIHRoaXMudG9vbHRpcF9tYXhdLmZvckVhY2goZnVuY3Rpb24gKHRvb2x0aXApIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0eSh0b29sdGlwLCAnYnMtdG9vbHRpcC1sZWZ0Jyk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydHkodG9vbHRpcCwgJ2JzLXRvb2x0aXAtcmlnaHQnKTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0eSh0b29sdGlwLCAnYnMtdG9vbHRpcC10b3AnKTtcblxuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKHRvb2x0aXAsICdicy10b29sdGlwLXJpZ2h0Jyk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModG9vbHRpcCwgJ2JzLXRvb2x0aXAtbGVmdCcpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKHRvb2x0aXAsICdicy10b29sdGlwLXRvcCcpO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuXHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0aGlzLnNsaWRlckVsZW0sICdzbGlkZXItdmVydGljYWwnKTtcblx0XHRcdFx0dGhpcy5zdHlsZVBvcyA9ICd0b3AnO1xuXHRcdFx0XHR0aGlzLm1vdXNlUG9zID0gJ3BhZ2VZJztcblx0XHRcdFx0dGhpcy5zaXplUG9zID0gJ29mZnNldEhlaWdodCc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0aGlzLnNsaWRlckVsZW0sICdzbGlkZXItaG9yaXpvbnRhbCcpO1xuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uc3R5bGUud2lkdGggPSBvcmlnV2lkdGg7XG5cdFx0XHRcdHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcblx0XHRcdFx0XHR0aGlzLnN0eWxlUG9zID0gJ3JpZ2h0Jztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnN0eWxlUG9zID0gJ2xlZnQnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMubW91c2VQb3MgPSAnY2xpZW50WCc7XG5cdFx0XHRcdHRoaXMuc2l6ZVBvcyA9ICdvZmZzZXRXaWR0aCc7XG5cdFx0XHR9XG5cdFx0XHQvLyBzcGVjaWZpYyBydGwgY2xhc3Ncblx0XHRcdGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMuc2xpZGVyRWxlbSwgJ3NsaWRlci1ydGwnKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NldFRvb2x0aXBQb3NpdGlvbigpO1xuXHRcdFx0LyogSW4gY2FzZSB0aWNrcyBhcmUgc3BlY2lmaWVkLCBvdmVyd3JpdGUgdGhlIG1pbiBhbmQgbWF4IGJvdW5kcyAqL1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLnRpY2tzKSAmJiB0aGlzLm9wdGlvbnMudGlja3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRpZiAoIWlzTWF4U2V0KSB7XG5cdFx0XHRcdFx0dGhpcy5vcHRpb25zLm1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIHRoaXMub3B0aW9ucy50aWNrcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFpc01pblNldCkge1xuXHRcdFx0XHRcdHRoaXMub3B0aW9ucy5taW4gPSBNYXRoLm1pbi5hcHBseShNYXRoLCB0aGlzLm9wdGlvbnMudGlja3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy52YWx1ZSkpIHtcblx0XHRcdFx0dGhpcy5vcHRpb25zLnJhbmdlID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fc3RhdGUudmFsdWUgPSB0aGlzLm9wdGlvbnMudmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5yYW5nZSkge1xuXHRcdFx0XHQvLyBVc2VyIHdhbnRzIGEgcmFuZ2UsIGJ1dCB2YWx1ZSBpcyBub3QgYW4gYXJyYXlcblx0XHRcdFx0dGhpcy5fc3RhdGUudmFsdWUgPSBbdGhpcy5vcHRpb25zLnZhbHVlLCB0aGlzLm9wdGlvbnMubWF4XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3N0YXRlLnZhbHVlID0gdGhpcy5vcHRpb25zLnZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnRyYWNrTG93ID0gc2xpZGVyVHJhY2tMb3cgfHwgdGhpcy50cmFja0xvdztcblx0XHRcdHRoaXMudHJhY2tTZWxlY3Rpb24gPSBzbGlkZXJUcmFja1NlbGVjdGlvbiB8fCB0aGlzLnRyYWNrU2VsZWN0aW9uO1xuXHRcdFx0dGhpcy50cmFja0hpZ2ggPSBzbGlkZXJUcmFja0hpZ2ggfHwgdGhpcy50cmFja0hpZ2g7XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0aW9uID09PSAnbm9uZScpIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50cmFja0xvdywgJ2hpZGUnKTtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50cmFja1NlbGVjdGlvbiwgJ2hpZGUnKTtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50cmFja0hpZ2gsICdoaWRlJyk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zZWxlY3Rpb24gPT09ICdhZnRlcicgfHwgdGhpcy5vcHRpb25zLnNlbGVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50cmFja0xvdywgJ2hpZGUnKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50cmFja1NlbGVjdGlvbiwgJ2hpZGUnKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50cmFja0hpZ2gsICdoaWRlJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlMSA9IHNsaWRlck1pbkhhbmRsZSB8fCB0aGlzLmhhbmRsZTE7XG5cdFx0XHR0aGlzLmhhbmRsZTIgPSBzbGlkZXJNYXhIYW5kbGUgfHwgdGhpcy5oYW5kbGUyO1xuXG5cdFx0XHRpZiAodXBkYXRlU2xpZGVyID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIFJlc2V0IGNsYXNzZXNcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGUxLCAncm91bmQgdHJpYW5nbGUnKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGUyLCAncm91bmQgdHJpYW5nbGUgaGlkZScpO1xuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLnRpY2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50aWNrc1tpXSwgJ3JvdW5kIHRyaWFuZ2xlIGhpZGUnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYXZhaWxhYmxlSGFuZGxlTW9kaWZpZXJzID0gWydyb3VuZCcsICd0cmlhbmdsZScsICdjdXN0b20nXTtcblx0XHRcdHZhciBpc1ZhbGlkSGFuZGxlVHlwZSA9IGF2YWlsYWJsZUhhbmRsZU1vZGlmaWVycy5pbmRleE9mKHRoaXMub3B0aW9ucy5oYW5kbGUpICE9PSAtMTtcblx0XHRcdGlmIChpc1ZhbGlkSGFuZGxlVHlwZSkge1xuXHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0aGlzLmhhbmRsZTEsIHRoaXMub3B0aW9ucy5oYW5kbGUpO1xuXHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0aGlzLmhhbmRsZTIsIHRoaXMub3B0aW9ucy5oYW5kbGUpO1xuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLnRpY2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50aWNrc1tpXSwgdGhpcy5vcHRpb25zLmhhbmRsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc3RhdGUub2Zmc2V0ID0gdGhpcy5fb2Zmc2V0KHRoaXMuc2xpZGVyRWxlbSk7XG5cdFx0XHR0aGlzLl9zdGF0ZS5zaXplID0gdGhpcy5zbGlkZXJFbGVtW3RoaXMuc2l6ZVBvc107XG5cdFx0XHR0aGlzLnNldFZhbHVlKHRoaXMuX3N0YXRlLnZhbHVlKTtcblxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgXHRcdFx0XHRCaW5kIEV2ZW50IExpc3RlbmVyc1xuICAgXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblx0XHRcdC8vIEJpbmQga2V5Ym9hcmQgaGFuZGxlcnNcblx0XHRcdHRoaXMuaGFuZGxlMUtleWRvd24gPSB0aGlzLl9rZXlkb3duLmJpbmQodGhpcywgMCk7XG5cdFx0XHR0aGlzLmhhbmRsZTEuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5oYW5kbGUxS2V5ZG93biwgZmFsc2UpO1xuXG5cdFx0XHR0aGlzLmhhbmRsZTJLZXlkb3duID0gdGhpcy5fa2V5ZG93bi5iaW5kKHRoaXMsIDEpO1xuXHRcdFx0dGhpcy5oYW5kbGUyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlMktleWRvd24sIGZhbHNlKTtcblxuXHRcdFx0dGhpcy5tb3VzZWRvd24gPSB0aGlzLl9tb3VzZWRvd24uYmluZCh0aGlzKTtcblx0XHRcdHRoaXMudG91Y2hzdGFydCA9IHRoaXMuX3RvdWNoc3RhcnQuYmluZCh0aGlzKTtcblx0XHRcdHRoaXMudG91Y2htb3ZlID0gdGhpcy5fdG91Y2htb3ZlLmJpbmQodGhpcyk7XG5cblx0XHRcdGlmICh0aGlzLnRvdWNoQ2FwYWJsZSkge1xuXHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy50b3VjaHN0YXJ0LCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRoaXMudG91Y2htb3ZlLCBmYWxzZSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2xpZGVyRWxlbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMubW91c2Vkb3duLCBmYWxzZSk7XG5cblx0XHRcdC8vIEJpbmQgd2luZG93IGhhbmRsZXJzXG5cdFx0XHR0aGlzLnJlc2l6ZSA9IHRoaXMuX3Jlc2l6ZS5iaW5kKHRoaXMpO1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5yZXNpemUsIGZhbHNlKTtcblxuXHRcdFx0Ly8gQmluZCB0b29sdGlwLXJlbGF0ZWQgaGFuZGxlcnNcblx0XHRcdGlmICh0aGlzLm9wdGlvbnMudG9vbHRpcCA9PT0gJ2hpZGUnKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudG9vbHRpcCwgJ2hpZGUnKTtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50b29sdGlwX21pbiwgJ2hpZGUnKTtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50b29sdGlwX21heCwgJ2hpZGUnKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2x0aXAgPT09ICdhbHdheXMnKSB7XG5cdFx0XHRcdHRoaXMuX3Nob3dUb29sdGlwKCk7XG5cdFx0XHRcdHRoaXMuX2Fsd2F5c1Nob3dUb29sdGlwID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc2hvd1Rvb2x0aXAgPSB0aGlzLl9zaG93VG9vbHRpcC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLmhpZGVUb29sdGlwID0gdGhpcy5faGlkZVRvb2x0aXAuYmluZCh0aGlzKTtcblxuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnRpY2tzX3Rvb2x0aXApIHtcblx0XHRcdFx0XHR2YXIgY2FsbGJhY2tIYW5kbGUgPSB0aGlzLl9hZGRUaWNrTGlzdGVuZXIoKTtcblx0XHRcdFx0XHQvL2NyZWF0ZSBoYW5kbGUxIGxpc3RlbmVycyBhbmQgc3RvcmUgcmVmZXJlbmNlcyBpbiBtYXBcblx0XHRcdFx0XHR2YXIgbW91c2VFbnRlciA9IGNhbGxiYWNrSGFuZGxlLmFkZE1vdXNlRW50ZXIodGhpcywgdGhpcy5oYW5kbGUxKTtcblx0XHRcdFx0XHR2YXIgbW91c2VMZWF2ZSA9IGNhbGxiYWNrSGFuZGxlLmFkZE1vdXNlTGVhdmUodGhpcywgdGhpcy5oYW5kbGUxKTtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZUNhbGxiYWNrTWFwLmhhbmRsZTEgPSB7XG5cdFx0XHRcdFx0XHRtb3VzZUVudGVyOiBtb3VzZUVudGVyLFxuXHRcdFx0XHRcdFx0bW91c2VMZWF2ZTogbW91c2VMZWF2ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Ly9jcmVhdGUgaGFuZGxlMiBsaXN0ZW5lcnMgYW5kIHN0b3JlIHJlZmVyZW5jZXMgaW4gbWFwXG5cdFx0XHRcdFx0bW91c2VFbnRlciA9IGNhbGxiYWNrSGFuZGxlLmFkZE1vdXNlRW50ZXIodGhpcywgdGhpcy5oYW5kbGUyKTtcblx0XHRcdFx0XHRtb3VzZUxlYXZlID0gY2FsbGJhY2tIYW5kbGUuYWRkTW91c2VMZWF2ZSh0aGlzLCB0aGlzLmhhbmRsZTIpO1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlQ2FsbGJhY2tNYXAuaGFuZGxlMiA9IHtcblx0XHRcdFx0XHRcdG1vdXNlRW50ZXI6IG1vdXNlRW50ZXIsXG5cdFx0XHRcdFx0XHRtb3VzZUxlYXZlOiBtb3VzZUxlYXZlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgdGhpcy5zaG93VG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLmhpZGVUb29sdGlwLCBmYWxzZSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy50b3VjaENhcGFibGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLnNob3dUb29sdGlwLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLnNob3dUb29sdGlwLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMuaGlkZVRvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmhhbmRsZTEuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5oYW5kbGUxLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuaGlkZVRvb2x0aXAsIGZhbHNlKTtcblxuXHRcdFx0XHR0aGlzLmhhbmRsZTIuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5oYW5kbGUyLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuaGlkZVRvb2x0aXAsIGZhbHNlKTtcblxuXHRcdFx0XHRpZiAodGhpcy50b3VjaENhcGFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZTEuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5zaG93VG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlMS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZTEuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMuaGlkZVRvb2x0aXAsIGZhbHNlKTtcblxuXHRcdFx0XHRcdHRoaXMuaGFuZGxlMi5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLnNob3dUb29sdGlwLCBmYWxzZSk7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGUyLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5zaG93VG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlMi5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5oaWRlVG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgXHRcdFx0XHRJTlNUQU5DRSBQUk9QRVJUSUVTL01FVEhPRFNcbiAgXHQtIEFueSBtZXRob2RzIGJvdW5kIHRvIHRoZSBwcm90b3R5cGUgYXJlIGNvbnNpZGVyZWRcbiAgcGFydCBvZiB0aGUgcGx1Z2luJ3MgYHB1YmxpY2AgaW50ZXJmYWNlXG4gIFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdFx0U2xpZGVyLnByb3RvdHlwZSA9IHtcblx0XHRcdF9pbml0OiBmdW5jdGlvbiBfaW5pdCgpIHt9LCAvLyBOT1RFOiBNdXN0IGV4aXN0IHRvIHN1cHBvcnQgYnJpZGdldFxuXG5cdFx0XHRjb25zdHJ1Y3RvcjogU2xpZGVyLFxuXG5cdFx0XHRkZWZhdWx0T3B0aW9uczoge1xuXHRcdFx0XHRpZDogXCJcIixcblx0XHRcdFx0bWluOiAwLFxuXHRcdFx0XHRtYXg6IDEwLFxuXHRcdFx0XHRzdGVwOiAxLFxuXHRcdFx0XHRwcmVjaXNpb246IDAsXG5cdFx0XHRcdG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcsXG5cdFx0XHRcdHZhbHVlOiA1LFxuXHRcdFx0XHRyYW5nZTogZmFsc2UsXG5cdFx0XHRcdHNlbGVjdGlvbjogJ2JlZm9yZScsXG5cdFx0XHRcdHRvb2x0aXA6ICdzaG93Jyxcblx0XHRcdFx0dG9vbHRpcF9zcGxpdDogZmFsc2UsXG5cdFx0XHRcdGxvY2tfdG9fdGlja3M6IGZhbHNlLFxuXHRcdFx0XHRoYW5kbGU6ICdyb3VuZCcsXG5cdFx0XHRcdHJldmVyc2VkOiBmYWxzZSxcblx0XHRcdFx0cnRsOiAnYXV0bycsXG5cdFx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRcdGZvcm1hdHRlcjogZnVuY3Rpb24gZm9ybWF0dGVyKHZhbCkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB2YWxbMF0gKyBcIiA6IFwiICsgdmFsWzFdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0bmF0dXJhbF9hcnJvd19rZXlzOiBmYWxzZSxcblx0XHRcdFx0dGlja3M6IFtdLFxuXHRcdFx0XHR0aWNrc19wb3NpdGlvbnM6IFtdLFxuXHRcdFx0XHR0aWNrc19sYWJlbHM6IFtdLFxuXHRcdFx0XHR0aWNrc19zbmFwX2JvdW5kczogMCxcblx0XHRcdFx0dGlja3NfdG9vbHRpcDogZmFsc2UsXG5cdFx0XHRcdHNjYWxlOiAnbGluZWFyJyxcblx0XHRcdFx0Zm9jdXM6IGZhbHNlLFxuXHRcdFx0XHR0b29sdGlwX3Bvc2l0aW9uOiBudWxsLFxuXHRcdFx0XHRsYWJlbGxlZGJ5OiBudWxsLFxuXHRcdFx0XHRyYW5nZUhpZ2hsaWdodHM6IFtdXG5cdFx0XHR9LFxuXG5cdFx0XHRnZXRFbGVtZW50OiBmdW5jdGlvbiBnZXRFbGVtZW50KCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zbGlkZXJFbGVtO1xuXHRcdFx0fSxcblxuXHRcdFx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlKCkge1xuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJhbmdlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3N0YXRlLnZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9zdGF0ZS52YWx1ZVswXTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0c2V0VmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKHZhbCwgdHJpZ2dlclNsaWRlRXZlbnQsIHRyaWdnZXJDaGFuZ2VFdmVudCkge1xuXHRcdFx0XHRpZiAoIXZhbCkge1xuXHRcdFx0XHRcdHZhbCA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFyIG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS52YWx1ZSA9IHRoaXMuX3ZhbGlkYXRlSW5wdXRWYWx1ZSh2YWwpO1xuXHRcdFx0XHR2YXIgYXBwbHlQcmVjaXNpb24gPSB0aGlzLl9hcHBseVByZWNpc2lvbi5iaW5kKHRoaXMpO1xuXG5cdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMucmFuZ2UpIHtcblx0XHRcdFx0XHR0aGlzLl9zdGF0ZS52YWx1ZVswXSA9IGFwcGx5UHJlY2lzaW9uKHRoaXMuX3N0YXRlLnZhbHVlWzBdKTtcblx0XHRcdFx0XHR0aGlzLl9zdGF0ZS52YWx1ZVsxXSA9IGFwcGx5UHJlY2lzaW9uKHRoaXMuX3N0YXRlLnZhbHVlWzFdKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnRpY2tzQXJlVmFsaWQgJiYgdGhpcy5vcHRpb25zLmxvY2tfdG9fdGlja3MpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3N0YXRlLnZhbHVlWzBdID0gdGhpcy5vcHRpb25zLnRpY2tzW3RoaXMuX2dldENsb3Nlc3RUaWNrSW5kZXgodGhpcy5fc3RhdGUudmFsdWVbMF0pXTtcblx0XHRcdFx0XHRcdHRoaXMuX3N0YXRlLnZhbHVlWzFdID0gdGhpcy5vcHRpb25zLnRpY2tzW3RoaXMuX2dldENsb3Nlc3RUaWNrSW5kZXgodGhpcy5fc3RhdGUudmFsdWVbMV0pXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9zdGF0ZS52YWx1ZVswXSA9IE1hdGgubWF4KHRoaXMub3B0aW9ucy5taW4sIE1hdGgubWluKHRoaXMub3B0aW9ucy5tYXgsIHRoaXMuX3N0YXRlLnZhbHVlWzBdKSk7XG5cdFx0XHRcdFx0dGhpcy5fc3RhdGUudmFsdWVbMV0gPSBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluLCBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LCB0aGlzLl9zdGF0ZS52YWx1ZVsxXSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3N0YXRlLnZhbHVlID0gYXBwbHlQcmVjaXNpb24odGhpcy5fc3RhdGUudmFsdWUpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMudGlja3NBcmVWYWxpZCAmJiB0aGlzLm9wdGlvbnMubG9ja190b190aWNrcykge1xuXHRcdFx0XHRcdFx0dGhpcy5fc3RhdGUudmFsdWUgPSB0aGlzLm9wdGlvbnMudGlja3NbdGhpcy5fZ2V0Q2xvc2VzdFRpY2tJbmRleCh0aGlzLl9zdGF0ZS52YWx1ZSldO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX3N0YXRlLnZhbHVlID0gW01hdGgubWF4KHRoaXMub3B0aW9ucy5taW4sIE1hdGgubWluKHRoaXMub3B0aW9ucy5tYXgsIHRoaXMuX3N0YXRlLnZhbHVlKSldO1xuXHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMuaGFuZGxlMiwgJ2hpZGUnKTtcblx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbiA9PT0gJ2FmdGVyJykge1xuXHRcdFx0XHRcdFx0dGhpcy5fc3RhdGUudmFsdWVbMV0gPSB0aGlzLm9wdGlvbnMubWF4O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGF0ZS52YWx1ZVsxXSA9IHRoaXMub3B0aW9ucy5taW47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRGV0ZXJtaW5lIHdoaWNoIHRpY2tzIHRoZSBoYW5kbGUocykgYXJlIHNldCBhdCAoaWYgYXBwbGljYWJsZSlcblx0XHRcdFx0dGhpcy5fc2V0VGlja0luZGV4KCk7XG5cblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5tYXggPiB0aGlzLm9wdGlvbnMubWluKSB7XG5cdFx0XHRcdFx0dGhpcy5fc3RhdGUucGVyY2VudGFnZSA9IFt0aGlzLl90b1BlcmNlbnRhZ2UodGhpcy5fc3RhdGUudmFsdWVbMF0pLCB0aGlzLl90b1BlcmNlbnRhZ2UodGhpcy5fc3RhdGUudmFsdWVbMV0pLCB0aGlzLm9wdGlvbnMuc3RlcCAqIDEwMCAvICh0aGlzLm9wdGlvbnMubWF4IC0gdGhpcy5vcHRpb25zLm1pbildO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2UgPSBbMCwgMCwgMTAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX2xheW91dCgpO1xuXHRcdFx0XHR2YXIgbmV3VmFsdWUgPSB0aGlzLm9wdGlvbnMucmFuZ2UgPyB0aGlzLl9zdGF0ZS52YWx1ZSA6IHRoaXMuX3N0YXRlLnZhbHVlWzBdO1xuXG5cdFx0XHRcdHRoaXMuX3NldERhdGFWYWwobmV3VmFsdWUpO1xuXHRcdFx0XHRpZiAodHJpZ2dlclNsaWRlRXZlbnQgPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl90cmlnZ2VyKCdzbGlkZScsIG5ld1ZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuXHRcdFx0XHRcdGhhc0NoYW5nZWQgPSBvbGRWYWx1ZVswXSAhPT0gbmV3VmFsdWVbMF0gfHwgb2xkVmFsdWVbMV0gIT09IG5ld1ZhbHVlWzFdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhhc0NoYW5nZWQgPSBvbGRWYWx1ZSAhPT0gbmV3VmFsdWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaGFzQ2hhbmdlZCAmJiB0cmlnZ2VyQ2hhbmdlRXZlbnQgPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl90cmlnZ2VyKCdjaGFuZ2UnLCB7XG5cdFx0XHRcdFx0XHRvbGRWYWx1ZTogb2xkVmFsdWUsXG5cdFx0XHRcdFx0XHRuZXdWYWx1ZTogbmV3VmFsdWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0ZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIGV2ZW50IGhhbmRsZXJzIG9uIHNsaWRlciBlbGVtZW50c1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVTbGlkZXJFdmVudEhhbmRsZXJzKCk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBzbGlkZXIgZnJvbSB0aGUgRE9NXG5cdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2xpZGVyRWxlbSk7XG5cdFx0XHRcdC8qIFNob3cgb3JpZ2luYWwgPGlucHV0PiBlbGVtZW50ICovXG5cdFx0XHRcdHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblxuXHRcdFx0XHQvLyBDbGVhciBvdXQgY3VzdG9tIGV2ZW50IGJpbmRpbmdzXG5cdFx0XHRcdHRoaXMuX2NsZWFuVXBFdmVudENhbGxiYWNrc01hcCgpO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBkYXRhIHZhbHVlc1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YVwiKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgSlF1ZXJ5IGhhbmRsZXJzL2RhdGFcblx0XHRcdFx0aWYgKCQpIHtcblx0XHRcdFx0XHR0aGlzLl91bmJpbmRKUXVlcnlFdmVudEhhbmRsZXJzKCk7XG5cdFx0XHRcdFx0aWYgKGF1dG9SZWdpc3Rlck5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX01BSU4pIHtcblx0XHRcdFx0XHRcdHRoaXMuJGVsZW1lbnQucmVtb3ZlRGF0YShhdXRvUmVnaXN0ZXJOYW1lc3BhY2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLiRlbGVtZW50LnJlbW92ZURhdGEoTkFNRVNQQUNFX0FMVEVSTkFURSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0XHRcdHRoaXMuX3N0YXRlLmVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5oYW5kbGUxLnJlbW92ZUF0dHJpYnV0ZShcInRhYmluZGV4XCIpO1xuXHRcdFx0XHR0aGlzLmhhbmRsZTIucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIik7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMuc2xpZGVyRWxlbSwgJ3NsaWRlci1kaXNhYmxlZCcpO1xuXHRcdFx0XHR0aGlzLl90cmlnZ2VyKCdzbGlkZURpc2FibGVkJyk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRlbmFibGU6IGZ1bmN0aW9uIGVuYWJsZSgpIHtcblx0XHRcdFx0dGhpcy5fc3RhdGUuZW5hYmxlZCA9IHRydWU7XG5cdFx0XHRcdHRoaXMuaGFuZGxlMS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCAwKTtcblx0XHRcdFx0dGhpcy5oYW5kbGUyLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIDApO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnNsaWRlckVsZW0sICdzbGlkZXItZGlzYWJsZWQnKTtcblx0XHRcdFx0dGhpcy5fdHJpZ2dlcignc2xpZGVFbmFibGVkJyk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHR0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3N0YXRlLmVuYWJsZWQpIHtcblx0XHRcdFx0XHR0aGlzLmRpc2FibGUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0aXNFbmFibGVkOiBmdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9zdGF0ZS5lbmFibGVkO1xuXHRcdFx0fSxcblxuXHRcdFx0b246IGZ1bmN0aW9uIG9uKGV2dCwgY2FsbGJhY2spIHtcblx0XHRcdFx0dGhpcy5fYmluZE5vblF1ZXJ5RXZlbnRIYW5kbGVyKGV2dCwgY2FsbGJhY2spO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdG9mZjogZnVuY3Rpb24gb2ZmKGV2dCwgY2FsbGJhY2spIHtcblx0XHRcdFx0aWYgKCQpIHtcblx0XHRcdFx0XHR0aGlzLiRlbGVtZW50Lm9mZihldnQsIGNhbGxiYWNrKTtcblx0XHRcdFx0XHR0aGlzLiRzbGlkZXJFbGVtLm9mZihldnQsIGNhbGxiYWNrKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl91bmJpbmROb25RdWVyeUV2ZW50SGFuZGxlcihldnQsIGNhbGxiYWNrKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Z2V0QXR0cmlidXRlOiBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSB7XG5cdFx0XHRcdGlmIChhdHRyaWJ1dGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zW2F0dHJpYnV0ZV07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucztcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0c2V0QXR0cmlidXRlOiBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSkge1xuXHRcdFx0XHR0aGlzLm9wdGlvbnNbYXR0cmlidXRlXSA9IHZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdHJlZnJlc2g6IGZ1bmN0aW9uIHJlZnJlc2gob3B0aW9ucykge1xuXHRcdFx0XHR2YXIgY3VycmVudFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVTbGlkZXJFdmVudEhhbmRsZXJzKCk7XG5cdFx0XHRcdGNyZWF0ZU5ld1NsaWRlci5jYWxsKHRoaXMsIHRoaXMuZWxlbWVudCwgdGhpcy5vcHRpb25zKTtcblx0XHRcdFx0Ly8gRG9uJ3QgcmVzZXQgc2xpZGVyJ3MgdmFsdWUgb24gcmVmcmVzaCBpZiBgdXNlQ3VycmVudFZhbHVlYCBpcyB0cnVlXG5cdFx0XHRcdGlmIChvcHRpb25zICYmIG9wdGlvbnMudXNlQ3VycmVudFZhbHVlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRWYWx1ZShjdXJyZW50VmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkKSB7XG5cdFx0XHRcdFx0Ly8gQmluZCBuZXcgaW5zdGFuY2Ugb2Ygc2xpZGVyIHRvIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0aWYgKGF1dG9SZWdpc3Rlck5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX01BSU4pIHtcblx0XHRcdFx0XHRcdCQuZGF0YSh0aGlzLmVsZW1lbnQsIE5BTUVTUEFDRV9NQUlOLCB0aGlzKTtcblx0XHRcdFx0XHRcdCQuZGF0YSh0aGlzLmVsZW1lbnQsIE5BTUVTUEFDRV9BTFRFUk5BVEUsIHRoaXMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkLmRhdGEodGhpcy5lbGVtZW50LCBOQU1FU1BBQ0VfQUxURVJOQVRFLCB0aGlzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRyZWxheW91dDogZnVuY3Rpb24gcmVsYXlvdXQoKSB7XG5cdFx0XHRcdHRoaXMuX3Jlc2l6ZSgpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiorXG4gICBcdFx0XHRcdEhFTFBFUlNcbiAgIFx0LSBBbnkgbWV0aG9kIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gICAtIFBsYWNlIGl0IHVuZGVybmVhdGggdGhpcyBjb21tZW50IGJsb2NrIGFuZCB3cml0ZSBpdHMgc2lnbmF0dXJlIGxpa2Ugc286XG4gICBcdFx0X2ZuTmFtZSA6IGZ1bmN0aW9uKCkgey4uLn1cbiAgIFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdFx0XHRfcmVtb3ZlVG9vbHRpcExpc3RlbmVyOiBmdW5jdGlvbiBfcmVtb3ZlVG9vbHRpcExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKSB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlMS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuaGFuZGxlMi5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBmYWxzZSk7XG5cdFx0XHR9LFxuXHRcdFx0X3JlbW92ZVNsaWRlckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uIF9yZW1vdmVTbGlkZXJFdmVudEhhbmRsZXJzKCkge1xuXHRcdFx0XHQvLyBSZW1vdmUga2V5ZG93biBldmVudCBsaXN0ZW5lcnNcblx0XHRcdFx0dGhpcy5oYW5kbGUxLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlMUtleWRvd24sIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5oYW5kbGUyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlMktleWRvd24sIGZhbHNlKTtcblxuXHRcdFx0XHQvL3JlbW92ZSB0aGUgbGlzdGVuZXJzIGZyb20gdGhlIHRpY2tzIGFuZCBoYW5kbGVzIGlmIHRoZXkgaGFkIHRoZWlyIG93biBsaXN0ZW5lcnNcblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy50aWNrc190b29sdGlwKSB7XG5cdFx0XHRcdFx0dmFyIHRpY2tzID0gdGhpcy50aWNrc0NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzbGlkZXItdGljaycpO1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGlja3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdHRpY2tzW2ldLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLnRpY2tzQ2FsbGJhY2tNYXBbaV0ubW91c2VFbnRlciwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dGlja3NbaV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMudGlja3NDYWxsYmFja01hcFtpXS5tb3VzZUxlYXZlLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUNhbGxiYWNrTWFwLmhhbmRsZTEgJiYgdGhpcy5oYW5kbGVDYWxsYmFja01hcC5oYW5kbGUyKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZTEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuaGFuZGxlQ2FsbGJhY2tNYXAuaGFuZGxlMS5tb3VzZUVudGVyLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZTIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuaGFuZGxlQ2FsbGJhY2tNYXAuaGFuZGxlMi5tb3VzZUVudGVyLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZTEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlQ2FsbGJhY2tNYXAuaGFuZGxlMS5tb3VzZUxlYXZlLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZTIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlQ2FsbGJhY2tNYXAuaGFuZGxlMi5tb3VzZUxlYXZlLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5oYW5kbGVDYWxsYmFja01hcCA9IG51bGw7XG5cdFx0XHRcdHRoaXMudGlja3NDYWxsYmFja01hcCA9IG51bGw7XG5cblx0XHRcdFx0aWYgKHRoaXMuc2hvd1Rvb2x0aXApIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVUb29sdGlwTGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLnNob3dUb29sdGlwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5oaWRlVG9vbHRpcCkge1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVRvb2x0aXBMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy5oaWRlVG9vbHRpcCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gc2xpZGVyRWxlbVxuXHRcdFx0XHRpZiAodGhpcy5zaG93VG9vbHRpcCkge1xuXHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCB0aGlzLnNob3dUb29sdGlwLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuaGlkZVRvb2x0aXApIHtcblx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5oaWRlVG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zbGlkZXJFbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5tb3VzZWRvd24sIGZhbHNlKTtcblxuXHRcdFx0XHRpZiAodGhpcy50b3VjaENhcGFibGUpIHtcblx0XHRcdFx0XHQvLyBSZW1vdmUgdG91Y2ggZXZlbnQgbGlzdGVuZXJzIGZyb20gaGFuZGxlc1xuXHRcdFx0XHRcdGlmICh0aGlzLnNob3dUb29sdGlwKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZTEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5zaG93VG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGUxLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5zaG93VG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGUyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlMi5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRoaXMuaGlkZVRvb2x0aXApIHtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlMS5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5oaWRlVG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGUyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB0aGlzLmhpZGVUb29sdGlwLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHNsaWRlckVsZW1cblx0XHRcdFx0XHRpZiAodGhpcy5zaG93VG9vbHRpcCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zbGlkZXJFbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRoaXMuc2hvd1Rvb2x0aXAsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRoaXMuaGlkZVRvb2x0aXApIHtcblx0XHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5oaWRlVG9vbHRpcCwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuc2xpZGVyRWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLnRvdWNoc3RhcnQsIGZhbHNlKTtcblx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLnRvdWNobW92ZSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIHdpbmRvdyBldmVudCBsaXN0ZW5lclxuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLnJlc2l6ZSwgZmFsc2UpO1xuXHRcdFx0fSxcblx0XHRcdF9iaW5kTm9uUXVlcnlFdmVudEhhbmRsZXI6IGZ1bmN0aW9uIF9iaW5kTm9uUXVlcnlFdmVudEhhbmRsZXIoZXZ0LCBjYWxsYmFjaykge1xuXHRcdFx0XHRpZiAodGhpcy5ldmVudFRvQ2FsbGJhY2tNYXBbZXZ0XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5ldmVudFRvQ2FsbGJhY2tNYXBbZXZ0XSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZXZlbnRUb0NhbGxiYWNrTWFwW2V2dF0ucHVzaChjYWxsYmFjayk7XG5cdFx0XHR9LFxuXHRcdFx0X3VuYmluZE5vblF1ZXJ5RXZlbnRIYW5kbGVyOiBmdW5jdGlvbiBfdW5iaW5kTm9uUXVlcnlFdmVudEhhbmRsZXIoZXZ0LCBjYWxsYmFjaykge1xuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gdGhpcy5ldmVudFRvQ2FsbGJhY2tNYXBbZXZ0XTtcblx0XHRcdFx0aWYgKGNhbGxiYWNrcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmIChjYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9jbGVhblVwRXZlbnRDYWxsYmFja3NNYXA6IGZ1bmN0aW9uIF9jbGVhblVwRXZlbnRDYWxsYmFja3NNYXAoKSB7XG5cdFx0XHRcdHZhciBldmVudE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5ldmVudFRvQ2FsbGJhY2tNYXApO1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YXIgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5ldmVudFRvQ2FsbGJhY2tNYXBbZXZlbnROYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9zaG93VG9vbHRpcDogZnVuY3Rpb24gX3Nob3dUb29sdGlwKCkge1xuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnRvb2x0aXBfc3BsaXQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50b29sdGlwLCAnc2hvdycpO1xuXHRcdFx0XHRcdHRoaXMudG9vbHRpcF9taW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0XHR0aGlzLnRvb2x0aXBfbWF4LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50b29sdGlwX21pbiwgJ3Nob3cnKTtcblx0XHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0aGlzLnRvb2x0aXBfbWF4LCAnc2hvdycpO1xuXHRcdFx0XHRcdHRoaXMudG9vbHRpcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3N0YXRlLm92ZXIgPSB0cnVlO1xuXHRcdFx0fSxcblx0XHRcdF9oaWRlVG9vbHRpcDogZnVuY3Rpb24gX2hpZGVUb29sdGlwKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fc3RhdGUuaW5EcmFnID09PSBmYWxzZSAmJiB0aGlzLl9hbHdheXNTaG93VG9vbHRpcCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMudG9vbHRpcCwgJ3Nob3cnKTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXBfbWluLCAnc2hvdycpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMudG9vbHRpcF9tYXgsICdzaG93Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc3RhdGUub3ZlciA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdF9zZXRUb29sVGlwT25Nb3VzZU92ZXI6IGZ1bmN0aW9uIF9zZXRUb29sVGlwT25Nb3VzZU92ZXIodGVtcFN0YXRlKSB7XG5cdFx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdFx0dmFyIGZvcm1hdHRlZFRvb2x0aXBWYWwgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVyKCF0ZW1wU3RhdGUgPyB0aGlzLl9zdGF0ZS52YWx1ZVswXSA6IHRlbXBTdGF0ZS52YWx1ZVswXSk7XG5cdFx0XHRcdHZhciBwb3NpdGlvblBlcmNlbnRhZ2VzID0gIXRlbXBTdGF0ZSA/IGdldFBvc2l0aW9uUGVyY2VudGFnZXModGhpcy5fc3RhdGUsIHRoaXMub3B0aW9ucy5yZXZlcnNlZCkgOiBnZXRQb3NpdGlvblBlcmNlbnRhZ2VzKHRlbXBTdGF0ZSwgdGhpcy5vcHRpb25zLnJldmVyc2VkKTtcblx0XHRcdFx0dGhpcy5fc2V0VGV4dCh0aGlzLnRvb2x0aXBJbm5lciwgZm9ybWF0dGVkVG9vbHRpcFZhbCk7XG5cblx0XHRcdFx0dGhpcy50b29sdGlwLnN0eWxlW3RoaXMuc3R5bGVQb3NdID0gcG9zaXRpb25QZXJjZW50YWdlc1swXSArIFwiJVwiO1xuXG5cdFx0XHRcdGZ1bmN0aW9uIGdldFBvc2l0aW9uUGVyY2VudGFnZXMoc3RhdGUsIHJldmVyc2VkKSB7XG5cdFx0XHRcdFx0aWYgKHJldmVyc2VkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWzEwMCAtIHN0YXRlLnBlcmNlbnRhZ2VbMF0sIHNlbGYub3B0aW9ucy5yYW5nZSA/IDEwMCAtIHN0YXRlLnBlcmNlbnRhZ2VbMV0gOiBzdGF0ZS5wZXJjZW50YWdlWzFdXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIFtzdGF0ZS5wZXJjZW50YWdlWzBdLCBzdGF0ZS5wZXJjZW50YWdlWzFdXTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9jb3B5U3RhdGU6IGZ1bmN0aW9uIF9jb3B5U3RhdGUoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0dmFsdWU6IFt0aGlzLl9zdGF0ZS52YWx1ZVswXSwgdGhpcy5fc3RhdGUudmFsdWVbMV1dLFxuXHRcdFx0XHRcdGVuYWJsZWQ6IHRoaXMuX3N0YXRlLmVuYWJsZWQsXG5cdFx0XHRcdFx0b2Zmc2V0OiB0aGlzLl9zdGF0ZS5vZmZzZXQsXG5cdFx0XHRcdFx0c2l6ZTogdGhpcy5fc3RhdGUuc2l6ZSxcblx0XHRcdFx0XHRwZXJjZW50YWdlOiBbdGhpcy5fc3RhdGUucGVyY2VudGFnZVswXSwgdGhpcy5fc3RhdGUucGVyY2VudGFnZVsxXSwgdGhpcy5fc3RhdGUucGVyY2VudGFnZVsyXV0sXG5cdFx0XHRcdFx0aW5EcmFnOiB0aGlzLl9zdGF0ZS5pbkRyYWcsXG5cdFx0XHRcdFx0b3ZlcjogdGhpcy5fc3RhdGUub3Zlcixcblx0XHRcdFx0XHQvLyBkZWxldGVkIG9yIG51bGwnZCBrZXlzXG5cdFx0XHRcdFx0ZHJhZ2dlZDogdGhpcy5fc3RhdGUuZHJhZ2dlZCxcblx0XHRcdFx0XHRrZXlDdHJsOiB0aGlzLl9zdGF0ZS5rZXlDdHJsXG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0X2FkZFRpY2tMaXN0ZW5lcjogZnVuY3Rpb24gX2FkZFRpY2tMaXN0ZW5lcigpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRhZGRNb3VzZUVudGVyOiBmdW5jdGlvbiBhZGRNb3VzZUVudGVyKHJlZmVyZW5jZSwgZWxlbWVudCwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdHZhciBlbnRlciA9IGZ1bmN0aW9uIGVudGVyKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGVtcFN0YXRlID0gcmVmZXJlbmNlLl9jb3B5U3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0Ly8gV2hpY2ggaGFuZGxlIGlzIGJlaW5nIGhvdmVyZWQgb3Zlcj9cblx0XHRcdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW1lbnQgPT09IHJlZmVyZW5jZS5oYW5kbGUxID8gdGVtcFN0YXRlLnZhbHVlWzBdIDogdGVtcFN0YXRlLnZhbHVlWzFdO1xuXHRcdFx0XHRcdFx0XHR2YXIgcGVyID0gdm9pZCAwO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNldHVwIHZhbHVlIGFuZCBwZXJjZW50YWdlIGZvciB0aWNrJ3MgJ21vdXNlZW50ZXInXG5cdFx0XHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFsID0gcmVmZXJlbmNlLm9wdGlvbnMudGlja3NbaW5kZXhdO1xuXHRcdFx0XHRcdFx0XHRcdHBlciA9IHJlZmVyZW5jZS5vcHRpb25zLnRpY2tzX3Bvc2l0aW9ucy5sZW5ndGggPiAwICYmIHJlZmVyZW5jZS5vcHRpb25zLnRpY2tzX3Bvc2l0aW9uc1tpbmRleF0gfHwgcmVmZXJlbmNlLl90b1BlcmNlbnRhZ2UocmVmZXJlbmNlLm9wdGlvbnMudGlja3NbaW5kZXhdKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRwZXIgPSByZWZlcmVuY2UuX3RvUGVyY2VudGFnZSh2YWwpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGVtcFN0YXRlLnZhbHVlWzBdID0gdmFsO1xuXHRcdFx0XHRcdFx0XHR0ZW1wU3RhdGUucGVyY2VudGFnZVswXSA9IHBlcjtcblx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlLl9zZXRUb29sVGlwT25Nb3VzZU92ZXIodGVtcFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlLl9zaG93VG9vbHRpcCgpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgZW50ZXIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbnRlcjtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFkZE1vdXNlTGVhdmU6IGZ1bmN0aW9uIGFkZE1vdXNlTGVhdmUocmVmZXJlbmNlLCBlbGVtZW50KSB7XG5cdFx0XHRcdFx0XHR2YXIgbGVhdmUgPSBmdW5jdGlvbiBsZWF2ZSgpIHtcblx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlLl9oaWRlVG9vbHRpcCgpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgbGVhdmUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybiBsZWF2ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0X2xheW91dDogZnVuY3Rpb24gX2xheW91dCgpIHtcblx0XHRcdFx0dmFyIHBvc2l0aW9uUGVyY2VudGFnZXM7XG5cdFx0XHRcdHZhciBmb3JtYXR0ZWRWYWx1ZTtcblxuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJldmVyc2VkKSB7XG5cdFx0XHRcdFx0cG9zaXRpb25QZXJjZW50YWdlcyA9IFsxMDAgLSB0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzBdLCB0aGlzLm9wdGlvbnMucmFuZ2UgPyAxMDAgLSB0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzFdIDogdGhpcy5fc3RhdGUucGVyY2VudGFnZVsxXV07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cG9zaXRpb25QZXJjZW50YWdlcyA9IFt0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzBdLCB0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzFdXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaGFuZGxlMS5zdHlsZVt0aGlzLnN0eWxlUG9zXSA9IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gKyBcIiVcIjtcblx0XHRcdFx0dGhpcy5oYW5kbGUxLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMuX3N0YXRlLnZhbHVlWzBdKTtcblx0XHRcdFx0Zm9ybWF0dGVkVmFsdWUgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVyKHRoaXMuX3N0YXRlLnZhbHVlWzBdKTtcblx0XHRcdFx0aWYgKGlzTmFOKGZvcm1hdHRlZFZhbHVlKSkge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlMS5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0JywgZm9ybWF0dGVkVmFsdWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlMS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmhhbmRsZTIuc3R5bGVbdGhpcy5zdHlsZVBvc10gPSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdICsgXCIlXCI7XG5cdFx0XHRcdHRoaXMuaGFuZGxlMi5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLl9zdGF0ZS52YWx1ZVsxXSk7XG5cdFx0XHRcdGZvcm1hdHRlZFZhbHVlID0gdGhpcy5vcHRpb25zLmZvcm1hdHRlcih0aGlzLl9zdGF0ZS52YWx1ZVsxXSk7XG5cdFx0XHRcdGlmIChpc05hTihmb3JtYXR0ZWRWYWx1ZSkpIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZTIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVldGV4dCcsIGZvcm1hdHRlZFZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZTIucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXZhbHVldGV4dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyogUG9zaXRpb24gaGlnaGxpZ2h0IHJhbmdlIGVsZW1lbnRzICovXG5cdFx0XHRcdGlmICh0aGlzLnJhbmdlSGlnaGxpZ2h0RWxlbWVudHMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5yYW5nZUhpZ2hsaWdodHMpICYmIHRoaXMub3B0aW9ucy5yYW5nZUhpZ2hsaWdodHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLm9wdGlvbnMucmFuZ2VIaWdobGlnaHRzLmxlbmd0aDsgX2krKykge1xuXHRcdFx0XHRcdFx0dmFyIHN0YXJ0UGVyY2VudCA9IHRoaXMuX3RvUGVyY2VudGFnZSh0aGlzLm9wdGlvbnMucmFuZ2VIaWdobGlnaHRzW19pXS5zdGFydCk7XG5cdFx0XHRcdFx0XHR2YXIgZW5kUGVyY2VudCA9IHRoaXMuX3RvUGVyY2VudGFnZSh0aGlzLm9wdGlvbnMucmFuZ2VIaWdobGlnaHRzW19pXS5lbmQpO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJldmVyc2VkKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBzcCA9IDEwMCAtIGVuZFBlcmNlbnQ7XG5cdFx0XHRcdFx0XHRcdGVuZFBlcmNlbnQgPSAxMDAgLSBzdGFydFBlcmNlbnQ7XG5cdFx0XHRcdFx0XHRcdHN0YXJ0UGVyY2VudCA9IHNwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgY3VycmVudFJhbmdlID0gdGhpcy5fY3JlYXRlSGlnaGxpZ2h0UmFuZ2Uoc3RhcnRQZXJjZW50LCBlbmRQZXJjZW50KTtcblxuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRSYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5yYW5nZUhpZ2hsaWdodEVsZW1lbnRzW19pXS5zdHlsZS50b3AgPSBjdXJyZW50UmFuZ2Uuc3RhcnQgKyBcIiVcIjtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnJhbmdlSGlnaGxpZ2h0RWxlbWVudHNbX2ldLnN0eWxlLmhlaWdodCA9IGN1cnJlbnRSYW5nZS5zaXplICsgXCIlXCI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucmFuZ2VIaWdobGlnaHRFbGVtZW50c1tfaV0uc3R5bGUucmlnaHQgPSBjdXJyZW50UmFuZ2Uuc3RhcnQgKyBcIiVcIjtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5yYW5nZUhpZ2hsaWdodEVsZW1lbnRzW19pXS5zdHlsZS5sZWZ0ID0gY3VycmVudFJhbmdlLnN0YXJ0ICsgXCIlXCI7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMucmFuZ2VIaWdobGlnaHRFbGVtZW50c1tfaV0uc3R5bGUud2lkdGggPSBjdXJyZW50UmFuZ2Uuc2l6ZSArIFwiJVwiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnJhbmdlSGlnaGxpZ2h0RWxlbWVudHNbX2ldLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKiBQb3NpdGlvbiB0aWNrcyBhbmQgbGFiZWxzICovXG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy50aWNrcykgJiYgdGhpcy5vcHRpb25zLnRpY2tzLmxlbmd0aCA+IDApIHtcblxuXHRcdFx0XHRcdHZhciBzdHlsZVNpemUgPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cdFx0XHRcdFx0dmFyIHN0eWxlTWFyZ2luO1xuXHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcblx0XHRcdFx0XHRcdHN0eWxlTWFyZ2luID0gJ21hcmdpblRvcCc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG5cdFx0XHRcdFx0XHRcdHN0eWxlTWFyZ2luID0gJ21hcmdpblJpZ2h0Jztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN0eWxlTWFyZ2luID0gJ21hcmdpbkxlZnQnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgbGFiZWxTaXplID0gdGhpcy5fc3RhdGUuc2l6ZSAvICh0aGlzLm9wdGlvbnMudGlja3MubGVuZ3RoIC0gMSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy50aWNrTGFiZWxDb250YWluZXIpIHtcblx0XHRcdFx0XHRcdHZhciBleHRyYU1hcmdpbiA9IDA7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnRpY2tzX3Bvc2l0aW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiAhPT0gJ3ZlcnRpY2FsJykge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVsQ29udGFpbmVyLnN0eWxlW3N0eWxlTWFyZ2luXSA9IC1sYWJlbFNpemUgLyAyICsgXCJweFwiO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0ZXh0cmFNYXJnaW4gPSB0aGlzLnRpY2tMYWJlbENvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvKiBDaGlkcmVuIGFyZSBwb3NpdGlvbiBhYnNvbHV0ZSwgY2FsY3VsYXRlIGhlaWdodCBieSBmaW5kaW5nIHRoZSBtYXggb2Zmc2V0SGVpZ2h0IG9mIGEgY2hpbGQgKi9cblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMudGlja0xhYmVsQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy50aWNrTGFiZWxDb250YWluZXIuY2hpbGROb2Rlc1tpXS5vZmZzZXRIZWlnaHQgPiBleHRyYU1hcmdpbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFNYXJnaW4gPSB0aGlzLnRpY2tMYWJlbENvbnRhaW5lci5jaGlsZE5vZGVzW2ldLm9mZnNldEhlaWdodDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNsaWRlckVsZW0uc3R5bGUubWFyZ2luQm90dG9tID0gZXh0cmFNYXJnaW4gKyBcInB4XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRpY2tzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJjZW50YWdlID0gdGhpcy5vcHRpb25zLnRpY2tzX3Bvc2l0aW9uc1tpXSB8fCB0aGlzLl90b1BlcmNlbnRhZ2UodGhpcy5vcHRpb25zLnRpY2tzW2ldKTtcblxuXHRcdFx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5yZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHRwZXJjZW50YWdlID0gMTAwIC0gcGVyY2VudGFnZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dGhpcy50aWNrc1tpXS5zdHlsZVt0aGlzLnN0eWxlUG9zXSA9IHBlcmNlbnRhZ2UgKyBcIiVcIjtcblxuXHRcdFx0XHRcdFx0LyogU2V0IGNsYXNzIGxhYmVscyB0byBkZW5vdGUgd2hldGhlciB0aWNrcyBhcmUgaW4gdGhlIHNlbGVjdGlvbiAqL1xuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50aWNrc1tpXSwgJ2luLXNlbGVjdGlvbicpO1xuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLm9wdGlvbnMucmFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5zZWxlY3Rpb24gPT09ICdhZnRlcicgJiYgcGVyY2VudGFnZSA+PSBwb3NpdGlvblBlcmNlbnRhZ2VzWzBdKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50aWNrc1tpXSwgJ2luLXNlbGVjdGlvbicpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zZWxlY3Rpb24gPT09ICdiZWZvcmUnICYmIHBlcmNlbnRhZ2UgPD0gcG9zaXRpb25QZXJjZW50YWdlc1swXSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudGlja3NbaV0sICdpbi1zZWxlY3Rpb24nKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwZXJjZW50YWdlID49IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gJiYgcGVyY2VudGFnZSA8PSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudGlja3NbaV0sICdpbi1zZWxlY3Rpb24nKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHRoaXMudGlja0xhYmVsc1tpXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRpY2tMYWJlbHNbaV0uc3R5bGVbc3R5bGVTaXplXSA9IGxhYmVsU2l6ZSArIFwicHhcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uICE9PSAndmVydGljYWwnICYmIHRoaXMub3B0aW9ucy50aWNrc19wb3NpdGlvbnNbaV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVsc1tpXS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50aWNrTGFiZWxzW2ldLnN0eWxlW3RoaXMuc3R5bGVQb3NdID0gcGVyY2VudGFnZSArIFwiJVwiO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVsc1tpXS5zdHlsZVtzdHlsZU1hcmdpbl0gPSAtbGFiZWxTaXplIC8gMiArICdweCc7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVsc1tpXS5zdHlsZVsnbWFyZ2luUmlnaHQnXSA9IHRoaXMuc2xpZGVyRWxlbS5vZmZzZXRXaWR0aCArIFwicHhcIjtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy50aWNrTGFiZWxzW2ldLnN0eWxlWydtYXJnaW5MZWZ0J10gPSB0aGlzLnNsaWRlckVsZW0ub2Zmc2V0V2lkdGggKyBcInB4XCI7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudGlja0xhYmVsQ29udGFpbmVyLnN0eWxlW3N0eWxlTWFyZ2luXSA9IHRoaXMuc2xpZGVyRWxlbS5vZmZzZXRXaWR0aCAvIDIgKiAtMSArICdweCc7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvKiBTZXQgY2xhc3MgbGFiZWxzIHRvIGluZGljYXRlIHRpY2sgbGFiZWxzIGFyZSBpbiB0aGUgc2VsZWN0aW9uIG9yIHNlbGVjdGVkICovXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMudGlja0xhYmVsc1tpXSwgJ2xhYmVsLWluLXNlbGVjdGlvbiBsYWJlbC1pcy1zZWxlY3Rpb24nKTtcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLm9wdGlvbnMucmFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbiA9PT0gJ2FmdGVyJyAmJiBwZXJjZW50YWdlID49IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudGlja0xhYmVsc1tpXSwgJ2xhYmVsLWluLXNlbGVjdGlvbicpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbiA9PT0gJ2JlZm9yZScgJiYgcGVyY2VudGFnZSA8PSBwb3NpdGlvblBlcmNlbnRhZ2VzWzBdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0aGlzLnRpY2tMYWJlbHNbaV0sICdsYWJlbC1pbi1zZWxlY3Rpb24nKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBlcmNlbnRhZ2UgPT09IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudGlja0xhYmVsc1tpXSwgJ2xhYmVsLWlzLXNlbGVjdGlvbicpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwZXJjZW50YWdlID49IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gJiYgcGVyY2VudGFnZSA8PSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50aWNrTGFiZWxzW2ldLCAnbGFiZWwtaW4tc2VsZWN0aW9uJyk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBlcmNlbnRhZ2UgPT09IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gfHwgcG9zaXRpb25QZXJjZW50YWdlc1sxXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50aWNrTGFiZWxzW2ldLCAnbGFiZWwtaXMtc2VsZWN0aW9uJyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGZvcm1hdHRlZFRvb2x0aXBWYWw7XG5cblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5yYW5nZSkge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRvb2x0aXBWYWwgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVyKHRoaXMuX3N0YXRlLnZhbHVlKTtcblx0XHRcdFx0XHR0aGlzLl9zZXRUZXh0KHRoaXMudG9vbHRpcElubmVyLCBmb3JtYXR0ZWRUb29sdGlwVmFsKTtcblx0XHRcdFx0XHR0aGlzLnRvb2x0aXAuc3R5bGVbdGhpcy5zdHlsZVBvc10gPSAocG9zaXRpb25QZXJjZW50YWdlc1sxXSArIHBvc2l0aW9uUGVyY2VudGFnZXNbMF0pIC8gMiArIFwiJVwiO1xuXG5cdFx0XHRcdFx0dmFyIGlubmVyVG9vbHRpcE1pblRleHQgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVyKHRoaXMuX3N0YXRlLnZhbHVlWzBdKTtcblx0XHRcdFx0XHR0aGlzLl9zZXRUZXh0KHRoaXMudG9vbHRpcElubmVyX21pbiwgaW5uZXJUb29sdGlwTWluVGV4dCk7XG5cblx0XHRcdFx0XHR2YXIgaW5uZXJUb29sdGlwTWF4VGV4dCA9IHRoaXMub3B0aW9ucy5mb3JtYXR0ZXIodGhpcy5fc3RhdGUudmFsdWVbMV0pO1xuXHRcdFx0XHRcdHRoaXMuX3NldFRleHQodGhpcy50b29sdGlwSW5uZXJfbWF4LCBpbm5lclRvb2x0aXBNYXhUZXh0KTtcblxuXHRcdFx0XHRcdHRoaXMudG9vbHRpcF9taW4uc3R5bGVbdGhpcy5zdHlsZVBvc10gPSBwb3NpdGlvblBlcmNlbnRhZ2VzWzBdICsgXCIlXCI7XG5cblx0XHRcdFx0XHR0aGlzLnRvb2x0aXBfbWF4LnN0eWxlW3RoaXMuc3R5bGVQb3NdID0gcG9zaXRpb25QZXJjZW50YWdlc1sxXSArIFwiJVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRvb2x0aXBWYWwgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVyKHRoaXMuX3N0YXRlLnZhbHVlWzBdKTtcblx0XHRcdFx0XHR0aGlzLl9zZXRUZXh0KHRoaXMudG9vbHRpcElubmVyLCBmb3JtYXR0ZWRUb29sdGlwVmFsKTtcblxuXHRcdFx0XHRcdHRoaXMudG9vbHRpcC5zdHlsZVt0aGlzLnN0eWxlUG9zXSA9IHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gKyBcIiVcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcblx0XHRcdFx0XHR0aGlzLnRyYWNrTG93LnN0eWxlLnRvcCA9ICcwJztcblx0XHRcdFx0XHR0aGlzLnRyYWNrTG93LnN0eWxlLmhlaWdodCA9IE1hdGgubWluKHBvc2l0aW9uUGVyY2VudGFnZXNbMF0sIHBvc2l0aW9uUGVyY2VudGFnZXNbMV0pICsgJyUnO1xuXG5cdFx0XHRcdFx0dGhpcy50cmFja1NlbGVjdGlvbi5zdHlsZS50b3AgPSBNYXRoLm1pbihwb3NpdGlvblBlcmNlbnRhZ2VzWzBdLCBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSArICclJztcblx0XHRcdFx0XHR0aGlzLnRyYWNrU2VsZWN0aW9uLnN0eWxlLmhlaWdodCA9IE1hdGguYWJzKHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gLSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSArICclJztcblxuXHRcdFx0XHRcdHRoaXMudHJhY2tIaWdoLnN0eWxlLmJvdHRvbSA9ICcwJztcblx0XHRcdFx0XHR0aGlzLnRyYWNrSGlnaC5zdHlsZS5oZWlnaHQgPSAxMDAgLSBNYXRoLm1pbihwb3NpdGlvblBlcmNlbnRhZ2VzWzBdLCBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSAtIE1hdGguYWJzKHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gLSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSArICclJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAodGhpcy5zdHlsZVBvcyA9PT0gJ3JpZ2h0Jykge1xuXHRcdFx0XHRcdFx0dGhpcy50cmFja0xvdy5zdHlsZS5yaWdodCA9ICcwJztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy50cmFja0xvdy5zdHlsZS5sZWZ0ID0gJzAnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLnRyYWNrTG93LnN0eWxlLndpZHRoID0gTWF0aC5taW4ocG9zaXRpb25QZXJjZW50YWdlc1swXSwgcG9zaXRpb25QZXJjZW50YWdlc1sxXSkgKyAnJSc7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5zdHlsZVBvcyA9PT0gJ3JpZ2h0Jykge1xuXHRcdFx0XHRcdFx0dGhpcy50cmFja1NlbGVjdGlvbi5zdHlsZS5yaWdodCA9IE1hdGgubWluKHBvc2l0aW9uUGVyY2VudGFnZXNbMF0sIHBvc2l0aW9uUGVyY2VudGFnZXNbMV0pICsgJyUnO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRyYWNrU2VsZWN0aW9uLnN0eWxlLmxlZnQgPSBNYXRoLm1pbihwb3NpdGlvblBlcmNlbnRhZ2VzWzBdLCBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSArICclJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy50cmFja1NlbGVjdGlvbi5zdHlsZS53aWR0aCA9IE1hdGguYWJzKHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gLSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSArICclJztcblxuXHRcdFx0XHRcdGlmICh0aGlzLnN0eWxlUG9zID09PSAncmlnaHQnKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRyYWNrSGlnaC5zdHlsZS5sZWZ0ID0gJzAnO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRyYWNrSGlnaC5zdHlsZS5yaWdodCA9ICcwJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy50cmFja0hpZ2guc3R5bGUud2lkdGggPSAxMDAgLSBNYXRoLm1pbihwb3NpdGlvblBlcmNlbnRhZ2VzWzBdLCBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSAtIE1hdGguYWJzKHBvc2l0aW9uUGVyY2VudGFnZXNbMF0gLSBwb3NpdGlvblBlcmNlbnRhZ2VzWzFdKSArICclJztcblxuXHRcdFx0XHRcdHZhciBvZmZzZXRfbWluID0gdGhpcy50b29sdGlwX21pbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0X21heCA9IHRoaXMudG9vbHRpcF9tYXguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnRvb2x0aXBfcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG5cdFx0XHRcdFx0XHRpZiAob2Zmc2V0X21pbi5yaWdodCA+IG9mZnNldF9tYXgubGVmdCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXBfbWF4LCAnYnMtdG9vbHRpcC1ib3R0b20nKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50b29sdGlwX21heCwgJ2JzLXRvb2x0aXAtdG9wJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMudG9vbHRpcF9tYXguc3R5bGUudG9wID0gJyc7XG5cdFx0XHRcdFx0XHRcdHRoaXMudG9vbHRpcF9tYXguc3R5bGUuYm90dG9tID0gMjIgKyAncHgnO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50b29sdGlwX21heCwgJ2JzLXRvb2x0aXAtdG9wJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudG9vbHRpcF9tYXgsICdicy10b29sdGlwLWJvdHRvbScpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRvb2x0aXBfbWF4LnN0eWxlLnRvcCA9IHRoaXMudG9vbHRpcF9taW4uc3R5bGUudG9wO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRvb2x0aXBfbWF4LnN0eWxlLmJvdHRvbSA9ICcnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAob2Zmc2V0X21pbi5yaWdodCA+IG9mZnNldF9tYXgubGVmdCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXBfbWF4LCAnYnMtdG9vbHRpcC10b3AnKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkQ2xhc3ModGhpcy50b29sdGlwX21heCwgJ2JzLXRvb2x0aXAtYm90dG9tJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMudG9vbHRpcF9tYXguc3R5bGUudG9wID0gMTggKyAncHgnO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy50b29sdGlwX21heCwgJ2JzLXRvb2x0aXAtYm90dG9tJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRoaXMudG9vbHRpcF9tYXgsICdicy10b29sdGlwLXRvcCcpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRvb2x0aXBfbWF4LnN0eWxlLnRvcCA9IHRoaXMudG9vbHRpcF9taW4uc3R5bGUudG9wO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9jcmVhdGVIaWdobGlnaHRSYW5nZTogZnVuY3Rpb24gX2NyZWF0ZUhpZ2hsaWdodFJhbmdlKHN0YXJ0LCBlbmQpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2lzSGlnaGxpZ2h0UmFuZ2Uoc3RhcnQsIGVuZCkpIHtcblx0XHRcdFx0XHRpZiAoc3RhcnQgPiBlbmQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7ICdzdGFydCc6IGVuZCwgJ3NpemUnOiBzdGFydCAtIGVuZCB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ3NpemUnOiBlbmQgLSBzdGFydCB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fSxcblx0XHRcdF9pc0hpZ2hsaWdodFJhbmdlOiBmdW5jdGlvbiBfaXNIaWdobGlnaHRSYW5nZShzdGFydCwgZW5kKSB7XG5cdFx0XHRcdGlmICgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IDEwMCAmJiAwIDw9IGVuZCAmJiBlbmQgPD0gMTAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3Jlc2l6ZTogZnVuY3Rpb24gX3Jlc2l6ZShldikge1xuXHRcdFx0XHQvKmpzaGludCB1bnVzZWQ6ZmFsc2UqL1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5vZmZzZXQgPSB0aGlzLl9vZmZzZXQodGhpcy5zbGlkZXJFbGVtKTtcblx0XHRcdFx0dGhpcy5fc3RhdGUuc2l6ZSA9IHRoaXMuc2xpZGVyRWxlbVt0aGlzLnNpemVQb3NdO1xuXHRcdFx0XHR0aGlzLl9sYXlvdXQoKTtcblx0XHRcdH0sXG5cdFx0XHRfcmVtb3ZlUHJvcGVydHk6IGZ1bmN0aW9uIF9yZW1vdmVQcm9wZXJ0eShlbGVtZW50LCBwcm9wKSB7XG5cdFx0XHRcdGlmIChlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9tb3VzZWRvd246IGZ1bmN0aW9uIF9tb3VzZWRvd24oZXYpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9zdGF0ZS5lbmFibGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGV2LnByZXZlbnREZWZhdWx0KSB7XG5cdFx0XHRcdFx0ZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX3N0YXRlLm9mZnNldCA9IHRoaXMuX29mZnNldCh0aGlzLnNsaWRlckVsZW0pO1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5zaXplID0gdGhpcy5zbGlkZXJFbGVtW3RoaXMuc2l6ZVBvc107XG5cblx0XHRcdFx0dmFyIHBlcmNlbnRhZ2UgPSB0aGlzLl9nZXRQZXJjZW50YWdlKGV2KTtcblxuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJhbmdlKSB7XG5cdFx0XHRcdFx0dmFyIGRpZmYxID0gTWF0aC5hYnModGhpcy5fc3RhdGUucGVyY2VudGFnZVswXSAtIHBlcmNlbnRhZ2UpO1xuXHRcdFx0XHRcdHZhciBkaWZmMiA9IE1hdGguYWJzKHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbMV0gLSBwZXJjZW50YWdlKTtcblx0XHRcdFx0XHR0aGlzLl9zdGF0ZS5kcmFnZ2VkID0gZGlmZjEgPCBkaWZmMiA/IDAgOiAxO1xuXHRcdFx0XHRcdHRoaXMuX2FkanVzdFBlcmNlbnRhZ2VGb3JSYW5nZVNsaWRlcnMocGVyY2VudGFnZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fc3RhdGUuZHJhZ2dlZCA9IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9zdGF0ZS5wZXJjZW50YWdlW3RoaXMuX3N0YXRlLmRyYWdnZWRdID0gcGVyY2VudGFnZTtcblxuXHRcdFx0XHRpZiAodGhpcy50b3VjaENhcGFibGUpIHtcblx0XHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRoaXMubW91c2Vtb3ZlLCBmYWxzZSk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMubW91c2V1cCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMubW91c2Vtb3ZlKSB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLm1vdXNldXApIHtcblx0XHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm1vdXNldXAsIGZhbHNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMubW91c2Vtb3ZlID0gdGhpcy5fbW91c2Vtb3ZlLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMubW91c2V1cCA9IHRoaXMuX21vdXNldXAuYmluZCh0aGlzKTtcblxuXHRcdFx0XHRpZiAodGhpcy50b3VjaENhcGFibGUpIHtcblx0XHRcdFx0XHQvLyBUb3VjaDogQmluZCB0b3VjaCBldmVudHM6XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLm1vdXNlbW92ZSwgZmFsc2UpO1xuXHRcdFx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB0aGlzLm1vdXNldXAsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBCaW5kIG1vdXNlIGV2ZW50czpcblx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSwgZmFsc2UpO1xuXHRcdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm1vdXNldXAsIGZhbHNlKTtcblxuXHRcdFx0XHR0aGlzLl9zdGF0ZS5pbkRyYWcgPSB0cnVlO1xuXHRcdFx0XHR2YXIgbmV3VmFsdWUgPSB0aGlzLl9jYWxjdWxhdGVWYWx1ZSgpO1xuXG5cdFx0XHRcdHRoaXMuX3RyaWdnZXIoJ3NsaWRlU3RhcnQnLCBuZXdWYWx1ZSk7XG5cblx0XHRcdFx0dGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0XHRcdGV2LnJldHVyblZhbHVlID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5mb2N1cykge1xuXHRcdFx0XHRcdHRoaXMuX3RyaWdnZXJGb2N1c09uSGFuZGxlKHRoaXMuX3N0YXRlLmRyYWdnZWQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXHRcdFx0X3RvdWNoc3RhcnQ6IGZ1bmN0aW9uIF90b3VjaHN0YXJ0KGV2KSB7XG5cdFx0XHRcdHRoaXMuX21vdXNlZG93bihldik7XG5cdFx0XHR9LFxuXHRcdFx0X3RyaWdnZXJGb2N1c09uSGFuZGxlOiBmdW5jdGlvbiBfdHJpZ2dlckZvY3VzT25IYW5kbGUoaGFuZGxlSWR4KSB7XG5cdFx0XHRcdGlmIChoYW5kbGVJZHggPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZTEuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaGFuZGxlSWR4ID09PSAxKSB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGUyLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRfa2V5ZG93bjogZnVuY3Rpb24gX2tleWRvd24oaGFuZGxlSWR4LCBldikge1xuXHRcdFx0XHRpZiAoIXRoaXMuX3N0YXRlLmVuYWJsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgZGlyO1xuXHRcdFx0XHRzd2l0Y2ggKGV2LmtleUNvZGUpIHtcblx0XHRcdFx0XHRjYXNlIDM3OiAvLyBsZWZ0XG5cdFx0XHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0XHRcdC8vIGRvd25cblx0XHRcdFx0XHRcdGRpciA9IC0xO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAzOTogLy8gcmlnaHRcblx0XHRcdFx0XHRjYXNlIDM4OlxuXHRcdFx0XHRcdFx0Ly8gdXBcblx0XHRcdFx0XHRcdGRpciA9IDE7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWRpcikge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHVzZSBuYXR1cmFsIGFycm93IGtleXMgaW5zdGVhZCBvZiBmcm9tIG1pbiB0byBtYXhcblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5uYXR1cmFsX2Fycm93X2tleXMpIHtcblx0XHRcdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG5cdFx0XHRcdFx0dmFyIGlzVmVydGljYWwgPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCc7XG5cdFx0XHRcdFx0dmFyIGlzUlRMID0gdGhpcy5vcHRpb25zLnJ0bDtcblx0XHRcdFx0XHR2YXIgaXNSZXZlcnNlZCA9IHRoaXMub3B0aW9ucy5yZXZlcnNlZDtcblxuXHRcdFx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0XHRcdGlmIChpc1JUTCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWlzUmV2ZXJzZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRkaXIgPSAtZGlyO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoaXNSZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHRcdGRpciA9IC1kaXI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzVmVydGljYWwpIHtcblx0XHRcdFx0XHRcdGlmICghaXNSZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHRkaXIgPSAtZGlyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB2YWw7XG5cdFx0XHRcdGlmICh0aGlzLnRpY2tzQXJlVmFsaWQgJiYgdGhpcy5vcHRpb25zLmxvY2tfdG9fdGlja3MpIHtcblx0XHRcdFx0XHR2YXIgaW5kZXggPSB2b2lkIDA7XG5cdFx0XHRcdFx0Ly8gRmluZCB0aWNrIGluZGV4IHRoYXQgaGFuZGxlIDEvMiBpcyBjdXJyZW50bHkgb25cblx0XHRcdFx0XHRpbmRleCA9IHRoaXMub3B0aW9ucy50aWNrcy5pbmRleE9mKHRoaXMuX3N0YXRlLnZhbHVlW2hhbmRsZUlkeF0pO1xuXHRcdFx0XHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdC8vIFNldCBkZWZhdWx0IHRvIGZpcnN0IHRpY2tcblx0XHRcdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdFx0XHRcdHdpbmRvdy5jb25zb2xlLndhcm4oJyhsb2NrX3RvX3RpY2tzKSBfa2V5ZG93bjogaW5kZXggc2hvdWxkIG5vdCBiZSAtMScpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSBkaXI7XG5cdFx0XHRcdFx0aW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLm9wdGlvbnMudGlja3MubGVuZ3RoIC0gMSwgaW5kZXgpKTtcblx0XHRcdFx0XHR2YWwgPSB0aGlzLm9wdGlvbnMudGlja3NbaW5kZXhdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbCA9IHRoaXMuX3N0YXRlLnZhbHVlW2hhbmRsZUlkeF0gKyBkaXIgKiB0aGlzLm9wdGlvbnMuc3RlcDtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgcGVyY2VudGFnZSA9IHRoaXMuX3RvUGVyY2VudGFnZSh2YWwpO1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5rZXlDdHJsID0gaGFuZGxlSWR4O1xuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJhbmdlKSB7XG5cdFx0XHRcdFx0dGhpcy5fYWRqdXN0UGVyY2VudGFnZUZvclJhbmdlU2xpZGVycyhwZXJjZW50YWdlKTtcblx0XHRcdFx0XHR2YXIgdmFsMSA9ICF0aGlzLl9zdGF0ZS5rZXlDdHJsID8gdmFsIDogdGhpcy5fc3RhdGUudmFsdWVbMF07XG5cdFx0XHRcdFx0dmFyIHZhbDIgPSB0aGlzLl9zdGF0ZS5rZXlDdHJsID8gdmFsIDogdGhpcy5fc3RhdGUudmFsdWVbMV07XG5cdFx0XHRcdFx0Ly8gUmVzdHJpY3QgdmFsdWVzIHdpdGhpbiBsaW1pdHNcblx0XHRcdFx0XHR2YWwgPSBbTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pbiwgTWF0aC5taW4odGhpcy5vcHRpb25zLm1heCwgdmFsMSkpLCBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluLCBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LCB2YWwyKSldO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbCA9IE1hdGgubWF4KHRoaXMub3B0aW9ucy5taW4sIE1hdGgubWluKHRoaXMub3B0aW9ucy5tYXgsIHZhbCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdHJpZ2dlcignc2xpZGVTdGFydCcsIHZhbCk7XG5cblx0XHRcdFx0dGhpcy5zZXRWYWx1ZSh2YWwsIHRydWUsIHRydWUpO1xuXG5cdFx0XHRcdHRoaXMuX3RyaWdnZXIoJ3NsaWRlU3RvcCcsIHZhbCk7XG5cblx0XHRcdFx0dGhpcy5fcGF1c2VFdmVudChldik7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9zdGF0ZS5rZXlDdHJsO1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRfcGF1c2VFdmVudDogZnVuY3Rpb24gX3BhdXNlRXZlbnQoZXYpIHtcblx0XHRcdFx0aWYgKGV2LnN0b3BQcm9wYWdhdGlvbikge1xuXHRcdFx0XHRcdGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChldi5wcmV2ZW50RGVmYXVsdCkge1xuXHRcdFx0XHRcdGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZXYuY2FuY2VsQnViYmxlID0gdHJ1ZTtcblx0XHRcdFx0ZXYucmV0dXJuVmFsdWUgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRfbW91c2Vtb3ZlOiBmdW5jdGlvbiBfbW91c2Vtb3ZlKGV2KSB7XG5cdFx0XHRcdGlmICghdGhpcy5fc3RhdGUuZW5hYmxlZCkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwZXJjZW50YWdlID0gdGhpcy5fZ2V0UGVyY2VudGFnZShldik7XG5cdFx0XHRcdHRoaXMuX2FkanVzdFBlcmNlbnRhZ2VGb3JSYW5nZVNsaWRlcnMocGVyY2VudGFnZSk7XG5cdFx0XHRcdHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbdGhpcy5fc3RhdGUuZHJhZ2dlZF0gPSBwZXJjZW50YWdlO1xuXG5cdFx0XHRcdHZhciB2YWwgPSB0aGlzLl9jYWxjdWxhdGVWYWx1ZSh0cnVlKTtcblx0XHRcdFx0dGhpcy5zZXRWYWx1ZSh2YWwsIHRydWUsIHRydWUpO1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRfdG91Y2htb3ZlOiBmdW5jdGlvbiBfdG91Y2htb3ZlKGV2KSB7XG5cdFx0XHRcdGlmIChldi5jaGFuZ2VkVG91Y2hlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUHJldmVudCBwYWdlIGZyb20gc2Nyb2xsaW5nIGFuZCBvbmx5IGRyYWcgdGhlIHNsaWRlclxuXHRcdFx0XHRpZiAoZXYucHJldmVudERlZmF1bHQpIHtcblx0XHRcdFx0XHRldi5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2FkanVzdFBlcmNlbnRhZ2VGb3JSYW5nZVNsaWRlcnM6IGZ1bmN0aW9uIF9hZGp1c3RQZXJjZW50YWdlRm9yUmFuZ2VTbGlkZXJzKHBlcmNlbnRhZ2UpIHtcblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5yYW5nZSkge1xuXHRcdFx0XHRcdHZhciBwcmVjaXNpb24gPSB0aGlzLl9nZXROdW1EaWdpdHNBZnRlckRlY2ltYWxQbGFjZShwZXJjZW50YWdlKTtcblx0XHRcdFx0XHRwcmVjaXNpb24gPSBwcmVjaXNpb24gPyBwcmVjaXNpb24gLSAxIDogMDtcblx0XHRcdFx0XHR2YXIgcGVyY2VudGFnZVdpdGhBZGp1c3RlZFByZWNpc2lvbiA9IHRoaXMuX2FwcGx5VG9GaXhlZEFuZFBhcnNlRmxvYXQocGVyY2VudGFnZSwgcHJlY2lzaW9uKTtcblx0XHRcdFx0XHRpZiAodGhpcy5fc3RhdGUuZHJhZ2dlZCA9PT0gMCAmJiB0aGlzLl9hcHBseVRvRml4ZWRBbmRQYXJzZUZsb2F0KHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbMV0sIHByZWNpc2lvbikgPCBwZXJjZW50YWdlV2l0aEFkanVzdGVkUHJlY2lzaW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzBdID0gdGhpcy5fc3RhdGUucGVyY2VudGFnZVsxXTtcblx0XHRcdFx0XHRcdHRoaXMuX3N0YXRlLmRyYWdnZWQgPSAxO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fc3RhdGUuZHJhZ2dlZCA9PT0gMSAmJiB0aGlzLl9hcHBseVRvRml4ZWRBbmRQYXJzZUZsb2F0KHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbMF0sIHByZWNpc2lvbikgPiBwZXJjZW50YWdlV2l0aEFkanVzdGVkUHJlY2lzaW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzFdID0gdGhpcy5fc3RhdGUucGVyY2VudGFnZVswXTtcblx0XHRcdFx0XHRcdHRoaXMuX3N0YXRlLmRyYWdnZWQgPSAwO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fc3RhdGUua2V5Q3RybCA9PT0gMCAmJiB0aGlzLl90b1BlcmNlbnRhZ2UodGhpcy5fc3RhdGUudmFsdWVbMV0pIDwgcGVyY2VudGFnZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc3RhdGUucGVyY2VudGFnZVswXSA9IHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbMV07XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGF0ZS5rZXlDdHJsID0gMTtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlMi5mb2N1cygpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fc3RhdGUua2V5Q3RybCA9PT0gMSAmJiB0aGlzLl90b1BlcmNlbnRhZ2UodGhpcy5fc3RhdGUudmFsdWVbMF0pID4gcGVyY2VudGFnZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc3RhdGUucGVyY2VudGFnZVsxXSA9IHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbMF07XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGF0ZS5rZXlDdHJsID0gMDtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlMS5mb2N1cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9tb3VzZXVwOiBmdW5jdGlvbiBfbW91c2V1cChldikge1xuXHRcdFx0XHRpZiAoIXRoaXMuX3N0YXRlLmVuYWJsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGVyY2VudGFnZSA9IHRoaXMuX2dldFBlcmNlbnRhZ2UoZXYpO1xuXHRcdFx0XHR0aGlzLl9hZGp1c3RQZXJjZW50YWdlRm9yUmFuZ2VTbGlkZXJzKHBlcmNlbnRhZ2UpO1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5wZXJjZW50YWdlW3RoaXMuX3N0YXRlLmRyYWdnZWRdID0gcGVyY2VudGFnZTtcblxuXHRcdFx0XHRpZiAodGhpcy50b3VjaENhcGFibGUpIHtcblx0XHRcdFx0XHQvLyBUb3VjaDogVW5iaW5kIHRvdWNoIGV2ZW50IGhhbmRsZXJzOlxuXHRcdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5tb3VzZW1vdmUsIGZhbHNlKTtcblx0XHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5tb3VzZXVwLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVW5iaW5kIG1vdXNlIGV2ZW50IGhhbmRsZXJzOlxuXHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlLCBmYWxzZSk7XG5cdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMubW91c2V1cCwgZmFsc2UpO1xuXG5cdFx0XHRcdHRoaXMuX3N0YXRlLmluRHJhZyA9IGZhbHNlO1xuXHRcdFx0XHRpZiAodGhpcy5fc3RhdGUub3ZlciA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHR0aGlzLl9oaWRlVG9vbHRpcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciB2YWwgPSB0aGlzLl9jYWxjdWxhdGVWYWx1ZSh0cnVlKTtcblxuXHRcdFx0XHR0aGlzLnNldFZhbHVlKHZhbCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR0aGlzLl90cmlnZ2VyKCdzbGlkZVN0b3AnLCB2YWwpO1xuXG5cdFx0XHRcdC8vIE5vIGxvbmdlciBuZWVkICdkcmFnZ2VkJyBhZnRlciBtb3VzZSB1cFxuXHRcdFx0XHR0aGlzLl9zdGF0ZS5kcmFnZ2VkID0gbnVsbDtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0X3NldFZhbHVlczogZnVuY3Rpb24gX3NldFZhbHVlcyhpbmRleCwgdmFsKSB7XG5cdFx0XHRcdHZhciBjb21wID0gMCA9PT0gaW5kZXggPyAwIDogMTAwO1xuXHRcdFx0XHRpZiAodGhpcy5fc3RhdGUucGVyY2VudGFnZVtpbmRleF0gIT09IGNvbXApIHtcblx0XHRcdFx0XHR2YWwuZGF0YVtpbmRleF0gPSB0aGlzLl90b1ZhbHVlKHRoaXMuX3N0YXRlLnBlcmNlbnRhZ2VbaW5kZXhdKTtcblx0XHRcdFx0XHR2YWwuZGF0YVtpbmRleF0gPSB0aGlzLl9hcHBseVByZWNpc2lvbih2YWwuZGF0YVtpbmRleF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2NhbGN1bGF0ZVZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlVmFsdWUoc25hcFRvQ2xvc2VzdFRpY2spIHtcblx0XHRcdFx0dmFyIHZhbCA9IHt9O1xuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJhbmdlKSB7XG5cdFx0XHRcdFx0dmFsLmRhdGEgPSBbdGhpcy5vcHRpb25zLm1pbiwgdGhpcy5vcHRpb25zLm1heF07XG5cdFx0XHRcdFx0dGhpcy5fc2V0VmFsdWVzKDAsIHZhbCk7XG5cdFx0XHRcdFx0dGhpcy5fc2V0VmFsdWVzKDEsIHZhbCk7XG5cdFx0XHRcdFx0aWYgKHNuYXBUb0Nsb3Nlc3RUaWNrKSB7XG5cdFx0XHRcdFx0XHR2YWwuZGF0YVswXSA9IHRoaXMuX3NuYXBUb0Nsb3Nlc3RUaWNrKHZhbC5kYXRhWzBdKTtcblx0XHRcdFx0XHRcdHZhbC5kYXRhWzFdID0gdGhpcy5fc25hcFRvQ2xvc2VzdFRpY2sodmFsLmRhdGFbMV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWwuZGF0YSA9IHRoaXMuX3RvVmFsdWUodGhpcy5fc3RhdGUucGVyY2VudGFnZVswXSk7XG5cdFx0XHRcdFx0dmFsLmRhdGEgPSBwYXJzZUZsb2F0KHZhbC5kYXRhKTtcblx0XHRcdFx0XHR2YWwuZGF0YSA9IHRoaXMuX2FwcGx5UHJlY2lzaW9uKHZhbC5kYXRhKTtcblx0XHRcdFx0XHRpZiAoc25hcFRvQ2xvc2VzdFRpY2spIHtcblx0XHRcdFx0XHRcdHZhbC5kYXRhID0gdGhpcy5fc25hcFRvQ2xvc2VzdFRpY2sodmFsLmRhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWwuZGF0YTtcblx0XHRcdH0sXG5cdFx0XHRfc25hcFRvQ2xvc2VzdFRpY2s6IGZ1bmN0aW9uIF9zbmFwVG9DbG9zZXN0VGljayh2YWwpIHtcblx0XHRcdFx0dmFyIG1pbiA9IFt2YWwsIEluZmluaXR5XTtcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMudGlja3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YXIgZGlmZiA9IE1hdGguYWJzKHRoaXMub3B0aW9ucy50aWNrc1tpXSAtIHZhbCk7XG5cdFx0XHRcdFx0aWYgKGRpZmYgPD0gbWluWzFdKSB7XG5cdFx0XHRcdFx0XHRtaW4gPSBbdGhpcy5vcHRpb25zLnRpY2tzW2ldLCBkaWZmXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG1pblsxXSA8PSB0aGlzLm9wdGlvbnMudGlja3Nfc25hcF9ib3VuZHMpIHtcblx0XHRcdFx0XHRyZXR1cm4gbWluWzBdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWw7XG5cdFx0XHR9LFxuXG5cdFx0XHRfYXBwbHlQcmVjaXNpb246IGZ1bmN0aW9uIF9hcHBseVByZWNpc2lvbih2YWwpIHtcblx0XHRcdFx0dmFyIHByZWNpc2lvbiA9IHRoaXMub3B0aW9ucy5wcmVjaXNpb24gfHwgdGhpcy5fZ2V0TnVtRGlnaXRzQWZ0ZXJEZWNpbWFsUGxhY2UodGhpcy5vcHRpb25zLnN0ZXApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fYXBwbHlUb0ZpeGVkQW5kUGFyc2VGbG9hdCh2YWwsIHByZWNpc2lvbik7XG5cdFx0XHR9LFxuXHRcdFx0X2dldE51bURpZ2l0c0FmdGVyRGVjaW1hbFBsYWNlOiBmdW5jdGlvbiBfZ2V0TnVtRGlnaXRzQWZ0ZXJEZWNpbWFsUGxhY2UobnVtKSB7XG5cdFx0XHRcdHZhciBtYXRjaCA9ICgnJyArIG51bSkubWF0Y2goLyg/OlxcLihcXGQrKSk/KD86W2VFXShbKy1dP1xcZCspKT8kLyk7XG5cdFx0XHRcdGlmICghbWF0Y2gpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoMCwgKG1hdGNoWzFdID8gbWF0Y2hbMV0ubGVuZ3RoIDogMCkgLSAobWF0Y2hbMl0gPyArbWF0Y2hbMl0gOiAwKSk7XG5cdFx0XHR9LFxuXHRcdFx0X2FwcGx5VG9GaXhlZEFuZFBhcnNlRmxvYXQ6IGZ1bmN0aW9uIF9hcHBseVRvRml4ZWRBbmRQYXJzZUZsb2F0KG51bSwgdG9GaXhlZElucHV0KSB7XG5cdFx0XHRcdHZhciB0cnVuY2F0ZWROdW0gPSBudW0udG9GaXhlZCh0b0ZpeGVkSW5wdXQpO1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VGbG9hdCh0cnVuY2F0ZWROdW0pO1xuXHRcdFx0fSxcblx0XHRcdC8qXG4gICBcdENyZWRpdHMgdG8gTWlrZSBTYW11ZWwgZm9yIHRoZSBmb2xsb3dpbmcgbWV0aG9kIVxuICAgXHRTb3VyY2U6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA0NTQ1MTgvamF2YXNjcmlwdC1ob3ctdG8tcmV0cmlldmUtdGhlLW51bWJlci1vZi1kZWNpbWFscy1vZi1hLXN0cmluZy1udW1iZXJcbiAgICovXG5cdFx0XHRfZ2V0UGVyY2VudGFnZTogZnVuY3Rpb24gX2dldFBlcmNlbnRhZ2UoZXYpIHtcblx0XHRcdFx0aWYgKHRoaXMudG91Y2hDYXBhYmxlICYmIChldi50eXBlID09PSAndG91Y2hzdGFydCcgfHwgZXYudHlwZSA9PT0gJ3RvdWNobW92ZScgfHwgZXYudHlwZSA9PT0gJ3RvdWNoZW5kJykpIHtcblx0XHRcdFx0XHRldiA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGV2ZW50UG9zaXRpb24gPSBldlt0aGlzLm1vdXNlUG9zXTtcblx0XHRcdFx0dmFyIHNsaWRlck9mZnNldCA9IHRoaXMuX3N0YXRlLm9mZnNldFt0aGlzLnN0eWxlUG9zXTtcblx0XHRcdFx0dmFyIGRpc3RhbmNlVG9TbGlkZSA9IGV2ZW50UG9zaXRpb24gLSBzbGlkZXJPZmZzZXQ7XG5cdFx0XHRcdGlmICh0aGlzLnN0eWxlUG9zID09PSAncmlnaHQnKSB7XG5cdFx0XHRcdFx0ZGlzdGFuY2VUb1NsaWRlID0gLWRpc3RhbmNlVG9TbGlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBDYWxjdWxhdGUgd2hhdCBwZXJjZW50IG9mIHRoZSBsZW5ndGggdGhlIHNsaWRlciBoYW5kbGUgaGFzIHNsaWRcblx0XHRcdFx0dmFyIHBlcmNlbnRhZ2UgPSBkaXN0YW5jZVRvU2xpZGUgLyB0aGlzLl9zdGF0ZS5zaXplICogMTAwO1xuXHRcdFx0XHRwZXJjZW50YWdlID0gTWF0aC5yb3VuZChwZXJjZW50YWdlIC8gdGhpcy5fc3RhdGUucGVyY2VudGFnZVsyXSkgKiB0aGlzLl9zdGF0ZS5wZXJjZW50YWdlWzJdO1xuXHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJldmVyc2VkKSB7XG5cdFx0XHRcdFx0cGVyY2VudGFnZSA9IDEwMCAtIHBlcmNlbnRhZ2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhlIHBlcmNlbnQgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHNsaWRlci5cblx0XHRcdFx0Ly8gMCUgY29ycmVzcG9uZHMgdG8gdGhlICdtaW4nIHZhbHVlIG9mIHRoZSBzbGlkZVxuXHRcdFx0XHQvLyAxMDAlIGNvcnJlc3BvbmRzIHRvIHRoZSAnbWF4JyB2YWx1ZSBvZiB0aGUgc2xpZGVcblx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgcGVyY2VudGFnZSkpO1xuXHRcdFx0fSxcblx0XHRcdF92YWxpZGF0ZUlucHV0VmFsdWU6IGZ1bmN0aW9uIF92YWxpZGF0ZUlucHV0VmFsdWUodmFsKSB7XG5cdFx0XHRcdGlmICghaXNOYU4oK3ZhbCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gK3ZhbDtcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdFx0XHR0aGlzLl92YWxpZGF0ZUFycmF5KHZhbCk7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoRXJyb3JNc2dzLmZvcm1hdEludmFsaWRJbnB1dEVycm9yTXNnKHZhbCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3ZhbGlkYXRlQXJyYXk6IGZ1bmN0aW9uIF92YWxpZGF0ZUFycmF5KHZhbCkge1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhciBpbnB1dCA9IHZhbFtpXTtcblx0XHRcdFx0XHRpZiAodHlwZW9mIGlucHV0ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKEVycm9yTXNncy5mb3JtYXRJbnZhbGlkSW5wdXRFcnJvck1zZyhpbnB1dCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9zZXREYXRhVmFsOiBmdW5jdGlvbiBfc2V0RGF0YVZhbCh2YWwpIHtcblx0XHRcdFx0dGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScsIHZhbCk7XG5cdFx0XHRcdHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdmFsKTtcblx0XHRcdFx0dGhpcy5lbGVtZW50LnZhbHVlID0gdmFsO1xuXHRcdFx0fSxcblx0XHRcdF90cmlnZ2VyOiBmdW5jdGlvbiBfdHJpZ2dlcihldnQsIHZhbCkge1xuXHRcdFx0XHR2YWwgPSB2YWwgfHwgdmFsID09PSAwID8gdmFsIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja0ZuQXJyYXkgPSB0aGlzLmV2ZW50VG9DYWxsYmFja01hcFtldnRdO1xuXHRcdFx0XHRpZiAoY2FsbGJhY2tGbkFycmF5ICYmIGNhbGxiYWNrRm5BcnJheS5sZW5ndGgpIHtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrRm5BcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrRm4gPSBjYWxsYmFja0ZuQXJyYXlbaV07XG5cdFx0XHRcdFx0XHRjYWxsYmFja0ZuKHZhbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyogSWYgSlF1ZXJ5IGV4aXN0cywgdHJpZ2dlciBKUXVlcnkgZXZlbnRzICovXG5cdFx0XHRcdGlmICgkKSB7XG5cdFx0XHRcdFx0dGhpcy5fdHJpZ2dlckpRdWVyeUV2ZW50KGV2dCwgdmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF90cmlnZ2VySlF1ZXJ5RXZlbnQ6IGZ1bmN0aW9uIF90cmlnZ2VySlF1ZXJ5RXZlbnQoZXZ0LCB2YWwpIHtcblx0XHRcdFx0dmFyIGV2ZW50RGF0YSA9IHtcblx0XHRcdFx0XHR0eXBlOiBldnQsXG5cdFx0XHRcdFx0dmFsdWU6IHZhbFxuXHRcdFx0XHR9O1xuXHRcdFx0XHR0aGlzLiRlbGVtZW50LnRyaWdnZXIoZXZlbnREYXRhKTtcblx0XHRcdFx0dGhpcy4kc2xpZGVyRWxlbS50cmlnZ2VyKGV2ZW50RGF0YSk7XG5cdFx0XHR9LFxuXHRcdFx0X3VuYmluZEpRdWVyeUV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uIF91bmJpbmRKUXVlcnlFdmVudEhhbmRsZXJzKCkge1xuXHRcdFx0XHR0aGlzLiRlbGVtZW50Lm9mZigpO1xuXHRcdFx0XHR0aGlzLiRzbGlkZXJFbGVtLm9mZigpO1xuXHRcdFx0fSxcblx0XHRcdF9zZXRUZXh0OiBmdW5jdGlvbiBfc2V0VGV4dChlbGVtZW50LCB0ZXh0KSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LmlubmVyVGV4dCAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGVsZW1lbnQuaW5uZXJUZXh0ID0gdGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdF9yZW1vdmVDbGFzczogZnVuY3Rpb24gX3JlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzU3RyaW5nKSB7XG5cdFx0XHRcdHZhciBjbGFzc2VzID0gY2xhc3NTdHJpbmcuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHR2YXIgbmV3Q2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NOYW1lO1xuXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhciBjbGFzc1RhZyA9IGNsYXNzZXNbaV07XG5cdFx0XHRcdFx0dmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cChcIig/OlxcXFxzfF4pXCIgKyBjbGFzc1RhZyArIFwiKD86XFxcXHN8JClcIik7XG5cdFx0XHRcdFx0bmV3Q2xhc3NlcyA9IG5ld0NsYXNzZXMucmVwbGFjZShyZWdleCwgXCIgXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbWVudC5jbGFzc05hbWUgPSBuZXdDbGFzc2VzLnRyaW0oKTtcblx0XHRcdH0sXG5cdFx0XHRfYWRkQ2xhc3M6IGZ1bmN0aW9uIF9hZGRDbGFzcyhlbGVtZW50LCBjbGFzc1N0cmluZykge1xuXHRcdFx0XHR2YXIgY2xhc3NlcyA9IGNsYXNzU3RyaW5nLnNwbGl0KFwiIFwiKTtcblx0XHRcdFx0dmFyIG5ld0NsYXNzZXMgPSBlbGVtZW50LmNsYXNzTmFtZTtcblxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YXIgY2xhc3NUYWcgPSBjbGFzc2VzW2ldO1xuXHRcdFx0XHRcdHZhciByZWdleCA9IG5ldyBSZWdFeHAoXCIoPzpcXFxcc3xeKVwiICsgY2xhc3NUYWcgKyBcIig/OlxcXFxzfCQpXCIpO1xuXHRcdFx0XHRcdHZhciBpZkNsYXNzRXhpc3RzID0gcmVnZXgudGVzdChuZXdDbGFzc2VzKTtcblxuXHRcdFx0XHRcdGlmICghaWZDbGFzc0V4aXN0cykge1xuXHRcdFx0XHRcdFx0bmV3Q2xhc3NlcyArPSBcIiBcIiArIGNsYXNzVGFnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3Q2xhc3Nlcy50cmltKCk7XG5cdFx0XHR9LFxuXHRcdFx0X29mZnNldExlZnQ6IGZ1bmN0aW9uIF9vZmZzZXRMZWZ0KG9iaikge1xuXHRcdFx0XHRyZXR1cm4gb2JqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHR9LFxuXHRcdFx0X29mZnNldFJpZ2h0OiBmdW5jdGlvbiBfb2Zmc2V0UmlnaHQob2JqKSB7XG5cdFx0XHRcdHJldHVybiBvYmouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7XG5cdFx0XHR9LFxuXHRcdFx0X29mZnNldFRvcDogZnVuY3Rpb24gX29mZnNldFRvcChvYmopIHtcblx0XHRcdFx0dmFyIG9mZnNldFRvcCA9IG9iai5vZmZzZXRUb3A7XG5cdFx0XHRcdHdoaWxlICgob2JqID0gb2JqLm9mZnNldFBhcmVudCkgJiYgIWlzTmFOKG9iai5vZmZzZXRUb3ApKSB7XG5cdFx0XHRcdFx0b2Zmc2V0VG9wICs9IG9iai5vZmZzZXRUb3A7XG5cdFx0XHRcdFx0aWYgKG9iai50YWdOYW1lICE9PSAnQk9EWScpIHtcblx0XHRcdFx0XHRcdG9mZnNldFRvcCAtPSBvYmouc2Nyb2xsVG9wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb2Zmc2V0VG9wO1xuXHRcdFx0fSxcblx0XHRcdF9vZmZzZXQ6IGZ1bmN0aW9uIF9vZmZzZXQob2JqKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bGVmdDogdGhpcy5fb2Zmc2V0TGVmdChvYmopLFxuXHRcdFx0XHRcdHJpZ2h0OiB0aGlzLl9vZmZzZXRSaWdodChvYmopLFxuXHRcdFx0XHRcdHRvcDogdGhpcy5fb2Zmc2V0VG9wKG9iailcblx0XHRcdFx0fTtcblx0XHRcdH0sXG5cdFx0XHRfY3NzOiBmdW5jdGlvbiBfY3NzKGVsZW1lbnRSZWYsIHN0eWxlTmFtZSwgdmFsdWUpIHtcblx0XHRcdFx0aWYgKCQpIHtcblx0XHRcdFx0XHQkLnN0eWxlKGVsZW1lbnRSZWYsIHN0eWxlTmFtZSwgdmFsdWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBzdHlsZSA9IHN0eWxlTmFtZS5yZXBsYWNlKC9eLW1zLS8sIFwibXMtXCIpLnJlcGxhY2UoLy0oW1xcZGEtel0pL2dpLCBmdW5jdGlvbiAoYWxsLCBsZXR0ZXIpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRlbGVtZW50UmVmLnN0eWxlW3N0eWxlXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3RvVmFsdWU6IGZ1bmN0aW9uIF90b1ZhbHVlKHBlcmNlbnRhZ2UpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5zY2FsZS50b1ZhbHVlLmFwcGx5KHRoaXMsIFtwZXJjZW50YWdlXSk7XG5cdFx0XHR9LFxuXHRcdFx0X3RvUGVyY2VudGFnZTogZnVuY3Rpb24gX3RvUGVyY2VudGFnZSh2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnNjYWxlLnRvUGVyY2VudGFnZS5hcHBseSh0aGlzLCBbdmFsdWVdKTtcblx0XHRcdH0sXG5cdFx0XHRfc2V0VG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbiBfc2V0VG9vbHRpcFBvc2l0aW9uKCkge1xuXHRcdFx0XHR2YXIgdG9vbHRpcHMgPSBbdGhpcy50b29sdGlwLCB0aGlzLnRvb2x0aXBfbWluLCB0aGlzLnRvb2x0aXBfbWF4XTtcblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuXHRcdFx0XHRcdHZhciB0b29sdGlwUG9zO1xuXHRcdFx0XHRcdGlmICh0aGlzLm9wdGlvbnMudG9vbHRpcF9wb3NpdGlvbikge1xuXHRcdFx0XHRcdFx0dG9vbHRpcFBvcyA9IHRoaXMub3B0aW9ucy50b29sdGlwX3Bvc2l0aW9uO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuXHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zID0gJ2xlZnQnO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dG9vbHRpcFBvcyA9ICdyaWdodCc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciBvcHBvc2l0ZVNpZGUgPSB0b29sdGlwUG9zID09PSAnbGVmdCcgPyAncmlnaHQnIDogJ2xlZnQnO1xuXHRcdFx0XHRcdHRvb2x0aXBzLmZvckVhY2goZnVuY3Rpb24gKHRvb2x0aXApIHtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRvb2x0aXAsICdicy10b29sdGlwLScgKyB0b29sdGlwUG9zKTtcblx0XHRcdFx0XHRcdHRvb2x0aXAuc3R5bGVbb3Bwb3NpdGVTaWRlXSA9ICcxMDAlJztcblx0XHRcdFx0XHR9LmJpbmQodGhpcykpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy50b29sdGlwX3Bvc2l0aW9uID09PSAnYm90dG9tJykge1xuXHRcdFx0XHRcdHRvb2x0aXBzLmZvckVhY2goZnVuY3Rpb24gKHRvb2x0aXApIHtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZENsYXNzKHRvb2x0aXAsICdicy10b29sdGlwLWJvdHRvbScpO1xuXHRcdFx0XHRcdFx0dG9vbHRpcC5zdHlsZS50b3AgPSAyMiArICdweCc7XG5cdFx0XHRcdFx0fS5iaW5kKHRoaXMpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0b29sdGlwcy5mb3JFYWNoKGZ1bmN0aW9uICh0b29sdGlwKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRDbGFzcyh0b29sdGlwLCAnYnMtdG9vbHRpcC10b3AnKTtcblx0XHRcdFx0XHRcdHRvb2x0aXAuc3R5bGUudG9wID0gLXRoaXMudG9vbHRpcC5vdXRlckhlaWdodCAtIDE0ICsgJ3B4Jztcblx0XHRcdFx0XHR9LmJpbmQodGhpcykpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2dldENsb3Nlc3RUaWNrSW5kZXg6IGZ1bmN0aW9uIF9nZXRDbG9zZXN0VGlja0luZGV4KHZhbCkge1xuXHRcdFx0XHR2YXIgZGlmZmVyZW5jZSA9IE1hdGguYWJzKHZhbCAtIHRoaXMub3B0aW9ucy50aWNrc1swXSk7XG5cdFx0XHRcdHZhciBpbmRleCA9IDA7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRpY2tzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdFx0dmFyIGQgPSBNYXRoLmFicyh2YWwgLSB0aGlzLm9wdGlvbnMudGlja3NbaV0pO1xuXHRcdFx0XHRcdGlmIChkIDwgZGlmZmVyZW5jZSkge1xuXHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSA9IGQ7XG5cdFx0XHRcdFx0XHRpbmRleCA9IGk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBpbmRleDtcblx0XHRcdH0sXG5cdFx0XHQvKipcbiAgICAqIEF0dGVtcHRzIHRvIGZpbmQgdGhlIGluZGV4IGluIGB0aWNrc1tdYCB0aGUgc2xpZGVyIHZhbHVlcyBhcmUgc2V0IGF0LlxuICAgICogVGhlIGluZGV4ZXMgY2FuIGJlIC0xIHRvIGluZGljYXRlIHRoZSBzbGlkZXIgdmFsdWUgaXMgbm90IHNldCBhdCBhIHZhbHVlIGluIGB0aWNrc1tdYC5cbiAgICAqL1xuXHRcdFx0X3NldFRpY2tJbmRleDogZnVuY3Rpb24gX3NldFRpY2tJbmRleCgpIHtcblx0XHRcdFx0aWYgKHRoaXMudGlja3NBcmVWYWxpZCkge1xuXHRcdFx0XHRcdHRoaXMuX3N0YXRlLnRpY2tJbmRleCA9IFt0aGlzLm9wdGlvbnMudGlja3MuaW5kZXhPZih0aGlzLl9zdGF0ZS52YWx1ZVswXSksIHRoaXMub3B0aW9ucy50aWNrcy5pbmRleE9mKHRoaXMuX3N0YXRlLnZhbHVlWzFdKV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBcdFx0QXR0YWNoIHRvIGdsb2JhbCBuYW1lc3BhY2VcbiAgXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdFx0aWYgKCQgJiYgJC5mbikge1xuXHRcdFx0aWYgKCEkLmZuLnNsaWRlcikge1xuXHRcdFx0XHQkLmJyaWRnZXQoTkFNRVNQQUNFX01BSU4sIFNsaWRlcik7XG5cdFx0XHRcdGF1dG9SZWdpc3Rlck5hbWVzcGFjZSA9IE5BTUVTUEFDRV9NQUlOO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHdpbmRvd0lzRGVmaW5lZCkge1xuXHRcdFx0XHRcdHdpbmRvdy5jb25zb2xlLndhcm4oXCJib290c3RyYXAtc2xpZGVyLmpzIC0gV0FSTklORzogJC5mbi5zbGlkZXIgbmFtZXNwYWNlIGlzIGFscmVhZHkgYm91bmQuIFVzZSB0aGUgJC5mbi5ib290c3RyYXBTbGlkZXIgbmFtZXNwYWNlIGluc3RlYWQuXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF1dG9SZWdpc3Rlck5hbWVzcGFjZSA9IE5BTUVTUEFDRV9BTFRFUk5BVEU7XG5cdFx0XHR9XG5cdFx0XHQkLmJyaWRnZXQoTkFNRVNQQUNFX0FMVEVSTkFURSwgU2xpZGVyKTtcblxuXHRcdFx0Ly8gQXV0by1SZWdpc3RlciBkYXRhLXByb3ZpZGU9XCJzbGlkZXJcIiBFbGVtZW50c1xuXHRcdFx0JChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCQoXCJpbnB1dFtkYXRhLXByb3ZpZGU9c2xpZGVyXVwiKVthdXRvUmVnaXN0ZXJOYW1lc3BhY2VdKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pKCQpO1xuXG5cdHJldHVybiBTbGlkZXI7XG59KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsIi8qIVxuICAqIEJvb3RzdHJhcCB2NC41LjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyMCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdqcXVlcnknKSwgcmVxdWlyZSgncG9wcGVyLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdqcXVlcnknLCAncG9wcGVyLmpzJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuYm9vdHN0cmFwID0ge30sIGdsb2JhbC5qUXVlcnksIGdsb2JhbC5Qb3BwZXIpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCAkLCBQb3BwZXIpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeSAoZSkgeyByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsgfVxuXG4gIHZhciAkX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeSgkKTtcbiAgdmFyIFBvcHBlcl9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3koUG9wcGVyKTtcblxuICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuNS4zKTogdXRpbC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHJpdmF0ZSBUcmFuc2l0aW9uRW5kIEhlbHBlcnNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJztcbiAgdmFyIE1BWF9VSUQgPSAxMDAwMDAwO1xuICB2YXIgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwOyAvLyBTaG91dG91dCBBbmd1c0Nyb2xsIChodHRwczovL2dvby5nbC9weHdRR3ApXG5cbiAgZnVuY3Rpb24gdG9UeXBlKG9iaikge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBcIlwiICsgb2JqO1xuICAgIH1cblxuICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTcGVjaWFsVHJhbnNpdGlvbkVuZEV2ZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kVHlwZTogVFJBTlNJVElPTl9FTkQsXG4gICAgICBkZWxlZ2F0ZVR5cGU6IFRSQU5TSVRJT05fRU5ELFxuICAgICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC50YXJnZXQpLmlzKHRoaXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kRW11bGF0b3IoZHVyYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIFV0aWwudHJpZ2dlclRyYW5zaXRpb25FbmQoX3RoaXMpO1xuICAgICAgfVxuICAgIH0sIGR1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRyYW5zaXRpb25FbmRTdXBwb3J0KCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmRFbXVsYXRvcjtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZXZlbnQuc3BlY2lhbFtVdGlsLlRSQU5TSVRJT05fRU5EXSA9IGdldFNwZWNpYWxUcmFuc2l0aW9uRW5kRXZlbnQoKTtcbiAgfVxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHVibGljIFV0aWwgQXBpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgdmFyIFV0aWwgPSB7XG4gICAgVFJBTlNJVElPTl9FTkQ6ICdic1RyYW5zaXRpb25FbmQnLFxuICAgIGdldFVJRDogZnVuY3Rpb24gZ2V0VUlEKHByZWZpeCkge1xuICAgICAgZG8ge1xuICAgICAgICBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIE1BWF9VSUQpOyAvLyBcIn5+XCIgYWN0cyBsaWtlIGEgZmFzdGVyIE1hdGguZmxvb3IoKSBoZXJlXG4gICAgICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKTtcblxuICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0Jyk7XG5cbiAgICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgICB2YXIgaHJlZkF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICBzZWxlY3RvciA9IGhyZWZBdHRyICYmIGhyZWZBdHRyICE9PSAnIycgPyBocmVmQXR0ci50cmltKCkgOiAnJztcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OiBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG5cblxuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jc3MoJ3RyYW5zaXRpb24tZHVyYXRpb24nKTtcbiAgICAgIHZhciB0cmFuc2l0aW9uRGVsYXkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuY3NzKCd0cmFuc2l0aW9uLWRlbGF5Jyk7XG4gICAgICB2YXIgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB2YXIgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBwYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7IC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcblxuICAgICAgaWYgKCFmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiAmJiAhZmxvYXRUcmFuc2l0aW9uRGVsYXkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcblxuXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgICAgIHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdO1xuICAgICAgcmV0dXJuIChwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKyBwYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG4gICAgfSxcbiAgICByZWZsb3c6IGZ1bmN0aW9uIHJlZmxvdyhlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSxcbiAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJpZ2dlclRyYW5zaXRpb25FbmQoZWxlbWVudCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnRyaWdnZXIoVFJBTlNJVElPTl9FTkQpO1xuICAgIH0sXG4gICAgc3VwcG9ydHNUcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBzdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihUUkFOU0lUSU9OX0VORCk7XG4gICAgfSxcbiAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgIHJldHVybiAob2JqWzBdIHx8IG9iaikubm9kZVR5cGU7XG4gICAgfSxcbiAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb25maWdUeXBlcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZ1R5cGVzLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgICAgIHZhciB2YWx1ZVR5cGUgPSB2YWx1ZSAmJiBVdGlsLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBvbmVudE5hbWUudG9VcHBlckNhc2UoKSArIFwiOiBcIiArIChcIk9wdGlvbiBcXFwiXCIgKyBwcm9wZXJ0eSArIFwiXFxcIiBwcm92aWRlZCB0eXBlIFxcXCJcIiArIHZhbHVlVHlwZSArIFwiXFxcIiBcIikgKyAoXCJidXQgZXhwZWN0ZWQgdHlwZSBcXFwiXCIgKyBleHBlY3RlZFR5cGVzICsgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5kU2hhZG93Um9vdDogZnVuY3Rpb24gZmluZFNoYWRvd1Jvb3QoZWxlbWVudCkge1xuICAgICAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcblxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IHJvb3QgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG5cblxuICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVdGlsLmZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgfSxcbiAgICBqUXVlcnlEZXRlY3Rpb246IGZ1bmN0aW9uIGpRdWVyeURldGVjdGlvbigpIHtcbiAgICAgIGlmICh0eXBlb2YgJF9fZGVmYXVsdFsnZGVmYXVsdCddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5LiBqUXVlcnkgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0LicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbi5qcXVlcnkuc3BsaXQoJyAnKVswXS5zcGxpdCgnLicpO1xuICAgICAgdmFyIG1pbk1ham9yID0gMTtcbiAgICAgIHZhciBsdE1ham9yID0gMjtcbiAgICAgIHZhciBtaW5NaW5vciA9IDk7XG4gICAgICB2YXIgbWluUGF0Y2ggPSAxO1xuICAgICAgdmFyIG1heE1ham9yID0gNDtcblxuICAgICAgaWYgKHZlcnNpb25bMF0gPCBsdE1ham9yICYmIHZlcnNpb25bMV0gPCBtaW5NaW5vciB8fCB2ZXJzaW9uWzBdID09PSBtaW5NYWpvciAmJiB2ZXJzaW9uWzFdID09PSBtaW5NaW5vciAmJiB2ZXJzaW9uWzJdIDwgbWluUGF0Y2ggfHwgdmVyc2lvblswXSA+PSBtYXhNYWpvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBhdCBsZWFzdCBqUXVlcnkgdjEuOS4xIGJ1dCBsZXNzIHRoYW4gdjQuMC4wJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBVdGlsLmpRdWVyeURldGVjdGlvbigpO1xuICBzZXRUcmFuc2l0aW9uRW5kU3VwcG9ydCgpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSA9ICdhbGVydCc7XG4gIHZhciBWRVJTSU9OID0gJzQuNS4zJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLmFsZXJ0JztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FXTtcbiAgdmFyIFNFTEVDVE9SX0RJU01JU1MgPSAnW2RhdGEtZGlzbWlzcz1cImFsZXJ0XCJdJztcbiAgdmFyIEVWRU5UX0NMT1NFID0gXCJjbG9zZVwiICsgRVZFTlRfS0VZO1xuICB2YXIgRVZFTlRfQ0xPU0VEID0gXCJjbG9zZWRcIiArIEVWRU5UX0tFWTtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gXCJjbGlja1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZO1xuICB2YXIgQ0xBU1NfTkFNRV9BTEVSVCA9ICdhbGVydCc7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIEFsZXJ0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbGVydChlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IEFsZXJ0LnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5jbG9zZSA9IGZ1bmN0aW9uIGNsb3NlKGVsZW1lbnQpIHtcbiAgICAgIHZhciByb290RWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5fZ2V0Um9vdEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXN0b21FdmVudCA9IHRoaXMuX3RyaWdnZXJDbG9zZUV2ZW50KHJvb3RFbGVtZW50KTtcblxuICAgICAgaWYgKGN1c3RvbUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVtb3ZlRWxlbWVudChyb290RWxlbWVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0Um9vdEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgdmFyIHBhcmVudCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIHBhcmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jbG9zZXN0KFwiLlwiICsgQ0xBU1NfTkFNRV9BTEVSVClbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJpZ2dlckNsb3NlRXZlbnQgPSBmdW5jdGlvbiBfdHJpZ2dlckNsb3NlRXZlbnQoZWxlbWVudCkge1xuICAgICAgdmFyIGNsb3NlRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfQ0xPU0UpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnRyaWdnZXIoY2xvc2VFdmVudCk7XG4gICAgICByZXR1cm4gY2xvc2VFdmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZW1vdmVFbGVtZW50ID0gZnVuY3Rpb24gX3JlbW92ZUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyk7XG5cbiAgICAgIGlmICghJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSkpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCwgZXZlbnQpO1xuICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9kZXN0cm95RWxlbWVudCA9IGZ1bmN0aW9uIF9kZXN0cm95RWxlbWVudChlbGVtZW50KSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuZGV0YWNoKCkudHJpZ2dlcihFVkVOVF9DTE9TRUQpLnJlbW92ZSgpO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQWxlcnQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICRlbGVtZW50LmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQWxlcnQodGhpcyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQWxlcnQuX2hhbmRsZURpc21pc3MgPSBmdW5jdGlvbiBfaGFuZGxlRGlzbWlzcyhhbGVydEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBhbGVydEluc3RhbmNlLmNsb3NlKHRoaXMpO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKEFsZXJ0LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gQWxlcnQ7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9ESVNNSVNTLCBBbGVydC5faGFuZGxlRGlzbWlzcyhuZXcgQWxlcnQoKSkpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdID0gQWxlcnQuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gQWxlcnQ7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgIHJldHVybiBBbGVydC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQxID0gJ2J1dHRvbic7XG4gIHZhciBWRVJTSU9OJDEgPSAnNC41LjMnO1xuICB2YXIgREFUQV9LRVkkMSA9ICdicy5idXR0b24nO1xuICB2YXIgRVZFTlRfS0VZJDEgPSBcIi5cIiArIERBVEFfS0VZJDE7XG4gIHZhciBEQVRBX0FQSV9LRVkkMSA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXTtcbiAgdmFyIENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX0JVVFRPTiA9ICdidG4nO1xuICB2YXIgQ0xBU1NfTkFNRV9GT0NVUyA9ICdmb2N1cyc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QgPSAnW2RhdGEtdG9nZ2xlXj1cImJ1dHRvblwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRVMgPSAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS10b2dnbGU9XCJidXR0b25cIl0nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVTX0JVVFRPTlMgPSAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXSAuYnRuJztcbiAgdmFyIFNFTEVDVE9SX0lOUFVUID0gJ2lucHV0Om5vdChbdHlwZT1cImhpZGRlblwiXSknO1xuICB2YXIgU0VMRUNUT1JfQUNUSVZFID0gJy5hY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfQlVUVE9OID0gJy5idG4nO1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQxICsgREFUQV9BUElfS0VZJDE7XG4gIHZhciBFVkVOVF9GT0NVU19CTFVSX0RBVEFfQVBJID0gXCJmb2N1c1wiICsgRVZFTlRfS0VZJDEgKyBEQVRBX0FQSV9LRVkkMSArIFwiIFwiICsgKFwiYmx1clwiICsgRVZFTlRfS0VZJDEgKyBEQVRBX0FQSV9LRVkkMSk7XG4gIHZhciBFVkVOVF9MT0FEX0RBVEFfQVBJID0gXCJsb2FkXCIgKyBFVkVOVF9LRVkkMSArIERBVEFfQVBJX0tFWSQxO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBCdXR0b24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1dHRvbihlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuc2hvdWxkQXZvaWRUcmlnZ2VyQ2hhbmdlID0gZmFsc2U7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBCdXR0b24ucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIHZhciB0cmlnZ2VyQ2hhbmdlRXZlbnQgPSB0cnVlO1xuICAgICAgdmFyIGFkZEFyaWFQcmVzc2VkID0gdHJ1ZTtcbiAgICAgIHZhciByb290RWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX0RBVEFfVE9HR0xFUylbMF07XG5cbiAgICAgIGlmIChyb290RWxlbWVudCkge1xuICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5QVVQpO1xuXG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgIGlmIChpbnB1dC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAmJiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSkpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFKTtcblxuICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIG5vdCBhIHJhZGlvIGJ1dHRvbiBvciBjaGVja2JveCBkb24ndCBhZGQgYSBwb2ludGxlc3MvaW52YWxpZCBjaGVja2VkIHByb3BlcnR5IHRvIHRoZSBpbnB1dFxuICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZEF2b2lkVHJpZ2dlckNoYW5nZSkge1xuICAgICAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oaW5wdXQpLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgYWRkQXJpYVByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoISh0aGlzLl9lbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgaWYgKGFkZEFyaWFQcmVzc2VkKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2VFdmVudCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkMSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIGF2b2lkVHJpZ2dlckNoYW5nZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJDEpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMpO1xuICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVkkMSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnNob3VsZEF2b2lkVHJpZ2dlckNoYW5nZSA9IGF2b2lkVHJpZ2dlckNoYW5nZTtcblxuICAgICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKEJ1dHRvbiwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kMTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gQnV0dG9uO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQxLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBidXR0b24gPSBldmVudC50YXJnZXQ7XG4gICAgdmFyIGluaXRpYWxCdXR0b24gPSBidXR0b247XG5cbiAgICBpZiAoISRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLmhhc0NsYXNzKENMQVNTX05BTUVfQlVUVE9OKSkge1xuICAgICAgYnV0dG9uID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGJ1dHRvbikuY2xvc2VzdChTRUxFQ1RPUl9CVVRUT04pWzBdO1xuICAgIH1cblxuICAgIGlmICghYnV0dG9uIHx8IGJ1dHRvbi5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgYnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gd29yayBhcm91bmQgRmlyZWZveCBidWcgIzE1NDA5OTVcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlucHV0QnRuID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5QVVQpO1xuXG4gICAgICBpZiAoaW5wdXRCdG4gJiYgKGlucHV0QnRuLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBpbnB1dEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHdvcmsgYXJvdW5kIEZpcmVmb3ggYnVnICMxNTQwOTk1XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdGlhbEJ1dHRvbi50YWdOYW1lID09PSAnSU5QVVQnIHx8IGJ1dHRvbi50YWdOYW1lICE9PSAnTEFCRUwnKSB7XG4gICAgICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGJ1dHRvbiksICd0b2dnbGUnLCBpbml0aWFsQnV0dG9uLnRhZ05hbWUgPT09ICdJTlBVVCcpO1xuICAgICAgfVxuICAgIH1cbiAgfSkub24oRVZFTlRfRk9DVVNfQkxVUl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEVfQ0FSUk9ULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgYnV0dG9uID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTRUxFQ1RPUl9CVVRUT04pWzBdO1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICB9KTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oRVZFTlRfTE9BRF9EQVRBX0FQSSwgZnVuY3Rpb24gKCkge1xuICAgIC8vIGVuc3VyZSBjb3JyZWN0IGFjdGl2ZSBjbGFzcyBpcyBzZXQgdG8gbWF0Y2ggdGhlIGNvbnRyb2xzJyBhY3R1YWwgdmFsdWVzL3N0YXRlc1xuICAgIC8vIGZpbmQgYWxsIGNoZWNrYm94ZXMvcmVhZGlvIGJ1dHRvbnMgaW5zaWRlIGRhdGEtdG9nZ2xlIGdyb3Vwc1xuICAgIHZhciBidXR0b25zID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFU19CVVRUT05TKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnV0dG9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGJ1dHRvbiA9IGJ1dHRvbnNbaV07XG4gICAgICB2YXIgaW5wdXQgPSBidXR0b24ucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9JTlBVVCk7XG5cbiAgICAgIGlmIChpbnB1dC5jaGVja2VkIHx8IGlucHV0Lmhhc0F0dHJpYnV0ZSgnY2hlY2tlZCcpKSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgIH1cbiAgICB9IC8vIGZpbmQgYWxsIGJ1dHRvbiB0b2dnbGVzXG5cblxuICAgIGJ1dHRvbnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9UT0dHTEUpKTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgX2xlbiA9IGJ1dHRvbnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIHZhciBfYnV0dG9uID0gYnV0dG9uc1tfaV07XG5cbiAgICAgIGlmIChfYnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykgPT09ICd0cnVlJykge1xuICAgICAgICBfYnV0dG9uLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0gPSBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0uQ29uc3RydWN0b3IgPSBCdXR0b247XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXSA9IEpRVUVSWV9OT19DT05GTElDVCQxO1xuICAgIHJldHVybiBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkMiA9ICdjYXJvdXNlbCc7XG4gIHZhciBWRVJTSU9OJDIgPSAnNC41LjMnO1xuICB2YXIgREFUQV9LRVkkMiA9ICdicy5jYXJvdXNlbCc7XG4gIHZhciBFVkVOVF9LRVkkMiA9IFwiLlwiICsgREFUQV9LRVkkMjtcbiAgdmFyIERBVEFfQVBJX0tFWSQyID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdO1xuICB2YXIgQVJST1dfTEVGVF9LRVlDT0RFID0gMzc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGxlZnQgYXJyb3cga2V5XG5cbiAgdmFyIEFSUk9XX1JJR0hUX0tFWUNPREUgPSAzOTsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgcmlnaHQgYXJyb3cga2V5XG5cbiAgdmFyIFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgPSA1MDA7IC8vIFRpbWUgZm9yIG1vdXNlIGNvbXBhdCBldmVudHMgdG8gZmlyZSBhZnRlciB0b3VjaFxuXG4gIHZhciBTV0lQRV9USFJFU0hPTEQgPSA0MDtcbiAgdmFyIERlZmF1bHQgPSB7XG4gICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgc2xpZGU6IGZhbHNlLFxuICAgIHBhdXNlOiAnaG92ZXInLFxuICAgIHdyYXA6IHRydWUsXG4gICAgdG91Y2g6IHRydWVcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsXG4gICAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgICBzbGlkZTogJyhib29sZWFufHN0cmluZyknLFxuICAgIHBhdXNlOiAnKHN0cmluZ3xib29sZWFuKScsXG4gICAgd3JhcDogJ2Jvb2xlYW4nLFxuICAgIHRvdWNoOiAnYm9vbGVhbidcbiAgfTtcbiAgdmFyIERJUkVDVElPTl9ORVhUID0gJ25leHQnO1xuICB2YXIgRElSRUNUSU9OX1BSRVYgPSAncHJldic7XG4gIHZhciBESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbiAgdmFyIERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCc7XG4gIHZhciBFVkVOVF9TTElERSA9IFwic2xpZGVcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfU0xJRCA9IFwic2xpZFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9LRVlET1dOID0gXCJrZXlkb3duXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX01PVVNFRU5URVIgPSBcIm1vdXNlZW50ZXJcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfTU9VU0VMRUFWRSA9IFwibW91c2VsZWF2ZVwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9UT1VDSFNUQVJUID0gXCJ0b3VjaHN0YXJ0XCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX1RPVUNITU9WRSA9IFwidG91Y2htb3ZlXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX1RPVUNIRU5EID0gXCJ0b3VjaGVuZFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9QT0lOVEVSRE9XTiA9IFwicG9pbnRlcmRvd25cIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfUE9JTlRFUlVQID0gXCJwb2ludGVydXBcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfRFJBR19TVEFSVCA9IFwiZHJhZ3N0YXJ0XCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX0xPQURfREFUQV9BUEkkMSA9IFwibG9hZFwiICsgRVZFTlRfS0VZJDIgKyBEQVRBX0FQSV9LRVkkMjtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkMiArIERBVEFfQVBJX0tFWSQyO1xuICB2YXIgQ0xBU1NfTkFNRV9DQVJPVVNFTCA9ICdjYXJvdXNlbCc7XG4gIHZhciBDTEFTU19OQU1FX0FDVElWRSQxID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX1NMSURFID0gJ3NsaWRlJztcbiAgdmFyIENMQVNTX05BTUVfUklHSFQgPSAnY2Fyb3VzZWwtaXRlbS1yaWdodCc7XG4gIHZhciBDTEFTU19OQU1FX0xFRlQgPSAnY2Fyb3VzZWwtaXRlbS1sZWZ0JztcbiAgdmFyIENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldic7XG4gIHZhciBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUkMSA9ICcuYWN0aXZlJztcbiAgdmFyIFNFTEVDVE9SX0FDVElWRV9JVEVNID0gJy5hY3RpdmUuY2Fyb3VzZWwtaXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0lURU1fSU1HID0gJy5jYXJvdXNlbC1pdGVtIGltZyc7XG4gIHZhciBTRUxFQ1RPUl9ORVhUX1BSRVYgPSAnLmNhcm91c2VsLWl0ZW0tbmV4dCwgLmNhcm91c2VsLWl0ZW0tcHJldic7XG4gIHZhciBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtc2xpZGVdLCBbZGF0YS1zbGlkZS10b10nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLXJpZGU9XCJjYXJvdXNlbFwiXSc7XG4gIHZhciBQb2ludGVyVHlwZSA9IHtcbiAgICBUT1VDSDogJ3RvdWNoJyxcbiAgICBQRU46ICdwZW4nXG4gIH07XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIENhcm91c2VsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYXJvdXNlbChlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gbnVsbDtcbiAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsO1xuICAgICAgdGhpcy50b3VjaFN0YXJ0WCA9IDA7XG4gICAgICB0aGlzLnRvdWNoRGVsdGFYID0gMDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9JTkRJQ0FUT1JTKTtcbiAgICAgIHRoaXMuX3RvdWNoU3VwcG9ydGVkID0gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7XG4gICAgICB0aGlzLl9wb2ludGVyRXZlbnQgPSBCb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQgfHwgd2luZG93Lk1TUG9pbnRlckV2ZW50KTtcblxuICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IENhcm91c2VsLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5uZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgIHRoaXMuX3NsaWRlKERJUkVDVElPTl9ORVhUKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLm5leHRXaGVuVmlzaWJsZSA9IGZ1bmN0aW9uIG5leHRXaGVuVmlzaWJsZSgpIHtcbiAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KTsgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuXG4gICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiAkZWxlbWVudC5pcygnOnZpc2libGUnKSAmJiAkZWxlbWVudC5jc3MoJ3Zpc2liaWxpdHknKSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5wcmV2ID0gZnVuY3Rpb24gcHJldigpIHtcbiAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgIHRoaXMuX3NsaWRlKERJUkVDVElPTl9QUkVWKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoZXZlbnQpIHtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX05FWFRfUFJFVikpIHtcbiAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5jeWNsZSh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5jeWNsZSA9IGZ1bmN0aW9uIGN5Y2xlKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmludGVydmFsICYmICF0aGlzLl9pc1BhdXNlZCkge1xuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPyB0aGlzLm5leHRXaGVuVmlzaWJsZSA6IHRoaXMubmV4dCkuYmluZCh0aGlzKSwgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvID0gZnVuY3Rpb24gdG8oaW5kZXgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pO1xuXG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIGlmIChpbmRleCA+IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIDEgfHwgaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub25lKEVWRU5UX1NMSUQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMudG8oaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgdGhpcy5jeWNsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbmRleCA+IGFjdGl2ZUluZGV4ID8gRElSRUNUSU9OX05FWFQgOiBESVJFQ1RJT05fUFJFVjtcblxuICAgICAgdGhpcy5fc2xpZGUoZGlyZWN0aW9uLCB0aGlzLl9pdGVtc1tpbmRleF0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub2ZmKEVWRU5UX0tFWSQyKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDIpO1xuICAgICAgdGhpcy5faXRlbXMgPSBudWxsO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgdGhpcy5faXNQYXVzZWQgPSBudWxsO1xuICAgICAgdGhpcy5faXNTbGlkaW5nID0gbnVsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0LCBjb25maWcpO1xuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQyLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5faGFuZGxlU3dpcGUgPSBmdW5jdGlvbiBfaGFuZGxlU3dpcGUoKSB7XG4gICAgICB2YXIgYWJzRGVsdGF4ID0gTWF0aC5hYnModGhpcy50b3VjaERlbHRhWCk7XG5cbiAgICAgIGlmIChhYnNEZWx0YXggPD0gU1dJUEVfVEhSRVNIT0xEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpcmVjdGlvbiA9IGFic0RlbHRheCAvIHRoaXMudG91Y2hEZWx0YVg7XG4gICAgICB0aGlzLnRvdWNoRGVsdGFYID0gMDsgLy8gc3dpcGUgbGVmdFxuXG4gICAgICBpZiAoZGlyZWN0aW9uID4gMCkge1xuICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgIH0gLy8gc3dpcGUgcmlnaHRcblxuXG4gICAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9LRVlET1dOLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLl9rZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX01PVVNFRU5URVIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIucGF1c2UoZXZlbnQpO1xuICAgICAgICB9KS5vbihFVkVOVF9NT1VTRUxFQVZFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmN5Y2xlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcudG91Y2gpIHtcbiAgICAgICAgdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMuX3RvdWNoU3VwcG9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKF90aGlzMy5fcG9pbnRlckV2ZW50ICYmIFBvaW50ZXJUeXBlW2V2ZW50Lm9yaWdpbmFsRXZlbnQucG9pbnRlclR5cGUudG9VcHBlckNhc2UoKV0pIHtcbiAgICAgICAgICBfdGhpczMudG91Y2hTdGFydFggPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFg7XG4gICAgICAgIH0gZWxzZSBpZiAoIV90aGlzMy5fcG9pbnRlckV2ZW50KSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoU3RhcnRYID0gZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBtb3ZlID0gZnVuY3Rpb24gbW92ZShldmVudCkge1xuICAgICAgICAvLyBlbnN1cmUgc3dpcGluZyB3aXRoIG9uZSB0b3VjaCBhbmQgbm90IHBpbmNoaW5nXG4gICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgJiYgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBfdGhpczMudG91Y2hEZWx0YVggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMy50b3VjaERlbHRhWCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gX3RoaXMzLnRvdWNoU3RhcnRYO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgZW5kID0gZnVuY3Rpb24gZW5kKGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpczMuX3BvaW50ZXJFdmVudCAmJiBQb2ludGVyVHlwZVtldmVudC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoRGVsdGFYID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRYIC0gX3RoaXMzLnRvdWNoU3RhcnRYO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMzLl9oYW5kbGVTd2lwZSgpO1xuXG4gICAgICAgIGlmIChfdGhpczMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBtb3VzZSBjb21wYXRpYmlsaXR5IGV2ZW50cyBvbiBmaXJzdCB0YXAgLSB0aGUgY2Fyb3VzZWxcbiAgICAgICAgICAvLyB3b3VsZCBzdG9wIGN5Y2xpbmcgdW50aWwgdXNlciB0YXBwZWQgb3V0IG9mIGl0O1xuICAgICAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAgICAgLy8gKGFzIGlmIGl0J3MgdGhlIHNlY29uZCB0aW1lIHdlIHRhcCBvbiBpdCwgbW91c2VlbnRlciBjb21wYXQgZXZlbnRcbiAgICAgICAgICAvLyBpcyBOT1QgZmlyZWQpIGFuZCBhZnRlciBhIHRpbWVvdXQgKHRvIGFsbG93IGZvciBtb3VzZSBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG4gICAgICAgICAgX3RoaXMzLnBhdXNlKCk7XG5cbiAgICAgICAgICBpZiAoX3RoaXMzLnRvdWNoVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzMy50b3VjaFRpbWVvdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5jeWNsZShldmVudCk7XG4gICAgICAgICAgfSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIF90aGlzMy5fY29uZmlnLmludGVydmFsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9JVEVNX0lNRykpLm9uKEVWRU5UX0RSQUdfU1RBUlQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuX3BvaW50ZXJFdmVudCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfUE9JTlRFUkRPV04sIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBzdGFydChldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfUE9JTlRFUlVQLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZW5kKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfVE9VQ0hTVEFSVCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXJ0KGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSE1PVkUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBtb3ZlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSEVORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVuZChldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2tleWRvd24gPSBmdW5jdGlvbiBfa2V5ZG93bihldmVudCkge1xuICAgICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICBjYXNlIEFSUk9XX0xFRlRfS0VZQ09ERTpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQVJST1dfUklHSFRfS0VZQ09ERTpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldEl0ZW1JbmRleCA9IGZ1bmN0aW9uIF9nZXRJdGVtSW5kZXgoZWxlbWVudCkge1xuICAgICAgdGhpcy5faXRlbXMgPSBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSA/IFtdLnNsaWNlLmNhbGwoZWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfSVRFTSkpIDogW107XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXMuaW5kZXhPZihlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRJdGVtQnlEaXJlY3Rpb24gPSBmdW5jdGlvbiBfZ2V0SXRlbUJ5RGlyZWN0aW9uKGRpcmVjdGlvbiwgYWN0aXZlRWxlbWVudCkge1xuICAgICAgdmFyIGlzTmV4dERpcmVjdGlvbiA9IGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX05FWFQ7XG4gICAgICB2YXIgaXNQcmV2RGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fUFJFVjtcblxuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB2YXIgbGFzdEl0ZW1JbmRleCA9IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgaXNHb2luZ1RvV3JhcCA9IGlzUHJldkRpcmVjdGlvbiAmJiBhY3RpdmVJbmRleCA9PT0gMCB8fCBpc05leHREaXJlY3Rpb24gJiYgYWN0aXZlSW5kZXggPT09IGxhc3RJdGVtSW5kZXg7XG5cbiAgICAgIGlmIChpc0dvaW5nVG9XcmFwICYmICF0aGlzLl9jb25maWcud3JhcCkge1xuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlbHRhID0gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fUFJFViA/IC0xIDogMTtcbiAgICAgIHZhciBpdGVtSW5kZXggPSAoYWN0aXZlSW5kZXggKyBkZWx0YSkgJSB0aGlzLl9pdGVtcy5sZW5ndGg7XG4gICAgICByZXR1cm4gaXRlbUluZGV4ID09PSAtMSA/IHRoaXMuX2l0ZW1zW3RoaXMuX2l0ZW1zLmxlbmd0aCAtIDFdIDogdGhpcy5faXRlbXNbaXRlbUluZGV4XTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl90cmlnZ2VyU2xpZGVFdmVudCA9IGZ1bmN0aW9uIF90cmlnZ2VyU2xpZGVFdmVudChyZWxhdGVkVGFyZ2V0LCBldmVudERpcmVjdGlvbk5hbWUpIHtcbiAgICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChyZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgdmFyIGZyb21JbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pKTtcblxuICAgICAgdmFyIHNsaWRlRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0xJREUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldCxcbiAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgIGZyb206IGZyb21JbmRleCxcbiAgICAgICAgdG86IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRlRXZlbnQpO1xuICAgICAgcmV0dXJuIHNsaWRlRXZlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCA9IGZ1bmN0aW9uIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCkge1xuICAgICAgICB2YXIgaW5kaWNhdG9ycyA9IFtdLnNsaWNlLmNhbGwodGhpcy5faW5kaWNhdG9yc0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9BQ1RJVkUkMSkpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oaW5kaWNhdG9ycykucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG5cbiAgICAgICAgdmFyIG5leHRJbmRpY2F0b3IgPSB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5jaGlsZHJlblt0aGlzLl9nZXRJdGVtSW5kZXgoZWxlbWVudCldO1xuXG4gICAgICAgIGlmIChuZXh0SW5kaWNhdG9yKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKG5leHRJbmRpY2F0b3IpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2xpZGUgPSBmdW5jdGlvbiBfc2xpZGUoZGlyZWN0aW9uLCBlbGVtZW50KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pO1xuXG4gICAgICB2YXIgYWN0aXZlRWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB2YXIgbmV4dEVsZW1lbnQgPSBlbGVtZW50IHx8IGFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKGRpcmVjdGlvbiwgYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIHZhciBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KTtcblxuICAgICAgdmFyIGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO1xuICAgICAgdmFyIGRpcmVjdGlvbmFsQ2xhc3NOYW1lO1xuICAgICAgdmFyIG9yZGVyQ2xhc3NOYW1lO1xuICAgICAgdmFyIGV2ZW50RGlyZWN0aW9uTmFtZTtcblxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX05FWFQpIHtcbiAgICAgICAgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FX0xFRlQ7XG4gICAgICAgIG9yZGVyQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9ORVhUO1xuICAgICAgICBldmVudERpcmVjdGlvbk5hbWUgPSBESVJFQ1RJT05fTEVGVDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9SSUdIVDtcbiAgICAgICAgb3JkZXJDbGFzc05hbWUgPSBDTEFTU19OQU1FX1BSRVY7XG4gICAgICAgIGV2ZW50RGlyZWN0aW9uTmFtZSA9IERJUkVDVElPTl9SSUdIVDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRFbGVtZW50ICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShuZXh0RWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSkpIHtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNsaWRlRXZlbnQgPSB0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChuZXh0RWxlbWVudCwgZXZlbnREaXJlY3Rpb25OYW1lKTtcblxuICAgICAgaWYgKHNsaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgIW5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KG5leHRFbGVtZW50KTtcblxuICAgICAgdmFyIHNsaWRFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TTElELCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IGV2ZW50RGlyZWN0aW9uTmFtZSxcbiAgICAgICAgZnJvbTogYWN0aXZlRWxlbWVudEluZGV4LFxuICAgICAgICB0bzogbmV4dEVsZW1lbnRJbmRleFxuICAgICAgfSk7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TTElERSkpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKG5leHRFbGVtZW50KS5hZGRDbGFzcyhvcmRlckNsYXNzTmFtZSk7XG4gICAgICAgIFV0aWwucmVmbG93KG5leHRFbGVtZW50KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZUVsZW1lbnQpLmFkZENsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKG5leHRFbGVtZW50KS5hZGRDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgIHZhciBuZXh0RWxlbWVudEludGVydmFsID0gcGFyc2VJbnQobmV4dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWludGVydmFsJyksIDEwKTtcblxuICAgICAgICBpZiAobmV4dEVsZW1lbnRJbnRlcnZhbCkge1xuICAgICAgICAgIHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgPSB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5pbnRlcnZhbDtcbiAgICAgICAgICB0aGlzLl9jb25maWcuaW50ZXJ2YWwgPSBuZXh0RWxlbWVudEludGVydmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCA9IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgfHwgdGhpcy5fY29uZmlnLmludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQoYWN0aXZlRWxlbWVudCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmVFbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShuZXh0RWxlbWVudCkucmVtb3ZlQ2xhc3MoZGlyZWN0aW9uYWxDbGFzc05hbWUgKyBcIiBcIiArIG9yZGVyQ2xhc3NOYW1lKS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oYWN0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSArIFwiIFwiICsgb3JkZXJDbGFzc05hbWUgKyBcIiBcIiArIGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICAgICAgICBfdGhpczQuX2lzU2xpZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczQuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKG5leHRFbGVtZW50KS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgdGhpcy5jeWNsZSgpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQyKTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBfY29uZmlnID0gX2V4dGVuZHMoe30sIF9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aW9uID0gdHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgPyBjb25maWcgOiBfY29uZmlnLnNsaWRlO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQ2Fyb3VzZWwodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkMiwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBkYXRhLnRvKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbYWN0aW9uXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgYWN0aW9uICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbYWN0aW9uXSgpO1xuICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuaW50ZXJ2YWwgJiYgX2NvbmZpZy5yaWRlKSB7XG4gICAgICAgICAgZGF0YS5wYXVzZSgpO1xuICAgICAgICAgIGRhdGEuY3ljbGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIENhcm91c2VsLl9kYXRhQXBpQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gX2RhdGFBcGlDbGlja0hhbmRsZXIoZXZlbnQpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtcblxuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0YXJnZXQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oc2VsZWN0b3IpWzBdO1xuXG4gICAgICBpZiAoIXRhcmdldCB8fCAhJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DQVJPVVNFTCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29uZmlnID0gX2V4dGVuZHMoe30sICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YXJnZXQpLmRhdGEoKSwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XG5cbiAgICAgIHZhciBzbGlkZUluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtdG8nKTtcblxuICAgICAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICAgICAgY29uZmlnLmludGVydmFsID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGFyZ2V0KSwgY29uZmlnKTtcblxuICAgICAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldCkuZGF0YShEQVRBX0tFWSQyKS50byhzbGlkZUluZGV4KTtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKENhcm91c2VsLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQyO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIENhcm91c2VsO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQyLCBTRUxFQ1RPUl9EQVRBX1NMSURFLCBDYXJvdXNlbC5fZGF0YUFwaUNsaWNrSGFuZGxlcik7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLm9uKEVWRU5UX0xPQURfREFUQV9BUEkkMSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYXJvdXNlbHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9SSURFKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2Fyb3VzZWxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgJGNhcm91c2VsID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNhcm91c2Vsc1tpXSk7XG5cbiAgICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkY2Fyb3VzZWwsICRjYXJvdXNlbC5kYXRhKCkpO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQyXSA9IENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdLkNvbnN0cnVjdG9yID0gQ2Fyb3VzZWw7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMl0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQyXSA9IEpRVUVSWV9OT19DT05GTElDVCQyO1xuICAgIHJldHVybiBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQzID0gJ2NvbGxhcHNlJztcbiAgdmFyIFZFUlNJT04kMyA9ICc0LjUuMyc7XG4gIHZhciBEQVRBX0tFWSQzID0gJ2JzLmNvbGxhcHNlJztcbiAgdmFyIEVWRU5UX0tFWSQzID0gXCIuXCIgKyBEQVRBX0tFWSQzO1xuICB2YXIgREFUQV9BUElfS0VZJDMgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM107XG4gIHZhciBEZWZhdWx0JDEgPSB7XG4gICAgdG9nZ2xlOiB0cnVlLFxuICAgIHBhcmVudDogJydcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlJDEgPSB7XG4gICAgdG9nZ2xlOiAnYm9vbGVhbicsXG4gICAgcGFyZW50OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgfTtcbiAgdmFyIEVWRU5UX1NIT1cgPSBcInNob3dcIiArIEVWRU5UX0tFWSQzO1xuICB2YXIgRVZFTlRfU0hPV04gPSBcInNob3duXCIgKyBFVkVOVF9LRVkkMztcbiAgdmFyIEVWRU5UX0hJREUgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQzO1xuICB2YXIgRVZFTlRfSElEREVOID0gXCJoaWRkZW5cIiArIEVWRU5UX0tFWSQzO1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMyA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQzICsgREFUQV9BUElfS0VZJDM7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckMSA9ICdzaG93JztcbiAgdmFyIENMQVNTX05BTUVfQ09MTEFQU0UgPSAnY29sbGFwc2UnO1xuICB2YXIgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnO1xuICB2YXIgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJztcbiAgdmFyIERJTUVOU0lPTl9XSURUSCA9ICd3aWR0aCc7XG4gIHZhciBESU1FTlNJT05fSEVJR0hUID0gJ2hlaWdodCc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkVTID0gJy5zaG93LCAuY29sbGFwc2luZyc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxID0gJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdJztcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbGxhcHNlKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtdG9nZ2xlPVxcXCJjb2xsYXBzZVxcXCJdW2hyZWY9XFxcIiNcIiArIGVsZW1lbnQuaWQgKyBcIlxcXCJdLFwiICsgKFwiW2RhdGEtdG9nZ2xlPVxcXCJjb2xsYXBzZVxcXCJdW2RhdGEtdGFyZ2V0PVxcXCIjXCIgKyBlbGVtZW50LmlkICsgXCJcXFwiXVwiKSkpO1xuICAgICAgdmFyIHRvZ2dsZUxpc3QgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9UT0dHTEUkMSkpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG9nZ2xlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgZWxlbSA9IHRvZ2dsZUxpc3RbaV07XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKTtcbiAgICAgICAgdmFyIGZpbHRlckVsZW1lbnQgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5maWx0ZXIoZnVuY3Rpb24gKGZvdW5kRWxlbSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZEVsZW0gPT09IGVsZW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHNlbGVjdG9yO1xuXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudCA/IHRoaXMuX2dldFBhcmVudCgpIDogbnVsbDtcblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl9lbGVtZW50LCB0aGlzLl90cmlnZ2VyQXJyYXkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgfVxuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gQ29sbGFwc2UucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDEpKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhY3RpdmVzO1xuICAgICAgdmFyIGFjdGl2ZXNEYXRhO1xuXG4gICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgIGFjdGl2ZXMgPSBbXS5zbGljZS5jYWxsKHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0FDVElWRVMpKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICBpZiAodHlwZW9mIF90aGlzLl9jb25maWcucGFyZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudCcpID09PSBfdGhpcy5fY29uZmlnLnBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9DT0xMQVBTRSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGFjdGl2ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVzKSB7XG4gICAgICAgIGFjdGl2ZXNEYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvcikuZGF0YShEQVRBX0tFWSQzKTtcblxuICAgICAgICBpZiAoYWN0aXZlc0RhdGEgJiYgYWN0aXZlc0RhdGEuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc3RhcnRFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TSE9XKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHN0YXJ0RXZlbnQpO1xuXG4gICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVzKSB7XG4gICAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oYWN0aXZlcykubm90KHRoaXMuX3NlbGVjdG9yKSwgJ2hpZGUnKTtcblxuICAgICAgICBpZiAoIWFjdGl2ZXNEYXRhKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZXMpLmRhdGEoREFUQV9LRVkkMywgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRSkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDA7XG5cbiAgICAgIGlmICh0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl90cmlnZ2VyQXJyYXkpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFICsgXCIgXCIgKyBDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIF90aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcblxuICAgICAgICBfdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoRVZFTlRfU0hPV04pO1xuICAgICAgfTtcblxuICAgICAgdmFyIGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSk7XG4gICAgICB2YXIgc2Nyb2xsU2l6ZSA9IFwic2Nyb2xsXCIgKyBjYXBpdGFsaXplZERpbWVuc2lvbjtcbiAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV0gKyBcInB4XCI7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICEkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfSElERSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXSArIFwicHhcIjtcbiAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORykucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRSArIFwiIFwiICsgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgICAgdmFyIHRyaWdnZXJBcnJheUxlbmd0aCA9IHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0cmlnZ2VyQXJyYXlMZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpZ2dlckFycmF5TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJBcnJheVtpXTtcbiAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodHJpZ2dlcik7XG5cbiAgICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciAkZWxlbSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKSk7XG5cbiAgICAgICAgICAgIGlmICghJGVsZW0uaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDEpKSB7XG4gICAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0cmlnZ2VyKS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCkuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgX3RoaXMyLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczIuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRSkudHJpZ2dlcihFVkVOVF9ISURERU4pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRUcmFuc2l0aW9uaW5nID0gZnVuY3Rpb24gc2V0VHJhbnNpdGlvbmluZyhpc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGlzVHJhbnNpdGlvbmluZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkMyk7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkMSwgY29uZmlnKTtcbiAgICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDMsIGNvbmZpZywgRGVmYXVsdFR5cGUkMSk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldERpbWVuc2lvbiA9IGZ1bmN0aW9uIF9nZXREaW1lbnNpb24oKSB7XG4gICAgICB2YXIgaGFzV2lkdGggPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoRElNRU5TSU9OX1dJRFRIKTtcbiAgICAgIHJldHVybiBoYXNXaWR0aCA/IERJTUVOU0lPTl9XSURUSCA6IERJTUVOU0lPTl9IRUlHSFQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UGFyZW50ID0gZnVuY3Rpb24gX2dldFBhcmVudCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFyZW50O1xuXG4gICAgICBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5fY29uZmlnLnBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudDsgLy8gSXQncyBhIGpRdWVyeSBvYmplY3RcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5wYXJlbnQuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnRbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5fY29uZmlnLnBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZWxlY3RvciA9IFwiW2RhdGEtdG9nZ2xlPVxcXCJjb2xsYXBzZVxcXCJdW2RhdGEtcGFyZW50PVxcXCJcIiArIHRoaXMuX2NvbmZpZy5wYXJlbnQgKyBcIlxcXCJdXCI7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oY2hpbGRyZW4pLmVhY2goZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoQ29sbGFwc2UuX2dldFRhcmdldEZyb21FbGVtZW50KGVsZW1lbnQpLCBbZWxlbWVudF0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZWxlbWVudCwgdHJpZ2dlckFycmF5KSB7XG4gICAgICB2YXIgaXNPcGVuID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKTtcblxuICAgICAgaWYgKHRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRyaWdnZXJBcnJheSkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQsICFpc09wZW4pLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQ29sbGFwc2UuX2dldFRhcmdldEZyb21FbGVtZW50ID0gZnVuY3Rpb24gX2dldFRhcmdldEZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIDogbnVsbDtcbiAgICB9O1xuXG4gICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICRlbGVtZW50LmRhdGEoREFUQV9LRVkkMyk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCQxLCAkZWxlbWVudC5kYXRhKCksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgICBpZiAoIWRhdGEgJiYgX2NvbmZpZy50b2dnbGUgJiYgdHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgX2NvbmZpZy50b2dnbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQ29sbGFwc2UodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSQzLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoQ29sbGFwc2UsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDM7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQxO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBDb2xsYXBzZTtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMywgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gcHJldmVudERlZmF1bHQgb25seSBmb3IgPGE+IGVsZW1lbnRzICh3aGljaCBjaGFuZ2UgdGhlIFVSTCkgbm90IGluc2lkZSB0aGUgY29sbGFwc2libGUgZWxlbWVudFxuICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB2YXIgJHRyaWdnZXIgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyk7XG4gICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuICAgIHZhciBzZWxlY3RvcnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oc2VsZWN0b3JzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGFyZ2V0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgdmFyIGRhdGEgPSAkdGFyZ2V0LmRhdGEoREFUQV9LRVkkMyk7XG4gICAgICB2YXIgY29uZmlnID0gZGF0YSA/ICd0b2dnbGUnIDogJHRyaWdnZXIuZGF0YSgpO1xuXG4gICAgICBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJHRhcmdldCwgY29uZmlnKTtcbiAgICB9KTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXSA9IENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDNdLkNvbnN0cnVjdG9yID0gQ29sbGFwc2U7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXSA9IEpRVUVSWV9OT19DT05GTElDVCQzO1xuICAgIHJldHVybiBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ0ID0gJ2Ryb3Bkb3duJztcbiAgdmFyIFZFUlNJT04kNCA9ICc0LjUuMyc7XG4gIHZhciBEQVRBX0tFWSQ0ID0gJ2JzLmRyb3Bkb3duJztcbiAgdmFyIEVWRU5UX0tFWSQ0ID0gXCIuXCIgKyBEQVRBX0tFWSQ0O1xuICB2YXIgREFUQV9BUElfS0VZJDQgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF07XG4gIHZhciBFU0NBUEVfS0VZQ09ERSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgdmFyIFNQQUNFX0tFWUNPREUgPSAzMjsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3Igc3BhY2Uga2V5XG5cbiAgdmFyIFRBQl9LRVlDT0RFID0gOTsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgdGFiIGtleVxuXG4gIHZhciBBUlJPV19VUF9LRVlDT0RFID0gMzg7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHVwIGFycm93IGtleVxuXG4gIHZhciBBUlJPV19ET1dOX0tFWUNPREUgPSA0MDsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgZG93biBhcnJvdyBrZXlcblxuICB2YXIgUklHSFRfTU9VU0VfQlVUVE9OX1dISUNIID0gMzsgLy8gTW91c2VFdmVudC53aGljaCB2YWx1ZSBmb3IgdGhlIHJpZ2h0IGJ1dHRvbiAoYXNzdW1pbmcgYSByaWdodC1oYW5kZWQgbW91c2UpXG5cbiAgdmFyIFJFR0VYUF9LRVlET1dOID0gbmV3IFJlZ0V4cChBUlJPV19VUF9LRVlDT0RFICsgXCJ8XCIgKyBBUlJPV19ET1dOX0tFWUNPREUgKyBcInxcIiArIEVTQ0FQRV9LRVlDT0RFKTtcbiAgdmFyIEVWRU5UX0hJREUkMSA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJDQ7XG4gIHZhciBFVkVOVF9ISURERU4kMSA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkNDtcbiAgdmFyIEVWRU5UX1NIT1ckMSA9IFwic2hvd1wiICsgRVZFTlRfS0VZJDQ7XG4gIHZhciBFVkVOVF9TSE9XTiQxID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDQ7XG4gIHZhciBFVkVOVF9DTElDSyA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNCA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ0ICsgREFUQV9BUElfS0VZJDQ7XG4gIHZhciBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gXCJrZXlkb3duXCIgKyBFVkVOVF9LRVkkNCArIERBVEFfQVBJX0tFWSQ0O1xuICB2YXIgRVZFTlRfS0VZVVBfREFUQV9BUEkgPSBcImtleXVwXCIgKyBFVkVOVF9LRVkkNCArIERBVEFfQVBJX0tFWSQ0O1xuICB2YXIgQ0xBU1NfTkFNRV9ESVNBQkxFRCA9ICdkaXNhYmxlZCc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckMiA9ICdzaG93JztcbiAgdmFyIENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCc7XG4gIHZhciBDTEFTU19OQU1FX0RST1BSSUdIVCA9ICdkcm9wcmlnaHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QTEVGVCA9ICdkcm9wbGVmdCc7XG4gIHZhciBDTEFTU19OQU1FX01FTlVSSUdIVCA9ICdkcm9wZG93bi1tZW51LXJpZ2h0JztcbiAgdmFyIENMQVNTX05BTUVfUE9TSVRJT05fU1RBVElDID0gJ3Bvc2l0aW9uLXN0YXRpYyc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyID0gJ1tkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCJdJztcbiAgdmFyIFNFTEVDVE9SX0ZPUk1fQ0hJTEQgPSAnLmRyb3Bkb3duIGZvcm0nO1xuICB2YXIgU0VMRUNUT1JfTUVOVSA9ICcuZHJvcGRvd24tbWVudSc7XG4gIHZhciBTRUxFQ1RPUl9OQVZCQVJfTkFWID0gJy5uYXZiYXItbmF2JztcbiAgdmFyIFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMgPSAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknO1xuICB2YXIgUExBQ0VNRU5UX1RPUCA9ICd0b3Atc3RhcnQnO1xuICB2YXIgUExBQ0VNRU5UX1RPUEVORCA9ICd0b3AtZW5kJztcbiAgdmFyIFBMQUNFTUVOVF9CT1RUT00gPSAnYm90dG9tLXN0YXJ0JztcbiAgdmFyIFBMQUNFTUVOVF9CT1RUT01FTkQgPSAnYm90dG9tLWVuZCc7XG4gIHZhciBQTEFDRU1FTlRfUklHSFQgPSAncmlnaHQtc3RhcnQnO1xuICB2YXIgUExBQ0VNRU5UX0xFRlQgPSAnbGVmdC1zdGFydCc7XG4gIHZhciBEZWZhdWx0JDIgPSB7XG4gICAgb2Zmc2V0OiAwLFxuICAgIGZsaXA6IHRydWUsXG4gICAgYm91bmRhcnk6ICdzY3JvbGxQYXJlbnQnLFxuICAgIHJlZmVyZW5jZTogJ3RvZ2dsZScsXG4gICAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICAgIHBvcHBlckNvbmZpZzogbnVsbFxuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUkMiA9IHtcbiAgICBvZmZzZXQ6ICcobnVtYmVyfHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIGZsaXA6ICdib29sZWFuJyxcbiAgICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICAgIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICAgIGRpc3BsYXk6ICdzdHJpbmcnLFxuICAgIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdCknXG4gIH07XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIERyb3Bkb3duID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEcm9wZG93bihlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fbWVudSA9IHRoaXMuX2dldE1lbnVFbGVtZW50KCk7XG4gICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gRHJvcGRvd24ucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50LmRpc2FibGVkIHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0RJU0FCTEVEKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0FjdGl2ZSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvdyh0cnVlKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KHVzZVBvcHBlcikge1xuICAgICAgaWYgKHVzZVBvcHBlciA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHVzZVBvcHBlciA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCkgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX21lbnUpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgICB9O1xuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TSE9XJDEsIHJlbGF0ZWRUYXJnZXQpO1xuXG4gICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBEaXNhYmxlIHRvdGFsbHkgUG9wcGVyLmpzIGZvciBEcm9wZG93biBpbiBOYXZiYXJcblxuXG4gICAgICBpZiAoIXRoaXMuX2luTmF2YmFyICYmIHVzZVBvcHBlcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2sgZm9yIFBvcHBlciBkZXBlbmRlbmN5XG4gICAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBQb3BwZXJfX2RlZmF1bHRbJ2RlZmF1bHQnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlci5qcyAoaHR0cHM6Ly9wb3BwZXIuanMub3JnLyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gcGFyZW50O1xuICAgICAgICB9IGVsc2UgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2U7IC8vIENoZWNrIGlmIGl0J3MgalF1ZXJ5IGVsZW1lbnRcblxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fY29uZmlnLnJlZmVyZW5jZVswXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gSWYgYm91bmRhcnkgaXMgbm90IGBzY3JvbGxQYXJlbnRgLCB0aGVuIHNldCBwb3NpdGlvbiB0byBgc3RhdGljYFxuICAgICAgICAvLyB0byBhbGxvdyB0aGUgbWVudSB0byBcImVzY2FwZVwiIHRoZSBzY3JvbGwgcGFyZW50J3MgYm91bmRhcmllc1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzI0MjUxXG5cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJvdW5kYXJ5ICE9PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQpLmFkZENsYXNzKENMQVNTX05BTUVfUE9TSVRJT05fU1RBVElDKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG5ldyBQb3BwZXJfX2RlZmF1bHRbJ2RlZmF1bHQnXShyZWZlcmVuY2VFbGVtZW50LCB0aGlzLl9tZW51LCB0aGlzLl9nZXRQb3BwZXJDb25maWcoKSk7XG4gICAgICB9IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG5cblxuICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUl9OQVYpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJF9fZGVmYXVsdFsnZGVmYXVsdCddLm5vb3ApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9tZW51KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPV04kMSwgcmVsYXRlZFRhcmdldCkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCkgfHwgISRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgfTtcbiAgICAgIHZhciBoaWRlRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfSElERSQxLCByZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fbWVudSkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudCkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJRERFTiQxLCByZWxhdGVkVGFyZ2V0KSk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkkNCk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX21lbnUgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG5cbiAgICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG5cbiAgICAgIGlmICh0aGlzLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcG9wcGVyLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9DTElDSywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIF90aGlzLnRvZ2dsZSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5kYXRhKCksIGNvbmZpZyk7XG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDQsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldE1lbnVFbGVtZW50ID0gZnVuY3Rpb24gX2dldE1lbnVFbGVtZW50KCkge1xuICAgICAgaWYgKCF0aGlzLl9tZW51KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIHRoaXMuX21lbnUgPSBwYXJlbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9NRU5VKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fbWVudTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRQbGFjZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGxhY2VtZW50KCkge1xuICAgICAgdmFyICRwYXJlbnREcm9wZG93biA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUpO1xuICAgICAgdmFyIHBsYWNlbWVudCA9IFBMQUNFTUVOVF9CT1RUT007IC8vIEhhbmRsZSBkcm9wdXBcblxuICAgICAgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX21lbnUpLmhhc0NsYXNzKENMQVNTX05BTUVfTUVOVVJJR0hUKSA/IFBMQUNFTUVOVF9UT1BFTkQgOiBQTEFDRU1FTlRfVE9QO1xuICAgICAgfSBlbHNlIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QUklHSFQpKSB7XG4gICAgICAgIHBsYWNlbWVudCA9IFBMQUNFTUVOVF9SSUdIVDtcbiAgICAgIH0gZWxzZSBpZiAoJHBhcmVudERyb3Bkb3duLmhhc0NsYXNzKENMQVNTX05BTUVfRFJPUExFRlQpKSB7XG4gICAgICAgIHBsYWNlbWVudCA9IFBMQUNFTUVOVF9MRUZUO1xuICAgICAgfSBlbHNlIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fbWVudSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9NRU5VUklHSFQpKSB7XG4gICAgICAgIHBsYWNlbWVudCA9IFBMQUNFTUVOVF9CT1RUT01FTkQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZGV0ZWN0TmF2YmFyID0gZnVuY3Rpb24gX2RldGVjdE5hdmJhcigpIHtcbiAgICAgIHJldHVybiAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuY2xvc2VzdCgnLm5hdmJhcicpLmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0ID0gZnVuY3Rpb24gX2dldE9mZnNldCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0ge307XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLm9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZzZXQuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMsIF90aGlzMi5fY29uZmlnLm9mZnNldChkYXRhLm9mZnNldHMsIF90aGlzMi5fZWxlbWVudCkgfHwge30pO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2Zmc2V0Lm9mZnNldCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UG9wcGVyQ29uZmlnID0gZnVuY3Rpb24gX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICAgIHZhciBwb3BwZXJDb25maWcgPSB7XG4gICAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KCksXG4gICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5fY29uZmlnLmZsaXBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTsgLy8gRGlzYWJsZSBQb3BwZXIuanMgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgcG9wcGVyQ29uZmlnLm1vZGlmaWVycy5hcHBseVN0eWxlID0ge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcG9wcGVyQ29uZmlnLCB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNCk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ0LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBEcm9wZG93bi5fY2xlYXJNZW51cyA9IGZ1bmN0aW9uIF9jbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LndoaWNoID09PSBSSUdIVF9NT1VTRV9CVVRUT05fV0hJQ0ggfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC53aGljaCAhPT0gVEFCX0tFWUNPREUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRvZ2dsZXMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9UT0dHTEUkMikpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG9nZ2xlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRvZ2dsZXNbaV0pO1xuXG4gICAgICAgIHZhciBjb250ZXh0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRvZ2dsZXNbaV0pLmRhdGEoREFUQV9LRVkkNCk7XG4gICAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRvZ2dsZXNbaV1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHJvcGRvd25NZW51ID0gY29udGV4dC5fbWVudTtcblxuICAgICAgICBpZiAoISRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50ICYmIChldmVudC50eXBlID09PSAnY2xpY2snICYmIC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQud2hpY2ggPT09IFRBQl9LRVlDT0RFKSAmJiAkX19kZWZhdWx0WydkZWZhdWx0J10uY29udGFpbnMocGFyZW50LCBldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJREUkMSwgcmVsYXRlZFRhcmdldCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuXG4gICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuX3BvcHBlcikge1xuICAgICAgICAgIGNvbnRleHQuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZHJvcGRvd25NZW51KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQyKS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9ISURERU4kMSwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGFyZW50RnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHBhcmVudDtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50IHx8IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgO1xuXG4gICAgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIF9kYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAgIC8vIElmIG5vdCBpbnB1dC90ZXh0YXJlYTpcbiAgICAgIC8vICAtIEFuZCBub3QgYSBrZXkgaW4gUkVHRVhQX0tFWURPV04gPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgLy8gSWYgaW5wdXQvdGV4dGFyZWE6XG4gICAgICAvLyAgLSBJZiBzcGFjZSBrZXkgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgLy8gIC0gSWYga2V5IGlzIG90aGVyIHRoYW4gZXNjYXBlXG4gICAgICAvLyAgICAtIElmIGtleSBpcyBub3QgdXAgb3IgZG93biA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyAgICAtIElmIHRyaWdnZXIgaW5zaWRlIHRoZSBtZW51ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSA/IGV2ZW50LndoaWNoID09PSBTUEFDRV9LRVlDT0RFIHx8IGV2ZW50LndoaWNoICE9PSBFU0NBUEVfS0VZQ09ERSAmJiAoZXZlbnQud2hpY2ggIT09IEFSUk9XX0RPV05fS0VZQ09ERSAmJiBldmVudC53aGljaCAhPT0gQVJST1dfVVBfS0VZQ09ERSB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFNFTEVDVE9SX01FTlUpLmxlbmd0aCkgOiAhUkVHRVhQX0tFWURPV04udGVzdChldmVudC53aGljaCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgICB2YXIgaXNBY3RpdmUgPSAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAgIGlmICghaXNBY3RpdmUgJiYgZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoIWlzQWN0aXZlIHx8IGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSB8fCBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSkge1xuICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIpKS50cmlnZ2VyKCdmb2N1cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZW1zID0gW10uc2xpY2UuY2FsbChwYXJlbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TKSkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiAkX19kZWZhdWx0WydkZWZhdWx0J10oaXRlbSkuaXMoJzp2aXNpYmxlJyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YoZXZlbnQudGFyZ2V0KTtcblxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBBUlJPV19VUF9LRVlDT0RFICYmIGluZGV4ID4gMCkge1xuICAgICAgICAvLyBVcFxuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQud2hpY2ggPT09IEFSUk9XX0RPV05fS0VZQ09ERSAmJiBpbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgLy8gRG93blxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH1cblxuICAgICAgaXRlbXNbaW5kZXhdLmZvY3VzKCk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhEcm9wZG93biwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kNDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDI7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlJDI7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIERyb3Bkb3duO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbihFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQ0ICsgXCIgXCIgKyBFVkVOVF9LRVlVUF9EQVRBX0FQSSwgRHJvcGRvd24uX2NsZWFyTWVudXMpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAndG9nZ2xlJyk7XG4gIH0pLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQsIFNFTEVDVE9SX0ZPUk1fQ0hJTEQsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ0XSA9IERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdLkNvbnN0cnVjdG9yID0gRHJvcGRvd247XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ0XSA9IEpRVUVSWV9OT19DT05GTElDVCQ0O1xuICAgIHJldHVybiBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ1ID0gJ21vZGFsJztcbiAgdmFyIFZFUlNJT04kNSA9ICc0LjUuMyc7XG4gIHZhciBEQVRBX0tFWSQ1ID0gJ2JzLm1vZGFsJztcbiAgdmFyIEVWRU5UX0tFWSQ1ID0gXCIuXCIgKyBEQVRBX0tFWSQ1O1xuICB2YXIgREFUQV9BUElfS0VZJDUgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ1ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNV07XG4gIHZhciBFU0NBUEVfS0VZQ09ERSQxID0gMjc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIEVzY2FwZSAoRXNjKSBrZXlcblxuICB2YXIgRGVmYXVsdCQzID0ge1xuICAgIGJhY2tkcm9wOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIGZvY3VzOiB0cnVlLFxuICAgIHNob3c6IHRydWVcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlJDMgPSB7XG4gICAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICAgIGZvY3VzOiAnYm9vbGVhbicsXG4gICAgc2hvdzogJ2Jvb2xlYW4nXG4gIH07XG4gIHZhciBFVkVOVF9ISURFJDIgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfSElERV9QUkVWRU5URUQgPSBcImhpZGVQcmV2ZW50ZWRcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfSElEREVOJDIgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9TSE9XJDIgPSBcInNob3dcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfU0hPV04kMiA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfRk9DVVNJTiA9IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9SRVNJWkUgPSBcInJlc2l6ZVwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9DTElDS19ESVNNSVNTID0gXCJjbGljay5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0tFWURPV05fRElTTUlTUyA9IFwia2V5ZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX01PVVNFVVBfRElTTUlTUyA9IFwibW91c2V1cC5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gXCJtb3VzZWRvd24uZGlzbWlzc1wiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQ1ID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDUgKyBEQVRBX0FQSV9LRVkkNTtcbiAgdmFyIENMQVNTX05BTUVfU0NST0xMQUJMRSA9ICdtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSc7XG4gIHZhciBDTEFTU19OQU1FX1NDUk9MTEJBUl9NRUFTVVJFUiA9ICdtb2RhbC1zY3JvbGxiYXItbWVhc3VyZSc7XG4gIHZhciBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ21vZGFsLWJhY2tkcm9wJztcbiAgdmFyIENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbiAgdmFyIENMQVNTX05BTUVfRkFERSQxID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDMgPSAnc2hvdyc7XG4gIHZhciBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnO1xuICB2YXIgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnO1xuICB2YXIgU0VMRUNUT1JfTU9EQUxfQk9EWSA9ICcubW9kYWwtYm9keSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzID0gJ1tkYXRhLXRvZ2dsZT1cIm1vZGFsXCJdJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfRElTTUlTUyA9ICdbZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nO1xuICB2YXIgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJztcbiAgdmFyIFNFTEVDVE9SX1NUSUNLWV9DT05URU5UID0gJy5zdGlja3ktdG9wJztcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTW9kYWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vZGFsKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2RpYWxvZyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9ESUFMT0cpO1xuICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSAwO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gTW9kYWwucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMSkpIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TSE9XJDIsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldFxuICAgICAgfSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93biB8fCBzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fY2hlY2tTY3JvbGxiYXIoKTtcblxuICAgICAgdGhpcy5fc2V0U2Nyb2xsYmFyKCk7XG5cbiAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuXG4gICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUywgU0VMRUNUT1JfREFUQV9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmhpZGUoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZGlhbG9nKS5vbihFVkVOVF9NT1VTRURPV05fRElTTUlTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMuX2VsZW1lbnQpLm9uZShFVkVOVF9NT1VTRVVQX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQudGFyZ2V0KS5pcyhfdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgICAgIF90aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3Nob3dCYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJREUkMik7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDEpO1xuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9mZihFVkVOVF9GT0NVU0lOKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMyk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub2ZmKEVWRU5UX0NMSUNLX0RJU01JU1MpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2RpYWxvZykub2ZmKEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTKTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5faGlkZU1vZGFsKGV2ZW50KTtcbiAgICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hpZGVNb2RhbCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICBbd2luZG93LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9kaWFsb2ddLmZvckVhY2goZnVuY3Rpb24gKGh0bWxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAkX19kZWZhdWx0WydkZWZhdWx0J10oaHRtbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkkNSk7XG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogYGRvY3VtZW50YCBoYXMgMiBldmVudHMgYEVWRU5UX0ZPQ1VTSU5gIGFuZCBgRVZFTlRfQ0xJQ0tfREFUQV9BUElgXG4gICAgICAgKiBEbyBub3QgbW92ZSBgZG9jdW1lbnRgIGluIGBodG1sRWxlbWVudHNgIGFycmF5XG4gICAgICAgKiBJdCB3aWxsIHJlbW92ZSBgRVZFTlRfQ0xJQ0tfREFUQV9BUElgIGV2ZW50IHRoYXQgc2hvdWxkIHJlbWFpblxuICAgICAgICovXG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub2ZmKEVWRU5UX0ZPQ1VTSU4pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkNSk7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9kaWFsb2cgPSBudWxsO1xuICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgdGhpcy5faXNTaG93biA9IG51bGw7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IG51bGw7XG4gICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IG51bGw7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5oYW5kbGVVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVVcGRhdGUoKSB7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCQzLCBjb25maWcpO1xuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQ1LCBjb25maWcsIERlZmF1bHRUeXBlJDMpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uID0gZnVuY3Rpb24gX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgdmFyIGhpZGVFdmVudFByZXZlbnRlZCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9ISURFX1BSRVZFTlRFRCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudFByZXZlbnRlZCk7XG5cbiAgICAgICAgaWYgKGhpZGVFdmVudFByZXZlbnRlZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKTtcblxuICAgICAgICB2YXIgbW9kYWxUcmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2RpYWxvZyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vZmYoVXRpbC5UUkFOU0lUSU9OX0VORCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU1RBVElDKTtcblxuICAgICAgICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJyc7XG4gICAgICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChfdGhpczMuX2VsZW1lbnQsIG1vZGFsVHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG1vZGFsVHJhbnNpdGlvbkR1cmF0aW9uKTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zaG93RWxlbWVudCA9IGZ1bmN0aW9uIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIHRyYW5zaXRpb24gPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDEpO1xuICAgICAgdmFyIG1vZGFsQm9keSA9IHRoaXMuX2RpYWxvZyA/IHRoaXMuX2RpYWxvZy5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX01PREFMX0JPRFkpIDogbnVsbDtcblxuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgfHwgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAvLyBEb24ndCBtb3ZlIG1vZGFsJ3MgRE9NIHBvc2l0aW9uXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9kaWFsb2cpLmhhc0NsYXNzKENMQVNTX05BTUVfU0NST0xMQUJMRSkgJiYgbW9kYWxCb2R5KSB7XG4gICAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICBVdGlsLnJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENMQVNTX05BTUVfU0hPVyQzKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9lbmZvcmNlRm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3duRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPV04kMiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcblxuICAgICAgdmFyIHRyYW5zaXRpb25Db21wbGV0ZSA9IGZ1bmN0aW9uIHRyYW5zaXRpb25Db21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKF90aGlzNC5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgX3RoaXM0Ll9lbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXM0Ll9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZGlhbG9nKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2RpYWxvZykub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIHRyYW5zaXRpb25Db21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2VuZm9yY2VGb2N1cyA9IGZ1bmN0aW9uIF9lbmZvcmNlRm9jdXMoKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vZmYoRVZFTlRfRk9DVVNJTikgLy8gR3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgICAub24oRVZFTlRfRk9DVVNJTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChkb2N1bWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmIF90aGlzNS5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczUuX2VsZW1lbnQpLmhhcyhldmVudC50YXJnZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIF90aGlzNS5fZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRFc2NhcGVFdmVudCA9IGZ1bmN0aW9uIF9zZXRFc2NhcGVFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXM2Ll9jb25maWcua2V5Ym9hcmQgJiYgZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFJDEpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIF90aGlzNi5oaWRlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghX3RoaXM2Ll9jb25maWcua2V5Ym9hcmQgJiYgZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFJDEpIHtcbiAgICAgICAgICAgIF90aGlzNi5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfS0VZRE9XTl9ESVNNSVNTKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRSZXNpemVFdmVudCA9IGZ1bmN0aW9uIF9zZXRSZXNpemVFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vbihFVkVOVF9SRVNJWkUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczcuaGFuZGxlVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vZmYoRVZFTlRfUkVTSVpFKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9oaWRlTW9kYWwgPSBmdW5jdGlvbiBfaGlkZU1vZGFsKCkge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJyk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKTtcblxuICAgICAgICBfdGhpczguX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICBfdGhpczguX3Jlc2V0U2Nyb2xsYmFyKCk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzOC5fZWxlbWVudCkudHJpZ2dlcihFVkVOVF9ISURERU4kMik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZW1vdmVCYWNrZHJvcCA9IGZ1bmN0aW9uIF9yZW1vdmVCYWNrZHJvcCgpIHtcbiAgICAgIGlmICh0aGlzLl9iYWNrZHJvcCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fYmFja2Ryb3ApLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2hvd0JhY2tkcm9wID0gZnVuY3Rpb24gX3Nob3dCYWNrZHJvcChjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzOSA9IHRoaXM7XG5cbiAgICAgIHZhciBhbmltYXRlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKSA/IENMQVNTX05BTUVfRkFERSQxIDogJyc7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmIHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSBDTEFTU19OQU1FX0JBQ0tEUk9QO1xuXG4gICAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChhbmltYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9iYWNrZHJvcCkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9DTElDS19ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXM5Ll9pZ25vcmVCYWNrZHJvcENsaWNrKSB7XG4gICAgICAgICAgICBfdGhpczkuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXM5Ll90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fYmFja2Ryb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2JhY2tkcm9wKS5hZGRDbGFzcyhDTEFTU19OQU1FX1NIT1ckMyk7XG5cbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYW5pbWF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChiYWNrZHJvcFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1Nob3duICYmIHRoaXMuX2JhY2tkcm9wKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDMpO1xuXG4gICAgICAgIHZhciBjYWxsYmFja1JlbW92ZSA9IGZ1bmN0aW9uIGNhbGxiYWNrUmVtb3ZlKCkge1xuICAgICAgICAgIF90aGlzOS5fcmVtb3ZlQmFja2Ryb3AoKTtcblxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMSkpIHtcbiAgICAgICAgICB2YXIgX2JhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG5cbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fYmFja2Ryb3ApLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjYWxsYmFja1JlbW92ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoX2JhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFja1JlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICAvLyB0b2RvIChmYXQpOiB0aGVzZSBzaG91bGQgcHJvYmFibHkgYmUgcmVmYWN0b3JlZCBvdXQgb2YgbW9kYWwuanNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgO1xuXG4gICAgX3Byb3RvLl9hZGp1c3REaWFsb2cgPSBmdW5jdGlvbiBfYWRqdXN0RGlhbG9nKCkge1xuICAgICAgdmFyIGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgICAgaWYgKCF0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyAmJiBpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9IHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgJiYgIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX3Jlc2V0QWRqdXN0bWVudHMgPSBmdW5jdGlvbiBfcmVzZXRBZGp1c3RtZW50cygpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2hlY2tTY3JvbGxiYXIgPSBmdW5jdGlvbiBfY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgICB2YXIgcmVjdCA9IGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IE1hdGgucm91bmQocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgPCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gdGhpcy5fZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRTY3JvbGxiYXIgPSBmdW5jdGlvbiBfc2V0U2Nyb2xsYmFyKCkge1xuICAgICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgLy8gTm90ZTogRE9NTm9kZS5zdHlsZS5wYWRkaW5nUmlnaHQgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlIG9yICcnIGlmIG5vdCBzZXRcbiAgICAgICAgLy8gICB3aGlsZSAkKERPTU5vZGUpLmNzcygncGFkZGluZy1yaWdodCcpIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWUgb3IgMCBpZiBub3Qgc2V0XG4gICAgICAgIHZhciBmaXhlZENvbnRlbnQgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfRklYRURfQ09OVEVOVCkpO1xuICAgICAgICB2YXIgc3RpY2t5Q29udGVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCkpOyAvLyBBZGp1c3QgZml4ZWQgY29udGVudCBwYWRkaW5nXG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGZpeGVkQ29udGVudCkuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgYWN0dWFsUGFkZGluZyA9IGVsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0O1xuICAgICAgICAgIHZhciBjYWxjdWxhdGVkUGFkZGluZyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuZGF0YSgncGFkZGluZy1yaWdodCcsIGFjdHVhbFBhZGRpbmcpLmNzcygncGFkZGluZy1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZFBhZGRpbmcpICsgX3RoaXMxMC5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IHN0aWNreSBjb250ZW50IG1hcmdpblxuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShzdGlja3lDb250ZW50KS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBhY3R1YWxNYXJnaW4gPSBlbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0O1xuICAgICAgICAgIHZhciBjYWxjdWxhdGVkTWFyZ2luID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmRhdGEoJ21hcmdpbi1yaWdodCcsIGFjdHVhbE1hcmdpbikuY3NzKCdtYXJnaW4tcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRNYXJnaW4pIC0gX3RoaXMxMC5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IGJvZHkgcGFkZGluZ1xuXG4gICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkUGFkZGluZyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudC5ib2R5KS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKENMQVNTX05BTUVfT1BFTik7XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVzZXRTY3JvbGxiYXIgPSBmdW5jdGlvbiBfcmVzZXRTY3JvbGxiYXIoKSB7XG4gICAgICAvLyBSZXN0b3JlIGZpeGVkIGNvbnRlbnQgcGFkZGluZ1xuICAgICAgdmFyIGZpeGVkQ29udGVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9GSVhFRF9DT05URU5UKSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICB2YXIgcGFkZGluZyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5yZW1vdmVEYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcGFkZGluZyA/IHBhZGRpbmcgOiAnJztcbiAgICAgIH0pOyAvLyBSZXN0b3JlIHN0aWNreSBjb250ZW50XG5cbiAgICAgIHZhciBlbGVtZW50cyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIlwiICsgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQpKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50cykuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIG1hcmdpbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1hcmdpbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuY3NzKCdtYXJnaW4tcmlnaHQnLCBtYXJnaW4pLnJlbW92ZURhdGEoJ21hcmdpbi1yaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9KTsgLy8gUmVzdG9yZSBib2R5IHBhZGRpbmdcblxuICAgICAgdmFyIHBhZGRpbmcgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuZGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcGFkZGluZyA/IHBhZGRpbmcgOiAnJztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgIC8vIHRoeCBkLndhbHNoXG4gICAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9TQ1JPTExCQVJfTUVBU1VSRVI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7XG4gICAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDUpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkMywgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgTW9kYWwodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChfY29uZmlnLnNob3cpIHtcbiAgICAgICAgICBkYXRhLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoTW9kYWwsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQzO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBNb2RhbDtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIF90aGlzMTEgPSB0aGlzO1xuXG4gICAgdmFyIHRhcmdldDtcbiAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHZhciBjb25maWcgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGFyZ2V0KS5kYXRhKERBVEFfS0VZJDUpID8gJ3RvZ2dsZScgOiBfZXh0ZW5kcyh7fSwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldCkuZGF0YSgpLCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpKTtcblxuICAgIGlmICh0aGlzLnRhZ05hbWUgPT09ICdBJyB8fCB0aGlzLnRhZ05hbWUgPT09ICdBUkVBJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB2YXIgJHRhcmdldCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YXJnZXQpLm9uZShFVkVOVF9TSE9XJDIsIGZ1bmN0aW9uIChzaG93RXZlbnQpIHtcbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgLy8gT25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICR0YXJnZXQub25lKEVWRU5UX0hJRERFTiQyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMxMSkuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICBfdGhpczExLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTW9kYWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YXJnZXQpLCBjb25maWcsIHRoaXMpO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdID0gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNV0uQ29uc3RydWN0b3IgPSBNb2RhbDtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdID0gSlFVRVJZX05PX0NPTkZMSUNUJDU7XG4gICAgcmV0dXJuIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuNS4zKTogdG9vbHMvc2FuaXRpemVyLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdmFyIHVyaUF0dHJzID0gWydiYWNrZ3JvdW5kJywgJ2NpdGUnLCAnaHJlZicsICdpdGVtdHlwZScsICdsb25nZGVzYycsICdwb3N0ZXInLCAnc3JjJywgJ3hsaW5rOmhyZWYnXTtcbiAgdmFyIEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaTtcbiAgdmFyIERlZmF1bHRXaGl0ZWxpc3QgPSB7XG4gICAgLy8gR2xvYmFsIGF0dHJpYnV0ZXMgYWxsb3dlZCBvbiBhbnkgc3VwcGxpZWQgZWxlbWVudCBiZWxvdy5cbiAgICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICAgIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gICAgYXJlYTogW10sXG4gICAgYjogW10sXG4gICAgYnI6IFtdLFxuICAgIGNvbDogW10sXG4gICAgY29kZTogW10sXG4gICAgZGl2OiBbXSxcbiAgICBlbTogW10sXG4gICAgaHI6IFtdLFxuICAgIGgxOiBbXSxcbiAgICBoMjogW10sXG4gICAgaDM6IFtdLFxuICAgIGg0OiBbXSxcbiAgICBoNTogW10sXG4gICAgaDY6IFtdLFxuICAgIGk6IFtdLFxuICAgIGltZzogWydzcmMnLCAnc3Jjc2V0JywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICBsaTogW10sXG4gICAgb2w6IFtdLFxuICAgIHA6IFtdLFxuICAgIHByZTogW10sXG4gICAgczogW10sXG4gICAgc21hbGw6IFtdLFxuICAgIHNwYW46IFtdLFxuICAgIHN1YjogW10sXG4gICAgc3VwOiBbXSxcbiAgICBzdHJvbmc6IFtdLFxuICAgIHU6IFtdLFxuICAgIHVsOiBbXVxuICB9O1xuICAvKipcbiAgICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBhIGNvbW1vbmx5IHVzZWZ1bCBzdWJzZXQgb2YgVVJMcyB0aGF0IGFyZSBzYWZlLlxuICAgKlxuICAgKiBTaG91dG91dCB0byBBbmd1bGFyIDcgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzcuMi40L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzXG4gICAqL1xuXG4gIHZhciBTQUZFX1VSTF9QQVRURVJOID0gL14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZSk6fFteIyYvOj9dKig/OlsjLz9dfCQpKS9naTtcbiAgLyoqXG4gICAqIEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgc2FmZSBkYXRhIFVSTHMuIE9ubHkgbWF0Y2hlcyBpbWFnZSwgdmlkZW8gYW5kIGF1ZGlvIHR5cGVzLlxuICAgKlxuICAgKiBTaG91dG91dCB0byBBbmd1bGFyIDcgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzcuMi40L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzXG4gICAqL1xuXG4gIHZhciBEQVRBX1VSTF9QQVRURVJOID0gL15kYXRhOig/OmltYWdlXFwvKD86Ym1wfGdpZnxqcGVnfGpwZ3xwbmd8dGlmZnx3ZWJwKXx2aWRlb1xcLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1xcLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW1xcZCsvYS16XSs9KiQvaTtcblxuICBmdW5jdGlvbiBhbGxvd2VkQXR0cmlidXRlKGF0dHIsIGFsbG93ZWRBdHRyaWJ1dGVMaXN0KSB7XG4gICAgdmFyIGF0dHJOYW1lID0gYXR0ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmluZGV4T2YoYXR0ck5hbWUpICE9PSAtMSkge1xuICAgICAgaWYgKHVyaUF0dHJzLmluZGV4T2YoYXR0ck5hbWUpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihhdHRyLm5vZGVWYWx1ZS5tYXRjaChTQUZFX1VSTF9QQVRURVJOKSB8fCBhdHRyLm5vZGVWYWx1ZS5tYXRjaChEQVRBX1VSTF9QQVRURVJOKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciByZWdFeHAgPSBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGF0dHJSZWdleCkge1xuICAgICAgcmV0dXJuIGF0dHJSZWdleCBpbnN0YW5jZW9mIFJlZ0V4cDtcbiAgICB9KTsgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmVnRXhwLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoYXR0ck5hbWUubWF0Y2gocmVnRXhwW2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgd2hpdGVMaXN0LCBzYW5pdGl6ZUZuKSB7XG4gICAgaWYgKHVuc2FmZUh0bWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5zYWZlSHRtbDtcbiAgICB9XG5cbiAgICBpZiAoc2FuaXRpemVGbiAmJiB0eXBlb2Ygc2FuaXRpemVGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNhbml0aXplRm4odW5zYWZlSHRtbCk7XG4gICAgfVxuXG4gICAgdmFyIGRvbVBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG4gICAgdmFyIGNyZWF0ZWREb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcodW5zYWZlSHRtbCwgJ3RleHQvaHRtbCcpO1xuICAgIHZhciB3aGl0ZWxpc3RLZXlzID0gT2JqZWN0LmtleXMod2hpdGVMaXN0KTtcbiAgICB2YXIgZWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGNyZWF0ZWREb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSk7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpLCBsZW4pIHtcbiAgICAgIHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuICAgICAgdmFyIGVsTmFtZSA9IGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh3aGl0ZWxpc3RLZXlzLmluZGV4T2YoZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXR0cmlidXRlTGlzdCA9IFtdLnNsaWNlLmNhbGwoZWwuYXR0cmlidXRlcyk7XG4gICAgICB2YXIgd2hpdGVsaXN0ZWRBdHRyaWJ1dGVzID0gW10uY29uY2F0KHdoaXRlTGlzdFsnKiddIHx8IFtdLCB3aGl0ZUxpc3RbZWxOYW1lXSB8fCBbXSk7XG4gICAgICBhdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlKGF0dHIsIHdoaXRlbGlzdGVkQXR0cmlidXRlcykpIHtcbiAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5ub2RlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImNvbnRpbnVlXCIpIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUw7XG4gIH1cblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkNiA9ICd0b29sdGlwJztcbiAgdmFyIFZFUlNJT04kNiA9ICc0LjUuMyc7XG4gIHZhciBEQVRBX0tFWSQ2ID0gJ2JzLnRvb2x0aXAnO1xuICB2YXIgRVZFTlRfS0VZJDYgPSBcIi5cIiArIERBVEFfS0VZJDY7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDZdO1xuICB2YXIgQ0xBU1NfUFJFRklYID0gJ2JzLXRvb2x0aXAnO1xuICB2YXIgQlNDTFNfUFJFRklYX1JFR0VYID0gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgQ0xBU1NfUFJFRklYICsgXCJcXFxcUytcIiwgJ2cnKTtcbiAgdmFyIERJU0FMTE9XRURfQVRUUklCVVRFUyA9IFsnc2FuaXRpemUnLCAnd2hpdGVMaXN0JywgJ3Nhbml0aXplRm4nXTtcbiAgdmFyIERlZmF1bHRUeXBlJDQgPSB7XG4gICAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gICAgdGVtcGxhdGU6ICdzdHJpbmcnLFxuICAgIHRpdGxlOiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKScsXG4gICAgdHJpZ2dlcjogJ3N0cmluZycsXG4gICAgZGVsYXk6ICcobnVtYmVyfG9iamVjdCknLFxuICAgIGh0bWw6ICdib29sZWFuJyxcbiAgICBzZWxlY3RvcjogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICAgIHBsYWNlbWVudDogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICBvZmZzZXQ6ICcobnVtYmVyfHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gICAgZmFsbGJhY2tQbGFjZW1lbnQ6ICcoc3RyaW5nfGFycmF5KScsXG4gICAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICAgIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICAgIHdoaXRlTGlzdDogJ29iamVjdCcsXG4gICAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0KSdcbiAgfTtcbiAgdmFyIEF0dGFjaG1lbnRNYXAgPSB7XG4gICAgQVVUTzogJ2F1dG8nLFxuICAgIFRPUDogJ3RvcCcsXG4gICAgUklHSFQ6ICdyaWdodCcsXG4gICAgQk9UVE9NOiAnYm90dG9tJyxcbiAgICBMRUZUOiAnbGVmdCdcbiAgfTtcbiAgdmFyIERlZmF1bHQkNCA9IHtcbiAgICBhbmltYXRpb246IHRydWUsXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj4nICsgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+PC9kaXY+JyxcbiAgICB0cmlnZ2VyOiAnaG92ZXIgZm9jdXMnLFxuICAgIHRpdGxlOiAnJyxcbiAgICBkZWxheTogMCxcbiAgICBodG1sOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogZmFsc2UsXG4gICAgcGxhY2VtZW50OiAndG9wJyxcbiAgICBvZmZzZXQ6IDAsXG4gICAgY29udGFpbmVyOiBmYWxzZSxcbiAgICBmYWxsYmFja1BsYWNlbWVudDogJ2ZsaXAnLFxuICAgIGJvdW5kYXJ5OiAnc2Nyb2xsUGFyZW50JyxcbiAgICBzYW5pdGl6ZTogdHJ1ZSxcbiAgICBzYW5pdGl6ZUZuOiBudWxsLFxuICAgIHdoaXRlTGlzdDogRGVmYXVsdFdoaXRlbGlzdCxcbiAgICBwb3BwZXJDb25maWc6IG51bGxcbiAgfTtcbiAgdmFyIEhPVkVSX1NUQVRFX1NIT1cgPSAnc2hvdyc7XG4gIHZhciBIT1ZFUl9TVEFURV9PVVQgPSAnb3V0JztcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZJDYsXG4gICAgSElEREVOOiBcImhpZGRlblwiICsgRVZFTlRfS0VZJDYsXG4gICAgU0hPVzogXCJzaG93XCIgKyBFVkVOVF9LRVkkNixcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZJDYsXG4gICAgSU5TRVJURUQ6IFwiaW5zZXJ0ZWRcIiArIEVWRU5UX0tFWSQ2LFxuICAgIENMSUNLOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNixcbiAgICBGT0NVU0lOOiBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSQ2LFxuICAgIEZPQ1VTT1VUOiBcImZvY3Vzb3V0XCIgKyBFVkVOVF9LRVkkNixcbiAgICBNT1VTRUVOVEVSOiBcIm1vdXNlZW50ZXJcIiArIEVWRU5UX0tFWSQ2LFxuICAgIE1PVVNFTEVBVkU6IFwibW91c2VsZWF2ZVwiICsgRVZFTlRfS0VZJDZcbiAgfTtcbiAgdmFyIENMQVNTX05BTUVfRkFERSQyID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDQgPSAnc2hvdyc7XG4gIHZhciBTRUxFQ1RPUl9UT09MVElQX0lOTkVSID0gJy50b29sdGlwLWlubmVyJztcbiAgdmFyIFNFTEVDVE9SX0FSUk9XID0gJy5hcnJvdyc7XG4gIHZhciBUUklHR0VSX0hPVkVSID0gJ2hvdmVyJztcbiAgdmFyIFRSSUdHRVJfRk9DVVMgPSAnZm9jdXMnO1xuICB2YXIgVFJJR0dFUl9DTElDSyA9ICdjbGljayc7XG4gIHZhciBUUklHR0VSX01BTlVBTCA9ICdtYW51YWwnO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUb29sdGlwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb29sdGlwKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgaWYgKHR5cGVvZiBQb3BwZXJfX2RlZmF1bHRbJ2RlZmF1bHQnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyB0b29sdGlwcyByZXF1aXJlIFBvcHBlci5qcyAoaHR0cHM6Ly9wb3BwZXIuanMub3JnLyknKTtcbiAgICAgIH0gLy8gcHJpdmF0ZVxuXG5cbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gMDtcbiAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSAnJztcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fTtcbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7IC8vIFByb3RlY3RlZFxuXG4gICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcblxuICAgICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBUb29sdGlwLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiB0b2dnbGVFbmFibGVkKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gIXRoaXMuX2lzRW5hYmxlZDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShldmVudCkge1xuICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGRhdGFLZXkgPSB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZO1xuICAgICAgICB2YXIgY29udGV4dCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXkpO1xuXG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljaztcblxuICAgICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIobnVsbCwgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5fbGVhdmUobnVsbCwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5nZXRUaXBFbGVtZW50KCkpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQ0KSkge1xuICAgICAgICAgIHRoaXMuX2xlYXZlKG51bGwsIHRoaXMpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZW50ZXIobnVsbCwgdGhpcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5lbGVtZW50KS5vZmYodGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCkuY2xvc2VzdCgnLm1vZGFsJykub2ZmKCdoaWRlLmJzLm1vZGFsJywgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG5cbiAgICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy50aXApLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSBudWxsO1xuICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gbnVsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy50aXAgPSBudWxsO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCkuY3NzKCdkaXNwbGF5JykgPT09ICdub25lJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaG93RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XKTtcblxuICAgICAgaWYgKHRoaXMuaXNXaXRoQ29udGVudCgpICYmIHRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG4gICAgICAgIHZhciBzaGFkb3dSb290ID0gVXRpbC5maW5kU2hhZG93Um9vdCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB2YXIgaXNJblRoZURvbSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5jb250YWlucyhzaGFkb3dSb290ICE9PSBudWxsID8gc2hhZG93Um9vdCA6IHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5lbGVtZW50KTtcblxuICAgICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgICB2YXIgdGlwSWQgPSBVdGlsLmdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpO1xuICAgICAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRpcElkKTtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aXApLmFkZENsYXNzKENMQVNTX05BTUVfRkFERSQyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSB0eXBlb2YgdGhpcy5jb25maWcucGxhY2VtZW50ID09PSAnZnVuY3Rpb24nID8gdGhpcy5jb25maWcucGxhY2VtZW50LmNhbGwodGhpcywgdGlwLCB0aGlzLmVsZW1lbnQpIDogdGhpcy5jb25maWcucGxhY2VtZW50O1xuXG4gICAgICAgIHZhciBhdHRhY2htZW50ID0gdGhpcy5fZ2V0QXR0YWNobWVudChwbGFjZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9nZXRDb250YWluZXIoKTtcblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGlwKS5kYXRhKHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuXG4gICAgICAgIGlmICghJF9fZGVmYXVsdFsnZGVmYXVsdCddLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy50aXApKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcCkuYXBwZW5kVG8oY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCk7XG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG5ldyBQb3BwZXJfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmVsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpOyAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuXG4gICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJF9fZGVmYXVsdFsnZGVmYXVsdCddLm5vb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgaWYgKF90aGlzLmNvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9maXhUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHByZXZIb3ZlclN0YXRlID0gX3RoaXMuX2hvdmVyU3RhdGU7XG4gICAgICAgICAgX3RoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpcy5lbGVtZW50KS50cmlnZ2VyKF90aGlzLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKTtcblxuICAgICAgICAgIGlmIChwcmV2SG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfT1VUKSB7XG4gICAgICAgICAgICBfdGhpcy5fbGVhdmUobnVsbCwgX3RoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMudGlwKS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMikpIHtcbiAgICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLnRpcCk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMudGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoX3RoaXMyLl9ob3ZlclN0YXRlICE9PSBIT1ZFUl9TVEFURV9TSE9XICYmIHRpcC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgdGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGlwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMi5fY2xlYW5UaXBDbGFzcygpO1xuXG4gICAgICAgIF90aGlzMi5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczIuZWxlbWVudCkudHJpZ2dlcihfdGhpczIuY29uc3RydWN0b3IuRXZlbnQuSElEREVOKTtcblxuICAgICAgICBpZiAoX3RoaXMyLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBfdGhpczIuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGlwKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckNCk7IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuXG4gICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudC5ib2R5KS5jaGlsZHJlbigpLm9mZignbW91c2VvdmVyJywgbnVsbCwgJF9fZGVmYXVsdFsnZGVmYXVsdCddLm5vb3ApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfQ0xJQ0tdID0gZmFsc2U7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfRk9DVVNdID0gZmFsc2U7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy50aXApLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQyKSkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aXApO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gJyc7XG4gICAgfTtcblxuICAgIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gUHJvdGVjdGVkXG4gICAgO1xuXG4gICAgX3Byb3RvLmlzV2l0aENvbnRlbnQgPSBmdW5jdGlvbiBpc1dpdGhDb250ZW50KCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmFkZEF0dGFjaG1lbnRDbGFzcyA9IGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKENMQVNTX1BSRUZJWCArIFwiLVwiICsgYXR0YWNobWVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by5nZXRUaXBFbGVtZW50ID0gZnVuY3Rpb24gZ2V0VGlwRWxlbWVudCgpIHtcbiAgICAgIHRoaXMudGlwID0gdGhpcy50aXAgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgdGhpcy5zZXRFbGVtZW50Q29udGVudCgkX19kZWZhdWx0WydkZWZhdWx0J10odGlwLnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfVE9PTFRJUF9JTk5FUikpLCB0aGlzLmdldFRpdGxlKCkpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDIgKyBcIiBcIiArIENMQVNTX05BTUVfU0hPVyQ0KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldEVsZW1lbnRDb250ZW50ID0gZnVuY3Rpb24gc2V0RWxlbWVudENvbnRlbnQoJGVsZW1lbnQsIGNvbnRlbnQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgKGNvbnRlbnQubm9kZVR5cGUgfHwgY29udGVudC5qcXVlcnkpKSB7XG4gICAgICAgIC8vIENvbnRlbnQgaXMgYSBET00gbm9kZSBvciBhIGpRdWVyeVxuICAgICAgICBpZiAodGhpcy5jb25maWcuaHRtbCkge1xuICAgICAgICAgIGlmICghJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNvbnRlbnQpLnBhcmVudCgpLmlzKCRlbGVtZW50KSkge1xuICAgICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRlbGVtZW50LnRleHQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNvbnRlbnQpLnRleHQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5odG1sKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zYW5pdGl6ZSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBzYW5pdGl6ZUh0bWwoY29udGVudCwgdGhpcy5jb25maWcud2hpdGVMaXN0LCB0aGlzLmNvbmZpZy5zYW5pdGl6ZUZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRlbGVtZW50Lmh0bWwoY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZWxlbWVudC50ZXh0KGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGl0bGUgPSBmdW5jdGlvbiBnZXRUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKTtcblxuICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICB0aXRsZSA9IHR5cGVvZiB0aGlzLmNvbmZpZy50aXRsZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnRpdGxlLmNhbGwodGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnRpdGxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRQb3BwZXJDb25maWcgPSBmdW5jdGlvbiBfZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgZGVmYXVsdEJzQ29uZmlnID0ge1xuICAgICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KCksXG4gICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgYmVoYXZpb3I6IHRoaXMuY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgZWxlbWVudDogU0VMRUNUT1JfQVJST1dcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6IHRoaXMuY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkNyZWF0ZTogZnVuY3Rpb24gb25DcmVhdGUoZGF0YSkge1xuICAgICAgICAgIGlmIChkYXRhLm9yaWdpbmFsUGxhY2VtZW50ICE9PSBkYXRhLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgX3RoaXMzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblVwZGF0ZTogZnVuY3Rpb24gb25VcGRhdGUoZGF0YSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgZGVmYXVsdEJzQ29uZmlnLCB0aGlzLmNvbmZpZy5wb3BwZXJDb25maWcpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldE9mZnNldCA9IGZ1bmN0aW9uIF9nZXRPZmZzZXQoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIG9mZnNldCA9IHt9O1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLm9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZzZXQuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMsIF90aGlzNC5jb25maWcub2Zmc2V0KGRhdGEub2Zmc2V0cywgX3RoaXM0LmVsZW1lbnQpIHx8IHt9KTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldC5vZmZzZXQgPSB0aGlzLmNvbmZpZy5vZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gX2dldENvbnRhaW5lcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5jb25maWcuY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuY29uZmlnLmNvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLmZpbmQodGhpcy5jb25maWcuY29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRBdHRhY2htZW50ID0gZnVuY3Rpb24gX2dldEF0dGFjaG1lbnQocGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gQXR0YWNobWVudE1hcFtwbGFjZW1lbnQudG9VcHBlckNhc2UoKV07XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0TGlzdGVuZXJzID0gZnVuY3Rpb24gX3NldExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB2YXIgdHJpZ2dlcnMgPSB0aGlzLmNvbmZpZy50cmlnZ2VyLnNwbGl0KCcgJyk7XG4gICAgICB0cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0cmlnZ2VyKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzNS5lbGVtZW50KS5vbihfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuQ0xJQ0ssIF90aGlzNS5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS50b2dnbGUoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIgIT09IFRSSUdHRVJfTUFOVUFMKSB7XG4gICAgICAgICAgdmFyIGV2ZW50SW4gPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID8gX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFRU5URVIgOiBfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNJTjtcbiAgICAgICAgICB2YXIgZXZlbnRPdXQgPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID8gX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFTEVBVkUgOiBfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzNS5lbGVtZW50KS5vbihldmVudEluLCBfdGhpczUuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczUuX2VudGVyKGV2ZW50KTtcbiAgICAgICAgICB9KS5vbihldmVudE91dCwgX3RoaXM1LmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM1Ll9sZWF2ZShldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXM1LmVsZW1lbnQpIHtcbiAgICAgICAgICBfdGhpczUuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5lbGVtZW50KS5jbG9zZXN0KCcubW9kYWwnKS5vbignaGlkZS5icy5tb2RhbCcsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBfZXh0ZW5kcyh7fSwgdGhpcy5jb25maWcsIHtcbiAgICAgICAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICAgICAgICBzZWxlY3RvcjogJydcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9maXhUaXRsZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2ZpeFRpdGxlID0gZnVuY3Rpb24gX2ZpeFRpdGxlKCkge1xuICAgICAgdmFyIHRpdGxlVHlwZSA9IHR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyk7XG5cbiAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8IHRpdGxlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScsIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykgfHwgJycpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9lbnRlciA9IGZ1bmN0aW9uIF9lbnRlcihldmVudCwgY29udGV4dCkge1xuICAgICAgdmFyIGRhdGFLZXkgPSB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZO1xuICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNvbnRleHQuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckNCkgfHwgY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfU0hPVykge1xuICAgICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSE9WRVJfU1RBVEVfU0hPVztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQoY29udGV4dC5fdGltZW91dCk7XG4gICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSE9WRVJfU1RBVEVfU0hPVztcblxuICAgICAgaWYgKCFjb250ZXh0LmNvbmZpZy5kZWxheSB8fCAhY29udGV4dC5jb25maWcuZGVsYXkuc2hvdykge1xuICAgICAgICBjb250ZXh0LnNob3coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIT1ZFUl9TVEFURV9TSE9XKSB7XG4gICAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2xlYXZlID0gZnVuY3Rpb24gX2xlYXZlKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgICB2YXIgZGF0YUtleSA9IHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7XG4gICAgICBjb250ZXh0ID0gY29udGV4dCB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRleHQuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KTtcbiAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIT1ZFUl9TVEFURV9PVVQ7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LmhpZGUpIHtcbiAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfT1VUKSB7XG4gICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LmhpZGUpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2lzV2l0aEFjdGl2ZVRyaWdnZXIgPSBmdW5jdGlvbiBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICAgIGZvciAodmFyIHRyaWdnZXIgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVHJpZ2dlclt0cmlnZ2VyXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgdmFyIGRhdGFBdHRyaWJ1dGVzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCkuZGF0YSgpO1xuICAgICAgT2JqZWN0LmtleXMoZGF0YUF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFBdHRyKSB7XG4gICAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaW5kZXhPZihkYXRhQXR0cikgIT09IC0xKSB7XG4gICAgICAgICAgZGVsZXRlIGRhdGFBdHRyaWJ1dGVzW2RhdGFBdHRyXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LCBkYXRhQXR0cmlidXRlcywgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICAgIHNob3c6IGNvbmZpZy5kZWxheSxcbiAgICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmZpZy50aXRsZSA9IGNvbmZpZy50aXRsZS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25maWcuY29udGVudCA9IGNvbmZpZy5jb250ZW50LnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkNiwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcblxuICAgICAgaWYgKGNvbmZpZy5zYW5pdGl6ZSkge1xuICAgICAgICBjb25maWcudGVtcGxhdGUgPSBzYW5pdGl6ZUh0bWwoY29uZmlnLnRlbXBsYXRlLCBjb25maWcud2hpdGVMaXN0LCBjb25maWcuc2FuaXRpemVGbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0RGVsZWdhdGVDb25maWcgPSBmdW5jdGlvbiBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgICB2YXIgY29uZmlnID0ge307XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jb25maWcpIHtcbiAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2tleV0gIT09IHRoaXMuY29uZmlnW2tleV0pIHtcbiAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5jb25maWdba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbGVhblRpcENsYXNzID0gZnVuY3Rpb24gX2NsZWFuVGlwQ2xhc3MoKSB7XG4gICAgICB2YXIgJHRpcCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmdldFRpcEVsZW1lbnQoKSk7XG4gICAgICB2YXIgdGFiQ2xhc3MgPSAkdGlwLmF0dHIoJ2NsYXNzJykubWF0Y2goQlNDTFNfUFJFRklYX1JFR0VYKTtcblxuICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCkge1xuICAgICAgICAkdGlwLnJlbW92ZUNsYXNzKHRhYkNsYXNzLmpvaW4oJycpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UgPSBmdW5jdGlvbiBfaGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlKHBvcHBlckRhdGEpIHtcbiAgICAgIHRoaXMudGlwID0gcG9wcGVyRGF0YS5pbnN0YW5jZS5wb3BwZXI7XG5cbiAgICAgIHRoaXMuX2NsZWFuVGlwQ2xhc3MoKTtcblxuICAgICAgdGhpcy5hZGRBdHRhY2htZW50Q2xhc3ModGhpcy5fZ2V0QXR0YWNobWVudChwb3BwZXJEYXRhLnBsYWNlbWVudCkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2ZpeFRyYW5zaXRpb24gPSBmdW5jdGlvbiBfZml4VHJhbnNpdGlvbigpIHtcbiAgICAgIHZhciB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKTtcbiAgICAgIHZhciBpbml0Q29uZmlnQW5pbWF0aW9uID0gdGhpcy5jb25maWcuYW5pbWF0aW9uO1xuXG4gICAgICBpZiAodGlwLmdldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aXApLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfRkFERSQyKTtcbiAgICAgIHRoaXMuY29uZmlnLmFuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIHRoaXMuY29uZmlnLmFuaW1hdGlvbiA9IGluaXRDb25maWdBbmltYXRpb247XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBUb29sdGlwLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJDYpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiAvZGlzcG9zZXxoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFRvb2x0aXAodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSQ2LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoVG9vbHRpcCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIk5BTUVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTkFNRSQ2O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEQVRBX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEQVRBX0tFWSQ2O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJFdmVudFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFdmVudDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRVZFTlRfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEVWRU5UX0tFWSQ2O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQ0O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUb29sdGlwO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDZdID0gVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ2XS5Db25zdHJ1Y3RvciA9IFRvb2x0aXA7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ2XSA9IEpRVUVSWV9OT19DT05GTElDVCQ2O1xuICAgIHJldHVybiBUb29sdGlwLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBOQU1FJDcgPSAncG9wb3Zlcic7XG4gIHZhciBWRVJTSU9OJDcgPSAnNC41LjMnO1xuICB2YXIgREFUQV9LRVkkNyA9ICdicy5wb3BvdmVyJztcbiAgdmFyIEVWRU5UX0tFWSQ3ID0gXCIuXCIgKyBEQVRBX0tFWSQ3O1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDcgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XTtcbiAgdmFyIENMQVNTX1BSRUZJWCQxID0gJ2JzLXBvcG92ZXInO1xuICB2YXIgQlNDTFNfUFJFRklYX1JFR0VYJDEgPSBuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBDTEFTU19QUkVGSVgkMSArIFwiXFxcXFMrXCIsICdnJyk7XG5cbiAgdmFyIERlZmF1bHQkNSA9IF9leHRlbmRzKHt9LCBUb29sdGlwLkRlZmF1bHQsIHtcbiAgICBwbGFjZW1lbnQ6ICdyaWdodCcsXG4gICAgdHJpZ2dlcjogJ2NsaWNrJyxcbiAgICBjb250ZW50OiAnJyxcbiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwb3BvdmVyXCIgcm9sZT1cInRvb2x0aXBcIj4nICsgJzxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PicgKyAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgKyAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PjwvZGl2PidcbiAgfSk7XG5cbiAgdmFyIERlZmF1bHRUeXBlJDUgPSBfZXh0ZW5kcyh7fSwgVG9vbHRpcC5EZWZhdWx0VHlwZSwge1xuICAgIGNvbnRlbnQ6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJ1xuICB9KTtcblxuICB2YXIgQ0xBU1NfTkFNRV9GQURFJDMgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckNSA9ICdzaG93JztcbiAgdmFyIFNFTEVDVE9SX1RJVExFID0gJy5wb3BvdmVyLWhlYWRlcic7XG4gIHZhciBTRUxFQ1RPUl9DT05URU5UID0gJy5wb3BvdmVyLWJvZHknO1xuICB2YXIgRXZlbnQkMSA9IHtcbiAgICBISURFOiBcImhpZGVcIiArIEVWRU5UX0tFWSQ3LFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSQ3LFxuICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZJDcsXG4gICAgU0hPV046IFwic2hvd25cIiArIEVWRU5UX0tFWSQ3LFxuICAgIElOU0VSVEVEOiBcImluc2VydGVkXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBDTElDSzogXCJjbGlja1wiICsgRVZFTlRfS0VZJDcsXG4gICAgRk9DVVNJTjogXCJmb2N1c2luXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBGT0NVU09VVDogXCJmb2N1c291dFwiICsgRVZFTlRfS0VZJDcsXG4gICAgTU9VU0VFTlRFUjogXCJtb3VzZWVudGVyXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBNT1VTRUxFQVZFOiBcIm1vdXNlbGVhdmVcIiArIEVWRU5UX0tFWSQ3XG4gIH07XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIFBvcG92ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ub29sdGlwKSB7XG4gICAgX2luaGVyaXRzTG9vc2UoUG9wb3ZlciwgX1Rvb2x0aXApO1xuXG4gICAgZnVuY3Rpb24gUG9wb3ZlcigpIHtcbiAgICAgIHJldHVybiBfVG9vbHRpcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IFBvcG92ZXIucHJvdG90eXBlO1xuXG4gICAgLy8gT3ZlcnJpZGVzXG4gICAgX3Byb3RvLmlzV2l0aENvbnRlbnQgPSBmdW5jdGlvbiBpc1dpdGhDb250ZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KCk7XG4gICAgfTtcblxuICAgIF9wcm90by5hZGRBdHRhY2htZW50Q2xhc3MgPSBmdW5jdGlvbiBhZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhDTEFTU19QUkVGSVgkMSArIFwiLVwiICsgYXR0YWNobWVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by5nZXRUaXBFbGVtZW50ID0gZnVuY3Rpb24gZ2V0VGlwRWxlbWVudCgpIHtcbiAgICAgIHRoaXMudGlwID0gdGhpcy50aXAgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgdmFyICR0aXAgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5nZXRUaXBFbGVtZW50KCkpOyAvLyBXZSB1c2UgYXBwZW5kIGZvciBodG1sIG9iamVjdHMgdG8gbWFpbnRhaW4ganMgZXZlbnRzXG5cbiAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJHRpcC5maW5kKFNFTEVDVE9SX1RJVExFKSwgdGhpcy5nZXRUaXRsZSgpKTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9nZXRDb250ZW50KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5jYWxsKHRoaXMuZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJHRpcC5maW5kKFNFTEVDVE9SX0NPTlRFTlQpLCBjb250ZW50KTtcbiAgICAgICR0aXAucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDMgKyBcIiBcIiArIENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbnRlbnQgPSBmdW5jdGlvbiBfZ2V0Q29udGVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQnKSB8fCB0aGlzLmNvbmZpZy5jb250ZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgIHZhciAkdGlwID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTtcbiAgICAgIHZhciB0YWJDbGFzcyA9ICR0aXAuYXR0cignY2xhc3MnKS5tYXRjaChCU0NMU19QUkVGSVhfUkVHRVgkMSk7XG5cbiAgICAgIGlmICh0YWJDbGFzcyAhPT0gbnVsbCAmJiB0YWJDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICR0aXAucmVtb3ZlQ2xhc3ModGFiQ2xhc3Muam9pbignJykpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgUG9wb3Zlci5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDcpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBudWxsO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiAvZGlzcG9zZXxoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFBvcG92ZXIsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgLy8gR2V0dGVyc1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ1O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5BTUUkNztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiREFUQV9LRVlcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gREFUQV9LRVkkNztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRXZlbnRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRXZlbnQkMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRVZFTlRfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEVWRU5UX0tFWSQ3O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQ1O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBQb3BvdmVyO1xuICB9KFRvb2x0aXApO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XSA9IFBvcG92ZXIuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN10uQ29uc3RydWN0b3IgPSBQb3BvdmVyO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDddLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN10gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNztcbiAgICByZXR1cm4gUG9wb3Zlci5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ4ID0gJ3Njcm9sbHNweSc7XG4gIHZhciBWRVJTSU9OJDggPSAnNC41LjMnO1xuICB2YXIgREFUQV9LRVkkOCA9ICdicy5zY3JvbGxzcHknO1xuICB2YXIgRVZFTlRfS0VZJDggPSBcIi5cIiArIERBVEFfS0VZJDg7XG4gIHZhciBEQVRBX0FQSV9LRVkkNiA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDggPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XTtcbiAgdmFyIERlZmF1bHQkNiA9IHtcbiAgICBvZmZzZXQ6IDEwLFxuICAgIG1ldGhvZDogJ2F1dG8nLFxuICAgIHRhcmdldDogJydcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlJDYgPSB7XG4gICAgb2Zmc2V0OiAnbnVtYmVyJyxcbiAgICBtZXRob2Q6ICdzdHJpbmcnLFxuICAgIHRhcmdldDogJyhzdHJpbmd8ZWxlbWVudCknXG4gIH07XG4gIHZhciBFVkVOVF9BQ1RJVkFURSA9IFwiYWN0aXZhdGVcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfU0NST0xMID0gXCJzY3JvbGxcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfTE9BRF9EQVRBX0FQSSQyID0gXCJsb2FkXCIgKyBFVkVOVF9LRVkkOCArIERBVEFfQVBJX0tFWSQ2O1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNID0gJ2Ryb3Bkb3duLWl0ZW0nO1xuICB2YXIgQ0xBU1NfTkFNRV9BQ1RJVkUkMiA9ICdhY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9TUFkgPSAnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJztcbiAgdmFyIFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbiAgdmFyIFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuICB2YXIgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuICB2YXIgU0VMRUNUT1JfRFJPUERPV04gPSAnLmRyb3Bkb3duJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX0lURU1TID0gJy5kcm9wZG93bi1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbiAgdmFyIE1FVEhPRF9PRkZTRVQgPSAnb2Zmc2V0JztcbiAgdmFyIE1FVEhPRF9QT1NJVElPTiA9ICdwb3NpdGlvbic7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIFNjcm9sbFNweSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2Nyb2xsU3B5KGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScgPyB3aW5kb3cgOiBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9zZWxlY3RvciA9IHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX05BVl9MSU5LUyArIFwiLFwiICsgKHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX0xJU1RfSVRFTVMgKyBcIixcIikgKyAodGhpcy5fY29uZmlnLnRhcmdldCArIFwiIFwiICsgU0VMRUNUT1JfRFJPUERPV05fSVRFTVMpO1xuICAgICAgdGhpcy5fb2Zmc2V0cyA9IFtdO1xuICAgICAgdGhpcy5fdGFyZ2V0cyA9IFtdO1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IDA7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fc2Nyb2xsRWxlbWVudCkub24oRVZFTlRfU0NST0xMLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLl9wcm9jZXNzKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG5cbiAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IFNjcm9sbFNweS5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8ucmVmcmVzaCA9IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGF1dG9NZXRob2QgPSB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB0aGlzLl9zY3JvbGxFbGVtZW50LndpbmRvdyA/IE1FVEhPRF9PRkZTRVQgOiBNRVRIT0RfUE9TSVRJT047XG4gICAgICB2YXIgb2Zmc2V0TWV0aG9kID0gdGhpcy5fY29uZmlnLm1ldGhvZCA9PT0gJ2F1dG8nID8gYXV0b01ldGhvZCA6IHRoaXMuX2NvbmZpZy5tZXRob2Q7XG4gICAgICB2YXIgb2Zmc2V0QmFzZSA9IG9mZnNldE1ldGhvZCA9PT0gTUVUSE9EX1BPU0lUSU9OID8gdGhpcy5fZ2V0U2Nyb2xsVG9wKCkgOiAwO1xuICAgICAgdGhpcy5fb2Zmc2V0cyA9IFtdO1xuICAgICAgdGhpcy5fdGFyZ2V0cyA9IFtdO1xuICAgICAgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KCk7XG4gICAgICB2YXIgdGFyZ2V0cyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZWxlY3RvcikpO1xuICAgICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHRhcmdldDtcbiAgICAgICAgdmFyIHRhcmdldFNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgIGlmICh0YXJnZXRTZWxlY3Rvcikge1xuICAgICAgICAgIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHZhciB0YXJnZXRCQ1IgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0QkNSLndpZHRoIHx8IHRhcmdldEJDUi5oZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gKGZhdCk6IHJlbW92ZSBza2V0Y2ggcmVsaWFuY2Ugb24galF1ZXJ5IHBvc2l0aW9uL29mZnNldFxuICAgICAgICAgICAgcmV0dXJuIFskX19kZWZhdWx0WydkZWZhdWx0J10odGFyZ2V0KVtvZmZzZXRNZXRob2RdKCkudG9wICsgb2Zmc2V0QmFzZSwgdGFyZ2V0U2VsZWN0b3JdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYVswXSAtIGJbMF07XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIF90aGlzMi5fb2Zmc2V0cy5wdXNoKGl0ZW1bMF0pO1xuXG4gICAgICAgIF90aGlzMi5fdGFyZ2V0cy5wdXNoKGl0ZW1bMV0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDgpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkkOCk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX3NlbGVjdG9yID0gbnVsbDtcbiAgICAgIHRoaXMuX29mZnNldHMgPSBudWxsO1xuICAgICAgdGhpcy5fdGFyZ2V0cyA9IG51bGw7XG4gICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuICAgICAgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gbnVsbDtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCQ2LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRhcmdldCAhPT0gJ3N0cmluZycgJiYgVXRpbC5pc0VsZW1lbnQoY29uZmlnLnRhcmdldCkpIHtcbiAgICAgICAgdmFyIGlkID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJyk7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIGlkID0gVXRpbC5nZXRVSUQoTkFNRSQ4KTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oY29uZmlnLnRhcmdldCkuYXR0cignaWQnLCBpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcudGFyZ2V0ID0gXCIjXCIgKyBpZDtcbiAgICAgIH1cblxuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQ4LCBjb25maWcsIERlZmF1bHRUeXBlJDYpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQgPT09IHdpbmRvdyA/IHRoaXMuX3Njcm9sbEVsZW1lbnQucGFnZVlPZmZzZXQgOiB0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IHx8IE1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRPZmZzZXRIZWlnaHQgPSBmdW5jdGlvbiBfZ2V0T2Zmc2V0SGVpZ2h0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQgPT09IHdpbmRvdyA/IHdpbmRvdy5pbm5lckhlaWdodCA6IHRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3Byb2Nlc3MgPSBmdW5jdGlvbiBfcHJvY2VzcygpIHtcbiAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLl9nZXRTY3JvbGxUb3AoKSArIHRoaXMuX2NvbmZpZy5vZmZzZXQ7XG5cbiAgICAgIHZhciBzY3JvbGxIZWlnaHQgPSB0aGlzLl9nZXRTY3JvbGxIZWlnaHQoKTtcblxuICAgICAgdmFyIG1heFNjcm9sbCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQgKyBzY3JvbGxIZWlnaHQgLSB0aGlzLl9nZXRPZmZzZXRIZWlnaHQoKTtcblxuICAgICAgaWYgKHRoaXMuX3Njcm9sbEhlaWdodCAhPT0gc2Nyb2xsSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5fdGFyZ2V0c1t0aGlzLl90YXJnZXRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX2FjdGl2YXRlKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgJiYgc2Nyb2xsVG9wIDwgdGhpcy5fb2Zmc2V0c1swXSAmJiB0aGlzLl9vZmZzZXRzWzBdID4gMCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NsZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5fb2Zmc2V0cy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgdmFyIGlzQWN0aXZlVGFyZ2V0ID0gdGhpcy5fYWN0aXZlVGFyZ2V0ICE9PSB0aGlzLl90YXJnZXRzW2ldICYmIHNjcm9sbFRvcCA+PSB0aGlzLl9vZmZzZXRzW2ldICYmICh0eXBlb2YgdGhpcy5fb2Zmc2V0c1tpICsgMV0gPT09ICd1bmRlZmluZWQnIHx8IHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbaSArIDFdKTtcblxuICAgICAgICBpZiAoaXNBY3RpdmVUYXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0aGlzLl90YXJnZXRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2FjdGl2YXRlID0gZnVuY3Rpb24gX2FjdGl2YXRlKHRhcmdldCkge1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgICB0aGlzLl9jbGVhcigpO1xuXG4gICAgICB2YXIgcXVlcmllcyA9IHRoaXMuX3NlbGVjdG9yLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gc2VsZWN0b3IgKyBcIltkYXRhLXRhcmdldD1cXFwiXCIgKyB0YXJnZXQgKyBcIlxcXCJdLFwiICsgc2VsZWN0b3IgKyBcIltocmVmPVxcXCJcIiArIHRhcmdldCArIFwiXFxcIl1cIjtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgJGxpbmsgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJpZXMuam9pbignLCcpKSkpO1xuXG4gICAgICBpZiAoJGxpbmsuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgICAkbGluay5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKS5maW5kKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICAgICRsaW5rLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2V0IHRyaWdnZXJlZCBsaW5rIGFzIGFjdGl2ZVxuICAgICAgICAkbGluay5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQyKTsgLy8gU2V0IHRyaWdnZXJlZCBsaW5rcyBwYXJlbnRzIGFzIGFjdGl2ZVxuICAgICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcblxuICAgICAgICAkbGluay5wYXJlbnRzKFNFTEVDVE9SX05BVl9MSVNUX0dST1VQKS5wcmV2KFNFTEVDVE9SX05BVl9MSU5LUyArIFwiLCBcIiArIFNFTEVDVE9SX0xJU1RfSVRFTVMpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpOyAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gLm5hdi1saW5rIGlzIGluc2lkZSAubmF2LWl0ZW1cblxuICAgICAgICAkbGluay5wYXJlbnRzKFNFTEVDVE9SX05BVl9MSVNUX0dST1VQKS5wcmV2KFNFTEVDVE9SX05BVl9JVEVNUykuY2hpbGRyZW4oU0VMRUNUT1JfTkFWX0xJTktTKS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX3Njcm9sbEVsZW1lbnQpLnRyaWdnZXIoRVZFTlRfQUNUSVZBVEUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbGVhciA9IGZ1bmN0aW9uIF9jbGVhcigpIHtcbiAgICAgIFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZWxlY3RvcikpLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICB9KTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFNjcm9sbFNweS5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDgpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgU2Nyb2xsU3B5KHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDgsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhTY3JvbGxTcHksIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDg7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ2O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBTY3JvbGxTcHk7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vbihFVkVOVF9MT0FEX0RBVEFfQVBJJDIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2Nyb2xsU3B5cyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1NQWSkpO1xuICAgIHZhciBzY3JvbGxTcHlzTGVuZ3RoID0gc2Nyb2xsU3B5cy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gc2Nyb2xsU3B5c0xlbmd0aDsgaS0tOykge1xuICAgICAgdmFyICRzcHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oc2Nyb2xsU3B5c1tpXSk7XG5cbiAgICAgIFNjcm9sbFNweS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJHNweSwgJHNweS5kYXRhKCkpO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XSA9IFNjcm9sbFNweS5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XS5Db25zdHJ1Y3RvciA9IFNjcm9sbFNweTtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDhdID0gSlFVRVJZX05PX0NPTkZMSUNUJDg7XG4gICAgcmV0dXJuIFNjcm9sbFNweS5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ5ID0gJ3RhYic7XG4gIHZhciBWRVJTSU9OJDkgPSAnNC41LjMnO1xuICB2YXIgREFUQV9LRVkkOSA9ICdicy50YWInO1xuICB2YXIgRVZFTlRfS0VZJDkgPSBcIi5cIiArIERBVEFfS0VZJDk7XG4gIHZhciBEQVRBX0FQSV9LRVkkNyA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XTtcbiAgdmFyIEVWRU5UX0hJREUkMyA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9ISURERU4kMyA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkOTtcbiAgdmFyIEVWRU5UX1NIT1ckMyA9IFwic2hvd1wiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9TSE9XTiQzID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQ2ID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDkgKyBEQVRBX0FQSV9LRVkkNztcbiAgdmFyIENMQVNTX05BTUVfRFJPUERPV05fTUVOVSA9ICdkcm9wZG93bi1tZW51JztcbiAgdmFyIENMQVNTX05BTUVfQUNUSVZFJDMgPSAnYWN0aXZlJztcbiAgdmFyIENMQVNTX05BTUVfRElTQUJMRUQkMSA9ICdkaXNhYmxlZCc7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUkNCA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQ2ID0gJ3Nob3cnO1xuICB2YXIgU0VMRUNUT1JfRFJPUERPV04kMSA9ICcuZHJvcGRvd24nO1xuICB2YXIgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAkMSA9ICcubmF2LCAubGlzdC1ncm91cCc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUkMiA9ICcuYWN0aXZlJztcbiAgdmFyIFNFTEVDVE9SX0FDVElWRV9VTCA9ICc+IGxpID4gLmFjdGl2ZSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0ID0gJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtdG9nZ2xlPVwibGlzdFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX0FDVElWRV9DSElMRCA9ICc+IC5kcm9wZG93bi1tZW51IC5hY3RpdmUnO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUYWIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYihlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IFRhYi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlICYmIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpIHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0RJU0FCTEVEJDEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhcmdldDtcbiAgICAgIHZhciBwcmV2aW91cztcbiAgICAgIHZhciBsaXN0RWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX05BVl9MSVNUX0dST1VQJDEpWzBdO1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICBpZiAobGlzdEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGl0ZW1TZWxlY3RvciA9IGxpc3RFbGVtZW50Lm5vZGVOYW1lID09PSAnVUwnIHx8IGxpc3RFbGVtZW50Lm5vZGVOYW1lID09PSAnT0wnID8gU0VMRUNUT1JfQUNUSVZFX1VMIDogU0VMRUNUT1JfQUNUSVZFJDI7XG4gICAgICAgIHByZXZpb3VzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLm1ha2VBcnJheSgkX19kZWZhdWx0WydkZWZhdWx0J10obGlzdEVsZW1lbnQpLmZpbmQoaXRlbVNlbGVjdG9yKSk7XG4gICAgICAgIHByZXZpb3VzID0gcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV07XG4gICAgICB9XG5cbiAgICAgIHZhciBoaWRlRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfSElERSQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH0pO1xuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TSE9XJDMsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcHJldmlvdXNcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHByZXZpb3VzKS50cmlnZ2VyKGhpZGVFdmVudCk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LCBsaXN0RWxlbWVudCk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICB2YXIgaGlkZGVuRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfSElEREVOJDMsIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBfdGhpcy5fZWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNob3duRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPV04kMywge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICAgIH0pO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ocHJldmlvdXMpLnRyaWdnZXIoaGlkZGVuRXZlbnQpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd25FdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRlKHRhcmdldCwgdGFyZ2V0LnBhcmVudE5vZGUsIGNvbXBsZXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDkpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9hY3RpdmF0ZSA9IGZ1bmN0aW9uIF9hY3RpdmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnRzID0gY29udGFpbmVyICYmIChjb250YWluZXIubm9kZU5hbWUgPT09ICdVTCcgfHwgY29udGFpbmVyLm5vZGVOYW1lID09PSAnT0wnKSA/ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjb250YWluZXIpLmZpbmQoU0VMRUNUT1JfQUNUSVZFX1VMKSA6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjb250YWluZXIpLmNoaWxkcmVuKFNFTEVDVE9SX0FDVElWRSQyKTtcbiAgICAgIHZhciBhY3RpdmUgPSBhY3RpdmVFbGVtZW50c1swXTtcbiAgICAgIHZhciBpc1RyYW5zaXRpb25pbmcgPSBjYWxsYmFjayAmJiBhY3RpdmUgJiYgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDQpO1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5fdHJhbnNpdGlvbkNvbXBsZXRlKGVsZW1lbnQsIGFjdGl2ZSwgY2FsbGJhY2spO1xuICAgICAgfTtcblxuICAgICAgaWYgKGFjdGl2ZSAmJiBpc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQoYWN0aXZlKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDYpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmUpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICB2YXIgZHJvcGRvd25DaGlsZCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmUucGFyZW50Tm9kZSkuZmluZChTRUxFQ1RPUl9EUk9QRE9XTl9BQ1RJVkVfQ0hJTEQpWzBdO1xuXG4gICAgICAgIGlmIChkcm9wZG93bkNoaWxkKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRyb3Bkb3duQ2hpbGQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICBhY3RpdmUuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQzKTtcblxuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIFV0aWwucmVmbG93KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDQpKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgJiYgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQucGFyZW50Tm9kZSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QRE9XTl9NRU5VKSkge1xuICAgICAgICB2YXIgZHJvcGRvd25FbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04kMSlbMF07XG5cbiAgICAgICAgaWYgKGRyb3Bkb3duRWxlbWVudCkge1xuICAgICAgICAgIHZhciBkcm9wZG93blRvZ2dsZUxpc3QgPSBbXS5zbGljZS5jYWxsKGRyb3Bkb3duRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSQxKSk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRyb3Bkb3duVG9nZ2xlTGlzdCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMyk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJHRoaXMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJHRoaXMuZGF0YShEQVRBX0tFWSQ5KTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFRhYih0aGlzKTtcbiAgICAgICAgICAkdGhpcy5kYXRhKERBVEFfS0VZJDksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhUYWIsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRhYjtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNiwgU0VMRUNUT1JfREFUQV9UT0dHTEUkNCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAnc2hvdycpO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldID0gVGFiLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldLkNvbnN0cnVjdG9yID0gVGFiO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkOTtcbiAgICByZXR1cm4gVGFiLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBOQU1FJGEgPSAndG9hc3QnO1xuICB2YXIgVkVSU0lPTiRhID0gJzQuNS4zJztcbiAgdmFyIERBVEFfS0VZJGEgPSAnYnMudG9hc3QnO1xuICB2YXIgRVZFTlRfS0VZJGEgPSBcIi5cIiArIERBVEFfS0VZJGE7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkYSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGFdO1xuICB2YXIgRVZFTlRfQ0xJQ0tfRElTTUlTUyQxID0gXCJjbGljay5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkYTtcbiAgdmFyIEVWRU5UX0hJREUkNCA9IFwiaGlkZVwiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBFVkVOVF9ISURERU4kNCA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkYTtcbiAgdmFyIEVWRU5UX1NIT1ckNCA9IFwic2hvd1wiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBFVkVOVF9TSE9XTiQ0ID0gXCJzaG93blwiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUkNSA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfSElERSA9ICdoaWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQ3ID0gJ3Nob3cnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnO1xuICB2YXIgRGVmYXVsdFR5cGUkNyA9IHtcbiAgICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgICBhdXRvaGlkZTogJ2Jvb2xlYW4nLFxuICAgIGRlbGF5OiAnbnVtYmVyJ1xuICB9O1xuICB2YXIgRGVmYXVsdCQ3ID0ge1xuICAgIGFuaW1hdGlvbjogdHJ1ZSxcbiAgICBhdXRvaGlkZTogdHJ1ZSxcbiAgICBkZWxheTogNTAwXG4gIH07XG4gIHZhciBTRUxFQ1RPUl9EQVRBX0RJU01JU1MkMSA9ICdbZGF0YS1kaXNtaXNzPVwidG9hc3RcIl0nO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUb2FzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVG9hc3QoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9hc3QucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TSE9XJDQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcblxuICAgICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFJDUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgX3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpO1xuXG4gICAgICAgIF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDcpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpcy5fZWxlbWVudCkudHJpZ2dlcihFVkVOVF9TSE9XTiQ0KTtcblxuICAgICAgICBpZiAoX3RoaXMuX2NvbmZpZy5hdXRvaGlkZSkge1xuICAgICAgICAgIF90aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfSwgX3RoaXMuX2NvbmZpZy5kZWxheSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpO1xuXG4gICAgICBVdGlsLnJlZmxvdyh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJREUkNCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2xvc2UoKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0KCk7XG5cbiAgICAgIGlmICh0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNykpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9DTElDS19ESVNNSVNTJDEpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkYSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkNywgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmRhdGEoKSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSRhLCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfc2V0TGlzdGVuZXJzKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9DTElDS19ESVNNSVNTJDEsIFNFTEVDVE9SX0RBVEFfRElTTUlTUyQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuaGlkZSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xvc2UgPSBmdW5jdGlvbiBfY2xvc2UoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIF90aGlzMy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElERSk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzMy5fZWxlbWVudCkudHJpZ2dlcihFVkVOVF9ISURERU4kNCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDcpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gX2NsZWFyVGltZW91dCgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVG9hc3QuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICRlbGVtZW50LmRhdGEoREFUQV9LRVkkYSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBUb2FzdCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfS0VZJGEsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoVG9hc3QsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJGE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlJDc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ3O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUb2FzdDtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXSA9IFRvYXN0Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGFdLkNvbnN0cnVjdG9yID0gVG9hc3Q7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXSA9IEpRVUVSWV9OT19DT05GTElDVCRhO1xuICAgIHJldHVybiBUb2FzdC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIGV4cG9ydHMuQWxlcnQgPSBBbGVydDtcbiAgZXhwb3J0cy5CdXR0b24gPSBCdXR0b247XG4gIGV4cG9ydHMuQ2Fyb3VzZWwgPSBDYXJvdXNlbDtcbiAgZXhwb3J0cy5Db2xsYXBzZSA9IENvbGxhcHNlO1xuICBleHBvcnRzLkRyb3Bkb3duID0gRHJvcGRvd247XG4gIGV4cG9ydHMuTW9kYWwgPSBNb2RhbDtcbiAgZXhwb3J0cy5Qb3BvdmVyID0gUG9wb3ZlcjtcbiAgZXhwb3J0cy5TY3JvbGxzcHkgPSBTY3JvbGxTcHk7XG4gIGV4cG9ydHMuVGFiID0gVGFiO1xuICBleHBvcnRzLlRvYXN0ID0gVG9hc3Q7XG4gIGV4cG9ydHMuVG9vbHRpcCA9IFRvb2x0aXA7XG4gIGV4cG9ydHMuVXRpbCA9IFV0aWw7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcC5qcy5tYXBcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My41LjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDIwLTA1LTA0VDIyOjQ5WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBmbGF0ID0gYXJyLmZsYXQgPyBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuZmxhdC5jYWxsKCBhcnJheSApO1xufSA6IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5jb25jYXQuYXBwbHkoIFtdLCBhcnJheSApO1xufTtcblxuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqICkge1xuXG4gICAgICAvLyBTdXBwb3J0OiBDaHJvbWUgPD01NywgRmlyZWZveCA8PTUyXG4gICAgICAvLyBJbiBzb21lIGJyb3dzZXJzLCB0eXBlb2YgcmV0dXJucyBcImZ1bmN0aW9uXCIgZm9yIEhUTUwgPG9iamVjdD4gZWxlbWVudHNcbiAgICAgIC8vIChpLmUuLCBgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib2JqZWN0XCIgKSA9PT0gXCJmdW5jdGlvblwiYCkuXG4gICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNsYXNzaWZ5ICphbnkqIERPTSBub2RlIGFzIGEgZnVuY3Rpb24uXG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBvYmoubm9kZVR5cGUgIT09IFwibnVtYmVyXCI7XG4gIH07XG5cblxudmFyIGlzV2luZG93ID0gZnVuY3Rpb24gaXNXaW5kb3coIG9iaiApIHtcblx0XHRyZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09PSBvYmoud2luZG93O1xuXHR9O1xuXG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9uY2U6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBub2RlLCBkb2MgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksIHZhbCxcblx0XHRcdHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KCBcInNjcmlwdFwiICk7XG5cblx0XHRzY3JpcHQudGV4dCA9IGNvZGU7XG5cdFx0aWYgKCBub2RlICkge1xuXHRcdFx0Zm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNjQrLCBFZGdlIDE4K1xuXHRcdFx0XHQvLyBTb21lIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgdGhlIFwibm9uY2VcIiBwcm9wZXJ0eSBvbiBzY3JpcHRzLlxuXHRcdFx0XHQvLyBPbiB0aGUgb3RoZXIgaGFuZCwganVzdCB1c2luZyBgZ2V0QXR0cmlidXRlYCBpcyBub3QgZW5vdWdoIGFzXG5cdFx0XHRcdC8vIHRoZSBgbm9uY2VgIGF0dHJpYnV0ZSBpcyByZXNldCB0byBhbiBlbXB0eSBzdHJpbmcgd2hlbmV2ZXIgaXRcblx0XHRcdFx0Ly8gYmVjb21lcyBicm93c2luZy1jb250ZXh0IGNvbm5lY3RlZC5cblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OVxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jbm9uY2UtYXR0cmlidXRlc1xuXHRcdFx0XHQvLyBUaGUgYG5vZGUuZ2V0QXR0cmlidXRlYCBjaGVjayB3YXMgYWRkZWQgZm9yIHRoZSBzYWtlIG9mXG5cdFx0XHRcdC8vIGBqUXVlcnkuZ2xvYmFsRXZhbGAgc28gdGhhdCBpdCBjYW4gZmFrZSBhIG5vbmNlLWNvbnRhaW5pbmcgbm9kZVxuXHRcdFx0XHQvLyB2aWEgYW4gb2JqZWN0LlxuXHRcdFx0XHR2YWwgPSBub2RlWyBpIF0gfHwgbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoIGkgKTtcblx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0c2NyaXB0LnNldEF0dHJpYnV0ZSggaSwgdmFsICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjUuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblxuXHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRpZiAoIG51bSA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0cmV0dXJuIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF07XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXZlbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICggaSArIDEgKSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0b2RkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gaSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IE9iamVjdC5wcm90b3R5cGUgcG9sbHV0aW9uXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCBuYW1lID09PSBcIl9fcHJvdG9fX1wiIHx8IHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblx0XHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSBwcm9wZXIgdHlwZSBmb3IgdGhlIHNvdXJjZSB2YWx1ZVxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgJiYgIUFycmF5LmlzQXJyYXkoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBbXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhY29weUlzQXJyYXkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0ge307XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIHByb3ZpZGVkIGNvbnRleHQ7IGZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBvbmVcblx0Ly8gaWYgbm90IHNwZWNpZmllZC5cblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUsIG9wdGlvbnMsIGRvYyApIHtcblx0XHRET01FdmFsKCBjb2RlLCB7IG5vbmNlOiBvcHRpb25zICYmIG9wdGlvbnMubm9uY2UgfSwgZG9jICk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGZsYXQoIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbn0gKTtcblxuZnVuY3Rpb24gaXNBcnJheUxpa2UoIG9iaiApIHtcblxuXHQvLyBTdXBwb3J0OiByZWFsIGlPUyA4LjIgb25seSAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9ICEhb2JqICYmIFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IHRvVHlwZSggb2JqICk7XG5cblx0aWYgKCBpc0Z1bmN0aW9uKCBvYmogKSB8fCBpc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHR5cGUgPT09IFwiYXJyYXlcIiB8fCBsZW5ndGggPT09IDAgfHxcblx0XHR0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKCBsZW5ndGggLSAxICkgaW4gb2JqO1xufVxudmFyIFNpenpsZSA9XG4vKiFcbiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuNVxuICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2pzLmZvdW5kYXRpb24vXG4gKlxuICogRGF0ZTogMjAyMC0wMy0xNFxuICovXG4oIGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRub25uYXRpdmVTZWxlY3RvckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoIHt9ICkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoTmF0aXZlID0gYXJyLnB1c2gsXG5cdHB1c2ggPSBhcnIucHVzaCxcblx0c2xpY2UgPSBhcnIuc2xpY2UsXG5cblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0WyBpIF0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0Ym9vbGVhbnMgPSBcImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxcIiArXG5cdFx0XCJpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsXG5cblx0Ly8gUmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlXG5cdHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsXG5cblx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jaWRlbnQtdG9rZW4tZGlhZ3JhbVxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCI/fFxcXFxcXFxcW15cXFxcclxcXFxuXFxcXGZdfFtcXFxcdy1dfFteXFwwLVxcXFx4N2ZdKStcIixcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XVxuXHRcdC8vIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdXCJcblx0XHRcIiooPzonKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCJ8KFwiICsgaWRlbnRpZmllciArIFwiKSl8KVwiICtcblx0XHR3aGl0ZXNwYWNlICsgXCIqXFxcXF1cIixcblxuXHRwc2V1ZG9zID0gXCI6KFwiICsgaWRlbnRpZmllciArIFwiKSg/OlxcXFwoKFwiICtcblxuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cblx0XHQvLyAyLiBzaW1wbGUgKGNhcHR1cmUgNilcblx0XHRcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpW1xcXFxdXXxcIiArIGF0dHJpYnV0ZXMgKyBcIikqKXxcIiArXG5cblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgK1xuXHRcdHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlwiICksXG5cdHJkZXNjZW5kID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwifD5cIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiVEFHXCI6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJodG1sID0gL0hUTUwkL2ksXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cblx0Ly8gQ1NTIGVzY2FwZXNcblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcW1xcXFxkYS1mQS1GXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fFxcXFxcXFxcKFteXFxcXHJcXFxcblxcXFxmXSlcIiwgXCJnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIGVzY2FwZSwgbm9uSGV4ICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlLnNsaWNlKCAxICkgLSAweDEwMDAwO1xuXG5cdFx0cmV0dXJuIG5vbkhleCA/XG5cblx0XHRcdC8vIFN0cmlwIHRoZSBiYWNrc2xhc2ggcHJlZml4IGZyb20gYSBub24taGV4IGVzY2FwZSBzZXF1ZW5jZVxuXHRcdFx0bm9uSGV4IDpcblxuXHRcdFx0Ly8gUmVwbGFjZSBhIGhleGFkZWNpbWFsIGVzY2FwZSBzZXF1ZW5jZSB3aXRoIHRoZSBlbmNvZGVkIFVuaWNvZGUgY29kZSBwb2ludFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMStcblx0XHRcdC8vIEZvciB2YWx1ZXMgb3V0c2lkZSB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApLCBtYW51YWxseSBjb25zdHJ1Y3QgYVxuXHRcdFx0Ly8gc3Vycm9nYXRlIHBhaXJcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uXG5cdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jY29tbW9uLXNlcmlhbGl6aW5nLWlkaW9tc1xuXHRyY3NzZXNjYXBlID0gLyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFwwLVxceDFmXFx4N2YtXFx1RkZGRlxcdy1dL2csXG5cdGZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkge1xuXHRcdGlmICggYXNDb2RlUG9pbnQgKSB7XG5cblx0XHRcdC8vIFUrMDAwMCBOVUxMIGJlY29tZXMgVStGRkZEIFJFUExBQ0VNRU5UIENIQVJBQ1RFUlxuXHRcdFx0aWYgKCBjaCA9PT0gXCJcXDBcIiApIHtcblx0XHRcdFx0cmV0dXJuIFwiXFx1RkZGRFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdFx0cmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgXCJcXFxcXCIgK1xuXHRcdFx0XHRjaC5jaGFyQ29kZUF0KCBjaC5sZW5ndGggLSAxICkudG9TdHJpbmcoIDE2ICkgKyBcIiBcIjtcblx0XHR9XG5cblx0XHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdFx0cmV0dXJuIFwiXFxcXFwiICsgY2g7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH0sXG5cblx0aW5EaXNhYmxlZEZpZWxkc2V0ID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmaWVsZHNldFwiO1xuXHRcdH0sXG5cdFx0eyBkaXI6IFwicGFyZW50Tm9kZVwiLCBuZXh0OiBcImxlZ2VuZFwiIH1cblx0KTtcblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KCBhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApICksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0YXJyWyBwcmVmZXJyZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTtcbn0gY2F0Y2ggKCBlICkge1xuXHRwdXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/XG5cblx0XHQvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hOYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbCggZWxzICkgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0Ly8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoXG5cdFx0XHR3aGlsZSAoICggdGFyZ2V0WyBqKysgXSA9IGVsc1sgaSsrIF0gKSApIHt9XG5cdFx0XHR0YXJnZXQubGVuZ3RoID0gaiAtIDE7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3Rvcixcblx0XHRuZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsXG5cblx0XHQvLyBub2RlVHlwZSBkZWZhdWx0cyB0byA5LCBzaW5jZSBjb250ZXh0IGRlZmF1bHRzIHRvIGRvY3VtZW50XG5cdFx0bm9kZVR5cGUgPSBjb250ZXh0ID8gY29udGV4dC5ub2RlVHlwZSA6IDk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGZyb20gY2FsbHMgd2l0aCBpbnZhbGlkIHNlbGVjdG9yIG9yIGNvbnRleHRcblx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgfHwgIXNlbGVjdG9yIHx8XG5cdFx0bm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDkgJiYgbm9kZVR5cGUgIT09IDExICkge1xuXG5cdFx0cmV0dXJuIHJlc3VsdHM7XG5cdH1cblxuXHQvLyBUcnkgdG8gc2hvcnRjdXQgZmluZCBvcGVyYXRpb25zIChhcyBvcHBvc2VkIHRvIGZpbHRlcnMpIGluIEhUTUwgZG9jdW1lbnRzXG5cdGlmICggIXNlZWQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0XHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSBcImdldCpCeSpcIiBET00gbWV0aG9kXG5cdFx0XHQvLyAoZXhjZXB0aW5nIERvY3VtZW50RnJhZ21lbnQgY29udGV4dCwgd2hlcmUgdGhlIG1ldGhvZHMgZG9uJ3QgZXhpc3QpXG5cdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAoIG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApICkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAoIG0gPSBtYXRjaFsgMSBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb2N1bWVudCBjb250ZXh0XG5cdFx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKCBlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApICkgJiZcblx0XHRcdFx0XHRcdFx0Y29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJlxuXHRcdFx0XHRcdFx0XHRlbGVtLmlkID09PSBtICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHlwZSBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsgMiBdICkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0XHQvLyBDbGFzcyBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAoIG0gPSBtYXRjaFsgMyBdICkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmXG5cdFx0XHRcdFx0Y29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUYWtlIGFkdmFudGFnZSBvZiBxdWVyeVNlbGVjdG9yQWxsXG5cdFx0XHRpZiAoIHN1cHBvcnQucXNhICYmXG5cdFx0XHRcdCFub25uYXRpdmVTZWxlY3RvckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF0gJiZcblx0XHRcdFx0KCAhcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSApICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOCBvbmx5XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgb2JqZWN0IGVsZW1lbnRzXG5cdFx0XHRcdCggbm9kZVR5cGUgIT09IDEgfHwgY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkgKSB7XG5cblx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cblx0XHRcdFx0Ly8gcVNBIGNvbnNpZGVycyBlbGVtZW50cyBvdXRzaWRlIGEgc2NvcGluZyByb290IHdoZW4gZXZhbHVhdGluZyBjaGlsZCBvclxuXHRcdFx0XHQvLyBkZXNjZW5kYW50IGNvbWJpbmF0b3JzLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCB3ZSB3b3JrIGFyb3VuZCB0aGUgYmVoYXZpb3IgYnkgcHJlZml4aW5nIGV2ZXJ5IHNlbGVjdG9yIGluIHRoZVxuXHRcdFx0XHQvLyBsaXN0IHdpdGggYW4gSUQgc2VsZWN0b3IgcmVmZXJlbmNpbmcgdGhlIHNjb3BlIGNvbnRleHQuXG5cdFx0XHRcdC8vIFRoZSB0ZWNobmlxdWUgaGFzIHRvIGJlIHVzZWQgYXMgd2VsbCB3aGVuIGEgbGVhZGluZyBjb21iaW5hdG9yIGlzIHVzZWRcblx0XHRcdFx0Ly8gYXMgc3VjaCBzZWxlY3RvcnMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHF1ZXJ5U2VsZWN0b3JBbGwuXG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHRlY2huaXF1ZS5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggcmRlc2NlbmQudGVzdCggc2VsZWN0b3IgKSB8fCByY29tYmluYXRvcnMudGVzdCggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gV2UgY2FuIHVzZSA6c2NvcGUgaW5zdGVhZCBvZiB0aGUgSUQgaGFjayBpZiB0aGUgYnJvd3NlclxuXHRcdFx0XHRcdC8vIHN1cHBvcnRzIGl0ICYgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBjb250ZXh0LlxuXHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAhPT0gY29udGV4dCB8fCAhc3VwcG9ydC5zY29wZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRcdGlmICggKCBuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkgKSApIHtcblx0XHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsICggbmlkID0gZXhwYW5kbyApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbIGkgXSA9ICggbmlkID8gXCIjXCIgKyBuaWQgOiBcIjpzY29wZVwiICkgKyBcIiBcIiArXG5cdFx0XHRcdFx0XHRcdHRvU2VsZWN0b3IoIGdyb3Vwc1sgaSBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSggc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCBcImlkXCIgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgb2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIFVzZSAoa2V5ICsgXCIgXCIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoIGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUgKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBlbGVtZW50IGFuZCByZXR1cm5zIGEgYm9vbGVhbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHtcblx0dmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJmaWVsZHNldFwiICk7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZWwgKTtcblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXG5cdFx0Ly8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0XG5cdFx0aWYgKCBlbC5wYXJlbnROb2RlICkge1xuXHRcdFx0ZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWwgKTtcblx0XHR9XG5cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGVsID0gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZFxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkge1xuXHR2YXIgYXJyID0gYXR0cnMuc3BsaXQoIFwifFwiICksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbIGkgXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGN1ci5uZXh0U2libGluZyApICkge1xuXHRcdFx0aWYgKCBjdXIgPT09IGIgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYSA/IDEgOiAtMTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuICggbmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIgKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRpbkRpc2FibGVkRmllbGRzZXQoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0dmFyIGosXG5cdFx0XHRcdG1hdGNoSW5kZXhlcyA9IGZuKCBbXSwgc2VlZC5sZW5ndGgsIGFyZ3VtZW50ICksXG5cdFx0XHRcdGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoO1xuXG5cdFx0XHQvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXNcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIHNlZWRbICggaiA9IG1hdGNoSW5kZXhlc1sgaSBdICkgXSApIHtcblx0XHRcdFx0XHRzZWVkWyBqIF0gPSAhKCBtYXRjaGVzWyBqIF0gPSBzZWVkWyBqIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSApO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5hbWVzcGFjZSA9IGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdGRvY0VsZW0gPSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkuZG9jdW1lbnRFbGVtZW50O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OFxuXHQvLyBBc3N1bWUgSFRNTCB3aGVuIGRvY3VtZW50RWxlbWVudCBkb2Vzbid0IHlldCBleGlzdCwgc3VjaCBhcyBpbnNpZGUgbG9hZGluZyBpZnJhbWVzXG5cdC8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC80ODMzXG5cdHJldHVybiAhcmh0bWwudGVzdCggbmFtZXNwYWNlIHx8IGRvY0VsZW0gJiYgZG9jRWxlbS5ub2RlTmFtZSB8fCBcIkhUTUxcIiApO1xufTtcblxuLyoqXG4gKiBTZXRzIGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKi9cbnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7XG5cdHZhciBoYXNDb21wYXJlLCBzdWJXaW5kb3csXG5cdFx0ZG9jID0gbm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jO1xuXG5cdC8vIFJldHVybiBlYXJseSBpZiBkb2MgaXMgaW52YWxpZCBvciBhbHJlYWR5IHNlbGVjdGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggZG9jID09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH1cblxuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlc1xuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4K1xuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggcHJlZmVycmVkRG9jICE9IGRvY3VtZW50ICYmXG5cdFx0KCBzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldyApICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDExLCBFZGdlXG5cdFx0aWYgKCBzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcInVubG9hZFwiLCB1bmxvYWRIYW5kbGVyLCBmYWxzZSApO1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDEwIG9ubHlcblx0XHR9IGVsc2UgaWYgKCBzdWJXaW5kb3cuYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDggLSAxMSssIEVkZ2UgMTIgLSAxOCssIENocm9tZSA8PTE2IC0gMjUgb25seSwgRmlyZWZveCA8PTMuNiAtIDMxIG9ubHksXG5cdC8vIFNhZmFyaSA0IC0gNSBvbmx5LCBPcGVyYSA8PTExLjYgLSAxMi54IG9ubHlcblx0Ly8gSUUvRWRnZSAmIG9sZGVyIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgdGhlIDpzY29wZSBwc2V1ZG8tY2xhc3MuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaSA2LjAgb25seVxuXHQvLyBTYWZhcmkgNi4wIHN1cHBvcnRzIDpzY29wZSBidXQgaXQncyBhbiBhbGlhcyBvZiA6cm9vdCB0aGVyZS5cblx0c3VwcG9ydC5zY29wZSA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXHRcdHJldHVybiB0eXBlb2YgZWwucXVlcnlTZWxlY3RvckFsbCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0IWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOnNjb3BlIGZpZWxkc2V0IGRpdlwiICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGVsLmNsYXNzTmFtZSA9IFwiaVwiO1xuXHRcdHJldHVybiAhZWwuZ2V0QXR0cmlidXRlKCBcImNsYXNzTmFtZVwiICk7XG5cdH0gKTtcblxuXHQvKiBnZXRFbGVtZW50KHMpQnkqXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzXG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCggXCJcIiApICk7XG5cdFx0cmV0dXJuICFlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCIqXCIgKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5XG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDEwXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxuXHQvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0Ly8gSUQgZmlsdGVyIGFuZCBmaW5kXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmlsdGVyWyBcIklEXCIgXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0RXhwci5maW5kWyBcIklEXCIgXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIGVsZW0gPyBbIGVsZW0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0RXhwci5maWx0ZXJbIFwiSURcIiBdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIFwiaWRcIiApO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gNyBvbmx5XG5cdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1dFxuXHRcdEV4cHIuZmluZFsgXCJJRFwiIF0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFsgXCJUQUdcIiBdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbIFwiQ0xBU1NcIiBdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoICggc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSApICkge1xuXG5cdFx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRcdGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXG5cdFx0XHR2YXIgaW5wdXQ7XG5cblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvblxuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIlttc2FsbG93Y2FwdHVyZV49JyddXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbc2VsZWN0ZWRdXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44K1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbaWR+PVwiICsgZXhwYW5kbyArIFwiLV1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwifj1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHRcdC8vIElFIDExL0VkZ2UgZG9uJ3QgZmluZCBlbGVtZW50cyBvbiBhIGBbbmFtZT0nJ11gIHF1ZXJ5IGluIHNvbWUgY2FzZXMuXG5cdFx0XHQvLyBBZGRpbmcgYSB0ZW1wb3JhcnkgYXR0cmlidXRlIHRvIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIHNlbGVjdGlvbiB3b3Jrc1xuXHRcdFx0Ly8gYXJvdW5kIHRoZSBpc3N1ZS5cblx0XHRcdC8vIEludGVyZXN0aW5nbHksIElFIDEwICYgb2xkZXIgZG9uJ3Qgc2VlbSB0byBoYXZlIHRoZSBpc3N1ZS5cblx0XHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIlwiICk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW25hbWU9JyddXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqbmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKj1cIiArXG5cdFx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmNoZWNrZWRcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmNoZWNrZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2libGluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLiMuK1srfl1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9My42IC0gNSBvbmx5XG5cdFx0XHQvLyBPbGQgRmlyZWZveCBkb2Vzbid0IHRocm93IG9uIGEgYmFkbHktZXNjYXBlZCBpZGVudGlmaWVyLlxuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbCggXCJcXFxcXFxmXCIgKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIltcXFxcclxcXFxuXFxcXGZdXCIgKTtcblx0XHR9ICk7XG5cblx0XHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIkRcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZVxuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltuYW1lPWRdXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmVuYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjpkaXNhYmxlZFwiICkubGVuZ3RoICE9PSAyICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IE9wZXJhIDEwIC0gMTEgb25seVxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiKiw6eFwiICk7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCIsLio6XCIgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRpZiAoICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoICggbWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlcyB8fFxuXHRcdGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yICkgKSApICkge1xuXG5cdFx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGVsLCBcIipcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGVsLCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oIFwifFwiICkgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbiggXCJ8XCIgKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSApO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoICggYiA9IGIucGFyZW50Tm9kZSApICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCggIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSApICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRpZiAoIGEgPT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRjb250YWlucyggcHJlZmVycmVkRG9jLCBhICkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYiA9PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGIgKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblx0XHRcdHJldHVybiBhID09IGRvY3VtZW50ID8gLTEgOlxuXHRcdFx0XHRiID09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIucGFyZW50Tm9kZSApICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGN1ci5wYXJlbnROb2RlICkgKSB7XG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cblx0XHQvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxuXHRcdHdoaWxlICggYXBbIGkgXSA9PT0gYnBbIGkgXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cblx0XHRcdC8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvclxuXHRcdFx0c2libGluZ0NoZWNrKCBhcFsgaSBdLCBicFsgaSBdICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblx0XHRcdGFwWyBpIF0gPT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbIGkgXSA9PSBwcmVmZXJyZWREb2MgPyAxIDpcblx0XHRcdC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2N1bWVudDtcbn07XG5cblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xuXHRyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApO1xufTtcblxuU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHRzZXREb2N1bWVudCggZWxlbSApO1xuXG5cdGlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSApICYmXG5cdFx0KCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSApICkge1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTtcblxuXHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdFx0aWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fFxuXG5cdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIGV4cHIsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0dmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSxcblxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQoIHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApICkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG59O1xuXG5TaXp6bGUuZXNjYXBlID0gZnVuY3Rpb24oIHNlbCApIHtcblx0cmV0dXJuICggc2VsICsgXCJcIiApLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXNcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxuICovXG5nZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5vZGUsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRpID0gMCxcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0aWYgKCAhbm9kZVR5cGUgKSB7XG5cblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKCBub2RlID0gZWxlbVsgaSsrIF0gKSApIHtcblxuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVWYWx1ZTtcblx0fVxuXG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0Ly8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWRcblx0XHRcdG1hdGNoWyAzIF0gPSAoIG1hdGNoWyAzIF0gfHwgbWF0Y2hbIDQgXSB8fFxuXHRcdFx0XHRtYXRjaFsgNSBdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWyAyIF0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbIDMgXSA9IFwiIFwiICsgbWF0Y2hbIDMgXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsgMSBdID0gbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWyAxIF0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblxuXHRcdFx0XHQvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudFxuXHRcdFx0XHRpZiAoICFtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbIDAgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbIDQgXSA9ICsoIG1hdGNoWyA0IF0gP1xuXHRcdFx0XHRcdG1hdGNoWyA1IF0gKyAoIG1hdGNoWyA2IF0gfHwgMSApIDpcblx0XHRcdFx0XHQyICogKCBtYXRjaFsgMyBdID09PSBcImV2ZW5cIiB8fCBtYXRjaFsgMyBdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbIDUgXSA9ICsoICggbWF0Y2hbIDcgXSArIG1hdGNoWyA4IF0gKSB8fCBtYXRjaFsgMyBdID09PSBcIm9kZFwiICk7XG5cblx0XHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFsgNiBdICYmIG1hdGNoWyAyIF07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByWyBcIkNISUxEXCIgXS50ZXN0KCBtYXRjaFsgMCBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRtYXRjaFsgMiBdID0gbWF0Y2hbIDQgXSB8fCBtYXRjaFsgNSBdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblxuXHRcdFx0XHQvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KVxuXHRcdFx0XHQoIGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApICkgJiZcblxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KCBleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGggKSApIHtcblxuXHRcdFx0XHQvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleFxuXHRcdFx0XHRtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlcjoge1xuXG5cdFx0XCJUQUdcIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7XG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQoIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcdFx0XCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkgKSAmJiBjbGFzc0NhY2hlKFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdChcblx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHxcblx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSApO1xuXHRcdH0sXG5cblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICFvcGVyYXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdCArPSBcIlwiO1xuXG5cdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIF9hcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBjYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBub2RlWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8ICggbm9kZVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KCBkaWZmID0gbm9kZUluZGV4ID0gMCApIHx8IHN0YXJ0LnBvcCgpICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLilcblx0XHRcdFx0XHRcdFx0Ly8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0XHRpZiAoIGRpZmYgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblxuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaSBdID0gISggbWF0Y2hlc1sgaSBdID0gZWxlbSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblxuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdCggbGFuZyB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcInhtbDpsYW5nXCIgKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSggXCJsYW5nXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKCBlbGVtID0gZWxlbS5wYXJlbnROb2RlICkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmXG5cdFx0XHRcdCggIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkgKSAmJlxuXHRcdFx0XHQhISggZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCApO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksXG5cdFx0XCJkaXNhYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggdHJ1ZSApLFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkICkgfHxcblx0XHRcdFx0KCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQgKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1sgXCJlbXB0eVwiIF0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSApID09IG51bGwgfHxcblx0XHRcdFx0XHRhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0gKSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0gKSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIF9tYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSApLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9ICksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgP1xuXHRcdFx0XHRhcmd1bWVudCArIGxlbmd0aCA6XG5cdFx0XHRcdGFyZ3VtZW50ID4gbGVuZ3RoID9cblx0XHRcdFx0XHRsZW5ndGggOlxuXHRcdFx0XHRcdGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1sgXCJudGhcIiBdID0gRXhwci5wc2V1ZG9zWyBcImVxXCIgXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKCBtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWyAwIF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKCB0b2tlbnMgPSBbXSApICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoICggbWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbIDAgXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSApO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKCBtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkgKSAmJiAoICFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KCBtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSApICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1sgaSBdLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8ICggZWxlbVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKCBvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSApICYmXG5cdFx0XHRcdFx0XHRcdG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0cmV0dXJuICggbmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAoIG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkge1xuXHRyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBpID0gbWF0Y2hlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggIW1hdGNoZXJzWyBpIF0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbIDAgXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1sgaSBdLCByZXN1bHRzICk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7XG5cdHZhciBlbGVtLFxuXHRcdG5ld1VubWF0Y2hlZCA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsXG5cdFx0bWFwcGVkID0gbWFwICE9IG51bGw7XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyhcblx0XHRcdFx0c2VsZWN0b3IgfHwgXCIqXCIsXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsXG5cdFx0XHRcdFtdXG5cdFx0XHQpLFxuXG5cdFx0XHQvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb25cblx0XHRcdG1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgP1xuXHRcdFx0XHRjb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdGVsZW1zLFxuXG5cdFx0XHRtYXRjaGVyT3V0ID0gbWF0Y2hlciA/XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICggZWxlbSA9IHRlbXBbIGkgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXJPdXRbIHBvc3RNYXBbIGkgXSBdID0gISggbWF0Y2hlckluWyBwb3N0TWFwWyBpIF0gXSA9IGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggc2VlZCApIHtcblx0XHRcdGlmICggcG9zdEZpbmRlciB8fCBwcmVGaWx0ZXIgKSB7XG5cdFx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKCBtYXRjaGVySW5bIGkgXSA9IGVsZW0gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCAoIG1hdGNoZXJPdXQgPSBbXSApLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSAmJlxuXHRcdFx0XHRcdFx0KCB0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFsgaSBdICkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFsgdGVtcCBdID0gISggcmVzdWx0c1sgdGVtcCBdID0gZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgMCBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIFwiIFwiIF0sXG5cdFx0aSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLFxuXG5cdFx0Ly8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhhdCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocylcblx0XHRtYXRjaENvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBjaGVja0NvbnRleHQ7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoQW55Q29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIHJldCA9ICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoXG5cdFx0XHRcdCggY2hlY2tDb250ZXh0ID0gY29udGV4dCApLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyBpIF0udHlwZSBdICkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvciggZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIgKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1sgaSBdLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zWyBpIF0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyBqIF0udHlwZSBdICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzZXRNYXRjaGVyKFxuXHRcdFx0XHRcdGkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLFxuXHRcdFx0XHRcdGkgPiAxICYmIHRvU2VsZWN0b3IoXG5cblx0XHRcdFx0XHQvLyBJZiB0aGUgcHJlY2VkaW5nIHRva2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmluYXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1lbGVtZW50IGAqYFxuXHRcdFx0XHRcdHRva2Vuc1xuXHRcdFx0XHRcdFx0LnNsaWNlKCAwLCBpIC0gMSApXG5cdFx0XHRcdFx0XHQuY29uY2F0KCB7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gXCIgXCIgPyBcIipcIiA6IFwiXCIgfSApXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAoIHRva2VucyA9IHRva2Vucy5zbGljZSggaiApICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7XG5cdHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0YnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkge1xuXHRcdFx0dmFyIGVsZW0sIGosIG1hdGNoZXIsXG5cdFx0XHRcdG1hdGNoZWRDb3VudCA9IDAsXG5cdFx0XHRcdGkgPSBcIjBcIixcblx0XHRcdFx0dW5tYXRjaGVkID0gc2VlZCAmJiBbXSxcblx0XHRcdFx0c2V0TWF0Y2hlZCA9IFtdLFxuXHRcdFx0XHRjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCxcblxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kWyBcIlRBR1wiIF0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblxuXHRcdFx0XHQvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlclxuXHRcdFx0XHRkaXJydW5zVW5pcXVlID0gKCBkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSApLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09IGRvY3VtZW50IHx8IGNvbnRleHQgfHwgb3V0ZXJtb3N0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OSwgU2FmYXJpXG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWRcblx0XHRcdGZvciAoIDsgaSAhPT0gbGVuICYmICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVyc1xuXHRcdFx0XHRpZiAoIGJ5U2V0ICkge1xuXG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKCBlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSApICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gc2V0TWF0Y2hlcnNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblxuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKCB1bm1hdGNoZWRbIGkgXSB8fCBzZXRNYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkWyBpIF0gPSBwb3AuY2FsbCggcmVzdWx0cyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXNcblx0XHRcdFx0XHRzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHNcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApO1xuXG5cdFx0XHRcdC8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZ1xuXHRcdFx0XHRpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHQoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHtcblxuXHRcdFx0XHRcdFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5tYXRjaGVkO1xuXHRcdH07XG5cblx0cmV0dXJuIGJ5U2V0ID9cblx0XHRtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDpcblx0XHRzdXBlck1hdGNoZXI7XG59XG5cbmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblxuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFsgaSBdICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKFxuXHRcdFx0c2VsZWN0b3IsXG5cdFx0XHRtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKVxuXHRcdCk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoICggc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvciApICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbIDAgXSA9IG1hdGNoWyAwIF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICggdG9rZW4gPSB0b2tlbnNbIDAgXSApLnR5cGUgPT09IFwiSURcIiAmJlxuXHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIDEgXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFsgXCJJRFwiIF0oIHRva2VuLm1hdGNoZXNbIDAgXVxuXHRcdFx0XHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSwgY29udGV4dCApIHx8IFtdIClbIDAgXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbIFwibmVlZHNDb250ZXh0XCIgXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1sgaSBdO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICggdHlwZSA9IHRva2VuLnR5cGUgKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKCBmaW5kID0gRXhwci5maW5kWyB0eXBlIF0gKSApIHtcblxuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoIHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbIDAgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1sgMCBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0KSApICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KCBcIlwiICkuc29ydCggc29ydE9yZGVyICkuam9pbiggXCJcIiApID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXG5cdC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKVxuXHRyZXR1cm4gZWwuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApICkgJiAxO1xufSApO1xuXG4vLyBTdXBwb3J0OiBJRTw4XG4vLyBQcmV2ZW50IGF0dHJpYnV0ZS9wcm9wZXJ0eSBcImludGVycG9sYXRpb25cIlxuLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcImhyZWZcIiApID09PSBcIiNcIjtcbn0gKSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0gKTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRlbC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59ICkgKSB7XG5cdGFkZEhhbmRsZSggXCJ2YWx1ZVwiLCBmdW5jdGlvbiggZWxlbSwgX25hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSApO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0cmV0dXJuIGVsLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT0gbnVsbDtcbn0gKSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0KCB2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSApICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdFx0bnVsbDtcblx0XHR9XG5cdH0gKTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSApKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRpZiAoIGVsZW0uY29udGVudERvY3VtZW50ICE9IG51bGwgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErXG5cdFx0XHQvLyA8b2JqZWN0PiBlbGVtZW50cyB3aXRoIG5vIGBkYXRhYCBhdHRyaWJ1dGUgaGFzIGFuIG9iamVjdFxuXHRcdFx0Ly8gYGNvbnRlbnREb2N1bWVudGAgd2l0aCBhIGBudWxsYCBwcm90b3R5cGUuXG5cdFx0XHRnZXRQcm90byggZWxlbS5jb250ZW50RG9jdW1lbnQgKSApIHtcblxuXHRcdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seVxuXHRcdC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuXHRcdC8vIGRvbid0IHN1cHBvcnQgaXQuXG5cdFx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0ZW1wbGF0ZVwiICkgKSB7XG5cdFx0XHRlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3RodG1sd2hpdGUgPSAoIC9bXlxceDIwXFx0XFxyXFxuXFxmXSsvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7XG5cblx0XHRcdC8vIEV4ZWN1dGUgY2FsbGJhY2tzIGZvciBhbGwgcGVuZGluZyBleGVjdXRpb25zLFxuXHRcdFx0Ly8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlc1xuXHRcdFx0ZmlyZWQgPSBmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBxdWV1ZS5sZW5ndGg7IGZpcmluZ0luZGV4ID0gLTEgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRcdHdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gUnVuIGNhbGxiYWNrIGFuZCBjaGVjayBmb3IgZWFybHkgdGVybWluYXRpb25cblx0XHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0b3B0aW9ucy5zdG9wT25GYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSnVtcCB0byBlbmQgYW5kIGZvcmdldCB0aGUgZGF0YSBzbyAuYWRkIGRvZXNuJ3QgcmUtZmlyZVxuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JnZXQgdGhlIGRhdGEgaWYgd2UncmUgZG9uZSB3aXRoIGl0XG5cdFx0XHRpZiAoICFvcHRpb25zLm1lbW9yeSApIHtcblx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBpZiB3ZSdyZSBkb25lIGZpcmluZyBmb3IgZ29vZFxuXHRcdFx0aWYgKCBsb2NrZWQgKSB7XG5cblx0XHRcdFx0Ly8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3IgZnV0dXJlIGFkZCBjYWxsc1xuXHRcdFx0XHRpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIG9iamVjdCBpcyBzcGVudFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpc3QgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XG5cdFx0c2VsZiA9IHtcblxuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmdcblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQoIGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSApKCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gP1xuXHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOlxuXHRcdFx0XHRcdGxpc3QubGVuZ3RoID4gMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3Rcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGRcblx0XHRcdC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0Ly8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZVxuXHRcdFx0Ly8gQWxzbyBkaXNhYmxlIC5hZGQgdW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdClcblx0XHRcdC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRsb2NrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFsb2NrZWQ7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggIWxvY2tlZCApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGFyZ3MgKTtcblx0XHRcdFx0XHRpZiAoICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Vcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhZmlyZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRyZXR1cm4gc2VsZjtcbn07XG5cblxuZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gVGhyb3dlciggZXggKSB7XG5cdHRocm93IGV4O1xufVxuXG5mdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkge1xuXHR2YXIgbWV0aG9kO1xuXG5cdHRyeSB7XG5cblx0XHQvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yXG5cdFx0aWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlICkuZG9uZSggcmVzb2x2ZSApLmZhaWwoIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgdGhlbmFibGVzXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS50aGVuICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciBub24tdGhlbmFibGVzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOlxuXHRcdFx0Ly8gKiBmYWxzZTogWyB2YWx1ZSBdLnNsaWNlKCAwICkgPT4gcmVzb2x2ZSggdmFsdWUgKVxuXHRcdFx0Ly8gKiB0cnVlOiBbIHZhbHVlIF0uc2xpY2UoIDEgKSA9PiByZXNvbHZlKClcblx0XHRcdHJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTtcblx0XHR9XG5cblx0Ly8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zXG5cdC8vIFNpbmNlIGpRdWVyeS53aGVuIGRvZXNuJ3QgdW53cmFwIHRoZW5hYmxlcywgd2UgY2FuIHNraXAgdGhlIGV4dHJhIGNoZWNrcyBhcHBlYXJpbmcgaW5cblx0Ly8gRGVmZXJyZWQjdGhlbiB0byBjb25kaXRpb25hbGx5IHN1cHByZXNzIHJlamVjdGlvbi5cblx0fSBjYXRjaCAoIHZhbHVlICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgb25seVxuXHRcdC8vIFN0cmljdCBtb2RlIGZ1bmN0aW9ucyBpbnZva2VkIHdpdGhvdXQgLmNhbGwvLmFwcGx5IGdldCBnbG9iYWwtb2JqZWN0IGNvbnRleHRcblx0XHRyZWplY3QuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdICk7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsXG5cdFx0XHRcdC8vIC4uLiAudGhlbiBoYW5kbGVycywgYXJndW1lbnQgaW5kZXgsIFtmaW5hbCBzdGF0ZV1cblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksIDIgXSxcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAwLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDEsIFwicmVqZWN0ZWRcIiBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiY2F0Y2hcIjogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLnRoZW4oIG51bGwsIGZuICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7XG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBfaSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIF9rZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oXG5cdFx0XHRcdFx0ZWxlbXNbIGkgXSwga2V5LCByYXcgP1xuXHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcbnZhciBybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7XG5cbi8vIFVzZWQgYnkgY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuZnVuY3Rpb24gZmNhbWVsQ2FzZSggX2FsbCwgbGV0dGVyICkge1xuXHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcbi8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3MilcbmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkge1xuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcbn1cbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdFx0Ly8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlclxuXHRcdFx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHZhbHVlO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHQvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZVxuXHRcdFx0XHQvLyBkZWxldGVkIHdoZW4gZGF0YSBpcyByZW1vdmVkXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRvLCB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdHNldDogZnVuY3Rpb24oIG93bmVyLCBkYXRhLCB2YWx1ZSApIHtcblx0XHR2YXIgcHJvcCxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3Ncblx0XHQvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBjYW1lbENhc2UoIGRhdGEgKSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlWyBjYW1lbENhc2UoIHByb3AgKSBdID0gZGF0YVsgcHJvcCBdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FjaGU7XG5cdH0sXG5cdGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0cmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMuY2FjaGUoIG93bmVyICkgOlxuXG5cdFx0XHQvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpXG5cdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gJiYgb3duZXJbIHRoaXMuZXhwYW5kbyBdWyBjYW1lbENhc2UoIGtleSApIF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KCAoIGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblx0XHR9XG5cblx0XHQvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdGlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGtleSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5c1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBrZXkgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc2V0IGNhbWVsQ2FzZSBrZXlzLCBzbyByZW1vdmUgdGhhdC5cblx0XHRcdFx0a2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrZXkgPSBjYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBjcmVhdGUgYW4gYXJyYXkgYnkgbWF0Y2hpbmcgbm9uLXdoaXRlc3BhY2Vcblx0XHRcdFx0a2V5ID0ga2V5IGluIGNhY2hlID9cblx0XHRcdFx0XHRbIGtleSBdIDpcblx0XHRcdFx0XHQoIGtleS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdICk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBrZXkubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YVxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDVcblx0XHRcdC8vIFdlYmtpdCAmIEJsaW5rIHBlcmZvcm1hbmNlIHN1ZmZlcnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzXG5cdFx0XHQvLyBmcm9tIERPTSBub2Rlcywgc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKVxuXHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHR2YXIgY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApO1xuXHR9XG59O1xudmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFVc2VyID0gbmV3IERhdGEoKTtcblxuXG5cbi8vXHRJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5XG4vL1xuLy9cdDEuIEVuZm9yY2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFuY2hcbi8vXHQyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2Vcbi8vXHRcdHBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS5cbi8vXHQzLiBVc2UgdGhlIHNhbWUgc2luZ2xlIG1lY2hhbmlzbSB0byBzdXBwb3J0IFwicHJpdmF0ZVwiIGFuZCBcInVzZXJcIiBkYXRhLlxuLy9cdDQuIF9OZXZlcl8gZXhwb3NlIFwicHJpdmF0ZVwiIGRhdGEgdG8gdXNlciBjb2RlIChUT0RPOiBEcm9wIF9kYXRhLCBfcmVtb3ZlRGF0YSlcbi8vXHQ1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcylcbi8vXHQ2LiBQcm92aWRlIGEgY2xlYXIgcGF0aCBmb3IgaW1wbGVtZW50YXRpb24gdXBncmFkZSB0byBXZWFrTWFwIGluIDIwMTRcblxudmFyIHJicmFjZSA9IC9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxcblx0cm11bHRpRGFzaCA9IC9bQS1aXS9nO1xuXG5mdW5jdGlvbiBnZXREYXRhKCBkYXRhICkge1xuXHRpZiAoIGRhdGEgPT09IFwidHJ1ZVwiICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcImZhbHNlXCIgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcIm51bGxcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdGlmICggZGF0YSA9PT0gK2RhdGEgKyBcIlwiICkge1xuXHRcdHJldHVybiArZGF0YTtcblx0fVxuXG5cdGlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApO1xuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cdHZhciBuYW1lO1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0bmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKTtcblx0XHRkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkYXRhID0gZ2V0RGF0YSggZGF0YSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFVc2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fSxcblxuXHQvLyBUT0RPOiBOb3cgdGhhdCBhbGwgY2FsbHMgdG8gX2RhdGEgYW5kIF9yZW1vdmVEYXRhIGhhdmUgYmVlbiByZXBsYWNlZFxuXHQvLyB3aXRoIGRpcmVjdCBjYWxscyB0byBkYXRhUHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiApICkge1xuXHRcdFx0XHRcdGkgPSBhdHRycy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGRhdGE7XG5cblx0XHRcdC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5XG5cdFx0XHQvLyAoYW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZVxuXHRcdFx0Ly8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5IGpRdWVyeSBvYmplY3Rcblx0XHRcdC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGxcblx0XHRcdC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuXG5cdFx0XHRpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIFRoZSBrZXkgd2lsbCBhbHdheXMgYmUgY2FtZWxDYXNlZCBpbiBEYXRhXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzdG9yZSB0aGUgY2FtZWxDYXNlZCBrZXlcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXksIHZhbHVlICk7XG5cdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRhdGFVc2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YVByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgQXJyYXkuaXNBcnJheSggZGF0YSApICkge1xuXHRcdFx0XHRcdHF1ZXVlID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KCBkYXRhICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLmFkZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSApXG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbIDAgXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVsgMCBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHR9ICk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblxuXHQvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlXG5cdC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KVxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xuXHRcdHZhciB0bXAsXG5cdFx0XHRjb3VudCA9IDEsXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0ZWxlbWVudHMgPSB0aGlzLFxuXHRcdFx0aSA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICEoIC0tY291bnQgKSApIHtcblx0XHRcdFx0XHRkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG9iaiA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSApO1xudmFyIHBudW0gPSAoIC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvICkuc291cmNlO1xuXG52YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICk7XG5cblxudmFyIGNzc0V4cGFuZCA9IFsgXCJUb3BcIiwgXCJSaWdodFwiLCBcIkJvdHRvbVwiLCBcIkxlZnRcIiBdO1xuXG52YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cblxuXHR2YXIgaXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cdFx0fSxcblx0XHRjb21wb3NlZCA9IHsgY29tcG9zZWQ6IHRydWUgfTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrLCBpT1MgMTAuMCAtIDEwLjIgb25seVxuXHQvLyBDaGVjayBhdHRhY2htZW50IGFjcm9zcyBzaGFkb3cgRE9NIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZSAoZ2gtMzUwNClcblx0Ly8gU3VwcG9ydDogaU9TIDEwLjAtMTAuMiBvbmx5XG5cdC8vIEVhcmx5IGlPUyAxMCB2ZXJzaW9ucyBzdXBwb3J0IGBhdHRhY2hTaGFkb3dgIGJ1dCBub3QgYGdldFJvb3ROb2RlYCxcblx0Ly8gbGVhZGluZyB0byBlcnJvcnMuIFdlIG5lZWQgdG8gY2hlY2sgZm9yIGBnZXRSb290Tm9kZWAuXG5cdGlmICggZG9jdW1lbnRFbGVtZW50LmdldFJvb3ROb2RlICkge1xuXHRcdGlzQXR0YWNoZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Um9vdE5vZGUoIGNvbXBvc2VkICkgPT09IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHR9O1xuXHR9XG52YXIgaXNIaWRkZW5XaXRoaW5UcmVlID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXG5cdFx0Ly8gaXNIaWRkZW5XaXRoaW5UcmVlIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cblx0XHQvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbFxuXHRcdHJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8XG5cdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiZcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjaGVjayBjb21wdXRlZCBzdHlsZVxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQzIC0gNDVcblx0XHRcdC8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpc1xuXHRcdFx0Ly8gaW4gdGhlIGRvY3VtZW50LlxuXHRcdFx0aXNBdHRhY2hlZCggZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG5cblxuZnVuY3Rpb24gYWRqdXN0Q1NTKCBlbGVtLCBwcm9wLCB2YWx1ZVBhcnRzLCB0d2VlbiApIHtcblx0dmFyIGFkanVzdGVkLCBzY2FsZSxcblx0XHRtYXhJdGVyYXRpb25zID0gMjAsXG5cdFx0Y3VycmVudFZhbHVlID0gdHdlZW4gP1xuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5jdXIoKTtcblx0XHRcdH0gOlxuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wLCBcIlwiICk7XG5cdFx0XHR9LFxuXHRcdGluaXRpYWwgPSBjdXJyZW50VmFsdWUoKSxcblx0XHR1bml0ID0gdmFsdWVQYXJ0cyAmJiB2YWx1ZVBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdGluaXRpYWxJblVuaXQgPSBlbGVtLm5vZGVUeXBlICYmXG5cdFx0XHQoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK2luaXRpYWwgKSAmJlxuXHRcdFx0cmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTtcblxuXHRpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdFx0Ly8gSGFsdmUgdGhlIGl0ZXJhdGlvbiB0YXJnZXQgdmFsdWUgdG8gcHJldmVudCBpbnRlcmZlcmVuY2UgZnJvbSBDU1MgdXBwZXIgYm91bmRzIChnaC0yMTQ0KVxuXHRcdGluaXRpYWwgPSBpbml0aWFsIC8gMjtcblxuXHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHR1bml0ID0gdW5pdCB8fCBpbml0aWFsSW5Vbml0WyAzIF07XG5cblx0XHQvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludFxuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxO1xuXG5cdFx0d2hpbGUgKCBtYXhJdGVyYXRpb25zLS0gKSB7XG5cblx0XHRcdC8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuXG5cdFx0XHQvLyBGaW5pc2ggaWYgdGhlIHNjYWxlIGVxdWFscyBvciBjcm9zc2VzIDEgKG1ha2luZyB0aGUgb2xkKm5ldyBwcm9kdWN0IG5vbi1wb3NpdGl2ZSkuXG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cdFx0XHRpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHtcblx0XHRcdFx0bWF4SXRlcmF0aW9ucyA9IDA7XG5cdFx0XHR9XG5cdFx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAvIHNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyO1xuXHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3BlcnRpZXMgbGF0ZXIgb25cblx0XHR2YWx1ZVBhcnRzID0gdmFsdWVQYXJ0cyB8fCBbXTtcblx0fVxuXG5cdGlmICggdmFsdWVQYXJ0cyApIHtcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDtcblxuXHRcdC8vIEFwcGx5IHJlbGF0aXZlIG9mZnNldCAoKz0vLT0pIGlmIHNwZWNpZmllZFxuXHRcdGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID9cblx0XHRcdGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIgXSA6XG5cdFx0XHQrdmFsdWVQYXJ0c1sgMiBdO1xuXHRcdGlmICggdHdlZW4gKSB7XG5cdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcblx0XHRcdHR3ZWVuLnN0YXJ0ID0gaW5pdGlhbEluVW5pdDtcblx0XHRcdHR3ZWVuLmVuZCA9IGFkanVzdGVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYWRqdXN0ZWQ7XG59XG5cblxudmFyIGRlZmF1bHREaXNwbGF5TWFwID0ge307XG5cbmZ1bmN0aW9uIGdldERlZmF1bHREaXNwbGF5KCBlbGVtICkge1xuXHR2YXIgdGVtcCxcblx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsXG5cdFx0bm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLFxuXHRcdGRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTtcblxuXHRpZiAoIGRpc3BsYXkgKSB7XG5cdFx0cmV0dXJuIGRpc3BsYXk7XG5cdH1cblxuXHR0ZW1wID0gZG9jLmJvZHkuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVFbGVtZW50KCBub2RlTmFtZSApICk7XG5cdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0ZW1wLCBcImRpc3BsYXlcIiApO1xuXG5cdHRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApO1xuXG5cdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0ZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0fVxuXHRkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHtcblx0dmFyIGRpc3BsYXksIGVsZW0sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHQvLyBEZXRlcm1pbmUgbmV3IGRpc3BsYXkgdmFsdWUgZm9yIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBjaGFuZ2Vcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7XG5cdFx0aWYgKCBzaG93ICkge1xuXG5cdFx0XHQvLyBTaW5jZSB3ZSBmb3JjZSB2aXNpYmlsaXR5IHVwb24gY2FzY2FkZS1oaWRkZW4gZWxlbWVudHMsIGFuIGltbWVkaWF0ZSAoYW5kIHNsb3cpXG5cdFx0XHQvLyBjaGVjayBpcyByZXF1aXJlZCBpbiB0aGlzIGZpcnN0IGxvb3AgdW5sZXNzIHdlIGhhdmUgYSBub25lbXB0eSBkaXNwbGF5IHZhbHVlIChlaXRoZXJcblx0XHRcdC8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZClcblx0XHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7XG5cdFx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGdldERlZmF1bHREaXNwbGF5KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggZGlzcGxheSAhPT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IFwibm9uZVwiO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmdcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImRpc3BsYXlcIiwgZGlzcGxheSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcCB0byBhdm9pZCBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkge1xuXHRcdFx0ZWxlbWVudHNbIGluZGV4IF0uc3R5bGUuZGlzcGxheSA9IHZhbHVlc1sgaW5kZXggXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xudmFyIHJjaGVja2FibGVUeXBlID0gKCAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSApO1xuXG52YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaSApO1xuXG52YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2kgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHQvLyBJRSA8PTkgcmVwbGFjZXMgPG9wdGlvbj4gdGFncyB3aXRoIHRoZWlyIGNvbnRlbnRzIHdoZW4gaW5zZXJ0ZWQgb3V0c2lkZSBvZlxuXHQvLyB0aGUgc2VsZWN0IGVsZW1lbnQuXG5cdGRpdi5pbm5lckhUTUwgPSBcIjxvcHRpb24+PC9vcHRpb24+XCI7XG5cdHN1cHBvcnQub3B0aW9uID0gISFkaXYubGFzdENoaWxkO1xufSApKCk7XG5cblxuLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcbnZhciB3cmFwTWFwID0ge1xuXG5cdC8vIFhIVE1MIHBhcnNlcnMgZG8gbm90IG1hZ2ljYWxseSBpbnNlcnQgZWxlbWVudHMgaW4gdGhlXG5cdC8vIHNhbWUgd2F5IHRoYXQgdGFnIHNvdXAgcGFyc2VycyBkby4gU28gd2UgY2Fubm90IHNob3J0ZW5cblx0Ly8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLlxuXHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdF9kZWZhdWx0OiBbIDAsIFwiXCIsIFwiXCIgXVxufTtcblxud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuaWYgKCAhc3VwcG9ydC5vcHRpb24gKSB7XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbiA9IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXTtcbn1cblxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2NhdGlvbiBvbiBob3N0IG9iamVjdHMgKCMxNTE1MSlcblx0dmFyIHJldDtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IFtdO1xuXHR9XG5cblx0aWYgKCB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgbm9kZU5hbWUoIGNvbnRleHQsIHRhZyApICkge1xuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBhdHRhY2hlZCwgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIHRvVHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0dG1wLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRpID0gMDtcblx0d2hpbGUgKCAoIGVsZW0gPSBub2Rlc1sgaSsrIF0gKSApIHtcblxuXHRcdC8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpXG5cdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7XG5cdFx0XHRpZiAoIGlnbm9yZWQgKSB7XG5cdFx0XHRcdGlnbm9yZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0YXR0YWNoZWQgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnRcblx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRpZiAoIGF0dGFjaGVkICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FwdHVyZSBleGVjdXRhYmxlc1xuXHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0bXBbIGorKyBdICkgKSB7XG5cdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmcmFnbWVudDtcbn1cblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkvO1xuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTErXG4vLyBmb2N1cygpIGFuZCBibHVyKCkgYXJlIGFzeW5jaHJvbm91cywgZXhjZXB0IHdoZW4gdGhleSBhcmUgbm8tb3AuXG4vLyBTbyBleHBlY3QgZm9jdXMgdG8gYmUgc3luY2hyb25vdXMgd2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGFjdGl2ZSxcbi8vIGFuZCBibHVyIHRvIGJlIHN5bmNocm9ub3VzIHdoZW4gdGhlIGVsZW1lbnQgaXMgbm90IGFscmVhZHkgYWN0aXZlLlxuLy8gKGZvY3VzIGFuZCBibHVyIGFyZSBhbHdheXMgc3luY2hyb25vdXMgaW4gb3RoZXIgc3VwcG9ydGVkIGJyb3dzZXJzLFxuLy8gdGhpcyBqdXN0IGRlZmluZXMgd2hlbiB3ZSBjYW4gY291bnQgb24gaXQpLlxuZnVuY3Rpb24gZXhwZWN0U3luYyggZWxlbSwgdHlwZSApIHtcblx0cmV0dXJuICggZWxlbSA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSApID09PSAoIHR5cGUgPT09IFwiZm9jdXNcIiApO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gQWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgY2FuIHRocm93IHVuZXhwZWN0ZWRseVxuLy8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzkzXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIE9ubHkgYXR0YWNoIGV2ZW50cyB0byBvYmplY3RzIHRoYXQgYWNjZXB0IGRhdGFcblx0XHRpZiAoICFhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0gT2JqZWN0LmNyZWF0ZSggbnVsbCApO1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiIClcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHtcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xuXHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDtcblxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2Vcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC5zZXR1cCB8fFxuXHRcdFx0XHRcdHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblxuXHRcdHZhciBqLCBvcmlnQ291bnQsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBuYXRpdmVFdmVudCApIHtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXG5cdFx0XHQvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3Rcblx0XHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKSxcblxuXHRcdFx0aGFuZGxlcnMgPSAoXG5cdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApXG5cdFx0XHRcdClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZSBldmVudCBpcyBuYW1lc3BhY2VkLCB0aGVuIGVhY2ggaGFuZGxlciBpcyBvbmx5IGludm9rZWQgaWYgaXQgaXNcblx0XHRcdFx0Ly8gc3BlY2lhbGx5IHVuaXZlcnNhbCBvciBpdHMgbmFtZXNwYWNlcyBhcmUgYSBzdXBlcnNldCBvZiB0aGUgZXZlbnQncy5cblx0XHRcdFx0aWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBoYW5kbGVPYmoubmFtZXNwYWNlID09PSBmYWxzZSB8fFxuXHRcdFx0XHRcdGV2ZW50LnJuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30gKS5oYW5kbGUgfHxcblx0XHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyICkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKCBldmVudC5yZXN1bHQgPSByZXQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGVcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xuXHRcdFx0c3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkge1xuXHRcdHZhciBpLCBoYW5kbGVPYmosIHNlbCwgbWF0Y2hlZEhhbmRsZXJzLCBtYXRjaGVkU2VsZWN0b3JzLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05XG5cdFx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MClcblx0XHRcdGN1ci5ub2RlVHlwZSAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDJcblx0XHRcdC8vIFN1cHByZXNzIHNwZWMtdmlvbGF0aW5nIGNsaWNrcyBpbmRpY2F0aW5nIGEgbm9uLXByaW1hcnkgcG9pbnRlciBidXR0b24gKHRyYWMtMzg2MSlcblx0XHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50LXR5cGUtY2xpY2tcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdC8vIC4uLmJ1dCBub3QgYXJyb3cga2V5IFwiY2xpY2tzXCIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0Mylcblx0XHRcdCEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBldmVudC5idXR0b24gPj0gMSApICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjaGVjayBub24tZWxlbWVudHMgKCMxMzIwOClcblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBjdXIuZGlzYWJsZWQgPT09IHRydWUgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMgPSBbXTtcblx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzID0ge307XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRIYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRjdXIgPSB0aGlzO1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0YWRkUHJvcDogZnVuY3Rpb24oIG5hbWUsIGhvb2sgKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBqUXVlcnkuRXZlbnQucHJvdG90eXBlLCBuYW1lLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXG5cdFx0XHRnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaG9vayggdGhpcy5vcmlnaW5hbEV2ZW50ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRjbGljazoge1xuXG5cdFx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCB0byBlbnN1cmUgY29ycmVjdCBzdGF0ZSBmb3IgY2hlY2thYmxlIGlucHV0c1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0Ly8gZGF0YVByaXYuc2V0KCBlbCwgXCJjbGlja1wiLCAuLi4gKVxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiLCByZXR1cm5UcnVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlcmluZyBhIGNsaWNrXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIHN1cHByZXNzIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0Ly8gQWxzbyBwcmV2ZW50IGl0IGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRyZXR1cm4gcmNoZWNrYWJsZVR5cGUudGVzdCggdGFyZ2V0LnR5cGUgKSAmJlxuXHRcdFx0XHRcdHRhcmdldC5jbGljayAmJiBub2RlTmFtZSggdGFyZ2V0LCBcImlucHV0XCIgKSAmJlxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGFyZ2V0LCBcImNsaWNrXCIgKSB8fFxuXHRcdFx0XHRcdG5vZGVOYW1lKCB0YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gRW5zdXJlIHRoZSBwcmVzZW5jZSBvZiBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgbWFudWFsbHktdHJpZ2dlcmVkXG4vLyBzeW50aGV0aWMgZXZlbnRzIGJ5IGludGVycnVwdGluZyBwcm9ncmVzcyB1bnRpbCByZWludm9rZWQgaW4gcmVzcG9uc2UgdG9cbi8vICpuYXRpdmUqIGV2ZW50cyB0aGF0IGl0IGZpcmVzIGRpcmVjdGx5LCBlbnN1cmluZyB0aGF0IHN0YXRlIGNoYW5nZXMgaGF2ZVxuLy8gYWxyZWFkeSBvY2N1cnJlZCBiZWZvcmUgb3RoZXIgbGlzdGVuZXJzIGFyZSBpbnZva2VkLlxuZnVuY3Rpb24gbGV2ZXJhZ2VOYXRpdmUoIGVsLCB0eXBlLCBleHBlY3RTeW5jICkge1xuXG5cdC8vIE1pc3NpbmcgZXhwZWN0U3luYyBpbmRpY2F0ZXMgYSB0cmlnZ2VyIGNhbGwsIHdoaWNoIG11c3QgZm9yY2Ugc2V0dXAgdGhyb3VnaCBqUXVlcnkuZXZlbnQuYWRkXG5cdGlmICggIWV4cGVjdFN5bmMgKSB7XG5cdFx0aWYgKCBkYXRhUHJpdi5nZXQoIGVsLCB0eXBlICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGVsLCB0eXBlLCByZXR1cm5UcnVlICk7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlZ2lzdGVyIHRoZSBjb250cm9sbGVyIGFzIGEgc3BlY2lhbCB1bml2ZXJzYWwgaGFuZGxlciBmb3IgYWxsIGV2ZW50IG5hbWVzcGFjZXNcblx0ZGF0YVByaXYuc2V0KCBlbCwgdHlwZSwgZmFsc2UgKTtcblx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHtcblx0XHRuYW1lc3BhY2U6IGZhbHNlLFxuXHRcdGhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciBub3RBc3luYywgcmVzdWx0LFxuXHRcdFx0XHRzYXZlZCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRpZiAoICggZXZlbnQuaXNUcmlnZ2VyICYgMSApICYmIHRoaXNbIHR5cGUgXSApIHtcblxuXHRcdFx0XHQvLyBJbnRlcnJ1cHQgcHJvY2Vzc2luZyBvZiB0aGUgb3V0ZXIgc3ludGhldGljIC50cmlnZ2VyKCllZCBldmVudFxuXHRcdFx0XHQvLyBTYXZlZCBkYXRhIHNob3VsZCBiZSBmYWxzZSBpbiBzdWNoIGNhc2VzLCBidXQgbWlnaHQgYmUgYSBsZWZ0b3ZlciBjYXB0dXJlIG9iamVjdFxuXHRcdFx0XHQvLyBmcm9tIGFuIGFzeW5jIG5hdGl2ZSBoYW5kbGVyIChnaC00MzUwKVxuXHRcdFx0XHRpZiAoICFzYXZlZC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBhcmd1bWVudHMgZm9yIHVzZSB3aGVuIGhhbmRsaW5nIHRoZSBpbm5lciBuYXRpdmUgZXZlbnRcblx0XHRcdFx0XHQvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKGFuIGV2ZW50IG9iamVjdCksIHNvIHRoaXMgYXJyYXlcblx0XHRcdFx0XHQvLyB3aWxsIG5vdCBiZSBjb25mdXNlZCB3aXRoIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3QuXG5cdFx0XHRcdFx0c2F2ZWQgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHNhdmVkICk7XG5cblx0XHRcdFx0XHQvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnQgYW5kIGNhcHR1cmUgaXRzIHJlc3VsdFxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdFx0XHRcdC8vIGZvY3VzKCkgYW5kIGJsdXIoKSBhcmUgYXN5bmNocm9ub3VzXG5cdFx0XHRcdFx0bm90QXN5bmMgPSBleHBlY3RTeW5jKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdFx0dGhpc1sgdHlwZSBdKCk7XG5cdFx0XHRcdFx0cmVzdWx0ID0gZGF0YVByaXYuZ2V0KCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdFx0aWYgKCBzYXZlZCAhPT0gcmVzdWx0IHx8IG5vdEFzeW5jICkge1xuXHRcdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCBmYWxzZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzYXZlZCAhPT0gcmVzdWx0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyBDYW5jZWwgdGhlIG91dGVyIHN5bnRoZXRpYyBldmVudFxuXHRcdFx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC52YWx1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgZm9yIGFuIGV2ZW50IHdpdGggYSBidWJibGluZyBzdXJyb2dhdGVcblx0XHRcdFx0Ly8gKGZvY3VzIG9yIGJsdXIpLCBhc3N1bWUgdGhhdCB0aGUgc3Vycm9nYXRlIGFscmVhZHkgcHJvcGFnYXRlZCBmcm9tIHRyaWdnZXJpbmcgdGhlXG5cdFx0XHRcdC8vIG5hdGl2ZSBldmVudCBhbmQgcHJldmVudCB0aGF0IGZyb20gaGFwcGVuaW5nIGFnYWluIGhlcmUuXG5cdFx0XHRcdC8vIFRoaXMgdGVjaG5pY2FsbHkgZ2V0cyB0aGUgb3JkZXJpbmcgd3Jvbmcgdy5yLnQuIHRvIGAudHJpZ2dlcigpYCAoaW4gd2hpY2ggdGhlXG5cdFx0XHRcdC8vIGJ1YmJsaW5nIHN1cnJvZ2F0ZSBwcm9wYWdhdGVzICphZnRlciogdGhlIG5vbi1idWJibGluZyBiYXNlKSwgYnV0IHRoYXQgc2VlbXNcblx0XHRcdFx0Ly8gbGVzcyBiYWQgdGhhbiBkdXBsaWNhdGlvbi5cblx0XHRcdFx0fSBlbHNlIGlmICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9ICkuZGVsZWdhdGVUeXBlICkge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBuYXRpdmUgZXZlbnQgdHJpZ2dlcmVkIGFib3ZlLCBldmVyeXRoaW5nIGlzIG5vdyBpbiBvcmRlclxuXHRcdFx0Ly8gRmlyZSBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgd2l0aCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBzYXZlZC5sZW5ndGggKSB7XG5cblx0XHRcdFx0Ly8gLi4uYW5kIGNhcHR1cmUgdGhlIHJlc3VsdFxuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHtcblx0XHRcdFx0XHR2YWx1ZTogalF1ZXJ5LmV2ZW50LnRyaWdnZXIoXG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdFx0XHRcdFx0Ly8gRXh0ZW5kIHdpdGggdGhlIHByb3RvdHlwZSB0byByZXNldCB0aGUgYWJvdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblx0XHRcdFx0XHRcdGpRdWVyeS5leHRlbmQoIHNhdmVkWyAwIF0sIGpRdWVyeS5FdmVudC5wcm90b3R5cGUgKSxcblx0XHRcdFx0XHRcdHNhdmVkLnNsaWNlKCAxICksXG5cdFx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gQWJvcnQgaGFuZGxpbmcgb2YgdGhlIG5hdGl2ZSBldmVudFxuXHRcdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn1cblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibGU6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjb2RlOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbmpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCB0eXBlLCBkZWxlZ2F0ZVR5cGUgKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gPSB7XG5cblx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENsYWltIHRoZSBmaXJzdCBoYW5kbGVyXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiZm9jdXNcIiwgLi4uIClcblx0XHRcdC8vIGRhdGFQcml2LnNldCggdGhpcywgXCJibHVyXCIsIC4uLiApXG5cdFx0XHRsZXZlcmFnZU5hdGl2ZSggdGhpcywgdHlwZSwgZXhwZWN0U3luYyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEZvcmNlIHNldHVwIGJlZm9yZSB0cmlnZ2VyXG5cdFx0XHRsZXZlcmFnZU5hdGl2ZSggdGhpcywgdHlwZSApO1xuXG5cdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0ZGVsZWdhdGVUeXBlOiBkZWxlZ2F0ZVR5cGVcblx0fTtcbn0gKTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LlxuLy8gRG8gdGhlIHNhbWUgZm9yIHBvaW50ZXJlbnRlci9wb2ludGVybGVhdmUgYW5kIHBvaW50ZXJvdmVyL3BvaW50ZXJvdXRcbi8vXG4vLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5XG4vLyBTYWZhcmkgc2VuZHMgbW91c2VlbnRlciB0b28gb2Z0ZW47IHNlZTpcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEsIEVkZ2UgMTIgLSAxMyBvbmx5XG5cdC8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuXG5cdC8vIFNlZSBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzE3MzY1MTIvXG5cdHJub0lubmVyaHRtbCA9IC88c2NyaXB0fDxzdHlsZXw8bGluay9pLFxuXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZztcblxuLy8gUHJlZmVyIGEgdGJvZHkgb3ZlciBpdHMgcGFyZW50IHRhYmxlIGZvciBjb250YWluaW5nIG5ldyByb3dzXG5mdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7XG5cdGlmICggbm9kZU5hbWUoIGVsZW0sIFwidGFibGVcIiApICYmXG5cdFx0bm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgKSB7XG5cblx0XHRyZXR1cm4galF1ZXJ5KCBlbGVtICkuY2hpbGRyZW4oIFwidGJvZHlcIiApWyAwIF0gfHwgZWxlbTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG5mdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkge1xuXHRlbGVtLnR5cGUgPSAoIGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHRpZiAoICggZWxlbS50eXBlIHx8IFwiXCIgKS5zbGljZSggMCwgNSApID09PSBcInRydWUvXCIgKSB7XG5cdFx0ZWxlbS50eXBlID0gZWxlbS50eXBlLnNsaWNlKCA1ICk7XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIFwidHlwZVwiICk7XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50cztcblxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy5cblx0aWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFQcml2LmdldCggc3JjICk7XG5cdFx0ZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzO1xuXG5cdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRlc3QsIFwiaGFuZGxlIGV2ZW50c1wiICk7XG5cblx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyAyLiBDb3B5IHVzZXIgZGF0YVxuXHRpZiAoIGRhdGFVc2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApO1xuXHR9XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBmbGF0KCBhcmdzICk7XG5cblx0dmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggdmFsdWVJc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHR9XG5cdFx0XHRkb21NYW5pcCggc2VsZiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRpZiAoIGwgKSB7XG5cdFx0ZnJhZ21lbnQgPSBidWlsZEZyYWdtZW50KCBhcmdzLCBjb2xsZWN0aW9uWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIGNvbGxlY3Rpb24sIGlnbm9yZWQgKTtcblx0XHRmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHR9XG5cblx0XHQvLyBSZXF1aXJlIGVpdGhlciBuZXcgY29udGVudCBvciBhbiBpbnRlcmVzdCBpbiBpZ25vcmVkIGVsZW1lbnRzIHRvIGludm9rZSB0aGUgY2FsbGJhY2tcblx0XHRpZiAoIGZpcnN0IHx8IGlnbm9yZWQgKSB7XG5cdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW1cblx0XHRcdC8vIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHQvLyBSZWVuYWJsZSBzY3JpcHRzXG5cdFx0XHRcdGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTtcblxuXHRcdFx0XHQvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkge1xuXHRcdFx0XHRcdG5vZGUgPSBzY3JpcHRzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgXCJcIiApICYmXG5cdFx0XHRcdFx0XHQhZGF0YVByaXYuYWNjZXNzKCBub2RlLCBcImdsb2JhbEV2YWxcIiApICYmXG5cdFx0XHRcdFx0XHRqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUuc3JjICYmICggbm9kZS50eXBlIHx8IFwiXCIgKS50b0xvd2VyQ2FzZSgpICAhPT0gXCJtb2R1bGVcIiApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5fZXZhbFVybCAmJiAhbm9kZS5ub01vZHVsZSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRub25jZTogbm9kZS5ub25jZSB8fCBub2RlLmdldEF0dHJpYnV0ZSggXCJub25jZVwiIClcblx0XHRcdFx0XHRcdFx0XHR9LCBkb2MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgbm9kZSwgZG9jICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBpc0F0dGFjaGVkKCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbDtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cHM6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0XHRpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGJlZm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSB0aGlzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcblx0XHRcdFx0ZWxlbS50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmNhbGwoIGVsZW0gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxudmFyIHJib3hTdHlsZSA9IG5ldyBSZWdFeHAoIGNzc0V4cGFuZC5qb2luKCBcInxcIiApLCBcImlcIiApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblxuXHQvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXRcblx0Ly8gc28gdGhleSdyZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi5cblx0ZnVuY3Rpb24gY29tcHV0ZVN0eWxlVGVzdHMoKSB7XG5cblx0XHQvLyBUaGlzIGlzIGEgc2luZ2xldG9uLCB3ZSBuZWVkIHRvIGV4ZWN1dGUgaXQgb25seSBvbmNlXG5cdFx0aWYgKCAhZGl2ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7XCIgK1xuXHRcdFx0XCJtYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjBcIjtcblx0XHRkaXYuc3R5bGUuY3NzVGV4dCA9XG5cdFx0XHRcInBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDtcIiArXG5cdFx0XHRcIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7XCIgK1xuXHRcdFx0XCJ3aWR0aDo2MCU7dG9wOjElXCI7XG5cdFx0ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0XHR2YXIgZGl2U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2ICk7XG5cdFx0cGl4ZWxQb3NpdGlvblZhbCA9IGRpdlN0eWxlLnRvcCAhPT0gXCIxJVwiO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgRmlyZWZveCA8PTMgLSA0NFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUubWFyZ2luTGVmdCApID09PSAxMjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIFNhZmFyaSA8PTkuMSAtIDEwLjEsIGlPUyA8PTcuMCAtIDkuM1xuXHRcdC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2UgdmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndFxuXHRcdGRpdi5zdHlsZS5yaWdodCA9IFwiNjAlXCI7XG5cdFx0cGl4ZWxCb3hTdHlsZXNWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLnJpZ2h0ICkgPT09IDM2O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0XHQvLyBEZXRlY3QgbWlzcmVwb3J0aW5nIG9mIGNvbnRlbnQgZGltZW5zaW9ucyBmb3IgYm94LXNpemluZzpib3JkZXItYm94IGVsZW1lbnRzXG5cdFx0Ym94U2l6aW5nUmVsaWFibGVWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLndpZHRoICkgPT09IDM2O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KVxuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTY0XG5cdFx0Ly8gRG9uJ3QgZ2V0IHRyaWNrZWQgd2hlbiB6b29tIGFmZmVjdHMgb2Zmc2V0V2lkdGggKGdoLTQwMjkpXG5cdFx0ZGl2LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHRcdHNjcm9sbGJveFNpemVWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdi5vZmZzZXRXaWR0aCAvIDMgKSA9PT0gMTI7XG5cblx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0Ly8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZFxuXHRcdC8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWRcblx0XHRkaXYgPSBudWxsO1xuXHR9XG5cblx0ZnVuY3Rpb24gcm91bmRQaXhlbE1lYXN1cmVzKCBtZWFzdXJlICkge1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKCBwYXJzZUZsb2F0KCBtZWFzdXJlICkgKTtcblx0fVxuXG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgc2Nyb2xsYm94U2l6ZVZhbCwgcGl4ZWxCb3hTdHlsZXNWYWwsXG5cdFx0cmVsaWFibGVUckRpbWVuc2lvbnNWYWwsIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fSxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRS9FZGdlIG1pc3JlcG9ydCBgZ2V0Q29tcHV0ZWRTdHlsZWAgb2YgdGFibGUgcm93cyB3aXRoIHdpZHRoL2hlaWdodFxuXHRcdC8vIHNldCBpbiBDU1Mgd2hpbGUgYG9mZnNldCpgIHByb3BlcnRpZXMgcmVwb3J0IGNvcnJlY3QgdmFsdWVzLlxuXHRcdC8vIEJlaGF2aW9yIGluIElFIDkgaXMgbW9yZSBzdWJ0bGUgdGhhbiBpbiBuZXdlciB2ZXJzaW9ucyAmIGl0IHBhc3Nlc1xuXHRcdC8vIHNvbWUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0OyBtYWtlIHN1cmUgbm90IHRvIG1ha2UgaXQgcGFzcyB0aGVyZSFcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdGFibGUsIHRyLCB0ckNoaWxkLCB0clN0eWxlO1xuXHRcdFx0aWYgKCByZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGFibGVcIiApO1xuXHRcdFx0XHR0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidHJcIiApO1xuXHRcdFx0XHR0ckNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdFx0XHRcdHRhYmxlLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHhcIjtcblx0XHRcdFx0dHIuc3R5bGUuaGVpZ2h0ID0gXCIxcHhcIjtcblx0XHRcdFx0dHJDaGlsZC5zdHlsZS5oZWlnaHQgPSBcIjlweFwiO1xuXG5cdFx0XHRcdGRvY3VtZW50RWxlbWVudFxuXHRcdFx0XHRcdC5hcHBlbmRDaGlsZCggdGFibGUgKVxuXHRcdFx0XHRcdC5hcHBlbmRDaGlsZCggdHIgKVxuXHRcdFx0XHRcdC5hcHBlbmRDaGlsZCggdHJDaGlsZCApO1xuXG5cdFx0XHRcdHRyU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggdHIgKTtcblx0XHRcdFx0cmVsaWFibGVUckRpbWVuc2lvbnNWYWwgPSBwYXJzZUludCggdHJTdHlsZS5oZWlnaHQgKSA+IDM7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCB0YWJsZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNTErXG5cdFx0Ly8gUmV0cmlldmluZyBzdHlsZSBiZWZvcmUgY29tcHV0ZWQgc29tZWhvd1xuXHRcdC8vIGZpeGVzIGFuIGlzc3VlIHdpdGggZ2V0dGluZyB3cm9uZyB2YWx1ZXNcblx0XHQvLyBvbiBkZXRhY2hlZCBlbGVtZW50c1xuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgbmVlZGVkIGZvcjpcblx0Ly8gICAuY3NzKCdmaWx0ZXInKSAoSUUgOSBvbmx5LCAjMTI1MzcpXG5cdC8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWlzQXR0YWNoZWQoIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyIGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZSxcblx0dmVuZG9yUHJvcHMgPSB7fTtcblxuLy8gUmV0dXJuIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG9yIHVuZGVmaW5lZFxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWVbIDAgXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbi8vIFJldHVybiBhIHBvdGVudGlhbGx5LW1hcHBlZCBqUXVlcnkuY3NzUHJvcHMgb3IgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiBmaW5hbFByb3BOYW1lKCBuYW1lICkge1xuXHR2YXIgZmluYWwgPSBqUXVlcnkuY3NzUHJvcHNbIG5hbWUgXSB8fCB2ZW5kb3JQcm9wc1sgbmFtZSBdO1xuXG5cdGlmICggZmluYWwgKSB7XG5cdFx0cmV0dXJuIGZpbmFsO1xuXHR9XG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cdHJldHVybiB2ZW5kb3JQcm9wc1sgbmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB8fCBuYW1lO1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdHJjdXN0b21Qcm9wID0gL14tLS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9O1xuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggX2VsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblxuXHRcdC8vIElmIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyB1bmtub3duLCB0aGVuIHdlIGNhbid0IGRldGVybWluZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyXG5cdFx0Ly8gVXNlIGFuIGV4cGxpY2l0IHplcm8gdG8gYXZvaWQgTmFOIChnaC0zOTY0KVxuXHRcdCkgKSB8fCAwO1xuXHR9XG5cblx0cmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICkge1xuXG5cdC8vIFN0YXJ0IHdpdGggY29tcHV0ZWQgc3R5bGVcblx0dmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXG5cdFx0Ly8gVG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdywgb25seSBmZXRjaCBib3hTaXppbmcgaWYgd2UgbmVlZCBpdCAoZ2gtNDMyMikuXG5cdFx0Ly8gRmFrZSBjb250ZW50LWJveCB1bnRpbCB3ZSBrbm93IGl0J3MgbmVlZGVkIHRvIGtub3cgdGhlIHRydWUgdmFsdWUuXG5cdFx0Ym94U2l6aW5nTmVlZGVkID0gIXN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCBleHRyYSxcblx0XHRpc0JvcmRlckJveCA9IGJveFNpemluZ05lZWRlZCAmJlxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3gsXG5cblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIGRpbWVuc2lvbiwgc3R5bGVzICksXG5cdFx0b2Zmc2V0UHJvcCA9IFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICk7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBVc2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciB3aGVuIGJveCBzaXppbmcgaXMgdW5yZWxpYWJsZS5cblx0Ly8gSW4gdGhvc2UgY2FzZXMsIHRoZSBjb21wdXRlZCB2YWx1ZSBjYW4gYmUgdHJ1c3RlZCB0byBiZSBib3JkZXItYm94LlxuXHRpZiAoICggIXN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSAmJiBpc0JvcmRlckJveCB8fFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgMTAgLSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRS9FZGdlIG1pc3JlcG9ydCBgZ2V0Q29tcHV0ZWRTdHlsZWAgb2YgdGFibGUgcm93cyB3aXRoIHdpZHRoL2hlaWdodFxuXHRcdC8vIHNldCBpbiBDU1Mgd2hpbGUgYG9mZnNldCpgIHByb3BlcnRpZXMgcmVwb3J0IGNvcnJlY3QgdmFsdWVzLlxuXHRcdC8vIEludGVyZXN0aW5nbHksIGluIHNvbWUgY2FzZXMgSUUgOSBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoaXMgaXNzdWUuXG5cdFx0IXN1cHBvcnQucmVsaWFibGVUckRpbWVuc2lvbnMoKSAmJiBub2RlTmFtZSggZWxlbSwgXCJ0clwiICkgfHxcblxuXHRcdC8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyBcImF1dG9cIlxuXHRcdC8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSlcblx0XHR2YWwgPT09IFwiYXV0b1wiIHx8XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0XHQvLyBBbHNvIHVzZSBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgZm9yIG1pc3JlcG9ydGVkIGlubGluZSBkaW1lbnNpb25zIChnaC0zNjAyKVxuXHRcdCFwYXJzZUZsb2F0KCB2YWwgKSAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImlubGluZVwiICkgJiZcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyB2aXNpYmxlICYgY29ubmVjdGVkXG5cdFx0ZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIjtcblxuXHRcdC8vIFdoZXJlIGF2YWlsYWJsZSwgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGFwcHJveGltYXRlIGJvcmRlciBib3ggZGltZW5zaW9ucy5cblx0XHQvLyBXaGVyZSBub3QgYXZhaWxhYmxlIChlLmcuLCBTVkcpLCBhc3N1bWUgdW5yZWxpYWJsZSBib3gtc2l6aW5nIGFuZCBpbnRlcnByZXQgdGhlXG5cdFx0Ly8gcmV0cmlldmVkIHZhbHVlIGFzIGEgY29udGVudCBib3ggZGltZW5zaW9uLlxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBvZmZzZXRQcm9wIGluIGVsZW07XG5cdFx0aWYgKCB2YWx1ZUlzQm9yZGVyQm94ICkge1xuXHRcdFx0dmFsID0gZWxlbVsgb2Zmc2V0UHJvcCBdO1xuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBcIlwiIGFuZCBhdXRvXG5cdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cblx0Ly8gQWRqdXN0IGZvciB0aGUgZWxlbWVudCdzIGJveCBtb2RlbFxuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdGVsZW0sXG5cdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzLFxuXG5cdFx0XHQvLyBQcm92aWRlIHRoZSBjdXJyZW50IGNvbXB1dGVkIHNpemUgdG8gcmVxdWVzdCBzY3JvbGwgZ3V0dGVyIGNhbGN1bGF0aW9uIChnaC0zNTg5KVxuXHRcdFx0dmFsXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50XCI6IHRydWUsXG5cdFx0XCJjb2x1bW5Db3VudFwiOiB0cnVlLFxuXHRcdFwiZmlsbE9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcImZsZXhHcm93XCI6IHRydWUsXG5cdFx0XCJmbGV4U2hyaW5rXCI6IHRydWUsXG5cdFx0XCJmb250V2VpZ2h0XCI6IHRydWUsXG5cdFx0XCJncmlkQXJlYVwiOiB0cnVlLFxuXHRcdFwiZ3JpZENvbHVtblwiOiB0cnVlLFxuXHRcdFwiZ3JpZENvbHVtbkVuZFwiOiB0cnVlLFxuXHRcdFwiZ3JpZENvbHVtblN0YXJ0XCI6IHRydWUsXG5cdFx0XCJncmlkUm93XCI6IHRydWUsXG5cdFx0XCJncmlkUm93RW5kXCI6IHRydWUsXG5cdFx0XCJncmlkUm93U3RhcnRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdC8vIFRoZSBpc0N1c3RvbVByb3AgY2hlY2sgY2FuIGJlIHJlbW92ZWQgaW4galF1ZXJ5IDQuMCB3aGVuIHdlIG9ubHkgYXV0by1hcHBlbmRcblx0XHRcdC8vIFwicHhcIiB0byBhIGZldyBoYXJkY29kZWQgdmFsdWVzLlxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICYmICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRcdHZhbHVlICs9IHJldCAmJiByZXRbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fFxuXHRcdFx0XHQoIHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRcdFx0c3R5bGUuc2V0UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5pdGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImhlaWdodFwiLCBcIndpZHRoXCIgXSwgZnVuY3Rpb24oIF9pLCBkaW1lbnNpb24gKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgZGltZW5zaW9uIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiZcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4K1xuXHRcdFx0XHRcdC8vIFRhYmxlIGNvbHVtbnMgaW4gU2FmYXJpIGhhdmUgbm9uLXplcm8gb2Zmc2V0V2lkdGggJiB6ZXJvXG5cdFx0XHRcdFx0Ly8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggdW5sZXNzIGRpc3BsYXkgaXMgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHRcdFx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlXG5cdFx0XHRcdFx0Ly8gaW4gSUUgdGhyb3dzIGFuIGVycm9yLlxuXHRcdFx0XHRcdCggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggfHwgIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKSA/XG5cdFx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0XHRnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBtYXRjaGVzLFxuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdFx0XHQvLyBPbmx5IHJlYWQgc3R5bGVzLnBvc2l0aW9uIGlmIHRoZSB0ZXN0IGhhcyBhIGNoYW5jZSB0byBmYWlsXG5cdFx0XHRcdC8vIHRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3cuXG5cdFx0XHRcdHNjcm9sbGJveFNpemVCdWdneSA9ICFzdXBwb3J0LnNjcm9sbGJveFNpemUoKSAmJlxuXHRcdFx0XHRcdHN0eWxlcy5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiLFxuXG5cdFx0XHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTM5OTEpXG5cdFx0XHRcdGJveFNpemluZ05lZWRlZCA9IHNjcm9sbGJveFNpemVCdWdneSB8fCBleHRyYSxcblx0XHRcdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhID9cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0XHRpc0JvcmRlckJveCxcblx0XHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHRcdCkgOlxuXHRcdFx0XHRcdDA7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc2Nyb2xsYm94U2l6ZUJ1Z2d5ICkge1xuXHRcdFx0XHRzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoXG5cdFx0XHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdFx0XHRwYXJzZUZsb2F0KCBzdHlsZXNbIGRpbWVuc2lvbiBdICkgLVxuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBcImJvcmRlclwiLCBmYWxzZSwgc3R5bGVzICkgLVxuXHRcdFx0XHRcdDAuNVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIGRpbWVuc2lvbiBdID0gdmFsdWU7XG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpbkxlZnQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuICggcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiApICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdH0gKVxuXHRcdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCBwcmVmaXggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHQ7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdH0sXG5cdGN1cjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdHJldHVybiBob29rcyAmJiBob29rcy5nZXQgP1xuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApO1xuXHR9LFxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xuXHRcdHZhciBlYXNlZCxcblx0XHRcdGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XG5cdFx0fVxuXHRcdHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7XG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlO1xuXG5Ud2Vlbi5wcm9wSG9va3MgPSB7XG5cdF9kZWZhdWx0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0XHQvLyBVc2UgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSB3aGVuIGl0IGlzIG5vdCBhIERPTSBlbGVtZW50LFxuXHRcdFx0Ly8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy5cblx0XHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAhPT0gMSB8fFxuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cblx0XHRcdC8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LlxuXHRcdFx0Ly8gVXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlLlxuXHRcdFx0Ly8gVXNlIC5zdHlsZSBpZiBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZS5cblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdIHx8XG5cdFx0XHRcdFx0dHdlZW4uZWxlbS5zdHlsZVsgZmluYWxQcm9wTmFtZSggdHdlZW4ucHJvcCApIF0gIT0gbnVsbCApICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9LFxuXHRfZGVmYXVsdDogXCJzd2luZ1wiXG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBjb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgaW5Qcm9ncmVzcyxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJydW4gPSAvcXVldWVIb29rcyQvO1xuXG5mdW5jdGlvbiBzY2hlZHVsZSgpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdGlmICggZG9jdW1lbnQuaGlkZGVuID09PSBmYWxzZSAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICkge1xuXHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHNjaGVkdWxlLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0XHR9XG5cblx0XHRqUXVlcnkuZngudGljaygpO1xuXHR9XG59XG5cbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcbmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0ZnhOb3cgPSB1bmRlZmluZWQ7XG5cdH0gKTtcblx0cmV0dXJuICggZnhOb3cgPSBEYXRlLm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyBcIipcIiBdICksXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggKCB0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgKSB7XG5cblx0XHRcdC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHR2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgaG9va3MsIG9sZGZpcmUsIHByb3BUd2VlbiwgcmVzdG9yZURpc3BsYXksIGRpc3BsYXksXG5cdFx0aXNCb3ggPSBcIndpZHRoXCIgaW4gcHJvcHMgfHwgXCJoZWlnaHRcIiBpbiBwcm9wcyxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksXG5cdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBRdWV1ZS1za2lwcGluZyBhbmltYXRpb25zIGhpamFjayB0aGUgZnggaG9va3Ncblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5zdXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBjb21wbGV0ZXNcblx0XHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0aG9va3MudW5xdWV1ZWQtLTtcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRGV0ZWN0IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdGZvciAoIHByb3AgaW4gcHJvcHMgKSB7XG5cdFx0dmFsdWUgPSBwcm9wc1sgcHJvcCBdO1xuXHRcdGlmICggcmZ4dHlwZXMudGVzdCggdmFsdWUgKSApIHtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgcHJvcCBdO1xuXHRcdFx0dG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSBcInRvZ2dsZVwiO1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyBcImhpZGVcIiA6IFwic2hvd1wiICkgKSB7XG5cblx0XHRcdFx0Ly8gUHJldGVuZCB0byBiZSBoaWRkZW4gaWYgdGhpcyBpcyBhIFwic2hvd1wiIGFuZFxuXHRcdFx0XHQvLyB0aGVyZSBpcyBzdGlsbCBkYXRhIGZyb20gYSBzdG9wcGVkIHNob3cvaGlkZVxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQmFpbCBvdXQgaWYgdGhpcyBpcyBhIG5vLW9wIGxpa2UgLmhpZGUoKS5oaWRlKClcblx0cHJvcFR3ZWVuID0gIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wcyApO1xuXHRpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBSZXN0cmljdCBcIm92ZXJmbG93XCIgYW5kIFwiZGlzcGxheVwiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnNcblx0aWYgKCBpc0JveCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdC8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZFxuXHRcdC8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9yc1xuXHRcdC8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuXG5cdFx0b3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07XG5cblx0XHQvLyBJZGVudGlmeSBhIGRpc3BsYXkgdHlwZSwgcHJlZmVycmluZyBvbGQgc2hvdy9oaWRlIGRhdGEgb3ZlciB0aGUgQ1NTIGNhc2NhZGVcblx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFTaG93ICYmIGRhdGFTaG93LmRpc3BsYXk7XG5cdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0fVxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ICkge1xuXHRcdFx0XHRkaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHlcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5IHx8IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcImlubGluZVwiIHx8IGRpc3BsYXkgPT09IFwiaW5saW5lLWJsb2NrXCIgJiYgcmVzdG9yZURpc3BsYXkgIT0gbnVsbCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXG5cdFx0XHRcdC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zXG5cdFx0XHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5ID0gc3R5bGUuZGlzcGxheTtcblx0XHRcdFx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGlzcGxheSA9PT0gXCJub25lXCIgPyBcIlwiIDogZGlzcGxheTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBvcHRzLm92ZXJmbG93ICkge1xuXHRcdHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTtcblx0XHRcdHN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTtcblx0XHRcdHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBJbXBsZW1lbnQgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0cHJvcFR3ZWVuID0gZmFsc2U7XG5cdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblxuXHRcdC8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uXG5cdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdFx0aWYgKCBcImhpZGRlblwiIGluIGRhdGFTaG93ICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCBcInJldmVyc2VzXCJcblx0XHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0XHRkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG93IGVsZW1lbnRzIGJlZm9yZSBhbmltYXRpbmcgdGhlbVxuXHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0XHQvLyBUaGUgZmluYWwgc3RlcCBvZiBhIFwiaGlkZVwiIGFuaW1hdGlvbiBpcyBhY3R1YWxseSBoaWRpbmcgdGhlIGVsZW1lbnRcblx0XHRcdFx0aWYgKCAhaGlkZGVuICkge1xuXHRcdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIFBlci1wcm9wZXJ0eSBzZXR1cFxuXHRcdHByb3BUd2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRwcm9wVHdlZW4uZW5kID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRwcm9wVHdlZW4uc3RhcnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0gKTtcblxuXHRcdFx0Ly8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZFxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiByZW1haW5pbmc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKCAhbGVuZ3RoICkge1xuXHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uXG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSgge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwge1xuXHRcdFx0XHRzcGVjaWFsRWFzaW5nOiB7fSxcblx0XHRcdFx0ZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0XG5cdFx0XHR9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZTsgb3RoZXJ3aXNlLCByZWplY3Rcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xuXHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9ICksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0cmVzdWx0LnN0b3AuYmluZCggcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0Ly8gQXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0YW5pbWF0aW9uXG5cdFx0LnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9IClcblx0KTtcblxuXHRyZXR1cm4gYW5pbWF0aW9uO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblx0XHR9XG5cblx0XHR2YXIgcHJvcCxcblx0XHRcdGluZGV4ID0gMCxcblx0XHRcdGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0Ly8gR28gdG8gdGhlIGVuZCBzdGF0ZSBpZiBmeCBhcmUgb2ZmXG5cdGlmICggalF1ZXJ5LmZ4Lm9mZiApIHtcblx0XHRvcHQuZHVyYXRpb24gPSAwO1xuXG5cdH0gZWxzZSB7XG5cdFx0aWYgKCB0eXBlb2Ygb3B0LmR1cmF0aW9uICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0aWYgKCBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyApIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbldpdGhpblRyZWUgKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGUsXG5cdFx0XHRsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdGhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IHJldDtcblx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0bG93ZXJjYXNlTmFtZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59ICk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmNsaWNrYWJsZSA9IC9eKD86YXxhcmVhKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzXG5cdFx0XHRuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdO1xuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNDExMTYyMzMzNDcvaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0aWYgKCB0YWJpbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoIHRhYmluZGV4LCAxMCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiZcblx0XHRcdFx0XHRlbGVtLmhyZWZcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbi8vIGVzbGludCBydWxlIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29kZVxuLy8gc2luY2UgaXQgY29uc2lkZXJzIHN1Y2ggYWNjZXNzaW9ucyBub29wXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxuXHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gSFRNTCBzcGVjXG5cdC8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2UtYXNjaWktd2hpdGVzcGFjZVxuXHRmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHtcblx0XHR2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0XHRyZXR1cm4gdG9rZW5zLmpvaW4oIFwiIFwiICk7XG5cdH1cblxuXG5mdW5jdGlvbiBnZXRDbGFzcyggZWxlbSApIHtcblx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fCBcIlwiO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VzVG9BcnJheSggdmFsdWUgKSB7XG5cdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggY2xhc3Nlcy5sZW5ndGggKSB7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXG5cdFx0XHRcdC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpXG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSxcblx0XHRcdGlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiBpc1ZhbGlkVmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCBpc1ZhbGlkVmFsdWUgKSB7XG5cblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcblx0XHRcdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0XHRcdHdoaWxlICggKCBjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFwiXCIgOlxuXHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgdmFsdWVJc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fFxuXHRcdFx0XHRcdGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdFx0aWYgKCBob29rcyAmJlxuXHRcdFx0XHRcdFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkgKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0aWYgKCB0eXBlb2YgcmV0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgXCJcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdHJldHVybiByZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHR2YXIgdmFsO1xuXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidmFsdWVcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsICE9IG51bGwgP1xuXHRcdFx0XHRcdHZhbCA6XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEgb25seVxuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0c3RyaXBBbmRDb2xsYXBzZSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbiwgaSxcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCAwICkge1xuXHRcdFx0XHRcdGkgPSBtYXg7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXG5cdFx0XHRcdFx0XHRcdC8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdFx0XHRcdFx0IW9wdGlvbi5kaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fFxuXHRcdFx0XHRcdFx0XHRcdCFub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsIFwib3B0Z3JvdXBcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb25cblx0XHRcdFx0XHRcdHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHNcblx0XHRcdFx0XHRcdGlmICggb25lICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBvcHRpb25TZXQsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksXG5cdFx0XHRcdFx0aSA9IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG5cblx0XHRcdFx0XHRpZiAoIG9wdGlvbi5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tY29uZC1hc3NpZ24gKi9cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxuc3VwcG9ydC5mb2N1c2luID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxudmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFxuXHRzdG9wUHJvcGFnYXRpb25DYWxsYmFjayA9IGZ1bmN0aW9uKCBlICkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH07XG5cbmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCwgbGFzdEVsZW1lbnQsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIFwiLlwiICkgOiBbXTtcblxuXHRcdGN1ciA9IGxhc3RFbGVtZW50ID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7XG5cblx0XHQvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vd1xuXHRcdGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIuXCIgKSA+IC0xICkge1xuXG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XG5cdFx0XHRuYW1lc3BhY2VzLnNvcnQoKTtcblx0XHR9XG5cdFx0b250eXBlID0gdHlwZS5pbmRleE9mKCBcIjpcIiApIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiICk7XG5cdFx0ZXZlbnQucm5hbWVzcGFjZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0bGFzdEVsZW1lbnQgPSBjdXI7XG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKFxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApXG5cdFx0XHRcdClbIGV2ZW50LnR5cGUgXSAmJlxuXHRcdFx0XHRkYXRhUHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBhY2NlcHREYXRhKCBjdXIgKSApIHtcblx0XHRcdFx0ZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XG5cblx0XHQvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblxuXHRcdFx0aWYgKCAoICFzcGVjaWFsLl9kZWZhdWx0IHx8XG5cdFx0XHRcdHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmXG5cdFx0XHRcdGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cblx0XHRcdFx0XHRpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBzdG9wUHJvcGFnYXRpb25DYWxsYmFjayApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdC8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cdH1cblxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjFcbi8vIGZvY3VzKGluIHwgb3V0KSBldmVudHMgZmlyZSBhZnRlciBmb2N1cyAmIGJsdXIgZXZlbnRzLFxuLy8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIEhhbmRsZTogcmVndWxhciBub2RlcyAodmlhIGB0aGlzLm93bmVyRG9jdW1lbnRgKSwgd2luZG93XG5cdFx0XHRcdC8vICh2aWEgYHRoaXMuZG9jdW1lbnRgKSAmIGRvY3VtZW50ICh2aWEgYHRoaXNgKS5cblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IHsgZ3VpZDogRGF0ZS5ub3coKSB9O1xuXG52YXIgcnF1ZXJ5ID0gKCAvXFw/LyApO1xuXG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWw7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuXHRcdGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkge1xuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcblxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKFxuXHRcdFx0XHRcdHByZWZpeCArIFwiW1wiICsgKCB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9IG51bGwgPyBpIDogXCJcIiApICsgXCJdXCIsXG5cdFx0XHRcdFx0dixcblx0XHRcdFx0XHR0cmFkaXRpb25hbCxcblx0XHRcdFx0XHRhZGRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIHRvVHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWVPckZ1bmN0aW9uICkge1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlXG5cdFx0XHR2YXIgdmFsdWUgPSBpc0Z1bmN0aW9uKCB2YWx1ZU9yRnVuY3Rpb24gKSA/XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbigpIDpcblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uO1xuXG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICtcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0fTtcblxuXHRpZiAoIGEgPT0gbnVsbCApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIF9pLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSApLmdldCgpO1xuXHR9XG59ICk7XG5cblxudmFyXG5cdHIyMCA9IC8lMjAvZyxcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJhbnRpQ2FjaGUgPSAvKFs/Jl0pXz1bXiZdKi8sXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblxuXHQvKiBQcmVmaWx0ZXJzXG5cdCAqIDEpIFRoZXkgYXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAuanMgZm9yIGFuIGV4YW1wbGUpXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XG5cdCAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnRcblx0ICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxpemF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKVxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHByZWZpbHRlcnMgPSB7fSxcblxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXG5cdCAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHRyYW5zcG9ydHMgPSB7fSxcblxuXHQvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHRvcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpICsgXCIgXCIgXSA9XG5cdFx0XHRcdFx0XHRcdFx0XHQoIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpICsgXCIgXCIgXSB8fCBbXSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jb25jYXQoIG1hdGNoWyAyIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpICsgXCIgXCIgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2guam9pbiggXCIsIFwiICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV0ZWQgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhY2hlcyB0aGUgaGVhZGVyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID1cblx0XHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHwgbmFtZTtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXJcblx0XHRcdFx0b3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrcyBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb2RlIGluIG1hcCApIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTtcblxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSAoIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gdGhlIG9yaWdpbiBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IG9yaWdpbi5cblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHVybEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHRcdC8vIElFIHRocm93cyBleGNlcHRpb24gb24gYWNjZXNzaW5nIHRoZSBocmVmIHByb3BlcnR5IGlmIHVybCBpcyBtYWxmb3JtZWQsXG5cdFx0XHQvLyBlLmcuIGh0dHA6Ly9leGFtcGxlLmNvbTo4MHgvXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHMudXJsO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExIG9ubHlcblx0XHRcdFx0Ly8gQW5jaG9yJ3MgaG9zdCBwcm9wZXJ0eSBpc24ndCBjb3JyZWN0bHkgc2V0IHdoZW4gcy51cmwgaXMgcmVsYXRpdmVcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjtcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IG9yaWdpbkFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIG9yaWdpbkFuY2hvci5ob3N0ICE9PVxuXHRcdFx0XHRcdHVybEFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIHVybEFuY2hvci5ob3N0O1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgVVJMLCBhc3N1bWUgaXQgaXMgY3Jvc3NEb21haW4sXG5cdFx0XHRcdC8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWRcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvblxuXHRcdGNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsIFwiXCIgKTtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgaGFzaCBzbyB3ZSBjYW4gcHV0IGl0IGJhY2tcblx0XHRcdHVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApO1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiApICkge1xuXHRcdFx0XHRjYWNoZVVSTCArPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgcy5kYXRhO1xuXG5cdFx0XHRcdC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9yIHVwZGF0ZSBhbnRpLWNhY2hlIHBhcmFtIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSBjYWNoZVVSTC5yZXBsYWNlKCByYW50aUNhY2hlLCBcIiQxXCIgKTtcblx0XHRcdFx0dW5jYWNoZWQgPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgKCBub25jZS5ndWlkKysgKSArXG5cdFx0XHRcdFx0dW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIG5vb3AgY29udmVydGVyIGZvciBtaXNzaW5nIHNjcmlwdFxuXHRcdFx0aWYgKCAhaXNTdWNjZXNzICYmIGpRdWVyeS5pbkFycmF5KCBcInNjcmlwdFwiLCBzLmRhdGFUeXBlcyApID4gLTEgKSB7XG5cdFx0XHRcdHMuY29udmVydGVyc1sgXCJ0ZXh0IHNjcmlwdFwiIF0gPSBmdW5jdGlvbigpIHt9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBfaSwgbWV0aG9kICkge1xuXHRqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7XG5cblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKVxuXHRcdHJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1cmwgKSAmJiB1cmwgKSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdHZhciBpO1xuXHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRpZiAoIGkudG9Mb3dlckNhc2UoKSA9PT0gXCJjb250ZW50LXR5cGVcIiApIHtcblx0XHRcdHMuY29udGVudFR5cGUgPSBzLmhlYWRlcnNbIGkgXSB8fCBcIlwiO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbmpRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMsIGRvYyApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXG5cdFx0Ly8gT25seSBldmFsdWF0ZSB0aGUgcmVzcG9uc2UgaWYgaXQgaXMgc3VjY2Vzc2Z1bCAoZ2gtNDEyNilcblx0XHQvLyBkYXRhRmlsdGVyIGlzIG5vdCBpbnZva2VkIGZvciBmYWlsdXJlIHJlc3BvbnNlcywgc28gdXNpbmcgaXQgaW5zdGVhZFxuXHRcdC8vIG9mIHRoZSBkZWZhdWx0IGNvbnZlcnRlciBpcyBrbHVkZ3kgYnV0IGl0IHdvcmtzLlxuXHRcdGNvbnZlcnRlcnM6IHtcblx0XHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oKSB7fVxuXHRcdH0sXG5cdFx0ZGF0YUZpbHRlcjogZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHJlc3BvbnNlLCBvcHRpb25zLCBkb2MgKTtcblx0XHR9XG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxuXHRcdFx0XHRjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTtcblxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5hcHBlbmQoIGh0bWwgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGh0bWxJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZS5ndWlkKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBTYWZhcmkgOCBvbmx5XG4vLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50XG4vLyBjb2xsYXBzZSBzaWJsaW5nIGZvcm1zOiB0aGUgc2Vjb25kIG9uZSBiZWNvbWVzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IG9uZS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhpcyBzZWN1cml0eSBtZWFzdXJlIGhhcyB0byBiZSBkaXNhYmxlZCBpbiBTYWZhcmkgOC5cbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzdcbnN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ID0gKCBmdW5jdGlvbigpIHtcblx0dmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKS5ib2R5O1xuXHRib2R5LmlubmVySFRNTCA9IFwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIjtcblx0cmV0dXJuIGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT09IDI7XG59ICkoKTtcblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoIHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cblx0dmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0cztcblxuXHRpZiAoICFjb250ZXh0ICkge1xuXG5cdFx0Ly8gU3RvcCBzY3JpcHRzIG9yIGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG5cdFx0Ly8gYnkgdXNpbmcgZG9jdW1lbnQuaW1wbGVtZW50YXRpb25cblx0XHRpZiAoIHN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ICkge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApO1xuXG5cdFx0XHQvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHNvIGFueSBwYXJzZWQgZWxlbWVudHMgd2l0aCBVUkxzXG5cdFx0XHQvLyBhcmUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgVVJMIChnaC0yOTY1KVxuXHRcdFx0YmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJiYXNlXCIgKTtcblx0XHRcdGJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRjb250ZXh0LmhlYWQuYXBwZW5kQ2hpbGQoIGJhc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50O1xuXHRcdH1cblx0fVxuXG5cdHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApO1xuXHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbIDEgXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBidWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApO1xuXG5cdGlmICggc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApO1xufTtcblxuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdG9mZiA9IHVybC5pbmRleE9mKCBcIiBcIiApO1xuXG5cdGlmICggb2ZmID4gLTEgKSB7XG5cdFx0c2VsZWN0b3IgPSBzdHJpcEFuZENvbGxhcHNlKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBwcm9wcy50b3AgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHByb3BzLnRvcCArPSBcInB4XCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHR5cGVvZiBwcm9wcy5sZWZ0ID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHRwcm9wcy5sZWZ0ICs9IFwicHhcIjtcblx0XHRcdH1cblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdC8vIG9mZnNldCgpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIGJvcmRlciBib3ggdG8gdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdFx0Ly8gUHJlc2VydmUgY2hhaW5pbmcgZm9yIHNldHRlclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHR0aGlzIDpcblx0XHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlY3QsIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB6ZXJvcyBmb3IgZGlzY29ubmVjdGVkIGFuZCBoaWRkZW4gKGRpc3BsYXk6IG5vbmUpIGVsZW1lbnRzIChnaC0yMzEwKVxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGFcblx0XHQvLyBkaXNjb25uZWN0ZWQgbm9kZSBpbiBJRSB0aHJvd3MgYW4gZXJyb3Jcblx0XHRpZiAoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUlxuXHRcdHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdHdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldztcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiByZWN0LnRvcCArIHdpbi5wYWdlWU9mZnNldCxcblx0XHRcdGxlZnQ6IHJlY3QubGVmdCArIHdpbi5wYWdlWE9mZnNldFxuXHRcdH07XG5cdH0sXG5cblx0Ly8gcG9zaXRpb24oKSByZWxhdGVzIGFuIGVsZW1lbnQncyBtYXJnaW4gYm94IHRvIGl0cyBvZmZzZXQgcGFyZW50J3MgcGFkZGluZyBib3hcblx0Ly8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LCBkb2MsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIHBvc2l0aW9uOmZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB0aGUgdmlld3BvcnQsIHdoaWNoIGl0c2VsZiBhbHdheXMgaGFzIHplcm8gb2Zmc2V0XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgcG9zaXRpb246Zml4ZWQgaW1wbGllcyBhdmFpbGFiaWxpdHkgb2YgZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG5cdFx0XHRvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50XG5cdFx0XHQvLyB3aGVuIGEgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnQgaXMgaWRlbnRpZmllZFxuXHRcdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdFx0b2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmXG5cdFx0XHRcdCggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50ICE9PSBlbGVtICYmIG9mZnNldFBhcmVudC5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSBib3JkZXJzIGludG8gaXRzIG9mZnNldCwgc2luY2UgdGhleSBhcmUgb3V0c2lkZSBpdHMgY29udGVudCBvcmlnaW5cblx0XHRcdFx0cGFyZW50T2Zmc2V0ID0galF1ZXJ5KCBvZmZzZXRQYXJlbnQgKS5vZmZzZXQoKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwiYm9yZGVyVG9wV2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwiYm9yZGVyTGVmdFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpblRvcFwiLCB0cnVlICksXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIsIHRydWUgKVxuXHRcdH07XG5cdH0sXG5cblx0Ly8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZG9jdW1lbnRFbGVtZW50IGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG5cdC8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5cblx0Ly8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2luZG93XG5cdC8vIDIpIEZvciB0aGUgaGlkZGVuIG9yIGRldGFjaGVkIGVsZW1lbnRcblx0Ly8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZlxuXHQvL1xuXHQvLyBidXQgdGhvc2UgZXhjZXB0aW9ucyB3ZXJlIG5ldmVyIHByZXNlbnRlZCBhcyBhIHJlYWwgbGlmZSB1c2UtY2FzZXNcblx0Ly8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuXG5cdC8vXG5cdC8vIFRoaXMgbG9naWMsIGhvd2V2ZXIsIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBjYW4gY2hhbmdlIGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblxuXHRcdFx0Ly8gQ29hbGVzY2UgZG9jdW1lbnRzIGFuZCB3aW5kb3dzXG5cdFx0XHR2YXIgd2luO1xuXHRcdFx0aWYgKCBpc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtO1xuXHRcdFx0fSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0d2luID0gZWxlbS5kZWZhdWx0Vmlldztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OVxuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDdcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQ7XG4vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwganVzdCBjaGVjayBmb3IgaXQgaGVyZVxualF1ZXJ5LmVhY2goIFsgXCJ0b3BcIiwgXCJsZWZ0XCIgXSwgZnVuY3Rpb24oIF9pLCBwcm9wICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7XG5cblx0XHRcdFx0Ly8gSWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0XG5cdFx0XHRcdHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgXCJweFwiIDpcblx0XHRcdFx0XHRjb21wdXRlZDtcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59ICk7XG5cblxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBIZWlnaHQ6IFwiaGVpZ2h0XCIsIFdpZHRoOiBcIndpZHRoXCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7XG5cdGpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsIFwiXCI6IFwib3V0ZXJcIiArIG5hbWUgfSxcblx0XHRmdW5jdGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHtcblxuXHRcdC8vIE1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aFxuXHRcdGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkge1xuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcblx0XHRcdFx0ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyBcIm1hcmdpblwiIDogXCJib3JkZXJcIiApO1xuXG5cdFx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBkb2M7XG5cblx0XHRcdFx0aWYgKCBpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gJCggd2luZG93ICkub3V0ZXJXaWR0aC9IZWlnaHQgcmV0dXJuIHcvaCBpbmNsdWRpbmcgc2Nyb2xsYmFycyAoZ2gtMTcyOSlcblx0XHRcdFx0XHRyZXR1cm4gZnVuY05hbWUuaW5kZXhPZiggXCJvdXRlclwiICkgPT09IDAgP1xuXHRcdFx0XHRcdFx0ZWxlbVsgXCJpbm5lclwiICsgbmFtZSBdIDpcblx0XHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBcImNsaWVudFwiICsgbmFtZSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodFxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sXG5cdFx0XHRcdFx0Ly8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0XG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cblx0XHRcdFx0XHQvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0XG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6XG5cblx0XHRcdFx0XHQvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTtcblx0XHRcdH0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVmaW5lZCwgY2hhaW5hYmxlICk7XG5cdFx0fTtcblx0fSApO1xufSApO1xuXG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwiYWpheFN0YXJ0XCIsXG5cdFwiYWpheFN0b3BcIixcblx0XCJhamF4Q29tcGxldGVcIixcblx0XCJhamF4RXJyb3JcIixcblx0XCJhamF4U3VjY2Vzc1wiLFxuXHRcImFqYXhTZW5kXCJcbl0sIGZ1bmN0aW9uKCBfaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59ICk7XG5cblxuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRiaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7XG5cdH0sXG5cblx0ZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkge1xuXG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID9cblx0XHRcdHRoaXMub2ZmKCBzZWxlY3RvciwgXCIqKlwiICkgOlxuXHRcdFx0dGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH0sXG5cblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCAoIFwiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgXCIgK1xuXHRcIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIFwiICtcblx0XCJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51XCIgKS5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXG5cdFx0Ly8gSGFuZGxlIGV2ZW50IGJpbmRpbmdcblx0XHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHRcdHRoaXMub24oIG5hbWUsIG51bGwsIGRhdGEsIGZuICkgOlxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0XHR9O1xuXHR9ICk7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuLy8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG52YXIgcnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2c7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cbmpRdWVyeS50cmltID0gZnVuY3Rpb24oIHRleHQgKSB7XG5cdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFwiXCIgOlxuXHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCJcIiApO1xufTtcblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIiwiLyoqIVxuICogQGZpbGVPdmVydmlldyBLaWNrYXNzIGxpYnJhcnkgdG8gY3JlYXRlIGFuZCBwbGFjZSBwb3BwZXJzIG5lYXIgdGhlaXIgcmVmZXJlbmNlIGVsZW1lbnRzLlxuICogQHZlcnNpb24gMS4xNi4xXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2IEZlZGVyaWNvIFppdm9sbyBhbmQgY29udHJpYnV0b3JzXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCc7XG5cbnZhciB0aW1lb3V0RHVyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsb25nZXJUaW1lb3V0QnJvd3NlcnMgPSBbJ0VkZ2UnLCAnVHJpZGVudCcsICdGaXJlZm94J107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2VyVGltZW91dEJyb3dzZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YobG9uZ2VyVGltZW91dEJyb3dzZXJzW2ldKSA+PSAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59KCk7XG5cbmZ1bmN0aW9uIG1pY3JvdGFza0RlYm91bmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgd2luZG93LlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGVkID0gZmFsc2U7XG4gICAgICBmbigpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICBmbigpO1xuICAgICAgfSwgdGltZW91dER1cmF0aW9uKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBzdXBwb3J0c01pY3JvVGFza3MgPSBpc0Jyb3dzZXIgJiYgd2luZG93LlByb21pc2U7XG5cbi8qKlxuKiBDcmVhdGUgYSBkZWJvdW5jZWQgdmVyc2lvbiBvZiBhIG1ldGhvZCwgdGhhdCdzIGFzeW5jaHJvbm91c2x5IGRlZmVycmVkXG4qIGJ1dCBjYWxsZWQgaW4gdGhlIG1pbmltdW0gdGltZSBwb3NzaWJsZS5cbipcbiogQG1ldGhvZFxuKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4qIEBhcmd1bWVudCB7RnVuY3Rpb259IGZuXG4qIEByZXR1cm5zIHtGdW5jdGlvbn1cbiovXG52YXIgZGVib3VuY2UgPSBzdXBwb3J0c01pY3JvVGFza3MgPyBtaWNyb3Rhc2tEZWJvdW5jZSA6IHRhc2tEZWJvdW5jZTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBmdW5jdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtBbnl9IGZ1bmN0aW9uVG9DaGVjayAtIHZhcmlhYmxlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvOiBpcyBhIGZ1bmN0aW9uP1xuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjaykge1xuICB2YXIgZ2V0VHlwZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb25Ub0NoZWNrICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIEdldCBDU1MgY29tcHV0ZWQgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIHZhciB3aW5kb3cgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIHZhciBjc3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTtcbiAgcmV0dXJuIHByb3BlcnR5ID8gY3NzW3Byb3BlcnR5XSA6IGNzcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnROb2RlIG9yIHRoZSBob3N0IG9mIHRoZSBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlIHx8IGVsZW1lbnQuaG9zdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY3JvbGxpbmcgcGFyZW50IG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBzY3JvbGwgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIFJldHVybiBib2R5LCBgZ2V0U2Nyb2xsYCB3aWxsIHRha2UgY2FyZSB0byBnZXQgdGhlIGNvcnJlY3QgYHNjcm9sbFRvcGAgZnJvbSBpdFxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIHN3aXRjaCAoZWxlbWVudC5ub2RlTmFtZSkge1xuICAgIGNhc2UgJ0hUTUwnOlxuICAgIGNhc2UgJ0JPRFknOlxuICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICByZXR1cm4gZWxlbWVudC5ib2R5O1xuICB9XG5cbiAgLy8gRmlyZWZveCB3YW50IHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG5cbiAgdmFyIF9nZXRTdHlsZUNvbXB1dGVkUHJvcCA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRTdHlsZUNvbXB1dGVkUHJvcC5vdmVyZmxvd1k7XG5cbiAgaWYgKC8oYXV0b3xzY3JvbGx8b3ZlcmxheSkvLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBub2RlIG9mIHRoZSByZWZlcmVuY2Ugb2JqZWN0LCBvciB0aGUgcmVmZXJlbmNlIG9iamVjdCBpdHNlbGYuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSByZWZlcmVuY2UgLSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZSkge1xuICByZXR1cm4gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5yZWZlcmVuY2VOb2RlID8gcmVmZXJlbmNlLnJlZmVyZW5jZU5vZGUgOiByZWZlcmVuY2U7XG59XG5cbnZhciBpc0lFMTEgPSBpc0Jyb3dzZXIgJiYgISEod2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG52YXIgaXNJRTEwID0gaXNCcm93c2VyICYmIC9NU0lFIDEwLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGJyb3dzZXIgaXMgSW50ZXJuZXQgRXhwbG9yZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXNJRVxuICovXG5mdW5jdGlvbiBpc0lFKHZlcnNpb24pIHtcbiAgaWYgKHZlcnNpb24gPT09IDExKSB7XG4gICAgcmV0dXJuIGlzSUUxMTtcbiAgfVxuICBpZiAodmVyc2lvbiA9PT0gMTApIHtcbiAgICByZXR1cm4gaXNJRTEwO1xuICB9XG4gIHJldHVybiBpc0lFMTEgfHwgaXNJRTEwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IG9mZnNldCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIHZhciBub09mZnNldFBhcmVudCA9IGlzSUUoMTApID8gZG9jdW1lbnQuYm9keSA6IG51bGw7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50IHx8IG51bGw7XG4gIC8vIFNraXAgaGlkZGVuIGVsZW1lbnRzIHdoaWNoIGRvbid0IGhhdmUgYW4gb2Zmc2V0UGFyZW50XG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgPT09IG5vT2Zmc2V0UGFyZW50ICYmIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gKGVsZW1lbnQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykub2Zmc2V0UGFyZW50O1xuICB9XG5cbiAgdmFyIG5vZGVOYW1lID0gb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudC5ub2RlTmFtZTtcblxuICBpZiAoIW5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50ID8gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIC5vZmZzZXRQYXJlbnQgd2lsbCByZXR1cm4gdGhlIGNsb3Nlc3QgVEgsIFREIG9yIFRBQkxFIGluIGNhc2VcbiAgLy8gbm8gb2Zmc2V0UGFyZW50IGlzIHByZXNlbnQsIEkgaGF0ZSB0aGlzIGpvYi4uLlxuICBpZiAoWydUSCcsICdURCcsICdUQUJMRSddLmluZGV4T2Yob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAhPT0gLTEgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgcmV0dXJuIGdldE9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudDtcbn1cblxuZnVuY3Rpb24gaXNPZmZzZXRDb250YWluZXIoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ0hUTUwnIHx8IGdldE9mZnNldFBhcmVudChlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSA9PT0gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcm9vdCBub2RlIChkb2N1bWVudCwgc2hhZG93RE9NIHJvb3QpIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtFbGVtZW50fSByb290IG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gIGlmIChub2RlLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0Um9vdChub2RlLnBhcmVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG9mZnNldCBwYXJlbnQgY29tbW9uIHRvIHRoZSB0d28gcHJvdmlkZWQgbm9kZXNcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDFcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDJcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBjb21tb24gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50MSB8fCAhZWxlbWVudDEubm9kZVR5cGUgfHwgIWVsZW1lbnQyIHx8ICFlbGVtZW50Mi5ub2RlVHlwZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBIZXJlIHdlIG1ha2Ugc3VyZSB0byBnaXZlIGFzIFwic3RhcnRcIiB0aGUgZWxlbWVudCB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET01cbiAgdmFyIG9yZGVyID0gZWxlbWVudDEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudDIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc7XG4gIHZhciBzdGFydCA9IG9yZGVyID8gZWxlbWVudDEgOiBlbGVtZW50MjtcbiAgdmFyIGVuZCA9IG9yZGVyID8gZWxlbWVudDIgOiBlbGVtZW50MTtcblxuICAvLyBHZXQgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lclxuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICByYW5nZS5zZXRTdGFydChzdGFydCwgMCk7XG4gIHJhbmdlLnNldEVuZChlbmQsIDApO1xuICB2YXIgY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAvLyBCb3RoIG5vZGVzIGFyZSBpbnNpZGUgI2RvY3VtZW50XG5cbiAgaWYgKGVsZW1lbnQxICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciAmJiBlbGVtZW50MiAhPT0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgfHwgc3RhcnQuY29udGFpbnMoZW5kKSkge1xuICAgIGlmIChpc09mZnNldENvbnRhaW5lcihjb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgIHJldHVybiBjb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIG9uZSBvZiB0aGUgbm9kZXMgaXMgaW5zaWRlIHNoYWRvd0RPTSwgZmluZCB3aGljaCBvbmVcbiAgdmFyIGVsZW1lbnQxcm9vdCA9IGdldFJvb3QoZWxlbWVudDEpO1xuICBpZiAoZWxlbWVudDFyb290Lmhvc3QpIHtcbiAgICByZXR1cm4gZmluZENvbW1vbk9mZnNldFBhcmVudChlbGVtZW50MXJvb3QuaG9zdCwgZWxlbWVudDIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBnZXRSb290KGVsZW1lbnQyKS5ob3N0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHNjcm9sbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgZ2l2ZW4gc2lkZSAodG9wIGFuZCBsZWZ0KVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gc2lkZSBgdG9wYCBvciBgbGVmdGBcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGFtb3VudCBvZiBzY3JvbGxlZCBwaXhlbHNcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsKGVsZW1lbnQpIHtcbiAgdmFyIHNpZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICd0b3AnO1xuXG4gIHZhciB1cHBlclNpZGUgPSBzaWRlID09PSAndG9wJyA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBodG1sO1xuICAgIHJldHVybiBzY3JvbGxpbmdFbGVtZW50W3VwcGVyU2lkZV07XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFt1cHBlclNpZGVdO1xufVxuXG4vKlxuICogU3VtIG9yIHN1YnRyYWN0IHRoZSBlbGVtZW50IHNjcm9sbCB2YWx1ZXMgKGxlZnQgYW5kIHRvcCkgZnJvbSBhIGdpdmVuIHJlY3Qgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdCAtIFJlY3Qgb2JqZWN0IHlvdSB3YW50IHRvIGNoYW5nZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gdGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBzY3JvbGwgdmFsdWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnRyYWN0IC0gc2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc3VidHJhY3QgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjdCAtIFRoZSBtb2RpZmllciByZWN0IG9iamVjdFxuICovXG5mdW5jdGlvbiBpbmNsdWRlU2Nyb2xsKHJlY3QsIGVsZW1lbnQpIHtcbiAgdmFyIHN1YnRyYWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgdmFyIHNjcm9sbExlZnQgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ2xlZnQnKTtcbiAgdmFyIG1vZGlmaWVyID0gc3VidHJhY3QgPyAtMSA6IDE7XG4gIHJlY3QudG9wICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3AgKiBtb2RpZmllcjtcbiAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0ICogbW9kaWZpZXI7XG4gIHJldHVybiByZWN0O1xufVxuXG4vKlxuICogSGVscGVyIHRvIGRldGVjdCBib3JkZXJzIG9mIGEgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcbiAqIFJlc3VsdCBvZiBgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5YCBvbiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXMgLSBgeGAgb3IgYHlgXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGJvcmRlcnMgLSBUaGUgYm9yZGVycyBzaXplIG9mIHRoZSBnaXZlbiBheGlzXG4gKi9cblxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCBheGlzKSB7XG4gIHZhciBzaWRlQSA9IGF4aXMgPT09ICd4JyA/ICdMZWZ0JyA6ICdUb3AnO1xuICB2YXIgc2lkZUIgPSBzaWRlQSA9PT0gJ0xlZnQnID8gJ1JpZ2h0JyA6ICdCb3R0b20nO1xuXG4gIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVBICsgJ1dpZHRoJ10pICsgcGFyc2VGbG9hdChzdHlsZXNbJ2JvcmRlcicgKyBzaWRlQiArICdXaWR0aCddKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2l6ZShheGlzLCBib2R5LCBodG1sLCBjb21wdXRlZFN0eWxlKSB7XG4gIHJldHVybiBNYXRoLm1heChib2R5WydvZmZzZXQnICsgYXhpc10sIGJvZHlbJ3Njcm9sbCcgKyBheGlzXSwgaHRtbFsnY2xpZW50JyArIGF4aXNdLCBodG1sWydvZmZzZXQnICsgYXhpc10sIGh0bWxbJ3Njcm9sbCcgKyBheGlzXSwgaXNJRSgxMCkgPyBwYXJzZUludChodG1sWydvZmZzZXQnICsgYXhpc10pICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnbWFyZ2luJyArIChheGlzID09PSAnSGVpZ2h0JyA/ICdUb3AnIDogJ0xlZnQnKV0pICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnbWFyZ2luJyArIChheGlzID09PSAnSGVpZ2h0JyA/ICdCb3R0b20nIDogJ1JpZ2h0JyldKSA6IDApO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTaXplcyhkb2N1bWVudCkge1xuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IGlzSUUoMTApICYmIGdldENvbXB1dGVkU3R5bGUoaHRtbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IGdldFNpemUoJ0hlaWdodCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpLFxuICAgIHdpZHRoOiBnZXRTaXplKCdXaWR0aCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpXG4gIH07XG59XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBHaXZlbiBlbGVtZW50IG9mZnNldHMsIGdlbmVyYXRlIGFuIG91dHB1dCBzaW1pbGFyIHRvIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IG9mZnNldHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IENsaWVudFJlY3QgbGlrZSBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdChvZmZzZXRzKSB7XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb2Zmc2V0cywge1xuICAgIHJpZ2h0OiBvZmZzZXRzLmxlZnQgKyBvZmZzZXRzLndpZHRoLFxuICAgIGJvdHRvbTogb2Zmc2V0cy50b3AgKyBvZmZzZXRzLmhlaWdodFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYm91bmRpbmcgY2xpZW50IHJlY3Qgb2YgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7T2JqZWN0fSBjbGllbnQgcmVjdFxuICovXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IHt9O1xuXG4gIC8vIElFMTAgMTAgRklYOiBQbGVhc2UsIGRvbid0IGFzaywgdGhlIGVsZW1lbnQgaXNuJ3RcbiAgLy8gY29uc2lkZXJlZCBpbiBET00gaW4gc29tZSBjaXJjdW1zdGFuY2VzLi4uXG4gIC8vIFRoaXMgaXNuJ3QgcmVwcm9kdWNpYmxlIGluIElFMTAgY29tcGF0aWJpbGl0eSBtb2RlIG9mIElFMTFcbiAgdHJ5IHtcbiAgICBpZiAoaXNJRSgxMCkpIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IGdldFNjcm9sbChlbGVtZW50LCAndG9wJyk7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICAgICAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wO1xuICAgICAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQ7XG4gICAgICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICB9O1xuXG4gIC8vIHN1YnRyYWN0IHNjcm9sbGJhciBzaXplIGZyb20gc2l6ZXNcbiAgdmFyIHNpemVzID0gZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnID8gZ2V0V2luZG93U2l6ZXMoZWxlbWVudC5vd25lckRvY3VtZW50KSA6IHt9O1xuICB2YXIgd2lkdGggPSBzaXplcy53aWR0aCB8fCBlbGVtZW50LmNsaWVudFdpZHRoIHx8IHJlc3VsdC53aWR0aDtcbiAgdmFyIGhlaWdodCA9IHNpemVzLmhlaWdodCB8fCBlbGVtZW50LmNsaWVudEhlaWdodCB8fCByZXN1bHQuaGVpZ2h0O1xuXG4gIHZhciBob3JpelNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0V2lkdGggLSB3aWR0aDtcbiAgdmFyIHZlcnRTY3JvbGxiYXIgPSBlbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlaWdodDtcblxuICAvLyBpZiBhbiBoeXBvdGhldGljYWwgc2Nyb2xsYmFyIGlzIGRldGVjdGVkLCB3ZSBtdXN0IGJlIHN1cmUgaXQncyBub3QgYSBgYm9yZGVyYFxuICAvLyB3ZSBtYWtlIHRoaXMgY2hlY2sgY29uZGl0aW9uYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAgaWYgKGhvcml6U2Nyb2xsYmFyIHx8IHZlcnRTY3JvbGxiYXIpIHtcbiAgICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpO1xuICAgIGhvcml6U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3gnKTtcbiAgICB2ZXJ0U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3knKTtcblxuICAgIHJlc3VsdC53aWR0aCAtPSBob3JpelNjcm9sbGJhcjtcbiAgICByZXN1bHQuaGVpZ2h0IC09IHZlcnRTY3JvbGxiYXI7XG4gIH1cblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoY2hpbGRyZW4sIHBhcmVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgdmFyIGlzSUUxMCA9IGlzSUUoMTApO1xuICB2YXIgaXNIVE1MID0gcGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCc7XG4gIHZhciBjaGlsZHJlblJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRyZW4pO1xuICB2YXIgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGNoaWxkcmVuKTtcblxuICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KHBhcmVudCk7XG4gIHZhciBib3JkZXJUb3BXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlclRvcFdpZHRoKTtcbiAgdmFyIGJvcmRlckxlZnRXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlckxlZnRXaWR0aCk7XG5cbiAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHBhcmVudCBpcyBmaXhlZCwgd2UgbXVzdCBpZ25vcmUgbmVnYXRpdmUgc2Nyb2xsIGluIG9mZnNldCBjYWxjXG4gIGlmIChmaXhlZFBvc2l0aW9uICYmIGlzSFRNTCkge1xuICAgIHBhcmVudFJlY3QudG9wID0gTWF0aC5tYXgocGFyZW50UmVjdC50b3AsIDApO1xuICAgIHBhcmVudFJlY3QubGVmdCA9IE1hdGgubWF4KHBhcmVudFJlY3QubGVmdCwgMCk7XG4gIH1cbiAgdmFyIG9mZnNldHMgPSBnZXRDbGllbnRSZWN0KHtcbiAgICB0b3A6IGNoaWxkcmVuUmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcCAtIGJvcmRlclRvcFdpZHRoLFxuICAgIGxlZnQ6IGNoaWxkcmVuUmVjdC5sZWZ0IC0gcGFyZW50UmVjdC5sZWZ0IC0gYm9yZGVyTGVmdFdpZHRoLFxuICAgIHdpZHRoOiBjaGlsZHJlblJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiBjaGlsZHJlblJlY3QuaGVpZ2h0XG4gIH0pO1xuICBvZmZzZXRzLm1hcmdpblRvcCA9IDA7XG4gIG9mZnNldHMubWFyZ2luTGVmdCA9IDA7XG5cbiAgLy8gU3VidHJhY3QgbWFyZ2lucyBvZiBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBpdCdzIGJlaW5nIHVzZWQgYXMgcGFyZW50XG4gIC8vIHdlIGRvIHRoaXMgb25seSBvbiBIVE1MIGJlY2F1c2UgaXQncyB0aGUgb25seSBlbGVtZW50IHRoYXQgYmVoYXZlc1xuICAvLyBkaWZmZXJlbnRseSB3aGVuIG1hcmdpbnMgYXJlIGFwcGxpZWQgdG8gaXQuIFRoZSBtYXJnaW5zIGFyZSBpbmNsdWRlZCBpblxuICAvLyB0aGUgYm94IG9mIHRoZSBkb2N1bWVudEVsZW1lbnQsIGluIHRoZSBvdGhlciBjYXNlcyBub3QuXG4gIGlmICghaXNJRTEwICYmIGlzSFRNTCkge1xuICAgIHZhciBtYXJnaW5Ub3AgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Ub3ApO1xuICAgIHZhciBtYXJnaW5MZWZ0ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdCk7XG5cbiAgICBvZmZzZXRzLnRvcCAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmJvdHRvbSAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmxlZnQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcbiAgICBvZmZzZXRzLnJpZ2h0IC09IGJvcmRlckxlZnRXaWR0aCAtIG1hcmdpbkxlZnQ7XG5cbiAgICAvLyBBdHRhY2ggbWFyZ2luVG9wIGFuZCBtYXJnaW5MZWZ0IGJlY2F1c2UgaW4gc29tZSBjaXJjdW1zdGFuY2VzIHdlIG1heSBuZWVkIHRoZW1cbiAgICBvZmZzZXRzLm1hcmdpblRvcCA9IG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xuICB9XG5cbiAgaWYgKGlzSUUxMCAmJiAhZml4ZWRQb3NpdGlvbiA/IHBhcmVudC5jb250YWlucyhzY3JvbGxQYXJlbnQpIDogcGFyZW50ID09PSBzY3JvbGxQYXJlbnQgJiYgc2Nyb2xsUGFyZW50Lm5vZGVOYW1lICE9PSAnQk9EWScpIHtcbiAgICBvZmZzZXRzID0gaW5jbHVkZVNjcm9sbChvZmZzZXRzLCBwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShlbGVtZW50KSB7XG4gIHZhciBleGNsdWRlU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciByZWxhdGl2ZU9mZnNldCA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShlbGVtZW50LCBodG1sKTtcbiAgdmFyIHdpZHRoID0gTWF0aC5tYXgoaHRtbC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1heChodG1sLmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuXG4gIHZhciBzY3JvbGxUb3AgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sKSA6IDA7XG4gIHZhciBzY3JvbGxMZWZ0ID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCwgJ2xlZnQnKSA6IDA7XG5cbiAgdmFyIG9mZnNldCA9IHtcbiAgICB0b3A6IHNjcm9sbFRvcCAtIHJlbGF0aXZlT2Zmc2V0LnRvcCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpblRvcCxcbiAgICBsZWZ0OiBzY3JvbGxMZWZ0IC0gcmVsYXRpdmVPZmZzZXQubGVmdCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpbkxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG5cbiAgcmV0dXJuIGdldENsaWVudFJlY3Qob2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBmaXhlZCBvciBpcyBpbnNpZGUgYSBmaXhlZCBwYXJlbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBjdXN0b21Db250YWluZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG8gXCJpc0ZpeGVkP1wiXG4gKi9cbmZ1bmN0aW9uIGlzRml4ZWQoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gIGlmICghcGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNGaXhlZChwYXJlbnROb2RlKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3QgcGFyZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSB0cmFuc2Zvcm1lZCBwcm9wZXJ0eSBkZWZpbmVkXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBmaXJzdCB0cmFuc2Zvcm1lZCBwYXJlbnQgb3IgZG9jdW1lbnRFbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQucGFyZW50RWxlbWVudCB8fCBpc0lFKCkpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIHZhciBlbCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgd2hpbGUgKGVsICYmIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScpIHtcbiAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGVsIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cblxuLyoqXG4gKiBDb21wdXRlZCB0aGUgYm91bmRhcmllcyBsaW1pdHMgYW5kIHJldHVybiB0aGVtXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZVxuICogQHBhcmFtIHtudW1iZXJ9IHBhZGRpbmdcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50IC0gRWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgYm91bmRhcmllc1xuICogQHBhcmFtIHtCb29sZWFufSBmaXhlZFBvc2l0aW9uIC0gSXMgaW4gZml4ZWQgcG9zaXRpb24gbW9kZVxuICogQHJldHVybnMge09iamVjdH0gQ29vcmRpbmF0ZXMgb2YgdGhlIGJvdW5kYXJpZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIGZpeGVkUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuXG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG5cbiAgdmFyIGJvdW5kYXJpZXMgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCBnZXRSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZSkpO1xuXG4gIC8vIEhhbmRsZSB2aWV3cG9ydCBjYXNlXG4gIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIGJvdW5kYXJpZXMgPSBnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUob2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBIYW5kbGUgb3RoZXIgY2FzZXMgYmFzZWQgb24gRE9NIGVsZW1lbnQgdXNlZCBhcyBib3VuZGFyaWVzXG4gICAgdmFyIGJvdW5kYXJpZXNOb2RlID0gdm9pZCAwO1xuICAgIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUocmVmZXJlbmNlKSk7XG4gICAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnd2luZG93Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBwb3BwZXIub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldHMgPSBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoYm91bmRhcmllc05vZGUsIG9mZnNldFBhcmVudCwgZml4ZWRQb3NpdGlvbik7XG5cbiAgICAvLyBJbiBjYXNlIG9mIEhUTUwsIHdlIG5lZWQgYSBkaWZmZXJlbnQgY29tcHV0YXRpb25cbiAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdIVE1MJyAmJiAhaXNGaXhlZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICB2YXIgX2dldFdpbmRvd1NpemVzID0gZ2V0V2luZG93U2l6ZXMocG9wcGVyLm93bmVyRG9jdW1lbnQpLFxuICAgICAgICAgIGhlaWdodCA9IF9nZXRXaW5kb3dTaXplcy5oZWlnaHQsXG4gICAgICAgICAgd2lkdGggPSBfZ2V0V2luZG93U2l6ZXMud2lkdGg7XG5cbiAgICAgIGJvdW5kYXJpZXMudG9wICs9IG9mZnNldHMudG9wIC0gb2Zmc2V0cy5tYXJnaW5Ub3A7XG4gICAgICBib3VuZGFyaWVzLmJvdHRvbSA9IGhlaWdodCArIG9mZnNldHMudG9wO1xuICAgICAgYm91bmRhcmllcy5sZWZ0ICs9IG9mZnNldHMubGVmdCAtIG9mZnNldHMubWFyZ2luTGVmdDtcbiAgICAgIGJvdW5kYXJpZXMucmlnaHQgPSB3aWR0aCArIG9mZnNldHMubGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIGFsbCB0aGUgb3RoZXIgRE9NIGVsZW1lbnRzLCB0aGlzIG9uZSBpcyBnb29kXG4gICAgICBib3VuZGFyaWVzID0gb2Zmc2V0cztcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgcGFkZGluZ3NcbiAgcGFkZGluZyA9IHBhZGRpbmcgfHwgMDtcbiAgdmFyIGlzUGFkZGluZ051bWJlciA9IHR5cGVvZiBwYWRkaW5nID09PSAnbnVtYmVyJztcbiAgYm91bmRhcmllcy5sZWZ0ICs9IGlzUGFkZGluZ051bWJlciA/IHBhZGRpbmcgOiBwYWRkaW5nLmxlZnQgfHwgMDtcbiAgYm91bmRhcmllcy50b3AgKz0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcudG9wIHx8IDA7XG4gIGJvdW5kYXJpZXMucmlnaHQgLT0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcucmlnaHQgfHwgMDtcbiAgYm91bmRhcmllcy5ib3R0b20gLT0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcuYm90dG9tIHx8IDA7XG5cbiAgcmV0dXJuIGJvdW5kYXJpZXM7XG59XG5cbmZ1bmN0aW9uIGdldEFyZWEoX3JlZikge1xuICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG5cbiAgcmV0dXJuIHdpZHRoICogaGVpZ2h0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIGBhdXRvYCBwbGFjZW1lbnQgdG8gdGhlIHBsYWNlbWVudCB3aXRoIG1vcmVcbiAqIGF2YWlsYWJsZSBzcGFjZS5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHBsYWNlbWVudCwgcmVmUmVjdCwgcG9wcGVyLCByZWZlcmVuY2UsIGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiAwO1xuXG4gIGlmIChwbGFjZW1lbnQuaW5kZXhPZignYXV0bycpID09PSAtMSkge1xuICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMocG9wcGVyLCByZWZlcmVuY2UsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KTtcblxuICB2YXIgcmVjdHMgPSB7XG4gICAgdG9wOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogcmVmUmVjdC50b3AgLSBib3VuZGFyaWVzLnRvcFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLnJpZ2h0IC0gcmVmUmVjdC5yaWdodCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuYm90dG9tIC0gcmVmUmVjdC5ib3R0b21cbiAgICB9LFxuICAgIGxlZnQ6IHtcbiAgICAgIHdpZHRoOiByZWZSZWN0LmxlZnQgLSBib3VuZGFyaWVzLmxlZnQsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuaGVpZ2h0XG4gICAgfVxuICB9O1xuXG4gIHZhciBzb3J0ZWRBcmVhcyA9IE9iamVjdC5rZXlzKHJlY3RzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIHJlY3RzW2tleV0sIHtcbiAgICAgIGFyZWE6IGdldEFyZWEocmVjdHNba2V5XSlcbiAgICB9KTtcbiAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLmFyZWEgLSBhLmFyZWE7XG4gIH0pO1xuXG4gIHZhciBmaWx0ZXJlZEFyZWFzID0gc29ydGVkQXJlYXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciB3aWR0aCA9IF9yZWYyLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfcmVmMi5oZWlnaHQ7XG4gICAgcmV0dXJuIHdpZHRoID49IHBvcHBlci5jbGllbnRXaWR0aCAmJiBoZWlnaHQgPj0gcG9wcGVyLmNsaWVudEhlaWdodDtcbiAgfSk7XG5cbiAgdmFyIGNvbXB1dGVkUGxhY2VtZW50ID0gZmlsdGVyZWRBcmVhcy5sZW5ndGggPiAwID8gZmlsdGVyZWRBcmVhc1swXS5rZXkgOiBzb3J0ZWRBcmVhc1swXS5rZXk7XG5cbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIHJldHVybiBjb21wdXRlZFBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGZpeGVkUG9zaXRpb24gLSBpcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgY29tbW9uT2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCBnZXRSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZSkpO1xuICByZXR1cm4gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKHJlZmVyZW5jZSwgY29tbW9uT2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG91dGVyIHNpemVzIG9mIHRoZSBnaXZlbiBlbGVtZW50IChvZmZzZXQgc2l6ZSArIG1hcmdpbnMpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCBjb250YWluaW5nIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRPdXRlclNpemVzKGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICB2YXIgeCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCB8fCAwKSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkJvdHRvbSB8fCAwKTtcbiAgdmFyIHkgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0IHx8IDApICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luUmlnaHQgfHwgMCk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGggKyB5LFxuICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgKyB4XG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgb2YgdGhlIGdpdmVuIG9uZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudFxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHZhciBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBvZmZzZXRzIHRvIHRoZSBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiAtIENTUyBwb3NpdGlvbiB0aGUgUG9wcGVyIHdpbGwgZ2V0IGFwcGxpZWRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIHRoZSBwb3BwZXIgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHMgLSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHBhcmFtIHtTdHJpbmd9IHBsYWNlbWVudCAtIG9uZSBvZiB0aGUgdmFsaWQgcGxhY2VtZW50IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IHBvcHBlck9mZnNldHMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRQb3BwZXJPZmZzZXRzKHBvcHBlciwgcmVmZXJlbmNlT2Zmc2V0cywgcGxhY2VtZW50KSB7XG4gIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIC8vIEdldCBwb3BwZXIgbm9kZSBzaXplc1xuICB2YXIgcG9wcGVyUmVjdCA9IGdldE91dGVyU2l6ZXMocG9wcGVyKTtcblxuICAvLyBBZGQgcG9zaXRpb24sIHdpZHRoIGFuZCBoZWlnaHQgdG8gb3VyIG9mZnNldHMgb2JqZWN0XG4gIHZhciBwb3BwZXJPZmZzZXRzID0ge1xuICAgIHdpZHRoOiBwb3BwZXJSZWN0LndpZHRoLFxuICAgIGhlaWdodDogcG9wcGVyUmVjdC5oZWlnaHRcbiAgfTtcblxuICAvLyBkZXBlbmRpbmcgYnkgdGhlIHBvcHBlciBwbGFjZW1lbnQgd2UgaGF2ZSB0byBjb21wdXRlIGl0cyBvZmZzZXRzIHNsaWdodGx5IGRpZmZlcmVudGx5XG4gIHZhciBpc0hvcml6ID0gWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIG1haW5TaWRlID0gaXNIb3JpeiA/ICd0b3AnIDogJ2xlZnQnO1xuICB2YXIgc2Vjb25kYXJ5U2lkZSA9IGlzSG9yaXogPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgdmFyIHNlY29uZGFyeU1lYXN1cmVtZW50ID0gIWlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgcG9wcGVyT2Zmc2V0c1ttYWluU2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW21haW5TaWRlXSArIHJlZmVyZW5jZU9mZnNldHNbbWVhc3VyZW1lbnRdIC8gMiAtIHBvcHBlclJlY3RbbWVhc3VyZW1lbnRdIC8gMjtcbiAgaWYgKHBsYWNlbWVudCA9PT0gc2Vjb25kYXJ5U2lkZSkge1xuICAgIHBvcHBlck9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW3NlY29uZGFyeVNpZGVdIC0gcG9wcGVyUmVjdFtzZWNvbmRhcnlNZWFzdXJlbWVudF07XG4gIH0gZWxzZSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQoc2Vjb25kYXJ5U2lkZSldO1xuICB9XG5cbiAgcmV0dXJuIHBvcHBlck9mZnNldHM7XG59XG5cbi8qKlxuICogTWltaWNzIHRoZSBgZmluZGAgbWV0aG9kIG9mIEFycmF5XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmQoYXJyLCBjaGVjaykge1xuICAvLyB1c2UgbmF0aXZlIGZpbmQgaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZCkge1xuICAgIHJldHVybiBhcnIuZmluZChjaGVjayk7XG4gIH1cblxuICAvLyB1c2UgYGZpbHRlcmAgdG8gb2J0YWluIHRoZSBzYW1lIGJlaGF2aW9yIG9mIGBmaW5kYFxuICByZXR1cm4gYXJyLmZpbHRlcihjaGVjaylbMF07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIHByb3AsIHZhbHVlKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZEluZGV4IGlmIHN1cHBvcnRlZFxuICBpZiAoQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xuICAgIHJldHVybiBhcnIuZmluZEluZGV4KGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgIHJldHVybiBjdXJbcHJvcF0gPT09IHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXNlIGBmaW5kYCArIGBpbmRleE9mYCBpZiBgZmluZEluZGV4YCBpc24ndCBzdXBwb3J0ZWRcbiAgdmFyIG1hdGNoID0gZmluZChhcnIsIGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqW3Byb3BdID09PSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBhcnIuaW5kZXhPZihtYXRjaCk7XG59XG5cbi8qKlxuICogTG9vcCB0cm91Z2ggdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBydW4gdGhlbSBpbiBvcmRlcixcbiAqIGVhY2ggb2YgdGhlbSB3aWxsIHRoZW4gZWRpdCB0aGUgZGF0YSBvYmplY3QuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGVuZHMgLSBPcHRpb25hbCBtb2RpZmllciBuYW1lIHVzZWQgYXMgc3RvcHBlclxuICogQHJldHVybnMge2RhdGFPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHJ1bk1vZGlmaWVycyhtb2RpZmllcnMsIGRhdGEsIGVuZHMpIHtcbiAgdmFyIG1vZGlmaWVyc1RvUnVuID0gZW5kcyA9PT0gdW5kZWZpbmVkID8gbW9kaWZpZXJzIDogbW9kaWZpZXJzLnNsaWNlKDAsIGZpbmRJbmRleChtb2RpZmllcnMsICduYW1lJywgZW5kcykpO1xuXG4gIG1vZGlmaWVyc1RvUnVuLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKG1vZGlmaWVyWydmdW5jdGlvbiddKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdgbW9kaWZpZXIuZnVuY3Rpb25gIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbW9kaWZpZXIuZm5gIScpO1xuICAgIH1cbiAgICB2YXIgZm4gPSBtb2RpZmllclsnZnVuY3Rpb24nXSB8fCBtb2RpZmllci5mbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICBpZiAobW9kaWZpZXIuZW5hYmxlZCAmJiBpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgLy8gQWRkIHByb3BlcnRpZXMgdG8gb2Zmc2V0cyB0byBtYWtlIHRoZW0gYSBjb21wbGV0ZSBjbGllbnRSZWN0IG9iamVjdFxuICAgICAgLy8gd2UgZG8gdGhpcyBiZWZvcmUgZWFjaCBtb2RpZmllciB0byBtYWtlIHN1cmUgdGhlIHByZXZpb3VzIG9uZSBkb2Vzbid0XG4gICAgICAvLyBtZXNzIHdpdGggdGhlc2UgdmFsdWVzXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcbiAgICAgIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UpO1xuXG4gICAgICBkYXRhID0gZm4oZGF0YSwgbW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvcHBlciwgY29tcHV0aW5nIHRoZSBuZXcgb2Zmc2V0cyBhbmQgYXBwbHlpbmdcbiAqIHRoZSBuZXcgc3R5bGUuPGJyIC8+XG4gKiBQcmVmZXIgYHNjaGVkdWxlVXBkYXRlYCBvdmVyIGB1cGRhdGVgIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gdXBkYXRlKCkge1xuICAvLyBpZiBwb3BwZXIgaXMgZGVzdHJveWVkLCBkb24ndCBwZXJmb3JtIGFueSBmdXJ0aGVyIHVwZGF0ZVxuICBpZiAodGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkYXRhID0ge1xuICAgIGluc3RhbmNlOiB0aGlzLFxuICAgIHN0eWxlczoge30sXG4gICAgYXJyb3dTdHlsZXM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGZsaXBwZWQ6IGZhbHNlLFxuICAgIG9mZnNldHM6IHt9XG4gIH07XG5cbiAgLy8gY29tcHV0ZSByZWZlcmVuY2UgZWxlbWVudCBvZmZzZXRzXG4gIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHRoaXMuc3RhdGUsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICBkYXRhLnBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KHRoaXMub3B0aW9ucy5wbGFjZW1lbnQsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7XG5cbiAgLy8gc3RvcmUgdGhlIGNvbXB1dGVkIHBsYWNlbWVudCBpbnNpZGUgYG9yaWdpbmFsUGxhY2VtZW50YFxuICBkYXRhLm9yaWdpbmFsUGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG5cbiAgZGF0YS5wb3NpdGlvbkZpeGVkID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQ7XG5cbiAgLy8gY29tcHV0ZSB0aGUgcG9wcGVyIG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldFBvcHBlck9mZnNldHModGhpcy5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJztcblxuICAvLyBydW4gdGhlIG1vZGlmaWVyc1xuICBkYXRhID0gcnVuTW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBkYXRhKTtcblxuICAvLyB0aGUgZmlyc3QgYHVwZGF0ZWAgd2lsbCBjYWxsIGBvbkNyZWF0ZWAgY2FsbGJhY2tcbiAgLy8gdGhlIG90aGVyIG9uZXMgd2lsbCBjYWxsIGBvblVwZGF0ZWAgY2FsbGJhY2tcbiAgaWYgKCF0aGlzLnN0YXRlLmlzQ3JlYXRlZCkge1xuICAgIHRoaXMuc3RhdGUuaXNDcmVhdGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wdGlvbnMub25DcmVhdGUoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLm9uVXBkYXRlKGRhdGEpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIHVzZWQgdG8ga25vdyBpZiB0aGUgZ2l2ZW4gbW9kaWZpZXIgaXMgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyRW5hYmxlZChtb2RpZmllcnMsIG1vZGlmaWVyTmFtZSkge1xuICByZXR1cm4gbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgZW5hYmxlZCA9IF9yZWYuZW5hYmxlZDtcbiAgICByZXR1cm4gZW5hYmxlZCAmJiBuYW1lID09PSBtb2RpZmllck5hbWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZml4ZWQgc3VwcG9ydGVkIHByb3BlcnR5IG5hbWVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eSAoY2FtZWxDYXNlKVxuICogQHJldHVybnMge1N0cmluZ30gcHJlZml4ZWQgcHJvcGVydHkgKGNhbWVsQ2FzZSBvciBQYXNjYWxDYXNlLCBkZXBlbmRpbmcgb24gdGhlIHZlbmRvciBwcmVmaXgpXG4gKi9cbmZ1bmN0aW9uIGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZShwcm9wZXJ0eSkge1xuICB2YXIgcHJlZml4ZXMgPSBbZmFsc2UsICdtcycsICdXZWJraXQnLCAnTW96JywgJ08nXTtcbiAgdmFyIHVwcGVyUHJvcCA9IHByb3BlcnR5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcmVmaXggPSBwcmVmaXhlc1tpXTtcbiAgICB2YXIgdG9DaGVjayA9IHByZWZpeCA/ICcnICsgcHJlZml4ICsgdXBwZXJQcm9wIDogcHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3RvQ2hlY2tdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIERlc3Ryb3lzIHRoZSBwb3BwZXIuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gIHRoaXMuc3RhdGUuaXNEZXN0cm95ZWQgPSB0cnVlO1xuXG4gIC8vIHRvdWNoIERPTSBvbmx5IGlmIGBhcHBseVN0eWxlYCBtb2RpZmllciBpcyBlbmFibGVkXG4gIGlmIChpc01vZGlmaWVyRW5hYmxlZCh0aGlzLm1vZGlmaWVycywgJ2FwcGx5U3R5bGUnKSkge1xuICAgIHRoaXMucG9wcGVyLnJlbW92ZUF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKTtcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnRvcCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLmxlZnQgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5yaWdodCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLmJvdHRvbSA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLndpbGxDaGFuZ2UgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZVtnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpXSA9ICcnO1xuICB9XG5cbiAgdGhpcy5kaXNhYmxlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAvLyByZW1vdmUgdGhlIHBvcHBlciBpZiB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIHRoZSBkZWxldGlvbiBvbiBkZXN0cm95XG4gIC8vIGRvIG5vdCB1c2UgYHJlbW92ZWAgYmVjYXVzZSBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpdFxuICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSkge1xuICAgIHRoaXMucG9wcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3BwZXIpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coZWxlbWVudCkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IDogd2luZG93O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsUGFyZW50LCBldmVudCwgY2FsbGJhY2ssIHNjcm9sbFBhcmVudHMpIHtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudC5ub2RlTmFtZSA9PT0gJ0JPRFknO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gc2Nyb2xsUGFyZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiBzY3JvbGxQYXJlbnQ7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIGlmICghaXNCb2R5KSB7XG4gICAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKGdldFNjcm9sbFBhcmVudCh0YXJnZXQucGFyZW50Tm9kZSksIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cyk7XG4gIH1cbiAgc2Nyb2xsUGFyZW50cy5wdXNoKHRhcmdldCk7XG59XG5cbi8qKlxuICogU2V0dXAgbmVlZGVkIGV2ZW50IGxpc3RlbmVycyB1c2VkIHRvIHVwZGF0ZSB0aGUgcG9wcGVyIHBvc2l0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgb3B0aW9ucywgc3RhdGUsIHVwZGF0ZUJvdW5kKSB7XG4gIC8vIFJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgc3RhdGUudXBkYXRlQm91bmQgPSB1cGRhdGVCb3VuZDtcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBTY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgdmFyIHNjcm9sbEVsZW1lbnQgPSBnZXRTY3JvbGxQYXJlbnQocmVmZXJlbmNlKTtcbiAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKHNjcm9sbEVsZW1lbnQsICdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCwgc3RhdGUuc2Nyb2xsUGFyZW50cyk7XG4gIHN0YXRlLnNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50O1xuICBzdGF0ZS5ldmVudHNFbmFibGVkID0gdHJ1ZTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCBhZGQgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHN0YXJ0IHJlY2FsY3VsYXRpbmdcbiAqIHBvc2l0aW9uIG9mIHRoZSBwb3BwZXIgZWxlbWVudCB3aGVuIHRoZXkgYXJlIHRyaWdnZXJlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZW5hYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICghdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMub3B0aW9ucywgdGhpcy5zdGF0ZSwgdGhpcy5zY2hlZHVsZVVwZGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgc3RhdGUpIHtcbiAgLy8gUmVtb3ZlIHJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQpO1xuXG4gIC8vIFJlbW92ZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc3RhdGUudXBkYXRlQm91bmQpO1xuICB9KTtcblxuICAvLyBSZXNldCBzdGF0ZVxuICBzdGF0ZS51cGRhdGVCb3VuZCA9IG51bGw7XG4gIHN0YXRlLnNjcm9sbFBhcmVudHMgPSBbXTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEl0IHdpbGwgcmVtb3ZlIHJlc2l6ZS9zY3JvbGwgZXZlbnRzIGFuZCB3b24ndCByZWNhbGN1bGF0ZSBwb3BwZXIgcG9zaXRpb25cbiAqIHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLiBJdCBhbHNvIHdvbid0IHRyaWdnZXIgYG9uVXBkYXRlYCBjYWxsYmFjayBhbnltb3JlLFxuICogdW5sZXNzIHlvdSBjYWxsIGB1cGRhdGVgIG1ldGhvZCBtYW51YWxseS5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCkge1xuICBpZiAodGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkKSB7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5zdGF0ZSA9IHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMucmVmZXJlbmNlLCB0aGlzLnN0YXRlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIGlmIGEgZ2l2ZW4gaW5wdXQgaXMgYSBudW1iZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7Kn0gaW5wdXQgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTnVtZXJpYyhuKSB7XG4gIHJldHVybiBuICE9PSAnJyAmJiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XG59XG5cbi8qKlxuICogU2V0IHRoZSBzdHlsZSB0byB0aGUgZ2l2ZW4gcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFwcGx5IHRoZSBzdHlsZSB0b1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHN0eWxlc1xuICogT2JqZWN0IHdpdGggYSBsaXN0IG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICB2YXIgdW5pdCA9ICcnO1xuICAgIC8vIGFkZCB1bml0IGlmIHRoZSB2YWx1ZSBpcyBudW1lcmljIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICAgIGlmIChbJ3dpZHRoJywgJ2hlaWdodCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5pbmRleE9mKHByb3ApICE9PSAtMSAmJiBpc051bWVyaWMoc3R5bGVzW3Byb3BdKSkge1xuICAgICAgdW5pdCA9ICdweCc7XG4gICAgfVxuICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBzdHlsZXNbcHJvcF0gKyB1bml0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGdpdmVuIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSB0aGUgYXR0cmlidXRlcyB0b1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHN0eWxlc1xuICogT2JqZWN0IHdpdGggYSBsaXN0IG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW3Byb3BdO1xuICAgIGlmICh2YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHByb3AsIGF0dHJpYnV0ZXNbcHJvcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEuc3R5bGVzIC0gTGlzdCBvZiBzdHlsZSBwcm9wZXJ0aWVzIC0gdmFsdWVzIHRvIGFwcGx5IHRvIHBvcHBlciBlbGVtZW50XG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YS5hdHRyaWJ1dGVzIC0gTGlzdCBvZiBhdHRyaWJ1dGUgcHJvcGVydGllcyAtIHZhbHVlcyB0byBhcHBseSB0byBwb3BwZXIgZWxlbWVudFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIHNhbWUgZGF0YSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZShkYXRhKSB7XG4gIC8vIGFueSBwcm9wZXJ0eSBwcmVzZW50IGluIGBkYXRhLnN0eWxlc2Agd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIsXG4gIC8vIGluIHRoaXMgd2F5IHdlIGNhbiBtYWtlIHRoZSAzcmQgcGFydHkgbW9kaWZpZXJzIGFkZCBjdXN0b20gc3R5bGVzIHRvIGl0XG4gIC8vIEJlIGF3YXJlLCBtb2RpZmllcnMgY291bGQgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgcHJldmlvdXNcbiAgLy8gbGluZXMgb2YgdGhpcyBtb2RpZmllciFcbiAgc2V0U3R5bGVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLnN0eWxlcyk7XG5cbiAgLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuYXR0cmlidXRlc2Agd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIsXG4gIC8vIHRoZXkgd2lsbCBiZSBzZXQgYXMgSFRNTCBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50XG4gIHNldEF0dHJpYnV0ZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuYXR0cmlidXRlcyk7XG5cbiAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIGRlZmluZWQgYW5kIGFycm93U3R5bGVzIGhhcyBzb21lIHByb3BlcnRpZXNcbiAgaWYgKGRhdGEuYXJyb3dFbGVtZW50ICYmIE9iamVjdC5rZXlzKGRhdGEuYXJyb3dTdHlsZXMpLmxlbmd0aCkge1xuICAgIHNldFN0eWxlcyhkYXRhLmFycm93RWxlbWVudCwgZGF0YS5hcnJvd1N0eWxlcyk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHgtcGxhY2VtZW50IGF0dHJpYnV0ZSBiZWZvcmUgZXZlcnl0aGluZyBlbHNlIGJlY2F1c2UgaXQgY291bGQgYmUgdXNlZFxuICogdG8gYWRkIG1hcmdpbnMgdG8gdGhlIHBvcHBlciBtYXJnaW5zIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgdG8gZ2V0IHRoZVxuICogY29ycmVjdCBwb3BwZXIgb2Zmc2V0cy5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXIgLSBUaGUgSFRNTCBlbGVtZW50IHVzZWQgYXMgcG9wcGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFBvcHBlci5qcyBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U3R5bGVPbkxvYWQocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMsIG1vZGlmaWVyT3B0aW9ucywgc3RhdGUpIHtcbiAgLy8gY29tcHV0ZSByZWZlcmVuY2UgZWxlbWVudCBvZmZzZXRzXG4gIHZhciByZWZlcmVuY2VPZmZzZXRzID0gZ2V0UmVmZXJlbmNlT2Zmc2V0cyhzdGF0ZSwgcG9wcGVyLCByZWZlcmVuY2UsIG9wdGlvbnMucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gY29tcHV0ZSBhdXRvIHBsYWNlbWVudCwgc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsXG4gIC8vIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWRcbiAgLy8gYW5kIHJlZmVyIHRvIG9yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gIHZhciBwbGFjZW1lbnQgPSBjb21wdXRlQXV0b1BsYWNlbWVudChvcHRpb25zLnBsYWNlbWVudCwgcmVmZXJlbmNlT2Zmc2V0cywgcG9wcGVyLCByZWZlcmVuY2UsIG9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsIG9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7XG5cbiAgcG9wcGVyLnNldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnLCBwbGFjZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGBwb3NpdGlvbmAgdG8gcG9wcGVyIGJlZm9yZSBhbnl0aGluZyBlbHNlIGJlY2F1c2VcbiAgLy8gd2l0aG91dCB0aGUgcG9zaXRpb24gYXBwbGllZCB3ZSBjYW4ndCBndWFyYW50ZWUgY29ycmVjdCBjb21wdXRhdGlvbnNcbiAgc2V0U3R5bGVzKHBvcHBlciwgeyBwb3NpdGlvbjogb3B0aW9ucy5wb3NpdGlvbkZpeGVkID8gJ2ZpeGVkJyA6ICdhYnNvbHV0ZScgfSk7XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge0Jvb2xlYW59IHNob3VsZFJvdW5kIC0gSWYgdGhlIG9mZnNldHMgc2hvdWxkIGJlIHJvdW5kZWQgYXQgYWxsXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcG9wcGVyJ3MgcG9zaXRpb24gb2Zmc2V0cyByb3VuZGVkXG4gKlxuICogVGhlIHRhbGUgb2YgcGl4ZWwtcGVyZmVjdCBwb3NpdGlvbmluZy4gSXQncyBzdGlsbCBub3QgMTAwJSBwZXJmZWN0LCBidXQgYXNcbiAqIGdvb2QgYXMgaXQgY2FuIGJlIHdpdGhpbiByZWFzb24uXG4gKiBEaXNjdXNzaW9uIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL3B1bGwvNzE1XG4gKlxuICogTG93IERQSSBzY3JlZW5zIGNhdXNlIGEgcG9wcGVyIHRvIGJlIGJsdXJyeSBpZiBub3QgdXNpbmcgZnVsbCBwaXhlbHMgKFNhZmFyaVxuICogYXMgd2VsbCBvbiBIaWdoIERQSSBzY3JlZW5zKS5cbiAqXG4gKiBGaXJlZm94IHByZWZlcnMgbm8gcm91bmRpbmcgZm9yIHBvc2l0aW9uaW5nIGFuZCBkb2VzIG5vdCBoYXZlIGJsdXJyaW5lc3Mgb25cbiAqIGhpZ2ggRFBJIHNjcmVlbnMuXG4gKlxuICogT25seSBob3Jpem9udGFsIHBsYWNlbWVudCBhbmQgbGVmdC9yaWdodCB2YWx1ZXMgbmVlZCB0byBiZSBjb25zaWRlcmVkLlxuICovXG5mdW5jdGlvbiBnZXRSb3VuZGVkT2Zmc2V0cyhkYXRhLCBzaG91bGRSb3VuZCkge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG4gIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICBmbG9vciA9IE1hdGguZmxvb3I7XG5cbiAgdmFyIG5vUm91bmQgPSBmdW5jdGlvbiBub1JvdW5kKHYpIHtcbiAgICByZXR1cm4gdjtcbiAgfTtcblxuICB2YXIgcmVmZXJlbmNlV2lkdGggPSByb3VuZChyZWZlcmVuY2Uud2lkdGgpO1xuICB2YXIgcG9wcGVyV2lkdGggPSByb3VuZChwb3BwZXIud2lkdGgpO1xuXG4gIHZhciBpc1ZlcnRpY2FsID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihkYXRhLnBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgaXNWYXJpYXRpb24gPSBkYXRhLnBsYWNlbWVudC5pbmRleE9mKCctJykgIT09IC0xO1xuICB2YXIgc2FtZVdpZHRoUGFyaXR5ID0gcmVmZXJlbmNlV2lkdGggJSAyID09PSBwb3BwZXJXaWR0aCAlIDI7XG4gIHZhciBib3RoT2RkV2lkdGggPSByZWZlcmVuY2VXaWR0aCAlIDIgPT09IDEgJiYgcG9wcGVyV2lkdGggJSAyID09PSAxO1xuXG4gIHZhciBob3Jpem9udGFsVG9JbnRlZ2VyID0gIXNob3VsZFJvdW5kID8gbm9Sb3VuZCA6IGlzVmVydGljYWwgfHwgaXNWYXJpYXRpb24gfHwgc2FtZVdpZHRoUGFyaXR5ID8gcm91bmQgOiBmbG9vcjtcbiAgdmFyIHZlcnRpY2FsVG9JbnRlZ2VyID0gIXNob3VsZFJvdW5kID8gbm9Sb3VuZCA6IHJvdW5kO1xuXG4gIHJldHVybiB7XG4gICAgbGVmdDogaG9yaXpvbnRhbFRvSW50ZWdlcihib3RoT2RkV2lkdGggJiYgIWlzVmFyaWF0aW9uICYmIHNob3VsZFJvdW5kID8gcG9wcGVyLmxlZnQgLSAxIDogcG9wcGVyLmxlZnQpLFxuICAgIHRvcDogdmVydGljYWxUb0ludGVnZXIocG9wcGVyLnRvcCksXG4gICAgYm90dG9tOiB2ZXJ0aWNhbFRvSW50ZWdlcihwb3BwZXIuYm90dG9tKSxcbiAgICByaWdodDogaG9yaXpvbnRhbFRvSW50ZWdlcihwb3BwZXIucmlnaHQpXG4gIH07XG59XG5cbnZhciBpc0ZpcmVmb3ggPSBpc0Jyb3dzZXIgJiYgL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBjb21wdXRlU3R5bGUoZGF0YSwgb3B0aW9ucykge1xuICB2YXIgeCA9IG9wdGlvbnMueCxcbiAgICAgIHkgPSBvcHRpb25zLnk7XG4gIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlZ2FjeSBzdXBwb3J0IGluIFBvcHBlci5qcyB2MlxuXG4gIHZhciBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ2FwcGx5U3R5bGUnO1xuICB9KS5ncHVBY2NlbGVyYXRpb247XG4gIGlmIChsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGdwdUFjY2VsZXJhdGlvbmAgb3B0aW9uIG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFBvcHBlci5qcyEnKTtcbiAgfVxuICB2YXIgZ3B1QWNjZWxlcmF0aW9uID0gbGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uICE9PSB1bmRlZmluZWQgPyBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gOiBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbjtcblxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIG9mZnNldFBhcmVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcblxuICAvLyBTdHlsZXNcbiAgdmFyIHN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbjogcG9wcGVyLnBvc2l0aW9uXG4gIH07XG5cbiAgdmFyIG9mZnNldHMgPSBnZXRSb3VuZGVkT2Zmc2V0cyhkYXRhLCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA8IDIgfHwgIWlzRmlyZWZveCk7XG5cbiAgdmFyIHNpZGVBID0geCA9PT0gJ2JvdHRvbScgPyAndG9wJyA6ICdib3R0b20nO1xuICB2YXIgc2lkZUIgPSB5ID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcblxuICAvLyBpZiBncHVBY2NlbGVyYXRpb24gaXMgc2V0IHRvIGB0cnVlYCBhbmQgdHJhbnNmb3JtIGlzIHN1cHBvcnRlZCxcbiAgLy8gIHdlIHVzZSBgdHJhbnNsYXRlM2RgIHRvIGFwcGx5IHRoZSBwb3NpdGlvbiB0byB0aGUgcG9wcGVyIHdlXG4gIC8vIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBzdXBwb3J0ZWQgcHJlZml4ZWQgdmVyc2lvbiBpZiBuZWVkZWRcbiAgdmFyIHByZWZpeGVkUHJvcGVydHkgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpO1xuXG4gIC8vIG5vdywgbGV0J3MgbWFrZSBhIHN0ZXAgYmFjayBhbmQgbG9vayBhdCB0aGlzIGNvZGUgY2xvc2VseSAod3RmPylcbiAgLy8gSWYgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcHBlciBncm93cyBvbmNlIGl0J3MgYmVlbiBwb3NpdGlvbmVkLCBpdFxuICAvLyBtYXkgaGFwcGVuIHRoYXQgdGhlIHBvcHBlciBnZXRzIG1pc3BsYWNlZCBiZWNhdXNlIG9mIHRoZSBuZXcgY29udGVudFxuICAvLyBvdmVyZmxvd2luZyBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBwcm92aWRlIHR3byBvcHRpb25zICh4IGFuZCB5KSwgd2hpY2ggYWxsb3dcbiAgLy8gdGhlIGNvbnN1bWVyIHRvIGRlZmluZSB0aGUgb2Zmc2V0IG9yaWdpbi5cbiAgLy8gSWYgd2UgcG9zaXRpb24gYSBwb3BwZXIgb24gdG9wIG9mIGEgcmVmZXJlbmNlIGVsZW1lbnQsIHdlIGNhbiBzZXRcbiAgLy8gYHhgIHRvIGB0b3BgIHRvIG1ha2UgdGhlIHBvcHBlciBncm93IHRvd2FyZHMgaXRzIHRvcCBpbnN0ZWFkIG9mXG4gIC8vIGl0cyBib3R0b20uXG4gIHZhciBsZWZ0ID0gdm9pZCAwLFxuICAgICAgdG9wID0gdm9pZCAwO1xuICBpZiAoc2lkZUEgPT09ICdib3R0b20nKSB7XG4gICAgLy8gd2hlbiBvZmZzZXRQYXJlbnQgaXMgPGh0bWw+IHRoZSBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0byB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gKGV4Y2x1ZGluZyB0aGUgc2Nyb2xsYmFyKVxuICAgIC8vIGFuZCBub3QgdGhlIGJvdHRvbSBvZiB0aGUgaHRtbCBlbGVtZW50XG4gICAgaWYgKG9mZnNldFBhcmVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICB0b3AgPSAtb2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCArIG9mZnNldHMuYm90dG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3AgPSAtb2Zmc2V0UGFyZW50UmVjdC5oZWlnaHQgKyBvZmZzZXRzLmJvdHRvbTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9wID0gb2Zmc2V0cy50b3A7XG4gIH1cbiAgaWYgKHNpZGVCID09PSAncmlnaHQnKSB7XG4gICAgaWYgKG9mZnNldFBhcmVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICBsZWZ0ID0gLW9mZnNldFBhcmVudC5jbGllbnRXaWR0aCArIG9mZnNldHMucmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSAtb2Zmc2V0UGFyZW50UmVjdC53aWR0aCArIG9mZnNldHMucmlnaHQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlZnQgPSBvZmZzZXRzLmxlZnQ7XG4gIH1cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbiAmJiBwcmVmaXhlZFByb3BlcnR5KSB7XG4gICAgc3R5bGVzW3ByZWZpeGVkUHJvcGVydHldID0gJ3RyYW5zbGF0ZTNkKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4LCAwKSc7XG4gICAgc3R5bGVzW3NpZGVBXSA9IDA7XG4gICAgc3R5bGVzW3NpZGVCXSA9IDA7XG4gICAgc3R5bGVzLndpbGxDaGFuZ2UgPSAndHJhbnNmb3JtJztcbiAgfSBlbHNlIHtcbiAgICAvLyBvdGh3ZXJpc2UsIHdlIHVzZSB0aGUgc3RhbmRhcmQgYHRvcGAsIGBsZWZ0YCwgYGJvdHRvbWAgYW5kIGByaWdodGAgcHJvcGVydGllc1xuICAgIHZhciBpbnZlcnRUb3AgPSBzaWRlQSA9PT0gJ2JvdHRvbScgPyAtMSA6IDE7XG4gICAgdmFyIGludmVydExlZnQgPSBzaWRlQiA9PT0gJ3JpZ2h0JyA/IC0xIDogMTtcbiAgICBzdHlsZXNbc2lkZUFdID0gdG9wICogaW52ZXJ0VG9wO1xuICAgIHN0eWxlc1tzaWRlQl0gPSBsZWZ0ICogaW52ZXJ0TGVmdDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9IHNpZGVBICsgJywgJyArIHNpZGVCO1xuICB9XG5cbiAgLy8gQXR0cmlidXRlc1xuICB2YXIgYXR0cmlidXRlcyA9IHtcbiAgICAneC1wbGFjZW1lbnQnOiBkYXRhLnBsYWNlbWVudFxuICB9O1xuXG4gIC8vIFVwZGF0ZSBgZGF0YWAgYXR0cmlidXRlcywgc3R5bGVzIGFuZCBhcnJvd1N0eWxlc1xuICBkYXRhLmF0dHJpYnV0ZXMgPSBfZXh0ZW5kcyh7fSwgYXR0cmlidXRlcywgZGF0YS5hdHRyaWJ1dGVzKTtcbiAgZGF0YS5zdHlsZXMgPSBfZXh0ZW5kcyh7fSwgc3R5bGVzLCBkYXRhLnN0eWxlcyk7XG4gIGRhdGEuYXJyb3dTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLmFycm93LCBkYXRhLmFycm93U3R5bGVzKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBkZXBlbmRzIGZyb20gYW5vdGhlciBvbmUuPGJyIC8+XG4gKiBJdCBjaGVja3MgaWYgdGhlIG5lZWRlZCBtb2RpZmllciBpcyBsaXN0ZWQgYW5kIGVuYWJsZWQuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnMgLSBsaXN0IG9mIG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RpbmdOYW1lIC0gbmFtZSBvZiByZXF1ZXN0aW5nIG1vZGlmaWVyXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGVkTmFtZSAtIG5hbWUgb2YgcmVxdWVzdGVkIG1vZGlmaWVyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNNb2RpZmllclJlcXVpcmVkKG1vZGlmaWVycywgcmVxdWVzdGluZ05hbWUsIHJlcXVlc3RlZE5hbWUpIHtcbiAgdmFyIHJlcXVlc3RpbmcgPSBmaW5kKG1vZGlmaWVycywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICByZXR1cm4gbmFtZSA9PT0gcmVxdWVzdGluZ05hbWU7XG4gIH0pO1xuXG4gIHZhciBpc1JlcXVpcmVkID0gISFyZXF1ZXN0aW5nICYmIG1vZGlmaWVycy5zb21lKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSByZXF1ZXN0ZWROYW1lICYmIG1vZGlmaWVyLmVuYWJsZWQgJiYgbW9kaWZpZXIub3JkZXIgPCByZXF1ZXN0aW5nLm9yZGVyO1xuICB9KTtcblxuICBpZiAoIWlzUmVxdWlyZWQpIHtcbiAgICB2YXIgX3JlcXVlc3RpbmcgPSAnYCcgKyByZXF1ZXN0aW5nTmFtZSArICdgJztcbiAgICB2YXIgcmVxdWVzdGVkID0gJ2AnICsgcmVxdWVzdGVkTmFtZSArICdgJztcbiAgICBjb25zb2xlLndhcm4ocmVxdWVzdGVkICsgJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnICsgX3JlcXVlc3RpbmcgKyAnIG1vZGlmaWVyIGluIG9yZGVyIHRvIHdvcmssIGJlIHN1cmUgdG8gaW5jbHVkZSBpdCBiZWZvcmUgJyArIF9yZXF1ZXN0aW5nICsgJyEnKTtcbiAgfVxuICByZXR1cm4gaXNSZXF1aXJlZDtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGFycm93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMkYXJyb3c7XG5cbiAgLy8gYXJyb3cgZGVwZW5kcyBvbiBrZWVwVG9nZXRoZXIgaW4gb3JkZXIgdG8gd29ya1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2Fycm93JywgJ2tlZXBUb2dldGhlcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYXJyb3dFbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBhIHN0cmluZywgc3VwcG9zZSBpdCdzIGEgQ1NTIHNlbGVjdG9yXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIC8vIGlmIGFycm93RWxlbWVudCBpcyBub3QgZm91bmQsIGRvbid0IHJ1biB0aGUgbW9kaWZpZXJcbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGlmIHRoZSBhcnJvd0VsZW1lbnQgaXNuJ3QgYSBxdWVyeSBzZWxlY3RvciB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhlXG4gICAgLy8gcHJvdmlkZWQgRE9NIG5vZGUgaXMgY2hpbGQgb2YgaXRzIHBvcHBlciBub2RlXG4gICAgaWYgKCFkYXRhLmluc3RhbmNlLnBvcHBlci5jb250YWlucyhhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBhcnJvdy5lbGVtZW50YCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXIgZWxlbWVudCEnKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2lkZUNhcGl0YWxpemVkID0gaXNWZXJ0aWNhbCA/ICdUb3AnIDogJ0xlZnQnO1xuICB2YXIgc2lkZSA9IHNpZGVDYXBpdGFsaXplZC50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYWx0U2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gIHZhciBhcnJvd0VsZW1lbnRTaXplID0gZ2V0T3V0ZXJTaXplcyhhcnJvd0VsZW1lbnQpW2xlbl07XG5cbiAgLy9cbiAgLy8gZXh0ZW5kcyBrZWVwVG9nZXRoZXIgYmVoYXZpb3IgbWFraW5nIHN1cmUgdGhlIHBvcHBlciBhbmQgaXRzXG4gIC8vIHJlZmVyZW5jZSBoYXZlIGVub3VnaCBwaXhlbHMgaW4gY29uanVuY3Rpb25cbiAgLy9cblxuICAvLyB0b3AvbGVmdCBzaWRlXG4gIGlmIChyZWZlcmVuY2Vbb3BTaWRlXSAtIGFycm93RWxlbWVudFNpemUgPCBwb3BwZXJbc2lkZV0pIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdIC09IHBvcHBlcltzaWRlXSAtIChyZWZlcmVuY2Vbb3BTaWRlXSAtIGFycm93RWxlbWVudFNpemUpO1xuICB9XG4gIC8vIGJvdHRvbS9yaWdodCBzaWRlXG4gIGlmIChyZWZlcmVuY2Vbc2lkZV0gKyBhcnJvd0VsZW1lbnRTaXplID4gcG9wcGVyW29wU2lkZV0pIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdICs9IHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgLSBwb3BwZXJbb3BTaWRlXTtcbiAgfVxuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcblxuICAvLyBjb21wdXRlIGNlbnRlciBvZiB0aGUgcG9wcGVyXG4gIHZhciBjZW50ZXIgPSByZWZlcmVuY2Vbc2lkZV0gKyByZWZlcmVuY2VbbGVuXSAvIDIgLSBhcnJvd0VsZW1lbnRTaXplIC8gMjtcblxuICAvLyBDb21wdXRlIHRoZSBzaWRlVmFsdWUgdXNpbmcgdGhlIHVwZGF0ZWQgcG9wcGVyIG9mZnNldHNcbiAgLy8gdGFrZSBwb3BwZXIgbWFyZ2luIGluIGFjY291bnQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoaXMgaW5mbyBhdmFpbGFibGVcbiAgdmFyIGNzcyA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShkYXRhLmluc3RhbmNlLnBvcHBlcik7XG4gIHZhciBwb3BwZXJNYXJnaW5TaWRlID0gcGFyc2VGbG9hdChjc3NbJ21hcmdpbicgKyBzaWRlQ2FwaXRhbGl6ZWRdKTtcbiAgdmFyIHBvcHBlckJvcmRlclNpZGUgPSBwYXJzZUZsb2F0KGNzc1snYm9yZGVyJyArIHNpZGVDYXBpdGFsaXplZCArICdXaWR0aCddKTtcbiAgdmFyIHNpZGVWYWx1ZSA9IGNlbnRlciAtIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLSBwb3BwZXJNYXJnaW5TaWRlIC0gcG9wcGVyQm9yZGVyU2lkZTtcblxuICAvLyBwcmV2ZW50IGFycm93RWxlbWVudCBmcm9tIGJlaW5nIHBsYWNlZCBub3QgY29udGlndW91c2x5IHRvIGl0cyBwb3BwZXJcbiAgc2lkZVZhbHVlID0gTWF0aC5tYXgoTWF0aC5taW4ocG9wcGVyW2xlbl0gLSBhcnJvd0VsZW1lbnRTaXplLCBzaWRlVmFsdWUpLCAwKTtcblxuICBkYXRhLmFycm93RWxlbWVudCA9IGFycm93RWxlbWVudDtcbiAgZGF0YS5vZmZzZXRzLmFycm93ID0gKF9kYXRhJG9mZnNldHMkYXJyb3cgPSB7fSwgZGVmaW5lUHJvcGVydHkoX2RhdGEkb2Zmc2V0cyRhcnJvdywgc2lkZSwgTWF0aC5yb3VuZChzaWRlVmFsdWUpKSwgZGVmaW5lUHJvcGVydHkoX2RhdGEkb2Zmc2V0cyRhcnJvdywgYWx0U2lkZSwgJycpLCBfZGF0YSRvZmZzZXRzJGFycm93KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9wcG9zaXRlIHBsYWNlbWVudCB2YXJpYXRpb24gb2YgdGhlIGdpdmVuIG9uZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudCB2YXJpYXRpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9IGZsaXBwZWQgcGxhY2VtZW50IHZhcmlhdGlvblxuICovXG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvbih2YXJpYXRpb24pIHtcbiAgaWYgKHZhcmlhdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICByZXR1cm4gJ3N0YXJ0JztcbiAgfSBlbHNlIGlmICh2YXJpYXRpb24gPT09ICdzdGFydCcpIHtcbiAgICByZXR1cm4gJ2VuZCc7XG4gIH1cbiAgcmV0dXJuIHZhcmlhdGlvbjtcbn1cblxuLyoqXG4gKiBMaXN0IG9mIGFjY2VwdGVkIHBsYWNlbWVudHMgdG8gdXNlIGFzIHZhbHVlcyBvZiB0aGUgYHBsYWNlbWVudGAgb3B0aW9uLjxiciAvPlxuICogVmFsaWQgcGxhY2VtZW50cyBhcmU6XG4gKiAtIGBhdXRvYFxuICogLSBgdG9wYFxuICogLSBgcmlnaHRgXG4gKiAtIGBib3R0b21gXG4gKiAtIGBsZWZ0YFxuICpcbiAqIEVhY2ggcGxhY2VtZW50IGNhbiBoYXZlIGEgdmFyaWF0aW9uIGZyb20gdGhpcyBsaXN0OlxuICogLSBgLXN0YXJ0YFxuICogLSBgLWVuZGBcbiAqXG4gKiBWYXJpYXRpb25zIGFyZSBpbnRlcnByZXRlZCBlYXNpbHkgaWYgeW91IHRoaW5rIG9mIHRoZW0gYXMgdGhlIGxlZnQgdG8gcmlnaHRcbiAqIHdyaXR0ZW4gbGFuZ3VhZ2VzLiBIb3Jpem9udGFsbHkgKGB0b3BgIGFuZCBgYm90dG9tYCksIGBzdGFydGAgaXMgbGVmdCBhbmQgYGVuZGBcbiAqIGlzIHJpZ2h0LjxiciAvPlxuICogVmVydGljYWxseSAoYGxlZnRgIGFuZCBgcmlnaHRgKSwgYHN0YXJ0YCBpcyB0b3AgYW5kIGBlbmRgIGlzIGJvdHRvbS5cbiAqXG4gKiBTb21lIHZhbGlkIGV4YW1wbGVzIGFyZTpcbiAqIC0gYHRvcC1lbmRgIChvbiB0b3Agb2YgcmVmZXJlbmNlLCByaWdodCBhbGlnbmVkKVxuICogLSBgcmlnaHQtc3RhcnRgIChvbiByaWdodCBvZiByZWZlcmVuY2UsIHRvcCBhbGlnbmVkKVxuICogLSBgYm90dG9tYCAob24gYm90dG9tLCBjZW50ZXJlZClcbiAqIC0gYGF1dG8tZW5kYCAob24gdGhlIHNpZGUgd2l0aCBtb3JlIHNwYWNlIGF2YWlsYWJsZSwgYWxpZ25tZW50IGRlcGVuZHMgYnkgcGxhY2VtZW50KVxuICpcbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtBcnJheX1cbiAqIEBlbnVtIHtTdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZXRob2QgcGxhY2VtZW50c1xuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG52YXIgcGxhY2VtZW50cyA9IFsnYXV0by1zdGFydCcsICdhdXRvJywgJ2F1dG8tZW5kJywgJ3RvcC1zdGFydCcsICd0b3AnLCAndG9wLWVuZCcsICdyaWdodC1zdGFydCcsICdyaWdodCcsICdyaWdodC1lbmQnLCAnYm90dG9tLWVuZCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2xlZnQtZW5kJywgJ2xlZnQnLCAnbGVmdC1zdGFydCddO1xuXG4vLyBHZXQgcmlkIG9mIGBhdXRvYCBgYXV0by1zdGFydGAgYW5kIGBhdXRvLWVuZGBcbnZhciB2YWxpZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLnNsaWNlKDMpO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluaXRpYWwgcGxhY2VtZW50LCByZXR1cm5zIGFsbCB0aGUgc3Vic2VxdWVudCBwbGFjZW1lbnRzXG4gKiBjbG9ja3dpc2UgKG9yIGNvdW50ZXItY2xvY2t3aXNlKS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IC0gQSB2YWxpZCBwbGFjZW1lbnQgKGl0IGFjY2VwdHMgdmFyaWF0aW9ucylcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gY291bnRlciAtIFNldCB0byB0cnVlIHRvIHdhbGsgdGhlIHBsYWNlbWVudHMgY291bnRlcmNsb2Nrd2lzZVxuICogQHJldHVybnMge0FycmF5fSBwbGFjZW1lbnRzIGluY2x1ZGluZyB0aGVpciB2YXJpYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGNsb2Nrd2lzZShwbGFjZW1lbnQpIHtcbiAgdmFyIGNvdW50ZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBpbmRleCA9IHZhbGlkUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCk7XG4gIHZhciBhcnIgPSB2YWxpZFBsYWNlbWVudHMuc2xpY2UoaW5kZXggKyAxKS5jb25jYXQodmFsaWRQbGFjZW1lbnRzLnNsaWNlKDAsIGluZGV4KSk7XG4gIHJldHVybiBjb3VudGVyID8gYXJyLnJldmVyc2UoKSA6IGFycjtcbn1cblxudmFyIEJFSEFWSU9SUyA9IHtcbiAgRkxJUDogJ2ZsaXAnLFxuICBDTE9DS1dJU0U6ICdjbG9ja3dpc2UnLFxuICBDT1VOVEVSQ0xPQ0tXSVNFOiAnY291bnRlcmNsb2Nrd2lzZSdcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBmbGlwKGRhdGEsIG9wdGlvbnMpIHtcbiAgLy8gaWYgYGlubmVyYCBtb2RpZmllciBpcyBlbmFibGVkLCB3ZSBjYW4ndCB1c2UgdGhlIGBmbGlwYCBtb2RpZmllclxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdpbm5lcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoZGF0YS5mbGlwcGVkICYmIGRhdGEucGxhY2VtZW50ID09PSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50KSB7XG4gICAgLy8gc2VlbXMgbGlrZSBmbGlwIGlzIHRyeWluZyB0byBsb29wLCBwcm9iYWJseSB0aGVyZSdzIG5vdCBlbm91Z2ggc3BhY2Ugb24gYW55IG9mIHRoZSBmbGlwcGFibGUgc2lkZXNcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UsIG9wdGlvbnMucGFkZGluZywgb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMV0gfHwgJyc7XG5cbiAgdmFyIGZsaXBPcmRlciA9IFtdO1xuXG4gIHN3aXRjaCAob3B0aW9ucy5iZWhhdmlvcikge1xuICAgIGNhc2UgQkVIQVZJT1JTLkZMSVA6XG4gICAgICBmbGlwT3JkZXIgPSBbcGxhY2VtZW50LCBwbGFjZW1lbnRPcHBvc2l0ZV07XG4gICAgICBicmVhaztcbiAgICBjYXNlIEJFSEFWSU9SUy5DTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNPVU5URVJDTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50LCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmbGlwT3JkZXIgPSBvcHRpb25zLmJlaGF2aW9yO1xuICB9XG5cbiAgZmxpcE9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHN0ZXAsIGluZGV4KSB7XG4gICAgaWYgKHBsYWNlbWVudCAhPT0gc3RlcCB8fCBmbGlwT3JkZXIubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gICAgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIHBvcHBlck9mZnNldHMgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuICAgIHZhciByZWZPZmZzZXRzID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcblxuICAgIC8vIHVzaW5nIGZsb29yIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBvZmZzZXRzIG1heSBjb250YWluIGRlY2ltYWxzIHdlIGFyZSBub3QgZ29pbmcgdG8gY29uc2lkZXIgaGVyZVxuICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gICAgdmFyIG92ZXJsYXBzUmVmID0gcGxhY2VtZW50ID09PSAnbGVmdCcgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihyZWZPZmZzZXRzLmxlZnQpIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmxlZnQpIDwgZmxvb3IocmVmT2Zmc2V0cy5yaWdodCkgfHwgcGxhY2VtZW50ID09PSAndG9wJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihyZWZPZmZzZXRzLnRvcCkgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnRvcCkgPCBmbG9vcihyZWZPZmZzZXRzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzTGVmdCA9IGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihib3VuZGFyaWVzLmxlZnQpO1xuICAgIHZhciBvdmVyZmxvd3NSaWdodCA9IGZsb29yKHBvcHBlck9mZnNldHMucmlnaHQpID4gZmxvb3IoYm91bmRhcmllcy5yaWdodCk7XG4gICAgdmFyIG92ZXJmbG93c1RvcCA9IGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKGJvdW5kYXJpZXMudG9wKTtcbiAgICB2YXIgb3ZlcmZsb3dzQm90dG9tID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5ib3R0b20pID4gZmxvb3IoYm91bmRhcmllcy5ib3R0b20pO1xuXG4gICAgdmFyIG92ZXJmbG93c0JvdW5kYXJpZXMgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBvdmVyZmxvd3NMZWZ0IHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBvdmVyZmxvd3NSaWdodCB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIG92ZXJmbG93c1RvcCB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIG92ZXJmbG93c0JvdHRvbTtcblxuICAgIC8vIGZsaXAgdGhlIHZhcmlhdGlvbiBpZiByZXF1aXJlZFxuICAgIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIC8vIGZsaXBzIHZhcmlhdGlvbiBpZiByZWZlcmVuY2UgZWxlbWVudCBvdmVyZmxvd3MgYm91bmRhcmllc1xuICAgIHZhciBmbGlwcGVkVmFyaWF0aW9uQnlSZWYgPSAhIW9wdGlvbnMuZmxpcFZhcmlhdGlvbnMgJiYgKGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c0xlZnQgfHwgaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c1JpZ2h0IHx8ICFpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ3N0YXJ0JyAmJiBvdmVyZmxvd3NUb3AgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NCb3R0b20pO1xuXG4gICAgLy8gZmxpcHMgdmFyaWF0aW9uIGlmIHBvcHBlciBjb250ZW50IG92ZXJmbG93cyBib3VuZGFyaWVzXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb25CeUNvbnRlbnQgPSAhIW9wdGlvbnMuZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQgJiYgKGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1JpZ2h0IHx8IGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NMZWZ0IHx8ICFpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ3N0YXJ0JyAmJiBvdmVyZmxvd3NCb3R0b20gfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NUb3ApO1xuXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb24gPSBmbGlwcGVkVmFyaWF0aW9uQnlSZWYgfHwgZmxpcHBlZFZhcmlhdGlvbkJ5Q29udGVudDtcblxuICAgIGlmIChvdmVybGFwc1JlZiB8fCBvdmVyZmxvd3NCb3VuZGFyaWVzIHx8IGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgIC8vIHRoaXMgYm9vbGVhbiB0byBkZXRlY3QgYW55IGZsaXAgbG9vcFxuICAgICAgZGF0YS5mbGlwcGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gZmxpcE9yZGVyW2luZGV4ICsgMV07XG4gICAgICB9XG5cbiAgICAgIGlmIChmbGlwcGVkVmFyaWF0aW9uKSB7XG4gICAgICAgIHZhcmlhdGlvbiA9IGdldE9wcG9zaXRlVmFyaWF0aW9uKHZhcmlhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGRhdGEucGxhY2VtZW50ID0gcGxhY2VtZW50ICsgKHZhcmlhdGlvbiA/ICctJyArIHZhcmlhdGlvbiA6ICcnKTtcblxuICAgICAgLy8gdGhpcyBvYmplY3QgY29udGFpbnMgYHBvc2l0aW9uYCwgd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdCBhbG9uZyB3aXRoXG4gICAgICAvLyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0eSB3ZSBtYXkgYWRkIGluIHRoZSBmdXR1cmVcbiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLnBvcHBlciwgZ2V0UG9wcGVyT2Zmc2V0cyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpKTtcblxuICAgICAgZGF0YSA9IHJ1bk1vZGlmaWVycyhkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZGF0YSwgJ2ZsaXAnKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGtlZXBUb2dldGhlcihkYXRhKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgdmFyIGlzVmVydGljYWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgc2lkZSA9IGlzVmVydGljYWwgPyAncmlnaHQnIDogJ2JvdHRvbSc7XG4gIHZhciBvcFNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gIHZhciBtZWFzdXJlbWVudCA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgaWYgKHBvcHBlcltzaWRlXSA8IGZsb29yKHJlZmVyZW5jZVtvcFNpZGVdKSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbb3BTaWRlXSA9IGZsb29yKHJlZmVyZW5jZVtvcFNpZGVdKSAtIHBvcHBlclttZWFzdXJlbWVudF07XG4gIH1cbiAgaWYgKHBvcHBlcltvcFNpZGVdID4gZmxvb3IocmVmZXJlbmNlW3NpZGVdKSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbb3BTaWRlXSA9IGZsb29yKHJlZmVyZW5jZVtzaWRlXSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBjb250YWluaW5nIHZhbHVlICsgdW5pdCBpbnRvIGEgcHggdmFsdWUgbnVtYmVyXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiB7bW9kaWZpZXJzfm9mZnNldH1cbiAqIEBwcml2YXRlXG4gKiBAYXJndW1lbnQge1N0cmluZ30gc3RyIC0gVmFsdWUgKyB1bml0IHN0cmluZ1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IG1lYXN1cmVtZW50IC0gYGhlaWdodGAgb3IgYHdpZHRoYFxuICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzXG4gKiBAcmV0dXJucyB7TnVtYmVyfFN0cmluZ31cbiAqIFZhbHVlIGluIHBpeGVscywgb3Igb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHZhbHVlcyB3ZXJlIGV4dHJhY3RlZFxuICovXG5mdW5jdGlvbiB0b1ZhbHVlKHN0ciwgbWVhc3VyZW1lbnQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMpIHtcbiAgLy8gc2VwYXJhdGUgdmFsdWUgZnJvbSB1bml0XG4gIHZhciBzcGxpdCA9IHN0ci5tYXRjaCgvKCg/OlxcLXxcXCspP1xcZCpcXC4/XFxkKikoLiopLyk7XG4gIHZhciB2YWx1ZSA9ICtzcGxpdFsxXTtcbiAgdmFyIHVuaXQgPSBzcGxpdFsyXTtcblxuICAvLyBJZiBpdCdzIG5vdCBhIG51bWJlciBpdCdzIGFuIG9wZXJhdG9yLCBJIGd1ZXNzXG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgaWYgKHVuaXQuaW5kZXhPZignJScpID09PSAwKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB2b2lkIDA7XG4gICAgc3dpdGNoICh1bml0KSB7XG4gICAgICBjYXNlICclcCc6XG4gICAgICAgIGVsZW1lbnQgPSBwb3BwZXJPZmZzZXRzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyUnOlxuICAgICAgY2FzZSAnJXInOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZWxlbWVudCA9IHJlZmVyZW5jZU9mZnNldHM7XG4gICAgfVxuXG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0KGVsZW1lbnQpO1xuICAgIHJldHVybiByZWN0W21lYXN1cmVtZW50XSAvIDEwMCAqIHZhbHVlO1xuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd2aCcgfHwgdW5pdCA9PT0gJ3Z3Jykge1xuICAgIC8vIGlmIGlzIGEgdmggb3IgdncsIHdlIGNhbGN1bGF0ZSB0aGUgc2l6ZSBiYXNlZCBvbiB0aGUgdmlld3BvcnRcbiAgICB2YXIgc2l6ZSA9IHZvaWQgMDtcbiAgICBpZiAodW5pdCA9PT0gJ3ZoJykge1xuICAgICAgc2l6ZSA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2l6ZSA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gICAgfVxuICAgIHJldHVybiBzaXplIC8gMTAwICogdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgaXMgYW4gZXhwbGljaXQgcGl4ZWwgdW5pdCwgd2UgZ2V0IHJpZCBvZiB0aGUgdW5pdCBhbmQga2VlcCB0aGUgdmFsdWVcbiAgICAvLyBpZiBpcyBhbiBpbXBsaWNpdCB1bml0LCBpdCdzIHB4LCBhbmQgd2UgcmV0dXJuIGp1c3QgdGhlIHZhbHVlXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgYW4gYG9mZnNldGAgc3RyaW5nIHRvIGV4dHJhcG9sYXRlIGB4YCBhbmQgYHlgIG51bWVyaWMgb2Zmc2V0cy5cbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIHttb2RpZmllcnN+b2Zmc2V0fVxuICogQHByaXZhdGVcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBvZmZzZXRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzXG4gKiBAYXJndW1lbnQge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IGJhc2VQbGFjZW1lbnRcbiAqIEByZXR1cm5zIHtBcnJheX0gYSB0d28gY2VsbHMgYXJyYXkgd2l0aCB4IGFuZCB5IG9mZnNldHMgaW4gbnVtYmVyc1xuICovXG5mdW5jdGlvbiBwYXJzZU9mZnNldChvZmZzZXQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMsIGJhc2VQbGFjZW1lbnQpIHtcbiAgdmFyIG9mZnNldHMgPSBbMCwgMF07XG5cbiAgLy8gVXNlIGhlaWdodCBpZiBwbGFjZW1lbnQgaXMgbGVmdCBvciByaWdodCBhbmQgaW5kZXggaXMgMCBvdGhlcndpc2UgdXNlIHdpZHRoXG4gIC8vIGluIHRoaXMgd2F5IHRoZSBmaXJzdCBvZmZzZXQgd2lsbCB1c2UgYW4gYXhpcyBhbmQgdGhlIHNlY29uZCBvbmVcbiAgLy8gd2lsbCB1c2UgdGhlIG90aGVyIG9uZVxuICB2YXIgdXNlSGVpZ2h0ID0gWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgLy8gU3BsaXQgdGhlIG9mZnNldCBzdHJpbmcgdG8gb2J0YWluIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIG9wZXJhbmRzXG4gIC8vIFRoZSByZWdleCBhZGRyZXNzZXMgdmFsdWVzIHdpdGggdGhlIHBsdXMgb3IgbWludXMgc2lnbiBpbiBmcm9udCAoKzEwLCAtMjAsIGV0YylcbiAgdmFyIGZyYWdtZW50cyA9IG9mZnNldC5zcGxpdCgvKFxcK3xcXC0pLykubWFwKGZ1bmN0aW9uIChmcmFnKSB7XG4gICAgcmV0dXJuIGZyYWcudHJpbSgpO1xuICB9KTtcblxuICAvLyBEZXRlY3QgaWYgdGhlIG9mZnNldCBzdHJpbmcgY29udGFpbnMgYSBwYWlyIG9mIHZhbHVlcyBvciBhIHNpbmdsZSBvbmVcbiAgLy8gdGhleSBjb3VsZCBiZSBzZXBhcmF0ZWQgYnkgY29tbWEgb3Igc3BhY2VcbiAgdmFyIGRpdmlkZXIgPSBmcmFnbWVudHMuaW5kZXhPZihmaW5kKGZyYWdtZW50cywgZnVuY3Rpb24gKGZyYWcpIHtcbiAgICByZXR1cm4gZnJhZy5zZWFyY2goLyx8XFxzLykgIT09IC0xO1xuICB9KSk7XG5cbiAgaWYgKGZyYWdtZW50c1tkaXZpZGVyXSAmJiBmcmFnbWVudHNbZGl2aWRlcl0uaW5kZXhPZignLCcpID09PSAtMSkge1xuICAgIGNvbnNvbGUud2FybignT2Zmc2V0cyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UocykgYXJlIGRlcHJlY2F0ZWQsIHVzZSBhIGNvbW1hICgsKSBpbnN0ZWFkLicpO1xuICB9XG5cbiAgLy8gSWYgZGl2aWRlciBpcyBmb3VuZCwgd2UgZGl2aWRlIHRoZSBsaXN0IG9mIHZhbHVlcyBhbmQgb3BlcmFuZHMgdG8gZGl2aWRlXG4gIC8vIHRoZW0gYnkgb2ZzZXQgWCBhbmQgWS5cbiAgdmFyIHNwbGl0UmVnZXggPSAvXFxzKixcXHMqfFxccysvO1xuICB2YXIgb3BzID0gZGl2aWRlciAhPT0gLTEgPyBbZnJhZ21lbnRzLnNsaWNlKDAsIGRpdmlkZXIpLmNvbmNhdChbZnJhZ21lbnRzW2RpdmlkZXJdLnNwbGl0KHNwbGl0UmVnZXgpWzBdXSksIFtmcmFnbWVudHNbZGl2aWRlcl0uc3BsaXQoc3BsaXRSZWdleClbMV1dLmNvbmNhdChmcmFnbWVudHMuc2xpY2UoZGl2aWRlciArIDEpKV0gOiBbZnJhZ21lbnRzXTtcblxuICAvLyBDb252ZXJ0IHRoZSB2YWx1ZXMgd2l0aCB1bml0cyB0byBhYnNvbHV0ZSBwaXhlbHMgdG8gYWxsb3cgb3VyIGNvbXB1dGF0aW9uc1xuICBvcHMgPSBvcHMubWFwKGZ1bmN0aW9uIChvcCwgaW5kZXgpIHtcbiAgICAvLyBNb3N0IG9mIHRoZSB1bml0cyByZWx5IG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgcG9wcGVyXG4gICAgdmFyIG1lYXN1cmVtZW50ID0gKGluZGV4ID09PSAxID8gIXVzZUhlaWdodCA6IHVzZUhlaWdodCkgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG1lcmdlV2l0aFByZXZpb3VzID0gZmFsc2U7XG4gICAgcmV0dXJuIG9wXG4gICAgLy8gVGhpcyBhZ2dyZWdhdGVzIGFueSBgK2Agb3IgYC1gIHNpZ24gdGhhdCBhcmVuJ3QgY29uc2lkZXJlZCBvcGVyYXRvcnNcbiAgICAvLyBlLmcuOiAxMCArICs1ID0+IFsxMCwgKywgKzVdXG4gICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYgKGFbYS5sZW5ndGggLSAxXSA9PT0gJycgJiYgWycrJywgJy0nXS5pbmRleE9mKGIpICE9PSAtMSkge1xuICAgICAgICBhW2EubGVuZ3RoIC0gMV0gPSBiO1xuICAgICAgICBtZXJnZVdpdGhQcmV2aW91cyA9IHRydWU7XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSBlbHNlIGlmIChtZXJnZVdpdGhQcmV2aW91cykge1xuICAgICAgICBhW2EubGVuZ3RoIC0gMV0gKz0gYjtcbiAgICAgICAgbWVyZ2VXaXRoUHJldmlvdXMgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgICB9XG4gICAgfSwgW10pXG4gICAgLy8gSGVyZSB3ZSBjb252ZXJ0IHRoZSBzdHJpbmcgdmFsdWVzIGludG8gbnVtYmVyIHZhbHVlcyAoaW4gcHgpXG4gICAgLm1hcChmdW5jdGlvbiAoc3RyKSB7XG4gICAgICByZXR1cm4gdG9WYWx1ZShzdHIsIG1lYXN1cmVtZW50LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTG9vcCB0cm91Z2ggdGhlIG9mZnNldHMgYXJyYXlzIGFuZCBleGVjdXRlIHRoZSBvcGVyYXRpb25zXG4gIG9wcy5mb3JFYWNoKGZ1bmN0aW9uIChvcCwgaW5kZXgpIHtcbiAgICBvcC5mb3JFYWNoKGZ1bmN0aW9uIChmcmFnLCBpbmRleDIpIHtcbiAgICAgIGlmIChpc051bWVyaWMoZnJhZykpIHtcbiAgICAgICAgb2Zmc2V0c1tpbmRleF0gKz0gZnJhZyAqIChvcFtpbmRleDIgLSAxXSA9PT0gJy0nID8gLTEgOiAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBvZmZzZXRzO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEBhcmd1bWVudCB7TnVtYmVyfFN0cmluZ30gb3B0aW9ucy5vZmZzZXQ9MFxuICogVGhlIG9mZnNldCB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIG1vZGlmaWVyIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIG9mZnNldChkYXRhLCBfcmVmKSB7XG4gIHZhciBvZmZzZXQgPSBfcmVmLm9mZnNldDtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LFxuICAgICAgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcblxuICB2YXIgb2Zmc2V0cyA9IHZvaWQgMDtcbiAgaWYgKGlzTnVtZXJpYygrb2Zmc2V0KSkge1xuICAgIG9mZnNldHMgPSBbK29mZnNldCwgMF07XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0cyA9IHBhcnNlT2Zmc2V0KG9mZnNldCwgcG9wcGVyLCByZWZlcmVuY2UsIGJhc2VQbGFjZW1lbnQpO1xuICB9XG5cbiAgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIubGVmdCAtPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAndG9wJykge1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLnRvcCAtPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMV07XG4gIH1cblxuICBkYXRhLnBvcHBlciA9IHBvcHBlcjtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhkYXRhLCBvcHRpb25zKSB7XG4gIHZhciBib3VuZGFyaWVzRWxlbWVudCA9IG9wdGlvbnMuYm91bmRhcmllc0VsZW1lbnQgfHwgZ2V0T2Zmc2V0UGFyZW50KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcblxuICAvLyBJZiBvZmZzZXRQYXJlbnQgaXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LCB3ZSByZWFsbHkgd2FudCB0b1xuICAvLyBnbyBvbmUgc3RlcCB1cCBhbmQgdXNlIHRoZSBuZXh0IG9mZnNldFBhcmVudCBhcyByZWZlcmVuY2UgdG9cbiAgLy8gYXZvaWQgdG8gbWFrZSB0aGlzIG1vZGlmaWVyIGNvbXBsZXRlbHkgdXNlbGVzcyBhbmQgbG9vayBsaWtlIGJyb2tlblxuICBpZiAoZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UgPT09IGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gICAgYm91bmRhcmllc0VsZW1lbnQgPSBnZXRPZmZzZXRQYXJlbnQoYm91bmRhcmllc0VsZW1lbnQpO1xuICB9XG5cbiAgLy8gTk9URTogRE9NIGFjY2VzcyBoZXJlXG4gIC8vIHJlc2V0cyB0aGUgcG9wcGVyJ3MgcG9zaXRpb24gc28gdGhhdCB0aGUgZG9jdW1lbnQgc2l6ZSBjYW4gYmUgY2FsY3VsYXRlZCBleGNsdWRpbmdcbiAgLy8gdGhlIHNpemUgb2YgdGhlIHBvcHBlciBlbGVtZW50IGl0c2VsZlxuICB2YXIgdHJhbnNmb3JtUHJvcCA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG4gIHZhciBwb3BwZXJTdHlsZXMgPSBkYXRhLmluc3RhbmNlLnBvcHBlci5zdHlsZTsgLy8gYXNzaWdubWVudCB0byBoZWxwIG1pbmlmaWNhdGlvblxuICB2YXIgdG9wID0gcG9wcGVyU3R5bGVzLnRvcCxcbiAgICAgIGxlZnQgPSBwb3BwZXJTdHlsZXMubGVmdCxcbiAgICAgIHRyYW5zZm9ybSA9IHBvcHBlclN0eWxlc1t0cmFuc2Zvcm1Qcm9wXTtcblxuICBwb3BwZXJTdHlsZXMudG9wID0gJyc7XG4gIHBvcHBlclN0eWxlcy5sZWZ0ID0gJyc7XG4gIHBvcHBlclN0eWxlc1t0cmFuc2Zvcm1Qcm9wXSA9ICcnO1xuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UsIG9wdGlvbnMucGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQsIGRhdGEucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gTk9URTogRE9NIGFjY2VzcyBoZXJlXG4gIC8vIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBzdHlsZSBwcm9wZXJ0aWVzIGFmdGVyIHRoZSBvZmZzZXRzIGhhdmUgYmVlbiBjb21wdXRlZFxuICBwb3BwZXJTdHlsZXMudG9wID0gdG9wO1xuICBwb3BwZXJTdHlsZXMubGVmdCA9IGxlZnQ7XG4gIHBvcHBlclN0eWxlc1t0cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybTtcblxuICBvcHRpb25zLmJvdW5kYXJpZXMgPSBib3VuZGFyaWVzO1xuXG4gIHZhciBvcmRlciA9IG9wdGlvbnMucHJpb3JpdHk7XG4gIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gIHZhciBjaGVjayA9IHtcbiAgICBwcmltYXJ5OiBmdW5jdGlvbiBwcmltYXJ5KHBsYWNlbWVudCkge1xuICAgICAgdmFyIHZhbHVlID0gcG9wcGVyW3BsYWNlbWVudF07XG4gICAgICBpZiAocG9wcGVyW3BsYWNlbWVudF0gPCBib3VuZGFyaWVzW3BsYWNlbWVudF0gJiYgIW9wdGlvbnMuZXNjYXBlV2l0aFJlZmVyZW5jZSkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWF4KHBvcHBlcltwbGFjZW1lbnRdLCBib3VuZGFyaWVzW3BsYWNlbWVudF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KHt9LCBwbGFjZW1lbnQsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNlY29uZGFyeTogZnVuY3Rpb24gc2Vjb25kYXJ5KHBsYWNlbWVudCkge1xuICAgICAgdmFyIG1haW5TaWRlID0gcGxhY2VtZW50ID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgICB2YXIgdmFsdWUgPSBwb3BwZXJbbWFpblNpZGVdO1xuICAgICAgaWYgKHBvcHBlcltwbGFjZW1lbnRdID4gYm91bmRhcmllc1twbGFjZW1lbnRdICYmICFvcHRpb25zLmVzY2FwZVdpdGhSZWZlcmVuY2UpIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1pbihwb3BwZXJbbWFpblNpZGVdLCBib3VuZGFyaWVzW3BsYWNlbWVudF0gLSAocGxhY2VtZW50ID09PSAncmlnaHQnID8gcG9wcGVyLndpZHRoIDogcG9wcGVyLmhlaWdodCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KHt9LCBtYWluU2lkZSwgdmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBvcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICB2YXIgc2lkZSA9IFsnbGVmdCcsICd0b3AnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xID8gJ3ByaW1hcnknIDogJ3NlY29uZGFyeSc7XG4gICAgcG9wcGVyID0gX2V4dGVuZHMoe30sIHBvcHBlciwgY2hlY2tbc2lkZV0ocGxhY2VtZW50KSk7XG4gIH0pO1xuXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBwb3BwZXI7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIHNoaWZ0KGRhdGEpIHtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgc2hpZnR2YXJpYXRpb24gPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcblxuICAvLyBpZiBzaGlmdCBzaGlmdHZhcmlhdGlvbiBpcyBzcGVjaWZpZWQsIHJ1biB0aGUgbW9kaWZpZXJcbiAgaWYgKHNoaWZ0dmFyaWF0aW9uKSB7XG4gICAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcjtcblxuICAgIHZhciBpc1ZlcnRpY2FsID0gWydib3R0b20nLCAndG9wJ10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG4gICAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgdmFyIG1lYXN1cmVtZW50ID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICAgIHZhciBzaGlmdE9mZnNldHMgPSB7XG4gICAgICBzdGFydDogZGVmaW5lUHJvcGVydHkoe30sIHNpZGUsIHJlZmVyZW5jZVtzaWRlXSksXG4gICAgICBlbmQ6IGRlZmluZVByb3BlcnR5KHt9LCBzaWRlLCByZWZlcmVuY2Vbc2lkZV0gKyByZWZlcmVuY2VbbWVhc3VyZW1lbnRdIC0gcG9wcGVyW21lYXN1cmVtZW50XSlcbiAgICB9O1xuXG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IF9leHRlbmRzKHt9LCBwb3BwZXIsIHNoaWZ0T2Zmc2V0c1tzaGlmdHZhcmlhdGlvbl0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBoaWRlKGRhdGEpIHtcbiAgaWYgKCFpc01vZGlmaWVyUmVxdWlyZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdoaWRlJywgJ3ByZXZlbnRPdmVyZmxvdycpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgcmVmUmVjdCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2U7XG4gIHZhciBib3VuZCA9IGZpbmQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSAncHJldmVudE92ZXJmbG93JztcbiAgfSkuYm91bmRhcmllcztcblxuICBpZiAocmVmUmVjdC5ib3R0b20gPCBib3VuZC50b3AgfHwgcmVmUmVjdC5sZWZ0ID4gYm91bmQucmlnaHQgfHwgcmVmUmVjdC50b3AgPiBib3VuZC5ib3R0b20gfHwgcmVmUmVjdC5yaWdodCA8IGJvdW5kLmxlZnQpIHtcbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBET00gYWNjZXNzIGlmIHZpc2liaWxpdHkgaGFzbid0IGNoYW5nZWRcbiAgICBpZiAoZGF0YS5oaWRlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBkYXRhLmhpZGUgPSB0cnVlO1xuICAgIGRhdGEuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgRE9NIGFjY2VzcyBpZiB2aXNpYmlsaXR5IGhhc24ndCBjaGFuZ2VkXG4gICAgaWYgKGRhdGEuaGlkZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGRhdGEuaGlkZSA9IGZhbHNlO1xuICAgIGRhdGEuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gaW5uZXIoZGF0YSkge1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgaXNIb3JpeiA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gIHZhciBzdWJ0cmFjdExlbmd0aCA9IFsndG9wJywgJ2xlZnQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID09PSAtMTtcblxuICBwb3BwZXJbaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnXSA9IHJlZmVyZW5jZVtiYXNlUGxhY2VtZW50XSAtIChzdWJ0cmFjdExlbmd0aCA/IHBvcHBlcltpc0hvcml6ID8gJ3dpZHRoJyA6ICdoZWlnaHQnXSA6IDApO1xuXG4gIGRhdGEucGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldENsaWVudFJlY3QocG9wcGVyKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBNb2RpZmllciBmdW5jdGlvbiwgZWFjaCBtb2RpZmllciBjYW4gaGF2ZSBhIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZSBhc3NpZ25lZFxuICogdG8gaXRzIGBmbmAgcHJvcGVydHkuPGJyIC8+XG4gKiBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCB1cGRhdGUsIHRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdFxuICogbWFrZSBzdXJlIHRoZXkgYXJlIHBlcmZvcm1hbnQgZW5vdWdoIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLlxuICpcbiAqIEBmdW5jdGlvbiBNb2RpZmllckZuXG4gKiBAYXJndW1lbnQge2RhdGFPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge2RhdGFPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuXG4vKipcbiAqIE1vZGlmaWVycyBhcmUgcGx1Z2lucyB1c2VkIHRvIGFsdGVyIHRoZSBiZWhhdmlvciBvZiB5b3VyIHBvcHBlcnMuPGJyIC8+XG4gKiBQb3BwZXIuanMgdXNlcyBhIHNldCBvZiA5IG1vZGlmaWVycyB0byBwcm92aWRlIGFsbCB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0aWVzXG4gKiBuZWVkZWQgYnkgdGhlIGxpYnJhcnkuXG4gKlxuICogVXN1YWxseSB5b3UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZSB0aGUgYG9yZGVyYCwgYGZuYCBhbmQgYG9uTG9hZGAgcHJvcHMuXG4gKiBBbGwgdGhlIG90aGVyIHByb3BlcnRpZXMgYXJlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY291bGQgYmUgdHdlYWtlZC5cbiAqIEBuYW1lc3BhY2UgbW9kaWZpZXJzXG4gKi9cbnZhciBtb2RpZmllcnMgPSB7XG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIHNoaWZ0IHRoZSBwb3BwZXIgb24gdGhlIHN0YXJ0IG9yIGVuZCBvZiBpdHMgcmVmZXJlbmNlXG4gICAqIGVsZW1lbnQuPGJyIC8+XG4gICAqIEl0IHdpbGwgcmVhZCB0aGUgdmFyaWF0aW9uIG9mIHRoZSBgcGxhY2VtZW50YCBwcm9wZXJ0eS48YnIgLz5cbiAgICogSXQgY2FuIGJlIG9uZSBlaXRoZXIgYC1lbmRgIG9yIGAtc3RhcnRgLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgc2hpZnQ6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9MTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiAxMDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBzaGlmdFxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGUgYG9mZnNldGAgbW9kaWZpZXIgY2FuIHNoaWZ0IHlvdXIgcG9wcGVyIG9uIGJvdGggaXRzIGF4aXMuXG4gICAqXG4gICAqIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyB1bml0czpcbiAgICogLSBgcHhgIG9yIHVuaXQtbGVzcywgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzXG4gICAqIC0gYCVgIG9yIGAlcmAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICogLSBgJXBgLCBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIHRoZSBsZW5ndGggb2YgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIC0gYHZ3YCwgQ1NTIHZpZXdwb3J0IHdpZHRoIHVuaXRcbiAgICogLSBgdmhgLCBDU1Mgdmlld3BvcnQgaGVpZ2h0IHVuaXRcbiAgICpcbiAgICogRm9yIGxlbmd0aCBpcyBpbnRlbmRlZCB0aGUgbWFpbiBheGlzIHJlbGF0aXZlIHRvIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcHBlci48YnIgLz5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBwbGFjZW1lbnQgaXMgYHRvcGAgb3IgYGJvdHRvbWAsIHRoZSBsZW5ndGggd2lsbCBiZSB0aGVcbiAgICogYHdpZHRoYC4gSW4gY2FzZSBvZiBgbGVmdGAgb3IgYHJpZ2h0YCwgaXQgd2lsbCBiZSB0aGUgYGhlaWdodGAuXG4gICAqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSBhIHNpbmdsZSB2YWx1ZSAoYXMgYE51bWJlcmAgb3IgYFN0cmluZ2ApLCBvciBhIHBhaXIgb2YgdmFsdWVzXG4gICAqIGFzIGBTdHJpbmdgIGRpdmlkZWQgYnkgYSBjb21tYSBvciBvbmUgKG9yIG1vcmUpIHdoaXRlIHNwYWNlcy48YnIgLz5cbiAgICogVGhlIGxhdHRlciBpcyBhIGRlcHJlY2F0ZWQgbWV0aG9kIGJlY2F1c2UgaXQgbGVhZHMgdG8gY29uZnVzaW9uIGFuZCB3aWxsIGJlXG4gICAqIHJlbW92ZWQgaW4gdjIuPGJyIC8+XG4gICAqIEFkZGl0aW9uYWxseSwgaXQgYWNjZXB0cyBhZGRpdGlvbnMgYW5kIHN1YnRyYWN0aW9ucyBiZXR3ZWVuIGRpZmZlcmVudCB1bml0cy5cbiAgICogTm90ZSB0aGF0IG11bHRpcGxpY2F0aW9ucyBhbmQgZGl2aXNpb25zIGFyZW4ndCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIFZhbGlkIGV4YW1wbGVzIGFyZTpcbiAgICogYGBgXG4gICAqIDEwXG4gICAqICcxMCUnXG4gICAqICcxMCwgMTAnXG4gICAqICcxMCUsIDEwJ1xuICAgKiAnMTAgKyAxMCUnXG4gICAqICcxMCAtIDV2aCArIDMlJ1xuICAgKiAnLTEwcHggKyA1dmgsIDVweCAtIDYlJ1xuICAgKiBgYGBcbiAgICogPiAqKk5CKio6IElmIHlvdSBkZXNpcmUgdG8gYXBwbHkgb2Zmc2V0cyB0byB5b3VyIHBvcHBlcnMgaW4gYSB3YXkgdGhhdCBtYXkgbWFrZSB0aGVtIG92ZXJsYXBcbiAgICogPiB3aXRoIHRoZWlyIHJlZmVyZW5jZSBlbGVtZW50LCB1bmZvcnR1bmF0ZWx5LCB5b3Ugd2lsbCBoYXZlIHRvIGRpc2FibGUgdGhlIGBmbGlwYCBtb2RpZmllci5cbiAgICogPiBZb3UgY2FuIHJlYWQgbW9yZSBvbiB0aGlzIGF0IHRoaXMgW2lzc3VlXShodHRwczovL2dpdGh1Yi5jb20vRmV6VnJhc3RhL3BvcHBlci5qcy9pc3N1ZXMvMzczKS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIG9mZnNldDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0yMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDIwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IG9mZnNldCxcbiAgICAvKiogQHByb3Age051bWJlcnxTdHJpbmd9IG9mZnNldD0wXG4gICAgICogVGhlIG9mZnNldCB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIG1vZGlmaWVyIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgb2Zmc2V0OiAwXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gcHJldmVudCB0aGUgcG9wcGVyIGZyb20gYmVpbmcgcG9zaXRpb25lZCBvdXRzaWRlIHRoZSBib3VuZGFyeS5cbiAgICpcbiAgICogQSBzY2VuYXJpbyBleGlzdHMgd2hlcmUgdGhlIHJlZmVyZW5jZSBpdHNlbGYgaXMgbm90IHdpdGhpbiB0aGUgYm91bmRhcmllcy48YnIgLz5cbiAgICogV2UgY2FuIHNheSBpdCBoYXMgXCJlc2NhcGVkIHRoZSBib3VuZGFyaWVzXCIg4oCUIG9yIGp1c3QgXCJlc2NhcGVkXCIuPGJyIC8+XG4gICAqIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBwb3BwZXIgc2hvdWxkIGVpdGhlcjpcbiAgICpcbiAgICogLSBkZXRhY2ggZnJvbSB0aGUgcmVmZXJlbmNlIGFuZCByZW1haW4gXCJ0cmFwcGVkXCIgaW4gdGhlIGJvdW5kYXJpZXMsIG9yXG4gICAqIC0gaWYgaXQgc2hvdWxkIGlnbm9yZSB0aGUgYm91bmRhcnkgYW5kIFwiZXNjYXBlIHdpdGggaXRzIHJlZmVyZW5jZVwiXG4gICAqXG4gICAqIFdoZW4gYGVzY2FwZVdpdGhSZWZlcmVuY2VgIGlzIHNldCB0b2B0cnVlYCBhbmQgcmVmZXJlbmNlIGlzIGNvbXBsZXRlbHlcbiAgICogb3V0c2lkZSBpdHMgYm91bmRhcmllcywgdGhlIHBvcHBlciB3aWxsIG92ZXJmbG93IChvciBjb21wbGV0ZWx5IGxlYXZlKVxuICAgKiB0aGUgYm91bmRhcmllcyBpbiBvcmRlciB0byByZW1haW4gYXR0YWNoZWQgdG8gdGhlIGVkZ2Ugb2YgdGhlIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIHByZXZlbnRPdmVyZmxvdzoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0zMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDMwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7QXJyYXl9IFtwcmlvcml0eT1bJ2xlZnQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSddXVxuICAgICAqIFBvcHBlciB3aWxsIHRyeSB0byBwcmV2ZW50IG92ZXJmbG93IGZvbGxvd2luZyB0aGVzZSBwcmlvcml0aWVzIGJ5IGRlZmF1bHQsXG4gICAgICogdGhlbiwgaXQgY291bGQgb3ZlcmZsb3cgb24gdGhlIGxlZnQgYW5kIG9uIHRvcCBvZiB0aGUgYGJvdW5kYXJpZXNFbGVtZW50YFxuICAgICAqL1xuICAgIHByaW9yaXR5OiBbJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHBhZGRpbmc9NVxuICAgICAqIEFtb3VudCBvZiBwaXhlbCB1c2VkIHRvIGRlZmluZSBhIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm91bmRhcmllc1xuICAgICAqIGFuZCB0aGUgcG9wcGVyLiBUaGlzIG1ha2VzIHN1cmUgdGhlIHBvcHBlciBhbHdheXMgaGFzIGEgbGl0dGxlIHBhZGRpbmdcbiAgICAgKiBiZXR3ZWVuIHRoZSBlZGdlcyBvZiBpdHMgY29udGFpbmVyXG4gICAgICovXG4gICAgcGFkZGluZzogNSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudD0nc2Nyb2xsUGFyZW50J1xuICAgICAqIEJvdW5kYXJpZXMgdXNlZCBieSB0aGUgbW9kaWZpZXIuIENhbiBiZSBgc2Nyb2xsUGFyZW50YCwgYHdpbmRvd2AsXG4gICAgICogYHZpZXdwb3J0YCBvciBhbnkgRE9NIGVsZW1lbnQuXG4gICAgICovXG4gICAgYm91bmRhcmllc0VsZW1lbnQ6ICdzY3JvbGxQYXJlbnQnXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gbWFrZSBzdXJlIHRoZSByZWZlcmVuY2UgYW5kIGl0cyBwb3BwZXIgc3RheSBuZWFyIGVhY2ggb3RoZXJcbiAgICogd2l0aG91dCBsZWF2aW5nIGFueSBnYXAgYmV0d2VlbiB0aGUgdHdvLiBFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZSBhcnJvdyBpc1xuICAgKiBlbmFibGVkIGFuZCB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBpdCBwb2ludHMgdG8gaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBJdCBjYXJlcyBvbmx5IGFib3V0IHRoZSBmaXJzdCBheGlzLiBZb3UgY2FuIHN0aWxsIGhhdmUgcG9wcGVycyB3aXRoIG1hcmdpblxuICAgKiBiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGtlZXBUb2dldGhlcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj00MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDQwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGtlZXBUb2dldGhlclxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGlzIG1vZGlmaWVyIGlzIHVzZWQgdG8gbW92ZSB0aGUgYGFycm93RWxlbWVudGAgb2YgdGhlIHBvcHBlciB0byBtYWtlXG4gICAqIHN1cmUgaXQgaXMgcG9zaXRpb25lZCBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgZWxlbWVudCBhbmQgaXRzIHBvcHBlciBlbGVtZW50LlxuICAgKiBJdCB3aWxsIHJlYWQgdGhlIG91dGVyIHNpemUgb2YgdGhlIGBhcnJvd0VsZW1lbnRgIG5vZGUgdG8gZGV0ZWN0IGhvdyBtYW55XG4gICAqIHBpeGVscyBvZiBjb25qdW5jdGlvbiBhcmUgbmVlZGVkLlxuICAgKlxuICAgKiBJdCBoYXMgbm8gZWZmZWN0IGlmIG5vIGBhcnJvd0VsZW1lbnRgIGlzIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgYXJyb3c6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA1MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBhcnJvdyxcbiAgICAvKiogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gZWxlbWVudD0nW3gtYXJyb3ddJyAtIFNlbGVjdG9yIG9yIG5vZGUgdXNlZCBhcyBhcnJvdyAqL1xuICAgIGVsZW1lbnQ6ICdbeC1hcnJvd10nXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gZmxpcCB0aGUgcG9wcGVyJ3MgcGxhY2VtZW50IHdoZW4gaXQgc3RhcnRzIHRvIG92ZXJsYXAgaXRzXG4gICAqIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuXG4gICAqXG4gICAqICoqTk9URToqKiB0aGlzIG1vZGlmaWVyIHdpbGwgaW50ZXJydXB0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZSBhbmQgd2lsbFxuICAgKiByZXN0YXJ0IGl0IGlmIGl0IGRldGVjdHMgdGhlIG5lZWQgdG8gZmxpcCB0aGUgcGxhY2VtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgZmxpcDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj02MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDYwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGZsaXAsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xBcnJheX0gYmVoYXZpb3I9J2ZsaXAnXG4gICAgICogVGhlIGJlaGF2aW9yIHVzZWQgdG8gY2hhbmdlIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQuIEl0IGNhbiBiZSBvbmUgb2ZcbiAgICAgKiBgZmxpcGAsIGBjbG9ja3dpc2VgLCBgY291bnRlcmNsb2Nrd2lzZWAgb3IgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgdmFsaWRcbiAgICAgKiBwbGFjZW1lbnRzICh3aXRoIG9wdGlvbmFsIHZhcmlhdGlvbnMpXG4gICAgICovXG4gICAgYmVoYXZpb3I6ICdmbGlwJyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBwYWRkaW5nPTVcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgZmxpcCBpZiBpdCBoaXRzIHRoZSBlZGdlcyBvZiB0aGUgYGJvdW5kYXJpZXNFbGVtZW50YFxuICAgICAqL1xuICAgIHBhZGRpbmc6IDUsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQ9J3ZpZXdwb3J0J1xuICAgICAqIFRoZSBlbGVtZW50IHdoaWNoIHdpbGwgZGVmaW5lIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBwb3BwZXIgcG9zaXRpb24uXG4gICAgICogVGhlIHBvcHBlciB3aWxsIG5ldmVyIGJlIHBsYWNlZCBvdXRzaWRlIG9mIHRoZSBkZWZpbmVkIGJvdW5kYXJpZXNcbiAgICAgKiAoZXhjZXB0IGlmIGBrZWVwVG9nZXRoZXJgIGlzIGVuYWJsZWQpXG4gICAgICovXG4gICAgYm91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCcsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGZsaXBWYXJpYXRpb25zPWZhbHNlXG4gICAgICogVGhlIHBvcHBlciB3aWxsIHN3aXRjaCBwbGFjZW1lbnQgdmFyaWF0aW9uIGJldHdlZW4gYC1zdGFydGAgYW5kIGAtZW5kYCB3aGVuXG4gICAgICogdGhlIHJlZmVyZW5jZSBlbGVtZW50IG92ZXJsYXBzIGl0cyBib3VuZGFyaWVzLlxuICAgICAqXG4gICAgICogVGhlIG9yaWdpbmFsIHBsYWNlbWVudCBzaG91bGQgaGF2ZSBhIHNldCB2YXJpYXRpb24uXG4gICAgICovXG4gICAgZmxpcFZhcmlhdGlvbnM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtCb29sZWFufSBmbGlwVmFyaWF0aW9uc0J5Q29udGVudD1mYWxzZVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBzd2l0Y2ggcGxhY2VtZW50IHZhcmlhdGlvbiBiZXR3ZWVuIGAtc3RhcnRgIGFuZCBgLWVuZGAgd2hlblxuICAgICAqIHRoZSBwb3BwZXIgZWxlbWVudCBvdmVybGFwcyBpdHMgcmVmZXJlbmNlIGJvdW5kYXJpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGxhY2VtZW50IHNob3VsZCBoYXZlIGEgc2V0IHZhcmlhdGlvbi5cbiAgICAgKi9cbiAgICBmbGlwVmFyaWF0aW9uc0J5Q29udGVudDogZmFsc2VcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHRoZSBwb3BwZXIgZmxvdyB0b3dhcmQgdGhlIGlubmVyIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogQnkgZGVmYXVsdCwgd2hlbiB0aGlzIG1vZGlmaWVyIGlzIGRpc2FibGVkLCB0aGUgcG9wcGVyIHdpbGwgYmUgcGxhY2VkIG91dHNpZGVcbiAgICogdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgaW5uZXI6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NzAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA3MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPWZhbHNlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGlubmVyXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gaGlkZSB0aGUgcG9wcGVyIHdoZW4gaXRzIHJlZmVyZW5jZSBlbGVtZW50IGlzIG91dHNpZGUgb2YgdGhlXG4gICAqIHBvcHBlciBib3VuZGFyaWVzLiBJdCB3aWxsIHNldCBhIGB4LW91dC1vZi1ib3VuZGFyaWVzYCBhdHRyaWJ1dGUgd2hpY2ggY2FuXG4gICAqIGJlIHVzZWQgdG8gaGlkZSB3aXRoIGEgQ1NTIHNlbGVjdG9yIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGlzXG4gICAqIG91dCBvZiBib3VuZGFyaWVzLlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBoaWRlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTgwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogODAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaGlkZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgc3R5bGUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciBlbGVtZW50IHRvIGdldHNcbiAgICogcHJvcGVybHkgcG9zaXRpb25lZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgbW9kaWZpZXIgd2lsbCBub3QgdG91Y2ggdGhlIERPTSwgaXQganVzdCBwcmVwYXJlcyB0aGUgc3R5bGVzXG4gICAqIHNvIHRoYXQgYGFwcGx5U3R5bGVgIG1vZGlmaWVyIGNhbiBhcHBseSBpdC4gVGhpcyBzZXBhcmF0aW9uIGlzIHVzZWZ1bFxuICAgKiBpbiBjYXNlIHlvdSBuZWVkIHRvIHJlcGxhY2UgYGFwcGx5U3R5bGVgIHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIFRoaXMgbW9kaWZpZXIgaGFzIGA4NTBgIGFzIGBvcmRlcmAgdmFsdWUgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIFBvcHBlci5qcy4gRXhwZWN0IHRoZSBtb2RpZmllcnMgb3JkZXJpbmcgbWV0aG9kXG4gICAqIHRvIGNoYW5nZSBpbiBmdXR1cmUgbWFqb3IgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBjb21wdXRlU3R5bGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODUwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4NTAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBjb21wdXRlU3R5bGUsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNEIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdib3R0b20nXVxuICAgICAqIFdoZXJlIHRvIGFuY2hvciB0aGUgWCBheGlzIChgYm90dG9tYCBvciBgdG9wYCkuIEFLQSBYIG9mZnNldCBvcmlnaW4uXG4gICAgICogQ2hhbmdlIHRoaXMgaWYgeW91ciBwb3BwZXIgc2hvdWxkIGdyb3cgaW4gYSBkaXJlY3Rpb24gZGlmZmVyZW50IGZyb20gYGJvdHRvbWBcbiAgICAgKi9cbiAgICB4OiAnYm90dG9tJyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7c3RyaW5nfSBbeD0nbGVmdCddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBZIGF4aXMgKGBsZWZ0YCBvciBgcmlnaHRgKS4gQUtBIFkgb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgcmlnaHRgXG4gICAgICovXG4gICAgeTogJ3JpZ2h0J1xuICB9LFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBjb21wdXRlZCBzdHlsZXMgdG8gdGhlIHBvcHBlciBlbGVtZW50LlxuICAgKlxuICAgKiBBbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIGFyZSBsaW1pdGVkIHRvIHRoaXMgbW9kaWZpZXIuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VcbiAgICogeW91IHdhbnQgdG8gaW50ZWdyYXRlIFBvcHBlci5qcyBpbnNpZGUgYSBmcmFtZXdvcmsgb3IgdmlldyBsaWJyYXJ5IGFuZCB5b3VcbiAgICogd2FudCB0byBkZWxlZ2F0ZSBhbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIHRvIGl0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgaWYgeW91IGRpc2FibGUgdGhpcyBtb2RpZmllciwgeW91IG11c3QgbWFrZSBzdXJlIHRoZSBwb3BwZXIgZWxlbWVudFxuICAgKiBoYXMgaXRzIHBvc2l0aW9uIHNldCB0byBgYWJzb2x1dGVgIGJlZm9yZSBQb3BwZXIuanMgY2FuIGRvIGl0cyB3b3JrIVxuICAgKlxuICAgKiBKdXN0IGRpc2FibGUgdGhpcyBtb2RpZmllciBhbmQgZGVmaW5lIHlvdXIgb3duIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgZWZmZWN0LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgYXBwbHlTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj05MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDkwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGFwcGx5U3R5bGUsXG4gICAgLyoqIEBwcm9wIHtGdW5jdGlvbn0gKi9cbiAgICBvbkxvYWQ6IGFwcGx5U3R5bGVPbkxvYWQsXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjEwLjAsIHRoZSBwcm9wZXJ0eSBtb3ZlZCB0byBgY29tcHV0ZVN0eWxlYCBtb2RpZmllclxuICAgICAqIEBwcm9wIHtCb29sZWFufSBncHVBY2NlbGVyYXRpb249dHJ1ZVxuICAgICAqIElmIHRydWUsIGl0IHVzZXMgdGhlIENTUyAzRCB0cmFuc2Zvcm1hdGlvbiB0byBwb3NpdGlvbiB0aGUgcG9wcGVyLlxuICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCB1c2UgdGhlIGB0b3BgIGFuZCBgbGVmdGAgcHJvcGVydGllc1xuICAgICAqL1xuICAgIGdwdUFjY2VsZXJhdGlvbjogdW5kZWZpbmVkXG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGBkYXRhT2JqZWN0YCBpcyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9uIHVzZWQgYnkgUG9wcGVyLmpzLlxuICogVGhpcyBvYmplY3QgaXMgcGFzc2VkIHRvIG1vZGlmaWVycyBhbmQgdG8gdGhlIGBvbkNyZWF0ZWAgYW5kIGBvblVwZGF0ZWAgY2FsbGJhY2tzLlxuICogQG5hbWUgZGF0YU9iamVjdFxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuaW5zdGFuY2UgVGhlIFBvcHBlci5qcyBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGEucGxhY2VtZW50IFBsYWNlbWVudCBhcHBsaWVkIHRvIHBvcHBlclxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgUGxhY2VtZW50IG9yaWdpbmFsbHkgZGVmaW5lZCBvbiBpbml0XG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRhdGEuZmxpcHBlZCBUcnVlIGlmIHBvcHBlciBoYXMgYmVlbiBmbGlwcGVkIGJ5IGZsaXAgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGF0YS5oaWRlIFRydWUgaWYgdGhlIHJlZmVyZW5jZSBlbGVtZW50IGlzIG91dCBvZiBib3VuZGFyaWVzLCB1c2VmdWwgdG8ga25vdyB3aGVuIHRvIGhpZGUgdGhlIHBvcHBlclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gZGF0YS5hcnJvd0VsZW1lbnQgTm9kZSB1c2VkIGFzIGFycm93IGJ5IGFycm93IG1vZGlmaWVyXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5zdHlsZXMgQW55IENTUyBwcm9wZXJ0eSBkZWZpbmVkIGhlcmUgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIuIEl0IGV4cGVjdHMgdGhlIEphdmFTY3JpcHQgbm9tZW5jbGF0dXJlIChlZy4gYG1hcmdpbkJvdHRvbWApXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5hcnJvd1N0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciBhcnJvdy4gSXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmJvdW5kYXJpZXMgT2Zmc2V0cyBvZiB0aGUgcG9wcGVyIGJvdW5kYXJpZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMgVGhlIG1lYXN1cmVtZW50cyBvZiBwb3BwZXIsIHJlZmVyZW5jZSBhbmQgYXJyb3cgZWxlbWVudHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMucG9wcGVyIGB0b3BgLCBgbGVmdGAsIGB3aWR0aGAsIGBoZWlnaHRgIHZhbHVlc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLmFycm93XSBgdG9wYCBhbmQgYGxlZnRgIG9mZnNldHMsIG9ubHkgb25lIG9mIHRoZW0gd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSAwXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgcHJvdmlkZWQgdG8gUG9wcGVyLmpzIGNvbnN0cnVjdG9yLjxiciAvPlxuICogVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgdGhlIGBvcHRpb25zYCBhcmd1bWVudCBvZiBQb3BwZXIuanMuPGJyIC8+XG4gKiBUbyBvdmVycmlkZSBhbiBvcHRpb24sIHNpbXBseSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIGBvcHRpb25zYCBvYmplY3QsIGFzIHRoZSAzcmQgYXJndW1lbnQuIEZvciBleGFtcGxlOlxuICogYGBgXG4gKiBuZXcgUG9wcGVyKHJlZiwgcG9wLCB7XG4gKiAgIG1vZGlmaWVyczoge1xuICogICAgIHByZXZlbnRPdmVyZmxvdzogeyBlbmFibGVkOiBmYWxzZSB9XG4gKiAgIH1cbiAqIH0pXG4gKiBgYGBcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbnZhciBEZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIFBvcHBlcidzIHBsYWNlbWVudC5cbiAgICogQHByb3Age1BvcHBlci5wbGFjZW1lbnRzfSBwbGFjZW1lbnQ9J2JvdHRvbSdcbiAgICovXG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHRvIHRydWUgaWYgeW91IHdhbnQgcG9wcGVyIHRvIHBvc2l0aW9uIGl0IHNlbGYgaW4gJ2ZpeGVkJyBtb2RlXG4gICAqIEBwcm9wIHtCb29sZWFufSBwb3NpdGlvbkZpeGVkPWZhbHNlXG4gICAqL1xuICBwb3NpdGlvbkZpeGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogV2hldGhlciBldmVudHMgKHJlc2l6ZSwgc2Nyb2xsKSBhcmUgaW5pdGlhbGx5IGVuYWJsZWQuXG4gICAqIEBwcm9wIHtCb29sZWFufSBldmVudHNFbmFibGVkPXRydWVcbiAgICovXG4gIGV2ZW50c0VuYWJsZWQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZSBwb3BwZXIgd2hlblxuICAgKiB5b3UgY2FsbCB0aGUgYGRlc3Ryb3lgIG1ldGhvZC5cbiAgICogQHByb3Age0Jvb2xlYW59IHJlbW92ZU9uRGVzdHJveT1mYWxzZVxuICAgKi9cbiAgcmVtb3ZlT25EZXN0cm95OiBmYWxzZSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHBvcHBlciBpcyBjcmVhdGVkLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvbkNyZWF0ZX1cbiAgICovXG4gIG9uQ3JlYXRlOiBmdW5jdGlvbiBvbkNyZWF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIHVwZGF0ZWQuIFRoaXMgY2FsbGJhY2sgaXMgbm90IGNhbGxlZFxuICAgKiBvbiB0aGUgaW5pdGlhbGl6YXRpb24vY3JlYXRpb24gb2YgdGhlIHBvcHBlciwgYnV0IG9ubHkgb24gc3Vic2VxdWVudFxuICAgKiB1cGRhdGVzLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvblVwZGF0ZX1cbiAgICovXG4gIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG1vZGlmaWVycyB1c2VkIHRvIG1vZGlmeSB0aGUgb2Zmc2V0cyBiZWZvcmUgdGhleSBhcmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLlxuICAgKiBUaGV5IHByb3ZpZGUgbW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0aWVzIG9mIFBvcHBlci5qcy5cbiAgICogQHByb3Age21vZGlmaWVyc31cbiAgICovXG4gIG1vZGlmaWVyczogbW9kaWZpZXJzXG59O1xuXG4vKipcbiAqIEBjYWxsYmFjayBvbkNyZWF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgb25VcGRhdGVcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICovXG5cbi8vIFV0aWxzXG4vLyBNZXRob2RzXG52YXIgUG9wcGVyID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQb3BwZXIuanMgaW5zdGFuY2UuXG4gICAqIEBjbGFzcyBQb3BwZXJcbiAgICogQHBhcmFtIHtFbGVtZW50fHJlZmVyZW5jZU9iamVjdH0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHBvcHBlciAtIFRoZSBIVE1MIC8gWE1MIGVsZW1lbnQgdXNlZCBhcyB0aGUgcG9wcGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gWW91ciBjdXN0b20gb3B0aW9ucyB0byBvdmVycmlkZSB0aGUgb25lcyBkZWZpbmVkIGluIFtEZWZhdWx0c10oI2RlZmF1bHRzKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGluc3RhbmNlIC0gVGhlIGdlbmVyYXRlZCBQb3BwZXIuanMgaW5zdGFuY2VcbiAgICovXG4gIGZ1bmN0aW9uIFBvcHBlcihyZWZlcmVuY2UsIHBvcHBlcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wcGVyKTtcblxuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnVwZGF0ZSk7XG4gICAgfTtcblxuICAgIC8vIG1ha2UgdXBkYXRlKCkgZGVib3VuY2VkLCBzbyB0aGF0IGl0IG9ubHkgcnVucyBhdCBtb3N0IG9uY2UtcGVyLXRpY2tcbiAgICB0aGlzLnVwZGF0ZSA9IGRlYm91bmNlKHRoaXMudXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgLy8gd2l0aCB7fSB3ZSBjcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG9wdGlvbnMgaW5zaWRlIGl0XG4gICAgdGhpcy5vcHRpb25zID0gX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAvLyBpbml0IHN0YXRlXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzRGVzdHJveWVkOiBmYWxzZSxcbiAgICAgIGlzQ3JlYXRlZDogZmFsc2UsXG4gICAgICBzY3JvbGxQYXJlbnRzOiBbXVxuICAgIH07XG5cbiAgICAvLyBnZXQgcmVmZXJlbmNlIGFuZCBwb3BwZXIgZWxlbWVudHMgKGFsbG93IGpRdWVyeSB3cmFwcGVycylcbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZSAmJiByZWZlcmVuY2UuanF1ZXJ5ID8gcmVmZXJlbmNlWzBdIDogcmVmZXJlbmNlO1xuICAgIHRoaXMucG9wcGVyID0gcG9wcGVyICYmIHBvcHBlci5qcXVlcnkgPyBwb3BwZXJbMF0gOiBwb3BwZXI7XG5cbiAgICAvLyBEZWVwIG1lcmdlIG1vZGlmaWVycyBvcHRpb25zXG4gICAgdGhpcy5vcHRpb25zLm1vZGlmaWVycyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKF9leHRlbmRzKHt9LCBQb3BwZXIuRGVmYXVsdHMubW9kaWZpZXJzLCBvcHRpb25zLm1vZGlmaWVycykpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMubW9kaWZpZXJzW25hbWVdID0gX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnNbbmFtZV0gfHwge30sIG9wdGlvbnMubW9kaWZpZXJzID8gb3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gOiB7fSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWZhY3RvcmluZyBtb2RpZmllcnMnIGxpc3QgKE9iamVjdCA9PiBBcnJheSlcbiAgICB0aGlzLm1vZGlmaWVycyA9IE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucy5tb2RpZmllcnMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgbmFtZTogbmFtZVxuICAgICAgfSwgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0pO1xuICAgIH0pXG4gICAgLy8gc29ydCB0aGUgbW9kaWZpZXJzIGJ5IG9yZGVyXG4gICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICB9KTtcblxuICAgIC8vIG1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgd2hlbiBQb3BwZXIuanMgZ2V0IGluaXRlZFxuICAgIC8vIHN1Y2ggY29kZSBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBvZiBpdHMgbW9kaWZpZXJcbiAgICAvLyB0aGV5IGNvdWxkIGFkZCBuZXcgcHJvcGVydGllcyB0byB0aGVpciBvcHRpb25zIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBCRSBBV0FSRTogZG9uJ3QgYWRkIG9wdGlvbnMgdG8gYG9wdGlvbnMubW9kaWZpZXJzLm5hbWVgIGJ1dCB0byBgbW9kaWZpZXJPcHRpb25zYCFcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllck9wdGlvbnMpIHtcbiAgICAgIGlmIChtb2RpZmllck9wdGlvbnMuZW5hYmxlZCAmJiBpc0Z1bmN0aW9uKG1vZGlmaWVyT3B0aW9ucy5vbkxvYWQpKSB7XG4gICAgICAgIG1vZGlmaWVyT3B0aW9ucy5vbkxvYWQoX3RoaXMucmVmZXJlbmNlLCBfdGhpcy5wb3BwZXIsIF90aGlzLm9wdGlvbnMsIG1vZGlmaWVyT3B0aW9ucywgX3RoaXMuc3RhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZmlyZSB0aGUgZmlyc3QgdXBkYXRlIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIgaW4gdGhlIHJpZ2h0IHBsYWNlXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIHZhciBldmVudHNFbmFibGVkID0gdGhpcy5vcHRpb25zLmV2ZW50c0VuYWJsZWQ7XG4gICAgaWYgKGV2ZW50c0VuYWJsZWQpIHtcbiAgICAgIC8vIHNldHVwIGV2ZW50IGxpc3RlbmVycywgdGhleSB3aWxsIHRha2UgY2FyZSBvZiB1cGRhdGUgdGhlIHBvc2l0aW9uIGluIHNwZWNpZmljIHNpdHVhdGlvbnNcbiAgICAgIHRoaXMuZW5hYmxlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQgPSBldmVudHNFbmFibGVkO1xuICB9XG5cbiAgLy8gV2UgY2FuJ3QgdXNlIGNsYXNzIHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGRvbid0IGdldCBsaXN0ZWQgaW4gdGhlXG4gIC8vIGNsYXNzIHByb3RvdHlwZSBhbmQgYnJlYWsgc3R1ZmYgbGlrZSBTaW5vbiBzdHVic1xuXG5cbiAgY3JlYXRlQ2xhc3MoUG9wcGVyLCBbe1xuICAgIGtleTogJ3VwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSQkMSgpIHtcbiAgICAgIHJldHVybiB1cGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSQkMSgpIHtcbiAgICAgIHJldHVybiBkZXN0cm95LmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZW5hYmxlRXZlbnRMaXN0ZW5lcnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudExpc3RlbmVycyQkMSgpIHtcbiAgICAgIHJldHVybiBlbmFibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rpc2FibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc2FibGVFdmVudExpc3RlbmVycyQkMSgpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYW4gdXBkYXRlLiBJdCB3aWxsIHJ1biBvbiB0aGUgbmV4dCBVSSB1cGRhdGUgYXZhaWxhYmxlLlxuICAgICAqIEBtZXRob2Qgc2NoZWR1bGVVcGRhdGVcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY3VzdG9tIG1vZGlmaWVycy5cbiAgICAgKiBTdGFydGluZyBmcm9tIHZlcnNpb24gMS43LCB0aGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb25seSBpZiB5b3VcbiAgICAgKiBpbmNsdWRlIGBwb3BwZXItdXRpbHMuanNgIGJlZm9yZSBgcG9wcGVyLmpzYC5cbiAgICAgKlxuICAgICAqICoqREVQUkVDQVRJT04qKjogVGhpcyB3YXkgdG8gYWNjZXNzIFBvcHBlclV0aWxzIGlzIGRlcHJlY2F0ZWRcbiAgICAgKiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHYyISBVc2UgdGhlIFBvcHBlclV0aWxzIG1vZHVsZSBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAqIER1ZSB0byB0aGUgaGlnaCBpbnN0YWJpbGl0eSBvZiB0aGUgbWV0aG9kcyBjb250YWluZWQgaW4gVXRpbHMsIHdlIGNhbid0XG4gICAgICogZ3VhcmFudGVlIHRoZW0gdG8gZm9sbG93IHNlbXZlci4gVXNlIHRoZW0gYXQgeW91ciBvd24gcmlzayFcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMS44XG4gICAgICogQG1lbWJlciBVdGlsc1xuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuICB9XSk7XG4gIHJldHVybiBQb3BwZXI7XG59KCk7XG5cbi8qKlxuICogVGhlIGByZWZlcmVuY2VPYmplY3RgIGlzIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggUG9wcGVyLmpzXG4gKiBhbmQgbGV0cyB5b3UgdXNlIGl0IGFzIHJlcGxhY2VtZW50IG9mIGEgcmVhbCBET00gbm9kZS48YnIgLz5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHBvc2l0aW9uIGEgcG9wcGVyIHJlbGF0aXZlbHkgdG8gYSBzZXQgb2YgY29vcmRpbmF0ZXNcbiAqIGluIGNhc2UgeW91IGRvbid0IGhhdmUgYSBET00gbm9kZSB0byB1c2UgYXMgcmVmZXJlbmNlLlxuICpcbiAqIGBgYFxuICogbmV3IFBvcHBlcihyZWZlcmVuY2VPYmplY3QsIHBvcHBlck5vZGUpO1xuICogYGBgXG4gKlxuICogTkI6IFRoaXMgZmVhdHVyZSBpc24ndCBzdXBwb3J0ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4gKiBAbmFtZSByZWZlcmVuY2VPYmplY3RcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGRhdGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHNldCBvZiBjb29yZGluYXRlcyBjb21wYXRpYmxlIHdpdGggdGhlIG5hdGl2ZSBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBtZXRob2QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGF0YS5jbGllbnRXaWR0aFxuICogQW4gRVM2IGdldHRlciB0aGF0IHdpbGwgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudEhlaWdodFxuICogQW4gRVM2IGdldHRlciB0aGF0IHdpbGwgcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKi9cblxuXG5Qb3BwZXIuVXRpbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpLlBvcHBlclV0aWxzO1xuUG9wcGVyLnBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuUG9wcGVyLkRlZmF1bHRzID0gRGVmYXVsdHM7XG5cbmV4cG9ydCBkZWZhdWx0IFBvcHBlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvcHBlci5qcy5tYXBcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiJdLCJzb3VyY2VSb290IjoiIn0=