surveyjs-widgets
Version:
Custom widgets for the SurveyJS library
286 lines (275 loc) • 24.1 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-ui-datepicker", [], factory);
else if(typeof exports === 'object')
exports["widgets/jquery-ui-datepicker"] = factory();
else
root["widgets/jquery-ui-datepicker"] = factory();
})(self, () => {
return /******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/datepicker.svg":
/*!*****************************************************************************************!*\
!*** ./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/datepicker.svg ***!
\*****************************************************************************************/
/***/ ((module) => {
module.exports = "<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><g><rect x=\"3\" y=\"7\" width=\"2\" height=\"2\"></rect><rect x=\"7\" y=\"11\" width=\"2\" height=\"2\"></rect><rect x=\"3\" y=\"11\" width=\"2\" height=\"2\"></rect><rect x=\"11\" y=\"11\" width=\"2\" height=\"2\"></rect><rect x=\"11\" y=\"7\" width=\"2\" height=\"2\"></rect><path d=\"M10,6H6v4h4V6z M9,9H7V7h2V9z\"></path><rect x=\"4\" width=\"1\" height=\"3\"></rect><rect x=\"11\" width=\"1\" height=\"3\"></rect><path d=\"M13,2v2h-3V2H6v2H3V2H0v14h16V2H13z M15,15H1V5h14V15z\"></path></g></svg>"
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
;
/*!*************************************!*\
!*** ./src/jquery-ui-datepicker.js ***!
\*************************************/
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
function init(Survey, $) {
const iconId = "icon-datepicker";
const componentName = "datepicker";
Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, __webpack_require__(/*! svg-inline-loader?classPrefix!./images/datepicker.svg */ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/datepicker.svg"), "");
$ = $ || window.$;
if (
!!$ &&
!$.fn.bootstrapDP &&
!!$.fn.datepicker &&
!!$.fn.datepicker.noConflict
) {
$.fn.bootstrapDP = $.fn.datepicker.noConflict();
if (!$.fn.datepicker) {
$.fn.datepicker = $.fn.bootstrapDP;
}
}
var widget = {
name: componentName,
title: "Date picker",
iconName: iconId,
widgetIsLoaded: function () {
return !!$ && !!$.fn.datepicker && !$.fn.datepicker.noConflict;
},
isFit: function (question) {
return question.getType() === componentName;
},
htmlTemplate: "<input class='form-control widget-datepicker' type='text'>",
activatedByChanged: function (activatedBy) {
Survey.Serializer.addClass(
componentName,
[
{ name: "inputType", visible: false },
{ name: "inputFormat", visible: false },
{ name: "inputMask", visible: false },
],
null,
"text"
);
let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;
if(!!registerQuestion) registerQuestion(componentName);
Survey.Serializer.addProperty(componentName, {
name: "dateFormat",
category: "general",
});
Survey.Serializer.addProperty(componentName, {
name: "config",
category: "general",
visible: false,
default: null,
});
Survey.Serializer.addProperty(componentName, {
name: "maxDate",
category: "general",
});
Survey.Serializer.addProperty(componentName, {
name: "minDate",
category: "general",
});
Survey.Serializer.addProperty(componentName, {
name: "disableInput:boolean",
category: "general",
});
},
afterRender: function (question, el) {
var $el = $(el).is(".widget-datepicker")
? $(el)
: $(el).find(".widget-datepicker");
$el.addClass(question.css.text.root);
var isSelecting = false;
var config = $.extend(true, {}, question.config || {});
if (!!question.placeHolder) {
$el.attr("placeholder", question.placeHolder);
}
if (config.dateFormat === undefined) {
config.dateFormat = !!question.dateFormat
? question.dateFormat
: undefined;
}
if (config.option === undefined) {
config.option = {
minDate: null,
maxDate: null,
};
}
if (!!question.minDate) {
config.minDate = question.minDate;
}
if (!!question.maxDate) {
config.maxDate = question.maxDate;
}
if (!!question.renderedMin) {
config.minDate = new Date(question.renderedMin);
}
if (!!question.renderedMax) {
config.maxDate = new Date(question.renderedMax);
}
config.disabled = question.isReadOnly;
if (config.onSelect === undefined) {
config.onSelect = function (dateText) {
isSelecting = true;
setDateIntoQuestion();
isSelecting = false;
this.fixFocusIE = true;
};
}
config.fixFocusIE = false;
config.onClose = function (dateText, inst) {
this.fixFocusIE = true;
};
config.beforeShow = function (input, inst) {
var result = !!navigator.userAgent.match(/Trident\/7\./)
? !this.fixFocusIE
: true;
this.fixFocusIE = false;
return result;
};
function setDateIntoQuestion() {
var val = $el.datepicker('getDate');
var d = new Date();
val.setHours(d.getHours());
val.setMinutes(d.getMinutes());
val.setSeconds(d.getSeconds());
question.value = val;
}
var pickerWidget = $el.datepicker(config).on("change", function (e) {
setDateIntoQuestion();
});
$el.keyup(function (e) {
if (e.keyCode == 8 || e.keyCode == 46) {
$.datepicker._clearDate(this);
}
});
if(question.disableInput) {
$el.attr("readOnly", "true");
}
question.readOnlyChangedCallback = function () {
$el.datepicker("option", "disabled", question.isReadOnly);
};
function updateDate() {
if (!question.isEmpty()) {
var val = question.value;
if(typeof val === "string") {
val = new Date(val);
}
pickerWidget.datepicker("setDate", val);
} else {
pickerWidget.datepicker("setDate", null);
}
}
question.registerFunctionOnPropertyValueChanged(
"dateFormat",
function () {
question.dateFormat &&
pickerWidget.datepicker(
"option",
"dateFormat",
question.dateFormat
);
updateDate();
}
);
question.valueChangedCallback = function () {
if (!isSelecting) {
updateDate();
$el.blur();
}
};
question.valueChangedCallback();
},
willUnmount: function (question, el) {
var $el = $(el).is(".widget-datepicker")
? $(el)
: $(el).find(".widget-datepicker");
$el.datepicker("destroy");
},
pdfQuestionType: "text",
};
Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, "customtype");
}
if (typeof Survey !== "undefined") {
init(Survey, window.jQuery);
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (init);
})();
/******/ return __webpack_exports__;
/******/ })()
;
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0cy9qcXVlcnktdWktZGF0ZXBpY2tlci5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7O0FDVkE7Ozs7OztVQ0FBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsbUJBQU8sQ0FBQyxnSkFBdUQ7QUFDdEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUNBQW1DO0FBQy9DLFlBQVkscUNBQXFDO0FBQ2pELFlBQVksbUNBQW1DO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsdUJBQXVCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsSUFBSSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy8uL3NyYy9pbWFnZXMvZGF0ZXBpY2tlci5zdmciLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3N1cnZleWpzLXdpZGdldHMvLi9zcmMvanF1ZXJ5LXVpLWRhdGVwaWNrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJ3aWRnZXRzL2pxdWVyeS11aS1kYXRlcGlja2VyXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIndpZGdldHMvanF1ZXJ5LXVpLWRhdGVwaWNrZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wid2lkZ2V0cy9qcXVlcnktdWktZGF0ZXBpY2tlclwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGc+PHJlY3QgeD1cXFwiM1xcXCIgeT1cXFwiN1xcXCIgd2lkdGg9XFxcIjJcXFwiIGhlaWdodD1cXFwiMlxcXCI+PC9yZWN0PjxyZWN0IHg9XFxcIjdcXFwiIHk9XFxcIjExXFxcIiB3aWR0aD1cXFwiMlxcXCIgaGVpZ2h0PVxcXCIyXFxcIj48L3JlY3Q+PHJlY3QgeD1cXFwiM1xcXCIgeT1cXFwiMTFcXFwiIHdpZHRoPVxcXCIyXFxcIiBoZWlnaHQ9XFxcIjJcXFwiPjwvcmVjdD48cmVjdCB4PVxcXCIxMVxcXCIgeT1cXFwiMTFcXFwiIHdpZHRoPVxcXCIyXFxcIiBoZWlnaHQ9XFxcIjJcXFwiPjwvcmVjdD48cmVjdCB4PVxcXCIxMVxcXCIgeT1cXFwiN1xcXCIgd2lkdGg9XFxcIjJcXFwiIGhlaWdodD1cXFwiMlxcXCI+PC9yZWN0PjxwYXRoIGQ9XFxcIk0xMCw2SDZ2NGg0VjZ6IE05LDlIN1Y3aDJWOXpcXFwiPjwvcGF0aD48cmVjdCB4PVxcXCI0XFxcIiB3aWR0aD1cXFwiMVxcXCIgaGVpZ2h0PVxcXCIzXFxcIj48L3JlY3Q+PHJlY3QgeD1cXFwiMTFcXFwiIHdpZHRoPVxcXCIxXFxcIiBoZWlnaHQ9XFxcIjNcXFwiPjwvcmVjdD48cGF0aCBkPVxcXCJNMTMsMnYyaC0zVjJINnYySDNWMkgwdjE0aDE2VjJIMTN6IE0xNSwxNUgxVjVoMTRWMTV6XFxcIj48L3BhdGg+PC9nPjwvc3ZnPlwiIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJmdW5jdGlvbiBpbml0KFN1cnZleSwgJCkge1xuICBjb25zdCBpY29uSWQgPSBcImljb24tZGF0ZXBpY2tlclwiO1xuICBjb25zdCBjb21wb25lbnROYW1lID0gXCJkYXRlcGlja2VyXCI7XG4gIFN1cnZleS5TdmdSZWdpc3RyeSAmJiBTdXJ2ZXkuU3ZnUmVnaXN0cnkucmVnaXN0ZXJJY29uRnJvbVN2ZyhpY29uSWQsIHJlcXVpcmUoJ3N2Zy1pbmxpbmUtbG9hZGVyP2NsYXNzUHJlZml4IS4vaW1hZ2VzL2RhdGVwaWNrZXIuc3ZnJyksIFwiXCIpO1xuICAkID0gJCB8fCB3aW5kb3cuJDtcbiAgaWYgKFxuICAgICEhJCAmJlxuICAgICEkLmZuLmJvb3RzdHJhcERQICYmXG4gICAgISEkLmZuLmRhdGVwaWNrZXIgJiZcbiAgICAhISQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0XG4gICkge1xuICAgICQuZm4uYm9vdHN0cmFwRFAgPSAkLmZuLmRhdGVwaWNrZXIubm9Db25mbGljdCgpO1xuICAgIGlmICghJC5mbi5kYXRlcGlja2VyKSB7XG4gICAgICAkLmZuLmRhdGVwaWNrZXIgPSAkLmZuLmJvb3RzdHJhcERQO1xuICAgIH1cbiAgfVxuICB2YXIgd2lkZ2V0ID0ge1xuICAgIG5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgdGl0bGU6IFwiRGF0ZSBwaWNrZXJcIixcbiAgICBpY29uTmFtZTogaWNvbklkLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISEkICYmICEhJC5mbi5kYXRlcGlja2VyICYmICEkLmZuLmRhdGVwaWNrZXIubm9Db25mbGljdDtcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCkgPT09IGNvbXBvbmVudE5hbWU7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6IFwiPGlucHV0IGNsYXNzPSdmb3JtLWNvbnRyb2wgd2lkZ2V0LWRhdGVwaWNrZXInIHR5cGU9J3RleHQnPlwiLFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgICAgICAgY29tcG9uZW50TmFtZSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgbmFtZTogXCJpbnB1dFR5cGVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwiaW5wdXRGb3JtYXRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwiaW5wdXRNYXNrXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwidGV4dFwiXG4gICAgICApO1xuICAgICAgbGV0IHJlZ2lzdGVyUXVlc3Rpb24gPSBTdXJ2ZXkuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJDdXN0b21RdWVzdGlvbjtcbiAgICAgIGlmKCEhcmVnaXN0ZXJRdWVzdGlvbikgcmVnaXN0ZXJRdWVzdGlvbihjb21wb25lbnROYW1lKTtcbiAgICAgIFN1cnZleS5TZXJpYWxpemVyLmFkZFByb3BlcnR5KGNvbXBvbmVudE5hbWUsIHtcbiAgICAgICAgbmFtZTogXCJkYXRlRm9ybWF0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIH0pO1xuICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoY29tcG9uZW50TmFtZSwge1xuICAgICAgICBuYW1lOiBcImNvbmZpZ1wiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSk7XG4gICAgICBTdXJ2ZXkuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShjb21wb25lbnROYW1lLCB7XG4gICAgICAgIG5hbWU6IFwibWF4RGF0ZVwiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5TZXJpYWxpemVyLmFkZFByb3BlcnR5KGNvbXBvbmVudE5hbWUsIHtcbiAgICAgICAgbmFtZTogXCJtaW5EYXRlXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIH0pO1xuICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoY29tcG9uZW50TmFtZSwge1xuICAgICAgICBuYW1lOiBcImRpc2FibGVJbnB1dDpib29sZWFuXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHZhciAkZWwgPSAkKGVsKS5pcyhcIi53aWRnZXQtZGF0ZXBpY2tlclwiKVxuICAgICAgICA/ICQoZWwpXG4gICAgICAgIDogJChlbCkuZmluZChcIi53aWRnZXQtZGF0ZXBpY2tlclwiKTtcbiAgICAgICRlbC5hZGRDbGFzcyhxdWVzdGlvbi5jc3MudGV4dC5yb290KTtcbiAgICAgIHZhciBpc1NlbGVjdGluZyA9IGZhbHNlO1xuICAgICAgdmFyIGNvbmZpZyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBxdWVzdGlvbi5jb25maWcgfHwge30pO1xuICAgICAgaWYgKCEhcXVlc3Rpb24ucGxhY2VIb2xkZXIpIHtcbiAgICAgICAgJGVsLmF0dHIoXCJwbGFjZWhvbGRlclwiLCBxdWVzdGlvbi5wbGFjZUhvbGRlcik7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRhdGVGb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25maWcuZGF0ZUZvcm1hdCA9ICEhcXVlc3Rpb24uZGF0ZUZvcm1hdFxuICAgICAgICAgID8gcXVlc3Rpb24uZGF0ZUZvcm1hdFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5vcHRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25maWcub3B0aW9uID0ge1xuICAgICAgICAgIG1pbkRhdGU6IG51bGwsXG4gICAgICAgICAgbWF4RGF0ZTogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghIXF1ZXN0aW9uLm1pbkRhdGUpIHtcbiAgICAgICAgY29uZmlnLm1pbkRhdGUgPSBxdWVzdGlvbi5taW5EYXRlO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24ubWF4RGF0ZSkge1xuICAgICAgICBjb25maWcubWF4RGF0ZSA9IHF1ZXN0aW9uLm1heERhdGU7XG4gICAgICB9XG4gICAgICBpZiAoISFxdWVzdGlvbi5yZW5kZXJlZE1pbikge1xuICAgICAgICBjb25maWcubWluRGF0ZSA9IG5ldyBEYXRlKHF1ZXN0aW9uLnJlbmRlcmVkTWluKTtcbiAgICAgIH1cbiAgICAgIGlmICghIXF1ZXN0aW9uLnJlbmRlcmVkTWF4KSB7XG4gICAgICAgIGNvbmZpZy5tYXhEYXRlID0gbmV3IERhdGUocXVlc3Rpb24ucmVuZGVyZWRNYXgpO1xuICAgICAgfVxuICAgICAgY29uZmlnLmRpc2FibGVkID0gcXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICAgIGlmIChjb25maWcub25TZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25maWcub25TZWxlY3QgPSBmdW5jdGlvbiAoZGF0ZVRleHQpIHtcbiAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XG4gICAgICAgICAgc2V0RGF0ZUludG9RdWVzdGlvbigpO1xuICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5maXhGb2N1c0lFID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbmZpZy5maXhGb2N1c0lFID0gZmFsc2U7XG4gICAgICBjb25maWcub25DbG9zZSA9IGZ1bmN0aW9uIChkYXRlVGV4dCwgaW5zdCkge1xuICAgICAgICB0aGlzLmZpeEZvY3VzSUUgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5iZWZvcmVTaG93ID0gZnVuY3Rpb24gKGlucHV0LCBpbnN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAhIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1RyaWRlbnRcXC83XFwuLylcbiAgICAgICAgICA/ICF0aGlzLmZpeEZvY3VzSUVcbiAgICAgICAgICA6IHRydWU7XG4gICAgICAgIHRoaXMuZml4Rm9jdXNJRSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHNldERhdGVJbnRvUXVlc3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSAkZWwuZGF0ZXBpY2tlcignZ2V0RGF0ZScpO1xuICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhbC5zZXRIb3VycyhkLmdldEhvdXJzKCkpO1xuICAgICAgICB2YWwuc2V0TWludXRlcyhkLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgIHZhbC5zZXRTZWNvbmRzKGQuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgcXVlc3Rpb24udmFsdWUgPSB2YWw7XG4gICAgICB9XG4gICAgICB2YXIgcGlja2VyV2lkZ2V0ID0gJGVsLmRhdGVwaWNrZXIoY29uZmlnKS5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzZXREYXRlSW50b1F1ZXN0aW9uKCk7XG4gICAgICB9KTtcblxuICAgICAgJGVsLmtleXVwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gOCB8fCBlLmtleUNvZGUgPT0gNDYpIHtcbiAgICAgICAgICAkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZihxdWVzdGlvbi5kaXNhYmxlSW5wdXQpIHtcbiAgICAgICAgJGVsLmF0dHIoXCJyZWFkT25seVwiLCBcInRydWVcIik7XG4gICAgICB9XG5cbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkZWwuZGF0ZXBpY2tlcihcIm9wdGlvblwiLCBcImRpc2FibGVkXCIsIHF1ZXN0aW9uLmlzUmVhZE9ubHkpO1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGUoKSB7XG4gICAgICAgIGlmICghcXVlc3Rpb24uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICAgIGlmKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhbCA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBpY2tlcldpZGdldC5kYXRlcGlja2VyKFwic2V0RGF0ZVwiLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBpY2tlcldpZGdldC5kYXRlcGlja2VyKFwic2V0RGF0ZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVlc3Rpb24ucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIFwiZGF0ZUZvcm1hdFwiLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcXVlc3Rpb24uZGF0ZUZvcm1hdCAmJlxuICAgICAgICAgICAgcGlja2VyV2lkZ2V0LmRhdGVwaWNrZXIoXG4gICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgIFwiZGF0ZUZvcm1hdFwiLFxuICAgICAgICAgICAgICBxdWVzdGlvbi5kYXRlRm9ybWF0XG4gICAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZURhdGUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW5nKSB7XG4gICAgICAgICAgdXBkYXRlRGF0ZSgpO1xuICAgICAgICAgICRlbC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHZhciAkZWwgPSAkKGVsKS5pcyhcIi53aWRnZXQtZGF0ZXBpY2tlclwiKVxuICAgICAgICA/ICQoZWwpXG4gICAgICAgIDogJChlbCkuZmluZChcIi53aWRnZXQtZGF0ZXBpY2tlclwiKTtcbiAgICAgICRlbC5kYXRlcGlja2VyKFwiZGVzdHJveVwiKTtcbiAgICB9LFxuICAgIHBkZlF1ZXN0aW9uVHlwZTogXCJ0ZXh0XCIsXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgXCJjdXN0b210eXBlXCIpO1xufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBpbml0KFN1cnZleSwgd2luZG93LmpRdWVyeSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=