/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else {
var a = factory();
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(self, function() {
return /******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./libs/rateyo/rateyo.js":
/*!*******************************!*\
!*** ./libs/rateyo/rateyo.js ***!
\*******************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"rateYo\": function() { return /* reexport default from dynamic */ rateyo_src_jquery_rateyo__WEBPACK_IMPORTED_MODULE_0___default.a; }\n/* harmony export */ });\n/* harmony import */ var rateyo_src_jquery_rateyo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rateyo/src/jquery.rateyo */ \"./node_modules/rateyo/src/jquery.rateyo.js\");\n/* harmony import */ var rateyo_src_jquery_rateyo__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(rateyo_src_jquery_rateyo__WEBPACK_IMPORTED_MODULE_0__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9saWJzL3JhdGV5by9yYXRleW8uanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQThDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vVnVleHkvLi9saWJzL3JhdGV5by9yYXRleW8uanM/NTA3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmF0ZVlvIGZyb20gJ3JhdGV5by9zcmMvanF1ZXJ5LnJhdGV5byc7XHJcblxyXG5leHBvcnQgeyByYXRlWW8gfTtcclxuIl0sIm5hbWVzIjpbInJhdGVZbyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./libs/rateyo/rateyo.js\n");
/***/ }),
/***/ "./node_modules/rateyo/src/jquery.rateyo.js":
/*!**************************************************!*\
!*** ./node_modules/rateyo/src/jquery.rateyo.js ***!
\**************************************************/
/***/ (function() {
eval("/*****\n* rateyo - v2.3.5\n* http://prrashi.github.io/rateyo/\n* Copyright (c) 2014 Prashanth Pamidi; Licensed MIT\n*****/\n\n;(function ($) {\n \"use strict\";\n\n // The basic svg string required to generate stars\n var BASICSTAR = \"\"+\n \"\";\n\n // The Default values of different options available in the Plugin\n var DEFAULTS = {\n\n starWidth : \"32px\",\n normalFill: \"gray\",\n ratedFill : \"#f39c12\",\n numStars : 5,\n maxValue : 5,\n precision : 1,\n rating : 0,\n fullStar : false,\n halfStar : false,\n readOnly : false,\n spacing : \"0px\",\n rtl : false,\n multiColor: null,\n onInit : null,\n onChange : null,\n onSet : null,\n starSvg : null\n };\n\n //Default colors for multi-color rating\n var MULTICOLOR_OPTIONS = {\n\n startColor: \"#c0392b\", //red\n endColor : \"#f1c40f\" //yellow\n };\n\n // http://stackoverflow.com/questions/11381673/detecting-a-mobile-browser\n function isMobileBrowser () {\n var check = false;\n /* jshint ignore:start */\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n /* jshint ignore:end */\n return check;\n }\n\n function checkPrecision (value, minValue, maxValue) {\n\n /*\n * This function removes the unnecessary precision, at Min and Max Values\n */\n\n // Its like comparing 0.0 with 0, which is true\n if (value === minValue) {\n\n value = minValue;\n }\n else if(value === maxValue) {\n\n value = maxValue;\n }\n\n return value;\n }\n\n function checkBounds (value, minValue, maxValue) {\n\n /*\n * Check if the value is between min and max values, if not, throw an error\n */\n\n var isValid = value >= minValue && value <= maxValue;\n\n if(!isValid){\n\n throw Error(\"Invalid Rating, expected value between \"+ minValue +\n \" and \" + maxValue);\n }\n\n return value;\n }\n\n function isDefined(value) {\n\n // Better way to check if a variable is defined or not\n return typeof value !== \"undefined\";\n }\n\n // Regex to match Colors in Hex Format like #FF00FF\n var hexRegex = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\n\n var hexToRGB = function (hex) {\n\n /*\n * Extracts and returns the Red, Blue, Green Channel values,\n * in the form of decimals\n */\n\n if (!hexRegex.test(hex)) {\n\n return null;\n }\n\n var hexValues = hexRegex.exec(hex),\n r = parseInt(hexValues[1], 16),\n g = parseInt(hexValues[2], 16),\n b = parseInt(hexValues[3], 16);\n\n return {r:r, g:g, b:b};\n };\n\n function getChannelValue(startVal, endVal, percent) {\n\n /*\n * Returns a value between `startVal` and `endVal` based on the percent\n */\n\n var newVal = (endVal - startVal)*(percent/100);\n\n newVal = Math.round(startVal + newVal).toString(16);\n\n if (newVal.length === 1) {\n\n newVal = \"0\" + newVal;\n }\n\n return newVal;\n }\n\n function getColor (startColor, endColor, percent) {\n\n /*\n * Given the percentage( `percent` ) of `endColor` to be mixed\n * with the `startColor`, returns the mixed color.\n * Colors should be only in Hex Format\n */\n\n if (!startColor || !endColor) {\n\n return null;\n }\n\n percent = isDefined(percent)? percent : 0;\n\n startColor = hexToRGB(startColor);\n endColor = hexToRGB(endColor);\n\n var r = getChannelValue(startColor.r, endColor.r, percent),\n b = getChannelValue(startColor.b, endColor.b, percent),\n g = getChannelValue(startColor.g, endColor.g, percent);\n\n return \"#\" + r + g + b;\n }\n\n function RateYo ($node, options) {\n\n /*\n * The Contructor, whose instances are used by plugin itself\n */\n\n // Storing the HTML element as a property, for future access\n this.node = $node.get(0);\n\n var that = this;\n\n // Remove any stuff that is present inside the container, and add the plugin class\n $node.empty().addClass(\"jq-ry-container\");\n\n /*\n * Basically the plugin displays the rating using two rows of stars lying one above\n * the other, the row that is on the top represents the actual rating, and the one\n * behind acts just like a background.\n *\n * `$groupWrapper`: is an element that wraps both the rows\n * `$normalGroup`: is the container for row of stars thats behind and\n * acts as background\n * `$ratedGroup`: is the container for row of stars that display the actual rating.\n *\n * The rating is displayed by adjusting the width of `$ratedGroup`\n */\n var $groupWrapper = $(\"
\").addClass(\"jq-ry-group-wrapper\")\n .appendTo($node);\n\n var $normalGroup = $(\"\").addClass(\"jq-ry-normal-group\")\n .addClass(\"jq-ry-group\")\n .appendTo($groupWrapper);\n\n var $ratedGroup = $(\"\").addClass(\"jq-ry-rated-group\")\n .addClass(\"jq-ry-group\")\n .appendTo($groupWrapper);\n\n /*\n * Variable `step`: store the value of the rating for each star\n * eg: if `maxValue` is 5 and `numStars` is 5, value of each star\n * is 1.\n * Variable `starWidth`: stores the decimal value of width of star in units of px\n * Variable `percentOfStar`: stores the percentage of width each star takes w.r.t\n * the container\n * Variable `spacing`: stores the decimal value of the spacing between stars\n * in the units of px\n * Variable `percentOfSpacing`: stores the percentage of width of the spacing\n * between stars w.r.t the container\n */\n var step, starWidth, percentOfStar, spacing,\n percentOfSpacing, containerWidth, minValue = 0;\n\n /*\n * `currentRating` contains rating that is being displayed at the latest point of\n * time.\n *\n * When ever you hover over the plugin UI, the rating value changes\n * according to the place where you point the cursor, currentRating contains\n * the current value of rating that is being shown in the UI\n */\n var currentRating = options.rating;\n\n // A flag to store if the plugin is already being displayed in the UI\n var isInitialized = false;\n\n function showRating (ratingVal) {\n\n /*\n * The function is responsible for displaying the rating by changing\n * the width of `$ratedGroup`\n */\n\n if (!isDefined(ratingVal)) {\n\n ratingVal = options.rating;\n }\n\n // Storing the value that is being shown in `currentRating`.\n currentRating = ratingVal;\n\n var numStarsToShow = ratingVal/step;\n\n // calculating the percentage of width of $ratedGroup with respect to its parent\n var percent = numStarsToShow*percentOfStar;\n\n if (numStarsToShow > 1) {\n\n // adding the percentage of space that is taken by the gap the stars\n percent += (Math.ceil(numStarsToShow) - 1)*percentOfSpacing;\n }\n\n setRatedFill(options.ratedFill);\n\n percent = options.rtl ? 100 - percent : percent;\n\n if (percent < 0) {\n\n percent = 0;\n } else if (percent > 100) {\n\n percent = 100;\n }\n\n $ratedGroup.css(\"width\", percent + \"%\");\n }\n\n function setContainerWidth () {\n\n /*\n * Set the width of the `this.node` based on the width of each star and\n * the space between them\n */\n\n containerWidth = starWidth*options.numStars + spacing*(options.numStars - 1);\n\n percentOfStar = (starWidth/containerWidth)*100;\n\n percentOfSpacing = (spacing/containerWidth)*100;\n\n $node.width(containerWidth);\n\n showRating();\n }\n\n function setStarWidth (newWidth) {\n\n /*\n * Set the width and height of each SVG star, called whenever one changes the\n * `starWidth` option\n */\n\n // The width and height of the star should be the same\n var starHeight = options.starWidth = newWidth;\n\n starWidth = window.parseFloat(options.starWidth.replace(\"px\", \"\"));\n\n $normalGroup.find(\"svg\")\n .attr({width : options.starWidth,\n height: starHeight});\n\n $ratedGroup.find(\"svg\")\n .attr({width : options.starWidth,\n height: starHeight});\n\n setContainerWidth();\n\n return $node;\n }\n\n function setSpacing (newSpacing) {\n\n /*\n * Set spacing between the SVG stars, called whenever one changes\n * the `spacing` option\n */\n\n options.spacing = newSpacing;\n\n spacing = parseFloat(options.spacing.replace(\"px\", \"\"));\n\n $normalGroup.find(\"svg:not(:first-child)\")\n .css({\"margin-left\": newSpacing});\n\n $ratedGroup.find(\"svg:not(:first-child)\")\n .css({\"margin-left\": newSpacing});\n\n setContainerWidth();\n\n return $node;\n }\n\n function setNormalFill (newFill) {\n\n /*\n * Set the background fill of the Stars, called whenever one changes the\n * `normalFill` option\n */\n\n options.normalFill = newFill;\n\n var $svgs = (options.rtl ? $ratedGroup : $normalGroup).find(\"svg\");\n\n $svgs.attr({fill: options.normalFill});\n\n return $node;\n }\n\n /*\n * Store the recent `ratedFill` option in a variable\n * so that if multiColor is unset, we can use the perviously set `ratedFill`\n * from this variable\n */\n var ratedFill = options.ratedFill;\n\n function setRatedFill (newFill) {\n\n /*\n * Set ratedFill of the stars, called when one changes the `ratedFill` option\n */\n\n /*\n * If `multiColor` option is set, `newFill` variable is dynamically set\n * based on the rating, what ever set as parameter will be discarded\n */\n if (options.multiColor) {\n\n var ratingDiff = currentRating - minValue,\n percentCovered = (ratingDiff/options.maxValue)*100;\n\n var colorOpts = options.multiColor || {},\n startColor = colorOpts.startColor || MULTICOLOR_OPTIONS.startColor,\n endColor = colorOpts.endColor || MULTICOLOR_OPTIONS.endColor;\n\n newFill = getColor(startColor, endColor, percentCovered);\n } else {\n\n ratedFill = newFill;\n }\n\n options.ratedFill = newFill;\n\n var $svgs = (options.rtl ? $normalGroup : $ratedGroup).find(\"svg\");\n\n $svgs.attr({fill: options.ratedFill});\n\n return $node;\n }\n\n function setRtl (newValue) {\n\n newValue = !!newValue;\n\n options.rtl = newValue;\n\n setNormalFill(options.normalFill);\n showRating();\n }\n\n function setMultiColor (colorOptions) {\n\n /*\n * called whenever one changes the `multiColor` option\n */\n\n options.multiColor = colorOptions;\n\n // set the recently set `ratedFill` option, if multiColor Options are unset\n setRatedFill(colorOptions ? colorOptions : ratedFill);\n }\n\n function setNumStars (newValue) {\n\n /*\n * Set the number of stars to use to display the rating, called whenever one\n * changes the `numStars` option\n */\n\n options.numStars = newValue;\n\n step = options.maxValue/options.numStars;\n\n $normalGroup.empty();\n $ratedGroup.empty();\n\n for (var i=0; i newValue) {\n\n setRating(newValue);\n }\n\n showRating();\n\n return $node;\n }\n\n function setPrecision (newValue) {\n\n /*\n * Set the precision of the rating value, called if one changes the\n * `precision` option\n */\n\n options.precision = newValue;\n\n setRating(options.rating);\n\n return $node;\n }\n\n function setHalfStar (newValue) {\n\n /*\n * This function will be called if one changes the `halfStar` option\n */\n\n options.halfStar = newValue;\n\n return $node;\n }\n\n function setFullStar (newValue) {\n\n /*\n * This function will be called if one changes the `fullStar` option\n */\n\n options.fullStar = newValue;\n\n return $node;\n }\n\n function round (value) {\n\n /*\n * Rounds the value of rating if `halfStar` or `fullStar` options are chosen\n */\n\n var remainder = value%step,\n halfStep = step/2,\n isHalfStar = options.halfStar,\n isFullStar = options.fullStar;\n\n if (!isFullStar && !isHalfStar) {\n\n return value;\n }\n\n if (isFullStar || (isHalfStar && remainder > halfStep)) {\n\n value += step - remainder;\n } else {\n\n value = value - remainder;\n\n if (remainder > 0) {\n\n value += halfStep;\n }\n }\n\n return value;\n }\n\n function calculateRating (e) {\n\n /*\n * Calculates and returns the rating based on the position of cursor w.r.t the\n * plugin container\n */\n\n var position = $normalGroup.offset(),\n nodeStartX = position.left,\n nodeEndX = nodeStartX + $normalGroup.width();\n\n var maxValue = options.maxValue;\n\n // The x-coordinate(position) of the mouse pointer w.r.t page\n var pageX = e.pageX;\n\n var calculatedRating = 0;\n\n // If the mouse pointer is to the left of the container\n if(pageX < nodeStartX) {\n\n calculatedRating = minValue;\n }else if (pageX > nodeEndX) { // If the mouse pointer is right of the container\n\n calculatedRating = maxValue;\n }else { // If the mouse pointer is inside the continer\n\n /*\n * The fraction of width covered by the pointer w.r.t to the total width\n * of the container.\n */\n var calcPrcnt = ((pageX - nodeStartX)/(nodeEndX - nodeStartX));\n\n if (spacing > 0) {\n\n /*\n * If there is spacing between stars, take the percentage of width covered\n * and subtract the percentage of width covered by stars and spacing, to find\n * how many stars are covered, the number of stars covered is the rating\n *\n * TODO: I strongly feel that this logic can be improved!, Please help!\n */\n calcPrcnt *= 100;\n\n var remPrcnt = calcPrcnt;\n\n while (remPrcnt > 0) {\n\n if (remPrcnt > percentOfStar) {\n\n calculatedRating += step;\n remPrcnt -= (percentOfStar + percentOfSpacing);\n } else {\n\n calculatedRating += remPrcnt/percentOfStar*step;\n remPrcnt = 0;\n }\n }\n } else {\n\n /*\n * If there is not spacing between stars, the fraction of width covered per\n * `maxValue` is the rating\n */\n calculatedRating = calcPrcnt * (options.maxValue);\n }\n\n // Round the rating if `halfStar` or `fullStar` options are chosen\n calculatedRating = round(calculatedRating);\n }\n\n if (options.rtl) {\n\n calculatedRating = maxValue - calculatedRating;\n }\n\n return parseFloat(calculatedRating);\n }\n\n function setReadOnly (newValue) {\n\n /*\n * UnBinds mouse event handlers, called when whenever one changes the\n * `readOnly` option\n */\n\n options.readOnly = newValue;\n\n $node.attr(\"readonly\", true);\n\n unbindEvents();\n\n if (!newValue) {\n\n $node.removeAttr(\"readonly\");\n\n bindEvents();\n }\n\n return $node;\n }\n\n function setRating (newValue) {\n\n /*\n * Sets the rating of the Plugin, Called when option `rating` is changed\n * or, when `rating` method is called\n */\n\n var rating = newValue;\n\n var maxValue = options.maxValue;\n\n if (typeof rating === \"string\") {\n\n // If rating is given in percentage, maxValue should be 100\n if (rating[rating.length - 1] === \"%\") {\n\n rating = rating.substr(0, rating.length - 1);\n maxValue = 100;\n\n setMaxValue(maxValue);\n }\n\n rating = parseFloat(rating);\n }\n\n checkBounds(rating, minValue, maxValue);\n\n rating = parseFloat(rating.toFixed(options.precision));\n\n checkPrecision(parseFloat(rating), minValue, maxValue);\n\n options.rating = rating;\n\n showRating();\n\n if (isInitialized) {\n\n $node.trigger(\"rateyo.set\", {rating: rating});\n }\n\n return $node;\n }\n\n function setOnInit (method) {\n\n /*\n * set what method to be called on Initialization\n */\n\n options.onInit = method;\n\n return $node;\n }\n\n function setOnSet (method) {\n\n /*\n * set what method to be called when rating is set\n */\n\n options.onSet = method;\n\n return $node;\n }\n\n function setOnChange (method) {\n\n /*\n * set what method to be called rating in the UI is changed\n */\n\n options.onChange = method;\n\n return $node;\n }\n\n this.rating = function (newValue) {\n\n /*\n * rating getter/setter\n */\n\n if (!isDefined(newValue)) {\n\n return options.rating;\n }\n\n setRating(newValue);\n\n return $node;\n };\n\n this.destroy = function () {\n\n /*\n * Removes the Rating UI by clearing the content, and removing the custom classes\n */\n\n if (!options.readOnly) {\n\n unbindEvents();\n }\n\n RateYo.prototype.collection = deleteInstance($node.get(0),\n this.collection);\n\n $node.removeClass(\"jq-ry-container\").children().remove();\n\n return $node;\n };\n\n this.method = function (methodName) {\n\n /*\n * Method to call the methods of RateYo Instance\n */\n\n if (!methodName) {\n\n throw Error(\"Method name not specified!\");\n }\n\n if (!isDefined(this[methodName])) {\n\n throw Error(\"Method \" + methodName + \" doesn't exist!\");\n }\n\n var args = Array.prototype.slice.apply(arguments, []),\n params = args.slice(1),\n method = this[methodName];\n\n return method.apply(this, params);\n };\n\n this.option = function (optionName, param) {\n\n /*\n * Method to get/set Options\n */\n\n if (!isDefined(optionName)) {\n\n return options;\n }\n\n var method;\n\n switch (optionName) {\n\n case \"starWidth\":\n\n method = setStarWidth;\n break;\n case \"numStars\":\n\n method = setNumStars;\n break;\n case \"normalFill\":\n\n method = setNormalFill;\n break;\n case \"ratedFill\":\n\n method = setRatedFill;\n break;\n case \"multiColor\":\n\n method = setMultiColor;\n break;\n case \"maxValue\":\n\n method = setMaxValue;\n break;\n case \"precision\":\n\n method = setPrecision;\n break;\n case \"rating\":\n\n method = setRating;\n break;\n case \"halfStar\":\n\n method = setHalfStar;\n break;\n case \"fullStar\":\n\n method = setFullStar;\n break;\n case \"readOnly\":\n\n method = setReadOnly;\n break;\n case \"spacing\":\n\n method = setSpacing;\n break;\n case \"rtl\":\n\n method = setRtl;\n break;\n case \"onInit\":\n\n method = setOnInit;\n break;\n case \"onSet\":\n\n method = setOnSet;\n break;\n case \"onChange\":\n\n method = setOnChange;\n break;\n default:\n\n throw Error(\"No such option as \" + optionName);\n }\n\n return isDefined(param) ? method(param) : options[optionName];\n };\n\n function onMouseEnter (e) {\n\n /*\n * If the Mouse Pointer is inside the container, calculate and show the rating\n * in UI\n */\n\n var rating = calculateRating(e).toFixed(options.precision);\n\n var maxValue = options.maxValue;\n\n rating = checkPrecision(parseFloat(rating), minValue, maxValue);\n\n showRating(rating);\n\n $node.trigger(\"rateyo.change\", {rating: rating});\n }\n\n function onMouseLeave () {\n if (isMobileBrowser()) {\n return;\n }\n\n /*\n * If mouse leaves, revert the rating in UI to previously set rating,\n * when empty value is passed to showRating, it will take the previously set\n * rating\n */\n\n showRating();\n\n $node.trigger(\"rateyo.change\", {rating: options.rating});\n }\n\n function onMouseClick (e) {\n\n /*\n * On clicking the mouse inside the container, calculate and set the rating\n */\n\n var resultantRating = calculateRating(e).toFixed(options.precision);\n resultantRating = parseFloat(resultantRating);\n\n that.rating(resultantRating);\n }\n\n function onInit(e, data) {\n\n if(options.onInit && typeof options.onInit === \"function\") {\n\n /* jshint validthis:true */\n options.onInit.apply(this, [data.rating, that]);\n }\n }\n\n function onChange (e, data) {\n\n if(options.onChange && typeof options.onChange === \"function\") {\n\n /* jshint validthis:true */\n options.onChange.apply(this, [data.rating, that]);\n }\n }\n\n function onSet (e, data) {\n\n if(options.onSet && typeof options.onSet === \"function\") {\n\n /* jshint validthis:true */\n options.onSet.apply(this, [data.rating, that]);\n }\n }\n\n function bindEvents () {\n\n $node.on(\"mousemove\", onMouseEnter)\n .on(\"mouseenter\", onMouseEnter)\n .on(\"mouseleave\", onMouseLeave)\n .on(\"click\", onMouseClick)\n .on(\"rateyo.init\", onInit)\n .on(\"rateyo.change\", onChange)\n .on(\"rateyo.set\", onSet);\n }\n\n function unbindEvents () {\n\n $node.off(\"mousemove\", onMouseEnter)\n .off(\"mouseenter\", onMouseEnter)\n .off(\"mouseleave\", onMouseLeave)\n .off(\"click\", onMouseClick)\n .off(\"rateyo.init\", onInit)\n .off(\"rateyo.change\", onChange)\n .off(\"rateyo.set\", onSet);\n }\n\n setNumStars(options.numStars);\n setReadOnly(options.readOnly);\n\n if (options.rtl) {\n\n setRtl(options.rtl);\n }\n\n this.collection.push(this);\n this.rating(options.rating, true);\n\n isInitialized = true;\n $node.trigger(\"rateyo.init\", {rating: options.rating});\n }\n\n RateYo.prototype.collection = [];\n\n function getInstance (node, collection) {\n\n /*\n * Given a HTML element (node) and a collection of RateYo instances,\n * this function will search through the collection and return the matched\n * instance having the node\n */\n\n var instance;\n\n $.each(collection, function () {\n\n if(node === this.node){\n\n instance = this;\n return false;\n }\n });\n\n return instance;\n }\n\n function deleteInstance (node, collection) {\n\n /*\n * Given a HTML element (node) and a collection of RateYo instances,\n * this function will search through the collection and delete the\n * instance having the node, and return the modified collection\n */\n\n $.each(collection, function (index) {\n\n if (node === this.node) {\n\n var firstPart = collection.slice(0, index),\n secondPart = collection.slice(index+1, collection.length);\n\n collection = firstPart.concat(secondPart);\n\n return false;\n }\n });\n\n return collection;\n }\n\n function _rateYo (options) {\n\n var rateYoInstances = RateYo.prototype.collection;\n\n /* jshint validthis:true */\n var $nodes = $(this);\n\n if($nodes.length === 0) {\n\n return $nodes;\n }\n\n var args = Array.prototype.slice.apply(arguments, []);\n\n if (args.length === 0) {\n\n //If args length is 0, Initialize the UI with default settings\n options = args[0] = {};\n }else if (args.length === 1 && typeof args[0] === \"object\") {\n\n //If an Object is specified as first argument, it is considered as options\n options = args[0];\n }else if (args.length >= 1 && typeof args[0] === \"string\") {\n\n /*\n * if there is only one argument, and if its a string, it is supposed to be a\n * method name, if more than one argument is specified, the remaining arguments\n * except the first argument, will be passed as a params to the specified method\n */\n\n var methodName = args[0],\n params = args.slice(1);\n\n var result = [];\n\n $.each($nodes, function (i, node) {\n\n var existingInstance = getInstance(node, rateYoInstances);\n\n if(!existingInstance) {\n\n throw Error(\"Trying to set options before even initialization\");\n }\n\n var method = existingInstance[methodName];\n\n if (!method) {\n\n throw Error(\"Method \" + methodName + \" does not exist!\");\n }\n\n var returnVal = method.apply(existingInstance, params);\n\n result.push(returnVal);\n });\n\n /*\n * If the plugin in being called on only one jQuery Element, return only the\n * first value, to support chaining.\n */\n result = result.length === 1? result[0]: result;\n\n return result;\n }else {\n\n throw Error(\"Invalid Arguments\");\n }\n\n /*\n * if only options are passed, extend default options, and if the plugin is not\n * initialized on a particular jQuery element, initalize RateYo on it\n */\n options = $.extend({}, DEFAULTS, options);\n\n return $.each($nodes, function () {\n\n var existingInstance = getInstance(this, rateYoInstances);\n\n if (existingInstance) {\n\n return existingInstance;\n }\n\n var $node = $(this),\n dataAttrs = {},\n optionsCopy = $.extend({}, options);\n\n $.each($node.data(), function (key, value) {\n\n if (key.indexOf(\"rateyo\") !== 0) {\n\n return;\n }\n\n var optionName = key.replace(/^rateyo/, \"\");\n\n optionName = optionName[0].toLowerCase() + optionName.slice(1);\n\n dataAttrs[optionName] = value;\n\n delete optionsCopy[optionName];\n });\n\n return new RateYo($(this), $.extend({}, dataAttrs, optionsCopy));\n });\n }\n\n function rateYo () {\n\n /* jshint validthis:true */\n return _rateYo.apply(this, Array.prototype.slice.apply(arguments, []));\n }\n\n window.RateYo = RateYo;\n $.fn.rateYo = rateYo;\n\n}(window.jQuery));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmF0ZXlvL3NyYy9qcXVlcnkucmF0ZXlvLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2Qzs7QUFFQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiw2OERBQTY4RDtBQUM5OUQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUU7O0FBRTFEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWTtBQUNaOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxRQUFROztBQUVSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekIsNENBQTRDOztBQUU1QztBQUNBLHdCQUF3QjtBQUN4QiwyQ0FBMkM7O0FBRTNDOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSx3QkFBd0IsMEJBQTBCOztBQUVsRDtBQUNBLHVCQUF1QiwwQkFBMEI7O0FBRWpEOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsa0JBQWtCLHlCQUF5Qjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQ7QUFDakQ7QUFDQTs7QUFFQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxrQkFBa0Isd0JBQXdCOztBQUUxQztBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsb0JBQW9CLG9CQUFvQjs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsUUFBUTs7QUFFUjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsT0FBTyw2QkFBNkI7O0FBRXBDO0FBQ0EsT0FBTyxPQUFPOztBQUVkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEscUNBQXFDLGVBQWU7QUFDcEQ7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLGVBQWU7QUFDckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxzQ0FBc0MsdUJBQXVCO0FBQzdEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDLHVCQUF1QjtBQUN6RDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyw0Q0FBNEM7O0FBRTVDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxnQkFBZ0I7O0FBRWhCLHFEQUFxRDtBQUNyRCxZQUFZO0FBQ1o7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Z1ZXh5Ly4vbm9kZV9tb2R1bGVzL3JhdGV5by9zcmMvanF1ZXJ5LnJhdGV5by5qcz9kNzU0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKlxuKiByYXRleW8gLSB2Mi4zLjVcbiogaHR0cDovL3BycmFzaGkuZ2l0aHViLmlvL3JhdGV5by9cbiogQ29weXJpZ2h0IChjKSAyMDE0IFByYXNoYW50aCBQYW1pZGk7IExpY2Vuc2VkIE1JVFxuKioqKiovXG5cbjsoZnVuY3Rpb24gKCQpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgLy8gVGhlIGJhc2ljIHN2ZyBzdHJpbmcgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgc3RhcnNcbiAgdmFyIEJBU0lDU1RBUiA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwidXRmLThcXFwiPz5cIitcbiAgICAgICAgICAgICAgICAgIFwiPHN2ZyB2ZXJzaW9uPVxcXCIxLjFcXFwiXCIrXG4gICAgICAgICAgICAgICAgICAgICAgICBcInhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCJcIitcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidmlld0JveD1cXFwiMCAxMi43MDUgNTEyIDQ4Ni41OVxcXCJcIitcbiAgICAgICAgICAgICAgICAgICAgICAgIFwieD1cXFwiMHB4XFxcIiB5PVxcXCIwcHhcXFwiXCIrXG4gICAgICAgICAgICAgICAgICAgICAgICBcInhtbDpzcGFjZT1cXFwicHJlc2VydmVcXFwiPlwiK1xuICAgICAgICAgICAgICAgICAgICBcIjxwb2x5Z29uIFwiK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwb2ludHM9XFxcIjI1Ni44MTQsMTIuNzA1IDMxNy4yMDUsMTk4LjU2NlwiK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiA1MTIuNjMxLDE5OC41NjYgMzU0LjUyOSwzMTMuNDM1IFwiK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjQxNC45MTgsNDk5LjI5NSAyNTYuODE0LDM4NC40MjcgXCIrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiOTguNzEzLDQ5OS4yOTUgMTU5LjEwMiwzMTMuNDM1IFwiK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjEsMTk4LjU2NiAxOTYuNDI2LDE5OC41NjYgXFxcIi8+XCIrXG4gICAgICAgICAgICAgICAgICBcIjwvc3ZnPlwiO1xuXG4gIC8vIFRoZSBEZWZhdWx0IHZhbHVlcyBvZiBkaWZmZXJlbnQgb3B0aW9ucyBhdmFpbGFibGUgaW4gdGhlIFBsdWdpblxuICB2YXIgREVGQVVMVFMgPSB7XG5cbiAgICBzdGFyV2lkdGggOiBcIjMycHhcIixcbiAgICBub3JtYWxGaWxsOiBcImdyYXlcIixcbiAgICByYXRlZEZpbGwgOiBcIiNmMzljMTJcIixcbiAgICBudW1TdGFycyAgOiA1LFxuICAgIG1heFZhbHVlICA6IDUsXG4gICAgcHJlY2lzaW9uIDogMSxcbiAgICByYXRpbmcgICAgOiAwLFxuICAgIGZ1bGxTdGFyICA6IGZhbHNlLFxuICAgIGhhbGZTdGFyICA6IGZhbHNlLFxuICAgIHJlYWRPbmx5ICA6IGZhbHNlLFxuICAgIHNwYWNpbmcgICA6IFwiMHB4XCIsXG4gICAgcnRsICAgICAgIDogZmFsc2UsXG4gICAgbXVsdGlDb2xvcjogbnVsbCxcbiAgICBvbkluaXQgICAgOiBudWxsLFxuICAgIG9uQ2hhbmdlICA6IG51bGwsXG4gICAgb25TZXQgICAgIDogbnVsbCxcbiAgICBzdGFyU3ZnICAgOiBudWxsXG4gIH07XG5cbiAgLy9EZWZhdWx0IGNvbG9ycyBmb3IgbXVsdGktY29sb3IgcmF0aW5nXG4gIHZhciBNVUxUSUNPTE9SX09QVElPTlMgPSB7XG5cbiAgICBzdGFydENvbG9yOiBcIiNjMDM5MmJcIiwgLy9yZWRcbiAgICBlbmRDb2xvciAgOiBcIiNmMWM0MGZcIiAgLy95ZWxsb3dcbiAgfTtcblxuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMzgxNjczL2RldGVjdGluZy1hLW1vYmlsZS1icm93c2VyXG4gIGZ1bmN0aW9uIGlzTW9iaWxlQnJvd3NlciAoKSB7XG4gICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIChmdW5jdGlvbihhKXtpZigvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vfGFuZHJvaWR8aXBhZHxwbGF5Ym9va3xzaWxrL2kudGVzdChhKXx8LzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChhLnN1YnN0cigwLDQpKSljaGVjayA9IHRydWV9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yfHx3aW5kb3cub3BlcmEpO1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgcmV0dXJuIGNoZWNrO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tQcmVjaXNpb24gKHZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpIHtcblxuICAgIC8qXG4gICAgICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSB1bm5lY2Vzc2FyeSBwcmVjaXNpb24sIGF0IE1pbiBhbmQgTWF4IFZhbHVlc1xuICAgICAqL1xuXG4gICAgLy8gSXRzIGxpa2UgY29tcGFyaW5nIDAuMCB3aXRoIDAsIHdoaWNoIGlzIHRydWVcbiAgICBpZiAodmFsdWUgPT09IG1pblZhbHVlKSB7XG5cbiAgICAgIHZhbHVlID0gbWluVmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYodmFsdWUgPT09IG1heFZhbHVlKSB7XG5cbiAgICAgIHZhbHVlID0gbWF4VmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tCb3VuZHMgKHZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpIHtcblxuICAgIC8qXG4gICAgICogQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGJldHdlZW4gbWluIGFuZCBtYXggdmFsdWVzLCBpZiBub3QsIHRocm93IGFuIGVycm9yXG4gICAgICovXG5cbiAgICB2YXIgaXNWYWxpZCA9IHZhbHVlID49IG1pblZhbHVlICYmIHZhbHVlIDw9IG1heFZhbHVlO1xuXG4gICAgaWYoIWlzVmFsaWQpe1xuXG4gICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBSYXRpbmcsIGV4cGVjdGVkIHZhbHVlIGJldHdlZW4gXCIrIG1pblZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgXCIgYW5kIFwiICsgbWF4VmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuXG4gICAgLy8gQmV0dGVyIHdheSB0byBjaGVjayBpZiBhIHZhcmlhYmxlIGlzIGRlZmluZWQgb3Igbm90XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfVxuXG4gIC8vIFJlZ2V4IHRvIG1hdGNoIENvbG9ycyBpbiBIZXggRm9ybWF0IGxpa2UgI0ZGMDBGRlxuICB2YXIgaGV4UmVnZXggPSAvXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkkL2k7XG5cbiAgdmFyIGhleFRvUkdCID0gZnVuY3Rpb24gKGhleCkge1xuXG4gICAgLypcbiAgICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgUmVkLCBCbHVlLCBHcmVlbiBDaGFubmVsIHZhbHVlcyxcbiAgICAgKiBpbiB0aGUgZm9ybSBvZiBkZWNpbWFsc1xuICAgICAqL1xuXG4gICAgaWYgKCFoZXhSZWdleC50ZXN0KGhleCkpIHtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGhleFZhbHVlcyA9IGhleFJlZ2V4LmV4ZWMoaGV4KSxcbiAgICAgICAgciA9IHBhcnNlSW50KGhleFZhbHVlc1sxXSwgMTYpLFxuICAgICAgICBnID0gcGFyc2VJbnQoaGV4VmFsdWVzWzJdLCAxNiksXG4gICAgICAgIGIgPSBwYXJzZUludChoZXhWYWx1ZXNbM10sIDE2KTtcblxuICAgIHJldHVybiB7cjpyLCBnOmcsIGI6Yn07XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0Q2hhbm5lbFZhbHVlKHN0YXJ0VmFsLCBlbmRWYWwsIHBlcmNlbnQpIHtcblxuICAgIC8qXG4gICAgICogUmV0dXJucyBhIHZhbHVlIGJldHdlZW4gYHN0YXJ0VmFsYCBhbmQgYGVuZFZhbGAgYmFzZWQgb24gdGhlIHBlcmNlbnRcbiAgICAgKi9cblxuICAgIHZhciBuZXdWYWwgPSAoZW5kVmFsIC0gc3RhcnRWYWwpKihwZXJjZW50LzEwMCk7XG5cbiAgICBuZXdWYWwgPSBNYXRoLnJvdW5kKHN0YXJ0VmFsICsgbmV3VmFsKS50b1N0cmluZygxNik7XG5cbiAgICBpZiAobmV3VmFsLmxlbmd0aCA9PT0gMSkge1xuXG4gICAgICAgIG5ld1ZhbCA9IFwiMFwiICsgbmV3VmFsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdWYWw7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDb2xvciAoc3RhcnRDb2xvciwgZW5kQ29sb3IsIHBlcmNlbnQpIHtcblxuICAgIC8qXG4gICAgICogR2l2ZW4gdGhlIHBlcmNlbnRhZ2UoIGBwZXJjZW50YCApIG9mIGBlbmRDb2xvcmAgdG8gYmUgbWl4ZWRcbiAgICAgKiB3aXRoIHRoZSBgc3RhcnRDb2xvcmAsIHJldHVybnMgdGhlIG1peGVkIGNvbG9yLlxuICAgICAqIENvbG9ycyBzaG91bGQgYmUgb25seSBpbiBIZXggRm9ybWF0XG4gICAgICovXG5cbiAgICBpZiAoIXN0YXJ0Q29sb3IgfHwgIWVuZENvbG9yKSB7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHBlcmNlbnQgPSBpc0RlZmluZWQocGVyY2VudCk/IHBlcmNlbnQgOiAwO1xuXG4gICAgc3RhcnRDb2xvciA9IGhleFRvUkdCKHN0YXJ0Q29sb3IpO1xuICAgIGVuZENvbG9yID0gaGV4VG9SR0IoZW5kQ29sb3IpO1xuXG4gICAgdmFyIHIgPSBnZXRDaGFubmVsVmFsdWUoc3RhcnRDb2xvci5yLCBlbmRDb2xvci5yLCBwZXJjZW50KSxcbiAgICAgICAgYiA9IGdldENoYW5uZWxWYWx1ZShzdGFydENvbG9yLmIsIGVuZENvbG9yLmIsIHBlcmNlbnQpLFxuICAgICAgICBnID0gZ2V0Q2hhbm5lbFZhbHVlKHN0YXJ0Q29sb3IuZywgZW5kQ29sb3IuZywgcGVyY2VudCk7XG5cbiAgICByZXR1cm4gXCIjXCIgKyByICsgZyArIGI7XG4gIH1cblxuICBmdW5jdGlvbiBSYXRlWW8gKCRub2RlLCBvcHRpb25zKSB7XG5cbiAgICAvKlxuICAgICAqIFRoZSBDb250cnVjdG9yLCB3aG9zZSBpbnN0YW5jZXMgYXJlIHVzZWQgYnkgcGx1Z2luIGl0c2VsZlxuICAgICAqL1xuXG4gICAgLy8gU3RvcmluZyB0aGUgSFRNTCBlbGVtZW50IGFzIGEgcHJvcGVydHksIGZvciBmdXR1cmUgYWNjZXNzXG4gICAgdGhpcy5ub2RlID0gJG5vZGUuZ2V0KDApO1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBzdHVmZiB0aGF0IGlzIHByZXNlbnQgaW5zaWRlIHRoZSBjb250YWluZXIsIGFuZCBhZGQgdGhlIHBsdWdpbiBjbGFzc1xuICAgICRub2RlLmVtcHR5KCkuYWRkQ2xhc3MoXCJqcS1yeS1jb250YWluZXJcIik7XG5cbiAgICAvKlxuICAgICAqIEJhc2ljYWxseSB0aGUgcGx1Z2luIGRpc3BsYXlzIHRoZSByYXRpbmcgdXNpbmcgdHdvIHJvd3Mgb2Ygc3RhcnMgbHlpbmcgb25lIGFib3ZlXG4gICAgICogdGhlIG90aGVyLCB0aGUgcm93IHRoYXQgaXMgb24gdGhlIHRvcCByZXByZXNlbnRzIHRoZSBhY3R1YWwgcmF0aW5nLCBhbmQgdGhlIG9uZVxuICAgICAqIGJlaGluZCBhY3RzIGp1c3QgbGlrZSBhIGJhY2tncm91bmQuXG4gICAgICpcbiAgICAgKiBgJGdyb3VwV3JhcHBlcmA6IGlzIGFuIGVsZW1lbnQgdGhhdCB3cmFwcyBib3RoIHRoZSByb3dzXG4gICAgICogYCRub3JtYWxHcm91cGA6IGlzIHRoZSBjb250YWluZXIgZm9yIHJvdyBvZiBzdGFycyB0aGF0cyBiZWhpbmQgYW5kXG4gICAgICogICAgICAgICAgICAgICAgIGFjdHMgYXMgYmFja2dyb3VuZFxuICAgICAqIGAkcmF0ZWRHcm91cGA6IGlzIHRoZSBjb250YWluZXIgZm9yIHJvdyBvZiBzdGFycyB0aGF0IGRpc3BsYXkgdGhlIGFjdHVhbCByYXRpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgcmF0aW5nIGlzIGRpc3BsYXllZCBieSBhZGp1c3RpbmcgdGhlIHdpZHRoIG9mIGAkcmF0ZWRHcm91cGBcbiAgICAgKi9cbiAgICB2YXIgJGdyb3VwV3JhcHBlciA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3MoXCJqcS1yeS1ncm91cC13cmFwcGVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkbm9kZSk7XG5cbiAgICB2YXIgJG5vcm1hbEdyb3VwID0gJChcIjxkaXYvPlwiKS5hZGRDbGFzcyhcImpxLXJ5LW5vcm1hbC1ncm91cFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImpxLXJ5LWdyb3VwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRncm91cFdyYXBwZXIpO1xuXG4gICAgdmFyICRyYXRlZEdyb3VwID0gJChcIjxkaXYvPlwiKS5hZGRDbGFzcyhcImpxLXJ5LXJhdGVkLWdyb3VwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoXCJqcS1yeS1ncm91cFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRncm91cFdyYXBwZXIpO1xuXG4gICAgLypcbiAgICAgKiBWYXJpYWJsZSBgc3RlcGA6IHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgcmF0aW5nIGZvciBlYWNoIHN0YXJcbiAgICAgKiAgICAgICAgICAgICAgICAgIGVnOiBpZiBgbWF4VmFsdWVgIGlzIDUgYW5kIGBudW1TdGFyc2AgaXMgNSwgdmFsdWUgb2YgZWFjaCBzdGFyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgMS5cbiAgICAgKiBWYXJpYWJsZSBgc3RhcldpZHRoYDogc3RvcmVzIHRoZSBkZWNpbWFsIHZhbHVlIG9mIHdpZHRoIG9mIHN0YXIgaW4gdW5pdHMgb2YgcHhcbiAgICAgKiBWYXJpYWJsZSBgcGVyY2VudE9mU3RhcmA6IHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB3aWR0aCBlYWNoIHN0YXIgdGFrZXMgdy5yLnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb250YWluZXJcbiAgICAgKiBWYXJpYWJsZSBgc3BhY2luZ2A6IHN0b3JlcyB0aGUgZGVjaW1hbCB2YWx1ZSBvZiB0aGUgc3BhY2luZyBiZXR3ZWVuIHN0YXJzXG4gICAgICogICAgICAgICAgICAgICAgICAgICBpbiB0aGUgdW5pdHMgb2YgcHhcbiAgICAgKiBWYXJpYWJsZSBgcGVyY2VudE9mU3BhY2luZ2A6IHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB3aWR0aCBvZiB0aGUgc3BhY2luZ1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBzdGFycyB3LnIudCB0aGUgY29udGFpbmVyXG4gICAgICovXG4gICAgdmFyIHN0ZXAsIHN0YXJXaWR0aCwgcGVyY2VudE9mU3Rhciwgc3BhY2luZyxcbiAgICAgICAgcGVyY2VudE9mU3BhY2luZywgY29udGFpbmVyV2lkdGgsIG1pblZhbHVlID0gMDtcblxuICAgIC8qXG4gICAgICogYGN1cnJlbnRSYXRpbmdgIGNvbnRhaW5zIHJhdGluZyB0aGF0IGlzIGJlaW5nIGRpc3BsYXllZCBhdCB0aGUgbGF0ZXN0IHBvaW50IG9mXG4gICAgICogdGltZS5cbiAgICAgKlxuICAgICAqIFdoZW4gZXZlciB5b3UgaG92ZXIgb3ZlciB0aGUgcGx1Z2luIFVJLCB0aGUgcmF0aW5nIHZhbHVlIGNoYW5nZXNcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYWNlIHdoZXJlIHlvdSBwb2ludCB0aGUgY3Vyc29yLCBjdXJyZW50UmF0aW5nIGNvbnRhaW5zXG4gICAgICogdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmF0aW5nIHRoYXQgaXMgYmVpbmcgc2hvd24gaW4gdGhlIFVJXG4gICAgICovXG4gICAgdmFyIGN1cnJlbnRSYXRpbmcgPSBvcHRpb25zLnJhdGluZztcblxuICAgIC8vIEEgZmxhZyB0byBzdG9yZSBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYmVpbmcgZGlzcGxheWVkIGluIHRoZSBVSVxuICAgIHZhciBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBzaG93UmF0aW5nIChyYXRpbmdWYWwpIHtcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGlzcGxheWluZyB0aGUgcmF0aW5nIGJ5IGNoYW5naW5nXG4gICAgICAgKiB0aGUgd2lkdGggb2YgYCRyYXRlZEdyb3VwYFxuICAgICAgICovXG5cbiAgICAgIGlmICghaXNEZWZpbmVkKHJhdGluZ1ZhbCkpIHtcblxuICAgICAgICByYXRpbmdWYWwgPSBvcHRpb25zLnJhdGluZztcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmluZyB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZyBzaG93biBpbiBgY3VycmVudFJhdGluZ2AuXG4gICAgICBjdXJyZW50UmF0aW5nID0gcmF0aW5nVmFsO1xuXG4gICAgICB2YXIgbnVtU3RhcnNUb1Nob3cgPSByYXRpbmdWYWwvc3RlcDtcblxuICAgICAgLy8gY2FsY3VsYXRpbmcgdGhlIHBlcmNlbnRhZ2Ugb2Ygd2lkdGggb2YgJHJhdGVkR3JvdXAgd2l0aCByZXNwZWN0IHRvIGl0cyBwYXJlbnRcbiAgICAgIHZhciBwZXJjZW50ID0gbnVtU3RhcnNUb1Nob3cqcGVyY2VudE9mU3RhcjtcblxuICAgICAgaWYgKG51bVN0YXJzVG9TaG93ID4gMSkge1xuXG4gICAgICAgIC8vIGFkZGluZyB0aGUgcGVyY2VudGFnZSBvZiBzcGFjZSB0aGF0IGlzIHRha2VuIGJ5IHRoZSBnYXAgdGhlIHN0YXJzXG4gICAgICAgIHBlcmNlbnQgKz0gKE1hdGguY2VpbChudW1TdGFyc1RvU2hvdykgLSAxKSpwZXJjZW50T2ZTcGFjaW5nO1xuICAgICAgfVxuXG4gICAgICBzZXRSYXRlZEZpbGwob3B0aW9ucy5yYXRlZEZpbGwpO1xuXG4gICAgICBwZXJjZW50ID0gb3B0aW9ucy5ydGwgPyAxMDAgLSBwZXJjZW50IDogcGVyY2VudDtcblxuICAgICAgaWYgKHBlcmNlbnQgPCAwKSB7XG5cbiAgICAgICAgcGVyY2VudCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxMDApIHtcblxuICAgICAgICBwZXJjZW50ID0gMTAwO1xuICAgICAgfVxuXG4gICAgICAkcmF0ZWRHcm91cC5jc3MoXCJ3aWR0aFwiLCBwZXJjZW50ICsgXCIlXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldENvbnRhaW5lcldpZHRoICgpIHtcblxuICAgICAgLypcbiAgICAgICAqIFNldCB0aGUgd2lkdGggb2YgdGhlIGB0aGlzLm5vZGVgIGJhc2VkIG9uIHRoZSB3aWR0aCBvZiBlYWNoIHN0YXIgYW5kXG4gICAgICAgKiB0aGUgc3BhY2UgYmV0d2VlbiB0aGVtXG4gICAgICAgKi9cblxuICAgICAgY29udGFpbmVyV2lkdGggPSBzdGFyV2lkdGgqb3B0aW9ucy5udW1TdGFycyArIHNwYWNpbmcqKG9wdGlvbnMubnVtU3RhcnMgLSAxKTtcblxuICAgICAgcGVyY2VudE9mU3RhciA9IChzdGFyV2lkdGgvY29udGFpbmVyV2lkdGgpKjEwMDtcblxuICAgICAgcGVyY2VudE9mU3BhY2luZyA9IChzcGFjaW5nL2NvbnRhaW5lcldpZHRoKSoxMDA7XG5cbiAgICAgICRub2RlLndpZHRoKGNvbnRhaW5lcldpZHRoKTtcblxuICAgICAgc2hvd1JhdGluZygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFN0YXJXaWR0aCAobmV3V2lkdGgpIHtcblxuICAgICAgLypcbiAgICAgICAqIFNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBlYWNoIFNWRyBzdGFyLCBjYWxsZWQgd2hlbmV2ZXIgb25lIGNoYW5nZXMgdGhlXG4gICAgICAgKiBgc3RhcldpZHRoYCBvcHRpb25cbiAgICAgICAqL1xuXG4gICAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3RhciBzaG91bGQgYmUgdGhlIHNhbWVcbiAgICAgIHZhciBzdGFySGVpZ2h0ID0gb3B0aW9ucy5zdGFyV2lkdGggPSBuZXdXaWR0aDtcblxuICAgICAgc3RhcldpZHRoID0gd2luZG93LnBhcnNlRmxvYXQob3B0aW9ucy5zdGFyV2lkdGgucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcblxuICAgICAgJG5vcm1hbEdyb3VwLmZpbmQoXCJzdmdcIilcbiAgICAgICAgICAgICAgICAgIC5hdHRyKHt3aWR0aCA6IG9wdGlvbnMuc3RhcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogc3RhckhlaWdodH0pO1xuXG4gICAgICAkcmF0ZWRHcm91cC5maW5kKFwic3ZnXCIpXG4gICAgICAgICAgICAgICAgIC5hdHRyKHt3aWR0aCA6IG9wdGlvbnMuc3RhcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzdGFySGVpZ2h0fSk7XG5cbiAgICAgIHNldENvbnRhaW5lcldpZHRoKCk7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRTcGFjaW5nIChuZXdTcGFjaW5nKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBTZXQgc3BhY2luZyBiZXR3ZWVuIHRoZSBTVkcgc3RhcnMsIGNhbGxlZCB3aGVuZXZlciBvbmUgY2hhbmdlc1xuICAgICAgICogdGhlIGBzcGFjaW5nYCBvcHRpb25cbiAgICAgICAqL1xuXG4gICAgICBvcHRpb25zLnNwYWNpbmcgPSBuZXdTcGFjaW5nO1xuXG4gICAgICBzcGFjaW5nID0gcGFyc2VGbG9hdChvcHRpb25zLnNwYWNpbmcucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcblxuICAgICAgJG5vcm1hbEdyb3VwLmZpbmQoXCJzdmc6bm90KDpmaXJzdC1jaGlsZClcIilcbiAgICAgICAgICAgICAgICAgIC5jc3Moe1wibWFyZ2luLWxlZnRcIjogbmV3U3BhY2luZ30pO1xuXG4gICAgICAkcmF0ZWRHcm91cC5maW5kKFwic3ZnOm5vdCg6Zmlyc3QtY2hpbGQpXCIpXG4gICAgICAgICAgICAgICAgIC5jc3Moe1wibWFyZ2luLWxlZnRcIjogbmV3U3BhY2luZ30pO1xuXG4gICAgICBzZXRDb250YWluZXJXaWR0aCgpO1xuXG4gICAgICByZXR1cm4gJG5vZGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Tm9ybWFsRmlsbCAobmV3RmlsbCkge1xuXG4gICAgICAvKlxuICAgICAgICogU2V0IHRoZSBiYWNrZ3JvdW5kIGZpbGwgb2YgdGhlIFN0YXJzLCBjYWxsZWQgd2hlbmV2ZXIgb25lIGNoYW5nZXMgdGhlXG4gICAgICAgKiBgbm9ybWFsRmlsbGAgb3B0aW9uXG4gICAgICAgKi9cblxuICAgICAgb3B0aW9ucy5ub3JtYWxGaWxsID0gbmV3RmlsbDtcblxuICAgICAgdmFyICRzdmdzID0gKG9wdGlvbnMucnRsID8gJHJhdGVkR3JvdXAgOiAkbm9ybWFsR3JvdXApLmZpbmQoXCJzdmdcIik7XG5cbiAgICAgICRzdmdzLmF0dHIoe2ZpbGw6IG9wdGlvbnMubm9ybWFsRmlsbH0pO1xuXG4gICAgICByZXR1cm4gJG5vZGU7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTdG9yZSB0aGUgcmVjZW50IGByYXRlZEZpbGxgIG9wdGlvbiBpbiBhIHZhcmlhYmxlXG4gICAgICogc28gdGhhdCBpZiBtdWx0aUNvbG9yIGlzIHVuc2V0LCB3ZSBjYW4gdXNlIHRoZSBwZXJ2aW91c2x5IHNldCBgcmF0ZWRGaWxsYFxuICAgICAqIGZyb20gdGhpcyB2YXJpYWJsZVxuICAgICAqL1xuICAgIHZhciByYXRlZEZpbGwgPSBvcHRpb25zLnJhdGVkRmlsbDtcblxuICAgIGZ1bmN0aW9uIHNldFJhdGVkRmlsbCAobmV3RmlsbCkge1xuXG4gICAgICAvKlxuICAgICAgICogU2V0IHJhdGVkRmlsbCBvZiB0aGUgc3RhcnMsIGNhbGxlZCB3aGVuIG9uZSBjaGFuZ2VzIHRoZSBgcmF0ZWRGaWxsYCBvcHRpb25cbiAgICAgICAqL1xuXG4gICAgICAvKlxuICAgICAgICogSWYgYG11bHRpQ29sb3JgIG9wdGlvbiBpcyBzZXQsIGBuZXdGaWxsYCB2YXJpYWJsZSBpcyBkeW5hbWljYWxseSBzZXRcbiAgICAgICAqIGJhc2VkIG9uIHRoZSByYXRpbmcsIHdoYXQgZXZlciBzZXQgYXMgcGFyYW1ldGVyIHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICAgKi9cbiAgICAgIGlmIChvcHRpb25zLm11bHRpQ29sb3IpIHtcblxuICAgICAgICB2YXIgcmF0aW5nRGlmZiA9IGN1cnJlbnRSYXRpbmcgLSBtaW5WYWx1ZSxcbiAgICAgICAgICAgIHBlcmNlbnRDb3ZlcmVkID0gKHJhdGluZ0RpZmYvb3B0aW9ucy5tYXhWYWx1ZSkqMTAwO1xuXG4gICAgICAgIHZhciBjb2xvck9wdHMgID0gb3B0aW9ucy5tdWx0aUNvbG9yIHx8IHt9LFxuICAgICAgICAgICAgc3RhcnRDb2xvciA9IGNvbG9yT3B0cy5zdGFydENvbG9yIHx8IE1VTFRJQ09MT1JfT1BUSU9OUy5zdGFydENvbG9yLFxuICAgICAgICAgICAgZW5kQ29sb3IgICA9IGNvbG9yT3B0cy5lbmRDb2xvciB8fCBNVUxUSUNPTE9SX09QVElPTlMuZW5kQ29sb3I7XG5cbiAgICAgICAgbmV3RmlsbCA9IGdldENvbG9yKHN0YXJ0Q29sb3IsIGVuZENvbG9yLCBwZXJjZW50Q292ZXJlZCk7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJhdGVkRmlsbCA9IG5ld0ZpbGw7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMucmF0ZWRGaWxsID0gbmV3RmlsbDtcblxuICAgICAgdmFyICRzdmdzID0gKG9wdGlvbnMucnRsID8gJG5vcm1hbEdyb3VwIDogJHJhdGVkR3JvdXApLmZpbmQoXCJzdmdcIik7XG5cbiAgICAgICRzdmdzLmF0dHIoe2ZpbGw6IG9wdGlvbnMucmF0ZWRGaWxsfSk7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRSdGwgKG5ld1ZhbHVlKSB7XG5cbiAgICAgIG5ld1ZhbHVlID0gISFuZXdWYWx1ZTtcblxuICAgICAgb3B0aW9ucy5ydGwgPSBuZXdWYWx1ZTtcblxuICAgICAgc2V0Tm9ybWFsRmlsbChvcHRpb25zLm5vcm1hbEZpbGwpO1xuICAgICAgc2hvd1JhdGluZygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE11bHRpQ29sb3IgKGNvbG9yT3B0aW9ucykge1xuXG4gICAgICAvKlxuICAgICAgICogY2FsbGVkIHdoZW5ldmVyIG9uZSBjaGFuZ2VzIHRoZSBgbXVsdGlDb2xvcmAgb3B0aW9uXG4gICAgICAgKi9cblxuICAgICAgb3B0aW9ucy5tdWx0aUNvbG9yID0gY29sb3JPcHRpb25zO1xuXG4gICAgICAvLyBzZXQgdGhlIHJlY2VudGx5IHNldCBgcmF0ZWRGaWxsYCBvcHRpb24sIGlmIG11bHRpQ29sb3IgT3B0aW9ucyBhcmUgdW5zZXRcbiAgICAgIHNldFJhdGVkRmlsbChjb2xvck9wdGlvbnMgPyBjb2xvck9wdGlvbnMgOiByYXRlZEZpbGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE51bVN0YXJzIChuZXdWYWx1ZSkge1xuXG4gICAgICAvKlxuICAgICAgICogU2V0IHRoZSBudW1iZXIgb2Ygc3RhcnMgdG8gdXNlIHRvIGRpc3BsYXkgdGhlIHJhdGluZywgY2FsbGVkIHdoZW5ldmVyIG9uZVxuICAgICAgICogY2hhbmdlcyB0aGUgYG51bVN0YXJzYCBvcHRpb25cbiAgICAgICAqL1xuXG4gICAgICBvcHRpb25zLm51bVN0YXJzID0gbmV3VmFsdWU7XG5cbiAgICAgIHN0ZXAgPSBvcHRpb25zLm1heFZhbHVlL29wdGlvbnMubnVtU3RhcnM7XG5cbiAgICAgICRub3JtYWxHcm91cC5lbXB0eSgpO1xuICAgICAgJHJhdGVkR3JvdXAuZW1wdHkoKTtcblxuICAgICAgZm9yICh2YXIgaT0wOyBpPG9wdGlvbnMubnVtU3RhcnM7IGkrKykge1xuXG4gICAgICAgICRub3JtYWxHcm91cC5hcHBlbmQoJChvcHRpb25zLnN0YXJTdmcgfHwgQkFTSUNTVEFSKSk7XG4gICAgICAgICRyYXRlZEdyb3VwLmFwcGVuZCgkKG9wdGlvbnMuc3RhclN2ZyB8fCBCQVNJQ1NUQVIpKTtcbiAgICAgIH1cblxuICAgICAgc2V0U3RhcldpZHRoKG9wdGlvbnMuc3RhcldpZHRoKTtcbiAgICAgIHNldE5vcm1hbEZpbGwob3B0aW9ucy5ub3JtYWxGaWxsKTtcbiAgICAgIHNldFNwYWNpbmcob3B0aW9ucy5zcGFjaW5nKTtcblxuICAgICAgc2hvd1JhdGluZygpO1xuXG4gICAgICByZXR1cm4gJG5vZGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0TWF4VmFsdWUgKG5ld1ZhbHVlKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBzZXQgdGhlIE1heGltdW0gVmFsdWUgb2YgcmF0aW5nIHRvIGJlIGFsbG93ZWQsIGNhbGxlZCB3aGVuZXZlclxuICAgICAgICogb25lIGNoYW5nZXMgdGhlIGBtYXhWYWx1ZWAgb3B0aW9uXG4gICAgICAgKi9cblxuICAgICAgb3B0aW9ucy5tYXhWYWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgICBzdGVwID0gb3B0aW9ucy5tYXhWYWx1ZS9vcHRpb25zLm51bVN0YXJzO1xuXG4gICAgICBpZiAob3B0aW9ucy5yYXRpbmcgPiBuZXdWYWx1ZSkge1xuXG4gICAgICAgIHNldFJhdGluZyhuZXdWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHNob3dSYXRpbmcoKTtcblxuICAgICAgcmV0dXJuICRub2RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFByZWNpc2lvbiAobmV3VmFsdWUpIHtcblxuICAgICAgLypcbiAgICAgICAqIFNldCB0aGUgcHJlY2lzaW9uIG9mIHRoZSByYXRpbmcgdmFsdWUsIGNhbGxlZCBpZiBvbmUgY2hhbmdlcyB0aGVcbiAgICAgICAqIGBwcmVjaXNpb25gIG9wdGlvblxuICAgICAgICovXG5cbiAgICAgIG9wdGlvbnMucHJlY2lzaW9uID0gbmV3VmFsdWU7XG5cbiAgICAgIHNldFJhdGluZyhvcHRpb25zLnJhdGluZyk7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRIYWxmU3RhciAobmV3VmFsdWUpIHtcblxuICAgICAgLypcbiAgICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaWYgb25lIGNoYW5nZXMgdGhlIGBoYWxmU3RhcmAgb3B0aW9uXG4gICAgICAgKi9cblxuICAgICAgb3B0aW9ucy5oYWxmU3RhciA9IG5ld1ZhbHVlO1xuXG4gICAgICByZXR1cm4gJG5vZGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0RnVsbFN0YXIgKG5ld1ZhbHVlKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIG9uZSBjaGFuZ2VzIHRoZSBgZnVsbFN0YXJgIG9wdGlvblxuICAgICAgICovXG5cbiAgICAgIG9wdGlvbnMuZnVsbFN0YXIgPSBuZXdWYWx1ZTtcblxuICAgICAgcmV0dXJuICRub2RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdW5kICh2YWx1ZSkge1xuXG4gICAgICAvKlxuICAgICAgICogUm91bmRzIHRoZSB2YWx1ZSBvZiByYXRpbmcgaWYgYGhhbGZTdGFyYCBvciBgZnVsbFN0YXJgIG9wdGlvbnMgYXJlIGNob3NlblxuICAgICAgICovXG5cbiAgICAgIHZhciByZW1haW5kZXIgPSB2YWx1ZSVzdGVwLFxuICAgICAgICAgIGhhbGZTdGVwID0gc3RlcC8yLFxuICAgICAgICAgIGlzSGFsZlN0YXIgPSBvcHRpb25zLmhhbGZTdGFyLFxuICAgICAgICAgIGlzRnVsbFN0YXIgPSBvcHRpb25zLmZ1bGxTdGFyO1xuXG4gICAgICBpZiAoIWlzRnVsbFN0YXIgJiYgIWlzSGFsZlN0YXIpIHtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Z1bGxTdGFyIHx8IChpc0hhbGZTdGFyICYmIHJlbWFpbmRlciA+IGhhbGZTdGVwKSkge1xuXG4gICAgICAgIHZhbHVlICs9IHN0ZXAgLSByZW1haW5kZXI7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHZhbHVlID0gdmFsdWUgLSByZW1haW5kZXI7XG5cbiAgICAgICAgaWYgKHJlbWFpbmRlciA+IDApIHtcblxuICAgICAgICAgIHZhbHVlICs9IGhhbGZTdGVwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVSYXRpbmcgKGUpIHtcblxuICAgICAgLypcbiAgICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHJhdGluZyBiYXNlZCBvbiB0aGUgcG9zaXRpb24gb2YgY3Vyc29yIHcuci50IHRoZVxuICAgICAgICogcGx1Z2luIGNvbnRhaW5lclxuICAgICAgICovXG5cbiAgICAgIHZhciBwb3NpdGlvbiA9ICRub3JtYWxHcm91cC5vZmZzZXQoKSxcbiAgICAgICAgICBub2RlU3RhcnRYID0gcG9zaXRpb24ubGVmdCxcbiAgICAgICAgICBub2RlRW5kWCA9IG5vZGVTdGFydFggKyAkbm9ybWFsR3JvdXAud2lkdGgoKTtcblxuICAgICAgdmFyIG1heFZhbHVlID0gb3B0aW9ucy5tYXhWYWx1ZTtcblxuICAgICAgLy8gVGhlIHgtY29vcmRpbmF0ZShwb3NpdGlvbikgb2YgdGhlIG1vdXNlIHBvaW50ZXIgdy5yLnQgcGFnZVxuICAgICAgdmFyIHBhZ2VYID0gZS5wYWdlWDtcblxuICAgICAgdmFyIGNhbGN1bGF0ZWRSYXRpbmcgPSAwO1xuXG4gICAgICAvLyBJZiB0aGUgbW91c2UgcG9pbnRlciBpcyB0byB0aGUgbGVmdCBvZiB0aGUgY29udGFpbmVyXG4gICAgICBpZihwYWdlWCA8IG5vZGVTdGFydFgpIHtcblxuICAgICAgICBjYWxjdWxhdGVkUmF0aW5nID0gbWluVmFsdWU7XG4gICAgICB9ZWxzZSBpZiAocGFnZVggPiBub2RlRW5kWCkgeyAvLyBJZiB0aGUgbW91c2UgcG9pbnRlciBpcyByaWdodCBvZiB0aGUgY29udGFpbmVyXG5cbiAgICAgICAgY2FsY3VsYXRlZFJhdGluZyA9IG1heFZhbHVlO1xuICAgICAgfWVsc2UgeyAvLyBJZiB0aGUgbW91c2UgcG9pbnRlciBpcyBpbnNpZGUgdGhlIGNvbnRpbmVyXG5cbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIGZyYWN0aW9uIG9mIHdpZHRoIGNvdmVyZWQgYnkgdGhlIHBvaW50ZXIgdy5yLnQgdG8gdGhlIHRvdGFsIHdpZHRoXG4gICAgICAgICAqIG9mIHRoZSBjb250YWluZXIuXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgY2FsY1ByY250ID0gKChwYWdlWCAtIG5vZGVTdGFydFgpLyhub2RlRW5kWCAtIG5vZGVTdGFydFgpKTtcblxuICAgICAgICBpZiAoc3BhY2luZyA+IDApIHtcblxuICAgICAgICAgIC8qXG4gICAgICAgICAgICogSWYgdGhlcmUgaXMgc3BhY2luZyBiZXR3ZWVuIHN0YXJzLCB0YWtlIHRoZSBwZXJjZW50YWdlIG9mIHdpZHRoIGNvdmVyZWRcbiAgICAgICAgICAgKiBhbmQgc3VidHJhY3QgdGhlIHBlcmNlbnRhZ2Ugb2Ygd2lkdGggY292ZXJlZCBieSBzdGFycyBhbmQgc3BhY2luZywgdG8gZmluZFxuICAgICAgICAgICAqIGhvdyBtYW55IHN0YXJzIGFyZSBjb3ZlcmVkLCB0aGUgbnVtYmVyIG9mIHN0YXJzIGNvdmVyZWQgaXMgdGhlIHJhdGluZ1xuICAgICAgICAgICAqXG4gICAgICAgICAgICogVE9ETzogSSBzdHJvbmdseSBmZWVsIHRoYXQgdGhpcyBsb2dpYyBjYW4gYmUgaW1wcm92ZWQhLCBQbGVhc2UgaGVscCFcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjYWxjUHJjbnQgKj0gMTAwO1xuXG4gICAgICAgICAgdmFyIHJlbVByY250ID0gY2FsY1ByY250O1xuXG4gICAgICAgICAgd2hpbGUgKHJlbVByY250ID4gMCkge1xuXG4gICAgICAgICAgICBpZiAocmVtUHJjbnQgPiBwZXJjZW50T2ZTdGFyKSB7XG5cbiAgICAgICAgICAgICAgY2FsY3VsYXRlZFJhdGluZyArPSBzdGVwO1xuICAgICAgICAgICAgICByZW1QcmNudCAtPSAocGVyY2VudE9mU3RhciArIHBlcmNlbnRPZlNwYWNpbmcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICBjYWxjdWxhdGVkUmF0aW5nICs9IHJlbVByY250L3BlcmNlbnRPZlN0YXIqc3RlcDtcbiAgICAgICAgICAgICAgcmVtUHJjbnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIC8qXG4gICAgICAgICAgICogSWYgdGhlcmUgaXMgbm90IHNwYWNpbmcgYmV0d2VlbiBzdGFycywgdGhlIGZyYWN0aW9uIG9mIHdpZHRoIGNvdmVyZWQgcGVyXG4gICAgICAgICAgICogYG1heFZhbHVlYCBpcyB0aGUgcmF0aW5nXG4gICAgICAgICAgICovXG4gICAgICAgICAgY2FsY3VsYXRlZFJhdGluZyA9IGNhbGNQcmNudCAqIChvcHRpb25zLm1heFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJvdW5kIHRoZSByYXRpbmcgaWYgYGhhbGZTdGFyYCBvciBgZnVsbFN0YXJgIG9wdGlvbnMgYXJlIGNob3NlblxuICAgICAgICBjYWxjdWxhdGVkUmF0aW5nID0gcm91bmQoY2FsY3VsYXRlZFJhdGluZyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJ0bCkge1xuXG4gICAgICAgIGNhbGN1bGF0ZWRSYXRpbmcgPSBtYXhWYWx1ZSAtIGNhbGN1bGF0ZWRSYXRpbmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRSYXRpbmcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFJlYWRPbmx5IChuZXdWYWx1ZSkge1xuXG4gICAgICAvKlxuICAgICAgICogVW5CaW5kcyBtb3VzZSBldmVudCBoYW5kbGVycywgY2FsbGVkIHdoZW4gd2hlbmV2ZXIgb25lIGNoYW5nZXMgdGhlXG4gICAgICAgKiBgcmVhZE9ubHlgIG9wdGlvblxuICAgICAgICovXG5cbiAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSBuZXdWYWx1ZTtcblxuICAgICAgJG5vZGUuYXR0cihcInJlYWRvbmx5XCIsIHRydWUpO1xuXG4gICAgICB1bmJpbmRFdmVudHMoKTtcblxuICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuXG4gICAgICAgICRub2RlLnJlbW92ZUF0dHIoXCJyZWFkb25seVwiKTtcblxuICAgICAgICBiaW5kRXZlbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRSYXRpbmcgKG5ld1ZhbHVlKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBTZXRzIHRoZSByYXRpbmcgb2YgdGhlIFBsdWdpbiwgQ2FsbGVkIHdoZW4gb3B0aW9uIGByYXRpbmdgIGlzIGNoYW5nZWRcbiAgICAgICAqIG9yLCB3aGVuIGByYXRpbmdgIG1ldGhvZCBpcyBjYWxsZWRcbiAgICAgICAqL1xuXG4gICAgICB2YXIgcmF0aW5nID0gbmV3VmFsdWU7XG5cbiAgICAgIHZhciBtYXhWYWx1ZSA9IG9wdGlvbnMubWF4VmFsdWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmF0aW5nID09PSBcInN0cmluZ1wiKSB7XG5cbiAgICAgICAgLy8gSWYgcmF0aW5nIGlzIGdpdmVuIGluIHBlcmNlbnRhZ2UsIG1heFZhbHVlIHNob3VsZCBiZSAxMDBcbiAgICAgICAgaWYgKHJhdGluZ1tyYXRpbmcubGVuZ3RoIC0gMV0gPT09IFwiJVwiKSB7XG5cbiAgICAgICAgICByYXRpbmcgPSByYXRpbmcuc3Vic3RyKDAsIHJhdGluZy5sZW5ndGggLSAxKTtcbiAgICAgICAgICBtYXhWYWx1ZSA9IDEwMDtcblxuICAgICAgICAgIHNldE1heFZhbHVlKG1heFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhdGluZyA9IHBhcnNlRmxvYXQocmF0aW5nKTtcbiAgICAgIH1cblxuICAgICAgY2hlY2tCb3VuZHMocmF0aW5nLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuXG4gICAgICByYXRpbmcgPSBwYXJzZUZsb2F0KHJhdGluZy50b0ZpeGVkKG9wdGlvbnMucHJlY2lzaW9uKSk7XG5cbiAgICAgIGNoZWNrUHJlY2lzaW9uKHBhcnNlRmxvYXQocmF0aW5nKSwgbWluVmFsdWUsIG1heFZhbHVlKTtcblxuICAgICAgb3B0aW9ucy5yYXRpbmcgPSByYXRpbmc7XG5cbiAgICAgIHNob3dSYXRpbmcoKTtcblxuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHtcblxuICAgICAgICAkbm9kZS50cmlnZ2VyKFwicmF0ZXlvLnNldFwiLCB7cmF0aW5nOiByYXRpbmd9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICRub2RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9uSW5pdCAobWV0aG9kKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBzZXQgd2hhdCBtZXRob2QgdG8gYmUgY2FsbGVkIG9uIEluaXRpYWxpemF0aW9uXG4gICAgICAgKi9cblxuICAgICAgb3B0aW9ucy5vbkluaXQgPSBtZXRob2Q7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPblNldCAobWV0aG9kKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBzZXQgd2hhdCBtZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gcmF0aW5nIGlzIHNldFxuICAgICAgICovXG5cbiAgICAgIG9wdGlvbnMub25TZXQgPSBtZXRob2Q7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPbkNoYW5nZSAobWV0aG9kKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBzZXQgd2hhdCBtZXRob2QgdG8gYmUgY2FsbGVkIHJhdGluZyBpbiB0aGUgVUkgaXMgY2hhbmdlZFxuICAgICAgICovXG5cbiAgICAgIG9wdGlvbnMub25DaGFuZ2UgPSBtZXRob2Q7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9XG5cbiAgICB0aGlzLnJhdGluZyA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuXG4gICAgICAvKlxuICAgICAgICogcmF0aW5nIGdldHRlci9zZXR0ZXJcbiAgICAgICAqL1xuXG4gICAgICBpZiAoIWlzRGVmaW5lZChuZXdWYWx1ZSkpIHtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5yYXRpbmc7XG4gICAgICB9XG5cbiAgICAgIHNldFJhdGluZyhuZXdWYWx1ZSk7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9O1xuXG4gICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAvKlxuICAgICAgICogUmVtb3ZlcyB0aGUgUmF0aW5nIFVJIGJ5IGNsZWFyaW5nIHRoZSBjb250ZW50LCBhbmQgcmVtb3ZpbmcgdGhlIGN1c3RvbSBjbGFzc2VzXG4gICAgICAgKi9cblxuICAgICAgaWYgKCFvcHRpb25zLnJlYWRPbmx5KSB7XG5cbiAgICAgICAgdW5iaW5kRXZlbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIFJhdGVZby5wcm90b3R5cGUuY29sbGVjdGlvbiA9IGRlbGV0ZUluc3RhbmNlKCRub2RlLmdldCgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbik7XG5cbiAgICAgICRub2RlLnJlbW92ZUNsYXNzKFwianEtcnktY29udGFpbmVyXCIpLmNoaWxkcmVuKCkucmVtb3ZlKCk7XG5cbiAgICAgIHJldHVybiAkbm9kZTtcbiAgICB9O1xuXG4gICAgdGhpcy5tZXRob2QgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuXG4gICAgICAvKlxuICAgICAgICogTWV0aG9kIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgUmF0ZVlvIEluc3RhbmNlXG4gICAgICAgKi9cblxuICAgICAgaWYgKCFtZXRob2ROYW1lKSB7XG5cbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZXRob2QgbmFtZSBub3Qgc3BlY2lmaWVkIVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0RlZmluZWQodGhpc1ttZXRob2ROYW1lXSkpIHtcblxuICAgICAgICB0aHJvdyBFcnJvcihcIk1ldGhvZCBcIiArIG1ldGhvZE5hbWUgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLCBbXSksXG4gICAgICAgICAgcGFyYW1zID0gYXJncy5zbGljZSgxKSxcbiAgICAgICAgICBtZXRob2QgPSB0aGlzW21ldGhvZE5hbWVdO1xuXG4gICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIHBhcmFtcyk7XG4gICAgfTtcblxuICAgIHRoaXMub3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbk5hbWUsIHBhcmFtKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBNZXRob2QgdG8gZ2V0L3NldCBPcHRpb25zXG4gICAgICAgKi9cblxuICAgICAgaWYgKCFpc0RlZmluZWQob3B0aW9uTmFtZSkpIHtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgdmFyIG1ldGhvZDtcblxuICAgICAgc3dpdGNoIChvcHRpb25OYW1lKSB7XG5cbiAgICAgICAgY2FzZSBcInN0YXJXaWR0aFwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0U3RhcldpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtU3RhcnNcIjpcblxuICAgICAgICAgIG1ldGhvZCA9IHNldE51bVN0YXJzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibm9ybWFsRmlsbFwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0Tm9ybWFsRmlsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInJhdGVkRmlsbFwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0UmF0ZWRGaWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibXVsdGlDb2xvclwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0TXVsdGlDb2xvcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm1heFZhbHVlXCI6XG5cbiAgICAgICAgICBtZXRob2QgPSBzZXRNYXhWYWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInByZWNpc2lvblwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0UHJlY2lzaW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmF0aW5nXCI6XG5cbiAgICAgICAgICBtZXRob2QgPSBzZXRSYXRpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJoYWxmU3RhclwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0SGFsZlN0YXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJmdWxsU3RhclwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0RnVsbFN0YXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWFkT25seVwiOlxuXG4gICAgICAgICAgbWV0aG9kID0gc2V0UmVhZE9ubHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzcGFjaW5nXCI6XG5cbiAgICAgICAgICBtZXRob2QgPSBzZXRTcGFjaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicnRsXCI6XG5cbiAgICAgICAgICBtZXRob2QgPSBzZXRSdGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvbkluaXRcIjpcblxuICAgICAgICAgIG1ldGhvZCA9IHNldE9uSW5pdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm9uU2V0XCI6XG5cbiAgICAgICAgICBtZXRob2QgPSBzZXRPblNldDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm9uQ2hhbmdlXCI6XG5cbiAgICAgICAgICBtZXRob2QgPSBzZXRPbkNoYW5nZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICAgIHRocm93IEVycm9yKFwiTm8gc3VjaCBvcHRpb24gYXMgXCIgKyBvcHRpb25OYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzRGVmaW5lZChwYXJhbSkgPyBtZXRob2QocGFyYW0pIDogb3B0aW9uc1tvcHRpb25OYW1lXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gb25Nb3VzZUVudGVyIChlKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBJZiB0aGUgTW91c2UgUG9pbnRlciBpcyBpbnNpZGUgdGhlIGNvbnRhaW5lciwgY2FsY3VsYXRlIGFuZCBzaG93IHRoZSByYXRpbmdcbiAgICAgICAqIGluIFVJXG4gICAgICAgKi9cblxuICAgICAgdmFyIHJhdGluZyA9IGNhbGN1bGF0ZVJhdGluZyhlKS50b0ZpeGVkKG9wdGlvbnMucHJlY2lzaW9uKTtcblxuICAgICAgdmFyIG1heFZhbHVlID0gb3B0aW9ucy5tYXhWYWx1ZTtcblxuICAgICAgcmF0aW5nID0gY2hlY2tQcmVjaXNpb24ocGFyc2VGbG9hdChyYXRpbmcpLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuXG4gICAgICBzaG93UmF0aW5nKHJhdGluZyk7XG5cbiAgICAgICRub2RlLnRyaWdnZXIoXCJyYXRleW8uY2hhbmdlXCIsIHtyYXRpbmc6IHJhdGluZ30pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VMZWF2ZSAoKSB7XG4gICAgICBpZiAoaXNNb2JpbGVCcm93c2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogSWYgbW91c2UgbGVhdmVzLCByZXZlcnQgdGhlIHJhdGluZyBpbiBVSSB0byBwcmV2aW91c2x5IHNldCByYXRpbmcsXG4gICAgICAgKiB3aGVuIGVtcHR5IHZhbHVlIGlzIHBhc3NlZCB0byBzaG93UmF0aW5nLCBpdCB3aWxsIHRha2UgdGhlIHByZXZpb3VzbHkgc2V0XG4gICAgICAgKiByYXRpbmdcbiAgICAgICAqL1xuXG4gICAgICBzaG93UmF0aW5nKCk7XG5cbiAgICAgICRub2RlLnRyaWdnZXIoXCJyYXRleW8uY2hhbmdlXCIsIHtyYXRpbmc6IG9wdGlvbnMucmF0aW5nfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Nb3VzZUNsaWNrIChlKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBPbiBjbGlja2luZyB0aGUgbW91c2UgaW5zaWRlIHRoZSBjb250YWluZXIsIGNhbGN1bGF0ZSBhbmQgc2V0IHRoZSByYXRpbmdcbiAgICAgICAqL1xuXG4gICAgICB2YXIgcmVzdWx0YW50UmF0aW5nID0gY2FsY3VsYXRlUmF0aW5nKGUpLnRvRml4ZWQob3B0aW9ucy5wcmVjaXNpb24pO1xuICAgICAgcmVzdWx0YW50UmF0aW5nID0gcGFyc2VGbG9hdChyZXN1bHRhbnRSYXRpbmcpO1xuXG4gICAgICB0aGF0LnJhdGluZyhyZXN1bHRhbnRSYXRpbmcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uSW5pdChlLCBkYXRhKSB7XG5cbiAgICAgIGlmKG9wdGlvbnMub25Jbml0ICYmIHR5cGVvZiBvcHRpb25zLm9uSW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cbiAgICAgICAgLyoganNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIG9wdGlvbnMub25Jbml0LmFwcGx5KHRoaXMsIFtkYXRhLnJhdGluZywgdGhhdF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ2hhbmdlIChlLCBkYXRhKSB7XG5cbiAgICAgIGlmKG9wdGlvbnMub25DaGFuZ2UgJiYgdHlwZW9mIG9wdGlvbnMub25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuXG4gICAgICAgIC8qIGpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBvcHRpb25zLm9uQ2hhbmdlLmFwcGx5KHRoaXMsIFtkYXRhLnJhdGluZywgdGhhdF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uU2V0IChlLCBkYXRhKSB7XG5cbiAgICAgIGlmKG9wdGlvbnMub25TZXQgJiYgdHlwZW9mIG9wdGlvbnMub25TZXQgPT09IFwiZnVuY3Rpb25cIikge1xuXG4gICAgICAgIC8qIGpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBvcHRpb25zLm9uU2V0LmFwcGx5KHRoaXMsIFtkYXRhLnJhdGluZywgdGhhdF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMgKCkge1xuXG4gICAgICAkbm9kZS5vbihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlRW50ZXIpXG4gICAgICAgICAgIC5vbihcIm1vdXNlZW50ZXJcIiwgb25Nb3VzZUVudGVyKVxuICAgICAgICAgICAub24oXCJtb3VzZWxlYXZlXCIsIG9uTW91c2VMZWF2ZSlcbiAgICAgICAgICAgLm9uKFwiY2xpY2tcIiwgb25Nb3VzZUNsaWNrKVxuICAgICAgICAgICAub24oXCJyYXRleW8uaW5pdFwiLCBvbkluaXQpXG4gICAgICAgICAgIC5vbihcInJhdGV5by5jaGFuZ2VcIiwgb25DaGFuZ2UpXG4gICAgICAgICAgIC5vbihcInJhdGV5by5zZXRcIiwgb25TZXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuYmluZEV2ZW50cyAoKSB7XG5cbiAgICAgICRub2RlLm9mZihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlRW50ZXIpXG4gICAgICAgICAgIC5vZmYoXCJtb3VzZWVudGVyXCIsIG9uTW91c2VFbnRlcilcbiAgICAgICAgICAgLm9mZihcIm1vdXNlbGVhdmVcIiwgb25Nb3VzZUxlYXZlKVxuICAgICAgICAgICAub2ZmKFwiY2xpY2tcIiwgb25Nb3VzZUNsaWNrKVxuICAgICAgICAgICAub2ZmKFwicmF0ZXlvLmluaXRcIiwgb25Jbml0KVxuICAgICAgICAgICAub2ZmKFwicmF0ZXlvLmNoYW5nZVwiLCBvbkNoYW5nZSlcbiAgICAgICAgICAgLm9mZihcInJhdGV5by5zZXRcIiwgb25TZXQpO1xuICAgIH1cblxuICAgIHNldE51bVN0YXJzKG9wdGlvbnMubnVtU3RhcnMpO1xuICAgIHNldFJlYWRPbmx5KG9wdGlvbnMucmVhZE9ubHkpO1xuXG4gICAgaWYgKG9wdGlvbnMucnRsKSB7XG5cbiAgICAgIHNldFJ0bChvcHRpb25zLnJ0bCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2xsZWN0aW9uLnB1c2godGhpcyk7XG4gICAgdGhpcy5yYXRpbmcob3B0aW9ucy5yYXRpbmcsIHRydWUpO1xuXG4gICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgJG5vZGUudHJpZ2dlcihcInJhdGV5by5pbml0XCIsIHtyYXRpbmc6IG9wdGlvbnMucmF0aW5nfSk7XG4gIH1cblxuICBSYXRlWW8ucHJvdG90eXBlLmNvbGxlY3Rpb24gPSBbXTtcblxuICBmdW5jdGlvbiBnZXRJbnN0YW5jZSAobm9kZSwgY29sbGVjdGlvbikge1xuXG4gICAgLypcbiAgICAgKiBHaXZlbiBhIEhUTUwgZWxlbWVudCAobm9kZSkgYW5kIGEgY29sbGVjdGlvbiBvZiBSYXRlWW8gaW5zdGFuY2VzLFxuICAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBzZWFyY2ggdGhyb3VnaCB0aGUgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSBtYXRjaGVkXG4gICAgICogaW5zdGFuY2UgaGF2aW5nIHRoZSBub2RlXG4gICAgICovXG5cbiAgICB2YXIgaW5zdGFuY2U7XG5cbiAgICAkLmVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICBpZihub2RlID09PSB0aGlzLm5vZGUpe1xuXG4gICAgICAgIGluc3RhbmNlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlSW5zdGFuY2UgKG5vZGUsIGNvbGxlY3Rpb24pIHtcblxuICAgIC8qXG4gICAgICogR2l2ZW4gYSBIVE1MIGVsZW1lbnQgKG5vZGUpIGFuZCBhIGNvbGxlY3Rpb24gb2YgUmF0ZVlvIGluc3RhbmNlcyxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgc2VhcmNoIHRocm91Z2ggdGhlIGNvbGxlY3Rpb24gYW5kIGRlbGV0ZSB0aGVcbiAgICAgKiBpbnN0YW5jZSBoYXZpbmcgdGhlIG5vZGUsIGFuZCByZXR1cm4gdGhlIG1vZGlmaWVkIGNvbGxlY3Rpb25cbiAgICAgKi9cblxuICAgICQuZWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbiAoaW5kZXgpIHtcblxuICAgICAgaWYgKG5vZGUgPT09IHRoaXMubm9kZSkge1xuXG4gICAgICAgIHZhciBmaXJzdFBhcnQgPSBjb2xsZWN0aW9uLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgICAgICAgIHNlY29uZFBhcnQgPSBjb2xsZWN0aW9uLnNsaWNlKGluZGV4KzEsIGNvbGxlY3Rpb24ubGVuZ3RoKTtcblxuICAgICAgICBjb2xsZWN0aW9uID0gZmlyc3RQYXJ0LmNvbmNhdChzZWNvbmRQYXJ0KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yYXRlWW8gKG9wdGlvbnMpIHtcblxuICAgIHZhciByYXRlWW9JbnN0YW5jZXMgPSBSYXRlWW8ucHJvdG90eXBlLmNvbGxlY3Rpb247XG5cbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICB2YXIgJG5vZGVzID0gJCh0aGlzKTtcblxuICAgIGlmKCRub2Rlcy5sZW5ndGggPT09IDApIHtcblxuICAgICAgcmV0dXJuICRub2RlcztcbiAgICB9XG5cbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMsIFtdKTtcblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuXG4gICAgICAvL0lmIGFyZ3MgbGVuZ3RoIGlzIDAsIEluaXRpYWxpemUgdGhlIFVJIHdpdGggZGVmYXVsdCBzZXR0aW5nc1xuICAgICAgb3B0aW9ucyA9IGFyZ3NbMF0gPSB7fTtcbiAgICB9ZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpIHtcblxuICAgICAgLy9JZiBhbiBPYmplY3QgaXMgc3BlY2lmaWVkIGFzIGZpcnN0IGFyZ3VtZW50LCBpdCBpcyBjb25zaWRlcmVkIGFzIG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgPSBhcmdzWzBdO1xuICAgIH1lbHNlIGlmIChhcmdzLmxlbmd0aCA+PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiKSB7XG5cbiAgICAgIC8qXG4gICAgICAgKiBpZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCwgYW5kIGlmIGl0cyBhIHN0cmluZywgaXQgaXMgc3VwcG9zZWQgdG8gYmUgYVxuICAgICAgICogbWV0aG9kIG5hbWUsIGlmIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50c1xuICAgICAgICogZXhjZXB0IHRoZSBmaXJzdCBhcmd1bWVudCwgd2lsbCBiZSBwYXNzZWQgYXMgYSBwYXJhbXMgdG8gdGhlIHNwZWNpZmllZCBtZXRob2RcbiAgICAgICAqL1xuXG4gICAgICB2YXIgbWV0aG9kTmFtZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgcGFyYW1zID0gYXJncy5zbGljZSgxKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAkLmVhY2goJG5vZGVzLCBmdW5jdGlvbiAoaSwgbm9kZSkge1xuXG4gICAgICAgIHZhciBleGlzdGluZ0luc3RhbmNlID0gZ2V0SW5zdGFuY2Uobm9kZSwgcmF0ZVlvSW5zdGFuY2VzKTtcblxuICAgICAgICBpZighZXhpc3RpbmdJbnN0YW5jZSkge1xuXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJUcnlpbmcgdG8gc2V0IG9wdGlvbnMgYmVmb3JlIGV2ZW4gaW5pdGlhbGl6YXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWV0aG9kID0gZXhpc3RpbmdJbnN0YW5jZVttZXRob2ROYW1lXTtcblxuICAgICAgICBpZiAoIW1ldGhvZCkge1xuXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJNZXRob2QgXCIgKyBtZXRob2ROYW1lICsgXCIgZG9lcyBub3QgZXhpc3QhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJldHVyblZhbCA9IG1ldGhvZC5hcHBseShleGlzdGluZ0luc3RhbmNlLCBwYXJhbXMpO1xuXG4gICAgICAgIHJlc3VsdC5wdXNoKHJldHVyblZhbCk7XG4gICAgICB9KTtcblxuICAgICAgLypcbiAgICAgICAqIElmIHRoZSBwbHVnaW4gaW4gYmVpbmcgY2FsbGVkIG9uIG9ubHkgb25lIGpRdWVyeSBFbGVtZW50LCByZXR1cm4gb25seSB0aGVcbiAgICAgICAqIGZpcnN0IHZhbHVlLCB0byBzdXBwb3J0IGNoYWluaW5nLlxuICAgICAgICovXG4gICAgICByZXN1bHQgPSByZXN1bHQubGVuZ3RoID09PSAxPyByZXN1bHRbMF06IHJlc3VsdDtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9ZWxzZSB7XG5cbiAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBBcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBpZiBvbmx5IG9wdGlvbnMgYXJlIHBhc3NlZCwgZXh0ZW5kIGRlZmF1bHQgb3B0aW9ucywgYW5kIGlmIHRoZSBwbHVnaW4gaXMgbm90XG4gICAgICogaW5pdGlhbGl6ZWQgb24gYSBwYXJ0aWN1bGFyIGpRdWVyeSBlbGVtZW50LCBpbml0YWxpemUgUmF0ZVlvIG9uIGl0XG4gICAgICovXG4gICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBERUZBVUxUUywgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gJC5lYWNoKCRub2RlcywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdJbnN0YW5jZSA9IGdldEluc3RhbmNlKHRoaXMsIHJhdGVZb0luc3RhbmNlcyk7XG5cbiAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG5cbiAgICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgIHZhciAkbm9kZSA9ICQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgZGF0YUF0dHJzID0ge30sXG4gICAgICAgICAgICAgICAgICAgb3B0aW9uc0NvcHkgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICQuZWFjaCgkbm9kZS5kYXRhKCksIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cbiAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKFwicmF0ZXlvXCIpICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTmFtZSA9IGtleS5yZXBsYWNlKC9ecmF0ZXlvLywgXCJcIik7XG5cbiAgICAgICAgICAgICAgICAgb3B0aW9uTmFtZSA9IG9wdGlvbk5hbWVbMF0udG9Mb3dlckNhc2UoKSArIG9wdGlvbk5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgZGF0YUF0dHJzW29wdGlvbk5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnNDb3B5W29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmF0ZVlvKCQodGhpcyksICQuZXh0ZW5kKHt9LCBkYXRhQXR0cnMsIG9wdGlvbnNDb3B5KSk7XG4gICAgICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmF0ZVlvICgpIHtcblxuICAgIC8qIGpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgIHJldHVybiBfcmF0ZVlvLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMsIFtdKSk7XG4gIH1cblxuICB3aW5kb3cuUmF0ZVlvID0gUmF0ZVlvO1xuICAkLmZuLnJhdGVZbyA9IHJhdGVZbztcblxufSh3aW5kb3cualF1ZXJ5KSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/rateyo/src/jquery.rateyo.js\n");
/***/ })
/******/ });
/************************************************************************/
/******/ // 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/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(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 */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // 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 });
/******/ };
/******/ }();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
/******/ var __webpack_exports__ = __webpack_require__("./libs/rateyo/rateyo.js");
/******/
/******/ return __webpack_exports__;
/******/ })()
;
});