!function(Q,B){"object"==typeof exports&&"object"==typeof module?module.exports=B():"function"==typeof define&&define.amd?define([],B):"object"==typeof exports?exports.getVPAIDAd=B():Q.getVPAIDAd=B()}(self,(function(){return(()=>{"use strict";var __webpack_modules__={557:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ createVidoElement)\n/* harmony export */ });\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction createVidoElement(tag, props) {\n var element = document.createElement(tag);\n Object.entries(props || {}).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n name = _ref2[0],\n value = _ref2[1];\n\n if (name.startsWith(\'on\') && name.toLowerCase() in window) {\n element.addEventListener(name.toLowerCase().substr(2), value);\n } else {\n element.setAttribute(name, value.toString());\n }\n });\n\n for (var _len = arguments.length, children = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n children[_key - 2] = arguments[_key];\n }\n\n children.forEach(function (child) {\n appendChild(element, child);\n });\n return element;\n}\n\nvar appendChild = function appendChild(parent, child) {\n if (Array.isArray(child)) child.forEach(function (nestedChild) {\n return appendChild(parent, nestedChild);\n });else parent.appendChild(child.nodeType ? child : document.createTextNode(child));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZ2xvYmFsL2NyZWF0ZVZpZG9FbGVtZW50LmpzPzg2NTMiXSwibmFtZXMiOlsiY3JlYXRlVmlkb0VsZW1lbnQiLCJ0YWciLCJwcm9wcyIsImVsZW1lbnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJPYmplY3QiLCJlbnRyaWVzIiwiZm9yRWFjaCIsIm5hbWUiLCJ2YWx1ZSIsInN0YXJ0c1dpdGgiLCJ0b0xvd2VyQ2FzZSIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzdWJzdHIiLCJzZXRBdHRyaWJ1dGUiLCJ0b1N0cmluZyIsImNoaWxkcmVuIiwiY2hpbGQiLCJhcHBlbmRDaGlsZCIsInBhcmVudCIsIkFycmF5IiwiaXNBcnJheSIsIm5lc3RlZENoaWxkIiwibm9kZVR5cGUiLCJjcmVhdGVUZXh0Tm9kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFlLFNBQVNBLGlCQUFULENBQTJCQyxHQUEzQixFQUFnQ0MsS0FBaEMsRUFBbUQ7QUFDakUsTUFBTUMsT0FBTyxHQUFHQyxRQUFRLENBQUNDLGFBQVQsQ0FBdUJKLEdBQXZCLENBQWhCO0FBRUFLLFFBQU0sQ0FBQ0MsT0FBUCxDQUFlTCxLQUFLLElBQUksRUFBeEIsRUFBNEJNLE9BQTVCLENBQW9DLGdCQUFtQjtBQUFBO0FBQUEsUUFBakJDLElBQWlCO0FBQUEsUUFBWEMsS0FBVzs7QUFDdEQsUUFBSUQsSUFBSSxDQUFDRSxVQUFMLENBQWdCLElBQWhCLEtBQXlCRixJQUFJLENBQUNHLFdBQUwsTUFBc0JDLE1BQW5ELEVBQTJEO0FBQzFEVixhQUFPLENBQUNXLGdCQUFSLENBQXlCTCxJQUFJLENBQUNHLFdBQUwsR0FBbUJHLE1BQW5CLENBQTBCLENBQTFCLENBQXpCLEVBQXVETCxLQUF2RDtBQUNFLEtBRkgsTUFHSztBQUNEUCxhQUFPLENBQUNhLFlBQVIsQ0FBcUJQLElBQXJCLEVBQTJCQyxLQUFLLENBQUNPLFFBQU4sRUFBM0I7QUFDRDtBQUNILEdBUEQ7O0FBSGlFLG9DQUFUQyxRQUFTO0FBQVRBLFlBQVM7QUFBQTs7QUFZakVBLFVBQVEsQ0FBQ1YsT0FBVCxDQUFpQixVQUFDVyxLQUFELEVBQVc7QUFDM0JDLGVBQVcsQ0FBQ2pCLE9BQUQsRUFBVWdCLEtBQVYsQ0FBWDtBQUNBLEdBRkQ7QUFJQSxTQUFPaEIsT0FBUDtBQUNBOztBQUdELElBQU1pQixXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDQyxNQUFELEVBQVNGLEtBQVQsRUFBbUI7QUFDdEMsTUFBSUcsS0FBSyxDQUFDQyxPQUFOLENBQWNKLEtBQWQsQ0FBSixFQUNDQSxLQUFLLENBQUNYLE9BQU4sQ0FBYyxVQUFDZ0IsV0FBRDtBQUFBLFdBQWlCSixXQUFXLENBQUNDLE1BQUQsRUFBU0csV0FBVCxDQUE1QjtBQUFBLEdBQWQsRUFERCxLQUdDSCxNQUFNLENBQUNELFdBQVAsQ0FDQ0QsS0FBSyxDQUFDTSxRQUFOLEdBQWlCTixLQUFqQixHQUF5QmYsUUFBUSxDQUFDc0IsY0FBVCxDQUF3QlAsS0FBeEIsQ0FEMUI7QUFHRCxDQVBEIiwiZmlsZSI6IjU1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVZpZG9FbGVtZW50KHRhZywgcHJvcHMsIC4uLmNoaWxkcmVuKXtcblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKVxuXG5cdE9iamVjdC5lbnRyaWVzKHByb3BzIHx8IHt9KS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0aWYgKG5hbWUuc3RhcnRzV2l0aCgnb24nKSAmJiBuYW1lLnRvTG93ZXJDYXNlKCkgaW4gd2luZG93KSB7XG5cdFx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cigyKSwgdmFsdWUpXG4gICAgfVxuXHRcdGVsc2Uge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfSBcblx0fSlcblxuXHRjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuXHRcdGFwcGVuZENoaWxkKGVsZW1lbnQsIGNoaWxkKVxuXHR9KVxuXG5cdHJldHVybiBlbGVtZW50XG59XG5cblxuY29uc3QgYXBwZW5kQ2hpbGQgPSAocGFyZW50LCBjaGlsZCkgPT4ge1xuXHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpXG5cdFx0Y2hpbGQuZm9yRWFjaCgobmVzdGVkQ2hpbGQpID0+IGFwcGVuZENoaWxkKHBhcmVudCwgbmVzdGVkQ2hpbGQpKVxuXHRlbHNlXG5cdFx0cGFyZW50LmFwcGVuZENoaWxkKFxuXHRcdFx0Y2hpbGQubm9kZVR5cGUgPyBjaGlsZCA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKVxuXHRcdClcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///557\n')},969:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ src)\n});\n\n;// CONCATENATED MODULE: ./src/lib/helpers.js\n/* provided dependency */ var createVidoElement = __webpack_require__(557)[\"default\"];\nvar defaultTimeUpdateHandler = function defaultTimeUpdateHandler(vpaid) {\n var _int = setInterval(function () {\n if (vpaid.attributes_.timer < vpaid.attributes_.totalAdDuration) {\n vpaid.attributes_.timer += 1;\n vpaid.quartileEvents_.forEach(function (event) {\n if (vpaid.nextQuartileIndex_ >= vpaid.quartileEvents_.length) return;\n var percentPlayed = vpaid.attributes_.timer * 100.0 / vpaid.attributes_.totalAdDuration;\n\n if (percentPlayed >= vpaid.quartileEvents_[vpaid.nextQuartileIndex_].value) {\n var eventName = vpaid.quartileEvents_[vpaid.nextQuartileIndex_].event;\n vpaid.callEvent_(eventName);\n vpaid.nextQuartileIndex_ += 1;\n }\n });\n } else {\n clearInterval(_int);\n vpaid.stopAd(); // TODO: Check with Eric if we need to call AdVideoComplete event, or some other event\n }\n }, 1000);\n};\nvar hideControlButtons = function hideControlButtons(slot) {\n var container = slot.parentElement;\n\n if (container && container.firstChild && container.firstChild.nextSibling) {\n container.firstChild.nextSibling.style.opacity = '0';\n container.firstChild.nextSibling.style.display = 'none';\n container.firstChild.nextSibling.style.visibility = 'hidden';\n } else {\n setTimeout(function () {\n hideControlButtons(slot);\n }, 50);\n }\n};\nvar togglePlayerControlButtonsVisibility = function togglePlayerControlButtonsVisibility(isVisible, slot) {\n if (isVisible) {\n if (slot.nextSibling && slot.nextSibling.style) {\n slot.nextSibling.style.visibility = 'visible';\n slot.nextSibling.style.display = 'block';\n }\n } else {\n if (slot.nextSibling && slot.nextSibling.style) {\n slot.nextSibling.style.visibility = 'hidden';\n slot.nextSibling.style.display = 'none';\n }\n }\n};\n/**\n *\n * @param {*} vpaid\t\t\t\t\t\t[vpaid element]\n */\n\nvar adjustScale = function adjustScale(vpaid) {\n var slot_ = vpaid.slot_,\n attributes_ = vpaid.attributes_,\n parameters_ = vpaid.parameters_;\n var initialWidth = parameters_.width,\n initialHeight = parameters_.height;\n var slotParent = slot_.parentElement;\n var slotGrandParent = slot_.parentElement.parentElement;\n slotParent.style.setProperty('width', \"\".concat(initialWidth, \"px\"), 'important');\n slotParent.style.setProperty('height', \"\".concat(initialHeight, \"px\"), 'important'); // BUG: Creates a problem with the slider on mobile screens (slider is bigger than it should be)\n // slotGrandParent.style.setProperty('width', '100%', 'important');\n\n if (attributes_.width > 400 && attributes_.height > 225) {\n slotGrandParent.style.setProperty('width', '100%', 'important');\n }\n\n slotGrandParent.style.setProperty('max-width', \"\".concat(initialWidth, \"px\"), 'important');\n slotGrandParent.style.setProperty('max-height', \"\".concat(initialHeight, \"px\"), 'important');\n slot_.style.setProperty('width', \"\".concat(initialWidth, \"px\"), 'important');\n slot_.style.setProperty('height', \"\".concat(initialHeight, \"px\"), 'important');\n var slotGranparentStyles = top.window.getComputedStyle(slotGrandParent);\n var currentWidth = slotGrandParent.clientWidth - parseFloat(slotGranparentStyles.paddingLeft) - parseFloat(slotGranparentStyles.paddingRight);\n var scale = currentWidth / initialWidth;\n if (scale > 1) scale = 1;\n if (attributes_['scale'] !== scale) attributes_['scale'] = scale;\n slotParent.style.setProperty('transform-origin', '0px 0px', 'important');\n slotParent.style.setProperty('transform', \"scale(\".concat(scale, \")\")); // Adjust the height of slotGrandParent because it stays fixed\n\n var aspectRatio = initialWidth / initialHeight;\n slotGrandParent.style.setProperty('height', \"\".concat(slotGrandParent.clientWidth / aspectRatio, \"px\"), 'important'); // Adjust slider right\n\n if (slotGrandParent.getBoundingClientRect().x <= 0) {\n slotGrandParent.style.setProperty('right', '0', 'important');\n }\n};\nvar createFontFaces = function createFontFaces(fonts) {\n var formatMap = {\n ttf: 'truetype',\n otf: 'opentype',\n woff: 'woff',\n woff2: 'woff2'\n };\n var fontFaces = Object.keys(fonts).map(function (fontName) {\n var ext = fonts[fontName].split('.').pop();\n var format = \"format('\".concat(formatMap[ext], \"')\");\n var weight = fontName.split('-').pop().toLowerCase();\n var style = (fontName.split('-')[2] || 'normal').toLowerCase();\n var family = fontName.split('-').join('');\n return \"\\n\\t\\t\\t@font-face {\\n\\t\\t\\t\\tfont-family: '\".concat(family, \"';\\n\\t\\t\\t\\tsrc: url('\").concat(fonts[fontName], \"') \").concat(format, \";\\n\\t\\t\\t\\tfont-style: \").concat(style, \";\\n\\t\\t\\t\\tfont-weight: \").concat(weight, \";\\n\\t\\t\\t}\\n\\t\\t\");\n });\n return createVidoElement(\"style\", null, fontFaces);\n};\n;// CONCATENATED MODULE: ./src/vpaid.js\n/* provided dependency */ var vpaid_createVidoElement = __webpack_require__(557)[\"default\"];\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar VpaidVideoPlayer = /*#__PURE__*/function () {\n /**\n * @constructor\n */\n function VpaidVideoPlayer(creative) {\n _classCallCheck(this, VpaidVideoPlayer);\n\n /**\n * The slot is the div element on the main page that the ad is supposed to\n * occupy.\n * @type {Object}\n * @private\n */\n this.slot_ = null;\n /**\n * Creative template (desktop or mobile)\n */\n\n this.creative = creative;\n /**\n * The video slot is the video element used by the ad to render video content.\n * @type {Object}\n * @private\n */\n\n this.videoSlot_ = null;\n /**\n * An object containing all registered events. These events are all\n * callbacks for use by the VPAID ad.\n * @type {Object}\n * @private\n */\n\n this.eventsCallbacks_ = {};\n /**\n * A list of getable and setable attributes.\n * @type {Object}\n * @private\n */\n\n this.attributes_ = {\n companions: '',\n desiredBitrate: 256,\n duration: 10,\n expanded: false,\n width: 0,\n height: 0,\n icons: '',\n linear: true,\n remainingTime: 10,\n skippableState: false,\n viewMode: 'normal',\n volume: 1.0,\n timer: 0,\n totalAdDuration: 60,\n initialUnmute: false,\n scale: 1\n };\n /**\n * A set of ad playback events to be reported.\n * @type {Object}\n * @private\n */\n\n this.quartileEvents_ = [{\n event: 'AdImpression',\n value: 0\n }, {\n event: 'AdVideoStart',\n value: 0\n }, {\n event: 'AdVideoFirstQuartile',\n value: 25\n }, {\n event: 'AdVideoMidpoint',\n value: 50\n }, {\n event: 'AdVideoThirdQuartile',\n value: 75\n }, {\n event: 'AdVideoComplete',\n value: 100\n }];\n /**\n * @type {number} An index into what quartile was last reported.\n * @private\n */\n\n this.nextQuartileIndex_ = 0;\n /**\n * Parameters passed in from the AdParameters section of the VAST.\n * Used for video URL and MIME type.\n *\n * @type {!object}\n * @private\n */\n\n this.parameters_ = {};\n /**\n * The ad object\n * @type {Object}\n * @private\n */\n\n this.ad = null;\n }\n /**\n * Returns the supported VPAID verion.\n * @param {string} version\n * @return {string}\n */\n\n\n _createClass(VpaidVideoPlayer, [{\n key: \"handshakeVersion\",\n value: function handshakeVersion(version) {\n return '2.0';\n }\n /**\n * Initializes all attributes in the ad. The ad will not start until startAd is\\\n * called.\n *\n * @param {number} width The ad width.\n * @param {number} height The ad height.\n * @param {string} viewMode The ad view mode.\n * @param {number} desiredBitrate The desired bitrate.\n * @param {Object} creativeData Data associated with the creative.\n * @param {Object} environmentVars Runtime variables associated with the\n * creative like the slot and video slot.\n */\n\n }, {\n key: \"initAd\",\n value: function initAd(width, height, viewMode, desiredBitrate, creativeData, environmentVars) {\n var _this = this;\n\n this.attributes_['width'] = width;\n this.attributes_['height'] = height;\n this.attributes_['viewMode'] = viewMode;\n this.attributes_['desiredBitrate'] = desiredBitrate; // slot and videoSlot are passed as part of the environmentVars\n\n this.parameters_ = JSON.parse(creativeData['AdParameters']);\n this.slot_ = environmentVars.slot;\n this.videoSlot_ = environmentVars.videoSlot;\n this.log(\"initAd: \".concat(width, \"x\").concat(height, \", viewMode: \").concat(viewMode, \", desiredBitrate: \").concat(desiredBitrate), \"creativeData: \".concat(creativeData['AdParameters']));\n top.window.addEventListener('resize', function () {\n return adjustScale(_this);\n });\n this.setReactiveAttributes();\n this.updateVideoSlot_();\n this.videoSlot_.addEventListener('loadedmetadata', this.loadedMetadata_.bind(this), false);\n\n if (this.parameters_.format === 'video') {\n this.videoSlot_.addEventListener('timeupdate', this.timeUpdateHandler_.bind(this), false);\n this.videoSlot_.addEventListener('ended', this.stopAd.bind(this), false);\n } else {\n defaultTimeUpdateHandler(this);\n }\n }\n /**\n * Creates or updates the video slot and fills it with a supported video.\n * @private\n */\n\n }, {\n key: \"updateVideoSlot_\",\n value: function updateVideoSlot_() {\n var _this2 = this;\n\n if (!this.parameters_.options) this.parameters_.options = {};\n var adContainer = vpaid_createVidoElement(\"div\", {\n \"class\": \"creative-container\"\n });\n\n if (this.videoSlot_ == null) {\n this.videoSlot_ = vpaid_createVidoElement(\"video\", {\n \"class\": \"ad-video vpaid-video\",\n width: \"100%\",\n muted: true,\n playsinline: true\n });\n this.log('Warning: No video element passed to ad, creating element.');\n } // this.videoSlot_.setAttribute('src', this.parameters_['video'])\n\n\n this.videoSlot_.setAttribute('muted', 'true'); // this.videoSlot_.muted = true\n\n this.videoSlot_.setAttribute('playsinline', 'true'); // if (this.parameters_.options.autoplay) this.videoSlot_.setAttribute('autoplay', 'true')\n // this.videoSlot_.setAttribute('autoplay', 'true')\n\n if (this.parameters_.options.firstClickUnmute) this.setupUnmute(adContainer);\n\n if (this.parameters_.options.loop) {\n this.videoSlot_.setAttribute('loop', 'true');\n this.videoSlot_.loop = true;\n } // Video source\n\n\n this.videoSlot_.src = this.parameters_['video'];\n\n var onIframeLoad = function onIframeLoad(e) {\n var frame = e.target.contentWindow.document;\n frame.body.style.overflow = 'hidden'; // Custom styles\n\n _this2._frame.contentWindow.document.body.style.margin = '0';\n _this2._frame.contentWindow.document.body.style.padding = '0';\n _this2.iDoc = _this2._frame.contentWindow.document;\n\n var container = _this2.iDoc.querySelector('.creative-container');\n\n container.appendChild(_this2.videoSlot_);\n\n _this2.videoSlot_.addEventListener('loadedmetadata', _this2.loadedMetadata_.bind(_this2), false);\n\n if (_this2.parameters_.format === 'video') {\n _this2.videoSlot_.addEventListener('timeupdate', _this2.timeUpdateHandler_.bind(_this2), false);\n\n _this2.videoSlot_.addEventListener('ended', _this2.stopAd.bind(_this2), false); // Handle events for \"carousel\" and \"image\" formats\n\n } else {\n _this2.videoSlot_.style.display = 'none';\n _this2.videoSlot_.style.position = 'absolute';\n _this2.videoSlot_.style.top = '0';\n _this2.videoSlot_.style.left = '0';\n _this2.videoSlot_.style.transition = 'all 1s';\n _this2.videoSlot_.style.width = '100%';\n _this2.videoSlot_.style.height = '100%';\n _this2.videoSlot_.style.zIndex = '1';\n }\n\n var isVideoSmall = false;\n\n var makeSmallVideo = function makeSmallVideo() {\n _this2.videoSlot_.style.position = 'absolute';\n _this2.videoSlot_.style.top = '50px';\n _this2.videoSlot_.style.left = '50px';\n _this2.videoSlot_.style.transition = 'all 1s';\n _this2.videoSlot_.style.width = '400px';\n _this2.videoSlot_.style.height = '225px';\n _this2.videoSlot_.style.zIndex = '1';\n }; // Video transition\n\n\n if (_this2.parameters_.options.makeSmallVideo) {\n _this2.videoSlot_.ontimeupdate = function (e) {\n if (!isVideoSmall) {\n if (_this2.videoSlot_.currentTime >= 2) {\n isVideoSmall = true;\n makeSmallVideo();\n }\n }\n };\n\n _this2.videoSlot_.addEventListener('mouseover', function () {\n if (!isVideoSmall) {\n makeSmallVideo();\n }\n\n isVideoSmall = true;\n });\n }\n\n _this2.ad = new _this2.creative(_this2, container);\n\n _this2.callEvent_('AdLoaded');\n };\n\n this._frame = vpaid_createVidoElement(\"iframe\", null);\n var style = {\n width: '100%',\n height: '100%',\n border: 0,\n position: 'absolute',\n overflow: 'hidden',\n margin: 0,\n padding: 0\n };\n Object.assign(this._frame.style, style);\n this._frame.src = 'about:self';\n this._frame.srcdoc = adContainer.outerHTML;\n this._frame.onload = onIframeLoad;\n this.slot_.appendChild(this._frame); // Only for development\n\n if (false) {}\n }\n /**\n * Called when the ad is clicked.\n * @private\n */\n\n }, {\n key: \"clickAd_\",\n value: function clickAd_() {\n this.log('clickAd_');\n this.log('AdClickThru'); // this.callEvent_('AdClickThru', '','0', true)\n\n if ('AdClickThru' in this.eventsCallbacks_) {\n this.eventsCallbacks_['AdClickThru']('', '0', true);\n }\n }\n /**\n * Called by the video element when video metadata is loaded.\n * @private\n */\n\n }, {\n key: \"loadedMetadata_\",\n value: function loadedMetadata_() {\n // The ad duration is not known until the media metadata is loaded.\n // Then, update the player with the duration change.\n this.attributes_['duration'] = this.videoSlot_.duration;\n this.callEvent_('AdDurationChange');\n }\n /**\n * Called by the video element when the video reaches specific points during\n * playback.\n * @private\n */\n\n }, {\n key: \"timeUpdateHandler_\",\n value: function timeUpdateHandler_() {\n if (this.nextQuartileIndex_ >= this.quartileEvents_.length) {\n return;\n }\n\n var percentPlayed = this.videoSlot_.currentTime * 100.0 / this.videoSlot_.duration;\n\n if (percentPlayed >= this.quartileEvents_[this.nextQuartileIndex_].value) {\n var lastQuartileEvent = this.quartileEvents_[this.nextQuartileIndex_].event;\n\n if (this.eventsCallbacks_[lastQuartileEvent]) {\n this.callEvent_(lastQuartileEvent);\n }\n\n this.nextQuartileIndex_ += 1;\n }\n\n if (this.videoSlot_.duration > 0) {\n this.attributes_['remainingTime'] = this.videoSlot_.duration - this.videoSlot_.currentTime;\n }\n }\n /**\n * Helper function to update the size of the video player.\n * @private\n */\n\n }, {\n key: \"updateVideoPlayerSize_\",\n value: function updateVideoPlayerSize_() {\n this.videoSlot_.setAttribute('width', this.attributes_['width']);\n this.videoSlot_.setAttribute('height', this.attributes_['height']);\n }\n /**\n * Called by the wrapper to start the ad.\n */\n\n }, {\n key: \"startAd\",\n value: function startAd() {\n this.log('Starting ad');\n this.callEvent_('AdStarted'); // if (process.env.NODE_ENV !== 'development' && this.parameters_.format !== 'video') {\n // hideControlButtons(this.slot_);\n // }\n }\n /**\n * Called by the wrapper to stop the ad.\n */\n\n }, {\n key: \"stopAd\",\n value: function stopAd() {\n this.log('Stopping ad'); // Calling AdStopped immediately terminates the ad. Setting a timeout allows\n // events to go through.\n\n var callback = this.callEvent_.bind(this);\n setTimeout(callback, 75, ['AdStopped']);\n }\n /**\n * Called when the video player changes the width/height of the container.\n *\n * @param {number} width The new width.\n * @param {number} height A new height.\n * @param {string} viewMode A new view mode.\n */\n\n }, {\n key: \"resizeAd\",\n value: function resizeAd(width, height, viewMode) {\n var _this3 = this;\n\n this.log('resizeAd ' + width + 'x' + height + ' ' + viewMode);\n this.attributes_['width'] = width;\n this.attributes_['height'] = height;\n this.attributes_['viewMode'] = viewMode;\n this.updateVideoPlayerSize_();\n this.callEvent_('AdSizeChange');\n setTimeout(function () {\n adjustScale(_this3);\n }, 100);\n }\n /**\n * Pauses the ad.\n */\n\n }, {\n key: \"pauseAd\",\n value: function pauseAd() {\n this.log('pauseAd');\n this.videoSlot_.pause();\n this.callEvent_('AdPaused');\n }\n /**\n * Resumes the ad.\n */\n\n }, {\n key: \"resumeAd\",\n value: function resumeAd() {\n this.log('resumeAd');\n this.videoSlot_.play();\n this.callEvent_('AdPlaying');\n }\n /**\n * Expands the ad.\n */\n\n }, {\n key: \"expandAd\",\n value: function expandAd() {\n this.log('expandAd');\n this.attributes_['expanded'] = true;\n this.callEvent_('AdExpanded');\n }\n /**\n * Collapses the ad.\n */\n\n }, {\n key: \"collapseAd\",\n value: function collapseAd() {\n this.log('collapseAd');\n this.attributes_['expanded'] = false;\n }\n /**\n * Skips the ad.\n */\n\n }, {\n key: \"skipAd\",\n value: function skipAd() {\n this.log('skipAd');\n var skippableState = this.attributes_['skippableState'];\n\n if (skippableState) {\n this.callEvent_('AdSkipped');\n }\n }\n /**\n * Registers a callback for an event.\n *\n * @param {Function} aCallback The callback function.\n * @param {string} eventName The callback type.\n * @param {Object} aContext The context for the callback.\n */\n\n }, {\n key: \"subscribe\",\n value: function subscribe(aCallback, eventName, aContext) {\n this.log('Subscribe ' + eventName);\n var callBack = aCallback.bind(aContext);\n this.eventsCallbacks_[eventName] = callBack;\n }\n }, {\n key: \"devSuscribe\",\n value: function devSuscribe() {\n var _eventsCallbacks,\n _this4 = this;\n\n var eventsCallbacks = (_eventsCallbacks = {\n AdReady: function AdReady() {},\n AdLoaded: function AdLoaded() {},\n AdStarted: function AdStarted() {},\n AdVideoStart: function AdVideoStart() {},\n AdImpression: function AdImpression() {},\n AdClickThru: function AdClickThru() {},\n AdDurationChange: function AdDurationChange() {},\n AdError: function AdError() {},\n AdExpandedChange: function AdExpandedChange() {}\n }, _defineProperty(_eventsCallbacks, \"AdImpression\", function AdImpression() {}), _defineProperty(_eventsCallbacks, \"AdLinearChange\", function AdLinearChange() {}), _defineProperty(_eventsCallbacks, \"AdLoaded\", function AdLoaded() {}), _defineProperty(_eventsCallbacks, \"AdPaused\", function AdPaused() {}), _defineProperty(_eventsCallbacks, \"AdPlaying\", function AdPlaying() {}), _defineProperty(_eventsCallbacks, \"AdReady\", function AdReady() {}), _defineProperty(_eventsCallbacks, \"AdRemainingTimeChange\", function AdRemainingTimeChange() {}), _defineProperty(_eventsCallbacks, \"AdSizeChange\", function AdSizeChange() {}), _defineProperty(_eventsCallbacks, \"AdSkippableStateChange\", function AdSkippableStateChange() {}), _defineProperty(_eventsCallbacks, \"AdSkipped\", function AdSkipped() {}), _defineProperty(_eventsCallbacks, \"AdStarted\", function AdStarted() {}), _defineProperty(_eventsCallbacks, \"AdStopped\", function AdStopped() {}), _defineProperty(_eventsCallbacks, \"AdVideoComplete\", function AdVideoComplete() {}), _defineProperty(_eventsCallbacks, \"AdVideoFirstQuartile\", function AdVideoFirstQuartile() {}), _defineProperty(_eventsCallbacks, \"AdVideoMidpoint\", function AdVideoMidpoint() {}), _defineProperty(_eventsCallbacks, \"AdVideoStart\", function AdVideoStart() {}), _defineProperty(_eventsCallbacks, \"AdVideoThirdQuartile\", function AdVideoThirdQuartile() {}), _defineProperty(_eventsCallbacks, \"AdVolumeChange\", function AdVolumeChange() {}), _eventsCallbacks);\n Object.keys(eventsCallbacks).forEach(function (eventName) {\n _this4.subscribe(eventsCallbacks[eventName], eventName, null);\n });\n }\n /**\n * Removes a callback based on the eventName.\n *\n * @param {string} eventName The callback type.\n */\n\n }, {\n key: \"unsubscribe\",\n value: function unsubscribe(eventName) {\n this.log('unsubscribe ' + eventName);\n this.eventsCallbacks_[eventName] = null;\n }\n /**\n * Returns whether the ad is linear.\n *\n * @return {boolean} True if the ad is a linear, false for non linear.\n */\n\n }, {\n key: \"getAdLinear\",\n value: function getAdLinear() {\n return this.attributes_['linear'];\n }\n /**\n * Returns ad width.\n *\n * @return {number} The ad width.\n */\n\n }, {\n key: \"getAdWidth\",\n value: function getAdWidth() {\n return this.attributes_['width'];\n }\n /**\n * Returns ad height.\n *\n * @return {number} The ad height.\n */\n\n }, {\n key: \"getAdHeight\",\n value: function getAdHeight() {\n return this.attributes_['height'];\n }\n /**\n * Returns true if the ad is expanded.\n *\n * @return {boolean}\n */\n\n }, {\n key: \"getAdExpanded\",\n value: function getAdExpanded() {\n this.log('getAdExpanded');\n return this.attributes_['expanded'];\n }\n /**\n * Returns the skippable state of the ad.\n *\n * @return {boolean}\n */\n\n }, {\n key: \"getAdSkippableState\",\n value: function getAdSkippableState() {\n this.log('getAdSkippableState');\n return this.attributes_['skippableState'];\n }\n /**\n * Returns the remaining ad time, in seconds.\n *\n * @return {number} The time remaining in the ad.\n */\n\n }, {\n key: \"getAdRemainingTime\",\n value: function getAdRemainingTime() {\n return this.attributes_['remainingTime'];\n }\n /**\n * Returns the duration of the ad, in seconds.\n *\n * @return {number} The duration of the ad.\n */\n\n }, {\n key: \"getAdDuration\",\n value: function getAdDuration() {\n return this.attributes_['duration'];\n }\n /**\n * Returns the ad volume.\n *\n * @return {number} The volume of the ad.\n */\n\n }, {\n key: \"getAdVolume\",\n value: function getAdVolume() {\n this.log('getAdVolume');\n return this.attributes_['volume'];\n }\n /**\n * Sets the ad volume.\n *\n * @param {number} value The volume in percentage.\n */\n\n }, {\n key: \"setAdVolume\",\n value: function setAdVolume(value) {\n this.attributes_['volume'] = value;\n this.videoSlot_.volume = value;\n\n if (this.ad && this.ad.state && this.ad.state.videos) {\n this.ad.state.videos.forEach(function (v) {\n v.volume = value;\n\n if (value > 0) {\n v.muted = false;\n }\n });\n }\n\n this.log('setAdVolume ' + value);\n this.callEvent_('AdVolumeChange');\n }\n /**\n * Returns a list of companion ads for the ad.\n *\n * @return {string} List of companions in VAST XML.\n */\n\n }, {\n key: \"getAdCompanions\",\n value: function getAdCompanions() {\n return this.attributes_['companions'];\n }\n /**\n * Returns a list of icons.\n *\n * @return {string} A list of icons.\n */\n\n }, {\n key: \"getAdIcons\",\n value: function getAdIcons() {\n return this.attributes_['icons'];\n }\n /**\n * Logs events and messages.\n *\n * @param {string} message\n */\n\n }, {\n key: \"log\",\n value: function log() {// if (process.env.NODE_ENV === 'development') console.log(...arguments)\n // console.log(...arguments);\n }\n /**\n * Calls an event if there is a callback.\n *\n * @param {string} eventType\n * @private\n */\n\n }, {\n key: \"callEvent_\",\n value: function callEvent_(eventType) {\n this.log(eventType);\n\n if (eventType in this.eventsCallbacks_) {\n this.eventsCallbacks_[eventType]();\n }\n }\n }, {\n key: \"setReactiveAttributes\",\n value: function setReactiveAttributes() {\n var _this5 = this;\n\n this.attributes_ = new Proxy(this.attributes_, {\n set: function set(target, key, value) {\n target[key] = value;\n\n if (key === 'scale') {\n var event = new CustomEvent('scaling', {\n detail: {\n scale: value\n }\n });\n\n var container = _this5.slot_.querySelector('.creative-container');\n\n if (container) container.dispatchEvent(event);\n }\n\n return true;\n },\n get: function get(target, prop, receiver) {\n return target[prop];\n }\n });\n }\n }, {\n key: \"setupUnmute\",\n value: function setupUnmute(adContainer) {\n var _this6 = this;\n\n var unmuteVideo = function unmuteVideo() {\n if (_this6.attributes_.initialUnmute === false) {\n _this6.setAdVolume(1);\n\n _this6.videoSlot_.muted = false;\n _this6.attributes_.initialUnmute = true; // Remove event listeners\n\n _this6.videoSlot_.removeEventListener('click', unmuteVideo);\n\n _this6.slot_.removeEventListener('click', unmuteVideo);\n\n adContainer.removeEventListener('click', unmuteVideo);\n }\n };\n\n this.videoSlot_.addEventListener('click', unmuteVideo);\n this.slot_.addEventListener('click', unmuteVideo);\n adContainer.addEventListener('click', unmuteVideo);\n }\n }]);\n\n return VpaidVideoPlayer;\n}();\n\n\n// EXTERNAL MODULE: ./src/ad/desktop/desktop.scss\nvar desktop = __webpack_require__(646);\n;// CONCATENATED MODULE: ./src/lib/glide/glide.modular.esm.js\nfunction _typeof2(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\n/*!\n * Glide.js v3.4.1\n * (c) 2013-2019 Jędrzej Chałubek (http://jedrzejchalubek.com/)\n * Released under the MIT License.\n */\nvar defaults = {\n /**\n * Type of the movement.\n *\n * Available types:\n * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n *\n * @type {String}\n */\n type: 'slider',\n\n /**\n * Start at specific slide number defined with zero-based index.\n *\n * @type {Number}\n */\n startAt: 0,\n\n /**\n * A number of slides visible on the single viewport.\n *\n * @type {Number}\n */\n perView: 1,\n\n /**\n * Focus currently active slide at a specified position in the track.\n *\n * Available inputs:\n * `center` - Current slide will be always focused at the center of a track.\n * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n *\n * @type {String|Number}\n */\n focusAt: 0,\n\n /**\n * A size of the gap added between slides.\n *\n * @type {Number}\n */\n gap: 10,\n\n /**\n * Change slides after a specified interval. Use `false` for turning off autoplay.\n *\n * @type {Number|Boolean}\n */\n autoplay: false,\n\n /**\n * Stop autoplay on mouseover event.\n *\n * @type {Boolean}\n */\n hoverpause: true,\n\n /**\n * Allow for changing slides with left and right keyboard arrows.\n *\n * @type {Boolean}\n */\n keyboard: true,\n\n /**\n * Stop running `perView` number of slides from the end. Use this\n * option if you don't want to have an empty space after\n * a slider. Works only with `slider` type and a\n * non-centered `focusAt` setting.\n *\n * @type {Boolean}\n */\n bound: false,\n\n /**\n * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n *\n * @type {Number|Boolean}\n */\n swipeThreshold: 80,\n\n /**\n * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n *\n * @type {Number|Boolean}\n */\n dragThreshold: 120,\n\n /**\n * A maximum number of slides to which movement will be made on swiping or dragging. Use `false` for unlimited.\n *\n * @type {Number|Boolean}\n */\n perTouch: false,\n\n /**\n * Moving distance ratio of the slides on a swiping and dragging.\n *\n * @type {Number}\n */\n touchRatio: 0.5,\n\n /**\n * Angle required to activate slides moving on swiping or dragging.\n *\n * @type {Number}\n */\n touchAngle: 45,\n\n /**\n * Duration of the animation in milliseconds.\n *\n * @type {Number}\n */\n animationDuration: 400,\n\n /**\n * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n *\n * @type {Boolean}\n */\n rewind: true,\n\n /**\n * Duration of the rewinding animation of the `slider` type in milliseconds.\n *\n * @type {Number}\n */\n rewindDuration: 800,\n\n /**\n * Easing function for the animation.\n *\n * @type {String}\n */\n animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n /**\n * Throttle costly events at most once per every wait milliseconds.\n *\n * @type {Number}\n */\n throttle: 10,\n\n /**\n * Moving direction mode.\n *\n * Available inputs:\n * - 'ltr' - left to right movement,\n * - 'rtl' - right to left movement.\n *\n * @type {String}\n */\n direction: 'ltr',\n\n /**\n * The distance value of the next and previous viewports which\n * have to peek in the current view. Accepts number and\n * pixels as a string. Left and right peeking can be\n * set up separately with a directions object.\n *\n * For example:\n * `100` - Peek 100px on the both sides.\n * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n *\n * @type {Number|String|Object}\n */\n peek: 0,\n\n /**\n * Collection of options applied at specified media breakpoints.\n * For example: display two slides per view under 800px.\n * `{\n * '800px': {\n * perView: 2\n * }\n * }`\n */\n breakpoints: {},\n\n /**\n * Collection of internally used HTML classes.\n *\n * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n * @type {Object}\n */\n classes: {\n direction: {\n ltr: 'glide--ltr',\n rtl: 'glide--rtl'\n },\n slider: 'glide--slider',\n carousel: 'glide--carousel',\n swipeable: 'glide--swipeable',\n dragging: 'glide--dragging',\n cloneSlide: 'glide__slide--clone',\n activeNav: 'glide__bullet--active',\n activeSlide: 'glide__slide--active',\n disabledArrow: 'glide__arrow--disabled'\n }\n};\n/**\n * Outputs warning message to the bowser console.\n *\n * @param {String} msg\n * @return {Void}\n */\n\nfunction warn(msg) {\n console.error(\"[Glide warn]: \" + msg);\n}\n\nvar _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return _typeof2(obj);\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n};\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + _typeof2(superClass));\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn = function possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (_typeof2(call) === \"object\" || typeof call === \"function\") ? call : self;\n};\n/**\n * Converts value entered as number\n * or string to integer value.\n *\n * @param {String} value\n * @returns {Number}\n */\n\n\nfunction toInt(value) {\n return parseInt(value);\n}\n/**\n * Converts value entered as number\n * or string to flat value.\n *\n * @param {String} value\n * @returns {Number}\n */\n\n\nfunction toFloat(value) {\n return parseFloat(value);\n}\n/**\n * Indicates whether the specified value is a string.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isString(value) {\n return typeof value === 'string';\n}\n/**\n * Indicates whether the specified value is an object.\n *\n * @param {*} value\n * @return {Boolean}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\n\nfunction isObject(value) {\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n}\n/**\n * Indicates whether the specified value is a number.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isNumber(value) {\n return typeof value === 'number';\n}\n/**\n * Indicates whether the specified value is a function.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n/**\n * Indicates whether the specified value is undefined.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\n/**\n * Indicates whether the specified value is an array.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isArray(value) {\n return value.constructor === Array;\n}\n/**\n * Creates and initializes specified collection of extensions.\n * Each extension receives access to instance of glide and rest of components.\n *\n * @param {Object} glide\n * @param {Object} extensions\n *\n * @returns {Object}\n */\n\n\nfunction mount(glide, extensions, events) {\n var components = {};\n\n for (var name in extensions) {\n if (isFunction(extensions[name])) {\n components[name] = extensions[name](glide, components, events);\n } else {\n warn('Extension must be a function');\n }\n }\n\n for (var _name in components) {\n if (isFunction(components[_name].mount)) {\n components[_name].mount();\n }\n }\n\n return components;\n}\n/**\n * Defines getter and setter property on the specified object.\n *\n * @param {Object} obj Object where property has to be defined.\n * @param {String} prop Name of the defined property.\n * @param {Object} definition Get and set definitions for the property.\n * @return {Void}\n */\n\n\nfunction glide_modular_esm_define(obj, prop, definition) {\n Object.defineProperty(obj, prop, definition);\n}\n/**\n * Sorts aphabetically object keys.\n *\n * @param {Object} obj\n * @return {Object}\n */\n\n\nfunction sortKeys(obj) {\n return Object.keys(obj).sort().reduce(function (r, k) {\n r[k] = obj[k];\n return r[k], r;\n }, {});\n}\n/**\n * Merges passed settings object with default options.\n *\n * @param {Object} defaults\n * @param {Object} settings\n * @return {Object}\n */\n\n\nfunction mergeOptions(defaults, settings) {\n var options = _extends({}, defaults, settings); // `Object.assign` do not deeply merge objects, so we\n // have to do it manually for every nested object\n // in options. Although it does not look smart,\n // it's smaller and faster than some fancy\n // merging deep-merge algorithm script.\n\n\n if (settings.hasOwnProperty('classes')) {\n options.classes = _extends({}, defaults.classes, settings.classes);\n\n if (settings.classes.hasOwnProperty('direction')) {\n options.classes.direction = _extends({}, defaults.classes.direction, settings.classes.direction);\n }\n }\n\n if (settings.hasOwnProperty('breakpoints')) {\n options.breakpoints = _extends({}, defaults.breakpoints, settings.breakpoints);\n }\n\n return options;\n}\n\nvar EventsBus = function () {\n /**\n * Construct a EventBus instance.\n *\n * @param {Object} events\n */\n function EventsBus() {\n var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, EventsBus);\n this.events = events;\n this.hop = events.hasOwnProperty;\n }\n /**\n * Adds listener to the specifed event.\n *\n * @param {String|Array} event\n * @param {Function} handler\n */\n\n\n createClass(EventsBus, [{\n key: 'on',\n value: function on(event, handler) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.on(event[i], handler);\n }\n } // Create the event's object if not yet created\n\n\n if (!this.hop.call(this.events, event)) {\n this.events[event] = [];\n } // Add the handler to queue\n\n\n var index = this.events[event].push(handler) - 1; // Provide handle back for removal of event\n\n return {\n remove: function remove() {\n delete this.events[event][index];\n }\n };\n }\n /**\n * Runs registered handlers for specified event.\n *\n * @param {String|Array} event\n * @param {Object=} context\n */\n\n }, {\n key: 'emit',\n value: function emit(event, context) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.emit(event[i], context);\n }\n } // If the event doesn't exist, or there's no handlers in queue, just leave\n\n\n if (!this.hop.call(this.events, event)) {\n return;\n } // Cycle through events queue, fire!\n\n\n this.events[event].forEach(function (item) {\n item(context || {});\n });\n }\n }]);\n return EventsBus;\n}();\n\nvar Glide = function () {\n /**\n * Construct glide.\n *\n * @param {String} selector\n * @param {Object} options\n */\n function Glide(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, Glide);\n this._c = {};\n this._t = [];\n this._e = new EventsBus();\n this.disabled = false;\n this.selector = selector;\n this.settings = mergeOptions(defaults, options);\n this.index = this.settings.startAt;\n }\n /**\n * Initializes glide.\n *\n * @param {Object} extensions Collection of extensions to initialize.\n * @return {Glide}\n */\n\n\n createClass(Glide, [{\n key: 'mount',\n value: function mount$$1() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this._e.emit('mount.before');\n\n if (isObject(extensions)) {\n this._c = mount(this, extensions, this._e);\n } else {\n warn('You need to provide a object on `mount()`');\n }\n\n this._e.emit('mount.after');\n\n return this;\n }\n /**\n * Collects an instance `translate` transformers.\n *\n * @param {Array} transformers Collection of transformers.\n * @return {Void}\n */\n\n }, {\n key: 'mutate',\n value: function mutate() {\n var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n if (isArray(transformers)) {\n this._t = transformers;\n } else {\n warn('You need to provide a array on `mutate()`');\n }\n\n return this;\n }\n /**\n * Updates glide with specified settings.\n *\n * @param {Object} settings\n * @return {Glide}\n */\n\n }, {\n key: 'update',\n value: function update() {\n var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.settings = mergeOptions(this.settings, settings);\n\n if (settings.hasOwnProperty('startAt')) {\n this.index = settings.startAt;\n }\n\n this._e.emit('update');\n\n return this;\n }\n /**\n * Change slide with specified pattern. A pattern must be in the special format:\n * `>` - Move one forward\n * `<` - Move one backward\n * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\n * `>>` - Rewinds to end (last slide)\n * `<<` - Rewinds to start (first slide)\n *\n * @param {String} pattern\n * @return {Glide}\n */\n\n }, {\n key: 'go',\n value: function go(pattern) {\n this._c.Run.make(pattern);\n\n return this;\n }\n /**\n * Move track by specified distance.\n *\n * @param {String} distance\n * @return {Glide}\n */\n\n }, {\n key: 'move',\n value: function move(distance) {\n this._c.Transition.disable();\n\n this._c.Move.make(distance);\n\n return this;\n }\n /**\n * Destroy instance and revert all changes done by this._c.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this._e.emit('destroy');\n\n return this;\n }\n /**\n * Start instance autoplaying.\n *\n * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\n * @return {Glide}\n */\n\n }, {\n key: 'play',\n value: function play() {\n var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (interval) {\n this.settings.autoplay = interval;\n }\n\n this._e.emit('play');\n\n return this;\n }\n /**\n * Stop instance autoplaying.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'pause',\n value: function pause() {\n this._e.emit('pause');\n\n return this;\n }\n /**\n * Sets glide into a idle status.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'disable',\n value: function disable() {\n this.disabled = true;\n return this;\n }\n /**\n * Sets glide into a active status.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'enable',\n value: function enable() {\n this.disabled = false;\n return this;\n }\n /**\n * Adds cuutom event listener with handler.\n *\n * @param {String|Array} event\n * @param {Function} handler\n * @return {Glide}\n */\n\n }, {\n key: 'on',\n value: function on(event, handler) {\n this._e.on(event, handler);\n\n return this;\n }\n /**\n * Checks if glide is a precised type.\n *\n * @param {String} name\n * @return {Boolean}\n */\n\n }, {\n key: 'isType',\n value: function isType(name) {\n return this.settings.type === name;\n }\n /**\n * Gets value of the core options.\n *\n * @return {Object}\n */\n\n }, {\n key: 'settings',\n get: function get$$1() {\n return this._o;\n }\n /**\n * Sets value of the core options.\n *\n * @param {Object} o\n * @return {Void}\n */\n ,\n set: function set$$1(o) {\n if (isObject(o)) {\n this._o = o;\n } else {\n warn('Options must be an `object` instance.');\n }\n }\n /**\n * Gets current index of the slider.\n *\n * @return {Object}\n */\n\n }, {\n key: 'index',\n get: function get$$1() {\n return this._i;\n }\n /**\n * Sets current index a slider.\n *\n * @return {Object}\n */\n ,\n set: function set$$1(i) {\n this._i = toInt(i);\n }\n /**\n * Gets type name of the slider.\n *\n * @return {String}\n */\n\n }, {\n key: 'type',\n get: function get$$1() {\n return this.settings.type;\n }\n /**\n * Gets value of the idle status.\n *\n * @return {Boolean}\n */\n\n }, {\n key: 'disabled',\n get: function get$$1() {\n return this._d;\n }\n /**\n * Sets value of the idle status.\n *\n * @return {Boolean}\n */\n ,\n set: function set$$1(status) {\n this._d = !!status;\n }\n }]);\n return Glide;\n}();\n\nfunction Run(Glide, Components, Events) {\n var Run = {\n /**\n * Initializes autorunning of the glide.\n *\n * @return {Void}\n */\n mount: function mount() {\n this._o = false;\n },\n\n /**\n * Makes glides running based on the passed moving schema.\n *\n * @param {String} move\n */\n make: function make(move) {\n var _this = this;\n\n if (!Glide.disabled) {\n Glide.disable();\n this.move = move;\n Events.emit('run.before', this.move);\n this.calculate();\n Events.emit('run', this.move);\n Components.Transition.after(function () {\n if (_this.isStart()) {\n Events.emit('run.start', _this.move);\n }\n\n if (_this.isEnd()) {\n Events.emit('run.end', _this.move);\n }\n\n if (_this.isOffset('<') || _this.isOffset('>')) {\n _this._o = false;\n Events.emit('run.offset', _this.move);\n }\n\n Events.emit('run.after', _this.move);\n Glide.enable();\n });\n }\n },\n\n /**\n * Calculates current index based on defined move.\n *\n * @return {Void}\n */\n calculate: function calculate() {\n var move = this.move,\n length = this.length;\n var steps = move.steps,\n direction = move.direction;\n var countableSteps = isNumber(toInt(steps)) && toInt(steps) !== 0;\n\n switch (direction) {\n case '>':\n if (steps === '>') {\n Glide.index = length;\n } else if (this.isEnd()) {\n if (!(Glide.isType('slider') && !Glide.settings.rewind)) {\n this._o = true;\n Glide.index = 0;\n }\n } else if (countableSteps) {\n Glide.index += Math.min(length - Glide.index, -toInt(steps));\n } else {\n Glide.index++;\n }\n\n break;\n\n case '<':\n if (steps === '<') {\n Glide.index = 0;\n } else if (this.isStart()) {\n if (!(Glide.isType('slider') && !Glide.settings.rewind)) {\n this._o = true;\n Glide.index = length;\n }\n } else if (countableSteps) {\n Glide.index -= Math.min(Glide.index, toInt(steps));\n } else {\n Glide.index--;\n }\n\n break;\n\n case '=':\n Glide.index = steps;\n break;\n\n default:\n warn('Invalid direction pattern [' + direction + steps + '] has been used');\n break;\n }\n },\n\n /**\n * Checks if we are on the first slide.\n *\n * @return {Boolean}\n */\n isStart: function isStart() {\n return Glide.index === 0;\n },\n\n /**\n * Checks if we are on the last slide.\n *\n * @return {Boolean}\n */\n isEnd: function isEnd() {\n return Glide.index === this.length;\n },\n\n /**\n * Checks if we are making a offset run.\n *\n * @param {String} direction\n * @return {Boolean}\n */\n isOffset: function isOffset(direction) {\n return this._o && this.move.direction === direction;\n }\n };\n glide_modular_esm_define(Run, 'move', {\n /**\n * Gets value of the move schema.\n *\n * @returns {Object}\n */\n get: function get() {\n return this._m;\n },\n\n /**\n * Sets value of the move schema.\n *\n * @returns {Object}\n */\n set: function set(value) {\n var step = value.substr(1);\n this._m = {\n direction: value.substr(0, 1),\n steps: step ? toInt(step) ? toInt(step) : step : 0\n };\n }\n });\n glide_modular_esm_define(Run, 'length', {\n /**\n * Gets value of the running distance based\n * on zero-indexing number of slides.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n var length = Components.Html.slides.length; // If the `bound` option is acitve, a maximum running distance should be\n // reduced by `perView` and `focusAt` settings. Running distance\n // should end before creating an empty space after instance.\n\n if (Glide.isType('slider') && settings.focusAt !== 'center' && settings.bound) {\n return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n }\n\n return length - 1;\n }\n });\n glide_modular_esm_define(Run, 'offset', {\n /**\n * Gets status of the offsetting flag.\n *\n * @return {Boolean}\n */\n get: function get() {\n return this._o;\n }\n });\n return Run;\n}\n/**\n * Returns a current time.\n *\n * @return {Number}\n */\n\n\nfunction now() {\n return new Date().getTime();\n}\n/**\n * Returns a function, that, when invoked, will only be triggered\n * at most once during a given window of time.\n *\n * @param {Function} func\n * @param {Number} wait\n * @param {Object=} options\n * @return {Function}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\n\nfunction throttle(func, wait, options) {\n var timeout = void 0,\n context = void 0,\n args = void 0,\n result = void 0;\n var previous = 0;\n if (!options) options = {};\n\n var later = function later() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function throttled() {\n var at = now();\n if (!previous && options.leading === false) previous = at;\n var remaining = wait - (at - previous);\n context = this;\n args = arguments;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = at;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n\n return result;\n };\n\n throttled.cancel = function () {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n\nvar MARGIN_TYPE = {\n ltr: ['marginLeft', 'marginRight'],\n rtl: ['marginRight', 'marginLeft']\n};\n\nfunction Gaps(Glide, Components, Events) {\n var Gaps = {\n /**\n * Applies gaps between slides. First and last\n * slides do not receive it's edge margins.\n *\n * @param {HTMLCollection} slides\n * @return {Void}\n */\n apply: function apply(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n var direction = Components.Direction.value;\n\n if (i !== 0) {\n style[MARGIN_TYPE[direction][0]] = this.value / 2 + 'px';\n } else {\n style[MARGIN_TYPE[direction][0]] = '';\n }\n\n if (i !== slides.length - 1) {\n style[MARGIN_TYPE[direction][1]] = this.value / 2 + 'px';\n } else {\n style[MARGIN_TYPE[direction][1]] = '';\n }\n }\n },\n\n /**\n * Removes gaps from the slides.\n *\n * @param {HTMLCollection} slides\n * @returns {Void}\n */\n remove: function remove(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n style.marginLeft = '';\n style.marginRight = '';\n }\n }\n };\n glide_modular_esm_define(Gaps, 'value', {\n /**\n * Gets value of the gap.\n *\n * @returns {Number}\n */\n get: function get() {\n return toInt(Glide.settings.gap);\n }\n });\n glide_modular_esm_define(Gaps, 'grow', {\n /**\n * Gets additional dimentions value caused by gaps.\n * Used to increase width of the slides wrapper.\n *\n * @returns {Number}\n */\n get: function get() {\n return Gaps.value * (Components.Sizes.length - 1);\n }\n });\n glide_modular_esm_define(Gaps, 'reductor', {\n /**\n * Gets reduction value caused by gaps.\n * Used to subtract width of the slides.\n *\n * @returns {Number}\n */\n get: function get() {\n var perView = Glide.settings.perView;\n return Gaps.value * (perView - 1) / perView;\n }\n });\n /**\n * Apply calculated gaps:\n * - after building, so slides (including clones) will receive proper margins\n * - on updating via API, to recalculate gaps with new options\n */\n\n Events.on(['build.after', 'update'], throttle(function () {\n Gaps.apply(Components.Html.wrapper.children);\n }, 30));\n /**\n * Remove gaps:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Gaps.remove(Components.Html.wrapper.children);\n });\n return Gaps;\n}\n/**\n * Finds siblings nodes of the passed node.\n *\n * @param {Element} node\n * @return {Array}\n */\n\n\nfunction siblings(node) {\n if (node && node.parentNode) {\n var n = node.parentNode.firstChild;\n var matched = [];\n\n for (; n; n = n.nextSibling) {\n if (n.nodeType === 1 && n !== node) {\n matched.push(n);\n }\n }\n\n return matched;\n }\n\n return [];\n}\n/**\n * Checks if passed node exist and is a valid element.\n *\n * @param {Element} node\n * @return {Boolean}\n */\n\n\nfunction exist(node) {\n if (node && node instanceof window.HTMLElement) {\n return true;\n }\n\n return false;\n}\n\nvar TRACK_SELECTOR = '[data-glide-el=\"track\"]';\n\nfunction Html(Glide, Components) {\n var Html = {\n /**\n * Setup slider HTML nodes.\n *\n * @param {Glide} glide\n */\n mount: function mount() {\n this.root = Glide.selector;\n this.track = this.root.querySelector(TRACK_SELECTOR);\n this.slides = Array.prototype.slice.call(this.wrapper.children).filter(function (slide) {\n return !slide.classList.contains(Glide.settings.classes.cloneSlide);\n });\n }\n };\n glide_modular_esm_define(Html, 'root', {\n /**\n * Gets node of the glide main element.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._r;\n },\n\n /**\n * Sets node of the glide main element.\n *\n * @return {Object}\n */\n set: function set(r) {\n if (isString(r)) {\n r = top.document.querySelector(r);\n }\n\n Html._r = r;\n /**\n * Removed exist validation\n */\n // if (exist(r)) {\n // Html._r = r;\n // } else {\n // warn('Root element must be a existing Html node');\n // }\n }\n });\n glide_modular_esm_define(Html, 'track', {\n /**\n * Gets node of the glide track with slides.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._t;\n },\n\n /**\n * Sets node of the glide track with slides.\n *\n * @return {Object}\n */\n set: function set(t) {\n Html._t = t;\n /**\n * Removed exist validation\n */\n // if (exist(t)) {\n // Html._t = t;\n // } else {\n // warn('Could not find track element. Please use ' + TRACK_SELECTOR + ' attribute.');\n // }\n }\n });\n glide_modular_esm_define(Html, 'wrapper', {\n /**\n * Gets node of the slides wrapper.\n *\n * @return {Object}\n */\n get: function get() {\n return Html.track.children[0];\n }\n });\n return Html;\n}\n\nfunction Peek(Glide, Components, Events) {\n var Peek = {\n /**\n * Setups how much to peek based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.peek;\n }\n };\n glide_modular_esm_define(Peek, 'value', {\n /**\n * Gets value of the peek.\n *\n * @returns {Number|Object}\n */\n get: function get() {\n return Peek._v;\n },\n\n /**\n * Sets value of the peek.\n *\n * @param {Number|Object} value\n * @return {Void}\n */\n set: function set(value) {\n if (isObject(value)) {\n value.before = toInt(value.before);\n value.after = toInt(value.after);\n } else {\n value = toInt(value);\n }\n\n Peek._v = value;\n }\n });\n glide_modular_esm_define(Peek, 'reductor', {\n /**\n * Gets reduction value caused by peek.\n *\n * @returns {Number}\n */\n get: function get() {\n var value = Peek.value;\n var perView = Glide.settings.perView;\n\n if (isObject(value)) {\n return value.before / perView + value.after / perView;\n }\n\n return value * 2 / perView;\n }\n });\n /**\n * Recalculate peeking sizes on:\n * - when resizing window to update to proper percents\n */\n\n Events.on(['resize', 'update'], function () {\n Peek.mount();\n });\n return Peek;\n}\n\nfunction Move(Glide, Components, Events) {\n var Move = {\n /**\n * Constructs move component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n this._o = 0;\n },\n\n /**\n * Calculates a movement value based on passed offset and currently active index.\n *\n * @param {Number} offset\n * @return {Void}\n */\n make: function make() {\n var _this = this;\n\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n this.offset = offset;\n Events.emit('move', {\n movement: this.value\n });\n Components.Transition.after(function () {\n Events.emit('move.after', {\n movement: _this.value\n });\n });\n }\n };\n glide_modular_esm_define(Move, 'offset', {\n /**\n * Gets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n get: function get() {\n return Move._o;\n },\n\n /**\n * Sets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n set: function set(value) {\n Move._o = !isUndefined(value) ? toInt(value) : 0;\n }\n });\n glide_modular_esm_define(Move, 'translate', {\n /**\n * Gets a raw movement value.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Sizes.slideWidth * Glide.index;\n }\n });\n glide_modular_esm_define(Move, 'value', {\n /**\n * Gets an actual movement value corrected by offset.\n *\n * @return {Number}\n */\n get: function get() {\n var offset = this.offset;\n var translate = this.translate;\n\n if (Components.Direction.is('rtl')) {\n return translate + offset;\n }\n\n return translate - offset;\n }\n });\n /**\n * Make movement to proper slide on:\n * - before build, so glide will start at `startAt` index\n * - on each standard run to move to newly calculated index\n */\n\n Events.on(['build.before', 'run'], function () {\n Move.make();\n });\n return Move;\n}\n\nfunction Sizes(Glide, Components, Events) {\n var Sizes = {\n /**\n * Setups dimentions of slides.\n *\n * @return {Void}\n */\n setupSlides: function setupSlides() {\n var width = this.slideWidth + 'px';\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = width;\n }\n },\n\n /**\n * Setups dimentions of slides wrapper.\n *\n * @return {Void}\n */\n setupWrapper: function setupWrapper(dimention) {\n Components.Html.wrapper.style.width = this.wrapperSize + 'px';\n },\n\n /**\n * Removes applied styles from HTML elements.\n *\n * @returns {Void}\n */\n remove: function remove() {\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = '';\n }\n\n Components.Html.wrapper.style.width = '';\n }\n };\n glide_modular_esm_define(Sizes, 'length', {\n /**\n * Gets count number of the slides.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.slides.length;\n }\n });\n glide_modular_esm_define(Sizes, 'width', {\n /**\n * Gets width value of the glide.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.root.offsetWidth;\n }\n });\n glide_modular_esm_define(Sizes, 'wrapperSize', {\n /**\n * Gets size of the slides wrapper.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n }\n });\n glide_modular_esm_define(Sizes, 'slideWidth', {\n /**\n * Gets width value of the single slide.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n }\n });\n /**\n * Apply calculated glide's dimensions:\n * - before building, so other dimentions (e.g. translate) will be calculated propertly\n * - when resizing window to recalculate sildes dimensions\n * - on updating via API, to calculate dimensions based on new options\n */\n\n Events.on(['build.before', 'resize', 'update'], function () {\n Sizes.setupSlides();\n Sizes.setupWrapper();\n });\n /**\n * Remove calculated glide's dimensions:\n * - on destoting to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Sizes.remove();\n });\n return Sizes;\n}\n\nfunction Build(Glide, Components, Events) {\n var Build = {\n /**\n * Init glide building. Adds classes, sets\n * dimensions and setups initial state.\n *\n * @return {Void}\n */\n mount: function mount() {\n Events.emit('build.before');\n this.typeClass();\n this.activeClass();\n Events.emit('build.after');\n },\n\n /**\n * Adds `type` class to the glide element.\n *\n * @return {Void}\n */\n typeClass: function typeClass() {\n Components.Html.root.classList.add(Glide.settings.classes[Glide.settings.type]);\n },\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n activeClass: function activeClass() {\n var classes = Glide.settings.classes;\n var slide = Components.Html.slides[Glide.index];\n\n if (slide) {\n slide.classList.add(classes.activeSlide);\n siblings(slide).forEach(function (sibling) {\n sibling.classList.remove(classes.activeSlide);\n });\n }\n },\n\n /**\n * Removes HTML classes applied at building.\n *\n * @return {Void}\n */\n removeClasses: function removeClasses() {\n var classes = Glide.settings.classes;\n Components.Html.root.classList.remove(classes[Glide.settings.type]);\n Components.Html.slides.forEach(function (sibling) {\n sibling.classList.remove(classes.activeSlide);\n });\n }\n };\n /**\n * Clear building classes:\n * - on destroying to bring HTML to its initial state\n * - on updating to remove classes before remounting component\n */\n\n Events.on(['destroy', 'update'], function () {\n Build.removeClasses();\n });\n /**\n * Remount component:\n * - on resizing of the window to calculate new dimentions\n * - on updating settings via API\n */\n\n Events.on(['resize', 'update'], function () {\n Build.mount();\n });\n /**\n * Swap active class of current slide:\n * - after each move to the new index\n */\n\n Events.on('move.after', function () {\n Build.activeClass();\n });\n return Build;\n}\n\nfunction Clones(Glide, Components, Events) {\n var Clones = {\n /**\n * Create pattern map and collect slides to be cloned.\n */\n mount: function mount() {\n this.items = [];\n\n if (Glide.isType('carousel')) {\n this.items = this.collect();\n }\n },\n\n /**\n * Collect clones with pattern.\n *\n * @return {Void}\n */\n collect: function collect() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var slides = Components.Html.slides;\n var _Glide$settings = Glide.settings,\n perView = _Glide$settings.perView,\n classes = _Glide$settings.classes;\n var peekIncrementer = +!!Glide.settings.peek;\n var part = perView + peekIncrementer;\n var start = slides.slice(0, part);\n var end = slides.slice(-part);\n\n for (var r = 0; r < Math.max(1, Math.floor(perView / slides.length)); r++) {\n for (var i = 0; i < start.length; i++) {\n var clone = start[i].cloneNode(true);\n clone.classList.add(classes.cloneSlide);\n items.push(clone);\n }\n\n for (var _i = 0; _i < end.length; _i++) {\n var _clone = end[_i].cloneNode(true);\n\n _clone.classList.add(classes.cloneSlide);\n\n items.unshift(_clone);\n }\n }\n\n return items;\n },\n\n /**\n * Append cloned slides with generated pattern.\n *\n * @return {Void}\n */\n append: function append() {\n var items = this.items;\n var _Components$Html = Components.Html,\n wrapper = _Components$Html.wrapper,\n slides = _Components$Html.slides;\n var half = Math.floor(items.length / 2);\n var prepend = items.slice(0, half).reverse();\n var append = items.slice(half, items.length);\n var width = Components.Sizes.slideWidth + 'px';\n\n for (var i = 0; i < append.length; i++) {\n wrapper.appendChild(append[i]);\n }\n\n for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n wrapper.insertBefore(prepend[_i2], slides[0]);\n }\n\n for (var _i3 = 0; _i3 < items.length; _i3++) {\n items[_i3].style.width = width;\n }\n },\n\n /**\n * Remove all cloned slides.\n *\n * @return {Void}\n */\n remove: function remove() {\n var items = this.items;\n\n for (var i = 0; i < items.length; i++) {\n Components.Html.wrapper.removeChild(items[i]);\n }\n }\n };\n glide_modular_esm_define(Clones, 'grow', {\n /**\n * Gets additional dimentions value caused by clones.\n *\n * @return {Number}\n */\n get: function get() {\n return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n }\n });\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n\n Events.on('update', function () {\n Clones.remove();\n Clones.mount();\n Clones.append();\n });\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n\n Events.on('build.before', function () {\n if (Glide.isType('carousel')) {\n Clones.append();\n }\n });\n /**\n * Remove clones HTMLElements:\n * - on destroying, to bring HTML to its initial state\n */\n\n Events.on('destroy', function () {\n Clones.remove();\n });\n return Clones;\n}\n\nvar EventsBinder = function () {\n /**\n * Construct a EventsBinder instance.\n */\n function EventsBinder() {\n var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, EventsBinder);\n this.listeners = listeners;\n }\n /**\n * Adds events listeners to arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Function} closure\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n\n createClass(EventsBinder, [{\n key: 'on',\n value: function on(events, el, closure) {\n var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n this.listeners[events[i]] = closure;\n el.addEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n /**\n * Removes event listeners from arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n }, {\n key: 'off',\n value: function off(events, el) {\n var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n el.removeEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n /**\n * Destroy collected listeners.\n *\n * @returns {Void}\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n delete this.listeners;\n }\n }]);\n return EventsBinder;\n}();\n\nfunction Resize(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Resize = {\n /**\n * Initializes window bindings.\n */\n mount: function mount() {\n this.bind();\n },\n\n /**\n * Binds `rezsize` listener to the window.\n * It's a costly event, so we are debouncing it.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('resize', window, throttle(function () {\n Events.emit('resize');\n }, Glide.settings.throttle));\n },\n\n /**\n * Unbinds listeners from the window.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('resize', window);\n }\n };\n /**\n * Remove bindings from window:\n * - on destroying, to remove added EventListener\n */\n\n Events.on('destroy', function () {\n Resize.unbind();\n Binder.destroy();\n });\n return Resize;\n}\n\nvar VALID_DIRECTIONS = ['ltr', 'rtl'];\nvar FLIPED_MOVEMENTS = {\n '>': '<',\n '<': '>',\n '=': '='\n};\n\nfunction Direction(Glide, Components, Events) {\n var Direction = {\n /**\n * Setups gap value based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.direction;\n },\n\n /**\n * Resolves pattern based on direction value\n *\n * @param {String} pattern\n * @returns {String}\n */\n resolve: function resolve(pattern) {\n var token = pattern.slice(0, 1);\n\n if (this.is('rtl')) {\n return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n }\n\n return pattern;\n },\n\n /**\n * Checks value of direction mode.\n *\n * @param {String} direction\n * @returns {Boolean}\n */\n is: function is(direction) {\n return this.value === direction;\n },\n\n /**\n * Applies direction class to the root HTML element.\n *\n * @return {Void}\n */\n addClass: function addClass() {\n Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n },\n\n /**\n * Removes direction class from the root HTML element.\n *\n * @return {Void}\n */\n removeClass: function removeClass() {\n Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n }\n };\n glide_modular_esm_define(Direction, 'value', {\n /**\n * Gets value of the direction.\n *\n * @returns {Number}\n */\n get: function get() {\n return Direction._v;\n },\n\n /**\n * Sets value of the direction.\n *\n * @param {String} value\n * @return {Void}\n */\n set: function set(value) {\n if (VALID_DIRECTIONS.indexOf(value) > -1) {\n Direction._v = value;\n } else {\n warn('Direction value must be `ltr` or `rtl`');\n }\n }\n });\n /**\n * Clear direction class:\n * - on destroy to bring HTML to its initial state\n * - on update to remove class before reappling bellow\n */\n\n Events.on(['destroy', 'update'], function () {\n Direction.removeClass();\n });\n /**\n * Remount component:\n * - on update to reflect changes in direction value\n */\n\n Events.on('update', function () {\n Direction.mount();\n });\n /**\n * Apply direction class:\n * - before building to apply class for the first time\n * - on updating to reapply direction class that may changed\n */\n\n Events.on(['build.before', 'update'], function () {\n Direction.addClass();\n });\n return Direction;\n}\n/**\n * Reflects value of glide movement.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Rtl(Glide, Components) {\n return {\n /**\n * Negates the passed translate if glide is in RTL option.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Components.Direction.is('rtl')) {\n return -translate;\n }\n\n return translate;\n }\n };\n}\n/**\n * Updates glide movement with a `gap` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Gap(Glide, Components) {\n return {\n /**\n * Modifies passed translate value with number in the `gap` settings.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n return translate + Components.Gaps.value * Glide.index;\n }\n };\n}\n/**\n * Updates glide movement with width of additional clones width.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Grow(Glide, Components) {\n return {\n /**\n * Adds to the passed translate width of the half of clones.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n return translate + Components.Clones.grow / 2;\n }\n };\n}\n/**\n * Updates glide movement with a `peek` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Peeking(Glide, Components) {\n return {\n /**\n * Modifies passed translate value with a `peek` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Glide.settings.focusAt >= 0) {\n var peek = Components.Peek.value;\n\n if (isObject(peek)) {\n return translate - peek.before;\n }\n\n return translate - peek;\n }\n\n return translate;\n }\n };\n}\n/**\n * Updates glide movement with a `focusAt` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Focusing(Glide, Components) {\n return {\n /**\n * Modifies passed translate value with index in the `focusAt` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n var gap = Components.Gaps.value;\n var width = Components.Sizes.width;\n var focusAt = Glide.settings.focusAt;\n var slideWidth = Components.Sizes.slideWidth;\n\n if (focusAt === 'center') {\n return translate - (width / 2 - slideWidth / 2);\n }\n\n return translate - slideWidth * focusAt - gap * focusAt;\n }\n };\n}\n/**\n * Applies diffrent transformers on translate value.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction mutator(Glide, Components, Events) {\n /**\n * Merge instance transformers with collection of default transformers.\n * It's important that the Rtl component be last on the list,\n * so it reflects all previous transformations.\n *\n * @type {Array}\n */\n var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n return {\n /**\n * Piplines translate value with registered transformers.\n *\n * @param {Number} translate\n * @return {Number}\n */\n mutate: function mutate(translate) {\n for (var i = 0; i < TRANSFORMERS.length; i++) {\n var transformer = TRANSFORMERS[i];\n\n if (isFunction(transformer) && isFunction(transformer().modify)) {\n translate = transformer(Glide, Components, Events).modify(translate);\n } else {\n warn('Transformer should be a function that returns an object with `modify()` method');\n }\n }\n\n return translate;\n }\n };\n}\n\nfunction Translate(Glide, Components, Events) {\n var Translate = {\n /**\n * Sets value of translate on HTML element.\n *\n * @param {Number} value\n * @return {Void}\n */\n set: function set(value) {\n var transform = mutator(Glide, Components).mutate(value);\n Components.Html.wrapper.style.transform = 'translate3d(' + -1 * transform + 'px, 0px, 0px)';\n },\n\n /**\n * Removes value of translate from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transform = '';\n }\n };\n /**\n * Set new translate value:\n * - on move to reflect index change\n * - on updating via API to reflect possible changes in options\n */\n\n Events.on('move', function (context) {\n var gap = Components.Gaps.value;\n var length = Components.Sizes.length;\n var width = Components.Sizes.slideWidth;\n\n if (Glide.isType('carousel') && Components.Run.isOffset('<')) {\n Components.Transition.after(function () {\n Events.emit('translate.jump');\n Translate.set(width * (length - 1));\n });\n return Translate.set(-width - gap * length);\n }\n\n if (Glide.isType('carousel') && Components.Run.isOffset('>')) {\n Components.Transition.after(function () {\n Events.emit('translate.jump');\n Translate.set(0);\n });\n return Translate.set(width * length + gap * length);\n }\n\n return Translate.set(context.movement);\n });\n /**\n * Remove translate:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Translate.remove();\n });\n return Translate;\n}\n\nfunction Transition(Glide, Components, Events) {\n /**\n * Holds inactivity status of transition.\n * When true transition is not applied.\n *\n * @type {Boolean}\n */\n var disabled = false;\n var Transition = {\n /**\n * Composes string of the CSS transition.\n *\n * @param {String} property\n * @return {String}\n */\n compose: function compose(property) {\n var settings = Glide.settings;\n\n if (!disabled) {\n return property + ' ' + this.duration + 'ms ' + settings.animationTimingFunc;\n }\n\n return property + ' 0ms ' + settings.animationTimingFunc;\n },\n\n /**\n * Sets value of transition on HTML element.\n *\n * @param {String=} property\n * @return {Void}\n */\n set: function set() {\n var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n Components.Html.wrapper.style.transition = this.compose(property);\n },\n\n /**\n * Removes value of transition from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transition = '';\n },\n\n /**\n * Runs callback after animation.\n *\n * @param {Function} callback\n * @return {Void}\n */\n after: function after(callback) {\n setTimeout(function () {\n callback();\n }, this.duration);\n },\n\n /**\n * Enable transition.\n *\n * @return {Void}\n */\n enable: function enable() {\n disabled = false;\n this.set();\n },\n\n /**\n * Disable transition.\n *\n * @return {Void}\n */\n disable: function disable() {\n disabled = true;\n this.set();\n }\n };\n glide_modular_esm_define(Transition, 'duration', {\n /**\n * Gets duration of the transition based\n * on currently running animation type.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n\n if (Glide.isType('slider') && Components.Run.offset) {\n return settings.rewindDuration;\n }\n\n return settings.animationDuration;\n }\n });\n /**\n * Set transition `style` value:\n * - on each moving, because it may be cleared by offset move\n */\n\n Events.on('move', function () {\n Transition.set();\n });\n /**\n * Disable transition:\n * - before initial build to avoid transitioning from `0` to `startAt` index\n * - while resizing window and recalculating dimentions\n * - on jumping from offset transition at start and end edges in `carousel` type\n */\n\n Events.on(['build.before', 'resize', 'translate.jump'], function () {\n Transition.disable();\n });\n /**\n * Enable transition:\n * - on each running, because it may be disabled by offset move\n */\n\n Events.on('run', function () {\n Transition.enable();\n });\n /**\n * Remove transition:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Transition.remove();\n });\n return Transition;\n}\n/**\n * Test via a getter in the options object to see\n * if the passive property is accessed.\n *\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n */\n\n\nvar supportsPassive = false;\n\ntry {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n }\n });\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n} catch (e) {}\n\nvar supportsPassive$1 = supportsPassive;\nvar START_EVENTS = ['touchstart', 'mousedown'];\nvar MOVE_EVENTS = ['touchmove', 'mousemove'];\nvar END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\nvar MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\n\nfunction swipe(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var swipeSin = 0;\n var swipeStartX = 0;\n var swipeStartY = 0;\n var disabled = false;\n var capture = supportsPassive$1 ? {\n passive: true\n } : false;\n var Swipe = {\n /**\n * Initializes swipe bindings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bindSwipeStart();\n },\n\n /**\n * Handler for `swipestart` event. Calculates entry points of the user's tap.\n *\n * @param {Object} event\n * @return {Void}\n */\n start: function start(event) {\n if (!disabled && !Glide.disabled) {\n this.disable();\n var swipe = this.touches(event);\n swipeSin = null;\n swipeStartX = toInt(swipe.pageX);\n swipeStartY = toInt(swipe.pageY);\n this.bindSwipeMove();\n this.bindSwipeEnd();\n Events.emit('swipe.start');\n }\n },\n\n /**\n * Handler for `swipemove` event. Calculates user's tap angle and distance.\n *\n * @param {Object} event\n */\n move: function move(event) {\n if (!Glide.disabled) {\n var _Glide$settings = Glide.settings,\n touchAngle = _Glide$settings.touchAngle,\n touchRatio = _Glide$settings.touchRatio,\n classes = _Glide$settings.classes;\n var swipe = this.touches(event);\n var subExSx = toInt(swipe.pageX) - swipeStartX;\n var subEySy = toInt(swipe.pageY) - swipeStartY;\n var powEX = Math.abs(subExSx << 2);\n var powEY = Math.abs(subEySy << 2);\n var swipeHypotenuse = Math.sqrt(powEX + powEY);\n var swipeCathetus = Math.sqrt(powEY);\n swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n if (swipeSin * 180 / Math.PI < touchAngle) {\n event.stopPropagation();\n Components.Move.make(subExSx * toFloat(touchRatio));\n Components.Html.root.classList.add(classes.dragging);\n Events.emit('swipe.move');\n } else {\n return false;\n }\n }\n },\n\n /**\n * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n *\n * @param {Object} event\n * @return {Void}\n */\n end: function end(event) {\n if (!Glide.disabled) {\n var settings = Glide.settings;\n var swipe = this.touches(event);\n var threshold = this.threshold(event);\n var swipeDistance = swipe.pageX - swipeStartX;\n var swipeDeg = swipeSin * 180 / Math.PI;\n var steps = Math.round(swipeDistance / Components.Sizes.slideWidth);\n this.enable();\n\n if (swipeDistance > threshold && swipeDeg < settings.touchAngle) {\n // While swipe is positive and greater than threshold move backward.\n if (settings.perTouch) {\n steps = Math.min(steps, toInt(settings.perTouch));\n }\n\n if (Components.Direction.is('rtl')) {\n steps = -steps;\n }\n\n Components.Run.make(Components.Direction.resolve('<' + steps));\n } else if (swipeDistance < -threshold && swipeDeg < settings.touchAngle) {\n // While swipe is negative and lower than negative threshold move forward.\n if (settings.perTouch) {\n steps = Math.max(steps, -toInt(settings.perTouch));\n }\n\n if (Components.Direction.is('rtl')) {\n steps = -steps;\n }\n\n Components.Run.make(Components.Direction.resolve('>' + steps));\n } else {\n // While swipe don't reach distance apply previous transform.\n Components.Move.make();\n }\n\n Components.Html.root.classList.remove(settings.classes.dragging);\n this.unbindSwipeMove();\n this.unbindSwipeEnd();\n Events.emit('swipe.end');\n }\n },\n\n /**\n * Binds swipe's starting event.\n *\n * @return {Void}\n */\n bindSwipeStart: function bindSwipeStart() {\n var _this = this;\n\n var settings = Glide.settings;\n\n if (settings.swipeThreshold) {\n Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n\n if (settings.dragThreshold) {\n Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n },\n\n /**\n * Unbinds swipe's starting event.\n *\n * @return {Void}\n */\n unbindSwipeStart: function unbindSwipeStart() {\n Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n },\n\n /**\n * Binds swipe's moving event.\n *\n * @return {Void}\n */\n bindSwipeMove: function bindSwipeMove() {\n var _this2 = this;\n\n Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n _this2.move(event);\n }, Glide.settings.throttle), capture);\n },\n\n /**\n * Unbinds swipe's moving event.\n *\n * @return {Void}\n */\n unbindSwipeMove: function unbindSwipeMove() {\n Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n },\n\n /**\n * Binds swipe's ending event.\n *\n * @return {Void}\n */\n bindSwipeEnd: function bindSwipeEnd() {\n var _this3 = this;\n\n Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n _this3.end(event);\n });\n },\n\n /**\n * Unbinds swipe's ending event.\n *\n * @return {Void}\n */\n unbindSwipeEnd: function unbindSwipeEnd() {\n Binder.off(END_EVENTS, Components.Html.wrapper);\n },\n\n /**\n * Normalizes event touches points accorting to different types.\n *\n * @param {Object} event\n */\n touches: function touches(event) {\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return event;\n }\n\n return event.touches[0] || event.changedTouches[0];\n },\n\n /**\n * Gets value of minimum swipe distance settings based on event type.\n *\n * @return {Number}\n */\n threshold: function threshold(event) {\n var settings = Glide.settings;\n\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return settings.dragThreshold;\n }\n\n return settings.swipeThreshold;\n },\n\n /**\n * Enables swipe event.\n *\n * @return {self}\n */\n enable: function enable() {\n disabled = false;\n Components.Transition.enable();\n return this;\n },\n\n /**\n * Disables swipe event.\n *\n * @return {self}\n */\n disable: function disable() {\n disabled = true;\n Components.Transition.disable();\n return this;\n }\n };\n /**\n * Add component class:\n * - after initial building\n */\n\n Events.on('build.after', function () {\n Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n });\n /**\n * Remove swiping bindings:\n * - on destroying, to remove added EventListeners\n */\n\n Events.on('destroy', function () {\n Swipe.unbindSwipeStart();\n Swipe.unbindSwipeMove();\n Swipe.unbindSwipeEnd();\n Binder.destroy();\n });\n return Swipe;\n}\n\nfunction glide_modular_esm_images(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Images = {\n /**\n * Binds listener to glide wrapper.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bind();\n },\n\n /**\n * Binds `dragstart` event on wrapper to prevent dragging images.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n },\n\n /**\n * Unbinds `dragstart` event on wrapper.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('dragstart', Components.Html.wrapper);\n },\n\n /**\n * Event handler. Prevents dragging.\n *\n * @return {Void}\n */\n dragstart: function dragstart(event) {\n event.preventDefault();\n }\n };\n /**\n * Remove bindings from images:\n * - on destroying, to remove added EventListeners\n */\n\n Events.on('destroy', function () {\n Images.unbind();\n Binder.destroy();\n });\n return Images;\n}\n\nfunction glide_modular_esm_anchors(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n /**\n * Holds detaching status of anchors.\n * Prevents detaching of already detached anchors.\n *\n * @private\n * @type {Boolean}\n */\n\n var detached = false;\n /**\n * Holds preventing status of anchors.\n * If `true` redirection after click will be disabled.\n *\n * @private\n * @type {Boolean}\n */\n\n var prevented = false;\n var Anchors = {\n /**\n * Setups a initial state of anchors component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n /**\n * Holds collection of anchors elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._a = Components.Html.wrapper.querySelectorAll('a');\n this.bind();\n },\n\n /**\n * Binds events to anchors inside a track.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('click', Components.Html.wrapper, this.click);\n },\n\n /**\n * Unbinds events attached to anchors inside a track.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('click', Components.Html.wrapper);\n },\n\n /**\n * Handler for click event. Prevents clicks when glide is in `prevent` status.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n if (prevented) {\n event.stopPropagation();\n event.preventDefault();\n }\n },\n\n /**\n * Detaches anchors click event inside glide.\n *\n * @return {self}\n */\n detach: function detach() {\n prevented = true;\n\n if (!detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = false;\n this.items[i].setAttribute('data-href', this.items[i].getAttribute('href'));\n this.items[i].removeAttribute('href');\n }\n\n detached = true;\n }\n\n return this;\n },\n\n /**\n * Attaches anchors click events inside glide.\n *\n * @return {self}\n */\n attach: function attach() {\n prevented = false;\n\n if (detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = true;\n this.items[i].setAttribute('href', this.items[i].getAttribute('data-href'));\n }\n\n detached = false;\n }\n\n return this;\n }\n };\n glide_modular_esm_define(Anchors, 'items', {\n /**\n * Gets collection of the arrows HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Anchors._a;\n }\n });\n /**\n * Detach anchors inside slides:\n * - on swiping, so they won't redirect to its `href` attributes\n */\n\n Events.on('swipe.move', function () {\n Anchors.detach();\n });\n /**\n * Attach anchors inside slides:\n * - after swiping and transitions ends, so they can redirect after click again\n */\n\n Events.on('swipe.end', function () {\n Components.Transition.after(function () {\n Anchors.attach();\n });\n });\n /**\n * Unbind anchors inside slides:\n * - on destroying, to bring anchors to its initial state\n */\n\n Events.on('destroy', function () {\n Anchors.attach();\n Anchors.unbind();\n Binder.destroy();\n });\n return Anchors;\n}\n\nvar NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\nvar CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\n\nfunction controls(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var capture = supportsPassive$1 ? {\n passive: true\n } : false;\n var Controls = {\n /**\n * Inits arrows. Binds events listeners\n * to the arrows HTML elements.\n *\n * @return {Void}\n */\n mount: function mount() {\n /**\n * Collection of navigation HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n /**\n * Collection of controls HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n\n this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n this.addBindings();\n },\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n setActive: function setActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.addClass(this._n[i].children);\n }\n },\n\n /**\n * Removes active class to current slide.\n *\n * @return {Void}\n */\n removeActive: function removeActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.removeClass(this._n[i].children);\n }\n },\n\n /**\n * Toggles active class on items inside navigation.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n addClass: function addClass(controls) {\n var settings = Glide.settings;\n var item = controls[Glide.index];\n\n if (item) {\n item.classList.add(settings.classes.activeNav);\n siblings(item).forEach(function (sibling) {\n sibling.classList.remove(settings.classes.activeNav);\n });\n }\n },\n\n /**\n * Removes active class from active control.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n removeClass: function removeClass(controls) {\n var item = controls[Glide.index];\n\n if (item) {\n item.classList.remove(Glide.settings.classes.activeNav);\n }\n },\n\n /**\n * Adds handles to the each group of controls.\n *\n * @return {Void}\n */\n addBindings: function addBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.bind(this._c[i].children);\n }\n },\n\n /**\n * Removes handles from the each group of controls.\n *\n * @return {Void}\n */\n removeBindings: function removeBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.unbind(this._c[i].children);\n }\n },\n\n /**\n * Binds events to arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n bind: function bind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.on('click', elements[i], this.click);\n Binder.on('touchstart', elements[i], this.click, capture);\n }\n },\n\n /**\n * Unbinds events binded to the arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n unbind: function unbind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.off(['click', 'touchstart'], elements[i]);\n }\n },\n\n /**\n * Handles `click` event on the arrows HTML elements.\n * Moves slider in driection precised in\n * `data-glide-dir` attribute.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n event.preventDefault();\n Components.Run.make(Components.Direction.resolve(event.currentTarget.getAttribute('data-glide-dir')));\n }\n };\n glide_modular_esm_define(Controls, 'items', {\n /**\n * Gets collection of the controls HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Controls._c;\n }\n });\n /**\n * Swap active class of current navigation item:\n * - after mounting to set it to initial index\n * - after each move to the new index\n */\n\n Events.on(['mount.after', 'move.after'], function () {\n Controls.setActive();\n });\n /**\n * Remove bindings and HTML Classes:\n * - on destroying, to bring markup to its initial state\n */\n\n Events.on('destroy', function () {\n Controls.removeBindings();\n Controls.removeActive();\n Binder.destroy();\n });\n return Controls;\n}\n\nfunction keyboard(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Keyboard = {\n /**\n * Binds keyboard events on component mount.\n *\n * @return {Void}\n */\n mount: function mount() {\n if (Glide.settings.keyboard) {\n this.bind();\n }\n },\n\n /**\n * Adds keyboard press events.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('keyup', document, this.press);\n },\n\n /**\n * Removes keyboard press events.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('keyup', document);\n },\n\n /**\n * Handles keyboard's arrows press and moving glide foward and backward.\n *\n * @param {Object} event\n * @return {Void}\n */\n press: function press(event) {\n if (event.keyCode === 39) {\n Components.Run.make(Components.Direction.resolve('>'));\n }\n\n if (event.keyCode === 37) {\n Components.Run.make(Components.Direction.resolve('<'));\n }\n }\n };\n /**\n * Remove bindings from keyboard:\n * - on destroying to remove added events\n * - on updating to remove events before remounting\n */\n\n Events.on(['destroy', 'update'], function () {\n Keyboard.unbind();\n });\n /**\n * Remount component\n * - on updating to reflect potential changes in settings\n */\n\n Events.on('update', function () {\n Keyboard.mount();\n });\n /**\n * Destroy binder:\n * - on destroying to remove listeners\n */\n\n Events.on('destroy', function () {\n Binder.destroy();\n });\n return Keyboard;\n}\n\nfunction autoplay(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Autoplay = {\n /**\n * Initializes autoplaying and events.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.start();\n\n if (Glide.settings.hoverpause) {\n this.bind();\n }\n },\n\n /**\n * Starts autoplaying in configured interval.\n *\n * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n * @return {Void}\n */\n start: function start() {\n var _this = this;\n\n if (Glide.settings.autoplay) {\n if (isUndefined(this._i)) {\n this._i = setInterval(function () {\n _this.stop();\n\n Components.Run.make('>');\n\n _this.start();\n }, this.time);\n }\n }\n },\n\n /**\n * Stops autorunning of the glide.\n *\n * @return {Void}\n */\n stop: function stop() {\n this._i = clearInterval(this._i);\n },\n\n /**\n * Stops autoplaying while mouse is over glide's area.\n *\n * @return {Void}\n */\n bind: function bind() {\n var _this2 = this;\n\n Binder.on('mouseover', Components.Html.root, function () {\n _this2.stop();\n });\n Binder.on('mouseout', Components.Html.root, function () {\n _this2.start();\n });\n },\n\n /**\n * Unbind mouseover events.\n *\n * @returns {Void}\n */\n unbind: function unbind() {\n Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n }\n };\n glide_modular_esm_define(Autoplay, 'time', {\n /**\n * Gets time period value for the autoplay interval. Prioritizes\n * times in `data-glide-autoplay` attrubutes over options.\n *\n * @return {Number}\n */\n get: function get() {\n var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n if (autoplay) {\n return toInt(autoplay);\n }\n\n return toInt(Glide.settings.autoplay);\n }\n });\n /**\n * Stop autoplaying and unbind events:\n * - on destroying, to clear defined interval\n * - on updating via API to reset interval that may changed\n */\n\n Events.on(['destroy', 'update'], function () {\n Autoplay.unbind();\n });\n /**\n * Stop autoplaying:\n * - before each run, to restart autoplaying\n * - on pausing via API\n * - on destroying, to clear defined interval\n * - while starting a swipe\n * - on updating via API to reset interval that may changed\n */\n\n Events.on(['run.before', 'pause', 'destroy', 'swipe.start', 'update'], function () {\n Autoplay.stop();\n });\n /**\n * Start autoplaying:\n * - after each run, to restart autoplaying\n * - on playing via API\n * - while ending a swipe\n */\n\n Events.on(['run.after', 'play', 'swipe.end'], function () {\n Autoplay.start();\n });\n /**\n * Remount autoplaying:\n * - on updating via API to reset interval that may changed\n */\n\n Events.on('update', function () {\n Autoplay.mount();\n });\n /**\n * Destroy a binder:\n * - on destroying glide instance to clearup listeners\n */\n\n Events.on('destroy', function () {\n Binder.destroy();\n });\n return Autoplay;\n}\n/**\n * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n *\n * @param {Object} points\n * @returns {Object}\n */\n\n\nfunction sortBreakpoints(points) {\n if (isObject(points)) {\n return sortKeys(points);\n } else {\n warn('Breakpoints option must be an object');\n }\n\n return {};\n}\n\nfunction breakpoints(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n /**\n * Holds reference to settings.\n *\n * @type {Object}\n */\n\n var settings = Glide.settings;\n /**\n * Holds reference to breakpoints object in settings. Sorts breakpoints\n * from smaller to larger. It is required in order to proper\n * matching currently active breakpoint settings.\n *\n * @type {Object}\n */\n\n var points = sortBreakpoints(settings.breakpoints);\n /**\n * Cache initial settings before overwritting.\n *\n * @type {Object}\n */\n\n var defaults = _extends({}, settings);\n\n var Breakpoints = {\n /**\n * Matches settings for currectly matching media breakpoint.\n *\n * @param {Object} points\n * @returns {Object}\n */\n match: function match(points) {\n if (typeof window.matchMedia !== 'undefined') {\n for (var point in points) {\n if (points.hasOwnProperty(point)) {\n if (window.matchMedia('(max-width: ' + point + 'px)').matches) {\n return points[point];\n }\n }\n }\n }\n\n return defaults;\n }\n };\n /**\n * Overwrite instance settings with currently matching breakpoint settings.\n * This happens right after component initialization.\n */\n\n _extends(settings, Breakpoints.match(points));\n /**\n * Update glide with settings of matched brekpoint:\n * - window resize to update slider\n */\n\n\n Binder.on('resize', window, throttle(function () {\n Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n }, Glide.settings.throttle));\n /**\n * Resort and update default settings:\n * - on reinit via API, so breakpoint matching will be performed with options\n */\n\n Events.on('update', function () {\n points = sortBreakpoints(points);\n defaults = _extends({}, settings);\n });\n /**\n * Unbind resize listener:\n * - on destroying, to bring markup to its initial state\n */\n\n Events.on('destroy', function () {\n Binder.off('resize', window);\n });\n return Breakpoints;\n}\n\nvar COMPONENTS = {\n Html: Html,\n Translate: Translate,\n Transition: Transition,\n Direction: Direction,\n Peek: Peek,\n Sizes: Sizes,\n Gaps: Gaps,\n Move: Move,\n Clones: Clones,\n Resize: Resize,\n Build: Build,\n Run: Run\n};\n\nvar Glide$1 = function (_Core) {\n inherits(Glide$$1, _Core);\n\n function Glide$$1() {\n classCallCheck(this, Glide$$1);\n return possibleConstructorReturn(this, (Glide$$1.__proto__ || Object.getPrototypeOf(Glide$$1)).apply(this, arguments));\n }\n\n createClass(Glide$$1, [{\n key: 'mount',\n value: function mount() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return get(Glide$$1.prototype.__proto__ || Object.getPrototypeOf(Glide$$1.prototype), 'mount', this).call(this, _extends({}, COMPONENTS, extensions));\n }\n }]);\n return Glide$$1;\n}(Glide);\n\n/* harmony default export */ const glide_modular_esm = (Glide$1);\n\n;// CONCATENATED MODULE: ./src/ad/desktop/desktop.js\n/* provided dependency */ var desktop_createVidoElement = __webpack_require__(557)[\"default\"];\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction desktop_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction desktop_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction desktop_createClass(Constructor, protoProps, staticProps) { if (protoProps) desktop_defineProperties(Constructor.prototype, protoProps); if (staticProps) desktop_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n // Carousel\n\n\n\nvar CreativeDesktop = /*#__PURE__*/function () {\n function CreativeDesktop(vpaid, adContainer) {\n desktop_classCallCheck(this, CreativeDesktop);\n\n this.vpaid = vpaid;\n this.slot = vpaid.slot_;\n this.videoSlot = this.vpaid.videoSlot_;\n this.container = adContainer;\n this.params = this.vpaid.parameters_;\n this.img = this.params.imgBaseRoute; // this.video = this.params.videoBaseRoute\n\n this.state = {\n carousel: null,\n currentSlideIndex: 0\n }; // Load styles\n\n this.vpaid.iDoc.head.appendChild(createFontFaces(this.params.fonts));\n this.vpaid.iDoc.head.appendChild(desktop_createVidoElement(\"style\", null, desktop/* default.toString */.Z.toString())); // Load content\n\n this.container.appendChild(this.carousel('main'));\n this.initGlideCarousel('main');\n }\n\n desktop_createClass(CreativeDesktop, [{\n key: \"handleCTA\",\n value: function handleCTA(e, linkName) {\n // Call the click ad event on CTA redirection, important!\n this.vpaid.clickAd_();\n var link = this.params.cta[linkName];\n return window.open(link, '_blank'); // // Call the click ad event on CTA redirection, important!\n // this.vpaid.clickAd_()\n // // const link = this.params.cta[linkName]\n // return window.open(link, '_blank')\n } // createVideoCopy(el, videoName) {\n // \t// Create a\t copy of it\n // \tconst clone = el.cloneNode(true)\n // \tclone.src = `${this.video}/${videoName}.mp4`\n // \tclone.style.setProperty('display', 'block', 'important')\n // \t// clone.pause()\n // \tclone.classList.remove('vpaid-video')\n // \tthis.state.videos.push(clone)\n // \treturn clone\n // }\n\n }, {\n key: \"carousel\",\n value: function carousel(id) {\n var _this = this;\n\n return desktop_createVidoElement(\"div\", {\n id: \"carousel-\".concat(id),\n \"class\": \"carousel-container\"\n }, desktop_createVidoElement(\"div\", {\n \"class\": \"glide__track\",\n \"data-glide-el\": \"track\"\n }, desktop_createVidoElement(\"ul\", {\n \"class\": \"glide__slides\"\n }, desktop_createVidoElement(\"li\", {\n \"class\": \"glide__slide slide-1\",\n onClick: function onClick(e) {\n return _this.handleCTA(e, 'slide-1');\n }\n }, desktop_createVidoElement(\"img\", {\n src: \"\".concat(this.img, \"/slides/P1-resized-min.png\"),\n alt: \"Slide one\"\n })), desktop_createVidoElement(\"li\", {\n \"class\": \"glide__slide slide-2\",\n onClick: function onClick(e) {\n return _this.handleCTA(e, 'slide-2');\n }\n }, desktop_createVidoElement(\"img\", {\n src: \"\".concat(this.img, \"/slides/P2-resized-min.png\"),\n alt: \"Slide two\"\n })), desktop_createVidoElement(\"li\", {\n \"class\": \"glide__slide slide-3\",\n onClick: function onClick(e) {\n return _this.handleCTA(e, 'slide-3');\n }\n }, desktop_createVidoElement(\"img\", {\n src: \"\".concat(this.img, \"/slides/P3-resized-min.png\"),\n alt: \"Slide three\"\n })), desktop_createVidoElement(\"li\", {\n \"class\": \"glide__slide slide-4\",\n onClick: function onClick(e) {\n return _this.handleCTA(e, 'slide-4');\n }\n }, desktop_createVidoElement(\"img\", {\n src: \"\".concat(this.img, \"/slides/P4-resized-min.png\"),\n alt: \"Slide four\"\n })))), desktop_createVidoElement(\"div\", {\n \"class\": \"dots\"\n }, desktop_createVidoElement(\"div\", {\n onClick: function onClick(e) {\n return _this.handleGoToSlide(e, 0);\n }\n }, desktop_createVidoElement(\"button\", {\n type: \"button\",\n \"class\": \"dot active\"\n })), desktop_createVidoElement(\"div\", {\n onClick: function onClick(e) {\n return _this.handleGoToSlide(e, 1);\n }\n }, desktop_createVidoElement(\"button\", {\n type: \"button\",\n \"class\": \"dot\"\n })), desktop_createVidoElement(\"div\", {\n onClick: function onClick(e) {\n return _this.handleGoToSlide(e, 2);\n }\n }, desktop_createVidoElement(\"button\", {\n type: \"button\",\n \"class\": \"dot\"\n })), desktop_createVidoElement(\"div\", {\n onClick: function onClick(e) {\n return _this.handleGoToSlide(e, 3);\n }\n }, desktop_createVidoElement(\"button\", {\n type: \"button\",\n \"class\": \"dot\"\n }))), desktop_createVidoElement(\"div\", {\n \"class\": \"content\"\n }, desktop_createVidoElement(\"img\", {\n \"class\": \"logo\",\n src: \"\".concat(this.params.imgLogo),\n alt: \"CTA\"\n }), desktop_createVidoElement(\"img\", {\n \"class\": \"cta\",\n src: \"\".concat(this.params.imgCta),\n onClick: function onClick(e) {\n return _this.handleCTA(e, 'slide-1');\n },\n alt: \"CTA\"\n })));\n }\n }, {\n key: \"handleGoToSlide\",\n value: function handleGoToSlide(e, goTo) {\n var selectedDot = e.target.firstChild;\n this.state.carousel.go(\"=\".concat(goTo));\n\n var dots = _toConsumableArray(this.container.querySelectorAll('.dot'));\n\n dots.forEach(function (d) {\n return d.classList.remove('active');\n });\n selectedDot.classList.add('active');\n }\n }, {\n key: \"initGlideCarousel\",\n value: function initGlideCarousel(id) {\n var _this2 = this;\n\n var carouselContainer = this.container.querySelector(\"#carousel-\".concat(id));\n var config = {\n type: 'carousel',\n focusAt: 'center',\n perView: 1 // infinite: false\n // startAt: 1,\n // animationDuration: 600,\n // rewindDuration: 0,\n // gap: 0\n // autoplay: 5000\n // peek: {\n // \tbefore: 0,\n // \tafter: 50\n // }\n\n };\n var glide = new glide_modular_esm(carouselContainer, config); // Play first video after glide is mounted\n\n glide.on(['mount.after'], function () {\n if (!_this2.state.carousel) {\n _this2.state.carousel = glide;\n } // const video = this.state.videos[glide.index]\n // this.state.videos.forEach((video) => {\n // \t// Autoplay after video is finished\n // \tif (!video.getAttribute('ended-listener')) {\n // \t\tvideo.setAttribute('ended-listener', true)\n // \t\tvideo.addEventListener('ended', () => {\n // \t\t\tsetTimeout(() => {\n // \t\t\t\tglide.go('>')\n // \t\t\t}, 1000)\n // \t\t})\n // \t}\n // })\n\n });\n glide.on(['run'], function () {// const video = this.state.videos[glide.index]\n // video.play()\n // // Pause other videos\n // setTimeout(() => {\n // \tthis.state.videos.forEach((video, i) => {\n // \t\tif (glide.index !== i) {\n // \t\t\tvideo.pause()\n // \t\t\tvideo.currentTime = 0\n // \t\t}\n // \t})\n // }, 500)\n });\n glide.mount({\n Controls: controls,\n Breakpoints: breakpoints,\n Swipe: swipe\n /*Autoplay*/\n\n }); // // Add click EL on all carousel slides (including copies)\n // const arr = [...this.container.querySelectorAll('.glide__slide')]\n // arr.forEach((el) => el.addEventListener('click', (e) => this.handleCarouselItemClick(e)))\n }\n }]);\n\n return CreativeDesktop;\n}();\n\n\n;// CONCATENATED MODULE: ./src/index.js\n\n // Wiper\n// import CreativeDesktop from './ad/wiper/wiper.js'\n\n/* harmony default export */ function src() {\n return new VpaidVideoPlayer(CreativeDesktop);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvbGliL2hlbHBlcnMuanM/N2I0OCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvdnBhaWQuanM/ODQ3MSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvbGliL2dsaWRlL2dsaWRlLm1vZHVsYXIuZXNtLmpzP2MyN2MiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2FkL2Rlc2t0b3AvZGVza3RvcC5qcz8zZTYyIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pbmRleC5qcz9iNjM1Il0sIm5hbWVzIjpbImRlZmF1bHRUaW1lVXBkYXRlSGFuZGxlciIsInZwYWlkIiwiaW50Iiwic2V0SW50ZXJ2YWwiLCJhdHRyaWJ1dGVzXyIsInRpbWVyIiwidG90YWxBZER1cmF0aW9uIiwicXVhcnRpbGVFdmVudHNfIiwiZm9yRWFjaCIsImV2ZW50IiwibmV4dFF1YXJ0aWxlSW5kZXhfIiwibGVuZ3RoIiwicGVyY2VudFBsYXllZCIsInZhbHVlIiwiZXZlbnROYW1lIiwiY2FsbEV2ZW50XyIsImNsZWFySW50ZXJ2YWwiLCJzdG9wQWQiLCJoaWRlQ29udHJvbEJ1dHRvbnMiLCJzbG90IiwiY29udGFpbmVyIiwicGFyZW50RWxlbWVudCIsImZpcnN0Q2hpbGQiLCJuZXh0U2libGluZyIsInN0eWxlIiwib3BhY2l0eSIsImRpc3BsYXkiLCJ2aXNpYmlsaXR5Iiwic2V0VGltZW91dCIsInRvZ2dsZVBsYXllckNvbnRyb2xCdXR0b25zVmlzaWJpbGl0eSIsImlzVmlzaWJsZSIsImFkanVzdFNjYWxlIiwic2xvdF8iLCJwYXJhbWV0ZXJzXyIsImluaXRpYWxXaWR0aCIsIndpZHRoIiwiaW5pdGlhbEhlaWdodCIsImhlaWdodCIsInNsb3RQYXJlbnQiLCJzbG90R3JhbmRQYXJlbnQiLCJzZXRQcm9wZXJ0eSIsInNsb3RHcmFucGFyZW50U3R5bGVzIiwidG9wIiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImN1cnJlbnRXaWR0aCIsImNsaWVudFdpZHRoIiwicGFyc2VGbG9hdCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Iiwic2NhbGUiLCJhc3BlY3RSYXRpbyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIngiLCJjcmVhdGVGb250RmFjZXMiLCJmb250cyIsImZvcm1hdE1hcCIsInR0ZiIsIm90ZiIsIndvZmYiLCJ3b2ZmMiIsImZvbnRGYWNlcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJmb250TmFtZSIsImV4dCIsInNwbGl0IiwicG9wIiwiZm9ybWF0Iiwid2VpZ2h0IiwidG9Mb3dlckNhc2UiLCJmYW1pbHkiLCJqb2luIiwiVnBhaWRWaWRlb1BsYXllciIsImNyZWF0aXZlIiwidmlkZW9TbG90XyIsImV2ZW50c0NhbGxiYWNrc18iLCJjb21wYW5pb25zIiwiZGVzaXJlZEJpdHJhdGUiLCJkdXJhdGlvbiIsImV4cGFuZGVkIiwiaWNvbnMiLCJsaW5lYXIiLCJyZW1haW5pbmdUaW1lIiwic2tpcHBhYmxlU3RhdGUiLCJ2aWV3TW9kZSIsInZvbHVtZSIsImluaXRpYWxVbm11dGUiLCJhZCIsInZlcnNpb24iLCJjcmVhdGl2ZURhdGEiLCJlbnZpcm9ubWVudFZhcnMiLCJKU09OIiwicGFyc2UiLCJ2aWRlb1Nsb3QiLCJsb2ciLCJhZGRFdmVudExpc3RlbmVyIiwic2V0UmVhY3RpdmVBdHRyaWJ1dGVzIiwidXBkYXRlVmlkZW9TbG90XyIsImxvYWRlZE1ldGFkYXRhXyIsImJpbmQiLCJ0aW1lVXBkYXRlSGFuZGxlcl8iLCJvcHRpb25zIiwiYWRDb250YWluZXIiLCJzZXRBdHRyaWJ1dGUiLCJmaXJzdENsaWNrVW5tdXRlIiwic2V0dXBVbm11dGUiLCJsb29wIiwic3JjIiwib25JZnJhbWVMb2FkIiwiZSIsImZyYW1lIiwidGFyZ2V0IiwiY29udGVudFdpbmRvdyIsImRvY3VtZW50IiwiYm9keSIsIm92ZXJmbG93IiwiX2ZyYW1lIiwibWFyZ2luIiwicGFkZGluZyIsImlEb2MiLCJxdWVyeVNlbGVjdG9yIiwiYXBwZW5kQ2hpbGQiLCJwb3NpdGlvbiIsImxlZnQiLCJ0cmFuc2l0aW9uIiwiekluZGV4IiwiaXNWaWRlb1NtYWxsIiwibWFrZVNtYWxsVmlkZW8iLCJvbnRpbWV1cGRhdGUiLCJjdXJyZW50VGltZSIsImJvcmRlciIsImFzc2lnbiIsInNyY2RvYyIsIm91dGVySFRNTCIsIm9ubG9hZCIsInByb2Nlc3MiLCJsYXN0UXVhcnRpbGVFdmVudCIsImNhbGxiYWNrIiwidXBkYXRlVmlkZW9QbGF5ZXJTaXplXyIsInBhdXNlIiwicGxheSIsImFDYWxsYmFjayIsImFDb250ZXh0IiwiY2FsbEJhY2siLCJldmVudHNDYWxsYmFja3MiLCJBZFJlYWR5IiwiQWRMb2FkZWQiLCJBZFN0YXJ0ZWQiLCJBZFZpZGVvU3RhcnQiLCJBZEltcHJlc3Npb24iLCJBZENsaWNrVGhydSIsIkFkRHVyYXRpb25DaGFuZ2UiLCJBZEVycm9yIiwiQWRFeHBhbmRlZENoYW5nZSIsInN1YnNjcmliZSIsInN0YXRlIiwidmlkZW9zIiwidiIsIm11dGVkIiwiZXZlbnRUeXBlIiwiUHJveHkiLCJzZXQiLCJrZXkiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRpc3BhdGNoRXZlbnQiLCJnZXQiLCJwcm9wIiwicmVjZWl2ZXIiLCJ1bm11dGVWaWRlbyIsInNldEFkVm9sdW1lIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRlZmF1bHRzIiwidHlwZSIsInN0YXJ0QXQiLCJwZXJWaWV3IiwiZm9jdXNBdCIsImdhcCIsImF1dG9wbGF5IiwiaG92ZXJwYXVzZSIsImtleWJvYXJkIiwiYm91bmQiLCJzd2lwZVRocmVzaG9sZCIsImRyYWdUaHJlc2hvbGQiLCJwZXJUb3VjaCIsInRvdWNoUmF0aW8iLCJ0b3VjaEFuZ2xlIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJyZXdpbmQiLCJyZXdpbmREdXJhdGlvbiIsImFuaW1hdGlvblRpbWluZ0Z1bmMiLCJ0aHJvdHRsZSIsImRpcmVjdGlvbiIsInBlZWsiLCJicmVha3BvaW50cyIsImNsYXNzZXMiLCJsdHIiLCJydGwiLCJzbGlkZXIiLCJjYXJvdXNlbCIsInN3aXBlYWJsZSIsImRyYWdnaW5nIiwiY2xvbmVTbGlkZSIsImFjdGl2ZU5hdiIsImFjdGl2ZVNsaWRlIiwiZGlzYWJsZWRBcnJvdyIsIndhcm4iLCJtc2ciLCJjb25zb2xlIiwiZXJyb3IiLCJfdHlwZW9mIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJvYmoiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsImNsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsImNyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiaSIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJkZWZpbmVQcm9wZXJ0eSIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl9leHRlbmRzIiwiYXJndW1lbnRzIiwic291cmNlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwib2JqZWN0IiwicHJvcGVydHkiLCJGdW5jdGlvbiIsImRlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1bmRlZmluZWQiLCJwYXJlbnQiLCJnZXRQcm90b3R5cGVPZiIsImdldHRlciIsImluaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwidG9JbnQiLCJwYXJzZUludCIsInRvRmxvYXQiLCJpc1N0cmluZyIsImlzT2JqZWN0IiwiaXNOdW1iZXIiLCJpc0Z1bmN0aW9uIiwiaXNVbmRlZmluZWQiLCJpc0FycmF5IiwiQXJyYXkiLCJtb3VudCIsImdsaWRlIiwiZXh0ZW5zaW9ucyIsImV2ZW50cyIsImNvbXBvbmVudHMiLCJuYW1lIiwiX25hbWUiLCJkZWZpbmUiLCJkZWZpbml0aW9uIiwic29ydEtleXMiLCJzb3J0IiwicmVkdWNlIiwiciIsImsiLCJtZXJnZU9wdGlvbnMiLCJzZXR0aW5ncyIsIkV2ZW50c0J1cyIsImhvcCIsIm9uIiwiaGFuZGxlciIsImluZGV4IiwicHVzaCIsInJlbW92ZSIsImVtaXQiLCJjb250ZXh0IiwiaXRlbSIsIkdsaWRlIiwic2VsZWN0b3IiLCJfYyIsIl90IiwiX2UiLCJkaXNhYmxlZCIsIm1vdW50JCQxIiwibXV0YXRlIiwidHJhbnNmb3JtZXJzIiwidXBkYXRlIiwiZ28iLCJwYXR0ZXJuIiwiUnVuIiwibWFrZSIsIm1vdmUiLCJkaXN0YW5jZSIsIlRyYW5zaXRpb24iLCJkaXNhYmxlIiwiTW92ZSIsImRlc3Ryb3kiLCJpbnRlcnZhbCIsImVuYWJsZSIsImlzVHlwZSIsImdldCQkMSIsIl9vIiwic2V0JCQxIiwibyIsIl9pIiwiX2QiLCJzdGF0dXMiLCJDb21wb25lbnRzIiwiRXZlbnRzIiwiX3RoaXMiLCJjYWxjdWxhdGUiLCJhZnRlciIsImlzU3RhcnQiLCJpc0VuZCIsImlzT2Zmc2V0Iiwic3RlcHMiLCJjb3VudGFibGVTdGVwcyIsIk1hdGgiLCJtaW4iLCJfbSIsInN0ZXAiLCJzdWJzdHIiLCJIdG1sIiwic2xpZGVzIiwibm93IiwiRGF0ZSIsImdldFRpbWUiLCJmdW5jIiwid2FpdCIsInRpbWVvdXQiLCJhcmdzIiwicmVzdWx0IiwicHJldmlvdXMiLCJsYXRlciIsImxlYWRpbmciLCJhcHBseSIsInRocm90dGxlZCIsImF0IiwicmVtYWluaW5nIiwiY2xlYXJUaW1lb3V0IiwidHJhaWxpbmciLCJjYW5jZWwiLCJNQVJHSU5fVFlQRSIsIkdhcHMiLCJsZW4iLCJEaXJlY3Rpb24iLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJTaXplcyIsIndyYXBwZXIiLCJjaGlsZHJlbiIsInNpYmxpbmdzIiwibm9kZSIsInBhcmVudE5vZGUiLCJuIiwibWF0Y2hlZCIsIm5vZGVUeXBlIiwiZXhpc3QiLCJIVE1MRWxlbWVudCIsIlRSQUNLX1NFTEVDVE9SIiwicm9vdCIsInRyYWNrIiwic2xpY2UiLCJmaWx0ZXIiLCJzbGlkZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiX3IiLCJ0IiwiUGVlayIsIl92IiwiYmVmb3JlIiwib2Zmc2V0IiwibW92ZW1lbnQiLCJzbGlkZVdpZHRoIiwidHJhbnNsYXRlIiwiaXMiLCJzZXR1cFNsaWRlcyIsInNldHVwV3JhcHBlciIsImRpbWVudGlvbiIsIndyYXBwZXJTaXplIiwib2Zmc2V0V2lkdGgiLCJncm93IiwiQ2xvbmVzIiwicmVkdWN0b3IiLCJCdWlsZCIsInR5cGVDbGFzcyIsImFjdGl2ZUNsYXNzIiwiYWRkIiwic2libGluZyIsInJlbW92ZUNsYXNzZXMiLCJpdGVtcyIsImNvbGxlY3QiLCJfR2xpZGUkc2V0dGluZ3MiLCJwZWVrSW5jcmVtZW50ZXIiLCJwYXJ0Iiwic3RhcnQiLCJlbmQiLCJtYXgiLCJmbG9vciIsImNsb25lIiwiY2xvbmVOb2RlIiwiX2Nsb25lIiwidW5zaGlmdCIsImFwcGVuZCIsIl9Db21wb25lbnRzJEh0bWwiLCJoYWxmIiwicHJlcGVuZCIsInJldmVyc2UiLCJfaTIiLCJpbnNlcnRCZWZvcmUiLCJfaTMiLCJyZW1vdmVDaGlsZCIsIkV2ZW50c0JpbmRlciIsImxpc3RlbmVycyIsImVsIiwiY2xvc3VyZSIsImNhcHR1cmUiLCJvZmYiLCJSZXNpemUiLCJCaW5kZXIiLCJ1bmJpbmQiLCJWQUxJRF9ESVJFQ1RJT05TIiwiRkxJUEVEX01PVkVNRU5UUyIsInJlc29sdmUiLCJ0b2tlbiIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJpbmRleE9mIiwiUnRsIiwibW9kaWZ5IiwiR2FwIiwiR3JvdyIsIlBlZWtpbmciLCJGb2N1c2luZyIsIm11dGF0b3IiLCJUUkFOU0ZPUk1FUlMiLCJjb25jYXQiLCJ0cmFuc2Zvcm1lciIsIlRyYW5zbGF0ZSIsInRyYW5zZm9ybSIsImNvbXBvc2UiLCJzdXBwb3J0c1Bhc3NpdmUiLCJvcHRzIiwic3VwcG9ydHNQYXNzaXZlJDEiLCJTVEFSVF9FVkVOVFMiLCJNT1ZFX0VWRU5UUyIsIkVORF9FVkVOVFMiLCJNT1VTRV9FVkVOVFMiLCJzd2lwZSIsInN3aXBlU2luIiwic3dpcGVTdGFydFgiLCJzd2lwZVN0YXJ0WSIsInBhc3NpdmUiLCJTd2lwZSIsImJpbmRTd2lwZVN0YXJ0IiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJiaW5kU3dpcGVNb3ZlIiwiYmluZFN3aXBlRW5kIiwic3ViRXhTeCIsInN1YkV5U3kiLCJwb3dFWCIsImFicyIsInBvd0VZIiwic3dpcGVIeXBvdGVudXNlIiwic3FydCIsInN3aXBlQ2F0aGV0dXMiLCJhc2luIiwiUEkiLCJzdG9wUHJvcGFnYXRpb24iLCJ0aHJlc2hvbGQiLCJzd2lwZURpc3RhbmNlIiwic3dpcGVEZWciLCJyb3VuZCIsInVuYmluZFN3aXBlTW92ZSIsInVuYmluZFN3aXBlRW5kIiwidW5iaW5kU3dpcGVTdGFydCIsIl90aGlzMiIsIl90aGlzMyIsImNoYW5nZWRUb3VjaGVzIiwiaW1hZ2VzIiwiSW1hZ2VzIiwiZHJhZ3N0YXJ0IiwicHJldmVudERlZmF1bHQiLCJhbmNob3JzIiwiZGV0YWNoZWQiLCJwcmV2ZW50ZWQiLCJBbmNob3JzIiwiX2EiLCJxdWVyeVNlbGVjdG9yQWxsIiwiY2xpY2siLCJkZXRhY2giLCJkcmFnZ2FibGUiLCJnZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJhdHRhY2giLCJOQVZfU0VMRUNUT1IiLCJDT05UUk9MU19TRUxFQ1RPUiIsImNvbnRyb2xzIiwiQ29udHJvbHMiLCJfbiIsImFkZEJpbmRpbmdzIiwic2V0QWN0aXZlIiwicmVtb3ZlQWN0aXZlIiwicmVtb3ZlQmluZGluZ3MiLCJlbGVtZW50cyIsImN1cnJlbnRUYXJnZXQiLCJLZXlib2FyZCIsInByZXNzIiwia2V5Q29kZSIsIkF1dG9wbGF5Iiwic3RvcCIsInRpbWUiLCJzb3J0QnJlYWtwb2ludHMiLCJwb2ludHMiLCJCcmVha3BvaW50cyIsIm1hdGNoIiwibWF0Y2hNZWRpYSIsInBvaW50IiwibWF0Y2hlcyIsIkNPTVBPTkVOVFMiLCJHbGlkZSQxIiwiX0NvcmUiLCJHbGlkZSQkMSIsIkNyZWF0aXZlRGVza3RvcCIsInBhcmFtcyIsImltZyIsImltZ0Jhc2VSb3V0ZSIsImN1cnJlbnRTbGlkZUluZGV4IiwiaGVhZCIsInNjc3MiLCJpbml0R2xpZGVDYXJvdXNlbCIsImxpbmtOYW1lIiwiY2xpY2tBZF8iLCJsaW5rIiwiY3RhIiwib3BlbiIsImlkIiwiaGFuZGxlQ1RBIiwiaGFuZGxlR29Ub1NsaWRlIiwiaW1nTG9nbyIsImltZ0N0YSIsImdvVG8iLCJzZWxlY3RlZERvdCIsImRvdHMiLCJkIiwiY2Fyb3VzZWxDb250YWluZXIiLCJjb25maWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQU8sSUFBTUEsd0JBQXdCLEdBQUcsU0FBM0JBLHdCQUEyQixDQUFDQyxLQUFELEVBQVc7QUFDbEQsTUFBTUMsSUFBRyxHQUFHQyxXQUFXLENBQUMsWUFBTTtBQUM3QixRQUFJRixLQUFLLENBQUNHLFdBQU4sQ0FBa0JDLEtBQWxCLEdBQTBCSixLQUFLLENBQUNHLFdBQU4sQ0FBa0JFLGVBQWhELEVBQWlFO0FBQ2hFTCxXQUFLLENBQUNHLFdBQU4sQ0FBa0JDLEtBQWxCLElBQTJCLENBQTNCO0FBQ0FKLFdBQUssQ0FBQ00sZUFBTixDQUFzQkMsT0FBdEIsQ0FBOEIsVUFBQ0MsS0FBRCxFQUFXO0FBQ3hDLFlBQUlSLEtBQUssQ0FBQ1Msa0JBQU4sSUFBNEJULEtBQUssQ0FBQ00sZUFBTixDQUFzQkksTUFBdEQsRUFBOEQ7QUFFOUQsWUFBTUMsYUFBYSxHQUFJWCxLQUFLLENBQUNHLFdBQU4sQ0FBa0JDLEtBQWxCLEdBQTBCLEtBQTNCLEdBQW9DSixLQUFLLENBQUNHLFdBQU4sQ0FBa0JFLGVBQTVFOztBQUVBLFlBQUlNLGFBQWEsSUFBSVgsS0FBSyxDQUFDTSxlQUFOLENBQXNCTixLQUFLLENBQUNTLGtCQUE1QixFQUFnREcsS0FBckUsRUFBNEU7QUFDM0UsY0FBTUMsU0FBUyxHQUFHYixLQUFLLENBQUNNLGVBQU4sQ0FBc0JOLEtBQUssQ0FBQ1Msa0JBQTVCLEVBQWdERCxLQUFsRTtBQUNBUixlQUFL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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBYmMsT0FBZjtBQWVBLFVBQU0wRixLQUFLLEdBQUcsSUFBSXlCLGlCQUFKLENBQVUrUSxpQkFBVixFQUE2QkMsTUFBN0IsQ0FBZCxDQWpCcUIsQ0FrQnJCOztBQUNBelMsV0FBSyxDQUFDaUIsRUFBTixDQUFTLENBQUMsYUFBRCxDQUFULEVBQTBCLFlBQU07QUFDL0IsWUFBSSxDQUFDLE1BQUksQ0FBQy9ILEtBQUwsQ0FBVzRDLFFBQWhCLEVBQTBCO0FBQ3pCLGdCQUFJLENBQUM1QyxLQUFMLENBQVc0QyxRQUFYLEdBQXNCa0UsS0FBdEI7QUFDQSxTQUg4QixDQUsvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FqQkQ7QUFtQkFBLFdBQUssQ0FBQ2lCLEVBQU4sQ0FBUyxDQUFDLEtBQUQsQ0FBVCxFQUFrQixZQUFNLENBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVpEO0FBY0FqQixXQUFLLENBQUNELEtBQU4sQ0FBWTtBQUFFMFAsZ0JBQVEsRUFBUkEsUUFBRjtBQUFZZ0IsbUJBQVcsRUFBWEEsV0FBWjtBQUF5Qi9ELGFBQUssRUFBTEEsS0FBS0E7QUFBQzs7QUFBL0IsT0FBWixFQXBEcUIsQ0FzRHJCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQ3pLRjtDQUVBO0FBQ0E7O0FBRUEsNkJBQWUsU0FBUyxNQUFHO0FBQzFCLFNBQU8sSUFBSTNZLGdCQUFKLENBQXFCbWQsZUFBckIsQ0FBUDtBQUNBIiwiZmlsZSI6Ijk2OS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBkZWZhdWx0VGltZVVwZGF0ZUhhbmRsZXIgPSAodnBhaWQpID0+IHtcblx0Y29uc3QgaW50ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdGlmICh2cGFpZC5hdHRyaWJ1dGVzXy50aW1lciA8IHZwYWlkLmF0dHJpYnV0ZXNfLnRvdGFsQWREdXJhdGlvbikge1xuXHRcdFx0dnBhaWQuYXR0cmlidXRlc18udGltZXIgKz0gMVxuXHRcdFx0dnBhaWQucXVhcnRpbGVFdmVudHNfLmZvckVhY2goKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICh2cGFpZC5uZXh0UXVhcnRpbGVJbmRleF8gPj0gdnBhaWQucXVhcnRpbGVFdmVudHNfLmxlbmd0aCkgcmV0dXJuXG5cblx0XHRcdFx0Y29uc3QgcGVyY2VudFBsYXllZCA9ICh2cGFpZC5hdHRyaWJ1dGVzXy50aW1lciAqIDEwMC4wKSAvIHZwYWlkLmF0dHJpYnV0ZXNfLnRvdGFsQWREdXJhdGlvblxuXG5cdFx0XHRcdGlmIChwZXJjZW50UGxheWVkID49IHZwYWlkLnF1YXJ0aWxlRXZlbnRzX1t2cGFpZC5uZXh0UXVhcnRpbGVJbmRleF9dLnZhbHVlKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXZlbnROYW1lID0gdnBhaWQucXVhcnRpbGVFdmVudHNfW3ZwYWlkLm5leHRRdWFydGlsZUluZGV4X10uZXZlbnRcblx0XHRcdFx0XHR2cGFpZC5jYWxsRXZlbnRfKGV2ZW50TmFtZSlcblx0XHRcdFx0XHR2cGFpZC5uZXh0UXVhcnRpbGVJbmRleF8gKz0gMVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjbGVhckludGVydmFsKGludClcblx0XHRcdHZwYWlkLnN0b3BBZCgpXG5cdFx0XHQvLyBUT0RPOiBDaGVjayB3aXRoIEVyaWMgaWYgd2UgbmVlZCB0byBjYWxsIEFkVmlkZW9Db21wbGV0ZSBldmVudCwgb3Igc29tZSBvdGhlciBldmVudFxuXHRcdH1cblx0fSwgMTAwMClcbn1cblxuZXhwb3J0IGNvbnN0IGhpZGVDb250cm9sQnV0dG9ucyA9IChzbG90KSA9PiB7XG5cdGNvbnN0IGNvbnRhaW5lciA9IHNsb3QucGFyZW50RWxlbWVudFxuXHRpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5maXJzdENoaWxkICYmIGNvbnRhaW5lci5maXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG5cdFx0Y29udGFpbmVyLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmcuc3R5bGUub3BhY2l0eSA9ICcwJ1xuXHRcdGNvbnRhaW5lci5maXJzdENoaWxkLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcblx0XHRjb250YWluZXIuZmlyc3RDaGlsZC5uZXh0U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcblx0fSBlbHNlIHtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGhpZGVDb250cm9sQnV0dG9ucyhzbG90KVxuXHRcdH0sIDUwKVxuXHR9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVQbGF5ZXJDb250cm9sQnV0dG9uc1Zpc2liaWxpdHkgPSAoaXNWaXNpYmxlLCBzbG90KSA9PiB7XG5cdGlmIChpc1Zpc2libGUpIHtcblx0XHRpZiAoc2xvdC5uZXh0U2libGluZyAmJiBzbG90Lm5leHRTaWJsaW5nLnN0eWxlKSB7XG5cdFx0XHRzbG90Lm5leHRTaWJsaW5nLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSdcblx0XHRcdHNsb3QubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0aWYgKHNsb3QubmV4dFNpYmxpbmcgJiYgc2xvdC5uZXh0U2libGluZy5zdHlsZSkge1xuXHRcdFx0c2xvdC5uZXh0U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcblx0XHRcdHNsb3QubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0geyp9IHZwYWlkXHRcdFx0XHRcdFx0W3ZwYWlkIGVsZW1lbnRdXG4gKi9cbmV4cG9ydCBjb25zdCBhZGp1c3RTY2FsZSA9ICh2cGFpZCkgPT4ge1xuXHRjb25zdCB7IHNsb3RfLCBhdHRyaWJ1dGVzXywgcGFyYW1ldGVyc18gfSA9IHZwYWlkXG5cdGNvbnN0IHsgd2lkdGg6IGluaXRpYWxXaWR0aCwgaGVpZ2h0OiBpbml0aWFsSGVpZ2h0IH0gPSBwYXJhbWV0ZXJzX1xuXHRjb25zdCBzbG90UGFyZW50ID0gc2xvdF8ucGFyZW50RWxlbWVudFxuXHRjb25zdCBzbG90R3JhbmRQYXJlbnQgPSBzbG90Xy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnRcblxuXHRzbG90UGFyZW50LnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsIGAke2luaXRpYWxXaWR0aH1weGAsICdpbXBvcnRhbnQnKVxuXHRzbG90UGFyZW50LnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBgJHtpbml0aWFsSGVpZ2h0fXB4YCwgJ2ltcG9ydGFudCcpXG5cblx0Ly8gQlVHOiBDcmVhdGVzIGEgcHJvYmxlbSB3aXRoIHRoZSBzbGlkZXIgb24gbW9iaWxlIHNjcmVlbnMgKHNsaWRlciBpcyBiaWdnZXIgdGhhbiBpdCBzaG91bGQgYmUpXG5cdC8vIHNsb3RHcmFuZFBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwJScsICdpbXBvcnRhbnQnKTtcblx0aWYgKGF0dHJpYnV0ZXNfLndpZHRoID4gNDAwICYmIGF0dHJpYnV0ZXNfLmhlaWdodCA+IDIyNSkge1xuXHRcdHNsb3RHcmFuZFBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwJScsICdpbXBvcnRhbnQnKVxuXHR9XG5cblx0c2xvdEdyYW5kUGFyZW50LnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCBgJHtpbml0aWFsV2lkdGh9cHhgLCAnaW1wb3J0YW50Jylcblx0c2xvdEdyYW5kUGFyZW50LnN0eWxlLnNldFByb3BlcnR5KCdtYXgtaGVpZ2h0JywgYCR7aW5pdGlhbEhlaWdodH1weGAsICdpbXBvcnRhbnQnKVxuXG5cdHNsb3RfLnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsIGAke2luaXRpYWxXaWR0aH1weGAsICdpbXBvcnRhbnQnKVxuXHRzbG90Xy5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgYCR7aW5pdGlhbEhlaWdodH1weGAsICdpbXBvcnRhbnQnKVxuXG5cdGNvbnN0IHNsb3RHcmFucGFyZW50U3R5bGVzID0gdG9wLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNsb3RHcmFuZFBhcmVudClcblx0Y29uc3QgY3VycmVudFdpZHRoID0gc2xvdEdyYW5kUGFyZW50LmNsaWVudFdpZHRoIC0gcGFyc2VGbG9hdChzbG90R3JhbnBhcmVudFN0eWxlcy5wYWRkaW5nTGVmdCkgLSBwYXJzZUZsb2F0KHNsb3RHcmFucGFyZW50U3R5bGVzLnBhZGRpbmdSaWdodClcblx0bGV0IHNjYWxlID0gY3VycmVudFdpZHRoIC8gaW5pdGlhbFdpZHRoXG5cdGlmIChzY2FsZSA+IDEpIHNjYWxlID0gMVxuXHRpZiAoYXR0cmlidXRlc19bJ3NjYWxlJ10gIT09IHNjYWxlKSBhdHRyaWJ1dGVzX1snc2NhbGUnXSA9IHNjYWxlXG5cblx0c2xvdFBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtLW9yaWdpbicsICcwcHggMHB4JywgJ2ltcG9ydGFudCcpXG5cdHNsb3RQYXJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJ3RyYW5zZm9ybScsIGBzY2FsZSgke3NjYWxlfSlgKVxuXG5cdC8vIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHNsb3RHcmFuZFBhcmVudCBiZWNhdXNlIGl0IHN0YXlzIGZpeGVkXG5cdGNvbnN0IGFzcGVjdFJhdGlvID0gaW5pdGlhbFdpZHRoIC8gaW5pdGlhbEhlaWdodFxuXHRzbG90R3JhbmRQYXJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsIGAke3Nsb3RHcmFuZFBhcmVudC5jbGllbnRXaWR0aCAvIGFzcGVjdFJhdGlvfXB4YCwgJ2ltcG9ydGFudCcpXG5cblx0Ly8gQWRqdXN0IHNsaWRlciByaWdodFxuXHRpZiAoc2xvdEdyYW5kUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnggPD0gMCkge1xuXHRcdHNsb3RHcmFuZFBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgncmlnaHQnLCAnMCcsICdpbXBvcnRhbnQnKVxuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGb250RmFjZXMgPSAoZm9udHMpID0+IHtcblx0Y29uc3QgZm9ybWF0TWFwID0ge1xuXHRcdHR0ZjogJ3RydWV0eXBlJyxcblx0XHRvdGY6ICdvcGVudHlwZScsXG5cdFx0d29mZjogJ3dvZmYnLFxuXHRcdHdvZmYyOiAnd29mZjInXG5cdH1cblxuXHRjb25zdCBmb250RmFjZXMgPSBPYmplY3Qua2V5cyhmb250cykubWFwKChmb250TmFtZSkgPT4ge1xuXHRcdGNvbnN0IGV4dCA9IGZvbnRzW2ZvbnROYW1lXS5zcGxpdCgnLicpLnBvcCgpXG5cdFx0Y29uc3QgZm9ybWF0ID0gYGZvcm1hdCgnJHtmb3JtYXRNYXBbZXh0XX0nKWBcblx0XHRjb25zdCB3ZWlnaHQgPSBmb250TmFtZS5zcGxpdCgnLScpLnBvcCgpLnRvTG93ZXJDYXNlKClcblx0XHRjb25zdCBzdHlsZSA9IChmb250TmFtZS5zcGxpdCgnLScpWzJdIHx8ICdub3JtYWwnKS50b0xvd2VyQ2FzZSgpXG5cdFx0Y29uc3QgZmFtaWx5ID0gZm9udE5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKVxuXHRcdHJldHVybiBgXG5cdFx0XHRAZm9udC1mYWNlIHtcblx0XHRcdFx0Zm9udC1mYW1pbHk6ICcke2ZhbWlseX0nO1xuXHRcdFx0XHRzcmM6IHVybCgnJHtmb250c1tmb250TmFtZV19JykgJHtmb3JtYXR9O1xuXHRcdFx0XHRmb250LXN0eWxlOiAke3N0eWxlfTtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6ICR7d2VpZ2h0fTtcblx0XHRcdH1cblx0XHRgXG5cdH0pXG5cblx0cmV0dXJuIDxzdHlsZT57Zm9udEZhY2VzfTwvc3R5bGU+XG59XG4iLCJpbXBvcnQgeyBhZGp1c3RTY2FsZSwgZGVmYXVsdFRpbWVVcGRhdGVIYW5kbGVyIH0gZnJvbSAnQC9saWIvaGVscGVycydcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZwYWlkVmlkZW9QbGF5ZXIge1xuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihjcmVhdGl2ZSkge1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBzbG90IGlzIHRoZSBkaXYgZWxlbWVudCBvbiB0aGUgbWFpbiBwYWdlIHRoYXQgdGhlIGFkIGlzIHN1cHBvc2VkIHRvXG5cdFx0ICogb2NjdXB5LlxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLnNsb3RfID0gbnVsbFxuXG5cdFx0LyoqXG5cdFx0ICogQ3JlYXRpdmUgdGVtcGxhdGUgKGRlc2t0b3Agb3IgbW9iaWxlKVxuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRpdmUgPSBjcmVhdGl2ZVxuXG5cdFx0LyoqXG5cdFx0ICogVGhlIHZpZGVvIHNsb3QgaXMgdGhlIHZpZGVvIGVsZW1lbnQgdXNlZCBieSB0aGUgYWQgdG8gcmVuZGVyIHZpZGVvIGNvbnRlbnQuXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMudmlkZW9TbG90XyA9IG51bGxcblxuXHRcdC8qKlxuXHRcdCAqIEFuIG9iamVjdCBjb250YWluaW5nIGFsbCByZWdpc3RlcmVkIGV2ZW50cy4gVGhlc2UgZXZlbnRzIGFyZSBhbGxcblx0XHQgKiBjYWxsYmFja3MgZm9yIHVzZSBieSB0aGUgVlBBSUQgYWQuXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMuZXZlbnRzQ2FsbGJhY2tzXyA9IHt9XG5cblx0XHQvKipcblx0XHQgKiBBIGxpc3Qgb2YgZ2V0YWJsZSBhbmQgc2V0YWJsZSBhdHRyaWJ1dGVzLlxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLmF0dHJpYnV0ZXNfID0ge1xuXHRcdFx0Y29tcGFuaW9uczogJycsXG5cdFx0XHRkZXNpcmVkQml0cmF0ZTogMjU2LFxuXHRcdFx0ZHVyYXRpb246IDEwLFxuXHRcdFx0ZXhwYW5kZWQ6IGZhbHNlLFxuXHRcdFx0d2lkdGg6IDAsXG5cdFx0XHRoZWlnaHQ6IDAsXG5cdFx0XHRpY29uczogJycsXG5cdFx0XHRsaW5lYXI6IHRydWUsXG5cdFx0XHRyZW1haW5pbmdUaW1lOiAxMCxcblx0XHRcdHNraXBwYWJsZVN0YXRlOiBmYWxzZSxcblx0XHRcdHZpZXdNb2RlOiAnbm9ybWFsJyxcblx0XHRcdHZvbHVtZTogMS4wLFxuXHRcdFx0dGltZXI6IDAsXG5cdFx0XHR0b3RhbEFkRHVyYXRpb246IDYwLFxuXHRcdFx0aW5pdGlhbFVubXV0ZTogZmFsc2UsXG5cdFx0XHRzY2FsZTogMVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEEgc2V0IG9mIGFkIHBsYXliYWNrIGV2ZW50cyB0byBiZSByZXBvcnRlZC5cblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dGhpcy5xdWFydGlsZUV2ZW50c18gPSBbXG5cdFx0XHR7IGV2ZW50OiAnQWRJbXByZXNzaW9uJywgdmFsdWU6IDAgfSxcblx0XHRcdHsgZXZlbnQ6ICdBZFZpZGVvU3RhcnQnLCB2YWx1ZTogMCB9LFxuXHRcdFx0eyBldmVudDogJ0FkVmlkZW9GaXJzdFF1YXJ0aWxlJywgdmFsdWU6IDI1IH0sXG5cdFx0XHR7IGV2ZW50OiAnQWRWaWRlb01pZHBvaW50JywgdmFsdWU6IDUwIH0sXG5cdFx0XHR7IGV2ZW50OiAnQWRWaWRlb1RoaXJkUXVhcnRpbGUnLCB2YWx1ZTogNzUgfSxcblx0XHRcdHsgZXZlbnQ6ICdBZFZpZGVvQ29tcGxldGUnLCB2YWx1ZTogMTAwIH1cblx0XHRdXG5cblx0XHQvKipcblx0XHQgKiBAdHlwZSB7bnVtYmVyfSBBbiBpbmRleCBpbnRvIHdoYXQgcXVhcnRpbGUgd2FzIGxhc3QgcmVwb3J0ZWQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLm5leHRRdWFydGlsZUluZGV4XyA9IDBcblxuXHRcdC8qKlxuXHRcdCAqIFBhcmFtZXRlcnMgcGFzc2VkIGluIGZyb20gdGhlIEFkUGFyYW1ldGVycyBzZWN0aW9uIG9mIHRoZSBWQVNULlxuXHRcdCAqIFVzZWQgZm9yIHZpZGVvIFVSTCBhbmQgTUlNRSB0eXBlLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgeyFvYmplY3R9XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLnBhcmFtZXRlcnNfID0ge31cblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBhZCBvYmplY3Rcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dGhpcy5hZCA9IG51bGxcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgVlBBSUQgdmVyaW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRoYW5kc2hha2VWZXJzaW9uKHZlcnNpb24pIHtcblx0XHRyZXR1cm4gJzIuMCdcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhbGwgYXR0cmlidXRlcyBpbiB0aGUgYWQuIFRoZSBhZCB3aWxsIG5vdCBzdGFydCB1bnRpbCBzdGFydEFkIGlzXFxcblx0ICogY2FsbGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggVGhlIGFkIHdpZHRoLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IFRoZSBhZCBoZWlnaHQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TW9kZSBUaGUgYWQgdmlldyBtb2RlLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVzaXJlZEJpdHJhdGUgVGhlIGRlc2lyZWQgYml0cmF0ZS5cblx0ICogQHBhcmFtIHtPYmplY3R9IGNyZWF0aXZlRGF0YSBEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JlYXRpdmUuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBlbnZpcm9ubWVudFZhcnMgUnVudGltZSB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuXHQgKiAgICAgY3JlYXRpdmUgbGlrZSB0aGUgc2xvdCBhbmQgdmlkZW8gc2xvdC5cblx0ICovXG5cdGluaXRBZCh3aWR0aCwgaGVpZ2h0LCB2aWV3TW9kZSwgZGVzaXJlZEJpdHJhdGUsIGNyZWF0aXZlRGF0YSwgZW52aXJvbm1lbnRWYXJzKSB7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzX1snd2lkdGgnXSA9IHdpZHRoXG5cdFx0dGhpcy5hdHRyaWJ1dGVzX1snaGVpZ2h0J10gPSBoZWlnaHRcblx0XHR0aGlzLmF0dHJpYnV0ZXNfWyd2aWV3TW9kZSddID0gdmlld01vZGVcblx0XHR0aGlzLmF0dHJpYnV0ZXNfWydkZXNpcmVkQml0cmF0ZSddID0gZGVzaXJlZEJpdHJhdGVcblxuXHRcdC8vIHNsb3QgYW5kIHZpZGVvU2xvdCBhcmUgcGFzc2VkIGFzIHBhcnQgb2YgdGhlIGVudmlyb25tZW50VmFyc1xuXHRcdHRoaXMucGFyYW1ldGVyc18gPSBKU09OLnBhcnNlKGNyZWF0aXZlRGF0YVsnQWRQYXJhbWV0ZXJzJ10pXG5cdFx0dGhpcy5zbG90XyA9IGVudmlyb25tZW50VmFycy5zbG90XG5cdFx0dGhpcy52aWRlb1Nsb3RfID0gZW52aXJvbm1lbnRWYXJzLnZpZGVvU2xvdFxuXHRcdHRoaXMubG9nKGBpbml0QWQ6ICR7d2lkdGh9eCR7aGVpZ2h0fSwgdmlld01vZGU6ICR7dmlld01vZGV9LCBkZXNpcmVkQml0cmF0ZTogJHtkZXNpcmVkQml0cmF0ZX1gLCBgY3JlYXRpdmVEYXRhOiAke2NyZWF0aXZlRGF0YVsnQWRQYXJhbWV0ZXJzJ119YClcblx0XHR0b3Aud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IGFkanVzdFNjYWxlKHRoaXMpKVxuXG5cdFx0dGhpcy5zZXRSZWFjdGl2ZUF0dHJpYnV0ZXMoKVxuXHRcdHRoaXMudXBkYXRlVmlkZW9TbG90XygpXG5cdFx0dGhpcy52aWRlb1Nsb3RfLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy5sb2FkZWRNZXRhZGF0YV8uYmluZCh0aGlzKSwgZmFsc2UpXG5cdFx0aWYgKHRoaXMucGFyYW1ldGVyc18uZm9ybWF0ID09PSAndmlkZW8nKSB7XG5cdFx0XHR0aGlzLnZpZGVvU2xvdF8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIHRoaXMudGltZVVwZGF0ZUhhbmRsZXJfLmJpbmQodGhpcyksIGZhbHNlKVxuXHRcdFx0dGhpcy52aWRlb1Nsb3RfLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5zdG9wQWQuYmluZCh0aGlzKSwgZmFsc2UpXG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlZmF1bHRUaW1lVXBkYXRlSGFuZGxlcih0aGlzKVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIG9yIHVwZGF0ZXMgdGhlIHZpZGVvIHNsb3QgYW5kIGZpbGxzIGl0IHdpdGggYSBzdXBwb3J0ZWQgdmlkZW8uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHR1cGRhdGVWaWRlb1Nsb3RfKCkge1xuXHRcdGlmICghdGhpcy5wYXJhbWV0ZXJzXy5vcHRpb25zKSB0aGlzLnBhcmFtZXRlcnNfLm9wdGlvbnMgPSB7fVxuXHRcdGNvbnN0IGFkQ29udGFpbmVyID0gPGRpdiBjbGFzcz1cImNyZWF0aXZlLWNvbnRhaW5lclwiPjwvZGl2PlxuXG5cdFx0aWYgKHRoaXMudmlkZW9TbG90XyA9PSBudWxsKSB7XG5cdFx0XHR0aGlzLnZpZGVvU2xvdF8gPSA8dmlkZW8gY2xhc3M9XCJhZC12aWRlbyB2cGFpZC12aWRlb1wiIHdpZHRoPVwiMTAwJVwiIG11dGVkIHBsYXlzaW5saW5lPjwvdmlkZW8+XG5cdFx0XHR0aGlzLmxvZygnV2FybmluZzogTm8gdmlkZW8gZWxlbWVudCBwYXNzZWQgdG8gYWQsIGNyZWF0aW5nIGVsZW1lbnQuJylcblx0XHR9XG5cblx0XHQvLyB0aGlzLnZpZGVvU2xvdF8uc2V0QXR0cmlidXRlKCdzcmMnLCB0aGlzLnBhcmFtZXRlcnNfWyd2aWRlbyddKVxuXHRcdHRoaXMudmlkZW9TbG90Xy5zZXRBdHRyaWJ1dGUoJ211dGVkJywgJ3RydWUnKVxuXHRcdC8vIHRoaXMudmlkZW9TbG90Xy5tdXRlZCA9IHRydWVcblx0XHR0aGlzLnZpZGVvU2xvdF8uc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICd0cnVlJylcblx0XHQvLyBpZiAodGhpcy5wYXJhbWV0ZXJzXy5vcHRpb25zLmF1dG9wbGF5KSB0aGlzLnZpZGVvU2xvdF8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICd0cnVlJylcblx0XHQvLyB0aGlzLnZpZGVvU2xvdF8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICd0cnVlJylcblx0XHRpZiAodGhpcy5wYXJhbWV0ZXJzXy5vcHRpb25zLmZpcnN0Q2xpY2tVbm11dGUpIHRoaXMuc2V0dXBVbm11dGUoYWRDb250YWluZXIpXG5cdFx0aWYgKHRoaXMucGFyYW1ldGVyc18ub3B0aW9ucy5sb29wKSB7XG5cdFx0XHR0aGlzLnZpZGVvU2xvdF8uc2V0QXR0cmlidXRlKCdsb29wJywgJ3RydWUnKVxuXHRcdFx0dGhpcy52aWRlb1Nsb3RfLmxvb3AgPSB0cnVlXG5cdFx0fVxuXHRcdC8vIFZpZGVvIHNvdXJjZVxuXHRcdHRoaXMudmlkZW9TbG90Xy5zcmMgPSB0aGlzLnBhcmFtZXRlcnNfWyd2aWRlbyddXG5cblx0XHRjb25zdCBvbklmcmFtZUxvYWQgPSAoZSkgPT4ge1xuXHRcdFx0Y29uc3QgZnJhbWUgPSBlLnRhcmdldC5jb250ZW50V2luZG93LmRvY3VtZW50XG5cdFx0XHRmcmFtZS5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcblxuXHRcdFx0Ly8gQ3VzdG9tIHN0eWxlc1xuXHRcdFx0dGhpcy5fZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpbiA9ICcwJ1xuXHRcdFx0dGhpcy5fZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSAnMCdcblxuXHRcdFx0dGhpcy5pRG9jID0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudFxuXHRcdFx0Y29uc3QgY29udGFpbmVyID0gdGhpcy5pRG9jLnF1ZXJ5U2VsZWN0b3IoJy5jcmVhdGl2ZS1jb250YWluZXInKVxuXHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudmlkZW9TbG90XylcblxuXHRcdFx0dGhpcy52aWRlb1Nsb3RfLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy5sb2FkZWRNZXRhZGF0YV8uYmluZCh0aGlzKSwgZmFsc2UpXG5cdFx0XHRpZiAodGhpcy5wYXJhbWV0ZXJzXy5mb3JtYXQgPT09ICd2aWRlbycpIHtcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCB0aGlzLnRpbWVVcGRhdGVIYW5kbGVyXy5iaW5kKHRoaXMpLCBmYWxzZSlcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5zdG9wQWQuYmluZCh0aGlzKSwgZmFsc2UpXG5cblx0XHRcdFx0Ly8gSGFuZGxlIGV2ZW50cyBmb3IgXCJjYXJvdXNlbFwiIGFuZCBcImltYWdlXCIgZm9ybWF0c1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuXHRcdFx0XHR0aGlzLnZpZGVvU2xvdF8uc3R5bGUudG9wID0gJzAnXG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5zdHlsZS5sZWZ0ID0gJzAnXG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAxcydcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLndpZHRoID0gJzEwMCUnXG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5zdHlsZS5oZWlnaHQgPSAnMTAwJSdcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLnpJbmRleCA9ICcxJ1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgaXNWaWRlb1NtYWxsID0gZmFsc2VcblxuXHRcdFx0Y29uc3QgbWFrZVNtYWxsVmlkZW8gPSAoKSA9PiB7XG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLnRvcCA9ICc1MHB4J1xuXHRcdFx0XHR0aGlzLnZpZGVvU2xvdF8uc3R5bGUubGVmdCA9ICc1MHB4J1xuXHRcdFx0XHR0aGlzLnZpZGVvU2xvdF8uc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgMXMnXG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5zdHlsZS53aWR0aCA9ICc0MDBweCdcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLmhlaWdodCA9ICcyMjVweCdcblx0XHRcdFx0dGhpcy52aWRlb1Nsb3RfLnN0eWxlLnpJbmRleCA9ICcxJ1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBWaWRlbyB0cmFuc2l0aW9uXG5cdFx0XHRpZiAodGhpcy5wYXJhbWV0ZXJzXy5vcHRpb25zLm1ha2VTbWFsbFZpZGVvKSB7XG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5vbnRpbWV1cGRhdGUgPSAoZSkgPT4ge1xuXHRcdFx0XHRcdGlmICghaXNWaWRlb1NtYWxsKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy52aWRlb1Nsb3RfLmN1cnJlbnRUaW1lID49IDIpIHtcblx0XHRcdFx0XHRcdFx0aXNWaWRlb1NtYWxsID0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRtYWtlU21hbGxWaWRlbygpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFpc1ZpZGVvU21hbGwpIHtcblx0XHRcdFx0XHRcdG1ha2VTbWFsbFZpZGVvKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aXNWaWRlb1NtYWxsID0gdHJ1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmFkID0gbmV3IHRoaXMuY3JlYXRpdmUodGhpcywgY29udGFpbmVyKVxuXHRcdFx0dGhpcy5jYWxsRXZlbnRfKCdBZExvYWRlZCcpXG5cdFx0fVxuXG5cdFx0dGhpcy5fZnJhbWUgPSA8aWZyYW1lPjwvaWZyYW1lPlxuXHRcdGNvbnN0IHN0eWxlID0ge1xuXHRcdFx0d2lkdGg6ICcxMDAlJyxcblx0XHRcdGhlaWdodDogJzEwMCUnLFxuXHRcdFx0Ym9yZGVyOiAwLFxuXHRcdFx0cG9zaXRpb246ICdhYnNvbHV0ZScsXG5cdFx0XHRvdmVyZmxvdzogJ2hpZGRlbicsXG5cdFx0XHRtYXJnaW46IDAsXG5cdFx0XHRwYWRkaW5nOiAwXG5cdFx0fVxuXHRcdE9iamVjdC5hc3NpZ24odGhpcy5fZnJhbWUuc3R5bGUsIHN0eWxlKVxuXHRcdHRoaXMuX2ZyYW1lLnNyYyA9ICdhYm91dDpzZWxmJ1xuXHRcdHRoaXMuX2ZyYW1lLnNyY2RvYyA9IGFkQ29udGFpbmVyLm91dGVySFRNTFxuXHRcdHRoaXMuX2ZyYW1lLm9ubG9hZCA9IG9uSWZyYW1lTG9hZFxuXHRcdHRoaXMuc2xvdF8uYXBwZW5kQ2hpbGQodGhpcy5fZnJhbWUpXG5cblx0XHQvLyBPbmx5IGZvciBkZXZlbG9wbWVudFxuXHRcdGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuXHRcdFx0dGhpcy5zdGFydEFkKClcblx0XHRcdHRoaXMuZGV2U3VzY3JpYmUoKVxuXHRcdFx0YWRqdXN0U2NhbGUodGhpcylcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIGFkIGlzIGNsaWNrZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjbGlja0FkXygpIHtcblx0XHR0aGlzLmxvZygnY2xpY2tBZF8nKVxuXHRcdHRoaXMubG9nKCdBZENsaWNrVGhydScpXG5cblx0XHQvLyB0aGlzLmNhbGxFdmVudF8oJ0FkQ2xpY2tUaHJ1JywgJycsJzAnLCB0cnVlKVxuXHRcdGlmICgnQWRDbGlja1RocnUnIGluIHRoaXMuZXZlbnRzQ2FsbGJhY2tzXykge1xuXHRcdFx0dGhpcy5ldmVudHNDYWxsYmFja3NfWydBZENsaWNrVGhydSddKCcnLCAnMCcsIHRydWUpXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCBieSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuIHZpZGVvIG1ldGFkYXRhIGlzIGxvYWRlZC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGxvYWRlZE1ldGFkYXRhXygpIHtcblx0XHQvLyBUaGUgYWQgZHVyYXRpb24gaXMgbm90IGtub3duIHVudGlsIHRoZSBtZWRpYSBtZXRhZGF0YSBpcyBsb2FkZWQuXG5cdFx0Ly8gVGhlbiwgdXBkYXRlIHRoZSBwbGF5ZXIgd2l0aCB0aGUgZHVyYXRpb24gY2hhbmdlLlxuXHRcdHRoaXMuYXR0cmlidXRlc19bJ2R1cmF0aW9uJ10gPSB0aGlzLnZpZGVvU2xvdF8uZHVyYXRpb25cblx0XHR0aGlzLmNhbGxFdmVudF8oJ0FkRHVyYXRpb25DaGFuZ2UnKVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCBieSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuIHRoZSB2aWRlbyByZWFjaGVzIHNwZWNpZmljIHBvaW50cyBkdXJpbmdcblx0ICogcGxheWJhY2suXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHR0aW1lVXBkYXRlSGFuZGxlcl8oKSB7XG5cdFx0aWYgKHRoaXMubmV4dFF1YXJ0aWxlSW5kZXhfID49IHRoaXMucXVhcnRpbGVFdmVudHNfLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXHRcdGNvbnN0IHBlcmNlbnRQbGF5ZWQgPSAodGhpcy52aWRlb1Nsb3RfLmN1cnJlbnRUaW1lICogMTAwLjApIC8gdGhpcy52aWRlb1Nsb3RfLmR1cmF0aW9uXG5cblx0XHRpZiAocGVyY2VudFBsYXllZCA+PSB0aGlzLnF1YXJ0aWxlRXZlbnRzX1t0aGlzLm5leHRRdWFydGlsZUluZGV4X10udmFsdWUpIHtcblx0XHRcdHZhciBsYXN0UXVhcnRpbGVFdmVudCA9IHRoaXMucXVhcnRpbGVFdmVudHNfW3RoaXMubmV4dFF1YXJ0aWxlSW5kZXhfXS5ldmVudFxuXHRcdFx0aWYgKHRoaXMuZXZlbnRzQ2FsbGJhY2tzX1tsYXN0UXVhcnRpbGVFdmVudF0pIHtcblx0XHRcdFx0dGhpcy5jYWxsRXZlbnRfKGxhc3RRdWFydGlsZUV2ZW50KVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5uZXh0UXVhcnRpbGVJbmRleF8gKz0gMVxuXHRcdH1cblx0XHRpZiAodGhpcy52aWRlb1Nsb3RfLmR1cmF0aW9uID4gMCkge1xuXHRcdFx0dGhpcy5hdHRyaWJ1dGVzX1sncmVtYWluaW5nVGltZSddID0gdGhpcy52aWRlb1Nsb3RfLmR1cmF0aW9uIC0gdGhpcy52aWRlb1Nsb3RfLmN1cnJlbnRUaW1lXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIHNpemUgb2YgdGhlIHZpZGVvIHBsYXllci5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdHVwZGF0ZVZpZGVvUGxheWVyU2l6ZV8oKSB7XG5cdFx0dGhpcy52aWRlb1Nsb3RfLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLmF0dHJpYnV0ZXNfWyd3aWR0aCddKVxuXHRcdHRoaXMudmlkZW9TbG90Xy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuYXR0cmlidXRlc19bJ2hlaWdodCddKVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCBieSB0aGUgd3JhcHBlciB0byBzdGFydCB0aGUgYWQuXG5cdCAqL1xuXHRzdGFydEFkKCkge1xuXHRcdHRoaXMubG9nKCdTdGFydGluZyBhZCcpXG5cdFx0dGhpcy5jYWxsRXZlbnRfKCdBZFN0YXJ0ZWQnKVxuXHRcdC8vIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50JyAmJiB0aGlzLnBhcmFtZXRlcnNfLmZvcm1hdCAhPT0gJ3ZpZGVvJykge1xuXHRcdC8vICAgaGlkZUNvbnRyb2xCdXR0b25zKHRoaXMuc2xvdF8pO1xuXHRcdC8vIH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgYnkgdGhlIHdyYXBwZXIgdG8gc3RvcCB0aGUgYWQuXG5cdCAqL1xuXHRzdG9wQWQoKSB7XG5cdFx0dGhpcy5sb2coJ1N0b3BwaW5nIGFkJylcblx0XHQvLyBDYWxsaW5nIEFkU3RvcHBlZCBpbW1lZGlhdGVseSB0ZXJtaW5hdGVzIHRoZSBhZC4gU2V0dGluZyBhIHRpbWVvdXQgYWxsb3dzXG5cdFx0Ly8gZXZlbnRzIHRvIGdvIHRocm91Z2guXG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5jYWxsRXZlbnRfLmJpbmQodGhpcylcblx0XHRzZXRUaW1lb3V0KGNhbGxiYWNrLCA3NSwgWydBZFN0b3BwZWQnXSlcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgdmlkZW8gcGxheWVyIGNoYW5nZXMgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgY29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggVGhlIG5ldyB3aWR0aC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBBIG5ldyBoZWlnaHQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TW9kZSBBIG5ldyB2aWV3IG1vZGUuXG5cdCAqL1xuXHRyZXNpemVBZCh3aWR0aCwgaGVpZ2h0LCB2aWV3TW9kZSkge1xuXHRcdHRoaXMubG9nKCdyZXNpemVBZCAnICsgd2lkdGggKyAneCcgKyBoZWlnaHQgKyAnICcgKyB2aWV3TW9kZSlcblx0XHR0aGlzLmF0dHJpYnV0ZXNfWyd3aWR0aCddID0gd2lkdGhcblx0XHR0aGlzLmF0dHJpYnV0ZXNfWydoZWlnaHQnXSA9IGhlaWdodFxuXHRcdHRoaXMuYXR0cmlidXRlc19bJ3ZpZXdNb2RlJ10gPSB2aWV3TW9kZVxuXHRcdHRoaXMudXBkYXRlVmlkZW9QbGF5ZXJTaXplXygpXG5cdFx0dGhpcy5jYWxsRXZlbnRfKCdBZFNpemVDaGFuZ2UnKVxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0YWRqdXN0U2NhbGUodGhpcylcblx0XHR9LCAxMDApXG5cdH1cblxuXHQvKipcblx0ICogUGF1c2VzIHRoZSBhZC5cblx0ICovXG5cdHBhdXNlQWQoKSB7XG5cdFx0dGhpcy5sb2coJ3BhdXNlQWQnKVxuXHRcdHRoaXMudmlkZW9TbG90Xy5wYXVzZSgpXG5cdFx0dGhpcy5jYWxsRXZlbnRfKCdBZFBhdXNlZCcpXG5cdH1cblxuXHQvKipcblx0ICogUmVzdW1lcyB0aGUgYWQuXG5cdCAqL1xuXHRyZXN1bWVBZCgpIHtcblx0XHR0aGlzLmxvZygncmVzdW1lQWQnKVxuXHRcdHRoaXMudmlkZW9TbG90Xy5wbGF5KClcblx0XHR0aGlzLmNhbGxFdmVudF8oJ0FkUGxheWluZycpXG5cdH1cblxuXHQvKipcblx0ICogRXhwYW5kcyB0aGUgYWQuXG5cdCAqL1xuXHRleHBhbmRBZCgpIHtcblx0XHR0aGlzLmxvZygnZXhwYW5kQWQnKVxuXHRcdHRoaXMuYXR0cmlidXRlc19bJ2V4cGFuZGVkJ10gPSB0cnVlXG5cdFx0dGhpcy5jYWxsRXZlbnRfKCdBZEV4cGFuZGVkJylcblx0fVxuXG5cdC8qKlxuXHQgKiBDb2xsYXBzZXMgdGhlIGFkLlxuXHQgKi9cblx0Y29sbGFwc2VBZCgpIHtcblx0XHR0aGlzLmxvZygnY29sbGFwc2VBZCcpXG5cdFx0dGhpcy5hdHRyaWJ1dGVzX1snZXhwYW5kZWQnXSA9IGZhbHNlXG5cdH1cblxuXHQvKipcblx0ICogU2tpcHMgdGhlIGFkLlxuXHQgKi9cblx0c2tpcEFkKCkge1xuXHRcdHRoaXMubG9nKCdza2lwQWQnKVxuXHRcdHZhciBza2lwcGFibGVTdGF0ZSA9IHRoaXMuYXR0cmlidXRlc19bJ3NraXBwYWJsZVN0YXRlJ11cblx0XHRpZiAoc2tpcHBhYmxlU3RhdGUpIHtcblx0XHRcdHRoaXMuY2FsbEV2ZW50XygnQWRTa2lwcGVkJylcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZm9yIGFuIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBjYWxsYmFjayB0eXBlLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gYUNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBjYWxsYmFjay5cblx0ICovXG5cdHN1YnNjcmliZShhQ2FsbGJhY2ssIGV2ZW50TmFtZSwgYUNvbnRleHQpIHtcblx0XHR0aGlzLmxvZygnU3Vic2NyaWJlICcgKyBldmVudE5hbWUpXG5cdFx0dmFyIGNhbGxCYWNrID0gYUNhbGxiYWNrLmJpbmQoYUNvbnRleHQpXG5cdFx0dGhpcy5ldmVudHNDYWxsYmFja3NfW2V2ZW50TmFtZV0gPSBjYWxsQmFja1xuXHR9XG5cblx0ZGV2U3VzY3JpYmUoKSB7XG5cdFx0Y29uc3QgZXZlbnRzQ2FsbGJhY2tzID0ge1xuXHRcdFx0QWRSZWFkeTogKCkgPT4ge30sXG5cdFx0XHRBZExvYWRlZDogKCkgPT4ge30sXG5cdFx0XHRBZFN0YXJ0ZWQ6ICgpID0+IHt9LFxuXHRcdFx0QWRWaWRlb1N0YXJ0OiAoKSA9PiB7fSxcblx0XHRcdEFkSW1wcmVzc2lvbjogKCkgPT4ge30sXG5cdFx0XHRBZENsaWNrVGhydTogKCkgPT4ge30sXG5cdFx0XHRBZER1cmF0aW9uQ2hhbmdlOiAoKSA9PiB7fSxcblx0XHRcdEFkRXJyb3I6ICgpID0+IHt9LFxuXHRcdFx0QWRFeHBhbmRlZENoYW5nZTogKCkgPT4ge30sXG5cdFx0XHRBZEltcHJlc3Npb246ICgpID0+IHt9LFxuXHRcdFx0QWRMaW5lYXJDaGFuZ2U6ICgpID0+IHt9LFxuXHRcdFx0QWRMb2FkZWQ6ICgpID0+IHt9LFxuXHRcdFx0QWRQYXVzZWQ6ICgpID0+IHt9LFxuXHRcdFx0QWRQbGF5aW5nOiAoKSA9PiB7fSxcblx0XHRcdEFkUmVhZHk6ICgpID0+IHt9LFxuXHRcdFx0QWRSZW1haW5pbmdUaW1lQ2hhbmdlOiAoKSA9PiB7fSxcblx0XHRcdEFkU2l6ZUNoYW5nZTogKCkgPT4ge30sXG5cdFx0XHRBZFNraXBwYWJsZVN0YXRlQ2hhbmdlOiAoKSA9PiB7fSxcblx0XHRcdEFkU2tpcHBlZDogKCkgPT4ge30sXG5cdFx0XHRBZFN0YXJ0ZWQ6ICgpID0+IHt9LFxuXHRcdFx0QWRTdG9wcGVkOiAoKSA9PiB7fSxcblx0XHRcdEFkVmlkZW9Db21wbGV0ZTogKCkgPT4ge30sXG5cdFx0XHRBZFZpZGVvRmlyc3RRdWFydGlsZTogKCkgPT4ge30sXG5cdFx0XHRBZFZpZGVvTWlkcG9pbnQ6ICgpID0+IHt9LFxuXHRcdFx0QWRWaWRlb1N0YXJ0OiAoKSA9PiB7fSxcblx0XHRcdEFkVmlkZW9UaGlyZFF1YXJ0aWxlOiAoKSA9PiB7fSxcblx0XHRcdEFkVm9sdW1lQ2hhbmdlOiAoKSA9PiB7fVxuXHRcdH1cblx0XHRPYmplY3Qua2V5cyhldmVudHNDYWxsYmFja3MpLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuXHRcdFx0dGhpcy5zdWJzY3JpYmUoZXZlbnRzQ2FsbGJhY2tzW2V2ZW50TmFtZV0sIGV2ZW50TmFtZSwgbnVsbClcblx0XHR9KVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBjYWxsYmFjayBiYXNlZCBvbiB0aGUgZXZlbnROYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBjYWxsYmFjayB0eXBlLlxuXHQgKi9cblx0dW5zdWJzY3JpYmUoZXZlbnROYW1lKSB7XG5cdFx0dGhpcy5sb2coJ3Vuc3Vic2NyaWJlICcgKyBldmVudE5hbWUpXG5cdFx0dGhpcy5ldmVudHNDYWxsYmFja3NfW2V2ZW50TmFtZV0gPSBudWxsXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoZSBhZCBpcyBsaW5lYXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFkIGlzIGEgbGluZWFyLCBmYWxzZSBmb3Igbm9uIGxpbmVhci5cblx0ICovXG5cdGdldEFkTGluZWFyKCkge1xuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNfWydsaW5lYXInXVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWQgd2lkdGguXG5cdCAqXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFkIHdpZHRoLlxuXHQgKi9cblx0Z2V0QWRXaWR0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzX1snd2lkdGgnXVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWQgaGVpZ2h0LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhZCBoZWlnaHQuXG5cdCAqL1xuXHRnZXRBZEhlaWdodCgpIHtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzX1snaGVpZ2h0J11cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkIGlzIGV4cGFuZGVkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0Z2V0QWRFeHBhbmRlZCgpIHtcblx0XHR0aGlzLmxvZygnZ2V0QWRFeHBhbmRlZCcpXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc19bJ2V4cGFuZGVkJ11cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBza2lwcGFibGUgc3RhdGUgb2YgdGhlIGFkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0Z2V0QWRTa2lwcGFibGVTdGF0ZSgpIHtcblx0XHR0aGlzLmxvZygnZ2V0QWRTa2lwcGFibGVTdGF0ZScpXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc19bJ3NraXBwYWJsZVN0YXRlJ11cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSByZW1haW5pbmcgYWQgdGltZSwgaW4gc2Vjb25kcy5cblx0ICpcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdGltZSByZW1haW5pbmcgaW4gdGhlIGFkLlxuXHQgKi9cblx0Z2V0QWRSZW1haW5pbmdUaW1lKCkge1xuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNfWydyZW1haW5pbmdUaW1lJ11cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWQsIGluIHNlY29uZHMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGR1cmF0aW9uIG9mIHRoZSBhZC5cblx0ICovXG5cdGdldEFkRHVyYXRpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc19bJ2R1cmF0aW9uJ11cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhZCB2b2x1bWUuXG5cdCAqXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZvbHVtZSBvZiB0aGUgYWQuXG5cdCAqL1xuXHRnZXRBZFZvbHVtZSgpIHtcblx0XHR0aGlzLmxvZygnZ2V0QWRWb2x1bWUnKVxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNfWyd2b2x1bWUnXVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFkIHZvbHVtZS5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2b2x1bWUgaW4gcGVyY2VudGFnZS5cblx0ICovXG5cdHNldEFkVm9sdW1lKHZhbHVlKSB7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzX1sndm9sdW1lJ10gPSB2YWx1ZVxuXHRcdHRoaXMudmlkZW9TbG90Xy52b2x1bWUgPSB2YWx1ZVxuXG5cdFx0aWYgKHRoaXMuYWQgJiYgdGhpcy5hZC5zdGF0ZSAmJiB0aGlzLmFkLnN0YXRlLnZpZGVvcykge1xuXHRcdFx0dGhpcy5hZC5zdGF0ZS52aWRlb3MuZm9yRWFjaCgodikgPT4ge1xuXHRcdFx0XHR2LnZvbHVtZSA9IHZhbHVlXG5cdFx0XHRcdGlmICh2YWx1ZSA+IDApIHtcblx0XHRcdFx0XHR2Lm11dGVkID0gZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHR9XG5cblx0XHR0aGlzLmxvZygnc2V0QWRWb2x1bWUgJyArIHZhbHVlKVxuXHRcdHRoaXMuY2FsbEV2ZW50XygnQWRWb2x1bWVDaGFuZ2UnKVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBhbmlvbiBhZHMgZm9yIHRoZSBhZC5cblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGNvbXBhbmlvbnMgaW4gVkFTVCBYTUwuXG5cdCAqL1xuXHRnZXRBZENvbXBhbmlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc19bJ2NvbXBhbmlvbnMnXVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBsaXN0IG9mIGljb25zLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IEEgbGlzdCBvZiBpY29ucy5cblx0ICovXG5cdGdldEFkSWNvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc19bJ2ljb25zJ11cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGV2ZW50cyBhbmQgbWVzc2FnZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG5cdCAqL1xuXHRsb2coKSB7XG5cdFx0Ly8gaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSBjb25zb2xlLmxvZyguLi5hcmd1bWVudHMpXG5cdFx0Ly8gY29uc29sZS5sb2coLi4uYXJndW1lbnRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhbiBldmVudCBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjYWxsRXZlbnRfKGV2ZW50VHlwZSkge1xuXHRcdHRoaXMubG9nKGV2ZW50VHlwZSlcblxuXHRcdGlmIChldmVudFR5cGUgaW4gdGhpcy5ldmVudHNDYWxsYmFja3NfKSB7XG5cdFx0XHR0aGlzLmV2ZW50c0NhbGxiYWNrc19bZXZlbnRUeXBlXSgpXG5cdFx0fVxuXHR9XG5cblx0c2V0UmVhY3RpdmVBdHRyaWJ1dGVzKCkge1xuXHRcdHRoaXMuYXR0cmlidXRlc18gPSBuZXcgUHJveHkodGhpcy5hdHRyaWJ1dGVzXywge1xuXHRcdFx0c2V0OiAodGFyZ2V0LCBrZXksIHZhbHVlKSA9PiB7XG5cdFx0XHRcdHRhcmdldFtrZXldID0gdmFsdWVcblx0XHRcdFx0aWYgKGtleSA9PT0gJ3NjYWxlJykge1xuXHRcdFx0XHRcdGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdzY2FsaW5nJywgeyBkZXRhaWw6IHsgc2NhbGU6IHZhbHVlIH0gfSlcblx0XHRcdFx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLnNsb3RfLnF1ZXJ5U2VsZWN0b3IoJy5jcmVhdGl2ZS1jb250YWluZXInKVxuXHRcdFx0XHRcdGlmIChjb250YWluZXIpIGNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Z2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0W3Byb3BdXG5cdFx0XHR9XG5cdFx0fSlcblx0fVxuXG5cdHNldHVwVW5tdXRlKGFkQ29udGFpbmVyKSB7XG5cdFx0Y29uc3QgdW5tdXRlVmlkZW8gPSAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5hdHRyaWJ1dGVzXy5pbml0aWFsVW5tdXRlID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLnNldEFkVm9sdW1lKDEpXG5cdFx0XHRcdHRoaXMudmlkZW9TbG90Xy5tdXRlZCA9IGZhbHNlXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlc18uaW5pdGlhbFVubXV0ZSA9IHRydWVcblx0XHRcdFx0Ly8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xuXHRcdFx0XHR0aGlzLnZpZGVvU2xvdF8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bm11dGVWaWRlbylcblx0XHRcdFx0dGhpcy5zbG90Xy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHVubXV0ZVZpZGVvKVxuXHRcdFx0XHRhZENvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHVubXV0ZVZpZGVvKVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnZpZGVvU2xvdF8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bm11dGVWaWRlbylcblx0XHR0aGlzLnNsb3RfLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdW5tdXRlVmlkZW8pXG5cdFx0YWRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bm11dGVWaWRlbylcblx0fVxufVxuIiwiLyohXG4gKiBHbGlkZS5qcyB2My40LjFcbiAqIChjKSAyMDEzLTIwMTkgSsSZZHJ6ZWogQ2hhxYJ1YmVrIDxqZWRyemVqLmNoYWx1YmVrQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRyemVqY2hhbHViZWsuY29tLylcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoZSBtb3ZlbWVudC5cbiAgICpcbiAgICogQXZhaWxhYmxlIHR5cGVzOlxuICAgKiBgc2xpZGVyYCAtIFJld2luZHMgc2xpZGVyIHRvIHRoZSBzdGFydC9lbmQgd2hlbiBpdCByZWFjaGVzIHRoZSBmaXJzdCBvciBsYXN0IHNsaWRlLlxuICAgKiBgY2Fyb3VzZWxgIC0gQ2hhbmdlcyBzbGlkZXMgd2l0aG91dCBzdGFydGluZyBvdmVyIHdoZW4gaXQgcmVhY2hlcyB0aGUgZmlyc3Qgb3IgbGFzdCBzbGlkZS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHR5cGU6ICdzbGlkZXInLFxuXG4gIC8qKlxuICAgKiBTdGFydCBhdCBzcGVjaWZpYyBzbGlkZSBudW1iZXIgZGVmaW5lZCB3aXRoIHplcm8tYmFzZWQgaW5kZXguXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBzdGFydEF0OiAwLFxuXG4gIC8qKlxuICAgKiBBIG51bWJlciBvZiBzbGlkZXMgdmlzaWJsZSBvbiB0aGUgc2luZ2xlIHZpZXdwb3J0LlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgcGVyVmlldzogMSxcblxuICAvKipcbiAgICogRm9jdXMgY3VycmVudGx5IGFjdGl2ZSBzbGlkZSBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgdHJhY2suXG4gICAqXG4gICAqIEF2YWlsYWJsZSBpbnB1dHM6XG4gICAqIGBjZW50ZXJgIC0gQ3VycmVudCBzbGlkZSB3aWxsIGJlIGFsd2F5cyBmb2N1c2VkIGF0IHRoZSBjZW50ZXIgb2YgYSB0cmFjay5cbiAgICogYDAsMSwyLDMuLi5gIC0gQ3VycmVudCBzbGlkZSB3aWxsIGJlIGZvY3VzZWQgb24gdGhlIHNwZWNpZmllZCB6ZXJvLWJhc2VkIGluZGV4LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nfE51bWJlcn1cbiAgICovXG4gIGZvY3VzQXQ6IDAsXG5cbiAgLyoqXG4gICAqIEEgc2l6ZSBvZiB0aGUgZ2FwIGFkZGVkIGJldHdlZW4gc2xpZGVzLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgZ2FwOiAxMCxcblxuICAvKipcbiAgICogQ2hhbmdlIHNsaWRlcyBhZnRlciBhIHNwZWNpZmllZCBpbnRlcnZhbC4gVXNlIGBmYWxzZWAgZm9yIHR1cm5pbmcgb2ZmIGF1dG9wbGF5LlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfEJvb2xlYW59XG4gICAqL1xuICBhdXRvcGxheTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFN0b3AgYXV0b3BsYXkgb24gbW91c2VvdmVyIGV2ZW50LlxuICAgKlxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIGhvdmVycGF1c2U6IHRydWUsXG5cbiAgLyoqXG4gICAqIEFsbG93IGZvciBjaGFuZ2luZyBzbGlkZXMgd2l0aCBsZWZ0IGFuZCByaWdodCBrZXlib2FyZCBhcnJvd3MuXG4gICAqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAga2V5Ym9hcmQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIFN0b3AgcnVubmluZyBgcGVyVmlld2AgbnVtYmVyIG9mIHNsaWRlcyBmcm9tIHRoZSBlbmQuIFVzZSB0aGlzXG4gICAqIG9wdGlvbiBpZiB5b3UgZG9uJ3Qgd2FudCB0byBoYXZlIGFuIGVtcHR5IHNwYWNlIGFmdGVyXG4gICAqIGEgc2xpZGVyLiBXb3JrcyBvbmx5IHdpdGggYHNsaWRlcmAgdHlwZSBhbmQgYVxuICAgKiBub24tY2VudGVyZWQgYGZvY3VzQXRgIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgYm91bmQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBNaW5pbWFsIHN3aXBlIGRpc3RhbmNlIG5lZWRlZCB0byBjaGFuZ2UgdGhlIHNsaWRlLiBVc2UgYGZhbHNlYCBmb3IgdHVybmluZyBvZmYgYSBzd2lwaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfEJvb2xlYW59XG4gICAqL1xuICBzd2lwZVRocmVzaG9sZDogODAsXG5cbiAgLyoqXG4gICAqIE1pbmltYWwgbW91c2UgZHJhZyBkaXN0YW5jZSBuZWVkZWQgdG8gY2hhbmdlIHRoZSBzbGlkZS4gVXNlIGBmYWxzZWAgZm9yIHR1cm5pbmcgb2ZmIGEgZHJhZ2dpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ8Qm9vbGVhbn1cbiAgICovXG4gIGRyYWdUaHJlc2hvbGQ6IDEyMCxcblxuICAvKipcbiAgICogQSBtYXhpbXVtIG51bWJlciBvZiBzbGlkZXMgdG8gd2hpY2ggbW92ZW1lbnQgd2lsbCBiZSBtYWRlIG9uIHN3aXBpbmcgb3IgZHJhZ2dpbmcuIFVzZSBgZmFsc2VgIGZvciB1bmxpbWl0ZWQuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ8Qm9vbGVhbn1cbiAgICovXG4gIHBlclRvdWNoOiBmYWxzZSxcblxuICAvKipcbiAgICogTW92aW5nIGRpc3RhbmNlIHJhdGlvIG9mIHRoZSBzbGlkZXMgb24gYSBzd2lwaW5nIGFuZCBkcmFnZ2luZy5cbiAgICpcbiAgICogQHR5cGUge051bWJlcn1cbiAgICovXG4gIHRvdWNoUmF0aW86IDAuNSxcblxuICAvKipcbiAgICogQW5nbGUgcmVxdWlyZWQgdG8gYWN0aXZhdGUgc2xpZGVzIG1vdmluZyBvbiBzd2lwaW5nIG9yIGRyYWdnaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgdG91Y2hBbmdsZTogNDUsXG5cbiAgLyoqXG4gICAqIER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgYW5pbWF0aW9uRHVyYXRpb246IDQwMCxcblxuICAvKipcbiAgICogQWxsb3dzIGxvb3BpbmcgdGhlIGBzbGlkZXJgIHR5cGUuIFNsaWRlciB3aWxsIHJld2luZCB0byB0aGUgZmlyc3QvbGFzdCBzbGlkZSB3aGVuIGl0J3MgYXQgdGhlIHN0YXJ0L2VuZC5cbiAgICpcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICByZXdpbmQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIER1cmF0aW9uIG9mIHRoZSByZXdpbmRpbmcgYW5pbWF0aW9uIG9mIHRoZSBgc2xpZGVyYCB0eXBlIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQHR5cGUge051bWJlcn1cbiAgICovXG4gIHJld2luZER1cmF0aW9uOiA4MDAsXG5cbiAgLyoqXG4gICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGFuaW1hdGlvblRpbWluZ0Z1bmM6ICdjdWJpYy1iZXppZXIoLjE2NSwgLjg0MCwgLjQ0MCwgMSknLFxuXG4gIC8qKlxuICAgKiBUaHJvdHRsZSBjb3N0bHkgZXZlbnRzIGF0IG1vc3Qgb25jZSBwZXIgZXZlcnkgd2FpdCBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICB0aHJvdHRsZTogMTAsXG5cbiAgLyoqXG4gICAqIE1vdmluZyBkaXJlY3Rpb24gbW9kZS5cbiAgICpcbiAgICogQXZhaWxhYmxlIGlucHV0czpcbiAgICogLSAnbHRyJyAtIGxlZnQgdG8gcmlnaHQgbW92ZW1lbnQsXG4gICAqIC0gJ3J0bCcgLSByaWdodCB0byBsZWZ0IG1vdmVtZW50LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZGlyZWN0aW9uOiAnbHRyJyxcblxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIHZhbHVlIG9mIHRoZSBuZXh0IGFuZCBwcmV2aW91cyB2aWV3cG9ydHMgd2hpY2hcbiAgICogaGF2ZSB0byBwZWVrIGluIHRoZSBjdXJyZW50IHZpZXcuIEFjY2VwdHMgbnVtYmVyIGFuZFxuICAgKiBwaXhlbHMgYXMgYSBzdHJpbmcuIExlZnQgYW5kIHJpZ2h0IHBlZWtpbmcgY2FuIGJlXG4gICAqIHNldCB1cCBzZXBhcmF0ZWx5IHdpdGggYSBkaXJlY3Rpb25zIG9iamVjdC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIGAxMDBgIC0gUGVlayAxMDBweCBvbiB0aGUgYm90aCBzaWRlcy5cbiAgICogeyBiZWZvcmU6IDEwMCwgYWZ0ZXI6IDUwIH1gIC0gUGVlayAxMDBweCBvbiB0aGUgbGVmdCBzaWRlIGFuZCA1MHB4IG9uIHRoZSByaWdodCBzaWRlLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfFN0cmluZ3xPYmplY3R9XG4gICAqL1xuICBwZWVrOiAwLFxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG9wdGlvbnMgYXBwbGllZCBhdCBzcGVjaWZpZWQgbWVkaWEgYnJlYWtwb2ludHMuXG4gICAqIEZvciBleGFtcGxlOiBkaXNwbGF5IHR3byBzbGlkZXMgcGVyIHZpZXcgdW5kZXIgODAwcHguXG4gICAqIGB7XG4gICAqICAgJzgwMHB4Jzoge1xuICAgKiAgICAgcGVyVmlldzogMlxuICAgKiAgIH1cbiAgICogfWBcbiAgICovXG4gIGJyZWFrcG9pbnRzOiB7fSxcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBpbnRlcm5hbGx5IHVzZWQgSFRNTCBjbGFzc2VzLlxuICAgKlxuICAgKiBAdG9kbyBSZWZhY3RvciBgc2xpZGVyYCBhbmQgYGNhcm91c2VsYCBwcm9wZXJ0aWVzIHRvIHNpbmdsZSBgdHlwZTogeyBzbGlkZXI6ICcnLCBjYXJvdXNlbDogJycgfWAgb2JqZWN0XG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBjbGFzc2VzOiB7XG4gICAgZGlyZWN0aW9uOiB7XG4gICAgICBsdHI6ICdnbGlkZS0tbHRyJyxcbiAgICAgIHJ0bDogJ2dsaWRlLS1ydGwnXG4gICAgfSxcbiAgICBzbGlkZXI6ICdnbGlkZS0tc2xpZGVyJyxcbiAgICBjYXJvdXNlbDogJ2dsaWRlLS1jYXJvdXNlbCcsXG4gICAgc3dpcGVhYmxlOiAnZ2xpZGUtLXN3aXBlYWJsZScsXG4gICAgZHJhZ2dpbmc6ICdnbGlkZS0tZHJhZ2dpbmcnLFxuICAgIGNsb25lU2xpZGU6ICdnbGlkZV9fc2xpZGUtLWNsb25lJyxcbiAgICBhY3RpdmVOYXY6ICdnbGlkZV9fYnVsbGV0LS1hY3RpdmUnLFxuICAgIGFjdGl2ZVNsaWRlOiAnZ2xpZGVfX3NsaWRlLS1hY3RpdmUnLFxuICAgIGRpc2FibGVkQXJyb3c6ICdnbGlkZV9fYXJyb3ctLWRpc2FibGVkJ1xuICB9XG59O1xuXG4vKipcbiAqIE91dHB1dHMgd2FybmluZyBtZXNzYWdlIHRvIHRoZSBib3dzZXIgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1zZ1xuICogQHJldHVybiB7Vm9pZH1cbiAqL1xuZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgY29uc29sZS5lcnJvcihcIltHbGlkZSB3YXJuXTogXCIgKyBtc2cpO1xufVxuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iajtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xufTtcblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBnZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcblxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykge1xuICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBnZXR0ZXIgPSBkZXNjLmdldDtcblxuICAgIGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpO1xuICB9XG59O1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB2YWx1ZSBlbnRlcmVkIGFzIG51bWJlclxuICogb3Igc3RyaW5nIHRvIGludGVnZXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiB0b0ludCh2YWx1ZSkge1xuICByZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHZhbHVlIGVudGVyZWQgYXMgbnVtYmVyXG4gKiBvciBzdHJpbmcgdG8gZmxhdCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcbiAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7Kn0gICB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmVcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHZhbHVlKTtcblxuICByZXR1cm4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1peGVkLW9wZXJhdG9yc1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBudW1iZXIuXG4gKlxuICogQHBhcmFtICB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgeyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSAgeyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgZXh0ZW5zaW9ucy5cbiAqIEVhY2ggZXh0ZW5zaW9uIHJlY2VpdmVzIGFjY2VzcyB0byBpbnN0YW5jZSBvZiBnbGlkZSBhbmQgcmVzdCBvZiBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbGlkZVxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnNcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtb3VudChnbGlkZSwgZXh0ZW5zaW9ucywgZXZlbnRzKSB7XG4gIHZhciBjb21wb25lbnRzID0ge307XG5cbiAgZm9yICh2YXIgbmFtZSBpbiBleHRlbnNpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oZXh0ZW5zaW9uc1tuYW1lXSkpIHtcbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBleHRlbnNpb25zW25hbWVdKGdsaWRlLCBjb21wb25lbnRzLCBldmVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuKCdFeHRlbnNpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX25hbWUgaW4gY29tcG9uZW50cykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbXBvbmVudHNbX25hbWVdLm1vdW50KSkge1xuICAgICAgY29tcG9uZW50c1tfbmFtZV0ubW91bnQoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGdldHRlciBhbmQgc2V0dGVyIHByb3BlcnR5IG9uIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqICAgICAgICAgT2JqZWN0IHdoZXJlIHByb3BlcnR5IGhhcyB0byBiZSBkZWZpbmVkLlxuICogQHBhcmFtICB7U3RyaW5nfSBwcm9wICAgICAgICBOYW1lIG9mIHRoZSBkZWZpbmVkIHByb3BlcnR5LlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZpbml0aW9uICBHZXQgYW5kIHNldCBkZWZpbml0aW9ucyBmb3IgdGhlIHByb3BlcnR5LlxuICogQHJldHVybiB7Vm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lKG9iaiwgcHJvcCwgZGVmaW5pdGlvbikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZWZpbml0aW9uKTtcbn1cblxuLyoqXG4gKiBTb3J0cyBhcGhhYmV0aWNhbGx5IG9iamVjdCBrZXlzLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHNvcnRLZXlzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uIChyLCBrKSB7XG4gICAgcltrXSA9IG9ialtrXTtcblxuICAgIHJldHVybiByW2tdLCByO1xuICB9LCB7fSk7XG59XG5cbi8qKlxuICogTWVyZ2VzIHBhc3NlZCBzZXR0aW5ncyBvYmplY3Qgd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZhdWx0c1xuICogQHBhcmFtICB7T2JqZWN0fSBzZXR0aW5nc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMoZGVmYXVsdHMsIHNldHRpbmdzKSB7XG4gIHZhciBvcHRpb25zID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLCBzZXR0aW5ncyk7XG5cbiAgLy8gYE9iamVjdC5hc3NpZ25gIGRvIG5vdCBkZWVwbHkgbWVyZ2Ugb2JqZWN0cywgc28gd2VcbiAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseSBmb3IgZXZlcnkgbmVzdGVkIG9iamVjdFxuICAvLyBpbiBvcHRpb25zLiBBbHRob3VnaCBpdCBkb2VzIG5vdCBsb29rIHNtYXJ0LFxuICAvLyBpdCdzIHNtYWxsZXIgYW5kIGZhc3RlciB0aGFuIHNvbWUgZmFuY3lcbiAgLy8gbWVyZ2luZyBkZWVwLW1lcmdlIGFsZ29yaXRobSBzY3JpcHQuXG4gIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eSgnY2xhc3NlcycpKSB7XG4gICAgb3B0aW9ucy5jbGFzc2VzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLmNsYXNzZXMsIHNldHRpbmdzLmNsYXNzZXMpO1xuXG4gICAgaWYgKHNldHRpbmdzLmNsYXNzZXMuaGFzT3duUHJvcGVydHkoJ2RpcmVjdGlvbicpKSB7XG4gICAgICBvcHRpb25zLmNsYXNzZXMuZGlyZWN0aW9uID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLmNsYXNzZXMuZGlyZWN0aW9uLCBzZXR0aW5ncy5jbGFzc2VzLmRpcmVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KCdicmVha3BvaW50cycpKSB7XG4gICAgb3B0aW9ucy5icmVha3BvaW50cyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0cy5icmVha3BvaW50cywgc2V0dGluZ3MuYnJlYWtwb2ludHMpO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbnZhciBFdmVudHNCdXMgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBFdmVudEJ1cyBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50c1xuICAgKi9cbiAgZnVuY3Rpb24gRXZlbnRzQnVzKCkge1xuICAgIHZhciBldmVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50c0J1cyk7XG5cbiAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcbiAgICB0aGlzLmhvcCA9IGV2ZW50cy5oYXNPd25Qcm9wZXJ0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZlZCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhFdmVudHNCdXMsIFt7XG4gICAga2V5OiAnb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKGlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLm9uKGV2ZW50W2ldLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgdGhlIGV2ZW50J3Mgb2JqZWN0IGlmIG5vdCB5ZXQgY3JlYXRlZFxuICAgICAgaWYgKCF0aGlzLmhvcC5jYWxsKHRoaXMuZXZlbnRzLCBldmVudCkpIHtcbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gW107XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgaGFuZGxlciB0byBxdWV1ZVxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5ldmVudHNbZXZlbnRdLnB1c2goaGFuZGxlcikgLSAxO1xuXG4gICAgICAvLyBQcm92aWRlIGhhbmRsZSBiYWNrIGZvciByZW1vdmFsIG9mIGV2ZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbZXZlbnRdW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHJlZ2lzdGVyZWQgaGFuZGxlcnMgZm9yIHNwZWNpZmllZCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29udGV4dFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdlbWl0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW1pdChldmVudCwgY29udGV4dCkge1xuICAgICAgaWYgKGlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmVtaXQoZXZlbnRbaV0sIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBldmVudCBkb2Vzbid0IGV4aXN0LCBvciB0aGVyZSdzIG5vIGhhbmRsZXJzIGluIHF1ZXVlLCBqdXN0IGxlYXZlXG4gICAgICBpZiAoIXRoaXMuaG9wLmNhbGwodGhpcy5ldmVudHMsIGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEN5Y2xlIHRocm91Z2ggZXZlbnRzIHF1ZXVlLCBmaXJlIVxuICAgICAgdGhpcy5ldmVudHNbZXZlbnRdLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaXRlbShjb250ZXh0IHx8IHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRXZlbnRzQnVzO1xufSgpO1xuXG52YXIgR2xpZGUgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgZ2xpZGUuXG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBHbGlkZShzZWxlY3Rvcikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHbGlkZSk7XG5cbiAgICB0aGlzLl9jID0ge307XG4gICAgdGhpcy5fdCA9IFtdO1xuICAgIHRoaXMuX2UgPSBuZXcgRXZlbnRzQnVzKCk7XG5cbiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBtZXJnZU9wdGlvbnMoZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIHRoaXMuaW5kZXggPSB0aGlzLnNldHRpbmdzLnN0YXJ0QXQ7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgZ2xpZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRlbnNpb25zIENvbGxlY3Rpb24gb2YgZXh0ZW5zaW9ucyB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhHbGlkZSwgW3tcbiAgICBrZXk6ICdtb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdW50JCQxKCkge1xuICAgICAgdmFyIGV4dGVuc2lvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgICB0aGlzLl9lLmVtaXQoJ21vdW50LmJlZm9yZScpO1xuXG4gICAgICBpZiAoaXNPYmplY3QoZXh0ZW5zaW9ucykpIHtcbiAgICAgICAgdGhpcy5fYyA9IG1vdW50KHRoaXMsIGV4dGVuc2lvbnMsIHRoaXMuX2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybignWW91IG5lZWQgdG8gcHJvdmlkZSBhIG9iamVjdCBvbiBgbW91bnQoKWAnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZS5lbWl0KCdtb3VudC5hZnRlcicpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBhbiBpbnN0YW5jZSBgdHJhbnNsYXRlYCB0cmFuc2Zvcm1lcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtBcnJheX0gdHJhbnNmb3JtZXJzIENvbGxlY3Rpb24gb2YgdHJhbnNmb3JtZXJzLlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ211dGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11dGF0ZSgpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1lcnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgICBpZiAoaXNBcnJheSh0cmFuc2Zvcm1lcnMpKSB7XG4gICAgICAgIHRoaXMuX3QgPSB0cmFuc2Zvcm1lcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKCdZb3UgbmVlZCB0byBwcm92aWRlIGEgYXJyYXkgb24gYG11dGF0ZSgpYCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGdsaWRlIHdpdGggc3BlY2lmaWVkIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHZhciBzZXR0aW5ncyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICAgIHRoaXMuc2V0dGluZ3MgPSBtZXJnZU9wdGlvbnModGhpcy5zZXR0aW5ncywgc2V0dGluZ3MpO1xuXG4gICAgICBpZiAoc2V0dGluZ3MuaGFzT3duUHJvcGVydHkoJ3N0YXJ0QXQnKSkge1xuICAgICAgICB0aGlzLmluZGV4ID0gc2V0dGluZ3Muc3RhcnRBdDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZS5lbWl0KCd1cGRhdGUnKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHNsaWRlIHdpdGggc3BlY2lmaWVkIHBhdHRlcm4uIEEgcGF0dGVybiBtdXN0IGJlIGluIHRoZSBzcGVjaWFsIGZvcm1hdDpcbiAgICAgKiBgPmAgLSBNb3ZlIG9uZSBmb3J3YXJkXG4gICAgICogYDxgIC0gTW92ZSBvbmUgYmFja3dhcmRcbiAgICAgKiBgPXtpfWAgLSBHbyB0byB7aX0gemVyby1iYXNlZCBzbGlkZSAoZXEuICc9MScsIHdpbGwgZ28gdG8gc2Vjb25kIHNsaWRlKVxuICAgICAqIGA+PmAgLSBSZXdpbmRzIHRvIGVuZCAobGFzdCBzbGlkZSlcbiAgICAgKiBgPDxgIC0gUmV3aW5kcyB0byBzdGFydCAoZmlyc3Qgc2xpZGUpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVyblxuICAgICAqIEByZXR1cm4ge0dsaWRlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdnbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdvKHBhdHRlcm4pIHtcbiAgICAgIHRoaXMuX2MuUnVuLm1ha2UocGF0dGVybik7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgdHJhY2sgYnkgc3BlY2lmaWVkIGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRpc3RhbmNlXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKGRpc3RhbmNlKSB7XG4gICAgICB0aGlzLl9jLlRyYW5zaXRpb24uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5fYy5Nb3ZlLm1ha2UoZGlzdGFuY2UpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGluc3RhbmNlIGFuZCByZXZlcnQgYWxsIGNoYW5nZXMgZG9uZSBieSB0aGlzLl9jLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5fZS5lbWl0KCdkZXN0cm95Jyk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGluc3RhbmNlIGF1dG9wbGF5aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufE51bWJlcn0gaW50ZXJ2YWwgUnVuIGF1dG9wbGF5aW5nIHdpdGggcGFzc2VkIGludGVydmFsIHJlZ2FyZGxlc3Mgb2YgYGF1dG9wbGF5YCBzZXR0aW5nc1xuICAgICAqIEByZXR1cm4ge0dsaWRlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwbGF5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHZhciBpbnRlcnZhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzLmF1dG9wbGF5ID0gaW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2UuZW1pdCgncGxheScpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGluc3RhbmNlIGF1dG9wbGF5aW5nLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3BhdXNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLl9lLmVtaXQoJ3BhdXNlJyk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZ2xpZGUgaW50byBhIGlkbGUgc3RhdHVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2Rpc2FibGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZ2xpZGUgaW50byBhIGFjdGl2ZSBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZW5hYmxlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGN1dXRvbSBldmVudCBsaXN0ZW5lciB3aXRoIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9IGV2ZW50XG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudCwgaGFuZGxlcikge1xuICAgICAgdGhpcy5fZS5vbihldmVudCwgaGFuZGxlcik7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnbGlkZSBpcyBhIHByZWNpc2VkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1R5cGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1R5cGUobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudHlwZSA9PT0gbmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIHRoZSBjb3JlIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdmFsdWUgb2YgdGhlIGNvcmUgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gb1xuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG8pIHtcbiAgICAgIGlmIChpc09iamVjdChvKSkge1xuICAgICAgICB0aGlzLl9vID0gbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oJ09wdGlvbnMgbXVzdCBiZSBhbiBgb2JqZWN0YCBpbnN0YW5jZS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGN1cnJlbnQgaW5kZXggb2YgdGhlIHNsaWRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaW5kZXgnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBjdXJyZW50IGluZGV4IGEgc2xpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShpKSB7XG4gICAgICB0aGlzLl9pID0gdG9JbnQoaSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0eXBlIG5hbWUgb2YgdGhlIHNsaWRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAndHlwZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy50eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdmFsdWUgb2YgdGhlIGlkbGUgc3RhdHVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB2YWx1ZSBvZiB0aGUgaWRsZSBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShzdGF0dXMpIHtcbiAgICAgIHRoaXMuX2QgPSAhIXN0YXR1cztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEdsaWRlO1xufSgpO1xuXG5mdW5jdGlvbiBSdW4gKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgdmFyIFJ1biA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhdXRvcnVubmluZyBvZiB0aGUgZ2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHRoaXMuX28gPSBmYWxzZTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBnbGlkZXMgcnVubmluZyBiYXNlZCBvbiB0aGUgcGFzc2VkIG1vdmluZyBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW92ZVxuICAgICAqL1xuICAgIG1ha2U6IGZ1bmN0aW9uIG1ha2UobW92ZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCFHbGlkZS5kaXNhYmxlZCkge1xuICAgICAgICBHbGlkZS5kaXNhYmxlKCk7XG5cbiAgICAgICAgdGhpcy5tb3ZlID0gbW92ZTtcblxuICAgICAgICBFdmVudHMuZW1pdCgncnVuLmJlZm9yZScsIHRoaXMubW92ZSk7XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGUoKTtcblxuICAgICAgICBFdmVudHMuZW1pdCgncnVuJywgdGhpcy5tb3ZlKTtcblxuICAgICAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5pc1N0YXJ0KCkpIHtcbiAgICAgICAgICAgIEV2ZW50cy5lbWl0KCdydW4uc3RhcnQnLCBfdGhpcy5tb3ZlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMuaXNFbmQoKSkge1xuICAgICAgICAgICAgRXZlbnRzLmVtaXQoJ3J1bi5lbmQnLCBfdGhpcy5tb3ZlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMuaXNPZmZzZXQoJzwnKSB8fCBfdGhpcy5pc09mZnNldCgnPicpKSB7XG4gICAgICAgICAgICBfdGhpcy5fbyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBFdmVudHMuZW1pdCgncnVuLm9mZnNldCcsIF90aGlzLm1vdmUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEV2ZW50cy5lbWl0KCdydW4uYWZ0ZXInLCBfdGhpcy5tb3ZlKTtcblxuICAgICAgICAgIEdsaWRlLmVuYWJsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIGN1cnJlbnQgaW5kZXggYmFzZWQgb24gZGVmaW5lZCBtb3ZlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBjYWxjdWxhdGU6IGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHtcbiAgICAgIHZhciBtb3ZlID0gdGhpcy5tb3ZlLFxuICAgICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgdmFyIHN0ZXBzID0gbW92ZS5zdGVwcyxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBtb3ZlLmRpcmVjdGlvbjtcblxuXG4gICAgICB2YXIgY291bnRhYmxlU3RlcHMgPSBpc051bWJlcih0b0ludChzdGVwcykpICYmIHRvSW50KHN0ZXBzKSAhPT0gMDtcblxuICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKHN0ZXBzID09PSAnPicpIHtcbiAgICAgICAgICAgIEdsaWRlLmluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0VuZCgpKSB7XG4gICAgICAgICAgICBpZiAoIShHbGlkZS5pc1R5cGUoJ3NsaWRlcicpICYmICFHbGlkZS5zZXR0aW5ncy5yZXdpbmQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX28gPSB0cnVlO1xuXG4gICAgICAgICAgICAgIEdsaWRlLmluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50YWJsZVN0ZXBzKSB7XG4gICAgICAgICAgICBHbGlkZS5pbmRleCArPSBNYXRoLm1pbihsZW5ndGggLSBHbGlkZS5pbmRleCwgLXRvSW50KHN0ZXBzKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEdsaWRlLmluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgIGlmIChzdGVwcyA9PT0gJzwnKSB7XG4gICAgICAgICAgICBHbGlkZS5pbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzU3RhcnQoKSkge1xuICAgICAgICAgICAgaWYgKCEoR2xpZGUuaXNUeXBlKCdzbGlkZXInKSAmJiAhR2xpZGUuc2V0dGluZ3MucmV3aW5kKSkge1xuICAgICAgICAgICAgICB0aGlzLl9vID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBHbGlkZS5pbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50YWJsZVN0ZXBzKSB7XG4gICAgICAgICAgICBHbGlkZS5pbmRleCAtPSBNYXRoLm1pbihHbGlkZS5pbmRleCwgdG9JbnQoc3RlcHMpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgR2xpZGUuaW5kZXgtLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgR2xpZGUuaW5kZXggPSBzdGVwcztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHdhcm4oJ0ludmFsaWQgZGlyZWN0aW9uIHBhdHRlcm4gWycgKyBkaXJlY3Rpb24gKyBzdGVwcyArICddIGhhcyBiZWVuIHVzZWQnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgd2UgYXJlIG9uIHRoZSBmaXJzdCBzbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTdGFydDogZnVuY3Rpb24gaXNTdGFydCgpIHtcbiAgICAgIHJldHVybiBHbGlkZS5pbmRleCA9PT0gMDtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgd2UgYXJlIG9uIHRoZSBsYXN0IHNsaWRlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0VuZDogZnVuY3Rpb24gaXNFbmQoKSB7XG4gICAgICByZXR1cm4gR2xpZGUuaW5kZXggPT09IHRoaXMubGVuZ3RoO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB3ZSBhcmUgbWFraW5nIGEgb2Zmc2V0IHJ1bi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzT2Zmc2V0OiBmdW5jdGlvbiBpc09mZnNldChkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLl9vICYmIHRoaXMubW92ZS5kaXJlY3Rpb24gPT09IGRpcmVjdGlvbjtcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKFJ1biwgJ21vdmUnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB2YWx1ZSBvZiB0aGUgbW92ZSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX207XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyB2YWx1ZSBvZiB0aGUgbW92ZSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB2YXIgc3RlcCA9IHZhbHVlLnN1YnN0cigxKTtcblxuICAgICAgdGhpcy5fbSA9IHtcbiAgICAgICAgZGlyZWN0aW9uOiB2YWx1ZS5zdWJzdHIoMCwgMSksXG4gICAgICAgIHN0ZXBzOiBzdGVwID8gdG9JbnQoc3RlcCkgPyB0b0ludChzdGVwKSA6IHN0ZXAgOiAwXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKFJ1biwgJ2xlbmd0aCcsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIHRoZSBydW5uaW5nIGRpc3RhbmNlIGJhc2VkXG4gICAgICogb24gemVyby1pbmRleGluZyBudW1iZXIgb2Ygc2xpZGVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3M7XG4gICAgICB2YXIgbGVuZ3RoID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlcy5sZW5ndGg7XG5cbiAgICAgIC8vIElmIHRoZSBgYm91bmRgIG9wdGlvbiBpcyBhY2l0dmUsIGEgbWF4aW11bSBydW5uaW5nIGRpc3RhbmNlIHNob3VsZCBiZVxuICAgICAgLy8gcmVkdWNlZCBieSBgcGVyVmlld2AgYW5kIGBmb2N1c0F0YCBzZXR0aW5ncy4gUnVubmluZyBkaXN0YW5jZVxuICAgICAgLy8gc2hvdWxkIGVuZCBiZWZvcmUgY3JlYXRpbmcgYW4gZW1wdHkgc3BhY2UgYWZ0ZXIgaW5zdGFuY2UuXG5cbiAgICAgIGlmIChHbGlkZS5pc1R5cGUoJ3NsaWRlcicpICYmIHNldHRpbmdzLmZvY3VzQXQgIT09ICdjZW50ZXInICYmIHNldHRpbmdzLmJvdW5kKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggLSAxIC0gKHRvSW50KHNldHRpbmdzLnBlclZpZXcpIC0gMSkgKyB0b0ludChzZXR0aW5ncy5mb2N1c0F0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxlbmd0aCAtIDE7XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoUnVuLCAnb2Zmc2V0Jywge1xuICAgIC8qKlxuICAgICAqIEdldHMgc3RhdHVzIG9mIHRoZSBvZmZzZXR0aW5nIGZsYWcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX287XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gUnVuO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjdXJyZW50IHRpbWUuXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZFxuICogYXQgbW9zdCBvbmNlIGR1cmluZyBhIGdpdmVuIHdpbmRvdyBvZiB0aW1lLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0XG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlXG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIHRpbWVvdXQgPSB2b2lkIDAsXG4gICAgICBjb250ZXh0ID0gdm9pZCAwLFxuICAgICAgYXJncyA9IHZvaWQgMCxcbiAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgdmFyIHByZXZpb3VzID0gMDtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG5cbiAgdmFyIGxhdGVyID0gZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IG5vdygpO1xuICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gIH07XG5cbiAgdmFyIHRocm90dGxlZCA9IGZ1bmN0aW9uIHRocm90dGxlZCgpIHtcbiAgICB2YXIgYXQgPSBub3coKTtcbiAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gYXQ7XG4gICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAoYXQgLSBwcmV2aW91cyk7XG4gICAgY29udGV4dCA9IHRoaXM7XG4gICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzID0gYXQ7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdGhyb3R0bGVkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgcHJldmlvdXMgPSAwO1xuICAgIHRpbWVvdXQgPSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxudmFyIE1BUkdJTl9UWVBFID0ge1xuICBsdHI6IFsnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCddLFxuICBydGw6IFsnbWFyZ2luUmlnaHQnLCAnbWFyZ2luTGVmdCddXG59O1xuXG5mdW5jdGlvbiBHYXBzIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBHYXBzID0ge1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgZ2FwcyBiZXR3ZWVuIHNsaWRlcy4gRmlyc3QgYW5kIGxhc3RcbiAgICAgKiBzbGlkZXMgZG8gbm90IHJlY2VpdmUgaXQncyBlZGdlIG1hcmdpbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9ufSBzbGlkZXNcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGFwcGx5OiBmdW5jdGlvbiBhcHBseShzbGlkZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzbGlkZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHN0eWxlID0gc2xpZGVzW2ldLnN0eWxlO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gQ29tcG9uZW50cy5EaXJlY3Rpb24udmFsdWU7XG5cbiAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICBzdHlsZVtNQVJHSU5fVFlQRVtkaXJlY3Rpb25dWzBdXSA9IHRoaXMudmFsdWUgLyAyICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZVtNQVJHSU5fVFlQRVtkaXJlY3Rpb25dWzBdXSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgIT09IHNsaWRlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgc3R5bGVbTUFSR0lOX1RZUEVbZGlyZWN0aW9uXVsxXV0gPSB0aGlzLnZhbHVlIC8gMiArICdweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGVbTUFSR0lOX1RZUEVbZGlyZWN0aW9uXVsxXV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZ2FwcyBmcm9tIHRoZSBzbGlkZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9ufSBzbGlkZXNcbiAgICAgKiBAcmV0dXJucyB7Vm9pZH1cbiAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKHNsaWRlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNsaWRlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgc3R5bGUgPSBzbGlkZXNbaV0uc3R5bGU7XG5cbiAgICAgICAgc3R5bGUubWFyZ2luTGVmdCA9ICcnO1xuICAgICAgICBzdHlsZS5tYXJnaW5SaWdodCA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBkZWZpbmUoR2FwcywgJ3ZhbHVlJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgdmFsdWUgb2YgdGhlIGdhcC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdG9JbnQoR2xpZGUuc2V0dGluZ3MuZ2FwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShHYXBzLCAnZ3JvdycsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFkZGl0aW9uYWwgZGltZW50aW9ucyB2YWx1ZSBjYXVzZWQgYnkgZ2Fwcy5cbiAgICAgKiBVc2VkIHRvIGluY3JlYXNlIHdpZHRoIG9mIHRoZSBzbGlkZXMgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gR2Fwcy52YWx1ZSAqIChDb21wb25lbnRzLlNpemVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKEdhcHMsICdyZWR1Y3RvcicsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHJlZHVjdGlvbiB2YWx1ZSBjYXVzZWQgYnkgZ2Fwcy5cbiAgICAgKiBVc2VkIHRvIHN1YnRyYWN0IHdpZHRoIG9mIHRoZSBzbGlkZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHBlclZpZXcgPSBHbGlkZS5zZXR0aW5ncy5wZXJWaWV3O1xuXG4gICAgICByZXR1cm4gR2Fwcy52YWx1ZSAqIChwZXJWaWV3IC0gMSkgLyBwZXJWaWV3O1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEFwcGx5IGNhbGN1bGF0ZWQgZ2FwczpcbiAgICogLSBhZnRlciBidWlsZGluZywgc28gc2xpZGVzIChpbmNsdWRpbmcgY2xvbmVzKSB3aWxsIHJlY2VpdmUgcHJvcGVyIG1hcmdpbnNcbiAgICogLSBvbiB1cGRhdGluZyB2aWEgQVBJLCB0byByZWNhbGN1bGF0ZSBnYXBzIHdpdGggbmV3IG9wdGlvbnNcbiAgICovXG4gIEV2ZW50cy5vbihbJ2J1aWxkLmFmdGVyJywgJ3VwZGF0ZSddLCB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG4gICAgR2Fwcy5hcHBseShDb21wb25lbnRzLkh0bWwud3JhcHBlci5jaGlsZHJlbik7XG4gIH0sIDMwKSk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBnYXBzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcgdG8gYnJpbmcgbWFya3VwIHRvIGl0cyBpbml0YWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBHYXBzLnJlbW92ZShDb21wb25lbnRzLkh0bWwud3JhcHBlci5jaGlsZHJlbik7XG4gIH0pO1xuXG4gIHJldHVybiBHYXBzO1xufVxuXG4vKipcbiAqIEZpbmRzIHNpYmxpbmdzIG5vZGVzIG9mIHRoZSBwYXNzZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gc2libGluZ3Mobm9kZSkge1xuICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUpIHtcbiAgICB2YXIgbiA9IG5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkO1xuICAgIHZhciBtYXRjaGVkID0gW107XG5cbiAgICBmb3IgKDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcpIHtcbiAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IG5vZGUpIHtcbiAgICAgICAgbWF0Y2hlZC5wdXNoKG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBwYXNzZWQgbm9kZSBleGlzdCBhbmQgaXMgYSB2YWxpZCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGV4aXN0KG5vZGUpIHtcbiAgaWYgKG5vZGUgJiYgbm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgVFJBQ0tfU0VMRUNUT1IgPSAnW2RhdGEtZ2xpZGUtZWw9XCJ0cmFja1wiXSc7XG5cbmZ1bmN0aW9uIEh0bWwgKEdsaWRlLCBDb21wb25lbnRzKSB7XG4gIHZhciBIdG1sID0ge1xuICAgIC8qKlxuICAgICAqIFNldHVwIHNsaWRlciBIVE1MIG5vZGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtHbGlkZX0gZ2xpZGVcbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICB0aGlzLnJvb3QgPSBHbGlkZS5zZWxlY3RvcjtcbiAgICAgIHRoaXMudHJhY2sgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihUUkFDS19TRUxFQ1RPUik7XG4gICAgICB0aGlzLnNsaWRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMud3JhcHBlci5jaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgICByZXR1cm4gIXNsaWRlLmNsYXNzTGlzdC5jb250YWlucyhHbGlkZS5zZXR0aW5ncy5jbGFzc2VzLmNsb25lU2xpZGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShIdG1sLCAncm9vdCcsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIG5vZGUgb2YgdGhlIGdsaWRlIG1haW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBIdG1sLl9yO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgbm9kZSBvZiB0aGUgZ2xpZGUgbWFpbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KHIpIHtcbiAgICAgIGlmIChpc1N0cmluZyhyKSkge1xuICAgICAgICByID0gdG9wLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iocik7XG4gICAgICB9XG4gICAgICBIdG1sLl9yID0gcjtcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmVkIGV4aXN0IHZhbGlkYXRpb25cbiAgICAgICAqL1xuICAgICAgLy8gaWYgKGV4aXN0KHIpKSB7XG4gICAgICAvLyAgIEh0bWwuX3IgPSByO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgd2FybignUm9vdCBlbGVtZW50IG11c3QgYmUgYSBleGlzdGluZyBIdG1sIG5vZGUnKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShIdG1sLCAndHJhY2snLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBub2RlIG9mIHRoZSBnbGlkZSB0cmFjayB3aXRoIHNsaWRlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBIdG1sLl90O1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgbm9kZSBvZiB0aGUgZ2xpZGUgdHJhY2sgd2l0aCBzbGlkZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodCkge1xuICAgICAgSHRtbC5fdCA9IHQ7XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlZCBleGlzdCB2YWxpZGF0aW9uXG4gICAgICAgKi9cbiAgICAgIC8vIGlmIChleGlzdCh0KSkge1xuICAgICAgLy8gICBIdG1sLl90ID0gdDtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIHdhcm4oJ0NvdWxkIG5vdCBmaW5kIHRyYWNrIGVsZW1lbnQuIFBsZWFzZSB1c2UgJyArIFRSQUNLX1NFTEVDVE9SICsgJyBhdHRyaWJ1dGUuJyk7XG4gICAgICAvLyB9XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoSHRtbCwgJ3dyYXBwZXInLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBub2RlIG9mIHRoZSBzbGlkZXMgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBIdG1sLnRyYWNrLmNoaWxkcmVuWzBdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIEh0bWw7XG59XG5cbmZ1bmN0aW9uIFBlZWsgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgdmFyIFBlZWsgPSB7XG4gICAgLyoqXG4gICAgICogU2V0dXBzIGhvdyBtdWNoIHRvIHBlZWsgYmFzZWQgb24gc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBHbGlkZS5zZXR0aW5ncy5wZWVrO1xuICAgIH1cbiAgfTtcblxuICBkZWZpbmUoUGVlaywgJ3ZhbHVlJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgdmFsdWUgb2YgdGhlIHBlZWsuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfE9iamVjdH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBQZWVrLl92O1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgdmFsdWUgb2YgdGhlIHBlZWsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcnxPYmplY3R9IHZhbHVlXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5iZWZvcmUgPSB0b0ludCh2YWx1ZS5iZWZvcmUpO1xuICAgICAgICB2YWx1ZS5hZnRlciA9IHRvSW50KHZhbHVlLmFmdGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBQZWVrLl92ID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoUGVlaywgJ3JlZHVjdG9yJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgcmVkdWN0aW9uIHZhbHVlIGNhdXNlZCBieSBwZWVrLlxuICAgICAqXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IFBlZWsudmFsdWU7XG4gICAgICB2YXIgcGVyVmlldyA9IEdsaWRlLnNldHRpbmdzLnBlclZpZXc7XG5cbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmJlZm9yZSAvIHBlclZpZXcgKyB2YWx1ZS5hZnRlciAvIHBlclZpZXc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZSAqIDIgLyBwZXJWaWV3O1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIHBlZWtpbmcgc2l6ZXMgb246XG4gICAqIC0gd2hlbiByZXNpemluZyB3aW5kb3cgdG8gdXBkYXRlIHRvIHByb3BlciBwZXJjZW50c1xuICAgKi9cbiAgRXZlbnRzLm9uKFsncmVzaXplJywgJ3VwZGF0ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgUGVlay5tb3VudCgpO1xuICB9KTtcblxuICByZXR1cm4gUGVlaztcbn1cblxuZnVuY3Rpb24gTW92ZSAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICB2YXIgTW92ZSA9IHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIG1vdmUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5fbyA9IDA7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBhIG1vdmVtZW50IHZhbHVlIGJhc2VkIG9uIHBhc3NlZCBvZmZzZXQgYW5kIGN1cnJlbnRseSBhY3RpdmUgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IG9mZnNldFxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbWFrZTogZnVuY3Rpb24gbWFrZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG5cbiAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuXG4gICAgICBFdmVudHMuZW1pdCgnbW92ZScsIHtcbiAgICAgICAgbW92ZW1lbnQ6IHRoaXMudmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBFdmVudHMuZW1pdCgnbW92ZS5hZnRlcicsIHtcbiAgICAgICAgICBtb3ZlbWVudDogX3RoaXMudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKE1vdmUsICdvZmZzZXQnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBvZmZzZXQgdmFsdWUgdXNlZCB0byBtb2RpZnkgY3VycmVudCB0cmFuc2xhdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gTW92ZS5fbztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuIG9mZnNldCB2YWx1ZSB1c2VkIHRvIG1vZGlmeSBjdXJyZW50IHRyYW5zbGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgTW92ZS5fbyA9ICFpc1VuZGVmaW5lZCh2YWx1ZSkgPyB0b0ludCh2YWx1ZSkgOiAwO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKE1vdmUsICd0cmFuc2xhdGUnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhdyBtb3ZlbWVudCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBDb21wb25lbnRzLlNpemVzLnNsaWRlV2lkdGggKiBHbGlkZS5pbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShNb3ZlLCAndmFsdWUnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhY3R1YWwgbW92ZW1lbnQgdmFsdWUgY29ycmVjdGVkIGJ5IG9mZnNldC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgIHZhciB0cmFuc2xhdGUgPSB0aGlzLnRyYW5zbGF0ZTtcblxuICAgICAgaWYgKENvbXBvbmVudHMuRGlyZWN0aW9uLmlzKCdydGwnKSkge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlICsgb2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNsYXRlIC0gb2Zmc2V0O1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIE1ha2UgbW92ZW1lbnQgdG8gcHJvcGVyIHNsaWRlIG9uOlxuICAgKiAtIGJlZm9yZSBidWlsZCwgc28gZ2xpZGUgd2lsbCBzdGFydCBhdCBgc3RhcnRBdGAgaW5kZXhcbiAgICogLSBvbiBlYWNoIHN0YW5kYXJkIHJ1biB0byBtb3ZlIHRvIG5ld2x5IGNhbGN1bGF0ZWQgaW5kZXhcbiAgICovXG4gIEV2ZW50cy5vbihbJ2J1aWxkLmJlZm9yZScsICdydW4nXSwgZnVuY3Rpb24gKCkge1xuICAgIE1vdmUubWFrZSgpO1xuICB9KTtcblxuICByZXR1cm4gTW92ZTtcbn1cblxuZnVuY3Rpb24gU2l6ZXMgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgdmFyIFNpemVzID0ge1xuICAgIC8qKlxuICAgICAqIFNldHVwcyBkaW1lbnRpb25zIG9mIHNsaWRlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc2V0dXBTbGlkZXM6IGZ1bmN0aW9uIHNldHVwU2xpZGVzKCkge1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy5zbGlkZVdpZHRoICsgJ3B4JztcbiAgICAgIHZhciBzbGlkZXMgPSBDb21wb25lbnRzLkh0bWwuc2xpZGVzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzbGlkZXNbaV0uc3R5bGUud2lkdGggPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTZXR1cHMgZGltZW50aW9ucyBvZiBzbGlkZXMgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc2V0dXBXcmFwcGVyOiBmdW5jdGlvbiBzZXR1cFdyYXBwZXIoZGltZW50aW9uKSB7XG4gICAgICBDb21wb25lbnRzLkh0bWwud3JhcHBlci5zdHlsZS53aWR0aCA9IHRoaXMud3JhcHBlclNpemUgKyAncHgnO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYXBwbGllZCBzdHlsZXMgZnJvbSBIVE1MIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICB2YXIgc2xpZGVzID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlcztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2xpZGVzW2ldLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICB9XG5cbiAgICAgIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShTaXplcywgJ2xlbmd0aCcsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGNvdW50IG51bWJlciBvZiB0aGUgc2xpZGVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudHMuSHRtbC5zbGlkZXMubGVuZ3RoO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKFNpemVzLCAnd2lkdGgnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB3aWR0aCB2YWx1ZSBvZiB0aGUgZ2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50cy5IdG1sLnJvb3Qub2Zmc2V0V2lkdGg7XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoU2l6ZXMsICd3cmFwcGVyU2l6ZScsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHNpemUgb2YgdGhlIHNsaWRlcyB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFNpemVzLnNsaWRlV2lkdGggKiBTaXplcy5sZW5ndGggKyBDb21wb25lbnRzLkdhcHMuZ3JvdyArIENvbXBvbmVudHMuQ2xvbmVzLmdyb3c7XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoU2l6ZXMsICdzbGlkZVdpZHRoJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgd2lkdGggdmFsdWUgb2YgdGhlIHNpbmdsZSBzbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBTaXplcy53aWR0aCAvIEdsaWRlLnNldHRpbmdzLnBlclZpZXcgLSBDb21wb25lbnRzLlBlZWsucmVkdWN0b3IgLSBDb21wb25lbnRzLkdhcHMucmVkdWN0b3I7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogQXBwbHkgY2FsY3VsYXRlZCBnbGlkZSdzIGRpbWVuc2lvbnM6XG4gICAqIC0gYmVmb3JlIGJ1aWxkaW5nLCBzbyBvdGhlciBkaW1lbnRpb25zIChlLmcuIHRyYW5zbGF0ZSkgd2lsbCBiZSBjYWxjdWxhdGVkIHByb3BlcnRseVxuICAgKiAtIHdoZW4gcmVzaXppbmcgd2luZG93IHRvIHJlY2FsY3VsYXRlIHNpbGRlcyBkaW1lbnNpb25zXG4gICAqIC0gb24gdXBkYXRpbmcgdmlhIEFQSSwgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbnMgYmFzZWQgb24gbmV3IG9wdGlvbnNcbiAgICovXG4gIEV2ZW50cy5vbihbJ2J1aWxkLmJlZm9yZScsICdyZXNpemUnLCAndXBkYXRlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBTaXplcy5zZXR1cFNsaWRlcygpO1xuICAgIFNpemVzLnNldHVwV3JhcHBlcigpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3ZlIGNhbGN1bGF0ZWQgZ2xpZGUncyBkaW1lbnNpb25zOlxuICAgKiAtIG9uIGRlc3RvdGluZyB0byBicmluZyBtYXJrdXAgdG8gaXRzIGluaXRhbCBzdGF0ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIFNpemVzLnJlbW92ZSgpO1xuICB9KTtcblxuICByZXR1cm4gU2l6ZXM7XG59XG5cbmZ1bmN0aW9uIEJ1aWxkIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBCdWlsZCA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0IGdsaWRlIGJ1aWxkaW5nLiBBZGRzIGNsYXNzZXMsIHNldHNcbiAgICAgKiBkaW1lbnNpb25zIGFuZCBzZXR1cHMgaW5pdGlhbCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgRXZlbnRzLmVtaXQoJ2J1aWxkLmJlZm9yZScpO1xuXG4gICAgICB0aGlzLnR5cGVDbGFzcygpO1xuICAgICAgdGhpcy5hY3RpdmVDbGFzcygpO1xuXG4gICAgICBFdmVudHMuZW1pdCgnYnVpbGQuYWZ0ZXInKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGB0eXBlYCBjbGFzcyB0byB0aGUgZ2xpZGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgdHlwZUNsYXNzOiBmdW5jdGlvbiB0eXBlQ2xhc3MoKSB7XG4gICAgICBDb21wb25lbnRzLkh0bWwucm9vdC5jbGFzc0xpc3QuYWRkKEdsaWRlLnNldHRpbmdzLmNsYXNzZXNbR2xpZGUuc2V0dGluZ3MudHlwZV0pO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIGNsYXNzIHRvIGN1cnJlbnQgc2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGFjdGl2ZUNsYXNzOiBmdW5jdGlvbiBhY3RpdmVDbGFzcygpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gR2xpZGUuc2V0dGluZ3MuY2xhc3NlcztcbiAgICAgIHZhciBzbGlkZSA9IENvbXBvbmVudHMuSHRtbC5zbGlkZXNbR2xpZGUuaW5kZXhdO1xuXG4gICAgICBpZiAoc2xpZGUpIHtcbiAgICAgICAgc2xpZGUuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmFjdGl2ZVNsaWRlKTtcblxuICAgICAgICBzaWJsaW5ncyhzbGlkZSkuZm9yRWFjaChmdW5jdGlvbiAoc2libGluZykge1xuICAgICAgICAgIHNpYmxpbmcuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzLmFjdGl2ZVNsaWRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBIVE1MIGNsYXNzZXMgYXBwbGllZCBhdCBidWlsZGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlQ2xhc3NlczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3NlcygpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gR2xpZGUuc2V0dGluZ3MuY2xhc3NlcztcblxuICAgICAgQ29tcG9uZW50cy5IdG1sLnJvb3QuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzW0dsaWRlLnNldHRpbmdzLnR5cGVdKTtcblxuICAgICAgQ29tcG9uZW50cy5IdG1sLnNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzaWJsaW5nKSB7XG4gICAgICAgIHNpYmxpbmcuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzLmFjdGl2ZVNsaWRlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2xlYXIgYnVpbGRpbmcgY2xhc3NlczpcbiAgICogLSBvbiBkZXN0cm95aW5nIHRvIGJyaW5nIEhUTUwgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICogLSBvbiB1cGRhdGluZyB0byByZW1vdmUgY2xhc3NlcyBiZWZvcmUgcmVtb3VudGluZyBjb21wb25lbnRcbiAgICovXG4gIEV2ZW50cy5vbihbJ2Rlc3Ryb3knLCAndXBkYXRlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBCdWlsZC5yZW1vdmVDbGFzc2VzKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZW1vdW50IGNvbXBvbmVudDpcbiAgICogLSBvbiByZXNpemluZyBvZiB0aGUgd2luZG93IHRvIGNhbGN1bGF0ZSBuZXcgZGltZW50aW9uc1xuICAgKiAtIG9uIHVwZGF0aW5nIHNldHRpbmdzIHZpYSBBUElcbiAgICovXG4gIEV2ZW50cy5vbihbJ3Jlc2l6ZScsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIEJ1aWxkLm1vdW50KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTd2FwIGFjdGl2ZSBjbGFzcyBvZiBjdXJyZW50IHNsaWRlOlxuICAgKiAtIGFmdGVyIGVhY2ggbW92ZSB0byB0aGUgbmV3IGluZGV4XG4gICAqL1xuICBFdmVudHMub24oJ21vdmUuYWZ0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgQnVpbGQuYWN0aXZlQ2xhc3MoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIEJ1aWxkO1xufVxuXG5mdW5jdGlvbiBDbG9uZXMgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgdmFyIENsb25lcyA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcGF0dGVybiBtYXAgYW5kIGNvbGxlY3Qgc2xpZGVzIHRvIGJlIGNsb25lZC5cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICB0aGlzLml0ZW1zID0gW107XG5cbiAgICAgIGlmIChHbGlkZS5pc1R5cGUoJ2Nhcm91c2VsJykpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuY29sbGVjdCgpO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3QgY2xvbmVzIHdpdGggcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgY29sbGVjdDogZnVuY3Rpb24gY29sbGVjdCgpIHtcbiAgICAgIHZhciBpdGVtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgICB2YXIgc2xpZGVzID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlcztcbiAgICAgIHZhciBfR2xpZGUkc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncyxcbiAgICAgICAgICBwZXJWaWV3ID0gX0dsaWRlJHNldHRpbmdzLnBlclZpZXcsXG4gICAgICAgICAgY2xhc3NlcyA9IF9HbGlkZSRzZXR0aW5ncy5jbGFzc2VzO1xuXG5cbiAgICAgIHZhciBwZWVrSW5jcmVtZW50ZXIgPSArISFHbGlkZS5zZXR0aW5ncy5wZWVrO1xuICAgICAgdmFyIHBhcnQgPSBwZXJWaWV3ICsgcGVla0luY3JlbWVudGVyO1xuICAgICAgdmFyIHN0YXJ0ID0gc2xpZGVzLnNsaWNlKDAsIHBhcnQpO1xuICAgICAgdmFyIGVuZCA9IHNsaWRlcy5zbGljZSgtcGFydCk7XG5cbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihwZXJWaWV3IC8gc2xpZGVzLmxlbmd0aCkpOyByKyspIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHN0YXJ0W2ldLmNsb25lTm9kZSh0cnVlKTtcblxuICAgICAgICAgIGNsb25lLmNsYXNzTGlzdC5hZGQoY2xhc3Nlcy5jbG9uZVNsaWRlKTtcblxuICAgICAgICAgIGl0ZW1zLnB1c2goY2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVuZC5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0gZW5kW19pXS5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgICBfY2xvbmUuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmNsb25lU2xpZGUpO1xuXG4gICAgICAgICAgaXRlbXMudW5zaGlmdChfY2xvbmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmQgY2xvbmVkIHNsaWRlcyB3aXRoIGdlbmVyYXRlZCBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBhcHBlbmQ6IGZ1bmN0aW9uIGFwcGVuZCgpIHtcbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgICB2YXIgX0NvbXBvbmVudHMkSHRtbCA9IENvbXBvbmVudHMuSHRtbCxcbiAgICAgICAgICB3cmFwcGVyID0gX0NvbXBvbmVudHMkSHRtbC53cmFwcGVyLFxuICAgICAgICAgIHNsaWRlcyA9IF9Db21wb25lbnRzJEh0bWwuc2xpZGVzO1xuXG5cbiAgICAgIHZhciBoYWxmID0gTWF0aC5mbG9vcihpdGVtcy5sZW5ndGggLyAyKTtcbiAgICAgIHZhciBwcmVwZW5kID0gaXRlbXMuc2xpY2UoMCwgaGFsZikucmV2ZXJzZSgpO1xuICAgICAgdmFyIGFwcGVuZCA9IGl0ZW1zLnNsaWNlKGhhbGYsIGl0ZW1zLmxlbmd0aCk7XG4gICAgICB2YXIgd2lkdGggPSBDb21wb25lbnRzLlNpemVzLnNsaWRlV2lkdGggKyAncHgnO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFwcGVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGFwcGVuZFtpXSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByZXBlbmQubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB3cmFwcGVyLmluc2VydEJlZm9yZShwcmVwZW5kW19pMl0sIHNsaWRlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGl0ZW1zLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgaXRlbXNbX2kzXS5zdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgY2xvbmVkIHNsaWRlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIucmVtb3ZlQ2hpbGQoaXRlbXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBkZWZpbmUoQ2xvbmVzLCAnZ3JvdycsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFkZGl0aW9uYWwgZGltZW50aW9ucyB2YWx1ZSBjYXVzZWQgYnkgY2xvbmVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIChDb21wb25lbnRzLlNpemVzLnNsaWRlV2lkdGggKyBDb21wb25lbnRzLkdhcHMudmFsdWUpICogQ2xvbmVzLml0ZW1zLmxlbmd0aDtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBcHBlbmQgYWRkaXRpb25hbCBzbGlkZSdzIGNsb25lczpcbiAgICogLSB3aGlsZSBnbGlkZSdzIHR5cGUgaXMgYGNhcm91c2VsYFxuICAgKi9cbiAgRXZlbnRzLm9uKCd1cGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgQ2xvbmVzLnJlbW92ZSgpO1xuICAgIENsb25lcy5tb3VudCgpO1xuICAgIENsb25lcy5hcHBlbmQoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEFwcGVuZCBhZGRpdGlvbmFsIHNsaWRlJ3MgY2xvbmVzOlxuICAgKiAtIHdoaWxlIGdsaWRlJ3MgdHlwZSBpcyBgY2Fyb3VzZWxgXG4gICAqL1xuICBFdmVudHMub24oJ2J1aWxkLmJlZm9yZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoR2xpZGUuaXNUeXBlKCdjYXJvdXNlbCcpKSB7XG4gICAgICBDbG9uZXMuYXBwZW5kKCk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogUmVtb3ZlIGNsb25lcyBIVE1MRWxlbWVudHM6XG4gICAqIC0gb24gZGVzdHJveWluZywgdG8gYnJpbmcgSFRNTCB0byBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIENsb25lcy5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIENsb25lcztcbn1cblxudmFyIEV2ZW50c0JpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIEV2ZW50c0JpbmRlciBpbnN0YW5jZS5cbiAgICovXG4gIGZ1bmN0aW9uIEV2ZW50c0JpbmRlcigpIHtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudHNCaW5kZXIpO1xuXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBldmVudHMgbGlzdGVuZXJzIHRvIGFycm93cyBIVE1MIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9IGV2ZW50c1xuICAgKiBAcGFyYW0gIHtFbGVtZW50fFdpbmRvd3xEb2N1bWVudH0gZWxcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNsb3N1cmVcbiAgICogQHBhcmFtICB7Qm9vbGVhbnxPYmplY3R9IGNhcHR1cmVcbiAgICogQHJldHVybiB7Vm9pZH1cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhFdmVudHNCaW5kZXIsIFt7XG4gICAga2V5OiAnb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudHMsIGVsLCBjbG9zdXJlKSB7XG4gICAgICB2YXIgY2FwdHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG5cbiAgICAgIGlmIChpc1N0cmluZyhldmVudHMpKSB7XG4gICAgICAgIGV2ZW50cyA9IFtldmVudHNdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudHNbaV1dID0gY2xvc3VyZTtcblxuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50c1tpXSwgdGhpcy5saXN0ZW5lcnNbZXZlbnRzW2ldXSwgY2FwdHVyZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZnJvbSBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gZXZlbnRzXG4gICAgICogQHBhcmFtICB7RWxlbWVudHxXaW5kb3d8RG9jdW1lbnR9IGVsXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbnxPYmplY3R9IGNhcHR1cmVcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvZmYnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnRzLCBlbCkge1xuICAgICAgdmFyIGNhcHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gICAgICBpZiAoaXNTdHJpbmcoZXZlbnRzKSkge1xuICAgICAgICBldmVudHMgPSBbZXZlbnRzXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHNbaV0sIHRoaXMubGlzdGVuZXJzW2V2ZW50c1tpXV0sIGNhcHR1cmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgY29sbGVjdGVkIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtWb2lkfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVycztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEV2ZW50c0JpbmRlcjtcbn0oKTtcblxuZnVuY3Rpb24gUmVzaXplIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgYmluZGVyIGZvciBET00gRXZlbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRzQmluZGVyfVxuICAgKi9cbiAgdmFyIEJpbmRlciA9IG5ldyBFdmVudHNCaW5kZXIoKTtcblxuICB2YXIgUmVzaXplID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHdpbmRvdyBiaW5kaW5ncy5cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICB0aGlzLmJpbmQoKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBgcmV6c2l6ZWAgbGlzdGVuZXIgdG8gdGhlIHdpbmRvdy5cbiAgICAgKiBJdCdzIGEgY29zdGx5IGV2ZW50LCBzbyB3ZSBhcmUgZGVib3VuY2luZyBpdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24gYmluZCgpIHtcbiAgICAgIEJpbmRlci5vbigncmVzaXplJywgd2luZG93LCB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIEV2ZW50cy5lbWl0KCdyZXNpemUnKTtcbiAgICAgIH0sIEdsaWRlLnNldHRpbmdzLnRocm90dGxlKSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBsaXN0ZW5lcnMgZnJvbSB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgIEJpbmRlci5vZmYoJ3Jlc2l6ZScsIHdpbmRvdyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYmluZGluZ3MgZnJvbSB3aW5kb3c6XG4gICAqIC0gb24gZGVzdHJveWluZywgdG8gcmVtb3ZlIGFkZGVkIEV2ZW50TGlzdGVuZXJcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBSZXNpemUudW5iaW5kKCk7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFJlc2l6ZTtcbn1cblxudmFyIFZBTElEX0RJUkVDVElPTlMgPSBbJ2x0cicsICdydGwnXTtcbnZhciBGTElQRURfTU9WRU1FTlRTID0ge1xuICAnPic6ICc8JyxcbiAgJzwnOiAnPicsXG4gICc9JzogJz0nXG59O1xuXG5mdW5jdGlvbiBEaXJlY3Rpb24gKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgdmFyIERpcmVjdGlvbiA9IHtcbiAgICAvKipcbiAgICAgKiBTZXR1cHMgZ2FwIHZhbHVlIGJhc2VkIG9uIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICB0aGlzLnZhbHVlID0gR2xpZGUuc2V0dGluZ3MuZGlyZWN0aW9uO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHBhdHRlcm4gYmFzZWQgb24gZGlyZWN0aW9uIHZhbHVlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVyblxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZShwYXR0ZXJuKSB7XG4gICAgICB2YXIgdG9rZW4gPSBwYXR0ZXJuLnNsaWNlKDAsIDEpO1xuXG4gICAgICBpZiAodGhpcy5pcygncnRsJykpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQodG9rZW4pLmpvaW4oRkxJUEVEX01PVkVNRU5UU1t0b2tlbl0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdmFsdWUgb2YgZGlyZWN0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXM6IGZ1bmN0aW9uIGlzKGRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IGRpcmVjdGlvbjtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGRpcmVjdGlvbiBjbGFzcyB0byB0aGUgcm9vdCBIVE1MIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGFkZENsYXNzOiBmdW5jdGlvbiBhZGRDbGFzcygpIHtcbiAgICAgIENvbXBvbmVudHMuSHRtbC5yb290LmNsYXNzTGlzdC5hZGQoR2xpZGUuc2V0dGluZ3MuY2xhc3Nlcy5kaXJlY3Rpb25bdGhpcy52YWx1ZV0pO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZGlyZWN0aW9uIGNsYXNzIGZyb20gdGhlIHJvb3QgSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVDbGFzczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoKSB7XG4gICAgICBDb21wb25lbnRzLkh0bWwucm9vdC5jbGFzc0xpc3QucmVtb3ZlKEdsaWRlLnNldHRpbmdzLmNsYXNzZXMuZGlyZWN0aW9uW3RoaXMudmFsdWVdKTtcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKERpcmVjdGlvbiwgJ3ZhbHVlJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgdmFsdWUgb2YgdGhlIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gRGlyZWN0aW9uLl92O1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgdmFsdWUgb2YgdGhlIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmIChWQUxJRF9ESVJFQ1RJT05TLmluZGV4T2YodmFsdWUpID4gLTEpIHtcbiAgICAgICAgRGlyZWN0aW9uLl92ID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKCdEaXJlY3Rpb24gdmFsdWUgbXVzdCBiZSBgbHRyYCBvciBgcnRsYCcpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIENsZWFyIGRpcmVjdGlvbiBjbGFzczpcbiAgICogLSBvbiBkZXN0cm95IHRvIGJyaW5nIEhUTUwgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICogLSBvbiB1cGRhdGUgdG8gcmVtb3ZlIGNsYXNzIGJlZm9yZSByZWFwcGxpbmcgYmVsbG93XG4gICAqL1xuICBFdmVudHMub24oWydkZXN0cm95JywgJ3VwZGF0ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgRGlyZWN0aW9uLnJlbW92ZUNsYXNzKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZW1vdW50IGNvbXBvbmVudDpcbiAgICogLSBvbiB1cGRhdGUgdG8gcmVmbGVjdCBjaGFuZ2VzIGluIGRpcmVjdGlvbiB2YWx1ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCd1cGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgRGlyZWN0aW9uLm1vdW50KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBcHBseSBkaXJlY3Rpb24gY2xhc3M6XG4gICAqIC0gYmVmb3JlIGJ1aWxkaW5nIHRvIGFwcGx5IGNsYXNzIGZvciB0aGUgZmlyc3QgdGltZVxuICAgKiAtIG9uIHVwZGF0aW5nIHRvIHJlYXBwbHkgZGlyZWN0aW9uIGNsYXNzIHRoYXQgbWF5IGNoYW5nZWRcbiAgICovXG4gIEV2ZW50cy5vbihbJ2J1aWxkLmJlZm9yZScsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIERpcmVjdGlvbi5hZGRDbGFzcygpO1xuICB9KTtcblxuICByZXR1cm4gRGlyZWN0aW9uO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIHZhbHVlIG9mIGdsaWRlIG1vdmVtZW50LlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gR2xpZGVcbiAqIEBwYXJhbSAge09iamVjdH0gQ29tcG9uZW50c1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBSdGwgKEdsaWRlLCBDb21wb25lbnRzKSB7XG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogTmVnYXRlcyB0aGUgcGFzc2VkIHRyYW5zbGF0ZSBpZiBnbGlkZSBpcyBpbiBSVEwgb3B0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgbW9kaWZ5OiBmdW5jdGlvbiBtb2RpZnkodHJhbnNsYXRlKSB7XG4gICAgICBpZiAoQ29tcG9uZW50cy5EaXJlY3Rpb24uaXMoJ3J0bCcpKSB7XG4gICAgICAgIHJldHVybiAtdHJhbnNsYXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNsYXRlO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGdsaWRlIG1vdmVtZW50IHdpdGggYSBgZ2FwYCBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEdsaWRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IENvbXBvbmVudHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gR2FwIChHbGlkZSwgQ29tcG9uZW50cykge1xuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIHBhc3NlZCB0cmFuc2xhdGUgdmFsdWUgd2l0aCBudW1iZXIgaW4gdGhlIGBnYXBgIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgbW9kaWZ5OiBmdW5jdGlvbiBtb2RpZnkodHJhbnNsYXRlKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlICsgQ29tcG9uZW50cy5HYXBzLnZhbHVlICogR2xpZGUuaW5kZXg7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgZ2xpZGUgbW92ZW1lbnQgd2l0aCB3aWR0aCBvZiBhZGRpdGlvbmFsIGNsb25lcyB3aWR0aC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEdsaWRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IENvbXBvbmVudHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gR3JvdyAoR2xpZGUsIENvbXBvbmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBBZGRzIHRvIHRoZSBwYXNzZWQgdHJhbnNsYXRlIHdpZHRoIG9mIHRoZSBoYWxmIG9mIGNsb25lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdHJhbnNsYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGlmeTogZnVuY3Rpb24gbW9kaWZ5KHRyYW5zbGF0ZSkge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZSArIENvbXBvbmVudHMuQ2xvbmVzLmdyb3cgLyAyO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGdsaWRlIG1vdmVtZW50IHdpdGggYSBgcGVla2Agc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBHbGlkZVxuICogQHBhcmFtICB7T2JqZWN0fSBDb21wb25lbnRzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIFBlZWtpbmcgKEdsaWRlLCBDb21wb25lbnRzKSB7XG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogTW9kaWZpZXMgcGFzc2VkIHRyYW5zbGF0ZSB2YWx1ZSB3aXRoIGEgYHBlZWtgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHRyYW5zbGF0ZVxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBtb2RpZnk6IGZ1bmN0aW9uIG1vZGlmeSh0cmFuc2xhdGUpIHtcbiAgICAgIGlmIChHbGlkZS5zZXR0aW5ncy5mb2N1c0F0ID49IDApIHtcbiAgICAgICAgdmFyIHBlZWsgPSBDb21wb25lbnRzLlBlZWsudmFsdWU7XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KHBlZWspKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZSAtIHBlZWsuYmVmb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZSAtIHBlZWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFuc2xhdGU7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgZ2xpZGUgbW92ZW1lbnQgd2l0aCBhIGBmb2N1c0F0YCBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEdsaWRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IENvbXBvbmVudHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gRm9jdXNpbmcgKEdsaWRlLCBDb21wb25lbnRzKSB7XG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogTW9kaWZpZXMgcGFzc2VkIHRyYW5zbGF0ZSB2YWx1ZSB3aXRoIGluZGV4IGluIHRoZSBgZm9jdXNBdGAgc2V0dGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdHJhbnNsYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGlmeTogZnVuY3Rpb24gbW9kaWZ5KHRyYW5zbGF0ZSkge1xuICAgICAgdmFyIGdhcCA9IENvbXBvbmVudHMuR2Fwcy52YWx1ZTtcbiAgICAgIHZhciB3aWR0aCA9IENvbXBvbmVudHMuU2l6ZXMud2lkdGg7XG4gICAgICB2YXIgZm9jdXNBdCA9IEdsaWRlLnNldHRpbmdzLmZvY3VzQXQ7XG4gICAgICB2YXIgc2xpZGVXaWR0aCA9IENvbXBvbmVudHMuU2l6ZXMuc2xpZGVXaWR0aDtcblxuICAgICAgaWYgKGZvY3VzQXQgPT09ICdjZW50ZXInKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGUgLSAod2lkdGggLyAyIC0gc2xpZGVXaWR0aCAvIDIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNsYXRlIC0gc2xpZGVXaWR0aCAqIGZvY3VzQXQgLSBnYXAgKiBmb2N1c0F0O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGRpZmZyZW50IHRyYW5zZm9ybWVycyBvbiB0cmFuc2xhdGUgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBHbGlkZVxuICogQHBhcmFtICB7T2JqZWN0fSBDb21wb25lbnRzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG11dGF0b3IgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgLyoqXG4gICAqIE1lcmdlIGluc3RhbmNlIHRyYW5zZm9ybWVycyB3aXRoIGNvbGxlY3Rpb24gb2YgZGVmYXVsdCB0cmFuc2Zvcm1lcnMuXG4gICAqIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIFJ0bCBjb21wb25lbnQgYmUgbGFzdCBvbiB0aGUgbGlzdCxcbiAgICogc28gaXQgcmVmbGVjdHMgYWxsIHByZXZpb3VzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge0FycmF5fVxuICAgKi9cbiAgdmFyIFRSQU5TRk9STUVSUyA9IFtHYXAsIEdyb3csIFBlZWtpbmcsIEZvY3VzaW5nXS5jb25jYXQoR2xpZGUuX3QsIFtSdGxdKTtcblxuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIFBpcGxpbmVzIHRyYW5zbGF0ZSB2YWx1ZSB3aXRoIHJlZ2lzdGVyZWQgdHJhbnNmb3JtZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUodHJhbnNsYXRlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFRSQU5TRk9STUVSUy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdHJhbnNmb3JtZXIgPSBUUkFOU0ZPUk1FUlNbaV07XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odHJhbnNmb3JtZXIpICYmIGlzRnVuY3Rpb24odHJhbnNmb3JtZXIoKS5tb2RpZnkpKSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gdHJhbnNmb3JtZXIoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykubW9kaWZ5KHRyYW5zbGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybignVHJhbnNmb3JtZXIgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGBtb2RpZnkoKWAgbWV0aG9kJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIFRyYW5zbGF0ZSAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICB2YXIgVHJhbnNsYXRlID0ge1xuICAgIC8qKlxuICAgICAqIFNldHMgdmFsdWUgb2YgdHJhbnNsYXRlIG9uIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZVxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBtdXRhdG9yKEdsaWRlLCBDb21wb25lbnRzKS5tdXRhdGUodmFsdWUpO1xuXG4gICAgICBDb21wb25lbnRzLkh0bWwud3JhcHBlci5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlM2QoJyArIC0xICogdHJhbnNmb3JtICsgJ3B4LCAwcHgsIDBweCknO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdmFsdWUgb2YgdHJhbnNsYXRlIGZyb20gSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0IG5ldyB0cmFuc2xhdGUgdmFsdWU6XG4gICAqIC0gb24gbW92ZSB0byByZWZsZWN0IGluZGV4IGNoYW5nZVxuICAgKiAtIG9uIHVwZGF0aW5nIHZpYSBBUEkgdG8gcmVmbGVjdCBwb3NzaWJsZSBjaGFuZ2VzIGluIG9wdGlvbnNcbiAgICovXG4gIEV2ZW50cy5vbignbW92ZScsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIGdhcCA9IENvbXBvbmVudHMuR2Fwcy52YWx1ZTtcbiAgICB2YXIgbGVuZ3RoID0gQ29tcG9uZW50cy5TaXplcy5sZW5ndGg7XG4gICAgdmFyIHdpZHRoID0gQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoO1xuXG4gICAgaWYgKEdsaWRlLmlzVHlwZSgnY2Fyb3VzZWwnKSAmJiBDb21wb25lbnRzLlJ1bi5pc09mZnNldCgnPCcpKSB7XG4gICAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBFdmVudHMuZW1pdCgndHJhbnNsYXRlLmp1bXAnKTtcblxuICAgICAgICBUcmFuc2xhdGUuc2V0KHdpZHRoICogKGxlbmd0aCAtIDEpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gVHJhbnNsYXRlLnNldCgtd2lkdGggLSBnYXAgKiBsZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChHbGlkZS5pc1R5cGUoJ2Nhcm91c2VsJykgJiYgQ29tcG9uZW50cy5SdW4uaXNPZmZzZXQoJz4nKSkge1xuICAgICAgQ29tcG9uZW50cy5UcmFuc2l0aW9uLmFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgRXZlbnRzLmVtaXQoJ3RyYW5zbGF0ZS5qdW1wJyk7XG5cbiAgICAgICAgVHJhbnNsYXRlLnNldCgwKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gVHJhbnNsYXRlLnNldCh3aWR0aCAqIGxlbmd0aCArIGdhcCAqIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFRyYW5zbGF0ZS5zZXQoY29udGV4dC5tb3ZlbWVudCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgdHJhbnNsYXRlOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcgdG8gYnJpbmcgbWFya3VwIHRvIGl0cyBpbml0YWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBUcmFuc2xhdGUucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBUcmFuc2xhdGU7XG59XG5cbmZ1bmN0aW9uIFRyYW5zaXRpb24gKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgLyoqXG4gICAqIEhvbGRzIGluYWN0aXZpdHkgc3RhdHVzIG9mIHRyYW5zaXRpb24uXG4gICAqIFdoZW4gdHJ1ZSB0cmFuc2l0aW9uIGlzIG5vdCBhcHBsaWVkLlxuICAgKlxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHZhciBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIHZhciBUcmFuc2l0aW9uID0ge1xuICAgIC8qKlxuICAgICAqIENvbXBvc2VzIHN0cmluZyBvZiB0aGUgQ1NTIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgY29tcG9zZTogZnVuY3Rpb24gY29tcG9zZShwcm9wZXJ0eSkge1xuICAgICAgdmFyIHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3M7XG5cbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5ICsgJyAnICsgdGhpcy5kdXJhdGlvbiArICdtcyAnICsgc2V0dGluZ3MuYW5pbWF0aW9uVGltaW5nRnVuYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BlcnR5ICsgJyAwbXMgJyArIHNldHRpbmdzLmFuaW1hdGlvblRpbWluZ0Z1bmM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyB2YWx1ZSBvZiB0cmFuc2l0aW9uIG9uIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gcHJvcGVydHlcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHByb3BlcnR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAndHJhbnNmb3JtJztcblxuICAgICAgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuY29tcG9zZShwcm9wZXJ0eSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB2YWx1ZSBvZiB0cmFuc2l0aW9uIGZyb20gSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGNhbGxiYWNrIGFmdGVyIGFuaW1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uIGFmdGVyKGNhbGxiYWNrKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sIHRoaXMuZHVyYXRpb24pO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBlbmFibGU6IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuc2V0KCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLnNldCgpO1xuICAgIH1cbiAgfTtcblxuICBkZWZpbmUoVHJhbnNpdGlvbiwgJ2R1cmF0aW9uJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gYmFzZWRcbiAgICAgKiBvbiBjdXJyZW50bHkgcnVubmluZyBhbmltYXRpb24gdHlwZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBzZXR0aW5ncyA9IEdsaWRlLnNldHRpbmdzO1xuXG4gICAgICBpZiAoR2xpZGUuaXNUeXBlKCdzbGlkZXInKSAmJiBDb21wb25lbnRzLlJ1bi5vZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJld2luZER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2V0dGluZ3MuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogU2V0IHRyYW5zaXRpb24gYHN0eWxlYCB2YWx1ZTpcbiAgICogLSBvbiBlYWNoIG1vdmluZywgYmVjYXVzZSBpdCBtYXkgYmUgY2xlYXJlZCBieSBvZmZzZXQgbW92ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdtb3ZlJywgZnVuY3Rpb24gKCkge1xuICAgIFRyYW5zaXRpb24uc2V0KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRyYW5zaXRpb246XG4gICAqIC0gYmVmb3JlIGluaXRpYWwgYnVpbGQgdG8gYXZvaWQgdHJhbnNpdGlvbmluZyBmcm9tIGAwYCB0byBgc3RhcnRBdGAgaW5kZXhcbiAgICogLSB3aGlsZSByZXNpemluZyB3aW5kb3cgYW5kIHJlY2FsY3VsYXRpbmcgZGltZW50aW9uc1xuICAgKiAtIG9uIGp1bXBpbmcgZnJvbSBvZmZzZXQgdHJhbnNpdGlvbiBhdCBzdGFydCBhbmQgZW5kIGVkZ2VzIGluIGBjYXJvdXNlbGAgdHlwZVxuICAgKi9cbiAgRXZlbnRzLm9uKFsnYnVpbGQuYmVmb3JlJywgJ3Jlc2l6ZScsICd0cmFuc2xhdGUuanVtcCddLCBmdW5jdGlvbiAoKSB7XG4gICAgVHJhbnNpdGlvbi5kaXNhYmxlKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdHJhbnNpdGlvbjpcbiAgICogLSBvbiBlYWNoIHJ1bm5pbmcsIGJlY2F1c2UgaXQgbWF5IGJlIGRpc2FibGVkIGJ5IG9mZnNldCBtb3ZlXG4gICAqL1xuICBFdmVudHMub24oJ3J1bicsIGZ1bmN0aW9uICgpIHtcbiAgICBUcmFuc2l0aW9uLmVuYWJsZSgpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRyYW5zaXRpb246XG4gICAqIC0gb24gZGVzdHJveWluZyB0byBicmluZyBtYXJrdXAgdG8gaXRzIGluaXRhbCBzdGF0ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIFRyYW5zaXRpb24ucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufVxuXG4vKipcbiAqIFRlc3QgdmlhIGEgZ2V0dGVyIGluIHRoZSBvcHRpb25zIG9iamVjdCB0byBzZWVcbiAqIGlmIHRoZSBwYXNzaXZlIHByb3BlcnR5IGlzIGFjY2Vzc2VkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQjZmVhdHVyZS1kZXRlY3Rpb25cbiAqL1xuXG52YXIgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBvcHRzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBvcHRzKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgb3B0cyk7XG59IGNhdGNoIChlKSB7fVxuXG52YXIgc3VwcG9ydHNQYXNzaXZlJDEgPSBzdXBwb3J0c1Bhc3NpdmU7XG5cbnZhciBTVEFSVF9FVkVOVFMgPSBbJ3RvdWNoc3RhcnQnLCAnbW91c2Vkb3duJ107XG52YXIgTU9WRV9FVkVOVFMgPSBbJ3RvdWNobW92ZScsICdtb3VzZW1vdmUnXTtcbnZhciBFTkRfRVZFTlRTID0gWyd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcsICdtb3VzZXVwJywgJ21vdXNlbGVhdmUnXTtcbnZhciBNT1VTRV9FVkVOVFMgPSBbJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAnbW91c2V1cCcsICdtb3VzZWxlYXZlJ107XG5cbmZ1bmN0aW9uIHN3aXBlIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgYmluZGVyIGZvciBET00gRXZlbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRzQmluZGVyfVxuICAgKi9cbiAgdmFyIEJpbmRlciA9IG5ldyBFdmVudHNCaW5kZXIoKTtcblxuICB2YXIgc3dpcGVTaW4gPSAwO1xuICB2YXIgc3dpcGVTdGFydFggPSAwO1xuICB2YXIgc3dpcGVTdGFydFkgPSAwO1xuICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcbiAgdmFyIGNhcHR1cmUgPSBzdXBwb3J0c1Bhc3NpdmUkMSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogZmFsc2U7XG5cbiAgdmFyIFN3aXBlID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHN3aXBlIGJpbmRpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICB0aGlzLmJpbmRTd2lwZVN0YXJ0KCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3IgYHN3aXBlc3RhcnRgIGV2ZW50LiBDYWxjdWxhdGVzIGVudHJ5IHBvaW50cyBvZiB0aGUgdXNlcidzIHRhcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KGV2ZW50KSB7XG4gICAgICBpZiAoIWRpc2FibGVkICYmICFHbGlkZS5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRpc2FibGUoKTtcblxuICAgICAgICB2YXIgc3dpcGUgPSB0aGlzLnRvdWNoZXMoZXZlbnQpO1xuXG4gICAgICAgIHN3aXBlU2luID0gbnVsbDtcbiAgICAgICAgc3dpcGVTdGFydFggPSB0b0ludChzd2lwZS5wYWdlWCk7XG4gICAgICAgIHN3aXBlU3RhcnRZID0gdG9JbnQoc3dpcGUucGFnZVkpO1xuXG4gICAgICAgIHRoaXMuYmluZFN3aXBlTW92ZSgpO1xuICAgICAgICB0aGlzLmJpbmRTd2lwZUVuZCgpO1xuXG4gICAgICAgIEV2ZW50cy5lbWl0KCdzd2lwZS5zdGFydCcpO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIGBzd2lwZW1vdmVgIGV2ZW50LiBDYWxjdWxhdGVzIHVzZXIncyB0YXAgYW5nbGUgYW5kIGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICovXG4gICAgbW92ZTogZnVuY3Rpb24gbW92ZShldmVudCkge1xuICAgICAgaWYgKCFHbGlkZS5kaXNhYmxlZCkge1xuICAgICAgICB2YXIgX0dsaWRlJHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3MsXG4gICAgICAgICAgICB0b3VjaEFuZ2xlID0gX0dsaWRlJHNldHRpbmdzLnRvdWNoQW5nbGUsXG4gICAgICAgICAgICB0b3VjaFJhdGlvID0gX0dsaWRlJHNldHRpbmdzLnRvdWNoUmF0aW8sXG4gICAgICAgICAgICBjbGFzc2VzID0gX0dsaWRlJHNldHRpbmdzLmNsYXNzZXM7XG5cblxuICAgICAgICB2YXIgc3dpcGUgPSB0aGlzLnRvdWNoZXMoZXZlbnQpO1xuXG4gICAgICAgIHZhciBzdWJFeFN4ID0gdG9JbnQoc3dpcGUucGFnZVgpIC0gc3dpcGVTdGFydFg7XG4gICAgICAgIHZhciBzdWJFeVN5ID0gdG9JbnQoc3dpcGUucGFnZVkpIC0gc3dpcGVTdGFydFk7XG4gICAgICAgIHZhciBwb3dFWCA9IE1hdGguYWJzKHN1YkV4U3ggPDwgMik7XG4gICAgICAgIHZhciBwb3dFWSA9IE1hdGguYWJzKHN1YkV5U3kgPDwgMik7XG4gICAgICAgIHZhciBzd2lwZUh5cG90ZW51c2UgPSBNYXRoLnNxcnQocG93RVggKyBwb3dFWSk7XG4gICAgICAgIHZhciBzd2lwZUNhdGhldHVzID0gTWF0aC5zcXJ0KHBvd0VZKTtcblxuICAgICAgICBzd2lwZVNpbiA9IE1hdGguYXNpbihzd2lwZUNhdGhldHVzIC8gc3dpcGVIeXBvdGVudXNlKTtcblxuICAgICAgICBpZiAoc3dpcGVTaW4gKiAxODAgLyBNYXRoLlBJIDwgdG91Y2hBbmdsZSkge1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgQ29tcG9uZW50cy5Nb3ZlLm1ha2Uoc3ViRXhTeCAqIHRvRmxvYXQodG91Y2hSYXRpbykpO1xuXG4gICAgICAgICAgQ29tcG9uZW50cy5IdG1sLnJvb3QuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmRyYWdnaW5nKTtcblxuICAgICAgICAgIEV2ZW50cy5lbWl0KCdzd2lwZS5tb3ZlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3IgYHN3aXBlZW5kYCBldmVudC4gRmluaXRpYWxpemVzIHVzZXIncyB0YXAgYW5kIGRlY2lkZXMgYWJvdXQgZ2xpZGUgbW92ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgZW5kOiBmdW5jdGlvbiBlbmQoZXZlbnQpIHtcbiAgICAgIGlmICghR2xpZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3M7XG5cbiAgICAgICAgdmFyIHN3aXBlID0gdGhpcy50b3VjaGVzKGV2ZW50KTtcbiAgICAgICAgdmFyIHRocmVzaG9sZCA9IHRoaXMudGhyZXNob2xkKGV2ZW50KTtcblxuICAgICAgICB2YXIgc3dpcGVEaXN0YW5jZSA9IHN3aXBlLnBhZ2VYIC0gc3dpcGVTdGFydFg7XG4gICAgICAgIHZhciBzd2lwZURlZyA9IHN3aXBlU2luICogMTgwIC8gTWF0aC5QSTtcbiAgICAgICAgdmFyIHN0ZXBzID0gTWF0aC5yb3VuZChzd2lwZURpc3RhbmNlIC8gQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoKTtcblxuICAgICAgICB0aGlzLmVuYWJsZSgpO1xuXG4gICAgICAgIGlmIChzd2lwZURpc3RhbmNlID4gdGhyZXNob2xkICYmIHN3aXBlRGVnIDwgc2V0dGluZ3MudG91Y2hBbmdsZSkge1xuICAgICAgICAgIC8vIFdoaWxlIHN3aXBlIGlzIHBvc2l0aXZlIGFuZCBncmVhdGVyIHRoYW4gdGhyZXNob2xkIG1vdmUgYmFja3dhcmQuXG4gICAgICAgICAgaWYgKHNldHRpbmdzLnBlclRvdWNoKSB7XG4gICAgICAgICAgICBzdGVwcyA9IE1hdGgubWluKHN0ZXBzLCB0b0ludChzZXR0aW5ncy5wZXJUb3VjaCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChDb21wb25lbnRzLkRpcmVjdGlvbi5pcygncnRsJykpIHtcbiAgICAgICAgICAgIHN0ZXBzID0gLXN0ZXBzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIENvbXBvbmVudHMuUnVuLm1ha2UoQ29tcG9uZW50cy5EaXJlY3Rpb24ucmVzb2x2ZSgnPCcgKyBzdGVwcykpO1xuICAgICAgICB9IGVsc2UgaWYgKHN3aXBlRGlzdGFuY2UgPCAtdGhyZXNob2xkICYmIHN3aXBlRGVnIDwgc2V0dGluZ3MudG91Y2hBbmdsZSkge1xuICAgICAgICAgIC8vIFdoaWxlIHN3aXBlIGlzIG5lZ2F0aXZlIGFuZCBsb3dlciB0aGFuIG5lZ2F0aXZlIHRocmVzaG9sZCBtb3ZlIGZvcndhcmQuXG4gICAgICAgICAgaWYgKHNldHRpbmdzLnBlclRvdWNoKSB7XG4gICAgICAgICAgICBzdGVwcyA9IE1hdGgubWF4KHN0ZXBzLCAtdG9JbnQoc2V0dGluZ3MucGVyVG91Y2gpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoQ29tcG9uZW50cy5EaXJlY3Rpb24uaXMoJ3J0bCcpKSB7XG4gICAgICAgICAgICBzdGVwcyA9IC1zdGVwcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKENvbXBvbmVudHMuRGlyZWN0aW9uLnJlc29sdmUoJz4nICsgc3RlcHMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGlsZSBzd2lwZSBkb24ndCByZWFjaCBkaXN0YW5jZSBhcHBseSBwcmV2aW91cyB0cmFuc2Zvcm0uXG4gICAgICAgICAgQ29tcG9uZW50cy5Nb3ZlLm1ha2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIENvbXBvbmVudHMuSHRtbC5yb290LmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MuY2xhc3Nlcy5kcmFnZ2luZyk7XG5cbiAgICAgICAgdGhpcy51bmJpbmRTd2lwZU1vdmUoKTtcbiAgICAgICAgdGhpcy51bmJpbmRTd2lwZUVuZCgpO1xuXG4gICAgICAgIEV2ZW50cy5lbWl0KCdzd2lwZS5lbmQnKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBzd2lwZSdzIHN0YXJ0aW5nIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBiaW5kU3dpcGVTdGFydDogZnVuY3Rpb24gYmluZFN3aXBlU3RhcnQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncztcblxuICAgICAgaWYgKHNldHRpbmdzLnN3aXBlVGhyZXNob2xkKSB7XG4gICAgICAgIEJpbmRlci5vbihTVEFSVF9FVkVOVFNbMF0sIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBfdGhpcy5zdGFydChldmVudCk7XG4gICAgICAgIH0sIGNhcHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2V0dGluZ3MuZHJhZ1RocmVzaG9sZCkge1xuICAgICAgICBCaW5kZXIub24oU1RBUlRfRVZFTlRTWzFdLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgX3RoaXMuc3RhcnQoZXZlbnQpO1xuICAgICAgICB9LCBjYXB0dXJlKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmRzIHN3aXBlJ3Mgc3RhcnRpbmcgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHVuYmluZFN3aXBlU3RhcnQ6IGZ1bmN0aW9uIHVuYmluZFN3aXBlU3RhcnQoKSB7XG4gICAgICBCaW5kZXIub2ZmKFNUQVJUX0VWRU5UU1swXSwgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIsIGNhcHR1cmUpO1xuICAgICAgQmluZGVyLm9mZihTVEFSVF9FVkVOVFNbMV0sIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCBjYXB0dXJlKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBzd2lwZSdzIG1vdmluZyBldmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZFN3aXBlTW92ZTogZnVuY3Rpb24gYmluZFN3aXBlTW92ZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBCaW5kZXIub24oTU9WRV9FVkVOVFMsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCB0aHJvdHRsZShmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgX3RoaXMyLm1vdmUoZXZlbnQpO1xuICAgICAgfSwgR2xpZGUuc2V0dGluZ3MudGhyb3R0bGUpLCBjYXB0dXJlKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmRzIHN3aXBlJ3MgbW92aW5nIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmRTd2lwZU1vdmU6IGZ1bmN0aW9uIHVuYmluZFN3aXBlTW92ZSgpIHtcbiAgICAgIEJpbmRlci5vZmYoTU9WRV9FVkVOVFMsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCBjYXB0dXJlKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBzd2lwZSdzIGVuZGluZyBldmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZFN3aXBlRW5kOiBmdW5jdGlvbiBiaW5kU3dpcGVFbmQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgQmluZGVyLm9uKEVORF9FVkVOVFMsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgX3RoaXMzLmVuZChldmVudCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmRzIHN3aXBlJ3MgZW5kaW5nIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmRTd2lwZUVuZDogZnVuY3Rpb24gdW5iaW5kU3dpcGVFbmQoKSB7XG4gICAgICBCaW5kZXIub2ZmKEVORF9FVkVOVFMsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGV2ZW50IHRvdWNoZXMgcG9pbnRzIGFjY29ydGluZyB0byBkaWZmZXJlbnQgdHlwZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKi9cbiAgICB0b3VjaGVzOiBmdW5jdGlvbiB0b3VjaGVzKGV2ZW50KSB7XG4gICAgICBpZiAoTU9VU0VfRVZFTlRTLmluZGV4T2YoZXZlbnQudHlwZSkgPiAtMSkge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudC50b3VjaGVzWzBdIHx8IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEdldHMgdmFsdWUgb2YgbWluaW11bSBzd2lwZSBkaXN0YW5jZSBzZXR0aW5ncyBiYXNlZCBvbiBldmVudCB0eXBlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHRocmVzaG9sZDogZnVuY3Rpb24gdGhyZXNob2xkKGV2ZW50KSB7XG4gICAgICB2YXIgc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncztcblxuICAgICAgaWYgKE1PVVNFX0VWRU5UUy5pbmRleE9mKGV2ZW50LnR5cGUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLmRyYWdUaHJlc2hvbGQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXR0aW5ncy5zd2lwZVRocmVzaG9sZDtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHN3aXBlIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7c2VsZn1cbiAgICAgKi9cbiAgICBlbmFibGU6IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIENvbXBvbmVudHMuVHJhbnNpdGlvbi5lbmFibGUoKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgc3dpcGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzZWxmfVxuICAgICAqL1xuICAgIGRpc2FibGU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICBkaXNhYmxlZCA9IHRydWU7XG5cbiAgICAgIENvbXBvbmVudHMuVHJhbnNpdGlvbi5kaXNhYmxlKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIGNvbXBvbmVudCBjbGFzczpcbiAgICogLSBhZnRlciBpbml0aWFsIGJ1aWxkaW5nXG4gICAqL1xuICBFdmVudHMub24oJ2J1aWxkLmFmdGVyJywgZnVuY3Rpb24gKCkge1xuICAgIENvbXBvbmVudHMuSHRtbC5yb290LmNsYXNzTGlzdC5hZGQoR2xpZGUuc2V0dGluZ3MuY2xhc3Nlcy5zd2lwZWFibGUpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3ZlIHN3aXBpbmcgYmluZGluZ3M6XG4gICAqIC0gb24gZGVzdHJveWluZywgdG8gcmVtb3ZlIGFkZGVkIEV2ZW50TGlzdGVuZXJzXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgU3dpcGUudW5iaW5kU3dpcGVTdGFydCgpO1xuICAgIFN3aXBlLnVuYmluZFN3aXBlTW92ZSgpO1xuICAgIFN3aXBlLnVuYmluZFN3aXBlRW5kKCk7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFN3aXBlO1xufVxuXG5mdW5jdGlvbiBpbWFnZXMgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBiaW5kZXIgZm9yIERPTSBFdmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudHNCaW5kZXJ9XG4gICAqL1xuICB2YXIgQmluZGVyID0gbmV3IEV2ZW50c0JpbmRlcigpO1xuXG4gIHZhciBJbWFnZXMgPSB7XG4gICAgLyoqXG4gICAgICogQmluZHMgbGlzdGVuZXIgdG8gZ2xpZGUgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5iaW5kKCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQmluZHMgYGRyYWdzdGFydGAgZXZlbnQgb24gd3JhcHBlciB0byBwcmV2ZW50IGRyYWdnaW5nIGltYWdlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24gYmluZCgpIHtcbiAgICAgIEJpbmRlci5vbignZHJhZ3N0YXJ0JywgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIsIHRoaXMuZHJhZ3N0YXJ0KTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmRzIGBkcmFnc3RhcnRgIGV2ZW50IG9uIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgQmluZGVyLm9mZignZHJhZ3N0YXJ0JywgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIuIFByZXZlbnRzIGRyYWdnaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBkcmFnc3RhcnQ6IGZ1bmN0aW9uIGRyYWdzdGFydChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBiaW5kaW5ncyBmcm9tIGltYWdlczpcbiAgICogLSBvbiBkZXN0cm95aW5nLCB0byByZW1vdmUgYWRkZWQgRXZlbnRMaXN0ZW5lcnNcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBJbWFnZXMudW5iaW5kKCk7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIEltYWdlcztcbn1cblxuZnVuY3Rpb24gYW5jaG9ycyAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgLyoqXG4gICAqIEhvbGRzIGRldGFjaGluZyBzdGF0dXMgb2YgYW5jaG9ycy5cbiAgICogUHJldmVudHMgZGV0YWNoaW5nIG9mIGFscmVhZHkgZGV0YWNoZWQgYW5jaG9ycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICB2YXIgZGV0YWNoZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSG9sZHMgcHJldmVudGluZyBzdGF0dXMgb2YgYW5jaG9ycy5cbiAgICogSWYgYHRydWVgIHJlZGlyZWN0aW9uIGFmdGVyIGNsaWNrIHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgdmFyIHByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIHZhciBBbmNob3JzID0ge1xuICAgIC8qKlxuICAgICAqIFNldHVwcyBhIGluaXRpYWwgc3RhdGUgb2YgYW5jaG9ycyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Vm9pZH1cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEhvbGRzIGNvbGxlY3Rpb24gb2YgYW5jaG9ycyBlbGVtZW50cy5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHR5cGUge0hUTUxDb2xsZWN0aW9ufVxuICAgICAgICovXG4gICAgICB0aGlzLl9hID0gQ29tcG9uZW50cy5IdG1sLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuXG4gICAgICB0aGlzLmJpbmQoKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBldmVudHMgdG8gYW5jaG9ycyBpbnNpZGUgYSB0cmFjay5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24gYmluZCgpIHtcbiAgICAgIEJpbmRlci5vbignY2xpY2snLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgdGhpcy5jbGljayk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBldmVudHMgYXR0YWNoZWQgdG8gYW5jaG9ycyBpbnNpZGUgYSB0cmFjay5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQoKSB7XG4gICAgICBCaW5kZXIub2ZmKCdjbGljaycsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciBjbGljayBldmVudC4gUHJldmVudHMgY2xpY2tzIHdoZW4gZ2xpZGUgaXMgaW4gYHByZXZlbnRgIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gZXZlbnRcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGNsaWNrOiBmdW5jdGlvbiBjbGljayhldmVudCkge1xuICAgICAgaWYgKHByZXZlbnRlZCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyBhbmNob3JzIGNsaWNrIGV2ZW50IGluc2lkZSBnbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3NlbGZ9XG4gICAgICovXG4gICAgZGV0YWNoOiBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoIWRldGFjaGVkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuaXRlbXNbaV0uZHJhZ2dhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICB0aGlzLml0ZW1zW2ldLnNldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJywgdGhpcy5pdGVtc1tpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG5cbiAgICAgICAgICB0aGlzLml0ZW1zW2ldLnJlbW92ZUF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0YWNoZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhbmNob3JzIGNsaWNrIGV2ZW50cyBpbnNpZGUgZ2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzZWxmfVxuICAgICAqL1xuICAgIGF0dGFjaDogZnVuY3Rpb24gYXR0YWNoKCkge1xuICAgICAgcHJldmVudGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChkZXRhY2hlZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLml0ZW1zW2ldLmRyYWdnYWJsZSA9IHRydWU7XG5cbiAgICAgICAgICB0aGlzLml0ZW1zW2ldLnNldEF0dHJpYnV0ZSgnaHJlZicsIHRoaXMuaXRlbXNbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLWhyZWYnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRhY2hlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKEFuY2hvcnMsICdpdGVtcycsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGNvbGxlY3Rpb24gb2YgdGhlIGFycm93cyBIVE1MIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnRbXX1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBBbmNob3JzLl9hO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIERldGFjaCBhbmNob3JzIGluc2lkZSBzbGlkZXM6XG4gICAqIC0gb24gc3dpcGluZywgc28gdGhleSB3b24ndCByZWRpcmVjdCB0byBpdHMgYGhyZWZgIGF0dHJpYnV0ZXNcbiAgICovXG4gIEV2ZW50cy5vbignc3dpcGUubW92ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBBbmNob3JzLmRldGFjaCgpO1xuICB9KTtcblxuICAvKipcbiAgICogQXR0YWNoIGFuY2hvcnMgaW5zaWRlIHNsaWRlczpcbiAgICogLSBhZnRlciBzd2lwaW5nIGFuZCB0cmFuc2l0aW9ucyBlbmRzLCBzbyB0aGV5IGNhbiByZWRpcmVjdCBhZnRlciBjbGljayBhZ2FpblxuICAgKi9cbiAgRXZlbnRzLm9uKCdzd2lwZS5lbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgQ29tcG9uZW50cy5UcmFuc2l0aW9uLmFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIEFuY2hvcnMuYXR0YWNoKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgYW5jaG9ycyBpbnNpZGUgc2xpZGVzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIGJyaW5nIGFuY2hvcnMgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBBbmNob3JzLmF0dGFjaCgpO1xuICAgIEFuY2hvcnMudW5iaW5kKCk7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIEFuY2hvcnM7XG59XG5cbnZhciBOQVZfU0VMRUNUT1IgPSAnW2RhdGEtZ2xpZGUtZWw9XCJjb250cm9sc1tuYXZdXCJdJztcbnZhciBDT05UUk9MU19TRUxFQ1RPUiA9ICdbZGF0YS1nbGlkZS1lbF49XCJjb250cm9sc1wiXSc7XG5cbmZ1bmN0aW9uIGNvbnRyb2xzIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgYmluZGVyIGZvciBET00gRXZlbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRzQmluZGVyfVxuICAgKi9cbiAgdmFyIEJpbmRlciA9IG5ldyBFdmVudHNCaW5kZXIoKTtcblxuICB2YXIgY2FwdHVyZSA9IHN1cHBvcnRzUGFzc2l2ZSQxID8geyBwYXNzaXZlOiB0cnVlIH0gOiBmYWxzZTtcblxuICB2YXIgQ29udHJvbHMgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdHMgYXJyb3dzLiBCaW5kcyBldmVudHMgbGlzdGVuZXJzXG4gICAgICogdG8gdGhlIGFycm93cyBIVE1MIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICAvKipcbiAgICAgICAqIENvbGxlY3Rpb24gb2YgbmF2aWdhdGlvbiBIVE1MIGVsZW1lbnRzLlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAdHlwZSB7SFRNTENvbGxlY3Rpb259XG4gICAgICAgKi9cbiAgICAgIHRoaXMuX24gPSBDb21wb25lbnRzLkh0bWwucm9vdC5xdWVyeVNlbGVjdG9yQWxsKE5BVl9TRUxFQ1RPUik7XG5cbiAgICAgIC8qKlxuICAgICAgICogQ29sbGVjdGlvbiBvZiBjb250cm9scyBIVE1MIGVsZW1lbnRzLlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAdHlwZSB7SFRNTENvbGxlY3Rpb259XG4gICAgICAgKi9cbiAgICAgIHRoaXMuX2MgPSBDb21wb25lbnRzLkh0bWwucm9vdC5xdWVyeVNlbGVjdG9yQWxsKENPTlRST0xTX1NFTEVDVE9SKTtcblxuICAgICAgdGhpcy5hZGRCaW5kaW5ncygpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIGNsYXNzIHRvIGN1cnJlbnQgc2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHNldEFjdGl2ZTogZnVuY3Rpb24gc2V0QWN0aXZlKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkQ2xhc3ModGhpcy5fbltpXS5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhY3RpdmUgY2xhc3MgdG8gY3VycmVudCBzbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlQWN0aXZlOiBmdW5jdGlvbiByZW1vdmVBY3RpdmUoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcyh0aGlzLl9uW2ldLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIGFjdGl2ZSBjbGFzcyBvbiBpdGVtcyBpbnNpZGUgbmF2aWdhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBjb250cm9sc1xuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYWRkQ2xhc3M6IGZ1bmN0aW9uIGFkZENsYXNzKGNvbnRyb2xzKSB7XG4gICAgICB2YXIgc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncztcbiAgICAgIHZhciBpdGVtID0gY29udHJvbHNbR2xpZGUuaW5kZXhdO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoc2V0dGluZ3MuY2xhc3Nlcy5hY3RpdmVOYXYpO1xuXG4gICAgICAgIHNpYmxpbmdzKGl0ZW0pLmZvckVhY2goZnVuY3Rpb24gKHNpYmxpbmcpIHtcbiAgICAgICAgICBzaWJsaW5nLmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MuY2xhc3Nlcy5hY3RpdmVOYXYpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFjdGl2ZSBjbGFzcyBmcm9tIGFjdGl2ZSBjb250cm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGNvbnRyb2xzXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVDbGFzczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY29udHJvbHMpIHtcbiAgICAgIHZhciBpdGVtID0gY29udHJvbHNbR2xpZGUuaW5kZXhdO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoR2xpZGUuc2V0dGluZ3MuY2xhc3Nlcy5hY3RpdmVOYXYpO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEFkZHMgaGFuZGxlcyB0byB0aGUgZWFjaCBncm91cCBvZiBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYWRkQmluZGluZ3M6IGZ1bmN0aW9uIGFkZEJpbmRpbmdzKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYmluZCh0aGlzLl9jW2ldLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGhhbmRsZXMgZnJvbSB0aGUgZWFjaCBncm91cCBvZiBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlQmluZGluZ3M6IGZ1bmN0aW9uIHJlbW92ZUJpbmRpbmdzKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudW5iaW5kKHRoaXMuX2NbaV0uY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEJpbmRzIGV2ZW50cyB0byBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTENvbGxlY3Rpb259IGVsZW1lbnRzXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsZW1lbnRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIEJpbmRlci5vbignY2xpY2snLCBlbGVtZW50c1tpXSwgdGhpcy5jbGljayk7XG4gICAgICAgIEJpbmRlci5vbigndG91Y2hzdGFydCcsIGVsZW1lbnRzW2ldLCB0aGlzLmNsaWNrLCBjYXB0dXJlKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmRzIGV2ZW50cyBiaW5kZWQgdG8gdGhlIGFycm93cyBIVE1MIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MQ29sbGVjdGlvbn0gZWxlbWVudHNcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsZW1lbnRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIEJpbmRlci5vZmYoWydjbGljaycsICd0b3VjaHN0YXJ0J10sIGVsZW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGBjbGlja2AgZXZlbnQgb24gdGhlIGFycm93cyBIVE1MIGVsZW1lbnRzLlxuICAgICAqIE1vdmVzIHNsaWRlciBpbiBkcmllY3Rpb24gcHJlY2lzZWQgaW5cbiAgICAgKiBgZGF0YS1nbGlkZS1kaXJgIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgY2xpY2s6IGZ1bmN0aW9uIGNsaWNrKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKENvbXBvbmVudHMuRGlyZWN0aW9uLnJlc29sdmUoZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ2xpZGUtZGlyJykpKTtcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKENvbnRyb2xzLCAnaXRlbXMnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBjb2xsZWN0aW9uIG9mIHRoZSBjb250cm9scyBIVE1MIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnRbXX1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBDb250cm9scy5fYztcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTd2FwIGFjdGl2ZSBjbGFzcyBvZiBjdXJyZW50IG5hdmlnYXRpb24gaXRlbTpcbiAgICogLSBhZnRlciBtb3VudGluZyB0byBzZXQgaXQgdG8gaW5pdGlhbCBpbmRleFxuICAgKiAtIGFmdGVyIGVhY2ggbW92ZSB0byB0aGUgbmV3IGluZGV4XG4gICAqL1xuICBFdmVudHMub24oWydtb3VudC5hZnRlcicsICdtb3ZlLmFmdGVyJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBDb250cm9scy5zZXRBY3RpdmUoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBiaW5kaW5ncyBhbmQgSFRNTCBDbGFzc2VzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIGJyaW5nIG1hcmt1cCB0byBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIENvbnRyb2xzLnJlbW92ZUJpbmRpbmdzKCk7XG4gICAgQ29udHJvbHMucmVtb3ZlQWN0aXZlKCk7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIENvbnRyb2xzO1xufVxuXG5mdW5jdGlvbiBrZXlib2FyZCAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgdmFyIEtleWJvYXJkID0ge1xuICAgIC8qKlxuICAgICAqIEJpbmRzIGtleWJvYXJkIGV2ZW50cyBvbiBjb21wb25lbnQgbW91bnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIGlmIChHbGlkZS5zZXR0aW5ncy5rZXlib2FyZCkge1xuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGtleWJvYXJkIHByZXNzIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24gYmluZCgpIHtcbiAgICAgIEJpbmRlci5vbigna2V5dXAnLCBkb2N1bWVudCwgdGhpcy5wcmVzcyk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBrZXlib2FyZCBwcmVzcyBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgQmluZGVyLm9mZigna2V5dXAnLCBkb2N1bWVudCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBrZXlib2FyZCdzIGFycm93cyBwcmVzcyBhbmQgbW92aW5nIGdsaWRlIGZvd2FyZCBhbmQgYmFja3dhcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50XG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBwcmVzczogZnVuY3Rpb24gcHJlc3MoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAzOSkge1xuICAgICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKENvbXBvbmVudHMuRGlyZWN0aW9uLnJlc29sdmUoJz4nKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAzNykge1xuICAgICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKENvbXBvbmVudHMuRGlyZWN0aW9uLnJlc29sdmUoJzwnKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYmluZGluZ3MgZnJvbSBrZXlib2FyZDpcbiAgICogLSBvbiBkZXN0cm95aW5nIHRvIHJlbW92ZSBhZGRlZCBldmVudHNcbiAgICogLSBvbiB1cGRhdGluZyB0byByZW1vdmUgZXZlbnRzIGJlZm9yZSByZW1vdW50aW5nXG4gICAqL1xuICBFdmVudHMub24oWydkZXN0cm95JywgJ3VwZGF0ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgS2V5Ym9hcmQudW5iaW5kKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZW1vdW50IGNvbXBvbmVudFxuICAgKiAtIG9uIHVwZGF0aW5nIHRvIHJlZmxlY3QgcG90ZW50aWFsIGNoYW5nZXMgaW4gc2V0dGluZ3NcbiAgICovXG4gIEV2ZW50cy5vbigndXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIEtleWJvYXJkLm1vdW50KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGJpbmRlcjpcbiAgICogLSBvbiBkZXN0cm95aW5nIHRvIHJlbW92ZSBsaXN0ZW5lcnNcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBCaW5kZXIuZGVzdHJveSgpO1xuICB9KTtcblxuICByZXR1cm4gS2V5Ym9hcmQ7XG59XG5cbmZ1bmN0aW9uIGF1dG9wbGF5IChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgYmluZGVyIGZvciBET00gRXZlbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRzQmluZGVyfVxuICAgKi9cbiAgdmFyIEJpbmRlciA9IG5ldyBFdmVudHNCaW5kZXIoKTtcblxuICB2YXIgQXV0b3BsYXkgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYXV0b3BsYXlpbmcgYW5kIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5zdGFydCgpO1xuXG4gICAgICBpZiAoR2xpZGUuc2V0dGluZ3MuaG92ZXJwYXVzZSkge1xuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYXV0b3BsYXlpbmcgaW4gY29uZmlndXJlZCBpbnRlcnZhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbnxOdW1iZXJ9IGZvcmNlIFJ1biBhdXRvcGxheWluZyB3aXRoIHBhc3NlZCBpbnRlcnZhbCByZWdhcmRsZXNzIG9mIGBhdXRvcGxheWAgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHN0YXJ0OiBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmIChHbGlkZS5zZXR0aW5ncy5hdXRvcGxheSkge1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQodGhpcy5faSkpIHtcbiAgICAgICAgICB0aGlzLl9pID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc3RvcCgpO1xuXG4gICAgICAgICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKCc+Jyk7XG5cbiAgICAgICAgICAgIF90aGlzLnN0YXJ0KCk7XG4gICAgICAgICAgfSwgdGhpcy50aW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIGF1dG9ydW5uaW5nIG9mIHRoZSBnbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuX2kgPSBjbGVhckludGVydmFsKHRoaXMuX2kpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIGF1dG9wbGF5aW5nIHdoaWxlIG1vdXNlIGlzIG92ZXIgZ2xpZGUncyBhcmVhLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBiaW5kOiBmdW5jdGlvbiBiaW5kKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIEJpbmRlci5vbignbW91c2VvdmVyJywgQ29tcG9uZW50cy5IdG1sLnJvb3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnN0b3AoKTtcbiAgICAgIH0pO1xuXG4gICAgICBCaW5kZXIub24oJ21vdXNlb3V0JywgQ29tcG9uZW50cy5IdG1sLnJvb3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnN0YXJ0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmQgbW91c2VvdmVyIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtWb2lkfVxuICAgICAqL1xuICAgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgQmluZGVyLm9mZihbJ21vdXNlb3ZlcicsICdtb3VzZW91dCddLCBDb21wb25lbnRzLkh0bWwucm9vdCk7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShBdXRvcGxheSwgJ3RpbWUnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aW1lIHBlcmlvZCB2YWx1ZSBmb3IgdGhlIGF1dG9wbGF5IGludGVydmFsLiBQcmlvcml0aXplc1xuICAgICAqIHRpbWVzIGluIGBkYXRhLWdsaWRlLWF1dG9wbGF5YCBhdHRydWJ1dGVzIG92ZXIgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBhdXRvcGxheSA9IENvbXBvbmVudHMuSHRtbC5zbGlkZXNbR2xpZGUuaW5kZXhdLmdldEF0dHJpYnV0ZSgnZGF0YS1nbGlkZS1hdXRvcGxheScpO1xuXG4gICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgcmV0dXJuIHRvSW50KGF1dG9wbGF5KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRvSW50KEdsaWRlLnNldHRpbmdzLmF1dG9wbGF5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTdG9wIGF1dG9wbGF5aW5nIGFuZCB1bmJpbmQgZXZlbnRzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIGNsZWFyIGRlZmluZWQgaW50ZXJ2YWxcbiAgICogLSBvbiB1cGRhdGluZyB2aWEgQVBJIHRvIHJlc2V0IGludGVydmFsIHRoYXQgbWF5IGNoYW5nZWRcbiAgICovXG4gIEV2ZW50cy5vbihbJ2Rlc3Ryb3knLCAndXBkYXRlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBBdXRvcGxheS51bmJpbmQoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFN0b3AgYXV0b3BsYXlpbmc6XG4gICAqIC0gYmVmb3JlIGVhY2ggcnVuLCB0byByZXN0YXJ0IGF1dG9wbGF5aW5nXG4gICAqIC0gb24gcGF1c2luZyB2aWEgQVBJXG4gICAqIC0gb24gZGVzdHJveWluZywgdG8gY2xlYXIgZGVmaW5lZCBpbnRlcnZhbFxuICAgKiAtIHdoaWxlIHN0YXJ0aW5nIGEgc3dpcGVcbiAgICogLSBvbiB1cGRhdGluZyB2aWEgQVBJIHRvIHJlc2V0IGludGVydmFsIHRoYXQgbWF5IGNoYW5nZWRcbiAgICovXG4gIEV2ZW50cy5vbihbJ3J1bi5iZWZvcmUnLCAncGF1c2UnLCAnZGVzdHJveScsICdzd2lwZS5zdGFydCcsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIEF1dG9wbGF5LnN0b3AoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGF1dG9wbGF5aW5nOlxuICAgKiAtIGFmdGVyIGVhY2ggcnVuLCB0byByZXN0YXJ0IGF1dG9wbGF5aW5nXG4gICAqIC0gb24gcGxheWluZyB2aWEgQVBJXG4gICAqIC0gd2hpbGUgZW5kaW5nIGEgc3dpcGVcbiAgICovXG4gIEV2ZW50cy5vbihbJ3J1bi5hZnRlcicsICdwbGF5JywgJ3N3aXBlLmVuZCddLCBmdW5jdGlvbiAoKSB7XG4gICAgQXV0b3BsYXkuc3RhcnQoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlbW91bnQgYXV0b3BsYXlpbmc6XG4gICAqIC0gb24gdXBkYXRpbmcgdmlhIEFQSSB0byByZXNldCBpbnRlcnZhbCB0aGF0IG1heSBjaGFuZ2VkXG4gICAqL1xuICBFdmVudHMub24oJ3VwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBBdXRvcGxheS5tb3VudCgpO1xuICB9KTtcblxuICAvKipcbiAgICogRGVzdHJveSBhIGJpbmRlcjpcbiAgICogLSBvbiBkZXN0cm95aW5nIGdsaWRlIGluc3RhbmNlIHRvIGNsZWFydXAgbGlzdGVuZXJzXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIEF1dG9wbGF5O1xufVxuXG4vKipcbiAqIFNvcnRzIGtleXMgb2YgYnJlYWtwb2ludCBvYmplY3Qgc28gdGhleSB3aWxsIGJlIG9yZGVyZWQgZnJvbSBsb3dlciB0byBiaWdnZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBvaW50c1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gc29ydEJyZWFrcG9pbnRzKHBvaW50cykge1xuICBpZiAoaXNPYmplY3QocG9pbnRzKSkge1xuICAgIHJldHVybiBzb3J0S2V5cyhwb2ludHMpO1xuICB9IGVsc2Uge1xuICAgIHdhcm4oJ0JyZWFrcG9pbnRzIG9wdGlvbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBicmVha3BvaW50cyAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgLyoqXG4gICAqIEhvbGRzIHJlZmVyZW5jZSB0byBzZXR0aW5ncy5cbiAgICpcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHZhciBzZXR0aW5ncyA9IEdsaWRlLnNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBIb2xkcyByZWZlcmVuY2UgdG8gYnJlYWtwb2ludHMgb2JqZWN0IGluIHNldHRpbmdzLiBTb3J0cyBicmVha3BvaW50c1xuICAgKiBmcm9tIHNtYWxsZXIgdG8gbGFyZ2VyLiBJdCBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBwcm9wZXJcbiAgICogbWF0Y2hpbmcgY3VycmVudGx5IGFjdGl2ZSBicmVha3BvaW50IHNldHRpbmdzLlxuICAgKlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgdmFyIHBvaW50cyA9IHNvcnRCcmVha3BvaW50cyhzZXR0aW5ncy5icmVha3BvaW50cyk7XG5cbiAgLyoqXG4gICAqIENhY2hlIGluaXRpYWwgc2V0dGluZ3MgYmVmb3JlIG92ZXJ3cml0dGluZy5cbiAgICpcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHZhciBkZWZhdWx0cyA9IF9leHRlbmRzKHt9LCBzZXR0aW5ncyk7XG5cbiAgdmFyIEJyZWFrcG9pbnRzID0ge1xuICAgIC8qKlxuICAgICAqIE1hdGNoZXMgc2V0dGluZ3MgZm9yIGN1cnJlY3RseSBtYXRjaGluZyBtZWRpYSBicmVha3BvaW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBvaW50c1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbWF0Y2g6IGZ1bmN0aW9uIG1hdGNoKHBvaW50cykge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubWF0Y2hNZWRpYSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZm9yICh2YXIgcG9pbnQgaW4gcG9pbnRzKSB7XG4gICAgICAgICAgaWYgKHBvaW50cy5oYXNPd25Qcm9wZXJ0eShwb2ludCkpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogJyArIHBvaW50ICsgJ3B4KScpLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBvaW50c1twb2ludF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE92ZXJ3cml0ZSBpbnN0YW5jZSBzZXR0aW5ncyB3aXRoIGN1cnJlbnRseSBtYXRjaGluZyBicmVha3BvaW50IHNldHRpbmdzLlxuICAgKiBUaGlzIGhhcHBlbnMgcmlnaHQgYWZ0ZXIgY29tcG9uZW50IGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgX2V4dGVuZHMoc2V0dGluZ3MsIEJyZWFrcG9pbnRzLm1hdGNoKHBvaW50cykpO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgZ2xpZGUgd2l0aCBzZXR0aW5ncyBvZiBtYXRjaGVkIGJyZWtwb2ludDpcbiAgICogLSB3aW5kb3cgcmVzaXplIHRvIHVwZGF0ZSBzbGlkZXJcbiAgICovXG4gIEJpbmRlci5vbigncmVzaXplJywgd2luZG93LCB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG4gICAgR2xpZGUuc2V0dGluZ3MgPSBtZXJnZU9wdGlvbnMoc2V0dGluZ3MsIEJyZWFrcG9pbnRzLm1hdGNoKHBvaW50cykpO1xuICB9LCBHbGlkZS5zZXR0aW5ncy50aHJvdHRsZSkpO1xuXG4gIC8qKlxuICAgKiBSZXNvcnQgYW5kIHVwZGF0ZSBkZWZhdWx0IHNldHRpbmdzOlxuICAgKiAtIG9uIHJlaW5pdCB2aWEgQVBJLCBzbyBicmVha3BvaW50IG1hdGNoaW5nIHdpbGwgYmUgcGVyZm9ybWVkIHdpdGggb3B0aW9uc1xuICAgKi9cbiAgRXZlbnRzLm9uKCd1cGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgcG9pbnRzID0gc29ydEJyZWFrcG9pbnRzKHBvaW50cyk7XG5cbiAgICBkZWZhdWx0cyA9IF9leHRlbmRzKHt9LCBzZXR0aW5ncyk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgcmVzaXplIGxpc3RlbmVyOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIGJyaW5nIG1hcmt1cCB0byBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIEJpbmRlci5vZmYoJ3Jlc2l6ZScsIHdpbmRvdyk7XG4gIH0pO1xuXG4gIHJldHVybiBCcmVha3BvaW50cztcbn1cblxudmFyIENPTVBPTkVOVFMgPSB7XG4gIEh0bWw6IEh0bWwsXG4gIFRyYW5zbGF0ZTogVHJhbnNsYXRlLFxuICBUcmFuc2l0aW9uOiBUcmFuc2l0aW9uLFxuICBEaXJlY3Rpb246IERpcmVjdGlvbixcbiAgUGVlazogUGVlayxcbiAgU2l6ZXM6IFNpemVzLFxuICBHYXBzOiBHYXBzLFxuICBNb3ZlOiBNb3ZlLFxuICBDbG9uZXM6IENsb25lcyxcbiAgUmVzaXplOiBSZXNpemUsXG4gIEJ1aWxkOiBCdWlsZCxcbiAgUnVuOiBSdW5cbn07XG5cbnZhciBHbGlkZSQxID0gZnVuY3Rpb24gKF9Db3JlKSB7XG4gIGluaGVyaXRzKEdsaWRlJCQxLCBfQ29yZSk7XG5cbiAgZnVuY3Rpb24gR2xpZGUkJDEoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgR2xpZGUkJDEpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChHbGlkZSQkMS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEdsaWRlJCQxKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhHbGlkZSQkMSwgW3tcbiAgICBrZXk6ICdtb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdmFyIGV4dGVuc2lvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgICByZXR1cm4gZ2V0KEdsaWRlJCQxLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEdsaWRlJCQxLnByb3RvdHlwZSksICdtb3VudCcsIHRoaXMpLmNhbGwodGhpcywgX2V4dGVuZHMoe30sIENPTVBPTkVOVFMsIGV4dGVuc2lvbnMpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEdsaWRlJCQxO1xufShHbGlkZSk7XG5cbmV4cG9ydCBkZWZhdWx0IEdsaWRlJDE7XG5leHBvcnQgeyBzd2lwZSBhcyBTd2lwZSwgaW1hZ2VzIGFzIEltYWdlcywgYW5jaG9ycyBhcyBBbmNob3JzLCBjb250cm9scyBhcyBDb250cm9scywga2V5Ym9hcmQgYXMgS2V5Ym9hcmQsIGF1dG9wbGF5IGFzIEF1dG9wbGF5LCBicmVha3BvaW50cyBhcyBCcmVha3BvaW50cyB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlRm9udEZhY2VzIH0gZnJvbSAnLi4vLi4vbGliL2hlbHBlcnMnXG5pbXBvcnQgc2NzcyBmcm9tICcuL2Rlc2t0b3Auc2Nzcydcbi8vIENhcm91c2VsXG5pbXBvcnQgR2xpZGUsIHsgQ29udHJvbHMsIEJyZWFrcG9pbnRzLCBTd2lwZSwgQXV0b3BsYXkgfSBmcm9tICcuLi8uLi9saWIvZ2xpZGUvZ2xpZGUubW9kdWxhci5lc20uanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENyZWF0aXZlRGVza3RvcCB7XG5cdGNvbnN0cnVjdG9yKHZwYWlkLCBhZENvbnRhaW5lcikge1xuXHRcdHRoaXMudnBhaWQgPSB2cGFpZFxuXHRcdHRoaXMuc2xvdCA9IHZwYWlkLnNsb3RfXG5cdFx0dGhpcy52aWRlb1Nsb3QgPSB0aGlzLnZwYWlkLnZpZGVvU2xvdF9cblx0XHR0aGlzLmNvbnRhaW5lciA9IGFkQ29udGFpbmVyXG5cdFx0dGhpcy5wYXJhbXMgPSB0aGlzLnZwYWlkLnBhcmFtZXRlcnNfXG5cdFx0dGhpcy5pbWcgPSB0aGlzLnBhcmFtcy5pbWdCYXNlUm91dGVcblx0XHQvLyB0aGlzLnZpZGVvID0gdGhpcy5wYXJhbXMudmlkZW9CYXNlUm91dGVcblx0XHR0aGlzLnN0YXRlID0ge1xuXHRcdFx0Y2Fyb3VzZWw6IG51bGwsXG5cdFx0XHRjdXJyZW50U2xpZGVJbmRleDogMFxuXHRcdH1cblxuXHRcdC8vIExvYWQgc3R5bGVzXG5cdFx0dGhpcy52cGFpZC5pRG9jLmhlYWQuYXBwZW5kQ2hpbGQoY3JlYXRlRm9udEZhY2VzKHRoaXMucGFyYW1zLmZvbnRzKSlcblx0XHR0aGlzLnZwYWlkLmlEb2MuaGVhZC5hcHBlbmRDaGlsZCg8c3R5bGU+e3Njc3MudG9TdHJpbmcoKX08L3N0eWxlPilcblxuXHRcdC8vIExvYWQgY29udGVudFxuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2Fyb3VzZWwoJ21haW4nKSlcblx0XHR0aGlzLmluaXRHbGlkZUNhcm91c2VsKCdtYWluJylcblx0fVxuXG5cdGhhbmRsZUNUQShlLCBsaW5rTmFtZSkge1xuXHRcdC8vIENhbGwgdGhlIGNsaWNrIGFkIGV2ZW50IG9uIENUQSByZWRpcmVjdGlvbiwgaW1wb3J0YW50IVxuXHRcdHRoaXMudnBhaWQuY2xpY2tBZF8oKVxuXHRcdGNvbnN0IGxpbmsgPSB0aGlzLnBhcmFtcy5jdGFbbGlua05hbWVdXG5cdFx0cmV0dXJuIHdpbmRvdy5vcGVuKGxpbmssICdfYmxhbmsnKVxuXG5cdFx0Ly8gLy8gQ2FsbCB0aGUgY2xpY2sgYWQgZXZlbnQgb24gQ1RBIHJlZGlyZWN0aW9uLCBpbXBvcnRhbnQhXG5cdFx0Ly8gdGhpcy52cGFpZC5jbGlja0FkXygpXG5cdFx0Ly8gLy8gY29uc3QgbGluayA9IHRoaXMucGFyYW1zLmN0YVtsaW5rTmFtZV1cblx0XHQvLyByZXR1cm4gd2luZG93Lm9wZW4obGluaywgJ19ibGFuaycpXG5cdH1cblxuXHQvLyBjcmVhdGVWaWRlb0NvcHkoZWwsIHZpZGVvTmFtZSkge1xuXHQvLyBcdC8vIENyZWF0ZSBhXHQgY29weSBvZiBpdFxuXHQvLyBcdGNvbnN0IGNsb25lID0gZWwuY2xvbmVOb2RlKHRydWUpXG5cdC8vIFx0Y2xvbmUuc3JjID0gYCR7dGhpcy52aWRlb30vJHt2aWRlb05hbWV9Lm1wNGBcblx0Ly8gXHRjbG9uZS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdibG9jaycsICdpbXBvcnRhbnQnKVxuXHQvLyBcdC8vIGNsb25lLnBhdXNlKClcblx0Ly8gXHRjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCd2cGFpZC12aWRlbycpXG5cdC8vIFx0dGhpcy5zdGF0ZS52aWRlb3MucHVzaChjbG9uZSlcblx0Ly8gXHRyZXR1cm4gY2xvbmVcblx0Ly8gfVxuXG5cdGNhcm91c2VsKGlkKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgaWQ9e2BjYXJvdXNlbC0ke2lkfWB9IGNsYXNzPXtgY2Fyb3VzZWwtY29udGFpbmVyYH0+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJnbGlkZV9fdHJhY2tcIiBkYXRhLWdsaWRlLWVsPVwidHJhY2tcIj5cblx0XHRcdFx0XHQ8dWwgY2xhc3M9XCJnbGlkZV9fc2xpZGVzXCI+XG5cdFx0XHRcdFx0XHQ8bGkgY2xhc3M9XCJnbGlkZV9fc2xpZGUgc2xpZGUtMVwiIG9uQ2xpY2s9eyhlKSA9PiB0aGlzLmhhbmRsZUNUQShlLCAnc2xpZGUtMScpfT5cblx0XHRcdFx0XHRcdFx0PGltZyBzcmM9e2Ake3RoaXMuaW1nfS9zbGlkZXMvUDEtcmVzaXplZC1taW4ucG5nYH0gYWx0PVwiU2xpZGUgb25lXCIgLz5cblx0XHRcdFx0XHRcdDwvbGk+XG5cdFx0XHRcdFx0XHQ8bGkgY2xhc3M9XCJnbGlkZV9fc2xpZGUgc2xpZGUtMlwiIG9uQ2xpY2s9eyhlKSA9PiB0aGlzLmhhbmRsZUNUQShlLCAnc2xpZGUtMicpfT5cblx0XHRcdFx0XHRcdFx0PGltZyBzcmM9e2Ake3RoaXMuaW1nfS9zbGlkZXMvUDItcmVzaXplZC1taW4ucG5nYH0gYWx0PVwiU2xpZGUgdHdvXCIgLz5cblx0XHRcdFx0XHRcdDwvbGk+XG5cdFx0XHRcdFx0XHQ8bGkgY2xhc3M9XCJnbGlkZV9fc2xpZGUgc2xpZGUtM1wiIG9uQ2xpY2s9eyhlKSA9PiB0aGlzLmhhbmRsZUNUQShlLCAnc2xpZGUtMycpfT5cblx0XHRcdFx0XHRcdFx0PGltZyBzcmM9e2Ake3RoaXMuaW1nfS9zbGlkZXMvUDMtcmVzaXplZC1taW4ucG5nYH0gYWx0PVwiU2xpZGUgdGhyZWVcIiAvPlxuXHRcdFx0XHRcdFx0PC9saT5cblx0XHRcdFx0XHRcdDxsaSBjbGFzcz1cImdsaWRlX19zbGlkZSBzbGlkZS00XCIgb25DbGljaz17KGUpID0+IHRoaXMuaGFuZGxlQ1RBKGUsICdzbGlkZS00Jyl9PlxuXHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz17YCR7dGhpcy5pbWd9L3NsaWRlcy9QNC1yZXNpemVkLW1pbi5wbmdgfSBhbHQ9XCJTbGlkZSBmb3VyXCIgLz5cblx0XHRcdFx0XHRcdFx0ey8qIHt0aGlzLmNyZWF0ZVZpZGVvQ29weSh0aGlzLnZpZGVvU2xvdCwgNCl9ICovfVxuXHRcdFx0XHRcdFx0PC9saT5cblx0XHRcdFx0XHQ8L3VsPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZG90c1wiPlxuXHRcdFx0XHRcdDxkaXYgb25DbGljaz17KGUpID0+IHRoaXMuaGFuZGxlR29Ub1NsaWRlKGUsIDApfT5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZG90IGFjdGl2ZVwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgb25DbGljaz17KGUpID0+IHRoaXMuaGFuZGxlR29Ub1NsaWRlKGUsIDEpfT5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZG90XCI+PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBvbkNsaWNrPXsoZSkgPT4gdGhpcy5oYW5kbGVHb1RvU2xpZGUoZSwgMil9PlxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkb3RcIj48L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IG9uQ2xpY2s9eyhlKSA9PiB0aGlzLmhhbmRsZUdvVG9TbGlkZShlLCAzKX0+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRvdFwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuXHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJsb2dvXCIgc3JjPXtgJHt0aGlzLnBhcmFtcy5pbWdMb2dvfWB9IGFsdD1cIkNUQVwiIC8+XG5cdFx0XHRcdFx0PGltZyBjbGFzcz1cImN0YVwiIHNyYz17YCR7dGhpcy5wYXJhbXMuaW1nQ3RhfWB9IG9uQ2xpY2s9eyhlKSA9PiB0aGlzLmhhbmRsZUNUQShlLCAnc2xpZGUtMScpfSBhbHQ9XCJDVEFcIiAvPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHR7LyogPGRpdiBjbGFzcz1cImdsaWRlX19hcnJvd3NcIiBkYXRhLWdsaWRlLWVsPVwiY29udHJvbHNcIj5cblx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdsaWRlX19hcnJvdyBnbGlkZV9fYXJyb3ctLWxlZnRcIiBkYXRhLWdsaWRlLWRpcj1cIjxcIj5cblx0XHRcdFx0XHRcdDxpbWcgc3JjPXtgJHt0aGlzLmltZ30vYXJyb3dzL2Fycm93LWxlZnQucG5nYH0gYWx0PVwiTGVmdFwiIC8+XG5cdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnbGlkZV9fYXJyb3cgZ2xpZGVfX2Fycm93LS1yaWdodFwiIGRhdGEtZ2xpZGUtZGlyPVwiPlwiPlxuXHRcdFx0XHRcdFx0PGltZyBzcmM9e2Ake3RoaXMuaW1nfS9hcnJvd3MvYXJyb3ctcmlnaHQucG5nYH0gYWx0PVwiUmlnaHRcIiAvPlxuXHRcdFx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0XHQ8L2Rpdj4gKi99XG5cdFx0XHQ8L2Rpdj5cblx0XHQpXG5cdH1cblxuXHRoYW5kbGVHb1RvU2xpZGUoZSwgZ29Ubykge1xuXHRcdGNvbnN0IHNlbGVjdGVkRG90ID0gZS50YXJnZXQuZmlyc3RDaGlsZFxuXHRcdHRoaXMuc3RhdGUuY2Fyb3VzZWwuZ28oYD0ke2dvVG99YClcblx0XHRjb25zdCBkb3RzID0gWy4uLnRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kb3QnKV1cblx0XHRkb3RzLmZvckVhY2goKGQpID0+IGQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpXG5cdFx0c2VsZWN0ZWREb3QuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcblx0fVxuXG5cdGluaXRHbGlkZUNhcm91c2VsKGlkKSB7XG5cdFx0Y29uc3QgY2Fyb3VzZWxDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjY2Fyb3VzZWwtJHtpZH1gKVxuXHRcdGNvbnN0IGNvbmZpZyA9IHtcblx0XHRcdHR5cGU6ICdjYXJvdXNlbCcsXG5cdFx0XHRmb2N1c0F0OiAnY2VudGVyJyxcblx0XHRcdHBlclZpZXc6IDFcblx0XHRcdC8vIGluZmluaXRlOiBmYWxzZVxuXHRcdFx0Ly8gc3RhcnRBdDogMSxcblx0XHRcdC8vIGFuaW1hdGlvbkR1cmF0aW9uOiA2MDAsXG5cdFx0XHQvLyByZXdpbmREdXJhdGlvbjogMCxcblx0XHRcdC8vIGdhcDogMFxuXHRcdFx0Ly8gYXV0b3BsYXk6IDUwMDBcblx0XHRcdC8vIHBlZWs6IHtcblx0XHRcdC8vIFx0YmVmb3JlOiAwLFxuXHRcdFx0Ly8gXHRhZnRlcjogNTBcblx0XHRcdC8vIH1cblx0XHR9XG5cdFx0Y29uc3QgZ2xpZGUgPSBuZXcgR2xpZGUoY2Fyb3VzZWxDb250YWluZXIsIGNvbmZpZylcblx0XHQvLyBQbGF5IGZpcnN0IHZpZGVvIGFmdGVyIGdsaWRlIGlzIG1vdW50ZWRcblx0XHRnbGlkZS5vbihbJ21vdW50LmFmdGVyJ10sICgpID0+IHtcblx0XHRcdGlmICghdGhpcy5zdGF0ZS5jYXJvdXNlbCkge1xuXHRcdFx0XHR0aGlzLnN0YXRlLmNhcm91c2VsID0gZ2xpZGVcblx0XHRcdH1cblxuXHRcdFx0Ly8gY29uc3QgdmlkZW8gPSB0aGlzLnN0YXRlLnZpZGVvc1tnbGlkZS5pbmRleF1cblx0XHRcdC8vIHRoaXMuc3RhdGUudmlkZW9zLmZvckVhY2goKHZpZGVvKSA9PiB7XG5cdFx0XHQvLyBcdC8vIEF1dG9wbGF5IGFmdGVyIHZpZGVvIGlzIGZpbmlzaGVkXG5cdFx0XHQvLyBcdGlmICghdmlkZW8uZ2V0QXR0cmlidXRlKCdlbmRlZC1saXN0ZW5lcicpKSB7XG5cdFx0XHQvLyBcdFx0dmlkZW8uc2V0QXR0cmlidXRlKCdlbmRlZC1saXN0ZW5lcicsIHRydWUpXG5cdFx0XHQvLyBcdFx0dmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG5cdFx0XHQvLyBcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdC8vIFx0XHRcdFx0Z2xpZGUuZ28oJz4nKVxuXHRcdFx0Ly8gXHRcdFx0fSwgMTAwMClcblx0XHRcdC8vIFx0XHR9KVxuXHRcdFx0Ly8gXHR9XG5cdFx0XHQvLyB9KVxuXHRcdH0pXG5cblx0XHRnbGlkZS5vbihbJ3J1biddLCAoKSA9PiB7XG5cdFx0XHQvLyBjb25zdCB2aWRlbyA9IHRoaXMuc3RhdGUudmlkZW9zW2dsaWRlLmluZGV4XVxuXHRcdFx0Ly8gdmlkZW8ucGxheSgpXG5cdFx0XHQvLyAvLyBQYXVzZSBvdGhlciB2aWRlb3Ncblx0XHRcdC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Ly8gXHR0aGlzLnN0YXRlLnZpZGVvcy5mb3JFYWNoKCh2aWRlbywgaSkgPT4ge1xuXHRcdFx0Ly8gXHRcdGlmIChnbGlkZS5pbmRleCAhPT0gaSkge1xuXHRcdFx0Ly8gXHRcdFx0dmlkZW8ucGF1c2UoKVxuXHRcdFx0Ly8gXHRcdFx0dmlkZW8uY3VycmVudFRpbWUgPSAwXG5cdFx0XHQvLyBcdFx0fVxuXHRcdFx0Ly8gXHR9KVxuXHRcdFx0Ly8gfSwgNTAwKVxuXHRcdH0pXG5cblx0XHRnbGlkZS5tb3VudCh7IENvbnRyb2xzLCBCcmVha3BvaW50cywgU3dpcGUgLypBdXRvcGxheSovIH0pXG5cblx0XHQvLyAvLyBBZGQgY2xpY2sgRUwgb24gYWxsIGNhcm91c2VsIHNsaWRlcyAoaW5jbHVkaW5nIGNvcGllcylcblx0XHQvLyBjb25zdCBhcnIgPSBbLi4udGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmdsaWRlX19zbGlkZScpXVxuXHRcdC8vIGFyci5mb3JFYWNoKChlbCkgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5oYW5kbGVDYXJvdXNlbEl0ZW1DbGljayhlKSkpXG5cdH1cbn1cbiIsImltcG9ydCBWcGFpZFZpZGVvUGxheWVyIGZyb20gJy4vdnBhaWQuanMnXG5pbXBvcnQgQ3JlYXRpdmVEZXNrdG9wIGZyb20gJy4vYWQvZGVza3RvcC9kZXNrdG9wLmpzJ1xuLy8gV2lwZXJcbi8vIGltcG9ydCBDcmVhdGl2ZURlc2t0b3AgZnJvbSAnLi9hZC93aXBlci93aXBlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gbmV3IFZwYWlkVmlkZW9QbGF5ZXIoQ3JlYXRpdmVEZXNrdG9wKVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///969\n")},646:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(645);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, "*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}.creative-container{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff}.creative-container button.cta-button{position:absolute;z-index:1}video{cursor:pointer;transition:all 200ms ease-in-out !important}video:hover{filter:contrast(120%)}.carousel-container{width:640px;height:360px;overflow:hidden;margin:0 auto}.carousel-container ul.glide__slides{display:flex;list-style:none}.carousel-container li.glide__slide{width:640px;height:360px;position:relative}.carousel-container img{display:block;width:100%;height:auto;margin:auto;z-index:1;transition:opacity 120ms ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.carousel-container .dots{display:flex;position:absolute;bottom:25px;left:100px;background-color:transparent}.carousel-container .dots div{padding:5px 0;cursor:pointer}.carousel-container .dots div:not(:last-child){margin-right:5px}.carousel-container .dots button{pointer-events:none;width:100px;height:4px;background-color:rgba(255,255,255,.4);border-radius:0;border:none;cursor:pointer;transition:background-color 150ms ease-in-out}.carousel-container .dots button.active{background-color:#fff}.carousel-container div.content{position:absolute;top:125px;left:70px;width:220px}.carousel-container div.content img.logo{max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.carousel-container div.content img.cta{display:block;max-width:180px;margin-top:30px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:transform 150ms ease-in-out}.carousel-container div.content img.cta:hover{transform:scale(1.1)}", "",{"version":3,"sources":["webpack://./src/ad/desktop/desktop.scss"],"names":[],"mappings":"AAAA,qBAGC,QAAA,CACA,SAAA,CACA,qBAAA,CAGD,oBACE,iBAAA,CACA,KAAA,CACD,MAAA,CACC,UAAA,CACA,WAAA,CACA,qBAAA,CAGD,sCACC,iBAAA,CACA,SAAA,CAIF,MAEC,cAAA,CACA,2CAAA,CACA,YACC,qBAAA,CAWF,oBACC,WAAA,CACA,YAAA,CACA,eAAA,CACA,aAAA,CAIA,qCACC,YAAA,CACA,eAAA,CAGD,oCACC,WAAA,CACA,YAAA,CACA,iBAAA,CAGD,wBAEC,aAAA,CACA,UAAA,CACA,WAAA,CACA,WAAA,CACA,SAAA,CACA,oCAAA,CAEA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAMD,0BACC,YAAA,CACA,iBAAA,CACA,WAAA,CACA,UAAA,CACA,4BAAA,CAEA,8BACC,aAAA,CACA,cAAA,CACA,+CACC,gBAAA,CAIF,iCACC,mBAAA,CACA,WAAA,CACA,UAAA,CACA,qCAAA,CACA,eAAA,CACA,WAAA,CACA,cAAA,CACA,6CAAA,CAIA,wCACC,qBAAA,CAKH,gCACC,iBAAA,CACA,SAAA,CACA,SAAA,CACA,WAAA,CAEA,yCACC,cAAA,CACA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAED,wCACC,aAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CACA,sCAAA,CACA,8CACC,oBAAA","sourcesContent":["*,\\n*::before,\\n*::after {\\n\\tmargin: 0;\\n\\tpadding: 0;\\n\\tbox-sizing: border-box;\\n}\\n\\n.creative-container {\\n position: absolute;\\n top: 0;\\n\\tleft: 0;\\n width: 100%;\\n height: 100%;\\n background-color: #fff;\\n\\t// border: 1px solid gray;\\n\\n\\tbutton.cta-button {\\n\\t\\tposition: absolute;\\n\\t\\tz-index: 1;\\n\\t}\\n}\\n\\nvideo {\\n\\t// display: none !important;\\n\\tcursor: pointer;\\n\\ttransition: all 200ms ease-in-out !important;\\n\\t&:hover {\\n\\t\\tfilter: contrast(120%);\\n\\t}\\n}\\n\\nvideo.vpaid-video {\\n\\t// display: none !important;\\n}\\n\\n\\n\\n/* START - Carousel */ \\n.carousel-container {\\n\\twidth: 640px;\\n\\theight: 360px;\\n\\toverflow: hidden;\\n\\tmargin: 0 auto;\\n\\n\\t// .glide__track {}\\n\\n\\tul.glide__slides {\\n\\t\\tdisplay: flex;\\n\\t\\tlist-style: none;\\n\\t}\\n\\n\\tli.glide__slide {\\n\\t\\twidth: 640px;\\n\\t\\theight: 360px;\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\timg {\\n\\t\\t// position: absolute;\\n\\t\\tdisplay: block;\\n\\t\\twidth: 100%;\\n\\t\\theight: auto;\\n\\t\\tmargin: auto;\\n\\t\\tz-index: 1;\\n\\t\\ttransition: opacity 120ms ease-in-out;\\n\\t\\t// pointer-events: none !important;\\n\\t\\tuser-select: none;\\n\\t\\t// &:hover {\\n\\t\\t// \\tfilter: contrast(120%);\\n\\t\\t// }\\n\\t}\\n\\n\\t.dots {\\n\\t\\tdisplay: flex;\\n\\t\\tposition: absolute;\\n\\t\\tbottom: 25px;\\n\\t\\tleft: 100px;\\n\\t\\tbackground-color: transparent;\\n\\n\\t\\tdiv {\\n\\t\\t\\tpadding: 5px 0;\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\t&:not(:last-child) {\\n\\t\\t\\t\\tmargin-right: 5px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tbutton {\\n\\t\\t\\tpointer-events: none;\\n\\t\\t\\twidth: 100px;\\n\\t\\t\\theight: 4px;\\n\\t\\t\\tbackground-color: rgba($color: #fff, $alpha: 0.4);\\n\\t\\t\\tborder-radius: 0;\\n\\t\\t\\tborder: none;\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\ttransition: background-color 150ms ease-in-out;\\n\\t\\t\\t// &:not(:last-child) {\\n\\t\\t\\t// \\tmargin-right: 5px;\\n\\t\\t\\t// }\\n\\t\\t\\t&.active {\\n\\t\\t\\t\\tbackground-color: #fff;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tdiv.content {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 125px;\\n\\t\\tleft: 70px;\\n\\t\\twidth: 220px;\\n\\t\\t\\n\\t\\timg.logo {\\n\\t\\t\\tmax-width: 100%;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\t\\timg.cta {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tmax-width: 180px;\\n\\t\\t\\tmargin-top: 30px;\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tuser-select: none;\\n\\t\\t\\ttransition: transform 150ms ease-in-out;\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\ttransform: scale(1.1)\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\n\\t// .glide__arrows {\\n\\t// \\tposition: absolute;\\n\\t// \\ttop: 145px;\\n\\t// \\tuser-select: none;\\n\\n\\t// \\tbutton.glide__arrow {\\n\\t// \\t\\tdisplay: flex;\\n\\t// \\t\\tjustify-content: center;\\n\\t// \\t\\talign-items: center;\\n\\t// \\t\\tposition: absolute;\\n\\t// \\t\\tz-index: 99;\\n\\t// \\t\\tborder: none;\\n\\t// \\t\\t// height: 50px;\\n\\t// \\t\\t// width: 50px;\\n\\t// \\t\\tbackground-color: transparent;\\n\\t// \\t\\t// background: rgba(151, 151, 151, 0.3);\\n\\t// \\t\\t// border-radius: 50%;\\n\\t// \\t\\ttransition: transform 120ms ease-in-out;\\n\\n\\t// \\t\\timg {\\n\\t// \\t\\t\\theight: 50px;\\n\\t// \\t\\t}\\n\\n\\t// \\t\\t&:hover {\\n\\t// \\t\\t\\tcursor: pointer;\\n\\t// \\t\\t\\ttransform: scale(1.1);\\n\\t// \\t\\t}\\n\\n\\t// \\t\\t&--left {\\n\\t// \\t\\t\\tleft: 0px;\\n\\t// \\t\\t\\timg {\\n\\t// \\t\\t\\t\\tposition: relative;\\n\\t// \\t\\t\\t\\tright: 2px;\\n\\t// \\t\\t\\t}\\n\\t// \\t\\t}\\n\\t// \\t\\t&--right {\\n\\t// \\t\\t\\t// right: -590px;\\n\\t// \\t\\t\\tleft: 580px;\\n\\t// \\t\\t\\timg {\\n\\t// \\t\\t\\t\\tposition: relative;\\n\\t// \\t\\t\\t\\tleft: 3px;\\n\\t// \\t\\t\\t}\\n\\t// \\t\\t}\\n\\t// \\t}\\n\\n\\t// }\\n}\\n/* END - Carousel */ "],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvYWQvZGVza3RvcC9kZXNrdG9wLnNjc3M/YWQ0MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDNEg7QUFDN0I7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLHdHQUFxQztBQUMvRjtBQUNBLCtEQUErRCxTQUFTLFVBQVUsc0JBQXNCLG9CQUFvQixrQkFBa0IsTUFBTSxPQUFPLFdBQVcsWUFBWSxzQkFBc0Isc0NBQXNDLGtCQUFrQixVQUFVLE1BQU0sZUFBZSw0Q0FBNEMsWUFBWSxzQkFBc0Isb0JBQW9CLFlBQVksYUFBYSxnQkFBZ0IsY0FBYyxxQ0FBcUMsYUFBYSxnQkFBZ0Isb0NBQW9DLFlBQVksYUFBYSxrQkFBa0Isd0JBQXdCLGNBQWMsV0FBVyxZQUFZLFlBQVksVUFBVSxxQ0FBcUMseUJBQXlCLHNCQUFzQixxQkFBcUIsaUJBQWlCLDBCQUEwQixhQUFhLGtCQUFrQixZQUFZLFdBQVcsNkJBQTZCLDhCQUE4QixjQUFjLGVBQWUsK0NBQStDLGlCQUFpQixpQ0FBaUMsb0JBQW9CLFlBQVksV0FBVyxzQ0FBc0MsZ0JBQWdCLFlBQVksZUFBZSw4Q0FBOEMsd0NBQXdDLHNCQUFzQixnQ0FBZ0Msa0JBQWtCLFVBQVUsVUFBVSxZQUFZLHlDQUF5QyxlQUFlLHlCQUF5QixzQkFBc0IscUJBQXFCLGlCQUFpQix3Q0FBd0MsY0FBYyxnQkFBZ0IsZ0JBQWdCLGVBQWUseUJBQXlCLHNCQUFzQixxQkFBcUIsaUJBQWlCLHVDQUF1Qyw4Q0FBOEMscUJBQXFCLE9BQU8saThCQUFpOEIsY0FBYyxlQUFlLDJCQUEyQixHQUFHLHlCQUF5Qix1QkFBdUIsV0FBVyxZQUFZLGdCQUFnQixpQkFBaUIsMkJBQTJCLDhCQUE4Qix5QkFBeUIseUJBQXlCLGlCQUFpQixLQUFLLEdBQUcsV0FBVyxnQ0FBZ0Msb0JBQW9CLGlEQUFpRCxhQUFhLDZCQUE2QixLQUFLLEdBQUcsdUJBQXVCLGdDQUFnQyxHQUFHLHNEQUFzRCxpQkFBaUIsa0JBQWtCLHFCQUFxQixtQkFBbUIseUJBQXlCLHdCQUF3QixvQkFBb0IsdUJBQXVCLEtBQUssdUJBQXVCLG1CQUFtQixvQkFBb0IseUJBQXlCLEtBQUssV0FBVyw0QkFBNEIscUJBQXFCLGtCQUFrQixtQkFBbUIsbUJBQW1CLGlCQUFpQiw0Q0FBNEMseUNBQXlDLHdCQUF3QixrQkFBa0Isa0NBQWtDLFVBQVUsS0FBSyxhQUFhLG9CQUFvQix5QkFBeUIsbUJBQW1CLGtCQUFrQixvQ0FBb0MsYUFBYSx1QkFBdUIsd0JBQXdCLDRCQUE0Qiw0QkFBNEIsU0FBUyxPQUFPLGdCQUFnQiw2QkFBNkIscUJBQXFCLG9CQUFvQiwwREFBMEQseUJBQXlCLHFCQUFxQix3QkFBd0IsdURBQXVELCtCQUErQiwrQkFBK0IsWUFBWSxrQkFBa0IsaUNBQWlDLFNBQVMsT0FBTyxLQUFLLG1CQUFtQix5QkFBeUIsaUJBQWlCLGlCQUFpQixtQkFBbUIsc0JBQXNCLHdCQUF3QiwwQkFBMEIsT0FBTyxlQUFlLHVCQUF1Qix5QkFBeUIseUJBQXlCLHdCQUF3QiwwQkFBMEIsZ0RBQWdELGlCQUFpQix3Q0FBd0MsT0FBTyxLQUFLLDJCQUEyQiw0QkFBNEIsb0JBQW9CLDJCQUEyQixnQ0FBZ0MseUJBQXlCLG1DQUFtQywrQkFBK0IsOEJBQThCLHVCQUF1Qix3QkFBd0IsMkJBQTJCLDBCQUEwQix5Q0FBeUMsbURBQW1ELGlDQUFpQyxtREFBbUQsa0JBQWtCLDBCQUEwQixZQUFZLHNCQUFzQiw2QkFBNkIsbUNBQW1DLFlBQVksc0JBQXNCLHVCQUF1QixrQkFBa0Isa0NBQWtDLDBCQUEwQixjQUFjLFlBQVkscUJBQXFCLDhCQUE4Qix5QkFBeUIsa0JBQWtCLGtDQUFrQyx5QkFBeUIsY0FBYyxZQUFZLFVBQVUsVUFBVSxHQUFHLDBDQUEwQztBQUNuOUw7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQyIsImZpbGUiOiI2NDYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIiosKjo6YmVmb3JlLCo6OmFmdGVye21hcmdpbjowO3BhZGRpbmc6MDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LmNyZWF0aXZlLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmNyZWF0aXZlLWNvbnRhaW5lciBidXR0b24uY3RhLWJ1dHRvbntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjF9dmlkZW97Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjphbGwgMjAwbXMgZWFzZS1pbi1vdXQgIWltcG9ydGFudH12aWRlbzpob3ZlcntmaWx0ZXI6Y29udHJhc3QoMTIwJSl9LmNhcm91c2VsLWNvbnRhaW5lcnt3aWR0aDo2NDBweDtoZWlnaHQ6MzYwcHg7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbjowIGF1dG99LmNhcm91c2VsLWNvbnRhaW5lciB1bC5nbGlkZV9fc2xpZGVze2Rpc3BsYXk6ZmxleDtsaXN0LXN0eWxlOm5vbmV9LmNhcm91c2VsLWNvbnRhaW5lciBsaS5nbGlkZV9fc2xpZGV7d2lkdGg6NjQwcHg7aGVpZ2h0OjM2MHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5jYXJvdXNlbC1jb250YWluZXIgaW1ne2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6YXV0bzttYXJnaW46YXV0bzt6LWluZGV4OjE7dHJhbnNpdGlvbjpvcGFjaXR5IDEyMG1zIGVhc2UtaW4tb3V0Oy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uY2Fyb3VzZWwtY29udGFpbmVyIC5kb3Rze2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MjVweDtsZWZ0OjEwMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmNhcm91c2VsLWNvbnRhaW5lciAuZG90cyBkaXZ7cGFkZGluZzo1cHggMDtjdXJzb3I6cG9pbnRlcn0uY2Fyb3VzZWwtY29udGFpbmVyIC5kb3RzIGRpdjpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1yaWdodDo1cHh9LmNhcm91c2VsLWNvbnRhaW5lciAuZG90cyBidXR0b257cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDBweDtoZWlnaHQ6NHB4O2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCk7Ym9yZGVyLXJhZGl1czowO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAxNTBtcyBlYXNlLWluLW91dH0uY2Fyb3VzZWwtY29udGFpbmVyIC5kb3RzIGJ1dHRvbi5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jYXJvdXNlbC1jb250YWluZXIgZGl2LmNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEyNXB4O2xlZnQ6NzBweDt3aWR0aDoyMjBweH0uY2Fyb3VzZWwtY29udGFpbmVyIGRpdi5jb250ZW50IGltZy5sb2dve21heC13aWR0aDoxMDAlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uY2Fyb3VzZWwtY29udGFpbmVyIGRpdi5jb250ZW50IGltZy5jdGF7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTgwcHg7bWFyZ2luLXRvcDozMHB4O2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAxNTBtcyBlYXNlLWluLW91dH0uY2Fyb3VzZWwtY29udGFpbmVyIGRpdi5jb250ZW50IGltZy5jdGE6aG92ZXJ7dHJhbnNmb3JtOnNjYWxlKDEuMSl9XCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2FkL2Rlc2t0b3AvZGVza3RvcC5zY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLHFCQUdDLFFBQUEsQ0FDQSxTQUFBLENBQ0EscUJBQUEsQ0FHRCxvQkFDRSxpQkFBQSxDQUNBLEtBQUEsQ0FDRCxNQUFBLENBQ0MsVUFBQSxDQUNBLFdBQUEsQ0FDQSxxQkFBQSxDQUdELHNDQUNDLGlCQUFBLENBQ0EsU0FBQSxDQUlGLE1BRUMsY0FBQSxDQUNBLDJDQUFBLENBQ0EsWUFDQyxxQkFBQSxDQVdGLG9CQUNDLFdBQUEsQ0FDQSxZQUFBLENBQ0EsZUFBQSxDQUNBLGFBQUEsQ0FJQSxxQ0FDQyxZQUFBLENBQ0EsZUFBQSxDQUdELG9DQUNDLFdBQUEsQ0FDQSxZQUFBLENBQ0EsaUJBQUEsQ0FHRCx3QkFFQyxhQUFBLENBQ0EsVUFBQSxDQUNBLFdBQUEsQ0FDQSxXQUFBLENBQ0EsU0FBQSxDQUNBLG9DQUFBLENBRUEsd0JBQUEsQ0FBQSxxQkFBQSxDQUFBLG9CQUFBLENBQUEsZ0JBQUEsQ0FNRCwwQkFDQyxZQUFBLENBQ0EsaUJBQUEsQ0FDQSxXQUFBLENBQ0EsVUFBQSxDQUNBLDRCQUFBLENBRUEsOEJBQ0MsYUFBQSxDQUNBLGNBQUEsQ0FDQSwrQ0FDQyxnQkFBQSxDQUlGLGlDQUNDLG1CQUFBLENBQ0EsV0FBQSxDQUNBLFVBQUEsQ0FDQSxxQ0FBQSxDQUNBLGVBQUEsQ0FDQSxXQUFBLENBQ0EsY0FBQSxDQUNBLDZDQUFBLENBSUEsd0NBQ0MscUJBQUEsQ0FLSCxnQ0FDQyxpQkFBQSxDQUNBLFNBQUEsQ0FDQSxTQUFBLENBQ0EsV0FBQSxDQUVBLHlDQUNDLGNBQUEsQ0FDQSx3QkFBQSxDQUFBLHFCQUFBLENBQUEsb0JBQUEsQ0FBQSxnQkFBQSxDQUVELHdDQUNDLGFBQUEsQ0FDQSxlQUFBLENBQ0EsZUFBQSxDQUNBLGNBQUEsQ0FDQSx3QkFBQSxDQUFBLHFCQUFBLENBQUEsb0JBQUEsQ0FBQSxnQkFBQSxDQUNBLHNDQUFBLENBQ0EsOENBQ0Msb0JBQUFcIixcInNvdXJjZXNDb250ZW50XCI6W1wiKixcXG4qOjpiZWZvcmUsXFxuKjo6YWZ0ZXIge1xcblxcdG1hcmdpbjogMDtcXG5cXHRwYWRkaW5nOiAwO1xcblxcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi5jcmVhdGl2ZS1jb250YWluZXIge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcblxcdGxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuXFx0Ly8gYm9yZGVyOiAxcHggc29saWQgZ3JheTtcXG5cXG5cXHRidXR0b24uY3RhLWJ1dHRvbiB7XFxuXFx0XFx0cG9zaXRpb246IGFic29sdXRlO1xcblxcdFxcdHotaW5kZXg6IDE7XFxuXFx0fVxcbn1cXG5cXG52aWRlbyB7XFxuXFx0Ly8gZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xcblxcdGN1cnNvcjogcG9pbnRlcjtcXG5cXHR0cmFuc2l0aW9uOiBhbGwgMjAwbXMgZWFzZS1pbi1vdXQgIWltcG9ydGFudDtcXG5cXHQmOmhvdmVyIHtcXG5cXHRcXHRmaWx0ZXI6IGNvbnRyYXN0KDEyMCUpO1xcblxcdH1cXG59XFxuXFxudmlkZW8udnBhaWQtdmlkZW8ge1xcblxcdC8vIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuLyogU1RBUlQgLSBDYXJvdXNlbCAqLyBcXG4uY2Fyb3VzZWwtY29udGFpbmVyIHtcXG5cXHR3aWR0aDogNjQwcHg7XFxuXFx0aGVpZ2h0OiAzNjBweDtcXG5cXHRvdmVyZmxvdzogaGlkZGVuO1xcblxcdG1hcmdpbjogMCBhdXRvO1xcblxcblxcdC8vIC5nbGlkZV9fdHJhY2sge31cXG5cXG5cXHR1bC5nbGlkZV9fc2xpZGVzIHtcXG5cXHRcXHRkaXNwbGF5OiBmbGV4O1xcblxcdFxcdGxpc3Qtc3R5bGU6IG5vbmU7XFxuXFx0fVxcblxcblxcdGxpLmdsaWRlX19zbGlkZSB7XFxuXFx0XFx0d2lkdGg6IDY0MHB4O1xcblxcdFxcdGhlaWdodDogMzYwcHg7XFxuXFx0XFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblxcdH1cXG5cXG5cXHRpbWcge1xcblxcdFxcdC8vIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cXHRcXHRkaXNwbGF5OiBibG9jaztcXG5cXHRcXHR3aWR0aDogMTAwJTtcXG5cXHRcXHRoZWlnaHQ6IGF1dG87XFxuXFx0XFx0bWFyZ2luOiBhdXRvO1xcblxcdFxcdHotaW5kZXg6IDE7XFxuXFx0XFx0dHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlLWluLW91dDtcXG5cXHRcXHQvLyBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xcblxcdFxcdHVzZXItc2VsZWN0OiBub25lO1xcblxcdFxcdC8vICY6aG92ZXIge1xcblxcdFxcdC8vIFxcdGZpbHRlcjogY29udHJhc3QoMTIwJSk7XFxuXFx0XFx0Ly8gfVxcblxcdH1cXG5cXG5cXHQuZG90cyB7XFxuXFx0XFx0ZGlzcGxheTogZmxleDtcXG5cXHRcXHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXFx0XFx0Ym90dG9tOiAyNXB4O1xcblxcdFxcdGxlZnQ6IDEwMHB4O1xcblxcdFxcdGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcblxcblxcdFxcdGRpdiB7XFxuXFx0XFx0XFx0cGFkZGluZzogNXB4IDA7XFxuXFx0XFx0XFx0Y3Vyc29yOiBwb2ludGVyO1xcblxcdFxcdFxcdCY6bm90KDpsYXN0LWNoaWxkKSB7XFxuXFx0XFx0XFx0XFx0bWFyZ2luLXJpZ2h0OiA1cHg7XFxuXFx0XFx0XFx0fVxcblxcdFxcdH1cXG5cXG5cXHRcXHRidXR0b24ge1xcblxcdFxcdFxcdHBvaW50ZXItZXZlbnRzOiBub25lO1xcblxcdFxcdFxcdHdpZHRoOiAxMDBweDtcXG5cXHRcXHRcXHRoZWlnaHQ6IDRweDtcXG5cXHRcXHRcXHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRjb2xvcjogI2ZmZiwgJGFscGhhOiAwLjQpO1xcblxcdFxcdFxcdGJvcmRlci1yYWRpdXM6IDA7XFxuXFx0XFx0XFx0Ym9yZGVyOiBub25lO1xcblxcdFxcdFxcdGN1cnNvcjogcG9pbnRlcjtcXG5cXHRcXHRcXHR0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE1MG1zIGVhc2UtaW4tb3V0O1xcblxcdFxcdFxcdC8vICY6bm90KDpsYXN0LWNoaWxkKSB7XFxuXFx0XFx0XFx0Ly8gXFx0bWFyZ2luLXJpZ2h0OiA1cHg7XFxuXFx0XFx0XFx0Ly8gfVxcblxcdFxcdFxcdCYuYWN0aXZlIHtcXG5cXHRcXHRcXHRcXHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcblxcdFxcdFxcdH1cXG5cXHRcXHR9XFxuXFx0fVxcblxcblxcdGRpdi5jb250ZW50IHtcXG5cXHRcXHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXFx0XFx0dG9wOiAxMjVweDtcXG5cXHRcXHRsZWZ0OiA3MHB4O1xcblxcdFxcdHdpZHRoOiAyMjBweDtcXG5cXHRcXHRcXG5cXHRcXHRpbWcubG9nbyB7XFxuXFx0XFx0XFx0bWF4LXdpZHRoOiAxMDAlO1xcblxcdFxcdFxcdHVzZXItc2VsZWN0OiBub25lO1xcblxcdFxcdH1cXG5cXHRcXHRpbWcuY3RhIHtcXG5cXHRcXHRcXHRkaXNwbGF5OiBibG9jaztcXG5cXHRcXHRcXHRtYXgtd2lkdGg6IDE4MHB4O1xcblxcdFxcdFxcdG1hcmdpbi10b3A6IDMwcHg7XFxuXFx0XFx0XFx0Y3Vyc29yOiBwb2ludGVyO1xcblxcdFxcdFxcdHVzZXItc2VsZWN0OiBub25lO1xcblxcdFxcdFxcdHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBlYXNlLWluLW91dDtcXG5cXHRcXHRcXHQmOmhvdmVyIHtcXG5cXHRcXHRcXHRcXHR0cmFuc2Zvcm06IHNjYWxlKDEuMSlcXG5cXHRcXHRcXHR9XFxuXFx0XFx0fVxcblxcdH1cXG5cXG5cXG5cXHQvLyAuZ2xpZGVfX2Fycm93cyB7XFxuXFx0Ly8gXFx0cG9zaXRpb246IGFic29sdXRlO1xcblxcdC8vIFxcdHRvcDogMTQ1cHg7XFxuXFx0Ly8gXFx0dXNlci1zZWxlY3Q6IG5vbmU7XFxuXFxuXFx0Ly8gXFx0YnV0dG9uLmdsaWRlX19hcnJvdyB7XFxuXFx0Ly8gXFx0XFx0ZGlzcGxheTogZmxleDtcXG5cXHQvLyBcXHRcXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cXHQvLyBcXHRcXHRhbGlnbi1pdGVtczogY2VudGVyO1xcblxcdC8vIFxcdFxcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cXHQvLyBcXHRcXHR6LWluZGV4OiA5OTtcXG5cXHQvLyBcXHRcXHRib3JkZXI6IG5vbmU7XFxuXFx0Ly8gXFx0XFx0Ly8gaGVpZ2h0OiA1MHB4O1xcblxcdC8vIFxcdFxcdC8vIHdpZHRoOiA1MHB4O1xcblxcdC8vIFxcdFxcdGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcblxcdC8vIFxcdFxcdC8vIGJhY2tncm91bmQ6IHJnYmEoMTUxLCAxNTEsIDE1MSwgMC4zKTtcXG5cXHQvLyBcXHRcXHQvLyBib3JkZXItcmFkaXVzOiA1MCU7XFxuXFx0Ly8gXFx0XFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIDEyMG1zIGVhc2UtaW4tb3V0O1xcblxcblxcdC8vIFxcdFxcdGltZyB7XFxuXFx0Ly8gXFx0XFx0XFx0aGVpZ2h0OiA1MHB4O1xcblxcdC8vIFxcdFxcdH1cXG5cXG5cXHQvLyBcXHRcXHQmOmhvdmVyIHtcXG5cXHQvLyBcXHRcXHRcXHRjdXJzb3I6IHBvaW50ZXI7XFxuXFx0Ly8gXFx0XFx0XFx0dHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcblxcdC8vIFxcdFxcdH1cXG5cXG5cXHQvLyBcXHRcXHQmLS1sZWZ0IHtcXG5cXHQvLyBcXHRcXHRcXHRsZWZ0OiAwcHg7XFxuXFx0Ly8gXFx0XFx0XFx0aW1nIHtcXG5cXHQvLyBcXHRcXHRcXHRcXHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXFx0Ly8gXFx0XFx0XFx0XFx0cmlnaHQ6IDJweDtcXG5cXHQvLyBcXHRcXHRcXHR9XFxuXFx0Ly8gXFx0XFx0fVxcblxcdC8vIFxcdFxcdCYtLXJpZ2h0IHtcXG5cXHQvLyBcXHRcXHRcXHQvLyByaWdodDogLTU5MHB4O1xcblxcdC8vIFxcdFxcdFxcdGxlZnQ6IDU4MHB4O1xcblxcdC8vIFxcdFxcdFxcdGltZyB7XFxuXFx0Ly8gXFx0XFx0XFx0XFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblxcdC8vIFxcdFxcdFxcdFxcdGxlZnQ6IDNweDtcXG5cXHQvLyBcXHRcXHRcXHR9XFxuXFx0Ly8gXFx0XFx0fVxcblxcdC8vIFxcdH1cXG5cXG5cXHQvLyB9XFxufVxcbi8qIEVORCAtIENhcm91c2VsICovIFwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///646\n')},645:module=>{eval('\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item);\n\n if (item[2]) {\n return "@media ".concat(item[2], " {").concat(content, "}");\n }\n\n return content;\n }).join("");\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === "string") {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, ""]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = "".concat(mediaQuery, " and ").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzPzI0ZmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QyxxQkFBcUI7QUFDakU7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHFCQUFxQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjY0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107IC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblxuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIHJldHVybiBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoY29udGVudCwgXCJ9XCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9OyAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXG5cbiAgbGlzdC5pID0gZnVuY3Rpb24gKG1vZHVsZXMsIG1lZGlhUXVlcnksIGRlZHVwZSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgdmFyIGlkID0gdGhpc1tpXVswXTtcblxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBtb2R1bGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfaV0pO1xuXG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVkaWFRdWVyeSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWFRdWVyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzJdID0gXCJcIi5jb25jYXQobWVkaWFRdWVyeSwgXCIgYW5kIFwiKS5jb25jYXQoaXRlbVsyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///645\n')},15:module=>{eval('\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (typeof btoa === "function") {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join("\\n");\n }\n\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qcz83NWU5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGlDQUFpQywySEFBMkg7O0FBRTVKLDZCQUE2QixrS0FBa0s7O0FBRS9MLGlEQUFpRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNELGtIQUFrSDs7QUFFOVosc0NBQXNDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLGtCQUFrQixFQUFFLGFBQWE7O0FBRXJMLHdDQUF3QyxnRkFBZ0YsZUFBZSxlQUFlLGdCQUFnQixvQkFBb0IsTUFBTSwwQ0FBMEMsK0JBQStCLGFBQWEscUJBQXFCLG1DQUFtQyxFQUFFLEVBQUUsY0FBYyxXQUFXLFVBQVUsRUFBRSxVQUFVLE1BQU0saURBQWlELEVBQUUsVUFBVSxrQkFBa0IsRUFBRSxFQUFFLGFBQWE7O0FBRXZlLCtCQUErQixvQ0FBb0M7O0FBRW5FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxjQUFjO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pIHtcbiAgdmFyIF9pdGVtID0gX3NsaWNlZFRvQXJyYXkoaXRlbSwgNCksXG4gICAgICBjb250ZW50ID0gX2l0ZW1bMV0sXG4gICAgICBjc3NNYXBwaW5nID0gX2l0ZW1bM107XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgXCJcIikuY29uY2F0KHNvdXJjZSwgXCIgKi9cIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15\n')}},__webpack_module_cache__={};function __webpack_require__(Q){if(__webpack_module_cache__[Q])return __webpack_module_cache__[Q].exports;var B=__webpack_module_cache__[Q]={id:Q,exports:{}};return __webpack_modules__[Q](B,B.exports,__webpack_require__),B.exports}__webpack_require__.n=Q=>{var B=Q&&Q.__esModule?()=>Q.default:()=>Q;return __webpack_require__.d(B,{a:B}),B},__webpack_require__.d=(Q,B)=>{for(var F in B)__webpack_require__.o(B,F)&&!__webpack_require__.o(Q,F)&&Object.defineProperty(Q,F,{enumerable:!0,get:B[F]})},__webpack_require__.o=(Q,B)=>Object.prototype.hasOwnProperty.call(Q,B),__webpack_require__.r=Q=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(Q,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(969);return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})()}));