custom-metrosurvey-widgets
Version:
Custom widgets for the SurveyJS library
410 lines (395 loc) • 37.3 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("widgets/jquery-bar-rating", [], factory);
else if(typeof exports === 'object')
exports["widgets/jquery-bar-rating"] = factory();
else
root["widgets/jquery-bar-rating"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/jquery-bar-rating.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/barrating.svg":
/*!*******************************************************************************!*\
!*** ./node_modules/svg-inline-loader?classPrefix!./src/images/barrating.svg ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><g><path d=\"M12.1,15l-4.6-2.4L2.9,15l0.9-5.1L0,6.3l5.2-0.7L7.5,1l2.3,4.6L15,6.3l-3.8,3.6L12.1,15z\"></path></g></svg>"
/***/ }),
/***/ "./src/jquery-bar-rating.js":
/*!**********************************!*\
!*** ./src/jquery-bar-rating.js ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function init (Survey, $) {
const iconId = 'icon-barrating'
Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, __webpack_require__(/*! svg-inline-loader?classPrefix!./images/barrating.svg */ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/barrating.svg"), '')
$ = $ || window.$
var widget = {
name: 'barrating',
title: 'Bar rating',
iconName: iconId,
widgetIsLoaded: function () {
return typeof $ == 'function' && !!$.fn.barrating
},
defaultJSON: { choices: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] },
isFit: function (question) {
return question.getType() === 'barrating'
},
isDefaultRender: true,
activatedByChanged: function (activatedBy) {
Survey.JsonObject.metaData.addClass(
'barrating',
[
{ name: 'hasOther', visible: false },
{ name: 'otherText', visible: false },
{ name: 'optionsCaption', visible: false },
{ name: 'otherErrorText', visible: false },
{ name: 'storeOthersAsComment', visible: false },
{ name: 'renderAs', visible: false },
{ name: 'select2Config', visible: false },
],
null,
'dropdown',
)
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'showValues:boolean',
default: false,
category: 'general',
})
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'ratingTheme',
category: 'general',
default: 'css-estrellas',
choices: [
'css-caras',
'css-estrellas',
'css-manos',
'css-numeros',
],
})
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'ratingScala',
category: 'general',
default: 'Escala10',
choices: [
{ value: 'Escala5', text: 'Escala de 5' },
{ value: 'Escala10', text: 'Escala de 10' },
],
})
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'orientation',
category: 'general',
default: 'horizontal',
choices: [
{ value: 'horizontal', text: 'Horizontal' },
{ value: 'vertical', text: 'Vertical' },
],
})
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'colorScale',
category: 'general',
default: 'scale-color',
choices: [
{ value: 'scale-color', text: 'Color' },
{ value: 'scale-gray', text: 'Escala de grises' },
],
})
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'textoInicial',
category: 'general',
default: 'Inicio',
isLocalizable: true,
})
Survey.JsonObject.metaData.addProperty('barrating', {
name: 'textoFinalizacion',
category: 'general',
default: 'Fin',
isLocalizable: true,
})
},
afterRender: function (question, el) {
var $customSelect
var $questionInput
var contentContainer = $(el).is('select')
? $(el).parent().parent()[0]
: $(el).parent()[0]
var renderCustomSelect = function () {
$customSelect = $('<select class=\'sv-widget-select\'></select>')
$customSelect.append('<option disabled selected value style="display:none"></option>')
question.visibleChoices.forEach(function (choice) {
$customSelect.append(
'<option value="{0}">{1}</option>'.format(choice.value, choice.text),
)
})
$questionInput = $(contentContainer).find(
'[id="{0}"]'.format(question.inputId),
)
$questionInput.css('display', 'none')
$questionInput.after($customSelect)
console.log("abccc:",$customSelect[0].selectedIndex)
setTimeout(()=>{
$customSelect[0].selectedIndex = customSelect[0].length - 1
},250)
}
var removeCustomSelect = function () {
$questionInput.css('display', '')
$customSelect.barrating('destroy')
$customSelect.remove()
}
var renderBarrating = function () {
$customSelect.barrating('show', {
theme: question.ratingTheme,
initialRating: question.value,
showValues: question.showValues,
showSelectedRating: false,
readonly: question.isReadOnly,
onSelect: function (value, text) {
valueChangingByWidget = true
question.value = value
valueChangingByWidget = false
},
})
}
var renderBarratingText = function () {
let parent = $customSelect.parents()[0]
const list = parent.lastChild
let elemInit = document.getElementById(`id-text-barrating-init-${question.inputId}`)
if (elemInit) {
elemInit.innerHTML = question.textoInicial
} else {
const newNodeInit = document.createElement('span')
newNodeInit.id = `id-text-barrating-init-${question.inputId}`
newNodeInit.className = 'text-barrating text-barrating-init'
newNodeInit.innerHTML = question.textoInicial
list.insertBefore(newNodeInit, list.children[0])
}
let elemEnd = document.getElementById(`id-text-barrating-end-${question.inputId}`)
if (elemEnd) {
elemEnd.innerHTML = question.textoFinalizacion
} else {
const newNodeEnd = document.createElement('span')
newNodeEnd.id = `id-text-barrating-end-${question.inputId}`
newNodeEnd.className = 'text-barrating text-barrating-end'
newNodeEnd.innerHTML = question.textoFinalizacion
list.insertBefore(newNodeEnd, null)
}
}
var renderBarratingScale = function () {
let parent = $customSelect.parents()[0]
if (question.ratingScala === 'Escala5') {
parent.classList.remove(`br-theme-scale-10`)
parent.classList.add(`br-theme-scale-5`)
}
if (question.ratingScala === 'Escala10') {
parent.classList.remove(`br-theme-scale-5`)
parent.classList.add(`br-theme-scale-10`)
}
}
var renderBarratingOrientation = function () {
let parent = $customSelect.parents()[0]
if (question.orientation === 'horizontal') {
parent.classList.remove(`br-theme-vertical`)
parent.classList.add(`br-theme-horizontal`)
}
if (question.orientation === 'vertical') {
parent.classList.add(`br-theme-vertical`)
parent.classList.remove(`br-theme-horizontal`)
}
}
var renderBarratingColor = function () {
let parent = $customSelect.parents()[0]
if (question.colorScale === 'scale-gray') {
parent.classList.add(`br-theme-scale-gray`)
} else {
parent.classList.remove(`br-theme-scale-gray`)
}
}
renderCustomSelect()
renderBarrating()
renderBarratingText()
renderBarratingScale()
renderBarratingOrientation()
renderBarratingColor()
if (!!$customSelect.parents()[0])
$customSelect.parents()[0].style.marginBottom = '3px'
var valueChangingByWidget = false
question.valueChangedCallback = function () {
if (
!valueChangingByWidget &&
$(contentContainer).find('select.sv-widget-select')[0].value !==
question.value
) {
$(contentContainer).find('select.sv-widget-select').barrating('set', question.value)
}
}
question.__barratingOnPropertyChangedCallback = function (
sender,
options,
) {
let parent = $customSelect.parents()[0]
if (options.name === 'ratingTheme') {
question.showValues = false
if (question.ratingTheme === 'css-numeros') {
question.showValues = true
}
$customSelect.barrating('destroy')
renderBarrating()
renderBarratingText()
}
if (options.name === 'textoInicial' || options.name === 'textoFinalizacion') {
renderBarratingText()
}
if (options.name === 'ratingScala') {
if (question.ratingScala === 'Escala5') {
question.choices = [1, 2, 3, 4, 5]
}
if (question.ratingScala === 'Escala10') {
question.choices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
renderBarratingScale()
}
if (options.name === 'orientation') {
renderBarratingOrientation()
}
if (options.name === 'colorScale') {
renderBarratingColor()
}
}
question.onPropertyChanged.add(
question.__barratingOnPropertyChangedCallback,
)
question.readOnlyChangedCallback = function () {
removeCustomSelect()
renderCustomSelect()
renderBarrating()
renderBarratingText()
renderBarratingScale()
renderBarratingOrientation()
renderBarratingColor()
}
question.visibleChoicesChangedCallback = function () {
removeCustomSelect()
renderCustomSelect()
renderBarrating()
renderBarratingText()
renderBarratingScale()
renderBarratingOrientation()
renderBarratingColor()
}
},
willUnmount: function (question, el) {
var $contentContainer = $(el).is('select')
? $(el).parent().parent()
: $(el).parent()
var $el = $contentContainer.find('select.sv-widget-select')
$el.barrating('destroy')
$el.remove()
question.valueChangedCallback = undefined
question.onPropertyChanged.remove(
question.__barratingOnPropertyChangedCallback,
)
question.__barratingOnPropertyChangedCallback = undefined
},
pdfQuestionType: 'dropdown',
}
Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, 'customtype')
}
if (typeof Survey !== 'undefined') {
init(Survey, window.$)
}
/* harmony default export */ __webpack_exports__["default"] = (init);
/***/ })
/******/ });
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1tuYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaW1hZ2VzL2JhcnJhdGluZy5zdmciLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2pxdWVyeS1iYXItcmF0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkEseU07Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFDQTtBQUNBLHVFQUF1RSxtQkFBTyxDQUFDLDhJQUFzRDtBQUNySTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxrQkFBa0IsMkNBQTJDO0FBQzdEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsb0NBQW9DO0FBQy9DLFdBQVcseUNBQXlDO0FBQ3BELFdBQVcseUNBQXlDO0FBQ3BELFdBQVcsK0NBQStDO0FBQzFELFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsd0NBQXdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0NBQXdDO0FBQ25ELFdBQVcsMENBQTBDO0FBQ3JEO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDBDQUEwQztBQUNyRCxXQUFXLHNDQUFzQztBQUNqRDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxzQ0FBc0M7QUFDakQsV0FBVyxnREFBZ0Q7QUFDM0Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0FBQ3BDO0FBQ0EsU0FBUztBQUNUO0FBQ0EsaUJBQWlCLEVBQUU7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxpQkFBaUI7QUFDMUY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHFEQUFxRCxpQkFBaUI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUVBQXVFLGlCQUFpQjtBQUN4RjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsbURBQW1ELGlCQUFpQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZSxtRUFBSSIsImZpbGUiOiJ3aWRnZXRzL2pxdWVyeS1iYXItcmF0aW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJ3aWRnZXRzL2pxdWVyeS1iYXItcmF0aW5nXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIndpZGdldHMvanF1ZXJ5LWJhci1yYXRpbmdcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wid2lkZ2V0cy9qcXVlcnktYmFyLXJhdGluZ1wiXSA9IGZhY3RvcnkoKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvanF1ZXJ5LWJhci1yYXRpbmcuanNcIik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGc+PHBhdGggZD1cXFwiTTEyLjEsMTVsLTQuNi0yLjRMMi45LDE1bDAuOS01LjFMMCw2LjNsNS4yLTAuN0w3LjUsMWwyLjMsNC42TDE1LDYuM2wtMy44LDMuNkwxMi4xLDE1elxcXCI+PC9wYXRoPjwvZz48L3N2Zz5cIiIsImZ1bmN0aW9uIGluaXQgKFN1cnZleSwgJCkge1xuICBjb25zdCBpY29uSWQgPSAnaWNvbi1iYXJyYXRpbmcnXG4gIFN1cnZleS5TdmdSZWdpc3RyeSAmJiBTdXJ2ZXkuU3ZnUmVnaXN0cnkucmVnaXN0ZXJJY29uRnJvbVN2ZyhpY29uSWQsIHJlcXVpcmUoJ3N2Zy1pbmxpbmUtbG9hZGVyP2NsYXNzUHJlZml4IS4vaW1hZ2VzL2JhcnJhdGluZy5zdmcnKSwgJycpXG4gICQgPSAkIHx8IHdpbmRvdy4kXG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogJ2JhcnJhdGluZycsXG4gICAgdGl0bGU6ICdCYXIgcmF0aW5nJyxcbiAgICBpY29uTmFtZTogaWNvbklkLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mICQgPT0gJ2Z1bmN0aW9uJyAmJiAhISQuZm4uYmFycmF0aW5nXG4gICAgfSxcbiAgICBkZWZhdWx0SlNPTjogeyBjaG9pY2VzOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gJ2JhcnJhdGluZydcbiAgICB9LFxuICAgIGlzRGVmYXVsdFJlbmRlcjogdHJ1ZSxcbiAgICBhY3RpdmF0ZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uIChhY3RpdmF0ZWRCeSkge1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gICAgICAgICdiYXJyYXRpbmcnLFxuICAgICAgICBbXG4gICAgICAgICAgeyBuYW1lOiAnaGFzT3RoZXInLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogJ290aGVyVGV4dCcsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiAnb3B0aW9uc0NhcHRpb24nLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogJ290aGVyRXJyb3JUZXh0JywgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6ICdzdG9yZU90aGVyc0FzQ29tbWVudCcsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiAncmVuZGVyQXMnLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogJ3NlbGVjdDJDb25maWcnLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICBdLFxuICAgICAgICBudWxsLFxuICAgICAgICAnZHJvcGRvd24nLFxuICAgICAgKVxuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoJ2JhcnJhdGluZycsIHtcbiAgICAgICAgbmFtZTogJ3Nob3dWYWx1ZXM6Ym9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdyYXRpbmdUaGVtZScsXG4gICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgIGRlZmF1bHQ6ICdjc3MtZXN0cmVsbGFzJyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICdjc3MtY2FyYXMnLFxuICAgICAgICAgICdjc3MtZXN0cmVsbGFzJyxcbiAgICAgICAgICAnY3NzLW1hbm9zJyxcbiAgICAgICAgICAnY3NzLW51bWVyb3MnLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdyYXRpbmdTY2FsYScsXG4gICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgIGRlZmF1bHQ6ICdFc2NhbGExMCcsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHZhbHVlOiAnRXNjYWxhNScsIHRleHQ6ICdFc2NhbGEgZGUgNScgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnRXNjYWxhMTAnLCB0ZXh0OiAnRXNjYWxhIGRlIDEwJyB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdvcmllbnRhdGlvbicsXG4gICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgIGRlZmF1bHQ6ICdob3Jpem9udGFsJyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdmFsdWU6ICdob3Jpem9udGFsJywgdGV4dDogJ0hvcml6b250YWwnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJ3ZlcnRpY2FsJywgdGV4dDogJ1ZlcnRpY2FsJyB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdjb2xvclNjYWxlJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdnZW5lcmFsJyxcbiAgICAgICAgZGVmYXVsdDogJ3NjYWxlLWNvbG9yJyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdmFsdWU6ICdzY2FsZS1jb2xvcicsIHRleHQ6ICdDb2xvcicgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnc2NhbGUtZ3JheScsIHRleHQ6ICdFc2NhbGEgZGUgZ3Jpc2VzJyB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICd0ZXh0b0luaWNpYWwnLFxuICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgICBkZWZhdWx0OiAnSW5pY2lvJyxcbiAgICAgICAgaXNMb2NhbGl6YWJsZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eSgnYmFycmF0aW5nJywge1xuICAgICAgICBuYW1lOiAndGV4dG9GaW5hbGl6YWNpb24nLFxuICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgICBkZWZhdWx0OiAnRmluJyxcbiAgICAgICAgaXNMb2NhbGl6YWJsZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgdmFyICRjdXN0b21TZWxlY3RcbiAgICAgIHZhciAkcXVlc3Rpb25JbnB1dFxuICAgICAgdmFyIGNvbnRlbnRDb250YWluZXIgPSAkKGVsKS5pcygnc2VsZWN0JylcbiAgICAgICAgPyAkKGVsKS5wYXJlbnQoKS5wYXJlbnQoKVswXVxuICAgICAgICA6ICQoZWwpLnBhcmVudCgpWzBdXG4gICAgICB2YXIgcmVuZGVyQ3VzdG9tU2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkY3VzdG9tU2VsZWN0ID0gJCgnPHNlbGVjdCBjbGFzcz1cXCdzdi13aWRnZXQtc2VsZWN0XFwnPjwvc2VsZWN0PicpXG4gICAgICAgICRjdXN0b21TZWxlY3QuYXBwZW5kKCc8b3B0aW9uIGRpc2FibGVkIHNlbGVjdGVkIHZhbHVlIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PC9vcHRpb24+JylcbiAgICAgICAgcXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hvaWNlKSB7XG4gICAgICAgICAgJGN1c3RvbVNlbGVjdC5hcHBlbmQoXG4gICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT1cInswfVwiPnsxfTwvb3B0aW9uPicuZm9ybWF0KGNob2ljZS52YWx1ZSwgY2hvaWNlLnRleHQpLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgICAgJHF1ZXN0aW9uSW5wdXQgPSAkKGNvbnRlbnRDb250YWluZXIpLmZpbmQoXG4gICAgICAgICAgJ1tpZD1cInswfVwiXScuZm9ybWF0KHF1ZXN0aW9uLmlucHV0SWQpLFxuICAgICAgICApXG4gICAgICAgICRxdWVzdGlvbklucHV0LmNzcygnZGlzcGxheScsICdub25lJylcbiAgICAgICAgJHF1ZXN0aW9uSW5wdXQuYWZ0ZXIoJGN1c3RvbVNlbGVjdClcbiAgICAgICAgY29uc29sZS5sb2coXCJhYmNjYzpcIiwkY3VzdG9tU2VsZWN0WzBdLnNlbGVjdGVkSW5kZXgpXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAkY3VzdG9tU2VsZWN0WzBdLnNlbGVjdGVkSW5kZXggPSBjdXN0b21TZWxlY3RbMF0ubGVuZ3RoIC0gMVxuICAgICAgICB9LDI1MClcbiAgICAgIH1cbiAgICAgIHZhciByZW1vdmVDdXN0b21TZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRxdWVzdGlvbklucHV0LmNzcygnZGlzcGxheScsICcnKVxuICAgICAgICAkY3VzdG9tU2VsZWN0LmJhcnJhdGluZygnZGVzdHJveScpXG4gICAgICAgICRjdXN0b21TZWxlY3QucmVtb3ZlKClcbiAgICAgIH1cbiAgICAgIHZhciByZW5kZXJCYXJyYXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRjdXN0b21TZWxlY3QuYmFycmF0aW5nKCdzaG93Jywge1xuICAgICAgICAgIHRoZW1lOiBxdWVzdGlvbi5yYXRpbmdUaGVtZSxcbiAgICAgICAgICBpbml0aWFsUmF0aW5nOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgICBzaG93VmFsdWVzOiBxdWVzdGlvbi5zaG93VmFsdWVzLFxuICAgICAgICAgIHNob3dTZWxlY3RlZFJhdGluZzogZmFsc2UsXG4gICAgICAgICAgcmVhZG9ubHk6IHF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uICh2YWx1ZSwgdGV4dCkge1xuICAgICAgICAgICAgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gdHJ1ZVxuICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuXG4gICAgICB9XG4gICAgICB2YXIgcmVuZGVyQmFycmF0aW5nVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdXG4gICAgICAgIGNvbnN0IGxpc3QgPSBwYXJlbnQubGFzdENoaWxkXG4gICAgICAgIGxldCBlbGVtSW5pdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBpZC10ZXh0LWJhcnJhdGluZy1pbml0LSR7cXVlc3Rpb24uaW5wdXRJZH1gKVxuICAgICAgICBpZiAoZWxlbUluaXQpIHtcbiAgICAgICAgICBlbGVtSW5pdC5pbm5lckhUTUwgPSBxdWVzdGlvbi50ZXh0b0luaWNpYWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXdOb2RlSW5pdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgICAgIG5ld05vZGVJbml0LmlkID0gYGlkLXRleHQtYmFycmF0aW5nLWluaXQtJHtxdWVzdGlvbi5pbnB1dElkfWBcbiAgICAgICAgICBuZXdOb2RlSW5pdC5jbGFzc05hbWUgPSAndGV4dC1iYXJyYXRpbmcgdGV4dC1iYXJyYXRpbmctaW5pdCdcbiAgICAgICAgICBuZXdOb2RlSW5pdC5pbm5lckhUTUwgPSBxdWVzdGlvbi50ZXh0b0luaWNpYWxcbiAgICAgICAgICBsaXN0Lmluc2VydEJlZm9yZShuZXdOb2RlSW5pdCwgbGlzdC5jaGlsZHJlblswXSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtRW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGlkLXRleHQtYmFycmF0aW5nLWVuZC0ke3F1ZXN0aW9uLmlucHV0SWR9YClcbiAgICAgICAgaWYgKGVsZW1FbmQpIHtcbiAgICAgICAgICBlbGVtRW5kLmlubmVySFRNTCA9IHF1ZXN0aW9uLnRleHRvRmluYWxpemFjaW9uXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZUVuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgICAgIG5ld05vZGVFbmQuaWQgPSBgaWQtdGV4dC1iYXJyYXRpbmctZW5kLSR7cXVlc3Rpb24uaW5wdXRJZH1gXG4gICAgICAgICAgbmV3Tm9kZUVuZC5jbGFzc05hbWUgPSAndGV4dC1iYXJyYXRpbmcgdGV4dC1iYXJyYXRpbmctZW5kJ1xuICAgICAgICAgIG5ld05vZGVFbmQuaW5uZXJIVE1MID0gcXVlc3Rpb24udGV4dG9GaW5hbGl6YWNpb25cbiAgICAgICAgICBsaXN0Lmluc2VydEJlZm9yZShuZXdOb2RlRW5kLCBudWxsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgcmVuZGVyQmFycmF0aW5nU2NhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAkY3VzdG9tU2VsZWN0LnBhcmVudHMoKVswXVxuICAgICAgICBpZiAocXVlc3Rpb24ucmF0aW5nU2NhbGEgPT09ICdFc2NhbGE1Jykge1xuICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKGBici10aGVtZS1zY2FsZS0xMGApXG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoYGJyLXRoZW1lLXNjYWxlLTVgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdTY2FsYSA9PT0gJ0VzY2FsYTEwJykge1xuICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKGBici10aGVtZS1zY2FsZS01YClcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChgYnItdGhlbWUtc2NhbGUtMTBgKVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIHZhciByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdXG4gICAgICAgIGlmIChxdWVzdGlvbi5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5yZW1vdmUoYGJyLXRoZW1lLXZlcnRpY2FsYClcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChgYnItdGhlbWUtaG9yaXpvbnRhbGApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXN0aW9uLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoYGJyLXRoZW1lLXZlcnRpY2FsYClcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShgYnItdGhlbWUtaG9yaXpvbnRhbGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByZW5kZXJCYXJyYXRpbmdDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdXG4gICAgICAgIGlmIChxdWVzdGlvbi5jb2xvclNjYWxlID09PSAnc2NhbGUtZ3JheScpIHtcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChgYnItdGhlbWUtc2NhbGUtZ3JheWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5yZW1vdmUoYGJyLXRoZW1lLXNjYWxlLWdyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZW5kZXJDdXN0b21TZWxlY3QoKVxuICAgICAgcmVuZGVyQmFycmF0aW5nKClcbiAgICAgIHJlbmRlckJhcnJhdGluZ1RleHQoKVxuICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgcmVuZGVyQmFycmF0aW5nT3JpZW50YXRpb24oKVxuICAgICAgcmVuZGVyQmFycmF0aW5nQ29sb3IoKVxuICAgICAgaWYgKCEhJGN1c3RvbVNlbGVjdC5wYXJlbnRzKClbMF0pXG4gICAgICAgICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdLnN0eWxlLm1hcmdpbkJvdHRvbSA9ICczcHgnXG4gICAgICB2YXIgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gZmFsc2VcblxuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ICYmXG4gICAgICAgICAgJChjb250ZW50Q29udGFpbmVyKS5maW5kKCdzZWxlY3Quc3Ytd2lkZ2V0LXNlbGVjdCcpWzBdLnZhbHVlICE9PVxuICAgICAgICAgIHF1ZXN0aW9uLnZhbHVlXG4gICAgICAgICkge1xuICAgICAgICAgICQoY29udGVudENvbnRhaW5lcikuZmluZCgnc2VsZWN0LnN2LXdpZGdldC1zZWxlY3QnKS5iYXJyYXRpbmcoJ3NldCcsIHF1ZXN0aW9uLnZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5fX2JhcnJhdGluZ09uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoXG4gICAgICAgIHNlbmRlcixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICkge1xuICAgICAgICBsZXQgcGFyZW50ID0gJGN1c3RvbVNlbGVjdC5wYXJlbnRzKClbMF1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ3JhdGluZ1RoZW1lJykge1xuICAgICAgICAgIHF1ZXN0aW9uLnNob3dWYWx1ZXMgPSBmYWxzZVxuICAgICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdUaGVtZSA9PT0gJ2Nzcy1udW1lcm9zJykge1xuICAgICAgICAgICAgcXVlc3Rpb24uc2hvd1ZhbHVlcyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgJGN1c3RvbVNlbGVjdC5iYXJyYXRpbmcoJ2Rlc3Ryb3knKVxuICAgICAgICAgIHJlbmRlckJhcnJhdGluZygpXG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nVGV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ3RleHRvSW5pY2lhbCcgfHwgb3B0aW9ucy5uYW1lID09PSAndGV4dG9GaW5hbGl6YWNpb24nKSB7XG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nVGV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ3JhdGluZ1NjYWxhJykge1xuICAgICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdTY2FsYSA9PT0gJ0VzY2FsYTUnKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdTY2FsYSA9PT0gJ0VzY2FsYTEwJykge1xuICAgICAgICAgICAgcXVlc3Rpb24uY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdvcmllbnRhdGlvbicpIHtcbiAgICAgICAgICByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbigpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ2NvbG9yU2NhbGUnKSB7XG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nQ29sb3IoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5hZGQoXG4gICAgICAgIHF1ZXN0aW9uLl9fYmFycmF0aW5nT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayxcbiAgICAgIClcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZW1vdmVDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmcoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdUZXh0KClcbiAgICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbigpXG4gICAgICAgIHJlbmRlckJhcnJhdGluZ0NvbG9yKClcbiAgICAgIH1cbiAgICAgIHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZW1vdmVDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmcoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdUZXh0KClcbiAgICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbigpXG4gICAgICAgIHJlbmRlckJhcnJhdGluZ0NvbG9yKClcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGNvbnRlbnRDb250YWluZXIgPSAkKGVsKS5pcygnc2VsZWN0JylcbiAgICAgICAgPyAkKGVsKS5wYXJlbnQoKS5wYXJlbnQoKVxuICAgICAgICA6ICQoZWwpLnBhcmVudCgpXG4gICAgICB2YXIgJGVsID0gJGNvbnRlbnRDb250YWluZXIuZmluZCgnc2VsZWN0LnN2LXdpZGdldC1zZWxlY3QnKVxuICAgICAgJGVsLmJhcnJhdGluZygnZGVzdHJveScpXG4gICAgICAkZWwucmVtb3ZlKClcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkXG4gICAgICBxdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5yZW1vdmUoXG4gICAgICAgIHF1ZXN0aW9uLl9fYmFycmF0aW5nT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayxcbiAgICAgIClcbiAgICAgIHF1ZXN0aW9uLl9fYmFycmF0aW5nT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgcGRmUXVlc3Rpb25UeXBlOiAnZHJvcGRvd24nLFxuICB9XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgJ2N1c3RvbXR5cGUnKVxufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgaW5pdChTdXJ2ZXksIHdpbmRvdy4kKVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0XG4iXSwic291cmNlUm9vdCI6IiJ9