/******/ (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.lean_validator.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/approvejs/dist/approve.min.js": /*!****************************************************!*\ !*** ./node_modules/approvejs/dist/approve.min.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { !function(e,t){ true?module.exports=t():undefined}(this,function(){"use strict";function e(){this.scheme="",this.valid=!1}function t(e){this.strength=e,this.points=0,this.isMinimum=!1,this.hasLower=!1,this.hasUpper=!1,this.hasNumber=!1,this.hasSpecial=!1,this.isBonus=!1,this.percent=0,this.valid=!1,this.errors=[]}var r={message:"{title} is not a valid credit card number",schemes:[{regex:/^(5610|560221|560222|560223|560224|560225)/,scheme:"Australian Bank Card"},{regex:/^(2014|2149)/,scheme:"Diner's Club"},{regex:/^36/,scheme:"Diner's Club International"},{regex:/^(30[0-5]|36|38|54|55|2014|2149)/,scheme:"Diner's Club / Carte Blanche"},{regex:/^35(2[89]|[3-8][0-9])/,scheme:"Japanese Credit Bureau"},{regex:/^(5018|5020|5038|6304|6759|676[1-3])/,scheme:"Maestro"},{regex:/^5[1-5]/,scheme:"Mastercard"},{regex:/^(6304|670[69]|6771)/,scheme:"Laser"},{regex:/^(6334|6767)/,scheme:"Solo (Paymentech)"},{regex:/^(6011|622|64|65)/,scheme:"Discover"},{regex:/^3[47]/,scheme:"American Express"},{regex:/^(4026|417500|4508|4844|491(3|7))/,scheme:"Visa Electron"},{regex:/^(4)/,scheme:"Visa"}],_getScheme:function(e){e=(""+e).replace(/\D/g,"");for(var t=this.schemes.length;t--;)if(this.schemes[t].regex.test(e))return this.schemes[t].scheme},validate:function(t){t=(""+t).replace(/\D/g,"");var r,s=new e,a=t.length,i=0,n=1;if(a<12)return!1;for(;a--;)r=t.charAt(a)*n,i+=r-9*(r>9),n^=3;return s.valid=i%10===0&&i>0,s.scheme=this._getScheme(t),s}},s={minimum:8,minimumBonus:10,strengths:{0:"Very Weak",1:"Weak",2:"Better",3:"Almost",4:"Acceptable",5:"Strong",6:"Very Strong"},message:"{title} did not pass the strength test.",expects:["min","bonus"],errors:{isMinimum:"{title} must be at least {min} characters",hasLower:"{title} must have at least 1 lower case character",hasUpper:"{title} must have at least 1 upper case character",hasNumber:"{title} must have at least 1 number",hasSpecial:"{title} must have at least 1 special character"},_getScore:function(e){var r=new t(this.strengths[0]);return e.length>this.minimumBonus?(r.points+=2,r.isBonus=!0,r.isMinimum=!0):e.length>this.minimum?(r.points++,r.isMinimum=!0):(r.points=1,r.isMinimum=!1),r.hasLower=null!==e.match(/[a-z]/),r.isMinimum&&r.hasLower&&r.points++,r.hasUpper=null!==e.match(/[A-Z]/),r.isMinimum&&r.hasUpper&&r.points++,r.hasNumber=null!==e.match(/\d+/),r.isMinimum&&r.hasNumber&&r.points++,r.hasSpecial=null!==e.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,(,)]/),r.isMinimum&&r.hasSpecial&&r.points++,r.percent=Math.ceil(r.points/6*100),r},_getStrength:function(e){var t=this._getScore(e);return t.strength=this.strengths[t.points],t.isMinimum||t.errors.push(this.errors.isMinimum),t.hasLower||t.errors.push(this.errors.hasLower),t.hasUpper||t.errors.push(this.errors.hasUpper),t.hasSpecial||t.errors.push(this.errors.hasSpecial),t.hasNumber||t.errors.push(this.errors.hasNumber),t.points>4&&(t.valid=!0),t},validate:function(e,t){if(this.minimum=t.min||this.minimum,this.minimumBonus=t.bonus||this.minimumBonus,t.hasOwnProperty("config")&&t.config.hasOwnProperty("messages"))for(var r in t.config.messages)t.config.messages.hasOwnProperty(r)&&(this.errors[r]=t.config.messages[r]);return this._getStrength(e)}},a={required:{validate:function(e){return!!e},message:"{title} is required",expects:!1},email:{regex:/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,validate:function(e){return this.regex.test(e)},message:"{title} must be a valid email address",expects:!1},url:{regex:/^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/i,validate:function(e){return this.regex.test(e)},message:"{title} must be a valid web address",expects:!1},alphaNumeric:{regex:/^[A-Za-z0-9]+$/i,validate:function(e){return this.regex.test(e)},message:"{title} may only contain [A-Za-z] and [0-9]",expects:!1},numeric:{regex:/^-?[0-9]+$/,validate:function(e){return this.regex.test(e)},message:"{title} may only contain [0-9]",expects:!1},alpha:{regex:/^[A-Za-z]+$/,validate:function(e){return this.regex.test(e)},message:"{title} may only contain [A-Za-z]",expects:!1},decimal:{regex:/^\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*$/,validate:function(e){return this.regex.test(e)},message:"{title} must be a valid decimal",expects:!1},currency:{regex:/^\s*(\+|-)?((\d+(\.\d\d)?)|(\.\d\d))\s*$/,validate:function(e){return this.regex.test(e)},message:"{title} must be a valid currency value",expects:!1},ip:{regex:{ipv4:/^(?:(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/,ipv4Cidr:/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/,ipv6:/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i,ipv6Cidr:/^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/},validate:function(e){return this.regex.ipv4.test(e)||this.regex.ipv6.test(e)||this.regex.ipv4Cidr.test(e)||this.regex.ipv6Cidr.test(e)},message:"{title} must be a valid IP address",expects:!1},min:{validate:function(e,t){return"string"==typeof e&&e.length>=t.min},message:"{title} must be a minimum of {min} characters",expects:["min"]},max:{validate:function(e,t){return"string"==typeof e&&e.length<=t.max},message:"{title} must be a maximum of {max} characters",expects:["max"]},range:{validate:function(e,t){return"string"==typeof e?e.length>=t.min&&e.length<=t.max:"number"==typeof e&&(e>=t.min&&e<=t.max)},message:"{title} must be a minimum of {min} and a maximum of {max} characters",expects:["min","max"]},equal:{validate:function(e,t){return""+e==""+t.value},message:"{title} must be equal to {field}",expects:["value","field"]},format:{validate:function(e,t){if("[object RegExp]"===Object.prototype.toString.call(t.regex))return t.regex.test(e);throw"approve.value(): [format] - regex is not a valid regular expression."},message:"{title} did not pass the [{regex}] test",expects:["regex"]},time:{regex:/^(2[0-3]|[01]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])$/,validate:function(e){return this.regex.test(e)},message:"{title} is not a valid time",expects:!1},date:{formats:{ymd:/^(?:\2)(?:[0-9]{2})?[0-9]{2}([\/-])(1[0-2]|0?[1-9])([\/-])(3[01]|[12][0-9]|0?[1-9])$/,dmy:/^(3[01]|[12][0-9]|0?[1-9])([\/-])(1[0-2]|0?[1-9])([\/-])(?:[0-9]{2})?[0-9]{2}$/},validate:function(e,t){return this.formats[t.format].test(e)},message:"{title} is not a valid date",expects:["format"]},truthy:{regex:/^(?:1|t(?:rue)?|y(?:es)?|ok(?:ay)?)$/i,validate:function(e){return this.regex.test(e)},message:"{title} is not valid",expects:!1},falsy:{regex:/^(?:1|t(?:rue)?|y(?:es)?|ok(?:ay)?)$/i,validate:function(e){return!this.regex.test(e)},message:"{title} is not valid",expects:!1},cc:r,strength:s},i=function(){this.approved=!0,this.errors=[],this.failed=[],this.each=function(e){for(var t=e&&e.constructor&&e.call&&e.apply,r=this.errors.length;r--;)t&&e(this.errors[r])},this.filter=function(e,t){var r=t&&t.constructor&&t.call&&t.apply,s=0;if(this.hasOwnProperty(e))for(s=this[e].errors.length;s--;)r&&t(this[e].errors[s])}},n={tests:a,_format:function(e,t){return t="object"==typeof t?t:Array.prototype.slice.call(arguments,1),e.replace(/\{\{|\}\}|\{(\w+)\}/g,function(e,r){return"{{"===e?"{":"}}"===e?"}":t[r]}).trim()},_isRule:function(e){var t=["title","stop","ignoreNull"];return t.indexOf(e)<0},_start:function(e,t){var r=new i,s="",a=!1,n=!1;t.hasOwnProperty("title")&&(s=t.title),t.hasOwnProperty("stop")&&(a=t.stop),t.hasOwnProperty("ignoreNull")&&(n=t.ignoreNull);for(var u in t){if(a&&!r.approved)break;if(t.hasOwnProperty(u)&&this._isRule(u)){var o=t[u];if(!this.tests.hasOwnProperty(u))throw"approve.value(): "+u+" test not defined.";var d={constraint:o,rule:u,title:s,test:this.tests[u],value:e,ignoreNull:n};this._test(d,r)}}return r},_test:function(e,t){if(!e.hasOwnProperty("ignoreNull")||e.value||!e.ignoreNull){var r=this._getArgs(e),s=e.test.validate(e.value,r);if(t[e.rule]={approved:!0,errors:[]},"object"==typeof s){if(t.approved=!!s.valid&&t.approved,t[e.rule].approved=s.valid,s.hasOwnProperty("errors")){var a=this._formatMessages(s.errors,e);t.errors=t.errors.concat(a),t[e.rule].errors=a}for(var i in s)s.hasOwnProperty(i)&&!t.hasOwnProperty(i)&&(t[e.rule][i]=s[i])}else{if("boolean"!=typeof s)throw"approve.value(): "+e.rule+" returned an invalid value";t.approved=!!s&&t.approved,t[e.rule].approved=s}if(!t.approved){var n=this._formatMessage(e);t.errors.push(n),t[e.rule].errors.push(n)}s.valid||t.failed.push(e.rule)}},_eachExpected:function(e,t){if(Array.isArray(e.test.expects))for(var r=e.test.expects.length,s=r;s--;)t(e.test.expects[s],r)},_getArgs:function(e){var t={};return this._eachExpected(e,function(r,s){if(e.constraint.hasOwnProperty(r))t[r]=e.constraint[r];else{if(!(s<=1)||!/^[A-Za-z0-9]+$/i.test(e.constraint)&&"[object RegExp]"!==toString.call(e.constraint))throw"approve.value(): "+e.rule+" expects the "+r+" parameter.";t[r]=e.constraint}}),e.constraint.hasOwnProperty("config")&&(t.config=e.constraint.config),t},_getFormat:function(e){var t={};return this._eachExpected(e,function(r){e.constraint.hasOwnProperty(r)&&(t[r]=e.constraint[r]),/^[A-Za-z0-9]+$/i.test(e.constraint)&&(t[r]=e.constraint)}),t.title=e.title,t},_formatMessages:function(e,t){for(var r=this._getFormat(t),s=e.length;s--;)e[s]=this._format(e[s],r);return e},_formatMessage:function(e){var t,r=this._getFormat(e);return e.constraint.hasOwnProperty("message")?(t=e.constraint.message,this._format(t,r)):(t=e.test.message,this._format(t,r))},value:function(e,t){if("object"!=typeof t)throw"approve.value(value, rules): rules is not a valid object.";return this._start(e,t)},addTest:function(e,t){if("object"!=typeof e)throw"approve.addTest(obj, name): obj is not a valid object.";try{this.tests.hasOwnProperty(t)||(this.tests[t]=e)}catch(r){throw"approve.addTest(): "+r.message}}};return n}); //# sourceMappingURL=approve.min.js.map /***/ }), /***/ "./src/jquery.lean_validator.js": /*!**************************************!*\ !*** ./src/jquery.lean_validator.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _approvejs = __webpack_require__(/*! approvejs */ "./node_modules/approvejs/dist/approve.min.js"); var _approvejs2 = _interopRequireDefault(_approvejs); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } (function ($, approve) { if ($ && approve) { var globalVars = { validationSplitKey: "|", classes: { errorMessage: "lv-validate-error-message", getErrorMessageClass: function getErrorMessageClass() { return "." + this.errorMessage; } }, dataAttributes: { errorContainer: "lvErrorContainer", approvalKey: { raw: "lv-validated", processed: "lvValidated" }, validationRules: { raw: "lv-validate", processed: "lvValidate" }, validationTitle: { raw: "lv-validate-title", processed: "lvValidateTitle" }, noValidateDisabled: { raw: "lv-no-validate-disabled", processed: "lvNoValidateDisabled" } }, rules: { required: { required: true, title: '' }, email: { email: { message: '{title} must be a valid email' }, title: '' }, valid_no_empty_array: { validNonEmptyArray: { message: '{title} cannot be empty' }, title: '' }, number_greater_than_zero: { numberGreaterThanZero: { message: '{title} must be greater than 0' }, title: '' } } }; var methods = { validate: function validate($form) { var $elements = $form.find("[data-" + globalVars.dataAttributes.validationRules.raw + "]"), totalElementsValidated = 0; $elements.map(function (index, element) { var $element = $(element), validationRulesArray = methods._parseValidationRules($element), valueToBeValidated = $element.val(), rulesObject = {}, isElementDisabled = $element.is(":disabled"), shouldNotValidateDisabled = $element.data(globalVars.dataAttributes.noValidateDisabled.processed); if (!isElementDisabled || undefined === shouldNotValidateDisabled) { for (var _index = 0; _index < validationRulesArray.length; _index++) { var rule = validationRulesArray[_index]; if (globalVars.rules.hasOwnProperty(rule)) { var ruleObject = globalVars.rules[rule]; ruleObject.title = undefined !== $element.data(globalVars.dataAttributes.validationTitle.processed) ? $element.data(globalVars.dataAttributes.validationTitle.processed) : "Input"; $.extend(rulesObject, globalVars.rules[rule]); } } var result = approve.value(valueToBeValidated, rulesObject); if (result.approved) { methods._clearErrorMessage($element); totalElementsValidated++; } else { methods._displayErrorMessage($element, result.errors); } } else { methods._clearErrorMessage($element); //Since the element is not getting checked but it was passed for checking. totalElementsValidated++; } }); return totalElementsValidated === $elements.length; }, clear: function clear($form) { var $elements = $form.find("[data-" + globalVars.dataAttributes.validationRules.raw + "]"); $elements.map(function (index, element) { var $element = $(element); methods._clearErrorMessage($element); }); }, _parseValidationRules: function _parseValidationRules($element) { var $rules = $element.data(globalVars.dataAttributes.validationRules.processed); return $rules.split(globalVars.validationSplitKey); }, generateCustomValidationRules: function generateCustomValidationRules() { //Test to check if a valid array and non empty var validNonEmptyArray = {}; validNonEmptyArray.expects = 'array'; validNonEmptyArray.message = '{title} cannot be empty.'; validNonEmptyArray.validate = function (value, pars) { return Array === value.constructor && 0 < value.length; }; //Test to check if a number is greater than zero var numberGreaterThanZero = {}; numberGreaterThanZero.expects = 'number'; numberGreaterThanZero.message = '{title} cannot be lower than 1.'; numberGreaterThanZero.validate = function (value, pars) { return 0 < value; }; approve.addTest(validNonEmptyArray, 'validNonEmptyArray'); approve.addTest(numberGreaterThanZero, 'numberGreaterThanZero'); }, _displayErrorMessage: function _displayErrorMessage($element, errorsArray) { var errorContainer = methods._getErrorContainer($element), errors = ""; for (var index = 0; index < errorsArray.length; index++) { errors += "

" + errorsArray[index] + "

"; } var html = methods._getMessageHtml(errors); if (undefined === errorContainer) { methods._clearErrorMessage($element); $element.parent().append(html); } else { $(errorContainer).empty().append(html); } }, _clearErrorMessage: function _clearErrorMessage($element) { var errorContainer = methods._getErrorContainer($element); if (undefined === errorContainer) { $element.parent().find(globalVars.classes.getErrorMessageClass()).remove(); } else { $(errorContainer).empty(); } }, _getMessageHtml: function _getMessageHtml($errorsString) { return "" + $errorsString + ""; }, _getErrorContainer: function _getErrorContainer($element) { var errorContainerSelector = $element.data(globalVars.dataAttributes.errorContainer), $errorContainer = undefined; if (undefined !== errorContainerSelector) { $errorContainer = $(errorContainerSelector); } return $errorContainer; } }; $.fn.leanValidator = function initiate(method) { var $form = $(this), isFormOk = false; if ($form.is("form")) { //Generate the custom rules used by approve methods.generateCustomValidationRules(); //Method is provided so use that if (undefined !== method) { if (methods.hasOwnProperty(method)) { isFormOk = methods[method]($form); } else { console.log("Method: " + method + " not found on lean validator."); } } else { $form.on("submit", function () { return methods.validate($form); }); } } else { console.log("Please apply lean validator to a form only."); } return isFormOk; }; } else { console.log("Please install https://jquery.com/ and https://charlgottschalk.github.io/approvejs/"); } })(window.$, _approvejs2.default); /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FwcHJvdmVqcy9kaXN0L2FwcHJvdmUubWluLmpzIiwid2VicGFjazovLy8uL3NyYy9qcXVlcnkubGVhbl92YWxpZGF0b3IuanMiXSwibmFtZXMiOlsiJCIsImFwcHJvdmUiLCJnbG9iYWxWYXJzIiwidmFsaWRhdGlvblNwbGl0S2V5IiwiY2xhc3NlcyIsImVycm9yTWVzc2FnZSIsImdldEVycm9yTWVzc2FnZUNsYXNzIiwiZGF0YUF0dHJpYnV0ZXMiLCJlcnJvckNvbnRhaW5lciIsImFwcHJvdmFsS2V5IiwicmF3IiwicHJvY2Vzc2VkIiwidmFsaWRhdGlvblJ1bGVzIiwidmFsaWRhdGlvblRpdGxlIiwibm9WYWxpZGF0ZURpc2FibGVkIiwicnVsZXMiLCJyZXF1aXJlZCIsInRpdGxlIiwiZW1haWwiLCJtZXNzYWdlIiwidmFsaWRfbm9fZW1wdHlfYXJyYXkiLCJ2YWxpZE5vbkVtcHR5QXJyYXkiLCJudW1iZXJfZ3JlYXRlcl90aGFuX3plcm8iLCJudW1iZXJHcmVhdGVyVGhhblplcm8iLCJtZXRob2RzIiwidmFsaWRhdGUiLCIkZm9ybSIsIiRlbGVtZW50cyIsImZpbmQiLCJ0b3RhbEVsZW1lbnRzVmFsaWRhdGVkIiwibWFwIiwiaW5kZXgiLCJlbGVtZW50IiwiJGVsZW1lbnQiLCJ2YWxpZGF0aW9uUnVsZXNBcnJheSIsIl9wYXJzZVZhbGlkYXRpb25SdWxlcyIsInZhbHVlVG9CZVZhbGlkYXRlZCIsInZhbCIsInJ1bGVzT2JqZWN0IiwiaXNFbGVtZW50RGlzYWJsZWQiLCJpcyIsInNob3VsZE5vdFZhbGlkYXRlRGlzYWJsZWQiLCJkYXRhIiwidW5kZWZpbmVkIiwibGVuZ3RoIiwicnVsZSIsImhhc093blByb3BlcnR5IiwicnVsZU9iamVjdCIsImV4dGVuZCIsInJlc3VsdCIsInZhbHVlIiwiYXBwcm92ZWQiLCJfY2xlYXJFcnJvck1lc3NhZ2UiLCJfZGlzcGxheUVycm9yTWVzc2FnZSIsImVycm9ycyIsImNsZWFyIiwiJHJ1bGVzIiwic3BsaXQiLCJnZW5lcmF0ZUN1c3RvbVZhbGlkYXRpb25SdWxlcyIsImV4cGVjdHMiLCJwYXJzIiwiQXJyYXkiLCJjb25zdHJ1Y3RvciIsImFkZFRlc3QiLCJlcnJvcnNBcnJheSIsIl9nZXRFcnJvckNvbnRhaW5lciIsImh0bWwiLCJfZ2V0TWVzc2FnZUh0bWwiLCJwYXJlbnQiLCJhcHBlbmQiLCJlbXB0eSIsInJlbW92ZSIsIiRlcnJvcnNTdHJpbmciLCJlcnJvckNvbnRhaW5lclNlbGVjdG9yIiwiJGVycm9yQ29udGFpbmVyIiwiZm4iLCJsZWFuVmFsaWRhdG9yIiwiaW5pdGlhdGUiLCJtZXRob2QiLCJpc0Zvcm1PayIsImNvbnNvbGUiLCJsb2ciLCJvbiIsIndpbmRvdyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBLGVBQWUsbUNBQXNJLGlCQUFpQixh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TUFFTztBQUNMc0Qsb0JBQVFDLEdBQVIsQ0FBWSxhQUFXSCxNQUFYLEdBQWtCLCtCQUE5QjtBQUNEO0FBQ0YsU0FORCxNQU1PO0FBQ0xwRCxnQkFBTXdELEVBQU4sQ0FBUyxRQUFULEVBQW1CLFlBQVc7QUFDNUIsbUJBQU8xRCxRQUFRQyxRQUFSLENBQWlCQyxLQUFqQixDQUFQO0FBQ0QsV0FGRDtBQUdEO0FBQ0YsT0FoQkQsTUFnQk87QUFDTHNELGdCQUFRQyxHQUFSLENBQVksNkNBQVo7QUFDRDs7QUFFRCxhQUFPRixRQUFQO0FBQ0QsS0F6QkQ7QUEwQkQsR0FoTkQsTUFnTk87QUFDTEMsWUFBUUMsR0FBUixDQUFZLHFGQUFaO0FBQ0Q7QUFDRixDQXBORCxFQW9OR0UsT0FBT25GLENBcE5WLEVBb05hQyxtQkFwTmIsRSIsImZpbGUiOiJqcXVlcnkubGVhbl92YWxpZGF0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9qcXVlcnkubGVhbl92YWxpZGF0b3IuanNcIik7XG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTplLmFwcHJvdmU9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSgpe3RoaXMuc2NoZW1lPVwiXCIsdGhpcy52YWxpZD0hMX1mdW5jdGlvbiB0KGUpe3RoaXMuc3RyZW5ndGg9ZSx0aGlzLnBvaW50cz0wLHRoaXMuaXNNaW5pbXVtPSExLHRoaXMuaGFzTG93ZXI9ITEsdGhpcy5oYXNVcHBlcj0hMSx0aGlzLmhhc051bWJlcj0hMSx0aGlzLmhhc1NwZWNpYWw9ITEsdGhpcy5pc0JvbnVzPSExLHRoaXMucGVyY2VudD0wLHRoaXMudmFsaWQ9ITEsdGhpcy5lcnJvcnM9W119dmFyIHI9e21lc3NhZ2U6XCJ7dGl0bGV9IGlzIG5vdCBhIHZhbGlkIGNyZWRpdCBjYXJkIG51bWJlclwiLHNjaGVtZXM6W3tyZWdleDovXig1NjEwfDU2MDIyMXw1NjAyMjJ8NTYwMjIzfDU2MDIyNHw1NjAyMjUpLyxzY2hlbWU6XCJBdXN0cmFsaWFuIEJhbmsgQ2FyZFwifSx7cmVnZXg6L14oMjAxNHwyMTQ5KS8sc2NoZW1lOlwiRGluZXIncyBDbHViXCJ9LHtyZWdleDovXjM2LyxzY2hlbWU6XCJEaW5lcidzIENsdWIgSW50ZXJuYXRpb25hbFwifSx7cmVnZXg6L14oMzBbMC01XXwzNnwzOHw1NHw1NXwyMDE0fDIxNDkpLyxzY2hlbWU6XCJEaW5lcidzIENsdWIgLyBDYXJ0ZSBCbGFuY2hlXCJ9LHtyZWdleDovXjM1KDJbODldfFszLThdWzAtOV0pLyxzY2hlbWU6XCJKYXBhbmVzZSBDcmVkaXQgQnVyZWF1XCJ9LHtyZWdleDovXig1MDE4fDUwMjB8NTAzOHw2MzA0fDY3NTl8Njc2WzEtM10pLyxzY2hlbWU6XCJNYWVzdHJvXCJ9LHtyZWdleDovXjVbMS01XS8sc2NoZW1lOlwiTWFzdGVyY2FyZFwifSx7cmVnZXg6L14oNjMwNHw2NzBbNjldfDY3NzEpLyxzY2hlbWU6XCJMYXNlclwifSx7cmVnZXg6L14oNjMzNHw2NzY3KS8sc2NoZW1lOlwiU29sbyAoUGF5bWVudGVjaClcIn0se3JlZ2V4Oi9eKDYwMTF8NjIyfDY0fDY1KS8sc2NoZW1lOlwiRGlzY292ZXJcIn0se3JlZ2V4Oi9eM1s0N10vLHNjaGVtZTpcIkFtZXJpY2FuIEV4cHJlc3NcIn0se3JlZ2V4Oi9eKDQwMjZ8NDE3NTAwfDQ1MDh8NDg0NHw0OTEoM3w3KSkvLHNjaGVtZTpcIlZpc2EgRWxlY3Ryb25cIn0se3JlZ2V4Oi9eKDQpLyxzY2hlbWU6XCJWaXNhXCJ9XSxfZ2V0U2NoZW1lOmZ1bmN0aW9uKGUpe2U9KFwiXCIrZSkucmVwbGFjZSgvXFxEL2csXCJcIik7Zm9yKHZhciB0PXRoaXMuc2NoZW1lcy5sZW5ndGg7dC0tOylpZih0aGlzLnNjaGVtZXNbdF0ucmVnZXgudGVzdChlKSlyZXR1cm4gdGhpcy5zY2hlbWVzW3RdLnNjaGVtZX0sdmFsaWRhdGU6ZnVuY3Rpb24odCl7dD0oXCJcIit0KS5yZXBsYWNlKC9cXEQvZyxcIlwiKTt2YXIgcixzPW5ldyBlLGE9dC5sZW5ndGgsaT0wLG49MTtpZihhPDEyKXJldHVybiExO2Zvcig7YS0tOylyPXQuY2hhckF0KGEpKm4saSs9ci05KihyPjkpLG5ePTM7cmV0dXJuIHMudmFsaWQ9aSUxMD09PTAmJmk+MCxzLnNjaGVtZT10aGlzLl9nZXRTY2hlbWUodCksc319LHM9e21pbmltdW06OCxtaW5pbXVtQm9udXM6MTAsc3RyZW5ndGhzOnswOlwiVmVyeSBXZWFrXCIsMTpcIldlYWtcIiwyOlwiQmV0dGVyXCIsMzpcIkFsbW9zdFwiLDQ6XCJBY2NlcHRhYmxlXCIsNTpcIlN0cm9uZ1wiLDY6XCJWZXJ5IFN0cm9uZ1wifSxtZXNzYWdlOlwie3RpdGxlfSBkaWQgbm90IHBhc3MgdGhlIHN0cmVuZ3RoIHRlc3QuXCIsZXhwZWN0czpbXCJtaW5cIixcImJvbnVzXCJdLGVycm9yczp7aXNNaW5pbXVtOlwie3RpdGxlfSBtdXN0IGJlIGF0IGxlYXN0IHttaW59IGNoYXJhY3RlcnNcIixoYXNMb3dlcjpcInt0aXRsZX0gbXVzdCBoYXZlIGF0IGxlYXN0IDEgbG93ZXIgY2FzZSBjaGFyYWN0ZXJcIixoYXNVcHBlcjpcInt0aXRsZX0gbXVzdCBoYXZlIGF0IGxlYXN0IDEgdXBwZXIgY2FzZSBjaGFyYWN0ZXJcIixoYXNOdW1iZXI6XCJ7dGl0bGV9IG11c3QgaGF2ZSBhdCBsZWFzdCAxIG51bWJlclwiLGhhc1NwZWNpYWw6XCJ7dGl0bGV9IG11c3QgaGF2ZSBhdCBsZWFzdCAxIHNwZWNpYWwgY2hhcmFjdGVyXCJ9LF9nZXRTY29yZTpmdW5jdGlvbihlKXt2YXIgcj1uZXcgdCh0aGlzLnN0cmVuZ3Roc1swXSk7cmV0dXJuIGUubGVuZ3RoPnRoaXMubWluaW11bUJvbnVzPyhyLnBvaW50cys9MixyLmlzQm9udXM9ITAsci5pc01pbmltdW09ITApOmUubGVuZ3RoPnRoaXMubWluaW11bT8oci5wb2ludHMrKyxyLmlzTWluaW11bT0hMCk6KHIucG9pbnRzPTEsci5pc01pbmltdW09ITEpLHIuaGFzTG93ZXI9bnVsbCE9PWUubWF0Y2goL1thLXpdLyksci5pc01pbmltdW0mJnIuaGFzTG93ZXImJnIucG9pbnRzKyssci5oYXNVcHBlcj1udWxsIT09ZS5tYXRjaCgvW0EtWl0vKSxyLmlzTWluaW11bSYmci5oYXNVcHBlciYmci5wb2ludHMrKyxyLmhhc051bWJlcj1udWxsIT09ZS5tYXRjaCgvXFxkKy8pLHIuaXNNaW5pbXVtJiZyLmhhc051bWJlciYmci5wb2ludHMrKyxyLmhhc1NwZWNpYWw9bnVsbCE9PWUubWF0Y2goLy5bISxALCMsJCwlLF4sJiwqLD8sXyx+LC0sKCwpXS8pLHIuaXNNaW5pbXVtJiZyLmhhc1NwZWNpYWwmJnIucG9pbnRzKyssci5wZXJjZW50PU1hdGguY2VpbChyLnBvaW50cy82KjEwMCkscn0sX2dldFN0cmVuZ3RoOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldFNjb3JlKGUpO3JldHVybiB0LnN0cmVuZ3RoPXRoaXMuc3RyZW5ndGhzW3QucG9pbnRzXSx0LmlzTWluaW11bXx8dC5lcnJvcnMucHVzaCh0aGlzLmVycm9ycy5pc01pbmltdW0pLHQuaGFzTG93ZXJ8fHQuZXJyb3JzLnB1c2godGhpcy5lcnJvcnMuaGFzTG93ZXIpLHQuaGFzVXBwZXJ8fHQuZXJyb3JzLnB1c2godGhpcy5lcnJvcnMuaGFzVXBwZXIpLHQuaGFzU3BlY2lhbHx8dC5lcnJvcnMucHVzaCh0aGlzLmVycm9ycy5oYXNTcGVjaWFsKSx0Lmhhc051bWJlcnx8dC5lcnJvcnMucHVzaCh0aGlzLmVycm9ycy5oYXNOdW1iZXIpLHQucG9pbnRzPjQmJih0LnZhbGlkPSEwKSx0fSx2YWxpZGF0ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMubWluaW11bT10Lm1pbnx8dGhpcy5taW5pbXVtLHRoaXMubWluaW11bUJvbnVzPXQuYm9udXN8fHRoaXMubWluaW11bUJvbnVzLHQuaGFzT3duUHJvcGVydHkoXCJjb25maWdcIikmJnQuY29uZmlnLmhhc093blByb3BlcnR5KFwibWVzc2FnZXNcIikpZm9yKHZhciByIGluIHQuY29uZmlnLm1lc3NhZ2VzKXQuY29uZmlnLm1lc3NhZ2VzLmhhc093blByb3BlcnR5KHIpJiYodGhpcy5lcnJvcnNbcl09dC5jb25maWcubWVzc2FnZXNbcl0pO3JldHVybiB0aGlzLl9nZXRTdHJlbmd0aChlKX19LGE9e3JlcXVpcmVkOnt2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4hIWV9LG1lc3NhZ2U6XCJ7dGl0bGV9IGlzIHJlcXVpcmVkXCIsZXhwZWN0czohMX0sZW1haWw6e3JlZ2V4Oi9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaSx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC50ZXN0KGUpfSxtZXNzYWdlOlwie3RpdGxlfSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLGV4cGVjdHM6ITF9LHVybDp7cmVnZXg6L14oPzooPzpodHRwcz98ZnRwKTpcXC9cXC8pPyg/Oig/ISg/OjEwfDEyNykoPzpcXC5cXGR7MSwzfSl7M30pKD8hKD86MTY5XFwuMjU0fDE5MlxcLjE2OCkoPzpcXC5cXGR7MSwzfSl7Mn0pKD8hMTcyXFwuKD86MVs2LTldfDJcXGR8M1swLTFdKSg/OlxcLlxcZHsxLDN9KXsyfSkoPzpbMS05XVxcZD98MVxcZFxcZHwyWzAxXVxcZHwyMlswLTNdKSg/OlxcLig/OjE/XFxkezEsMn18MlswLTRdXFxkfDI1WzAtNV0pKXsyfSg/OlxcLig/OlsxLTldXFxkP3wxXFxkXFxkfDJbMC00XVxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcdTAwYTEtXFx1ZmZmZjAtOV0tKikqW2EtelxcdTAwYTEtXFx1ZmZmZjAtOV0rKSg/OlxcLig/OlthLXpcXHUwMGExLVxcdWZmZmYwLTldLSopKlthLXpcXHUwMGExLVxcdWZmZmYwLTldKykqKD86XFwuKD86W2EtelxcdTAwYTEtXFx1ZmZmZl17Mix9KSkpKD86OlxcZHsyLDV9KT8oPzpcXC9cXFMqKT8kL2ksdmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVnZXgudGVzdChlKX0sbWVzc2FnZTpcInt0aXRsZX0gbXVzdCBiZSBhIHZhbGlkIHdlYiBhZGRyZXNzXCIsZXhwZWN0czohMX0sYWxwaGFOdW1lcmljOntyZWdleDovXltBLVphLXowLTldKyQvaSx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC50ZXN0KGUpfSxtZXNzYWdlOlwie3RpdGxlfSBtYXkgb25seSBjb250YWluIFtBLVphLXpdIGFuZCBbMC05XVwiLGV4cGVjdHM6ITF9LG51bWVyaWM6e3JlZ2V4Oi9eLT9bMC05XSskLyx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC50ZXN0KGUpfSxtZXNzYWdlOlwie3RpdGxlfSBtYXkgb25seSBjb250YWluIFswLTldXCIsZXhwZWN0czohMX0sYWxwaGE6e3JlZ2V4Oi9eW0EtWmEtel0rJC8sdmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVnZXgudGVzdChlKX0sbWVzc2FnZTpcInt0aXRsZX0gbWF5IG9ubHkgY29udGFpbiBbQS1aYS16XVwiLGV4cGVjdHM6ITF9LGRlY2ltYWw6e3JlZ2V4Oi9eXFxzKihcXCt8LSk/KChcXGQrKFxcLlxcZCspPyl8KFxcLlxcZCspKVxccyokLyx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC50ZXN0KGUpfSxtZXNzYWdlOlwie3RpdGxlfSBtdXN0IGJlIGEgdmFsaWQgZGVjaW1hbFwiLGV4cGVjdHM6ITF9LGN1cnJlbmN5OntyZWdleDovXlxccyooXFwrfC0pPygoXFxkKyhcXC5cXGRcXGQpPyl8KFxcLlxcZFxcZCkpXFxzKiQvLHZhbGlkYXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlZ2V4LnRlc3QoZSl9LG1lc3NhZ2U6XCJ7dGl0bGV9IG11c3QgYmUgYSB2YWxpZCBjdXJyZW5jeSB2YWx1ZVwiLGV4cGVjdHM6ITF9LGlwOntyZWdleDp7aXB2NDovXig/Oig/OlxcZHxbMS05XVxcZHwxXFxkezJ9fDJbMC00XVxcZHwyNVswLTVdKVxcLil7M30oPzpcXGR8WzEtOV1cXGR8MVxcZHsyfXwyWzAtNF1cXGR8MjVbMC01XSkkLyxpcHY0Q2lkcjovXigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pKFxcLyhbMC05XXxbMS0yXVswLTldfDNbMC0yXSkpJC8saXB2NjovXigoPz0uKjo6KSg/IS4qOjouKzo6KSg6Oik/KFtcXGRBLUZdezEsNH06KDp8XFxiKXwpezV9fChbXFxkQS1GXXsxLDR9Oil7Nn0pKCgoW1xcZEEtRl17MSw0fSgoPyFcXDMpOjp8OlxcYnwkKSl8KD8hXFwyXFwzKSl7Mn18KCgoMlswLTRdfDFcXGR8WzEtOV0pP1xcZHwyNVswLTVdKVxcLj9cXGIpezR9KSQvaSxpcHY2Q2lkcjovXnMqKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1kfDFkZHxbMS05XT9kKSguKDI1WzAtNV18MlswLTRdZHwxZGR8WzEtOV0/ZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1kfDFkZHxbMS05XT9kKSguKDI1WzAtNV18MlswLTRdZHwxZGR8WzEtOV0/ZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1kfDFkZHxbMS05XT9kKSguKDI1WzAtNV18MlswLTRdZHwxZGR8WzEtOV0/ZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XWR8MWRkfFsxLTldP2QpKC4oMjVbMC01XXwyWzAtNF1kfDFkZHxbMS05XT9kKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdZHwxZGR8WzEtOV0/ZCkoLigyNVswLTVdfDJbMC00XWR8MWRkfFsxLTldP2QpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsxfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1kfDFkZHxbMS05XT9kKSguKDI1WzAtNV18MlswLTRdZHwxZGR8WzEtOV0/ZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XWR8MWRkfFsxLTldP2QpKC4oMjVbMC01XXwyWzAtNF1kfDFkZHxbMS05XT9kKSl7M30pKXw6KSkpKCUuKyk/cyooXFwvKFswLTldfFsxLTldWzAtOV18MVswLTFdWzAtOV18MTJbMC04XSkpPyQvfSx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC5pcHY0LnRlc3QoZSl8fHRoaXMucmVnZXguaXB2Ni50ZXN0KGUpfHx0aGlzLnJlZ2V4LmlwdjRDaWRyLnRlc3QoZSl8fHRoaXMucmVnZXguaXB2NkNpZHIudGVzdChlKX0sbWVzc2FnZTpcInt0aXRsZX0gbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3NcIixleHBlY3RzOiExfSxtaW46e3ZhbGlkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJmUubGVuZ3RoPj10Lm1pbn0sbWVzc2FnZTpcInt0aXRsZX0gbXVzdCBiZSBhIG1pbmltdW0gb2Yge21pbn0gY2hhcmFjdGVyc1wiLGV4cGVjdHM6W1wibWluXCJdfSxtYXg6e3ZhbGlkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJmUubGVuZ3RoPD10Lm1heH0sbWVzc2FnZTpcInt0aXRsZX0gbXVzdCBiZSBhIG1heGltdW0gb2Yge21heH0gY2hhcmFjdGVyc1wiLGV4cGVjdHM6W1wibWF4XCJdfSxyYW5nZTp7dmFsaWRhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZT9lLmxlbmd0aD49dC5taW4mJmUubGVuZ3RoPD10Lm1heDpcIm51bWJlclwiPT10eXBlb2YgZSYmKGU+PXQubWluJiZlPD10Lm1heCl9LG1lc3NhZ2U6XCJ7dGl0bGV9IG11c3QgYmUgYSBtaW5pbXVtIG9mIHttaW59IGFuZCBhIG1heGltdW0gb2Yge21heH0gY2hhcmFjdGVyc1wiLGV4cGVjdHM6W1wibWluXCIsXCJtYXhcIl19LGVxdWFsOnt2YWxpZGF0ZTpmdW5jdGlvbihlLHQpe3JldHVyblwiXCIrZT09XCJcIit0LnZhbHVlfSxtZXNzYWdlOlwie3RpdGxlfSBtdXN0IGJlIGVxdWFsIHRvIHtmaWVsZH1cIixleHBlY3RzOltcInZhbHVlXCIsXCJmaWVsZFwiXX0sZm9ybWF0Ont2YWxpZGF0ZTpmdW5jdGlvbihlLHQpe2lmKFwiW29iamVjdCBSZWdFeHBdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5yZWdleCkpcmV0dXJuIHQucmVnZXgudGVzdChlKTt0aHJvd1wiYXBwcm92ZS52YWx1ZSgpOiBbZm9ybWF0XSAtIHJlZ2V4IGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cIn0sbWVzc2FnZTpcInt0aXRsZX0gZGlkIG5vdCBwYXNzIHRoZSBbe3JlZ2V4fV0gdGVzdFwiLGV4cGVjdHM6W1wicmVnZXhcIl19LHRpbWU6e3JlZ2V4Oi9eKDJbMC0zXXxbMDFdP1swLTldKTooWzAtNV0/WzAtOV0pOihbMC01XT9bMC05XSkkLyx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC50ZXN0KGUpfSxtZXNzYWdlOlwie3RpdGxlfSBpcyBub3QgYSB2YWxpZCB0aW1lXCIsZXhwZWN0czohMX0sZGF0ZTp7Zm9ybWF0czp7eW1kOi9eKD86XFwyKSg/OlswLTldezJ9KT9bMC05XXsyfShbXFwvLV0pKDFbMC0yXXwwP1sxLTldKShbXFwvLV0pKDNbMDFdfFsxMl1bMC05XXwwP1sxLTldKSQvLGRteTovXigzWzAxXXxbMTJdWzAtOV18MD9bMS05XSkoW1xcLy1dKSgxWzAtMl18MD9bMS05XSkoW1xcLy1dKSg/OlswLTldezJ9KT9bMC05XXsyfSQvfSx2YWxpZGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmZvcm1hdHNbdC5mb3JtYXRdLnRlc3QoZSl9LG1lc3NhZ2U6XCJ7dGl0bGV9IGlzIG5vdCBhIHZhbGlkIGRhdGVcIixleHBlY3RzOltcImZvcm1hdFwiXX0sdHJ1dGh5OntyZWdleDovXig/OjF8dCg/OnJ1ZSk/fHkoPzplcyk/fG9rKD86YXkpPykkL2ksdmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVnZXgudGVzdChlKX0sbWVzc2FnZTpcInt0aXRsZX0gaXMgbm90IHZhbGlkXCIsZXhwZWN0czohMX0sZmFsc3k6e3JlZ2V4Oi9eKD86MXx0KD86cnVlKT98eSg/OmVzKT98b2soPzpheSk/KSQvaSx2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4hdGhpcy5yZWdleC50ZXN0KGUpfSxtZXNzYWdlOlwie3RpdGxlfSBpcyBub3QgdmFsaWRcIixleHBlY3RzOiExfSxjYzpyLHN0cmVuZ3RoOnN9LGk9ZnVuY3Rpb24oKXt0aGlzLmFwcHJvdmVkPSEwLHRoaXMuZXJyb3JzPVtdLHRoaXMuZmFpbGVkPVtdLHRoaXMuZWFjaD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZSYmZS5jb25zdHJ1Y3RvciYmZS5jYWxsJiZlLmFwcGx5LHI9dGhpcy5lcnJvcnMubGVuZ3RoO3ItLTspdCYmZSh0aGlzLmVycm9yc1tyXSl9LHRoaXMuZmlsdGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dCYmdC5jb25zdHJ1Y3RvciYmdC5jYWxsJiZ0LmFwcGx5LHM9MDtpZih0aGlzLmhhc093blByb3BlcnR5KGUpKWZvcihzPXRoaXNbZV0uZXJyb3JzLmxlbmd0aDtzLS07KXImJnQodGhpc1tlXS5lcnJvcnNbc10pfX0sbj17dGVzdHM6YSxfZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9XCJvYmplY3RcIj09dHlwZW9mIHQ/dDpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZS5yZXBsYWNlKC9cXHtcXHt8XFx9XFx9fFxceyhcXHcrKVxcfS9nLGZ1bmN0aW9uKGUscil7cmV0dXJuXCJ7e1wiPT09ZT9cIntcIjpcIn19XCI9PT1lP1wifVwiOnRbcl19KS50cmltKCl9LF9pc1J1bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9W1widGl0bGVcIixcInN0b3BcIixcImlnbm9yZU51bGxcIl07cmV0dXJuIHQuaW5kZXhPZihlKTwwfSxfc3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgcj1uZXcgaSxzPVwiXCIsYT0hMSxuPSExO3QuaGFzT3duUHJvcGVydHkoXCJ0aXRsZVwiKSYmKHM9dC50aXRsZSksdC5oYXNPd25Qcm9wZXJ0eShcInN0b3BcIikmJihhPXQuc3RvcCksdC5oYXNPd25Qcm9wZXJ0eShcImlnbm9yZU51bGxcIikmJihuPXQuaWdub3JlTnVsbCk7Zm9yKHZhciB1IGluIHQpe2lmKGEmJiFyLmFwcHJvdmVkKWJyZWFrO2lmKHQuaGFzT3duUHJvcGVydHkodSkmJnRoaXMuX2lzUnVsZSh1KSl7dmFyIG89dFt1XTtpZighdGhpcy50ZXN0cy5oYXNPd25Qcm9wZXJ0eSh1KSl0aHJvd1wiYXBwcm92ZS52YWx1ZSgpOiBcIit1K1wiIHRlc3Qgbm90IGRlZmluZWQuXCI7dmFyIGQ9e2NvbnN0cmFpbnQ6byxydWxlOnUsdGl0bGU6cyx0ZXN0OnRoaXMudGVzdHNbdV0sdmFsdWU6ZSxpZ25vcmVOdWxsOm59O3RoaXMuX3Rlc3QoZCxyKX19cmV0dXJuIHJ9LF90ZXN0OmZ1bmN0aW9uKGUsdCl7aWYoIWUuaGFzT3duUHJvcGVydHkoXCJpZ25vcmVOdWxsXCIpfHxlLnZhbHVlfHwhZS5pZ25vcmVOdWxsKXt2YXIgcj10aGlzLl9nZXRBcmdzKGUpLHM9ZS50ZXN0LnZhbGlkYXRlKGUudmFsdWUscik7aWYodFtlLnJ1bGVdPXthcHByb3ZlZDohMCxlcnJvcnM6W119LFwib2JqZWN0XCI9PXR5cGVvZiBzKXtpZih0LmFwcHJvdmVkPSEhcy52YWxpZCYmdC5hcHByb3ZlZCx0W2UucnVsZV0uYXBwcm92ZWQ9cy52YWxpZCxzLmhhc093blByb3BlcnR5KFwiZXJyb3JzXCIpKXt2YXIgYT10aGlzLl9mb3JtYXRNZXNzYWdlcyhzLmVycm9ycyxlKTt0LmVycm9ycz10LmVycm9ycy5jb25jYXQoYSksdFtlLnJ1bGVdLmVycm9ycz1hfWZvcih2YXIgaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJiF0Lmhhc093blByb3BlcnR5KGkpJiYodFtlLnJ1bGVdW2ldPXNbaV0pfWVsc2V7aWYoXCJib29sZWFuXCIhPXR5cGVvZiBzKXRocm93XCJhcHByb3ZlLnZhbHVlKCk6IFwiK2UucnVsZStcIiByZXR1cm5lZCBhbiBpbnZhbGlkIHZhbHVlXCI7dC5hcHByb3ZlZD0hIXMmJnQuYXBwcm92ZWQsdFtlLnJ1bGVdLmFwcHJvdmVkPXN9aWYoIXQuYXBwcm92ZWQpe3ZhciBuPXRoaXMuX2Zvcm1hdE1lc3NhZ2UoZSk7dC5lcnJvcnMucHVzaChuKSx0W2UucnVsZV0uZXJyb3JzLnB1c2gobil9cy52YWxpZHx8dC5mYWlsZWQucHVzaChlLnJ1bGUpfX0sX2VhY2hFeHBlY3RlZDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZS50ZXN0LmV4cGVjdHMpKWZvcih2YXIgcj1lLnRlc3QuZXhwZWN0cy5sZW5ndGgscz1yO3MtLTspdChlLnRlc3QuZXhwZWN0c1tzXSxyKX0sX2dldEFyZ3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHRoaXMuX2VhY2hFeHBlY3RlZChlLGZ1bmN0aW9uKHIscyl7aWYoZS5jb25zdHJhaW50Lmhhc093blByb3BlcnR5KHIpKXRbcl09ZS5jb25zdHJhaW50W3JdO2Vsc2V7aWYoIShzPD0xKXx8IS9eW0EtWmEtejAtOV0rJC9pLnRlc3QoZS5jb25zdHJhaW50KSYmXCJbb2JqZWN0IFJlZ0V4cF1cIiE9PXRvU3RyaW5nLmNhbGwoZS5jb25zdHJhaW50KSl0aHJvd1wiYXBwcm92ZS52YWx1ZSgpOiBcIitlLnJ1bGUrXCIgZXhwZWN0cyB0aGUgXCIrcitcIiBwYXJhbWV0ZXIuXCI7dFtyXT1lLmNvbnN0cmFpbnR9fSksZS5jb25zdHJhaW50Lmhhc093blByb3BlcnR5KFwiY29uZmlnXCIpJiYodC5jb25maWc9ZS5jb25zdHJhaW50LmNvbmZpZyksdH0sX2dldEZvcm1hdDpmdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gdGhpcy5fZWFjaEV4cGVjdGVkKGUsZnVuY3Rpb24ocil7ZS5jb25zdHJhaW50Lmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lLmNvbnN0cmFpbnRbcl0pLC9eW0EtWmEtejAtOV0rJC9pLnRlc3QoZS5jb25zdHJhaW50KSYmKHRbcl09ZS5jb25zdHJhaW50KX0pLHQudGl0bGU9ZS50aXRsZSx0fSxfZm9ybWF0TWVzc2FnZXM6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9dGhpcy5fZ2V0Rm9ybWF0KHQpLHM9ZS5sZW5ndGg7cy0tOyllW3NdPXRoaXMuX2Zvcm1hdChlW3NdLHIpO3JldHVybiBlfSxfZm9ybWF0TWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMuX2dldEZvcm1hdChlKTtyZXR1cm4gZS5jb25zdHJhaW50Lmhhc093blByb3BlcnR5KFwibWVzc2FnZVwiKT8odD1lLmNvbnN0cmFpbnQubWVzc2FnZSx0aGlzLl9mb3JtYXQodCxyKSk6KHQ9ZS50ZXN0Lm1lc3NhZ2UsdGhpcy5fZm9ybWF0KHQscikpfSx2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKFwib2JqZWN0XCIhPXR5cGVvZiB0KXRocm93XCJhcHByb3ZlLnZhbHVlKHZhbHVlLCBydWxlcyk6IHJ1bGVzIGlzIG5vdCBhIHZhbGlkIG9iamVjdC5cIjtyZXR1cm4gdGhpcy5fc3RhcnQoZSx0KX0sYWRkVGVzdDpmdW5jdGlvbihlLHQpe2lmKFwib2JqZWN0XCIhPXR5cGVvZiBlKXRocm93XCJhcHByb3ZlLmFkZFRlc3Qob2JqLCBuYW1lKTogb2JqIGlzIG5vdCBhIHZhbGlkIG9iamVjdC5cIjt0cnl7dGhpcy50ZXN0cy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMudGVzdHNbdF09ZSl9Y2F0Y2gocil7dGhyb3dcImFwcHJvdmUuYWRkVGVzdCgpOiBcIityLm1lc3NhZ2V9fX07cmV0dXJuIG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcHJvdmUubWluLmpzLm1hcFxuIiwiaW1wb3J0IGFwcHJvdmUgZnJvbSAnYXBwcm92ZWpzJztcblxuKGZ1bmN0aW9uICgkLCBhcHByb3ZlKSB7XG4gIGlmKCQgJiYgYXBwcm92ZSkge1xuICAgIGxldCBnbG9iYWxWYXJzID0ge1xuICAgICAgdmFsaWRhdGlvblNwbGl0S2V5OiBcInxcIixcbiAgICAgIGNsYXNzZXM6IHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBcImx2LXZhbGlkYXRlLWVycm9yLW1lc3NhZ2VcIixcbiAgICAgICAgZ2V0RXJyb3JNZXNzYWdlQ2xhc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gXCIuXCIrdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkYXRhQXR0cmlidXRlczoge1xuICAgICAgICBlcnJvckNvbnRhaW5lcjogXCJsdkVycm9yQ29udGFpbmVyXCIsXG4gICAgICAgIGFwcHJvdmFsS2V5OiB7XG4gICAgICAgICAgcmF3OiBcImx2LXZhbGlkYXRlZFwiLFxuICAgICAgICAgIHByb2Nlc3NlZDogXCJsdlZhbGlkYXRlZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczoge1xuICAgICAgICAgIHJhdzogXCJsdi12YWxpZGF0ZVwiLFxuICAgICAgICAgIHByb2Nlc3NlZDogXCJsdlZhbGlkYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdGlvblRpdGxlOiB7XG4gICAgICAgICAgcmF3OiBcImx2LXZhbGlkYXRlLXRpdGxlXCIsXG4gICAgICAgICAgcHJvY2Vzc2VkOiBcImx2VmFsaWRhdGVUaXRsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIG5vVmFsaWRhdGVEaXNhYmxlZDoge1xuICAgICAgICAgIHJhdzogXCJsdi1uby12YWxpZGF0ZS1kaXNhYmxlZFwiLFxuICAgICAgICAgIHByb2Nlc3NlZDogXCJsdk5vVmFsaWRhdGVEaXNhYmxlZFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBydWxlczoge1xuICAgICAgICByZXF1aXJlZDoge1xuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHRpdGxlOiAnJ1xuICAgICAgICB9LFxuICAgICAgICBlbWFpbDoge1xuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAne3RpdGxlfSBtdXN0IGJlIGEgdmFsaWQgZW1haWwnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZTogJydcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRfbm9fZW1wdHlfYXJyYXk6IHtcbiAgICAgICAgICB2YWxpZE5vbkVtcHR5QXJyYXk6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd7dGl0bGV9IGNhbm5vdCBiZSBlbXB0eSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpdGxlOiAnJ1xuICAgICAgICB9LFxuICAgICAgICBudW1iZXJfZ3JlYXRlcl90aGFuX3plcm86IHtcbiAgICAgICAgICBudW1iZXJHcmVhdGVyVGhhblplcm86IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd7dGl0bGV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZTogJydcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgbWV0aG9kcyA9IHtcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbigkZm9ybSkge1xuICAgICAgICBsZXQgJGVsZW1lbnRzID0gJGZvcm0uZmluZChcIltkYXRhLVwiK2dsb2JhbFZhcnMuZGF0YUF0dHJpYnV0ZXMudmFsaWRhdGlvblJ1bGVzLnJhdytcIl1cIiksXG4gICAgICAgICAgdG90YWxFbGVtZW50c1ZhbGlkYXRlZCA9IDA7XG5cbiAgICAgICAgJGVsZW1lbnRzLm1hcChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIGxldCAkZWxlbWVudCA9ICQoZWxlbWVudCksXG4gICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXNBcnJheSA9IG1ldGhvZHMuX3BhcnNlVmFsaWRhdGlvblJ1bGVzKCRlbGVtZW50KSxcbiAgICAgICAgICAgIHZhbHVlVG9CZVZhbGlkYXRlZCA9ICRlbGVtZW50LnZhbCgpLFxuICAgICAgICAgICAgcnVsZXNPYmplY3QgPSB7fSxcbiAgICAgICAgICAgIGlzRWxlbWVudERpc2FibGVkID0gJGVsZW1lbnQuaXMoXCI6ZGlzYWJsZWRcIiksXG4gICAgICAgICAgICBzaG91bGROb3RWYWxpZGF0ZURpc2FibGVkID0gJGVsZW1lbnQuZGF0YShnbG9iYWxWYXJzLmRhdGFBdHRyaWJ1dGVzLm5vVmFsaWRhdGVEaXNhYmxlZC5wcm9jZXNzZWQpO1xuXG4gICAgICAgICAgaWYoIWlzRWxlbWVudERpc2FibGVkIHx8IHVuZGVmaW5lZCA9PT0gc2hvdWxkTm90VmFsaWRhdGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZhbGlkYXRpb25SdWxlc0FycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICBsZXQgcnVsZSA9IHZhbGlkYXRpb25SdWxlc0FycmF5W2luZGV4XTtcbiAgICAgICAgICAgICAgaWYoZ2xvYmFsVmFycy5ydWxlcy5oYXNPd25Qcm9wZXJ0eShydWxlKSkge1xuICAgICAgICAgICAgICAgIGxldCBydWxlT2JqZWN0ID0gZ2xvYmFsVmFycy5ydWxlc1tydWxlXTtcblxuICAgICAgICAgICAgICAgIHJ1bGVPYmplY3QudGl0bGUgPSAoXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQgIT09ICRlbGVtZW50LmRhdGEoZ2xvYmFsVmFycy5kYXRhQXR0cmlidXRlcy52YWxpZGF0aW9uVGl0bGUucHJvY2Vzc2VkKSA/XG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LmRhdGEoZ2xvYmFsVmFycy5kYXRhQXR0cmlidXRlcy52YWxpZGF0aW9uVGl0bGUucHJvY2Vzc2VkKSA6XG4gICAgICAgICAgICAgICAgICAgIFwiSW5wdXRcIlxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAkLmV4dGVuZChydWxlc09iamVjdCwgZ2xvYmFsVmFycy5ydWxlc1tydWxlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFwcHJvdmUudmFsdWUodmFsdWVUb0JlVmFsaWRhdGVkLCBydWxlc09iamVjdCk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdC5hcHByb3ZlZCkge1xuICAgICAgICAgICAgICBtZXRob2RzLl9jbGVhckVycm9yTWVzc2FnZSgkZWxlbWVudCk7XG4gICAgICAgICAgICAgIHRvdGFsRWxlbWVudHNWYWxpZGF0ZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1ldGhvZHMuX2Rpc3BsYXlFcnJvck1lc3NhZ2UoJGVsZW1lbnQsIHJlc3VsdC5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RzLl9jbGVhckVycm9yTWVzc2FnZSgkZWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vU2luY2UgdGhlIGVsZW1lbnQgaXMgbm90IGdldHRpbmcgY2hlY2tlZCBidXQgaXQgd2FzIHBhc3NlZCBmb3IgY2hlY2tpbmcuXG4gICAgICAgICAgICB0b3RhbEVsZW1lbnRzVmFsaWRhdGVkKys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdG90YWxFbGVtZW50c1ZhbGlkYXRlZCA9PT0gJGVsZW1lbnRzLmxlbmd0aDtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyOiBmdW5jdGlvbigkZm9ybSkge1xuICAgICAgICBsZXQgJGVsZW1lbnRzID0gJGZvcm0uZmluZChcIltkYXRhLVwiK2dsb2JhbFZhcnMuZGF0YUF0dHJpYnV0ZXMudmFsaWRhdGlvblJ1bGVzLnJhdytcIl1cIik7XG5cbiAgICAgICAgJGVsZW1lbnRzLm1hcChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIGxldCAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgICAgbWV0aG9kcy5fY2xlYXJFcnJvck1lc3NhZ2UoJGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIF9wYXJzZVZhbGlkYXRpb25SdWxlczogZnVuY3Rpb24oJGVsZW1lbnQpIHtcbiAgICAgICAgbGV0ICRydWxlcyA9ICRlbGVtZW50LmRhdGEoZ2xvYmFsVmFycy5kYXRhQXR0cmlidXRlcy52YWxpZGF0aW9uUnVsZXMucHJvY2Vzc2VkKTtcbiAgICAgICAgcmV0dXJuICRydWxlcy5zcGxpdChnbG9iYWxWYXJzLnZhbGlkYXRpb25TcGxpdEtleSk7XG4gICAgICB9LFxuXG4gICAgICBnZW5lcmF0ZUN1c3RvbVZhbGlkYXRpb25SdWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vVGVzdCB0byBjaGVjayBpZiBhIHZhbGlkIGFycmF5IGFuZCBub24gZW1wdHlcbiAgICAgICAgbGV0IHZhbGlkTm9uRW1wdHlBcnJheSA9IHt9O1xuICAgICAgICB2YWxpZE5vbkVtcHR5QXJyYXkuZXhwZWN0cyA9ICdhcnJheSc7XG4gICAgICAgIHZhbGlkTm9uRW1wdHlBcnJheS5tZXNzYWdlID0gJ3t0aXRsZX0gY2Fubm90IGJlIGVtcHR5Lic7XG4gICAgICAgIHZhbGlkTm9uRW1wdHlBcnJheS52YWxpZGF0ZSA9IGZ1bmN0aW9uKHZhbHVlLCBwYXJzKSB7XG4gICAgICAgICAgcmV0dXJuIEFycmF5ID09PSB2YWx1ZS5jb25zdHJ1Y3RvciAmJiAwIDwgdmFsdWUubGVuZ3RoO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVGVzdCB0byBjaGVjayBpZiBhIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVyb1xuICAgICAgICBsZXQgbnVtYmVyR3JlYXRlclRoYW5aZXJvID0ge307XG4gICAgICAgIG51bWJlckdyZWF0ZXJUaGFuWmVyby5leHBlY3RzID0gJ251bWJlcic7XG4gICAgICAgIG51bWJlckdyZWF0ZXJUaGFuWmVyby5tZXNzYWdlID0gJ3t0aXRsZX0gY2Fubm90IGJlIGxvd2VyIHRoYW4gMS4nO1xuICAgICAgICBudW1iZXJHcmVhdGVyVGhhblplcm8udmFsaWRhdGUgPSBmdW5jdGlvbih2YWx1ZSwgcGFycykge1xuICAgICAgICAgIHJldHVybiAwIDwgdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBwcm92ZS5hZGRUZXN0KHZhbGlkTm9uRW1wdHlBcnJheSwgJ3ZhbGlkTm9uRW1wdHlBcnJheScpO1xuICAgICAgICBhcHByb3ZlLmFkZFRlc3QobnVtYmVyR3JlYXRlclRoYW5aZXJvLCAnbnVtYmVyR3JlYXRlclRoYW5aZXJvJyk7XG4gICAgICB9LFxuXG4gICAgICBfZGlzcGxheUVycm9yTWVzc2FnZTogZnVuY3Rpb24oJGVsZW1lbnQsIGVycm9yc0FycmF5KSB7XG4gICAgICAgIGxldCBlcnJvckNvbnRhaW5lciA9IG1ldGhvZHMuX2dldEVycm9yQ29udGFpbmVyKCRlbGVtZW50KSxcbiAgICAgICAgICBlcnJvcnMgPSBcIlwiO1xuXG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVycm9yc0FycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGVycm9ycyArPSBcIjxwIHN0eWxlPSd0ZXh0LWFsaWduOiByaWdodDsgY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMTNweDsnPlwiK2Vycm9yc0FycmF5W2luZGV4XStcIjwvcD5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBodG1sID0gbWV0aG9kcy5fZ2V0TWVzc2FnZUh0bWwoZXJyb3JzKTtcblxuICAgICAgICBpZih1bmRlZmluZWQgPT09IGVycm9yQ29udGFpbmVyKSB7XG4gICAgICAgICAgbWV0aG9kcy5fY2xlYXJFcnJvck1lc3NhZ2UoJGVsZW1lbnQpO1xuICAgICAgICAgICRlbGVtZW50LnBhcmVudCgpLmFwcGVuZChodG1sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKGVycm9yQ29udGFpbmVyKS5lbXB0eSgpLmFwcGVuZChodG1sKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX2NsZWFyRXJyb3JNZXNzYWdlOiBmdW5jdGlvbigkZWxlbWVudCkge1xuICAgICAgICBsZXQgZXJyb3JDb250YWluZXIgPSBtZXRob2RzLl9nZXRFcnJvckNvbnRhaW5lcigkZWxlbWVudCk7XG4gICAgICAgIGlmKHVuZGVmaW5lZCA9PT0gZXJyb3JDb250YWluZXIpIHtcbiAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoKS5maW5kKGdsb2JhbFZhcnMuY2xhc3Nlcy5nZXRFcnJvck1lc3NhZ2VDbGFzcygpKS5yZW1vdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKGVycm9yQ29udGFpbmVyKS5lbXB0eSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBfZ2V0TWVzc2FnZUh0bWw6IGZ1bmN0aW9uICgkZXJyb3JzU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBcIjxzcGFuIGNsYXNzPSdcIitnbG9iYWxWYXJzLmNsYXNzZXMuZXJyb3JNZXNzYWdlK1wiJz5cIiArXG4gICAgICAgICAgJGVycm9yc1N0cmluZyArXG4gICAgICAgICAgXCI8L3NwYW4+XCI7XG4gICAgICB9LFxuXG4gICAgICBfZ2V0RXJyb3JDb250YWluZXI6IGZ1bmN0aW9uICgkZWxlbWVudCkge1xuICAgICAgICBsZXQgZXJyb3JDb250YWluZXJTZWxlY3RvciA9ICRlbGVtZW50LmRhdGEoZ2xvYmFsVmFycy5kYXRhQXR0cmlidXRlcy5lcnJvckNvbnRhaW5lciksXG4gICAgICAgICAgJGVycm9yQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmKHVuZGVmaW5lZCAhPT0gZXJyb3JDb250YWluZXJTZWxlY3Rvcikge1xuICAgICAgICAgICRlcnJvckNvbnRhaW5lciA9ICQoZXJyb3JDb250YWluZXJTZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJGVycm9yQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAkLmZuLmxlYW5WYWxpZGF0b3IgPSBmdW5jdGlvbiBpbml0aWF0ZShtZXRob2QpIHtcbiAgICAgIGxldCAkZm9ybSA9ICQodGhpcyksXG4gICAgICAgIGlzRm9ybU9rID0gZmFsc2U7XG5cbiAgICAgIGlmKCRmb3JtLmlzKFwiZm9ybVwiKSkge1xuICAgICAgICAvL0dlbmVyYXRlIHRoZSBjdXN0b20gcnVsZXMgdXNlZCBieSBhcHByb3ZlXG4gICAgICAgIG1ldGhvZHMuZ2VuZXJhdGVDdXN0b21WYWxpZGF0aW9uUnVsZXMoKTtcblxuICAgICAgICAvL01ldGhvZCBpcyBwcm92aWRlZCBzbyB1c2UgdGhhdFxuICAgICAgICBpZih1bmRlZmluZWQgIT09IG1ldGhvZCkge1xuICAgICAgICAgIGlmKG1ldGhvZHMuaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuICAgICAgICAgICAgaXNGb3JtT2sgPSBtZXRob2RzW21ldGhvZF0oJGZvcm0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1ldGhvZDogXCIrbWV0aG9kK1wiIG5vdCBmb3VuZCBvbiBsZWFuIHZhbGlkYXRvci5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmb3JtLm9uKFwic3VibWl0XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHMudmFsaWRhdGUoJGZvcm0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSBhcHBseSBsZWFuIHZhbGlkYXRvciB0byBhIGZvcm0gb25seS5cIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0Zvcm1PaztcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwiUGxlYXNlIGluc3RhbGwgaHR0cHM6Ly9qcXVlcnkuY29tLyBhbmQgaHR0cHM6Ly9jaGFybGdvdHRzY2hhbGsuZ2l0aHViLmlvL2FwcHJvdmVqcy9cIilcbiAgfVxufSkod2luZG93LiQsIGFwcHJvdmUpOyJdLCJzb3VyY2VSb290IjoiIn0=