PageSourceSearch

https://umanpivo.ua/Media/assets/js/bundle.js?v=1790093317

js umanpivo.ua collected 2026-09-25 06:01:12 UTC 929,222 bytes, 10,072 lines download raw bytes

1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// install a JSONP callback for chunk loading
3/******/ 	function webpackJsonpCallback(data) {
4/******/ 		var chunkIds = data[0];
5/******/ 		var moreModules = data[1];
6/******/
7/******/
8/******/ 		// add "moreModules" to the modules object,
9/******/ 		// then flag all "chunkIds" as loaded and fire callback
10/******/ 		var moduleId, chunkId, i = 0, resolves = [];
11/******/ 		for(;i < chunkIds.length; i++) {
12/******/ 			chunkId = chunkIds[i];
13/******/ 			if(installedChunks[chunkId]) {
14/******/ 				resolves.push(installedChunks[chunkId][0]);
15/******/ 			}
16/******/ 			installedChunks[chunkId] = 0;
17/******/ 		}
18/******/ 		for(moduleId in moreModules) {
19/******/ 			if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
20/******/ 				modules[moduleId] = moreModules[moduleId];
21/******/ 			}
22/******/ 		}
23/******/ 		if(parentJsonpFunction) parentJsonpFunction(data);
24/******/
25/******/ 		while(resolves.length) {
26/******/ 			resolves.shift()();
27/******/ 		}
28/******/
29/******/ 	};
30/******/
31/******/
32/******/ 	// The module cache
33/******/ 	var installedModules = {};
34/******/
35/******/ 	// object to store loaded and loading chunks
36/******/ 	// undefined = chunk not loaded, null = chunk preloaded/prefetched
37/******/ 	// Promise = chunk loading, 0 = chunk loaded
38/******/ 	var installedChunks = {
39/******/ 		"bundle": 0
40/******/ 	};
41/******/
42/******/
43/******/
44/******/ 	// script path function
45/******/ 	function jsonpScriptSrc(chunkId) {
46/******/ 		return __webpack_require__.p + "_async-modules/" + ({"vendors~draggable-table":"vendors~draggable-table","draggable-table":"draggable-table","wrap-media":"wrap-media"}[chunkId]||chunkId) + ".js?=" + {"0":"93fa613c516259edff8b","1":"8b375f181552c4d22746","2":"80bc1d1f09ded2345e24","3":"6e8aa59a6cff0c9c2c46","4":"41382716d481b544ec51","5":"6bc50e43dbd29b3d44ba","6":"ef43d98016d5b9473d5e","7":"83b806f99da7d1c3a8c3","8":"4a5fc6ed934e940f4d84","9":"b9dc265ff303b8be39c5","10":"a22dc2173dca49c66c52","11":"1f6264e4e5650f25181d","12":"ab106d63fc567f4127f1","13":"85635083cca3f43cd427","14":"e66ee516dc49550377ca","15":"92200a5ce4e625101918","16":"1f528bc27fdbf65ba474","17":"b13db9ba163d99072359","18":"1a9be069013be4fec23a","19":"8909ac9abc64be7024cb","20":"9165e4aedce91a5452a6","21":"a061e7d6ee104251bf10","22":"de2d89d809cfeff69ce2","23":"54ecfc61bce717a83d28","24":"a601c76409bea68a5a0f","25":"66b396090e88834c7108","26":"aca93347c353a696e235","27":"e875a259d63eb18eba13","28":"79f6d2be7b6dfaec1dbc","29":"54bebca9a4fa376e7f3c","30":"ba1004ff9c95a90fb2b7","31":"532419720ef85b1593cb","32":"f899485d089d70ceb6bf","33":"d401d6a65d0120efbd1a","34":"cb886360c3a5e309df53","35":"4e1d0ab3cf6fd2dba906","36":"03f957ca36d683272938","37":"96cbb73d25c38ecea25c","38":"bc07b8119c01d02c8a74","39":"c77f6822289560929f7c","40":"e80f123458a0975bf992","41":"75bebc97dee7f79f7270","42":"4e051d5bf69910523fdf","vendors~draggable-table":"c19a78f1db37c68d8b63","draggable-table":"636b346a2f86a00dbfdb","wrap-media":"0ffebbdd7658594f0d59"}[chunkId] + ""
47/******/ 	}
48/******/
49/******/ 	// The require function
50/******/ 	function __webpack_require__(moduleId) {
51/******/
52/******/ 		// Check if module is in cache
53/******/ 		if(installedModules[moduleId]) {
54/******/ 			return installedModules[moduleId].exports;
55/******/ 		}
56/******/ 		// Create a new module (and put it into the cache)
57/******/ 		var module = installedModules[moduleId] = {
58/******/ 			i: moduleId,
59/******/ 			l: false,
60/******/ 			exports: {}
61/******/ 		};
62/******/
63/******/ 		// Execute the module function
64/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
65/******/
66/******/ 		// Flag the module as loaded
67/******/ 		module.l = true;
68/******/
69/******/ 		// Return the exports of the module
70/******/ 		return module.exports;
71/******/ 	}
72/******/
73/******/ 	// This file contains only the entry chunk.
74/******/ 	// The chunk loading function for additional chunks
75/******/ 	__webpack_require__.e = function requireEnsure(chunkId) {
76/******/ 		var promises = [];
77/******/
78/******/
79/******/ 		// JSONP chunk loading for javascript
80/******/
81/******/ 		var installedChunkData = installedChunks[chunkId];
82/******/ 		if(installedChunkData !== 0) { // 0 means "already installed".
83/******/
84/******/ 			// a Promise means "currently loading".
85/******/ 			if(installedChunkData) {
86/******/ 				promises.push(installedChunkData[2]);
87/******/ 			} else {
88/******/ 				// setup Promise in chunk cache
89/******/ 				var promise = new Promise(function(resolve, reject) {
90/******/ 					installedChunkData = installedChunks[chunkId] = [resolve, reject];
91/******/ 				});
92/******/ 				promises.push(installedChunkData[2] = promise);
93/******/
94/******/ 				// start chunk loading
95/******/ 				var script = document.createElement('script');
96/******/ 				var onScriptComplete;
97/******/
98/******/ 				script.charset = 'utf-8';
99/******/ 				script.timeout = 120;
100/******/ 				if (__webpack_require__.nc) {
101/******/ 					script.setAttribute("nonce", __webpack_require__.nc);
102/******/ 				}
103/******/ 				script.src = jsonpScriptSrc(chunkId);
104/******/
105/******/ 				onScriptComplete = function (event) {
106/******/ 					// avoid mem leaks in IE.
107/******/ 					script.onerror = script.onload = null;
108/******/ 					clearTimeout(timeout);
109/******/ 					var chunk = installedChunks[chunkId];
110/******/ 					if(chunk !== 0) {
111/******/ 						if(chunk) {
112/******/ 							var errorType = event && (event.type === 'load' ? 'missing' : event.type);
113/******/ 							var realSrc = event && event.target && event.target.src;
114/******/ 							var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')');
115/******/ 							error.type = errorType;
116/******/ 							error.request = realSrc;
117/******/ 							chunk[1](error);
118/******/ 						}
119/******/ 						installedChunks[chunkId] = undefined;
120/******/ 					}
121/******/ 				};
122/******/ 				var timeout = setTimeout(function(){
123/******/ 					onScriptComplete({ type: 'timeout', target: script });
124/******/ 				}, 120000);
125/******/ 				script.onerror = script.onload = onScriptComplete;
126/******/ 				document.head.appendChild(script);
127/******/ 			}
128/******/ 		}
129/******/ 		return Promise.all(promises);
130/******/ 	};
131/******/
132/******/ 	// expose the modules object (__webpack_modules__)
133/******/ 	__webpack_require__.m = modules;
134/******/
135/******/ 	// expose the module cache
136/******/ 	__webpack_require__.c = installedModules;
137/******/
138/******/ 	// define getter function for harmony exports
139/******/ 	__webpack_require__.d = function(exports, name, getter) {
140/******/ 		if(!__webpack_require__.o(exports, name)) {
141/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
142/******/ 		}
143/******/ 	};
144/******/
145/******/ 	// define __esModule on exports
146/******/ 	__webpack_require__.r = function(exports) {
147/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
148/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
149/******/ 		}
150/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
151/******/ 	};
152/******/
153/******/ 	// create a fake namespace object
154/******/ 	// mode & 1: value is a module id, require it
155/******/ 	// mode & 2: merge all properties of value into the ns
156/******/ 	// mode & 4: return value when already ns object
157/******/ 	// mode & 8|1: behave like require
158/******/ 	__webpack_require__.t = function(value, mode) {
159/******/ 		if(mode & 1) value = __webpack_require__(value);
160/******/ 		if(mode & 8) return value;
161/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esMo
161dule) return value;
162/******/ 		var ns = Object.create(null);
163/******/ 		__webpack_require__.r(ns);
164/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
165/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
166/******/ 		return ns;
167/******/ 	};
168/******/
169/******/ 	// getDefaultExport function for compatibility with non-harmony modules
170/******/ 	__webpack_require__.n = function(module) {
171/******/ 		var getter = module && module.__esModule ?
172/******/ 			function getDefault() { return module['default']; } :
173/******/ 			function getModuleExports() { return module; };
174/******/ 		__webpack_require__.d(getter, 'a', getter);
175/******/ 		return getter;
176/******/ 	};
177/******/
178/******/ 	// Object.prototype.hasOwnProperty.call
179/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
180/******/
181/******/ 	// __webpack_public_path__
182/******/ 	__webpack_require__.p = "/Media/assets//js/";
183/******/
184/******/ 	// on error function for async loading
185/******/ 	__webpack_require__.oe = function(err) { console.error(err); throw err; };
186/******/
187/******/ 	var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
188/******/ 	var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
189/******/ 	jsonpArray.push = webpackJsonpCallback;
190/******/ 	jsonpArray = jsonpArray.slice();
191/******/ 	for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
192/******/ 	var parentJsonpFunction = oldJsonpFunction;
193/******/
194/******/
195/******/ 	// Load entry module and return exports
196/******/ 	return __webpack_require__(__webpack_require__.s = "./_HTML/src/js/entry.js");
197/******/ })
198/************************************************************************/
199/******/ ({
200
201/***/ "./.modernizrrc":
202/*!**********************!*\
203  !*** ./.modernizrrc ***!
204  \**********************/
205/*! no static exports found */
206/***/ (function(module, exports) {
207
208;(function(window){
209var hadGlobal = 'Modernizr' in window;
210var oldGlobal = window.Modernizr;
211/*! modernizr 3.11.4 (Custom Build) | MIT *
212 * https://modernizr.com/download/?-cssscrollbar-touchevents-addtest-mq-setclasses-testprop !*/
213!function(e,n,t,o){function r(e,n){return typeof e===n}function i(e){var n=w.className,t=Modernizr._config.classPrefix||"";if(_&&(n=n.baseVal),Modernizr._config.enableJSClass){var o=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(o,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(e.length>0&&(n+=" "+t+e.join(" "+t)),_?w.className.baseVal=n:w.className=n)}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):_?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function l(){var e=t.body;return e||(e=s(_?"svg":"body"),e.fake=!0),e}function a(e,n,o,r){var i,a,u,f,c="modernizr",d=s("div"),p=l();if(parseInt(o,10))for(;o--;)u=s("div"),u.id=r?r[o]:c+(o+1),d.appendChild(u);return i=s("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=w.style.overflow,w.style.overflow="hidden",w.appendChild(p)),a=n(d,e),p.fake?(p.parentNode.removeChild(p),w.style.overflow=f,w.offsetHeight):d.parentNode.removeChild(d),!!a}function u(e,t,o){var r;if("getComputedStyle"in n){r=getComputedStyle.call(n,e,t);var i=n.console;if(null!==r)o&&(r=r.getPropertyValue(o));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else r=!t&&e.currentStyle&&e.currentStyle[o];return r}function f(e,n){if("object"==typeof e)for(var t in e)S(e,t)&&f(t,e[t]);else{e=e.toLowerCase();var o=e.split("."),r=Modernizr[o[0]];if(2===o.length&&(r=r[o[1]]),void 0!==r)return Modernizr;n="function"==typeof n?n():n,1===o.length?Modernizr[o[0]]=n:(!Modernizr[o[0]]||Modernizr[o[0]]instanceof Boolean||(Modernizr[o[0]]=new Boolean(Modernizr[o[0]])),Modernizr[o[0]][o[1]]=n),i([(n&&!1!==n?"":"no-")+o.join("-")]),Modernizr._trigger(e,n)}return Modernizr}function c(e,n){return!!~(""+e).indexOf(n)}function d(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function p(e,t){var r=e.length;if("CSS"in n&&"supports"in n.CSS){for(;r--;)if(n.CSS.supports(d(e[r]),t))return!0;return!1}if("CSSSupportsRule"in n){for(var i=[];r--;)i.push("("+d(e[r])+":"+t+")");return i=i.join(" or "),a("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"===u(e,null,"position")})}return o}function h(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function m(e,n,t,i){function l(){u&&(delete x.style,delete x.modElem)}if(i=!r(i,"undefined")&&i,!r(t,"undefined")){var a=p(e,t);if(!r(a,"undefined"))return a}for(var u,f,d,m,v,y=["modernizr","tspan","samp"];!x.style&&y.length;)u=!0,x.modElem=s(y.shift()),x.style=x.modElem.style;for(d=e.length,f=0;f<d;f++)if(m=e[f],v=x.style[m],c(m,"-")&&(m=h(m)),x.style[m]!==o){if(i||r(t,"undefined"))return l(),"pfx"!==n||m;try{x.style[m]=t}catch(e){}if(x.style[m]!==v)return l(),"pfx"!==n||m}return l(),!1}var v=[],y={_version:"3.11.4",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){v.push({name:e,fn:n,options:t})},addAsyncTest:function(e){v.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=y,Modernizr=new Modernizr;var g=[],w=t.documentElement,_="svg"===w.nodeName.toLowerCase(),C=function(){var e=n.matchMedia||n.msMatchMedia;return e?function(n){var t=e(n);return t&&t.matches||!1}:function(e){var n=!1;return a("@media "+e+" { #modernizr { position: absolute; } }",function(e){n="absolute"===u(e,null,"position")}),n}}();y.mq=C;var S;!function(){var e={}.hasOwnProperty;S=r(e,"undefined")||r(e.call,"undefined")?function(e,n){return n in e&&r(e.constructor.prototype[n],"undefined")}:function(n,t){return e.call(n,t)}}(),y._l={},y.on=function(e,n){this._l[e]||(this._l[e]=[]),this._l[e].push(n),Modernizr.hasOwnProperty(e)&&setTimeout(function(){Modernizr._trigger(e,Modernizr[e])},0)},y._trigger=function(e,n){if(this._l[e]){var t=this._l[e];setTimeout(function(){var e;
213for(e=0;e<t.length;e++)(0,t[e])(n)},0),delete this._l[e]}},Modernizr._q.push(function(){y.addTest=f});var b={elem:s("modernizr")};Modernizr._q.push(function(){delete b.elem});var x={style:b.elem.style};Modernizr._q.unshift(function(){delete x.style});var T=(y.testProp=function(e,n,t){return m([e],o,n,t)},y.testStyles=a),z=y._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];y._prefixes=z,T("#modernizr{overflow: scroll; width: 40px; height: 40px; }#"+z.join("scrollbar{width:10px} #modernizr::").split("#").slice(1).join("#")+"scrollbar{width:10px}",function(e){Modernizr.addTest("cssscrollbar","scrollWidth"in e&&30===e.scrollWidth)}),Modernizr.addTest("touchevents",function(){if("ontouchstart"in n||n.TouchEvent||n.DocumentTouch&&t instanceof DocumentTouch)return!0;var e=["(",z.join("touch-enabled),("),"heartz",")"].join("");return C(e)}),function(){var e,n,t,o,i,s,l;for(var a in v)if(v.hasOwnProperty(a)){if(e=[],n=v[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(o=r(n.fn,"function")?n.fn():n.fn,i=0;i<e.length;i++)s=e[i],l=s.split("."),1===l.length?Modernizr[l[0]]=o:(Modernizr[l[0]]&&(!Modernizr[l[0]]||Modernizr[l[0]]instanceof Boolean)||(Modernizr[l[0]]=new Boolean(Modernizr[l[0]])),Modernizr[l[0]][l[1]]=o),g.pu
213sh((o?"":"no-")+l.join("-"))}}(),i(g),delete y.addTest,delete y.addAsyncTest;for(var j=0;j<Modernizr._q.length;j++)Modernizr._q[j]();e.Modernizr=Modernizr}(window,window,document);
214module.exports = window.Modernizr;
215if (hadGlobal) { window.Modernizr = oldGlobal; }
216else { delete window.Modernizr; }
217})(window);
218
219/***/ }),
220
221/***/ "./_HTML/src/js/_modules-loaders lazy recursive ^\\.\\/.*$":
222/*!**********************************************************************!*\
223  !*** ./_HTML/src/js/_modules-loaders lazy ^\.\/.*$ namespace object ***!
224  \**********************************************************************/
225/*! no static exports found */
226/***/ (function(module, exports, __webpack_require__) {
227
228var map = {
229	"./accordion--module-loader": [
230		"./_HTML/src/js/_modules-loaders/accordion--module-loader.js",
231		0,
232		14
233	],
234	"./accordion--module-loader.js": [
235		"./_HTML/src/js/_modules-loaders/accordion--module-loader.js",
236		0,
237		14
238	],
239	"./animated-text": [
240		"./_HTML/src/js/_modules-loaders/animated-text.js",
241		22
242	],
243	"./animated-text.js": [
244		"./_HTML/src/js/_modules-loaders/animated-text.js",
245		22
246	],
247	"./beerbox--module-loader": [
248		"./_HTML/src/js/_modules-loaders/beerbox--module-loader.js",
249		1,
250		2,
251		4,
252		3,
253		8
254	],
255	"./beerbox--module-loader.js": [
256		"./_HTML/src/js/_modules-loaders/beerbox--module-loader.js",
257		1,
258		2,
259		4,
260		3,
261		8
262	],
263	"./cart--module-loader": [
264		"./_HTML/src/js/_modules-loaders/cart--module-loader.js",
265		12
266	],
267	"./cart--module-loader.js": [
268		"./_HTML/src/js/_modules-loaders/cart--module-loader.js",
269		12
270	],
271	"./catalog-filter--module-loader": [
272		"./_HTML/src/js/_modules-loaders/catalog-filter--module-loader.js",
273		23
274	],
275	"./catalog-filter--module-loader.js": [
276		"./_HTML/src/js/_modules-loaders/catalog-filter--module-loader.js",
277		23
278	],
279	"./draggable-table--module-loader": [
280		"./_HTML/src/js/_modules-loaders/draggable-table--module-loader.js",
281		24
282	],
283	"./draggable-table--module-loader.js": [
284		"./_HTML/src/js/_modules-loaders/draggable-table--module-loader.js",
285		24
286	],
287	"./google-map--module-loader": [
288		"./_HTML/src/js/_modules-loaders/google-map--module-loader.js",
289		0,
290		9,
291		15
292	],
293	"./google-map--module-loader.js": [
294		"./_HTML/src/js/_modules-loaders/google-map--module-loader.js",
295		0,
296		9,
297		15
298	],
299	"./infinity-scroll--module-loader": [
300		"./_HTML/src/js/_modules-loaders/infinity-scroll--module-loader.js",
301		16
302	],
303	"./infinity-scroll--module-loader.js": [
304		"./_HTML/src/js/_modules-loaders/infinity-scroll--module-loader.js",
305		16
306	],
307	"./input-quantity--module-loader": [
308		"./_HTML/src/js/_modules-loaders/input-quantity--module-loader.js",
309		32,
310		17
311	],
312	"./input-quantity--module-loader.js": [
313		"./_HTML/src/js/_modules-loaders/input-quantity--module-loader.js",
314		32,
315		17
316	],
317	"./inputmask--module-loader": [
318		"./_HTML/src/js/_modules-loaders/inputmask--module-loader.js",
319		0,
320		10,
321		13
322	],
323	"./inputmask--module-loader.js": [
324		"./_HTML/src/js/_modules-loaders/inputmask--module-loader.js",
325		0,
326		10,
327		13
328	],
329	"./jquery-validation--module-loader": [
330		"./_HTML/src/js/_modules-loaders/jquery-validation--module-loader.js",
331		0,
332		1,
333		2,
334		4,
335		7
336	],
337	"./jquery-validation--module-loader.js": [
338		"./_HTML/src/js/_modules-loaders/jquery-validation--module-loader.js",
339		0,
340		1,
341		2,
342		4,
343		7
344	],
345	"./magnific-popup--module-loader": [
346		"./_HTML/src/js/_modules-loaders/magnific-popup--module-loader.js",
347		0,
348		1,
349		2,
350		3,
351		18
352	],
353	"./magnific-popup--module-loader.js": [
354		"./_HTML/src/js/_modules-loaders/magnific-popup--module-loader.js",
355		0,
356		1,
357		2,
358		3,
359		18
360	],
361	"./partner-form--module-loader": [
362		"./_HTML/src/js/_modules-loaders/partner-form--module-loader.js",
363		11
364	],
365	"./partner-form--module-loader.js": [
366		"./_HTML/src/js/_modules-loaders/partner-form--module-loader.js",
367		11
368	],
369	"./password-toggle--module-loader": [
370		"./_HTML/src/js/_modules-loaders/password-toggle--module-loader.js",
371		19
372	],
373	"./password-toggle--module-loader.js": [
374		"./_HTML/src/js/_modules-loaders/password-toggle--module-loader.js",
375		19
376	],
377	"./review-read-more--module-loader": [
378		"./_HTML/src/js/_modules-loaders/review-read-more--module-loader.js",
379		25
380	],
381	"./review-read-more--module-loader.js": [
382		"./_HTML/src/js/_modules-loaders/review-read-more--module-loader.js",
383		25
384	],
385	"./s2s--module-loader": [
386		"./_HTML/src/js/_modules-loaders/s2s--module-loader.js",
387		26
388	],
389	"./s2s--module-loader.js": [
390		"./_HTML/src/js/_modules-loaders/s2s--module-loader.js",
391		26
392	],
393	"./scroll-window--module-loader": [
394		"./_HTML/src/js/_modules-loaders/scroll-window--module-loader.js",
395		5,
396		21,
397		20
398	],
399	"./scroll-window--module-loader.js": [
400		"./_HTML/src/js/_modules-loaders/scroll-window--module-loader.js",
401		5,
402		21,
403		20
404	],
405	"./sliders--module-loader": [
406		"./_HTML/src/js/_modules-loaders/sliders--module-loader.js",
407		6,
408		27
409	],
410	"./sliders--module-loader.js": [
411		"./_HTML/src/js/_modules-loaders/sliders--module-loader.js",
412		6,
413		27
414	],
415	"./splash-no-18": [
416		"./_HTML/src/js/_modules-loaders/splash-no-18.js",
417		28
418	],
419	"./splash-no-18.js": [
420		"./_HTML/src/js/_modules-loaders/splash-no-18.js",
421		28
422	],
423	"./timeline": [
424		"./_HTML/src/js/_modules-loaders/timeline.js",
425		33,
426		29
427	],
428	"./timeline.js": [
429		"./_HTML/src/js/_modules-loaders/timeline.js",
430		33,
431		29
432	],
433	"./wrap-media--module-loader": [
434		"./_HTML/src/js/_modules-loaders/wrap-media--module-loader.js",
435		30
436	],
437	"./wrap-media--module-loader.js": [
438		"./_HTML/src/js/_modules-loaders/wrap-media--module-loader.js",
439		30
440	],
441	"./zzload--module-loader": [
442		"./_HTML/src/js/_modules-loaders/zzload--module-loader.js",
443		31
444	],
445	"./zzload--module-loader.js": [
446		"./_HTML/src/js/_modules-loaders/zzload--module-loader.js",
447		31
448	]
449};
450function webpackAsyncContext(req) {
451	var ids = map[req];
452	if(!ids) {
453		return Promise.resolve().then(function() {
454			var e = new Error("Cannot find module '" + req + "'");
455			e.code = 'MODULE_NOT_FOUND';
456			throw e;
457		});
458	}
459	return Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {
460		var id = ids[0];
461		return __webpack_require__.t(id, 7);
462	});
463}
464webpackAsyncContext.keys = function webpackAsyncContextKeys() {
465	return Object.keys(map);
466};
467webpackAsyncContext.id = "./_HTML/src/js/_modules-loaders lazy recursive ^\\.\\/.*$";
468module.exports = webpackAsyncContext;
469
470/***/ }),
471
472/***/ "./_HTML/src/js/_modules/ball-modal/index.js":
473/*!***************************************************!*\
474  !*** ./_HTML/src/js/_modules/ball-modal/index.js ***!
475  \***************************************************/
476/*! no static exports found */
477/***/ (function(module, exports, __webpack_require__) {
478
479"use strict";
480
481
482/**
483 * @module Ball Modal - размещение шарика и управление модальным окном
484 */
485
486Object.defineProperty(exports, "__esModule", {
487	value: true
488});
489
490var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
491
492var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
493
494var _cookieData = __webpack_require__(/*! #/_modules/cookie-data */ "./_HTML/src/js/_modules/cookie-data.js");
495
496var _cookieData2 = _interopRequireDefault(_cookieData);
497
498var _jquery = __webpack_require__(/*! jquery */ "jquery");
499
500var _jquery2 = _interopRequireDefault(_jquery);
501
502function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
503
504function _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; }
505
506function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
507
508/**
509 * Класс для управления Ball Modal
510 */
511var BallModal = function () {
512	function BallModal() {
513		_classCallCheck(this, BallModal);
514
515		this.container = document.querySelector('.bf-ball-container');
516		this.ball = document.querySelector('.bf-ball');
517		this.modalStep1 = document.getElementById('bfBallModalStep1');
518		this.modalStep2 = document.getElementById('bfBallModalStep2');
519
520		// Проверяем наличие контейнера и шарика
521		if (!this.container) {
522			console.warn('BallModal: контейнер .bf-ball-container не найден в DOM');
523			return;
524		}
525
526		if (!this.ball) {
527			console.warn('BallModal: шарик .bf-ball не найден в DOM');
528			return;
529		}
530
531		// Проверяем наличие cookie
532		if (_cookieData2.default.receive('show-ball-modal')) {
533			// Если cookie установлена, скрываем шарик
534			this.container.style.display = 'none';
535			this.container.style.visibility = 'hidden';
536			return;
537		}
538
539		// Инициализируем шарик
540		this.init();
541	}
542
543	/**
544  * Инициализация
545  */
546
547
548	_createClass(BallModal, [{
549		key: 'init',
550		value: function init() {
551			var _this = this;
552
553			if (!this.container || !this.ball) {
554				console.warn('BallModal: контейнер или шарик не найдены при инициализации');
555				return;
556			}
557
558			// Убеждаемся, что шарик находится внутри контейнера
559			if (!this.container.contains(this.ball)) {
560				console.warn('BallModal: шарик не найден внутри контейнера, добавляем');
561				this.container.appendChild(this.ball);
562			}
563
564			// Удаляем контейнер из текущего места в DOM (если он там есть)
565			if (this.container.parentNode) {
566				this.container.parentNode.removeChild(this.container);
567			}
568
569			// Скрываем шарик временно
570			this.container.style.display = 'none';
571			this.container.style.visibility = 'hidden';
572
573			// Размещаем шарик, прикрепляя к случайному элементу
574			this.positionBall();
575
576			// Принудительно показываем шарик после размещения
577			setTimeout(function () {
578				if (_this.container && _this.container.parentNode) {
579					// Убеждаемся, что шарик виден
580					_this.container.style.display = 'block';
581					_this.container.style.visibility = 'visible';
582					_this.container.style.opacity = '1';
583					_this.container.style.pointerEvents = 'auto';
584					_this.container.style.position = 'absolute';
585					_this.container.classList.add('is-attached');
586
587					// Проверка координат
588					var rect = _this.container.getBoundingClientRect();
589					if (rect.width === 0 || rect.height === 0) {
590						console.warn('BallModal: шарик имеет нулевой размер, возможно скрыт CSS');
591					}
592				} else {
593					console.warn('BallModal: шарик не был добавлен в DOM после позиционирования, используем fallback');
594					// Fallback - размещаем в случайной позиции
595					_this.attachToRandomPosition();
596					if (_this.container && _this.container.parentNode) {
597						_this.container.style.display = 'block';
598						_this.container.style.visibility = 'visible';
599						_this.container.style.opacity = '1';
600						_this.container.style.pointerEvents = 'auto';
601						_this.container.style.position = 'absolute';
602						_this.container.classList.add('is-attached');
603					}
604				}
605			}, 150);
606
607			// Обработка клика на шарик
608			this.ball.addEventListener('click', function (e) {
609				e.preventDefault();
610				_this.showModalStep1();
611			});
612
613			// Обработка закрытия модальных окон
614			this.initModalHandlers();
615
616			// Обработка формы
617			this.initFormHandler();
618
619			// Обработка кнопки копирования промокода
620			this.initCopyButton();
621
622			// При изменении размера окна - переприкрепляем шарик
623			var resizeTimeout = void 0;
624			window.addEventListener('resize', function () {
625				clearTimeout(resizeTimeout);
626				resizeTimeout = setTimeout(function () {
627					if (_this.container && _this.container.parentNode && !_cookieData2.default.receive('show-ball-modal')) {
628						_this.container.style.display = 'none';
629						if (_this.container.parentNode !== document.body) {
630							_this.container.parentNode.removeChild(_this.container);
631						}
632						_this.positionBall();
633						if (_this.container.parentNode) {
634							_this.container.style.display = 'block';
635						}
636					}
637				}, 300);
638			});
639		}
640
641		/**
642   * Размещение шарика - прикрепление к случайному НЕОЧЕВИДНОМУ элементу на странице
643   * Шарик привязан к элементу и двигается вместе со страницей при прокрутке
644   */
645
646	}, {
647		key: 'positionBall',
648		value: function positionBall() {
649			if (!this.container || !this.ball) {
650				return;
651			}
652
653			// Находим все подходящие НЕОЧЕВИДНЫЕ элементы на странице
654			// Выбираем мелкие, незаметные элементы - делаем игру интереснее
655			var selectors = ['p', // Обычные параграфы (предпочитаем мелкие)
656			'span:not(.icon):not(.badge):not(.tag)', // Обычные span, но не иконки/бейджи
657			'small', // Мелкий текст
658			'label', // Метки форм
659			'time', // Элементы времени
660			'address', // Адреса
661			'cite', // Цитаты
662			'code', // Код
663			'sub', 'sup', // Подстрочные/надстрочные индексы
664			'.text-small', // Мелкий текст
665			'.caption', // Подписи
666			'.meta', // Мета-информация
667			'.description:not(.product-description)'];
668
669			// Собираем все подходящие НЕОЧЕВИДНЫЕ элементы
670			var candidates = [];
671
672			selectors.forEach(function (selector) {
673				try {
674					var elements = document.querySelectorAll(selector);
675					elements.forEach(function (el) {
676						// Исключаем элементы, которые слишком малы или скрыты
677						var rect = el.getBoundingClientRect();
678						var style = window.getComputedStyle(el);
679
680						// Исключаем очевидные и большие элементы - делаем игру интереснее
681						var isObvious = el.tagName.match(/^H[1-6]$/i) || // Заголовки
682						el.tagName === 'BUTTON' || // Кнопки
683						el.tagName === 'IMG' || // Изображения
684						el.tagName === 'A' && (el.classList.contains('btn') || el.classList.contains('link') || el.getAttribute('href')) || // Ссылки-кнопки или любые ссылки
685						el.classList.contains('title') || // Элементы с классом title
686						el.classList.contains('btn') || // Кнопки
687						el.classList.contains('button') || // Кнопки
688						el.classList.contains('product-card') || // Карточки товаров
689						el.classList.contains('catalog-item') || // Элементы каталога
690						el.classList.contains('card') || // Карточки
691						el.classList.contains('item') || // Элементы
692						el.classList.contains('product') || // Товары
693						el.classList.contains('icon') || // Иконки
694						el.classList.contains('logo') || // Логотипы
695						rect.width > 300 || // Слишком большие элементы
696						rect.height > 200; // Слишком высокие элементы
697
698						// Предпочитаем элементы среднего размера, но не слишком большие
699						var isGoodSize = rect.width >= 30 && rect.width <= 250 && rect.height >= 20 && rect.height <= 150;
700
701						if (!isObvious && // Не очевидный элемент
702						isGoodSize && // Подходящий размер
703						style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0' && !el.closest('.bf-ball-container') && // Не на самом шарике
704						!el.closest('header') && // Не в шапке
705						!el.closest('footer') && // Не в футере
706						!el.closest('.bf-ball-modal') && // Не в модалке
707						!el.closest('.modal') && // Не в других модалках
708						!el.closest('.popup') // Не в попапах
709						) {
710								candidates.push(el);
711							}
712					});
713				} catch (e) {
714					// Игнорируем ошибки селекторов
715				}
716			});
717
718			// Фильтруем только элементы в видимой области
719			var viewportHeight = window.innerHeight;
720			var viewportWidth = window.innerWidth;
721
722			var visibleCandidates = candidates.filter(function (el) {
723				var rect = el.getBoundingClientRect();
724				return rect.top < viewportHeight && rect.bottom > 0 && rect.left < viewportWidth && rect.right > 0 && rect.width > 0 && rect.height > 0;
725			});
726
727			// Если не нашли подходящих элементов, используем body
728			if (visibleCandidates.length === 0) {
729				this.attachToRandomPosition();
730				return;
731			}
732
733			// Выбираем случайный элемент из видимых
734			var randomElement = visibleCandidates[Math.floor(Math.random() * visibleCandidates.length)];
735
736			// Прикрепляем шарик к выбранному элементу
737			this.attachToElement(randomElement);
738		}
739
740		/**
741   * Прикрепление шарика к конкретному элементу
742   */
743
744	}, {
745		key: 'attachToElement',
746		value: function attachToElement(element) {
747			if (!this.container || !element) {
748				return;
749			}
750
751			// Если элемент - body, используем случайное позиционирование
752			if (element === document.body) {
753				this.attachToRandomPosition();
754				return;
755			}
756
757			// Получаем позицию элемента относительно viewport
758			var elementRect = element.getBoundingClientRect();
759			// Получаем позицию элемента относительно документа (с учетом прокрутки)
760			var scrollY = window.scrollY || window.pageYOffset;
761			var scrollX = window.scrollX || window.pageXOffset;
762
763			// Шарик должен быть виден, поэтому размещаем его относительно элемента
764			// Выбираем случайную позицию вокруг элемента
765			var ballWidth = 60;
766			var ballHeight = 220;
767
768			// Позиции относительно элемента (процент от размера элемента)
769			var positions = [{ side: 'top-left', x: 0.1, y: -ballHeight - 10 }, // Сверху слева
770			{ side: 'top-right', x: 0.9, y: -ballHeight - 10 }, // Сверху справа
771			{ side: 'bottom-left', x: 0.1, y: elementRect.height + 10 }, // Снизу слева
772			{ side: 'bottom-right', x: 0.9, y: elementRect.height + 10 }, // Снизу справа
773			{ side: 'top-center', x: 0.5, y: -ballHeight - 10 }, // Сверху по центру
774			{ side: 'bottom-center', x: 0.5, y: elementRect.height + 10 }];
775
776			var randomPos = positions[Math.floor(Math.random() * positions.length)];
777
778			// Вычисляем абсолютные координаты относительно документа (с учетом прокрутки)
779			// elementRect.left/top - это позиция относительно viewport
780			// Добавляем scrollX/scrollY чтобы получить позицию относительно документа
781			var absoluteX = elementRect.left + scrollX + elementRect.width * randomPos.x - ballWidth * 0.5;
782			var absoluteY = elementRect.top + scrollY + randomPos.y;
783
784			// Убеждаемся, что шарик находится внутри контейнера
785			if (!this.container.contains(this.ball)) {
786				this.container.appendChild(this.ball);
787			}
788
789			// Вставляем контейнер с шариком в body с абсолютным позиционированием
790			if (this.container.parentNode !== document.body) {
791				document.body.appendChild(this.container);
792			}
793
794			// Устанавливаем позицию (absolute, чтобы шарик был привязан к элементу и двигался со страницей)
795			this.container.style.position = 'absolute';
796			this.container.style.left = absoluteX + 'px';
797			this.container.style.top = absoluteY + 'px';
798			this.container.style.zIndex = '9998';
799			this.container.style.display = 'block';
800			this.container.style.visibility = 'visible';
801			this.container.style.opacity = '1';
802			this.container.style.pointerEvents = 'auto';
803			this.container.classList.add('is-attached');
804		}
805
806		/**
807   * Прикрепление к случайной позиции на странице (fallback)
808   */
809
810	}, {
811		key: 'attachToRandomPosition',
812		value: function attachToRandomPosition() {
813			if (!this.container) {
814				return;
815			}
816
817			var ballWidth = 60;
818			var ballHeight = 220;
819			var padding = 20;
820			var viewportWidth = window.innerWidth;
821			var viewportHeight = window.innerHeight;
822			var scrollY = window.scrollY || window.pageYOffset;
823			var scrollX = window.scrollX || window.pageXOffset;
824
825			// Получаем размеры документа
826			var documentHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
827			var documentWidth = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);
828
829			// Вычисляем диапазон для случайной позиции относительно документа
830			var minX = padding;
831			var maxX = Math.max(viewportWidth, documentWidth) - ballWidth - padding;
832			var minY = padding;
833			var maxY = Math.max(viewportHeight, documentHeight) - ballHeight - padding;
834
835			var randomX = Math.floor(Math.random() * (maxX - minX + 1)) + minX;
836			var randomY = Math.floor(Math.random() * (maxY - minY + 1)) + minY;
837
838			// Убеждаемся, что шарик находится внутри контейнера
839			if (this.ball && !this.container.contains(this.ball)) {
840				this.container.appendChild(this.ball);
841			}
842
843			// Вставляем контейнер с шариком в body
844			if (this.container.parentNode !== document.body) {
845				document.body.appendChild(this.container);
846			}
847
848			// Используем absolute позиционирование относительно документа
849			this.container.style.position = 'absolute';
850			this.container.style.left = randomX + 'px';
851			this.container.style.top = randomY + 'px';
852			this.container.style.zIndex = '9998';
853			this.container.style.display = 'block';
854			this.container.style.visibility = 'visible';
855			this.container.classList.add('is-attached');
856		}
857
858		/**
859   * Показ первого модального окна (форма email)
860   */
861
862	}, {
863		key: 'showModalStep1',
864		value: function showModalStep1() {
865			if (!this.modalStep1) {
866				return;
867			}
868
869			// Скрываем шарик сразу и полностью
870			if (this.container) {
871				this.container.style.display = 'none';
872				this.container.style.visibility = 'hidden';
873				this.container.style.opacity = '0';
874				this.container.style.pointerEvents = 'none';
875			}
876
877			// Показываем модальное окно
878			this.modalStep1.style.display = 'flex';
879			document.body.style.overflow = 'hidden';
880		}
881
882		/**
883   * Показ второго модального окна (промокод)
884   */
885
886	}, {
887		key: 'showModalStep2',
888		value: function showModalStep2(promocode) {
889			if (!this.modalStep2) {
890				return;
891			}
892
893			// Скрываем первое модальное окно
894			if (this.modalStep1) {
895				this.modalStep1.style.display = 'none';
896			}
897
898			// Устанавливаем промокод
899			var promocodeInput = this.modalStep2.querySelector('#bfBallPromocode');
900			if (promocodeInput && promocode) {
901				promocodeInput.value = promocode;
902			}
903
904			// Обновляем текст с процентом скидки
905			var promocodeText = this.modalStep2.querySelector('#bfBallPromocodeText');
906			if (promocodeText && promocode) {
907				// Извлекаем процент из промокода (BLKFRD5 -> 5%, BLKFRD10 -> 10%, и т.д.)
908				var discountText = '';
909				if (promocode === 'DOSTFREE') {
910					discountText = 'БЕЗКОШТОВНУ ДОСТАВКУ НА АДВЕНТ КАЛЕНДАР';
911				} else if (promocode.startsWith('BLKFRD')) {
912					// Извлекаем число из промокода (BLKFRD5 -> 5, BLKFRD10 -> 10)
913					var match = promocode.match(/BLKFRD(\d+)/);
914					if (match && match[1]) {
915						var percent = match[1];
916						discountText = '-' + percent + '%';
917					} else {
918						discountText = 'ПРОМОКОД';
919					}
920				} else {
921					discountText = 'ПРОМОКОД';
922				}
923
924				promocodeText.textContent = '\u0412\u0406\u0422\u0410\u0404\u041C\u041E! \u0412\u0418 \u0417\u041D\u0410\u0419\u0428\u041B\u0418 ' + discountText;
925			}
926
927			// Показываем второе модальное окно
928			this.modalStep2.style.display = 'flex';
929		}
930
931		/**
932   * Скрытие модального окна
933   */
934
935	}, {
936		key: 'hideModal',
937		value: function hideModal() {
938			if (this.modalStep1) {
939				this.modalStep1.style.display = 'none';
940			}
941			if (this.modalStep2) {
942				this.modalStep2.style.display = 'none';
943			}
944			document.body.style.overflow = '';
945		}
946
947		/**
948   * Инициализация обработчиков модальных окон
949   */
950
951	}, {
952		key: 'initModalHandlers',
953		value: function initModalHandlers() {
954			var _this2 = this;
955
956			// Кнопки закрытия
957			var closeButtons = document.querySelectorAll('.js-close-bf-ball-modal, .js-hide-bf-ball-modal');
958			closeButtons.forEach(function (btn) {
959				btn.addEventListener('click', function () {
960					_this2.hideModal();
961					// Устанавливаем cookie, чтобы больше не показывать шарик
962					_cookieData2.default.add('show-ball-modal', false, {
963						expires: 365,
964						path: '/',
965						SameSite: 'None',
966						Secure: 'Secure'
967					});
968				});
969			});
970
971			// Закрытие при клике на фон
972			[this.modalStep1, this.modalStep2].forEach(function (modal) {
973				if (modal) {
974					modal.addEventListener('click', function (e) {
975						if (e.target === modal) {
976							_this2.hideModal();
977							_cookieData2.default.add('show-ball-modal', false, {
978								expires: 365,
979								path: '/',
980								SameSite: 'None',
981								Secure: 'Secure'
982							});
983						}
984					});
985				}
986			});
987		}
988
989		/**
990   * Инициализация обработчика формы
991   * Форма обрабатывается через стандартную систему валидации
992   * Мы перехватываем успешный ответ через кастомное событие
993   */
994
995	}, {
996		key: 'initFormHandler',
997		value: function initFormHandler() {
998			var _this3 = this;
999
1000			if (!this.modalStep1) {
1001				console.warn('BallModal: modalStep1 не найден');
1002				return;
1003			}
1004
1005			var form = this.modalStep1.querySelector('form[data-ajax]');
1006			if (!form) {
1007				console.warn('BallModal: форма не найдена в modalStep1');
1008				return;
1009			}
1010
1011			var $form = (0, _jquery2.default)(form);
1012
1013			// Сохраняем ссылку на форму для использования в других методах
1014			this.form = form;
1015			this.$form = $form;
1016
1017			// Перехватываем ответ через кастомное событие, которое генерируется в validateGetResponse
1018			$form.on('ballmodal:response', function (e, response) {
1019				console.log('BallModal: получен ответ от ballmodal', response);
1020
1021				if (response && response.success && response.ballmodal) {
1022					// Если форма успешно отправлена, отправляем на второй шаг
1023					console.log('BallModal: успешный ответ, переходим к сохранению');
1024					_this3.saveBall(response);
1025				} else if (response && !response.success) {
1026					// Показываем ошибку, если она есть
1027					var errorMsg = response.response || 'Помилка. Спробуйте ще раз.';
1028					console.error('BallModal: ошибка в ответе', errorMsg);
1029					alert(errorMsg);
1030				} else {
1031					console.warn('BallModal: неожиданный формат ответа', response);
1032				}
1033			});
1034
1035			console.log('BallModal: обработчик формы инициализирован для', form, 'URL:', $form.data('ajax'));
1036		}
1037
1038		/**
1039   * Сохранение шарика (второй шаг)
1040   */
1041
1042	}, {
1043		key: 'saveBall',
1044		value: function saveBall(modalResponse) {
1045			var _this4 = this;
1046
1047			console.log('BallModal: saveBall вызван с ответом', modalResponse);
1048
1049			var emailInput = this.modalStep1.querySelector('input[name="email"]');
1050			if (!emailInput) {
1051				console.error('BallModal: email input не найден');
1052				return;
1053			}
1054
1055			var email = emailInput.value;
1056			if (!email) {
1057				console.error('BallModal: email не найден в input');
1058				alert('Помилка: email не знайдено');
1059				return;
1060			}
1061
1062			// Используем сохраненную ссылку на форму или ищем заново
1063			var form = this.form || this.modalStep1.querySelector('form[data-ajax]');
1064			if (!form) {
1065				console.error('BallModal: форма не найдена');
1066				return;
1067			}
1068
1069			var $form = this.$form || (0, _jquery2.default)(form);
1070			var baseUrl = $form.data('ajax') || form.getAttribute('data-ajax');
1071			if (!baseUrl) {
1072				console.error('BallModal: не удалось определить URL из формы');
1073				alert('Помилка: не вдалося визначити URL для збереження');
1074				return;
1075			}
1076
1077			console.log('BallModal: отправляем запрос на сохранение, email:', email, 'U
1077RL:', baseUrl);
1078
1079			// Заменяем ballmodal на ballsave
1080			var saveUrl = baseUrl.replace('ballmodal', 'ballsave');
1081
1082			console.log('BallModal: отправляем запрос на сохранение');
1083
1084			_jquery2.default.ajax({
1085				cache: false,
1086				method: 'POST',
1087				url: saveUrl,
1088				data: {
1089					email: email
1090				},
1091				dataType: 'json',
1092				contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
1093			}).done(function (response, textStatus, xhr) {
1094				console.log('BallModal: успешный ответ от ballsave', { response: response, textStatus: textStatus, xhr: xhr });
1095
1096				// Проверяем, что ответ является объектом
1097				if ((typeof response === 'undefined' ? 'undefined' : _typeof(response)) !== 'object' || response === null) {
1098					console.error('Invalid response format:', response);
1099					alert('Помилка: некоректна відповідь від сервера');
1100					return;
1101				}
1102
1103				if (response.success) {
1104					// Получаем промокод из ответа
1105					var promocode = response.promo || response.promocode || 'DOSTFREE';
1106					console.log('BallModal: получен промокод', promocode);
1107
1108					// Показываем второе модальное окно с промокодом
1109					_this4.showModalStep2(promocode);
1110
1111					// Устанавливаем cookie
1112					_cookieData2.default.add('show-ball-modal', false, {
1113						expires: 365,
1114						path: '/',
1115						SameSite: 'None',
1116						Secure: 'Secure'
1117					});
1118				} else {
1119					var errorMsg = response.response || response.message || 'Помилка. Спробуйте ще раз.';
1120					console.error('BallModal: ошибка в ответе', errorMsg);
1121					alert(errorMsg);
1122				}
1123			}).fail(function (xhr, status, error) {
1124				var _console$error;
1125
1126				console.error('BallModal: AJAX fail вызван', (_console$error = {
1127					status: xhr.status,
1128					statusText: xhr.statusText,
1129					readyState: xhr.readyState,
1130					responseText: xhr.responseText,
1131					responseJSON: xhr.responseJSON
1132				}, _defineProperty(_console$error, 'status', status), _defineProperty(_console$error, 'error', error), _console$error));
1133
1134				var errorMsg = 'Помилка з\'єднання. Спробуйте ще раз.';
1135
1136				// Если статус 200, но попали в fail - возможно проблема с парсингом JSON
1137				if (xhr.status === 200) {
1138					console.warn('BallModal: статус 200, но попали в fail - возможно проблема с JSON');
1139					try {
1140						var response = typeof xhr.responseJSON !== 'undefined' ? xhr.responseJSON : JSON.parse(xhr.responseText);
1141
1142						if (response && response.success) {
1143							// Если ответ успешный, обрабатываем его
1144							var promocode = response.promo || response.promocode || 'DOSTFREE';
1145							console.log('BallModal: обрабатываем ответ из fail (статус 200)', promocode);
1146							_this4.showModalStep2(promocode);
1147							_cookieData2.default.add('show-ball-modal', false, {
1148								expires: 365,
1149								path: '/',
1150								SameSite: 'None',
1151								Secure: 'Secure'
1152							});
1153							return;
1154						} else if (response && response.response) {
1155							errorMsg = response.response;
1156						}
1157					} catch (e) {
1158						console.error('BallModal: ошибка парсинга ответа', e);
1159						errorMsg = 'Помилка: некоректна відповідь від сервера';
1160					}
1161				} else {
1162					// Пытаемся получить сообщение об ошибке из ответа
1163					if (xhr.responseJSON && xhr.responseJSON.response) {
1164						errorMsg = xhr.responseJSON.response;
1165					} else if (xhr.responseText) {
1166						try {
1167							var errorResponse = JSON.parse(xhr.responseText);
1168							if (errorResponse.response) {
1169								errorMsg = errorResponse.response;
1170							}
1171						} catch (e) {
1172							// Игнорируем ошибку парсинга
1173						}
1174					}
1175				}
1176
1177				alert(errorMsg);
1178			});
1179		}
1180
1181		/**
1182   * Инициализация кнопки копирования промокода
1183   */
1184
1185	}, {
1186		key: 'initCopyButton',
1187		value: function initCopyButton() {
1188			var copyBtn = document.querySelector('[data-copy-target]');
1189			if (!copyBtn) {
1190				return;
1191			}
1192
1193			copyBtn.addEventListener('click', function (e) {
1194				e.preventDefault();
1195				var targetSelector = copyBtn.getAttribute('data-copy-target');
1196				var targetInput = document.querySelector(targetSelector);
1197
1198				if (targetInput) {
1199					targetInput.select();
1200					targetInput.setSelectionRange(0, 99999); // Для мобильных устройств
1201
1202					try {
1203						document.execCommand('copy');
1204
1205						// Визуальная обратная связь
1206						var originalText = copyBtn.textContent;
1207						copyBtn.textContent = 'Скопійовано!';
1208						setTimeout(function () {
1209							copyBtn.textContent = originalText;
1210						}, 2000);
1211					} catch (err) {
1212						alert('Не вдалося скопіювати промокод');
1213					}
1214				}
1215			});
1216		}
1217	}]);
1218
1219	return BallModal;
1220}();
1221
1222exports.default = BallModal;
1223
1224/***/ }),
1225
1226/***/ "./_HTML/src/js/_modules/catalog-search.js":
1227/*!*************************************************!*\
1228  !*** ./_HTML/src/js/_modules/catalog-search.js ***!
1229  \*************************************************/
1230/*! no static exports found */
1231/***/ (function(module, exports, __webpack_require__) {
1232
1233"use strict";
1234
1235
1236Object.defineProperty(exports, "__esModule", {
1237	value: true
1238});
1239exports.refs = undefined;
1240
1241exports.default = function () {
1242	if (!refs.openBtn) {
1243		return;
1244	}
1245
1246	var handleSearchAutocomplete = function handleSearchAutocomplete(searchTerm) {
1247		refs.searchAllBtn.href = window.wezomConfig.search + '?q=' + encodeURI(searchTerm);
1248		$.ajax({
1249			method: 'POST',
1250			url: window.wezomConfig.searchAutocomplete,
1251			data: {
1252				query: searchTerm
1253			}
1254		}).done(function (res) {
1255			if (res.success && res.items_markup) {
1256				refs.notFoundText.style.display = 'none';
1257				refs.itemsList.innerHTML = res.items_markup;
1258				refs.itemsWrap.style.display = 'block';
1259				return;
1260			}
1261			refs.itemsWrap.style.display = 'none';
1262			refs.notFoundText.style.display = 'block';
1263		}).fail(function (err) {
1264			refs.itemsWrap.style.display = 'none';
1265			refs.notFoundText.style.display = 'block';
1266			console.error(err.responseText);
1267		});
1268	};
1269
1270	var handleSearchInput = function handleSearchInput(e) {
1271		if (!e.target.value) {
1272			refs.itemsWrap.style.display = 'none';
1273			refs.notFoundText.style.display = 'none';
1274			return;
1275		}
1276		var searchTerm = e.target.value.trim().toLocaleLowerCase();
1277		// console.log(searchTerm.replace(/^\w\s/gi, ''));
1278		if (!searchTerm) {
1279			e.target.value = '';
1280			refs.itemsWrap.style.display = 'none';
1281			refs.notFoundText.style.display = 'block';
1282			return;
1283		}
1284		handleSearchAutocomplete(searchTerm);
1285	};
1286
1287	refs.searchInput.addEventListener('input', (0, _lodash2.default)(handleSearchInput, 500));
1288
1289	var handleEscClose = function handleEscClose(event) {
1290		if (event.code === 'Escape') {
1291			event.preventDefault();
1292			if (document.querySelector('.mfp-ready') || !refs.menu.classList.contains('is-hidden')) {
1293				return;
1294			}
1295			window.removeEventListener('keydown', handleEscClose);
1296			if (refs.search.classList.contains('is-hidden')) {
1297				return;
1298			}
1299			toggleSearch();
1300		}
1301	};
1302
1303	var handleHotKeyPress = function handleHotKeyPress(event) {
1304		if ((event.ctrlKey || event.metaKey) && event.code === 'KeyK') {
1305			event.preventDefault();
1306			if (document.querySelector('.mfp-ready') || !refs.menu.classList.contains('is-hidden')) {
1307				return;
1308			}
1309			window.removeEventListener('keydown', handleEscClose);
1310			toggleSearch();
1311		}
1312	};
1313
1314	var toggleSearch = function toggleSearch() {
1315		var isSearchOpen = refs.openBtn.getAttribute('aria-expanded') === 'true' || false;
1316
1317		if (!isSearchOpen) {
1318			refs.notFoundText.style.display = 'none';
1319			// add close on Esc
1320			window.addEventListener('keydown', handleEscClose);
1321			window.setTimeout(function () {
1322				refs.searchInput.focus();
1323				refs.searchInput.setSelectionRange(-1, -1);
1324			}, 200);
1325
1326			if (refs.searchInput.value) {
1327				handleSearchAutocomplete(refs.searchInput.value);
1328			}
1329		}
1330
1331		// show/hide search
1332		refs.openBtn.setAttribute('aria-expanded', !isSearchOpen);
1333		refs.search.classList.toggle('is-hidden');
1334
1335		// lock/unlock window scroll
1336		(0, _mainMenu.toggleBodyScrollLock)(!isSearchOpen, refs.search);
1337	};
1338
1339	refs.openBtn.addEventListener('click', toggleSearch);
1340
1341	refs.search.addEventListener('click', function (_ref) {
1342		var target = _ref.target;
1343
1344		if (target !== refs.search && target !== refs.closeBtn) {
1345			return;
1346		}
1347		toggleSearch();
1348	});
1349
1350	window.addEventListener('keydown', handleHotKeyPress);
1351};
1352
1353var _lodash = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js");
1354
1355var _lodash2 = _interopRequireDefault(_lodash);
1356
1357var _mainMenu = __webpack_require__(/*! ./main-menu */ "./_HTML/src/js/_modules/main-menu.js");
1358
1359function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1360
1361var refs = exports.refs = {
1362	body: document.body,
1363	menu: document.querySelector('.js-main-menu'),
1364	search: document.querySelector('.js-catalog-search'),
1365	searchInput: document.querySelector('.js-catalog-search-input'),
1366	openBtn: document.querySelector('.js-catalog-search-open'),
1367	closeBtn: document.querySelector('.js-catalog-search-close'),
1368	searchAllBtn: document.querySelector('.js-catalog-search-show-all'),
1369	itemsList: document.querySelector('.js-catalog-search-items-list'),
1370	itemsWrap: document.querySelector('.js-catalog-search-items-wrap'),
1371	notFoundText: document.querySelector('.js-catalog-search-not-found-text')
1372};
1373
1374/***/ }),
1375
1376/***/ "./_HTML/src/js/_modules/click-trigger-for/index.js":
1377/*!**********************************************************!*\
1378  !*** ./_HTML/src/js/_modules/click-trigger-for/index.js ***!
1379  \**********************************************************/
1380/*! no static exports found */
1381/***/ (function(module, exports, __webpack_require__) {
1382
1383"use strict";
1384
1385'use  strict';
1386
1387/**
1388 * @module
1389 */
1390
1391Object.defineProperty(exports, "__esModule", {
1392	value: true
1393});
1394exports.clickTriggerFor = clickTriggerFor;
1395
1396var _jquery = __webpack_require__(/*! jquery */ "jquery");
1397
1398var _jquery2 = _interopRequireDefault(_jquery);
1399
1400__webpack_require__(/*! custom-jquery-methods/fn/get-my-elements */ "./node_modules/custom-jquery-methods/fn/get-my-elements.js");
1401
1402function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1403
1404function clickTriggerFor() {
1405	(0, _jquery2.default)(document).on('click', '[data-click-trigger-for]', function () {
1406		var $this = (0, _jquery2.default)(this);
1407		var selector = $this.data('click-trigger-for');
1408		var $for = $this.getMyElements('$for', selector);
1409		$for.click();
1410	});
1411}
1412
1413/***/ }),
1414
1415/***/ "./_HTML/src/js/_modules/cookie-data.js":
1416/*!**********************************************!*\
1417  !*** ./_HTML/src/js/_modules/cookie-data.js ***!
1418  \**********************************************/
1419/*! no static exports found */
1420/***/ (function(module, exports, __webpack_require__) {
1421
1422"use strict";
1423
1424
1425/**
1426 * Модуль для работы с куки
1427 * @module
1428 */
1429
1430// ----------------------------------------
1431// Private
1432// ----------------------------------------
1433
1434Object.defineProperty(exports, "__esModule", {
1435	value: true
1436});
1437var _window = window,
1438    encoder = _window.encodeURIComponent,
1439    decoder = _window.decodeURIComponent;
1440
1441// ----------------------------------------
1442// Public
1443// ----------------------------------------
1444
1445/**
1446 * Работа с `document.cookie`
1447 * @namespace cookieData
1448 * @sourceCode
1449 */
1450
1451var cookieData = {
1452	/**
1453  * Добавление записи
1454  * @param {string} key
1455  * @param {*} value
1456  * @param {Object} [options={}]
1457  * @param {Date|number|string} [options.expires]
1458  * @param {string} [options.path]
1459  * @param {string} [options.domain]
1460  * @param {boolean} [options.secure]
1461  * @see {@link https://learn.javascript.ru/cookie#функция-setcookie-name-value-options}
1462  * @sourceCode
1463  */
1464	add: function add(key, value) {
1465		var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1466
1467		if (!this.allowUsage && key !== this.allowUsageKey) {
1468			console.warn('Cookie usage is disallowed!');
1469			return false;
1470		}
1471		var expires = options.expires;
1472
1473		if (typeof expires === 'number' && expires) {
1474			var d = new Date();
1475			d.setTime(d.getTime() + expires * 1000 * 60 * 60 * 24);
1476			expires = options.expires = d;
1477		}
1478
1479		if (expires && expires.toUTCString) {
1480			options.expires = expires.toUTCString();
1481		}
1482
1483		value = encoder(value);
1484		var updatedCookie = key + '=' + value;
1485
1486		for (var propName in options) {
1487			updatedCookie += '; ' + propName;
1488			var propValue = options[propName];
1489			if (propValue !== true) {
1490				updatedCookie += '=' + propValue;
1491			}
1492		}
1493
1494		document.cookie = updatedCookie;
1495	},
1496
1497
1498	/**
1499  * Получение куки по ключу
1500  * @param key
1501  * @return {string|undefined}
1502  * @see {@link https://learn.javascript.ru/cookie#функция-getcookie-name}
1503  * @sourceCode
1504  */
1505	receive: function receive(key) {
1506		var matches = document.cookie.match(new RegExp('(?:^|; )' + key.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)' // eslint-disable-line no-useless-escape
1507		));
1508		return matches ? decoder(matches[1]) : undefined;
1509	},
1510
1511
1512	/**
1513  * Удаление куки по ключу
1514  * @param {string} key
1515  * @see {@link https://learn.javascript.ru/cookie#функция-deletecookie-name}
1516  * @sourceCode
1517  */
1518	delete: function _delete(key) {
1519		this.add(key, '', { expires: -1 });
1520	},
1521
1522
1523	/**
1524  * Задать вопрос о пользовательском согласии использавния куки
1525  * @return {boolean}
1526  * @sourceCode
1527  */
1528	askUsage: function askUsage() {
1529		var _this = this;
1530
1531		if (this.allowUsage) {
1532			return false;
1533		}
1534
1535		this.$infoBlock = this.$infoBlock || $('[data-cookie-info]');
1536		this.$infoButton = this.$infoButton || $('[data-cookie-submit]');
1537
1538		if (this.$infoBlock.length && this.$infoButton.length) {
1539			var hiddenClass = 'is-hidden';
1540			this.$infoButton.on('click', function () {
1541				_this.$infoBlock.addClass(hiddenClass);
1542				_this.add(_this.allowUsageKey, _this.allowUsageValue, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' });
1543			});
1544
1545			window.setTimeout(function () {
1546				_this.$infoBlock.removeClass(hiddenClass);
1547			}, this.allowUsageDelay);
1548			return true;
1549		}
1550	},
1551
1552
1553	/**
1554  * Проверка пользовательского согласия
1555  * на использования файлов cookie
1556  * @return {boolean}
1557  * @protected
1558  * @sourceCode
1559  */
1560	get allowUsage() {
1561		return this.receive(this.allowUsageKey) === this.allowUsageValue;
1562	},
1563
1564	/**
1565  * Ключ проверки пользовательского согласия
1566  * на использования файлов cookie
1567  * @type {string}
1568  * @default 'allow-cookie-usage'
1569  * @protected
1570  * @sourceCode
1571  */
1572	get allowUsageKey() {
1573		return 'allow-cookie-usage';
1574	},
1575
1576	/**
1577  * Значение ключа проверки пользовательского согласия
1578  * на использования файлов cookie
1579  * @type {string}
1580  * @default 'true'
1581  * @protected
1582  * @sourceCode
1583  */
1584	get allowUsageValue() {
1585		return 'true';
1586	},
1587
1588	/**
1589  * Задержка (ms) для проверки пользовательского согласия
1590  * на использования файлов cookie
1591  * @type {number}
1592  * @default 2000
1593  * @protected
1594  * @sourceCode
1595  */
1596	get allowUsageDelay() {
1597		return 2000;
1598	}
1599};
1600
1601// ----------------------------------------
1602// Exports
1603// ----------------------------------------
1604
1605exports.default = cookieData;
1606
1607/***/ }),
1608
1609/***/ "./_HTML/src/js/_modules/ecommerce-tracking.js":
1610/*!*****************************************************!*\
1611  !*** ./_HTML/src/js/_modules/ecommerce-tracking.js ***!
1612  \*****************************************************/
1613/*! no static exports found */
1614/***/ (function(module, exports, __webpack_require__) {
1615
1616"use strict";
1617/* eslint-disable no-useless-escape */
1618
1619
1620/**
1621 * Ecommerce Tracking
1622 * @module
1623 */
1624
1625// ----------------------------------------
1626// Imports
1627// ----------------------------------------
1628
1629Object.defineProperty(exports, "__esModule", {
1630	value: true
1631});
1632
1633var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
1634
1635function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
1636
1637var EcommerceTracking = function () {
1638	function EcommerceTracking() {
1639		_classCallCheck(this, EcommerceTracking);
1640
1641		this.itemBrand = 'Уманьпиво';
1642		this.currency = 'UAH';
1643	}
1644
1645	/**
1646  * Clear the previous ecommerce object.
1647  */
1648
1649
1650	_createClass(EcommerceTracking, [{
1651		key: 'clear',
1652		value: function clear() {
1653			window.dataLayer.push({ ecommerce: null });
1654		}
1655	}, {
1656		key: 'trackFormSubmit',
1657		value: function trackFormSubmit(event) {
1658			window.dataLayer.push({
1659				event: event
1660			});
1661		}
1662	}, {
1663		key: 'trackViewItem',
1664		value: function trackViewItem(productData) {
1665			if (!productData) return;
1666			productData.item_brand = this.itemBrand;
1667			productData.currency = this.currency;
1668			this.clear();
1669			window.dataLayer.push({
1670				event: 'view_item',
1671				ecommerce: {
1672					items: [productData]
1673				}
1674			});
1675		}
1676	}, {
1677		key: 'trackCartItem',
1678		value: function trackCartItem(event, productData) {
1679			var _this = this;
1680
1681			var quantity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
1682
1683			if (!productData) return;
1684
1685			var items = Array.isArray(productData) ? productData : [productData];
1686			var value = 0;
1687
1688			items.forEach(function (item) {
1689				item.item_brand = _this.itemBrand;
1690				item.quantity = item.quantity ? parseInt(item.quantity) * quantity : quantity;
1691				value += item.price * item.quantity;
1692			});
1693
1694			this.clear();
1695
1696			var pushData = {
1697				event: event,
1698				ecommerce: {
1699					value: value,
1700					currency: this.currency,
1701					items: items
1702				}
1703			};
1704
1705			window.dataLayer.push(pushData);
1706		}
1707	}, {
1708		key: 'trackBeginCheckout',
1709		value: function trackBeginCheckout(amount, items) {
1710			var _this2 = this;
1711
1712			if (!amount || !items) return;
1713
1714			// Ensure items is an array
1715			var itemsArray = Array.isArray(items) ? items : Object.values(items);
1716
1717			if (!itemsArray.length) return;
1718
1719			itemsArray.forEach(function (item) {
1720				item.item_brand = _this2.itemBrand;
1721			});
1722
1723			this.clear();
1724
1725			var pushData = {
1726				event: 'begin_checkout',
1727				ecommerce: {
1728					value: parseFloat(amount),
1729					currency: this.currency,
1730					items: itemsArray
1731				}
1732			};
1733
1734			window.dataLayer.push(pushData);
1735		}
1736	}, {
1737		key: 'trackPurchase',
1738		value: function trackPurchase(order) {
1739			var _this3 = this;
1740
1741			if (!order) return;
1742
1743			var orderId = order.order_id,
1744			    amount = order.amount,
1745			    deliveryType = order.delivery_type,
1746			    _order$coupon = order.coupon,
1747			    coupon = _order$coupon === undefined ? null : _order$coupon,
1748			    items = order.items;
1749
1750
1751			if (!items) return;
1752
1753			// Ensure items is an array
1754			var itemsArray = Array.isArray(items) ? items : Object.values(items);
1755
1756			if (!itemsArray.length) return;
1757
1758			itemsArray.forEach(function (item) {
1759				item.item_brand = _this3.itemBrand;
1760			});
1761
1762			this.clear();
1763
1764			var pushData = {
1765				event: 'purchase',
1766				ecommerce: {
1767					transaction_id: orderId,
1768					value: parseFloat(amount),
1769					currency: this.currency,
1770					delivery_type: deliveryType,
1771					items: itemsArray
1772				}
1773			};
1774
1775			if (coupon) {
1776				pushData.ecommerce.coupon = coupon;
1777			}
1778
1779			window.dataLayer.push(pushData);
1780		}
1781	}]);
1782
1783	return EcommerceTracking;
1784}();
1785
1786exports.default = new EcommerceTracking();
1787
1788/***/ }),
1789
1790/***/ "./_HTML/src/js/_modules/equal-height.js":
1791/*!***********************************************!*\
1792  !*** ./_HTML/src/js/_modules/equal-height.js ***!
1793  \***********************************************/
1794/*! no static exports found */
1795/***/ (function(module, exports, __webpack_require__) {
1796
1797"use strict";
1798
1799
1800Object.defineProperty(exports, "__esModule", {
1801	value: true
1802});
1803
1804var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
1805
1806function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
1807
1808// list of elements
1809var equalHeightsElements = ['.slider-products .slider-reviews__item__name'];
1810
1811var EqualHeight = function () {
1812	function EqualHeight() {
1813		_classCallCheck(this, EqualHeight);
1814	}
1815
1816	_createClass(EqualHeight, [{
1817		key: 'init',
1818		value: function init() {
1819			equalHeightsElements.forEach(function (item) {
1820				// console.log(item);
1821				var itemElement = $(item);
1822				if (itemElement.length) {
1823					itemElement.equalHeights();
1824				}
1825			});
1826		}
1827	}]);
1828
1829	return EqualHeight;
1830}();
1831
1832exports.default = new EqualHeight();
1833
1834/***/ }),
1835
1836/***/ "./_HTML/src/js/_modules/lazyload/index.js":
1837/*!*************************************************!*\
1838  !*** ./_HTML/src/js/_modules/lazyload/index.js ***!
1839  \*************************************************/
1840/*! no static exports found */
1841/***/ (function(module, exports, __webpack_require__) {
1842
1843"use strict";
1844
1845
1846/**
1847 *
1848 * @module
1849 */
1850
1851// ----------------------------------------
1852// Imports
1853// ----------------------------------------
1854
1855Object.defineProperty(exports, "__esModule", {
1856	value: true
1857});
1858exports.selector = undefined;
1859exports.lazyload = lazyload;
1860
1861var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc");
1862
1863var _modernizr2 = _interopRequireDefault(_modernizr);
1864
1865function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1866
1867// ----------------------------------------
1868// Public
1869// ----------------------------------------
1870
1871/**
1872 * @type {string}
1873 */
1874var selector = exports.selector = '.js-lazyload';
1875
1876/**
1877 * @param {string|NodeList} selectorOrNodeList
1878 * @property {selector}
1879 * @return {Promise<any>}
1880 */
1881function lazyload() {
1882	var selectorOrNodeList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : selector;
1883	var option = arguments[1];
1884
1885	return new Promise(function (resolve, reject) {
1886		var _initialize = function _initialize(_ref) {
1887			var zzLoad = _ref.default;
1888
1889			resolve(zzLoad(selectorOrNodeList, option));
1890		};
1891
1892		if (_modernizr2.default.intersectionobserver) {
1893			__webpack_require__.e(/*! import() */ 34).then(__webpack_require__.bind(null, /*! zz-load */ "./node_modules/zz-load/zz-load.es.js")).then(_initialize);
1894		} else {
1895			__webpack_require__.e(/*! import() */ 41).then(__webpack_require__.t.bind(null, /*! intersection-observer */ "./node_modules/intersection-observer/intersection-observer.js", 7)).then(function () {
1896				__webpack_require__.e(/*! import() */ 34).then(__webpack_require__.bind(null, /*! zz-load */ "./node_modules/zz-load/zz-load.es.js")).then(_initialize);
1897			});
1898		}
1899	});
1900}
1901
1902/***/ }),
1903
1904/***/ "./_HTML/src/js/_modules/main-menu.js":
1905/*!********************************************!*\
1906  !*** ./_HTML/src/js/_modules/main-menu.js ***!
1907  \********************************************/
1908/*! no static exports found */
1909/***/ (function(module, exports, __webpack_require__) {
1910
1911"use strict";
1912
1913
1914Object.defineProperty(exports, "__esModule", {
1915	value: true
1916});
1917exports.toggleBodyScrollLock = exports.toggleFixedElementsOffset = exports.isIOS = exports.getBrwoserScrollbarWidth = exports.refs = undefined;
1918
1919exports.default = function () {
1920	if (!refs.openBtn) {
1921		return;
1922	}
1923
1924	var handleEscClose = function handleEscClose(event) {
1925		if (event.code === 'Escape') {
1926			event.preventDefault();
1927			window.removeEventListener('keydown', handleEscClose);
1928			if (document.querySelector('.js-main-menu').classList.contains('is-hidden')) {
1929				return;
1930			}
1931			toggleMenu();
1932		}
1933	};
1934
1935	var toggleMenu = function toggleMenu() {
1936		var isMenuOpen = refs.openBtn.getAttribute('aria-expanded') === 'true' || false;
1937
1938		// show/hide menu
1939		refs.openBtn.setAttribute('aria-expanded', !isMenuOpen);
1940		refs.menu.classList.toggle('is-hidden');
1941
1942		// lock/unlock window scroll
1943		toggleBodyScrollLock(!isMenuOpen, refs.menu.querySelector('.main-menu__body'));
1944
1945		// add close on Esc
1946		!isMenuOpen && window.addEventListener('keydown', handleEscClose);
1947	};
1948
1949	refs.openBtn.addEventListener('click', toggleMenu);
1950	if (refs.openMobileBtn) {
1951		refs.openMobileBtn.addEventListener('click', toggleMenu);
1952	}
1953	refs.menu.addEventListener('click', function (_ref) {
1954		var target = _ref.target;
1955
1956		if (target !== refs.menu && target !== refs.closeBtn) {
1957			return;
1958		}
1959		toggleMenu();
1960	});
1961};
1962
1963var _bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ "./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js");
1964
1965var refs = exports.refs = {
1966	body: document.body,
1967	fixedElements: document.querySelectorAll('[data-fixed]'),
1968	menu: document.querySelector('.js-main-menu'),
1969	openBtn: document.querySelector('.js-main-menu-open'),
1970	closeBtn: document.querySelector('.js-main-menu-close'),
1971	openMobileBtn: document.querySelector('.js-main-mobile-menu-open')
1972};
1973
1974/**
1975 * Retrieves the width of the browser's scrollbar.
1976 * @returns {number} The width of the scrollbar in pixels.
1977 */
1978var getBrwoserScrollbarWidth = exports.getBrwoserScrollbarWidth = function getBrwoserScrollbarWidth() {
1979	return window.innerWidth - document.documentElement.clientWidth;
1980};
1981
1982var isIOS = exports.isIOS = function isIOS() {
1983	return 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
1984};
1985
1986/**
1987 * Sets the right offset value for a fixed elements.
1988 * @param {string} value - The value to set as the right offset.
1989 */
1990var toggleFixedElementsOffset = exports.toggleFixedElementsOffset = function toggleFixedElementsOffset(value) {
1991	refs.fixedElements.forEach(function (element) {
1992		element.style.paddingRight = value;
1993	});
1994};
1995
1996/**
1997 * Toggles the body scroll lock on or off without breaking scrolling of a specific target element.
1998 * Also adjusts the body and fixed header offsets accordingly.
1999 * @param {boolean} on - Whether to enable or disable the scroll lock.
2000 * @param {HTMLElement} targetRef - The reference to the target element that you want to persist scrolling for (such as a modal/lightbox/flyout/nav).
2001 */
2002var toggleBodyScrollLock = exports.toggleBodyScrollLock = function toggleBodyScrollLock(on, targetRef) {
2003	// fix body & fixed header offsets
2004	var scrollBarWidth = on ? getBrwoserScrollbarWidth() + 'px' : 0;
2005	refs.body.style.paddingRight = scrollBarWidth;
2006	toggleFixedElementsOffset(scrollBarWidth);
2007
2008	// lock/unlock window scroll
2009	if (!isIOS()) {
2010		on ? (0, _bodyScrollLock.disableBodyScroll)(targetRef) : (0, _bodyScrollLock.enableBodyScroll)(targetRef);
2011		return;
2012	}
2013
2014	document.body.style.overflow = on ? 'hidden' : '';
2015};
2016
2017/***/ }),
2018
2019/***/ "./_HTML/src/js/_modules/modernizr/custom-tests/edge.js":
2020/*!**************************************************************!*\
2021  !*** ./_HTML/src/js/_modules/modernizr/custom-tests/edge.js ***!
2022  \**************************************************************/
2023/*! no static exports found */
2024/***/ (function(module, exports, __webpack_require__) {
2025
2026"use strict";
2027
2028
2029/**
2030 * @module
2031 */
2032
2033// ----------------------------------------
2034// Imports
2035// ----------------------------------------
2036
2037var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc");
2038
2039var _modernizr2 = _interopRequireDefault(_modernizr);
2040
2041function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2042
2043// ----------------------------------------
2044// Public
2045// ----------------------------------------
2046
2047_modernizr2.default.addTest('edge', / edge\//i.test(window.navigator.userAgent));
2048
2049/***/ }),
2050
2051/***/ "./_HTML/src/js/_modules/modernizr/custom-tests/intersection-observer.js":
2052/*!*******************************************************************************!*\
2053  !*** ./_HTML/src/js/_modules/modernizr/custom-tests/intersection-observer.js ***!
2054  \*******************************************************************************/
2055/*! no static exports found */
2056/***/ (function(module, exports, __webpack_require__) {
2057
2058"use strict";
2059
2060
2061/**
2062 * @module
2063 */
2064
2065// ----------------------------------------
2066// Imports
2067// ----------------------------------------
2068
2069var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc");
2070
2071var _modernizr2 = _interopRequireDefault(_modernizr);
2072
2073function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2074
2075// ----------------------------------------
2076// Public
2077// ----------------------------------------
2078
2079_modernizr2.default.addTest('intersectionobserver', 'IntersectionObserver' in window);
2080
2081/***/ }),
2082
2083/***/ "./_HTML/src/js/_modules/modernizr/index.js":
2084/*!**************************************************!*\
2085  !*** ./_HTML/src/js/_modules/modernizr/index.js ***!
2086  \**************************************************/
2087/*! no static exports found */
2088/***/ (function(module, exports, __webpack_require__) {
2089
2090"use strict";
2091
2092
2093/**
2094 * Кастомные тесты для Modernizr
2095 * @module
2096 * @author Oleg Dutchenko <[email protected]>
2097 * @version 1.0.0
2098 */
2099
2100// ----------------------------------------
2101// Imports
2102// ----------------------------------------
2103
2104var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc");
2105
2106var _modernizr2 = _interopRequireDefault(_modernizr);
2107
2108__webpack_require__(/*! ./custom-tests/intersection-observer */ "./_HTML/src/js/_modules/modernizr/custom-tests/intersection-observer.js");
2109
2110__webpack_require__(/*! ./custom-tests/edge */ "./_HTML/src/js/_modules/modernizr/custom-tests/edge.js");
2111
2112function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2113
2114// import './custom-tests/mix-blend-mode';
2115
2116// ----------------------------------------
2117// Public
2118// ----------------------------------------
2119
2120window.Modernizr = _modernizr2.default;
2121
2122/***/ }),
2123
2124/***/ "./_HTML/src/js/_modules/products-filter/index.js":
2125/*!********************************************************!*\
2126  !*** ./_HTML/src/js/_modules/products-filter/index.js ***!
2127  \********************************************************/
2128/*! no static exports found */
2129/***/ (function(module, exports, __webpack_require__) {
2130
2131"use strict";
2132
2133
2134Object.defineProperty(exports, "__esModule", {
2135	value: true
2136});
2137
2138var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
2139
2140var _nouislider = __webpack_require__(/*! nouislider */ "./node_modules/nouislider/dist/nouislider.mjs");
2141
2142var _nouislider2 = _interopRequireDefault(_nouislider);
2143
2144var _numeral = __webpack_require__(/*! numeral */ "./node_modules/numeral/numeral.js");
2145
2146var _numeral2 = _interopRequireDefault(_numeral);
2147
2148function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2149
2150function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
2151
2152var $ = window.jQuery;
2153
2154var _class = function () {
2155	function _class() {
2156		_classCallCheck(this, _class);
2157
2158		this.data = {
2159			elms: {
2160				filterParent: '#product-filter',
2161				sliderElm: '#product-filter__price-slider',
2162				minElm: '#product-filter__price-min',
2163				maxElm: '#product-filter__price-max'
2164			},
2165			values: {
2166				min: 0,
2167				max: 0,
2168				currentMin: 0,
2169				currentMax: 0
2170			},
2171			decimals: 2
2172		};
2173	}
2174
2175	_createClass(_class, [{
2176		key: 'init',
2177		value: function init() {
2178			if (this.isEnabled()) {
2179				this.prepareValues();
2180				this.bind();
2181				this.initSlider();
2182			}
2183		}
2184	}, {
2185		key: 'isEnabled',
2186		value: function isEnabled() {
2187			return $(this.data.elms.filterParent).length;
2188		}
2189	}, {
2190		key: 'prepareValues',
2191		value: function prepareValues() {
2192			var _t = this;
2193			var _e = _t.data.elms;
2194			var _v = _t.data.values;
2195			// Elms
2196			var slider = $(_e.sliderElm);
2197			var minValue = $(_e.minElm);
2198			var maxValue = $(_e.maxElm);
2199			// Values
2200			_v.min = Number(slider.data('min'));
2201			_v.max = Number(slider.data('max'));
2202			_v.currentMin = Number(minValue.val());
2203			_v.currentMax = Number(maxValue.val());
2204		}
2205	}, {
2206		key: 'initSlider',
2207		value: function initSlider() {
2208			var _t = this;
2209			var _e = _t.data.elms;
2210			var _v = _t.data.values;
2211			var min = parseFloat(_v.min);
2212			var max = parseFloat(_v.max);
2213			var minStart = parseFloat(_v.currentMin);
2214			var maxStart = parseFloat(_v.currentMax);
2215			var decimals = 0;
2216			var formatSlide = void 0;
2217
2218			// Decimal
2219			if (/\./.test(min) || /\./.test(max)) {
2220				decimals = Math.max(min.toString().replace(/^\d+(\.|$)/, '').length, max.toString().replace(/^\d+(\.|$)/, '').length);
2221			}
2222
2223			if (decimals > 2) {
2224				decimals = 2;
2225			}
2226
2227			formatSlide = {
2228				to: function to(v, h, r) {
2229					var format = '(0';
2230					if (v < 100 && decimals) {
2231						format += '.' + '0'.repeat(decimals);
2232					} else if (v > 1000) {
2233						format += '.0';
2234					}
2235					format += ' a)';
2236
2237					return v > 1000 ? (0, _numeral2.default)(v).format(format) : v.toFixed(decimals);
2238				},
2239				from: function from(v) {
2240					return v;
2241				}
2242			};
2243
2244			var sliderOptions = {
2245				animate: false,
2246				behaviour: 'snap',
2247				connect: true,
2248				format: formatSlide,
2249				cssPrefix: 'products-slider__noUi-',
2250				start: [minStart, maxStart],
2251				range: {
2252					'min': min,
2253					'max': max
2254				},
2255				pips: {
2256					mode: 'range',
2257					density: 4
2258				}
2259			};
2260
2261			// Create, Update
2262			var slider = document.getElementById(_e.sliderElm.substring(1));
2263
2264			if (slider.hasOwnProperty('noUiSlider')) {
2265				slider.noUiSlider.updateOptions(sliderOptions, false);
2266
2267				return true;
2268			}
2269
2270			_nouislider2.default.create(slider, sliderOptions);
2271
2272			slider.noUiSlider.on('update', function (formatted, handle, values, tap, positions, sliderObj) {
2273				_v.currentMin = values[0].toFixed(_t.data.decimals);
2274				_v.currentMax = values[1].toFixed(_t.data.decimals);
2275				_t.setValues();
2276			});
2277
2278			slider.noUiSlider.on('set', function (formatted, handle, values, tap, positions, sliderObj) {
2279				_v.currentMin = values[0].toFixed(_t.data.decimals);
2280				_v.currentMax = values[1].toFixed(_t.data.decimals);
2281				_t.setValues();
2282			});
2283		}
2284	}, {
2285		key: 'bind',
2286		value: function bind() {
2287			var _t = this;
2288			var _e = _t.data.elms;
2289			var _v = _t.data.values;
2290
2291			$(document).on('change', _e.minElm, function (e) {
2292				e.preventDefault();
2293				_v.currentMin = parseFloat($(this).val()).toFixed(_t.data.decimals);
2294				_t.setSilder();
2295			});
2296
2297			$(document).on('change', _e.maxElm, function (e) {
2298				e.preventDefault();
2299				_v.currentMax = parseFloat($(this).val()).toFixed(_t.data.decimals);
2300				_t.setSilder();
2301			});
2302		}
2303	}, {
2304		key: 'setSilder',
2305		value: function setSilder() {
2306			var slider = document.getElementById(this.data.elms.sliderElm.substring(1));
2307			slider.noUiSlider.set([this.data.values.currentMin, this.data.values.currentMax]);
2308		}
2309	}, {
2310		key: 'setValues',
2311		value: function setValues() {
2312			var _t = this;
2313			var _e = _t.data.elms;
2314			var _v = _t.data.values;
2315
2316			var minValue = (Math.round(parseFloat(_v.currentMin) * 100) / 100).toFixed(_t.data.decimals);
2317			if (minValue < _v.min) {
2318				minValue = _v.min;
2319			}
2320			$(_e.minElm).val(minValue);
2321
2322			var maxValue = (Math.round(parseFloat(_v.currentMax) * 100) / 100).toFixed(_t.data.decimals);
2323			if (maxValue > _v.max) {
2324				maxValue = _v.max;
2325			}
2326			$(_e.maxElm).val(maxValue);
2327		}
2328	}]);
2329
2330	return _class;
2331}();
2332
2333exports.default = _class;
2334;
2335
2336/***/ }),
2337
2338/***/ "./_HTML/src/js/_modules/utm-tracking.js":
2339/*!***********************************************!*\
2340  !*** ./_HTML/src/js/_modules/utm-tracking.js ***!
2341  \***********************************************/
2342/*! no static exports found */
2343/***/ (function(module, exports, __webpack_require__) {
2344
2345"use strict";
2346/* eslint-disable no-useless-escape */
2347
2348
2349/**
2350 * UTM TRACKING
2351 * @module
2352 */
2353
2354// ----------------------------------------
2355// Imports
2356// ----------------------------------------
2357
2358Object.defineProperty(exports, "__esModule", {
2359	value: true
2360});
2361
2362var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
2363
2364var _cookieData = __webpack_require__(/*! ./cookie-data */ "./_HTML/src/js/_modules/cookie-data.js");
2365
2366var _cookieData2 = _interopRequireDefault(_cookieData);
2367
2368function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2369
2370function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
2371
2372var UtmTracking = function () {
2373	function UtmTracking() {
2374		_classCallCheck(this, UtmTracking);
2375
2376		// Get the URL parameters variable by UTM names
2377		this.source = this.getParameterByName('utm_source');
2378		this.medium = this.getParameterByName('utm_medium');
2379		this.campaign = this.getParameterByName('utm_campaign');
2380		this.content = this.getParameterByName('utm_content');
2381		this.term = this.getParameterByName('utm_term');
2382	}
2383
2384	_createClass(UtmTracking, [{
2385		key: 'init',
2386		value: function init() {
2387			// Do the Set UTM function for each UTM
2388			this.setUtm('utm_source', this.source);
2389			this.setUtm('utm_medium', this.medium);
2390			this.setUtm('utm_campaign', this.campaign);
2391			this.setUtm('utm_content', this.content);
2392			this.setUtm('utm_term', this.term);
2393		}
2394
2395		// Parse the URL
2396
2397	}, {
2398		key: 'getParameterByName',
2399		value: function getParameterByName(name) {
2400			name = name.replace(/[\[]/, '\[').replace(/[\]]/, '\]');
2401			var regex = new RegExp('[\?&]' + name + '=([^&#]*)');
2402			var results = regex.exec(window.location.search);
2403			return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
2404		}
2405
2406		// Set UTM function
2407
2408	}, {
2409		key: 'setUtm',
2410		value: function setUtm(utmParam, utmVal) {
2411			if (utmVal === '') {
2412				return;
2413			};
2414			// TODO: determine the max expiring time or clear after ordering
2415			_cookieData2.default.add(utmParam, utmVal, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' });
2416		}
2417	}]);
2418
2419	return UtmTracking;
2420}();
2421
2422exports.default = new UtmTracking();
2423
2424/***/ }),
2425
2426/***/ "./_HTML/src/js/_polyfills/mdn.js":
2427/*!****************************************!*\
2428  !*** ./_HTML/src/js/_polyfills/mdn.js ***!
2429  \****************************************/
2430/*! no static exports found */
2431/***/ (function(module, exports, __webpack_require__) {
2432
2433"use strict";
2434
2435
2436/**
2437 * @module
2438 */
2439
2440// ----------------------------------------
2441// Imports
2442// ----------------------------------------
2443
2444__webpack_require__(/*! mdn-polyfills/src/Object.assign */ "./node_modules/mdn-polyfills/src/Object.assign/index.js");
2445
2446/***/ }),
2447
2448/***/ "./_HTML/src/js/_polyfills/promise-polyfill.js":
2449/*!*****************************************************!*\
2450  !*** ./_HTML/src/js/_polyfills/promise-polyfill.js ***!
2451  \*****************************************************/
2452/*! no static exports found */
2453/***/ (function(module, exports, __webpack_require__) {
2454
2455"use strict";
2456
2457
2458/**
2459 * Полифил для IE, Edge и других браузеров
2460 * которые не имеют нативную поддержку Promise
2461 * @see {@link https://www.npmjs.com/package/es6-promise-polyfill}
2462 * @module
2463 */
2464
2465// ----------------------------------------
2466// Imports
2467// ----------------------------------------
2468
2469var _es6PromisePolyfill = __webpack_require__(/*! es6-promise-polyfill */ "./node_modules/es6-promise-polyfill/promise.js");
2470
2471// ----------------------------------------
2472// Public
2473// ----------------------------------------
2474
2475window.Promise = window.Promise || _es6PromisePolyfill.Promise;
2476
2477/***/ }),
2478
vendor: 2,017 bytes, lines 2479-2530
2479/***/ "./_HTML/src/js/_vendors/dynamicAdapt.js":
2480/*!***********************************************!*\
2481  !*** ./_HTML/src/js/_vendors/dynamicAdapt.js ***!
2482  \***********************************************/
2483/*! no static exports found */
2484/***/ (function(module, exports, __webpack_require__) {
2485
2486"use strict";
2487
2488
2489Object.defineProperty(exports, "__esModule", {
2490  value: true
2491});
2492
2493var _slicedToArray = function () { function sliceIterator(arr, i) { 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"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
2494
2495exports.useDynamicAdapt = useDynamicAdapt;
2496
2497function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
2498
2499/**
2500 * @typedef {Object} dNode
2501 * @property {HTMLElement} parent
2502 * @property {HTMLElement} element
2503 * @property {HTMLElement} to
2504 * @property {string} breakpoint
2505 * @property {string} order
2506 * @property {number} index
2507 */
2508
2509/**
2510 * @typedef {Object} dMediaQuery
2511 * @property {string} query
2512 * @property {number} breakpoint
2513 */
2514
2515/**
2516 * @param {'min' | 'max'} type
2517 */
2518function useDynamicAdapt() {
2519  var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'max';
2520
2521  var className = '_dynamic_adapt_';
2522  var attrName = 'data-da';
2523
2524  /** @type {dNode[]} */
2525  var dNodes = getDNodes();
2526
2527  /** @type {dMediaQuery[]} */
2528  var dMediaQueries = getDMediaQueries(dNodes);
2529
2530  dMediaQueries.forEach(function (dMediaQuery) {
2531    var matchMedia = window.matchMedia(dMediaQuery.query);
2532    // массив объектов с подходящим брейкпоинтом
2533    var filteredDNodes = dNodes.filter(function (_ref) {
2534      var breakpoint = _ref.breakpoint;
2535      return breakpoint === dMediaQuery.breakpoint;
2536    });
2537    var mediaHandler = getMediaHandler(matchMedia, filteredDNodes);
2538    matchMedia.addEventListener('change', mediaHandler);
2539
2540    mediaHandler();
2541  });
2542
2543  function getDNodes() {
2544    var result = [];
2545    var elements = [].concat(_toConsumableArray(document.querySelectorAll('[' + attrName + ']')));
2546
2547    elements.forEach(function (element) {
2548      var attr = element.getAttribute(attrName);
2549
2550      var _attr$split$map = attr.split(',').map(function (val) {
2551        return val.trim();
2552      }),
2553          _attr$split$map2 = _slicedToArray(_attr$split$map, 3),
2554          toSelector = _attr$split$map2[0],
2555          breakpoint = _attr$split$map2[1],
2556          order = _attr$split$map2[2];
2557
2558      var to = document.querySelector(toSelector);
2559
2560      if (to) {
2561        result.push({
2562          parent: element.parentElement,
2563          element: element,
2564          to: to,
2565          breakpoint: breakpoint ? breakpoint : '767',
2566          order: order !== undefined ? isNumber(order) ? Number(order) : order : 'last',
2567          index: -1
2568        });
2569      }
2570    });
2571
2572    return sortDNodes(result);
2573  }
2574
2575  /**
2576   * @param {dNode} items
2577   * @returns {dMediaQuery[]}
2578   */
2579  function getDMediaQueries(items) {
2580    var uniqItems = [].concat(_toConsumableArray(new Set(items.map(function (_ref2) {
2581      var breakpoint = _ref2.breakpoint;
2582      return '(' + type + '-width: ' + breakpoint + 'px),' + breakpoint;
2583    }))));
2584
2585    return uniqItems.map(function (item) {
2586      var _item$split = item.split(','),
2587          _item$split2 = _slicedToArray(_item$split, 2),
2588          query = _item$split2[0],
2589          breakpoint = _item$split2[1];
2590
2591      return { query: query, breakpoint: breakpoint };
2592    });
2593  }
2594
2595  /**
2596   * @param {MediaQueryList} matchMedia
2597   * @param {dNodes} items
2598   */
2599  function getMediaHandler(matchMedia, items) {
2600    return function mediaHandler() {
2601      if (matchMedia.matches) {
2602        items.forEach(function (item) {
2603          moveTo(item);
2604        });
2605
2606        items.reverse();
2607      } else {
2608        items.forEach(function (item) {
2609          if (item.element.classList.contains(className)) {
2610            moveBack(item);
2611          }
2612        });
2613
2614        items.reverse();
2615      }
2616    };
2617  }
2618
2619  /**
2620   * @param {dNode} dNode
2621   */
2622  function moveTo(dNode) {
2623    var to = dNode.to,
2624        element = dNode.element,
2625        order = dNode.order;
2626
2627    dNode.index = getIndexInParent(dNode.element, dNode.element.parentElement);
2628    element.classList.add(className);
2629
2630    if (order === 'last' || order >= to.children.length) {
2631      to.append(element);
2632
2633      return;
2634    }
2635
2636    if (order === 'first') {
2637      to.prepend(element);
2638
2639      return;
2640    }
2641
2642    to.children[order].before(element);
2643  }
2644
2645  /**
2646   * @param {dNode} dNode
2647   */
2648  function moveBack(dNode) {
2649    var parent = dNode.parent,
2650        element = dNode.element,
2651        index = dNode.index;
2652
2653    element.classList.remove(className);
2654
2655    if (index >= 0 && parent.children[index]) {
2656      parent.children[index].before(element);
2657    } else {
2658      parent.append(element);
2659    }
2660  }
2661
2662  /**
2663   * @param {HTMLElement} element
2664   * @param {HTMLElement} parent
2665   */
2666  function getIndexInParent(element, parent) {
2667    return [].concat(_toConsumableArray(parent.children)).indexOf(element);
2668  }
2669
2670  /**
2671   * Функция сортировки массива по breakpoint и order
2672   * по возрастанию для type = min
2673   * по убыванию для type = max
2674   *
2675   * @param {dNode[]} items
2676   */
2677  function sortDNodes(items) {
2678    var isMin = type === 'min' ? 1 : 0;
2679
2680    return [].concat(_toConsumableArray(items)).sort(function (a, b) {
2681      if (a.breakpoint === b.breakpoint) {
2682        if (a.order === b.order) {
2683          return 0;
2684        }
2685
2686        if (a.order === 'first' || b.order === 'last') {
2687          return -1 * isMin;
2688        }
2689
2690        if (a.order === 'last' || b.order === 'first') {
2691          return 1 * isMin;
2692        }
2693
2694        return 0;
2695      }
2696
2697      return (a.breakpoint - b.breakpoint) * isMin;
2698    });
2699  }
2700
2701  function isNumber(value) {
2702    return !isNaN(value);
2703  }
2704}
2705
2706/***/ }),
2707
2708/***/ "./_HTML/src/js/_vendors/jquery.js":
2709/*!*****************************************!*\
2710  !*** ./_HTML/src/js/_vendors/jquery.js ***!
2711  \*****************************************/
2712/*! no static exports found */
2713/***/ (function(module, exports, __webpack_require__) {
2714
2715"use strict";
2716
2717
2718/**
2719 * Подключение библиотеки jQuery
2720 * @module
2721 */
2722
2723// ----------------------------------------
2724// Imports
2725// ----------------------------------------
2726
2727var _jquery = __webpack_require__(/*! jquery */ "jquery");
2728
2729var _jquery2 = _interopRequireDefault(_jquery);
2730
2731function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2732
2733// ----------------------------------------
2734// Public
2735// ----------------------------------------
2736
2737window.$ = window.jQuery = _jquery2.default;
2738
2739/* jQuery Equal heights plugin v. 1.0.7 by status201.nl */
2740!function (i) {
2741  i.fn.equalHeights = function (n) {
2742    var o,
2743        e = i.extend({}, { onResize: !0, onLoad: !0 }, n),
2744        t = {},
2745        h = [],
2746        s = 0,
2747        u = 0,
2748        a = i(this);return a.length < 2 ? this : (e.onResize && i(window).resize(function () {
2749      o && window.clearTimeout(o), o = window.setTimeout(function () {
2750        a.equalHeights({ onResize: !1, onLoad: !1 });
2751      }, 100);
2752    }), e.onLoad && i(window).on("load", function () {
2753      a.equalHeights({ onResize: !1, onLoad: !1 });
2754    }), a.each(function () {
2755      (h = i(this)).height("auto"), (s = h.height()) > 0 && (u = h.position().top, u in t ? s > t[u] ? (t[u] = s, i(a).filter(function () {
2756        return i(this).position().top == u;
2757      }).height(s)) : h.height(t[u]) : (t[u] = s, h.height(t[u])));
2758    }), this);
2759  };
2760}(jQuery);
2761
2762/***/ }),
2763
2764/***/ "./_HTML/src/js/entry.js":
2765/*!*******************************!*\
2766  !*** ./_HTML/src/js/entry.js ***!
2767  \*******************************/
2768/*! no static exports found */
2769/***/ (function(module, exports, __webpack_require__) {
2770
2771"use strict";
2772
2773
2774/**
2775 * @fileOverview Основной файл инициализации модулей
2776 */
2777
2778// ----------------------------------------
2779// Imports
2780// ----------------------------------------
2781
2782var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
2783
2784__webpack_require__(/*! #/_vendors/jquery */ "./_HTML/src/js/_vendors/jquery.js");
2785
2786__webpack_require__(/*! #/_polyfills/mdn */ "./_HTML/src/js/_polyfills/mdn.js");
2787
2788__webpack_require__(/*! #/_polyfills/promise-polyfill */ "./_HTML/src/js/_polyfills/promise-polyfill.js");
2789
2790__webpack_require__(/*! #/_modules/modernizr */ "./_HTML/src/js/_modules/modernizr/index.js");
2791
2792__webpack_require__(/*! custom-jquery-methods/fn/change-my-class */ "./node_modules/custom-jquery-methods/fn/change-my-class.js");
2793
2794var _browserizr = __webpack_require__(/*! browserizr */ "./node_modules/browserizr/index.js");
2795
2796var _browserizr2 = _interopRequireDefault(_browserizr);
2797
2798var _dynamicAdapt = __webpack_require__(/*! #/_vendors/dynamicAdapt.js */ "./_HTML/src/js/_vendors/dynamicAdapt.js");
2799
2800var _moduleLoader = __webpack_require__(/*! #/module-loader */ "./_HTML/src/js/module-loader.js");
2801
2802var _moduleLoader2 = _interopRequireDefault(_moduleLoader);
2803
2804var _wezomStandardTabs = __webpack_require__(/*! wezom-standard-tabs */ "./node_modules/wezom-standard-tabs/index.js");
2805
2806var _wezomStandardTabs2 = _interopRequireDefault(_wezomStandardTabs);
2807
2808var _cookieData = __webpack_require__(/*! #/_modules/cookie-data */ "./_HTML/src/js/_modules/cookie-data.js");
2809
2810var _cookieData2 = _interopRequireDefault(_cookieData);
2811
2812var _lazyload = __webpack_require__(/*! #/_modules/lazyload */ "./_HTML/src/js/_modules/lazyload/index.js");
2813
2814var _clickTriggerFor = __webpack_require__(/*! #/_modules/click-trigger-for */ "./_HTML/src/js/_modules/click-trigger-for/index.js");
2815
2816var _createTimer = __webpack_require__(/*! create-timer */ "./node_modules/create-timer/create-timer.js");
2817
2818var _createTimer2 = _interopRequireDefault(_createTimer);
2819
2820var _utmTracking = __webpack_require__(/*! #/_modules/utm-tracking */ "./_HTML/src/js/_modules/utm-tracking.js");
2821
2822var _utmTracking2 = _interopRequireDefault(_utmTracking);
2823
2824var _ecommerceTracking = __webpack_require__(/*! #/_modules/ecommerce-tracking */ "./_HTML/src/js/_modules/ecommerce-tracking.js");
2825
2826var _ecommerceTracking2 = _interopRequireDefault(_ecommerceTracking);
2827
2828var _mainMenu = __webpack_require__(/*! ./_modules/main-menu */ "./_HTML/src/js/_modules/main-menu.js");
2829
2830var _mainMenu2 = _interopRequireDefault(_mainMenu);
2831
2832var _catalogSearch = __webpack_require__(/*! ./_modules/catalog-search */ "./_HTML/src/js/_modules/catalog-search.js");
2833
2834var _catalogSearch2 = _interopRequireDefault(_catalogSearch);
2835
2836var _productsFilter = __webpack_require__(/*! ./_modules/products-filter */ "./_HTML/src/js/_modules/products-filter/index.js");
2837
2838var _productsFilter2 = _interopRequireDefault(_productsFilter);
2839
2840var _equalHeight = __webpack_require__(/*! #/_modules/equal-height */ "./_HTML/src/js/_modules/equal-height.js");
2841
2842var _equalHeight2 = _interopRequireDefault(_equalHeight);
2843
2844var _ballModal = __webpack_require__(/*! ./_modules/ball-modal */ "./_HTML/src/js/_modules/ball-modal/index.js");
2845
2846var _ballModal2 = _interopRequireDefault(_ballModal);
2847
2848var _jquery = __webpack_require__(/*! jquery */ "jquery");
2849
2850var _jquery2 = _interopRequireDefault(_jquery);
2851
2852__webpack_require__(/*! jquery-snowfall */ "./node_modules/jquery-snowfall/src/snowfall.jquery.js");
2853
2854function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2855
2856// ----------------------------------------
2857// Public
2858// ----------------------------------------
2859
2860try {
2861	(0, _dynamicAdapt.useDynamicAdapt)('min');
2862} catch (e) {}
2863// console.log(e);
2864
2865
2866// snow settings on the website
2867function throttle(callback, limit) {
2868	var wait = false;
2869	return function () {
2870		if (!wait) {
2871			// eslint-disable-next-line standard/no-callback-literal
2872			callback.apply(undefined, arguments);
2873			wait = true;
2874			setTimeout(function () {
2875				wait = false;
2876			}, limit);
2877		}
2878	};
2879}
2880
2881// check config for enable snowfall
2882if (typeof window.MainConfig !== 'undefined' && typeof window.MainConfig.snowfall !== 'undefined' && window.MainConfig.snowfall) {
2883	(0, _jquery2.default)(document).ready(function () {
2884		// $('body').snowfall({
2885		// 	deviceorientation: true,
2886		// 	round: true,
2887		// 	minSize: 3,
2888		// 	maxSize: 8,
2889		// 	maxSpeed: 3,
2890		// 	flakeCount: 75
2891		// });
2892
2893		var snowConfig = {
2894			deviceorientation: true,
2895			round: true,
2896			minSize: 3,
2897			maxSize: 8,
2898			maxSpeed: 3,
2899			flakeCount: 75
2900		};
2901
2902		(0, _jquery2.default)(document).snowfall(snowConfig);
2903
2904		var snowRefreshIntervalId = void 0;
2905
2906		(0, _jquery2.default)(window).on('mousemove', throttle(function () {
2907			var snowTimer = 0;
2908			clearInterval(snowRefreshIntervalId);
2909			(0, _jquery2.default)(document).snowfall('clear');
2910
2911			snowRefreshIntervalId = setInterval(function () {
2912				snowTimer += 1;
2913				if (snowTimer > 5) {
2914					clearInterval(snowRefreshIntervalId);
2915					(0, _jquery2.default)(document).snowfall(snowConfig);
2916				}
2917			}, 1000);
2918		}, 500));
2919	});
2920}
2921
2922window.jQuery(document).ready(function ($) {
2923	_moduleLoader2.default.init($(document));
2924	_cookieData2.default.askUsage(); // если нужно использовать куки
2925	_wezomStandardTabs2.default.init();
2926	// wsTabs.setActive(); // если нужно принудительно активировать табы
2927
2928	_utmTracking2.default.init();
2929
2930	(0, _mainMenu2.default)();
2931	(0, _catalogSearch2.default)();
2932	// product filter init
2933	new _productsFilter2.default($).init();
2934
2935	(0, _clickTriggerFor.clickTriggerFor)();
2936	_equalHeight2.default.init();
2937
2938	if (_browserizr2.default.detect().isEdge()) {
2939		var $header = $('.js-header-sticky');
2940		var $window = $(window);
2941		if ($header.length) {
2942			var cssClass = 'is-fixed';
2943			var previouslyAdded = $header.hasClass(cssClass);
2944			var timeout = (0, _createTimer2.default)(300);
2945			var _fixed = function _fixed() {
2946				var top = $window.scrollTop();
2947				var height = $header.height();
2948				previouslyAdded = $header.changeMyClass(top > height, previouslyAdded, cssClass);
2949			};
2950			$window.on('scroll', _fixed);
2951			$window.on('resize', function () {
2952				return timeout(_fixed);
2953			});
2954			$window.on('orientationchange', function () {
2955				return timeout(_fixed);
2956			});
2957			_fixed();
2958		}
2959	}
2960
2961	// это дефолтные настройки скролла, можешь их убирать/модифицировать, кароче делать что хочешь, калбеков нету понятное дело:D
2962	__webpack_require__.e(/*! import() */ 40).then(__webpack_require__.t.bind(null, /*! #/_vendors/scroll */ "./_HTML/src/js/_vendors/scroll.js", 7)).then(function (module) {
2963		module.default({
2964			frameRate: 150, // [Hz]
2965			animationTime: 700, // [ms]
2966			stepSize: 70, // [px]
2967			pulseAlgorithm: true,
2968			pulseScale: 3,
2969			pulseNormalize: 1,
2970			accelerationDelta: 50, // 50
2971			accelerationMax: 3, // 3
2972			keyboardSupport: true, // option
2973			arrowScroll: 50, // [px]
2974			fixedBackground: true,
2975			excluded: ''
2976		});
2977	});
2978
2979	(0, _lazyload.lazyload)(_lazyload.selector).then(function (observer) {
2980		return observer.observe();
2981	});
2982
2983	$('.js-previewer-trigger').on('click', function () {
2984		$(this).toggleClass('is-active');
2985		$('#js-previewer-container').toggleClass('is-active');
2986	});
2987
2988	// Добаляем и удаляем класс "is-full" если input или textarea заполнен
2989	document.addEventListener('blur', function (evt) {
2990		if (!evt.target.tagName) return false;
2991		var tagName = evt.target.tagName.toLowerCase();
2992		if (tagName !== 'input' && tagName !== 'textarea') return true;
2993		if (evt.target.type === 'radio') return true;
2994		evt.target.classList.toggle('is-full', Boolean(evt.target.value));
2995	}, true);
2996
2997	if ($('input').length) {
2998		$('input').each(function () {
2999			if ($(this).val().length) {
3000				$(this).addClass('is-full');
3001			}
3002		});
3003	}
3004
3005	// Добаляем класс "is-full" если select заполнен
3006	$('select').on('change', function () {
3007		$(this).toggleClass('is-full', Boolean($(this).val()));
3008	});
3009
3010	$(document).on('click', '.js-magnific-close', function () {
3011		$.magnificPopup.close();
3012	});
3013
3014	// eto adaptacia knopki na slidere xD
3015	function handler1(button, block) {
3016		button.css('left', block.offset().left + 'px');
3017	}
3018
3019	if ($('[data-bottom-block-helper]').length) {
3020		var $button = $('[data-bottom-block-helper]');
3021		var $block = $('[data-bottom-block-helper-container]').eq(0);
3022
3023		handler1($button, $block);
3024
3025		var moidebaunce = null;
3026
3027		$(window).resize(function () {
3028			clearTimeout(moidebaunce);
3029
3030			moidebaunce = setTimeout(function () {
3031				handler1($button, $block);
3032			}, 300);
3033		});
3034	}
3035
3036	if ($('[data-load-more]').length) {
3037		$('[data-load-more]').click(function () {
3038			var button = $(this);
3039			var url = button.data('url');
3040			var params = button.attr('data-params');
3041
3042			button.addClass('is-loading');
3043
3044			$.ajax({
3045				cache: false,
3046				method: 'post',
3047				url: url,
3048				data: JSON.parse(params)
3049			}).done(function (response) {
3050				button.removeClass('is-loading');
3051
3052				if (response.success) {
3053					var Nparams = response.params;
3054
3055					if (response.markup) {
3056						var $container = $('[data-load-more-container="' + button.attr('data-load-more') + '"]');
3057						var itemsBefore = $container.children().length;
3058						$container.append(response.markup);
3059
3060						$('html, body').animate({
3061							scrollTop: $container.find('li:nth-child(' + (itemsBefore + 1) + ')').offset().top - 64
3062						}, 1000);
3063						// lazyload(lazyloadSelector).then(observer => observer.observe());
3064					}
3065
3066					if (response.end) {
3067						button.remove();
3068					}
3069
3070					if (response.params) {
3071						if ((typeof Nparams === 'undefined' ? 'undefined' : _typeof(Nparams)) === 'object') {
3072							Nparams = JSON.stringify(Nparams);
3073						}
3074						button.attr('data-params', Nparams);
3075					}
3076
3077					// lazyload(lazyloadSelector).then(observer => observer.observe());
3078				}
3079			});
3080		});
3081	}
3082
3083	if ($('.post-card').length) {
3084		$(document).on('click', '.post-card', function (e) {
3085			window.location.href = $(e.currentTarget).find('a').attr('href');
3086		});
3087	}
3088
3089	if ($('.main-about .image-block').length) {
3090		$(document).on('click', '.main-about .image-block', function (e) {
3091			var href = $(e.currentTarget).find('a.image-block__cta').first().attr('href');
3092			if (href) {
3093				window.location.href = href;
3094			}
3095		});
3096	}
3097
3098	// Ublock
3099	if ($(window).width() >= 1025) {
3100		if (navigator.userAgent.match(/firefox/i)) {
3101			$('#firefixU').attr('transform', 'scale(.02,.02), translate(11 8)');
3102		} else if (/Edge\/\d./i.test(navigator.userAgent)) {
3103			$('#edgefixU').hide();
3104			$('#UimageFix').show();
3105		}
3106	} else {
3107		$('#edgefixU').hide();
3108		$('#UimageFix').show();
3109	}
3110
3111	var $perfectScrollbar = $('[data-perfect-scrollbar]');
3112	if ($perfectScrollbar.length && !window.Modernizr.mobiledevice && !window.Modernizr.cssscrollbar) {
3113		Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(37), __webpack_require__.e(39)]).then(__webpack_require__.t.bind(null, /*! #/_modules/perfect-scrollbar */ "./_HTML/src/js/_modules/perfect-scrollbar.js", 7)).then(function (module) {
3114			module.default($perfectScrollbar);
3115		});
3116	}
3117
3118	if (window.messageOnLoadNoty) {
3119		Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(2), __webpack_require__.e(4), __webpack_require__.e(3), __webpack_require__.e(35)]).then(__webpack_require__.t.bind(null, /*! #/_modules/jquery-validation/validate-get-response */ "./_HTML/src/js/_modules/jquery-validation/validate-get-response.js", 7)).then(function (module) {
3120			module.showMessageMagnific(null, false, window.messageOnLoadNoty.type, window.messageOnLoadNoty.title, window.messageOnLoadNoty.text);
3121		});
3122	}
3123
3124	if ($('[data-thank-print]').length) {
3125		$('body').addClass('is-printing');
3126
3127		$('[data-thank-print]').on('click', function () {
3128			window.print();
3129		});
3130	}
3131
3132	// Copyright on copy
3133	function initCopirightOnCopy() {
3134		var lang = document.getElementsByTagName('html')[0].getAttribute('lang');
3135		var helpText = '';
3136		switch (lang) {
3137			case 'ru':
3138				helpText = 'Подробнее по ссылке';
3139				break;
3140			case 'en':
3141				helpText = 'Read more at';
3142				break;
3143			case 'ua':
3144				helpText = 'Детальніше за посиланням';
3145				break;
3146			default:
3147				helpText = 'Детальніше за посиланням';
3148		}
3149		function a(event) {
3150			if (event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA') {
3151				return;
3152			}
3153			var a;var b = document.getElementsByTagName('body')[0];
3154			a = window.getSelection();
3155			var c = '<br /><br />' + helpText + ": <a href='" + document.location.href + "'>" + document.location.href + '</a>';var d = a + c;var e = document.createElement('div');
3156			e.style.position = 'absolute';
3157			e.style.left = '-99999px';
3158			b.appendChild(e);
3159			e.innerHTML = d;
3160			a.selectAllChildren(e);
3161			window.setTimeout(function () {
3162				b.removeChild(e);
3163			}, 0);
3164		}
3165		document.oncopy = a;
3166	}
3167	// Init Copyright on copy
3168	initCopirightOnCopy();
3169
3170	$(document).on('click', '.js-messangers-btn', function (e) {
3171		e.preventDefault();
3172		$(e.target).parent().toggleClass('is-active');
3173	});
3174
3175	// Spoilers
3176	$(document).on('click', '[data-spoiler] [data-spoiler-title]', function (e) {
3177		e.preventDefault();
3178		e.stopPropagation();
3179		var slideSpeed = 250;
3180		var $current = $(e.currentTarget);
3181		var $spoiler = $current.parents('[data-spoiler]');
3182
3183		function toggleSpoiler() {
3184			$current.toggleClass('active').next().stop().slideToggle(slideSpeed);
3185		}
3186
3187		function openSpoiler() {
3188			$current.addClass('active').next().stop().slideDown(slideSpeed);
3189		}
3190
3191		function closeNotCurrentSpoiler() {
3192			$spoiler.find('[data-spoiler-title]').not($current).removeClass('active').next().slideUp(slideSpeed);
3193		}
3194
3195		if ($(window).width() < 1024) {
3196			toggleSpoiler();
3197			return;
3198		}
3199
3200		switch ($spoiler.attr('data-spoiler')) {
3201			case 'one':
3202				closeNotCurrentSpoiler();
3203				openSpoiler();
3204				break;
3205			case 'one-close':
3206				if ($current.hasClass('active')) {
3207					toggleSpoiler();
3208					return;
3209				}
3210				closeNotCurrentSpoiler();
3211				openSpoiler();
3212				break;
3213			default:
3214				toggleSpoiler();
3215				break;
3216		}
3217	});
3218
3219	$('[data-spoiler] [data-spoiler-title].active').next().show();
3220
3221	// Show more text
3222	$(document).on('click', '[data-showmore]', function (e) {
3223		e.preventDefault();
3224		var $current = $(e.target);
3225		var $text = $current.parent();
3226		$text.toggleClass('is-visible');
3227		var locale = document.documentElement.lang.split('-').pop().toLocaleLowerCase() === 'uk' ? 'ua' : document.documentElement.lang.split('-').pop().toLocaleLowerCase();
3228		var dictionary = $current.data('dictionary')[locale];
3229		$current.text($text.hasClass('is-visible') ? dictionary.less : dictionary.more);
3230	});
3231
3232	// Show more comments
3233	$(document).on('click', '[data-comments-load]', function (e) {
3234		e.preventDefault();
3235		var $current = $(e.target);
3236		var $commentsBlock = $('[data-comments]');
3237		var $commentsList = $commentsBlock.find('[data-comments-list]');
3238		var catalogID = $commentsBlock.data('comments');
3239		var url = $current.data('comments-load');
3240		$current.attr('disabled', true);
3241		$commentsBlock.addClass('is-loading');
3242
3243		var data = {
3244			catalog_id: Number(catalogID),
3245			offset: $commentsList.children().length
3246		};
3247
3248		setTimeout(function () {
3249			$.ajax({
3250				cache: false,
3251				method: 'post',
3252				url: url,
3253				data: data
3254			}).done(function (response) {
3255				$commentsBlock.removeClass('is-loading');
3256				$current.attr('disabled', false);
3257
3258				if (response.success) {
3259					if (response.reviews_markup) {
3260						$commentsList.append(response.reviews_markup);
3261					}
3262					if (response.end) {
3263						$current.remove();
3264					}
3265				}
3266			});
3267		}, 300);
3268	});
3269
3270	// Lovers Modal init
3271	var loversModalRef = document.getElementById('loversModal');
3272	if (loversModalRef) {
3273		document.body.classList.add('blur');
3274		var loversModalCloseHandler = function loversModalCloseHandler() {
3275			_cookieData2.default.add('show-lovers-modal', false, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' });
3276			loversModalRef.style.opacity = 0;
3277			document.body.classList.remove('blur');
3278			setTimeout(function () {
3279				loversModalRef.remove();
3280			}, 2000);
3281		};
3282		var closeBtnRef = loversModalRef.querySelector('.js-close-lovers-modal');
3283		closeBtnRef.addEventListener('click', loversModalCloseHandler);
3284	}
3285
3286	// Easter Modal init
3287	var easterModalRef = document.getElementById('easterModal');
3288
3289	if (easterModalRef) {
3290		// document.body.classList.add('blur');
3291		var easterModalCloseHandler = function easterModalCloseHandler() {
3292			_cookieData2.default.add('show-easter-modal', false, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' });
3293			easterModalRef.style.opacity = 0;
3294			// document.body.classList.remove('blur');
3295			document.body.style.overflow = '';
3296			setTimeout(function () {
3297				easterModalRef.remove();
3298			}, 2000);
3299		};
3300		var _closeBtnRef = easterModalRef.querySelector('.js-close-easter-modal');
3301		_closeBtnRef.addEventListener('click', easterModalCloseHandler);
3302	}
3303
3304	// Ball Modal init
3305	var ballContainer = document.querySelector('.bf-ball-container');
3306	if (ballContainer && ballContainer.getAttribute('data-bfball') === 'active') {
3307		new _ballModal2.default();
3308	}
3309});
3310
3311// GA4
3312window.addEventListener('DOMContentLoaded', function () {
3313	// Product page
3314	var productPage = document.querySelector('[data-product-page]');
3315
3316	if (productPage) {
3317		// Отримання ідентифікатора товару з атрибута data-product-page
3318		var productId = parseInt(productPage.getAttribute('data-product-page'));
3319
3320		if (!productId) {
3321			return;
3322		}
3323
3324		_jquery2.default.ajax({
3325			cache: false,
3326			method: 'post',
3327			url: '/ua/ecommerce/ajax/product',
3328			data: {
3329				productId: productId
3330			}
3331		}).done(function (response) {
3332			if (response.success && response.data) {
3333				_ecommerceTracking2.default.trackViewItem(response.data);
3334			}
3335		});
3336	}
3337
3338	// Checkout page
3339	var checkoutPage = document.querySelector('[data-checkout-page]');
3340
3341	if (checkoutPage) {
3342		_jquery2.default.ajax({
3343			cache: false,
3344			method: 'post',
3345			url: '/ua/ecommerce/ajax/checkout'
3346		}).done(function (response) {
3347			if (response.success && response.data) {
3348				var _response$data = response.data,
3349				    amount = _response$data.amount,
3350				    items = _response$data.items;
3351
3352				_ecommerceTracking2.default.trackBeginCheckout(amount, items);
3353			}
3354		});
3355	}
3356
3357	// Thanks page
3358	var thankPage = document.querySelector('[data-thank-page]');
3359
3360	if (thankPage) {
3361		if (!window.trackPurchase) {
3362			return;
3363		}
3364
3365		// Отримання ідентифікатора замовлення з атрибута data-thank-page
3366		var orderId = parseInt(thankPage.getAttribute('data-thank-page'));
3367
3368		if (!orderId) {
3369			return;
3370		}
3371
3372		_jquery2.default.ajax({
3373			cache: false,
3374			method: 'post',
3375			url: '/ua/ecommerce/ajax/purchase',
3376			data: {
3377				orderId: orderId
3378			}
3379		}).done(function (response) {
3380			if (response.success && response.data) {
3381				_ecommerceTracking2.default.trackPurchase(response.data);
3382			}
3383		});
3384	}
3385
3386	// spoiler
3387	(0, _jquery2.default)(document).on('click', '.text-spoiler', function (e) {
3388		e.preventDefault();
3389		var currentAction = (0, _jquery2.default)(this).data('action');
3390		var spoilerBlock = (0, _jquery2.default)(this).parent().find('.text-spoiler__content');
3391		if (currentAction === 'open') {
3392			spoilerBlock.addClass('open');
3393		}
3394		if (currentAction === 'close') {
3395			spoilerBlock.removeClass('open');
3396		}
3397		(0, _jquery2.default)(this).parent().find('.text-spoiler').show();
3398		(0, _jquery2.default)(this).hide();
3399	});
3400});
3401
3402// ----------------------------------------
3403
3404/***/ }),
3405
3406/***/ "./_HTML/src/js/module-loader.js":
3407/*!***************************************!*\
3408  !*** ./_HTML/src/js/module-loader.js ***!
3409  \***************************************/
3410/*! no static exports found */
3411/***/ (function(module, exports, __webpack_require__) {
3412
3413"use strict";
3414
3415
3416/**
3417 * @module
3418 */
3419
3420// ----------------------------------------
3421// Imports
3422// ----------------------------------------
3423
3424Object.defineProperty(exports, "__esModule", {
3425	value: true
3426});
3427
3428var _wezomModuleLoader = __webpack_require__(/*! wezom-module-loader */ "./node_modules/wezom-module-loader/index.js");
3429
3430var _wezomModuleLoader2 = _interopRequireDefault(_wezomModuleLoader);
3431
3432function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3433
3434// ----------------------------------------
3435// Public
3436// ----------------------------------------
3437
3438var moduleLoader = new _wezomModuleLoader2.default({
3439	debug: false, // IS_DEVELOPMENT,
3440	importPromise: function importPromise(moduleName) {
3441		return __webpack_require__("./_HTML/src/js/_modules-loaders lazy recursive ^\\.\\/.*$")("./" + moduleName);
3442	},
3443	initSelector: '.js-init',
3444	initFunctionName: 'loaderInit',
3445	loadingClass: '_module-loading',
3446	loadedClass: '_module-loaded',
3447	list: {
3448		/* eslint-disable key-spacing */
3449		'jquery-validation--module-loader': 'form',
3450		'inputmask--module-loader': '[data-phonemask]',
3451		's2s--module-loader': '[data-s2s]',
3452		'magnific-popup--module-loader': '[data-mfp]',
3453		'wrap-media--module-loader': '[data-wrap-media]',
3454		'sliders--module-loader': '[data-slider]',
3455		'lozad--module-loader': ['[data-lozad]', 'picture'],
3456		'google-map--module-loader': '[data-google-map]',
3457		'scroll-window--module-loader': '[data-scroll-window]',
3458		'draggable-table--module-loader': '[data-draggable-table]',
3459		'accordion--module-loader': '[data-accordion]',
3460		'splash-no-18': '[data-no-18]',
3461		'timeline': '[data-timeline]',
3462		'cart--module-loader': '[data-cart-container]',
3463		'input-quantity--module-loader': '[data-quantity]',
3464		'review-read-more--module-loader': '.js-read-more',
3465		'catalog-filter--module-loader': '.js-filter-button',
3466		'animated-text': '[data-animated-text]',
3467		'beerbox--module-loader': '[data-beerbox]',
3468		'partner-form--module-loader': '[data-partner-form]',
3469		'infinity-scroll--module-loader': '.infinity-scroll',
3470		'password-toggle--module-loader': '.password-toggle'
3471	}
3472});
3473
3474// ----------------------------------------
3475// Exports
3476// ----------------------------------------
3477
3478exports.default = moduleLoader;
3479
3480/***/ }),
3481
vendor: 10,120 bytes, lines 3482-3775
3482/***/ "./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js":
3483/*!*****************************************************************!*\
3484  !*** ./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js ***!
3485  \*****************************************************************/
3486/*! exports provided: disableBodyScroll, clearAllBodyScrollLocks, enableBodyScroll */
3487/***/ (function(module, __webpack_exports__, __webpack_require__) {
3488
3489"use strict";
3490__webpack_require__.r(__webpack_exports__);
3491/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disableBodyScroll", function() { return disableBodyScroll; });
3492/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearAllBodyScrollLocks", function() { return clearAllBodyScrollLocks; });
3493/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableBodyScroll", function() { return enableBodyScroll; });
3494function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
3495
3496// Older browsers don't support event options, feature detect it.
3497
3498// Adopted and modified solution from Bohdan Didukh (2017)
3499// https://stackoverflow.com/questions/41594997/ios-10-safari-prevent-scrolling-behind-a-fixed-overlay-and-maintain-scroll-posi
3500
3501var hasPassiveEvents = false;
3502if (typeof window !== 'undefined') {
3503  var passiveTestOptions = {
3504    get passive() {
3505      hasPassiveEvents = true;
3506      return undefined;
3507    }
3508  };
3509  window.addEventListener('testPassive', null, passiveTestOptions);
3510  window.removeEventListener('testPassive', null, passiveTestOptions);
3511}
3512
3513var isIosDevice = typeof window !== 'undefined' && window.navigator && window.navigator.platform && (/iP(ad|hone|od)/.test(window.navigator.platform) || window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1);
3514
3515
3516var locks = [];
3517var documentListenerAdded = false;
3518var initialClientY = -1;
3519var previousBodyOverflowSetting = void 0;
3520var previousBodyPosition = void 0;
3521var previousBodyPaddingRight = void 0;
3522
3523// returns true if `el` should be allowed to receive touchmove events.
3524var allowTouchMove = function allowTouchMove(el) {
3525  return locks.some(function (lock) {
3526    if (lock.options.allowTouchMove && lock.options.allowTouchMove(el)) {
3527      return true;
3528    }
3529
3530    return false;
3531  });
3532};
3533
3534var preventDefault = function preventDefault(rawEvent) {
3535  var e = rawEvent || window.event;
3536
3537  // For the case whereby consumers adds a touchmove event listener to document.
3538  // Recall that we do document.addEventListener('touchmove', preventDefault, { passive: false })
3539  // in disableBodyScroll - so if we provide this opportunity to allowTouchMove, then
3540  // the touchmove event on document will break.
3541  if (allowTouchMove(e.target)) {
3542    return true;
3543  }
3544
3545  // Do not prevent if the event has more than one touch (usually meaning this is a multi touch gesture like pinch to zoom).
3546  if (e.touches.length > 1) return true;
3547
3548  if (e.preventDefault) e.preventDefault();
3549
3550  return false;
3551};
3552
3553var setOverflowHidden = function setOverflowHidden(options) {
3554  // If previousBodyPaddingRight is already set, don't set it again.
3555  if (previousBodyPaddingRight === undefined) {
3556    var _reserveScrollBarGap = !!options && options.reserveScrollBarGap === true;
3557    var scrollBarGap = window.innerWidth - document.documentElement.clientWidth;
3558
3559    if (_reserveScrollBarGap && scrollBarGap > 0) {
3560      var computedBodyPaddingRight = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'), 10);
3561      previousBodyPaddingRight = document.body.style.paddingRight;
3562      document.body.style.paddingRight = computedBodyPaddingRight + scrollBarGap + 'px';
3563    }
3564  }
3565
3566  // If previousBodyOverflowSetting is already set, don't set it again.
3567  if (previousBodyOverflowSetting === undefined) {
3568    previousBodyOverflowSetting = document.body.style.overflow;
3569    document.body.style.overflow = 'hidden';
3570  }
3571};
3572
3573var restoreOverflowSetting = function restoreOverflowSetting() {
3574  if (previousBodyPaddingRight !== undefined) {
3575    document.body.style.paddingRight = previousBodyPaddingRight;
3576
3577    // Restore previousBodyPaddingRight to undefined so setOverflowHidden knows it
3578    // can be set again.
3579    previousBodyPaddingRight = undefined;
3580  }
3581
3582  if (previousBodyOverflowSetting !== undefined) {
3583    document.body.style.overflow = previousBodyOverflowSetting;
3584
3585    // Restore previousBodyOverflowSetting to undefined
3586    // so setOverflowHidden knows it can be set again.
3587    previousBodyOverflowSetting = undefined;
3588  }
3589};
3590
3591var setPositionFixed = function setPositionFixed() {
3592  return window.requestAnimationFrame(function () {
3593    // If previousBodyPosition is already set, don't set it again.
3594    if (previousBodyPosition === undefined) {
3595      previousBodyPosition = {
3596        position: document.body.style.position,
3597        top: document.body.style.top,
3598        left: document.body.style.left
3599      };
3600
3601      // Update the dom inside an animation frame 
3602      var _window = window,
3603          scrollY = _window.scrollY,
3604          scrollX = _window.scrollX,
3605          innerHeight = _window.innerHeight;
3606
3607      document.body.style.position = 'fixed';
3608      document.body.style.top = -scrollY;
3609      document.body.style.left = -scrollX;
3610
3611      setTimeout(function () {
3612        return window.requestAnimationFrame(function () {
3613          // Attempt to check if the bottom bar appeared due to the position change
3614          var bottomBarHeight = innerHeight - window.innerHeight;
3615          if (bottomBarHeight && scrollY >= innerHeight) {
3616            // Move the content further up so that the bottom bar doesn't hide it
3617            document.body.style.top = -(scrollY + bottomBarHeight);
3618          }
3619        });
3620      }, 300);
3621    }
3622  });
3623};
3624
3625var restorePositionSetting = function restorePositionSetting() {
3626  if (previousBodyPosition !== undefined) {
3627    // Convert the position from "px" to Int
3628    var y = -parseInt(document.body.style.top, 10);
3629    var x = -parseInt(document.body.style.left, 10);
3630
3631    // Restore styles
3632    document.body.style.position = previousBodyPosition.position;
3633    document.body.style.top = previousBodyPosition.top;
3634    document.body.style.left = previousBodyPosition.left;
3635
3636    // Restore scroll
3637    window.scrollTo(x, y);
3638
3639    previousBodyPosition = undefined;
3640  }
3641};
3642
3643// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions
3644var isTargetElementTotallyScrolled = function isTargetElementTotallyScrolled(targetElement) {
3645  return targetElement ? targetElement.scrollHeight - targetElement.scrollTop <= targetElement.clientHeight : false;
3646};
3647
3648var handleScroll = function handleScroll(event, targetElement) {
3649  var clientY = event.targetTouches[0].clientY - initialClientY;
3650
3651  if (allowTouchMove(event.target)) {
3652    return false;
3653  }
3654
3655  if (targetElement && targetElement.scrollTop === 0 && clientY > 0) {
3656    // element is at the top of its scroll.
3657    return preventDefault(event);
3658  }
3659
3660  if (isTargetElementTotallyScrolled(targetElement) && clientY < 0) {
3661    // element is at the bottom of its scroll.
3662    return preventDefault(event);
3663  }
3664
3665  event.stopPropagation();
3666  return true;
3667};
3668
3669var disableBodyScroll = function disableBodyScroll(targetElement, options) {
3670  // targetElement must be provided
3671  if (!targetElement) {
3672    // eslint-disable-next-line no-console
3673    console.error('disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.');
3674    return;
3675  }
3676
3677  // disableBodyScroll must not have been called on this targetElement before
3678  if (locks.some(function (lock) {
3679    return lock.targetElement === targetElement;
3680  })) {
3681    return;
3682  }
3683
3684  var lock = {
3685    targetElement: targetElement,
3686    options: options || {}
3687  };
3688
3689  locks = [].concat(_toConsumableArray(locks), [lock]);
3690
3691  if (isIosDevice) {
3692    setPositionFixed();
3693  } else {
3694    setOverflowHidden(options);
3695  }
3696
3697  if (isIosDevice) {
3698    targetElement.ontouchstart = function (event) {
3699      if (event.targetTouches.length === 1) {
3700        // detect single touch.
3701        initialClientY = event.targetTouches[0].clientY;
3702      }
3703    };
3704    targetElement.ontouchmove = function (event) {
3705      if (event.targetTouches.length === 1) {
3706        // detect single touch.
3707        handleScroll(event, targetElement);
3708      }
3709    };
3710
3711    if (!documentListenerAdded) {
3712      document.addEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);
3713      documentListenerAdded = true;
3714    }
3715  }
3716};
3717
3718var clearAllBodyScrollLocks = function clearAllBodyScrollLocks() {
3719  if (isIosDevice) {
3720    // Clear all locks ontouchstart/ontouchmove handlers, and the references.
3721    locks.forEach(function (lock) {
3722      lock.targetElement.ontouchstart = null;
3723      lock.targetElement.ontouchmove = null;
3724    });
3725
3726    if (documentListenerAdded) {
3727      document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);
3728      documentListenerAdded = false;
3729    }
3730
3731    // Reset initial clientY.
3732    initialClientY = -1;
3733  }
3734
3735  if (isIosDevice) {
3736    restorePositionSetting();
3737  } else {
3738    restoreOverflowSetting();
3739  }
3740
3741  locks = [];
3742};
3743
3744var enableBodyScroll = function enableBodyScroll(targetElement) {
3745  if (!targetElement) {
3746    // eslint-disable-next-line no-console
3747    console.error('enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.');
3748    return;
3749  }
3750
3751  locks = locks.filter(function (lock) {
3752    return lock.targetElement !== targetElement;
3753  });
3754
3755  if (isIosDevice) {
3756    targetElement.ontouchstart = null;
3757    targetElement.ontouchmove = null;
3758
3759    if (documentListenerAdded && locks.length === 0) {
3760      document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);
3761      documentListenerAdded = false;
3762    }
3763  }
3764
3765  if (isIosDevice) {
3766    restorePositionSetting();
3767  } else {
3768    restoreOverflowSetting();
3769  }
3770};
3771
3772
3773
3774/***/ }),
3775
vendor: 11,515 bytes, lines 3776-4181
3776/***/ "./node_modules/browserizr/index.js":
3777/*!******************************************!*\
3778  !*** ./node_modules/browserizr/index.js ***!
3779  \******************************************/
3780/*! exports provided: default */
3781/***/ (function(module, __webpack_exports__, __webpack_require__) {
3782
3783"use strict";
3784__webpack_require__.r(__webpack_exports__);
3785
3786
3787/**
3788 * @module
3789 * @version 3.1.0
3790 * @author Oleg Dutchenko <[email protected]>
3791 * @see {@link https://wezomagency.github.io/browserizr/}
3792 * @licence MIT
3793 */
3794
3795/* eslint-disable no-return-assign */
3796
3797// ----------------------------------------
3798// Public
3799// ----------------------------------------
3800
3801const Browserizr = (function (window, navigator, screen) {
3802  let ua = navigator.userAgent
3803  let platform = navigator.platform
3804  let width = screen.width
3805  let height = screen.height
3806  if (width > height) {
3807    let temp = height
3808    height = width
3809    width = temp
3810  }
3811
3812  /**
3813   * @constructor
3814   */
3815  function Browserizr () {}
3816
3817  let isAndroid = null
3818  /** @return {boolean} */
3819  Browserizr.prototype.isAndroid = function () {
3820    return isAndroid === null ? (isAndroid = /android/i.test(ua)) : isAndroid
3821  }
3822
3823  let isAndroid3 = null
3824  /** @return {boolean} */
3825  Browserizr.prototype.isAndroid3 = function () {
3826    return isAndroid3 === null ? (isAndroid3 = /android 3/i.test(ua)) : isAndroid3
3827  }
3828
3829  let isAndroid4 = null
3830  /** @return {boolean} */
3831  Browserizr.prototype.isAndroid4 = function () {
3832    return isAndroid4 === null ? (isAndroid4 = /android 4/i.test(ua)) : isAndroid4
3833  }
3834
3835  let isAndroid5 = null
3836  /** @return {boolean} */
3837  Browserizr.prototype.isAndroid5 = function () {
3838    return isAndroid5 === null ? (isAndroid5 = /android 5/i.test(ua)) : isAndroid5
3839  }
3840
3841  let isAndroid6 = null
3842  /** @return {boolean} */
3843  Browserizr.prototype.isAndroid6 = function () {
3844    return isAndroid6 === null ? (isAndroid6 = /android 6/i.test(ua)) : isAndroid6
3845  }
3846
3847  let isAndroid7 = null
3848  /** @return {boolean} */
3849  Browserizr.prototype.isAndroid7 = function () {
3850    return isAndroid7 === null ? (isAndroid7 = /android 7/i.test(ua)) : isAndroid7
3851  }
3852
3853  let isAndroid8 = null
3854  /** @return {boolean} */
3855  Browserizr.prototype.isAndroid8 = function () {
3856    return isAndroid8 === null ? (isAndroid8 = /android 8/i.test(ua)) : isAndroid8
3857  }
3858
3859  let isMeizuPhone = null
3860  /** @return {boolean} */
3861  Browserizr.prototype.isMeizuPhone = function () {
3862    return isMeizuPhone === null ? (isMeizuPhone = /Android\s.*MZ(-)?/i.test(ua)) : isMeizuPhone
3863  }
3864
3865  let isMeizuNotePhone = null
3866  /** @return {boolean} */
3867  Browserizr.prototype.isMeizuNotePhone = function () {
3868    return isMeizuNotePhone === null ? (isMeizuNotePhone = /Android\s.*MZ(-)?.*\snote\s/i.test(ua)) : isMeizuNotePhone
3869  }
3870
3871  let isRedmiPhone = null
3872  /** @return {boolean} */
3873  Browserizr.prototype.isRedmiPhone = function () {
3874    return isRedmiPhone === null ? (isRedmiPhone = /Android\s.*Redmi\s/i.test(ua)) : isRedmiPhone
3875  }
3876
3877  let isRedmiNotePhone = null
3878  /** @return {boolean} */
3879  Browserizr.prototype.isRedmiNotePhone = function () {
3880    return isRedmiNotePhone === null ? (isRedmiNotePhone = /Android\s.*Redmi.*\sNote\s/i.test(ua)) : isRedmiNotePhone
3881  }
3882
3883  let isIPad = null
3884  /** @return {boolean} */
3885  Browserizr.prototype.isIPad = function () {
3886    return isIPad === null ? (isIPad = /iPad/i.test(ua)) : isIPad
3887  }
3888
3889  let isIPod = null
3890  /** @return {boolean} */
3891  Browserizr.prototype.isIPod = function () {
3892    return isIPod === null ? (isIPod = /iPod/i.test(ua)) : isIPod
3893  }
3894
3895  let isIPhone = null
3896  /** @return {boolean} */
3897  Browserizr.prototype.isIPhone = function () {
3898    return isIPhone === null ? (isIPhone = /iPhone/i.test(ua)) : isIPhone
3899  }
3900
3901  /** @return {boolean} */
3902  Browserizr.prototype.isIPhone4 = function () {
3903    return this.isIPhone() && width === 320 && height === 480
3904  }
3905
3906  /** @return {boolean} */
3907  Browserizr.prototype.isIPhone5 = function () {
3908    return this.isIPhone() && width === 320 && height === 568
3909  }
3910
3911  /** @return {boolean} */
3912  Browserizr.prototype.isIPhone678 = function () {
3913    return this.isIPhone() && width === 375 && height === 667
3914  }
3915
3916  /** @return {boolean} */
3917  Browserizr.prototype.isIPhone678plus = function () {
3918    return this.isIPhone() && width === 414 && height === 736
3919  }
3920
3921  /** @return {boolean} */
3922  Browserizr.prototype.isIPhoneX = function () {
3923    return this.isIPhone() && width === 375 && height === 812
3924  }
3925
3926  /** @return {boolean} */
3927  Browserizr.prototype.isIOS = function () {
3928    return this.isIPad() || this.isIPod() || this.isIPhone()
3929  }
3930
3931  let isMac = null
3932  /** @return {boolean} */
3933  Browserizr.prototype.isMac = function () {
3934    return isMac === null ? (isMac = /Mac/.test(platform)) : isMac
3935  }
3936
3937  /** @return {boolean} */
3938  Browserizr.prototype.isMacLike = function () {
3939    return this.isMac() || this.isIOS()
3940  }
3941
3942  let isBlackBerry = null
3943  /** @return {boolean} */
3944  Browserizr.prototype.isBlackBerry = function () {
3945    return isBlackBerry === null ? (isBlackBerry = /BlackBerry/i.test(ua)) : isBlackBerry
3946  }
3947
3948  let isBlackBerry10 = null
3949  /** @return {boolean} */
3950  Browserizr.prototype.isBlackBerry10 = function () {
3951    return isBlackBerry10 === null ? (isBlackBerry10 = /BB10;/i.test(ua)) : isBlackBerry10
3952  }
3953
3954  let isMoz = null
3955  /** @return {boolean} */
3956  Browserizr.prototype.isMoz = function () {
3957    return isMoz === null ? (isMoz = / Firefox\//i.test(ua)) : isMoz
3958  }
3959
3960  let isOpera = null
3961  /** @return {boolean} */
3962  Browserizr.prototype.isOpera = function () {
3963    return isOpera === null ? (isOpera = /Opera|OPR\//i.test(ua)) : isOpera
3964  }
3965
3966  let isSafari = null
3967  /** @return {boolean} */
3968  Browserizr.prototype.isSafari = function () {
3969    return isSafari === null ? (isSafari = (/ Safari\/\d/.test(ua) && !/ Chrome\/\d/.test(ua))) : isSafari
3970  }
3971
3972  let isChrome = null
3973  /** @return {boolean} */
3974  Browserizr.prototype.isChrome = function () {
3975    if (isChrome === null) {
3976      isChrome = (
3977        / Chrome\/\d/i.test(ua) &&
3978        !(
3979          this.isOpera() ||
3980          this.isSafari() ||
3981          this.isEdge() ||
3982          this.isEdgeIOS() ||
3983          this.isEdgeAndroid()
3984        )
3985      )
3986    }
3987    return isChrome
3988  }
3989
3990  let isIE = null
3991  /** @return {boolean} */
3992  Browserizr.prototype.isIE = function () {
3993    return isIE === null ? (isIE = /(MSIE|Trident)/i.test(ua)) : isIE
3994  }
3995
3996  let isIE8 = null
3997  /** @return {boolean} */
3998  Browserizr.prototype.isIE8 = function () {
3999    return isIE8 === null ? (isIE8 = /MSIE 8\.\d/i.test(ua)) : isIE8
4000  }
4001
4002  let isIE9 = null
4003  /** @return {boolean} */
4004  Browserizr.prototype.isIE9 = function () {
4005    return isIE9 === null ? (isIE9 = /MSIE 9\.\d/i.test(ua)) : isIE9
4006  }
4007
4008  let isIE10 = null
4009  /** @return {boolean} */
4010  Browserizr.prototype.isIE10 = function () {
4011    return isIE10 === null ? (isIE10 = /MSIE 10\.\d/i.test(ua)) : isIE10
4012  }
4013
4014  let isIE11 = null
4015  /** @return {boolean} */
4016  Browserizr.prototype.isIE11 = function () {
4017    return isIE11 === null ? (isIE11 = /Trident.*rv[ :]*11\./.test(ua)) : isIE11
4018  }
4019
4020  let isEdge = null
4021  /** @return {boolean} */
4022  Browserizr.prototype.isEdge = function () {
4023    return isEdge === null ? (isEdge = / Edge\/\d/i.test(ua)) : isEdge
4024  }
4025
4026  let isEdgeIOS = null
4027  /** @return {boolean} */
4028  Browserizr.prototype.isEdgeIOS = function () {
4029    return isEdgeIOS === null ? (isEdgeIOS = /\sEdgiOS\//i.test(ua)) : isEdgeIOS
4030  }
4031
4032  let isEdgeAndroid = null
4033  /** @return {boolean} */
4034  Browserizr.prototype.isEdgeAndroid = function () {
4035    return isEdgeAndroid === null ? (isEdgeAndroid = /\sEdgA\//i.test(ua)) : isEdgeAndroid
4036  }
4037
4038  let isWindowsPhone = null
4039  /** @return {boolean} */
4040  Browserizr.prototype.isWindowsPhone = function () {
4041    return isWindowsPhone === null ? (isWindowsPhone = /Windows\sPhone/i.test(ua)) : isWindowsPhone
4042  }
4043
4044  let isWindows = null
4045  /** @return {boolean} */
4046  Browserizr.prototype.isWindows = function () {
4047    return isWindows === null ? (isWindows = /^win/i.test(platform)) : isWindows
4048  }
4049
4050  let isWindowsXP = null
4051  /** @return {boolean} */
4052  Browserizr.prototype.isWindowsXP = function () {
4053    return isWindowsXP === null ? (isWindowsXP = /windows nt 5\.1/i.test(ua)) : isWindowsXP
4054  }
4055
4056  let isWindowsVista = null
4057  /** @return {boolean} */
4058  Browserizr.prototype.isWindowsVista = function () {
4059    return isWindowsVista === null ? (isWindowsVista = /windows nt 6\.0/i.test(ua)) : isWindowsVista
4060  }
4061
4062  let isWindows7 = null
4063  /** @return {boolean} */
4064  Browserizr.prototype.isWindows7 = function () {
4065    return isWindows7 === null ? (isWindows7 = /windows nt 6\.1/i.test(ua)) : isWindows7
4066  }
4067
4068  let isWindows8 = null
4069  /** @return {boolean} */
4070  Browserizr.prototype.isWindows8 = function () {
4071    return isWindows8 === null ? (isWindows8 = /windows nt 6\.[2|3]/i.test(ua)) : isWindows8
4072  }
4073
4074  let isWindows10 = null
4075  /** @return {boolean} */
4076  Browserizr.prototype.isWindows10 = function () {
4077    return isWindows10 === null ? (isWindows10 = /windows nt 10/i.test(ua)) : isWindows10
4078  }
4079
4080  let isLinux = null
4081  /** @return {boolean} */
4082  Browserizr.prototype.isLinux = function () {
4083    return isLinux === null ? (isLinux = /^linux/i.test(platform)) : isLinux
4084  }
4085
4086  /** @return {boolean} */
4087  Browserizr.prototype.isMobile = function () {
4088    return (
4089      this.isIOS() ||
4090      this.isAndroid() ||
4091      this.isEdgeIOS() ||
4092      this.isEdgeAndroid() ||
4093      this.isWindowsPhone() ||
4094      this.isBlackBerry() ||
4095      this.isBlackBerry10()
4096    )
4097  }
4098
4099  /** @return {boolean} */
4100  Browserizr.prototype.isDesktop = function () {
4101    return !this.isMobile()
4102  }
4103
4104  /**
4105   * @param {string[]} tests
4106   * @param {string} [classPrefix=""]
4107   * @param {boolean} [toString=true]
4108   * @return {string[]}
4109   */
4110  Browserizr.prototype.cssClasses = function (tests, classPrefix) {
4111    classPrefix = classPrefix || ''
4112    const classes = []
4113
4114    for (let i = 0; i < tests.length; i++) {
4115      const key = tests[i]
4116      const method = 'is' + key
4117      if (this[method] !== undefined) {
4118        const result = this[method]()
4119        const prefix = result ? prefixIs : prefixIsNot
4120        classes.push(classPrefix + prefix + key.toLowerCase())
4121      } else {
4122        console.warn('Browserizr has no the test "' + method + '()"')
4123      }
4124    }
4125
4126    return classes
4127  }
4128
4129  let instance = null
4130  let prefixIs = 'is-'
4131  let prefixIsNot = 'is-not-'
4132
4133  return {
4134    /**
4135     * @static
4136     * @public
4137     * @return {Browserizr}
4138     */
4139    detect () {
4140      return instance === null ? (instance = new Browserizr()) : instance
4141    },
4142
4143    /**
4144     * @type string
4145     */
4146    get prefixIs () {
4147      return prefixIs
4148    },
4149
4150    /**
4151     * @type string
4152     */
4153    set prefixIs (value) {
4154      prefixIs = value
4155    },
4156
4157    /**
4158     * @type string
4159     */
4160    get prefixIsNot () {
4161      return prefixIsNot
4162    },
4163
4164    /**
4165     * @type string
4166     */
4167    set prefixIsNot (value) {
4168      prefixIsNot = value
4169    }
4170  }
4171})(window, window.navigator, window.screen)
4172
4173// ----------------------------------------
4174// Exports
4175// ----------------------------------------
4176
4177/* harmony default export */ __webpack_exports__["default"] = (Browserizr);
4178
4179
4180/***/ }),
4181
vendor: 1,667 bytes, lines 4182-4259
4182/***/ "./node_modules/create-timer/create-timer.js":
4183/*!***************************************************!*\
4184  !*** ./node_modules/create-timer/create-timer.js ***!
4185  \***************************************************/
4186/*! exports provided: default */
4187/***/ (function(module, __webpack_exports__, __webpack_require__) {
4188
4189"use strict";
4190__webpack_require__.r(__webpack_exports__);
4191
4192
4193/**
4194 * Creating timers with internal closure
4195 * @module
4196 * @example
4197import createTimer from 'create-timer';
4198
4199const timer = createTimer(500);
4200$(window).on('resize', function () {
4201    timer(() => {
4202        console.log('done');
4203    });
4204});
4205
4206timer(() => {
4207    console.log('just test');
4208}, 300);
4209
4210// ...clear timer if need
4211timer.clear();
4212 */
4213
4214// ----------------------------------------
4215// Public
4216// ----------------------------------------
4217
4218/**
4219 * @typedef {Function} timer
4220 */
4221
4222/**
4223 * @param {number} [defaultDelay=300]
4224 * @return {timer}
4225 */
4226function createTimer (defaultDelay = 300) {
4227	let timeoutId = null;
4228
4229	/**
4230	 * @type {timer}
4231	 * @param {Function} fn
4232	 * @param {number} [delay=defaultDelay]
4233	 * @returns {number} timeoutId
4234	 */
4235	function timer (fn, delay = defaultDelay) {
4236		window.clearTimeout(timeoutId);
4237		timeoutId = window.setTimeout(fn, delay);
4238		return timeoutId;
4239	}
4240
4241	/**
4242	 * clear current timeout
4243	 * @methodOf timer
4244	 * @returns void
4245	 */
4246	timer.clear = () => window.clearTimeout(timeoutId);
4247
4248	return timer;
4249}
4250
4251// ----------------------------------------
4252// Exports
4253// ----------------------------------------
4254
4255/* harmony default export */ __webpack_exports__["default"] = (createTimer);
4256
4257
4258/***/ }),
4259
vendor: 1,676 bytes, lines 4260-4311
4260/***/ "./node_modules/custom-jquery-methods/fn/change-my-class.js":
4261/*!******************************************************************!*\
4262  !*** ./node_modules/custom-jquery-methods/fn/change-my-class.js ***!
4263  \******************************************************************/
4264/*! no static exports found */
4265/***/ (function(module, exports, __webpack_require__) {
4266
4267"use strict";
4268
4269
4270(function () {
4271	'use strict';
4272	/**
4273  * Add className if previously was removed.
4274  * Remove className if previously was added
4275  *
4276  * @example
4277  * function showSection ($section, $frontier) {
4278  *     const $window = $(window);
4279  *     let previouslyAdded = $section.hasClass('show'); // <--
4280  *     $window.on('scroll', () => {
4281  *         const top = $window.scrollTop();
4282  *         const height = $frontier.offset().top + $frontier.outerHeight();
4283  *         previouslyAdded = $section.changeMyClass(top > height, previouslyAdded, 'show');  // <--
4284  *     });
4285  * }
4286  *
4287  * @name changeMyClass
4288  * @this jQuery
4289  * @param {boolean} needToAdd
4290  * @param {boolean} previouslyAdded
4291  * @param {string|string[]|function} className
4292  * @param {function} [onChange]
4293  * @returns {boolean} className was added or not
4294  * @sourceCode
4295  */
4296
4297	jQuery.fn.changeMyClass = function (needToAdd, previouslyAdded, className, onChange) {
4298		var changeClass = needToAdd ? previouslyAdded ? false : 'addClass' : previouslyAdded ? 'removeClass' : false;
4299		if (changeClass) {
4300			previouslyAdded = changeClass === 'addClass';
4301			this[changeClass](className);
4302			if (typeof onChange === 'function') {
4303				onChange(previouslyAdded);
4304			}
4305		}
4306		return previouslyAdded;
4307	};
4308})();
4309
4310/***/ }),
4311
vendor: 3,169 bytes, lines 4312-4396
4312/***/ "./node_modules/custom-jquery-methods/fn/get-my-elements.js":
4313/*!******************************************************************!*\
4314  !*** ./node_modules/custom-jquery-methods/fn/get-my-elements.js ***!
4315  \******************************************************************/
4316/*! no static exports found */
4317/***/ (function(module, exports, __webpack_require__) {
4318
4319"use strict";
4320
4321
4322(function () {
4323	'use strict';
4324	/**
4325  * Search on the page or retrieve from the date of the desired item.
4326  *
4327  * First, look at the date object on a certain property.
4328  * If it is empty - look for the element on the specified selector in the given direction.
4329  * When found, write it in the date object to
4330  * at subsequent calls - we get from the date, faster and without searching.
4331  *
4332  * ___!!! If called element more then one,___
4333  * ___then the method is performed only for the first___
4334  *
4335  * @example <caption>Find / retrieve nested items</caption>
4336  * let $els = $('.wrapper').getMyElements('$myEls', '.els-selector', 'find');
4337  *
4338  * @example <caption>Find / retrieve nested items only in context block</caption>
4339  * let $context = $('.demo');
4340  * let $els = $('.wrapper').getMyElements('$myEls', '.els-selector', $context);
4341  *
4342  * @example <caption>Finding / getting the parent element</caption>
4343  * let $wrapper = $('.els').getMyElements('$myWrapper', '.wrapper-selector', 'closest');
4344  *
4345  * @example <caption>Search / retrieve similar items except for the current one</caption>
4346  * let $sameEls = $('.els').getMyElements('$mySameEls', '.els', 'document', true);
4347  *
4348  * @param {string} dataKey - the property key from the data object of the element
4349  * @param {JQuery.Selector} selector - search selector
4350  * @param {string|JQuery} [direction="document"] - direction where to look for - `[closest, parent, children, find, prev, next, siblings]`, or can be jQuery element for find selector inside
4351  * @param {boolean} [notSelf] - ignore the current element, when searching for elements, for example in `document` using the same selector as the current element
4352  *
4353  * @name getMyElements
4354  * @param {string} dataKey
4355  * @param {string} selector
4356  * @param {string|jQuery} [direction='document']
4357  * @param {boolean} [direction='document']
4358  * @return {jQuery}
4359  * @sourceCode
4360  */
4361
4362	jQuery.fn.getMyElements = function (dataKey, selector) {
4363		var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'document';
4364		var notSelf = arguments[3];
4365
4366		/** @type {jQuery} */
4367		var $element = this.eq(0);
4368		var keyIsSelector = typeof dataKey === 'string';
4369		var $target = keyIsSelector ? $element.data(dataKey) : null;
4370
4371		if (!$target) {
4372			if (direction === 'document' || direction && direction.jquery) {
4373				if (direction.jquery) {
4374					$target = direction.find(selector);
4375				} else {
4376					$target = jQuery(selector);
4377				}
4378				if ($target.length && notSelf) {
4379					$target = $target.not($element);
4380				}
4381			} else {
4382				$target = $element[direction](selector);
4383			}
4384			$element.data(dataKey, $target);
4385		}
4386
4387		if (!$target.length) {
4388			$element.data(dataKey, null);
4389		}
4390
4391		return $target;
4392	};
4393})();
4394
4395/***/ }),
4396
vendor: 7,819 bytes, lines 4397-4751
4397/***/ "./node_modules/es6-promise-polyfill/promise.js":
4398/*!******************************************************!*\
4399  !*** ./node_modules/es6-promise-polyfill/promise.js ***!
4400  \******************************************************/
4401/*! no static exports found */
4402/***/ (function(module, exports, __webpack_require__) {
4403
4404/* WEBPACK VAR INJECTION */(function(global, setImmediate) {var __WEBPACK_AMD_DEFINE_RESULT__;(function(global){
4405
4406//
4407// Check for native Promise and it has correct interface
4408//
4409
4410var NativePromise = global['Promise'];
4411var nativePromiseSupported =
4412  NativePromise &&
4413  // Some of these methods are missing from
4414  // Firefox/Chrome experimental implementations
4415  'resolve' in NativePromise &&
4416  'reject' in NativePromise &&
4417  'all' in NativePromise &&
4418  'race' in NativePromise &&
4419  // Older version of the spec had a resolver object
4420  // as the arg rather than a function
4421  (function(){
4422    var resolve;
4423    new NativePromise(function(r){ resolve = r; });
4424    return typeof resolve === 'function';
4425  })();
4426
4427
4428//
4429// export if necessary
4430//
4431
4432if ( true && exports)
4433{
4434  // node.js
4435  exports.Promise = nativePromiseSupported ? NativePromise : Promise;
4436  exports.Polyfill = Promise;
4437}
4438else
4439{
4440  // AMD
4441  if (true)
4442  {
4443    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){
4444      return nativePromiseSupported ? NativePromise : Promise;
4445    }).call(exports, __webpack_require__, exports, module),
4446				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
4447  }
4448  else
4449  {}
4450}
4451
4452
4453//
4454// Polyfill
4455//
4456
4457var PENDING = 'pending';
4458var SEALED = 'sealed';
4459var FULFILLED = 'fulfilled';
4460var REJECTED = 'rejected';
4461var NOOP = function(){};
4462
4463function isArray(value) {
4464  return Object.prototype.toString.call(value) === '[object Array]';
4465}
4466
4467// async calls
4468var asyncSetTimer = typeof setImmediate !== 'undefined' ? setImmediate : setTimeout;
4469var asyncQueue = [];
4470var asyncTimer;
4471
4472function asyncFlush(){
4473  // run promise callbacks
4474  for (var i = 0; i < asyncQueue.length; i++)
4475    asyncQueue[i][0](asyncQueue[i][1]);
4476
4477  // reset async asyncQueue
4478  asyncQueue = [];
4479  asyncTimer = false;
4480}
4481
4482function asyncCall(callback, arg){
4483  asyncQueue.push([callback, arg]);
4484
4485  if (!asyncTimer)
4486  {
4487    asyncTimer = true;
4488    asyncSetTimer(asyncFlush, 0);
4489  }
4490}
4491
4492
4493function invokeResolver(resolver, promise) {
4494  function resolvePromise(value) {
4495    resolve(promise, value);
4496  }
4497
4498  function rejectPromise(reason) {
4499    reject(promise, reason);
4500  }
4501
4502  try {
4503    resolver(resolvePromise, rejectPromise);
4504  } catch(e) {
4505    rejectPromise(e);
4506  }
4507}
4508
4509function invokeCallback(subscriber){
4510  var owner = subscriber.owner;
4511  var settled = owner.state_;
4512  var value = owner.data_;  
4513  var callback = subscriber[settled];
4514  var promise = subscriber.then;
4515
4516  if (typeof callback === 'function')
4517  {
4518    settled = FULFILLED;
4519    try {
4520      value = callback(value);
4521    } catch(e) {
4522      reject(promise, e);
4523    }
4524  }
4525
4526  if (!handleThenable(promise, value))
4527  {
4528    if (settled === FULFILLED)
4529      resolve(promise, value);
4530
4531    if (settled === REJECTED)
4532      reject(promise, value);
4533  }
4534}
4535
4536function handleThenable(promise, value) {
4537  var resolved;
4538
4539  try {
4540    if (promise === value)
4541      throw new TypeError('A promises callback cannot return that same promise.');
4542
4543    if (value && (typeof value === 'function' || typeof value === 'object'))
4544    {
4545      var then = value.then;  // then should be retrived only once
4546
4547      if (typeof then === 'function')
4548      {
4549        then.call(value, function(val){
4550          if (!resolved)
4551          {
4552            resolved = true;
4553
4554            if (value !== val)
4555              resolve(promise, val);
4556            else
4557              fulfill(promise, val);
4558          }
4559        }, function(reason){
4560          if (!resolved)
4561          {
4562            resolved = true;
4563
4564            reject(promise, reason);
4565          }
4566        });
4567
4568        return true;
4569      }
4570    }
4571  } catch (e) {
4572    if (!resolved)
4573      reject(promise, e);
4574
4575    return true;
4576  }
4577
4578  return false;
4579}
4580
4581function resolve(promise, value){
4582  if (promise === value || !handleThenable(promise, value))
4583    fulfill(promise, value);
4584}
4585
4586function fulfill(promise, value){
4587  if (promise.state_ === PENDING)
4588  {
4589    promise.state_ = SEALED;
4590    promise.data_ = value;
4591
4592    asyncCall(publishFulfillment, promise);
4593  }
4594}
4595
4596function reject(promise, reason){
4597  if (promise.state_ === PENDING)
4598  {
4599    promise.state_ = SEALED;
4600    promise.data_ = reason;
4601
4602    asyncCall(publishRejection, promise);
4603  }
4604}
4605
4606function publish(promise) {
4607  var callbacks = promise.then_;
4608  promise.then_ = undefined;
4609
4610  for (var i = 0; i < callbacks.length; i++) {
4611    invokeCallback(callbacks[i]);
4612  }
4613}
4614
4615function publishFulfillment(promise){
4616  promise.state_ = FULFILLED;
4617  publish(promise);
4618}
4619
4620function publishRejection(promise){
4621  promise.state_ = REJECTED;
4622  publish(promise);
4623}
4624
4625/**
4626* @class
4627*/
4628function Promise(resolver){
4629  if (typeof resolver !== 'function')
4630    throw new TypeError('Promise constructor takes a function argument');
4631
4632  if (this instanceof Promise === false)
4633    throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
4634
4635  this.then_ = [];
4636
4637  invokeResolver(resolver, this);
4638}
4639
4640Promise.prototype = {
4641  constructor: Promise,
4642
4643  state_: PENDING,
4644  then_: null,
4645  data_: undefined,
4646
4647  then: function(onFulfillment, onRejection){
4648    var subscriber = {
4649      owner: this,
4650      then: new this.constructor(NOOP),
4651      fulfilled: onFulfillment,
4652      rejected: onRejection
4653    };
4654
4655    if (this.state_ === FULFILLED || this.state_ === REJECTED)
4656    {
4657      // already resolved, call callback async
4658      asyncCall(invokeCallback, subscriber);
4659    }
4660    else
4661    {
4662      // subscribe
4663      this.then_.push(subscriber);
4664    }
4665
4666    return subscriber.then;
4667  },
4668
4669  'catch': function(onRejection) {
4670    return this.then(null, onRejection);
4671  }
4672};
4673
4674Promise.all = function(promises){
4675  var Class = this;
4676
4677  if (!isArray(promises))
4678    throw new TypeError('You must pass an array to Promise.all().');
4679
4680  return new Class(function(resolve, reject){
4681    var results = [];
4682    var remaining = 0;
4683
4684    function resolver(index){
4685      remaining++;
4686      return function(value){
4687        results[index] = value;
4688        if (!--remaining)
4689          resolve(results);
4690      };
4691    }
4692
4693    for (var i = 0, promise; i < promises.length; i++)
4694    {
4695      promise = promises[i];
4696
4697      if (promise && typeof promise.then === 'function')
4698        promise.then(resolver(i), reject);
4699      else
4700        results[i] = promise;
4701    }
4702
4703    if (!remaining)
4704      resolve(results);
4705  });
4706};
4707
4708Promise.race = function(promises){
4709  var Class = this;
4710
4711  if (!isArray(promises))
4712    throw new TypeError('You must pass an array to Promise.race().');
4713
4714  return new Class(function(resolve, reject) {
4715    for (var i = 0, promise; i < promises.length; i++)
4716    {
4717      promise = promises[i];
4718
4719      if (promise && typeof promise.then === 'function')
4720        promise.then(resolve, reject);
4721      else
4722        resolve(promise);
4723    }
4724  });
4725};
4726
4727Promise.resolve = function(value){
4728  var Class = this;
4729
4730  if (value && typeof value === 'object' && value.constructor === Class)
4731    return value;
4732
4733  return new Class(function(resolve){
4734    resolve(value);
4735  });
4736};
4737
4738Promise.reject = function(reason){
4739  var Class = this;
4740
4741  return new Class(function(resolve, reject){
4742    reject(reason);
4743  });
4744};
4745
4746})(typeof window != 'undefined' ? window : typeof global != 'undefined' ? global : typeof self != 'undefined' ? self : this);
4747
4748/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate))
4749
4750/***/ }),
4751
vendor: 16,563 bytes, lines 4752-5138
4752/***/ "./node_modules/jquery-snowfall/src/snowfall.jquery.js":
4753/*!*************************************************************!*\
4754  !*** ./node_modules/jquery-snowfall/src/snowfall.jquery.js ***!
4755  \*************************************************************/
4756/*! no static exports found */
4757/***/ (function(module, exports) {
4758
4759/*  Snowfall jquery plugin
4760
4761    ====================================================================
4762    LICENSE
4763    ====================================================================
4764    Licensed under the Apache License, Version 2.0 (the "License");
4765    you may not use this file except in compliance with the License.
4766    You may obtain a copy of the License at
4767
4768       http://www.apache.org/licenses/LICENSE-2.0
4769
4770       Unless required by applicable law or agreed to in writing, software
4771       distributed under the License is distributed on an "AS IS" BASIS,
4772       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4773       See the License for the specific language governing permissions and
4774       limitations under the License.
4775    ====================================================================
4776
4777    Version 1.51 Dec 2nd 2012
4778    // fixed bug where snow collection didn't happen if a valid doctype was declared.
4779
4780    Version 1.5 Oct 5th 2011
4781    Added collecting snow! Uses the canvas element to collect snow. In order to initialize snow collection use the following
4782
4783    $(document).snowfall({collection : 'element'});
4784
4785    element = any valid jquery selector.
4786
4787    The plugin then creates a canvas above every element that matches the selector, and collects the snow. If there are a varrying amount of elements the
4788    flakes get assigned a random one on start they will collide.
4789
4790    Version 1.4 Dec 8th 2010
4791    Fixed issues (I hope) with scroll bars flickering due to snow going over the edge of the screen.
4792    Added round snowflakes via css, will not work for any version of IE. - Thanks to Luke Barker of http://www.infinite-eye.com/
4793    Added shadows as an option via css again will not work with IE. The idea behind shadows, is to show flakes on lighter colored web sites - Thanks Yutt
4794
4795    Version 1.3.1 Nov 25th 2010
4796    Updated script that caused flakes not to show at all if plugin was initialized with no options, also added the fixes that Han Bongers suggested
4797
4798    Developed by Jason Brown for any bugs or questions email me at loktar69@hotmail
4799    info on the plugin is located on Somethinghitme.com
4800
4801    values for snow options are
4802
4803    flakeCount,
4804    flakeColor,
4805    flakeIndex,
4806    minSize,
4807    maxSize,
4808    minSpeed,
4809    maxSpeed,
4810    round,      true or false, makes the snowflakes rounded if the browser supports it.
4811    shadow      true or false, gives the snowflakes a shadow if the browser supports it.
4812
4813    Example Usage :
4814    $(document).snowfall({flakeCount : 100, maxSpeed : 10});
4815
4816    -or-
4817
4818    $('#element').snowfall({flakeCount : 800, maxSpeed : 5, maxSize : 5});
4819
4820    -or with defaults-
4821
4822    $(document).snowfall();
4823
4824    - To clear -
4825    $('#element').snowfall('clear');
4826*/
4827
4828// requestAnimationFrame polyfill from https://github.com/darius/requestAnimationFrame
4829if (!Date.now)
4830    Date.now = function() { return new Date().getTime(); };
4831
4832(function() {
4833    'use strict';
4834
4835    var vendors = ['webkit', 'moz'];
4836    for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
4837        var vp = vendors[i];
4838        window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
4839        window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
4840                                   || window[vp+'CancelRequestAnimationFrame']);
4841    }
4842    if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
4843        || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
4844        var lastTime = 0;
4845        window.requestAnimationFrame = function(callback) {
4846            var now = Date.now();
4847            var nextTime = Math.max(lastTime + 16, now);
4848            return setTimeout(function() { callback(lastTime = nextTime); },
4849                              nextTime - now);
4850        };
4851        window.cancelAnimationFrame = clearTimeout;
4852    }
4853}());
4854
4855(function($){
4856    $.snowfall = function(element, options){
4857        var flakes = [],
4858            defaults = {
4859                flakeCount : 35,
4860                flakeColor : '#ffffff',
4861				flakePosition: 'absolute',
4862                flakeIndex: 999999,
4863                minSize : 1,
4864                maxSize : 2,
4865                minSpeed : 1,
4866                maxSpeed : 5,
4867                round : false,
4868                shadow : false,
4869                collection : false,
4870                collectionHeight : 40,
4871                deviceorientation : false
4872            },
4873            options = $.extend(defaults, options),
4874            random = function random(min, max){
4875                return Math.round(min + Math.random()*(max-min));
4876            };
4877
4878            $(element).data("snowfall", this);
4879
4880            // Snow flake object
4881            function Flake(_x, _y, _size, _speed){
4882                // Flake properties
4883                this.x  = _x;
4884                this.y  = _y;
4885                this.size = _size;
4886                this.speed = _speed;
4887                this.step = 0;
4888                this.stepSize = random(1,10) / 100;
4889
4890                if(options.collection){
4891                    this.target = canvasCollection[random(0,canvasCollection.length-1)];
4892                }
4893
4894                var flakeMarkup = null;
4895
4896                if(options.image){
4897                    flakeMarkup = document.createElement("img");
4898                    flakeMarkup.src = options.image;
4899                }else{
4900                    flakeMarkup = document.createElement("div");
4901                    $(flakeMarkup).css({'background' : options.flakeColor});
4902                }
4903
4904                $(flakeMarkup).attr({
4905                    'class': 'snowfall-flakes',
4906                }).css({
4907                    'width' : this.size,
4908                    'height' : this.size,
4909                    'position' : options.flakePosition,
4910                    'top' : this.y,
4911                    'left' : this.x,
4912                    'fontSize' : 0,
4913                    'zIndex' : options.flakeIndex
4914                });
4915
4916                if($(element).get(0).tagName === $(document).get(0).tagName){
4917                    $('body').append($(flakeMarkup));
4918                    element = $('body');
4919                }else{
4920                    $(element).append($(flakeMarkup));
4921                }
4922
4923                this.element = flakeMarkup;
4924
4925                // Update function, used to update the snow flakes, and checks current snowflake against bounds
4926                this.update = function(){
4927                    this.y += this.speed;
4928
4929                    if(this.y > (elHeight) - (this.size  + 6)){
4930                        this.reset();
4931                    }
4932
4933                    this.element.style.top = this.y + 'px';
4934                    this.element.style.left = this.x + 'px';
4935
4936                    this.step += this.stepSize;
4937
4938                    if (doRatio === false) {
4939                        this.x += Math.cos(this.step);
4940                    } else {
4941                        this.x += (doRatio + Math.cos(this.step));
4942                    }
4943
4944                    // Pileup check
4945                    if(options.collection){
4946                        if(this.x > this.target.x && this.x < this.target.width + this.target.x && this.y > this.target.y && this.y < this.target.height + this.target.y){
4947                            var ctx = this.target.element.getContext("2d"),
4948                                curX = this.x - this.target.x,
4949                                curY = this.y - this.target.y,
4950                                colData = this.target.colData;
4951
4952                                if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] !== undefined || curY+this.speed+this.size > this.target.height){
4953                                    if(curY+this.speed+this.size > this.target.height){
4954                                        while(curY+this.speed+this.size > this.target.height && this.speed > 0){
4955                                            this.speed *= .5;
4956                                        }
4957
4958                                        ctx.fillStyle = defaults.flakeColor;
4959
4960                                        if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] == undefined){
4961                                            colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] = 1;
4962                                            ctx.fillRect(curX, (curY)+this.speed+this.size, this.size, this.size);
4963                                        }else{
4964                                            colData[parseInt(curX)][parseInt(curY+this.speed)] = 1;
4965                                            ctx.fillRect(curX, curY+this.speed, this.size, this.size);
4966                                        }
4967                                        this.reset();
4968                                    }else{
4969                                        // flow to the sides
4970                                        this.speed = 1;
4971                                        this.stepSize = 0;
4972
4973                                        if(parseInt(curX)+1 < this.target.width && colData[parseInt(curX)+1][parseInt(curY)+1] == undefined ){
4974                                            // go left
4975                                            this.x++;
4976                                        }else if(parseInt(curX)-1 > 0 && colData[parseInt(curX)-1][parseInt(curY)+1] == undefined ){
4977                                            // go right
4978                                            this.x--;
4979                                        }else{
4980                                            //stop
4981                                            ctx.fillStyle = defaults.flakeColor;
4982                                            ctx.fillRect(curX, curY, this.size, this.size);
4983                                            colData[parseInt(curX)][parseInt(curY)] = 1;
4984                                            this.reset();
4985                                        }
4986                                    }
4987                                }
4988                        }
4989                    }
4990
4991                    if(this.x + this.size > (elWidth) - widthOffset || this.x < widthOffset){
4992                        this.reset();
4993                    }
4994                }
4995
4996                // Resets the snowflake once it reaches one of the bounds set
4997                this.reset = function(){
4998                    this.y = 0;
4999                    this.x = random(widthOffset, elWidth - widthOffset);
5000                    this.stepSize = random(1,10) / 100;
5001                    this.size = random((options.minSize * 100), (options.maxSize * 100)) / 100;
5002                    this.element.style.width = this.size + 'px';
5003                    this.element.style.height = this.size + 'px';
5004                    this.speed = random(options.minSpeed, options.maxSpeed);
5005                }
5006            }
5007
5008            // local vars
5009            var i = 0,
5010                elHeight = $(element).height(),
5011                elWidth = $(element).width(),
5012                widthOffset = 0,
5013                snowTimeout = 0;
5014
5015            // Collection Piece ******************************
5016            if(options.collection !== false){
5017                var testElem = document.createElement('canvas');
5018                if(!!(testElem.getContext && testElem.getContext('2d'))){
5019                    var canvasCollection = [],
5020                        elements = $(options.collection),
5021                        collectionHeight = options.collectionHeight;
5022
5023                    for(var i =0; i < elements.length; i++){
5024                            var bounds = elements[i].getBoundingClientRect(),
5025                                $canvas = $('<canvas/>',
5026                                    {
5027                                        'class' : 'snowfall-canvas'
5028                                    }),
5029                                collisionData = [];
5030
5031                            if(bounds.top-collectionHeight > 0){
5032                                $('body').append($canvas);
5033
5034                                $canvas.css({
5035                                    'position' : options.flakePosition,
5036                                    'left'     : bounds.left + 'px',
5037                                    'top'      : bounds.top-collectionHeight + 'px'
5038                                })
5039                                .prop({
5040                                    width: bounds.width,
5041                                    height: collectionHeight
5042                                });
5043
5044                                for(var w = 0; w < bounds.width; w++){
5045                                    collisionData[w] = [];
5046                                }
5047
5048                                canvasCollection.push({
5049                                    element : $canvas.get(0),
5050                                    x : bounds.left,
5051                                    y : bounds.top-collectionHeight,
5052                                    width : bounds.width,
5053                                    height: collectionHeight,
5054                                    colData : collisionData
5055                                });
5056                            }
5057                    }
5058                }else{
5059                    // Canvas element isnt supported
5060                    options.collection = false;
5061                }
5062            }
5063            // ************************************************
5064
5065            // This will reduce the horizontal scroll bar from displaying, when the effect is applied to the whole page
5066            if($(element).get(0).tagName === $(document).get(0).tagName){
5067                widthOffset = 25;
5068            }
5069
5070            // Bind the window resize event so we can get the innerHeight again
5071            $(window).bind("resize", function(){
5072                elHeight = $(element)[0].clientHeight;
5073                elWidth = $(element)[0].offsetWidth;
5074            });
5075
5076
5077            // initialize the flakes
5078            for(i = 0; i < options.flakeCount; i+=1){
5079                flakes.push(new Flake(random(widthOffset,elWidth - widthOffset), random(0, elHeight), random((options.minSize * 100), (options.maxSize * 100)) / 100, random(options.minSpeed, options.maxSpeed)));
5080            }
5081
5082            // This adds the style to make the snowflakes round via border radius property
5083            if(options.round){
5084                $('.snowfall-flakes').css({'-moz-border-radius' : options.maxSize, '-webkit-border-radius' : options.maxSize, 'border-radius' : options.maxSize});
5085            }
5086
5087            // This adds shadows just below the snowflake so they pop a bit on lighter colored web pages
5088            if(options.shadow){
5089                $('.snowfall-flakes').css({'-moz-box-shadow' : '1px 1px 1px #555', '-webkit-box-shadow' : '1px 1px 1px #555', 'box-shadow' : '1px 1px 1px #555'});
5090            }
5091
5092            // On newer Macbooks Snowflakes will fall based on deviceorientation
5093            var doRatio = false;
5094            if (options.deviceorientation) {
5095                $(window).bind('deviceorientation', function(event) {
5096                    doRatio = event.originalEvent.gamma * 0.1;
5097                });
5098            }
5099
5100            // this controls flow of the updating snow
5101            function snow(){
5102                for( i = 0; i < flakes.length; i += 1){
5103                    flakes[i].update();
5104                }
5105
5106                snowTimeout = requestAnimationFrame(function(){snow()});
5107            }
5108
5109            snow();
5110
5111            // clears the snowflakes
5112            this.clear = function(){
5113                $('.snowfall-canvas').remove();
5114                $(element).children('.snowfall-flakes').remove();
5115                cancelAnimationFrame(snowTimeout);
5116            }
5117    };
5118
5119    // Initialize the options and the plugin
5120    $.fn.snowfall = function(options){
5121        if(typeof(options) == "object" || options == undefined){
5122                 return this.each(function(i){
5123                    (new $.snowfall(this, options));
5124                });
5125        }else if (typeof(options) == "string") {
5126            return this.each(function(i){
5127                var snow = $(this).data('snowfall');
5128                if(snow){
5129                    snow.clear();
5130                }
5131            });
5132        }
5133    };
5134})(jQuery);
5135
5136
5137/***/ }),
5138
vendor: 11,282 bytes, lines 5139-5527
5139/***/ "./node_modules/lodash.debounce/index.js":
5140/*!***********************************************!*\
5141  !*** ./node_modules/lodash.debounce/index.js ***!
5142  \***********************************************/
5143/*! no static exports found */
5144/***/ (function(module, exports, __webpack_require__) {
5145
5146/* WEBPACK VAR INJECTION */(function(global) {/**
5147 * lodash (Custom Build) <https://lodash.com/>
5148 * Build: `lodash modularize exports="npm" -o ./`
5149 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
5150 * Released under MIT license <https://lodash.com/license>
5151 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
5152 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
5153 */
5154
5155/** Used as the `TypeError` message for "Functions" methods. */
5156var FUNC_ERROR_TEXT = 'Expected a function';
5157
5158/** Used as references for various `Number` constants. */
5159var NAN = 0 / 0;
5160
5161/** `Object#toString` result references. */
5162var symbolTag = '[object Symbol]';
5163
5164/** Used to match leading and trailing whitespace. */
5165var reTrim = /^\s+|\s+$/g;
5166
5167/** Used to detect bad signed hexadecimal string values. */
5168var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
5169
5170/** Used to detect binary string values. */
5171var reIsBinary = /^0b[01]+$/i;
5172
5173/** Used to detect octal string values. */
5174var reIsOctal = /^0o[0-7]+$/i;
5175
5176/** Built-in method references without a dependency on `root`. */
5177var freeParseInt = parseInt;
5178
5179/** Detect free variable `global` from Node.js. */
5180var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
5181
5182/** Detect free variable `self`. */
5183var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
5184
5185/** Used as a reference to the global object. */
5186var root = freeGlobal || freeSelf || Function('return this')();
5187
5188/** Used for built-in method references. */
5189var objectProto = Object.prototype;
5190
5191/**
5192 * Used to resolve the
5193 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
5194 * of values.
5195 */
5196var objectToString = objectProto.toString;
5197
5198/* Built-in method references for those with the same name as other `lodash` methods. */
5199var nativeMax = Math.max,
5200    nativeMin = Math.min;
5201
5202/**
5203 * Gets the timestamp of the number of milliseconds that have elapsed since
5204 * the Unix epoch (1 January 1970 00:00:00 UTC).
5205 *
5206 * @static
5207 * @memberOf _
5208 * @since 2.4.0
5209 * @category Date
5210 * @returns {number} Returns the timestamp.
5211 * @example
5212 *
5213 * _.defer(function(stamp) {
5214 *   console.log(_.now() - stamp);
5215 * }, _.now());
5216 * // => Logs the number of milliseconds it took for the deferred invocation.
5217 */
5218var now = function() {
5219  return root.Date.now();
5220};
5221
5222/**
5223 * Creates a debounced function that delays invoking `func` until after `wait`
5224 * milliseconds have elapsed since the last time the debounced function was
5225 * invoked. The debounced function comes with a `cancel` method to cancel
5226 * delayed `func` invocations and a `flush` method to immediately invoke them.
5227 * Provide `options` to indicate whether `func` should be invoked on the
5228 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
5229 * with the last arguments provided to the debounced function. Subsequent
5230 * calls to the debounced function return the result of the last `func`
5231 * invocation.
5232 *
5233 * **Note:** If `leading` and `trailing` options are `true`, `func` is
5234 * invoked on the trailing edge of the timeout only if the debounced function
5235 * is invoked more than once during the `wait` timeout.
5236 *
5237 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
5238 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
5239 *
5240 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
5241 * for details over the differences between `_.debounce` and `_.throttle`.
5242 *
5243 * @static
5244 * @memberOf _
5245 * @since 0.1.0
5246 * @category Function
5247 * @param {Function} func The function to debounce.
5248 * @param {number} [wait=0] The number of milliseconds to delay.
5249 * @param {Object} [options={}] The options object.
5250 * @param {boolean} [options.leading=false]
5251 *  Specify invoking on the leading edge of the timeout.
5252 * @param {number} [options.maxWait]
5253 *  The maximum time `func` is allowed to be delayed before it's invoked.
5254 * @param {boolean} [options.trailing=true]
5255 *  Specify invoking on the trailing edge of the timeout.
5256 * @returns {Function} Returns the new debounced function.
5257 * @example
5258 *
5259 * // Avoid costly calculations while the window size is in flux.
5260 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
5261 *
5262 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
5263 * jQuery(element).on('click', _.debounce(sendMail, 300, {
5264 *   'leading': true,
5265 *   'trailing': false
5266 * }));
5267 *
5268 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
5269 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
5270 * var source = new EventSource('/stream');
5271 * jQuery(source).on('message', debounced);
5272 *
5273 * // Cancel the trailing debounced invocation.
5274 * jQuery(window).on('popstate', debounced.cancel);
5275 */
5276function debounce(func, wait, options) {
5277  var lastArgs,
5278      lastThis,
5279      maxWait,
5280      result,
5281      timerId,
5282      lastCallTime,
5283      lastInvokeTime = 0,
5284      leading = false,
5285      maxing = false,
5286      trailing = true;
5287
5288  if (typeof func != 'function') {
5289    throw new TypeError(FUNC_ERROR_TEXT);
5290  }
5291  wait = toNumber(wait) || 0;
5292  if (isObject(options)) {
5293    leading = !!options.leading;
5294    maxing = 'maxWait' in options;
5295    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
5296    trailing = 'trailing' in options ? !!options.trailing : trailing;
5297  }
5298
5299  function invokeFunc(time) {
5300    var args = lastArgs,
5301        thisArg = lastThis;
5302
5303    lastArgs = lastThis = undefined;
5304    lastInvokeTime = time;
5305    result = func.apply(thisArg, args);
5306    return result;
5307  }
5308
5309  function leadingEdge(time) {
5310    // Reset any `maxWait` timer.
5311    lastInvokeTime = time;
5312    // Start the timer for the trailing edge.
5313    timerId = setTimeout(timerExpired, wait);
5314    // Invoke the leading edge.
5315    return leading ? invokeFunc(time) : result;
5316  }
5317
5318  function remainingWait(time) {
5319    var timeSinceLastCall = time - lastCallTime,
5320        timeSinceLastInvoke = time - lastInvokeTime,
5321        result = wait - timeSinceLastCall;
5322
5323    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
5324  }
5325
5326  function shouldInvoke(time) {
5327    var timeSinceLastCall = time - lastCallTime,
5328        timeSinceLastInvoke = time - lastInvokeTime;
5329
5330    // Either this is the first call, activity has stopped and we're at the
5331    // trailing edge, the system time has gone backwards and we're treating
5332    // it as the trailing edge, or we've hit the `maxWait` limit.
5333    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
5334      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
5335  }
5336
5337  function timerExpired() {
5338    var time = now();
5339    if (shouldInvoke(time)) {
5340      return trailingEdge(time);
5341    }
5342    // Restart the timer.
5343    timerId = setTimeout(timerExpired, remainingWait(time));
5344  }
5345
5346  function trailingEdge(time) {
5347    timerId = undefined;
5348
5349    // Only invoke if we have `lastArgs` which means `func` has been
5350    // debounced at least once.
5351    if (trailing && lastArgs) {
5352      return invokeFunc(time);
5353    }
5354    lastArgs = lastThis = undefined;
5355    return result;
5356  }
5357
5358  function cancel() {
5359    if (timerId !== undefined) {
5360      clearTimeout(timerId);
5361    }
5362    lastInvokeTime = 0;
5363    lastArgs = lastCallTime = lastThis = timerId = undefined;
5364  }
5365
5366  function flush() {
5367    return timerId === undefined ? result : trailingEdge(now());
5368  }
5369
5370  function debounced() {
5371    var time = now(),
5372        isInvoking = shouldInvoke(time);
5373
5374    lastArgs = arguments;
5375    lastThis = this;
5376    lastCallTime = time;
5377
5378    if (isInvoking) {
5379      if (timerId === undefined) {
5380        return leadingEdge(lastCallTime);
5381      }
5382      if (maxing) {
5383        // Handle invocations in a tight loop.
5384        timerId = setTimeout(timerExpired, wait);
5385        return invokeFunc(lastCallTime);
5386      }
5387    }
5388    if (timerId === undefined) {
5389      timerId = setTimeout(timerExpired, wait);
5390    }
5391    return result;
5392  }
5393  debounced.cancel = cancel;
5394  debounced.flush = flush;
5395  return debounced;
5396}
5397
5398/**
5399 * Checks if `value` is the
5400 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
5401 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
5402 *
5403 * @static
5404 * @memberOf _
5405 * @since 0.1.0
5406 * @category Lang
5407 * @param {*} value The value to check.
5408 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
5409 * @example
5410 *
5411 * _.isObject({});
5412 * // => true
5413 *
5414 * _.isObject([1, 2, 3]);
5415 * // => true
5416 *
5417 * _.isObject(_.noop);
5418 * // => true
5419 *
5420 * _.isObject(null);
5421 * // => false
5422 */
5423function isObject(value) {
5424  var type = typeof value;
5425  return !!value && (type == 'object' || type == 'function');
5426}
5427
5428/**
5429 * Checks if `value` is object-like. A value is object-like if it's not `null`
5430 * and has a `typeof` result of "object".
5431 *
5432 * @static
5433 * @memberOf _
5434 * @since 4.0.0
5435 * @category Lang
5436 * @param {*} value The value to check.
5437 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
5438 * @example
5439 *
5440 * _.isObjectLike({});
5441 * // => true
5442 *
5443 * _.isObjectLike([1, 2, 3]);
5444 * // => true
5445 *
5446 * _.isObjectLike(_.noop);
5447 * // => false
5448 *
5449 * _.isObjectLike(null);
5450 * // => false
5451 */
5452function isObjectLike(value) {
5453  return !!value && typeof value == 'object';
5454}
5455
5456/**
5457 * Checks if `value` is classified as a `Symbol` primitive or object.
5458 *
5459 * @static
5460 * @memberOf _
5461 * @since 4.0.0
5462 * @category Lang
5463 * @param {*} value The value to check.
5464 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
5465 * @example
5466 *
5467 * _.isSymbol(Symbol.iterator);
5468 * // => true
5469 *
5470 * _.isSymbol('abc');
5471 * // => false
5472 */
5473function isSymbol(value) {
5474  return typeof value == 'symbol' ||
5475    (isObjectLike(value) && objectToString.call(value) == symbolTag);
5476}
5477
5478/**
5479 * Converts `value` to a number.
5480 *
5481 * @static
5482 * @memberOf _
5483 * @since 4.0.0
5484 * @category Lang
5485 * @param {*} value The value to process.
5486 * @returns {number} Returns the number.
5487 * @example
5488 *
5489 * _.toNumber(3.2);
5490 * // => 3.2
5491 *
5492 * _.toNumber(Number.MIN_VALUE);
5493 * // => 5e-324
5494 *
5495 * _.toNumber(Infinity);
5496 * // => Infinity
5497 *
5498 * _.toNumber('3.2');
5499 * // => 3.2
5500 */
5501function toNumber(value) {
5502  if (typeof value == 'number') {
5503    return value;
5504  }
5505  if (isSymbol(value)) {
5506    return NAN;
5507  }
5508  if (isObject(value)) {
5509    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
5510    value = isObject(other) ? (other + '') : other;
5511  }
5512  if (typeof value != 'string') {
5513    return value === 0 ? value : +value;
5514  }
5515  value = value.replace(reTrim, '');
5516  var isBinary = reIsBinary.test(value);
5517  return (isBinary || reIsOctal.test(value))
5518    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
5519    : (reIsBadHex.test(value) ? NAN : +value);
5520}
5521
5522module.exports = debounce;
5523
5524/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
5525
5526/***/ }),
5527
vendor: 1,138 bytes, lines 5528-5559
5528/***/ "./node_modules/mdn-polyfills/src/Object.assign/assign.js":
5529/*!****************************************************************!*\
5530  !*** ./node_modules/mdn-polyfills/src/Object.assign/assign.js ***!
5531  \****************************************************************/
5532/*! exports provided: default */
5533/***/ (function(module, __webpack_exports__, __webpack_require__) {
5534
5535"use strict";
5536__webpack_require__.r(__webpack_exports__);
5537/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return assign; });
5538function assign(target) {
5539    if (target === undefined || target === null) {
5540        throw new TypeError('Cannot convert undefined or null to object');
5541    }
5542
5543    const output = Object(target);
5544    for (let index = 1; index < arguments.length; index++) {
5545        const source = arguments[index];
5546        if (source !== undefined && source !== null) {
5547            for (const nextKey in source) {
5548                if (source.hasOwnProperty(nextKey)) {
5549                    output[nextKey] = source[nextKey];
5550                }
5551            }
5552        }
5553    }
5554    return output;
5555}
5556
5557
5558/***/ }),
5559
vendor: 715 bytes, lines 5560-5578
5560/***/ "./node_modules/mdn-polyfills/src/Object.assign/index.js":
5561/*!***************************************************************!*\
5562  !*** ./node_modules/mdn-polyfills/src/Object.assign/index.js ***!
5563  \***************************************************************/
5564/*! no exports provided */
5565/***/ (function(module, __webpack_exports__, __webpack_require__) {
5566
5567"use strict";
5568__webpack_require__.r(__webpack_exports__);
5569/* harmony import */ var _assign__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assign */ "./node_modules/mdn-polyfills/src/Object.assign/assign.js");
5570
5571
5572if (typeof Object.assign !== 'function') {
5573    Object.assign = _assign__WEBPACK_IMPORTED_MODULE_0__["default"];
5574}
5575
5576
5577/***/ }),
5578
vendor: 97,303 bytes, lines 5579-7925
5579/***/ "./node_modules/nouislider/dist/nouislider.mjs":
5580/*!*****************************************************!*\
5581  !*** ./node_modules/nouislider/dist/nouislider.mjs ***!
5582  \*****************************************************/
5583/*! exports provided: PipsMode, PipsType, create, cssClasses, default */
5584/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {
5585
5586"use strict";
5587__webpack_require__.r(__webpack_exports__);
5588/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PipsMode", function() { return PipsMode; });
5589/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PipsType", function() { return PipsType; });
5590/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create", function() { return initialize; });
5591/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cssClasses", function() { return cssClasses; });
5592
5593var PipsMode;
5594(function (PipsMode) {
5595    PipsMode["Range"] = "range";
5596    PipsMode["Steps"] = "steps";
5597    PipsMode["Positions"] = "positions";
5598    PipsMode["Count"] = "count";
5599    PipsMode["Values"] = "values";
5600})(PipsMode || (PipsMode = {}));
5601var PipsType;
5602(function (PipsType) {
5603    PipsType[PipsType["None"] = -1] = "None";
5604    PipsType[PipsType["NoValue"] = 0] = "NoValue";
5605    PipsType[PipsType["LargeValue"] = 1] = "LargeValue";
5606    PipsType[PipsType["SmallValue"] = 2] = "SmallValue";
5607})(PipsType || (PipsType = {}));
5608//region Helper Methods
5609function isValidFormatter(entry) {
5610    return isValidPartialFormatter(entry) && typeof entry.from === "function";
5611}
5612function isValidPartialFormatter(entry) {
5613    // partial formatters only need a to function and not a from function
5614    return typeof entry === "object" && typeof entry.to === "function";
5615}
5616function removeElement(el) {
5617    el.parentElement.removeChild(el);
5618}
5619function isSet(value) {
5620    return value !== null && value !== undefined;
5621}
5622// Bindable version
5623function preventDefault(e) {
5624    e.preventDefault();
5625}
5626// Removes duplicates from an array.
5627function unique(array) {
5628    return array.filter(function (a) {
5629        return !this[a] ? (this[a] = true) : false;
5630    }, {});
5631}
5632// Round a value to the closest 'to'.
5633function closest(value, to) {
5634    return Math.round(value / to) * to;
5635}
5636// Current position of an element relative to the document.
5637function offset(elem, orientation) {
5638    var rect = elem.getBoundingClientRect();
5639    var doc = elem.ownerDocument;
5640    var docElem = doc.documentElement;
5641    var pageOffset = getPageOffset(doc);
5642    // getBoundingClientRect contains left scroll in Chrome on Android.
5643    // I haven't found a feature detection that proves this. Worst case
5644    // scenario on mis-match: the 'tap' feature on horizontal sliders breaks.
5645    if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) {
5646        pageOffset.x = 0;
5647    }
5648    return orientation ? rect.top + pageOffset.y - docElem.clientTop : rect.left + pageOffset.x - docElem.clientLeft;
5649}
5650// Checks whether a value is numerical.
5651function isNumeric(a) {
5652    return typeof a === "number" && !isNaN(a) && isFinite(a);
5653}
5654// Sets a class and removes it after [duration] ms.
5655function addClassFor(element, className, duration) {
5656    if (duration > 0) {
5657        addClass(element, className);
5658        setTimeout(function () {
5659            removeClass(element, className);
5660        }, duration);
5661    }
5662}
5663// Limits a value to 0 - 100
5664function limit(a) {
5665    return Math.max(Math.min(a, 100), 0);
5666}
5667// Wraps a variable as an array, if it isn't one yet.
5668// Note that an input array is returned by reference!
5669function asArray(a) {
5670    return Array.isArray(a) ? a : [a];
5671}
5672// Counts decimals
5673function countDecimals(numStr) {
5674    numStr = String(numStr);
5675    var pieces = numStr.split(".");
5676    return pieces.length > 1 ? pieces[1].length : 0;
5677}
5678// http://youmightnotneedjquery.com/#add_class
5679function addClass(el, className) {
5680    if (el.classList && !/\s/.test(className)) {
5681        el.classList.add(className);
5682    }
5683    else {
5684        el.className += " " + className;
5685    }
5686}
5687// http://youmightnotneedjquery.com/#remove_class
5688function removeClass(el, className) {
5689    if (el.classList && !/\s/.test(className)) {
5690        el.classList.remove(className);
5691    }
5692    else {
5693        el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " ");
5694    }
5695}
5696// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/
5697function hasClass(el, className) {
5698    return el.classList ? el.classList.contains(className) : new RegExp("\\b" + className + "\\b").test(el.className);
5699}
5700// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes
5701function getPageOffset(doc) {
5702    var supportPageOffset = window.pageXOffset !== undefined;
5703    var isCSS1Compat = (doc.compatMode || "") === "CSS1Compat";
5704    var x = supportPageOffset
5705        ? window.pageXOffset
5706        : isCSS1Compat
5707            ? doc.documentElement.scrollLeft
5708            : doc.body.scrollLeft;
5709    var y = supportPageOffset
5710        ? window.pageYOffset
5711        : isCSS1Compat
5712            ? doc.documentElement.scrollTop
5713            : doc.body.scrollTop;
5714    return {
5715        x: x,
5716        y: y,
5717    };
5718}
5719// we provide a function to compute constants instead
5720// of accessing window.* as soon as the module needs it
5721// so that we do not compute anything if not needed
5722function getActions() {
5723    // Determine the events to bind. IE11 implements pointerEvents without
5724    // a prefix, which breaks compatibility with the IE10 implementation.
5725    return window.navigator.pointerEnabled
5726        ? {
5727            start: "pointerdown",
5728            move: "pointermove",
5729            end: "pointerup",
5730        }
5731        : window.navigator.msPointerEnabled
5732            ? {
5733                start: "MSPointerDown",
5734                move: "MSPointerMove",
5735                end: "MSPointerUp",
5736            }
5737            : {
5738                start: "mousedown touchstart",
5739                move: "mousemove touchmove",
5740                end: "mouseup touchend",
5741            };
5742}
5743// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
5744// Issue #785
5745function getSupportsPassive() {
5746    var supportsPassive = false;
5747    /* eslint-disable */
5748    try {
5749        var opts = Object.defineProperty({}, "passive", {
5750            get: function () {
5751                supportsPassive = true;
5752            },
5753        });
5754        // @ts-ignore
5755        window.addEventListener("test", null, opts);
5756    }
5757    catch (e) { }
5758    /* eslint-enable */
5759    return supportsPassive;
5760}
5761function getSupportsTouchActionNone() {
5762    return window.CSS && CSS.supports && CSS.supports("touch-action", "none");
5763}
5764//endregion
5765//region Range Calculation
5766// Determine the size of a sub-range in relation to a full range.
5767function subRangeRatio(pa, pb) {
5768    return 100 / (pb - pa);
5769}
5770// (percentage) How many percent is this value of this range?
5771function fromPercentage(range, value, startRange) {
5772    return (value * 100) / (range[startRange + 1] - range[startRange]);
5773}
5774// (percentage) Where is this value on this range?
5775function toPercentage(range, value) {
5776    return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0);
5777}
5778// (value) How much is this percentage on this range?
5779function isPercentage(range, value) {
5780    return (value * (range[1] - range[0])) / 100 + range[0];
5781}
5782function getJ(value, arr) {
5783    var j = 1;
5784    while (value >= arr[j]) {
5785        j += 1;
5786    }
5787    return j;
5788}
5789// (percentage) Input a value, find where, on a scale of 0-100, it applies.
5790function toStepping(xVal, xPct, value) {
5791    if (value >= xVal.slice(-1)[0]) {
5792        return 100;
5793    }
5794    var j = getJ(value, xVal);
5795    var va = xVal[j - 1];
5796    var vb = xVal[j];
5797    var pa = xPct[j - 1];
5798    var pb = xPct[j];
5799    return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb);
5800}
5801// (value) Input a percentage, find where it is on the specified range.
5802function fromStepping(xVal, xPct, value) {
5803    // There is no range group that fits 100
5804    if (value >= 100) {
5805        return xVal.slice(-1)[0];
5806    }
5807    var j = getJ(value, xPct);
5808    var va = xVal[j - 1];
5809    var vb = xVal[j];
5810    var pa = xPct[j - 1];
5811    var pb = xPct[j];
5812    return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb));
5813}
5814// (percentage) Get the step that applies at a certain value.
5815function getStep(xPct, xSteps, snap, value) {
5816    if (value === 100) {
5817        return value;
5818    }
5819    var j = getJ(value, xPct);
5820    var a = xPct[j - 1];
5821    var b = xPct[j];
5822    // If 'snap' is set, steps are used as fixed points on the slider.
5823    if (snap) {
5824        // Find the closest position, a or b.
5825        if (value - a > (b - a) / 2) {
5826            return b;
5827        }
5828        return a;
5829    }
5830    if (!xSteps[j - 1]) {
5831        return value;
5832    }
5833    return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]);
5834}
5835//endregion
5836//region Spectrum
5837var Spectrum = /** @class */ (function () {
5838    function Spectrum(entry, snap, singleStep) {
5839        this.xPct = [];
5840        this.xVal = [];
5841        this.xSteps = [];
5842        this.xNumSteps = [];
5843        this.xHighestCompleteStep = [];
5844        this.xSteps = [singleStep || false];
5845        this.xNumSteps = [false];
5846        this.snap = snap;
5847        var index;
5848        var ordered = [];
5849        // Map the object keys to an array.
5850        Object.keys(entry).forEach(function (index) {
5851            ordered.push([asArray(entry[index]), index]);
5852        });
5853        // Sort all entries by value (numeric sort).
5854        ordered.sort(function (a, b) {
5855            return a[0][0] - b[0][0];
5856        });
5857        // Convert all entries to subranges.
5858        for (index = 0; index < ordered.length; index++) {
5859            this.handleEntryPoint(ordered[index][1], ordered[index][0]);
5860        }
5861        // Store the actual step values.
5862        // xSteps is sorted in the same order as xPct and xVal.
5863        this.xNumSteps = this.xSteps.slice(0);
5864        // Convert all numeric steps to the percentage of the subrange they represent.
5865        for (index = 0; index < this.xNumSteps.length; index++) {
5866            this.handleStepPoint(index, this.xNumSteps[index]);
5867        }
5868    }
5869    Spectrum.prototype.getDistance = function (value) {
5870        var distances = [];
5871        for (var index = 0; index < this.xNumSteps.length - 1; index++) {
5872            distances[index] = fromPercentage(this.xVal, value, index);
5873        }
5874        return distances;
5875    };
5876    // Calculate the percentual distance over the whole scale of ranges.
5877    // direction: 0 = backwards / 1 = forwards
5878    Spectrum.prototype.getAbsoluteDistance = function (value, distances, direction) {
5879        var xPct_index = 0;
5880        // Calculate range where to start calculation
5881        if (value < this.xPct[this.xPct.length - 1]) {
5882            while (value > this.xPct[xPct_index + 1]) {
5883                xPct_index++;
5884            }
5885        }
5886        else if (value === this.xPct[this.xPct.length - 1]) {
5887            xPct_index = this.xPct.length - 2;
5888        }
5889        // If looking backwards and the value is exactly at a range separator then look one range further
5890        if (!direction && value === this.xPct[xPct_index + 1]) {
5891            xPct_index++;
5892        }
5893        if (distances === null) {
5894            distances = [];
5895        }
5896        var start_factor;
5897        var rest_factor = 1;
5898        var rest_rel_distance = distances[xPct_index];
5899        var range_pct = 0;
5900        var rel_range_distance = 0;
5901        var abs_distance_counter = 0;
5902        var range_counter = 0;
5903        // Calculate what part of the start range the value is
5904        if (direction) {
5905            start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);
5906        }
5907        else {
5908            start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);
5909        }
5910        // Do until the complete distance across ranges is calculated
5911        while (rest_rel_distance > 0) {
5912            // Calculate the percentage of total range
5913            range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter];
5914            // Detect if the margin, padding or limit is larger then the current range and calculate
5915            if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) {
5916                // If larger then take the percentual distance of the whole range
5917                rel_range_distance = range_pct * start_factor;
5918                // Rest factor of relative percentual distance still to be calculated
5919                rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter];
5920                // Set start factor to 1 as for next range it does not apply.
5921                start_factor = 1;
5922            }
5923            else {
5924                // If smaller or equal then take the percentual distance of the calculate percentual part of that range
5925                rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor;
5926                // No rest left as the rest fits in current range
5927                rest_factor = 0;
5928            }
5929            if (direction) {
5930                abs_distance_counter = abs_distance_counter - rel_range_distance;
5931                // Limit range to first range when distance becomes outside of minimum range
5932                if (this.xPct.length + range_counter >= 1) {
5933                    range_counter--;
5934                }
5935            }
5936            else {
5937                abs_distance_counter = abs_distance_counter + rel_range_distance;
5938                // Limit range to last range when distance becomes outside of maximum range
5939                if (this.xPct.length - range_counter >= 1) {
5940                    range_counter++;
5941                }
5942            }
5943            // Rest of relative percentual distance still to be calculated
5944            rest_rel_distance = distances[xPct_index + range_counter] * rest_factor;
5945        }
5946        return value + abs_distance_counter;
5947    };
5948    Spectrum.prototype.toStepping = function (value) {
5949        value = toStepping(this.xVal, this.xPct, value);
5950        return value;
5951    };
5952    Spectrum.prototype.fromStepping = function (value) {
5953        return fromStepping(this.xVal, this.xPct, value);
5954    };
5955    Spectrum.prototype.getStep = function (value) {
5956        value = getStep(this.xPct, this.xSteps, this.snap, value);
5957        return value;
5958    };
5959    Spectrum.prototype.getDefaultStep = function (value, isDown, size) {
5960        var j = getJ(value, this.xPct);
5961        // When at the top or stepping down, look at the previous sub-range
5962        if (value === 100 || (isDown && value === this.xPct[j - 1])) {
5963            j = Math.max(j - 1, 1);
5964        }
5965        return (this.xVal[j] - this.xVal[j - 1]) / size;
5966    };
5967    Spectrum.prototype.getNearbySteps = function (value) {
5968        var j = getJ(value, this.xPct);
5969        return {
5970            stepBefore: {
5971                startValue: this.xVal[j - 2],
5972                step: this.xNumSteps[j - 2],
5973                highestStep: this.xHighestCompleteStep[j - 2],
5974            },
5975            thisStep: {
5976                startValue: this.xVal[j - 1],
5977                step: this.xNumSteps[j - 1],
5978                highestStep: this.xHighestCompleteStep[j - 1],
5979            },
5980            stepAfter: {
5981                startValue: this.xVal[j],
5982                step: this.xNumSteps[j],
5983                highestStep: this.xHighestCompleteStep[j],
5984            },
5985        };
5986    };
5987    Spectrum.prototype.countStepDecimals = function () {
5988        var stepDecimals = this.xNumSteps.map(countDecimals);
5989        return Math.max.apply(null, stepDecimals);
5990    };
5991    Spectrum.prototype.hasNoSize = function () {
5992        return this.xVal[0] === this.xVal[this.xVal.length - 1];
5993    };
5994    // Outside testing
5995    Spectrum.prototype.convert = function (value) {
5996        return this.getStep(this.toStepping(value));
5997    };
5998    Spectrum.prototype.handleEntryPoint = function (index, value) {
5999        var percentage;
6000        // Covert min/max syntax to 0 and 100.
6001        if (index === "min") {
6002            percentage = 0;
6003        }
6004        else if (index === "max") {
6005            percentage = 100;
6006        }
6007        else {
6008            percentage = parseFloat(index);
6009        }
6010        // Check for correct input.
6011        if (!isNumeric(percentage) || !isNumeric(value[0])) {
6012            throw new Error("noUiSlider: 'range' value isn't numeric.");
6013        }
6014        // Store values.
6015        this.xPct.push(percentage);
6016        this.xVal.push(value[0]);
6017        var value1 = Number(value[1]);
6018        // NaN will evaluate to false too, but to keep
6019        // logging clear, set step explicitly. Make sure
6020        // not to override the 'step' setting with false.
6021        if (!percentage) {
6022            if (!isNaN(value1)) {
6023                this.xSteps[0] = value1;
6024            }
6025        }
6026        else {
6027            this.xSteps.push(isNaN(value1) ? false : value1);
6028        }
6029        this.xHighestCompleteStep.push(0);
6030    };
6031    Spectrum.prototype.handleStepPoint = function (i, n) {
6032        // Ignore 'false' stepping.
6033        if (!n) {
6034            return;
6035        }
6036        // Step over zero-length ranges (#948);
6037        if (this.xVal[i] === this.xVal[i + 1]) {
6038            this.xSteps[i] = this.xHighestCompleteStep[i] = this.xVal[i];
6039            return;
6040        }
6041        // Factor to range ratio
6042        this.xSteps[i] =
6043            fromPercentage([this.xVal[i], this.xVal[i + 1]], n, 0) / subRangeRatio(this.xPct[i], this.xPct[i + 1]);
6044        var totalSteps = (this.xVal[i + 1] - this.xVal[i]) / this.xNumSteps[i];
6045        var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);
6046        var step = this.xVal[i] + this.xNumSteps[i] * highestStep;
6047        this.xHighestCompleteStep[i] = step;
6048    };
6049    return Spectrum;
6050}());
6051//endregion
6052//region Options
6053/*	Every input option is tested and parsed. This will prevent
6054    endless validation in internal methods. These tests are
6055    structured with an item for every option available. An
6056    option can be marked as required by setting the 'r' flag.
6057    The testing function is provided with three arguments:
6058        - The provided value for the option;
6059        - A reference to the options object;
6060        - The name for the option;
6061
6062    The testing function returns false when an error is detected,
6063    or true when everything is OK. It can also modify the option
6064    object, to make sure all values can be correctly looped elsewhere. */
6065//region Defaults
6066var defaultFormatter = {
6067    to: function (value) {
6068        return value === undefined ? "" : value.toFixed(2);
6069    },
6070    from: Number,
6071};
6072var cssClasses = {
6073    target: "target",
6074    base: "base",
6075    origin: "origin",
6076    handle: "handle",
6077    handleLower: "handle-lower",
6078    handleUpper: "handle-upper",
6079    touchArea: "touch-area",
6080    horizontal: "horizontal",
6081    vertical: "vertical",
6082    background: "background",
6083    connect: "connect",
6084    connects: "connects",
6085    ltr: "ltr",
6086    rtl: "rtl",
6087    textDirectionLtr: "txt-dir-ltr",
6088    textDirectionRtl: "txt-dir-rtl",
6089    draggable: "draggable",
6090    drag: "state-drag",
6091    tap: "state-tap",
6092    active: "active",
6093    tooltip: "tooltip",
6094    pips: "pips",
6095    pipsHorizontal: "pips-horizontal",
6096    pipsVertical: "pips-vertical",
6097    marker: "marker",
6098    markerHorizontal: "marker-horizontal",
6099    markerVertical: "marker-vertical",
6100    markerNormal: "marker-normal",
6101    markerLarge: "marker-large",
6102    markerSub: "marker-sub",
6103    value: "value",
6104    valueHorizontal: "value-horizontal",
6105    valueVertical: "value-vertical",
6106    valueNormal: "value-normal",
6107    valueLarge: "value-large",
6108    valueSub: "value-sub",
6109};
6110// Namespaces of internal event listeners
6111var INTERNAL_EVENT_NS = {
6112    tooltips: ".__tooltips",
6113    aria: ".__aria",
6114};
6115//endregion
6116function testStep(parsed, entry) {
6117    if (!isNumeric(entry)) {
6118        throw new Error("noUiSlider: 'step' is not numeric.");
6119    }
6120    // The step option can still be used to set stepping
6121    // for linear sliders. Overwritten if set in 'range'.
6122    parsed.singleStep = entry;
6123}
6124function testKeyboardPageMultiplier(parsed, entry) {
6125    if (!isNumeric(entry)) {
6126        throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");
6127    }
6128    parsed.keyboardPageMultiplier = entry;
6129}
6130function testKeyboardMultiplier(parsed, entry) {
6131    if (!isNumeric(entry)) {
6132        throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");
6133    }
6134    parsed.keyboardMultiplier = entry;
6135}
6136function testKeyboardDefaultStep(parsed, entry) {
6137    if (!isNumeric(entry)) {
6138        throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");
6139    }
6140    parsed.keyboardDefaultStep = entry;
6141}
6142function testRange(parsed, entry) {
6143    // Filter incorrect input.
6144    if (typeof entry !== "object" || Array.isArray(entry)) {
6145        throw new Error("noUiSlider: 'range' is not an object.");
6146    }
6147    // Catch missing start or end.
6148    if (entry.min === undefined || entry.max === undefined) {
6149        throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");
6150    }
6151    parsed.spectrum = new Spectrum(entry, parsed.snap || false, parsed.singleStep);
6152}
6153function testStart(parsed, entry) {
6154    entry = asArray(entry);
6155    // Validate input. Values aren't tested, as the public .val method
6156    // will always provide a valid location.
6157    if (!Array.isArray(entry) || !entry.length) {
6158        throw new Error("noUiSlider: 'start' option is incorrect.");
6159    }
6160    // Store the number of handles.
6161    parsed.handles = entry.length;
6162    // When the slider is initialized, the .val method will
6163    // be called with the start options.
6164    parsed.start = entry;
6165}
6166function testSnap(parsed, entry) {
6167    if (typeof entry !== "boolean") {
6168        throw new Error("noUiSlider: 'snap' option must be a boolean.");
6169    }
6170    // Enforce 100% stepping within subranges.
6171    parsed.snap = entry;
6172}
6173function testAnimate(parsed, entry) {
6174    if (typeof entry !== "boolean") {
6175        throw new Error("noUiSlider: 'animate' option must be a boolean.");
6176    }
6177    // Enforce 100% stepping within subranges.
6178    parsed.animate = entry;
6179}
6180function testAnimationDuration(parsed, entry) {
6181    if (typeof entry !== "number") {
6182        throw new Error("noUiSlider: 'animationDuration' option must be a number.");
6183    }
6184    parsed.animationDuration = entry;
6185}
6186function testConnect(parsed, entry) {
6187    var connect = [false];
6188    var i;
6189    // Map legacy options
6190    if (entry === "lower") {
6191        entry = [true, false];
6192    }
6193    else if (entry === "upper") {
6194        entry = [false, true];
6195    }
6196    // Handle boolean options
6197    if (entry === true || entry === false) {
6198        for (i = 1; i < parsed.handles; i++) {
6199            connect.push(entry);
6200        }
6201        connect.push(false);
6202    }
6203    // Reject invalid input
6204    else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) {
6205        throw new Error("noUiSlider: 'connect' option doesn't match handle count.");
6206    }
6207    else {
6208        connect = entry;
6209    }
6210    parsed.connect = connect;
6211}
6212function testOrientation(parsed, entry) {
6213    // Set orientation to an a numerical value for easy
6214    // array selection.
6215    switch (entry) {
6216        case "horizontal":
6217            parsed.ort = 0;
6218            break;
6219        case "vertical":
6220            parsed.ort = 1;
6221            break;
6222        default:
6223            throw new Error("noUiSlider: 'orientation' option is invalid.");
6224    }
6225}
6226function testMargin(parsed, entry) {
6227    if (!isNumeric(entry)) {
6228        throw new Error("noUiSlider: 'margin' option must be numeric.");
6229    }
6230    // Issue #582
6231    if (entry === 0) {
6232        return;
6233    }
6234    parsed.margin = parsed.spectrum.getDistance(entry);
6235}
6236function testLimit(parsed, entry) {
6237    if (!isNumeric(entry)) {
6238        throw new Error("noUiSlider: 'limit' option must be numeric.");
6239    }
6240    parsed.limit = parsed.spectrum.getDistance(entry);
6241    if (!parsed.limit || parsed.handles < 2) {
6242        throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles.");
6243    }
6244}
6245function testPadding(parsed, entry) {
6246    var index;
6247    if (!isNumeric(entry) && !Array.isArray(entry)) {
6248        throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");
6249    }
6250    if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) {
6251        throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");
6252    }
6253    if (entry === 0) {
6254        return;
6255    }
6256    if (!Array.isArray(entry)) {
6257        entry = [entry, entry];
6258    }
6259    // 'getDistance' returns false for invalid values.
6260    parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])];
6261    for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) {
6262        // last "range" can't contain step size as it is purely an endpoint.
6263        if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) {
6264            throw new Error("noUiSlider: 'padding' option must be a positive number(s).");
6265        }
6266    }
6267    var totalPadding = entry[0] + entry[1];
6268    var firstValue = parsed.spectrum.xVal[0];
6269    var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1];
6270    if (totalPadding / (lastValue - firstValue) > 1) {
6271        throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.");
6272    }
6273}
6274function testDirection(parsed, entry) {
6275    // Set direction as a numerical value for easy parsing.
6276    // Invert connection for RTL sliders, so that the proper
6277    // handles get the connect/background classes.
6278    switch (entry) {
6279        case "ltr":
6280            parsed.dir = 0;
6281            break;
6282        case "rtl":
6283            parsed.dir = 1;
6284            break;
6285        default:
6286            throw new Error("noUiSlider: 'direction' option was not recognized.");
6287    }
6288}
6289function testBehaviour(parsed, entry) {
6290    // Make sure the input is a string.
6291    if (typeof entry !== "string") {
6292        throw new Error("noUiSlider: 'behaviour' must be a string containing options.");
6293    }
6294    // Check if the string contains any keywords.
6295    // None are required.
6296    var tap = entry.indexOf("tap") >= 0;
6297    var drag = entry.indexOf("drag") >= 0;
6298    var fixed = entry.indexOf("fixed") >= 0;
6299    var snap = entry.indexOf("snap") >= 0;
6300    var hover = entry.indexOf("hover") >= 0;
6301    var unconstrained = entry.indexOf("unconstrained") >= 0;
6302    var invertConnects = entry.indexOf("invert-connects") >= 0;
6303    var dragAll = entry.indexOf("drag-all") >= 0;
6304    var smoothSteps = entry.indexOf("smooth-steps") >= 0;
6305    if (fixed) {
6306        if (parsed.handles !== 2) {
6307            throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");
6308        }
6309        // Use margin to enforce fixed state
6310        testMargin(parsed, parsed.start[1] - parsed.start[0]);
6311    }
6312    if (invertConnects && parsed.handles !== 2) {
6313        throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles");
6314    }
6315    if (unconstrained && (parsed.margin || parsed.limit)) {
6316        throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");
6317    }
6318    parsed.events = {
6319        tap: tap || snap,
6320        drag: drag,
6321        dragAll: dragAll,
6322        smoothSteps: smoothSteps,
6323        fixed: fixed,
6324        snap: snap,
6325        hover: hover,
6326        unconstrained: unconstrained,
6327        invertConnects: invertConnects,
6328    };
6329}
6330function testTooltips(parsed, entry) {
6331    if (entry === false) {
6332        return;
6333    }
6334    if (entry === true || isValidPartialFormatter(entry)) {
6335        parsed.tooltips = [];
6336        for (var i = 0; i < parsed.handles; i++) {
6337            parsed.tooltips.push(entry);
6338        }
6339    }
6340    else {
6341        entry = asArray(entry);
6342        if (entry.length !== parsed.handles) {
6343            throw new Error("noUiSlider: must pass a formatter for all handles.");
6344        }
6345        entry.forEach(function (formatter) {
6346            if (typeof formatter !== "boolean" && !isValidPartialFormatter(formatter)) {
6347                throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'.");
6348            }
6349        });
6350        parsed.tooltips = entry;
6351    }
6352}
6353function testHandleAttributes(parsed, entry) {
6354    if (entry.length !== parsed.handles) {
6355        throw new Error("noUiSlider: must pass a attributes for all handles.");
6356    }
6357    parsed.handleAttributes = entry;
6358}
6359function testAriaFormat(parsed, entry) {
6360    if (!isValidPartialFormatter(entry)) {
6361        throw new Error("noUiSlider: 'ariaFormat' requires 'to' method.");
6362    }
6363    parsed.ariaFormat = entry;
6364}
6365function testFormat(parsed, entry) {
6366    if (!isValidFormatter(entry)) {
6367        throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods.");
6368    }
6369    parsed.format = entry;
6370}
6371function testKeyboardSupport(parsed, entry) {
6372    if (typeof entry !== "boolean") {
6373        throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean.");
6374    }
6375    parsed.keyboardSupport = entry;
6376}
6377function testDocumentElement(parsed, entry) {
6378    // This is an advanced option. Passed values are used without validation.
6379    parsed.documentElement = entry;
6380}
6381function testCssPrefix(parsed, entry) {
6382    if (typeof entry !== "string" && entry !== false) {
6383        throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`.");
6384    }
6385    parsed.cssPrefix = entry;
6386}
6387function testCssClasses(parsed, entry) {
6388    if (typeof entry !== "object") {
6389        throw new Error("noUiSlider: 'cssClasses' must be an object.");
6390    }
6391    if (typeof parsed.cssPrefix === "string") {
6392        parsed.cssClasses = {};
6393        Object.keys(entry).forEach(function (key) {
6394            parsed.cssClasses[key] = parsed.cssPrefix + entry[key];
6395        });
6396    }
6397    else {
6398        parsed.cssClasses = entry;
6399    }
6400}
6401// Test all developer settings and parse to assumption-safe values.
6402function testOptions(options) {
6403    // To prove a fix for #537, freeze options here.
6404    // If the object is modified, an error will be thrown.
6405    // Object.freeze(options);
6406    var parsed = {
6407        margin: null,
6408        limit: null,
6409        padding: null,
6410        animate: true,
6411        animationDuration: 300,
6412        ariaFormat: defaultFormatter,
6413        format: defaultFormatter,
6414    };
6415    // Tests are executed in the order they are presented here.
6416    var tests = {
6417        step: { r: false, t: testStep },
6418        keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier },
6419        keyboardMultiplier: { r: false, t: testKeyboardMultiplier },
6420        keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep },
6421        start: { r: true, t: testStart },
6422        connect: { r: true, t: testConnect },
6423        direction: { r: true, t: testDirection },
6424        snap: { r: false, t: testSnap },
6425        animate: { r: false, t: testAnimate },
6426        animationDuration: { r: false, t: testAnimationDuration },
6427        range: { r: true, t: testRange },
6428        orientation: { r: false, t: testOrientation },
6429        margin: { r: false, t: testMargin },
6430        limit: { r: false, t: testLimit },
6431        padding: { r: false, t: testPadding },
6432        behaviour: { r: true, t: testBehaviour },
6433        ariaFormat: { r: false, t: testAriaFormat },
6434        format: { r: false, t: testFormat },
6435        tooltips: { r: false, t: testTooltips },
6436        keyboardSupport: { r: true, t: testKeyboardSupport },
6437        documentElement: { r: false, t: testDocumentElement },
6438        cssPrefix: { r: true, t: testCssPrefix },
6439        cssClasses: { r: true, t: testCssClasses },
6440        handleAttributes: { r: false, t: testHandleAttributes },
6441    };
6442    var defaults = {
6443        connect: false,
6444        direction: "ltr",
6445        behaviour: "tap",
6446        orientation: "horizontal",
6447        keyboardSupport: true,
6448        cssPrefix: "noUi-",
6449        cssClasses: cssClasses,
6450        keyboardPageMultiplier: 5,
6451        keyboardMultiplier: 1,
6452        keyboardDefaultStep: 10,
6453    };
6454    // AriaFormat defaults to regular format, if any.
6455    if (options.format && !options.ariaFormat) {
6456        options.ariaFormat = options.format;
6457    }
6458    // Run all options through a testing mechanism to ensure correct
6459    // input. It should be noted that options might get modified to
6460    // be handled properly. E.g. wrapping integers in arrays.
6461    Object.keys(tests).forEach(function (name) {
6462        // If the option isn't set, but it is required, throw an error.
6463        if (!isSet(options[name]) && defaults[name] === undefined) {
6464            if (tests[name].r) {
6465                throw new Error("noUiSlider: '" + name + "' is required.");
6466            }
6467            return;
6468        }
6469        tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]);
6470    });
6471    // Forward pips options
6472    parsed.pips = options.pips;
6473    // All recent browsers accept unprefixed transform.
6474    // We need -ms- for IE9 and -webkit- for older Android;
6475    // Assume use of -webkit- if unprefixed and -ms- are not supported.
6476    // https://caniuse.com/#feat=transforms2d
6477    var d = document.createElement("div");
6478    var msPrefix = d.style.msTransform !== undefined;
6479    var noPrefix = d.style.transform !== undefined;
6480    parsed.transformRule = noPrefix ? "transform" : msPrefix ? "msTransform" : "webkitTransform";
6481    // Pips don't move, so we can place them using left/top.
6482    var styles = [
6483        ["left", "top"],
6484        ["right", "bottom"],
6485    ];
6486    parsed.style = styles[parsed.dir][parsed.ort];
6487    return parsed;
6488}
6489//endregion
6490function scope(target, options, originalOptions) {
6491    var actions = getActions();
6492    var supportsTouchActionNone = getSupportsTouchActionNone();
6493    var supportsPassive = supportsTouchActionNone && getSupportsPassive();
6494    // All variables local to 'scope' are prefixed with 'scope_'
6495    // Slider DOM Nodes
6496    var scope_Target = target;
6497    var scope_Base;
6498    var scope_ConnectBase;
6499    var scope_Handles;
6500    var scope_Connects;
6501    var scope_Pips;
6502    var scope_Tooltips;
6503    // Slider state values
6504    var scope_Spectrum = options.spectrum;
6505    var scope_Values = [];
6506    var scope_Locations = [];
6507    var scope_HandleNumbers = [];
6508    var scope_ActiveHandlesCount = 0;
6509    var scope_Events = {};
6510    var scope_ConnectsInverted = false;
6511    // Document Nodes
6512    var scope_Document = target.ownerDocument;
6513    var scope_DocumentElement = options.documentElement || scope_Document.documentElement;
6514    var scope_Body = scope_Document.body;
6515    // For horizontal sliders in standard ltr documents,
6516    // make .noUi-origin overflow to the left so the document doesn't scroll.
6517    var scope_DirOffset = scope_Document.dir === "rtl" || options.ort === 1 ? 0 : 100;
6518    // Creates a node, adds it to target, returns the new node.
6519    function addNodeTo(addTarget, className) {
6520        var div = scope_Document.createElement("div");
6521        if (className) {
6522            addClass(div, className);
6523        }
6524        addTarget.appendChild(div);
6525        return div;
6526    }
6527    // Append a origin to the base
6528    function addOrigin(base, handleNumber) {
6529        var origin = addNodeTo(base, options.cssClasses.origin);
6530        var handle = addNodeTo(origin, options.cssClasses.handle);
6531        addNodeTo(handle, options.cssClasses.touchArea);
6532        handle.setAttribute("data-handle", String(handleNumber));
6533        if (options.keyboardSupport) {
6534            // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex
6535            // 0 = focusable and reachable
6536            handle.setAttribute("tabindex", "0");
6537            handle.addEventListener("keydown", function (event) {
6538                return eventKeydown(event, handleNumber);
6539            });
6540        }
6541        if (options.handleAttributes !== undefined) {
6542            var attributes_1 = options.handleAttributes[handleNumber];
6543            Object.keys(attributes_1).forEach(function (attribute) {
6544                handle.setAttribute(attribute, attributes_1[attribute]);
6545            });
6546        }
6547        handle.setAttribute("role", "slider");
6548        handle.setAttribute("aria-orientation", options.ort ? "vertical" : "horizontal");
6549        if (handleNumber === 0) {
6550            addClass(handle, options.cssClasses.handleLower);
6551        }
6552        else if (handleNumber === options.handles - 1) {
6553            addClass(handle, options.cssClasses.handleUpper);
6554        }
6555        origin.handle = handle;
6556        return origin;
6557    }
6558    // Insert nodes for connect elements
6559    function addConnect(base, add) {
6560        if (!add) {
6561            return false;
6562        }
6563        return addNodeTo(base, options.cssClasses.connect);
6564    }
6565    // Add handles to the slider base.
6566    function addElements(connectOptions, base) {
6567        scope_ConnectBase = addNodeTo(base, options.cssClasses.connects);
6568        scope_Handles = [];
6569        scope_Connects = [];
6570        scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[0]));
6571        // [::::O====O====O====]
6572        // connectOptions = [0, 1, 1, 1]
6573        for (var i = 0; i < options.handles; i++) {
6574            // Keep a list of all added handles.
6575            scope_Handles.push(addOrigin(base, i));
6576            scope_HandleNumbers[i] = i;
6577            scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[i + 1]));
6578        }
6579    }
6580    // Initialize a single slider.
6581    function addSlider(addTarget) {
6582        // Apply classes and data to the target.
6583        addClass(addTarget, options.cssClasses.target);
6584        if (options.dir === 0) {
6585            addClass(addTarget, options.cssClasses.ltr);
6586        }
6587        else {
6588            addClass(addTarget, options.cssClasses.rtl);
6589        }
6590        if (options.ort === 0) {
6591            addClass(addTarget, options.cssClasses.horizontal);
6592        }
6593        else {
6594            addClass(addTarget, options.cssClasses.vertical);
6595        }
6596        var textDirection = getComputedStyle(addTarget).direction;
6597        if (textDirection === "rtl") {
6598            addClass(addTarget, options.cssClasses.textDirectionRtl);
6599        }
6600        else {
6601            addClass(addTarget, options.cssClasses.textDirectionLtr);
6602        }
6603        return addNodeTo(addTarget, options.cssClasses.base);
6604    }
6605    function addTooltip(handle, handleNumber) {
6606        if (!options.tooltips || !options.tooltips[handleNumber]) {
6607            return false;
6608        }
6609        return addNodeTo(handle.firstChild, options.cssClasses.tooltip);
6610    }
6611    function isSliderDisabled() {
6612        return scope_Target.hasAttribute("disabled");
6613    }
6614    // Disable the slider dragging if any handle is disabled
6615    function isHandleDisabled(handleNumber) {
6616        var handleOrigin = scope_Handles[handleNumber];
6617        return handleOrigin.hasAttribute("disabled");
6618    }
6619    function disable(handleNumber) {
6620        if (handleNumber !== null && handleNumber !== undefined) {
6621            scope_Handles[handleNumber].setAttribute("disabled", "");
6622            scope_Handles[handleNumber].handle.removeAttribute("tabindex");
6623        }
6624        else {
6625            scope_Target.setAttribute("disabled", "");
6626            scope_Handles.forEach(function (handle) {
6627                handle.handle.removeAttribute("tabindex");
6628            });
6629        }
6630    }
6631    function enable(handleNumber) {
6632        if (handleNumber !== null && handleNumber !== undefined) {
6633            scope_Handles[handleNumber].removeAttribute("disabled");
6634            scope_Handles[handleNumber].handle.setAttribute("tabindex", "0");
6635        }
6636        else {
6637            scope_Target.removeAttribute("disabled");
6638            scope_Handles.forEach(function (handle) {
6639                handle.removeAttribute("disabled");
6640                handle.handle.setAttribute("tabindex", "0");
6641            });
6642        }
6643    }
6644    function removeTooltips() {
6645        if (scope_Tooltips) {
6646            removeEvent("update" + INTERNAL_EVENT_NS.tooltips);
6647            scope_Tooltips.forEach(function (tooltip) {
6648                if (tooltip) {
6649                    removeElement(tooltip);
6650                }
6651            });
6652            scope_Tooltips = null;
6653        }
6654    }
6655    // The tooltips option is a shorthand for using the 'update' event.
6656    function tooltips() {
6657        removeTooltips();
6658        // Tooltips are added with options.tooltips in original order.
6659        scope_Tooltips = scope_Handles.map(addTooltip);
6660        bindEvent("update" + INTERNAL_EVENT_NS.tooltips, function (values, handleNumber, unencoded) {
6661            if (!scope_Tooltips || !options.tooltips) {
6662                return;
6663            }
6664            if (scope_Tooltips[handleNumber] === false) {
6665                return;
6666            }
6667            var formattedValue = values[handleNumber];
6668            if (options.tooltips[handleNumber] !== true) {
6669                formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);
6670            }
6671            scope_Tooltips[handleNumber].innerHTML = formattedValue;
6672        });
6673    }
6674    function aria() {
6675        removeEvent("update" + INTERNAL_EVENT_NS.aria);
6676        bindEvent("update" + INTERNAL_EVENT_NS.aria, function (values, handleNumber, unencoded, tap, positions) {
6677            // Update Aria Values for all handles, as a change in one changes min and max values for the next.
6678            scope_HandleNumbers.forEach(function (index) {
6679                var handle = scope_Handles[index];
6680                var min = checkHandlePosition(scope_Locations, index, 0, true, true, true);
6681                var max = checkHandlePosition(scope_Locations, index, 100, true, true, true);
6682                var now = positions[index];
6683                // Formatted value for display
6684                var text = String(options.ariaFormat.to(unencoded[index]));
6685                // Map to slider range values
6686                min = scope_Spectrum.fromStepping(min).toFixed(1);
6687                max = scope_Spectrum.fromStepping(max).toFixed(1);
6688                now = scope_Spectrum.fromStepping(now).toFixed(1);
6689                handle.children[0].setAttribute("aria-valuemin", min);
6690                handle.children[0].setAttribute("aria-valuemax", max);
6691                handle.children[0].setAttribute("aria-valuenow", now);
6692                handle.children[0].setAttribute("aria-valuetext", text);
6693            });
6694        });
6695    }
6696    function getGroup(pips) {
6697        // Use the range.
6698        if (pips.mode === PipsMode.Range || pips.mode === PipsMode.Steps) {
6699            return scope_Spectrum.xVal;
6700        }
6701        if (pips.mode === PipsMode.Count) {
6702            if (pips.values < 2) {
6703                throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'.");
6704            }
6705            // Divide 0 - 100 in 'count' parts.
6706            var interval = pips.values - 1;
6707            var spread = 100 / interval;
6708            var values = [];
6709            // List these parts and have them handled as 'positions'.
6710            while (interval--) {
6711                values[interval] = interval * spread;
6712            }
6713            values.push(100);
6714            return mapToRange(values, pips.stepped);
6715        }
6716        if (pips.mode === PipsMode.Positions) {
6717            // Map all percentages to on-range values.
6718            return mapToRange(pips.values, pips.stepped);
6719        }
6720        if (pips.mode === PipsMode.Values) {
6721            // If the value must be stepped, it needs to be converted to a percentage first.
6722            if (pips.stepped) {
6723                return pips.values.map(function (value) {
6724                    // Convert to percentage, apply step, return to value.
6725                    return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value)));
6726                });
6727            }
6728            // Otherwise, we can simply use the values.
6729            return pips.values;
6730        }
6731        return []; // pips.mode = never
6732    }
6733    function mapToRange(values, stepped) {
6734        return values.map(function (value) {
6735            return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value);
6736        });
6737    }
6738    function generateSpread(pips) {
6739        function safeIncrement(value, increment) {
6740            // Avoid floating point variance by dropping the smallest decimal places.
6741            return Number((value + increment).toFixed(7));
6742        }
6743        var group = getGroup(pips);
6744        var indexes = {};
6745        var firstInRange = scope_Spectrum.xVal[0];
6746        var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1];
6747        var ignoreFirst = false;
6748        var ignoreLast = false;
6749        var prevPct = 0;
6750        // Create a copy of the group, sort it and filter away all duplicates.
6751        group = unique(group.slice().sort(function (a, b) {
6752            return a - b;
6753        }));
6754        // Make sure the range starts with the first element.
6755        if (group[0] !== firstInRange) {
6756            group.unshift(firstInRange);
6757            ignoreFirst = true;
6758        }
6759        // Likewise for the last one.
6760        if (group[group.length - 1] !== lastInRange) {
6761            group.push(lastInRange);
6762            ignoreLast = true;
6763        }
6764        group.forEach(function (current, index) {
6765            // Get the current step and the lower + upper positions.
6766            var step;
6767            var i;
6768            var q;
6769            var low = current;
6770            var high = group[index + 1];
6771            var newPct;
6772            var pctDifference;
6773            var pctPos;
6774            var type;
6775            var steps;
6776            var realSteps;
6777            var stepSize;
6778            var isSteps = pips.mode === PipsMode.Steps;
6779            // When using 'steps' mode, use the provided steps.
6780            // Otherwise, we'll step on to the next subrange.
6781            if (isSteps) {
6782                step = scope_Spectrum.xNumSteps[index];
6783            }
6784            // Default to a 'full' step.
6785            if (!step) {
6786                step = high - low;
6787            }
6788            // If high is undefined we are at the last subrange. Make sure it iterates once (#1088)
6789            if (high === undefined) {
6790                high = low;
6791            }
6792            // Make sure step isn't 0, which would cause an infinite loop (#654)
6793            step = Math.max(step, 0.0000001);
6794            // Find all steps in the subrange.
6795            for (i = low; i <= high; i = safeIncrement(i, step)) {
6796                // Get the percentage value for the current step,
6797                // calculate the size for the subrange.
6798                newPct = scope_Spectrum.toStepping(i);
6799                pctDifference = newPct - prevPct;
6800                steps = pctDifference / (pips.density || 1);
6801                realSteps = Math.round(steps);
6802                // This ratio represents the amount of percentage-space a point indicates.
6803                // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided.
6804                // Round the percentage offset to an even number, then divide by two
6805                // to spread the offset on both sides of the range.
6806                stepSize = pctDifference / realSteps;
6807                // Divide all points evenly, adding the correct number to this subrange.
6808                // Run up to <= so that 100% gets a point, event if ignoreLast is set.
6809                for (q = 1; q <= realSteps; q += 1) {
6810                    // The ratio between the rounded value and the actual size might be ~1% off.
6811                    // Correct the percentage offset by the number of points
6812                    // per subrange. density = 1 will result in 100 points on the
6813                    // full range, 2 for 50, 4 for 25, etc.
6814                    pctPos = prevPct + q * stepSize;
6815                    indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0];
6816                }
6817                // Determine the point type.
6818                type = group.indexOf(i) > -1 ? PipsType.LargeValue : isSteps ? PipsType.SmallValue : PipsType.NoValue;
6819                // Enforce the 'ignoreFirst' option by overwriting the type for 0.
6820                if (!index && ignoreFirst && i !== high) {
6821                    type = 0;
6822                }
6823                if (!(i === high && ignoreLast)) {
6824                    // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.
6825                    indexes[newPct.toFixed(5)] = [i, type];
6826                }
6827                // Update the percentage count.
6828                prevPct = newPct;
6829            }
6830        });
6831        return indexes;
6832    }
6833    function addMarking(spread, filterFunc, formatter) {
6834        var _a, _b;
6835        var element = scope_Document.createElement("div");
6836        var valueSizeClasses = (_a = {},
6837            _a[PipsType.None] = "",
6838            _a[PipsType.NoValue] = options.cssClasses.valueNormal,
6839            _a[PipsType.LargeValue] = options.cssClasses.valueLarge,
6840            _a[PipsType.SmallValue] = options.cssClasses.valueSub,
6841            _a);
6842        var markerSizeClasses = (_b = {},
6843            _b[PipsType.None] = "",
6844            _b[PipsType.NoValue] = options.cssClasses.markerNormal,
6845            _b[PipsType.LargeValue] = options.cssClasses.markerLarge,
6846            _b[PipsType.SmallValue] = options.cssClasses.markerSub,
6847            _b);
6848        var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical];
6849        var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical];
6850        addClass(element, options.cssClasses.pips);
6851        addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);
6852        function getClasses(type, source) {
6853            var a = source === options.cssClasses.value;
6854            var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;
6855            var sizeClasses = a ? valueSizeClasses : markerSizeClasses;
6856            return source + " " + orientationClasses[options.ort] + " " + sizeClasses[type];
6857        }
6858        function addSpread(offset, value, type) {
6859            // Apply the filter function, if it is set.
6860            type = filterFunc ? filterFunc(value, type) : type;
6861            if (type === PipsType.None) {
6862                return;
6863            }
6864            // Add a marker for every point
6865            var node = addNodeTo(element, false);
6866            node.className = getClasses(type, options.cssClasses.marker);
6867            node.style[options.style] = offset + "%";
6868            // Values are only appended for points marked '1' or '2'.
6869            if (type > PipsType.NoValue) {
6870                node = addNodeTo(element, false);
6871                node.className = getClasses(type, options.cssClasses.value);
6872                node.setAttribute("data-value", String(value));
6873                node.style[options.style] = offset + "%";
6874                node.innerHTML = String(formatter.to(value));
6875            }
6876        }
6877        // Append all points.
6878        Object.keys(spread).forEach(function (offset) {
6879            addSpread(offset, spread[offset][0], spread[offset][1]);
6880        });
6881        return element;
6882    }
6883    function removePips() {
6884        if (scope_Pips) {
6885            removeElement(scope_Pips);
6886            scope_Pips = null;
6887        }
6888    }
6889    function pips(pips) {
6890        // Fix #669
6891        removePips();
6892        var spread = generateSpread(pips);
6893        var filter = pips.filter;
6894        var format = pips.format || {
6895            to: function (value) {
6896                return String(Math.round(value));
6897            },
6898        };
6899        scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format));
6900        return scope_Pips;
6901    }
6902    // Shorthand for base dimensions.
6903    function baseSize() {
6904        var rect = scope_Base.getBoundingClientRect();
6905        var alt = ("offset" + ["Width", "Height"][options.ort]);
6906        return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt];
6907    }
6908    // Handler for attaching events trough a proxy.
6909    function attachEvent(events, element, callback, data) {
6910        // This function can be used to 'filter' events to the slider.
6911        // element is a node, not a nodeList
6912        var method = function (event) {
6913            var e = fixEvent(event, data.pageOffset, data.target || element);
6914            // fixEvent returns false if this event has a different target
6915            // when handling (multi-) touch events;
6916            if (!e) {
6917                return false;
6918            }
6919            // doNotReject is passed by all end events to make sure released touches
6920            // are not rejected, leaving the slider "stuck" to the cursor;
6921            if (isSliderDisabled() && !data.doNotReject) {
6922                return false;
6923            }
6924            // Stop if an active 'tap' transition is taking place.
6925            if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) {
6926                return false;
6927            }
6928            // Ignore right or middle clicks on start #454
6929            if (events === actions.start && e.buttons !== undefined && e.buttons > 1) {
6930                return false;
6931            }
6932            // Ignore right or middle clicks on start #454
6933            if (data.hover && e.buttons) {
6934                return false;
6935            }
6936            // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.
6937            // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support
6938            // touch-action: manipulation, but that allows panning, which breaks
6939            // sliders after zooming/on non-responsive pages.
6940            // See: https://bugs.webkit.org/show_bug.cgi?id=133112
6941            if (!supportsPassive) {
6942                e.preventDefault();
6943            }
6944            e.calcPoint = e.points[options.ort];
6945            // Call the event handler with the event [ and additional data ].
6946            callback(e, data);
6947            return;
6948        };
6949        var methods = [];
6950        // Bind a closure on the target for every event type.
6951        events.split(" ").forEach(function (eventName) {
6952            element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);
6953            methods.push([eventName, method]);
6954        });
6955        return methods;
6956    }
6957    // Provide a clean event with standardized offset values.
6958    function fixEvent(e, pageOffset, eventTarget) {
6959        // Filter the event to register the type, which can be
6960        // touch, mouse or pointer. Offset changes need to be
6961        // made on an event specific basis.
6962        var touch = e.type.indexOf("touch") === 0;
6963        var mouse = e.type.indexOf("mouse") === 0;
6964        var pointer = e.type.indexOf("pointer") === 0;
6965        var x = 0;
6966        var y = 0;
6967        // IE10 implemented pointer events with a prefix;
6968        if (e.type.indexOf("MSPointer") === 0) {
6969            pointer = true;
6970        }
6971        // Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with
6972        // the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore
6973        // events that have no touches or buttons associated with them. (#1057, #1079, #1095)
6974        if (e.type === "mousedown" && !e.buttons && !e.touches) {
6975            return false;
6976        }
6977        // The only thing one handle should be concerned about is the touches that originated on top of it.
6978        if (touch) {
6979            // Returns true if a touch originated on the target.
6980            var isTouchOnTarget = function (checkTouch) {
6981                var target = checkTouch.target;
6982                return (target === eventTarget ||
6983                    eventTarget.contains(target) ||
6984                    (e.composed && e.composedPath().shift() === eventTarget));
6985            };
6986            // In the case of touchstart events, we need to make sure there is still no more than one
6987            // touch on the target so we look amongst all touches.
6988            if (e.type === "touchstart") {
6989                var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget);
6990                // Do not support more than one touch per handle.
6991                if (targetTouches.length > 1) {
6992                    return false;
6993                }
6994                x = targetTouches[0].pageX;
6995                y = targetTouches[0].pageY;
6996            }
6997            else {
6998                // In the other cases, find on changedTouches is enough.
6999                var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget);
7000                // Cancel if the target touch has not moved.
7001                if (!targetTouch) {
7002                    return false;
7003                }
7004                x = targetTouch.pageX;
7005                y = targetTouch.pageY;
7006            }
7007        }
7008        pageOffset = pageOffset || getPageOffset(scope_Document);
7009        if (mouse || pointer) {
7010            x = e.clientX + pageOffset.x;
7011            y = e.clientY + pageOffset.y;
7012        }
7013        e.pageOffset = pageOffset;
7014        e.points = [x, y];
7015        e.cursor = mouse || pointer; // Fix #435
7016        return e;
7017    }
7018    // Translate a coordinate in the document to a percentage on the slider
7019    function calcPointToPercentage(calcPoint) {
7020        var location = calcPoint - offset(scope_Base, options.ort);
7021        var proposal = (location * 100) / baseSize();
7022        // Clamp proposal between 0% and 100%
7023        // Out-of-bound coordinates may occur when .noUi-base pseudo-elements
7024        // are used (e.g. contained handles feature)
7025        proposal = limit(proposal);
7026        return options.dir ? 100 - proposal : proposal;
7027    }
7028    // Find handle closest to a certain percentage on the slider
7029    function getClosestHandle(clickedPosition) {
7030        var smallestDifference = 100;
7031        var handleNumber = false;
7032        scope_Handles.forEach(function (handle, index) {
7033            // Disabled handles are ignored
7034            if (isHandleDisabled(index)) {
7035                return;
7036            }
7037            var handlePosition = scope_Locations[index];
7038            var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition);
7039            // Initial state
7040            var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100;
7041            // Difference with this handle is smaller than the previously checked handle
7042            var isCloser = differenceWithThisHandle < smallestDifference;
7043            var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition;
7044            if (isCloser || isCloserAfter || clickAtEdge) {
7045                handleNumber = index;
7046                smallestDifference = differenceWithThisHandle;
7047            }
7048        });
7049        return handleNumber;
7050    }
7051    // Fire 'end' when a mouse or pen leaves the document.
7052    function documentLeave(event, data) {
7053        if (event.type === "mouseout" &&
7054            event.target.nodeName === "HTML" &&
7055            event.relatedTarget === null) {
7056            eventEnd(event, data);
7057        }
7058    }
7059    // Handle movement on document for handle and range drag.
7060    function eventMove(event, data) {
7061        // Fix #498
7062        // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).
7063        // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero
7064        // IE9 has .buttons and .which zero on mousemove.
7065        // Firefox breaks the spec MDN defines.
7066        if (navigator.appVersion.indexOf("MSIE 9") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) {
7067            return eventEnd(event, data);
7068        }
7069        // Check if we are moving up or down
7070        var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);
7071        // Convert the movement into a percentage of the slider width/height
7072        var proposal = (movement * 100) / data.baseSize;
7073        moveHandles(movement > 0, proposal, data.locations, data.handleNumbers, data.connect);
7074    }
7075    // Unbind move events on document, call callbacks.
7076    function eventEnd(event, data) {
7077        // The handle is no longer active, so remove the class.
7078        if (data.handle) {
7079            removeClass(data.handle, options.cssClasses.active);
7080            scope_ActiveHandlesCount -= 1;
7081        }
7082        // Unbind the move and end events, which are added on 'start'.
7083        data.listeners.forEach(function (c) {
7084            scope_DocumentElement.removeEventListener(c[0], c[1]);
7085        });
7086        if (scope_ActiveHandlesCount === 0) {
7087            // Remove dragging class.
7088            removeClass(scope_Target, options.cssClasses.drag);
7089            setZindex();
7090            // Remove cursor styles and text-selection events bound to the body.
7091            if (event.cursor) {
7092                scope_Body.style.cursor = "";
7093                scope_Body.removeEventListener("selectstart", preventDefault);
7094            }
7095        }
7096        if (options.events.smoothSteps) {
7097            data.handleNumbers.forEach(function (handleNumber) {
7098                setHandle(handleNumber, scope_Locations[handleNumber], true, true, false, false);
7099            });
7100            data.handleNumbers.forEach(function (handleNumber) {
7101                fireEvent("update", handleNumber);
7102            });
7103        }
7104        data.handleNumbers.forEach(function (handleNumber) {
7105            fireEvent("change", handleNumber);
7106            fireEvent("set", handleNumber);
7107            fireEvent("end", handleNumber);
7108        });
7109    }
7110    // Bind move events on document.
7111    function eventStart(event, data) {
7112        // Ignore event if any handle is disabled
7113        if (data.handleNumbers.some(isHandleDisabled)) {
7114            return;
7115        }
7116        var handle;
7117        if (data.handleNumbers.length === 1) {
7118            var handleOrigin = scope_Handles[data.handleNumbers[0]];
7119            handle = handleOrigin.children[0];
7120            scope_ActiveHandlesCount += 1;
7121            // Mark the handle as 'active' so it can be styled.
7122            addClass(handle, options.cssClasses.active);
7123        }
7124        // A drag should never propagate up to the 'tap' event.
7125        event.stopPropagation();
7126        // Record the event listeners.
7127        var listeners = [];
7128        // Attach the move and end events.
7129        var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {
7130            // The event target has changed so we need to propagate the original one so that we keep
7131            // relying on it to extract target touches.
7132            target: event.target,
7133            handle: handle,
7134            connect: data.connect,
7135            listeners: listeners,
7136            startCalcPoint: event.calcPoint,
7137            baseSize: baseSize(),
7138            pageOffset: event.pageOffset,
7139            handleNumbers: data.handleNumbers,
7140            buttonsProperty: event.buttons,
7141            locations: scope_Locations.slice(),
7142        });
7143        var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {
7144            target: event.target,
7145            handle: handle,
7146            listeners: listeners,
7147            doNotReject: true,
7148            handleNumbers: data.handleNumbers,
7149        });
7150        var outEvent = attachEvent("mouseout", scope_DocumentElement, documentLeave, {
7151            target: event.target,
7152            handle: handle,
7153            listeners: listeners,
7154            doNotReject: true,
7155            handleNumbers: data.handleNumbers,
7156        });
7157        // We want to make sure we pushed the listeners in the listener list rather than creating
7158        // a new one as it has already been passed to the event handlers.
7159        listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent));
7160        // Text selection isn't an issue on touch devices,
7161        // so adding cursor styles can be skipped.
7162        if (event.cursor) {
7163            // Prevent the 'I' cursor and extend the range-drag cursor.
7164            scope_Body.style.cursor = getComputedStyle(event.target).cursor;
7165            // Mark the target with a dragging state.
7166            if (scope_Handles.length > 1) {
7167                addClass(scope_Target, options.cssClasses.drag);
7168            }
7169            // Prevent text selection when dragging the handles.
7170            // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,
7171            // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,
7172            // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.
7173            // The 'cursor' flag is false.
7174            // See: http://caniuse.com/#search=selectstart
7175            scope_Body.addEventListener("selectstart", preventDefault, false);
7176        }
7177        data.handleNumbers.forEach(function (handleNumber) {
7178            fireEvent("start", handleNumber);
7179        });
7180    }
7181    // Move closest handle to tapped location.
7182    function eventTap(event) {
7183        // The tap event shouldn't propagate up
7184        event.stopPropagation();
7185        var proposal = calcPointToPercentage(event.calcPoint);
7186        var handleNumber = getClosestHandle(proposal);
7187        // Tackle the case that all handles are 'disabled'.
7188        if (handleNumber === false) {
7189            return;
7190        }
7191        // Flag the slider as it is now in a transitional state.
7192        // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.
7193        if (!options.events.snap) {
7194            addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);
7195        }
7196        setHandle(handleNumber, proposal, true, true);
7197        setZindex();
7198        fireEvent("slide", handleNumber, true);
7199        fireEvent("update", handleNumber, true);
7200        if (!options.events.snap) {
7201            fireEvent("change", handleNumber, true);
7202            fireEvent("set", handleNumber, true);
7203        }
7204        else {
7205            eventStart(event, { handleNumbers: [handleNumber] });
7206        }
7207    }
7208    // Fires a 'hover' event for a hovered mouse/pen position.
7209    function eventHover(event) {
7210        var proposal = calcPointToPercentage(event.calcPoint);
7211        var to = scope_Spectrum.getStep(proposal);
7212        var value = scope_Spectrum.fromStepping(to);
7213        Object.keys(scope_Events).forEach(function (targetEvent) {
7214            if ("hover" === targetEvent.split(".")[0]) {
7215                scope_Events[targetEvent].forEach(function (callback) {
7216                    callback.call(scope_Self, value);
7217                });
7218            }
7219        });
7220    }
7221    // Handles keydown on focused handles
7222    // Don't move the document when pressing arrow keys on focused handles
7223    function eventKeydown(event, handleNumber) {
7224        if (isSliderDisabled() || isHandleDisabled(handleNumber)) {
7225            return false;
7226        }
7227        var horizontalKeys = ["Left", "Right"];
7228        var verticalKeys = ["Down", "Up"];
7229        var largeStepKeys = ["PageDown", "PageUp"];
7230        var edgeKeys = ["Home", "End"];
7231        if (options.dir && !options.ort) {
7232            // On an right-to-left slider, the left and right keys act inverted
7233            horizontalKeys.reverse();
7234        }
7235        else if (options.ort && !options.dir) {
7236            // On a top-to-bottom slider, the up and down keys act inverted
7237            verticalKeys.reverse();
7238            largeStepKeys.reverse();
7239        }
7240        // Strip "Arrow" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
7241        var key = event.key.replace("Arrow", "");
7242        var isLargeDown = key === largeStepKeys[0];
7243        var isLargeUp = key === largeStepKeys[1];
7244        var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown;
7245        var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp;
7246        var isMin = key === edgeKeys[0];
7247        var isMax = key === edgeKeys[1];
7248        if (!isDown && !isUp && !isMin && !isMax) {
7249            return true;
7250        }
7251        event.preventDefault();
7252        var to;
7253        if (isUp || isDown) {
7254            var direction = isDown ? 0 : 1;
7255            var steps = getNextStepsForHandle(handleNumber);
7256            var step = steps[direction];
7257            // At the edge of a slider, do nothing
7258            if (step === null) {
7259                return false;
7260            }
7261            // No step set, use the default of 10% of the sub-range
7262            if (step === false) {
7263                step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, options.keyboardDefaultStep);
7264            }
7265            if (isLargeUp || isLargeDown) {
7266                step *= options.keyboardPageMultiplier;
7267            }
7268            else {
7269                step *= options.keyboardMultiplier;
7270            }
7271            // Step over zero-length ranges (#948);
7272            step = Math.max(step, 0.0000001);
7273            // Decrement for down steps
7274            step = (isDown ? -1 : 1) * step;
7275            to = scope_Values[handleNumber] + step;
7276        }
7277        else if (isMax) {
7278            // End key
7279            to = options.spectrum.xVal[options.spectrum.xVal.length - 1];
7280        }
7281        else {
7282            // Home key
7283            to = options.spectrum.xVal[0];
7284        }
7285        setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true);
7286        fireEvent("slide", handleNumber);
7287        fireEvent("update", handleNumber);
7288        fireEvent("change", handleNumber);
7289        fireEvent("set", handleNumber);
7290        return false;
7291    }
7292    // Attach events to several slider parts.
7293    function bindSliderEvents(behaviour) {
7294        // Attach the standard drag event to the handles.
7295        if (!behaviour.fixed) {
7296            scope_Handles.forEach(function (handle, index) {
7297                // These events are only bound to the visual handle
7298                // element, not the 'real' origin element.
7299                attachEvent(actions.start, handle.children[0], eventStart, {
7300                    handleNumbers: [index],
7301                });
7302            });
7303        }
7304        // Attach the tap event to the slider base.
7305        if (behaviour.tap) {
7306            attachEvent(actions.start, scope_Base, eventTap, {});
7307        }
7308        // Fire hover events
7309        if (behaviour.hover) {
7310            attachEvent(actions.move, scope_Base, eventHover, {
7311                hover: true,
7312            });
7313        }
7314        // Make the range draggable.
7315        if (behaviour.drag) {
7316            scope_Connects.forEach(function (connect, index) {
7317                if (connect === false || index === 0 || index === scope_Connects.length - 1) {
7318                    return;
7319                }
7320                var handleBefore = scope_Handles[index - 1];
7321                var handleAfter = scope_Handles[index];
7322                var eventHolders = [connect];
7323                var handlesToDrag = [handleBefore, handleAfter];
7324                var handleNumbersToDrag = [index - 1, index];
7325                addClass(connect, options.cssClasses.draggable);
7326                // When the range is fixed, the entire range can
7327                // be dragged by the handles. The handle in the first
7328                // origin will propagate the start event upward,
7329                // but it needs to be bound manually on the other.
7330                if (behaviour.fixed) {
7331                    eventHolders.push(handleBefore.children[0]);
7332                    eventHolders.push(handleAfter.children[0]);
7333                }
7334                if (behaviour.dragAll) {
7335                    handlesToDrag = scope_Handles;
7336                    handleNumbersToDrag = scope_HandleNumbers;
7337                }
7338                eventHolders.forEach(function (eventHolder) {
7339                    attachEvent(actions.start, eventHolder, eventStart, {
7340                        handles: handlesToDrag,
7341                        handleNumbers: handleNumbersToDrag,
7342                        connect: connect,
7343                    });
7344                });
7345            });
7346        }
7347    }
7348    // Attach an event to this slider, possibly including a namespace
7349    function bindEvent(namespacedEvent, callback) {
7350        scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];
7351        scope_Events[namespacedEvent].push(callback);
7352        // If the event bound is 'update,' fire it immediately for all handles.
7353        if (namespacedEvent.split(".")[0] === "update") {
7354            scope_Handles.forEach(function (a, index) {
7355                fireEvent("update", index);
7356            });
7357        }
7358    }
7359    function isInternalNamespace(namespace) {
7360        return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips;
7361    }
7362    // Undo attachment of event
7363    function removeEvent(namespacedEvent) {
7364        var event = namespacedEvent && namespacedEvent.split(".")[0];
7365        var namespace = event ? namespacedEvent.substring(event.length) : namespacedEvent;
7366        Object.keys(scope_Events).forEach(function (bind) {
7367            var tEvent = bind.split(".")[0];
7368            var tNamespace = bind.substring(tEvent.length);
7369            if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) {
7370                // only delete protected internal event if intentional
7371                if (!isInternalNamespace(tNamespace) || namespace === tNamespace) {
7372                    delete scope_Events[bind];
7373                }
7374            }
7375        });
7376    }
7377    // External event handling
7378    function fireEvent(eventName, handleNumber, tap) {
7379        Object.keys(scope_Events).forEach(function (targetEvent) {
7380            var eventType = targetEvent.split(".")[0];
7381            if (eventName === eventType) {
7382                scope_Events[targetEvent].forEach(function (callback) {
7383                    callback.call(
7384                    // Use the slider public API as the scope ('this')
7385                    scope_Self, 
7386                    // Return values as array, so arg_1[arg_2] is always valid.
7387                    scope_Values.map(options.format.to), 
7388                    // Handle index, 0 or 1
7389                    handleNumber, 
7390                    // Un-formatted slider values
7391                    scope_Values.slice(), 
7392                    // Event is fired by tap, true or false
7393                    tap || false, 
7394                    // Left offset of the handle, in relation to the slider
7395                    scope_Locations.slice(), 
7396                    // add the slider public API to an accessible parameter when this is unavailable
7397                    scope_Self);
7398                });
7399            }
7400        });
7401    }
7402    // Split out the handle positioning logic so the Move event can use it, too
7403    function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps) {
7404        var distance;
7405        // For sliders with multiple handles, limit movement to the other handle.
7406        // Apply the margin option by adding it to the handle positions.
7407        if (scope_Handles.length > 1 && !options.events.unconstrained) {
7408            if (lookBackward && handleNumber > 0) {
7409                distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, false);
7410                to = Math.max(to, distance);
7411            }
7412            if (lookForward && handleNumber < scope_Handles.length - 1) {
7413                distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, true);
7414                to = Math.min(to, distance);
7415            }
7416        }
7417        // The limit option has the opposite effect, limiting handles to a
7418        // maximum distance from another. Limit must be > 0, as otherwise
7419        // handles would be unmovable.
7420        if (scope_Handles.length > 1 && options.limit) {
7421            if (lookBackward && handleNumber > 0) {
7422                distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, false);
7423                to = Math.min(to, distance);
7424            }
7425            if (lookForward && handleNumber < scope_Handles.length - 1) {
7426                distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, true);
7427                to = Math.max(to, distance);
7428            }
7429        }
7430        // The padding option keeps the handles a certain distance from the
7431        // edges of the slider. Padding must be > 0.
7432        if (options.padding) {
7433            if (handleNumber === 0) {
7434                distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], false);
7435                to = Math.max(to, distance);
7436            }
7437            if (handleNumber === scope_Handles.length - 1) {
7438                distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], true);
7439                to = Math.min(to, distance);
7440            }
7441        }
7442        if (!smoothSteps) {
7443            to = scope_Spectrum.getStep(to);
7444        }
7445        // Limit percentage to the 0 - 100 range
7446        to = limit(to);
7447        // Return false if handle can't move
7448        if (to === reference[handleNumber] && !getValue) {
7449            return false;
7450        }
7451        return to;
7452    }
7453    // Uses slider orientation to create CSS rules. a = base value;
7454    function inRuleOrder(v, a) {
7455        var o = options.ort;
7456        return (o ? a : v) + ", " + (o ? v : a);
7457    }
7458    // Moves handle(s) by a percentage
7459    // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])
7460    function moveHandles(upward, proposal, locations, handleNumbers, connect) {
7461        var proposals = locations.slice();
7462        // Store first handle now, so we still have it in case handleNumbers is reversed
7463        var firstHandle = handleNumbers[0];
7464        var smoothSteps = options.events.smoothSteps;
7465        var b = [!upward, upward];
7466        var f = [upward, !upward];
7467        // Copy handleNumbers so we don't change the dataset
7468        handleNumbers = handleNumbers.slice();
7469        // Check to see which handle is 'leading'.
7470        // If that one can't move the second can't either.
7471        if (upward) {
7472            handleNumbers.reverse();
7473        }
7474        // Step 1: get the maximum percentage that any of the handles can move
7475        if (handleNumbers.length > 1) {
7476            handleNumbers.forEach(function (handleNumber, o) {
7477                var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false, smoothSteps);
7478                // Stop if one of the handles can't move.
7479                if (to === false) {
7480                    proposal = 0;
7481                }
7482                else {
7483                    proposal = to - proposals[handleNumber];
7484                    proposals[handleNumber] = to;
7485                }
7486            });
7487        }
7488        // If using one handle, check backward AND forward
7489        else {
7490            b = f = [true];
7491        }
7492        var state = false;
7493        // Step 2: Try to set the handles with the found percentage
7494        handleNumbers.forEach(function (handleNumber, o) {
7495            state =
7496                setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o], false, smoothSteps) || state;
7497        });
7498        // Step 3: If a handle moved, fire events
7499        if (state) {
7500            handleNumbers.forEach(function (handleNumber) {
7501                fireEvent("update", handleNumber);
7502                fireEvent("slide", handleNumber);
7503            });
7504            // If target is a connect, then fire drag event
7505            if (connect != undefined) {
7506                fireEvent("drag", firstHandle);
7507            }
7508        }
7509    }
7510    // Takes a base value and an offset. This offset is used for the connect bar size.
7511    // In the initial design for this feature, the origin element was 1% wide.
7512    // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature
7513    // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223
7514    function transformDirection(a, b) {
7515        return options.dir ? 100 - a - b : a;
7516    }
7517    // Updates scope_Locations and scope_Values, updates visual state
7518    function updateHandlePosition(handleNumber, to) {
7519        // Update locations.
7520        scope_Locations[handleNumber] = to;
7521        // Convert the value to the slider stepping/range.
7522        scope_Values[handleNumber] = scope_Spectrum.fromStepping(to);
7523        var translation = transformDirection(to, 0) - scope_DirOffset;
7524        var translateRule = "translate(" + inRuleOrder(translation + "%", "0") + ")";
7525        scope_Handles[handleNumber].style[options.transformRule] = translateRule;
7526        // sanity check for at least 2 handles (e.g. during setup)
7527        if (options.events.invertConnects && scope_Locations.length > 1) {
7528            // check if handles passed each other, but don't match the ConnectsInverted state
7529            var handlesAreInOrder = scope_Locations.every(function (position, index, locations) {
7530                return index === 0 || position >= locations[index - 1];
7531            });
7532            if (scope_ConnectsInverted !== !handlesAreInOrder) {
7533                // invert connects when handles pass each other
7534                invertConnects();
7535                // invertConnects already updates all connect elements
7536                return;
7537            }
7538        }
7539        updateConnect(handleNumber);
7540        updateConnect(handleNumber + 1);
7541        if (scope_ConnectsInverted) {
7542            // When connects are inverted, we also have to update adjacent connects
7543            updateConnect(handleNumber - 1);
7544            updateConnect(handleNumber + 2);
7545        }
7546    }
7547    // Handles before the slider middle are stacked later = higher,
7548    // Handles after the middle later is lower
7549    // [[7] [8] .......... | .......... [5] [4]
7550    function setZindex() {
7551        scope_HandleNumbers.forEach(function (handleNumber) {
7552            var dir = scope_Locations[handleNumber] > 50 ? -1 : 1;
7553            var zIndex = 3 + (scope_Handles.length + dir * handleNumber);
7554            scope_Handles[handleNumber].style.zIndex = String(zIndex);
7555        });
7556    }
7557    // Test suggested values and apply margin, step.
7558    // if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436)
7559    function setHandle(handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps) {
7560        if (!exactInput) {
7561            to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps);
7562        }
7563        if (to === false) {
7564            return false;
7565        }
7566        updateHandlePosition(handleNumber, to);
7567        return true;
7568    }
7569    // Updates style attribute for connect nodes
7570    function updateConnect(index) {
7571        // Skip connects set to false
7572        if (!scope_Connects[index]) {
7573            return;
7574        }
7575        // Create a copy of locations, so we can sort them for the local scope logic
7576        var locations = scope_Locations.slice();
7577        if (scope_ConnectsInverted) {
7578            locations.sort(function (a, b) {
7579                return a - b;
7580            });
7581        }
7582        var l = 0;
7583        var h = 100;
7584        if (index !== 0) {
7585            l = locations[index - 1];
7586        }
7587        if (index !== scope_Connects.length - 1) {
7588            h = locations[index];
7589        }
7590        // We use two rules:
7591        // 'translate' to change the left/top offset;
7592        // 'scale' to change the width of the element;
7593        // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base)
7594        var connectWidth = h - l;
7595        var translateRule = "translate(" + inRuleOrder(transformDirection(l, connectWidth) + "%", "0") + ")";
7596        var scaleRule = "scale(" + inRuleOrder(connectWidth / 100, "1") + ")";
7597        scope_Connects[index].style[options.transformRule] =
7598            translateRule + " " + scaleRule;
7599    }
7600    // Parses value passed to .set method. Returns current value if not parse-able.
7601    function resolveToValue(to, handleNumber) {
7602        // Setting with null indicates an 'ignore'.
7603        // Inputting 'false' is invalid.
7604        if (to === null || to === false || to === undefined) {
7605            return scope_Locations[handleNumber];
7606        }
7607        // If a formatted number was passed, attempt to decode it.
7608        if (typeof to === "number") {
7609            to = String(to);
7610        }
7611        to = options.format.from(to);
7612        if (to !== false) {
7613            to = scope_Spectrum.toStepping(to);
7614        }
7615        // If parsing the number failed, use the current value.
7616        if (to === false || isNaN(to)) {
7617            return scope_Locations[handleNumber];
7618        }
7619        return to;
7620    }
7621    // Set the slider value.
7622    function valueSet(input, fireSetEvent, exactInput) {
7623        var values = asArray(input);
7624        var isInit = scope_Locations[0] === undefined;
7625        // Event fires by default
7626        fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent;
7627        // Animation is optional.
7628        // Make sure the initial values were set before using animated placement.
7629        if (options.animate && !isInit) {
7630            addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);
7631        }
7632        // First pass, without lookAhead but with lookBackward. Values are set from left to right.
7633        scope_HandleNumbers.forEach(function (handleNumber) {
7634            setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false, exactInput);
7635        });
7636        var i = scope_HandleNumbers.length === 1 ? 0 : 1;
7637        // Spread handles evenly across the slider if the range has no size (min=max)
7638        if (isInit && scope_Spectrum.hasNoSize()) {
7639            exactInput = true;
7640            scope_Locations[0] = 0;
7641            if (scope_HandleNumbers.length > 1) {
7642                var space_1 = 100 / (scope_HandleNumbers.length - 1);
7643                scope_HandleNumbers.forEach(function (handleNumber) {
7644                    scope_Locations[handleNumber] = handleNumber * space_1;
7645                });
7646            }
7647        }
7648        // Secondary passes. Now that all base values are set, apply constraints.
7649        // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009)
7650        for (; i < scope_HandleNumbers.length; ++i) {
7651            scope_HandleNumbers.forEach(function (handleNumber) {
7652                setHandle(handleNumber, scope_Locations[handleNumber], true, true, exactInput);
7653            });
7654        }
7655        setZindex();
7656        scope_HandleNumbers.forEach(function (handleNumber) {
7657            fireEvent("update", handleNumber);
7658            // Fire the event only for handles that received a new value, as per #579
7659            if (values[handleNumber] !== null && fireSetEvent) {
7660                fireEvent("set", handleNumber);
7661            }
7662        });
7663    }
7664    // Reset slider to initial values
7665    function valueReset(fireSetEvent) {
7666        valueSet(options.start, fireSetEvent);
7667    }
7668    // Set value for a single handle
7669    function valueSetHandle(handleNumber, value, fireSetEvent, exactInput) {
7670        // Ensure numeric input
7671        handleNumber = Number(handleNumber);
7672        if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) {
7673            throw new Error("noUiSlider: invalid handle number, got: " + handleNumber);
7674        }
7675        // Look both backward and forward, since we don't want this handle to "push" other handles (#960);
7676        // The exactInput argument can be used to ignore slider stepping (#436)
7677        setHandle(handleNumber, resolveToValue(value, handleNumber), true, true, exactInput);
7678        fireEvent("update", handleNumber);
7679        if (fireSetEvent) {
7680            fireEvent("set", handleNumber);
7681        }
7682    }
7683    // Get the slider value.
7684    function valueGet(unencoded) {
7685        if (unencoded === void 0) { unencoded = false; }
7686        if (unencoded) {
7687            // return a copy of the raw values
7688            return scope_Values.length === 1 ? scope_Values[0] : scope_Values.slice(0);
7689        }
7690        var values = scope_Values.map(options.format.to);
7691        // If only one handle is used, return a single value.
7692        if (values.length === 1) {
7693            return values[0];
7694        }
7695        return values;
7696    }
7697    // Removes classes from the root and empties it.
7698    function destroy() {
7699        // remove protected internal listeners
7700        removeEvent(INTERNAL_EVENT_NS.aria);
7701        removeEvent(INTERNAL_EVENT_NS.tooltips);
7702        Object.keys(options.cssClasses).forEach(function (key) {
7703            removeClass(scope_Target, options.cssClasses[key]);
7704        });
7705        while (scope_Target.firstChild) {
7706            scope_Target.removeChild(scope_Target.firstChild);
7707        }
7708        delete scope_Target.noUiSlider;
7709    }
7710    function getNextStepsForHandle(handleNumber) {
7711        var location = scope_Locations[handleNumber];
7712        var nearbySteps = scope_Spectrum.getNearbySteps(location);
7713        var value = scope_Values[handleNumber];
7714        var increment = nearbySteps.thisStep.step;
7715        var decrement = null;
7716        // If snapped, directly use defined step value
7717        if (options.snap) {
7718            return [
7719                value - nearbySteps.stepBefore.startValue || null,
7720                nearbySteps.stepAfter.startValue - value || null,
7721            ];
7722        }
7723        // If the next value in this step moves into the next step,
7724        // the increment is the start of the next step - the current value
7725        if (increment !== false) {
7726            if (value + increment > nearbySteps.stepAfter.startValue) {
7727                increment = nearbySteps.stepAfter.startValue - value;
7728            }
7729        }
7730        // If the value is beyond the starting point
7731        if (value > nearbySteps.thisStep.startValue) {
7732            decrement = nearbySteps.thisStep.step;
7733        }
7734        else if (nearbySteps.stepBefore.step === false) {
7735            decrement = false;
7736        }
7737        // If a handle is at the start of a step, it always steps back into the previous step first
7738        else {
7739            decrement = value - nearbySteps.stepBefore.highestStep;
7740        }
7741        // Now, if at the slider edges, there is no in/decrement
7742        if (location === 100) {
7743            increment = null;
7744        }
7745        else if (location === 0) {
7746            decrement = null;
7747        }
7748        // As per #391, the comparison for the decrement step can have some rounding issues.
7749        var stepDecimals = scope_Spectrum.countStepDecimals();
7750        // Round per #391
7751        if (increment !== null && increment !== false) {
7752            increment = Number(increment.toFixed(stepDecimals));
7753        }
7754        if (decrement !== null && decrement !== false) {
7755            decrement = Number(decrement.toFixed(stepDecimals));
7756        }
7757        return [decrement, increment];
7758    }
7759    // Get the current step size for the slider.
7760    function getNextSteps() {
7761        return scope_HandleNumbers.map(getNextStepsForHandle);
7762    }
7763    // Updatable: margin, limit, padding, step, range, animate, snap
7764    function updateOptions(optionsToUpdate, fireSetEvent) {
7765        // Spectrum is created using the range, snap, direction and step options.
7766        // 'snap' and 'step' can be updated.
7767        // If 'snap' and 'step' are not passed, they should remain unchanged.
7768        var v = valueGet();
7769        var updateAble = [
7770            "margin",
7771            "limit",
7772            "padding",
7773            "range",
7774            "animate",
7775            "snap",
7776            "step",
7777            "format",
7778            "pips",
7779            "tooltips",
7780            "connect",
7781        ];
7782        // Only change options that we're actually passed to update.
7783        updateAble.forEach(function (name) {
7784            // Check for undefined. null removes the value.
7785            if (optionsToUpdate[name] !== undefined) {
7786                originalOptions[name] = optionsToUpdate[name];
7787            }
7788        });
7789        var newOptions = testOptions(originalOptions);
7790        // Load new options into the slider state
7791        updateAble.forEach(function (name) {
7792            if (optionsToUpdate[name] !== undefined) {
7793                options[name] = newOptions[name];
7794            }
7795        });
7796        scope_Spectrum = newOptions.spectrum;
7797        // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)
7798        options.margin = newOptions.margin;
7799        options.limit = newOptions.limit;
7800        options.padding = newOptions.padding;
7801        // Update pips, removes existing.
7802        if (options.pips) {
7803            pips(options.pips);
7804        }
7805        else {
7806            removePips();
7807        }
7808        // Update tooltips, removes existing.
7809        if (options.tooltips) {
7810            tooltips();
7811        }
7812        else {
7813            removeTooltips();
7814        }
7815        // Invalidate the current positioning so valueSet forces an update.
7816        scope_Locations = [];
7817        valueSet(isSet(optionsToUpdate.start) ? optionsToUpdate.start : v, fireSetEvent);
7818        // Update connects only if it was set
7819        if (optionsToUpdate.connect) {
7820            updateConnectOption();
7821        }
7822    }
7823    function updateConnectOption() {
7824        // IE supported way of removing children including event handlers
7825        while (scope_ConnectBase.firstChild) {
7826            scope_ConnectBase.removeChild(scope_ConnectBase.firstChild);
7827        }
7828        // Adding new connects according to the new connect options
7829        for (var i = 0; i <= options.handles; i++) {
7830            scope_Connects[i] = addConnect(scope_ConnectBase, options.connect[i]);
7831            updateConnect(i);
7832        }
7833        // re-adding drag events for the new connect elements
7834        // to ignore the other events we have to negate the 'if (!behaviour.fixed)' check
7835        bindSliderEvents({ drag: options.events.drag, fixed: true });
7836    }
7837    // Invert options for connect handles
7838    function invertConnects() {
7839        scope_ConnectsInverted = !scope_ConnectsInverted;
7840        testConnect(options, 
7841        // inverse the connect boolean array
7842        options.connect.map(function (b) { return !b; }));
7843        updateConnectOption();
7844    }
7845    // Initialization steps
7846    function setupSlider() {
7847        // Create the base element, initialize HTML and set classes.
7848        // Add handles and connect elements.
7849        scope_Base = addSlider(scope_Target);
7850        addElements(options.connect, scope_Base);
7851        // Attach user events.
7852        bindSliderEvents(options.events);
7853        // Use the public value method to set the start values.
7854        valueSet(options.start);
7855        if (options.pips) {
7856            pips(options.pips);
7857        }
7858        if (options.tooltips) {
7859            tooltips();
7860        }
7861        aria();
7862    }
7863    setupSlider();
7864    var scope_Self = {
7865        destroy: destroy,
7866        steps: getNextSteps,
7867        on: bindEvent,
7868        off: removeEvent,
7869        get: valueGet,
7870        set: valueSet,
7871        setHandle: valueSetHandle,
7872        reset: valueReset,
7873        disable: disable,
7874        enable: enable,
7875        // Exposed for unit testing, don't use this in your application.
7876        __moveHandles: function (upward, proposal, handleNumbers) {
7877            moveHandles(upward, proposal, scope_Locations, handleNumbers);
7878        },
7879        options: originalOptions,
7880        updateOptions: updateOptions,
7881        target: scope_Target,
7882        removePips: removePips,
7883        removeTooltips: removeTooltips,
7884        getPositions: function () {
7885            return scope_Locations.slice();
7886        },
7887        getTooltips: function () {
7888            return scope_Tooltips;
7889        },
7890        getOrigins: function () {
7891            return scope_Handles;
7892        },
7893        pips: pips, // Issue #594
7894    };
7895    return scope_Self;
7896}
7897// Run the standard initializer
7898function initialize(target, originalOptions) {
7899    if (!target || !target.nodeName) {
7900        throw new Error("noUiSlider: create requires a single element, got: " + target);
7901    }
7902    // Throw an error if the slider was already initialized.
7903    if (target.noUiSlider) {
7904        throw new Error("noUiSlider: Slider was already initialized.");
7905    }
7906    // Test the options and create the slider environment;
7907    var options = testOptions(originalOptions);
7908    var api = scope(target, options, originalOptions);
7909    target.noUiSlider = api;
7910    return api;
7911}
7912
7913
7914/* harmony default export */ __webpack_exports__["default"] = ({
7915    // Exposed for unit testing, don't use this in your application.
7916    __spectrum: Spectrum,
7917    // A reference to the default classes, allows global changes.
7918    // Use the cssClasses option for changes to one slider.
7919    cssClasses: cssClasses,
7920    create: initialize,
7921});
7922
7923
7924/***/ }),
7925
vendor: 34,125 bytes, lines 7926-8949
7926/***/ "./node_modules/numeral/numeral.js":
7927/*!*****************************************!*\
7928  !*** ./node_modules/numeral/numeral.js ***!
7929  \*****************************************/
7930/*! no static exports found */
7931/***/ (function(module, exports, __webpack_require__) {
7932
7933var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @preserve
7934 * numeral.js
7935 * version : 2.0.6
7936 * author : Adam Draper
7937 * license : MIT
7938 * http://adamwdraper.github.com/Numeral-js/
7939 */
7940
7941(function (global, factory) {
7942    if (true) {
7943        !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
7944				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
7945				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
7946				__WEBPACK_AMD_DEFINE_FACTORY__),
7947				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
7948    } else {}
7949}(this, function () {
7950    /************************************
7951        Variables
7952    ************************************/
7953
7954    var numeral,
7955        _,
7956        VERSION = '2.0.6',
7957        formats = {},
7958        locales = {},
7959        defaults = {
7960            currentLocale: 'en',
7961            zeroFormat: null,
7962            nullFormat: null,
7963            defaultFormat: '0,0',
7964            scalePercentBy100: true
7965        },
7966        options = {
7967            currentLocale: defaults.currentLocale,
7968            zeroFormat: defaults.zeroFormat,
7969            nullFormat: defaults.nullFormat,
7970            defaultFormat: defaults.defaultFormat,
7971            scalePercentBy100: defaults.scalePercentBy100
7972        };
7973
7974
7975    /************************************
7976        Constructors
7977    ************************************/
7978
7979    // Numeral prototype object
7980    function Numeral(input, number) {
7981        this._input = input;
7982
7983        this._value = number;
7984    }
7985
7986    numeral = function(input) {
7987        var value,
7988            kind,
7989            unformatFunction,
7990            regexp;
7991
7992        if (numeral.isNumeral(input)) {
7993            value = input.value();
7994        } else if (input === 0 || typeof input === 'undefined') {
7995            value = 0;
7996        } else if (input === null || _.isNaN(input)) {
7997            value = null;
7998        } else if (typeof input === 'string') {
7999            if (options.zeroFormat && input === options.zeroFormat) {
8000                value = 0;
8001            } else if (options.nullFormat && input === options.nullFormat || !input.replace(/[^0-9]+/g, '').length) {
8002                value = null;
8003            } else {
8004                for (kind in formats) {
8005                    regexp = typeof formats[kind].regexps.unformat === 'function' ? formats[kind].regexps.unformat() : formats[kind].regexps.unformat;
8006
8007                    if (regexp && input.match(regexp)) {
8008                        unformatFunction = formats[kind].unformat;
8009
8010                        break;
8011                    }
8012                }
8013
8014                unformatFunction = unformatFunction || numeral._.stringToNumber;
8015
8016                value = unformatFunction(input);
8017            }
8018        } else {
8019            value = Number(input)|| null;
8020        }
8021
8022        return new Numeral(input, value);
8023    };
8024
8025    // version number
8026    numeral.version = VERSION;
8027
8028    // compare numeral object
8029    numeral.isNumeral = function(obj) {
8030        return obj instanceof Numeral;
8031    };
8032
8033    // helper functions
8034    numeral._ = _ = {
8035        // formats numbers separators, decimals places, signs, abbreviations
8036        numberToFormat: function(value, format, roundingFunction) {
8037            var locale = locales[numeral.options.currentLocale],
8038                negP = false,
8039                optDec = false,
8040                leadingCount = 0,
8041                abbr = '',
8042                trillion = 1000000000000,
8043                billion = 1000000000,
8044                million = 1000000,
8045                thousand = 1000,
8046                decimal = '',
8047                neg = false,
8048                abbrForce, // force abbreviation
8049                abs,
8050                min,
8051                max,
8052                power,
8053                int,
8054                precision,
8055                signed,
8056                thousands,
8057                output;
8058
8059            // make sure we never format a null value
8060            value = value || 0;
8061
8062            abs = Math.abs(value);
8063
8064            // see if we should use parentheses for negative number or if we should prefix with a sign
8065            // if both are present we default to parentheses
8066            if (numeral._.includes(format, '(')) {
8067                negP = true;
8068                format = format.replace(/[\(|\)]/g, '');
8069            } else if (numeral._.includes(format, '+') || numeral._.includes(format, '-')) {
8070                signed = numeral._.includes(format, '+') ? format.indexOf('+') : value < 0 ? format.indexOf('-') : -1;
8071                format = format.replace(/[\+|\-]/g, '');
8072            }
8073
8074            // see if abbreviation is wanted
8075            if (numeral._.includes(format, 'a')) {
8076                abbrForce = format.match(/a(k|m|b|t)?/);
8077
8078                abbrForce = abbrForce ? abbrForce[1] : false;
8079
8080                // check for space before abbreviation
8081                if (numeral._.includes(format, ' a')) {
8082                    abbr = ' ';
8083                }
8084
8085                format = format.replace(new RegExp(abbr + 'a[kmbt]?'), '');
8086
8087                if (abs >= trillion && !abbrForce || abbrForce === 't') {
8088                    // trillion
8089                    abbr += locale.abbreviations.trillion;
8090                    value = value / trillion;
8091                } else if (abs < trillion && abs >= billion && !abbrForce || abbrForce === 'b') {
8092                    // billion
8093                    abbr += locale.abbreviations.billion;
8094                    value = value / billion;
8095                } else if (abs < billion && abs >= million && !abbrForce || abbrForce === 'm') {
8096                    // million
8097                    abbr += locale.abbreviations.million;
8098                    value = value / million;
8099                } else if (abs < million && abs >= thousand && !abbrForce || abbrForce === 'k') {
8100                    // thousand
8101                    abbr += locale.abbreviations.thousand;
8102                    value = value / thousand;
8103                }
8104            }
8105
8106            // check for optional decimals
8107            if (numeral._.includes(format, '[.]')) {
8108                optDec = true;
8109                format = format.replace('[.]', '.');
8110            }
8111
8112            // break number and format
8113            int = value.toString().split('.')[0];
8114            precision = format.split('.')[1];
8115            thousands = format.indexOf(',');
8116            leadingCount = (format.split('.')[0].split(',')[0].match(/0/g) || []).length;
8117
8118            if (precision) {
8119                if (numeral._.includes(precision, '[')) {
8120                    precision = precision.replace(']', '');
8121                    precision = precision.split('[');
8122                    decimal = numeral._.toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length);
8123                } else {
8124                    decimal = numeral._.toFixed(value, precision.length, roundingFunction);
8125                }
8126
8127                int = decimal.split('.')[0];
8128
8129                if (numeral._.includes(decimal, '.')) {
8130                    decimal = locale.delimiters.decimal + decimal.split('.')[1];
8131                } else {
8132                    decimal = '';
8133                }
8134
8135                if (optDec && Number(decimal.slice(1)) === 0) {
8136                    decimal = '';
8137                }
8138            } else {
8139                int = numeral._.toFixed(value, 0, roundingFunction);
8140            }
8141
8142            // check abbreviation again after rounding
8143            if (abbr && !abbrForce && Number(int) >= 1000 && abbr !== locale.abbreviations.trillion) {
8144                int = String(Number(int) / 1000);
8145
8146                switch (abbr) {
8147                    case locale.abbreviations.thousand:
8148                        abbr = locale.abbreviations.million;
8149                        break;
8150                    case locale.abbreviations.million:
8151                        abbr = locale.abbreviations.billion;
8152                        break;
8153                    case locale.abbreviations.billion:
8154                        abbr = locale.abbreviations.trillion;
8155                        break;
8156                }
8157            }
8158
8159
8160            // format number
8161            if (numeral._.includes(int, '-')) {
8162                int = int.slice(1);
8163                neg = true;
8164            }
8165
8166            if (int.length < leadingCount) {
8167                for (var i = leadingCount - int.length; i > 0; i--) {
8168                    int = '0' + int;
8169                }
8170            }
8171
8172            if (thousands > -1) {
8173                int = int.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + locale.delimiters.thousands);
8174            }
8175
8176            if (format.indexOf('.') === 0) {
8177                int = '';
8178            }
8179
8180            output = int + decimal + (abbr ? abbr : '');
8181
8182            if (negP) {
8183                output = (negP && neg ? '(' : '') + output + (negP && neg ? ')' : '');
8184            } else {
8185                if (signed >= 0) {
8186                    output = signed === 0 ? (neg ? '-' : '+') + output : output + (neg ? '-' : '+');
8187                } else if (neg) {
8188                    output = '-' + output;
8189                }
8190            }
8191
8192            return output;
8193        },
8194        // unformats numbers separators, decimals places, signs, abbreviations
8195        stringToNumber: function(string) {
8196            var locale = locales[options.currentLocale],
8197                stringOriginal = string,
8198                abbreviations = {
8199                    thousand: 3,
8200                    million: 6,
8201                    billion: 9,
8202                    trillion: 12
8203                },
8204                abbreviation,
8205                value,
8206                i,
8207                regexp;
8208
8209            if (options.zeroFormat && string === options.zeroFormat) {
8210                value = 0;
8211            } else if (options.nullFormat && string === options.nullFormat || !string.replace(/[^0-9]+/g, '').length) {
8212                value = null;
8213            } else {
8214                value = 1;
8215
8216                if (locale.delimiters.decimal !== '.') {
8217                    string = string.replace(/\./g, '').replace(locale.delimiters.decimal, '.');
8218                }
8219
8220                for (abbreviation in abbreviations) {
8221                    regexp = new RegExp('[^a-zA-Z]' + locale.abbreviations[abbreviation] + '(?:\\)|(\\' + locale.currency.symbol + ')?(?:\\))?)?$');
8222
8223                    if (stringOriginal.match(regexp)) {
8224                        value *= Math.pow(10, abbreviations[abbreviation]);
8225                        break;
8226                    }
8227                }
8228
8229                // check for negative number
8230                value *= (string.split('-').length + Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2 ? 1 : -1;
8231
8232                // remove non numbers
8233                string = string.replace(/[^0-9\.]+/g, '');
8234
8235                value *= Number(string);
8236            }
8237
8238            return value;
8239        },
8240        isNaN: function(value) {
8241            return typeof value === 'number' && isNaN(value);
8242        },
8243        includes: function(string, search) {
8244            return string.indexOf(search) !== -1;
8245        },
8246        insert: function(string, subString, start) {
8247            return string.slice(0, start) + subString + string.slice(start);
8248        },
8249        reduce: function(array, callback /*, initialValue*/) {
8250            if (this === null) {
8251                throw new TypeError('Array.prototype.reduce called on null or undefined');
8252            }
8253
8254            if (typeof callback !== 'function') {
8255                throw new TypeError(callback + ' is not a function');
8256            }
8257
8258            var t = Object(array),
8259                len = t.length >>> 0,
8260                k = 0,
8261                value;
8262
8263            if (arguments.length === 3) {
8264                value = arguments[2];
8265            } else {
8266                while (k < len && !(k in t)) {
8267                    k++;
8268                }
8269
8270                if (k >= len) {
8271                    throw new TypeError('Reduce of empty array with no initial value');
8272                }
8273
8274                value = t[k++];
8275            }
8276            for (; k < len; k++) {
8277                if (k in t) {
8278                    value = callback(value, t[k], k, t);
8279                }
8280            }
8281            return value;
8282        },
8283        /**
8284         * Computes the multiplier necessary to make x >= 1,
8285         * effectively eliminating miscalculations caused by
8286         * finite precision.
8287         */
8288        multiplier: function (x) {
8289            var parts = x.toString().split('.');
8290
8291            return parts.length < 2 ? 1 : Math.pow(10, parts[1].length);
8292        },
8293        /**
8294         * Given a variable number of arguments, returns the maximum
8295         * multiplier that must be used to normalize an operation involving
8296         * all of them.
8297         */
8298        correctionFactor: function () {
8299            var args = Array.prototype.slice.call(arguments);
8300
8301            return args.reduce(function(accum, next) {
8302                var mn = _.multiplier(next);
8303                return accum > mn ? accum : mn;
8304            }, 1);
8305        },
8306        /**
8307         * Implementation of toFixed() that treats floats more like decimals
8308         *
8309         * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present
8310         * problems for accounting- and finance-related software.
8311         */
8312        toFixed: function(value, maxDecimals, roundingFunction, optionals) {
8313            var splitValue = value.toString().split('.'),
8314                minDecimals = maxDecimals - (optionals || 0),
8315                boundedPrecision,
8316                optionalsRegExp,
8317                power,
8318                output;
8319
8320            // Use the smallest precision value possible to avoid errors from floating point representation
8321            if (splitValue.length === 2) {
8322              boundedPrecision = Math.min(Math.max(splitValue[1].length, minDecimals), maxDecimals);
8323            } else {
8324              boundedPrecision = minDecimals;
8325            }
8326
8327            power = Math.pow(10, boundedPrecision);
8328
8329            // Multiply up by precision, round accurately, then divide and use native toFixed():
8330            output = (roundingFunction(value + 'e+' + boundedPrecision) / power).toFixed(boundedPrecision);
8331
8332            if (optionals > maxDecimals - boundedPrecision) {
8333                optionalsRegExp = new RegExp('\\.?0{1,' + (optionals - (maxDecimals - boundedPrecision)) + '}$');
8334                output = output.replace(optionalsRegExp, '');
8335            }
8336
8337            return output;
8338        }
8339    };
8340
8341    // avaliable options
8342    numeral.options = options;
8343
8344    // avaliable formats
8345    numeral.formats = formats;
8346
8347    // avaliable formats
8348    numeral.locales = locales;
8349
8350    // This function sets the current locale.  If
8351    // no arguments are passed in, it will simply return the current global
8352    // locale key.
8353    numeral.locale = function(key) {
8354        if (key) {
8355            options.currentLocale = key.toLowerCase();
8356        }
8357
8358        return options.currentLocale;
8359    };
8360
8361    // This function provides access to the loaded locale data.  If
8362    // no arguments are passed in, it will simply return the current
8363    // global locale object.
8364    numeral.localeData = function(key) {
8365        if (!key) {
8366            return locales[options.currentLocale];
8367        }
8368
8369        key = key.toLowerCase();
8370
8371        if (!locales[key]) {
8372            throw new Error('Unknown locale : ' + key);
8373        }
8374
8375        return locales[key];
8376    };
8377
8378    numeral.reset = function() {
8379        for (var property in defaults) {
8380            options[property] = defaults[property];
8381        }
8382    };
8383
8384    numeral.zeroFormat = function(format) {
8385        options.zeroFormat = typeof(format) === 'string' ? format : null;
8386    };
8387
8388    numeral.nullFormat = function (format) {
8389        options.nullFormat = typeof(format) === 'string' ? format : null;
8390    };
8391
8392    numeral.defaultFormat = function(format) {
8393        options.defaultFormat = typeof(format) === 'string' ? format : '0.0';
8394    };
8395
8396    numeral.register = function(type, name, format) {
8397        name = name.toLowerCase();
8398
8399        if (this[type + 's'][name]) {
8400            throw new TypeError(name + ' ' + type + ' already registered.');
8401        }
8402
8403        this[type + 's'][name] = format;
8404
8405        return format;
8406    };
8407
8408
8409    numeral.validate = function(val, culture) {
8410        var _decimalSep,
8411            _thousandSep,
8412            _currSymbol,
8413            _valArray,
8414            _abbrObj,
8415            _thousandRegEx,
8416            localeData,
8417            temp;
8418
8419        //coerce val to string
8420        if (typeof val !== 'string') {
8421            val += '';
8422
8423            if (console.warn) {
8424                console.warn('Numeral.js: Value is not string. It has been co-erced to: ', val);
8425            }
8426        }
8427
8428        //trim whitespaces from either sides
8429        val = val.trim();
8430
8431        //if val is just digits return true
8432        if (!!val.match(/^\d+$/)) {
8433            return true;
8434        }
8435
8436        //if val is empty return false
8437        if (val === '') {
8438            return false;
8439        }
8440
8441        //get the decimal and thousands separator from numeral.localeData
8442        try {
8443            //check if the culture is understood by numeral. if not, default it to current locale
8444            localeData = numeral.localeData(culture);
8445        } catch (e) {
8446            localeData = numeral.localeData(numeral.locale());
8447        }
8448
8449        //setup the delimiters and currency symbol based on culture/locale
8450        _currSymbol = localeData.currency.symbol;
8451        _abbrObj = localeData.abbreviations;
8452        _decimalSep = localeData.delimiters.decimal;
8453        if (localeData.delimiters.thousands === '.') {
8454            _thousandSep = '\\.';
8455        } else {
8456            _thousandSep = localeData.delimiters.thousands;
8457        }
8458
8459        // validating currency symbol
8460        temp = val.match(/^[^\d]+/);
8461        if (temp !== null) {
8462            val = val.substr(1);
8463            if (temp[0] !== _currSymbol) {
8464                return false;
8465            }
8466        }
8467
8468        //validating abbreviation symbol
8469        temp = val.match(/[^\d]+$/);
8470        if (temp !== null) {
8471            val = val.slice(0, -1);
8472            if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million && temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) {
8473                return false;
8474            }
8475        }
8476
8477        _thousandRegEx = new RegExp(_thousandSep + '{2}');
8478
8479        if (!val.match(/[^\d.,]/g)) {
8480            _valArray = val.split(_decimalSep);
8481            if (_valArray.length > 2) {
8482                return false;
8483            } else {
8484                if (_valArray.length < 2) {
8485                    return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx));
8486                } else {
8487                    if (_valArray[0].length === 1) {
8488                        return ( !! _valArray[0].match(/^\d+$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/));
8489                    } else {
8490                        return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/));
8491                    }
8492                }
8493            }
8494        }
8495
8496        return false;
8497    };
8498
8499
8500    /************************************
8501        Numeral Prototype
8502    ************************************/
8503
8504    numeral.fn = Numeral.prototype = {
8505        clone: function() {
8506            return numeral(this);
8507        },
8508        format: function(inputString, roundingFunction) {
8509            var value = this._value,
8510                format = inputString || options.defaultFormat,
8511                kind,
8512                output,
8513                formatFunction;
8514
8515            // make sure we have a roundingFunction
8516            roundingFunction = roundingFunction || Math.round;
8517
8518            // format based on value
8519            if (value === 0 && options.zeroFormat !== null) {
8520                output = options.zeroFormat;
8521            } else if (value === null && options.nullFormat !== null) {
8522                output = options.nullFormat;
8523            } else {
8524                for (kind in formats) {
8525                    if (format.match(formats[kind].regexps.format)) {
8526                        formatFunction = formats[kind].format;
8527
8528                        break;
8529                    }
8530                }
8531
8532                formatFunction = formatFunction || numeral._.numberToFormat;
8533
8534                output = formatFunction(value, format, roundingFunction);
8535            }
8536
8537            return output;
8538        },
8539        value: function() {
8540            return this._value;
8541        },
8542        input: function() {
8543            return this._input;
8544        },
8545        set: function(value) {
8546            this._value = Number(value);
8547
8548            return this;
8549        },
8550        add: function(value) {
8551            var corrFactor = _.correctionFactor.call(null, this._value, value);
8552
8553            function cback(accum, curr, currI, O) {
8554                return accum + Math.round(corrFactor * curr);
8555            }
8556
8557            this._value = _.reduce([this._value, value], cback, 0) / corrFactor;
8558
8559            return this;
8560        },
8561        subtract: function(value) {
8562            var corrFactor = _.correctionFactor.call(null, this._value, value);
8563
8564            function cback(accum, curr, currI, O) {
8565                return accum - Math.round(corrFactor * curr);
8566            }
8567
8568            this._value = _.reduce([value], cback, Math.round(this._value * corrFactor)) / corrFactor;
8569
8570            return this;
8571        },
8572        multiply: function(value) {
8573            function cback(accum, curr, currI, O) {
8574                var corrFactor = _.correctionFactor(accum, curr);
8575                return Math.round(accum * corrFactor) * Math.round(curr * corrFactor) / Math.round(corrFactor * corrFactor);
8576            }
8577
8578            this._value = _.reduce([this._value, value], cback, 1);
8579
8580            return this;
8581        },
8582        divide: function(value) {
8583            function cback(accum, curr, currI, O) {
8584                var corrFactor = _.correctionFactor(accum, curr);
8585                return Math.round(accum * corrFactor) / Math.round(curr * corrFactor);
8586            }
8587
8588            this._value = _.reduce([this._value, value], cback);
8589
8590            return this;
8591        },
8592        difference: function(value) {
8593            return Math.abs(numeral(this._value).subtract(value).value());
8594        }
8595    };
8596
8597    /************************************
8598        Default Locale && Format
8599    ************************************/
8600
8601    numeral.register('locale', 'en', {
8602        delimiters: {
8603            thousands: ',',
8604            decimal: '.'
8605        },
8606        abbreviations: {
8607            thousand: 'k',
8608            million: 'm',
8609            billion: 'b',
8610            trillion: 't'
8611        },
8612        ordinal: function(number) {
8613            var b = number % 10;
8614            return (~~(number % 100 / 10) === 1) ? 'th' :
8615                (b === 1) ? 'st' :
8616                (b === 2) ? 'nd' :
8617                (b === 3) ? 'rd' : 'th';
8618        },
8619        currency: {
8620            symbol: '$'
8621        }
8622    });
8623
8624    
8625
8626(function() {
8627        numeral.register('format', 'bps', {
8628            regexps: {
8629                format: /(BPS)/,
8630                unformat: /(BPS)/
8631            },
8632            format: function(value, format, roundingFunction) {
8633                var space = numeral._.includes(format, ' BPS') ? ' ' : '',
8634                    output;
8635
8636                value = value * 10000;
8637
8638                // check for space before BPS
8639                format = format.replace(/\s?BPS/, '');
8640
8641                output = numeral._.numberToFormat(value, format, roundingFunction);
8642
8643                if (numeral._.includes(output, ')')) {
8644                    output = output.split('');
8645
8646                    output.splice(-1, 0, space + 'BPS');
8647
8648                    output = output.join('');
8649                } else {
8650                    output = output + space + 'BPS';
8651                }
8652
8653                return output;
8654            },
8655            unformat: function(string) {
8656                return +(numeral._.stringToNumber(string) * 0.0001).toFixed(15);
8657            }
8658        });
8659})();
8660
8661
8662(function() {
8663        var decimal = {
8664            base: 1000,
8665            suffixes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
8666        },
8667        binary = {
8668            base: 1024,
8669            suffixes: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
8670        };
8671
8672    var allSuffixes =  decimal.suffixes.concat(binary.suffixes.filter(function (item) {
8673            return decimal.suffixes.indexOf(item) < 0;
8674        }));
8675        var unformatRegex = allSuffixes.join('|');
8676        // Allow support for BPS (http://www.investopedia.com/terms/b/basispoint.asp)
8677        unformatRegex = '(' + unformatRegex.replace('B', 'B(?!PS)') + ')';
8678
8679    numeral.register('format', 'bytes', {
8680        regexps: {
8681            format: /([0\s]i?b)/,
8682            unformat: new RegExp(unformatRegex)
8683        },
8684        format: function(value, format, roundingFunction) {
8685            var output,
8686                bytes = numeral._.includes(format, 'ib') ? binary : decimal,
8687                suffix = numeral._.includes(format, ' b') || numeral._.includes(format, ' ib') ? ' ' : '',
8688                power,
8689                min,
8690                max;
8691
8692            // check for space before
8693            format = format.replace(/\s?i?b/, '');
8694
8695            for (power = 0; power <= bytes.suffixes.length; power++) {
8696                min = Math.pow(bytes.base, power);
8697                max = Math.pow(bytes.base, power + 1);
8698
8699                if (value === null || value === 0 || value >= min && value < max) {
8700                    suffix += bytes.suffixes[power];
8701
8702                    if (min > 0) {
8703                        value = value / min;
8704                    }
8705
8706                    break;
8707                }
8708            }
8709
8710            output = numeral._.numberToFormat(value, format, roundingFunction);
8711
8712            return output + suffix;
8713        },
8714        unformat: function(string) {
8715            var value = numeral._.stringToNumber(string),
8716                power,
8717                bytesMultiplier;
8718
8719            if (value) {
8720                for (power = decimal.suffixes.length - 1; power >= 0; power--) {
8721                    if (numeral._.includes(string, decimal.suffixes[power])) {
8722                        bytesMultiplier = Math.pow(decimal.base, power);
8723
8724                        break;
8725                    }
8726
8727                    if (numeral._.includes(string, binary.suffixes[power])) {
8728                        bytesMultiplier = Math.pow(binary.base, power);
8729
8730                        break;
8731                    }
8732                }
8733
8734                value *= (bytesMultiplier || 1);
8735            }
8736
8737            return value;
8738        }
8739    });
8740})();
8741
8742
8743(function() {
8744        numeral.register('format', 'currency', {
8745        regexps: {
8746            format: /(\$)/
8747        },
8748        format: function(value, format, roundingFunction) {
8749            var locale = numeral.locales[numeral.options.currentLocale],
8750                symbols = {
8751                    before: format.match(/^([\+|\-|\(|\s|\$]*)/)[0],
8752                    after: format.match(/([\+|\-|\)|\s|\$]*)$/)[0]
8753                },
8754                output,
8755                symbol,
8756                i;
8757
8758            // strip format of spaces and $
8759            format = format.replace(/\s?\$\s?/, '');
8760
8761            // format the number
8762            output = numeral._.numberToFormat(value, format, roundingFunction);
8763
8764            // update the before and after based on value
8765            if (value >= 0) {
8766                symbols.before = symbols.before.replace(/[\-\(]/, '');
8767                symbols.after = symbols.after.replace(/[\-\)]/, '');
8768            } else if (value < 0 && (!numeral._.includes(symbols.before, '-') && !numeral._.includes(symbols.before, '('))) {
8769                symbols.before = '-' + symbols.before;
8770            }
8771
8772            // loop through each before symbol
8773            for (i = 0; i < symbols.before.length; i++) {
8774                symbol = symbols.before[i];
8775
8776                switch (symbol) {
8777                    case '$':
8778                        output = numeral._.insert(output, locale.currency.symbol, i);
8779                        break;
8780                    case ' ':
8781                        output = numeral._.insert(output, ' ', i + locale.currency.symbol.length - 1);
8782                        break;
8783                }
8784            }
8785
8786            // loop through each after symbol
8787            for (i = symbols.after.length - 1; i >= 0; i--) {
8788                symbol = symbols.after[i];
8789
8790                switch (symbol) {
8791                    case '$':
8792                        output = i === symbols.after.length - 1 ? output + locale.currency.symbol : numeral._.insert(output, locale.currency.symbol, -(symbols.after.length - (1 + i)));
8793                        break;
8794                    case ' ':
8795                        output = i === symbols.after.length - 1 ? output + ' ' : numeral._.insert(output, ' ', -(symbols.after.length - (1 + i) + locale.currency.symbol.length - 1));
8796                        break;
8797                }
8798            }
8799
8800
8801            return output;
8802        }
8803    });
8804})();
8805
8806
8807(function() {
8808        numeral.register('format', 'exponential', {
8809        regexps: {
8810            format: /(e\+|e-)/,
8811            unformat: /(e\+|e-)/
8812        },
8813        format: function(value, format, roundingFunction) {
8814            var output,
8815                exponential = typeof value === 'number' && !numeral._.isNaN(value) ? value.toExponential() : '0e+0',
8816                parts = exponential.split('e');
8817
8818            format = format.replace(/e[\+|\-]{1}0/, '');
8819
8820            output = numeral._.numberToFormat(Number(parts[0]), format, roundingFunction);
8821
8822            return output + 'e' + parts[1];
8823        },
8824        unformat: function(string) {
8825            var parts = numeral._.includes(string, 'e+') ? string.split('e+') : string.split('e-'),
8826                value = Number(parts[0]),
8827                power = Number(parts[1]);
8828
8829            power = numeral._.includes(string, 'e-') ? power *= -1 : power;
8830
8831            function cback(accum, curr, currI, O) {
8832                var corrFactor = numeral._.correctionFactor(accum, curr),
8833                    num = (accum * corrFactor) * (curr * corrFactor) / (corrFactor * corrFactor);
8834                return num;
8835            }
8836
8837            return numeral._.reduce([value, Math.pow(10, power)], cback, 1);
8838        }
8839    });
8840})();
8841
8842
8843(function() {
8844        numeral.register('format', 'ordinal', {
8845        regexps: {
8846            format: /(o)/
8847        },
8848        format: function(value, format, roundingFunction) {
8849            var locale = numeral.locales[numeral.options.currentLocale],
8850                output,
8851                ordinal = numeral._.includes(format, ' o') ? ' ' : '';
8852
8853            // check for space before
8854            format = format.replace(/\s?o/, '');
8855
8856            ordinal += locale.ordinal(value);
8857
8858            output = numeral._.numberToFormat(value, format, roundingFunction);
8859
8860            return output + ordinal;
8861        }
8862    });
8863})();
8864
8865
8866(function() {
8867        numeral.register('format', 'percentage', {
8868        regexps: {
8869            format: /(%)/,
8870            unformat: /(%)/
8871        },
8872        format: function(value, format, roundingFunction) {
8873            var space = numeral._.includes(format, ' %') ? ' ' : '',
8874                output;
8875
8876            if (numeral.options.scalePercentBy100) {
8877                value = value * 100;
8878            }
8879
8880            // check for space before %
8881            format = format.replace(/\s?\%/, '');
8882
8883            output = numeral._.numberToFormat(value, format, roundingFunction);
8884
8885            if (numeral._.includes(output, ')')) {
8886                output = output.split('');
8887
8888                output.splice(-1, 0, space + '%');
8889
8890                output = output.join('');
8891            } else {
8892                output = output + space + '%';
8893            }
8894
8895            return output;
8896        },
8897        unformat: function(string) {
8898            var number = numeral._.stringToNumber(string);
8899            if (numeral.options.scalePercentBy100) {
8900                return number * 0.01;
8901            }
8902            return number;
8903        }
8904    });
8905})();
8906
8907
8908(function() {
8909        numeral.register('format', 'time', {
8910        regexps: {
8911            format: /(:)/,
8912            unformat: /(:)/
8913        },
8914        format: function(value, format, roundingFunction) {
8915            var hours = Math.floor(value / 60 / 60),
8916                minutes = Math.floor((value - (hours * 60 * 60)) / 60),
8917                seconds = Math.round(value - (hours * 60 * 60) - (minutes * 60));
8918
8919            return hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds);
8920        },
8921        unformat: function(string) {
8922            var timeArray = string.split(':'),
8923                seconds = 0;
8924
8925            // turn hours and minutes into seconds and add them all up
8926            if (timeArray.length === 3) {
8927                // hours
8928                seconds = seconds + (Number(timeArray[0]) * 60 * 60);
8929                // minutes
8930                seconds = seconds + (Number(timeArray[1]) * 60);
8931                // seconds
8932                seconds = seconds + Number(timeArray[2]);
8933            } else if (timeArray.length === 2) {
8934                // minutes
8935                seconds = seconds + (Number(timeArray[0]) * 60);
8936                // seconds
8937                seconds = seconds + Number(timeArray[1]);
8938            }
8939            return Number(seconds);
8940        }
8941    });
8942})();
8943
8944return numeral;
8945}));
8946
8947
8948/***/ }),
8949
vendor: 5,681 bytes, lines 8950-9144
8950/***/ "./node_modules/process/browser.js":
8951/*!*****************************************!*\
8952  !*** ./node_modules/process/browser.js ***!
8953  \*****************************************/
8954/*! no static exports found */
8955/***/ (function(module, exports) {
8956
8957// shim for using process in browser
8958var process = module.exports = {};
8959
8960// cached from whatever global is present so that test runners that stub it
8961// don't break things.  But we need to wrap it in a try catch in case it is
8962// wrapped in strict mode code which doesn't define any globals.  It's inside a
8963// function because try/catches deoptimize in certain engines.
8964
8965var cachedSetTimeout;
8966var cachedClearTimeout;
8967
8968function defaultSetTimout() {
8969    throw new Error('setTimeout has not been defined');
8970}
8971function defaultClearTimeout () {
8972    throw new Error('clearTimeout has not been defined');
8973}
8974(function () {
8975    try {
8976        if (typeof setTimeout === 'function') {
8977            cachedSetTimeout = setTimeout;
8978        } else {
8979            cachedSetTimeout = defaultSetTimout;
8980        }
8981    } catch (e) {
8982        cachedSetTimeout = defaultSetTimout;
8983    }
8984    try {
8985        if (typeof clearTimeout === 'function') {
8986            cachedClearTimeout = clearTimeout;
8987        } else {
8988            cachedClearTimeout = defaultClearTimeout;
8989        }
8990    } catch (e) {
8991        cachedClearTimeout = defaultClearTimeout;
8992    }
8993} ())
8994function runTimeout(fun) {
8995    if (cachedSetTimeout === setTimeout) {
8996        //normal enviroments in sane situations
8997        return setTimeout(fun, 0);
8998    }
8999    // if setTimeout wasn't available but was latter defined
9000    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
9001        cachedSetTimeout = setTimeout;
9002        return setTimeout(fun, 0);
9003    }
9004    try {
9005        // when when somebody has screwed with setTimeout but no I.E. maddness
9006        return cachedSetTimeout(fun, 0);
9007    } catch(e){
9008        try {
9009            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
9010            return cachedSetTimeout.call(null, fun, 0);
9011        } catch(e){
9012            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
9013            return cachedSetTimeout.call(this, fun, 0);
9014        }
9015    }
9016
9017
9018}
9019function runClearTimeout(marker) {
9020    if (cachedClearTimeout === clearTimeout) {
9021        //normal enviroments in sane situations
9022        return clearTimeout(marker);
9023    }
9024    // if clearTimeout wasn't available but was latter defined
9025    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
9026        cachedClearTimeout = clearTimeout;
9027        return clearTimeout(marker);
9028    }
9029    try {
9030        // when when somebody has screwed with setTimeout but no I.E. maddness
9031        return cachedClearTimeout(marker);
9032    } catch (e){
9033        try {
9034            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
9035            return cachedClearTimeout.call(null, marker);
9036        } catch (e){
9037            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
9038            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
9039            return cachedClearTimeout.call(this, marker);
9040        }
9041    }
9042
9043
9044
9045}
9046var queue = [];
9047var draining = false;
9048var currentQueue;
9049var queueIndex = -1;
9050
9051function cleanUpNextTick() {
9052    if (!draining || !currentQueue) {
9053        return;
9054    }
9055    draining = false;
9056    if (currentQueue.length) {
9057        queue = currentQueue.concat(queue);
9058    } else {
9059        queueIndex = -1;
9060    }
9061    if (queue.length) {
9062        drainQueue();
9063    }
9064}
9065
9066function drainQueue() {
9067    if (draining) {
9068        return;
9069    }
9070    var timeout = runTimeout(cleanUpNextTick);
9071    draining = true;
9072
9073    var len = queue.length;
9074    while(len) {
9075        currentQueue = queue;
9076        queue = [];
9077        while (++queueIndex < len) {
9078            if (currentQueue) {
9079                currentQueue[queueIndex].run();
9080            }
9081        }
9082        queueIndex = -1;
9083        len = queue.length;
9084    }
9085    currentQueue = null;
9086    draining = false;
9087    runClearTimeout(timeout);
9088}
9089
9090process.nextTick = function (fun) {
9091    var args = new Array(arguments.length - 1);
9092    if (arguments.length > 1) {
9093        for (var i = 1; i < arguments.length; i++) {
9094            args[i - 1] = arguments[i];
9095        }
9096    }
9097    queue.push(new Item(fun, args));
9098    if (queue.length === 1 && !draining) {
9099        runTimeout(drainQueue);
9100    }
9101};
9102
9103// v8 likes predictible objects
9104function Item(fun, array) {
9105    this.fun = fun;
9106    this.array = array;
9107}
9108Item.prototype.run = function () {
9109    this.fun.apply(null, this.array);
9110};
9111process.title = 'browser';
9112process.browser = true;
9113process.env = {};
9114process.argv = [];
9115process.version = ''; // empty string to avoid regexp issues
9116process.versions = {};
9117
9118function noop() {}
9119
9120process.on = noop;
9121process.addListener = noop;
9122process.once = noop;
9123process.off = noop;
9124process.removeListener = noop;
9125process.removeAllListeners = noop;
9126process.emit = noop;
9127process.prependListener = noop;
9128process.prependOnceListener = noop;
9129
9130process.listeners = function (name) { return [] }
9131
9132process.binding = function (name) {
9133    throw new Error('process.binding is not supported');
9134};
9135
9136process.cwd = function () { return '/' };
9137process.chdir = function (dir) {
9138    throw new Error('process.chdir is not supported');
9139};
9140process.umask = function() { return 0; };
9141
9142
9143/***/ }),
9144
vendor: 7,087 bytes, lines 9145-9342
9145/***/ "./node_modules/setimmediate/setImmediate.js":
9146/*!***************************************************!*\
9147  !*** ./node_modules/setimmediate/setImmediate.js ***!
9148  \***************************************************/
9149/*! no static exports found */
9150/***/ (function(module, exports, __webpack_require__) {
9151
9152/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
9153    "use strict";
9154
9155    if (global.setImmediate) {
9156        return;
9157    }
9158
9159    var nextHandle = 1; // Spec says greater than zero
9160    var tasksByHandle = {};
9161    var currentlyRunningATask = false;
9162    var doc = global.document;
9163    var registerImmediate;
9164
9165    function setImmediate(callback) {
9166      // Callback can either be a function or a string
9167      if (typeof callback !== "function") {
9168        callback = new Function("" + callback);
9169      }
9170      // Copy function arguments
9171      var args = new Array(arguments.length - 1);
9172      for (var i = 0; i < args.length; i++) {
9173          args[i] = arguments[i + 1];
9174      }
9175      // Store and register the task
9176      var task = { callback: callback, args: args };
9177      tasksByHandle[nextHandle] = task;
9178      registerImmediate(nextHandle);
9179      return nextHandle++;
9180    }
9181
9182    function clearImmediate(handle) {
9183        delete tasksByHandle[handle];
9184    }
9185
9186    function run(task) {
9187        var callback = task.callback;
9188        var args = task.args;
9189        switch (args.length) {
9190        case 0:
9191            callback();
9192            break;
9193        case 1:
9194            callback(args[0]);
9195            break;
9196        case 2:
9197            callback(args[0], args[1]);
9198            break;
9199        case 3:
9200            callback(args[0], args[1], args[2]);
9201            break;
9202        default:
9203            callback.apply(undefined, args);
9204            break;
9205        }
9206    }
9207
9208    function runIfPresent(handle) {
9209        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
9210        // So if we're currently running a task, we'll need to delay this invocation.
9211        if (currentlyRunningATask) {
9212            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
9213            // "too much recursion" error.
9214            setTimeout(runIfPresent, 0, handle);
9215        } else {
9216            var task = tasksByHandle[handle];
9217            if (task) {
9218                currentlyRunningATask = true;
9219                try {
9220                    run(task);
9221                } finally {
9222                    clearImmediate(handle);
9223                    currentlyRunningATask = false;
9224                }
9225            }
9226        }
9227    }
9228
9229    function installNextTickImplementation() {
9230        registerImmediate = function(handle) {
9231            process.nextTick(function () { runIfPresent(handle); });
9232        };
9233    }
9234
9235    function canUsePostMessage() {
9236        // The test against `importScripts` prevents this implementation from being installed inside a web worker,
9237        // where `global.postMessage` means something completely different and can't be used for this purpose.
9238        if (global.postMessage && !global.importScripts) {
9239            var postMessageIsAsynchronous = true;
9240            var oldOnMessage = global.onmessage;
9241            global.onmessage = function() {
9242                postMessageIsAsynchronous = false;
9243            };
9244            global.postMessage("", "*");
9245            global.onmessage = oldOnMessage;
9246            return postMessageIsAsynchronous;
9247        }
9248    }
9249
9250    function installPostMessageImplementation() {
9251        // Installs an event handler on `global` for the `message` event: see
9252        // * https://developer.mozilla.org/en/DOM/window.postMessage
9253        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
9254
9255        var messagePrefix = "setImmediate$" + Math.random() + "$";
9256        var onGlobalMessage = function(event) {
9257            if (event.source === global &&
9258                typeof event.data === "string" &&
9259                event.data.indexOf(messagePrefix) === 0) {
9260                runIfPresent(+event.data.slice(messagePrefix.length));
9261            }
9262        };
9263
9264        if (global.addEventListener) {
9265            global.addEventListener("message", onGlobalMessage, false);
9266        } else {
9267            global.attachEvent("onmessage", onGlobalMessage);
9268        }
9269
9270        registerImmediate = function(handle) {
9271            global.postMessage(messagePrefix + handle, "*");
9272        };
9273    }
9274
9275    function installMessageChannelImplementation() {
9276        var channel = new MessageChannel();
9277        channel.port1.onmessage = function(event) {
9278            var handle = event.data;
9279            runIfPresent(handle);
9280        };
9281
9282        registerImmediate = function(handle) {
9283            channel.port2.postMessage(handle);
9284        };
9285    }
9286
9287    function installReadyStateChangeImplementation() {
9288        var html = doc.documentElement;
9289        registerImmediate = function(handle) {
9290            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
9291            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
9292            var script = doc.createElement("script");
9293            script.onreadystatechange = function () {
9294                runIfPresent(handle);
9295                script.onreadystatechange = null;
9296                html.removeChild(script);
9297                script = null;
9298            };
9299            html.appendChild(script);
9300        };
9301    }
9302
9303    function installSetTimeoutImplementation() {
9304        registerImmediate = function(handle) {
9305            setTimeout(runIfPresent, 0, handle);
9306        };
9307    }
9308
9309    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
9310    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
9311    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
9312
9313    // Don't get fooled by e.g. browserify environments.
9314    if ({}.toString.call(global.process) === "[object process]") {
9315        // For Node.js before 0.9
9316        installNextTickImplementation();
9317
9318    } else if (canUsePostMessage()) {
9319        // For non-IE10 modern browsers
9320        installPostMessageImplementation();
9321
9322    } else if (global.MessageChannel) {
9323        // For web workers, where supported
9324        installMessageChannelImplementation();
9325
9326    } else if (doc && "onreadystatechange" in doc.createElement("script")) {
9327        // For IE 6–8
9328        installReadyStateChangeImplementation();
9329
9330    } else {
9331        // For older browsers
9332        installSetTimeoutImplementation();
9333    }
9334
9335    attachTo.setImmediate = setImmediate;
9336    attachTo.clearImmediate = clearImmediate;
9337}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
9338
9339/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
9340
9341/***/ }),
9342
vendor: 2,587 bytes, lines 9343-9417
9343/***/ "./node_modules/timers-browserify/main.js":
9344/*!************************************************!*\
9345  !*** ./node_modules/timers-browserify/main.js ***!
9346  \************************************************/
9347/*! no static exports found */
9348/***/ (function(module, exports, __webpack_require__) {
9349
9350/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
9351            (typeof self !== "undefined" && self) ||
9352            window;
9353var apply = Function.prototype.apply;
9354
9355// DOM APIs, for completeness
9356
9357exports.setTimeout = function() {
9358  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
9359};
9360exports.setInterval = function() {
9361  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
9362};
9363exports.clearTimeout =
9364exports.clearInterval = function(timeout) {
9365  if (timeout) {
9366    timeout.close();
9367  }
9368};
9369
9370function Timeout(id, clearFn) {
9371  this._id = id;
9372  this._clearFn = clearFn;
9373}
9374Timeout.prototype.unref = Timeout.prototype.ref = function() {};
9375Timeout.prototype.close = function() {
9376  this._clearFn.call(scope, this._id);
9377};
9378
9379// Does not start the time, just sets up the members needed.
9380exports.enroll = function(item, msecs) {
9381  clearTimeout(item._idleTimeoutId);
9382  item._idleTimeout = msecs;
9383};
9384
9385exports.unenroll = function(item) {
9386  clearTimeout(item._idleTimeoutId);
9387  item._idleTimeout = -1;
9388};
9389
9390exports._unrefActive = exports.active = function(item) {
9391  clearTimeout(item._idleTimeoutId);
9392
9393  var msecs = item._idleTimeout;
9394  if (msecs >= 0) {
9395    item._idleTimeoutId = setTimeout(function onTimeout() {
9396      if (item._onTimeout)
9397        item._onTimeout();
9398    }, msecs);
9399  }
9400};
9401
9402// setimmediate attaches itself to the global object
9403__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js");
9404// On some exotic environments, it's not clear which object `setimmediate` was
9405// able to install onto.  Search each possibility in the same order as the
9406// `setimmediate` library.
9407exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
9408                       (typeof global !== "undefined" && global.setImmediate) ||
9409                       (this && this.setImmediate);
9410exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
9411                         (typeof global !== "undefined" && global.clearImmediate) ||
9412                         (this && this.clearImmediate);
9413
9414/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
9415
9416/***/ }),
9417
vendor: 724 bytes, lines 9418-9448
9418/***/ "./node_modules/webpack/buildin/global.js":
9419/*!***********************************!*\
9420  !*** (webpack)/buildin/global.js ***!
9421  \***********************************/
9422/*! no static exports found */
9423/***/ (function(module, exports) {
9424
9425var g;
9426
9427// This works in non-strict mode
9428g = (function() {
9429	return this;
9430})();
9431
9432try {
9433	// This works if eval is allowed (see CSP)
9434	g = g || new Function("return this")();
9435} catch (e) {
9436	// This works if the window reference is available
9437	if (typeof window === "object") g = window;
9438}
9439
9440// g can still be undefined, but nothing to do about it...
9441// We return undefined, instead of nothing here, so it's
9442// easier to handle this case. if(!global) { ...}
9443
9444module.exports = g;
9445
9446
9447/***/ }),
9448
vendor: 9,830 bytes, lines 9449-9759
9449/***/ "./node_modules/wezom-module-loader/index.js":
9450/*!***************************************************!*\
9451  !*** ./node_modules/wezom-module-loader/index.js ***!
9452  \***************************************************/
9453/*! no static exports found */
9454/***/ (function(module, exports, __webpack_require__) {
9455
9456"use strict";
9457
9458
9459/**
9460 * @module
9461 */
9462
9463Object.defineProperty(exports, "__esModule", {
9464  value: true
9465});
9466
9467var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
9468
9469var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
9470
9471var _jquery = __webpack_require__(/*! jquery */ "jquery");
9472
9473var _jquery2 = _interopRequireDefault(_jquery);
9474
9475function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9476
9477function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9478
9479// ----------------------------------------
9480// Private
9481// ----------------------------------------
9482
9483/**
9484 * @param {string} prop
9485 * @param {*} value
9486 * @private
9487 */
9488function isProtected(prop, value) {
9489  return console.warn('ModuleLoader.' + prop + ' is protected property! You cannot change it to "' + value + '" after create!');
9490}
9491
9492// ----------------------------------------
9493// Public
9494// ----------------------------------------
9495
9496var ModuleLoader = function () {
9497  /**
9498   * @param {Object} loaderData
9499   * @param {Promise} [loaderData.importPromise=null]
9500   * @param {string} [loaderData.initSelector='.js-init']
9501   * @param {string} [loaderData.initFunctionName='loaderInit']
9502   * @param {Object} [loaderData.list={}]
9503   * @param {Object} [loaderData.debug=false]
9504   * @param {string} [loaderData.loadingClass='_module-loading']
9505   * @param {string} [loaderData.loadedClass='_module-loaded']
9506   *
9507   * @prop {string} initSelector
9508   * @prop {string} initFunctionName
9509   * @prop {Object} list
9510   * @prop {Object} modules
9511   * @prop {boolean} debug
9512   * @prop {string} loadingClass
9513   * @prop {string} loadedClass
9514   */
9515  function ModuleLoader(loaderData) {
9516    _classCallCheck(this, ModuleLoader);
9517
9518    var _loaderData$importPro = loaderData.importPromise,
9519        importPromise = _loaderData$importPro === undefined ? null : _loaderData$importPro,
9520        _loaderData$initSelec = loaderData.initSelector,
9521        initSelector = _loaderData$initSelec === undefined ? '.js-init' : _loaderData$initSelec,
9522        _loaderData$initFunct = loaderData.initFunctionName,
9523        initFunctionName = _loaderData$initFunct === undefined ? 'loaderInit' : _loaderData$initFunct,
9524        _loaderData$list = loaderData.list,
9525        list = _loaderData$list === undefined ? {} : _loaderData$list,
9526        _loaderData$loadingCl = loaderData.loadingClass,
9527        loadingClass = _loaderData$loadingCl === undefined ? '_module-loading' : _loaderData$loadingCl,
9528        _loaderData$loadedCla = loaderData.loadedClass,
9529        loadedClass = _loaderData$loadedCla === undefined ? '_module-loaded' : _loaderData$loadedCla,
9530        _loaderData$debug = loaderData.debug,
9531        debug = _loaderData$debug === undefined ? false : _loaderData$debug;
9532
9533
9534    if (typeof importPromise !== 'function') {
9535      throw new Error('ModuleLoader ERROR! You must specify "importPromise" property, as Function with import()');
9536    }
9537
9538    if ((typeof list === 'undefined' ? 'undefined' : _typeof(list)) !== 'object' || Object.keys(list).length === 0) {
9539      throw new Error('ModuleLoader ERROR! You must specify "list" property, as Object with values');
9540    }
9541
9542    for (var moduleName in list) {
9543      var selectors = list[moduleName];
9544      if (Array.isArray(selectors)) {
9545        list[moduleName] = selectors.join(',');
9546      }
9547    }
9548
9549    var modules = {};
9550
9551    var _loop = function _loop(_moduleName) {
9552      modules[_moduleName] = function () {
9553        return importPromise(_moduleName);
9554      };
9555    };
9556
9557    for (var _moduleName in list) {
9558      _loop(_moduleName);
9559    }
9560
9561    Object.defineProperty(this, 'initSelector', {
9562      get: function get() {
9563        return initSelector;
9564      },
9565      set: function set(val) {
9566        return isProtected('initSelector', val);
9567      }
9568    });
9569
9570    Object.defineProperty(this, 'initFunctionName', {
9571      get: function get() {
9572        return initFunctionName;
9573      },
9574      set: function set(val) {
9575        return isProtected('initFunctionName', val);
9576      }
9577    });
9578
9579    Object.defineProperty(this, 'list', {
9580      get: function get() {
9581        return list;
9582      },
9583      set: function set(val) {
9584        return isProtected('list', val);
9585      }
9586    });
9587
9588    Object.defineProperty(this, 'modules', {
9589      get: function get() {
9590        return modules;
9591      },
9592      set: function set(val) {
9593        return isProtected('modules', val);
9594      }
9595    });
9596
9597    Object.defineProperty(this, 'loadingClass', {
9598      get: function get() {
9599        return loadingClass;
9600      },
9601      set: function set(val) {
9602        return isProtected('loadingClass', val);
9603      }
9604    });
9605
9606    Object.defineProperty(this, 'loadedClass', {
9607      get: function get() {
9608        return loadedClass;
9609      },
9610      set: function set(val) {
9611        return isProtected('loadedClass', val);
9612      }
9613    });
9614
9615    this.debug = debug;
9616  }
9617
9618  /**
9619   * @param {string} type
9620   * @param {string} msg
9621   * @param {...*} [data]
9622   * @private
9623   */
9624
9625
9626  _createClass(ModuleLoader, [{
9627    key: 'log',
9628    value: function log(type, msg) {
9629      if (this.debug) {
9630        var _console;
9631
9632        for (var _len = arguments.length, data = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
9633          data[_key - 2] = arguments[_key];
9634        }
9635
9636        (_console = console)[type].apply(_console, ['ModuleLoader ' + type + ': ' + msg].concat(data));
9637      }
9638    }
9639
9640    /**
9641     * @param {jQuery} [$context=$(document)]
9642     * @param {string} [selectors]
9643     * @returns {jQuery}
9644     * @public
9645     */
9646
9647  }, {
9648    key: 'getElements',
9649    value: function getElements() {
9650      var _this = this;
9651
9652      var $context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _jquery2.default)(document);
9653      var selectors = arguments[1];
9654
9655      var selector = this.initSelector;
9656      if (selectors) {
9657        selector = selectors.split(',').map(function (selector) {
9658          return _this.initSelector + selector;
9659        }).join(',');
9660      }
9661      this.log('info', 'Get elements "' + selector + '" in', $context);
9662      return $context.find(selector);
9663    }
9664
9665    /**
9666     * @param {string} moduleName
9667     * @param {jQuery} [$context]
9668     * @public
9669     */
9670
9671  }, {
9672    key: 'runModule',
9673    value: function runModule(moduleName, $context) {
9674      this.log('warn', 'Use .load() only method after .init()');
9675      console.log(moduleName, $context);
9676    }
9677
9678    /**
9679     * @param {jQuery} $elements
9680     * @private
9681     */
9682
9683  }, {
9684    key: 'markAsLoadingElements',
9685    value: function markAsLoadingElements($elements) {
9686      $elements.not(this.loadedClass).addClass(this.loadingClass);
9687    }
9688
9689    /**
9690     * @param {jQuery} $elements
9691     * @private
9692     */
9693
9694  }, {
9695    key: 'markAsLoadedElements',
9696    value: function markAsLoadedElements($elements) {
9697      $elements.removeClass(this.loadingClass).addClass(this.loadedClass);
9698      $elements.data('moduleLoader', this);
9699    }
9700
9701    /**
9702     * @param {jQuery} [$context=$(document)]
9703     * @public
9704     */
9705
9706  }, {
9707    key: 'init',
9708    value: function init() {
9709      var $context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _jquery2.default)(document);
9710
9711      var $elements = this.getElements($context);
9712      if (!$elements.length) {
9713        this.log('info', 'No init elements with selector "' + this.initSelector + '"');
9714        return false;
9715      }
9716
9717      this.runModule = function (moduleName, $context) {
9718        var _this2 = this;
9719
9720        var selectors = this.list[moduleName];
9721        var $moduleElements = $context ? this.getElements($context, selectors) : $elements.filter(selectors);
9722        this.markAsLoadingElements($moduleElements);
9723
9724        if ($moduleElements.length) {
9725          this.log('info', 'Load module "' + moduleName + '"');
9726          return this.modules[moduleName]().then(function (module) {
9727            var isFunction = typeof module[_this2.initFunctionName] === 'function';
9728            if (isFunction) {
9729              _this2.log('info', 'Init module "' + moduleName + '"');
9730              _this2.markAsLoadedElements($moduleElements);
9731              module[_this2.initFunctionName]($moduleElements, _this2);
9732            } else {
9733              _this2.log('warn', 'Module "' + moduleName + '" has no exported method "' + _this2.initSelector + '"');
9734            }
9735          }).catch(function (err) {
9736            console.error(err);
9737          });
9738        }
9739
9740        return Promise.resolve();
9741      };
9742
9743      for (var moduleName in this.list) {
9744        this.runModule(moduleName);
9745      }
9746    }
9747  }]);
9748
9749  return ModuleLoader;
9750}();
9751
9752// ----------------------------------------
9753// Exports
9754// ----------------------------------------
9755
9756exports.default = ModuleLoader;
9757
9758/***/ }),
9759
vendor: 9,240 bytes, lines 9760-10058
9760/***/ "./node_modules/wezom-standard-tabs/index.js":
9761/*!***************************************************!*\
9762  !*** ./node_modules/wezom-standard-tabs/index.js ***!
9763  \***************************************************/
9764/*! exports provided: default */
9765/***/ (function(module, __webpack_exports__, __webpack_require__) {
9766
9767"use strict";
9768__webpack_require__.r(__webpack_exports__);
9769/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery");
9770/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
9771/* harmony import */ var custom_jquery_methods_fn_get_my_elements__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! custom-jquery-methods/fn/get-my-elements */ "./node_modules/custom-jquery-methods/fn/get-my-elements.js");
9772/* harmony import */ var custom_jquery_methods_fn_get_my_elements__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(custom_jquery_methods_fn_get_my_elements__WEBPACK_IMPORTED_MODULE_1__);
9773
9774
9775/**
9776 * Wezom Standard Tabs
9777 * @module
9778 * @author Oleg Dutchenko <[email protected]>
9779 * @licence {@link https://github.com/WezomAgency/wezom-standard-tabs/blob/master/LICENSE}
9780 */
9781
9782// ----------------------------------------
9783// Imports
9784// ----------------------------------------
9785
9786
9787
9788
9789// ----------------------------------------
9790// Private
9791// ----------------------------------------
9792
9793/**
9794 * @type {{myBlocks: string, myBlock: string, myButtons: string}}
9795 * @private
9796 */
9797const _myKeys = {
9798	myBlock: '$myWsTabsBlock',
9799	myBlocks: '$myWsTabsBlocks',
9800	myButtons: '$myWsTabsButtons'
9801};
9802
9803/**
9804 * @param {jQuery} $button
9805 * @return {boolean|undefined}
9806 * @private
9807 */
9808function _noReact ($button) {
9809	return $button.hasClass(wsTabs.cssClass.active) || $button.hasClass(wsTabs.cssClass.disabled) || $button.prop('disabled');
9810}
9811
9812/**
9813 * @param {jQuery} $button
9814 * @param {jQuery} $context
9815 * @return {{myNs:string, myName:string, buttonsSelector:string, buttonSyncSelector:string, blocksSelector:string, blockSelector:string, $block:jQuery, $siblingBlocks:jQuery, $siblingButtons:jQuery, $syncButtons:jQuery}}
9816 * @private
9817 */
9818function _ejectData ($button, $context) {
9819	let $sibling = null;
9820	const data = {
9821		myNs: $button.data(wsTabs.keys.ns),
9822		myName: $button.data(wsTabs.keys.button),
9823		get buttonsSelector () {
9824			return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.button}]`;
9825		},
9826		get buttonSyncSelector () {
9827			return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.button}="${this.myName}"]`;
9828		},
9829		get blocksSelector () {
9830			return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.block}]`;
9831		},
9832		get blockSelector () {
9833			return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.block}="${this.myName}"]`;
9834		},
9835		get $block () {
9836			return $button.getMyElements(_myKeys.myBlock, this.blockSelector);
9837		},
9838		get $siblingBlocks () {
9839			let $blocks = this.$block.getMyElements(_myKeys.myBlocks, this.blocksSelector, $context, true);
9840			return $blocks.not(this.blockSelector);
9841		},
9842		get $siblingButtons () {
9843			return $sibling || $button.getMyElements(_myKeys.myButtons, this.buttonsSelector, $context, true);
9844		},
9845		get $syncButtons () {
9846			return this.$siblingButtons.filter(this.buttonSyncSelector);
9847		}
9848	};
9849	if (data.$syncButtons.length) {
9850		$sibling = data.$siblingButtons.not(data.$syncButtons);
9851	}
9852	return data;
9853}
9854
9855/**
9856 * @param {string} name
9857 * @param {*} ...args
9858 * @private
9859 */
9860function _runHook (name, ...args) {
9861	const hooks = wsTabs.hooks[name];
9862	if (Array.isArray(hooks)) {
9863		hooks.forEach(hook => {
9864			if (typeof hook === 'function') {
9865				hook(...args);
9866			}
9867		});
9868	}
9869}
9870
9871/**
9872 * @param {jQuery} $button
9873 * @param {jQuery} $context
9874 * @private
9875 */
9876function _changeTab ($button, $context) {
9877	const { myNs, myName, $block, $siblingBlocks, $siblingButtons, $syncButtons } = _ejectData($button, $context);
9878	if (_noReact($button)) {
9879		_runHook('beforeAgain', myNs, myName, $button, $block);
9880		$button.add($block).trigger(wsTabs.events.again);
9881		_runHook('again', myNs, myName, $button, $block);
9882		return false;
9883	}
9884
9885	_runHook('beforeOff', myNs, myName, $siblingButtons, $siblingBlocks);
9886	_runHook('beforeOn', myNs, myName, $button, $block, $syncButtons);
9887
9888	$siblingButtons.add($siblingBlocks).removeClass(wsTabs.cssClass.active).trigger(wsTabs.events.off);
9889	$button.add($syncButtons).add($block).addClass(wsTabs.cssClass.active).trigger(wsTabs.events.on);
9890
9891	_runHook('off', myNs, myName, $siblingButtons, $siblingBlocks);
9892	_runHook('on', myNs, myName, $button, $block, $syncButtons);
9893}
9894
9895/**
9896 * @param {jQuery} $buttons
9897 * @param {jQuery} $context
9898 * @private
9899 */
9900function setActiveIfNotHave ($buttons, $context) {
9901	let ns = $buttons.data(wsTabs.keys.ns);
9902	let selector = `[data-${wsTabs.keys.ns}="${ns}"]`;
9903	let $group = $buttons.filter(selector);
9904
9905	if ($group.length) {
9906		let $active = $group.filter(`.${wsTabs.cssClass.active}`);
9907		if (!$active.length) {
9908			_changeTab($group.eq(0), $context);
9909		}
9910
9911		if ($group.length < $buttons.length) {
9912			setActiveIfNotHave($buttons.not(selector), $context);
9913		}
9914	}
9915}
9916
9917/**
9918 * @param {jQuery} $list
9919 * @param {strig[]} keys
9920 * @private
9921 */
9922function dropDependencies ($list, keys) {
9923	const wsTabsKeys = Object.keys(wsTabs.keys);
9924	$list.each((i, el) => {
9925		let $item = jquery__WEBPACK_IMPORTED_MODULE_0___default()(el);
9926		wsTabsKeys.forEach(key => {
9927			$item.data(key, null);
9928		});
9929	});
9930}
9931
9932// ----------------------------------------
9933// Public
9934// ----------------------------------------
9935
9936/**
9937 * @namespace
9938 */
9939const wsTabs = {
9940	/**
9941	 * @enum {string}
9942	 */
9943	events: {
9944		on: 'wstabs-on',
9945		off: 'wstabs-off',
9946		again: 'wstabs-again'
9947	},
9948
9949	/**
9950	 * @enum {function[]}
9951	 */
9952	hooks: {
9953		beforeOn: [],
9954		beforeOff: [],
9955		beforeAgain: [],
9956		on: [],
9957		off: [],
9958		again: [],
9959		update: []
9960	},
9961
9962	/**
9963	 * @enum {string}
9964	 */
9965	cssClass: {
9966		active: 'is-active',
9967		disabled: 'is-disabled'
9968	},
9969
9970	/**
9971	 * @enum {string}
9972	 */
9973	keys: {
9974		ns: 'wstabs-ns',
9975		button: 'wstabs-button',
9976		block: 'wstabs-block'
9977	},
9978
9979	/**
9980	 * Initialize.
9981	 * Set dependencies and delegated handlers
9982	 * @param {jQuery} [$context=$(document)]
9983	 */
9984	init ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) {
9985		this.updateDependencies($context);
9986		$context.on('click', `[data-${this.keys.button}]`, { $context }, function () {
9987			_changeTab(jquery__WEBPACK_IMPORTED_MODULE_0___default()(this), $context);
9988		});
9989
9990		$context.on('keydown', `[data-${this.keys.button}]`, { $context }, function (event) {
9991			let code = null;
9992			if (event.key !== undefined) {
9993				code = event.key;
9994			} else if (event.keyIdentifier !== undefined) {
9995				code = event.keyIdentifier;
9996			} else if (event.keyCode !== undefined) {
9997				code = event.keyCode;
9998			}
9999			if (code === 13 || code.toLowerCase() === 'enter') {
10000				_changeTab(jquery__WEBPACK_IMPORTED_MODULE_0___default()(this), $context);
10001			}
10002		});
10003	},
10004
10005	/**
10006	 * Forced activation of tabs if there are no active one
10007	 * @param {jQuery} [$context=$(document)]
10008	 */
10009	setActive ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) {
10010		let $buttons = $context.find(`[data-${this.keys.button}]`);
10011		setActiveIfNotHave($buttons, $context);
10012	},
10013
10014	/**
10015	 * Remove all dependencies
10016	 * @param {jQuery} [$context=$(document)]
10017	 * @return {{$buttons: $jQuery, $blocks: $jQuery}}
10018	 */
10019	dropDependencies ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) {
10020		let $buttons = $context.find(`[data-${this.keys.button}]`);
10021		let $blocks = $context.find(`[data-${this.keys.block}]`);
10022		dropDependencies($buttons, [_myKeys.myBlock, _myKeys.myButtons]);
10023		dropDependencies($blocks, [_myKeys.myBlocks]);
10024		return { $buttons, $blocks };
10025	},
10026
10027	/**
10028	 * Update all dependencies with pre-reset.
10029	 * Actual when dynamically adding new buttons and blocks to existing tab groups
10030	 * @param {jQuery} [$context=$(document)]
10031	 */
10032	updateDependencies ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) {
10033		const { $buttons } = this.dropDependencies($context);
10034		$buttons.each((i, button) => {
10035			const $button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button);
10036			const { myNs, myName, $block, $syncButtons } = _ejectData($button, $context);
10037			_runHook('update', myNs, myName, $button, $block, $syncButtons);
10038		});
10039	},
10040
10041	/**
10042	 * @param {jQuery} $button
10043	 * @param {jQuery} [$context=$(document)]
10044	 * @returns {{myNs: string, myName: string, buttonsSelector: string, buttonSyncSelector: string, blocksSelector: string, blockSelector: string, $block: jQuery, $siblingBlocks: jQuery, $siblingButtons: jQuery, $syncButtons: jQuery}}
10045	 */
10046	ejectData ($button, $context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) {
10047		return _ejectData($button, $context);
10048	}
10049};
10050
10051// ----------------------------------------
10052// Exports
10053// ----------------------------------------
10054
10055/* harmony default export */ __webpack_exports__["default"] = (wsTabs);
10056
10057
10058/***/ })
10058,
10059
10060/***/ "jquery":
10061/*!*************************!*\
10062  !*** external "jQuery" ***!
10063  \*************************/
10064/*! no static exports found */
10065/***/ (function(module, exports) {
10066
10067module.exports = jQuery;
10068
10069/***/ })
10070
10071/******/ });
10072//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vLm1vZGVybml6cnJjIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzIGxhenkgXlxcLlxcLy4qJCBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9iYWxsLW1vZGFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9jYXRhbG9nLXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvY2xpY2stdHJpZ2dlci1mb3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL2Nvb2tpZS1kYXRhLmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9lY29tbWVyY2UtdHJhY2tpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL2VxdWFsLWhlaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvbGF6eWxvYWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL21haW4tbWVudS5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvbW9kZXJuaXpyL2N1c3RvbS10ZXN0cy9lZGdlLmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9tb2Rlcm5penIvY3VzdG9tLXRlc3RzL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvbW9kZXJuaXpyL2luZGV4LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9wcm9kdWN0cy1maWx0ZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL3V0bS10cmFja2luZy5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX3BvbHlmaWxscy9tZG4uanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19wb2x5ZmlsbHMvcHJvbWlzZS1wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX3ZlbmRvcnMvZHluYW1pY0FkYXB0LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fdmVuZG9ycy9qcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL2VudHJ5LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9tb2R1bGUtbG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ib2R5LXNjcm9sbC1sb2NrL2xpYi9ib2R5U2Nyb2xsTG9jay5lc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpenIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NyZWF0ZS10aW1lci9jcmVhdGUtdGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9jaGFuZ2UtbXktY2xhc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9nZXQtbXktZWxlbWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzNi1wcm9taXNlLXBvbHlmaWxsL3Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pxdWVyeS1zbm93ZmFsbC9zcmMvc25vd2ZhbGwuanF1ZXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVib3VuY2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21kbi1wb2x5ZmlsbHMvc3JjL09iamVjdC5hc3NpZ24vYXNzaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tZG4tcG9seWZpbGxzL3NyYy9PYmplY3QuYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub3Vpc2xpZGVyL2Rpc3Qvbm91aXNsaWRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL251bWVyYWwvbnVtZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dlem9tLW1vZHVsZS1sb2FkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dlem9tLXN0YW5kYXJkLXRhYnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwialF1ZXJ5XCIiXSwibmFtZXMiOlsiQmFsbE1vZGFsIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiYmFsbCIsIm1vZGFsU3RlcDEiLCJnZXRFbGVtZW50QnlJZCIsIm1vZGFsU3RlcDIiLCJjb25zb2xlIiwid2FybiIsImNvb2tpZURhdGEiLCJyZWNlaXZlIiwic3R5bGUiLCJkaXNwbGF5IiwidmlzaWJpbGl0eSIsImluaXQiLCJjb250YWlucyIsImFwcGVuZENoaWxkIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicG9zaXRpb25CYWxsIiwic2V0VGltZW91dCIsIm9wYWNpdHkiLCJwb2ludGVyRXZlbnRzIiwicG9zaXRpb24iLCJjbGFzc0xpc3QiLCJhZGQiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJhdHRhY2hUb1JhbmRvbVBvc2l0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNob3dNb2RhbFN0ZXAxIiwiaW5pdE1vZGFsSGFuZGxlcnMiLCJpbml0Rm9ybUhhbmRsZXIiLCJpbml0Q29weUJ1dHRvbiIsInJlc2l6ZVRpbWVvdXQiLCJ3aW5kb3ciLCJjbGVhclRpbWVvdXQiLCJib2R5Iiwic2VsZWN0b3JzIiwiY2FuZGlkYXRlcyIsImZvckVhY2giLCJlbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJzZWxlY3RvciIsImVsIiwi
10072Z2V0Q29tcHV0ZWRTdHlsZSIsImlzT2J2aW91cyIsInRhZ05hbWUiLCJtYXRjaCIsImdldEF0dHJpYnV0ZSIsImlzR29vZFNpemUiLCJjbG9zZXN0IiwicHVzaCIsInZpZXdwb3J0SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJ2aWV3cG9ydFdpZHRoIiwiaW5uZXJXaWR0aCIsInZpc2libGVDYW5kaWRhdGVzIiwiZmlsdGVyIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwibGVuZ3RoIiwicmFuZG9tRWxlbWVudCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImF0dGFjaFRvRWxlbWVudCIsImVsZW1lbnQiLCJlbGVtZW50UmVjdCIsInNjcm9sbFkiLCJwYWdlWU9mZnNldCIsInNjcm9sbFgiLCJwYWdlWE9mZnNldCIsImJhbGxXaWR0aCIsImJhbGxIZWlnaHQiLCJwb3NpdGlvbnMiLCJzaWRlIiwieCIsInkiLCJyYW5kb21Qb3MiLCJhYnNvbHV0ZVgiLCJhYnNvbHV0ZVkiLCJ6SW5kZXgiLCJwYWRkaW5nIiwiZG9jdW1lbnRIZWlnaHQiLCJtYXgiLCJzY3JvbGxIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRIZWlnaHQiLCJkb2N1bWVudFdpZHRoIiwic2Nyb2xsV2lkdGgiLCJvZmZzZXRXaWR0aCIsImNsaWVudFdpZHRoIiwibWluWCIsIm1heFgiLCJtaW5ZIiwibWF4WSIsInJhbmRvbVgiLCJyYW5kb21ZIiwib3ZlcmZsb3ciLCJwcm9tb2NvZGUiLCJwcm9tb2NvZGVJbnB1dCIsInZhbHVlIiwicHJvbW9jb2RlVGV4dCIsImRpc2NvdW50VGV4dCIsInN0YXJ0c1dpdGgiLCJwZXJjZW50IiwidGV4dENvbnRlbnQiLCJjbG9zZUJ1dHRvbnMiLCJidG4iLCJoaWRlTW9kYWwiLCJleHBpcmVzIiwicGF0aCIsIlNhbWVTaXRlIiwiU2VjdXJlIiwibW9kYWwiLCJ0YXJnZXQiLCJmb3JtIiwiJGZvcm0iLCJvbiIsInJlc3BvbnNlIiwibG9nIiwic3VjY2VzcyIsImJhbGxtb2RhbCIsInNhdmVCYWxsIiwiZXJyb3JNc2ciLCJlcnJvciIsImFsZXJ0IiwiZGF0YSIsIm1vZGFsUmVzcG9uc2UiLCJlbWFpbElucHV0IiwiZW1haWwiLCJiYXNlVXJsIiwic2F2ZVVybCIsInJlcGxhY2UiLCIkIiwiYWpheCIsImNhY2hlIiwibWV0aG9kIiwidXJsIiwiZGF0YVR5cGUiLCJjb250ZW50VHlwZSIsImRvbmUiLCJ0ZXh0U3RhdHVzIiwieGhyIiwicHJvbW8iLCJzaG93TW9kYWxTdGVwMiIsIm1lc3NhZ2UiLCJmYWlsIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInJlYWR5U3RhdGUiLCJyZXNwb25zZVRleHQiLCJyZXNwb25zZUpTT04iLCJKU09OIiwicGFyc2UiLCJlcnJvclJlc3BvbnNlIiwiY29weUJ0biIsInRhcmdldFNlbGVjdG9yIiwidGFyZ2V0SW5wdXQiLCJzZWxlY3QiLCJzZXRTZWxlY3Rpb25SYW5nZSIsImV4ZWNDb21tYW5kIiwib3JpZ2luYWxUZXh0IiwiZXJyIiwicmVmcyIsIm9wZW5CdG4iLCJoYW5kbGVTZWFyY2hBdXRvY29tcGxldGUiLCJzZWFyY2hUZXJtIiwic2VhcmNoQWxsQnRuIiwiaHJlZiIsIndlem9tQ29uZmlnIiwic2VhcmNoIiwiZW5jb2RlVVJJIiwic2VhcmNoQXV0b2NvbXBsZXRlIiwicXVlcnkiLCJyZXMiLCJpdGVtc19tYXJrdXAiLCJub3RGb3VuZFRleHQiLCJpdGVtc0xpc3QiLCJpbm5lckhUTUwiLCJpdGVtc1dyYXAiLCJoYW5kbGVTZWFyY2hJbnB1dCIsInRyaW0iLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsInNlYXJjaElucHV0IiwiaGFuZGxlRXNjQ2xvc2UiLCJldmVudCIsImNvZGUiLCJtZW51IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRvZ2dsZVNlYXJjaCIsImhhbmRsZUhvdEtleVByZXNzIiwiY3RybEtleSIsIm1ldGFLZXkiLCJpc1NlYXJjaE9wZW4iLCJmb2N1cyIsInNldEF0dHJpYnV0ZSIsInRvZ2dsZSIsImNsb3NlQnRuIiwiY2xpY2tUcmlnZ2VyRm9yIiwiJHRoaXMiLCIkZm9yIiwiZ2V0TXlFbGVtZW50cyIsImNsaWNrIiwiZW5jb2RlciIsImVuY29kZVVSSUNvbXBvbmVudCIsImRlY29kZXIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJrZXkiLCJvcHRpb25zIiwiYWxsb3dVc2FnZSIsImFsbG93VXNhZ2VLZXkiLCJkIiwiRGF0ZSIsInNldFRpbWUiLCJnZXRUaW1lIiwidG9VVENTdHJpbmciLCJ1cGRhdGVkQ29va2llIiwicHJvcE5hbWUiLCJwcm9wVmFsdWUiLCJjb29raWUiLCJtYXRjaGVzIiwiUmVnRXhwIiwidW5kZWZpbmVkIiwiZGVsZXRlIiwiYXNrVXNhZ2UiLCIkaW5mb0Jsb2NrIiwiJGluZm9CdXR0b24iLCJoaWRkZW5DbGFzcyIsImFkZENsYXNzIiwiYWxsb3dVc2FnZVZhbHVlIiwicmVtb3ZlQ2xhc3MiLCJhbGxvd1VzYWdlRGVsYXkiLCJFY29tbWVyY2VUcmFja2luZyIsIml0ZW1CcmFuZCIsImN1cnJlbmN5IiwiZGF0YUxheWVyIiwiZWNvbW1lcmNlIiwicHJvZHVjdERhdGEiLCJpdGVtX2JyYW5kIiwiY2xlYXIiLCJpdGVtcyIsInF1YW50aXR5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXRlbSIsInBhcnNlSW50IiwicHJpY2UiLCJwdXNoRGF0YSIsImFtb3VudCIsIml0ZW1zQXJyYXkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJwYXJzZUZsb2F0Iiwib3JkZXIiLCJvcmRlcklkIiwib3JkZXJfaWQiLCJkZWxpdmVyeVR5cGUiLCJkZWxpdmVyeV90eXBlIiwiY291cG9uIiwidHJhbnNhY3Rpb25faWQiLCJlcXVhbEhlaWdodHNFbGVtZW50cyIsIkVxdWFsSGVpZ2h0IiwiaXRlbUVsZW1lbnQiLCJlcXVhbEhlaWdodHMiLCJsYXp5bG9hZCIsInNlbGVjdG9yT3JOb2RlTGlzdCIsIm9wdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiX2luaXRpYWxpemUiLCJ6ekxvYWQiLCJkZWZhdWx0IiwiTW9kZXJuaXpyIiwiaW50ZXJzZWN0aW9ub2JzZXJ2ZXIiLCJ0aGVuIiwidG9nZ2xlTWVudSIsImlzTWVudU9wZW4iLCJ0b2dnbGVCb2R5U2Nyb2xsTG9jayIsIm9wZW5Nb2JpbGVCdG4iLCJmaXhlZEVsZW1lbnRzIiwiZ2V0QnJ3b3NlclNjcm9sbGJhcldpZHRoIiwiaXNJT1MiLCJuYXZpZ2F0b3IiLCJNYXhUb3VjaFBvaW50cyIsIm1zTWF4VG91Y2hQb2ludHMiLCJ0b2dnbGVGaXhlZEVsZW1lbnRzT2Zmc2V0IiwicGFkZGluZ1JpZ2h0IiwidGFyZ2V0UmVmIiwic2Nyb2xsQmFyV2lkdGgiLCJhZGRUZXN0IiwidGVzdCIsInVzZXJBZ2VudCIsImpRdWVyeSIsImVsbXMiLCJmaWx0ZXJQYXJlbnQiLCJzbGlkZXJFbG0iLCJtaW5FbG0iLCJtYXhFbG0iLCJtaW4iLCJjdXJyZW50TWluIiwiY3VycmVudE1heCIsImRlY2ltYWxzIiwiaXNFbmFibGVkIiwicHJlcGFyZVZhbHVlcyIsImJpbmQiLCJpbml0U2xpZGVyIiwiX3QiLCJfZSIsIl92Iiwic2xpZGVyIiwibWluVmFsdWUiLCJtYXhWYWx1ZSIsIk51bWJlciIsInZhbCIsIm1pblN0YXJ0IiwibWF4U3RhcnQiLCJmb3JtYXRTbGlkZSIsInRvU3RyaW5nIiwidG8iLCJ2IiwiaCIsInIiLCJmb3JtYXQiLCJyZXBlYXQiLCJ0b0ZpeGVkIiwiZnJvbSIsInNsaWRlck9wdGlvbnMiLCJhbmltYXRlIiwiYmVoYXZpb3VyIiwiY29ubmVjdCIsIm
10072Nzc1ByZWZpeCIsInN0YXJ0IiwicmFuZ2UiLCJwaXBzIiwibW9kZSIsImRlbnNpdHkiLCJzdWJzdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsIm5vVWlTbGlkZXIiLCJ1cGRhdGVPcHRpb25zIiwiY3JlYXRlIiwiZm9ybWF0dGVkIiwiaGFuZGxlIiwidGFwIiwic2xpZGVyT2JqIiwic2V0VmFsdWVzIiwic2V0U2lsZGVyIiwic2V0Iiwicm91bmQiLCJVdG1UcmFja2luZyIsInNvdXJjZSIsImdldFBhcmFtZXRlckJ5TmFtZSIsIm1lZGl1bSIsImNhbXBhaWduIiwiY29udGVudCIsInRlcm0iLCJzZXRVdG0iLCJuYW1lIiwicmVnZXgiLCJyZXN1bHRzIiwiZXhlYyIsImxvY2F0aW9uIiwidXRtUGFyYW0iLCJ1dG1WYWwiLCJ1c2VEeW5hbWljQWRhcHQiLCJ0eXBlIiwiY2xhc3NOYW1lIiwiYXR0ck5hbWUiLCJkTm9kZXMiLCJnZXRETm9kZXMiLCJkTWVkaWFRdWVyaWVzIiwiZ2V0RE1lZGlhUXVlcmllcyIsImRNZWRpYVF1ZXJ5IiwibWF0Y2hNZWRpYSIsImZpbHRlcmVkRE5vZGVzIiwiYnJlYWtwb2ludCIsIm1lZGlhSGFuZGxlciIsImdldE1lZGlhSGFuZGxlciIsInJlc3VsdCIsImF0dHIiLCJzcGxpdCIsIm1hcCIsInRvU2VsZWN0b3IiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaXNOdW1iZXIiLCJpbmRleCIsInNvcnRETm9kZXMiLCJ1bmlxSXRlbXMiLCJTZXQiLCJtb3ZlVG8iLCJyZXZlcnNlIiwibW92ZUJhY2siLCJkTm9kZSIsImdldEluZGV4SW5QYXJlbnQiLCJjaGlsZHJlbiIsImFwcGVuZCIsInByZXBlbmQiLCJiZWZvcmUiLCJyZW1vdmUiLCJpbmRleE9mIiwiaXNNaW4iLCJzb3J0IiwiYSIsImIiLCJpc05hTiIsImkiLCJmbiIsIm4iLCJvIiwiZXh0ZW5kIiwib25SZXNpemUiLCJvbkxvYWQiLCJ0IiwicyIsInUiLCJyZXNpemUiLCJlYWNoIiwidGhyb3R0bGUiLCJjYWxsYmFjayIsImxpbWl0Iiwid2FpdCIsIk1haW5Db25maWciLCJzbm93ZmFsbCIsInJlYWR5Iiwic25vd0NvbmZpZyIsImRldmljZW9yaWVudGF0aW9uIiwibWluU2l6ZSIsIm1heFNpemUiLCJtYXhTcGVlZCIsImZsYWtlQ291bnQiLCJzbm93UmVmcmVzaEludGVydmFsSWQiLCJzbm93VGltZXIiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJtb2R1bGVMb2FkZXIiLCJ3c1RhYnMiLCJVVE1UcmFjayIsIlByb2R1Y3RzRmlsdGVyIiwiQnJvd3Nlcml6ciIsImRldGVjdCIsImlzRWRnZSIsIiRoZWFkZXIiLCIkd2luZG93IiwiY3NzQ2xhc3MiLCJwcmV2aW91c2x5QWRkZWQiLCJoYXNDbGFzcyIsInRpbWVvdXQiLCJfZml4ZWQiLCJzY3JvbGxUb3AiLCJjaGFuZ2VNeUNsYXNzIiwibW9kdWxlIiwiZnJhbWVSYXRlIiwiYW5pbWF0aW9uVGltZSIsInN0ZXBTaXplIiwicHVsc2VBbGdvcml0aG0iLCJwdWxzZVNjYWxlIiwicHVsc2VOb3JtYWxpemUiLCJhY2NlbGVyYXRpb25EZWx0YSIsImFjY2VsZXJhdGlvbk1heCIsImtleWJvYXJkU3VwcG9ydCIsImFycm93U2Nyb2xsIiwiZml4ZWRCYWNrZ3JvdW5kIiwiZXhjbHVkZWQiLCJsYXp5bG9hZFNlbGVjdG9yIiwib2JzZXJ2ZXIiLCJvYnNlcnZlIiwidG9nZ2xlQ2xhc3MiLCJldnQiLCJ0b0xvd2VyQ2FzZSIsIkJvb2xlYW4iLCJtYWduaWZpY1BvcHVwIiwiY2xvc2UiLCJoYW5kbGVyMSIsImJ1dHRvbiIsImJsb2NrIiwiY3NzIiwib2Zmc2V0IiwiJGJ1dHRvbiIsIiRibG9jayIsImVxIiwibW9pZGViYXVuY2UiLCJwYXJhbXMiLCJOcGFyYW1zIiwibWFya3VwIiwiJGNvbnRhaW5lciIsIml0ZW1zQmVmb3JlIiwiZmluZCIsImVuZCIsInN0cmluZ2lmeSIsImN1cnJlbnRUYXJnZXQiLCJmaXJzdCIsImhpZGUiLCJzaG93IiwiJHBlcmZlY3RTY3JvbGxiYXIiLCJtb2JpbGVkZXZpY2UiLCJ
10072jc3NzY3JvbGxiYXIiLCJtZXNzYWdlT25Mb2FkTm90eSIsInNob3dNZXNzYWdlTWFnbmlmaWMiLCJ0aXRsZSIsInRleHQiLCJwcmludCIsImluaXRDb3BpcmlnaHRPbkNvcHkiLCJsYW5nIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJoZWxwVGV4dCIsIm5vZGVOYW1lIiwiZ2V0U2VsZWN0aW9uIiwiYyIsImNyZWF0ZUVsZW1lbnQiLCJzZWxlY3RBbGxDaGlsZHJlbiIsIm9uY29weSIsInN0b3BQcm9wYWdhdGlvbiIsInNsaWRlU3BlZWQiLCIkY3VycmVudCIsIiRzcG9pbGVyIiwicGFyZW50cyIsInRvZ2dsZVNwb2lsZXIiLCJuZXh0Iiwic3RvcCIsInNsaWRlVG9nZ2xlIiwib3BlblNwb2lsZXIiLCJzbGlkZURvd24iLCJjbG9zZU5vdEN1cnJlbnRTcG9pbGVyIiwibm90Iiwic2xpZGVVcCIsIiR0ZXh0IiwibG9jYWxlIiwicG9wIiwiZGljdGlvbmFyeSIsImxlc3MiLCJtb3JlIiwiJGNvbW1lbnRzQmxvY2siLCIkY29tbWVudHNMaXN0IiwiY2F0YWxvZ0lEIiwiY2F0YWxvZ19pZCIsInJldmlld3NfbWFya3VwIiwibG92ZXJzTW9kYWxSZWYiLCJsb3ZlcnNNb2RhbENsb3NlSGFuZGxlciIsImNsb3NlQnRuUmVmIiwiZWFzdGVyTW9kYWxSZWYiLCJlYXN0ZXJNb2RhbENsb3NlSGFuZGxlciIsImJhbGxDb250YWluZXIiLCJwcm9kdWN0UGFnZSIsInByb2R1Y3RJZCIsIkVjb21tZXJjZVRyYWNrIiwidHJhY2tWaWV3SXRlbSIsImNoZWNrb3V0UGFnZSIsInRyYWNrQmVnaW5DaGVja291dCIsInRoYW5rUGFnZSIsInRyYWNrUHVyY2hhc2UiLCJjdXJyZW50QWN0aW9uIiwic3BvaWxlckJsb2NrIiwiTW9kdWxlTG9hZGVyIiwiZGVidWciLCJpbXBvcnRQcm9taXNlIiwibW9kdWxlTmFtZSIsImluaXRTZWxlY3RvciIsImluaXRGdW5jdGlvbk5hbWUiLCJsb2FkaW5nQ2xhc3MiLCJsb2FkZWRDbGFzcyIsImxpc3QiLCJuZWVkVG9BZGQiLCJvbkNoYW5nZSIsImNoYW5nZUNsYXNzIiwiZGF0YUtleSIsImRpcmVjdGlvbiIsIm5vdFNlbGYiLCIkZWxlbWVudCIsImtleUlzU2VsZWN0b3IiLCIkdGFyZ2V0IiwianF1ZXJ5IiwiaXNQcm90ZWN0ZWQiLCJwcm9wIiwibG9hZGVyRGF0YSIsIkVycm9yIiwia2V5cyIsImpvaW4iLCJtb2R1bGVzIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJtc2ciLCIkY29udGV4dCIsIiRlbGVtZW50cyIsImdldEVsZW1lbnRzIiwicnVuTW9kdWxlIiwiJG1vZHVsZUVsZW1lbnRzIiwibWFya0FzTG9hZGluZ0VsZW1lbnRzIiwiaXNGdW5jdGlvbiIsIm1hcmtBc0xvYWRlZEVsZW1lbnRzIiwiY2F0Y2giXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTtRQUNBO1FBQ0EsUUFBUSxvQkFBb0I7UUFDNUI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7UUFFQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7Ozs7UUFJQTtRQUNBO1FBQ0Esd0RBQXdELGtIQUFrSCxpQ0FBaUMsd3lDQUF3eUM7UUFDbi9DOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTs7O1FBR0E7O1FBRUE7UUFDQSxpQ0FBaUM7O1FBRWpDO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047O1FBRUE7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0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s7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrRUFBK0UsaUJBQWlCO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpRkFBaUYsaUJBQWlCO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxvRkFBb0YsaUJBQWlCO0FBQ3JHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvRkFBb0YsaUJBQWlCO0FBQ3JHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNwUkE7QUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBLDZEQUE2RDtBQUM3RDs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0F
10072BRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYS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FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsdUJBQXVCLHdCQUF3QjtB
10072QUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsbUNBQW1DO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsb0JBQW9CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsOENBQThDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkMsaUNBQWlDLDBDQUEwQztBQUMzRSw2QkFBNkIsc0NBQXNDO0FBQ25FLDhCQUE4Qix1Q0FBdUM7QUFDckUsZ0JBQWdCLHdCQUF3QjtB
10072QUN4QyxrQkFBa0IsMEJBQTBCO0FBQzVDLG9CQUFvQiw0QkFBNEI7QUFDaEQsZUFBZSx3QkFBd0I7QUFDdkMsa0JBQWtCLDJCQUEyQjtBQUM3Qyw0QkFBNEIscUNBQXFDO0FBQ2pFLGdCQUFnQix3QkFBd0I7QUFDeEMsc0JBQXNCLCtCQUErQjtBQUNyRCxpQkFBaUIsMEJBQTBCO0FBQzNDLGdCQUFnQix5QkFBeUI7QUFDekMsa0JBQWtCLDJCQUEyQjtBQUM3QyxvQkFBb0IsNEJBQTRCO0FBQ2hELHFCQUFxQiw4QkFBOEI7QUFDbkQsaUJBQWlCLDBCQUEwQjtBQUMzQyxtQkFBbUIsNEJBQTRCO0FBQy9DLDBCQUEwQixrQ0FBa0M7QUFDNUQsMEJBQTBCLG1DQUFtQztBQUM3RCxvQkFBb0IsNEJBQTRCO0FBQ2hELHFCQUFxQiw2QkFBNkI7QUFDbEQsMkJBQTJCLG9DQUFvQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUJBQXFCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdCQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsZ0JBQWdCO0FBQzNGO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
10072FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZ0NBQWdDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsZ0NBQWdDO0FBQzlDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
10072FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix5Q0FBeUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFdBQVcsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNnQztBQUNWO0FBQ1A7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7Ozs7Ozs7Ozs7OztBQ3p4RUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLElBQTBDO0FBQ2xELFFBQVEsb0NBQU8sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLG9HQUFDO0FBQ3ZCLEtBQUssTUFBTSxFQUlOO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RCxFQUFFO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QU
10072FDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0QseURBQXlEO0FBQzdHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFELEVBQUU7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7Ozs7QUFJTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQkFBMkIsZ0NBQWdDO0FBQzNEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseURBQXlELFlBQVk7QUFDckU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDLEVBQUU7O0FBRWhEOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0F
10072BRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBLENBQUM7Ozs7Ozs7Ozs7OztBQ3AvQkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0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0FBQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVlLHFFQUFNLEVBQUM7Ozs7Ozs7Ozs7OztBQzFSdEIsd0IiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG5cblxuIFx0XHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcbiBcdFx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG4gXHRcdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDAsIHJlc29sdmVzID0gW107XG4gXHRcdGZvcig7aSA8IGNodW5rSWRzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0Y2h1bmtJZCA9IGNodW5rSWRzW2ldO1xuIFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuIFx0XHRcdFx0cmVzb2x2ZXMucHVzaChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bM
10072F0pO1xuIFx0XHRcdH1cbiBcdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuIFx0XHR9XG4gXHRcdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuIFx0XHRcdGlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVzW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0aWYocGFyZW50SnNvbnBGdW5jdGlvbikgcGFyZW50SnNvbnBGdW5jdGlvbihkYXRhKTtcblxuIFx0XHR3aGlsZShyZXNvbHZlcy5sZW5ndGgpIHtcbiBcdFx0XHRyZXNvbHZlcy5zaGlmdCgpKCk7XG4gXHRcdH1cblxuIFx0fTtcblxuXG4gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuIFx0Ly8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4gXHQvLyBQcm9taXNlID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxuIFx0dmFyIGluc3RhbGxlZENodW5rcyA9IHtcbiBcdFx0XCJidW5kbGVcIjogMFxuIFx0fTtcblxuXG5cbiBcdC8vIHNjcmlwdCBwYXRoIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBqc29ucFNjcmlwdFNyYyhjaHVua0lkKSB7XG4gXHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBcIl9hc3luYy1tb2R1bGVzL1wiICsgKHtcInZlbmRvcnN+ZHJhZ2dhYmxlLXRhYmxlXCI6XCJ2ZW5kb3JzfmRyYWdnYWJsZS10YWJsZVwiLFwiZHJhZ2dhYmxlLXRhYmxlXCI6XCJkcmFnZ2FibGUtdGFibGVcIixcIndyYXAtbWVkaWFcIjpcIndyYXAtbWVkaWFcIn1bY2h1bmtJZF18fGNodW5rSWQpICsgXCIuanM/PVwiICsge1wiMFwiOlwiOTNmYTYxM2M1MTYyNTllZGZmOGJcIixcIjFcIjpcIjhiMzc1ZjE4MTU1MmM0ZDIyNzQ2XCIsXCIyXCI6XCI4MGJjMWQxZjA5ZGVkMjM0NWUyNFwiLFwiM1wiOlwiNmU4YWE1OWE2Y2ZmMGM5YzJjNDZcIixcIjRcIjpcIjQxMzgyNzE2ZDQ4MWI1NDRlYzUxXCIsXCI1XCI6XCI2YmM1MGU0M2RiZDI5YjNkNDRiYVwiLFwiNlwiOlwiZWY0M2Q5ODAxNmQ1Yjk0NzNkNWVcIixcIjdcIjpcIjgzYjgwNmY5OWRhN2QxYzNhOGMzXCIsXCI4XCI6XCI0YTVmYzZlZDkzNGU5NDBmNGQ4NFwiLFwiOVwiOlwiYjlkYzI2NWZmMzAzYjhiZTM5YzVcIixcIjEwXCI6XCJhMjJkYzIxNzNkY2E0OWM2NmM1MlwiLFwiMTFcIjpcIjFmNjI2NGU0ZTU2NTBmMjUxODFkXCIsXCIxMlwiOlwiYWIxMDZkNjNmYzU2N2Y0MTI3ZjFcIixcIjEzXCI6XCI4NTYzNTA4M2NjYTNmNDNjZDQyN1wiLFwiMTRcIjpcImU2NmVlNTE2ZGM0OTU1MDM3N2NhXCIsXCIxNVwiOlwiOTIyMDBhNWNlNGU2MjUxMDE5MThcIixcIjE2XCI6XCIxZjUyOGJjMjdmZGJmNjViYTQ3NFwiLFwiMTdcIjpcImIxM2RiOWJhMTYzZDk5MDcyMzU5XCIsXCIxOFwiOlwiMWE5YmUwNjkwMTNiZTRmZWMyM2FcIixcIjE5XCI6XCI4OTA5YWM5YWJjNjRiZTcwMjRjYlwiLFwiMjBcIjpcIjkxNjVlNGFlZGNlOTFhNTQ1MmE2XCIsXCIyMVwiOlwiYTA2MWU3ZDZlZTEwNDI1MWJmMTBcIixcIjIyXCI6XCJkZTJkODlkODA5Y2ZlZmY2OWNlMlwiLFwiMjNcIjpcIjU0ZWNmYzYxYmNlNzE3YTgzZDI4XCIsXCIyNFwiOlwiYTYwMWM3NjQwOWJlYTY4YTVhMGZcIixcIjI1XCI6XCI2NmIzOTYwOTBlODg4MzRjNzEwOFwiLFwiMjZcIjpcImFjYTkzMzQ3YzM1M2E2OTZlMjM1XCIsXCIyN1wiOlwiZTg3NWEyNTlkNjNlYjE4ZWJhMTNcIixcIjI4XCI6XCI3OWY2ZDJiZTdiNmRmYWVjMWRiY1wiLFwiMjlcIjpcIjU0YmViY2E5YTRmYTM3NmU3ZjNjXCIsXCIzMFwiOlwiYmExMDA0ZmY5Yzk1YTkwZmIyYjdcIixcIjMxXCI6XCI1MzI0MTk3MjBlZjg1YjE1OTNjYlwiLFwiMzJcIjpcImY4OTk0ODVkMDg5ZDcwY2ViNmJmXCIsXCIzM1wiOlwiZDQwMWQ2YTY1ZDAxMjBlZmJkMWFcIixcIjM0XCI6XCJjYjg4NjM2MGMzYTVlMzA5ZGY1M1wiLFwiMzVcIjpcIjRlMWQwYWIzY2Y2ZmQyZGJhOTA2XCIsXCIzNlwiOlwiMDNmOTU3Y2EzNmQ2ODMyNzI5MzhcIixcIjM3XCI6XCI5NmNiYjczZDI1YzM4ZWNlYTI1Y1wiLFwiMzhcIjpcImJjMDdiODExOWMwMWQwMmM4YTc0XCIsXCIzOVwiOlwiYzc3ZjY4MjIyODk1NjA5MjlmN2NcIixcIjQwXCI6XCJlODBmMTIzNDU4YTA5NzViZjk5MlwiLFwiNDFcIjpcIjc1YmViYzk3ZGVlN2Y3OWY3MjcwXCIsXCI0MlwiOlwiNGUwNTFkNWJmNjk5MTA1MjNmZGZcIixcInZlbmRvcnN+ZHJhZ2dhYmxlLXRhYmxlXCI6XCJjMTlhNzhmMWRiMzdjNjhkOGI2M1wiLFwiZHJhZ2dhYmxlLXRhYmxlXCI6XCI2MzZiMzQ2YTJmODZhMDBkYmZkYlwiLFwid3JhcC1tZWRpYVwiOlwiMGZmZWJiZGQ3NjU4NTk0ZjBkNTlcIn1bY2h1bmtJZF0gKyBcIlwiXG4gXHR9XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybi
10072B0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuIFx0Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuIFx0Ly8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSBmdW5jdGlvbiByZXF1aXJlRW5zdXJlKGNodW5rSWQpIHtcbiBcdFx0dmFyIHByb21pc2VzID0gW107XG5cblxuIFx0XHQvLyBKU09OUCBjaHVuayBsb2FkaW5nIGZvciBqYXZhc2NyaXB0XG5cbiBcdFx0dmFyIGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcbiBcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG4gXHRcdFx0Ly8gYSBQcm9taXNlIG1lYW5zIFwiY3VycmVudGx5IGxvYWRpbmdcIi5cbiBcdFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEpIHtcbiBcdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0Ly8gc2V0dXAgUHJvbWlzZSBpbiBjaHVuayBjYWNoZVxuIFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiBcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gXHRcdFx0XHR9KTtcbiBcdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdID0gcHJvbWlzZSk7XG5cbiBcdFx0XHRcdC8vIHN0YXJ0IGNodW5rIGxvYWRpbmdcbiBcdFx0XHRcdHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiBcdFx0XHRcdHZhciBvblNjcmlwdENvbXBsZXRlO1xuXG4gXHRcdFx0XHRzY3JpcHQuY2hhcnNldCA9ICd1dGYtOCc7XG4gXHRcdFx0XHRzY3JpcHQudGltZW91dCA9IDEyMDtcbiBcdFx0XHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG4gXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdHNjcmlwdC5zcmMgPSBqc29ucFNjcmlwdFNyYyhjaHVua0lkKTtcblxuIFx0XHRcdFx0b25TY3JpcHRDb21wbGV0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuIFx0XHRcdFx0XHQvLyBhdm9pZCBtZW0gbGVha3MgaW4gSUUuXG4gXHRcdFx0XHRcdHNjcmlwdC5vbmVycm9yID0gc2NyaXB0Lm9ubG9hZCA9IG51bGw7XG4gXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiBcdFx0XHRcdFx0dmFyIGNodW5rID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0XHRcdFx0XHRpZihjaHVuayAhPT0gMCkge1xuIFx0XHRcdFx0XHRcdGlmKGNodW5rKSB7XG4gXHRcdFx0XHRcdFx0XHR2YXIgZXJyb3JUeXBlID0gZXZlbnQgJiYgKGV2ZW50LnR5cGUgPT09ICdsb2FkJyA/ICdtaXNzaW5nJyA6IGV2ZW50LnR5cGUpO1xuIFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcbiBcdFx0XHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcignTG9hZGluZyBjaHVuayAnICsgY2h1bmtJZCArICcgZmFpbGVkLlxcbignICsgZXJyb3JUeXBlICsgJzogJyArIHJlYWxTcmMgKyAnKScpO1xuIFx0XHRcdFx0XHRcdFx0ZXJyb3IudHlwZSA9IGVycm9yVHlwZTtcbiBcdFx0XHRcdFx0XHRcdGVycm9yLnJlcXVlc3QgPSByZWFsU3JjO1xuIFx0XHRcdFx0XHRcdFx0Y2h1bmtbMV0oZXJyb3IpO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH07XG4gXHRcdFx0XHR2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiBcdFx0XHRcdFx0b25TY3JpcHRDb21wbGV0ZSh7IHR5cGU6ICd0aW1lb3V0JywgdGFyZ2V0OiBzY3JpcHQgfSk7XG4gXHRcdFx0XHR9LCAxMjAwMDApO1xuIFx0XHRcdFx0c2NyaXB0Lm9uZXJyb3IgPSBzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZTtcbiBcdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiBcdH07XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybi
10072Btb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvTWVkaWEvYXNzZXRzLy9qcy9cIjtcblxuIFx0Ly8gb24gZXJyb3IgZnVuY3Rpb24gZm9yIGFzeW5jIGxvYWRpbmdcbiBcdF9fd2VicGFja19yZXF1aXJlX18ub2UgPSBmdW5jdGlvbihlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB0aHJvdyBlcnI7IH07XG5cbiBcdHZhciBqc29ucEFycmF5ID0gd2luZG93W1wid2VicGFja0pzb25wXCJdID0gd2luZG93W1wid2VicGFja0pzb25wXCJdIHx8IFtdO1xuIFx0dmFyIG9sZEpzb25wRnVuY3Rpb24gPSBqc29ucEFycmF5LnB1c2guYmluZChqc29ucEFycmF5KTtcbiBcdGpzb25wQXJyYXkucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrO1xuIFx0anNvbnBBcnJheSA9IGpzb25wQXJyYXkuc2xpY2UoKTtcbiBcdGZvcih2YXIgaSA9IDA7IGkgPCBqc29ucEFycmF5Lmxlbmd0aDsgaSsrKSB3ZWJwYWNrSnNvbnBDYWxsYmFjayhqc29ucEFycmF5W2ldKTtcbiBcdHZhciBwYXJlbnRKc29ucEZ1bmN0aW9uID0gb2xkSnNvbnBGdW5jdGlvbjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9fSFRNTC9zcmMvanMvZW50cnkuanNcIik7XG4iLCI7KGZ1bmN0aW9uKHdpbmRvdyl7XG52YXIgaGFkR2xvYmFsID0gJ01vZGVybml6cicgaW4gd2luZG93O1xudmFyIG9sZEdsb2JhbCA9IHdpbmRvdy5Nb2Rlcm5penI7XG4vKiEgbW9kZXJuaXpyIDMuMTEuNCAoQ3VzdG9tIEJ1aWxkKSB8IE1JVCAqXG4gKiBodHRwczovL21vZGVybml6ci5jb20vZG93bmxvYWQvPy1jc3NzY3JvbGxiYXItdG91Y2hldmVudHMtYWRkdGVzdC1tcS1zZXRjbGFzc2VzLXRlc3Rwcm9wICEqL1xuIWZ1bmN0aW9uKGUsbix0LG8pe2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdHlwZW9mIGU9PT1ufWZ1bmN0aW9uIGkoZSl7dmFyIG49dy5jbGFzc05hbWUsdD1Nb2Rlcm5penIuX2NvbmZpZy5jbGFzc1ByZWZpeHx8XCJcIjtpZihfJiYobj1uLmJhc2VWYWwpLE1vZGVybml6ci5fY29uZmlnLmVuYWJsZUpTQ2xhc3Mpe3ZhciBvPW5ldyBSZWdFeHAoXCIoXnxcXFxccylcIit0K1wibm8tanMoXFxcXHN8JClcIik7bj1uLnJlcGxhY2UobyxcIiQxXCIrdCtcImpzJDJcIil9TW9kZXJuaXpyLl9jb25maWcuZW5hYmxlQ2xhc3NlcyYmKGUubGVuZ3RoPjAmJihuKz1cIiBcIit0K2Uuam9pbihcIiBcIit0KSksXz93LmNsYXNzTmFtZS5iYXNlVmFsPW46dy5jbGFzc05hbWU9bil9ZnVuY3Rpb24gcygpe3JldHVyblwiZnVuY3Rpb25cIiE9dHlwZW9mIHQuY3JlYXRlRWxlbWVudD90LmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTpfP3QuY3JlYXRlRWxlbWVudE5TLmNhbGwodCxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsYXJndW1lbnRzWzBdKTp0LmNyZWF0ZUVsZW1lbnQuYXBwbHkodCxhcmd1bWVudHMpfWZ1bmN0aW9uIGwoKXt2YXIgZT10LmJvZHk7cmV0dXJuIGV8fChlPXMoXz9cInN2Z1wiOlwiYm9keVwiKSxlLmZha2U9ITApLGV9ZnVuY3Rpb24gYShlLG4sbyxyKXt2YXIgaSxhLHUsZixjPVwibW9kZXJuaXpyXCIsZD1zKFwiZGl2XCIpLHA9bCgpO2lmKHBhcnNlSW50KG8sMTApKWZvcig7by0tOyl1PXMoXCJkaXZcIiksdS5pZD1yP3Jbb106YysobysxKSxkLmFwcGVuZENoaWxkKHUpO3JldHVybiBpPXMoXCJzdHlsZVwiKSxpLnR5cGU9XCJ0ZXh0L2Nzc1wiLGkuaWQ9XCJzXCIrYywocC5mYWtlP3A6ZCkuYXBwZW5kQ2hpbGQoaSkscC5hcHBlbmRDaGlsZChkKSxpLnN0eWxlU2hlZXQ/aS5zdHlsZVNoZWV0LmNzc1RleHQ9ZTppLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoZSkpLGQuaWQ9YyxwLmZha2UmJihwLnN0eWxlLmJhY2tncm91bmQ9XCJcIixwLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIsZj13LnN0eWxlLm92ZXJmbG93LHcuc3R5bGUub3ZlcmZsb3c9XCJoaWRkZW5cIix3LmFwcGVuZENoaWxkKHApKSxhPW4oZCxlKSxwLmZha2U/KHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSx3LnN0eWxlLm92ZXJmbG93PWYsdy5vZmZzZXRIZWlnaHQpOmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSwhIWF9ZnVuY3Rpb24gdShlLHQsbyl7dmFyIHI7aWYoXCJnZXRDb21wdXRlZFN0eWxlXCJpbiBuKXtyPWdldENvbXB1dGVkU3R5bGUuY2FsbChuLGUsdCk7dmFyIGk9bi5jb25zb2xlO2lmKG51bGwhPT1yKW8mJihyPXIuZ2V0UHJvcGVydHlWYWx1ZShvKSk7ZWxzZSBpZihpKXt2YXIgcz1pLmVycm9yP1wiZXJyb3JcIjpcImxvZ1wiO2lbc10uY2FsbChpLFwiZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5pbmcgbnVsbCwgaXRzIHBvc3NpYmxlIG1vZGVybml6ciB0ZXN0IHJlc3VsdHMgYXJlIGluYWNjdXJhdGVcIil9fWVsc2Ugcj0hdCYmZS5jdXJyZW50U3R5bGUmJmUuY3VycmVudFN0eWxlW29dO3JldHVybiByfWZ1bmN0aW9uIGYoZSxuKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZSlmb3IodmFyIHQgaW4gZSlTKGUsdCkmJmYodCxlW3RdKTtlbHNle2U9ZS50b0xvd2VyQ2FzZSgpO3ZhciBvPWUuc3BsaXQoXCIuXCIpLHI9TW9kZXJuaXpyW29bMF1dO2lmKDI9PT1vLmxlbmd0aCYmKHI9cltvWzFdXSksdm9pZCAwIT09cilyZXR1cm4gTW9kZXJuaXpyO249XCJmdW5jdGlvblwiPT10eXBlb2Ygbj9uKCk6biwxPT09by5sZW5ndGg/TW9kZXJuaXpyW29bMF1dPW46KCFNb2Rlcm5penJbb1swXV18fE1vZGVybml6cltvWzBdXWluc3RhbmNlb2YgQm9vbGVhbnx8KE1vZGVybml6cltvWzBdXT1uZXcgQm9vbGVhbihNb2Rlcm5penJbb1swXV0pKSxNb2Rlcm5penJbb1swXV1bb1sxXV09biksaShbKG4mJiExIT09bj9cIlwiOlwibm8tXCIpK28uam9pbihcIi1cIildKSxNb2Rlcm5penIuX3RyaWdnZXIoZSxuKX1yZXR1cm4gTW9kZXJuaXpyfWZ1bmN0aW9uIGMoZSxuKXtyZXR1cm4hIX4oXCJcIitlKS5pbmRleE9mKG4pfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFtBLVpdKS9nLGZ1bmN0aW9uKGUsbil7cmV0dXJuXCItXCIrbi50b0xvd2VyQ2FzZSgpfSkucmVwbGFjZSgvXm1zLS8sXCItbXMtXCIpfWZ1bmN0aW9uIHAoZSx0KXt2YXIgcj1lLmxlbmd0aDtpZihcIkNTU1wiaW4gbiYmXCJzdXBwb3J0c1wiaW4gbi5DU1Mpe2Zvcig7ci0tOylpZihuLkNTUy5zdXBwb3J0cyhkKGVbcl0pLHQpKXJldHVybiEwO3JldHVybiExfWlmKFwiQ1NTU3VwcG9ydHNSdWxlXCJpbiBuKXtmb3IodmFyIGk9W107ci0tOylpLnB1c2goXCIoXCIrZChlW3JdKStcIjpcIit0K1wiKVwiKTtyZXR1cm4gaT1pLmpvaW4oXCIgb3IgXCIpLGEoXCJAc3VwcG9ydHMgKFwiK2krXCIpIHsgI21vZGVybml6ciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9XCIsZnVuY3Rpb24oZSl7cmV0dXJuXCJhYnNvbHV0ZVwiPT09dShlLG51bGwsXCJwb3NpdGlvblwiKX0pfXJldHVybi
10072BvfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKS0oW2Etel0pL2csZnVuY3Rpb24oZSxuLHQpe3JldHVybiBuK3QudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL14tLyxcIlwiKX1mdW5jdGlvbiBtKGUsbix0LGkpe2Z1bmN0aW9uIGwoKXt1JiYoZGVsZXRlIHguc3R5bGUsZGVsZXRlIHgubW9kRWxlbSl9aWYoaT0hcihpLFwidW5kZWZpbmVkXCIpJiZpLCFyKHQsXCJ1bmRlZmluZWRcIikpe3ZhciBhPXAoZSx0KTtpZighcihhLFwidW5kZWZpbmVkXCIpKXJldHVybiBhfWZvcih2YXIgdSxmLGQsbSx2LHk9W1wibW9kZXJuaXpyXCIsXCJ0c3BhblwiLFwic2FtcFwiXTsheC5zdHlsZSYmeS5sZW5ndGg7KXU9ITAseC5tb2RFbGVtPXMoeS5zaGlmdCgpKSx4LnN0eWxlPXgubW9kRWxlbS5zdHlsZTtmb3IoZD1lLmxlbmd0aCxmPTA7ZjxkO2YrKylpZihtPWVbZl0sdj14LnN0eWxlW21dLGMobSxcIi1cIikmJihtPWgobSkpLHguc3R5bGVbbV0hPT1vKXtpZihpfHxyKHQsXCJ1bmRlZmluZWRcIikpcmV0dXJuIGwoKSxcInBmeFwiIT09bnx8bTt0cnl7eC5zdHlsZVttXT10fWNhdGNoKGUpe31pZih4LnN0eWxlW21dIT09dilyZXR1cm4gbCgpLFwicGZ4XCIhPT1ufHxtfXJldHVybiBsKCksITF9dmFyIHY9W10seT17X3ZlcnNpb246XCIzLjExLjRcIixfY29uZmlnOntjbGFzc1ByZWZpeDpcIlwiLGVuYWJsZUNsYXNzZXM6ITAsZW5hYmxlSlNDbGFzczohMCx1c2VQcmVmaXhlczohMH0sX3E6W10sb246ZnVuY3Rpb24oZSxuKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuKHRbZV0pfSwwKX0sYWRkVGVzdDpmdW5jdGlvbihlLG4sdCl7di5wdXNoKHtuYW1lOmUsZm46bixvcHRpb25zOnR9KX0sYWRkQXN5bmNUZXN0OmZ1bmN0aW9uKGUpe3YucHVzaCh7bmFtZTpudWxsLGZuOmV9KX19LE1vZGVybml6cj1mdW5jdGlvbigpe307TW9kZXJuaXpyLnByb3RvdHlwZT15LE1vZGVybml6cj1uZXcgTW9kZXJuaXpyO3ZhciBnPVtdLHc9dC5kb2N1bWVudEVsZW1lbnQsXz1cInN2Z1wiPT09dy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLEM9ZnVuY3Rpb24oKXt2YXIgZT1uLm1hdGNoTWVkaWF8fG4ubXNNYXRjaE1lZGlhO3JldHVybiBlP2Z1bmN0aW9uKG4pe3ZhciB0PWUobik7cmV0dXJuIHQmJnQubWF0Y2hlc3x8ITF9OmZ1bmN0aW9uKGUpe3ZhciBuPSExO3JldHVybiBhKFwiQG1lZGlhIFwiK2UrXCIgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH1cIixmdW5jdGlvbihlKXtuPVwiYWJzb2x1dGVcIj09PXUoZSxudWxsLFwicG9zaXRpb25cIil9KSxufX0oKTt5Lm1xPUM7dmFyIFM7IWZ1bmN0aW9uKCl7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7Uz1yKGUsXCJ1bmRlZmluZWRcIil8fHIoZS5jYWxsLFwidW5kZWZpbmVkXCIpP2Z1bmN0aW9uKGUsbil7cmV0dXJuIG4gaW4gZSYmcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVtuXSxcInVuZGVmaW5lZFwiKX06ZnVuY3Rpb24obix0KXtyZXR1cm4gZS5jYWxsKG4sdCl9fSgpLHkuX2w9e30seS5vbj1mdW5jdGlvbihlLG4pe3RoaXMuX2xbZV18fCh0aGlzLl9sW2VdPVtdKSx0aGlzLl9sW2VdLnB1c2gobiksTW9kZXJuaXpyLmhhc093blByb3BlcnR5KGUpJiZzZXRUaW
100721lb3V0KGZ1bmN0aW9uKCl7TW9kZXJuaXpyLl90cmlnZ2VyKGUsTW9kZXJuaXpyW2VdKX0sMCl9LHkuX3RyaWdnZXI9ZnVuY3Rpb24oZSxuKXtpZih0aGlzLl9sW2VdKXt2YXIgdD10aGlzLl9sW2VdO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKSgwLHRbZV0pKG4pfSwwKSxkZWxldGUgdGhpcy5fbFtlXX19LE1vZGVybml6ci5fcS5wdXNoKGZ1bmN0aW9uKCl7eS5hZGRUZXN0PWZ9KTt2YXIgYj17ZWxlbTpzKFwibW9kZXJuaXpyXCIpfTtNb2Rlcm5penIuX3EucHVzaChmdW5jdGlvbigpe2RlbGV0ZSBiLmVsZW19KTt2YXIgeD17c3R5bGU6Yi5lbGVtLnN0eWxlfTtNb2Rlcm5penIuX3EudW5zaGlmdChmdW5jdGlvbigpe2RlbGV0ZSB4LnN0eWxlfSk7dmFyIFQ9KHkudGVzdFByb3A9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBtKFtlXSxvLG4sdCl9LHkudGVzdFN0eWxlcz1hKSx6PXkuX2NvbmZpZy51c2VQcmVmaXhlcz9cIiAtd2Via2l0LSAtbW96LSAtby0gLW1zLSBcIi5zcGxpdChcIiBcIik6W1wiXCIsXCJcIl07eS5fcHJlZml4ZXM9eixUKFwiI21vZGVybml6cntvdmVyZmxvdzogc2Nyb2xsOyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4OyB9I1wiK3ouam9pbihcInNjcm9sbGJhcnt3aWR0aDoxMHB4fSAjbW9kZXJuaXpyOjpcIikuc3BsaXQoXCIjXCIpLnNsaWNlKDEpLmpvaW4oXCIjXCIpK1wic2Nyb2xsYmFye3dpZHRoOjEwcHh9XCIsZnVuY3Rpb24oZSl7TW9kZXJuaXpyLmFkZFRlc3QoXCJjc3NzY3JvbGxiYXJcIixcInNjcm9sbFdpZHR
10072oXCJpbiBlJiYzMD09PWUuc2Nyb2xsV2lkdGgpfSksTW9kZXJuaXpyLmFkZFRlc3QoXCJ0b3VjaGV2ZW50c1wiLGZ1bmN0aW9uKCl7aWYoXCJvbnRvdWNoc3RhcnRcImluIG58fG4uVG91Y2hFdmVudHx8bi5Eb2N1bWVudFRvdWNoJiZ0IGluc3RhbmNlb2YgRG9jdW1lbnRUb3VjaClyZXR1cm4hMDt2YXIgZT1bXCIoXCIsei5qb2luKFwidG91Y2gtZW5hYmxlZCksKFwiKSxcImhlYXJ0elwiLFwiKVwiXS5qb2luKFwiXCIpO3JldHVybiBDKGUpfSksZnVuY3Rpb24oKXt2YXIgZSxuLHQsbyxpLHMsbDtmb3IodmFyIGEgaW4gdilpZih2Lmhhc093blByb3BlcnR5KGEpKXtpZihlPVtdLG49dlthXSxuLm5hbWUmJihlLnB1c2gobi5uYW1lLnRvTG93ZXJDYXNlKCkpLG4ub3B0aW9ucyYmbi5vcHRpb25zLmFsaWFzZXMmJm4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aCkpZm9yKHQ9MDt0PG4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aDt0KyspZS5wdXNoKG4ub3B0aW9ucy5hbGlhc2VzW3RdLnRvTG93ZXJDYXNlKCkpO2ZvcihvPXIobi5mbixcImZ1bmN0aW9uXCIpP24uZm4oKTpuLmZuLGk9MDtpPGUubGVuZ3RoO2krKylzPWVbaV0sbD1zLnNwbGl0KFwiLlwiKSwxPT09bC5sZW5ndGg/TW9kZXJuaXpyW2xbMF1dPW86KE1vZGVybml6cltsWzBdXSYmKCFNb2Rlcm5penJbbFswXV18fE1vZGVybml6cltsWzBdXWluc3RhbmNlb2YgQm9vbGVhbil8fChNb2Rlcm5penJbbFswXV09bmV3IEJvb2xlYW4oTW9kZXJuaXpyW2xbMF1dKSksTW9kZXJuaXpyW2xbMF1dW2xbMV1dPW8pLGcucHVzaCgobz9cIlwiOlwibm8tXCIpK2wuam9pbihcIi1cIikpfX0oKSxpKGcpLGRlbGV0ZSB5LmFkZFRlc3QsZGVsZXRlIHkuYWRkQXN5bmNUZXN0O2Zvcih2YXIgaj0wO2o8TW9kZXJuaXpyLl9xLmxlbmd0aDtqKyspTW9kZXJuaXpyLl9xW2pdKCk7ZS5Nb2Rlcm5penI9TW9kZXJuaXpyfSh3aW5kb3csd2luZG93LGRvY3VtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gd2luZG93Lk1vZGVybml6cjtcbmlmIChoYWRHbG9iYWwpIHsgd2luZG93Lk1vZGVybml6ciA9IG9sZEdsb2JhbDsgfVxuZWxzZSB7IGRlbGV0ZSB3aW5kb3cuTW9kZXJuaXpyOyB9XG59KSh3aW5kb3cpOyIsInZhciBtYXAgPSB7XG5cdFwiLi9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQwLFxuXHRcdDE0XG5cdF0sXG5cdFwiLi9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQwLFxuXHRcdDE0XG5cdF0sXG5cdFwiLi9hbmltYXRlZC10ZXh0XCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvYW5pbWF0ZWQtdGV4dC5qc1wiLFxuXHRcdDIyXG5cdF0sXG5cdFwiLi9hbmltYXRlZC10ZXh0LmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvYW5pbWF0ZWQtdGV4dC5qc1wiLFxuXHRcdDIyXG5cdF0sXG5cdFwiLi9iZWVyYm94LS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvYmVlcmJveC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDEsXG5cdFx0Mixcblx0XHQ0LFxuXHRcdDMsXG5cdFx0OFxuXHRdLFxuXHRcIi4vYmVlcmJveC0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL2JlZXJib3gtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQxLFxuXHRcdDIsXG5cdFx0NCxcblx0XHQzLFxuXHRcdDhcblx0XSxcblx0XCIuL2NhcnQtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9jYXJ0LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTJcblx0XSxcblx0XCIuL2NhcnQtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9jYXJ0LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTJcblx0XSxcblx0XCIuL2NhdGFsb2ctZmlsdGVyLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvY2F0YWxvZy1maWx0ZXItLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyM1xuXHRdLFxuXHRcIi4vY2F0YWxvZy1maWx0ZXItLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9jYXRhbG9nLWZpbHRlci0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDIzXG5cdF0sXG5cdFwiLi9kcmFnZ2FibGUtdGFibGUtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9kcmFnZ2FibGUtdGFibGUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyNFxuXHRdLFxuXHRcIi4vZHJhZ2dhYmxlLXRhYmxlLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvZHJhZ2dhYmxlLXRhYmxlLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MjRcblx0XSxcblx0XCIuL2dvb2dsZS1tYXAtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9nb29nbGUtbWFwLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MCxcblx0XHQ5LFxuXHRcdDE1XG5cdF0sXG5cdFwiLi9nb29nbGUtbWFwLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvZ29vZ2xlLW1hcC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0OSxcblx0XHQxNVxuXHRdLFxuXHRcIi4vaW5maW5pdHktc2Nyb2xsLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5maW5pdHktc2Nyb2xsLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTZcblx0XSxcblx0XCIuL2luZmluaXR5LXNjcm9sbC0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL2luZmluaXR5LXNjcm9sbC0tbW9k
10072dWxlLWxvYWRlci5qc1wiLFxuXHRcdDE2XG5cdF0sXG5cdFwiLi9pbnB1dC1xdWFudGl0eS0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL2lucHV0LXF1YW50aXR5LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MzIsXG5cdFx0MTdcblx0XSxcblx0XCIuL2lucHV0LXF1YW50aXR5LS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5wdXQtcXVhbnRpdHktLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQzMixcblx0XHQxN1xuXHRdLFxuXHRcIi4vaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MCxcblx0XHQxMCxcblx0XHQxM1xuXHRdLFxuXHRcIi4vaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MCxcblx0XHQxMCxcblx0XHQxM1xuXHRdLFxuXHRcIi4vanF1ZXJ5LXZhbGlkYXRpb24tLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9qcXVlcnktdmFsaWRhdGlvbi0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0MSxcblx0XHQyLFxuXHRcdDQsXG5cdFx0N1xuXHRdLFxuXHRcIi4vanF1ZXJ5LXZhbGlkYXRpb24tLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9qcXVlcnktdmFsaWRhdGlvbi0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0MSxcblx0XHQyLFxuXHRcdDQsXG5cdFx0N1xuXHRdLFxuXHRcIi4vbWFnbmlmaWMtcG9wdXAtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9tYWduaWZpYy1wb3B1cC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0MSxcblx0XHQyLFxuXHRcdDMsXG5cdFx0MThcblx0XSxcblx0XCIuL21hZ25pZmljLXBvcHVwLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvbWFnbmlmaWMtcG9wdXAtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQwLFxuXHRcdDEsXG5cdFx0Mixcblx0XHQzLFxuXHRcdDE4XG5cdF0sXG5cdFwiLi9wYXJ0bmVyLWZvcm0tLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9wYXJ0bmVyLWZvcm0tLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQxMVxuXHRdLFxuXHRcIi4vcGFydG5lci1mb3JtLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvcGFydG5lci1mb3JtLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTFcblx0XSxcblx0XCIuL3Bhc3N3b3JkLXRvZ2dsZS0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Bhc3N3b3JkLXRvZ2dsZS0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDE5XG5cdF0sXG5cdFwiLi9wYXNzd29yZC10b2dnbGUtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9wYXNzd29yZC10b2dnbGUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQxOVxuXHRdLFxuXHRcIi4vcmV2aWV3LXJlYWQtbW9yZS0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Jldmlldy1yZWFkLW1vcmUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyNVxuXHRdLFxuXHRcIi4vcmV2aWV3LXJlYWQtbW9yZS0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Jldmlldy1yZWFkLW1vcmUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyNVxuXHRdLFxuXHRcIi4vczJzLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvczJzLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MjZcblx0XSxcblx0XCIuL3Mycy0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Mycy0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDI2XG5cdF0sXG5cdFwiLi9zY3JvbGwtd2luZG93LS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvc2Nyb2xsLXdpbmRvdy0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDUsXG5cdFx0MjEsXG5cdFx0MjBcblx0XSxcblx0XCIuL3Njcm9sbC13aW5kb3ctLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9zY3JvbGwtd2luZG93LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0NSxcblx0XHQyMSxcblx0XHQyMFxuXHRdLFxuXHRcIi4vc2xpZGVycy0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3NsaWRlcnMtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQ2LFxuXHRcdDI3XG5cdF0sXG5cdFwiLi9zbGlkZXJzLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvc2xpZGVycy0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDYsXG5cdFx0Mjdcblx0XSxcblx0XCIuL3NwbGFzaC1uby0xOFwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3NwbGFzaC1uby0xOC5qc1wiLFxuXHRcdDI4XG5cdF0sXG5cdFwiLi9zcGxhc2gtbm8tMTguanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9zcGxhc2gtbm8tMTguanNcIixcblx0XHQyOFxuXHRdLFxuXHRcIi4vdGltZWxpbmVcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy90aW1lbGluZS5qc1wiLFxuXHRcdDMzLFxuXHRcdDI5XG5cdF0sXG5cdFwiLi90aW1lbGluZS5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3RpbWVsaW5lLmpzXCIsXG5cdFx0MzMsXG5cdFx0Mjlcblx0XSxcblx0XCIuL3dyYXAtbWVkaWEtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy93cmFwLW1lZGlhLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MzBcblx0XSxcblx0XCIuL3dyYXAtbWVkaWEtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy93cmFwLW1lZGlhLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MzBcblx0XSxcblx0XCIuL3p6bG9hZC0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3p6bG9hZC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDMxXG5cdF0sXG5cdFwiLi96emxvYWQtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy96emxvYWQtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQzMVxuXHRdXG59O1xuZnVuY3Rpb24gd2VicGFja0FzeW5jQ29udGV4dChyZXEpIHtcblx0dmFyIGlkcyA9IG1hcFtyZXFdO1xuXHRpZighaWRzKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybi
10072BQcm9taXNlLmFsbChpZHMuc2xpY2UoMSkubWFwKF9fd2VicGFja19yZXF1aXJlX18uZSkpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlkID0gaWRzWzBdO1xuXHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLnQoaWQsIDcpO1xuXHR9KTtcbn1cbndlYnBhY2tBc3luY0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tBc3luY0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQXN5bmNDb250ZXh0LmlkID0gXCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzIGxhenkgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tBc3luY0NvbnRleHQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGUgQmFsbCBNb2RhbCAtINGA0LDQt9C80LXRidC10L3QuNC1INGI0LDRgNC40LrQsCDQuCDRg9C/0YDQsNCy0LvQtdC90LjQtSDQvNC+0LTQsNC70YzQvdGL0Lwg0L7QutC90L7QvFxuICovXG5cbmltcG9ydCBjb29raWVEYXRhIGZyb20gJyMvX21vZHVsZXMvY29va2llLWRhdGEnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuLyoqXG4gKiDQmtC70LDRgdGBINC00LvRjyDRg9C/0YDQsNCy0LvQtdC90LjRjyBCYWxsIE1vZGFsXG4gKi9cbmNsYXNzIEJhbGxNb2RhbCB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJmLWJhbGwtY29udGFpbmVyJyk7XG5cdFx0dGhpcy5iYWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJmLWJhbGwnKTtcblx0XHR0aGlzLm1vZGFsU3RlcDEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmZCYWxsTW9kYWxTdGVwMScpO1xuXHRcdHRoaXMubW9kYWxTdGVwMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZkJhbGxNb2RhbFN0ZXAyJyk7XG5cdFx0XG5cdFx0Ly8g0J/RgNC+0LLQtdGA0Y/QtdC8INC90LDQu9C40YfQuNC1INC60L7QvdGC0LXQudC90LXRgNCwINC4INGI0LDRgNC40LrQsFxuXHRcdGlmICghdGhpcy5jb250YWluZXIpIHtcblx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDQutC+0L3RgtC10LnQvdC10YAgLmJmLWJhbGwtY29udGFpbmVyINC90LUg0L3QsNC50LTQtdC9INCyIERPTScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRpZiAoIXRoaXMuYmFsbCkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYWxsTW9kYWw6INGI0LDRgNC40LogLmJmLWJhbGwg0L3QtSDQvdCw0LnQtNC10L0g0LIgRE9NJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFxuXHRcdC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQvdCw0LvQuNGH0LjQtSBjb29raWVcblx0XHRpZiAoY29va2llRGF0YS5yZWNlaXZlKCdzaG93LWJhbGwtbW9kYWwnKSkge1xuXHRcdFx0Ly8g0JXRgdC70LggY29va2llINGD0YHRgtCw0L3QvtCy0LvQtdC90LAsINGB0LrRgNGL0LLQsNC10Lwg0YjQsNGA0LjQulxuXHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0XG5cdFx0Ly8g0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDRiNCw0YDQuNC6XG5cdFx0dGhpcy5pbml0KCk7XG5cdH1cblxuXHQvKipcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y9cblx0ICovXG5cdGluaXQoKSB7XG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5iYWxsKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0JhbGxNb2RhbDog0LrQvtC90YLQtdC50L3QtdGAINC40LvQuCDRiNCw0YDQuNC6INC90LUg0L3QsNC50LTQtdC90Ysg0L/RgNC4INC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNC4Jyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8g0KPQsdC10LbQtNCw0LXQvNGB0Y8sINGH0YLQviDRiNCw0YDQuNC6INC90LDRhdC+0LTQuNGC0YHRjyDQstC90YPRgtGA0Lgg0LrQvtC90YLQtdC50L3QtdGA0LBcblx0XHRpZiAoIXRoaXMuY29udGFpbmVyLmNvbnRhaW5zKHRoaXMuYmFsbCkpIHtcblx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRiNCw0YDQuNC6INC90LUg0L3QsNC50LTQtdC9INCy0L3Rg9GC0YDQuCDQutC+0L3RgtC10LnQvdC10YDQsCwg0LTQvtCx0LDQstC70Y/QtdC8Jyk7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmJhbGwpO1xuXHRcdH1cblxuXHRcdC8vINCj0LTQsNC70Y/QtdC8INC60L7QvdGC0LXQudC90LXRgCDQuNC3INGC0LXQutGD0YnQtdCz0L4g0LzQtdGB0YLQsCDQsiBET00gKNC10YHQu9C4INC+0L0g0YLQsNC8INC10YHRgtGMKVxuXHRcdGlmICh0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcblx0XHR9XG5cblx0XHQvLyDQodC60YDRi9Cy0LDQtdC8INGI0LDRgNC40Log0LLRgNC10LzQtdC90L3QvlxuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXG5cdFx0Ly8g0KDQsNC30LzQtdGJ0LDQtdC8INGI0LDRgNC40LosINC/0YDQuNC60YDQtdC/0LvRj9GPINC6INGB0LvRg9GH0LDQudC90L7QvNGDINGN0LvQtdC80LXQvdGC0YNcblx0XHR0aGlzLnBvc2l0aW9uQmFsbCgpO1xuXG5cdFx0Ly8g0J/RgNC40L3Rg9C00LjRgtC10LvRjNC90L4g0L/QvtC60LDQt9GL0LLQsNC10Lwg0YjQsNGA0LjQuiDQv9C+0YHQu9C1INGA0LDQt9C80LXRidC10L3QuNGPXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuXHRcdFx0XHQvLyDQo9Cx0LXQttC00LDQtdC80YHRjywg0YfRgtC+INGI0LDRgNC40Log0LLQuNC00LXQvVxuXHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUub3BhY2l0eSA9ICcxJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpcy1hdHRhY2hlZCcpO1xuXHRcdFx0XHRcblx0XHRcdFx0Ly8g0J/RgNC+0LLQtdGA0LrQsCDQutC+0L7RgNC00LjQvdCw0YJcblx0XHRcdFx0Y29uc3QgcmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRpZiAocmVjdC53aWR0aCA9PT0gMCB8fCByZWN0LmhlaWdodCA9PT0gMCkge1xuXHRcdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRiNCw0YDQuNC6INC40LzQtdC10YIg0L3Rg9C70LXQstC+0Lkg0YDQsNC30LzQtdGALCDQstC+0LfQvNC+0LbQvdC+INGB0LrRgNGL0YIgQ1NTJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRiNCw0YDQuNC6INC90LUg0LHRi9C7INC00L7QsdCw0LLQu9C10L0g0LIgRE9NINC/0L7RgdC70LUg0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40Y8sINC40YHQv9C+0LvRjNC30YPQtdC8IGZhbGxiYWNrJyk7XG5cdFx0XHRcdC8vIEZhbGxiYWNrIC0g0YDQsNC30LzQtdGJ0LDQtdC8INCyINGB0LvRg9GH0LDQudC90L7QuSDQv9C+0LfQuNGG0LjQuFxuXHRcdFx0XHR0aGlzLmF0dGFjaFRvUmFuZG9tUG9zaXRpb24oKTtcblx0XHRcdFx0aWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXHRcdFx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnaXMtYXR0YWNoZWQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sIDE1MCk7XG5cblx0XHQvLyDQntCx0YDQsNCx0L7RgtC60LAg0LrQu9C40LrQsCDQvdCwINGI0LDRgNC40Lpcblx0XHR0aGlzLmJhbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dGhpcy5zaG93TW9kYWxTdGVwMSgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8g0J7QsdGA0LDQsdC+0YLQutCwINC30LDQutGA0YvRgtC40Y8g0LzQvtC00LDQu9GM0L3Ri9GFINC+0LrQvtC9XG5cdFx0dGhpcy5pbml0TW9kYWxIYW5kbGVycygpO1xuXG5cdFx0Ly8g0J7QsdGA0LDQsdC+0YLQutCwINGE0L7RgNC80Ytcblx0XHR0aGlzLmluaXRGb3JtSGFuZGxlcigpO1xuXG5cdFx0Ly8g0J7QsdGA0LDQsdC+0YLQutCwINC60L3QvtC/0LrQuCDQutC+0L/QuNGA0L7QstCw0L3QuNGPINC/0YDQvtC80L7QutC+0LTQsFxuXHRcdHRoaXMuaW5pdENvcHlCdXR0b24oKTtcblxuXHRcdC8vINCf0YDQuCDQuNC30LzQtdC90LXQvdC40Lgg0YDQsNC30LzQtdGA0LAg0L7QutC90LAgLSDQv9C10YDQtdC/0YDQuNC60YDQtdC/0LvRj9C10Lwg0YjQsNGA0LjQulxuXHRcdGxldCByZXNpemVUaW1lb3V0O1xuXHRcdHdpbmRvdy5hZGR
10072FdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG5cdFx0XHRjbGVhclRpbWVvdXQocmVzaXplVGltZW91dCk7XG5cdFx0XHRyZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlICYmICFjb29raWVEYXRhLnJlY2VpdmUoJ3Nob3ctYmFsbC1tb2RhbCcpKSB7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0XHRpZiAodGhpcy5jb250YWluZXIucGFyZW50Tm9kZSAhPT0gZG9jdW1lbnQuYm9keSkge1xuXHRcdFx0XHRcdFx0dGhpcy5jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMucG9zaXRpb25CYWxsKCk7XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSwgMzAwKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiDQoNCw0LfQvNC10YnQtdC90LjQtSDRiNCw0YDQuNC60LAgLSDQv9GA0LjQutGA0LXQv9C70LXQvdC40LUg0Log0YHQu9GD0YfQsNC50L3QvtC80YMg0J3QldCe0KfQldCS0JjQlNCd0J7QnNCjINGN0LvQtdC80LXQvdGC0YMg0L3QsCDRgdGC0YDQsNC90LjRhtC1XG5cdCAqINCo0LDRgNC40Log0L/RgNC40LLRj9C30LDQvSDQuiDRjdC70LXQvNC10L3RgtGDINC4INC00LLQuNCz0LDQtdGC0YHRjyDQstC80LXRgdGC0LUg0YHQviDRgdGC0YDQsNC90LjRhtC10Lkg0L/RgNC4INC/0YDQvtC60YDRg9GC0LrQtVxuXHQgKi9cblx0cG9zaXRpb25CYWxsKCkge1xuXHRcdGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuYmFsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCd0LDRhdC+0LTQuNC8INCy0YHQtSDQv9C+0LTRhdC+0LTRj9GJ0LjQtSDQndCV0J7Qp9CV0JLQmNCU0J3Qq9CVINGN0LvQtdC80LXQvdGC0Ysg0L3QsCDRgdGC0YDQsNC90LjRhtC1XG5cdFx0Ly8g0JLRi9Cx0LjRgNCw0LXQvCDQvNC10LvQutC40LUsINC90LXQt9Cw0LzQtdGC0L3Ri9C1INGN0LvQtdC80LXQvdGC0YsgLSDQtNC10LvQsNC10Lwg0LjQs9GA0YMg0LjQvdGC0LXRgNC10YHQvdC10LVcblx0XHRjb25zdCBzZWxlY3RvcnMgPSBbXG5cdFx0XHQncCcsIC8vINCe0LHRi9GH0L3Ri9C1INC/0LDRgNCw0LPRgNCw0YTRiyAo0L/RgNC10LTQv9C+0YfQuNGC0LDQtdC8INC80LXQu9C60LjQtSlcblx0XHRcdCdzcGFuOm5vdCguaWNvbik6bm90KC5iYWRnZSk6bm90KC50YWcpJywgLy8g0J7QsdGL0YfQvdGL0LUgc3Bhbiwg0L3QviDQvdC1INC40LrQvtC90LrQuC/QsdC10LnQtNC20Lhcblx0XHRcdCdzbWFsbCcsIC8vINCc0LXQu9C60LjQuSDRgtC10LrRgdGCXG5cdFx0XHQnbGFiZWwnLCAvLyDQnNC10YLQutC4INGE0L7RgNC8XG5cdFx0XHQndGltZScsIC8vINCt0LvQtdC80LXQvdGC0Ysg0LLRgNC10LzQtdC90Lhcblx0XHRcdCdhZGRyZXNzJywgLy8g0JDQtNGA0LXRgdCwXG5cdFx0XHQnY2l0ZScsIC8vINCm0LjRgtCw0YLRi1xuXHRcdFx0J2NvZGUnLCAvLyDQmtC+0LRcblx0XHRcdCdzdWInLCAnc3VwJywgLy8g0J/QvtC00YHRgtGA0L7Rh9C90YvQtS/QvdCw0LTRgdGC0YDQvtGH0L3Ri9C1INC40L3QtNC10LrRgdGLXG5cdFx0XHQnLnRleHQtc21hbGwnLCAvLyDQnNC10LvQutC40Lkg0YLQtdC60YHRglxuXHRcdFx0Jy5jYXB0aW9uJywgLy8g0J/QvtC00L/QuNGB0Lhcblx0XHRcdCcubWV0YScsIC8vINCc0LXRgtCwLdC40L3RhNC+0YDQvNCw0YbQuNGPXG5cdFx0XHQnLmRlc2NyaXB0aW9uOm5vdCgucHJvZHVjdC1kZXNjcmlwdGlvbiknLCAvLyDQntC/0LjRgdCw0L3QuNGPLCDQvdC+INC90LUg0L7Qv9C40YHQsNC90LjRjyDRgtC+0LLQsNGA0L7QslxuXHRcdF07XG5cblx0XHQvLyDQodC+0LHQuNGA0LDQtdC8INCy0YHQtSDQv9C+0LTRhdC+0LTRj9GJ0LjQtSDQndCV0J7Qp9CV0JLQmNCU0J3Qq9CVINGN0LvQtdC80LXQvdGC0Ytcblx0XHRsZXQgY2FuZGlkYXRlcyA9IFtdO1xuXHRcdFxuXHRcdHNlbGVjdG9ycy5mb3JFYWNoKHNlbGVjdG9yID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cdFx0XHRcdGVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuXHRcdFx0XHRcdC8vINCY0YHQutC70Y7Rh9Cw0LXQvCDRjdC70LXQvNC10L3RgtGLLCDQutC+0YLQvtGA0YvQtSDRgdC70LjRiNC60L7QvCDQvNCw0LvRiyDQuNC70Lgg0YHQutGA0YvRgtGLXG5cdFx0XHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vINCY0YHQutC70Y7Rh9Cw0LXQvCDQvtGH0LXQstC40LTQvdGL0LUg0Lgg0LHQvtC70YzRiNC40LUg0Y3Qu9C10LzQtdC90YLRiyAtINC00LXQu9Cw0LXQvCDQuNCz0YDRgyDQuNC90YLQtdGA0LXRgdC90LXQtVxuXHRcdFx0XHRcdGNvbnN0IGlzT2J2aW91cyA9IFxuXHRcdFx0XHRcdFx0ZWwudGFnTmFtZS5tYXRjaCgvXkhbMS02XSQvaSkgfHwgLy8g0JfQsNCz0L7Qu9C+0LLQutC4XG5cdFx0XHRcdFx0XHRlbC50YWdOYW1lID09PSAnQlVUVE9OJyB8fCAvLyDQmtC90L7Qv9C60Lhcblx0XHRcdFx0XHRcdGVsLnRhZ05hbWUgPT09ICdJTUcnIHx8IC8vINCY0LfQvtCx0YDQsNC20LXQvdC40Y9cblx0XHRcdFx0XHRcdGVsLnRhZ05hbWUgPT09ICdBJyAmJiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdidG4nKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpbmsnKSB8fCBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkgfHwgLy8g0KHRgdGL0LvQutC4LdC60L3QvtC/0LrQuCDQuNC70Lgg0LvRjtCx0YvQtSDRgdGB0YvQu9C60Lhcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygndGl0bGUnKSB8fCAvLyDQrdC70LXQvNC10L3RgtGLINGBINC60LvQsNGB0YHQvtC8IH
10072RpdGxlXG5cdFx0XHRcdFx0XHRlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2J0bicpIHx8IC8vINCa0L3QvtC/0LrQuFxuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdidXR0b24nKSB8fCAvLyDQmtC90L7Qv9C60Lhcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygncHJvZHVjdC1jYXJkJykgfHwgLy8g0JrQsNGA0YLQvtGH0LrQuCDRgtC+0LLQsNGA0L7QslxuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjYXRhbG9nLWl0ZW0nKSB8fCAvLyDQrdC70LXQvNC10L3RgtGLINC60LDRgtCw0LvQvtCz0LBcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygnY2FyZCcpIHx8IC8vINCa0LDRgNGC0L7Rh9C60Lhcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygnaXRlbScpIHx8IC8vINCt0LvQtdC80LXQvdGC0Ytcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygncHJvZHVjdCcpIHx8IC8vINCi0L7QstCw0YDRi1xuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uJykgfHwgLy8g0JjQutC+0L3QutC4XG5cdFx0XHRcdFx0XHRlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2xvZ28nKSB8fCAvLyDQm9C+0LPQvtGC0LjQv9GLXG5cdFx0XHRcdFx0XHRyZWN0LndpZHRoID4gMzAwIHx8IC8vINCh0LvQuNGI0LrQvtC8INCx0L7Qu9GM0YjQuNC1INGN0LvQtdC80LXQvdGC0Ytcblx0XHRcdFx0XHRcdHJlY3QuaGVpZ2h0ID4gMjAwOyAvLyDQodC70LjRiNC60L7QvCDQstGL0YHQvtC60LjQtSDRjdC70LXQvNC10L3RgtGLXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8g0J/RgNC10LTQv9C+0YfQuNGC0LDQtdC8INGN0LvQtdC80LXQvdGC0Ysg0YHRgNC10LTQvdC10LPQviDRgNCw0LfQvNC10YDQsCwg0L3QviDQvdC1INGB0LvQuNGI0LrQvtC8INCx0L7Qu9GM0YjQuNC1XG5cdFx0XHRcdFx0Y29uc3QgaXNHb29kU2l6ZSA9IHJlY3Qud2lkdGggPj0gMzAgJiYgcmVjdC53aWR0aCA8PSAyNTAgJiYgXG5cdFx0XHRcdFx0ICAgICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgPj0gMjAgJiYgcmVjdC5oZWlnaHQgPD0gMTUwO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdCFpc09idmlvdXMgJiYgLy8g0J3QtSDQvtGH0LXQstC40LTQvdGL0Lkg0Y3Qu9C10LzQtdC90YJcblx0XHRcdFx0XHRcdGlzR29vZFNpemUgJiYgLy8g0J/QvtC00YXQvtC00Y/RidC40Lkg0YDQsNC30LzQtdGAXG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiZcblx0XHRcdFx0XHRcdHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmXG5cdFx0XHRcdFx0XHRzdHlsZS5vcGFjaXR5ICE9PSAnMCcgJiZcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCcuYmYtYmFsbC1jb250YWluZXInKSAmJiAvLyDQndC1INC90LAg0YHQsNC80L7QvCDRiNCw0YDQuNC60LVcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCdoZWFkZXInKSAmJiAvLyDQndC1INCyINGI0LDQv9C60LVcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCdmb290ZXInKSAmJiAvLyDQndC1INCyINGE0YPRgtC10YDQtVxuXHRcdFx0XHRcdFx0IWVsLmNsb3Nlc3QoJy5iZi1iYWxsLW1vZGFsJykgJiYgLy8g0J3QtSDQsiDQvNC+0LTQsNC70LrQtVxuXHRcdFx0XHRcdFx0IWVsLmNsb3Nlc3QoJy5tb2RhbCcpICYmIC8vINCd0LUg0LIg0LTRgNGD0LPQuNGFINC80L7QtNCw0LvQutCw0YVcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCcucG9wdXAnKSAvLyDQndC1INCyINC/0L7Qv9Cw0L/QsNGFXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjYW5kaWRhdGVzLnB1c2goZWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vINCY0LPQvdC+0YDQuNGA0YPQtdC8INC+0YjQuNCx0LrQuCDRgdC10LvQtdC60YLQvtGA0L7QslxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8g0KTQuNC70YzRgtGA0YPQtdC8INGC0L7Qu9GM0LrQviDRjdC70LXQvNC10L3RgtGLINCyINCy0LjQtNC40LzQvtC5INC+0LHQu9Cw0YHRgtC4XG5cdFx0Y29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cdFx0Y29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuXHRcdFxuXHRcdGNvbnN0IHZpc2libGVDYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5maWx0ZXIoZWwgPT4ge1xuXHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0cmVjdC50b3AgPCB2aWV3cG9ydEhlaWdodCAmJlxuXHRcdFx0XHRyZWN0LmJvdHRvbSA+IDAgJiZcblx0XHRcdFx0cmVjdC5sZWZ0IDwgdmlld3BvcnRXaWR0aCAmJlxuXHRcdFx0XHRyZWN0LnJpZ2h0ID4gMCAmJlxuXHRcdFx0XHRyZWN0LndpZHRoID4gMCAmJlxuXHRcdFx0XHRyZWN0LmhlaWdodCA+IDBcblx0XHRcdCk7XG5cdFx0fSk7XG5cblx0XHQvLyDQldGB0LvQuCDQvdC1INC90LDRiNC70Lgg0L/QvtC00YXQvtC00Y/RidC40YUg0Y3Qu9C10LzQtdC90YLQvtCyLCDQuNGB0L/QvtC70YzQt9GD0LXQvCBib2R5XG5cdFx0aWYgKHZpc2libGVDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5hdHRhY2hUb1JhbmRvbVBvc2l0aW9uKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8g0JLRi9Cx0LjRgNCw0LXQvCDRgdC70YPRh9Cw0LnQvdGL0Lkg0Y3Qu9C10LzQtdC90YIg0LjQtyDQstC40LTQuNC80YvRhVxuXHRcdGNvbnN0IHJhbmRvbUVsZW1lbnQgPSB2aXNpYmxlQ2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB2aXNpYmxlQ2FuZGlkYXRlcy5sZW5ndGgpXTtcblx0XHRcblx0XHQvLyDQn9GA0LjQutGA0LXQv9C70Y/QtdC8INGI0LDRgNC40Log0Log0LLRi9Cx0YDQsNC90L3QvtC80YMg0Y3Qu9C10LzQtdC90YLRg1xuXHRcdHRoaXMuYXR0YWNoVG9FbGVtZW50KHJhbmRvbUVsZW1lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCf0YDQuNC60YDQtdC/0LvQtdC90LjQtSDRiNCw0YDQuNC60LAg0Log0LrQvtC90LrRgNC10YLQvdC+0LzRgyDRjdC70LXQvNC10L3RgtGDXG5cdCAqL1xuXHRhdHRhY2hUb0VsZW1lbnQoZWxlbWVudCkge1xuXHRcdGlmICghdGhpcy5jb250YWluZXIgfHwgIWVsZW1lbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyDQldGB0LvQuCDRjdC70LXQvNC10L3RgiAtIGJvZHksINC40YHQv9C+0LvRjNC30YPQtdC8INGB0LvRg9GH0LDQudC90L7QtSDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjQtVxuXHRcdGlmIChlbGVtZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG5cdFx0XHR0aGlzLmF0dGFjaFRvUmFuZG9tUG9zaXRpb24oKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyDQn9C+0LvRg9GH0LDQtdC8INC/0L7Qt9C40YbQuNGOINGN0LvQtdC80LXQvdGC0LAg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+IHZpZXdwb3J0XG5cdFx0Y29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdC8vINCf0L7Qu9GD0YfQsNC10Lwg0L/QvtC30LjRhtC40Y4g0Y3Qu9C10LzQtdC90YLQsCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LTQvtC60YPQvNC10L3RgtCwICjRgSDRg9GH0LXRgtC+0Lwg0L/RgNC+0LrRgNGD0YLQutC4KVxuXHRcdGNvbnN0IHNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWSB8fCB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdFx0Y29uc3Qgc2Nyb2xsWCA9IHdpbmRvdy5zY3JvbGxYIHx8IHdpbmRvdy5wYWdlWE9mZnNldDtcblxuXHRcdC8vINCo0LDRgNC40Log0LTQvtC70LbQtdC9INCx0YvRgtGMINCy0LjQtNC10L0sINC/0L7RjdGC0L7QvNGDINGA0LDQt9C80LXRidCw0LXQvCDQtdCz0L4g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INGN0LvQtdC80LXQvdGC0LBcblx0XHQvLyDQktGL0LHQuNGA0LDQtdC8INGB0LvRg9GH0LDQudC90YPRjiDQv9C+0LfQuNGG0LjRjiDQstC+0LrRgNGD0LMg0Y3Qu9C10LzQtdC90YLQsFxuXHRcdGNvbnN0IGJhbGxXaWR0aCA9IDYwO1xuXHRcdGNvbnN0IGJhbGxIZWlnaHQgPSAyMjA7XG5cdFx0XG5cdFx0Ly8g0J/QvtC30LjRhtC40Lgg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INGN0LvQtdC80LXQvdGC0LAgKNC/0YDQvtGG0LXQvdGCINC+0YIg0YDQsNC30LzQtdGA0LAg0Y3Qu9C10LzQtdC90YLQsClcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbXG5cdFx0XHR7IHNpZGU6ICd0b3AtbGVmdCcsIHg6IDAuMSwgeTogLWJhbGxIZWlnaHQgLSAxMCB9LCAvLyDQodCy0LXRgNGF0YMg0YHQu9C10LLQsFxuXHRcdFx0eyBzaWRlOiAndG9wLXJpZ2h0JywgeDogMC45LCB5OiAtYmFsbEhlaWdodCAtIDEwIH0sIC8vINCh0LLQtdGA0YXRgyDRgdC/0YDQsNCy0LBcblx0XHRcdHsgc2lkZTogJ2JvdHRvbS1sZWZ0JywgeDogMC4xLCB5OiBlbGVtZW50UmVjdC5oZWlnaHQgKyAxMCB9LCAvLyDQodC90LjQt9GDINGB0LvQtdCy0LBcblx0XHRcdHsgc2lkZTogJ2JvdHRvbS1yaWdodCcsIHg6IDAuOSwgeTogZWxlbWVudFJlY3QuaGVpZ2h0ICsgMTAgfSwgLy8g0KHQvdC40LfRgyDRgdC/0YDQsNCy0LBcblx0XHRcdHsgc2lkZTogJ3RvcC1jZW50ZXInLCB4OiAwLjUsIHk6IC1iYWxsSGVpZ2h0IC0gMTAgfSwgLy8g0KHQstC10YDRhdGDINC/0L4g0YbQtdC90YLRgNGDXG5cdFx0XHR7IHNpZGU6ICdib3R0b20tY2VudGVyJywgeDogMC41LCB5OiBlbGVtZW50UmVjdC5oZWlnaHQgKyAxMCB9LCAvLyDQodC90LjQt9GDINC/0L4g0YbQtdC90YLRgNGDXG5cdFx0XTtcblxuXHRcdGNvbnN0IHJhbmRvbVBvcyA9IHBvc2l0aW9uc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NpdGlvbnMubGVuZ3RoKV07XG5cdFx0XG5cdFx0Ly8g0JLRi9GH0LjRgdC70Y/QtdC8INCw0LHRgdC+0LvRjtGC0L3Ri9C1INC60L7QvtGA0LTQuNC90LDRgtGLINC+0YLQvdC+0YHQuNGC0LXQu9GM0L3QviDQtNC+0LrRg9C80LXQvdGC0LAgKNGBINGD0YfQtdGC0L7QvCDQv9GA0L7QutGA0YPRgtC60LgpXG5cdFx0Ly8gZWxlbWVudFJlY3QubGVmdC90b3AgLSDRjdGC0L4g0L/QvtC30LjRhtC40Y8g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+IHZpZXdwb3J0XG5cdFx0Ly8g0JTQvtCx0LDQstC70Y/QtdC8IHNjcm9sbFgvc2Nyb2xsWSDRh9GC0L7QsdGLINC/0L7Qu9GD0YfQuNGC0Ywg0L/QvtC30LjRhtC40Y4g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INC00L7QutGD0LzQtdC90YLQsFxuXHRcdGNvbnN0IGFic29sdXRlWCA9IGVsZW1lbnRSZWN0LmxlZnQgKyBzY3JvbGxYICsgKGVsZW1lbnRSZWN0LndpZHR
10072oICogcmFuZG9tUG9zLngpIC0gKGJhbGxXaWR0aCAqIDAuNSk7XG5cdFx0Y29uc3QgYWJzb2x1dGVZID0gZWxlbWVudFJlY3QudG9wICsgc2Nyb2xsWSArIHJhbmRvbVBvcy55O1xuXHRcdFxuXHRcdC8vINCj0LHQtdC20LTQsNC10LzRgdGPLCDRh9GC0L4g0YjQsNGA0LjQuiDQvdCw0YXQvtC00LjRgtGB0Y8g0LLQvdGD0YLRgNC4INC60L7QvdGC0LXQudC90LXRgNCwXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lci5jb250YWlucyh0aGlzLmJhbGwpKSB7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmJhbGwpO1xuXHRcdH1cblx0XHRcblx0XHQvLyDQktGB0YLQsNCy0LvRj9C10Lwg0LrQvtC90YLQtdC50L3QtdGAINGBINGI0LDRgNC40LrQvtC8INCyIGJvZHkg0YEg0LDQsdGB0L7Qu9GO0YLQvdGL0Lwg0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40LXQvFxuXHRcdGlmICh0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlICE9PSBkb2N1bWVudC5ib2R5KSB7XG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0L/QvtC30LjRhtC40Y4gKGFic29sdXRlLCDRh9GC0L7QsdGLINGI0LDRgNC40Log0LHRi9C7INC/0YDQuNCy0Y/Qt9Cw0L0g0Log0Y3Qu9C10LzQtdC90YLRgyDQuCDQtNCy0LjQs9Cw0LvRgdGPINGB0L4g0YHRgtGA0LDQvdC40YbQtdC5KVxuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7YWJzb2x1dGVYfXB4YDtcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHthYnNvbHV0ZVl9cHhgO1xuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9ICc5OTk4Jztcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcblx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpcy1hdHRhY2hlZCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCf0YDQuNC60YDQtdC/0LvQtdC90LjQtSDQuiDRgdC70YPRh9Cw0LnQvdC+0Lkg0L/QvtC30LjRhtC40Lgg0L3QsCDRgdGC0YDQsNC90LjRhtC1IChmYWxsYmFjaylcblx0ICovXG5cdGF0dGFjaFRvUmFuZG9tUG9zaXRpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJhbGxXaWR0aCA9IDYwO1xuXHRcdGNvbnN0IGJhbGxIZWlnaHQgPSAyMjA7XG5cdFx0Y29uc3QgcGFkZGluZyA9IDIwO1xuXHRcdGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblx0XHRjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblx0XHRjb25zdCBzY3JvbGxZID0gd2luZG93LnNjcm9sbFkgfHwgd2luZG93LnBhZ2VZT2Zmc2V0O1xuXHRcdGNvbnN0IHNjcm9sbFggPSB3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cucGFnZVhPZmZzZXQ7XG5cdFx0XG5cdFx0Ly8g0J/QvtC70YPRh9Cw0LXQvCDRgNCw0LfQvNC10YDRiyDQtNC+0LrRg9C80LXQvdGC0LBcblx0XHRjb25zdCBkb2N1bWVudEhlaWdodCA9IE1hdGgubWF4KFxuXHRcdFx0ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsXG5cdFx0XHRkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxcblx0XHRcdGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuXHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodFxuXHRcdCk7XG5cdFx0Y29uc3QgZG9jdW1lbnRXaWR0aCA9IE1hdGgubWF4KFxuXHRcdFx0ZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCxcblx0XHRcdGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGhcblx0XHQpO1xuXG5cdFx0Ly8g0JLRi9GH0LjRgdC70Y/QtdC8INC00LjQsNC/0LDQt9C+0L0g0LTQu9GPINGB0LvRg9GH0LDQudC90L7QuSDQv9C+0LfQuNGG0LjQuCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LTQvtC60YPQvNC10L3RgtCwXG5cdFx0Y29uc3QgbWluWCA9IHBhZGRpbmc7XG5cdFx0Y29uc3QgbWF4WCA9IE1hdGgubWF4KHZpZXdwb3J0V2lkdGgsIGRvY3VtZW50V2lkdGgpIC0gYmFsbFdpZHRoIC0gcGFkZGluZztcblx0XHRjb25zdCBtaW5ZID0gcGFkZGluZztcblx0XHRjb25zdCBtYXhZID0gTWF0aC5tYXgodmlld3BvcnRIZWlnaHQsIGRvY3VtZW50SGVpZ2h0KSAtIGJhbGxIZWlnaHQgLSBwYWRkaW5nO1xuXG5cdFx0Y29uc3QgcmFuZG9tWCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhYIC0gbWluWCArIDEpKSArIG1pblg7XG5cdFx0Y29uc3QgcmFuZG9tWSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhZIC0gbWluWSArIDEpKSArIG1pblk7XG5cblx0XHQvLyDQo9Cx0LXQttC00LDQtdC80YHRjywg0YfRgtC+INGI0LDRgNC40Log0L3QsNGF0L7QtNC40YLRgdGPINCy0L3Rg9GC0YDQuCDQutC+0L3RgtC10LnQvdC10YDQsFxuXHRcdGlmICh0aGlzLmJhbGwgJiYgIXRoaXMuY29udGFpbmVyLmNvbnRhaW5zKHRoaXMuYmFsbCkpIHtcblx0XHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYmFsbCk7XG5cdFx0fVxuXG5cdFx0Ly8g0JLRgdGC0LDQstC70Y/QtdC8INC60L7QvdGC0LXQudC90LXRgCDRgSDRiNCw0YDQuNC60L7QvCDQsiBib2R5XG5cdFx0aWYgKHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmJvZHkpIHtcblx0XHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyDQmNGB0L/QvtC70YzQt9GD0LXQvCBhYnNvbHV0ZSDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjQtSDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LTQvtC60YPQvNC10L3RgtCwXG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtyYW5kb21YfXB4YDtcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHtyYW5kb21ZfXB4YDtcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSAnOTk5OCc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpcy1hdHRhY2hlZCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCf0L7QutCw0Lcg0L/QtdGA0LLQvtCz0L4g0LzQvtC00LDQu9GM0L3QvtCz0L4g0L7QutC90LAgKNGE0L7RgNC80LAgZW1haWwpXG5cdCAqL1xuXHRzaG93TW9kYWxTdGVwMSgpIHtcblx0XHRpZiAoIXRoaXMubW9kYWxTdGVwMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCh0LrRgNGL0LLQsNC10Lwg0YjQsNGA0LjQuiDRgdGA0LDQt9GDINC4INC/0L7Qu9C90L7RgdGC0YzRjlxuXHRcdGlmICh0aGlzLmNvbnRhaW5lcikge1xuXHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXHRcdH1cblxuXHRcdC8vINCf0L7QutCw0LfRi9Cy0LDQtdC8INC80L7QtNCw0LvRjNC90L7QtSDQvtC60L3QvlxuXHRcdHRoaXMubW9kYWxTdGVwMS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXHRcdGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0fVxuXG5cdC8qKlxuXHQgKiDQn9C+0LrQsNC3INCy0YLQvtGA0L7Qs9C+INC80L7QtNCw0LvRjNC90L7Qs9C+INC+0LrQvdCwICjQv9GA0L7QvNC+0LrQvtC0KVxuXHQgKi9cblx0c2hvd01vZGFsU3RlcDIocHJvbW9jb2RlKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGFsU3RlcDIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyDQodC60YDRi9Cy0LDQtdC8INC/0LXRgNCy0L7QtSDQvNC+0LTQsNC70YzQvdC+0LUg0L7QutC90L5cblx0XHRpZiAodGhpcy5tb2R
10072hbFN0ZXAxKSB7XG5cdFx0XHR0aGlzLm1vZGFsU3RlcDEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHR9XG5cblx0XHQvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDQv9GA0L7QvNC+0LrQvtC0XG5cdFx0Y29uc3QgcHJvbW9jb2RlSW5wdXQgPSB0aGlzLm1vZGFsU3RlcDIucXVlcnlTZWxlY3RvcignI2JmQmFsbFByb21vY29kZScpO1xuXHRcdGlmIChwcm9tb2NvZGVJbnB1dCAmJiBwcm9tb2NvZGUpIHtcblx0XHRcdHByb21vY29kZUlucHV0LnZhbHVlID0gcHJvbW9jb2RlO1xuXHRcdH1cblxuXHRcdC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgtC10LrRgdGCINGBINC/0YDQvtGG0LXQvdGC0L7QvCDRgdC60LjQtNC60Lhcblx0XHRjb25zdCBwcm9tb2NvZGVUZXh0ID0gdGhpcy5tb2RhbFN0ZXAyLnF1ZXJ5U2VsZWN0b3IoJyNiZkJhbGxQcm9tb2NvZGVUZXh0Jyk7XG5cdFx0aWYgKHByb21vY29kZVRleHQgJiYgcHJvbW9jb2RlKSB7XG5cdFx0XHQvLyDQmNC30LLQu9C10LrQsNC10Lwg0L/RgNC+0YbQtdC90YIg0LjQtyDQv9GA0L7QvNC+0LrQvtC00LAgKEJMS0ZSRDUgLT4gNSUsIEJMS0ZSRDEwIC0+IDEwJSwg0Lgg0YIu0LQuKVxuXHRcdFx0bGV0IGRpc2NvdW50VGV4dCA9ICcnO1xuXHRcdFx0aWYgKHByb21vY29kZSA9PT0gJ0RPU1RGUkVFJykge1xuXHRcdFx0XHRkaXNjb3VudFRleHQgPSAn0JHQldCX0JrQntCo0KLQntCS0J3QoyDQlNCe0KHQotCQ0JLQmtCjINCd0JAg0JDQlNCS0JXQndCiINCa0JDQm9CV0J3QlNCQ0KAnO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9tb2NvZGUuc3RhcnRzV2l0aCgnQkxLRlJEJykpIHtcblx0XHRcdFx0Ly8g0JjQt9Cy0LvQtdC60LDQtdC8INGH0LjRgdC70L4g0LjQtyDQv9GA0L7QvNC+0LrQvtC00LAgKEJMS0ZSRDUgLT4gNSwgQkxLRlJEMTAgLT4gMTApXG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gcHJvbW9jb2RlLm1hdGNoKC9CTEtGUkQoXFxkKykvKTtcblx0XHRcdFx0aWYgKG1hdGNoICYmIG1hdGNoWzFdKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGVyY2VudCA9IG1hdGNoWzFdO1xuXHRcdFx0XHRcdGRpc2NvdW50VGV4dCA9IGAtJHtwZXJjZW50fSVgO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpc2NvdW50VGV4dCA9ICfQn9Cg0J7QnNCe0JrQntCUJztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGlzY291bnRUZXh0ID0gJ9Cf0KDQntCc0J7QmtCe0JQnO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRwcm9tb2NvZGVUZXh0LnRleHRDb250ZW50ID0gYNCS0IbQotCQ0ITQnNCeISDQktCYINCX0J3QkNCZ0KjQm9CYICR7ZGlzY291bnRUZXh0fWA7XG5cdFx0fVxuXG5cdFx0Ly8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0LLRgtC+0YDQvtC1INC80L7QtNCw0LvRjNC90L7QtSDQvtC60L3QvlxuXHRcdHRoaXMubW9kYWxTdGVwMi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXHR9XG5cblx0LyoqXG5cdCAqINCh0LrRgNGL0YLQuNC1INC80L7QtNCw0LvRjNC90L7Qs9C+INC+0LrQvdCwXG5cdCAqL1xuXHRoaWRlTW9kYWwoKSB7XG5cdFx0aWYgKHRoaXMubW9kYWxTdGVwMSkge1xuXHRcdFx0dGhpcy5tb2R
10072hbFN0ZXAxLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm1vZGFsU3RlcDIpIHtcblx0XHRcdHRoaXMubW9kYWxTdGVwMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdH1cblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cdH1cblxuXHQvKipcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0L7QsdGA0LDQsdC+0YLRh9C40LrQvtCyINC80L7QtNCw0LvRjNC90YvRhSDQvtC60L7QvVxuXHQgKi9cblx0aW5pdE1vZGFsSGFuZGxlcnMoKSB7XG5cdFx0Ly8g0JrQvdC+0L/QutC4INC30LDQutGA0YvRgtC40Y9cblx0XHRjb25zdCBjbG9zZUJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2xvc2UtYmYtYmFsbC1tb2RhbCwgLmpzLWhpZGUtYmYtYmFsbC1tb2RhbCcpO1xuXHRcdGNsb3NlQnV0dG9ucy5mb3JFYWNoKGJ0biA9PiB7XG5cdFx0XHRidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaGlkZU1vZGFsKCk7XG5cdFx0XHRcdC8vINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8IGNvb2tpZSwg0YfRgtC+0LHRiyDQsdC+0LvRjNGI0LUg0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCDRiNCw0YDQuNC6XG5cdFx0XHRcdGNvb2tpZURhdGEuYWRkKCdzaG93LWJhbGwtbW9kYWwnLCBmYWxzZSwge1xuXHRcdFx0XHRcdGV4cGlyZXM6IDM2NSxcblx0XHRcdFx0XHRwYXRoOiAnLycsXG5cdFx0XHRcdFx0U2FtZVNpdGU6ICdOb25lJyxcblx0XHRcdFx0XHRTZWN1cmU6ICdTZWN1cmUnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHQvLyDQl9Cw0LrRgNGL0YLQuNC1INC/0YDQuCDQutC70LjQutC1INC90LAg0YTQvtC9XG5cdFx0W3RoaXMubW9kYWxTdGVwMSwgdGhpcy5tb2RhbFN0ZXAyXS5mb3JFYWNoKG1vZGFsID0+IHtcblx0XHRcdGlmIChtb2RhbCkge1xuXHRcdFx0XHRtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuXHRcdFx0XHRcdFx0dGhpcy5oaWRlTW9kYWwoKTtcblx0XHRcdFx0XHRcdGNvb2tpZURhdGEuYWRkKCdzaG93LWJhbGwtbW9kYWwnLCBmYWxzZSwge1xuXHRcdFx0XHRcdFx0XHRleHBpcmVzOiAzNjUsXG5cdFx0XHRcdFx0XHRcdHBhdGg6ICcvJyxcblx0XHRcdFx0XHRcdFx0U2FtZVNpdGU6ICdOb25lJyxcblx0XHRcdFx0XHRcdFx0U2VjdXJlOiAnU2VjdXJlJ1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQvtCx0YDQsNCx0L7RgtGH0LjQutCwINGE0L7RgNC80Ytcblx0ICog0KTQvtGA0LzQsCDQvtCx0YDQsNCx0LDRgtGL0LLQsNC10YLRgdGPINGH0LXRgNC10Lcg0YHRgtCw0L3QtNCw0YDRgtC90YPRjiDRgdC40YHRgtC10LzRgyDQstCw0LvQuNC00LDRhtC40Lhcblx0ICog0JzRiyDQv9C10YDQtdGF0LLQsNGC0YvQstCw0LXQvCDRg9GB0L/QtdGI0L3Ri9C5INC+0YLQstC10YIg0YfQtdGA0LXQtyDQutCw0YHRgtC+0LzQvdC+0LUg0YHQvtCx0YvRgtC40LVcblx0ICovXG5cdGluaXRGb3JtSGFuZGxlcigpIHtcblx0XHRpZiAoIXRoaXMubW9kYWxTdGVwMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYWxsTW9kYWw6IG1vZGFsU3RlcDEg0L3QtSDQvdCw0LnQtNC10L0nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtID0gdGhpcy5tb2RhbFN0ZXAxLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm1bZGF0YS1hamF4XScpO1xuXHRcdGlmICghZm9ybSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYWxsTW9kYWw6INGE0L7RgNC80LAg0L3QtSDQvdCw0LnQtNC10L3QsCDQsiBtb2RhbFN0ZXAxJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgJGZvcm0gPSAkKGZvcm0pO1xuXHRcdFxuXHRcdC8vINCh0L7RhdGA0LDQvdGP0LXQvCDRgdGB0YvQu9C60YMg0L3QsCDRhNC+0YDQvNGDINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQsiDQtNGA0YPQs9C40YUg0LzQtdGC0L7QtNCw0YVcblx0XHR0aGlzLmZvcm0gPSBmb3JtO1xuXHRcdHRoaXMuJGZvcm0gPSAkZm9ybTtcblxuXHRcdC8vINCf0LXRgNC10YXQstCw0YLRi9Cy0LDQtdC8INC+0YLQstC10YIg0YfQtdGA0LXQtyDQutCw0YHRgtC+0LzQvdC+0LUg0YHQvtCx0YvRgtC40LUsINC60L7RgtC+0YDQvtC1INCz0LXQvdC10YDQuNGA0YPQtdGC0YHRjyDQsiB2YWxpZGF0ZUdldFJlc3BvbnNlXG5cdFx0JGZvcm0ub24oJ2JhbGxtb2RhbDpyZXNwb25zZScsIChlLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0L/QvtC70YPRh9C10L0g0L7RgtCy0LXRgiDQvtGCIGJhbGxtb2RhbCcsIHJlc3BvbnNlKTtcblx0XHRcdFxuXHRcdFx0aWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuYmFsbG1vZGFsKSB7XG5cdFx0XHRcdC8vINCV0YHQu9C4INGE0L7RgNC80LAg0YPRgdC/0LXRiNC90L4g0L7RgtC/0YDQsNCy0LvQtdC90LAsINC+0YLQv9GA0LDQstC70Y/QtdC8INC90LAg0LLRgtC+0YDQvtC5INGI0LDQs1xuXHRcdFx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiDRg9GB0L/QtdGI0L3Ri9C5INC+0YLQstC10YIsINC/0LXRgNC10YXQvtC00LjQvCDQuiDRgdC+0YXRgNCw0L3QtdC90LjRjicpO1xuXHRcdFx0XHR0aGlzLnNhdmVCYWxsKHJlc3BvbnNlKTtcblx0XHRcdH0gZWxzZSBpZiAocmVzcG9uc2UgJiYgIXJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0Ly8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0L7RiNC40LHQutGDLCDQtdGB0LvQuCDQvtC90LAg0LXRgdGC0Yxcblx0XHRcdFx0Y29uc3QgZXJyb3JNc2cgPSByZXNwb25zZS5yZXNwb25zZSB8fCAn0J/QvtC80LjQu9C60LAuINCh0L/RgNC+0LHRg9C50YLQtSDRidC1INGA0LDQty4nO1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6INC+0YjQuNCx0LrQsCDQsiDQvtGC0LLQtdGC0LUnLCBlcnJvck1zZyk7XG5cdFx0XHRcdGFsZXJ0KGVycm9yTXNnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDQvdC10L7QttC40LTQsNC90L3Ri9C5INGE0L7RgNC80LDRgiDQvtGC0LLQtdGC0LAnLCByZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0XG5cdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0L7QsdGA0LDQsdC+0YLRh9C40Log0YTQvtGA0LzRiyDQuNC90LjRhtC40LDQu9C40LfQuNGA0L7QstCw0L0g0LTQu9GPJywgZm9ybSwgJ1VSTDonLCAkZm9ybS5kYXRhKCdhamF4JykpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCh0L7RhdGA0LDQvdC10L3QuNC1INGI0LDRgNC40LrQsCAo0LLRgtC+0YDQvtC5INGI0LDQsylcblx0ICovXG5cdHNhdmVCYWxsKG1vZGFsUmVzcG9uc2UpIHtcblx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiBzYXZlQmFsbCDQstGL0LfQstCw0L0g0YEg0L7RgtCy0LXRgtC+0LwnLCBtb2RhbFJlc3BvbnNlKTtcblx0XHRcblx0XHRjb25zdCBlbWFpbElucHV0ID0gdGhpcy5tb2R
10072hbFN0ZXAxLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJlbWFpbFwiXScpO1xuXHRcdGlmICghZW1haWxJbnB1dCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcignQmFsbE1vZGFsOiBlbWFpbCBpbnB1dCDQvdC1INC90LDQudC00LXQvScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVtYWlsID0gZW1haWxJbnB1dC52YWx1ZTtcblx0XHRpZiAoIWVtYWlsKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6IGVtYWlsINC90LUg0L3QsNC50LTQtdC9INCyIGlucHV0Jyk7XG5cdFx0XHRhbGVydCgn0J/QvtC80LjQu9C60LA6IGVtYWlsINC90LUg0LfQvdCw0LnQtNC10L3QvicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCY0YHQv9C+0LvRjNC30YPQtdC8INGB0L7RhdGA0LDQvdC10L3QvdGD0Y4g0YHRgdGL0LvQutGDINC90LAg0YTQvtGA0LzRgyDQuNC70Lgg0LjRidC10Lwg0LfQsNC90L7QstC+XG5cdFx0Y29uc3QgZm9ybSA9IHRoaXMuZm9ybSB8fCB0aGlzLm1vZGFsU3RlcDEucXVlcnlTZWxlY3RvcignZm9ybVtkYXRhLWFqYXhdJyk7XG5cdFx0aWYgKCFmb3JtKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6INGE0L7RgNC80LAg0L3QtSDQvdCw0LnQtNC10L3QsCcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0ICRmb3JtID0gdGhpcy4kZm9ybSB8fCAkKGZvcm0pO1xuXHRcdGNvbnN0IGJhc2VVcmwgPSAkZm9ybS5kYXRhKCdhamF4JykgfHwgZm9ybS5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWpheCcpO1xuXHRcdGlmICghYmFzZVVybCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcignQmFsbE1vZGFsOiDQvdC1INGD0LTQsNC70L7RgdGMINC+0L/RgNC10LTQtdC70LjRgtGMIFVSTCDQuNC3INGE0L7RgNC80YsnKTtcblx0XHRcdGFsZXJ0KCfQn9C+0LzQuNC70LrQsDog0L3QtSDQstC00LDQu9C+0YHRjyDQstC40LfQvdCw0YfQuNGC0LggVVJMINC00LvRjyDQt9Cx0LXRgNC10LbQtdC90L3RjycpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiDQvtGC0L/RgNCw0LLQu9GP0LXQvCDQt9Cw0L/RgNC+0YEg0L3QsCDRgdC+0YXRgNCw0L3QtdC90LjQtSwgZW1haWw6JywgZW1haWwsICdVUkw6JywgYmFzZVVybCk7XG5cblx0XHQvLyDQl9Cw0LzQtdC90Y/QtdC8IGJhbGxtb2RhbCDQvdCwIGJhbGxzYXZlXG5cdFx0Y29uc3Qgc2F2ZVVybCA9IGJhc2VVcmwucmVwbGFjZSgnYmFsbG1vZGFsJywgJ2JhbGxzYXZlJyk7XG5cblx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiDQvtGC0L/RgNCw0LLQu9GP0LXQvCDQt9Cw0L/RgNC+0YEg0L3QsCDRgdC+0YXRgNCw0L3QtdC90LjQtScpO1xuXG5cdFx0JC5hamF4KHtcblx0XHRcdGNhY2hlOiBmYWxzZSxcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0dXJsOiBzYXZlVXJsLFxuXHRcdFx0ZGF0YToge1xuXHRcdFx0XHRlbWFpbDogZW1haWxcblx0XHRcdH0sXG5cdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnXG5cdFx0fSkuZG9uZSgocmVzcG9uc2UsIHRleHRTdGF0dXMsIHhocikgPT4ge1xuXHRcdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0YPRgdC/0LXRiNC90YvQuSDQvtGC0LLQtdGCINC+0YIgYmFsbHNhdmUnLCB7IHJlc3BvbnNlLCB0ZXh0U3RhdHVzLCB4aHIgfSk7XG5cdFx0XHRcblx0XHRcdC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0YfRgtC+INC+0YLQstC10YIg0Y/QstC70Y/QtdGC0YHRjyDQvtCx0YrQtdC60YLQvtC8XG5cdFx0XHRpZiAodHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCByZXNwb25zZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdDonLCByZXNwb25zZSk7XG5cdFx0XHRcdGFsZXJ0KCfQn9C+0LzQuNC70LrQsDog0L3QtdC60L7RgNC10LrRgtC90LAg0LLRltC00L/QvtCy0ZbQtNGMINCy0ZbQtCDRgdC10YDQstC10YDQsCcpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG5cdFx0XHRcdC8vINCf0L7Qu9GD0YfQsNC10Lwg0L/RgNC+0LzQvtC60L7QtCDQuNC3INC+0YLQstC10YLQsFxuXHRcdFx0XHRjb25zdCBwcm9tb2NvZGUgPSByZXNwb25zZS5wcm9tbyB8fCByZXNwb25zZS5wcm9tb2NvZGUgfHwgJ0RPU1RGUkVFJztcblx0XHRcdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0L/QvtC70YPRh9C10L0g0L/RgNC+0LzQvtC60L7QtCcsIHByb21vY29kZSk7XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyDQn9C+0LrQsNC30YvQstCw0LXQvCDQstGC0L7RgNC+0LUg0LzQvtC00LDQu9GM0L3QvtC1INC+0LrQvdC+INGBINC/0YDQvtC80L7QutC+0LTQvtC8XG5cdFx0XHRcdHRoaXMuc2hvd01vZGFsU3RlcDIocHJvbW9jb2RlKTtcblxuXHRcdFx0XHQvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCBjb29raWVcblx0XHRcdFx0Y29va2llRGF0YS5hZGQoJ3Nob3ctYmFsbC1tb2RhbCcsIGZhbHNlLCB7XG5cdFx0XHRcdFx0ZXhwaXJlczogMzY1LFxuXHRcdFx0XHRcdHBhdGg6ICcvJyxcblx0XHRcdFx0XHRTYW1lU2l0ZTogJ05vbmUnLFxuXHRcdFx0XHRcdFNlY3VyZTogJ1NlY3VyZSdcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBlcnJvck1zZyA9IHJlc3BvbnNlLnJlc3BvbnNlIHx8IHJlc3BvbnNlLm1lc3NhZ2UgfHwgJ9Cf0L7QvNC40LvQutCwLiDQodC/0YDQvtCx0YPQudGC0LUg0YnQtSDRgNCw0LcuJztcblx0XHRcdFx0Y29uc29sZS5lcnJvcignQmFsbE1vZGFsOiDQvtGI0LjQsdC60LAg0LIg0L7RgtCy0LXRgtC1JywgZXJyb3JNc2cpO1xuXHRcdFx0XHRhbGVydChlcnJvck1zZyk7XG5cdFx0XHR9XG5cdFx0fSkuZmFpbCgoeGhyLCBzdGF0dXMsIGVycm9yKSA9PiB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6IEFKQVggZmFpbCDQstGL0LfQstCw0L0nLCB7IFxuXHRcdFx0XHRzdGF0dXM6IHhoci5zdGF0dXMsIFxuXHRcdFx0XHRzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcblx0XHRcdFx0cmVhZHlTdGF0ZTogeGhyLnJlYWR5U3RhdGUsXG5cdFx0XHRcdHJlc3BvbnNlVGV4dDogeGhyLnJlc3BvbnNlVGV4dCxcblx0XHRcdFx0cmVzcG9uc2VKU09OOiB4aHIucmVzcG9uc2VKU09OLFxuXHRcdFx0XHRzdGF0dXM6IHN0YXR1cyxcblx0XHRcdFx0ZXJyb3I6IGVycm9yXG5cdFx0XHR9KTtcblx0XHRcdFxuXHRcdFx0bGV0IGVycm9yTXNnID0gJ9Cf0L7QvNC40LvQutCwINC3XFwn0ZTQtNC90LDQvdC90Y8uINCh0L/RgNC+0LHRg9C50YLQtSDRidC1INGA0LDQty4nO1xuXHRcdFx0XG5cdFx0XHQvLyDQldGB0LvQuCDRgdGC0LDRgtGD0YEgMjAwLCDQvdC+INC/0L7Qv9Cw0LvQuCDQsiBmYWlsIC0g0LLQvtC30LzQvtC20L3QviDQv9GA0L7QsdC70LXQvNCwINGBINC/0LDRgNGB0LjQvdCz0L7QvCBKU09OXG5cdFx0XHRpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRgdGC0LDRgtGD0YEgMjAwLCDQvdC+INC/0L7Qv9Cw0LvQuCDQsiBmYWlsIC0g0LLQvtC30LzQvtC20L3QviDQv9GA0L7QsdC70LXQvNCwINGBIEpTT04nKTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IHR5cGVvZiB4aHIucmVzcG9uc2VKU09OICE9PSAndW5kZWZpbmVkJyBcblx0XHRcdFx0XHRcdD8geGhyLnJlc3BvbnNlSl
10072NPTiBcblx0XHRcdFx0XHRcdDogSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0Ly8g0JXRgdC70Lgg0L7RgtCy0LXRgiDRg9GB0L/QtdGI0L3Ri9C5LCDQvtCx0YDQsNCx0LDRgtGL0LLQsNC10Lwg0LXQs9C+XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9tb2NvZGUgPSByZXNwb25zZS5wcm9tbyB8fCByZXNwb25zZS5wcm9tb2NvZGUgfHwgJ0RPU1RGUkVFJztcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdCYWxsTW9kYWw6INC+0LHRgNCw0LHQsNGC0YvQstCw0LXQvCDQvtGC0LLQtdGCINC40LcgZmFpbCAo0YHRgtCw0YLRg9GBIDIwMCknLCBwcm9tb2NvZGUpO1xuXHRcdFx0XHRcdFx0dGhpcy5zaG93TW9kYWxTdGVwMihwcm9tb2NvZGUpO1xuXHRcdFx0XHRcdFx0Y29va2llRGF0YS5hZGQoJ3Nob3ctYmFsbC1tb2RhbCcsIGZhbHNlLCB7XG5cdFx0XHRcdFx0XHRcdGV4cGlyZXM6IDM2NSxcblx0XHRcdFx0XHRcdFx0cGF0aDogJy8nLFxuXHRcdFx0XHRcdFx0XHRTYW1lU2l0ZTogJ05vbmUnLFxuXHRcdFx0XHRcdFx0XHRTZWN1cmU6ICdTZWN1cmUnXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRlcnJvck1zZyA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0JhbGxNb2RhbDog0L7RiNC40LHQutCwINC/0LDRgNGB0LjQvdCz0LAg0L7RgtCy0LXRgtCwJywgZSk7XG5cdFx0XHRcdFx0ZXJyb3JNc2cgPSAn0J/QvtC80LjQu9C60LA6INC90LXQutC+0YDQtdC60YLQvdCwINCy0ZbQtNC/0L7QstGW0LTRjCDQstGW0LQg0YHQtdGA0LLQtdGA0LAnO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyDQn9GL0YLQsNC10LzRgdGPINC/0L7Qu9GD0YfQuNGC0Ywg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1INC40Lcg0L7RgtCy0LXRgtCwXG5cdFx0XHRcdGlmICh4aHIucmVzcG9uc2VKU09OICYmIHhoci5yZXNwb25zZUpTT04ucmVzcG9uc2UpIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IHhoci5yZXNwb25zZUpTT04ucmVzcG9uc2U7XG5cdFx0XHRcdH0gZWxzZSBpZiAoeGhyLnJlc3BvbnNlVGV4dCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBlcnJvclJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcblx0XHRcdFx0XHRcdGlmIChlcnJvclJlc3BvbnNlLnJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRcdGVycm9yTXNnID0gZXJyb3JSZXNwb25zZS5yZXNwb25zZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHQvLyDQmNCz0L3QvtGA0LjRgNGD0LXQvCDQvtGI0LjQsdC60YMg0L/QsNGA0YHQuNC90LPQsFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRhbGVydChlcnJvck1zZyk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LrQvdC+0L/QutC4INC60L7Qv9C40YDQvtCy0LDQvdC40Y8g0L/RgNC+0LzQvtC60L7QtNCwXG5cdCAqL1xuXHRpbml0Q29weUJ1dHRvbigpIHtcblx0XHRjb25zdCBjb3B5QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29weS10YXJnZXRdJyk7XG5cdFx0aWYgKCFjb3B5QnRuKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29weUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRjb25zdCB0YXJnZXRTZWxlY3RvciA9IGNvcHlCdG4uZ2V0QXR0cmlidXRlKCdkYXRhLWNvcHktdGFyZ2V0Jyk7XG5cdFx0XHRjb25zdCB0YXJnZXRJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuXG5cdFx0XHRpZiAodGFyZ2V0SW5wdXQpIHtcblx0XHRcdFx0dGFyZ2V0SW5wdXQuc2VsZWN0KCk7XG5cdFx0XHRcdHRhcmdldElucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIDk5OTk5KTsgLy8g0JTQu9GPINC80L7QsdC40LvRjNC90YvRhSDRg9GB0YLRgNC+0LnRgdGC0LJcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG5cblx0XHRcdFx0XHQvLyDQktC40LfRg9Cw0LvRjNC90LDRjyDQvtCx0YDQsNGC0L3QsNGPINGB0LLRj9C30Yxcblx0XHRcdFx0XHRjb25zdCBvcmlnaW5hbFRleHQgPSBjb3B5QnRuLnRleHRDb250ZW50O1xuXHRcdFx0XHRcdGNvcHlCdG4udGV4dENvbnRlbnQgPSAn0KHQutC+0L/RltC50L7QstCw0L3QviEnO1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29weUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcblx0XHRcdFx0XHR9LCAyMDAwKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0YWxlcnQoJ9Cd0LUg0LLQtNCw0LvQvtGB0Y8g0YHQutC+0L/RltGO0LLQsNGC0Lgg0L/RgNC+0LzQvtC60L7QtCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFsbE1vZGFsO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2guZGVib3VuY2UnO1xuaW1wb3J0IHsgdG9nZ2xlQm9keVNjcm9sbExvY2sgfSBmcm9tICcuL21haW4tbWVudSc7XG5cbmV4cG9ydCBjb25zdCByZWZzID0ge1xuXHRib2R5OiBkb2N1bWVudC5ib2R5LFxuXHRtZW51OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbWFpbi1tZW51JyksXG5cdHNlYXJjaDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNhdGFsb2ctc2VhcmNoJyksXG5cdHNlYXJjaElucHV0OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2F0YWxvZy1zZWFyY2gtaW5wdXQnKSxcblx0b3BlbkJ0bjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNhdGFsb2ctc2VhcmNoLW9wZW4nKSxcblx0Y2xvc2VCdG46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXRhbG9nLXNlYXJjaC1jbG9zZScpLFxuXHRzZWFyY2hBbGxCdG46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXRhbG9nLXNlYXJjaC1zaG93LWFsbCcpLFxuXHRpdGVtc0xpc3Q6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXRhbG9nLXNlYXJjaC1pdGVtcy1saXN0JyksXG5cdGl0ZW1zV3JhcDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNhdGFsb2ctc2VhcmNoLWl0ZW1zLXdyYXAnKSxcblx0bm90Rm91bmRUZXh0OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2F0YWxvZy1zZWFyY2gtbm90LWZvdW5kLXRleHQnKVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuXHRpZiAoIXJlZnMub3BlbkJ0bikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGhhbmRsZVNlYXJjaEF1dG9jb21wbGV0ZSA9IChzZWFyY2hUZXJtKSA9PiB7XG5cdFx0cmVmcy5zZWFyY2hBbGxCdG4uaHJlZiA9IGAke3dpbmRvdy53ZXpvbUNvbmZpZy5zZWFyY2h9P3E9JHtlbmNvZGVVUkkoc2VhcmNoVGVybSl9YDtcblx0XHQkLmFqYXgoe1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHR1cmw6IHdpbmRvdy53ZXpvbUNvbmZpZy5zZWFyY2hBdXRvY29tcGxldGUsXG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdHF1ZXJ5OiBzZWFyY2hUZXJtXG5cdFx0XHR9XG5cdFx0fSkuZG9uZShyZXMgPT4ge1xuXHRcdFx0aWYgKHJlcy5zdWNjZXNzICYmIHJlcy5pdGVtc19tYXJrdXApIHtcblx0XHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0cmVmcy5pdGVtc0xpc3QuaW5uZXJIVE1MID0gcmVzLml0ZW1zX21hcmt1cDtcblx0XHRcdFx0cmVmcy5pdGVtc1dyYXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJlZnMuaXRlbXNXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRyZWZzLm5vdEZvdW5kVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHR9KS5mYWlsKGVyciA9PiB7XG5cdFx0XHRyZWZzLml0ZW1zV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRjb25zb2xlLmVycm9yKGVyci5yZXNwb25zZVRleHQpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdGNvbnN0IGhhbmRsZVNlYXJjaElucHV0ID0gKGUpID0+IHtcblx0XHRpZiAoIWUudGFyZ2V0LnZhbHVlKSB7XG5cdFx0XHRyZWZzLml0ZW1zV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgc2VhcmNoVGVybSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXHRcdC8vIGNvbnNvbGUubG9nKHNlYXJjaFRlcm0ucmVwbGFjZSgvXlxcd1xccy9naSwgJycpKTtcblx0XHRpZiAoIXNlYXJjaFRlcm0pIHtcblx0XHRcdGUudGFyZ2V0LnZhbHVlID0gJyc7XG5cdFx0XHRyZWZzLml0ZW1zV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhhbmRsZVNlYXJjaEF1dG9jb21wbGV0ZShzZWFyY2hUZXJtKTtcblx0fTtcblxuXHRyZWZzLnNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UoaGFuZGxlU2VhcmNoSW5wdXQsIDUwMCkpO1xuXG5cdGNvbnN0IGhhbmRsZUVzY0Nsb3NlID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZnAtcmVhZHknKSB8fCAhcmVmcy5tZW51LmNsYXNzTGlzdC5jb250YWlucygnaXMtaGlkZGVuJykpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NDbG9zZSk7XG5cdFx0XHRpZiAocmVmcy5zZWFyY2guY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1oaWRkZW4nKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0b2dnbGVTZWFyY2goKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgaGFuZGxlSG90S2V5UHJlc3MgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY29kZSA9PT0gJ0tleUsnKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZnAtcmVhZHknKSB8fCAhcmVmcy5tZW51LmNsYXNzTGlzdC5jb250YWlucygnaXMtaGlkZGVuJykpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NDbG9zZSk7XG5cdFx0XHR0b2dnbGVTZWFyY2goKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgdG9nZ2xlU2VhcmNoID0gKCkgPT4ge1xuXHRcdGNvbnN0IGlzU2VhcmNoT3BlbiA9IHJlZnMub3BlbkJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ3RydWUnIHx8IGZhbHNlO1xuXG5cdFx0aWYgKCFpc1NlYXJjaE9wZW4pIHtcblx0XHRcdHJlZnMubm90Rm91bmRUZXh0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHQvLyBhZGQgY2xvc2Ugb24gRXNjXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUVzY0Nsb3NlKTtcblx0XHRcdHdpbmRvdy5zZXRUaW
100721lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVmcy5zZWFyY2hJbnB1dC5mb2N1cygpO1xuXHRcdFx0XHRyZWZzLnNlYXJjaElucHV0LnNldFNlbGVjdGlvblJhbmdlKC0xLCAtMSk7XG5cdFx0XHR9LCAyMDApO1xuXG5cdFx0XHRpZiAocmVmcy5zZWFyY2hJbnB1dC52YWx1ZSkge1xuXHRcdFx0XHRoYW5kbGVTZWFyY2hBdXRvY29tcGxldGUocmVmcy5zZWFyY2hJbnB1dC52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gc2hvdy9oaWRlIHNlYXJjaFxuXHRcdHJlZnMub3BlbkJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAhaXNTZWFyY2hPcGVuKTtcblx0XHRyZWZzLnNlYXJjaC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1oaWRkZW4nKTtcblxuXHRcdC8vIGxvY2svdW5sb2NrIHdpbmRvdyBzY3JvbGxcblx0XHR0b2dnbGVCb2R5U2Nyb2xsTG9jayghaXNTZWFyY2hPcGVuLCByZWZzLnNlYXJjaCk7XG5cdH07XG5cblx0cmVmcy5vcGVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlU2VhcmNoKTtcblxuXHRyZWZzLnNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICh7IHRhcmdldCB9KSA9PiB7XG5cdFx0aWYgKHRhcmdldCAhPT0gcmVmcy5zZWFyY2ggJiYgdGFyZ2V0ICE9PSByZWZzLmNsb3NlQnRuKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRvZ2dsZVNlYXJjaCgpO1xuXHR9KTtcblxuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUhvdEtleVByZXNzKTtcbn1cbiIsIid1c2UgIHN0cmljdCc7XG5cbi8qKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9nZXQtbXktZWxlbWVudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xpY2tUcmlnZ2VyRm9yICgpIHtcblx0JChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLWNsaWNrLXRyaWdnZXItZm9yXScsIGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCAkdGhpcyA9ICQodGhpcyk7XG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSAkdGhpcy5kYXRhKCdjbGljay10cmlnZ2VyLWZvcicpO1xuXHRcdGNvbnN0ICRmb3IgPSAkdGhpcy5nZXRNeUVsZW1lbnRzKCckZm9yJywgc2VsZWN0b3IpO1xuXHRcdCRmb3IuY2xpY2soKTtcblx0fSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICog0JzQvtC00YPQu9GMINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrRg9C60LhcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcml2YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHtcblx0ZW5jb2RlVVJJQ29tcG9uZW50OiBlbmNvZGVyLFxuXHRkZWNvZGVVUklDb21wb25lbnQ6IGRlY29kZXJcbn0gPSB3aW5kb3c7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqINCg0LDQsdC+0YLQsCDRgSBgZG9jdW1lbnQuY29va2llYFxuICogQG5hbWVzcGFjZSBjb29raWVEYXRhXG4gKiBAc291cmNlQ29kZVxuICovXG5jb25zdCBjb29raWVEYXRhID0ge1xuXHQvKipcblx0ICog0JTQvtCx0LDQstC70LXQvdC40LUg0LfQsNC/0LjRgdC4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqIEBwYXJhbSB7RGF0ZXxudW1iZXJ8c3RyaW5nfSBbb3B0aW9ucy5leHBpcmVzXVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGF0aF1cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRvbWFpbl1cblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZWN1cmVdXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbGVhcm4uamF2YXNjcmlwdC5ydS9jb29raWUj0YTRg9C90LrRhtC40Y8tc2V0Y29va2llLW5hbWUtdmFsdWUtb3B0aW9uc31cblx0ICogQHNvdXJjZUNvZGVcblx0ICovXG5cdGFkZCAoa2V5LCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCF0aGlzLmFsbG93VXNhZ2UgJiYgKGtleSAhPT0gdGhpcy5hbGxvd1VzYWdlS2V5KSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdDb29raWUgdXNhZ2UgaXMgZGlzYWxsb3dlZCEnKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0bGV0IGV4cGlyZXMgPSBvcHRpb25zLmV4cGlyZXM7XG5cblx0XHRpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdudW1iZXInICYmIGV4cGlyZXMpIHtcblx0XHRcdGxldCBkID0gbmV3IERhdGUoKTtcblx0XHRcdGQuc2V0VGltZShkLmdldFRpbWUoKSArIGV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0KTtcblx0XHRcdGV4cGlyZXMgPSBvcHRpb25zLmV4cGlyZXMgPSBkO1xuXHRcdH1cblxuXHRcdGlmIChleHBpcmVzICYmIGV4cGlyZXMudG9VVENTdHJpbmcpIHtcblx0XHRcdG9wdGlvbnMuZXhwaXJlcyA9IGV4cGlyZXMudG9VVENTdHJpbmcoKTtcblx0XHR9XG5cblx0XHR2YWx1ZSA9IGVuY29kZXIodmFsdWUpO1xuXHRcdGxldCB1cGRhdGVkQ29va2llID0gYCR7a2V5fT0ke3ZhbHVlfWA7XG5cblx0XHRmb3IgKGxldCBwcm9wTmFtZSBpbiBvcHRpb25zKSB7XG5cdFx0XHR1cGRhdGVkQ29va2llICs9IGA7ICR7cHJvcE5hbWV9YDtcblx0XHRcdGxldCBwcm9wVmFsdWUgPSBvcHRpb25zW3Byb3BOYW1lXTtcblx0XHRcdGlmIChwcm9wVmFsdWUgIT09IHRydWUpIHtcblx0XHRcdFx0dXBkYXRlZENvb2tpZSArPSBgPSR7cHJvcFZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZG9jdW1lbnQuY29va2llID0gdXBkYXRlZENvb2tpZTtcblx0fSxcblxuXHQvKipcblx0ICog0J/QvtC70YPRh9C10L3QuNC1INC60YPQutC4INC/0L4g0LrQu9GO0YfRg1xuXHQgKiBAcGFyYW0ga2V5XG5cdCAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9XG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbGVhcm4uamF2YXNjcmlwdC5ydS9jb29raWUj0YTRg9C90LrRhtC40Y8tZ2V0Y29va2llLW5hbWV9XG5cdCAqIEBzb3VyY2VDb2RlXG5cdCAqL1xuXHRyZWNlaXZlIChrZXkpIHtcblx0XHRsZXQgbWF0Y2hlcyA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKFxuXHRcdFx0YCg/Ol58OyApJHtrZXkucmVwbGFjZSgvKFtcXC4kPyp8e31cXChcXClcXFtcXF1cX
10072FxcXFwvXFwrXl0pL2csICdcXFxcJDEnKX09KFteO10qKWAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuXHRcdCkpO1xuXHRcdHJldHVybiBtYXRjaGVzID8gZGVjb2RlcihtYXRjaGVzWzFdKSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICog0KPQtNCw0LvQtdC90LjQtSDQutGD0LrQuCDQv9C+INC60LvRjtGH0YNcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleVxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2xlYXJuLmphdmFzY3JpcHQucnUvY29va2llI9GE0YPQvdC60YbQuNGPLWRlbGV0ZWNvb2tpZS1uYW1lfVxuXHQgKiBAc291cmNlQ29kZVxuXHQgKi9cblx0ZGVsZXRlIChrZXkpIHtcblx0XHR0aGlzLmFkZChrZXksICcnLCB7IGV4cGlyZXM6IC0xIH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiDQl9Cw0LTQsNGC0Ywg0LLQvtC/0YDQvtGBINC+INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQvtC8INGB0L7Qs9C70LDRgdC40Lgg0LjRgdC/0L7Qu9GM0LfQsNCy0L3QuNGPINC60YPQutC4XG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqIEBzb3VyY2VDb2RlXG5cdCAqL1xuXHRhc2tVc2FnZSAoKSB7XG5cdFx0aWYgKHRoaXMuYWxsb3dVc2FnZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuJGluZm9CbG9jayA9IHRoaXMuJGluZm9CbG9jayB8fCAkKCdbZGF0YS1jb29raWUtaW5mb10nKTtcblx0XHR0aGlzLiRpbmZvQnV0dG9uID0gdGhpcy4kaW5mb0J1dHRvbiB8fCAkKCdbZGF0YS1jb29raWUtc3VibWl0XScpO1xuXG5cdFx0aWYgKHRoaXMuJGluZm9CbG9jay5sZW5ndGggJiYgdGhpcy4kaW5mb0J1dHRvbi5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkNsYXNzID0gJ2lzLWhpZGRlbic7XG5cdFx0XHR0aGlzLiRpbmZvQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0dGhpcy4kaW5mb0Jsb2NrLmFkZENsYXNzKGhpZGRlbkNsYXNzKTtcblx0XHRcdFx0dGhpcy5hZGQodGhpcy5hbGxvd1VzYWdlS2V5LCB0aGlzLmFsbG93VXNhZ2VWYWx1ZSwgeyBleHBpcmVzOiAzNjUsIHBhdGg6ICcvJywgU2FtZVNpdGU6ICdOb25lJywgU2VjdXJlOiAnU2VjdXJlJyB9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuJGluZm9CbG9jay5yZW1vdmVDbGFzcyhoaWRkZW5DbGFzcyk7XG5cdFx0XHR9LCB0aGlzLmFsbG93VXNhZ2VEZWxheSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqINCf0YDQvtCy0LXRgNC60LAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0LPQviDRgdC+0LPQu9Cw0YHQuNGPXG5cdCAqINC90LAg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0YTQsNC50LvQvtCyIGNvb2tpZVxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBzb3VyY2VDb2RlXG5cdCAqL1xuXHRnZXQgYWxsb3dVc2FnZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVjZWl2ZSh0aGlzLmFsbG93VXNhZ2VLZXkpID09PSB0aGlzLmFsbG93VXNhZ2VWYWx1ZTtcblx0fSxcblxuXHQvKipcblx0ICog0JrQu9GO0Ycg0L/RgNC+0LLQtdGA0LrQuCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60L7Qs9C+INGB0L7Qs9C70LDRgdC40Y9cblx0ICog0L3QsCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRhNCw0LnQu9C+0LIgY29va2llXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqIEBkZWZhdWx0ICdhbGxvdy1jb29raWUtdXNhZ2UnXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHNvdXJjZUNvZGVcblx0ICovXG5cdGdldCBhbGxvd1VzYWdlS2V5ICgpIHtcblx0XHRyZXR1cm4gJ2FsbG93LWNvb2tpZS11c2FnZSc7XG5cdH0sXG5cblx0LyoqXG5cdCAqINCX0L3QsNGH0LXQvdC40LUg0LrQu9GO0YfQsCDQv9GA0L7QstC10YDQutC4INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQvtCz0L4g0YHQvtCz0LvQsNGB0LjRj1xuXHQgKiDQvdCwINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINGE0LDQudC70L7QsiBjb29raWVcblx0ICogQHR5cGUge3N0cmluZ31cblx0ICogQGRlZmF1bHQgJ3RydWUnXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHNvdXJjZUNvZGVcblx0ICovXG5cdGdldCBhbGxvd1VzYWdlVmFsdWUgKCkge1xuXHRcdHJldHVybiAndHJ1ZSc7XG5cdH0sXG5cblx0LyoqXG5cdCAqINCX0LDQtNC10YDQttC60LAgKG1zKSDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60L7Qs9C+INGB0L7Qs9C70LDRgdC40Y9cblx0ICog0L3QsCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRhNCw0LnQu9C+0LIgY29va2llXG5cdCAqIEB0eXBlIHtudW1iZXJ9XG5cdCAqIEBkZWZhdWx0IDIwMDBcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAc291cmNlQ29kZVxuXHQgKi9cblx0Z2V0IGFsbG93VXNhZ2VEZWxheSAoKSB7XG5cdFx0cmV0dXJuIDIwMDA7XG5cdH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGRlZmF1bHQgY29va2llRGF0YTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRWNvbW1lcmNlIFRyYWNraW5nXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBFY29tbWVyY2VUcmFja2luZyB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0XHR0aGlzLml0ZW1CcmFuZCA9ICfQo9C80LDQvdGM0L/QuNCy0L4nO1xuXHRcdHRoaXMuY3VycmVuY3kgPSAnVUFIJztcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciB0aGUgcHJldmlvdXMgZWNvbW1lcmNlIG9iamVjdC5cblx0ICovXG5cdGNsZWFyICgpIHtcblx0XHR3aW5kb3cuZGF0YUxheWVyLnB1c2goeyBlY29tbWVyY2U6IG51bGwgfSk7XG5cdH1cblxuXHR0cmFja0Zvcm1TdWJtaXQgKGV2ZW50KSB7XG5cdFx0d2luZG93LmRh
10072dGFMYXllci5wdXNoKHtcblx0XHRcdGV2ZW50XG5cdFx0fSk7XG5cdH1cblxuXHR0cmFja1ZpZXdJdGVtIChwcm9kdWN0RGF0YSkge1xuXHRcdGlmICghcHJvZHVjdERhdGEpIHJldHVybjtcblx0XHRwcm9kdWN0RGF0YS5pdGVtX2JyYW5kID0gdGhpcy5pdGVtQnJhbmQ7XG5cdFx0cHJvZHVjdERhdGEuY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xuXHRcdHRoaXMuY2xlYXIoKTtcblx0XHR3aW5kb3cuZGF0YUxheWVyLnB1c2goe1xuXHRcdFx0ZXZlbnQ6ICd2aWV3X2l0ZW0nLFxuXHRcdFx0ZWNvbW1lcmNlOiB7XG5cdFx0XHRcdGl0ZW1zOiBbcHJvZHVjdERhdGFdXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHR0cmFja0NhcnRJdGVtIChldmVudCwgcHJvZHVjdERhdGEsIHF1YW50aXR5ID0gMSkge1xuXHRcdGlmICghcHJvZHVjdERhdGEpIHJldHVybjtcblxuXHRcdGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShwcm9kdWN0RGF0YSkgPyBwcm9kdWN0RGF0YSA6IFtwcm9kdWN0RGF0YV07XG5cdFx0bGV0IHZhbHVlID0gMDtcblxuXHRcdGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRcdGl0ZW0uaXRlbV9icmFuZCA9IHRoaXMuaXRlbUJyYW5kO1xuXHRcdFx0aXRlbS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHkgPyBwYXJzZUludChpdGVtLnF1YW50aXR5KSAqIHF1YW50aXR5IDogcXVhbnRpdHk7XG5cdFx0XHR2YWx1ZSArPSBpdGVtLnByaWNlICogaXRlbS5xdWFudGl0eTtcblx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHB1c2hEYXRhID0ge1xuXHRcdFx0ZXZlbnQsXG5cdFx0XHRlY29tbWVyY2U6IHtcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuXHRcdFx0XHRpdGVtc1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR3aW5kb3cuZGF0YUxheWVyLnB1c2gocHVzaERhdGEpO1xuXHR9XG5cblx0dHJhY2tCZWdpbkNoZWNrb3V0IChhbW91bnQsIGl0ZW1zKSB7XG5cdFx0aWYgKCFhbW91bnQgfHwgIWl0ZW1zKSByZXR1cm47XG5cblx0XHQvLyBFbnN1cmUgaXRlbXMgaXMgYW4gYXJyYXlcblx0XHRjb25zdCBpdGVtc0FycmF5ID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IE9iamVjdC52YWx1ZXMoaXRlbXMpO1xuXG5cdFx0aWYgKCFpdGVtc0FycmF5Lmxlbmd0aCkgcmV0dXJuO1xuXG5cdFx0aXRlbXNBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRpdGVtLml0ZW1fYnJhbmQgPSB0aGlzLml0ZW1CcmFuZDtcblx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHB1c2hEYXRhID0ge1xuXHRcdFx0ZXZlbnQ6ICdiZWdpbl9jaGVja291dCcsXG5cdFx0XHRlY29tbWVyY2U6IHtcblx0XHRcdFx0dmFsdWU6IHBhcnNlRmxvYXQoYW1vdW50KSxcblx0XHRcdFx0Y3VycmVuY3k6IHRoaXMuY3VycmVuY3ksXG5cdFx0XHRcdGl0ZW1zOiBpdGVtc0FycmF5XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHdpbmRvdy5kYXRhTGF5ZXIucHVzaChwdXNoRGF0YSk7XG5cdH1cblxuXHR0cmFja1B1cmNoYXNlIChvcmRlcikge1xuXHRcdGlmICghb3JkZXIpIHJldHVybjtcblxuXHRcdGNvbnN0IHsgb3JkZXJfaWQ6IG9yZGVySWQsIGFtb3VudCwgZGVsaXZlcnlfdHlwZTogZGVsaXZlcnlUeXBlLCBjb3Vwb24gPSBudWxsLCBpdGVtcyB9ID0gb3JkZXI7XG5cblx0XHRpZiAoIWl0ZW1zKSByZXR1cm47XG5cblx0XHQvLyBFbnN1cmUgaXRlbXMgaXMgYW4gYXJyYXlcblx0XHRjb25zdCBpdGVtc0FycmF5ID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IE9iamVjdC52YWx1ZXMoaXRlbXMpO1xuXG5cdFx0aWYgKCFpdGVtc0FycmF5Lmxlbmd0aCkgcmV0dXJuO1xuXG5cdFx0aXRlbXNBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRpdGVtLml0ZW1fYnJhbmQgPSB0aGlzLml0ZW1CcmFuZDtcblx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHB1c2hEYXRhID0ge1xuXHRcdFx0ZXZlbnQ6ICdwdXJjaGFzZScsXG5cdFx0XHRlY29tbWVyY2U6IHtcblx0XHRcdFx0dHJhbnNhY3Rpb25faWQ6IG9yZGVySWQsXG5cdFx0XHRcdHZhbHVlOiBwYXJzZUZsb2F0KGFtb3VudCksXG5cdFx0XHRcdGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuXHRcdFx0XHRkZWxpdmVyeV90eXBlOiBkZWxpdmVyeVR5cGUsXG5cdFx0XHRcdGl0ZW1zOiBpdGVtc0FycmF5XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmIChjb3Vwb24pIHtcblx0XHRcdHB1c2hEYXRhLmVjb21tZXJjZS5jb3Vwb24gPSBjb3Vwb247XG5cdFx0fVxuXG5cdFx0d2luZG93LmRhdGFMYXllci5wdXNoKHB1c2hEYXRhKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgRWNvbW1lcmNlVHJhY2tpbmcoKTtcbiIsIi8vIGxpc3Qgb2YgZWxlbWVudHNcbmNvbnN0IGVxdWFsSGVpZ2h0c0VsZW1lbnRzID0gW1xuXHQnLnNsaWRlci1wcm9kdWN0cyAuc2xpZGVyLXJldmlld3NfX2l0ZW1fX25hbWUnXG5dO1xuXG5jbGFzcyBFcXVhbEhlaWdodCB7XG5cdGluaXQgKCkge1xuXHRcdGVxdWFsSGVpZ2h0c0VsZW1lbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xuXHRcdFx0Y29uc3QgaXRlbUVsZW1lbnQgPSAkKGl0ZW0pO1xuXHRcdFx0aWYgKGl0ZW1FbGVtZW50Lmxlbmd0aCkge1xuXHRcdFx0XHRpdGVtRWxlbWVudC5lcXVhbEhlaWdodHMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXF1YWxIZWlnaHQoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEltcG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW1wb3J0IE1vZGVybml6ciBmcm9tICdtb2Rlcm5penInO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3Qgc2VsZWN0b3IgPSAnLmpzLWxhenlsb2FkJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xOb2RlTGlzdH0gc2VsZWN0b3JPck5vZGVMaXN0XG4gKiBAcHJvcGVydHkge3NlbGVjdG9yfVxuICogQHJldHVybi
10072B7UHJvbWlzZTxhbnk+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF6eWxvYWQgKHNlbGVjdG9yT3JOb2RlTGlzdCA9IHNlbGVjdG9yLCBvcHRpb24pIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBfaW5pdGlhbGl6ZSA9ICh7IGRlZmF1bHQ6IHp6TG9hZCB9KSA9PiB7XG5cdFx0XHRyZXNvbHZlKHp6TG9hZChzZWxlY3Rvck9yTm9kZUxpc3QsIG9wdGlvbikpO1xuXHRcdH07XG5cblx0XHRpZiAoTW9kZXJuaXpyLmludGVyc2VjdGlvbm9ic2VydmVyKSB7XG5cdFx0XHRpbXBvcnQoJ3p6LWxvYWQnKS50aGVuKF9pbml0aWFsaXplKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW1wb3J0KCdpbnRlcnNlY3Rpb24tb2JzZXJ2ZXInKS50aGVuKCgpID0+IHtcblx0XHRcdFx0aW1wb3J0KCd6ei1sb2FkJykudGhlbihfaW5pdGlhbGl6ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBkaXNhYmxlQm9keVNjcm9sbCwgZW5hYmxlQm9keVNjcm9sbCB9IGZyb20gJ2JvZHktc2Nyb2xsLWxvY2snO1xuXG5leHBvcnQgY29uc3QgcmVmcyA9IHtcblx0Ym9keTogZG9jdW1lbnQuYm9keSxcblx0Zml4ZWRFbGVtZW50czogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZml4ZWRdJyksXG5cdG1lbnU6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tYWluLW1lbnUnKSxcblx0b3BlbkJ0bjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLW1haW4tbWVudS1vcGVuJyksXG5cdGNsb3NlQnRuOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbWFpbi1tZW51LWNsb3NlJyksXG5cdG9wZW5Nb2JpbGVCdG46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tYWluLW1vYmlsZS1tZW51LW9wZW4nKSxcbn07XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHdpZHRoIG9mIHRoZSBicm93c2VyJ3Mgc2Nyb2xsYmFyLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIHdpZHRoIG9mIHRoZSBzY3JvbGxiYXIgaW4gcGl4ZWxzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0QnJ3b3NlclNjcm9sbGJhcldpZHRoID0gKCkgPT4ge1xuXHRyZXR1cm4gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJT1MgPSAoKSA9PiB7XG5cdHJldHVybiAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fCAobmF2aWdhdG9yLk1heFRvdWNoUG9pbnRzID4gMCkgfHwgKG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHJpZ2h0IG9mZnNldCB2YWx1ZSBmb3IgYSBmaXhlZCBlbGVtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgYXMgdGhlIHJpZ2h0IG9mZnNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpeGVkRWxlbWVudHNPZmZzZXQgPSAodmFsdWUpID0+IHtcblx0cmVmcy5maXhlZEVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0ZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB2YWx1ZTtcblx0fSk7XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgdGhlIGJvZHkgc2Nyb2xsIGxvY2sgb24gb3Igb2ZmIHdpdGhvdXQgYnJlYWtpbmcgc2Nyb2xsaW5nIG9mIGEgc3BlY2lmaWMgdGFyZ2V0IGVsZW1lbnQuXG4gKiBBbHNvIGFkanVzdHMgdGhlIGJvZHkgYW5kIGZpeGVkIGhlYWRlciBvZmZzZXRzIGFjY29yZGluZ2x5LlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFdoZXRoZXIgdG8gZW5hYmxlIG9y
10072IGRpc2FibGUgdGhlIHNjcm9sbCBsb2NrLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0UmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB0byBwZXJzaXN0IHNjcm9sbGluZyBmb3IgKHN1Y2ggYXMgYSBtb2RhbC9saWdodGJveC9mbHlvdXQvbmF2KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUJvZHlTY3JvbGxMb2NrID0gKG9uLCB0YXJnZXRSZWYpID0+IHtcblx0Ly8gZml4IGJvZHkgJiBmaXhlZCBoZWFkZXIgb2Zmc2V0c1xuXHRjb25zdCBzY3JvbGxCYXJXaWR0aCA9IG9uID8gYCR7Z2V0QnJ3b3NlclNjcm9sbGJhcldpZHRoKCl9cHhgIDogMDtcblx0cmVmcy5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoO1xuXHR0b2dnbGVGaXhlZEVsZW1lbnRzT2Zmc2V0KHNjcm9sbEJhcldpZHRoKTtcblxuXHQvLyBsb2NrL3VubG9jayB3aW5kb3cgc2Nyb2xsXG5cdGlmICghaXNJT1MoKSkge1xuXHRcdG9uID8gZGlzYWJsZUJvZHlTY3JvbGwodGFyZ2V0UmVmKSA6IGVuYWJsZUJvZHlTY3JvbGwodGFyZ2V0UmVmKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gb24gPyAnaGlkZGVuJyA6ICcnO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cdGlmICghcmVmcy5vcGVuQnRuKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgaGFuZGxlRXNjQ2xvc2UgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAoZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUVzY0Nsb3NlKTtcblx0XHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbWFpbi1tZW51JykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1oaWRkZW4nKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0b2dnbGVNZW51KCk7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IHRvZ2dsZU1lbnUgPSAoKSA9PiB7XG5cdFx0Y29uc3QgaXNNZW51T3BlbiA9IHJlZnMub3BlbkJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ3RydWUnIHx8IGZhbHNlO1xuXG5cdFx0Ly8gc2hvdy9oaWRlIG1lbnVcblx0XHRyZWZzLm9wZW5CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgIWlzTWVudU9wZW4pO1xuXHRcdHJlZnMubWVudS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1oaWRkZW4nKTtcblxuXHRcdC8vIGxvY2svdW5sb2NrIHdpbmRvdyBzY3JvbGxcblx0XHR0b2dnbGVCb2R5U2Nyb2xsTG9jayghaXNNZW51T3BlbiwgcmVmcy5tZW51LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLW1lbnVfX2JvZHknKSk7XG5cblx0XHQvLyBhZGQgY2xvc2Ugb24gRXNjXG5cdFx0IWlzTWVudU9wZW4gJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NDbG9zZSk7XG5cdH07XG5cblx0cmVmcy5vcGVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlTWVudSk7XG5cdGlmIChyZWZzLm9wZW5Nb2JpbGVCdG4pIHtcblx0XHRyZWZzLm9wZW5Nb2JpbGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVNZW51KTtcblx0fVxuXHRyZWZzLm1lbnUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoeyB0YXJnZXQgfSkgPT4ge1xuXHRcdGlmICh0YXJnZXQgIT09IHJlZnMubWVudSAmJiB0YXJnZXQgIT09IHJlZnMuY2xvc2VCdG4pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dG9nZ2xlTWVudSgpO1xuXHR9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgTW9kZXJuaXpyIGZyb20gJ21vZGVybml6cic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5Nb2Rlcm5penIuYWRkVGVzdCgnZWRnZScsICgvIGVkZ2VcXC8vaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCBNb2Rlcm5penIgZnJvbSAnbW9kZXJuaXpyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk1vZGVybml6ci5hZGRUZXN0KCdpbnRlcnNlY3Rpb25vYnNlcnZlcicsICdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiDQmtCw0YHRgtC+0LzQvdGL0LUg0YLQtdGB0YLRiyDQtNC70Y8gTW9kZXJuaXpyXG4gKiBAbW9kdWxlXG4gKiBAYXV0aG9yIE9sZWcgRHV0Y2hlbmtvIDxkdXRjaGVua28uby5kZXZAZ21haWwuY29tPlxuICogQHZlcnNpb24gMS4wLjBcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCBNb2Rlcm5penIgZnJvbSAnbW9kZXJuaXpyJztcbmltcG9ydCAnLi9jdXN0b20tdGVzdHMvaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcbmltcG9ydCAnLi9jdXN0b20tdGVzdHMvZWRnZSc7XG4vLyBpbXBvcnQgJy4vY3VzdG9tLXRlc3RzL21peC1ibGVuZC1tb2RlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbndpbmRvdy5Nb2Rlcm5penIgPSBNb2Rlcm5penI7XG4iLCJpbXBvcnQgbm9VaVNsaWRlciBmcm9tICdub3Vpc2xpZGVyJztcclxuaW1wb3J0IG51bWVyYWwgZnJvbSAnbnVtZXJhbCc7XHJcblxyXG5jb25zdCAkID0gd2luZG93LmpRdWVyeTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcclxuXHRjb25zdHJ1Y3RvciAoKSB7XHJcblx0XHR0aGlzLmRhdGEgPSB7XHJcblx0XHRcdGVsbXM6IHtcclxuXHRcdFx0XHRmaWx0ZXJQYXJlbnQ6ICcjcHJvZHVjdC1maWx0ZXInLFxyXG5cdFx0XHRcdHNsaWRlckVsbTogJyNwcm9kdWN0LWZ
10072pbHRlcl9fcHJpY2Utc2xpZGVyJyxcclxuXHRcdFx0XHRtaW5FbG06ICcjcHJvZHVjdC1maWx0ZXJfX3ByaWNlLW1pbicsXHJcblx0XHRcdFx0bWF4RWxtOiAnI3Byb2R1Y3QtZmlsdGVyX19wcmljZS1tYXgnXHJcblx0XHRcdH0sXHJcblx0XHRcdHZhbHVlczoge1xyXG5cdFx0XHRcdG1pbjogMCxcclxuXHRcdFx0XHRtYXg6IDAsXHJcblx0XHRcdFx0Y3VycmVudE1pbjogMCxcclxuXHRcdFx0XHRjdXJyZW50TWF4OiAwXHJcblx0XHRcdH0sXHJcblx0XHRcdGRlY2ltYWxzOiAyXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0aW5pdCAoKSB7XHJcblx0XHRpZiAodGhpcy5pc0VuYWJsZWQoKSkge1xyXG5cdFx0XHR0aGlzLnByZXBhcmVWYWx1ZXMoKTtcclxuXHRcdFx0dGhpcy5iaW5kKCk7XHJcblx0XHRcdHRoaXMuaW5pdFNsaWRlcigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aXNFbmFibGVkICgpIHtcclxuXHRcdHJldHVybiAkKHRoaXMuZGF0YS5lbG1zLmZpbHRlclBhcmVudCkubGVuZ3RoO1xyXG5cdH1cclxuXHJcblx0cHJlcGFyZVZhbHVlcyAoKSB7XHJcblx0XHRjb25zdCBfdCA9IHRoaXM7XHJcblx0XHRjb25zdCBfZSA9IF90LmRhdGEuZWxtcztcclxuXHRcdGNvbnN0IF92ID0gX3QuZGF0YS52YWx1ZXM7XHJcblx0XHQvLyBFbG1zXHJcblx0XHRjb25zdCBzbGlkZXIgPSAkKF9lLnNsaWRlckVsbSk7XHJcblx0XHRjb25zdCBtaW5WYWx1ZSA9ICQoX2UubWluRWxtKTtcclxuXHRcdGNvbnN0IG1heFZhbHVlID0gJChfZS5tYXhFbG0pO1xyXG5cdFx0Ly8gVmFsdWVzXHJcblx0XHRfdi5taW4gPSBOdW1iZXIoc2xpZGVyLmRhdGEoJ21pbicpKTtcclxuXHRcdF92Lm1heCA9IE51bWJlcihzbGlkZXIuZGF0YSgnbWF4JykpO1xyXG5cdFx0X3YuY3VycmVudE1pbiA9IE51bWJlcihtaW5WYWx1ZS52YWwoKSk7XHJcblx0XHRfdi5jdXJyZW50TWF4ID0gTnVtYmVyKG1heFZhbHVlLnZhbCgpKTtcclxuXHR9XHJcblxyXG5cdGluaXRTbGlkZXIgKCkge1xyXG5cdFx0Y29uc3QgX3QgPSB0aGlzO1xyXG5cdFx0Y29uc3QgX2UgPSBfdC5kYXRhLmVsbXM7XHJcblx0XHRjb25zdCBfdiA9IF90LmRhdGEudmFsdWVzO1xyXG5cdFx0bGV0IG1pbiA9IHBhcnNlRmxvYXQoX3YubWluKTtcclxuXHRcdGxldCBtYXggPSBwYXJzZUZsb2F0KF92Lm1heCk7XHJcblx0XHRsZXQgbWluU3RhcnQgPSBwYXJzZUZsb2F0KF92LmN1cnJlbnRNaW4pO1xyXG5cdFx0bGV0IG1heFN0YXJ0ID0gcGFyc2VGbG9hdChfdi5jdXJyZW50TWF4KTtcclxuXHRcdGxldCBkZWNpbWFscyA9IDA7XHJcblx0XHRsZXQgZm9ybWF0U2xpZGU7XHJcblxyXG5cdFx0Ly8gRGVjaW1hbFxyXG5cdFx0aWYgKCgvXFwuLy50ZXN0KG1pbikgfHwgL1xcLi8udGVzdChtYXgpKSkge1xyXG5cdFx0XHRkZWNpbWFscyA9IE1hdGgubWF4KFxyXG5cdFx0XHRcdG1pbi50b1N0cmluZygpLnJlcGxhY2UoL15cXGQrKFxcLnwkKS8sICcnKS5sZW5ndGgsXHJcblx0XHRcdFx0bWF4LnRvU3RyaW5nKCkucmVwbGFjZSgvXlxcZCsoXFwufCQpLywgJycpLmxlbmd0aFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChkZWNpbWFscyA+IDIpIHtcclxuXHRcdFx0ZGVjaW1hbHMgPSAyO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvcm1hdFNsaWRlID0ge1xyXG5cdFx0XHR0bzogZnVuY3Rpb24gKHYsIGgsIHIpIHtcclxuXHRcdFx0XHRsZXQgZm9ybWF0ID0gJygwJztcclxuXHRcdFx0XHRpZiAodiA8IDEwMCAmJi
10072BkZWNpbWFscykge1xyXG5cdFx0XHRcdFx0Zm9ybWF0ICs9ICcuJyArICcwJy5yZXBlYXQoZGVjaW1hbHMpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodiA+IDEwMDApIHtcclxuXHRcdFx0XHRcdGZvcm1hdCArPSAnLjAnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3JtYXQgKz0gJyBhKSc7XHJcblxyXG5cdFx0XHRcdHJldHVybiAodiA+IDEwMDAgPyBudW1lcmFsKHYpLmZvcm1hdChmb3JtYXQpIDogdi50b0ZpeGVkKGRlY2ltYWxzKSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdGZyb206IGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdFx0cmV0dXJuIHY7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0bGV0IHNsaWRlck9wdGlvbnMgPSB7XHJcblx0XHRcdGFuaW1hdGU6IGZhbHNlLFxyXG5cdFx0XHRiZWhhdmlvdXI6ICdzbmFwJyxcclxuXHRcdFx0Y29ubmVjdDogdHJ1ZSxcclxuXHRcdFx0Zm9ybWF0OiBmb3JtYXRTbGlkZSxcclxuXHRcdFx0Y3NzUHJlZml4OiAncHJvZHVjdHMtc2xpZGVyX19ub1VpLScsXHJcblx0XHRcdHN0YXJ0OiBbbWluU3RhcnQsIG1heFN0YXJ0XSxcclxuXHRcdFx0cmFuZ2U6IHtcclxuXHRcdFx0XHQnbWluJzogbWluLFxyXG5cdFx0XHRcdCdtYXgnOiBtYXhcclxuXHRcdFx0fSxcclxuXHRcdFx0cGlwczoge1xyXG5cdFx0XHRcdG1vZGU6ICdyYW5nZScsXHJcblx0XHRcdFx0ZGVuc2l0eTogNFxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIENyZWF0ZSwgVXBkYXRlXHJcblx0XHRjb25zdCBzbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfZS5zbGlkZXJFbG0uc3Vic3RyaW5nKDEpKTtcclxuXHJcblx0XHRpZiAoc2xpZGVyLmhhc093blByb3BlcnR5KCdub1VpU2xpZGVyJykpIHtcclxuXHRcdFx0c2xpZGVyLm5vVWlTbGlkZXIudXBkYXRlT3B0aW9ucyhzbGlkZXJPcHRpb25zLCBmYWxzZSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRub1VpU2xpZGVyLmNyZWF0ZShzbGlkZXIsIHNsaWRlck9wdGlvbnMpO1xyXG5cclxuXHRcdHNsaWRlci5ub1VpU2xpZGVyLm9uKCd1cGRhdGUnLCBmdW5jdGlvbiAoZm9ybWF0dGVkLCBoYW5kbGUsIHZhbHVlcywgdGFwLCBwb3NpdGlvbnMsIHNsaWRlck9iaikge1xyXG5cdFx0XHRfdi5jdXJyZW50TWluID0gdmFsdWVzWzBdLnRvRml4ZWQoX3QuZGF0YS5kZWNpbWFscyk7XHJcblx0XHRcdF92LmN1cnJlbnRNYXggPSB2YWx1ZXNbMV0udG9GaXhlZChfdC5kYXRhLmRlY2ltYWxzKTtcclxuXHRcdFx0X3Quc2V0VmFsdWVzKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRzbGlkZXIubm9VaVNsaWRlci5vbignc2V0JywgZnVuY3Rpb24gKGZvcm1hdHRlZCwgaGFuZGxlLCB2YWx1ZXMsIHRhcCwgcG9zaXRpb25zLCBzbGlkZXJPYmopIHtcclxuXHRcdFx0X3YuY3VycmVudE1pbiA9IHZhbHVlc1swXS50b0ZpeGVkKF90LmRhdGEuZGVjaW1hbHMpO1xyXG5cdFx0XHRfdi5jdXJyZW50TWF4ID0gdmFsdWVzWzFdLnRvRml4ZWQoX3QuZGF0YS5kZWNpbWFscyk7XHJcblx0XHRcdF90LnNldFZhbHVlcygpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRiaW5kICgpIHtcclxuXHRcdGNvbnN0IF90ID0gdGhpcztcclxuXHRcdGNvbnN0IF9lID0gX3QuZGF0YS5lbG1zO1xyXG5cdFx0Y29uc3QgX3YgPSBfdC5kYXRhLnZhbHVlcztcclxuXHJcblx0XHQkKGRvY3VtZW50KS5vbignY2hhbmdlJywgX2UubWluRWxtLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdF92LmN1cnJlbnRNaW4gPSBwYXJzZUZsb2F0KCQodGhpcykudmFsKCkpLnRvRml4ZWQoX3QuZGF0YS5kZWNpbWFscyk7XHJcblx0XHRcdF90LnNldFNpbGRlcigpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0JChkb2N1bWVudCkub24oJ2NoYW5nZScsIF9lLm1heEVsbSwgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRfdi5jdXJyZW50TWF4ID0gcGFyc2VGbG9hdCgkKHRoaXMpLnZhbCgpKS50b0ZpeGVkKF90LmRhdGEuZGVjaW1hbHMpO1xyXG5cdFx0XHRfdC5zZXRTaWxkZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2V0U2lsZGVyICgpIHtcclxuXHRcdGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGF0YS5lbG1zLnNsaWRlckVsbS5zdWJzdHJpbmcoMSkpO1xyXG5cdFx0c2xpZGVyLm5vVWlTbGlkZXIuc2V0KFt0aGlzLmRhdGEudmFsdWVzLmN1cnJlbnRNaW4sIHRoaXMuZGF0YS52YWx1ZXMuY3VycmVudE1heF0pO1xyXG5cdH1cclxuXHJcblx0c2V0VmFsdWVzICgpIHtcclxuXHRcdGNvbnN0IF90ID0gdGhpcztcclxuXHRcdGNvbnN0IF9lID0gX3QuZGF0YS5lbG1zO1xyXG5cdFx0Y29uc3QgX3YgPSBfdC5kYXRhLnZhbHVlcztcclxuXHJcblx0XHRsZXQgbWluVmFsdWUgPSAoTWF0aC5yb3VuZChwYXJzZUZsb2F0KF92LmN1cnJlbnRNaW4pICogMTAwKSAvIDEwMCkudG9GaXhlZChfdC5kYXRhLmRlY2ltYWxzKTtcclxuXHRcdGlmIChtaW5WYWx1ZSA8IF92Lm1pbikge1xyXG5cdFx0XHRtaW5WYWx1ZSA9IF92Lm1pbjtcclxuXHRcdH1cclxuXHRcdCQoX2UubWluRWxtKS52YWwobWluVmFsdWUpO1xyXG5cclxuXHRcdGxldCBtYXhWYWx1ZSA9IChNYXRoLnJvdW5kKHBhcnNlRmxvYXQoX3YuY3VycmVudE1heCkgKiAxMDApIC8gMTAwKS50b0ZpeGVkKF90LmRhdGEuZGVjaW1hbHMpO1xyXG5cdFx0aWYgKG1heFZhbHVlID4gX3YubWF4KSB7XHJcblx0XHRcdG1heFZhbHVlID0gX3YubWF4O1xyXG5cdFx0fVxyXG5cdFx0JChfZS5tYXhFbG0pLnZhbChtYXhWYWx1ZSk7XHJcblx0fVxyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVUTSBUUkFDS0lOR1xuICogQG1vZHVsZVxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEltcG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCBjb29raWVEYXRhIGZyb20gJy4vY29va2llLWRhdGEnO1xuXG5jbGFzcyBVdG1UcmFja2luZyB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0XHQvLyBHZXQgdGhlIFVSTCBwYXJhbWV0ZXJzIHZhcmlhYmxlIGJ5IFVUTSBuYW1lc1xuXHRcdHRoaXMuc291cmNlID0gdGhpcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3V0bV9zb3VyY2UnKTtcblx0XHR0aGlzLm1lZGl1bSA9IHRoaXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd1dG1fbWVkaXVtJyk7XG5cdFx0dGhpcy5jYW1wYWlnbiA9IHRoaXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd1dG1fY2FtcGFpZ24nKTtcblx0XHR0aGlzLmNvbnRlbnQgPSB0aGlzLmdldFBhcmFtZXRlckJ5TmFtZSgndXRtX2NvbnRlbnQnKTtcblx0XHR0aGlzLnRlcm0gPSB0aGlzLmdldFBhcmFtZXRlckJ5TmFtZSgndXRtX3Rlcm0nKTtcblx0fVxuXG5cdGluaXQgKCkge1xuXHRcdC8vIERvIHRoZSBTZXQgVVRNIGZ1bmN0aW9uIGZvciBlYWNoIFVUTVxuXHRcdHRoaXMuc2V0VXRtKCd1dG1fc291cmNlJywgdGhpcy5zb3VyY2UpO1xuXHRcdHRoaXMuc2V0VXRtKCd1dG1fbWVkaXVtJywgdGhpcy5tZWRpdW0pO1xuXHRcdHRoaXMuc2V0VXRtKCd1dG1fY2FtcGFpZ24nLCB0aGlzLmNhbXBhaWduKTtcblx0XHR0aGlzLnNldFV0bSgndXRtX2NvbnRlbnQnLCB0aGlzLmNvbnRlbnQpO1xuXHRcdHRoaXMuc2V0VXRtKCd1dG1fdGVybScsIHRoaXMudGVybSk7XG5cdH1cblxuXHQvLyBQYXJzZSB0aGUgVVJMXG5cdGdldFBhcmFtZXRlckJ5TmFtZSAobmFtZSkge1xuXHRcdG5hbW
10072UgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXScpO1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcPyZdJyArIG5hbWUgKyAnPShbXiYjXSopJyk7XG5cdFx0Y29uc3QgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0cmV0dXJuIHJlc3VsdHMgPT09IG51bGwgPyAnJyA6IGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcblx0fVxuXG5cdC8vIFNldCBVVE0gZnVuY3Rpb25cblx0c2V0VXRtICh1dG1QYXJhbSwgdXRtVmFsKSB7XG5cdFx0aWYgKHV0bVZhbCA9PT0gJycpIHtcblx0XHRcdHJldHVybjtcblx0XHR9O1xuXHRcdC8vIFRPRE86IGRldGVybWluZSB0aGUgbWF4IGV4cGlyaW5nIHRpbWUgb3IgY2xlYXIgYWZ0ZXIgb3JkZXJpbmdcblx0XHRjb29raWVEYXRhLmFkZCh1dG1QYXJhbSwgdXRtVmFsLCB7IGV4cGlyZXM6IDM2NSwgcGF0aDogJy8nLCBTYW1lU2l0ZTogJ05vbmUnLCBTZWN1cmU6ICdTZWN1cmUnIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBVdG1UcmFja2luZygpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCAnbWRuLXBvbHlmaWxscy9zcmMvT2JqZWN0LmFzc2lnbic7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICog0J/QvtC70LjRhNC40Lsg0LTQu9GPIElFLCBFZGdlINC4INC00YDRg9Cz0LjRhSDQsdGA0LDRg9C30LXRgNC+0LJcbiAqINC60L7RgtC+0YDRi9C1INC90LUg0LjQvNC10Y7RgiDQvdCw0YLQuNCy0L3Rg9GOINC/0L7QtNC00LXRgNC20LrRgyBQcm9taXNlXG4gKiBAc2VlIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9lczYtcHJvbWlzZS1wb2x5ZmlsbH1cbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCB7IFByb21pc2UgfSBmcm9tICdlczYtcHJvbWlzZS1wb2x5ZmlsbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG53aW5kb3cuUHJvbWlzZSA9IHdpbmRvdy5Qcm9taXNlIHx8IFByb21pc2U7XG4iLCIvKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGROb2RlXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHRvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnJlYWtwb2ludFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZGVyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGRNZWRpYVF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBicmVha3BvaW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geydtaW4nIHwgJ21heCd9IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUR5bmFtaWNBZGFwdCh0eXBlID0gJ21heCcpIHtcbiAgY29uc3QgY2xhc3NOYW1lID0gJ19keW5hbWljX2FkYXB0XydcbiAgY29uc3QgYXR0ck5hbWUgPSAnZGF0YS1kYSdcblxuICAvKiogQHR5cGUge2ROb2RlW119ICovXG4gIGNvbnN0IGROb2RlcyA9IGdldEROb2RlcygpXG5cbiAgLyoqIEB0eXBlIHtkTWVkaWFRdWVyeVtdfSAqL1xuICBjb25zdCBkTWVkaWFRdWVyaWVzID0gZ2V0RE1lZGlhUXVlcmllcyhkTm9kZXMpXG5cbiAgZE1lZGlhUXVlcmllcy5mb3JFYWNoKChkTWVkaWFRdWVyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoTWVkaWEgPSB3aW5kb3cubWF0Y2hNZWRpYShkTWVkaWFRdWVyeS5xdWVyeSlcbiAgICAvLyDQvNCw0YHRgdC40LIg0L7QsdGK0LXQutGC0L7QsiDRgSDQv9C+0LTRhdC+0LTRj9GJ0LjQvCDQsdGA0LXQudC60L/QvtC40L3RgtC+0LxcbiAgICBjb25zdCBmaWx0ZXJlZEROb2RlcyA9IGROb2Rlcy5maWx0ZXIoKHsgYnJlYWtwb2ludCB9KSA9PiBicmVha3BvaW50ID09PSBkTWVkaWFRdWVyeS5icmVha3BvaW50KVxuICAgIGNvbnN0IG1lZGlhSGFuZGxlciA9IGdldE1lZGlhSGFuZGxlcihtYXRjaE1lZGlhLCBmaWx0ZXJlZEROb2RlcylcbiAgICBtYXRjaE1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG1lZGlhSGFuZGxlcilcblxuICAgIG1lZGlhSGFuZGxlcigpXG4gIH0pXG5cbiAgZnVuY3Rpb24gZ2V0RE5vZGVzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdXG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7YXR0ck5hbWV9XWApXVxuXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKVxuICAgICAgY29uc3QgW3RvU2VsZWN0b3IsIGJyZWFrcG9pbnQsIG9yZGVyXSA9IGF0dHIuc3BsaXQoJywnKS5tYXAoKHZhbCkgPT4gdmFsLnRyaW0oKSlcblxuICAgICAgY29uc3QgdG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRvU2VsZWN0b3IpXG5cbiAgICAgIGlmICh0bykge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudEVsZW1lbnQsXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICB0byxcbiAgICAgICAgICBicmVha3BvaW50OiBicmVha3BvaW50ID8gYnJlYWtwb2ludCA6ICc3NjcnLFxuICAgICAgICAgIG9yZGVyOiBvcmRlciAhPT0gdW5kZWZpbmVkID8gKGlzTnVtYmVyKG9yZGVyKSA/IE51bWJlcihvcmRlcikgOiBvcmRlcikgOiAnbGFzdCcsXG4gICAgICAgICAgaW5kZXg6IC0xLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gc29ydEROb2RlcyhyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtkTm9kZX0gaXRlbXNcbiAgICogQHJldHVybnMge2RNZWRpYVF1ZXJ5W119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRETWVkaWFRdWVyaWVzKGl0ZW
100721zKSB7XG4gICAgY29uc3QgdW5pcUl0ZW1zID0gWy4uLm5ldyBTZXQoaXRlbXMubWFwKCh7IGJyZWFrcG9pbnQgfSkgPT4gYCgke3R5cGV9LXdpZHRoOiAke2JyZWFrcG9pbnR9cHgpLCR7YnJlYWtwb2ludH1gKSldXG5cbiAgICByZXR1cm4gdW5pcUl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgW3F1ZXJ5LCBicmVha3BvaW50XSA9IGl0ZW0uc3BsaXQoJywnKVxuXG4gICAgICByZXR1cm4geyBxdWVyeSwgYnJlYWtwb2ludCB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01lZGlhUXVlcnlMaXN0fSBtYXRjaE1lZGlhXG4gICAqIEBwYXJhbSB7ZE5vZGVzfSBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0TWVkaWFIYW5kbGVyKG1hdGNoTWVkaWEsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lZGlhSGFuZGxlcigpIHtcbiAgICAgIGlmIChtYXRjaE1lZGlhLm1hdGNoZXMpIHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIG1vdmVUbyhpdGVtKVxuICAgICAgICB9KVxuXG4gICAgICAgIGl0ZW1zLnJldmVyc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIG1vdmVCYWNrKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGl0ZW1zLnJldmVyc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ROb2RlfSBkTm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gbW92ZVRvKGROb2RlKSB7XG4gICAgY29uc3QgeyB0bywgZWxlbWVudCwgb3JkZXIgfSA9IGROb2RlXG4gICAgZE5vZGUuaW5kZXggPSBnZXRJbmRleEluUGFyZW50KGROb2RlLmVsZW1lbnQsIGROb2RlLmVsZW1lbnQucGFyZW50RWxlbWVudClcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKVxuXG4gICAgaWYgKG9yZGVyID09PSAnbGFzdCcgfHwgb3JkZXIgPj0gdG8uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0by5hcHBlbmQoZWxlbWVudClcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG9yZGVyID09PSAnZmlyc3QnKSB7XG4gICAgICB0by5wcmVwZW5kKGVsZW1lbnQpXG5cbiAgICAgIHJldHVyblxuICAgI
10072H1cblxuICAgIHRvLmNoaWxkcmVuW29yZGVyXS5iZWZvcmUoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ROb2RlfSBkTm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gbW92ZUJhY2soZE5vZGUpIHtcbiAgICBjb25zdCB7IHBhcmVudCwgZWxlbWVudCwgaW5kZXggfSA9IGROb2RlXG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcblxuICAgIGlmIChpbmRleCA+PSAwICYmIHBhcmVudC5jaGlsZHJlbltpbmRleF0pIHtcbiAgICAgIHBhcmVudC5jaGlsZHJlbltpbmRleF0uYmVmb3JlKGVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5hcHBlbmQoZWxlbWVudClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICovXG4gIGZ1bmN0aW9uIGdldEluZGV4SW5QYXJlbnQoZWxlbWVudCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIFsuLi5wYXJlbnQuY2hpbGRyZW5dLmluZGV4T2YoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiDQpNGD0L3QutGG0LjRjyDRgdC+0YDRgtC40YDQvtCy0LrQuCDQvNCw0YHRgdC40LLQsCDQv9C+IGJyZWFrcG9pbnQg0Lggb3JkZXJcbiAgICog0L/QviDQstC+0LfRgNCw0YHRgtCw0L3QuNGOINC00LvRjyB0eXBlID0gbWluXG4gICAqINC/0L4g0YPQsdGL0LLQsNC90LjRjiDQtNC70Y8gdHlwZSA9IG1heFxuICAgKlxuICAgKiBAcGFyYW0ge2ROb2RlW119IGl0ZW1zXG4gICAqL1xuICBmdW5jdGlvbiBzb3J0RE5vZGVzKGl0ZW1zKSB7XG4gICAgY29uc3QgaXNNaW4gPSB0eXBlID09PSAnbWluJyA/IDEgOiAwXG5cbiAgICByZXR1cm4gWy4uLml0ZW1zXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoYS5icmVha3BvaW50ID09PSBiLmJyZWFrcG9pbnQpIHtcbiAgICAgICAgaWYgKGEub3JkZXIgPT09IGIub3JkZXIpIHtcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEub3JkZXIgPT09ICdmaXJzdCcgfHwgYi5vcmRlciA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgcmV0dXJuIC0xICogaXNNaW5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLm9yZGVyID09PSAnbGFzdCcgfHwgYi5vcmRlciA9PT0gJ2ZpcnN0Jykge1xuICAgICAgICAgIHJldHVybiAxICogaXNNaW5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoYS5icmVha3BvaW50IC0gYi5icmVha3BvaW50KSAqIGlzTWluXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqINCf0L7QtNC60LvRjtGH0LXQvdC40LUg0LHQuNCx0LvQuNC+0YLQtdC60LggalF1ZXJ5XG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxud2luZG93LiQgPSB3aW5kb3cualF1ZXJ5ID0gJDtcblxuLyogalF1ZXJ5IEVxdWFsIGhlaWdodHMgcGx1Z2luIHYuIDEuMC43IGJ5IHN0YXR1czIwMS5ubCAqL1xuIWZ1bmN0aW9uKGkpe2kuZm4uZXF1YWxIZWlnaHRzPWZ1bmN0aW9uKG4pe3ZhciBvLGU9aS5leHRlbmQoe30se29uUmVzaXplOiEwLG9uTG9hZDohMH0sbiksdD17fSxoPVtdLHM9MCx1PTAsYT1pKHRoaXMpO3JldHVybiBhLmxlbmd0aDwyP3RoaXM6KGUub25SZXNpemUmJmkod2luZG93KS5yZXNpemUoZnVuY3Rpb24oKXtvJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KG8pLG89d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmVxdWFsSGVpZ2h0cyh7b25SZXNpemU6ITEsb25Mb2FkOiExfSl9LDEwMCl9KSxlLm9uTG9hZCYmaSh3aW5kb3cpLm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7YS5lcXVhbEhlaWdodHMoe29uUmVzaXplOiExLG9uTG9hZDohMX0pfSksYS5lYWNoKGZ1bmN0aW9uKCl7KGg9aSh0aGlzKSkuaGVpZ2h0KFwiYXV0b1wiKSwocz1oLmhlaWdodCgpKT4wJiYodT1oLnBvc2l0aW9uKCkudG9wLHUgaW4gdD9zPnRbdV0/KHRbdV09cyxpKGEpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBpKHRoaXMpLnBvc2l0aW9uKCkudG9wPT11fSkuaGVpZ2h0KHMpKTpoLmhlaWdodCh0W3VdKToodFt1XT1zLGguaGVpZ2h0KHRbdV0pKSl9KSx0aGlzKX19KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGZpbGVPdmVydmlldyDQntGB0L3QvtCy0L3QvtC5INGE0LDQudC7INC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNC4INC80L7QtNGD0LvQtdC5XG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgJyMvX3ZlbmRvcnMvanF1ZXJ5JztcbmltcG9ydCAnIy9fcG9seWZpbGxzL21kbic7XG5pbXBvcnQgJyMvX3BvbHlmaWxscy9wcm9taXNlLXBvbHlmaWxsJztcbmltcG9ydCAnIy9fbW9kdWxlcy9tb2Rlcm5penInO1xuaW1wb3J0ICdjdXN0b20tanF1ZXJ5LW1ldGhvZHMvZm4vY2hhbmdlLW15LWNsYXNzJztcbmltcG9ydCBCcm93c2VyaXpyIGZyb20gJ2Jyb3dzZXJpenInO1xuXG5pbXBvcnQgeyB1c2VEeW5hbWljQWRhcHQgfSBmcm9tICcjL192ZW5kb3JzL2R5bmFtaWNBZGFwdC5qcyc7XG5pbXBvcnQgbW9kdWxlTG9hZGVyIGZyb20gJyMvbW9kdWxlLWxvYWRlcic7XG5pbXBvcnQgd3NUYWJzIGZyb20gJ3dlem9tLXN0YW5kYXJkLXRhYnMnO1xuaW1wb3J0IGNvb2tpZURhdGEgZnJvbSAnIy9fbW9kdWxlcy9jb29raWUtZGF0YSc7XG5pbXBvcnQgeyBsYXp5bG9hZCwgc2VsZWN0b3IgYXMgbGF6eWxvYWRTZWxlY3RvciB9IGZyb20gJyMvX21vZHVsZXMvbGF6eWxvYWQnO1xuaW1wb3J0IHsgY2xpY2tUcmlnZ2VyRm9yIH0gZnJvbSAnIy9fbW9kdWxlcy9jbGljay10cmlnZ2VyLWZvcic7XG5pbXBvcnQgY3JlYXRlVGltZXIgZnJvbSAnY3JlYXRlLXRpbWVyJztcbmltcG9ydCBVVE1UcmFjayBmcm9tICcjL19tb2R1bGVzL3V0bS10cmFja2luZyc7XG5pbXBvcnQgRWNvbW1lcmNlVHJhY2sgZnJvbSAnIy9fbW9kdWxlcy9lY29tbWVyY2UtdHJhY2tpbmcnO1xuaW1wb3J0IG1haW5NZW51IGZyb20gJy4vX21vZHVsZXMvbWFpbi1tZW51JztcbmltcG9ydCBjYXRhbG9nU2VhcmNoIGZyb20gJy4vX21vZHVsZXMvY2F0YWxvZy1zZWFyY2gnO1xuaW1wb3J0IFByb2R1Y3RzRmlsdGVyIGZyb20gJy4vX21vZHVsZXMvcHJvZHVjdHMtZmlsdGVyJztcbmltcG9ydCBFcXVhbEhlaWdodCBmcm9tICcjL19tb2R1bGVzL2VxdWFsLWhlaWdodCc7XG5pbXBvcnQgQmFsbE1vZGFsIGZyb20gJy4vX21vZHVsZXMvYmFsbC1tb2RhbCc7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2pxdWVyeS1zbm93ZmFsbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50cnkge1xuXHR1c2VEeW5hbWljQWRhcHQoJ21pbicpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBjb25zb2xlLmxvZyhlKTtcbn1cblxuLy8gc25vdyBzZXR0aW5ncyBvbiB0aGUgd2Vic2l0ZVxuZnVuY3Rpb24gdGhyb3R0bGUgKGNhbGxiYWNrLCBsaW1pdCkge1xuXHR2YXIgd2FpdCA9IGZhbHNlO1xuXHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRpZiAoIXdhaXQpIHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdGFuZGFyZC9uby1jYWxsYmFjay1saXRlcmFsXG5cdFx0XHRjYWxsYmFjayguLi5hcmdzKTtcblx0XHRcdHdhaXQgPSB0cnVlO1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHdhaXQgPSBmYWxzZTtcblx0XHRcdH0sIGxpbWl0KTtcblx0XHR9XG5cdH07XG59XG5cbi8vIGNoZWNrIGNvbmZpZyBmb3IgZW5hYmxlIHNub3dmYWxsXG5pZiAodHlwZW9mIHdpbmRvdy5NYWluQ29uZmlnICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lk1haW5Db25maWcuc25vd2ZhbGwgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYWluQ29uZmlnLnNub3dmYWxsKSB7XG5cdCQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcblx0XHQvLyAkKCdib2R5Jykuc25vd2ZhbGwoe1xuXHRcdC8vIFx0ZGV2aWNlb3JpZW50YXRpb246IHRydWUsXG5cdFx0Ly8gXHRyb3VuZDogdHJ1ZSxcblx0XHQvLyBcdG1pblNpemU6IDMsXG5cdFx0Ly8gXHRtYXhTaXplOiA4LFxuXHRcdC8vIFx0bWF4U3BlZWQ6IDMsXG5cdFx0Ly8gXHRmbGFrZUNvdW50OiA3NVxuXHRcdC8vIH0pO1xuXG5cdFx0Y29uc3Qgc25vd0NvbmZpZyA9IHtcblx0XHRcdGRldmljZW9yaWVudGF0aW9uOiB0cnVlLFxuXHRcdFx0cm91bmQ6IHRydWUsXG5cdFx0XHRtaW5TaXplOiAzLFxuXHRcdFx0bWF4U2l6ZTogOCxcblx0XHRcdG1heFNwZWVkOiAzLFxuXHRcdFx0Zmxha2VDb3VudDogNzVcblx0XHR9O1xuXG5cdFx0JChkb2N1bWVudCkuc25vd2ZhbGwoc25vd0NvbmZpZyk7XG5cblx0XHRsZXQgc25vd1JlZnJlc2hJbnRlcnZhbElkO1xuXG5cdFx0JCh3aW5kb3cpLm9uKCdtb3VzZW1vdmUnLCB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc25vd1RpbWVyID0gMDtcblx0XHRcdGNsZWFySW50ZXJ2YWwoc25vd1JlZnJlc2hJbnRlcnZhbElkKTtcblx0XHRcdCQoZG9jdW1lbnQpLnNub3dmYWxsKCdjbGVhcicpO1xuXG5cdFx0XHRzbm93UmVmcmVzaEludGVydmFsSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNub3dUaW1lciArPSAxO1xuXHRcdFx0XHRpZiAoc25vd1RpbWVyID4gNSkge1xuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoc25vd1JlZnJlc2hJbnRlcnZhbElkKTtcblx0XHRcdFx0XHQkKGRvY3VtZW50KS5zbm93ZmFsbChzbm93Q29uZmlnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMTAwMCk7XG5cdFx0fSwgNTAwKSk7XG5cdH0pO1xufVxuXG53aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5yZWFkeSgkID0+IHtcblx0bW9kdWxlTG9hZGVyLmluaXQoJChkb2N1bWVudCkpO1xuXHRjb29raWVEYXRhLmFza1VzYWdlKCk7IC8vINC10YHQu9C4INC90YPQttC90L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINC60YPQutC4XG5cdHdzVGFicy5pbml0KCk7XG5cdC8vIHdzVGFicy5zZXRBY3RpdmUoKTsgLy8g0LXRgdC70Lgg0L3Rg9C20L3QviDQv9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3QviDQsNC60YLQuNCy0LjRgNC+0LLQsNGC0Ywg0YLQsNCx0YtcblxuXHRVVE1UcmFjay5pbml0KCk7XG5cblx0bWFpbk1lbnUoKTtcblx0Y2F0YWxvZ1NlYXJjaCgpO1xuXHQvLyBwcm9kdWN0IGZpbHRlciBpbml0XG5cdChuZXcgUHJvZHVjdHNGaWx0ZXIoJCkpLmluaXQoKTtcblxuXHRjbGlja1RyaWdnZXJGb3IoKTtcblx0RXF1YWxIZWlnaHQuaW5pdCgpO1xuXG5cdGlmIChCcm93c2VyaXpyLmRldGVjdCgpLmlzRWRnZSgpKSB7XG5cdFx0Y29uc3QgJGhlYWRlciA9ICQoJy5qcy1oZWFkZXItc3RpY2t5Jyk7XG5cdFx0Y29uc3QgJHdpbmRvdyA9ICQod2luZG93KTtcblx0XHRpZiAoJGhlYWRlci5sZW5ndGgpIHtcblx0XHRcdGxldCBjc3NDbGFzcyA9ICdpcy1maXhlZCc7XG5cdFx0XHRsZXQgcHJldmlvdXNseUFkZGVkID0gJGhlYWRlci5oYXNDbGFzcyhjc3NDbGFzcyk7XG5cdFx0XHRsZXQgdGltZW91dCA9IGNyZWF0ZVRpbWVyKDMwMCk7XG5cdFx0XHRsZXQgX2ZpeGVkID0gKCkgPT4ge1xuXHRcdFx0XHRsZXQgdG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcblx0XHRcdFx0bGV0IGhlaWdodCA9ICRoZWFkZXIuaGVpZ2h0KCk7XG5cdFx0XHRcdHByZXZpb3VzbHlBZGRlZCA9ICRoZWFkZXIuY2hhbmdlTXlDbGFzcyh0b3AgPiBoZWlnaHQsIHByZXZpb3VzbHlBZGRlZCwgY3NzQ2xhc3MpO1xuXHRcdFx0fTtcblx0XHRcdCR3aW5kb3cub24oJ3Njcm9sbCcsIF9maXhlZCk7XG5cdFx0XHQkd2luZG93Lm9uKCdyZXNpemUnLCAoKSA9PiB0aW1lb3V0KF9maXhlZCkpO1xuXHRcdFx0JHdpbmRvdy5vbignb3JpZW50YXRpb25jaGFuZ2UnLCAoKSA9PiB0aW1lb3V0KF9maXhlZCkpO1xuXHRcdFx0X2ZpeGVkKCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8g0Y3RgtC+INC00LXRhNC+0LvRgtC90YvQtS
10072DQvdCw0YHRgtGA0L7QudC60Lgg0YHQutGA0L7Qu9C70LAsINC80L7QttC10YjRjCDQuNGFINGD0LHQuNGA0LDRgtGML9C80L7QtNC40YTQuNGG0LjRgNC+0LLQsNGC0YwsINC60LDRgNC+0YfQtSDQtNC10LvQsNGC0Ywg0YfRgtC+INGF0L7Rh9C10YjRjCwg0LrQsNC70LHQtdC60L7QsiDQvdC10YLRgyDQv9C+0L3Rj9GC0L3QvtC1INC00LXQu9C+OkRcblx0aW1wb3J0KCcjL192ZW5kb3JzL3Njcm9sbCcpLnRoZW4oKG1vZHVsZSkgPT4ge1xuXHRcdG1vZHVsZS5kZWZhdWx0KHtcblx0XHRcdGZyYW1lUmF0ZTogMTUwLCAvLyBbSHpdXG5cdFx0XHRhbmltYXRpb25UaW1lOiA3MDAsIC8vIFttc11cblx0XHRcdHN0ZXBTaXplOiA3MCwgLy8gW3B4XVxuXHRcdFx0cHVsc2VBbGdvcml0aG06IHRydWUsXG5cdFx0XHRwdWxzZVNjYWxlOiAzLFxuXHRcdFx0cHVsc2VOb3JtYWxpemU6IDEsXG5cdFx0XHRhY2NlbGVyYXRpb25EZWx0YTogNTAsIC8vIDUwXG5cdFx0XHRhY2NlbGVyYXRpb25NYXg6IDMsIC8vIDNcblx0XHRcdGtleWJvYXJkU3VwcG9ydDogdHJ1ZSwgLy8gb3B0aW9uXG5cdFx0XHRhcnJvd1Njcm9sbDogNTAsIC8vIFtweF1cblx0XHRcdGZpeGVkQmFja2dyb3VuZDogdHJ1ZSxcblx0XHRcdGV4Y2x1ZGVkOiAnJ1xuXHRcdH0pO1xuXHR9KTtcblxuXHRsYXp5bG9hZChsYXp5bG9hZFNlbGVjdG9yKS50aGVuKG9ic2VydmVyID0+IG9ic2VydmVyLm9ic2VydmUoKSk7XG5cblx0JCgnLmpzLXByZXZpZXdlci10cmlnZ2VyJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuXHRcdCQodGhpcykudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHRcdCQoJyNqcy1wcmV2aWV3ZXItY29udGFpbmVyJykudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHR9KTtcblxuXHQvLyDQlNC+0LHQsNC70Y/QtdC8INC4INGD0LTQsNC70Y/QtdC8INC60LvQsNGB0YEgXCJpcy1mdWxsXCIg0LXRgdC70LggaW5wdXQg0LjQu9C4IHRleHRhcmVhINC30LDQv9C+0LvQvdC10L1cblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uIChldnQpIHtcblx0XHRpZiAoIWV2dC50YXJnZXQudGFnTmFtZSkgcmV0dXJuIGZhbHNlO1xuXHRcdGxldCB0YWdOYW1lID0gZXZ0LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKCh0YWdOYW1lICE9PSAnaW5wdXQnKSAmJiAodGFnTmFtZSAhPT0gJ3RleHRhcmVhJykpIHJldHVybiB0cnVlO1xuXHRcdGlmIChldnQudGFyZ2V0LnR5cGUgPT09ICdyYWRpbycpIHJldHVybiB0cnVlO1xuXHRcdGV2dC50YXJnZXQuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtZnVsbCcsIEJvb2xlYW4oZXZ0LnRhcmdldC52YWx1ZSkpO1xuXHR9LCB0cnVlKTtcblxuXHRpZlx0KCQoJ2lucHV0JykubGVuZ3RoKSB7XG5cdFx0JCgnaW5wdXQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmXHQoJCh0aGlzKS52YWwoKS5sZW5ndGgpIHtcblx0XHRcdFx0JCh0aGlzKS5hZGRDbGFzcygnaXMtZnVsbCcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8g0JTQvtCx0LDQu9GP0LXQvCDQutC70LDRgdGBIFwiaXMtZnVsbFwiINC10YHQu9C4IHNlbGVjdCDQt9Cw0L/QvtC70L3QtdC9XG5cdCQoJ3NlbGVjdCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG5cdFx0JCh0aGlzKS50b2dnbGVDbGFzcygnaXMtZnVsbCcsIEJvb2xlYW4oJCh0aGlzKS52YWwoKSkpO1xuXHR9KTtcblxuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmpzLW1hZ25pZmljLWNsb3NlJywgKCkgPT4ge1xuXHRcdCQubWFnbmlmaWNQb3B1cC5jbG9zZSgpO1xuXHR9KTtcblxuXHQvLyBldG8gYWRhcHRhY2lhIGtub3BraSBuYSBzbGlkZXJlIHhEXG5cdGZ1bmN0aW9uIGhhbmRsZXIxIChidXR0b24sIGJsb2NrKSB7XG5cdFx0YnV0dG9uLmNzcygnbGVmdCcsIGJsb2NrLm9mZnNldCgpLmxlZnQgKyAncHgnKTtcblx0fVxuXG5cdGlmICgkKCdbZGF0YS1ib3R0b20tYmxvY2staGVscGVyXScpLmxlbmd0aCkge1xuXHRcdGNvbnN0ICRidXR0b24gPSAkKCdbZGF0YS1ib3R0b20tYmxvY2staGVscGVyXScpO1xuXHRcdGNvbnN0ICRibG9jayA9ICQoJ1tkYXRhLWJvdHRvbS1ibG9jay1oZWxwZXItY29udGFpbmVyXScpLmVxKDApO1xuXG5cdFx0aGFuZGxlcjEoJGJ1dHRvbiwgJGJsb2NrKTtcblxuXHRcdGxldCBtb2lkZWJhdW5jZSA9IG51bGw7XG5cblx0XHQkKHdpbmRvdykucmVzaXplKCgpID0+IHtcblx0XHRcdGNsZWFyVGltZW91dChtb2lkZWJhdW5jZSk7XG5cblx0XHRcdG1vaWRlYmF1bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGhhbmRsZXIxKCRidXR0b24sICRibG9jayk7XG5cdFx0XHR9LCAzMDApO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCQoJ1tkYXRhLWxvYWQtbW9yZV0nKS5sZW5ndGgpIHtcblx0XHQkKCdbZGF0YS1sb2FkLW1vcmVdJykuY2xpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0bGV0IGJ1dHRvbiA9ICQodGhpcyk7XG5cdFx0XHRsZXQgdXJsID0gYnV0dG9uLmRhdGEoJ3VybCcpO1xuXHRcdFx0bGV0IHBhcmFtcyA9IGJ1dHRvbi5hdHRyKCdkYXRhLXBhcmFtcycpO1xuXG5cdFx0XHRidXR0b24uYWRkQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcblxuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0Y2FjaGU6IGZhbHNlLFxuXHRcdFx0XHRtZXRob2Q6ICdwb3N0Jyxcblx0XHRcdFx0dXJsOiB1cmwsXG5cdFx0XHRcdGRhdGE6IEpTT04ucGFyc2UocGFyYW1zKVxuXHRcdFx0fSkuZG9uZSgocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0YnV0dG9uLnJlbW92ZUNsYXNzKCdpcy1sb2FkaW5nJyk7XG5cblx0XHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRsZXQgTnBhcmFtcyA9IHJlc3BvbnNlLnBhcmFtcztcblxuXHRcdFx0XHRcdGlmIChyZXNwb25zZS5tYXJrdXApIHtcblx0XHRcdFx0XHRcdGxldCAkY29udGFpbmVyID0gJCgnW2RhdGEtbG9hZC1tb3JlLWNvbnRhaW5lcj1cIicgKyBidXR0b24uYXR0cignZGF0YS1sb2FkLW1vcmUnKSArICdcIl0nKTtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1zQmVmb3JlID0gJGNvbnRhaW5lci5jaGlsZHJlbigpLmxlbmd0aDtcblx0XHRcdFx0XHRcdCRjb250YWluZXIuYXBwZW5kKHJlc3BvbnNlLm1hcmt1cCk7XG5cblx0XHRcdFx0XHRcdCQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcblx0XHRcdFx0XHRcdFx0c2Nyb2xsVG9wOiAkY29udGFpbmVyLmZpbmQoYGxpOm50aC1jaGlsZCgke2l0ZW1zQmVmb3JlICsgMX0pYCkub2Zmc2V0KCkudG9wIC0gNjRcblx0XHRcdFx0XHRcdH0sIDEwM
10072DApO1xuXHRcdFx0XHRcdFx0Ly8gbGF6eWxvYWQobGF6eWxvYWRTZWxlY3RvcikudGhlbihvYnNlcnZlciA9PiBvYnNlcnZlci5vYnNlcnZlKCkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZXNwb25zZS5lbmQpIHtcblx0XHRcdFx0XHRcdGJ1dHRvbi5yZW1vdmUoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVzcG9uc2UucGFyYW1zKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIE5wYXJhbXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0XHRcdE5wYXJhbXMgPSBKU09OLnN0cmluZ2lmeShOcGFyYW1zKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJ1dHRvbi5hdHRyKCdkYXRhLXBhcmFtcycsIE5wYXJhbXMpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGxhenlsb2FkKGxhenlsb2FkU2VsZWN0b3IpLnRoZW4ob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIub2JzZXJ2ZSgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoJCgnLnBvc3QtY2FyZCcpLmxlbmd0aCkge1xuXHRcdCQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcucG9zdC1jYXJkJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJ2EnKS5hdHRyKCdocmVmJyk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoJCgnLm1haW4tYWJvdXQgLmltYWdlLWJsb2NrJykubGVuZ3RoKSB7XG5cdFx0JChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5tYWluLWFib3V0IC5pbWFnZS1ibG9jaycsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRjb25zdCBocmVmID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJ2EuaW1hZ2UtYmxvY2tfX2N0YScpLmZpcnN0KCkuYXR0cignaHJlZicpO1xuXHRcdFx0aWYgKGhyZWYpIHtcblx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVWJsb2NrXG5cdGlmICgkKHdpbmRvdykud2lkdGgoKSA+PSAxMDI1KSB7XG5cdFx0aWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2ZpcmVmb3gvaSkpIHtcblx0XHRcdCQoJyNmaXJlZml4VScpLmF0dHIoJ3RyYW5zZm9ybScsICdzY2FsZSguMDIsLjAyKSwgdHJhbnNsYXRlKDExIDgpJyk7XG5cdFx0fSBlbHNlIGlmICgvRWRnZVxcL1xcZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdFx0XHQkKCcjZWRnZWZpeFUnKS5oaWRlKCk7XG5cdFx0XHQkKCcjVWltYWdlRml4Jykuc2hvdygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQkKCcjZWRnZWZpeFUnKS5oaWRlKCk7XG5cdFx0JCgnI1VpbWFnZUZpeCcpLnNob3coKTtcblx0fVxuXG5cdGxldCAkcGVyZmVjdFNjcm9sbGJhciA9ICQoJ1tkYXRhLXBlcmZlY3Qtc2Nyb2xsYmFyXScpO1xuXHRpZiAoJHBlcmZlY3RTY3JvbGxiYXIubGVuZ3RoICYmICF3aW5kb3cuTW9kZXJuaXpyLm1vYmlsZWRldmljZSAmJiAhd2luZG93Lk1vZGVybml6ci5jc3NzY3JvbGxiYXIpIHtcblx0XHRpbXBvcnQoJyMvX21vZHVsZXMvcGVyZmVjdC1zY3JvbGxiYXInKS50aGVuKChtb2R1bGUpID0+IHtcblx0XHRcdG1vZHVsZS5kZWZhdWx0KCRwZXJmZWN0U2Nyb2xsYmFyKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmICh3aW5kb3cubWVzc2FnZU9uTG9hZE5vdHkpIHtcblx0XHRpbXBvcnQoJyMvX21vZHVsZXMvanF1ZXJ5LXZhbGlkYXRpb24vdmFsaWRhdGUtZ2V0LXJlc3BvbnNlJykudGhlbigobW9kdWxlKSA9PiB7XG5cdFx0XHRtb2R1bGUuc2hvd01lc3NhZ2VNYWduaWZpYyhudWxsLCBmYWxzZSwgd2luZG93Lm1lc3NhZ2VPbkxvYWROb3R5LnR5cGUsIHdpbmRvdy5tZXNzYWdlT25Mb2FkTm90eS50aXRsZSwgd2luZG93Lm1lc3NhZ2VPbkxvYWROb3R5LnRleHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWZcdCgkKCdbZGF0YS10aGFuay1wcmludF0nKS5sZW5ndGgpIHtcblx0XHQkKCdib2R5JykuYWRkQ2xhc3MoJ2lzLXByaW50aW5nJyk7XG5cblx0XHQkKCdbZGF0YS10aGFuay1wcmludF0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR3aW5kb3cucHJpbnQoKTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIENvcHlyaWdodCBvbiBjb3B5XG5cdGZ1bmN0aW9uIGluaXRDb3BpcmlnaHRPbkNvcHkgKCkge1xuXHRcdHZhciBsYW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTtcblx0XHR2YXIgaGVscFRleHQgPSAnJztcblx0XHRzd2l0Y2ggKGxhbmcpIHtcblx0XHRcdGNhc2UgJ3J1Jzpcblx0XHRcdFx0aGVscFRleHQgPSAn0J/QvtC00YDQvtCx0L3QtdC1INC/0L4g0YHRgdGL0LvQutC1Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlbic6XG5cdFx0XHRcdGhlbHBUZXh0ID0gJ1JlYWQgbW9yZSBhdCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndWEnOlxuXHRcdFx0XHRoZWxwVGV4dCA9ICfQlNC10YLQsNC70YzQvdGW0YjQtSDQt9CwINC/0L7RgdC40LvQsNC90L3Rj9C8Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRoZWxwVGV4dCA9ICfQlNC10YLQsNC70YzQvdGW0YjQtSDQt9CwINC/0L7RgdC40LvQsNC90L3Rj9C8Jztcblx0XHR9XG5cdFx0ZnVuY3Rpb24gYSAoZXZlbnQpIHtcblx0XHRcdGlmIChldmVudC50YXJnZXQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHZhciBhOyB2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF07XG5cdFx0XHRhID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXHRcdFx0dmFyIGMgPSAnPGJyIC8+PGJyIC8+JyArIGhlbHBUZXh0ICsgXCI6IDxhIGhyZWY9J1wiICsgZG9jdW1lbnQubG9jYXRpb24uaHJlZiArIFwiJz5cIiArIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgKyAnPC9hPidcblx0XHRcdDsgdmFyIGQgPSBhICsgY1xuXHRcdFx0OyB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0ZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlLnN0eWxlLmxlZnQgPSAnLTk5OTk5cHgnO1xuXHRcdFx0Yi5hcHBlbmRDaGlsZChlKTtcblx0XHRcdGUuaW5uZXJIVE1MID0gZDtcblx0XHRcdGEuc2VsZWN0QWxsQ2hpbGRyZW4oZSk7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGIucmVtb3ZlQ2hpbGQoZSk7XG5cdFx0XHR9LCAwKTtcblx0XHR9XG5cdFx0ZG9jdW1lbnQub25jb3B5ID0gYTtcblx0fVxuXHQvLyBJbml0IENvcHlyaWdodCBvbiBjb3B5XG5cdGluaXRDb3BpcmlnaHRPbkNvcHkoKTtcblxuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmpzLW1lc3NhbmdlcnMtYnRuJywgKGUpID0+IHtcblx0XHRlLnByZXZlbn
10072REZWZhdWx0KCk7XG5cdFx0JChlLnRhcmdldCkucGFyZW50KCkudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHR9KTtcblxuXHQvLyBTcG9pbGVyc1xuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnW2RhdGEtc3BvaWxlcl0gW2RhdGEtc3BvaWxlci10aXRsZV0nLCAoZSkgPT4ge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGNvbnN0IHNsaWRlU3BlZWQgPSAyNTA7XG5cdFx0Y29uc3QgJGN1cnJlbnQgPSAkKGUuY3VycmVudFRhcmdldCk7XG5cdFx0Y29uc3QgJHNwb2lsZXIgPSAkY3VycmVudC5wYXJlbnRzKCdbZGF0YS1zcG9pbGVyXScpO1xuXG5cdFx0ZnVuY3Rpb24gdG9nZ2xlU3BvaWxlciAoKSB7XG5cdFx0XHQkY3VycmVudC50b2dnbGVDbGFzcygnYWN0aXZlJykubmV4dCgpLnN0b3AoKS5zbGlkZVRvZ2dsZShzbGlkZVNwZWVkKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBvcGVuU3BvaWxlciAoKSB7XG5cdFx0XHQkY3VycmVudC5hZGRDbGFzcygnYWN0aXZlJykubmV4dCgpLnN0b3AoKS5zbGlkZURvd24oc2xpZGVTcGVlZCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2xvc2VOb3RDdXJyZW50U3BvaWxlciAoKSB7XG5cdFx0XHQkc3BvaWxlci5maW5kKCdbZGF0YS1zcG9pbGVyLXRpdGxlXScpLm5vdCgkY3VycmVudCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLm5leHQoKS5zbGlkZVVwKHNsaWRlU3BlZWQpO1xuXHRcdH1cblxuXHRcdGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDEwMjQpIHtcblx0XHRcdHRvZ2dsZVNwb2lsZXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKCRzcG9pbGVyLmF0dHIoJ2RhdGEtc3BvaWxlcicpKSB7XG5cdFx0XHRjYXNlICdvbmUnOlxuXHRcdFx0XHRjbG9zZU5vdEN1cnJlbnRTcG9pbGVyKCk7XG5cdFx0XHRcdG9wZW5TcG9pbGVyKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnb25lLWNsb3NlJzpcblx0XHRcdFx0aWYgKCRjdXJyZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuXHRcdFx0XHRcdHRvZ2dsZVNwb2lsZXIoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2xvc2VOb3RDdXJyZW50U3BvaWxlcigpO1xuXHRcdFx0XHRvcGVuU3BvaWxlcigpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRvZ2dsZVNwb2lsZXIoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9KTtcblxuXHQkKCdbZGF0YS1zcG9pbGVyXSBbZGF0YS1zcG9pbGVyLXRpdGxlXS5hY3RpdmUnKS5uZXh0KCkuc2hvdygpO1xuXG5cdC8vIFNob3cgbW9yZSB0ZXh0XG5cdCQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1zaG93bW9yZV0nLCAoZSkgPT4ge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRjb25zdCAkY3VycmVudCA9ICQoZS50YXJnZXQpO1xuXHRcdGNvbnN0ICR0ZXh0ID0gJGN1cnJlbnQucGFyZW50KCk7XG5cdFx0JHRleHQudG9nZ2xlQ2xhc3MoJ2lzLXZpc2libGUnKTtcblx0XHRjb25zdCBsb2NhbGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZy5zcGxpdCgnLScpLnBvcCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd1aycgPyAndWEnIDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmxhbmcuc3BsaXQoJy0nKS5wb3AoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXHRcdGNvbnN0IGRpY3Rpb25hcnkgPSAkY3VycmVudC5kYXRhKCdkaWN0aW9uYXJ5JylbbG9jYWxlXTtcblx0XHQkY3VycmVudC50ZXh0KCR0ZXh0Lmhhc0NsYXNzKCdpcy12aXNpYmxlJykgPyBkaWN0aW9uYXJ5Lmxlc3MgOiBkaWN0aW9uYXJ5Lm1vcmUpO1xuXHR9KTtcblxuXHQvLyBTaG93IG1vcmUgY29tbWVudHNcblx0JChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLWNvbW1lbnRzLWxvYWRdJywgKGUpID0+IHtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0Y29uc3QgJGN1cnJlbnQgPSAkKGUudGFyZ2V0KTtcblx0XHRjb25zdCAkY29tbWVudHNCbG9jayA9ICQoJ1tkYXRhLWNvbW1lbnRzXScpO1xuXHRcdGNvbnN0ICRjb21tZW50c0xpc3QgPSAkY29tbWVudHNCbG9jay5maW5kKCdbZGF0YS1jb21tZW50cy1saXN0XScpO1xuXHRcdGNvbnN0IGNhdGFsb2dJRCA9ICRjb21tZW50c0Jsb2NrLmRhdGEoJ2NvbW1lbnRzJyk7XG5cdFx0Y29uc3QgdXJsID0gJGN1cnJlbnQuZGF0YSgnY29tbWVudHMtbG9hZCcpO1xuXHRcdCRjdXJyZW50LmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0JGNvbW1lbnRzQmxvY2suYWRkQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcblxuXHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRjYXRhbG9nX2lkOiBOdW1iZXIoY2F0YWxvZ0lEKSxcblx0XHRcdG9mZnNldDogJGNvbW1lbnRzTGlzdC5jaGlsZHJlbigpLmxlbmd0aFxuXHRcdH07XG5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdGNhY2hlOiBmYWxzZSxcblx0XHRcdFx0bWV0aG9kOiAncG9zdCcsXG5cdFx0XHRcdHVybCxcblx0XHRcdFx0ZGF0YVxuXHRcdFx0fSkuZG9uZSgocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0JGNvbW1lbnRzQmxvY2sucmVtb3ZlQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcblx0XHRcdFx0JGN1cnJlbnQuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UucmV2aWV3c19tYXJrdXApIHtcblx0XHRcdFx0XHRcdCRjb21tZW50c0xpc3QuYXBwZW5kKHJlc3BvbnNlLnJldmlld3NfbWFya3VwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHJlc3BvbnNlLmVuZCkge1xuXHRcdFx0XHRcdFx0JGN1cnJlbnQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LCAzMDApO1xuXHR9KTtcblxuXHQvLyBMb3ZlcnMgTW9kYWwgaW5pdFxuXHRjb25zdCBsb3ZlcnNNb2RhbFJlZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb3ZlcnNNb2RhbCcpO1xuXHRpZiAobG92ZXJzTW9kYWxSZWYpIHtcblx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2JsdXInKTtcblx0XHRjb25zdCBsb3ZlcnNNb2RhbENsb3NlSGFuZGxlciA9ICgpID0+IHtcblx0XHRcdGNvb2tpZURhdGEuYWRkKCdzaG93LWxvdmVycy1tb2RhbCcsIGZhbHNlLCB7IGV4cGlyZXM6IDM2NSwgcGF0aDogJy8nLCBTYW1lU2l0ZTogJ05vbmUnLCBTZWN1cmU6ICdTZWN1cmUnIH0pO1xuXHRcdFx0bG92ZXJzTW9kYWxSZWYuc3R5bGUub3BhY2l0eSA9IDA7XG5cdFx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2JsdXInKTtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRsb3ZlcnNNb2RhbFJlZi5yZW1vdmUoKTtcblx0XHRcdH0sIDIwMDApO1xuXHRcdH07XG5cdFx0Y29uc3QgY2xvc2VCdG5SZWYgPSBsb3ZlcnNNb2RhbFJlZi5xdWVyeVNlbGVjdG9yKCcuanMtY2xvc2UtbG92ZXJzLW1vZGFsJyk7XG5cdFx0Y2xvc2VCdG5SZWYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb3ZlcnNNb2RhbENsb3NlSGFuZGxlcik7XG5cdH1cblxuXHQvLyBFYXN0ZXIgTW9kYWwgaW5pdFxuXHRjb25zdCBlYXN0ZXJNb2RhbFJlZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlYXN0ZXJNb2RhbCcpO1xuXG5cdGlmIChlYXN0ZXJNb2RhbFJlZikge1xuXHRcdC8vIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYmx1cicpO1xuXHRcdGNvbnN0IGVhc3Rlck1vZGFsQ2xvc2VIYW5kbGVyID0gKCkgPT4ge1xuXHRcdFx0Y29va2llRGF0YS5hZGQoJ3Nob3ctZWFzdGVyLW1vZGFsJywgZmFsc2UsIHsgZXhwaXJlczogMzY1LCBwYXRoOiAnLycsIFNhbWVTaXRlOiAnTm9uZScsIFNlY3VyZTogJ1NlY3VyZScgfSk7XG5cdFx0XHRlYXN0ZXJNb2RhbFJlZi5zdHlsZS5vcGFjaXR5ID0gMDtcblx0XHRcdC8vIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYmx1cicpO1xuXHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGVhc3Rlck1vZGFsUmVmLnJlbW92ZSgpO1xuXHRcdFx0fSwgMjAwMCk7XG5cdFx0fTtcblx0XHRjb25zdCBjbG9zZUJ0blJlZiA9IGVhc3Rlck1vZGFsUmVmLnF1ZXJ5U2VsZWN0b3IoJy5qcy1jbG9zZS1lYXN0ZXItbW9kYWwnKTtcblx0XHRjbG9zZUJ0blJlZi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVhc3Rlck1vZGFsQ2xvc2VIYW5kbGVyKTtcblx0fVxuXG5cdC8vIEJhbGwgTW9kYWwgaW5pdFxuXHRjb25zdCBiYWxsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJmLWJhbGwtY29udGFpbmVyJyk7XG5cdGlmIChiYWxsQ29udGFpbmVyICYmIGJhbGxDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWJmYmFsbCcpID09PSAnYWN0aXZlJykge1xuXHRcdG5ldyBCYWxsTW9kYWwoKTtcblx0fVxufSk7XG5cbi8vIEdBNFxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG5cdC8vIFByb2R1Y3QgcGFnZVxuXHRjb25zdCBwcm9kdWN0UGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtcGFnZV0nKTtcblxuXHRpZiAocHJvZHVjdFBhZ2UpIHtcblx0XHQvLyDQntGC0YDQuNC80LDQvdC90Y8g0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDQsCDRgtC+0LLQsNGA0YMg0Lcg0LDRgtGA0LjQsdGD0YLQsCBkYXRhLXByb2R1Y3QtcGFnZVxuXHRcdGNvbnN0IHByb2R1Y3RJZCA9IHBhcnNlSW50KHByb2R1Y3RQYWdlLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LXBhZ2UnKSk7XG5cblx0XHRpZiAoIXByb2R1Y3RJZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQuYWpheCh7XG5cdFx0XHRjYWNoZTogZmFsc2UsXG5cdFx0XHRtZXRob2Q6ICdwb3N0Jyxcblx0XHRcdHVybDogJy91YS9lY29tbWVyY2UvYWpheC9wcm9kdWN0Jyxcblx0XHRcdGRhdGE6IHtcblx0XHRcdFx0cHJvZHVjdElkXG5cdFx0XHR9XG5cdFx0fSkuZG9uZSgocmVzcG9uc2UpID0+IHtcblx0XHRcdGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcblx0XHRcdFx0RWNvbW1lcmNlVHJhY2sudHJhY2tWaWV3SXRlbShyZXNwb25zZS5kYXRhKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8vIENoZWNrb3V0IHBhZ2Vcblx0Y29uc3QgY2hlY2tvdXRQYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hlY2tvdXQtcGFnZV0nKTtcblxuXHRpZiAoY2hlY2tvdXRQYWdlKSB7XG5cdFx0JC5hamF4KHtcblx0XHRcdGNhY2hlOiBmYWxzZSxcblx0XHRcdG1ldGhvZDogJ3Bvc3QnLFxuXHRcdFx0dXJsOiAnL3VhL2Vjb21tZXJjZS9hamF4L2NoZWNrb3V0J1xuXHRcdH0pLmRvbmUoKHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG5cdFx0XHRcdGNvbnN0IHsgYW1vdW50LCBpdGVtcyB9ID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0RWNvbW1lcmNlVHJhY2sudHJhY2tCZWdpbkNoZWNrb3V0KGFtb3VudCwgaXRlbXMpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhhbmtzIHBhZ2Vcblx0Y29uc3QgdGhhbmtQYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdGhhbmstcGFnZV0nKTtcblxuXHRpZiAodGhhbmtQYWdlKSB7XG5cdFx0aWYgKCF3aW5kb3cudHJhY2tQdXJjaGFzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCe0YLRgNC40LzQsNC90L3RjyDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNCwINC30LDQvNC+0LLQu9C10L3QvdGPINC3INCw0YLRgNC40LHRg9GC0LAgZGF0YS10aGFuay1wYWdlXG5cdFx0Y29uc3Qgb3JkZXJJZCA9IHBhcnNlSW50KHRoYW5rUGFnZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGhhbmstcGFnZScpKTtcblxuXHRcdGlmICghb3JkZXJJZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQuYWpheCh7XG5cdFx0XHRjYWNoZTogZmFsc2UsXG5cdFx0XHRtZXRob2Q6ICdwb3N0Jyxcblx0XHRcdHVybDogJy91YS9lY29tbWVyY2UvYWpheC9wdXJjaGFzZScsXG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdG9yZGVySWRcblx0XHRcdH1cblx0XHR9KS5kb25lKChyZXNwb25zZSkgPT4ge1xuXHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuXHRcdFx0XHRFY29tbWVyY2VUcmFjay50cmFja1B1cmNoYXNlKHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gc3BvaWxlclxuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLnRleHQtc3BvaWxlcicsIGZ1bmN0aW9uIChlKSB7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGNvbnN0IGN1cnJlbnRBY3Rpb24gPSAkKHRoaXMpLmRhdGEoJ2FjdGlvbicpO1xuXHRcdGNvbnN0IHNwb2lsZXJCbG9jayA9ICQodGhpcykucGFyZW50KCkuZmluZCgnLnRleHQtc3BvaWxlcl9fY29udGVudCcpO1xuXHRcdGlmIChjdXJyZW50QWN0aW9uID09PSAnb3BlbicpIHtcblx0XHRcdHNwb2lsZXJCbG9jay5hZGRDbGFzcygnb3BlbicpO1xuXHRcdH1cblx0XHRpZiAoY3VycmVudEFjdGlvbiA9PT0gJ2Nsb3NlJykge1xuXHRcdFx0c3BvaWxlckJsb2NrLnJlbW92ZUNsYXNzKCdvcGVuJyk7XG5cdFx0fVxuXHRcdCQodGhpcykucGFyZW50KCkuZmluZCgnLnRleHQtc3BvaWxlcicpLnNob3coKTtcblx0XHQkKHRoaXMpLmhpZGUoKTtcblx0fSk7XG59
10072KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQG1vZHVsZVxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEltcG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW1wb3J0IE1vZHVsZUxvYWRlciBmcm9tICd3ZXpvbS1tb2R1bGUtbG9hZGVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IG1vZHVsZUxvYWRlciA9IG5ldyBNb2R1bGVMb2FkZXIoe1xuXHRkZWJ1ZzogZmFsc2UsIC8vIElTX0RFVkVMT1BNRU5ULFxuXHRpbXBvcnRQcm9taXNlOiBtb2R1bGVOYW1lID0+IGltcG9ydCgnLi9fbW9kdWxlcy1sb2FkZXJzLycgKyBtb2R1bGVOYW1lKSxcblx0aW5pdFNlbGVjdG9yOiAnLmpzLWluaXQnLFxuXHRpbml0RnVuY3Rpb25OYW1lOiAnbG9hZGVySW5pdCcsXG5cdGxvYWRpbmdDbGFzczogJ19tb2R1bGUtbG9hZGluZycsXG5cdGxvYWRlZENsYXNzOiAnX21vZHVsZS1sb2FkZWQnLFxuXHRsaXN0OiB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUga2V5LXNwYWNpbmcgKi9cblx0XHQnanF1ZXJ5LXZhbGlkYXRpb24tLW1vZHVsZS1sb2FkZXInXHRcdFx0OiAnZm9ybScsXG5cdFx0J2lucHV0bWFzay0tbW9kdWxlLWxvYWRlcidcdFx0XHRcdFx0XHRcdDogJ1tkYXRhLXBob25lbWFza10nLFxuXHRcdCdzMnMtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1zMnNdJyxcblx0XHQnbWFnbmlmaWMtcG9wdXAtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJ1tkYXRhLW1mcF0nLFxuXHRcdCd3cmFwLW1lZGlhLS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0XHRcdFx0OiAnW2RhdGEtd3JhcC1tZWRpYV0nLFxuXHRcdCdzbGlkZXJzLS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1zbGlkZXJdJyxcblx0XHQnbG96YWQtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdFx0XHRcdFx0OiBbJ1tkYXRhLWxvemFkXScsICdwaWN0dXJlJ10sXG5cdFx0J2dvb2dsZS1tYXAtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1nb29nbGUtbWFwXScsXG5cdFx0J3Njcm9sbC13aW5kb3ctLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJ1tkYXRhLXNjcm9sbC13aW5kb3ddJyxcblx0XHQnZHJhZ2dhYmxlLXRhYmxlLS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0OiAnW2RhdGEtZHJhZ2dhYmxlLXRhYmxlXScsXG5cdFx0J2FjY29yZGlvbi0tbW9kdWxlLWxvYWRlcidcdFx0XHRcdFx0XHRcdDogJ1tkYXRhLWFjY29yZGlvbl0nLFxuXHRcdCdzcGxhc2gtbm8tMTgnXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1uby0xOF0nLFxuXHRcdCd0aW1lbGluZSdcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS10aW1lbGluZV0nLFxuXHRcdCdjYXJ0LS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0XHRcdFx0XHRcdFx0OiAnW2RhdGEtY2FydC1jb250YWluZXJdJyxcblx0XHQnaW5wdXQtcXVhbnRpdHktLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJ1tkYXRhLXF1YW50aXR5XScsXG5cdFx0J3Jldmlldy1yZWFkLW1vcmUtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHQ6ICcuanMtcmVhZC1tb3JlJyxcblx0XHQnY2F0YWxvZy1maWx0ZXItLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJy5qcy1maWx0ZXItYnV0dG9uJyxcblx0XHQnYW5pbWF0ZWQtdGV4dCdcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogJ1tkYXRhLWFuaW1hdGVkLXRleHRdJyxcblx0XHQnYmVlcmJveC0tbW9kdWxlLWxvYWRlcidcdFx0XHRcdFx0XHRcdFx0OiAnW2RhdGEtYmVlcmJveF0nLFxuXHRcdCdwYXJ0bmVyLWZvcm0tLW1vZHVsZS1sb2FkZXInICAgICAgICAgICA6ICdbZGF0YS1wYXJ0bmVyLWZvcm1dJyxcblx0XHQnaW5maW5pdHktc2Nyb2xsLS1tb2R1bGUtbG9hZGVyJyAgICAgICAgOiAnLmluZmluaXR5LXNjcm9sbCcsXG5cdFx0J3Bhc3N3b3JkLXRvZ2dsZS0tbW9kdWxlLWxvYWRlcicgICAgICAgIDogJy5wYXNzd29yZC10b2dnbGUnXG5cdH1cbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBkZWZhdWx0IG1vZHVsZUxvYWRlcjtcbiIsImZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG4vLyBPbGRlciBicm93c2VycyBkb24ndCBzdXBwb3J0IGV2ZW50IG9wdGlvbnMsIGZlYXR1cmUgZGV0ZWN0IGl0LlxuXG4vLyBBZG9wdGVkIGFuZCBtb2RpZmllZCBzb2x1dGlvbiBmcm9tIEJvaGRhbiBEaWR1a2ggKDIwMTcpXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTU5NDk5Ny9pb3MtMTAtc2FmYXJpLXByZXZlbnQtc2Nyb2xsaW5nLWJlaGluZC1hLWZpeGVkLW92ZXJsYXktYW5kLW1haW50YWluLXNjcm9sbC1wb3NpXG5cbnZhciBoYXNQYXNzaXZlRXZlbnRzID0gZmFsc2U7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgdmFyIHBhc3NpdmVUZXN0T3B0aW9ucyA9IHtcbiAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgIGhhc1Bhc3NpdmVFdmVudHMgPSB0cnVlO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVUZXN0T3B0aW9ucyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVUZXN0T3B0aW9ucyk7XG59XG5cbnZhciBpc0lvc0RldmljZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSAmJiAoL2lQKGFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pIHx8IHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgd2luZG93Lm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpO1xuXG5cbnZhciBsb2NrcyA9IFtdO1xudmFyIGRvY3VtZW50TGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xudmFyIGluaXRpYWxDbGllbnRZID0gLTE7XG52YXIgcHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nID0gdm9pZCAwO1xudmFyIHByZXZpb3VzQm9keVBvc2l0aW9uID0gdm9pZCAwO1xudmFyIHByZXZpb3VzQm9keVBhZGRpbmdSaWdodCA9IHZvaWQgMDtcblxuLy8gcmV0dXJucyB0cnVlIGlmIGBlbGAgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcmVjZWl2ZSB0b3VjaG1vdmUgZXZlbnRzLlxudmFyIGFsbG93VG91Y2hNb3ZlID0gZnVuY3Rpb24gYWxsb3dUb3VjaE1vdmUoZWwpIHtcbiAgcmV0dXJuIGxvY2tzLnNvbWUoZnVuY3Rpb24gKGxvY2spIHtcbiAgICBpZiAobG9jay5vcHRpb25zLmFsbG93VG91Y2hNb3ZlICYmIGxvY2sub3B0aW9ucy5hbGxvd1RvdWNoTW92ZS
10072hlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG52YXIgcHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChyYXdFdmVudCkge1xuICB2YXIgZSA9IHJhd0V2ZW50IHx8IHdpbmRvdy5ldmVudDtcblxuICAvLyBGb3IgdGhlIGNhc2Ugd2hlcmVieSBjb25zdW1lcnMgYWRkcyBhIHRvdWNobW92ZSBldmVudCBsaXN0ZW5lciB0byBkb2N1bWVudC5cbiAgLy8gUmVjYWxsIHRoYXQgd2UgZG8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgcHJldmVudERlZmF1bHQsIHsgcGFzc2l2ZTogZmFsc2UgfSlcbiAgLy8gaW4gZGlzYWJsZUJvZHlTY3JvbGwgLSBzbyBpZiB3ZSBwcm92aWRlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gYWxsb3dUb3VjaE1vdmUsIHRoZW5cbiAgLy8gdGhlIHRvdWNobW92ZSBldmVudCBvbiBkb2N1bWVudCB3aWxsIGJyZWFrLlxuICBpZiAoYWxsb3dUb3VjaE1vdmUoZS50YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBEbyBub3QgcHJldmVudCBpZiB0aGUgZXZlbnQgaGFzIG1vcmUgdGhhbiBvbmUgdG91Y2ggKHVzdWFsbHkgbWVhbmluZyB0aGlzIGlzIGEgbXVsdGkgdG91Y2ggZ2VzdHVyZSBsaWtlIHBpbmNoIHRvIHpvb20pLlxuICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVybiB0cnVlO1xuXG4gIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHNldE92ZXJmbG93SGlkZGVuID0gZnVuY3Rpb24gc2V0T3ZlcmZsb3dIaWRkZW4ob3B0aW9ucykge1xuICAvLyBJZiBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgaXMgYWxyZWFkeSBzZXQsIGRvbid0IHNldCBpdCBhZ2Fpbi5cbiAgaWYgKHByZXZpb3VzQm9keVBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIF9yZXNlcnZlU2Nyb2xsQmFyR2FwID0gISFvcHRpb25zICYmIG9wdGlvbnMucmVzZXJ2ZVNjcm9sbEJhckdhcCA9PT0gdHJ1ZTtcbiAgICB2YXIgc2Nyb2xsQmFyR2FwID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoX3Jlc2VydmVTY3JvbGxCYXJHYXAgJiYgc2Nyb2xsQmFyR2FwID4gMCkge1xuICAgICAgdmFyIGNvbXB1dGVkQm9keVBhZGRpbmdSaWdodCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSwgMTApO1xuICAgICAgcHJldmlvdXNCb2R5UGFkZGluZ1JpZ2h0ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICBkb2
10072N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGNvbXB1dGVkQm9keVBhZGRpbmdSaWdodCArIHNjcm9sbEJhckdhcCArICdweCc7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgcHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nIGlzIGFscmVhZHkgc2V0LCBkb24ndCBzZXQgaXQgYWdhaW4uXG4gIGlmIChwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHByZXZpb3VzQm9keU92ZXJmbG93U2V0dGluZyA9IGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9XG59O1xuXG52YXIgcmVzdG9yZU92ZXJmbG93U2V0dGluZyA9IGZ1bmN0aW9uIHJlc3RvcmVPdmVyZmxvd1NldHRpbmcoKSB7XG4gIGlmIChwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcHJldmlvdXNCb2R5UGFkZGluZ1JpZ2h0O1xuXG4gICAgLy8gUmVzdG9yZSBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgdG8gdW5kZWZpbmVkIHNvIHNldE92ZXJmbG93SGlkZGVuIGtub3dzIGl0XG4gICAgLy8gY2FuIGJlIHNldCBhZ2Fpbi5cbiAgICBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAocHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gcHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nO1xuXG4gICAgLy8gUmVzdG9yZSBwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgdG8gdW5kZWZpbmVkXG4gICAgLy8gc28gc2V0T3ZlcmZsb3dIaWRkZW4ga25vd3MgaXQgY2FuIGJlIHNldCBhZ2Fpbi5cbiAgICBwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgPSB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbnZhciBzZXRQb3NpdGlvbkZpeGVkID0gZnVuY3Rpb24gc2V0UG9zaXRpb25GaXhlZCgpIHtcbiAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgIC8vIElmIHByZXZpb3VzQm9keVBvc2l0aW9uIGlzIGFscmVhZHkgc2V0LCBkb24ndCBzZXQgaXQgYWdhaW4uXG4gICAgaWYgKHByZXZpb3VzQm9keVBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZXZpb3VzQm9keVBvc2l0aW9uID0ge1xuICAgICAgICBwb3NpdGlvbjogZG9jdW1lbnQuYm9keS5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgdG9wOiBkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCxcbiAgICAgICAgbGVmdDogZG9jdW1lbnQuYm9keS5zdHlsZS5sZWZ0XG4gICAgICB9O1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRvbSBpbnNpZGUgYW4gYW5pbWF0aW9uIGZyYW1lIFxuICAgICAgdmFyIF93aW5kb3cgPSB3aW5kb3csXG4gICAgICAgICAgc2Nyb2xsWSA9IF93aW5kb3cuc2Nyb2xsWSxcbiAgICAgICAgICBzY3JvbGxYID0gX3dpbmRvdy5zY3JvbGxYLFxuICAgICAgICAgIGlubmVySGVpZ2h0ID0gX3dpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICBkb2
10072N1bWVudC5ib2R5LnN0eWxlLnRvcCA9IC1zY3JvbGxZO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5sZWZ0ID0gLXNjcm9sbFg7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQXR0ZW1wdCB0byBjaGVjayBpZiB0aGUgYm90dG9tIGJhciBhcHBlYXJlZCBkdWUgdG8gdGhlIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgIHZhciBib3R0b21CYXJIZWlnaHQgPSBpbm5lckhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgICBpZiAoYm90dG9tQmFySGVpZ2h0ICYmIHNjcm9sbFkgPj0gaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGNvbnRlbnQgZnVydGhlciB1cCBzbyB0aGF0IHRoZSBib3R0b20gYmFyIGRvZXNuJ3QgaGlkZSBpdFxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3AgPSAtKHNjcm9sbFkgKyBib3R0b21CYXJIZWlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgcmVzdG9yZVBvc2l0aW9uU2V0dGluZyA9IGZ1bmN0aW9uIHJlc3RvcmVQb3NpdGlvblNldHRpbmcoKSB7XG4gIGlmIChwcmV2aW91c0JvZHlQb3NpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQ29udmVydCB0aGUgcG9zaXRpb24gZnJvbSBcInB4XCIgdG8gSW50XG4gICAgdmFyIHkgPSAtcGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsIDEwKTtcbiAgICB2YXIgeCA9IC1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLmxlZnQsIDEwKTtcblxuICAgIC8vIFJlc3RvcmUgc3R5bGVzXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wb3NpdGlvbiA9IHByZXZpb3VzQm9keVBvc2l0aW9uLnBvc2l0aW9uO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudG9wID0gcHJldmlvdXNCb2R5UG9zaXRpb24udG9wO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubGVmdCA9IHByZXZpb3VzQm9keVBvc2l0aW9uLmxlZnQ7XG5cbiAgICAvLyBSZXN0b3JlIHNjcm9sbFxuICAgIHdpbmRvdy5zY3JvbGxUbyh4LCB5KTtcblxuICAgIHByZXZpb3VzQm9keVBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9zY3JvbGxIZWlnaHQjUHJvYmxlbXNfYW5kX3NvbHV0aW9uc1xudmFyIGlzVGFyZ2V0RWxlbWVudFRvdGFsbHlTY3JvbGxlZCA9IGZ1bmN0aW9uIGlzVGFyZ2V0RWxlbWVudFRvdGFsbHlTY3JvbGxlZCh0YXJnZXRFbGVtZW50KSB7XG4gIHJldHVybiB0YXJnZXRFbGVtZW50ID8gdGFyZ2V0RWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0YXJnZXRFbGVtZW50LnNjcm9sbFRvcCA8PSB0YXJnZXRFbGVtZW50LmNsaWVudEhlaWdodCA6IGZhbHNlO1xufTtcblxudmFyIGhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uIGhhbmRsZVNjcm9sbChldmVudCwgdGFyZ2V0RWxlbWVudCkge1xuICB2YXIgY2xpZW50WSA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSAtIGluaXRpYWxDbGllbnRZO1xuXG4gIGlmIChhbGxvd1RvdWNoTW92ZShldmVudC50YXJnZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudC5zY3JvbGxUb3AgPT09IDAgJiYgY2xpZW50WSA+IDApIHtcbiAgICAvLyBlbGVtZW50IGlzIGF0IHRoZSB0b3Agb2YgaXRzIHNjcm9sbC5cbiAgICByZXR1cm4gcHJldmVudERlZmF1bHQoZXZlbnQpO1xuICB9XG5cbiAgaWYgKGlzVGFyZ2V0RWxlbWVudFRvdGFsbHlTY3JvbGxlZCh0YXJnZXRFbGVtZW50KSAmJiBjbGllbnRZIDwgMCkge1xuICAgIC8vIGVsZW1lbnQgaXMgYXQgdGhlIGJvdHRvbSBvZiBpdHMgc2Nyb2xsLlxuICAgIHJldHVybiBwcmV2ZW50RGVmYXVsdChldmVudCk7XG4gIH1cblxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgdmFyIGRpc2FibGVCb2R5U2Nyb2xsID0gZnVuY3Rpb24gZGlzYWJsZUJvZHlTY3JvbGwodGFyZ2V0RWxlbWVudCwgb3B0aW9ucykge1xuICAvLyB0YXJnZXRFbGVtZW50IG11c3QgYmUgcHJvdmlkZWRcbiAgaWYgKCF0YXJnZXRFbGVtZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKCdkaXNhYmxlQm9keVNjcm9sbCB1bnN1Y2Nlc3NmdWwgLSB0YXJnZXRFbGVtZW50IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVCb2R5U2Nyb2xsIG9uIElPUyBkZXZpY2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGRpc2FibGVCb2R5U2Nyb2xsIG11c3Qgbm90IGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyB0YXJnZXRFbGVtZW50IGJlZm9yZVxuICBpZiAobG9ja3Muc29tZShmdW5jdGlvbiAobG9jaykge1xuICAgIHJldHVybiBsb2NrLnRhcmdldEVsZW1lbnQgPT09IHRhcmdldEVsZW1lbnQ7XG4gIH0pKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxvY2sgPSB7XG4gICAgdGFyZ2V0RWxlbWVudDogdGFyZ2V0RWxlbWVudCxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gIH07XG5cbiAgbG9ja3MgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxvY2tzKSwgW2xvY2tdKTtcblxuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICBzZXRQb3NpdGlvbkZpeGVkKCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T3ZlcmZsb3dIaWRkZW4ob3B0aW9ucyk7XG4gIH1cblxuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICB0YXJnZXRFbGVtZW50Lm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIGRldGVjdCBzaW5nbGUgdG91Y2guXG4gICAgICAgIGluaXRpYWxDbGllbnRZID0gZXZlbnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuICAgIH07XG4gICAgdGFyZ2V0RWxlbWVudC5vbnRvdWNobW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIGRldGVjdCBzaW5nbGUgdG91Y2guXG4gICAgICAgIGhhbmRsZVNjcm9sbChldmVudCwgdGFyZ2V0RWxlbWVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghZG9jdW1lbnRMaXN0ZW5lckFkZGVkKSB7XG4gICAgICBkb2
10072N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBwcmV2ZW50RGVmYXVsdCwgaGFzUGFzc2l2ZUV2ZW50cyA/IHsgcGFzc2l2ZTogZmFsc2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgICBkb2N1bWVudExpc3RlbmVyQWRkZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IHZhciBjbGVhckFsbEJvZHlTY3JvbGxMb2NrcyA9IGZ1bmN0aW9uIGNsZWFyQWxsQm9keVNjcm9sbExvY2tzKCkge1xuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICAvLyBDbGVhciBhbGwgbG9ja3Mgb250b3VjaHN0YXJ0L29udG91Y2htb3ZlIGhhbmRsZXJzLCBhbmQgdGhlIHJlZmVyZW5jZXMuXG4gICAgbG9ja3MuZm9yRWFjaChmdW5jdGlvbiAobG9jaykge1xuICAgICAgbG9jay50YXJnZXRFbGVtZW50Lm9udG91Y2hzdGFydCA9IG51bGw7XG4gICAgICBsb2NrLnRhcmdldEVsZW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgaWYgKGRvY3VtZW50TGlzdGVuZXJBZGRlZCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgcHJldmVudERlZmF1bHQsIGhhc1Bhc3NpdmVFdmVudHMgPyB7IHBhc3NpdmU6IGZhbHNlIH0gOiB1bmRlZmluZWQpO1xuICAgICAgZG9jdW1lbnRMaXN0ZW5lckFkZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgaW5pdGlhbCBjbGllbnRZLlxuICAgIGluaXRpYWxDbGllbnRZID0gLTE7XG4gIH1cblxuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICByZXN0b3JlUG9zaXRpb25TZXR0aW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZU92ZXJmbG93U2V0dGluZygpO1xuICB9XG5cbiAgbG9ja3MgPSBbXTtcbn07XG5cbmV4cG9ydCB2YXIgZW5hYmxlQm9keVNjcm9sbCA9IGZ1bmN0aW9uIGVuYWJsZUJvZHlTY3JvbGwodGFyZ2V0RWxlbWVudCkge1xuICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoJ2VuYWJsZUJvZHlTY3JvbGwgdW5zdWNjZXNzZnVsIC0gdGFyZ2V0RWxlbWVudCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gY2FsbGluZyBlbmFibGVCb2R5U2Nyb2xsIG9uIElPUyBkZXZpY2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvY2tzID0gbG9ja3MuZmlsdGVyKGZ1bmN0aW9uIChsb2NrKSB7XG4gICAgcmV0dXJuIGxvY2sudGFyZ2V0RWxlbWVudCAhPT0gdGFyZ2V0RWxlbWVudDtcbiAgfSk7XG5cbiAgaWYgKGlzSW9zRGV2aWNlKSB7XG4gICAgdGFyZ2V0RWxlbWVudC5vbnRvdWNoc3RhcnQgPSBudWxsO1xuICAgIHRhcmdldEVsZW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xuXG4gICAgaWYgKGRvY3VtZW50TGlzdGVuZXJBZGRlZCAmJiBsb2Nrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHByZXZlbnREZWZhdWx0LCBoYXNQYXNzaXZlRXZlbnRzID8geyBwYXNzaXZlOiBmYWxzZSB9IDogdW5kZWZpbmVkKTtcbiAgICAgIGRvY3VtZW50TGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0lvc0RldmljZSkge1xuICAgIHJlc3RvcmVQb3NpdGlvblNldHRpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlT3ZlcmZsb3dTZXR0aW5nKCk7XG4gIH1cbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGVcclxuICogQHZlcnNpb24gMy4xLjBcclxuICogQGF1dGhvciBPbGVnIER1dGNoZW5rbyA8ZHV0Y2hlbmtvLm8uZGV2QGdtYWlsLmNvbT5cclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93ZXpvbWFnZW5jeS5naXRodWIuaW8vYnJvd3Nlcml6ci99XHJcbiAqIEBsaWNlbmNlIE1JVFxyXG4gKi9cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXJldHVybi1hc3NpZ24gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gUHVibGljXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmNvbnN0IEJyb3dzZXJpenIgPSAoZnVuY3Rpb24gKHdpbmRvdywgbmF2aWdhdG9yLCBzY3JlZW4pIHtcclxuICBsZXQgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50XHJcbiAgbGV0IHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtXHJcbiAgbGV0IHdpZHRoID0gc2NyZWVuLndpZHRoXHJcbiAgbGV0IGhlaWdodCA9IHNjcmVlbi5oZWlnaHRcclxuICBpZiAod2lkdGggPiBoZWlnaHQpIHtcclxuICAgIGxldCB0ZW1wID0gaGVpZ2h0XHJcbiAgICBoZWlnaHQgPSB3aWR0aFxyXG4gICAgd2lkdGggPSB0ZW1wXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKi9cclxuICBmdW5jdGlvbiBCcm93c2VyaXpyICgpIHt9XHJcblxyXG4gIGxldCBpc0FuZHJvaWQgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzQW5kcm9pZCA9PT0gbnVsbCA/IChpc0FuZHJvaWQgPSAvYW5kcm9pZC9pLnRlc3QodWEpKSA6IGlzQW5kcm9pZFxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDMgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkMyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQzID09PSBudWxsID8gKGlzQW5kcm9pZDMgPSAvYW5kcm9pZCAzL2kudGVzdCh1YSkpIDogaXNBbmRyb2lkM1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDQgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ0ID09PSBudWxsID8gKGlzQW5kcm9pZDQgPSAvYW5kcm9pZCA0L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkNFxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDUgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybi
10072Bpc0FuZHJvaWQ1ID09PSBudWxsID8gKGlzQW5kcm9pZDUgPSAvYW5kcm9pZCA1L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkNVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDYgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ2ID09PSBudWxsID8gKGlzQW5kcm9pZDYgPSAvYW5kcm9pZCA2L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkNlxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDcgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ3ID09PSBudWxsID8gKGlzQW5kcm9pZDcgPSAvYW5kcm9pZCA3L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkN1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDggPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkOCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ4ID09PSBudWxsID8gKGlzQW5kcm9pZDggPSAvYW5kcm9pZCA4L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkOFxyXG4gIH1cclxuXHJcbiAgbGV0IGlzTWVpenVQaG9uZSA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc01laXp1UGhvbmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNNZWl6dVBob25lID09PSBudWxsID8gKGlzTWVpenVQaG9uZSA9IC9BbmRyb2lkXFxzLipNWigtKT8vaS50ZXN0KHVhKSkgOiBpc01laXp1UGhvbmVcclxuICB9XHJcblxyXG4gIGxldCBpc01laXp1Tm90ZVBob25lID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzTWVpenVOb3RlUGhvbmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNNZWl6dU5vdGVQaG9uZSA9PT0gbnVsbCA/IChpc01laXp1Tm90ZVBob25lID0gL0FuZHJvaWRcXHMuKk1aKC0pPy4qXFxzbm90ZVxccy9pLnRlc3QodWEpKSA6IGlzTWVpenVOb3RlUGhvbmVcclxuICB9XHJcblxyXG4gIGxldCBpc1JlZG1pUGhvbmUgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNSZWRtaVBob25lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzUmVkbWlQaG9uZSA9PT0gbnVsbCA/IChpc1JlZG1pUGhvbmUgPSAvQW5kcm9pZFxccy4qUmVkbWlcXHMvaS50ZXN0KHVhKSkgOiBpc1JlZG1pUGhvbmVcclxuICB9XHJcblxyXG4gIGxldCBpc1JlZG1pTm90ZVBob25lID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzUmVkbWlOb3RlUGhvbmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNSZWRtaU5vdGVQaG9uZSA9PT0gbnVsbCA/IChpc1JlZG1pTm90ZVBob25lID0gL0FuZHJvaWRcXHMuKlJlZG1pLipcXHNOb3RlXFxzL2kudGVzdCh1YSkpIDogaXNSZWRtaU5vdGVQaG9uZVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzSVBhZCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNJUGFkID09PSBudWxsID8gKGlzSVBhZCA9IC9pUGFkL2kudGVzdCh1YSkpIDogaXNJUGFkXHJcbiAgfVxyXG5cclxuICBsZXQgaXNJUG9kID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSVBvZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lQb2QgPT09IG51bGwgPyAoaXNJUG9kID0gL2lQb2QvaS50ZXN0KHVhKSkgOiBpc0lQb2RcclxuICB9XHJcblxyXG4gIGxldCBpc0lQaG9uZSA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQaG9uZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lQaG9uZSA9PT0gbnVsbCA/IChpc0lQaG9uZSA9IC9pUGhvbmUvaS50ZXN0KHVhKSkgOiBpc0lQaG9uZVxyXG4gIH1cclxuXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJUGhvbmU0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNJUGhvbmUoKSAmJiB3aWR0aCA9PT0gMzIwICYmIGhlaWdodCA9PT0gNDgwXHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQaG9uZTUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0lQaG9uZSgpICYmIHdpZHRoID09PSAzMjAgJiYgaGVpZ2h0ID09PSA1NjhcclxuICB9XHJcblxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSVBob25lNjc4ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNJUGhvbmUoKSAmJiB3aWR0aCA9PT0gMzc1ICYmIGhlaWdodCA9PT0gNjY3XHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQaG9uZTY3OHBsdXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0lQaG9uZSgpICYmIHdpZHRoID09PSA0MTQgJiYgaGVpZ2h0ID09PSA3MzZcclxuICB9XHJcblxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSVBob25lWCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLmlzSVBob25lKCkgJiYgd2lkdGggPT09IDM3NSAmJiBoZWlnaHQgPT09IDgxMlxyXG4gIH1cclxuXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJT1MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0lQYWQoKSB8fCB0aGlzLmlzSVBvZCgpIHx8IHRoaXMuaXNJUGhvbmUoKVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzTWFjID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzTWFjID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzTWFjID09PSBudWxsID8gKGlzTWFjID0gL01hYy8udGVzdChwbGF0Zm9ybSkpIDogaXNNYWNcclxuICB9XHJcblxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzTWFjTGlrZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybi
10072B0aGlzLmlzTWFjKCkgfHwgdGhpcy5pc0lPUygpXHJcbiAgfVxyXG5cclxuICBsZXQgaXNCbGFja0JlcnJ5ID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzQmxhY2tCZXJyeSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0JsYWNrQmVycnkgPT09IG51bGwgPyAoaXNCbGFja0JlcnJ5ID0gL0JsYWNrQmVycnkvaS50ZXN0KHVhKSkgOiBpc0JsYWNrQmVycnlcclxuICB9XHJcblxyXG4gIGxldCBpc0JsYWNrQmVycnkxMCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0JsYWNrQmVycnkxMCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0JsYWNrQmVycnkxMCA9PT0gbnVsbCA/IChpc0JsYWNrQmVycnkxMCA9IC9CQjEwOy9pLnRlc3QodWEpKSA6IGlzQmxhY2tCZXJyeTEwXHJcbiAgfVxyXG5cclxuICBsZXQgaXNNb3ogPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNNb3ogPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNNb3ogPT09IG51bGwgPyAoaXNNb3ogPSAvIEZpcmVmb3hcXC8vaS50ZXN0KHVhKSkgOiBpc01velxyXG4gIH1cclxuXHJcbiAgbGV0IGlzT3BlcmEgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNPcGVyYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc09wZXJhID09PSBudWxsID8gKGlzT3BlcmEgPSAvT3BlcmF8T1BSXFwvL2kudGVzdCh1YSkpIDogaXNPcGVyYVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzU2FmYXJpID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzU2FmYXJpID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzU2FmYXJpID09PSBudWxsID8gKGlzU2FmYXJpID0gKC8gU2FmYXJpXFwvXFxkLy50ZXN0KHVhKSAmJiAhLyBDaHJvbWVcXC9cXGQvLnRlc3QodWEpKSkgOiBpc1NhZmFyaVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQ2hyb21lID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzQ2hyb21lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKGlzQ2hyb21lID09PSBudWxsKSB7XHJcbiAgICAgIGlzQ2hyb21lID0gKFxyXG4gICAgICAgIC8gQ2hyb21lXFwvXFxkL2kudGVzdCh1YSkgJiZcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdGhpcy5pc09wZXJhKCkgfHxcclxuICAgICAgICAgIHRoaXMuaXNTYWZhcmkoKSB8fFxyXG4gICAgICAgICAgdGhpcy5pc0VkZ2UoKSB8fFxyXG4gICAgICAgICAgdGhpcy5pc0VkZ2VJT1MoKSB8fFxyXG4gICAgICAgICAgdGhpcy5pc0VkZ2VBbmRyb2lkKClcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgIH1cclxuICAgIHJldHVybiBpc0Nocm9tZVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzSUUgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJRSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lFID09PSBudWxsID8gKGlzSUUgPSAvKE1TSUV8VHJpZGVudCkvaS50ZXN0KHVhKSkgOiBpc0lFXHJcbiAgfVxyXG5cclxuICBsZXQgaXNJRTggPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJRTggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNJRTggPT09IG51bGwgPyAoaXNJRTggPSAvTVNJRSA4XFwuXFxkL2kudGVzdCh1YSkpIDogaXNJRThcclxuICB9XHJcblxyXG4gIGxldCBpc0lFOSA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lFOSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lFOSA9PT0gbnVsbCA/IChpc0lFOSA9IC9NU0lFIDlcXC5cXGQvaS50ZXN0KHVhKSkgOiBpc0lFOVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzSUUxMCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lFMTAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNJRTEwID09PSBudWxsID8gKGlzSUUxMCA9IC9NU0lFIDEwXFwuXFxkL2kudGVzdCh1YSkpIDogaXNJRTEwXHJcbiAgfVxyXG5cclxuICBsZXQgaXNJRTExID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSUUxMSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lFMTEgPT09IG51bGwgPyAoaXNJRTExID0gL1RyaWRlbnQuKnJ2WyA6XSoxMVxcLi8udGVzdCh1YSkpIDogaXNJRTExXHJcbiAgfVxyXG5cclxuICBsZXQgaXNFZGdlID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzRWRnZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0VkZ2UgPT09IG51bGwgPyAoaXNFZGdlID0gLyBFZGdlXFwvXFxkL2kudGVzdCh1YSkpIDogaXNFZGdlXHJcbiAgfVxyXG5cclxuICBsZXQgaXNFZGdlSU9TID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzRWRnZUlPUyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0VkZ2VJT1MgPT09IG51bGwgPyAoaXNFZGdlSU9TID0gL1xcc0VkZ2lPU1xcLy9pLnRlc3QodWEpKSA6IGlzRWRnZUlPU1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzRWRnZUFuZHJvaWQgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNFZGdlQW5kcm9pZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0VkZ2VBbmRyb2lkID09PSBudWxsID8gKGlzRWRnZUFuZHJvaWQgPSAvXFxzRWRnQVxcLy9pLnRlc3QodWEpKSA6IGlzRWRnZUFuZHJvaWRcclxuICB9XHJcblxyXG4gIGxldCBpc1dpbmRvd3NQaG9uZSA9IG51bGxcclxuICAvKiogQHJldHVybi
10072B7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc1dpbmRvd3NQaG9uZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc1dpbmRvd3NQaG9uZSA9PT0gbnVsbCA/IChpc1dpbmRvd3NQaG9uZSA9IC9XaW5kb3dzXFxzUGhvbmUvaS50ZXN0KHVhKSkgOiBpc1dpbmRvd3NQaG9uZVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzV2luZG93cyA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc1dpbmRvd3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzID09PSBudWxsID8gKGlzV2luZG93cyA9IC9ed2luL2kudGVzdChwbGF0Zm9ybSkpIDogaXNXaW5kb3dzXHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzWFAgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzWFAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzWFAgPT09IG51bGwgPyAoaXNXaW5kb3dzWFAgPSAvd2luZG93cyBudCA1XFwuMS9pLnRlc3QodWEpKSA6IGlzV2luZG93c1hQXHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzVmlzdGEgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzVmlzdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzVmlzdGEgPT09IG51bGwgPyAoaXNXaW5kb3dzVmlzdGEgPSAvd2luZG93cyBudCA2XFwuMC9pLnRlc3QodWEpKSA6IGlzV2luZG93c1Zpc3RhXHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzNyA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc1dpbmRvd3M3ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzV2luZG93czcgPT09IG51bGwgPyAoaXNXaW5kb3dzNyA9IC93aW5kb3dzIG50IDZcXC4xL2kudGVzdCh1YSkpIDogaXNXaW5kb3dzN1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzV2luZG93czggPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzOCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc1dpbmRvd3M4ID09PSBudWxsID8gKGlzV2luZG93czggPSAvd2luZG93cyBudCA2XFwuWzJ8M10vaS50ZXN0KHVhKSkgOiBpc1dpbmRvd3M4XHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzMTAgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzMTAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzMTAgPT09IG51bGwgPyAoaXNXaW5kb3dzMTAgPSAvd2luZG93cyBudCAxMC9pLnRlc3QodWEpKSA6IGlzV2luZG93czEwXHJcbiAgfVxyXG5cclxuICBsZXQgaXNMaW51eCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0xpbnV4ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzTGludXggPT09IG51bGwgPyAoaXNMaW51eCA9IC9ebGludXgvaS50ZXN0KHBsYXRmb3JtKSkgOiBpc0xpbnV4XHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc01vYmlsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuaXNJT1MoKSB8fFxyXG4gICAgICB0aGlzLmlzQW5kcm9pZCgpIHx8XHJcbiAgICAgIHRoaXMuaXNFZGdlSU9TKCkgfHxcclxuICAgICAgdGhpcy5pc0VkZ2VBbmRyb2lkKCkgfHxcclxuICAgICAgdGhpcy5pc1dpbmRvd3NQaG9uZSgpIHx8XHJcbiAgICAgIHRoaXMuaXNCbGFja0JlcnJ5KCkgfHxcclxuICAgICAgdGhpcy5pc0JsYWNrQmVycnkxMCgpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0Rlc2t0b3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNNb2JpbGUoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGVzdHNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXNzUHJlZml4PVwiXCJdXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9TdHJpbmc9dHJ1ZV1cclxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX1cclxuICAgKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5jc3NDbGFzc2VzID0gZnVuY3Rpb24gKHRlc3RzLCBjbGFzc1ByZWZpeCkge1xyXG4gICAgY2xhc3NQcmVmaXggPSBjbGFzc1ByZWZpeCB8fCAnJ1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IFtdXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSB0ZXN0c1tpXVxyXG4gICAgICBjb25zdCBtZXRob2QgPSAnaXMnICsga2V5XHJcbiAgICAgIGlmICh0aGlzW21ldGhvZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbbWV0aG9kXSgpXHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gcmVzdWx0ID8gcHJlZml4SXMgOiBwcmVmaXhJc05vdFxyXG4gICAgICAgIGNsYXNzZXMucHVzaChjbGFzc1ByZWZpeCArIHByZWZpeCArIGtleS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQnJvd3Nlcml6ciBoYXMgbm8gdGhlIHRlc3QgXCInICsgbWV0aG9kICsgJygpXCInKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzZXNcclxuICB9XHJcblxyXG4gIGxldCBpbnN0YW5jZSA9IG51bGxcclxuICBsZXQgcHJlZml4SXMgPSAnaXMtJ1xyXG4gIGxldCBwcmVmaXhJc05vdCA9ICdpcy1ub3QtJ1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKiBAcmV0dXJuIHtCcm93c2VyaXpyfVxyXG4gICAgICovXHJcbiAgICBkZXRlY3QgKCkge1xyXG4gICAgICByZXR1cm4gaW5zdGFuY2UgPT09IG51bGwgPyAoaW5zdGFuY2UgPSBuZXcgQnJvd3Nlcml6cigpKSA6IGluc3RhbmNlXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIGdldCBwcmVmaXhJcyAoKSB7XHJcbiAgICAgIHJldHVybi
10072BwcmVmaXhJc1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBzZXQgcHJlZml4SXMgKHZhbHVlKSB7XHJcbiAgICAgIHByZWZpeElzID0gdmFsdWVcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgZ2V0IHByZWZpeElzTm90ICgpIHtcclxuICAgICAgcmV0dXJuIHByZWZpeElzTm90XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHNldCBwcmVmaXhJc05vdCAodmFsdWUpIHtcclxuICAgICAgcHJlZml4SXNOb3QgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxufSkod2luZG93LCB3aW5kb3cubmF2aWdhdG9yLCB3aW5kb3cuc2NyZWVuKVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBFeHBvcnRzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXJpenJcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0aW5nIHRpbWVycyB3aXRoIGludGVybmFsIGNsb3N1cmVcclxuICogQG1vZHVsZVxyXG4gKiBAZXhhbXBsZVxyXG5pbXBvcnQgY3JlYXRlVGltZXIgZnJvbSAnY3JlYXRlLXRpbWVyJztcclxuXHJcbmNvbnN0IHRpbWVyID0gY3JlYXRlVGltZXIoNTAwKTtcclxuJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aW1lcigoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2RvbmUnKTtcclxuICAgIH0pO1xyXG59KTtcclxuXHJcbnRpbWVyKCgpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKCdqdXN0IHRlc3QnKTtcclxufSwgMzAwKTtcclxuXHJcbi8vIC4uLmNsZWFyIHRpbWVyIGlmIG5lZWRcclxudGltZXIuY2xlYXIoKTtcclxuICovXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFB1YmxpY1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSB0aW1lclxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2RlZmF1bHREZWxheT0zMDBdXHJcbiAqIEByZXR1cm4ge3RpbWVyfVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlVGltZXIgKGRlZmF1bHREZWxheSA9IDMwMCkge1xyXG5cdGxldCB0aW1lb3V0SWQgPSBudWxsO1xyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7dGltZXJ9XHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5PWRlZmF1bHREZWxheV1cclxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSB0aW1lb3V0SWRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB0aW1lciAoZm4sIGRlbGF5ID0gZGVmYXVsdERlbGF5KSB7XHJcblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XHJcblx0XHR0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChmbiwgZGVsYXkpO1xyXG5cdFx0cmV0dXJuIHRpbWVvdXRJZDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNsZWFyIGN1cnJlbnQgdGltZW91dFxyXG5cdCAqIEBtZXRob2RPZiB0aW1lclxyXG5cdCAqIEByZXR1cm5zIHZvaWRcclxuXHQgKi9cclxuXHR0aW1lci5jbGVhciA9ICgpID0+IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkKTtcclxuXHJcblx0cmV0dXJuIHRpbWVyO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEV4cG9ydHNcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlVGltZXI7XHJcbiIsIihmdW5jdGlvbiAoKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cdC8qKlxyXG5cdCAqIEFkZCBjbGFzc05hbWUgaWYgcHJldmlvdXNseSB3YXMgcmVtb3ZlZC5cclxuXHQgKiBSZW1vdmUgY2xhc3NOYW1lIGlmIHByZXZpb3VzbHkgd2FzIGFkZGVkXHJcblx0ICpcclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIGZ1bmN0aW9uIHNob3dTZWN0aW9uICgkc2VjdGlvbiwgJGZyb250aWVyKSB7XHJcblx0ICogICAgIGNvbnN0ICR3aW5kb3cgPSAkKHdpbmRvdyk7XHJcblx0ICogICAgIGxldCBwcmV2aW91c2x5QWRkZWQgPSAkc2VjdGlvbi5oYXNDbGFzcygnc2hvdycpOyAvLyA8LS1cclxuXHQgKiAgICAgJHdpbmRvdy5vbignc2Nyb2xsJywgKCkgPT4ge1xyXG5cdCAqICAgICAgICAgY29uc3QgdG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcclxuXHQgKiAgICAgICAgIGNvbnN0IGhlaWdodCA9ICRmcm9udGllci5vZmZzZXQoKS50b3AgKyAkZnJvbnRpZXIub3V0ZXJIZWlnaHQoKTtcclxuXHQgKiAgICAgICAgIHByZXZpb3VzbHlBZGRlZCA9ICRzZWN0aW9uLmNoYW5nZU15Q2xhc3ModG9wID4gaGVpZ2h0LCBwcmV2aW91c2x5QWRkZWQsICdzaG93Jyk7ICAvLyA8LS1cclxuXHQgKiAgICAgfSk7XHJcblx0ICogfVxyXG5cdCAqXHJcblx0ICogQG5hbWUgY2hhbmdlTXlDbGFzc1xyXG5cdCAqIEB0aGlzIGpRdWVyeVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZFRvQWRkXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBwcmV2aW91c2x5QWRkZWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXXxmdW5jdGlvbn0gY2xhc3NOYW1lXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gW29uQ2hhbmdlXVxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBjbGFzc05hbWUgd2FzIGFkZGVkIG9yIG5vdFxyXG5cdCAqIEBzb3VyY2VDb2RlXHJcblx0ICovXHJcblx0alF1ZXJ5LmZuLmNoYW5nZU15Q2xhc3MgPSBmdW5jdGlvbiAobmVlZFRvQWRkLCBwcmV2aW91c2x5QWRkZWQsIGNsYXNzTmFtZSwgb25DaGFuZ2UpIHtcclxuXHRcdGNvbnN0IGNoYW5nZUNsYXNzID0gbmVlZFRvQWRkXHJcblx0XHRcdD8gKHByZXZpb3VzbHlBZGRlZCA/IGZhbHNlIDogJ2FkZENsYXNzJylcclxuXHRcdFx0OiAocHJldmlvdXNseUFkZGVkID8gJ3JlbW92ZUNsYXNzJyA6IGZhbHNlKTtcclxuXHRcdGlmIChjaGFuZ2VDbGFzcykge1xyXG5cdFx0XHRwcmV2aW91c2x5QWRkZWQgPSBjaGFuZ2VDbGFzcyA9PT0gJ2FkZENsYXNzJztcclxuXHRcdFx0dGhpc1tjaGFuZ2VDbGFzc10oY2xhc3NOYW1lKTtcclxuXHRcdFx0aWYgKHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdG9uQ2hhbmdlKHByZXZpb3VzbHlBZGRlZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybi
10072BwcmV2aW91c2x5QWRkZWQ7XHJcblx0fTtcclxufSkoKTtcclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblx0LyoqXHJcblx0ICogU2VhcmNoIG9uIHRoZSBwYWdlIG9yIHJldHJpZXZlIGZyb20gdGhlIGRhdGUgb2YgdGhlIGRlc2lyZWQgaXRlbS5cclxuXHQgKlxyXG5cdCAqIEZpcnN0LCBsb29rIGF0IHRoZSBkYXRlIG9iamVjdCBvbiBhIGNlcnRhaW4gcHJvcGVydHkuXHJcblx0ICogSWYgaXQgaXMgZW1wdHkgLSBsb29rIGZvciB0aGUgZWxlbWVudCBvbiB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXHJcblx0ICogV2hlbiBmb3VuZCwgd3JpdGUgaXQgaW4gdGhlIGRhdGUgb2JqZWN0IHRvXHJcblx0ICogYXQgc3Vic2VxdWVudCBjYWxscyAtIHdlIGdldCBmcm9tIHRoZSBkYXRlLCBmYXN0ZXIgYW5kIHdpdGhvdXQgc2VhcmNoaW5nLlxyXG5cdCAqXHJcblx0ICogX19fISEhIElmIGNhbGxlZCBlbGVtZW50IG1vcmUgdGhlbiBvbmUsX19fXHJcblx0ICogX19fdGhlbiB0aGUgbWV0aG9kIGlzIHBlcmZvcm1lZCBvbmx5IGZvciB0aGUgZmlyc3RfX19cclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlIDxjYXB0aW9uPkZpbmQgLyByZXRyaWV2ZSBuZXN0ZWQgaXRlbXM8L2NhcHRpb24+XHJcblx0ICogbGV0ICRlbHMgPSAkKCcud3JhcHBlcicpLmdldE15RWxlbWVudHMoJyRteUVscycsICcuZWxzLXNlbGVjdG9yJywgJ2ZpbmQnKTtcclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlIDxjYXB0aW9uPkZpbmQgLyByZXRyaWV2ZSBuZXN0ZWQgaXRlbXMgb25seSBpbiBjb250ZXh0IGJsb2NrPC9jYXB0aW9uPlxyXG5cdCAqIGxldCAkY29udGV4dCA9ICQoJy5kZW1vJyk7XHJcblx0ICogbGV0ICRlbHMgPSAkKCcud3JhcHBlcicpLmdldE15RWxlbWVudHMoJyRteUVscycsICcuZWxzLXNlbGVjdG9yJywgJGNvbnRleHQpO1xyXG5cdCAqXHJcblx0ICogQGV4YW1wbGUgPGNhcHRpb24+RmluZGluZyAvIGdldHRpbmcgdGhlIHBhcmVudCBlbGVtZW50PC9jYXB0aW9uPlxyXG5cdCAqIGxldCAkd3JhcHBlciA9ICQoJy5lbHMnKS5nZXRNeUVsZW1lbnRzKCckbXlXcmFwcGVyJywgJy53cmFwcGVyLXNlbGVjdG9yJywgJ2Nsb3Nlc3QnKTtcclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlIDxjYXB0aW9uPlNlYXJjaCAvIHJldHJpZXZlIHNpbWlsYXIgaXRlbXMgZXhjZXB0IGZvciB0aGUgY3VycmVudCBvbmU8L2NhcHRpb24+XHJcblx0ICogbGV0ICRzYW1lRWxzID0gJCgnLmVscycpLmdldE15RWxlbWVudHMoJyRteVNhbWVFbHMnLCAnLmVscycsICdkb2N1bWVudCcsIHRydWUpO1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGFLZXkgLSB0aGUgcHJvcGVydHkga2V5IGZyb20gdGhlIGRhdGEgb2JqZWN0IG9mIHRoZSBlbGVtZW50XHJcblx0ICogQHBhcmFtIHtKUXVlcnkuU2VsZWN0b3J9IHNlbGVjdG9yIC0gc2VhcmNoIHNlbGVjdG9yXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8SlF1ZXJ5fSBbZGlyZWN0aW9uPVwiZG9jdW1lbnRcIl0gLSBkaXJlY3Rpb24gd2hlcmUgdG8gbG9vayBmb3IgLSBgW2Nsb3Nlc3QsIHBhcmVudCwgY2hpbGRyZW4sIGZpbmQsIHByZXYsIG5leHQsIHNpYmxpbmdzXWAsIG9yIGNhbiBiZSBqUXVlcnkgZWxlbWVudCBmb3IgZmluZCBzZWxlY3RvciBpbnNpZGVcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3RTZWxmXSAtIGlnbm9yZSB0aGUgY3VycmVudCBlbGVtZW50LCB3aGVuIHNlYXJjaGluZyBmb3IgZWxlbWVudHMsIGZvciBleGFtcGxlIGluIGBkb2N1bWVudGAgdXNpbmcgdGhlIHNhbWUgc2VsZWN0b3IgYXMgdGhlIGN1cnJlbnQgZWxlbWVudFxyXG5cdCAqXHJcblx0ICogQG5hbWUgZ2V0TXlFbGVtZW50c1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhS2V5XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8alF1ZXJ5fSBbZGlyZWN0aW9uPSdkb2N1bWVudCddXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0aW9uPSdkb2N1bWVudCddXHJcblx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdCAqIEBzb3VyY2VDb2RlXHJcblx0ICovXHJcblx0alF1ZXJ5LmZuLmdldE15RWxlbWVudHMgPSBmdW5jdGlvbiAoZGF0YUtleSwgc2VsZWN0b3IsIGRpcmVjdGlvbiA9ICdkb2N1bWVudCcsIG5vdFNlbGYpIHtcclxuXHRcdC8qKiBAdHlwZSB7alF1ZXJ5fSAqL1xyXG5cdFx0Y29uc3QgJGVsZW1lbnQgPSB0aGlzLmVxKDApO1xyXG5cdFx0Y29uc3Qga2V5SXNTZWxlY3RvciA9ICh0eXBlb2YgZGF0YUtleSA9PT0gJ3N0cmluZycpO1xyXG5cdFx0bGV0ICR0YXJnZXQgPSBrZXlJc1NlbGVjdG9yID8gJGVsZW1lbnQuZGF0YShkYXRhS2V5KSA6IG51bGw7XHJcblxyXG5cdFx0aWYgKCEkdGFyZ2V0KSB7XHJcblx0XHRcdGlmIChkaXJlY3Rpb24gPT09ICdkb2N1bWVudCcgfHwgKGRpcmVjdGlvbiAmJiBkaXJlY3Rpb24uanF1ZXJ5KSkge1xyXG5cdFx0XHRcdGlmIChkaXJlY3Rpb24uanF1ZXJ5KSB7XHJcblx0XHRcdFx0XHQkdGFyZ2V0ID0gZGlyZWN0aW9uLmZpbmQoc2VsZWN0b3IpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQkdGFyZ2V0ID0galF1ZXJ5KHNlbGVjdG9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCR0YXJnZXQubGVuZ3RoICYmIG5vdFNlbGYpIHtcclxuXHRcdFx0XHRcdCR0YXJnZXQgPSAkdGFyZ2V0Lm5vdCgkZWxlbWVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCR0YXJnZXQgPSAkZWxlbWVudFtkaXJlY3Rpb25dKHNlbGVjdG9yKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQkZWxlbWVudC5kYXRhKGRhdGFLZXksICR0YXJnZXQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghJHRhcmdldC5sZW5ndGgpIHtcclxuXHRcdFx0JGVsZW1lbnQuZGF0YShkYXRhS2V5LCBudWxsKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJHRhcmdldDtcclxuXHR9O1xyXG59KSgpO1xyXG4iLCIoZnVuY3Rpb24oZ2xvYmFsKXtcblxuLy9cbi8vIENoZWNrIGZvciBuYXRpdmUgUHJvbWlzZSBhbmQgaXQgaGFzIGNvcnJlY3QgaW50ZXJmYWNlXG4vL1xuXG52YXIgTmF0aXZlUHJvbWlzZSA9IGdsb2JhbFsnUHJvbWlzZSddO1xudmFyIG5hdGl2ZVByb21pc2VTdXBwb3J0ZWQgPVxuICBOYXRpdmVQcm9taXNlICYmXG4gIC8vIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgbWlzc2luZyBmcm9tXG4gIC8vIEZpcmVmb3gvQ2hyb21lIGV4cGVyaW1lbn
10072RhbCBpbXBsZW1lbnRhdGlvbnNcbiAgJ3Jlc29sdmUnIGluIE5hdGl2ZVByb21pc2UgJiZcbiAgJ3JlamVjdCcgaW4gTmF0aXZlUHJvbWlzZSAmJlxuICAnYWxsJyBpbiBOYXRpdmVQcm9taXNlICYmXG4gICdyYWNlJyBpbiBOYXRpdmVQcm9taXNlICYmXG4gIC8vIE9sZGVyIHZlcnNpb24gb2YgdGhlIHNwZWMgaGFkIGEgcmVzb2x2ZXIgb2JqZWN0XG4gIC8vIGFzIHRoZSBhcmcgcmF0aGVyIHRoYW4gYSBmdW5jdGlvblxuICAoZnVuY3Rpb24oKXtcbiAgICB2YXIgcmVzb2x2ZTtcbiAgICBuZXcgTmF0aXZlUHJvbWlzZShmdW5jdGlvbihyKXsgcmVzb2x2ZSA9IHI7IH0pO1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgfSkoKTtcblxuXG4vL1xuLy8gZXhwb3J0IGlmIG5lY2Vzc2FyeVxuLy9cblxuaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiBleHBvcnRzKVxue1xuICAvLyBub2RlLmpzXG4gIGV4cG9ydHMuUHJvbWlzZSA9IG5hdGl2ZVByb21pc2VTdXBwb3J0ZWQgPyBOYXRpdmVQcm9taXNlIDogUHJvbWlzZTtcbiAgZXhwb3J0cy5Qb2x5ZmlsbCA9IFByb21pc2U7XG59XG5lbHNlXG57XG4gIC8vIEFNRFxuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG4gIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKXtcbiAgICAgIHJldHVybiBuYXRpdmVQcm9taXNlU3VwcG9ydGVkID8gTmF0aXZlUHJvbWlzZSA6IFByb21pc2U7XG4gICAgfSk7XG4gIH1cbiAgZWxzZVxuICB7XG4gICAgLy8gaW4gYnJvd3NlciBhZGQgdG8gZ2xvYmFsXG4gICAgaWYgKCFuYXRpdmVQcm9taXNlU3VwcG9ydGVkKVxuICAgICAgZ2xvYmFsWydQcm9taXNlJ10gPSBQcm9taXNlO1xuICB9XG59XG5cblxuLy9cbi8vIFBvbHlmaWxsXG4vL1xuXG52YXIgUEVORElORyA9ICdwZW5kaW5nJztcbnZhciBTRUFMRUQgPSAnc2VhbGVkJztcbnZhciBGVUxGSUxMRUQgPSAnZnVsZmlsbGVkJztcbnZhciBSRUpFQ1RFRCA9ICdyZWplY3RlZCc7XG52YXIgTk9PUCA9IGZ1bmN0aW9uKCl7fTtcblxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLy8gYXN5bmMgY2FsbHNcbnZhciBhc3luY1NldFRpbWVyID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRJbW1lZGlhdGUgOiBzZXRUaW1lb3V0O1xudmFyIGFzeW5jUXVldWUgPSBbXTtcbnZhciBhc3luY1RpbWVyO1xuXG5mdW5jdGlvbiBhc3luY0ZsdXNoKCl7XG4gIC8vIHJ1biBwcm9taXNlIGNhbGxiYWNrc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFzeW5jUXVldWUubGVuZ3RoOyBpKyspXG4gICAgYXN5bmNRdWV1ZVtpXVswXShhc3luY1F1ZXVlW2ldWzFdKTtcblxuICAvLyByZXNldCBhc3luYyBhc3luY1F1ZXVlXG4gIGFzeW5jUXVldWUgPSBbXTtcbiAgYXN5bmNUaW1lciA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc3luY0NhbGwoY2FsbGJhY2ssIGFyZyl7XG4gIGFzeW5jUXVldWUucHVzaChbY2FsbGJhY2ssIGFyZ10pO1xuXG4gIGlmICghYXN5bmNUaW1lcilcbiAge1xuICAgIGFzeW5jVGltZXIgPSB0cnVlO1xuICAgIGFzeW5jU2V0VGltZXIoYXN5bmNGbHVzaCwgMCk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBpbnZva2VSZXNvbHZlcihyZXNvbHZlciwgcHJvbWlzZSkge1xuICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSkge1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmVzb2x2ZXIocmVzb2x2ZVByb21pc2UsIHJlamVjdFByb21pc2UpO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZWplY3RQcm9taXNlKGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHN1YnNjcmliZXIpe1xuICB2YXIgb3duZXIgPSBzdWJzY3JpYmVyLm93bmVyO1xuICB2YXIgc2V0dGxlZCA9IG93bmVyLnN0YXRlXztcbiAgdmFyIHZhbHVlID0gb3duZXIuZGF0YV87ICBcbiAgdmFyIGNhbGxiYWNrID0gc3Vic2NyaWJlcltzZXR0bGVkXTtcbiAgdmFyIHByb21pc2UgPSBzdWJzY3JpYmVyLnRoZW47XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJylcbiAge1xuICAgIHNldHRsZWQgPSBGVUxGSUxMRUQ7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gY2FsbGJhY2sodmFsdWUpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgcmVqZWN0KHByb21pc2UsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaGFuZGxlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpKVxuICB7XG4gICAgaWYgKHNldHRsZWQgPT09IEZVTEZJTExFRClcbiAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuXG4gICAgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKVxuICAgICAgcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkge1xuICB2YXIgcmVzb2x2ZWQ7XG5cbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJyk7XG5cbiAgICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSlcbiAgICB7XG4gICAgICB2Y
10072XIgdGhlbiA9IHZhbHVlLnRoZW47ICAvLyB0aGVuIHNob3VsZCBiZSByZXRyaXZlZCBvbmx5IG9uY2VcblxuICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKVxuICAgICAge1xuICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bmN0aW9uKHZhbCl7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsKVxuICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJlamVjdChwcm9taXNlLCBlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlKHByb21pc2UsIHZhbHVlKXtcbiAgaWYgKHByb21pc2UgPT09IHZhbHVlIHx8ICFoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpXG4gICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpe1xuICBpZiAocHJvbWlzZS5zdGF0ZV8gPT09IFBFTkRJTkcpXG4gIHtcbiAgICBwcm9taXNlLnN0YXRlXyA9IFNFQUxFRDtcbiAgICBwcm9taXNlLmRhdGFfID0gdmFsdWU7XG5cbiAgICBhc3luY0NhbGwocHVibGlzaEZ1bGZpbGxtZW50LCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKXtcbiAgaWYgKHByb21pc2Uuc3RhdGVfID09PSBQRU5ESU5HKVxuICB7XG4gICAgcHJvbWlzZS5zdGF0ZV8gPSBTRUFMRUQ7XG4gICAgcHJvbWlzZS5kYXRhXyA9IHJlYXNvbjtcblxuICAgIGFzeW5jQ2FsbChwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoKHByb21pc2UpIHtcbiAgdmFyIGNhbGxiYWNrcyA9IHByb21pc2UudGhlbl87XG4gIHByb21pc2UudGhlbl8gPSB1bmRlZmluZWQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBpbnZva2VDYWxsYmFjayhjYWxsYmFja3NbaV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hGdWxmaWxsbWVudChwcm9taXNlKXtcbiAgcHJvbWlzZS5zdGF0ZV8gPSBGVUxGSUxMRUQ7XG4gIHB1Ymxpc2gocHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSl7XG4gIHByb21pc2Uuc3RhdGVfID0gUkVKRUNURUQ7XG4gIHB1Ymxpc2gocHJvbWlzZSk7XG59XG5cbi8qKlxuKiBAY2xhc3NcbiovXG5mdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyKXtcbiAgaWYgKHR5cGVvZiByZXNvbHZlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIGNvbnN0cnVjdG9yIHRha2VzIGEgZnVuY3Rpb24gYXJndW1lbnQnKTtcblxuICBpZiAodGhpcyBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBjb25zdHJ1Y3QgXFwnUHJvbWlzZVxcJzogUGxlYXNlIHVzZSB0aGUgXFwnbmV3XFwnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJyk7XG5cbiAgdGhpcy50aGVuXyA9IFtdO1xuXG4gIGludm9rZVJlc29sdmVyKHJlc29sdmVyLCB0aGlzKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQcm9taXNlLFxuXG4gIHN0YXRlXzogUEVORElORyxcbiAgdGhlbl86IG51bGwsXG4gIGRhdGFfOiB1bmRlZmluZWQsXG5cbiAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pe1xuICAgIHZhciBzdWJzY3JpYmVyID0ge1xuICAgICAgb3duZXI6IHRoaXMsXG4gICAgICB0aGVuOiBuZXcgdGhpcy5jb25zdHJ1Y3RvcihOT09QKSxcbiAgICAgIGZ1bGZpbGxlZDogb25GdWxmaWxsbWVudCxcbiAgICAgIHJlamVjdGVkOiBvblJlamVjdGlvblxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zdGF0ZV8gPT09IEZVTEZJTExFRCB8fCB0aGlzLnN0YXRlXyA9PT0gUkVKRUNURUQpXG4gICAge1xuICAgICAgLy8gYWxyZWFkeSByZXNvbHZlZCwgY2FsbCBjYWxsYmFjayBhc3luY1xuICAgICAgYXN5bmNDYWxsKGludm9rZUNhbGxiYWNrLCBzdWJzY3JpYmVyKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIC8vIHN1YnNjcmliZVxuICAgICAgdGhpcy50aGVuXy5wdXNoKHN1YnNjcmliZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJzY3JpYmVyLnRoZW47XG4gIH0sXG5cbiAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uKTtcbiAgfVxufTtcblxuUHJvbWlzZS5hbGwgPSBmdW5jdGlvbihwcm9taXNlcyl7XG4gIHZhciBDbGFzcyA9IHRoaXM7XG5cbiAgaWYgKCFpc0FycmF5KHByb21pc2VzKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIFByb21pc2UuYWxsKCkuJyk7XG5cbiAgcmV0dXJuIG5ldyBDbGFzcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHJlbWFpbmluZyA9IDA7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcihpbmRleCl7XG4gICAgICByZW1haW5pbmcrKztcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIGlmICghLS1yZW1haW5pbmcpXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIHByb21pc2U7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZXNbaV07XG5cbiAgICAgIGlmIChwcm9taXNlICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT
1007209ICdmdW5jdGlvbicpXG4gICAgICAgIHByb21pc2UudGhlbihyZXNvbHZlcihpKSwgcmVqZWN0KTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzdWx0c1tpXSA9IHByb21pc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZW1haW5pbmcpXG4gICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICB9KTtcbn07XG5cblByb21pc2UucmFjZSA9IGZ1bmN0aW9uKHByb21pc2VzKXtcbiAgdmFyIENsYXNzID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkocHJvbWlzZXMpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gUHJvbWlzZS5yYWNlKCkuJyk7XG5cbiAgcmV0dXJuIG5ldyBDbGFzcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgcHJvbWlzZTsgaSA8IHByb21pc2VzLmxlbmd0aDsgaSsrKVxuICAgIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlc1tpXTtcblxuICAgICAgaWYgKHByb21pc2UgJiYgdHlwZW9mIHByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc29sdmUocHJvbWlzZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIENsYXNzID0gdGhpcztcblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQ2xhc3MpXG4gICAgcmV0dXJuIHZhbHVlO1xuXG4gIHJldHVybiBuZXcgQ2xhc3MoZnVuY3Rpb24ocmVzb2x2ZSl7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbihyZWFzb24pe1xuICB2YXIgQ2xhc3MgPSB0aGlzO1xuXG4gIHJldHVybiBuZXcgQ2xhc3MoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICByZWplY3QocmVhc29uKTtcbiAgfSk7XG59O1xuXG59KSh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMpO1xuIiwiLyogIFNub3dmYWxsIGpxdWVyeSBwbHVnaW5cblxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgTElDRU5TRVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBWZXJzaW9uIDEuNTEgRGVjIDJuZCAyMDEyXG4gICAgLy8gZml4ZWQgYnVnIHdoZXJlIHNub3cgY29sbGVjdGlvbiBkaWRuJ3QgaGFwcGVuIGlmIGEgdmFsaWQgZG9jdHlwZSB3YXMgZGVjbGFyZWQuXG5cbiAgICBWZXJzaW9uIDEuNSBPY3QgNXRoIDIwMTFcbiAgICBBZGRlZCBjb2xsZWN0aW5nIHNub3chIFVzZXMgdGhlIGNhbnZhcyBlbGVtZW50IHRvIGNvbGxlY3Qgc25vdy4gSW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBzbm93IGNvbGxlY3Rpb24gdXNlIHRoZSBmb2xsb3dpbmdcblxuICAgICQoZG9jdW1lbnQpLnNub3dmYWxsKHtjb2xsZWN0aW9uIDogJ2VsZW1lbnQnfSk7XG5cbiAgICBlbGVtZW50ID0gYW55IHZhbGlkIGpxdWVyeSBzZWxlY3Rvci5cblxuICAgIFRoZSBwbHVnaW4gdGhlbiBjcmVhdGVzIGEgY2FudmFzIGFib3ZlIGV2ZXJ5IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwgYW5kIGNvbGxlY3RzIHRoZSBzbm93LiBJZiB0aGVyZSBhcmUgYSB2YXJyeWluZyBhbW91bnQgb2YgZWxlbWVudHMgdGhlXG4gICAgZmxha2VzIGdldCBhc3NpZ25lZCBhIHJhbmRvbSBvbmUgb24gc3RhcnQgdGhleSB3aWxsIGNvbGxpZGUuXG5cbiAgICBWZXJzaW9uIDEuNCBEZWMgOHRoIDIwMTBcbiAgICBGaXhlZCBpc3N1ZXMgKEkgaG9wZSkgd2l0aCBzY3JvbGwgYmFycyBmbGlja2VyaW5nIGR1ZSB0byBzbm93IGdvaW5nIG92ZXIgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbi5cbiAgICBBZGRlZCByb3VuZCBzbm93Zmxha2VzIHZpYSBjc3MsIHdpbGwgbm90IHdvcmsgZm9yIGFueSB2ZXJzaW9uIG9mIElFLiAtIFRoYW5rcyB0byBMdWtlIEJhcmtlciBvZiBodHRwOi8vd3d3LmluZmluaXRlLWV5ZS5jb20vXG4gICAgQWRkZWQgc2hhZG93cyBhcyBhbiBvcHRpb24gdmlhIGNzcyBhZ2FpbiB3aWxsIG5vdCB3b3JrIHdpdGggSUUuIFRoZSBpZGVhIGJlaGluZCBzaGFkb3dzLCBpcyB0byBzaG93IGZsYWtlcyBvbiBsaWdodGVyIGNvbG9yZWQgd2ViIHNpdGVzIC0gVGhhbmtzIFl1dHRcblxuICAgIFZlcnNpb24gMS4zLjEgTm92IDI1dGggMjAxMFxuICAgIFVwZGF0ZWQgc2NyaXB0IHRoYXQgY2F1c2VkIGZsYWtlcyBub3QgdG8gc2hvdyBhdCBhbGwgaWYgcGx1Z2luIHdhcyBpbml0aWFsaXplZCB3aXRoIG5vIG9wdGlvbnMsIGFsc28gYWRkZWQgdGhlIGZpeGVzIHRoYXQgSGFuIEJvbmdlcnMgc3VnZ2VzdGVkXG5cbiAgICBEZXZlbG9wZWQgYnkgSmFzb24gQnJvd24gZm9yIGFueSBidWdzIG9yIHF1ZXN0aW9ucyBlbWFpbCBtZSBhdCBsb2t0YX
10072I2OUBob3RtYWlsXG4gICAgaW5mbyBvbiB0aGUgcGx1Z2luIGlzIGxvY2F0ZWQgb24gU29tZXRoaW5naGl0bWUuY29tXG5cbiAgICB2YWx1ZXMgZm9yIHNub3cgb3B0aW9ucyBhcmVcblxuICAgIGZsYWtlQ291bnQsXG4gICAgZmxha2VDb2xvcixcbiAgICBmbGFrZUluZGV4LFxuICAgIG1pblNpemUsXG4gICAgbWF4U2l6ZSxcbiAgICBtaW5TcGVlZCxcbiAgICBtYXhTcGVlZCxcbiAgICByb3VuZCwgICAgICB0cnVlIG9yIGZhbHNlLCBtYWtlcyB0aGUgc25vd2ZsYWtlcyByb3VuZGVkIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LlxuICAgIHNoYWRvdyAgICAgIHRydWUgb3IgZmFsc2UsIGdpdmVzIHRoZSBzbm93Zmxha2VzIGEgc2hhZG93IGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LlxuXG4gICAgRXhhbXBsZSBVc2FnZSA6XG4gICAgJChkb2N1bWVudCkuc25vd2ZhbGwoe2ZsYWtlQ291bnQgOiAxMDAsIG1heFNwZWVkIDogMTB9KTtcblxuICAgIC1vci1cblxuICAgICQoJyNlbGVtZW50Jykuc25vd2ZhbGwoe2ZsYWtlQ291bnQgOiA4MDAsIG1heFNwZWVkIDogNSwgbWF4U2l6ZSA6IDV9KTtcblxuICAgIC1vciB3aXRoIGRlZmF1bHRzLVxuXG4gICAgJChkb2N1bWVudCkuc25vd2ZhbGwoKTtcblxuICAgIC0gVG8gY2xlYXIgLVxuICAgICQoJyNlbGVtZW50Jykuc25vd2ZhbGwoJ2NsZWFyJyk7XG4qL1xuXG4vLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGwgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZGFyaXVzL3JlcXVlc3RBbmltYXRpb25GcmFtZVxuaWYgKCFEYXRlLm5vdylcbiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH07XG5cbihmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgICB2Y
10072XIgdnAgPSB2ZW5kb3JzW2ldO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93W3ZwKydSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3dbdnArJ0NhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSddKTtcbiAgICB9XG4gICAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgLy8gaU9TNiBpcyBidWdneVxuICAgICAgICB8fCAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAhd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIHZhciBsYXN0VGltZSA9IDA7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB2YXIgbmV4dFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSArIDE2LCBub3cpO1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKGxhc3RUaW1lID0gbmV4dFRpbWUpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgLSBub3cpO1xuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjbGVhclRpbWVvdXQ7XG4gICAgfVxufSgpKTtcblxuKGZ1bmN0aW9uKCQpe1xuICAgICQuc25vd2ZhbGwgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKXtcbiAgICAgICAgdmFyIGZsYWtlcyA9IFtdLFxuICAgICAgICAgICAgZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICAgICAgZmxha2VDb3VudCA6IDM1LFxuICAgICAgICAgICAgICAgIGZsYWtlQ29sb3IgOiAnI2ZmZmZmZicsXG5cdFx0XHRcdGZsYWtlUG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgZmxha2VJbmRleDogOTk5OTk5LFxuICAgICAgICAgICAgICAgIG1pblNpemUgOiAxLFxuICAgICAgICAgICAgICAgIG1heFNpemUgOiAyLFxuICAgICAgICAgICAgICAgIG1pblNwZWVkIDogMSxcbiAgICAgICAgICAgICAgICBtYXhTcGVlZCA6IDUsXG4gICAgICAgICAgICAgICAgcm91bmQgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaGFkb3cgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbkhlaWdodCA6IDQwLFxuICAgICAgICAgICAgICAgIGRldmljZW9yaWVudGF0aW9uIDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoZGVmYXVsdHMsIG9wdGlvbnMpLFxuICAgICAgICAgICAgcmFuZG9tID0gZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtaW4gKyBNYXRoLnJhbmRvbSgpKihtYXgtbWluKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJzbm93ZmFsbFwiLCB0aGlzKTtcblxuICAgICAgICAgICAgLy8gU25vdyBmbGFrZSBvYmplY3RcbiAgICAgICAgICAgIGZ1bmN0aW9uIEZsYWtlKF94LCBfeSwgX3NpemUsIF9zcGVlZCl7XG4gICAgICAgICAgICAgICAgLy8gRmxha2UgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgIHRoaXMueCAgPSBfeDtcbiAgICAgICAgICAgICAgICB0aGlzLnkgID0gX3k7XG4gICAgICAgICAgICAgICAgdGhpcy5zaXplID0gX3NpemU7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVlZCA9IF9zcGVlZDtcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXAgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcFNpemUgPSByYW5kb20oMSwxMCkgLyAxMDA7XG5cbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNvbGxlY3Rpb24pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IGNhbnZhc0NvbGxlY3Rpb25bcmFuZG9tKDAsY2FudmFzQ29sbGVjdGlvbi5sZW5ndGgtMSldO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBmbGFrZU1hcmt1cCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmltYWdlKXtcbiAgICAgICAgICAgICAgICAgICAgZmxha2VNYXJrdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgICAgICAgICBmbGFrZU1hcmt1cC5zcmMgPSBvcHRpb25zLmltYWdlO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBmbGFrZU1hcmt1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgICQoZmxha2VNYXJrdXApLmNzcyh7J2JhY2tncm91bmQnIDogb3B0aW9ucy5mbGFrZUNvbG9yfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJChmbGFrZU1hcmt1cCkuYXR0cih7XG4gICAgICAgICAgICAgICAgICAgICdjbGFzcyc6ICdzbm93ZmFsbC1mbGFrZXMnLFxuICAgICAgICAgICAgICAgIH0pLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiB0aGlzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICdoZWlnaHQnIDogdGhpcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAncG9zaXRpb24nIDogb3B0aW9ucy5mbGFrZVBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAndG9wJyA6IHRoaXMueSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQnIDogdGhpcy54LFxuICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnIDogMCxcbiAgICAgICAgICAgICAgICAgICAgJ3pJbmRleCcgOiBvcHRpb25zLmZsYWtlSW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmKCQoZWxlbWVudCkuZ2V0KDApLnRhZ05hbWUgPT09ICQoZG9jdW1lbnQpLmdldCgwKS50YWdOYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkKGZsYWtlTWFya3VwKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAkKCdib2R5Jyk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYXBwZW5kKCQoZmxha2VNYXJrdXApKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBmbGFrZU1hcmt1cDtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmdW5jdGlvbiwgdXNlZCB0byB1cGRhdGUgdGhlIHNub3cgZmxha2VzLCBhbmQgY2hlY2tzIGN1cnJlbnQgc25vd2ZsYWtlIGFnYWluc3QgYm91bmRzXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnkgKz0gdGhpcy5zcGVlZDtcblxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnkgPiAoZWxIZWlnaHQpIC0gKHRoaXMuc2l6ZSAgKyA2KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgI
10072H1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudG9wID0gdGhpcy55ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLnggKyAncHgnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcCArPSB0aGlzLnN0ZXBTaXplO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1JhdGlvID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54ICs9IE1hdGguY29zKHRoaXMuc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnggKz0gKGRvUmF0aW8gKyBNYXRoLmNvcyh0aGlzLnN0ZXApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBpbGV1cCBjaGVja1xuICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNvbGxlY3Rpb24pe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy54ID4gdGhpcy50YXJnZXQueCAmJiB0aGlzLnggPCB0aGlzLnRhcmdldC53aWR0aCArIHRoaXMudGFyZ2V0LnggJiYgdGhpcy55ID4gdGhpcy50YXJnZXQueSAmJiB0aGlzLnkgPCB0aGlzLnRhcmdldC5oZWlnaHQgKyB0aGlzLnRhcmdldC55KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy50YXJnZXQuZWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clggPSB0aGlzLnggLSB0aGlzLnRhcmdldC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJZID0gdGhpcy55IC0gdGhpcy50YXJnZXQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA9IHRoaXMudGFyZ2V0LmNvbERhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sRGF0YVtwYXJzZUludChjdXJYKV1bcGFyc2VJbnQoY3VyWSt0aGlzLnNwZWVkK3RoaXMuc2l6ZSldICE9PSB1bmRlZmluZWQgfHwgY3VyWSt0aGlzLnNwZWVkK3RoaXMuc2l6ZSA+IHRoaXMudGFyZ2V0LmhlaWdodCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjdXJZK3RoaXMuc3BlZWQrdGhpcy5zaXplID4gdGhpcy50YXJnZXQuaGVpZ2h0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjdXJZK3RoaXMuc3BlZWQrdGhpcy5zaXplID4gdGhpcy50YXJnZXQuaGVpZ2h0ICYmIHRoaXMuc3BlZWQgPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCAqPSAuNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gZGVmYXVsdHMuZmxha2VDb2xvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbERhdGFbcGFyc2VJbnQoY3VyWCldW3BhcnNlSW50KGN1clkrdGhpcy5zcGVlZCt0aGlzLnN
10072pemUpXSA9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhW3BhcnNlSW50KGN1clgpXVtwYXJzZUludChjdXJZK3RoaXMuc3BlZWQrdGhpcy5zaXplKV0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoY3VyWCwgKGN1clkpK3RoaXMuc3BlZWQrdGhpcy5zaXplLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGFbcGFyc2VJbnQoY3VyWCldW3BhcnNlSW50KGN1clkrdGhpcy5zcGVlZCldID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN1clgsIGN1clkrdGhpcy5zcGVlZCwgdGhpcy5zaXplLCB0aGlzLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG93IHRvIHRoZSBzaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlZWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcFNpemUgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyc2VJbnQoY3VyWCkrMSA8IHRoaXMudGFyZ2V0LndpZHRoICYmIGNvbERhdGFbcGFyc2VJbnQoY3VyWCkrMV1bcGFyc2VJbnQoY3VyWSkrMV0gPT0gdW5kZWZpbmVkICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFyc2VJbnQoY3VyWCktMSA+IDAgJiYgY29sRGF0YVtwYXJzZUludChjdXJYKS0xXVtwYXJzZUludChjdXJZKSsxXSA9PSB1bmRlZmluZWQgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54LS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gZGVmYXVsdHMuZmxha2VDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN1clgsIGN1clksIHRoaXMuc2l6ZSwgdGhpcy5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YVtwYXJzZUludChjdXJYKV1bcGFyc2VJbnQoY3VyWSldID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy54ICsgdGhpcy5zaXplID4gKGVsV2lkdGgpIC0gd2lkdGhPZmZzZXQgfHwgdGhpcy54IDwgd2lkdGhPZmZzZXQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBzbm93Zmxha2Ugb25jZSBpdCByZWFjaGVzIG9uZSBvZiB0aGUgYm91bmRzIHNldFxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnggPSByYW5kb20od2lkdGhPZmZzZXQsIGVsV2lkdGggLSB3aWR0aE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcFNpemUgPSByYW5kb20oMSwxMCkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHJhbmRvbSgob3B0aW9ucy5taW5TaXplICogMTAwKSwgKG9wdGlvbnMubWF4U2l6ZSAqIDEwMCkpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnNpemUgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zaXplICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCA9IHJhbmRvbShvcHRpb25zLm1pblNwZWVkLCBvcHRpb25zLm1heFNwZWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxvY2FsIHZhcnNcbiAgICAgICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgICAgICBlbEhlaWdodCA9ICQoZWxlbWVudCkuaGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgZWxXaWR0aCA9ICQoZWxlbWVudCkud2lkdGgoKSxcbiAgICAgICAgICAgICAgICB3aWR0aE9mZnNldCA9IDAsXG4gICAgICAgICAgICAgICAgc25vd1RpbWVvdXQgPSAwO1xuXG4gICAgICAgICAgICAvLyBDb2xsZWN0aW9uIFBpZWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgaWYob3B0aW9ucy5jb2xsZWN0aW9uICE9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdmFyIHRlc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgaWYoISEodGVzdEVsZW0uZ2V0Q29udGV4dCAmJiB0ZXN0RWxlbS5nZXRDb250ZXh0KCcyZCcpKSl7XG4gICAgICAgICAgICAgICAgICAgI
10072HZhciBjYW52YXNDb2xsZWN0aW9uID0gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9ICQob3B0aW9ucy5jb2xsZWN0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25IZWlnaHQgPSBvcHRpb25zLmNvbGxlY3Rpb25IZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0wOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBlbGVtZW50c1tpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbnZhcyA9ICQoJzxjYW52YXMvPicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdzbm93ZmFsbC1jYW52YXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uRGF0YSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm91bmRzLnRvcC1jb2xsZWN0aW9uSGVpZ2h0ID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJGNhbnZhcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbnZhcy5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJyA6IG9wdGlvbnMuZmxha2VQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsZWZ0JyAgICAgOiBib3VuZHMubGVmdCArICdweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG9wJyAgICAgIDogYm91bmRzLnRvcC1jb2xsZWN0aW9uSGVpZ2h0ICsgJ3B4J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb2xsZWN0aW9uSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgdyA9IDA7IHcgPCBib3VuZHMud2lkdGg7IHcrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25EYXRhW3ddID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNDb2xsZWN0aW9uLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA6ICRjYW52YXMuZ2V0KDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA6IGJvdW5kcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA6IGJvdW5kcy50b3AtY29sbGVjdGlvbkhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb2xsZWN0aW9uSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA6IGNvbGxpc2lvbkRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbnZhcyBlbGVtZW50IGlzbnQgc3VwcG9ydGVkXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29sbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVkdWNlIHRoZSBob3Jpem9udGFsIHNjcm9sbCBiYXIgZnJvbSBkaXNwbGF5aW5nLCB3aGVuIHRoZSBlZmZlY3QgaXMgYXBwbGllZCB0byB0aGUgd2hvbGUgcGFnZVxuICAgICAgICAgICAgaWYoJChlbGVtZW50KS5nZXQoMCkudGFnTmFtZSA9PT0gJChkb2N1bWVudCkuZ2V0KDApLnRhZ05hbWUpe1xuICAgICAgICAgICAgICAgIHdpZHRoT2Zmc2V0ID0gMjU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgdGhlIHdpbmRvdyByZXNpemUgZXZlbnQgc28gd2UgY2FuIGdldCB0aGUgaW5uZXJIZWlnaHQgYWdhaW5cbiAgICAgICAgICAgICQod2luZG93KS5iaW5kKFwicmVzaXplXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgZWxIZWlnaHQgPSAkKGVsZW1lbnQpWzBdLmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICBlbFdpZHRoID0gJChlbGVtZW50KVswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZsYWtlc1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgb3B0aW9ucy5mbGFrZUNvdW50OyBpKz0xKXtcbiAgICAgICAgICAgICAgICBmbGFrZXMucHVzaChuZXcgRmxha2UocmFuZG9tKHdpZHRoT2Zmc2V0LGVsV2lkdGggLSB3aWR0aE9mZnNldCksIHJhbmRvbSgwLCBlbEhlaWdodCksIHJhbmRvbSgob3B0aW9ucy5taW5TaXplICogMTAwKSwgKG9wdGlvbnMubWF4U2l6ZSAqIDEwMCkpIC8gMTAwLCByYW5kb20ob3B0aW9ucy5taW5TcGVlZCwgb3B0aW9ucy5tYXhTcGVlZCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhpcyBhZGRzIHRoZSBzdHlsZSB0byBtYWtlIHRoZSBzbm93Zmxha2VzIHJvdW5kIHZpYSBib3JkZXIgcmFkaXVzIHByb3BlcnR5XG4gICAgICAgICAgICBpZihvcHRpb25zLnJvdW5kKXtcbiAgICAgICAgICAgICAgICAkKCcuc25vd2ZhbGwtZmxha2VzJykuY3NzKHsnLW1vei1ib3JkZXItcmFkaXVzJyA6IG9wdGlvbnMubWF4U2l6ZSwgJy13ZWJraXQtYm9yZGVyLXJhZGl1cycgOiBvcHRpb25zLm1heFN
10072pemUsICdib3JkZXItcmFkaXVzJyA6IG9wdGlvbnMubWF4U2l6ZX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGlzIGFkZHMgc2hhZG93cyBqdXN0IGJlbG93IHRoZSBzbm93Zmxha2Ugc28gdGhleSBwb3AgYSBiaXQgb24gbGlnaHRlciBjb2xvcmVkIHdlYiBwYWdlc1xuICAgICAgICAgICAgaWYob3B0aW9ucy5zaGFkb3cpe1xuICAgICAgICAgICAgICAgICQoJy5zbm93ZmFsbC1mbGFrZXMnKS5jc3MoeyctbW96LWJveC1zaGFkb3cnIDogJzFweCAxcHggMXB4ICM1NTUnLCAnLXdlYmtpdC1ib3gtc2hhZG93JyA6ICcxcHggMXB4IDFweCAjNTU1JywgJ2JveC1zaGFkb3cnIDogJzFweCAxcHggMXB4ICM1NTUnfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9uIG5ld2VyIE1hY2Jvb2tzIFNub3dmbGFrZXMgd2lsbCBmYWxsIGJhc2VkIG9uIGRldmljZW9yaWVudGF0aW9uXG4gICAgICAgICAgICB2YXIgZG9SYXRpbyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGV2aWNlb3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAkKHdpbmRvdykuYmluZCgnZGV2aWNlb3JpZW50YXRpb24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkb1JhdGlvID0gZXZlbnQub3JpZ2luYWxFdmVudC5nYW1tYSAqIDAuMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhpcyBjb250cm9scyBmbG93IG9mIHRoZSB1cGRhdGluZyBzbm93XG4gICAgICAgICAgICBmdW5jdGlvbiBzbm93KCl7XG4gICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGZsYWtlcy5sZW5ndGg7IGkgKz0gMSl7XG4gICAgICAgICAgICAgICAgICAgIGZsYWtlc1tpXS51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzbm93VGltZW91dCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3Nub3coKX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzbm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNsZWFycyB0aGUgc25vd2ZsYWtlc1xuICAgICAgICAgICAgdGhpcy5jbGVhciA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgJCgnLnNub3dmYWxsLWNhbnZhcycpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuY2hpbGRyZW4oJy5zbm93ZmFsbC1mbGFrZXMnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzbm93VGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIG9wdGlvbnMgYW5kIHRoZSBwbHVnaW5cbiAgICAkLmZuLnNub3dmYWxsID0gZnVuY3Rpb24ob3B0aW9ucyl7XG4gICAgICAgIGlmKHR5cGVvZihvcHRpb25zKSA9PSBcIm9iamVjdFwiIHx8IG9wdGlvbnMgPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXtcbiAgICAgICAgICAgICAgICAgICAgKG5ldyAkLnNub3dmYWxsKHRoaXMsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfWVsc2UgaWYgKHR5cGVvZihvcHRpb25zKSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgIHZhciBzbm93ID0gJCh0aGlzKS5kYXRhKCdzbm93ZmFsbCcpO1xuICAgICAgICAgICAgICAgIGlmKHNub3cpe1xuICAgICAgICAgICAgICAgICAgICBzbm93LmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoalF1ZXJ5KTtcbiIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgP
10072SBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG
100721heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgY
10072XQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS
100725yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsImltcG9ydCBhc3NpZ24gZnJvbSAnLi9hc3NpZ24nO1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBPYmplY3QuYXNzaWduID0gYXNzaWduO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnQgdmFyIFBpcHNNb2RlO1xuKGZ1bmN0aW9uIChQaXBzTW9kZSkge1xuICAgIFBpcHNNb2RlW1wiUmFuZ2VcIl0gPSBcInJhbmdlXCI7XG4gICAgUGlwc01vZGVbXCJTdGVwc1wiXSA9IFwic3RlcHNcIjtcbiAgICBQaXBzTW9kZVtcIlBvc2l0aW9uc1wiXSA9IFwicG9zaXRpb25zXCI7XG4gICAgUGlwc01vZGVbXCJDb3VudFwiXSA9IFwiY291bnRcIjtcbiAgICBQaXBzTW9kZVtcIlZhbHVlc1wiXSA9IFwidmFsdWVzXCI7XG59KShQaXBzTW9kZSB8fCAoUGlwc01vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBQaXBzVHlwZTtcbihmdW5jdGlvbiAoUGlwc1R5cGUpIHtcbiAgICBQaXBzVHlwZVtQaXBzVHlwZVtcIk5vbmVcIl0gPSAtMV0gPSBcIk5vbmVcIjtcbiAgICBQaXBzVHlwZVtQaXBzVHlwZVtcIk5vVmFsdWVcIl0gPSAwXSA9IFwiTm9WYWx1ZVwiO1xuICAgIFBpcHNUeXBlW1BpcHNUeXBlW1wiTGFyZ2VWYWx1ZVwiXSA9IDFdID0gXCJMYXJnZVZhbHVlXCI7XG4gICAgUGlwc1R5cGVbUGlwc1R5cGVbXCJTbWFsbFZhbHVlXCJdID0gMl0gPSBcIlNtYWxsVmFsdWVcIjtcbn0pKFBpcHNUeXBlIHx8IChQaXBzVHlwZSA9IHt9KSk7XG4vL3JlZ2lvbiBIZWxwZXIgTWV0aG9kc1xuZnVuY3Rpb24gaXNWYWxpZEZvcm1hdHRlcihlbnRyeSkge1xuICAgIHJldHVybiBpc1ZhbGlkUGFydGlhbEZvcm1hdHRlcihlbnRyeSkgJiYgdHlwZW9mIGVudHJ5LmZyb20gPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQYXJ0aWFsRm9ybWF0dGVyKGVudHJ5KSB7XG4gICAgLy8gcGFydGlhbCBmb3JtYXR0ZXJzIG9ubHkgbmVlZCBhIHRvIGZ1bmN0aW9uIGFuZCBub3QgYSBmcm9tIGZ1bmN0aW9uXG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZW50cnkudG8gPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWwpIHtcbiAgICBlbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGVsKTtcbn1cbmZ1bmN0aW9uIGlzU2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG4vLyBCaW5kYWJsZSB2ZXJzaW9uXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuLy8gUmVtb3ZlcyBkdXBsaWNhdGVzIGZyb20gYW4gYXJyYXkuXG5mdW5jdGlvbiB1bmlxdWUoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiAhdGhpc1thXSA/ICh0aGlzW2FdID0gdHJ1ZSkgOiBmYWxzZTtcbiAgICB9LCB7fSk7XG59XG4vLyBSb3VuZCBhIHZhbHVlIHRvIHRoZSBjbG9zZXN0ICd0bycuXG5mdW5jdGlvbiBjbG9zZXN0KHZhbHVlLCB0bykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlIC8gdG8pICogdG87XG59XG4vLyBDdXJyZW50IHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LlxuZnVuY3Rpb24gb2Zmc2V0KGVsZW0sIG9yaWVudGF0aW9uKSB7XG4gICAgdmFyIHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgIHZhciBwYWdlT2Zmc2V0ID0gZ2V0UGFnZU9mZnNldChkb2MpO1xuICAgIC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBjb250YWlucyBsZWZ0IHNjcm9sbCBpbiBDaHJvbWUgb24gQW5kcm9pZC5cbiAgICAvLyBJIGhhdmVuJ3QgZm91bmQgYSBmZWF0dXJlIGRldGVjdGlvbiB0aGF0IHByb3ZlcyB0aGlzLiBXb3JzdCBjYXNlXG4gICAgLy8gc2NlbmFyaW8gb24gbWlzLW1hdGNoOiB0aGUgJ3RhcCcgZmVhdHVyZSBvbiBob3Jpem9udGFsIHNsaWRlcnMgYnJlYWtzLlxuICAgIGlmICgvd2Via2l0LipDaHJvbWUuKk1vYmlsZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgcGFnZU9mZnNldC54ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uID8gcmVjdC50b3AgKyBwYWdlT2Zmc2V0LnkgLSBkb2
10072NFbGVtLmNsaWVudFRvcCA6IHJlY3QubGVmdCArIHBhZ2VPZmZzZXQueCAtIGRvY0VsZW0uY2xpZW50TGVmdDtcbn1cbi8vIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgbnVtZXJpY2FsLlxuZnVuY3Rpb24gaXNOdW1lcmljKGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGEgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKGEpICYmIGlzRmluaXRlKGEpO1xufVxuLy8gU2V0cyBhIGNsYXNzIGFuZCByZW1vdmVzIGl0IGFmdGVyIFtkdXJhdGlvbl0gbXMuXG5mdW5jdGlvbiBhZGRDbGFzc0ZvcihlbGVtZW50LCBjbGFzc05hbWUsIGR1cmF0aW9uKSB7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkge1xuICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICB9XG59XG4vLyBMaW1pdHMgYSB2YWx1ZSB0byAwIC0gMTAwXG5mdW5jdGlvbiBsaW1pdChhKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGEsIDEwMCksIDApO1xufVxuLy8gV3JhcHMgYSB2YXJpYWJsZSBhcyBhbiBhcnJheSwgaWYgaXQgaXNuJ3Qgb25lIHlldC5cbi8vIE5vdGUgdGhhdCBhbiBpbnB1dCBhcnJheSBpcyByZXR1cm5lZCBieSByZWZlcmVuY2UhXG5mdW5jdGlvbiBhc0FycmF5KGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhKSA/IGEgOiBbYV07XG59XG4vLyBDb3VudHMgZGVjaW1hbHNcbmZ1bmN0aW9uIGNvdW50RGVjaW1hbHMobnVtU3RyKSB7XG4gICAgbnVtU3RyID0gU3RyaW5nKG51bVN0cik7XG4gICAgdmFyIHBpZWNlcyA9IG51bVN0ci5zcGxpdChcIi5cIik7XG4gICAgcmV0dXJuIHBpZWNlcy5sZW5ndGggPiAxID8gcGllY2VzWzFdLmxlbmd0aCA6IDA7XG59XG4vLyBodHRwOi8veW91bWlnaHRub3RuZWVkanF1ZXJ5LmNvbS8jYWRkX2NsYXNzXG5mdW5jdGlvbiBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCAmJiAhL1xccy8udGVzdChjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLmNsYXNzTmFtZSArPSBcIiBcIiArIGNsYXNzTmFtZTtcbiAgICB9XG59XG4vLyBodHRwOi8veW91bWlnaHRub3RuZWVkanF1ZXJ5LmNvbS8jcmVtb3ZlX2NsYXNzXG5mdW5jdGlvbiByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCAmJiAhL1xccy8udGVzdChjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXFxcYilcIiArIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuam9pbihcInxcIikgKyBcIihcXFxcYnwkKVwiLCBcImdpXCIpLCBcIiBcIik7XG4gICAgfVxufVxuLy8gaHR0cHM6Ly9wbGFpbmpzLmNvbS9qYXZhc2NyaXB0L2F0dHJpYnV0ZXMvYWRkaW5nLXJlbW92aW5nLWFuZC10ZXN0aW5nLWZvci1jbGFzc2VzLTkvXG5mdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGVsLmNsYXNzTGlzdCA/IGVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpIDogbmV3IFJlZ0V4cChcIlxcXFxiXCIgKyBjbGFzc05hbWUgKyBcIlxcXFxiXCIpLnRlc3QoZWwuY2xhc3NOYW1lKTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvc2Nyb2xsWSNOb3Rlc1xuZnVuY3Rpb24gZ2V0UGFnZU9mZnNldChkb2MpIHtcbiAgICB2YXIgc3VwcG9ydFBhZ2VPZmZzZXQgPSB3aW5kb3cucGFnZVhPZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNDU1MxQ29tcGF0ID0gKGRvYy5jb21wYXRNb2RlIHx8IFwiXCIpID09PSBcIkNTUzFDb21wYXRcIjtcbiAgICB2YXIgeCA9IHN1cHBvcnRQYWdlT2Zmc2V0XG4gICAgICAgID8gd2luZG93LnBhZ2VYT2Zmc2V0XG4gICAgICAgIDogaXNDU1MxQ29tcGF0XG4gICAgICAgICAgICA/IGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdFxuICAgICAgICAgICAgOiBkb2MuYm9keS5zY3JvbGxMZWZ0O1xuICAgIHZhciB5ID0gc3VwcG9ydFBhZ2VPZmZzZXRcbiAgICAgICAgPyB3aW5kb3cucGFnZVlPZmZzZXRcbiAgICAgICAgOiBpc0NTUzFDb21wYXRcbiAgICAgICAgICAgID8gZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcbiAgICAgICAgICAgIDogZG9jLmJvZHkuc2Nyb2xsVG9wO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgfTtcbn1cbi8vIHdlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byBjb21wdXRlIGNvbnN0YW50cyBpbnN0ZWFkXG4vLyBvZiBhY2Nlc3Npbmcgd2luZG93LiogYXMgc29vbiBhcyB0aGUgbW9kdWxlIG5lZWRzIGl0XG4vLyBzbyB0aGF0IHdlIGRvIG5vdCBjb21wdXRlIGFueXRoaW5nIGlmIG5vdCBuZWVkZWRcbmZ1bmN0aW9uIGdldEFjdGlvbnMoKSB7XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBldmVudHMgdG8gYmluZC4gSUUxMSBpbXBsZW1lbnRzIHBvaW50ZXJFdmVudHMgd2l0aG91dFxuICAgIC8vIGEgcHJlZml4LCB3aGljaCBicmVha3MgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBJRTEwIGltcGxlbWVudGF0aW9uLlxuICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3RhcnQ6IFwicG9pbnRlcmRvd25cIixcbiAgICAgICAgICAgIG1vdmU6IFwicG9pbnRlcm1vdmVcIixcbiAgICAgICAgICAgIGVuZDogXCJwb2ludGVydXBcIixcbiAgICAgICAgfVxuICAgICAgICA6IHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IFwiTVNQb2ludGVyRG93blwiLFxuICAgICAgICAgICAgICAgIG1vdmU6IFwiTVNQb2ludGVyTW92ZVwiLFxuICAgICAgICAgICAgICAgIGVuZDogXCJNU1BvaW50ZXJVcFwiLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IFwibW91c2Vkb3duIHRvdWNoc3RhcnRcIixcbiAgICAgICAgICAgICAgICBtb3ZlOiBcIm1vdXNlbW92ZSB0b3VjaG1vdmVcIixcbiAgICAgICAgICAgICAgICBlbmQ6IFwibW91c2V1cCB0b3VjaGVuZFwiLFxuICAgICAgICAgICAgfTtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kXG4vLyBJc3N1ZSAjNzg1XG5mdW5jdGlvbiBnZXRTdXBwb3J0c1Bhc3NpdmUoKSB7XG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIFwicGFzc2l2ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIG51bGwsIG9wdHMpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkgeyB9XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgIHJldHVybi
10072BzdXBwb3J0c1Bhc3NpdmU7XG59XG5mdW5jdGlvbiBnZXRTdXBwb3J0c1RvdWNoQWN0aW9uTm9uZSgpIHtcbiAgICByZXR1cm4gd2luZG93LkNTUyAmJiBDU1Muc3VwcG9ydHMgJiYgQ1NTLnN1cHBvcnRzKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKTtcbn1cbi8vZW5kcmVnaW9uXG4vL3JlZ2lvbiBSYW5nZSBDYWxjdWxhdGlvblxuLy8gRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgc3ViLXJhbmdlIGluIHJlbGF0aW9uIHRvIGEgZnVsbCByYW5nZS5cbmZ1bmN0aW9uIHN1YlJhbmdlUmF0aW8ocGEsIHBiKSB7XG4gICAgcmV0dXJuIDEwMCAvIChwYiAtIHBhKTtcbn1cbi8vIChwZXJjZW50YWdlKSBIb3cgbWFueSBwZXJjZW50IGlzIHRoaXMgdmFsdWUgb2YgdGhpcyByYW5nZT9cbmZ1bmN0aW9uIGZyb21QZXJjZW50YWdlKHJhbmdlLCB2YWx1ZSwgc3RhcnRSYW5nZSkge1xuICAgIHJldHVybiAodmFsdWUgKiAxMDApIC8gKHJhbmdlW3N0YXJ0UmFuZ2UgKyAxXSAtIHJhbmdlW3N0YXJ0UmFuZ2VdKTtcbn1cbi8vIChwZXJjZW50YWdlKSBXaGVyZSBpcyB0aGlzIHZhbHVlIG9uIHRoaXMgcmFuZ2U/XG5mdW5jdGlvbiB0b1BlcmNlbnRhZ2UocmFuZ2UsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZyb21QZXJjZW50YWdlKHJhbmdlLCByYW5nZVswXSA8IDAgPyB2YWx1ZSArIE1hdGguYWJzKHJhbmdlWzBdKSA6IHZhbHVlIC0gcmFuZ2VbMF0sIDApO1xufVxuLy8gKHZhbHVlKSBIb3cgbXVjaCBpcyB0aGlzIHBlcmNlbnRhZ2Ugb24gdGhpcyByYW5nZT9cbmZ1bmN0aW9uIGlzUGVyY2VudGFnZShyYW5nZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICogKHJhbmdlWzFdIC0gcmFuZ2VbMF0pKSAvIDEwMCArIHJhbmdlWzBdO1xufVxuZnVuY3Rpb24gZ2V0Sih2YWx1ZSwgYXJyKSB7XG4gICAgdmFyIGogPSAxO1xuICAgIHdoaWxlICh2YWx1ZSA+PSBhcnJbal0pIHtcbiAgICAgICAgaiArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gajtcbn1cbi8vIChwZXJjZW50YWdlKSBJbnB1dCBhIHZhbHVlLCBmaW5kIHdoZXJlLCBvbiBhIHNjYWxlIG9mIDAtMTAwLCBpdCBhcHBsaWVzLlxuZnVuY3Rpb24gdG9TdGVwcGluZyh4VmFsLCB4UGN0LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA+PSB4VmFsLnNsaWNlKC0xKVswXSkge1xuICAgICAgICByZXR1cm4gMTAwO1xuICAgIH1cbiAgICB2YXIgaiA9IGdldEoodmFsdWUsIHhWYWwpO1xuICAgIHZhciB2YSA9IHhWYWxbaiAtIDFdO1xuICAgIHZhciB2YiA9IHhWYWxbal07XG4gICAgdmFyIHBhID0geFBjdFtqIC0gMV07XG4gICAgdmFyIHBiID0geFBjdFtqXTtcbiAgICByZXR1cm4gcGEgKyB0b1BlcmNlbnRhZ2UoW3ZhLCB2Yl0sIHZhbHVlKSAvIHN1YlJhbmdlUmF0aW8ocGEsIHBiKTtcbn1cbi8vICh2YWx1ZSkgSW5wdXQgYSBwZXJjZW50YWdlLCBmaW5kIHdoZXJlIGl0IGlzIG9uIHRoZSBzcGVjaWZpZWQgcmFuZ2UuXG5mdW5jdGlvbiBmcm9tU3RlcHBpbmcoeFZhbCwgeFBjdCwgdmFsdWUpIHtcbiAgICAvLyBUaGVyZSBpcyBubyByYW5nZSBncm91cCB0aGF0IGZpdHMgMTAwXG4gICAgaWYgKHZhbHVlID49IDEwMCkge1xuICAgICAgICByZXR1cm4geFZhbC5zbGljZSgtMSlbMF07XG4gICAgfVxuICAgIHZhciBqID0gZ2V0Sih2YWx1ZSwgeFBjdCk7XG4gICAgdmFyIHZhID0geFZhbFtqIC0gMV07XG4gICAgdmFyIHZiID0geFZhbFtqXTtcbiAgICB2YXIgcGEgPSB4UGN0W2ogLSAxXTtcbiAgICB2YXIgcGIgPSB4UGN0W2pdO1xuICAgIHJldHVybiBpc1BlcmNlbnRhZ2UoW3ZhLCB2Yl0sICh2YWx1ZSAtIHBhKSAqIHN1YlJhbmdlUmF0aW8ocGEsIHBiKSk7XG59XG4vLyAocGVyY2VudGFnZSkgR2V0IHRoZSBzdGVwIHRoYXQgYXBwbGllcyBhdCBhIGNlcnRhaW4gdmFsdWUuXG5mdW5jdGlvbiBnZXRTdGVwKHhQY3QsIHhTdGVwcywgc25hcCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IDEwMCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHZhciBqID0gZ2V0Sih2YWx1ZSwgeFBjdCk7XG4gICAgdmFyIGEgPSB4UGN0W2ogLSAxXTtcbiAgICB2YXIgYiA9IHhQY3Rbal07XG4gICAgLy8gSWYgJ3NuYXAnIGlzIHNldCwgc3RlcHMgYXJlIHVzZWQgYXMgZml4ZWQgcG9pbnRzIG9uIHRoZSBzbGlkZXIuXG4gICAgaWYgKHNuYXApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBwb3NpdGlvbiwgYSBvciBiLlxuICAgICAgICBpZiAodmFsdWUgLSBhID4gKGIgLSBhKSAvIDIpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoIXhTdGVwc1tqIC0gMV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geFBjdFtqIC0gMV0gKyBjbG9zZXN0KHZhbHVlIC0geFBjdFtqIC0gMV0sIHhTdGVwc1tqIC0gMV0pO1xufVxuLy9lbmRyZWdpb25cbi8vcmVnaW9uIFNwZWN0cnVtXG52YXIgU3BlY3RydW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3BlY3RydW0oZW50cnksIHNuYXAsIHNpbmdsZVN0ZXApIHtcbiAgICAgICAgdGhpcy54UGN0ID0gW107XG4gICAgICAgIHRoaXMueFZhbCA9IFtdO1xuICAgICAgICB0aGlzLnhTdGVwcyA9IFtdO1xuICAgICAgICB0aGlzLnhOdW1TdGVwcyA9IFtdO1xuICAgICAgICB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwID0gW107XG4gICAgICAgIHRoaXMueFN0ZXBzID0gW3NpbmdsZVN0ZXAgfHwgZmFsc2VdO1xuICAgICAgICB0aGlzLnhOdW1TdGVwcyA9IFtmYWxzZV07XG4gICAgICAgIHRoaXMuc25hcCA9IHNuYXA7XG4gICAgICAgIHZhciBpbmRleDtcbiAgICAgICAgdmFyIG9yZGVyZWQgPSBbXTtcbiAgICAgICAgLy8gTWFwIHRoZSBvYmplY3Qga2V5cyB0byBhbiBhcnJheS5cbiAgICAgICAgT2JqZWN0LmtleXMoZW50cnkpLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBvcmRlcmVkLnB1c2goW2FzQXJyYXkoZW50cnlbaW5kZXhdKSwgaW5kZXhdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNvcnQgYWxsIGVudHJpZXMgYnkgdmFsdWUgKG51bWVyaWMgc29ydCkuXG4gICAgICAgIG9yZGVyZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGFbMF1bMF0gLSBiWzBdWzBdO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29udmVydCBhbGwgZW50cmllcyB0byBzdWJyYW5nZXMuXG4gICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG9yZGVyZWQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVudHJ5UG9pbnQob3JkZXJlZFtpbmRleF1bMV0sIG9yZGVyZWRbaW5kZXhdWzBdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdG9yZSB0aGUgYWN0dWFsIHN0ZXAgdmFsdWVzLlxuICAgICAgICAvLyB4U3RlcHMgaXMgc29ydGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHhQY3QgYW5kIHhWYWwuXG4gICAgICAgI
10072HRoaXMueE51bVN0ZXBzID0gdGhpcy54U3RlcHMuc2xpY2UoMCk7XG4gICAgICAgIC8vIENvbnZlcnQgYWxsIG51bWVyaWMgc3RlcHMgdG8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHN1YnJhbmdlIHRoZXkgcmVwcmVzZW50LlxuICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnhOdW1TdGVwcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RlcFBvaW50KGluZGV4LCB0aGlzLnhOdW1TdGVwc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5nZXREaXN0YW5jZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgZGlzdGFuY2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnhOdW1TdGVwcy5sZW5ndGggLSAxOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBkaXN0YW5jZXNbaW5kZXhdID0gZnJvbVBlcmNlbnRhZ2UodGhpcy54VmFsLCB2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXN0YW5jZXM7XG4gICAgfTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBlcmNlbnR1YWwgZGlzdGFuY2Ugb3ZlciB0aGUgd2hvbGUgc2NhbGUgb2YgcmFuZ2VzLlxuICAgIC8vIGRpcmVjdGlvbjogMCA9IGJhY2t3YXJkcyAvIDEgPSBmb3J3YXJkc1xuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5nZXRBYnNvbHV0ZURpc3RhbmNlID0gZnVuY3Rpb24gKHZhbHVlLCBkaXN0YW5jZXMsIGRpcmVjdGlvbikge1xuICAgICAgICB2Y
10072XIgeFBjdF9pbmRleCA9IDA7XG4gICAgICAgIC8vIENhbGN1bGF0ZSByYW5nZSB3aGVyZSB0byBzdGFydCBjYWxjdWxhdGlvblxuICAgICAgICBpZiAodmFsdWUgPCB0aGlzLnhQY3RbdGhpcy54UGN0Lmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICB3aGlsZSAodmFsdWUgPiB0aGlzLnhQY3RbeFBjdF9pbmRleCArIDFdKSB7XG4gICAgICAgICAgICAgICAgeFBjdF9pbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB0aGlzLnhQY3RbdGhpcy54UGN0Lmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICB4UGN0X2luZGV4ID0gdGhpcy54UGN0Lmxlbmd0aCAtIDI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbG9va2luZyBiYWNrd2FyZHMgYW5kIHRoZSB2YWx1ZSBpcyBleGFjdGx5IGF0IGEgcmFuZ2Ugc2VwYXJhdG9yIHRoZW4gbG9vayBvbmUgcmFuZ2UgZnVydGhlclxuICAgICAgICBpZiAoIWRpcmVjdGlvbiAmJiB2YWx1ZSA9PT0gdGhpcy54UGN0W3hQY3RfaW5kZXggKyAxXSkge1xuICAgICAgICAgICAgeFBjdF9pbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXN0YW5jZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3RhbmNlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFydF9mYWN0b3I7XG4gICAgICAgIHZhciByZXN0X2ZhY3RvciA9IDE7XG4gICAgICAgIHZhciByZXN0X3JlbF9kaXN0YW5jZSA9IGRpc3RhbmNlc1t4UGN0X2luZGV4XTtcbiAgICAgICAgdmFyIHJhbmdlX3BjdCA9IDA7XG4gICAgICAgIHZhciByZWxfcmFuZ2VfZGlzdGFuY2UgPSAwO1xuICAgICAgICB2Y
10072XIgYWJzX2Rpc3RhbmNlX2NvdW50ZXIgPSAwO1xuICAgICAgICB2YXIgcmFuZ2VfY291bnRlciA9IDA7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aGF0IHBhcnQgb2YgdGhlIHN0YXJ0IHJhbmdlIHRoZSB2YWx1ZSBpc1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBzdGFydF9mYWN0b3IgPSAodmFsdWUgLSB0aGlzLnhQY3RbeFBjdF9pbmRleF0pIC8gKHRoaXMueFBjdFt4UGN0X2luZGV4ICsgMV0gLSB0aGlzLnhQY3RbeFBjdF9pbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnRfZmFjdG9yID0gKHRoaXMueFBjdFt4UGN0X2luZGV4ICsgMV0gLSB2YWx1ZSkgLyAodGhpcy54UGN0W3hQY3RfaW5kZXggKyAxXSAtIHRoaXMueFBjdFt4UGN0X2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gdW50aWwgdGhlIGNvbXBsZXRlIGRpc3RhbmNlIGFjcm9zcyByYW5nZXMgaXMgY2FsY3VsYXRlZFxuICAgICAgICB3aGlsZSAocmVzdF9yZWxfZGlzdGFuY2UgPiAwKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgdG90YWwgcmFuZ2VcbiAgICAgICAgICAgIHJhbmdlX3BjdCA9IHRoaXMueFBjdFt4UGN0X2luZGV4ICsgMSArIHJhbmdlX2NvdW50ZXJdIC0gdGhpcy54UGN0W3hQY3RfaW5kZXggKyByYW5nZV9jb3VudGVyXTtcbiAgICAgICAgICAgIC8vIERldGVjdCBpZiB0aGUgbWFyZ2luLCBwYWRkaW5nIG9yIGxpbWl0IGlzIGxhcmdlciB0aGVuIHRoZSBjdXJyZW50IHJhbmdlIGFuZCBjYWxjdWxhdGVcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZXNbeFBjdF9pbmRleCArIHJhbmdlX2NvdW50ZXJdICogcmVzdF9mYWN0b3IgKyAxMDAgLSBzdGFydF9mYWN0b3IgKiAxMDAgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBsYXJnZXIgdGhlbiB0YWtlIHRoZSBwZXJjZW50dWFsIGRpc3RhbmNlIG9mIHRoZSB3aG9sZSByYW5nZVxuICAgICAgICAgICAgICAgIHJlbF9yYW5nZV9kaXN0YW5jZSA9IHJhbmdlX3BjdCAqIHN0YXJ0X2ZhY3RvcjtcbiAgICAgICAgICAgICAgICAvLyBSZXN0IGZhY3RvciBvZiByZWxhdGl2ZSBwZXJjZW50dWFsIGRpc3RhbmNlIHN0aWxsIHRvIGJlIGNhbGN1bGF0ZWRcbiAgICAgICAgICAgICAgICByZXN0X2ZhY3RvciA9IChyZXN0X3JlbF9kaXN0YW5jZSAtIDEwMCAqIHN0YXJ0X2ZhY3RvcikgLyBkaXN0YW5jZXNbeFBjdF9pbmRleCArIHJhbmdlX2NvdW50ZXJdO1xuICAgICAgICAgICAgICAgIC8vIFNldCBzdGFydCBmYWN0b3IgdG8gMSBhcyBmb3IgbmV4dCByYW5nZSBpdCBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgICAgICAgICBzdGFydF9mYWN0b3IgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc21hbGxlciBvciBlcXVhbCB0aGVuIHRha2UgdGhlIHBlcmNlbnR1YWwgZGlzdGFuY2Ugb2YgdGhlIGNhbGN1bGF0ZSBwZXJjZW50dWFsIHBhcnQgb2YgdGhhdCByYW5nZVxuICAgICAgICAgICAgICAgIHJlbF9yYW5nZV9kaXN0YW5jZSA9ICgoZGlzdGFuY2VzW3hQY3RfaW5kZXggKyByYW5nZV9jb3VudGVyXSAqIHJhbmdlX3BjdCkgLyAxMDApICogcmVzdF9mYWN0b3I7XG4gICAgICAgICAgICAgICAgLy8gTm8gcmVzdCBsZWZ0IGFzIHRoZSByZXN0IGZpdHMgaW4gY3VycmVudCByYW5nZVxuICAgICAgICAgICAgICAgIHJlc3RfZmFjdG9yID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBhYnNfZGlzdGFuY2VfY291bnRlciA9IGFic19kaXN0YW5jZV9jb3VudGVyIC0gcmVsX3JhbmdlX2Rpc3RhbmNlO1xuICAgICAgICAgICAgICAgIC8vIExpbWl0IHJhbmdlIHRvIGZpcnN0IHJhbmdlIHdoZW4gZGlzdGFuY2UgYmVjb21lcyBvdXRzaWRlIG9mIG1pbmltdW0gcmFuZ2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy54UGN0Lmxlbmd0aCArIHJhbmdlX2NvdW50ZXIgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZV9jb3VudGVyLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWJzX2Rpc3RhbmNlX2NvdW50ZXIgPSBhYnNfZGlzdGFuY2VfY291bnRlciArIHJlbF9yYW5nZV9kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAvLyBMaW1pdCByYW5nZSB0byBsYXN0IHJhbmdlIHdoZW4gZGlzdGFuY2UgYmVjb21lcyBvdXRzaWRlIG9mIG1heGltdW0gcmFuZ2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy54UGN0Lmxlbmd0aCAtIHJhbmdlX2NvdW50ZXIgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZV9jb3VudGVyKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVzdCBvZiByZWxhdGl2ZSBwZXJjZW50dWFsIGRpc3RhbmNlIHN0aWxsIHRvIGJlIGNhbGN1bGF0ZWRcbiAgICAgICAgICAgIHJlc3RfcmVsX2Rpc3RhbmNlID0gZGlzdGFuY2VzW3hQY3RfaW5kZXggKyByYW5nZV9jb3VudGVyXSAqIHJlc3RfZmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSArIGFic19kaXN0YW5jZV9jb3VudGVyO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLnRvU3RlcHBpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB0b1N0ZXBwaW5nKHRoaXMueFZhbCwgdGhpcy54UGN0LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5mcm9tU3RlcHBpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyb21TdGVwcGluZyh0aGlzLnhWYWwsIHRoaXMueFBjdCwgdmFsdWUpO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmdldFN0ZXAgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSBnZXRTdGVwKHRoaXMueFBjdCwgdGhpcy54U3RlcHMsIHRoaXMuc25hcCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBTcGVjdHJ1bS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0ZXAgPSBmdW5jdGlvbiAodmFsdWUsIGlzRG93biwgc2l6ZSkge1xuICAgICAgICB2Y
10072XIgaiA9IGdldEoodmFsdWUsIHRoaXMueFBjdCk7XG4gICAgICAgIC8vIFdoZW4gYXQgdGhlIHRvcCBvciBzdGVwcGluZyBkb3duLCBsb29rIGF0IHRoZSBwcmV2aW91cyBzdWItcmFuZ2VcbiAgICAgICAgaWYgKHZhbHVlID09PSAxMDAgfHwgKGlzRG93biAmJiB2YWx1ZSA9PT0gdGhpcy54UGN0W2ogLSAxXSkpIHtcbiAgICAgICAgICAgIGogPSBNYXRoLm1heChqIC0gMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLnhWYWxbal0gLSB0aGlzLnhWYWxbaiAtIDFdKSAvIHNpemU7XG4gICAgfTtcbiAgICBTcGVjdHJ1bS5wcm90b3R5cGUuZ2V0TmVhcmJ5U3RlcHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGogPSBnZXRKKHZhbHVlLCB0aGlzLnhQY3QpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RlcEJlZm9yZToge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWU6IHRoaXMueFZhbFtqIC0gMl0sXG4gICAgICAgICAgICAgICAgc3RlcDogdGhpcy54TnVtU3RlcHNbaiAtIDJdLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RTdGVwOiB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwW2ogLSAyXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzU3RlcDoge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWU6IHRoaXMueFZhbFtqIC0gMV0sXG4gICAgICAgICAgICAgICAgc3RlcDogdGhpcy54TnVtU3RlcHNbaiAtIDFdLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RTdGVwOiB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwW2ogLSAxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGVwQWZ0ZXI6IHtcbiAgICAgICAgICAgICAgICBzdGFydFZhbHVlOiB0aGlzLnhWYWxbal0sXG4gICAgICAgICAgICAgICAgc3RlcDogdGhpcy54TnVtU3RlcHNbal0sXG4gICAgICAgICAgICAgICAgaGlnaGVzdFN0ZXA6IHRoaXMueEhpZ2hlc3RDb21wbGV0ZVN0ZXBbal0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmNvdW50U3RlcERlY2ltYWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
10072XIgc3RlcERlY2ltYWxzID0gdGhpcy54TnVtU3RlcHMubWFwKGNvdW50RGVjaW1hbHMpO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCwgc3RlcERlY2ltYWxzKTtcbiAgICB9O1xuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5oYXNOb1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhWYWxbMF0gPT09IHRoaXMueFZhbFt0aGlzLnhWYWwubGVuZ3RoIC0gMV07XG4gICAgfTtcbiAgICAvLyBPdXRzaWRlIHRlc3RpbmdcbiAgICBTcGVjdHJ1bS5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGVwKHRoaXMudG9TdGVwcGluZyh2YWx1ZSkpO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmhhbmRsZUVudHJ5UG9pbnQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHZhciBwZXJjZW50YWdlO1xuICAgICAgICAvLyBDb3ZlcnQgbWluL21heCBzeW50YXggdG8gMCBhbmQgMTAwLlxuICAgICAgICBpZiAoaW5kZXggPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudGFnZSA9IHBhcnNlRmxvYXQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IGlucHV0LlxuICAgICAgICBpZiAoIWlzTnVtZXJpYyhwZXJjZW50YWdlKSB8fCAhaXNOdW1lcmljKHZhbHVlWzBdKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3JhbmdlJyB2YWx1ZSBpc24ndCBudW1lcmljLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdG9yZSB2YWx1ZXMuXG4gICAgICAgIHRoaXMueFBjdC5wdXNoKHBlcmNlbnRhZ2UpO1xuICAgICAgICB0aGlzLnhWYWwucHVzaCh2YWx1ZVswXSk7XG4gICAgICAgIHZhciB2YWx1ZTEgPSBOdW1iZXIodmFsdWVbMV0pO1xuICAgICAgICAvLyBOYU4gd2lsbCBldmFsdWF0ZSB0byBmYWxzZSB0b28sIGJ1dCB0byBrZWVwXG4gICAgICAgIC8vIGxvZ2dpbmcgY2xlYXIsIHNldCBzdGVwIGV4cGxpY2l0bHkuIE1ha2Ugc3VyZVxuICAgICAgICAvLyBub3QgdG8gb3ZlcnJpZGUgdGhlICdzdGVwJyBzZXR0aW5nIHdpdGggZmFsc2UuXG4gICAgICAgIGlmICghcGVyY2VudGFnZSkge1xuICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZTEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy54U3RlcHNbMF0gPSB2YWx1ZTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnhTdGVwcy5wdXNoKGlzTmFOKHZhbHVlMSkgPyBmYWxzZSA6IHZhbHVlMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54SGlnaGVzdENvbXBsZXRlU3RlcC5wdXNoKDApO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmhhbmRsZVN0ZXBQb2ludCA9IGZ1bmN0aW9uIChpLCBuKSB7XG4gICAgICAgIC8vIElnbm9yZSAnZmFsc2UnIHN0ZXBwaW5nLlxuICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwIG92ZXIgemVyby1sZW5ndGggcmFuZ2VzICgjOTQ4KTtcbiAgICAgICAgaWYgKHRoaXMueFZhbFtpXSA9PT0gdGhpcy54VmFsW2kgKyAxXSkge1xuICAgICAgICAgICAgdGhpcy54U3RlcHNbaV0gPSB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwW2ldID0gdGhpcy54VmFsW2ldO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhY3RvciB0byByYW5nZSByYXRpb1xuICAgICAgICB0aGlzLnhTdGVwc1tpXSA9XG4gICAgICAgICAgICBmcm9tUGVyY2VudGFnZShbdGhpcy54VmFsW2ldLCB0aGlzLnhWYWxbaSArIDFdXSwgbiwgMCkgLyBzdWJSYW5nZVJhdGlvKHRoaXMueFBjdFtpXSwgdGhpcy54UGN0W2kgKyAxXSk7XG4gICAgICAgIHZhciB0b3RhbFN0ZXBzID0gKHRoaXMueFZhbFtpICsgMV0gLSB0aGlzLnhWYWxbaV0pIC8gdGhpcy54TnVtU3RlcHNbaV07XG4gICAgICAgIHZhciBoaWdoZXN0U3RlcCA9IE1hdGguY2VpbChOdW1iZXIodG90YWxTdGVwcy50b0ZpeGVkKDMpKSAtIDEpO1xuICAgICAgICB2Y
10072XIgc3RlcCA9IHRoaXMueFZhbFtpXSArIHRoaXMueE51bVN0ZXBzW2ldICogaGlnaGVzdFN0ZXA7XG4gICAgICAgIHRoaXMueEhpZ2hlc3RDb21wbGV0ZVN0ZXBbaV0gPSBzdGVwO1xuICAgIH07XG4gICAgcmV0dXJuIFNwZWN0cnVtO1xufSgpKTtcbi8vZW5kcmVnaW9uXG4vL3JlZ2lvbiBPcHRpb25zXG4vKlx0RXZlcnkgaW5wdXQgb3B0aW9uIGlzIHRlc3RlZCBhbmQgcGFyc2VkLiBUaGlzIHdpbGwgcHJldmVudFxuICAgIGVuZGxlc3MgdmFsaWRhdGlvbiBpbiBpbnRlcm5hbCBtZXRob2RzLiBUaGVzZSB0ZXN0cyBhcmVcbiAgICBzdHJ1Y3R1cmVkIHdpdGggYW4gaXRlbSBmb3IgZXZlcnkgb3B0aW9uIGF2YWlsYWJsZS4gQW5cbiAgICBvcHRpb24gY2FuIGJlIG1hcmtlZCBhcyByZXF1aXJlZCBieSBzZXR0aW5nIHRoZSAncicgZmxhZy5cbiAgICBUaGUgdGVzdGluZyBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgICAgLSBUaGUgcHJvdmlkZWQgdmFsdWUgZm9yIHRoZSBvcHRpb247XG4gICAgICAgIC0gQSByZWZlcmVuY2UgdG8gdGhlIG9wdGlvbnMgb2JqZWN0O1xuICAgICAgICAtIFRoZSBuYW1lIGZvciB0aGUgb3B0aW9uO1xuXG4gICAgVGhlIHRlc3RpbmcgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkLFxuICAgIG9yIHRydWUgd2hlbiBldmVyeXRoaW5nIGlzIE9LLiBJdCBjYW4gYWxzbyBtb2RpZnkgdGhlIG9wdGlvblxuICAgIG9iamVjdCwgdG8gbWFrZSBzdXJlIGFsbCB2YWx1ZXMgY2FuIGJlIGNvcnJlY3RseSBsb29wZWQgZWxzZXdoZXJlLiAqL1xuLy9yZWdpb24gRGVmYXVsdHNcbnZhciBkZWZhdWx0Rm9ybWF0dGVyID0ge1xuICAgIHRvOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBcIlwiIDogdmFsdWUudG9GaXhlZCgyKTtcbiAgICB9LFxuICAgIGZyb206IE51bWJlcixcbn07XG52YXIgY3NzQ2xhc3NlcyA9IHtcbiAgICB0YXJnZXQ6IFwidGFyZ2V0XCIsXG4gICAgYmFzZTogXCJiYXNlXCIsXG4gICAgb3JpZ2luOiBcIm9yaWdpblwiLFxuICAgIGhhbmRsZTogXCJoYW5kbGVcIixcbiAgICBoYW5kbGVMb3dlcjogXCJoYW5kbGUtbG93ZXJcIixcbiAgICBoYW5kbGVVcHBlcjogXCJoYW5kbGUtdXBwZXJcIixcbiAgICB0b3VjaEFyZWE6IFwidG91Y2gtYXJlYVwiLFxuICAgIGhvcml6b250YWw6IFwiaG9yaXpvbnRhbFwiLFxuICAgIHZlcnRpY2FsOiBcInZlcnRpY2FsXCIsXG4gICAgYmFja2dyb3VuZDogXCJiYWNrZ3JvdW5kXCIsXG4gICAgY29ubmVjdDogXCJjb25uZWN0XCIsXG4gICAgY29ubmVjdHM6IFwiY29ubmVjdHNcIixcbiAgICBsdHI6IFwibHRyXCIsXG4gICAgcnRsOiBcInJ0bFwiLFxuICAgIHRleHREaXJlY3Rpb25MdHI6IFwidHh0LWRpci1sdHJcIixcbiAgICB0ZXh0RGlyZWN0aW9uUnRsOiBcInR4dC1kaXItcnRsXCIsXG4gICAgZHJhZ2dhYmxlOiBcImRyYWdnYWJsZVwiLFxuICAgIGRyYWc6IFwic3RhdGUtZHJhZ1wiLFxuICAgIHRhcDogXCJzdGF0ZS10YXBcIixcbiAgICBhY3RpdmU6IFwiYWN0aXZlXCIsXG4gICAgdG9vbHRpcDogXCJ0b29sdGlwXCIsXG4gICAgcGlwczogXCJwaXBzXCIsXG4gICAgcGlwc0hvcml6b250YWw6IFwicGlwcy1ob3Jpem9udGFsXCIsXG4gICAgcGlwc1ZlcnRpY2FsOiBcInBpcHMtdmVydGljYWxcIixcbiAgICBtYXJrZXI6IFwibWFya2VyXCIsXG4gICAgbWFya2VySG9yaXpvbnRhbDogXCJtYXJrZXItaG9yaXpvbnRhbFwiLFxuICAgIG1hcmtlclZlcnRpY2FsOiBcIm1hcmtlci12ZXJ0aWNhbFwiLFxuICAgIG1hcmtlck5vcm1hbDogXCJtYXJrZXItbm9ybWFsXCIsXG4gICAgbWFya2VyTGFyZ2U6IFwibWFya2VyLWxhcmdlXCIsXG4gICAgbWFya2VyU3ViOiBcIm1hcmtlci1zdWJcIixcbiAgICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICAgIHZhbHVlSG9yaXpvbnRhbDogXCJ2YWx1ZS1ob3Jpem9udGFsXCIsXG4gICAgdmFsdWVWZXJ0aWNhbDogXCJ2YWx1ZS12ZXJ0aWNhbFwiLFxuICAgIHZhbHVlTm9ybWFsOiBcInZhbHVlLW5vcm1hbFwiLFxuICAgIHZhbHVlTGFyZ2U6IFwidmFsdWUtbGFyZ2VcIixcbiAgICB2YWx1ZVN1YjogXCJ2YWx1ZS1zdWJcIixcbn07XG4vLyBOYW1lc3BhY2VzIG9mIGludGVybmFsIGV2ZW50IGxpc3RlbmVyc1xudmFyIElOVEVSTkFMX0VWRU5UX05TID0ge1xuICAgIHRvb2x0aXBzOiBcIi5fX3Rvb2x0aXBzXCIsXG4gICAgYXJpYTogXCIuX19hcmlhXCIsXG59O1xuLy9lbmRyZWdpb25cbmZ1bmN0aW9uIHRlc3RTdGVwKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoIWlzTnVtZXJpYyhlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3N0ZXAnIGlzIG5vdCBudW1lcmljLlwiKTtcbiAgICB9XG4gICAgLy8gVGhlIHN0ZXAgb3B0aW9uIGNhbiBzdGlsbCBiZSB1c2VkIHRvIHNldCBzdGVwcGluZ1xuICAgIC8vIGZvciBsaW5lYXIgc2xpZGVycy4gT3ZlcndyaXR0ZW4gaWYgc2V0IGluICdyYW5nZScuXG4gICAgcGFyc2VkLnNpbmdsZVN0ZXAgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RLZXlib2FyZFBhZ2VNdWx0aXBsaWVyKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoIWlzTnVtZXJpYyhlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2tleWJvYXJkUGFnZU11bHRpcGxpZXInIGlzIG5vdCBudW1lcmljLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmtleWJvYXJkUGFnZU11bHRpcGxpZXIgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RLZXlib2FyZE11bHRpcGxpZXIocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICghaXNOdW1lcmljKGVudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAna2V5Ym9hcmRNdWx0aXBsaWVyJyBpcyBub3QgbnVtZXJpYy5cIik7XG4gICAgfVxuICAgIHBhcnNlZC5rZXlib2FyZE11bHRpcGxpZXIgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RLZXlib2FyZERlZmF1bHRTdGVwKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoIWlzTnVtZXJpYyhlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2tleWJvYXJkRGVmYXVsdFN0ZXAnIGlzIG5vdCBudW1lcmljLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmtleWJvYXJkRGVmYXVsdFN0ZXAgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RSYW5nZShwYXJzZWQsIGVudHJ5KSB7XG4gICAgLy8gRmlsdGVyIGluY29ycmVjdCBpbnB1dC5cbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgI
10072HRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdyYW5nZScgaXMgbm90IGFuIG9iamVjdC5cIik7XG4gICAgfVxuICAgIC8vIENhdGNoIG1pc3Npbmcgc3RhcnQgb3IgZW5kLlxuICAgIGlmIChlbnRyeS5taW4gPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5tYXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBNaXNzaW5nICdtaW4nIG9yICdtYXgnIGluICdyYW5nZScuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQuc3BlY3RydW0gPSBuZXcgU3BlY3RydW0oZW50cnksIHBhcnNlZC5zbmFwIHx8IGZhbHNlLCBwYXJzZWQuc2luZ2xlU3RlcCk7XG59XG5mdW5jdGlvbiB0ZXN0U3RhcnQocGFyc2VkLCBlbnRyeSkge1xuICAgIGVudHJ5ID0gYXNBcnJheShlbnRyeSk7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQuIFZhbHVlcyBhcmVuJ3QgdGVzdGVkLCBhcyB0aGUgcHVibGljIC52YWwgbWV0aG9kXG4gICAgLy8gd2lsbCBhbHdheXMgcHJvdmlkZSBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgIWVudHJ5Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnc3RhcnQnIG9wdGlvbiBpcyBpbmNvcnJlY3QuXCIpO1xuICAgIH1cbiAgICAvLyBTdG9yZSB0aGUgbnVtYmVyIG9mIGhhbmRsZXMuXG4gICAgcGFyc2VkLmhhbmRsZXMgPSBlbnRyeS5sZW5ndGg7XG4gICAgLy8gV2hlbiB0aGUgc2xpZGVyIGlzIGluaXRpYWxpemVkLCB0aGUgLnZhbCBtZXRob2Qgd2lsbFxuICAgIC8vIGJlIGNhbGxlZCB3aXRoIHRoZSBzdGFydCBvcHRpb25zLlxuICAgIHBhcnNlZC5zdGFydCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdFNuYXAocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdzbmFwJyBvcHRpb24gbXVzdCBiZSBhIGJvb2xlYW4uXCIpO1xuICAgIH1cbiAgICAvLyBFbmZvcmNlIDEwMCUgc3RlcHBpbmcgd2l0aGluIHN1YnJhbmdlcy5cbiAgICBwYXJzZWQuc25hcCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdEFuaW1hdGUocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdhbmltYXRlJyBvcHRpb24gbXVzdCBiZSBhIGJvb2xlYW4uXCIpO1xuICAgIH1cbiAgICAvLyBFbmZvcmNlIDEwMCUgc3RlcHBpbmcgd2l0aGluIHN1YnJhbmdlcy5cbiAgICBwYXJzZWQuYW5pbWF0ZSA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdEFuaW1hdGlvbkR1cmF0aW9uKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdhbmltYXRpb25EdXJhdGlvbicgb3B0aW9uIG11c3QgYmUgYSBudW1iZXIuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQuYW5pbWF0aW9uRHVyYXRpb24gPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RDb25uZWN0KHBhcnNlZCwgZW50cnkpIHtcbiAgICB2YXIgY29ubmVjdCA9IFtmYWxzZV07XG4gICAgdmFyIGk7XG4gICAgLy8gTWFwIGxlZ2FjeSBvcHRpb25zXG4gICAgaWYgKGVudHJ5ID09PSBcImxvd2VyXCIpIHtcbiAgICAgICAgZW50cnkgPSBbdHJ1ZSwgZmFsc2VdO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbnRyeSA9PT0gXCJ1cHBlclwiKSB7XG4gICAgICAgIGVudHJ5ID0gW2ZhbHNlLCB0cnVlXTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIGJvb2xlYW4gb3B0aW9uc1xuICAgIGlmIChlbnRyeSA9PT0gdHJ1ZSB8fCBlbnRyeSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IHBhcnNlZC5oYW5kbGVzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbm5lY3QucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdC5wdXNoKGZhbHNlKTtcbiAgICB9XG4gICAgLy8gUmVqZWN0IGludmFsaWQgaW5wdXRcbiAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgIWVudHJ5Lmxlbmd0aCB8fCBlbnRyeS5sZW5ndGggIT09IHBhcnNlZC5oYW5kbGVzICsgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnY29ubmVjdCcgb3B0aW9uIGRvZXNuJ3QgbWF0Y2ggaGFuZGxlIGNvdW50LlwiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbm5lY3QgPSBlbnRyeTtcbiAgICB9XG4gICAgcGFyc2VkLmNvbm5lY3QgPSBjb25uZWN0O1xufVxuZnVuY3Rpb24gdGVzdE9yaWVudGF0aW9uKHBhcnNlZCwgZW50cnkpIHtcbiAgICAvLyBTZXQgb3JpZW50YXRpb24gdG8gYW4gYSBudW1lcmljYWwgdmFsdWUgZm9yIGVhc3lcbiAgICAvLyBhcnJheSBzZWxlY3Rpb24uXG4gICAgc3dpdGNoIChlbnRyeSkge1xuICAgICAgICBjYXNlIFwiaG9yaXpvbnRhbFwiOlxuICAgICAgICAgICAgcGFyc2VkLm9ydCA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInZlcnRpY2FsXCI6XG4gICAgICAgICAgICBwYXJzZWQub3J0ID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ29yaWVudGF0aW9uJyBvcHRpb24gaXMgaW52YWxpZC5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gdGVzdE1hcmdpbihwYXJzZWQsIGVudHJ5KSB7XG4gICAgaWYgKCFpc051bWVyaWMoZW50cnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdtYXJnaW4nIG9wdGlvbiBtdXN0IGJlIG51bWVyaWMuXCIpO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTgyXG4gICAgaWYgKGVudHJ5ID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyc2VkLm1hcmdpbiA9IHBhcnNlZC5zcGVjdHJ1bS5nZXREaXN0YW5jZShlbnRyeSk7XG59XG5mdW5jdGlvbiB0ZXN0TGltaXQocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICghaXNOdW1lcmljKGVudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnbGltaXQnIG9wdGlvbiBtdXN0IGJlIG51bWVyaWMuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQubGltaXQgPSBwYXJzZWQuc3BlY3RydW0uZ2V0RGlzdGFuY2UoZW50cnkpO1xuICAgIGlmICghcGFyc2VkLmxpbWl0IHx8IHBhcnNlZC5oYW5kbGVzIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnbGltaXQnIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBsaW5lYXIgc2xpZGVycyB3aXRoIDIgb3IgbW9yZSBoYW5kbGVzLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXN0UGFkZGluZyhwYXJzZWQsIGVudHJ5KSB7XG4gICAgdmFyIGluZGV4O1xuICAgIGlmICghaXNOdW1lcmljKGVudHJ5KSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3BhZGRpbmcnIG9wdGlvbiBtdXN0IGJlIG51bWVyaWMgb3IgYXJyYXkgb2YgZXhhY3RseSAyIG51bWJlcnMuXCIpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkgJiYgIShlbnRyeS5sZW5ndGggPT09IDIgfHwgaXNOdW1lcmljKGVudHJ5WzBdKSB8fCBpc051bWVyaWMoZW50cnlbMV0pKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAncGFkZGluZycgb3B0aW9uIG11c3QgYmUgbnVtZXJpYyBvciBhcnJheSBvZiBleGFjdGx5IDIgbnVtYmVycy5cIik7XG4gICAgfVxuICAgIGlmIChlbnRyeSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgZW50cnkgPSBbZW50cnksIGVudHJ5XTtcbiAgICB9XG4gICAgLy8gJ2dldERpc3RhbmNlJyByZXR1cm5zIGZhbHNlIGZvciBpbnZhbGlkIHZhbHVlcy5cbiAgICBwYXJzZWQucGFkZGluZyA9IFtwYXJzZWQuc3BlY3RydW0uZ2V0RGlzdGFuY2UoZW50cnlbMF0pLCBwYXJzZWQuc3BlY3RydW0uZ2V0RGlzdGFuY2UoZW50cnlbMV0pXTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJzZWQuc3BlY3RydW0ueE51bVN0ZXBzLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgICAgLy8gbGFzdCBcInJhbmdlXCIgY2FuJ3QgY29udGFpbiBzdGVwIHNpemUgYXMgaXQgaXMgcHVyZWx5IGFuIGVuZHBvaW50LlxuICAgICAgICBpZiAocGFyc2VkLnBhZGRpbmdbMF1baW5kZXhdIDwgMCB8fCBwYXJzZWQucGFkZGluZ1sxXVtpbmRleF0gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAncGFkZGluZycgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIocykuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciB0b3RhbFBhZGRpbmcgPSBlbnRyeVswXSArIGVudHJ5WzFdO1xuICAgIHZhciBmaXJzdFZhbHVlID0gcGFyc2VkLnNwZWN0cnVtLnhWYWxbMF07XG4gICAgdmFyIGxhc3RWYWx1ZSA9IHBhcnNlZC5zcGVjdHJ1bS54VmFsW3BhcnNlZC5zcGVjdHJ1bS54VmFsLmxlbmd0aCAtIDFdO1xuICAgIGlmICh0b3RhbFBhZGRpbmcgLyAobGFzdFZhbHVlIC0gZmlyc3RWYWx1ZSkgPiAxKSB7XG4gICAgICAgI
10072HRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdwYWRkaW5nJyBvcHRpb24gbXVzdCBub3QgZXhjZWVkIDEwMCUgb2YgdGhlIHJhbmdlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXN0RGlyZWN0aW9uKHBhcnNlZCwgZW50cnkpIHtcbiAgICAvLyBTZXQgZGlyZWN0aW9uIGFzIGEgbnVtZXJpY2FsIHZhbHVlIGZvciBlYXN5IHBhcnNpbmcuXG4gICAgLy8gSW52ZXJ0IGNvbm5lY3Rpb24gZm9yIFJUTCBzbGlkZXJzLCBzbyB0aGF0IHRoZSBwcm9wZXJcbiAgICAvLyBoYW5kbGVzIGdldCB0aGUgY29ubmVjdC9iYWNrZ3JvdW5kIGNsYXNzZXMuXG4gICAgc3dpdGNoIChlbnRyeSkge1xuICAgICAgICBjYXNlIFwibHRyXCI6XG4gICAgICAgICAgICBwYXJzZWQuZGlyID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicnRsXCI6XG4gICAgICAgICAgICBwYXJzZWQuZGlyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2RpcmVjdGlvbicgb3B0aW9uIHdhcyBub3QgcmVjb2duaXplZC5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gdGVzdEJlaGF2aW91cihwYXJzZWQsIGVudHJ5KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBpbnB1dCBpcyBhIHN0cmluZy5cbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdiZWhhdmlvdXInIG11c3QgYmUgYSBzdHJpbmcgY29udGFpbmluZyBvcHRpb25zLlwiKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkga2V5d29yZHMuXG4gICAgLy8gTm9uZSBhcmUgcmVxdWlyZWQuXG4gICAgdmFyIHRhcCA9IGVudHJ5LmluZGV4T2YoXCJ0YXBcIikgPj0gMDtcbiAgICB2YXIgZHJhZyA9IGVudHJ5LmluZGV4T2YoXCJkcmFnXCIpID49IDA7XG4gICAgdmFyIGZpeGVkID0gZW50cnkuaW5kZXhPZihcImZpeGVkXCIpID49IDA7XG4gICAgdmFyIHNuYXAgPSBlbnRyeS5pbmRleE9mKFwic25hcFwiKSA+PSAwO1xuICAgIHZhciBob3ZlciA9IGVudHJ5LmluZGV4T2YoXCJob3ZlclwiKSA+PSAwO1xuICAgIHZhciB1bmNvbnN0cmFpbmVkID0gZW50cnkuaW5kZXhPZihcInVuY29uc3RyYWluZWRcIikgPj0gMDtcbiAgICB2YXIgaW52ZXJ0Q29ubmVjdHMgPSBlbnRyeS5pbmRleE9mKFwiaW52ZXJ0LWNvbm5lY3RzXCIpID49IDA7XG4gICAgdmFyIGRyYWdBbGwgPSBlbnRyeS5pbmRleE9mKFwiZHJhZy1hbGxcIikgPj0gMDtcbiAgICB2YXIgc21vb3RoU3RlcHMgPSBlbnRyeS5pbmRleE9mKFwic21vb3RoLXN0ZXBzXCIpID49IDA7XG4gICAgaWYgKGZpeGVkKSB7XG4gICAgICAgIGlmIChwYXJzZWQuaGFuZGxlcyAhPT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2ZpeGVkJyBiZWhhdmlvdXIgbXVzdCBiZSB1c2VkIHdpdGggMiBoYW5kbGVzXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBtYXJnaW4gdG8gZW5mb3JjZSBmaXhlZCBzdGF0ZVxuICAgICAgICB0ZXN0TWFyZ2luKHBhcnNlZCwgcGFyc2VkLnN0YXJ0WzFdIC0gcGFyc2VkLnN0YXJ0WzBdKTtcbiAgICB9XG4gICAgaWYgKGludmVydENvbm5lY3RzICYmIHBhcnNlZC5oYW5kbGVzICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdpbnZlcnQtY29ubmVjdHMnIGJlaGF2aW91ciBtdXN0IGJlIHVzZWQgd2l0aCAyIGhhbmRsZXNcIik7XG4gICAgfVxuICAgIGlmICh1bmNvbnN0cmFpbmVkICYmIChwYXJzZWQubWFyZ2luIHx8IHBhcnNlZC5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3VuY29uc3RyYWluZWQnIGJlaGF2aW91ciBjYW5ub3QgYmUgdXNlZCB3aXRoIG1hcmdpbiBvciBsaW1pdFwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmV2ZW50cyA9IHtcbiAgICAgICAgdGFwOiB0YXAgfHwgc25hcCxcbiAgICAgICAgZHJhZzogZHJhZyxcbiAgICAgICAgZHJhZ0FsbDogZHJhZ0FsbCxcbiAgICAgICAgc21vb3RoU3RlcHM6IHNtb290aFN0ZXBzLFxuICAgICAgICBmaXhlZDogZml4ZWQsXG4gICAgICAgIHNuYXA6IHNuYXAsXG4gICAgICAgIGhvdmVyOiBob3ZlcixcbiAgICAgICAgdW5jb25zdHJhaW5lZDogdW5jb25zdHJhaW5lZCxcbiAgICAgICAgaW52ZXJ0Q29ubmVjdHM6IGludmVydENvbm5lY3RzLFxuICAgIH07XG59XG5mdW5jdGlvbiB0ZXN0VG9vbHRpcHMocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmIChlbnRyeSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZW50cnkgPT09IHRydWUgfHwgaXNWYWxpZFBhcnRpYWxGb3JtYXR0ZXIoZW50cnkpKSB7XG4gICAgICAgIHBhcnNlZC50b29sdGlwcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnNlZC5oYW5kbGVzOyBpKyspIHtcbiAgICAgICAgICAgIHBhcnNlZC50b29sdGlwcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW50cnkgPSBhc0FycmF5KGVudHJ5KTtcbiAgICAgICAgaWYgKGVudHJ5Lmxlbmd0aCAhPT0gcGFyc2VkLmhhbmRsZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6IG11c3QgcGFzcyBhIGZvcm1hdHRlciBmb3IgYWxsIGhhbmRsZXMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5LmZvckVhY2goZnVuY3Rpb24gKGZvcm1hdHRlcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgIT09IFwiYm9vbGVhblwiICYmICFpc1ZhbGlkUGFydGlhbEZvcm1hdHRlcihmb3JtYXR0ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3Rvb2x0aXBzJyBtdXN0IGJlIHBhc3NlZCBhIGZvcm1hdHRlciBvciAnZmFsc2UnLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlZC50b29sdGlwcyA9IGVudHJ5O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRlc3RIYW5kbGVBdHRyaWJ1dGVzKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoZW50cnkubGVuZ3RoICE9PSBwYXJzZWQuaGFuZGxlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBtdXN0IHBhc3MgYSBhdHRyaWJ1dGVzIGZvciBhbGwgaGFuZGxlcy5cIik7XG4gICAgfVxuICAgIHBhcnNlZC5oYW5kbGVBdHRyaWJ1dGVzID0gZW50cnk7XG59XG5mdW5jdGlvbiB0ZXN0QXJpYUZvcm1hdChwYXJzZWQsIGVudHJ5KSB7XG4gICAgaWYgKCFpc1ZhbGlkUGFydGlhbEZvcm1hdHRlcihlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2FyaWFGb3JtYXQnIHJlcXVpcmVzICd0bycgbWV0aG9kLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmFyaWFGb3JtYXQgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RGb3JtYXQocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICghaXNWYWxpZEZvcm1hdHRlcihlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2Zvcm1hdCcgcmVxdWlyZXMgJ3RvJyBhbmQgJ2Zyb20nIG1ldGhvZHMuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQuZm9ybWF0ID0gZW50cnk7XG59XG5mdW5jdGlvbiB0ZXN0S2V5Ym9hcmRTdXBwb3J0KHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAna2V5Ym9hcmRTdXBwb3J0JyBvcHRpb24gbXVzdCBiZSBhIGJvb2xlYW4uXCIpO1xuICAgIH1cbiAgICBwYXJzZWQua2V5Ym9hcmRTdXBwb3J0ID0gZW50cnk7XG59XG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRFbGVtZW50KHBhcnNlZCwgZW50cnkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGFkdmFuY2VkIG9wdGlvbi4gUGFzc2VkIHZhbHVlcyBhcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24uXG4gICAgcGFyc2VkLmRvY3VtZW50RWxlbWVudCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdENzc1ByZWZpeChwYXJzZWQsIGVudHJ5KSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gXCJzdHJpbmdcIiAmJiBlbn
10072RyeSAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2Nzc1ByZWZpeCcgbXVzdCBiZSBhIHN0cmluZyBvciBgZmFsc2VgLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmNzc1ByZWZpeCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdENzc0NsYXNzZXMocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2Nzc0NsYXNzZXMnIG11c3QgYmUgYW4gb2JqZWN0LlwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQuY3NzUHJlZml4ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBhcnNlZC5jc3NDbGFzc2VzID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGVudHJ5KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHBhcnNlZC5jc3NDbGFzc2VzW2tleV0gPSBwYXJzZWQuY3NzUHJlZml4ICsgZW50cnlba2V5XTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwYXJzZWQuY3NzQ2xhc3NlcyA9IGVudHJ5O1xuICAgIH1cbn1cbi8vIFRlc3QgYWxsIGRldmVsb3BlciBzZXR0aW5ncyBhbmQgcGFyc2UgdG8gYXNzdW1wdGlvbi1zYWZlIHZhbHVlcy5cbmZ1bmN0aW9uIHRlc3RPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAvLyBUbyBwcm92ZSBhIGZpeCBmb3IgIzUzNywgZnJlZXplIG9wdGlvbnMgaGVyZS5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIG1vZGlmaWVkLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAvLyBPYmplY3QuZnJlZXplKG9wdGlvbnMpO1xuICAgIHZhciBwYXJzZWQgPSB7XG4gICAgICAgIG1hcmdpbjogbnVsbCxcbiAgICAgICAgbGltaXQ6IG51bGwsXG4gICAgICAgIHBhZGRpbmc6IG51bGwsXG4gICAgICAgIGFuaW1hdGU6IHRydWUsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAzMDAsXG4gICAgICAgIGFyaWFGb3JtYXQ6IGRlZmF1bHRGb3JtYXR0ZXIsXG4gICAgICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdHRlcixcbiAgICB9O1xuICAgIC8vIFRlc3RzIGFyZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJlc2VudGVkIGhlcmUuXG4gICAgdmFyIHRlc3RzID0ge1xuICAgICAgICBzdGVwOiB7IHI6IGZhbHNlLCB0OiB0ZXN0U3RlcCB9LFxuICAgICAgICBrZXlib2FyZFBhZ2VNdWx0aXBsaWVyOiB7IHI6IGZhbHNlLCB0OiB0ZXN0S2V5Ym9hcmRQYWdlTXVsdGlwbGllciB9LFxuICAgICAgICBrZXlib2FyZE11bHRpcGxpZXI6IHsgcjogZmFsc2UsIHQ6IHRlc3RLZXlib2FyZE11bHRpcGxpZXIgfSxcbiAgICAgICAga2V5Ym9hcmREZWZhdWx0U3RlcDogeyByOiBmYWxzZSwgdDogdGVzdEtleWJvYXJkRGVmYXVsdFN0ZXAgfSxcbiAgICAgICAgc3RhcnQ6IHsgcjogdHJ1ZSwgdDogdGVzdFN0YXJ0IH0sXG4gICAgICAgIGNvbm5lY3Q6IHsgcjogdHJ1ZSwgdDogdGVzdENvbm5lY3QgfSxcbiAgICAgICAgZGlyZWN0aW9uOiB7IHI6IHRydWUsIHQ6IHRlc3REaXJlY3Rpb24gfSxcbiAgICAgICAgc25hcDogeyByOiBmYWxzZSwgdDogdGVzdFNuYXAgfSxcbiAgICAgICAgYW5pbWF0ZTogeyByOiBmYWxzZSwgdDogdGVzdEFuaW1hdGUgfSxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IHsgcjogZmFsc2UsIHQ6IHRlc3RBbmltYXRpb25EdXJhdGlvbiB9LFxuICAgICAgICByYW5nZTogeyByOiB0cnVlLCB0OiB0ZXN0UmFuZ2UgfSxcbiAgICAgICAgb3JpZW50YXRpb246IHsgcjogZmFsc2UsIHQ6IHRlc3RPcmllbnRhdGlvbiB9LFxuICAgICAgICBtYXJnaW46IHsgcjogZmFsc2UsIHQ6IHRlc3RNYXJnaW4gfSxcbiAgICAgICAgbGltaXQ6IHsgcjogZmFsc2UsIHQ6IHRlc3RMaW1pdCB9LFxuICAgICAgICBwYWRkaW5nOiB7IHI6IGZhbHNlLCB0OiB0ZXN0UGFkZGluZyB9LFxuICAgICAgICBiZWhhdmlvdXI6IHsgcjogdHJ1ZSwgdDogdGVzdEJlaGF2aW91ciB9LFxuICAgICAgICBhcmlhRm9ybWF0OiB7IHI6IGZhbHNlLCB0OiB0ZXN0QXJpYUZvcm1hdCB9LFxuICAgICAgICBmb3JtYXQ6IHsgcjogZmFsc2UsIHQ6IHRlc3RGb3JtYXQgfSxcbiAgICAgICAgdG9vbHRpcHM6IHsgcjogZmFsc2UsIHQ6IHRlc3RUb29sdGlwcyB9LFxuICAgICAgICBrZXlib2FyZFN1cHBvcnQ6IHsgcjogdHJ1ZSwgdDogdGVzdEtleWJvYXJkU3VwcG9ydCB9LFxuICAgICAgICBkb2
10072N1bWVudEVsZW1lbnQ6IHsgcjogZmFsc2UsIHQ6IHRlc3REb2N1bWVudEVsZW1lbnQgfSxcbiAgICAgICAgY3NzUHJlZml4OiB7IHI6IHRydWUsIHQ6IHRlc3RDc3NQcmVmaXggfSxcbiAgICAgICAgY3NzQ2xhc3NlczogeyByOiB0cnVlLCB0OiB0ZXN0Q3NzQ2xhc3NlcyB9LFxuICAgICAgICBoYW5kbGVBdHRyaWJ1dGVzOiB7IHI6IGZhbHNlLCB0OiB0ZXN0SGFuZGxlQXR0cmlidXRlcyB9LFxuICAgIH07XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgICBjb25uZWN0OiBmYWxzZSxcbiAgICAgICAgZGlyZWN0aW9uOiBcImx0clwiLFxuICAgICAgICBiZWhhdmlvdXI6IFwidGFwXCIsXG4gICAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIixcbiAgICAgICAga2V5Ym9hcmRTdXBwb3J0OiB0cnVlLFxuICAgICAgICBjc3NQcmVmaXg6IFwibm9VaS1cIixcbiAgICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3NlcyxcbiAgICAgICAga2V5Ym9hcmRQYWdlTXVsdGlwbGllcjogNSxcbiAgICAgICAga2V5Ym9hcmRNdWx0aXBsaWVyOiAxLFxuICAgICAgICBrZXlib2FyZERlZmF1bHRTdGVwOiAxMCxcbiAgICB9O1xuICAgIC8vIEFyaWFGb3JtYXQgZGVmYXVsdHMgdG8gcmVndWxhciBmb3JtYXQsIGlmIGFueS5cbiAgICBpZiAob3B0aW9ucy5mb3JtYXQgJiYgIW9wdGlvbnMuYXJpYUZvcm1hdCkge1xuICAgICAgICBvcHRpb25zLmFyaWFGb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcbiAgICB9XG4gICAgLy8gUnVuIGFsbCBvcHRpb25zIHRocm91Z2ggYSB0ZXN0aW5nIG1lY2hhbmlzbSB0byBlbnN1cmUgY29ycmVjdFxuICAgIC8vIGlucHV0LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBvcHRpb25zIG1pZ2h0IGdldCBtb2RpZmllZCB0b1xuICAgIC8vIGJlIGhhbmRsZWQgcHJvcGVybHkuIEUuZy4gd3JhcHBpbmcgaW50ZWdlcnMgaW4gYXJyYXlzLlxuICAgIE9iamVjdC5rZXlzKHRlc3RzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIElmIHRoZSBvcHRpb24gaXNuJ3Qgc2V0LCBidXQgaXQgaXMgcmVxdWlyZWQsIHRocm93IGFuIGVycm9yLlxuICAgICAgICBpZiAoIWlzU2V0KG9wdGlvbnNbbmFtZV0pICYmIGRlZmF1bHRzW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0ZXN0c1tuYW1lXS5yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ1wiICsgbmFtZSArIFwiJyBpcyByZXF1aXJlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGVzdHNbbmFtZV0udChwYXJzZWQsICFpc1NldChvcHRpb25zW25hbWVdKSA/IGRlZmF1bHRzW25hbWVdIDogb3B0aW9uc1tuYW1lXSk7XG4gICAgfSk7XG4gICAgLy8gRm9yd2FyZCBwaXBzIG9wdGlvbnNcbiAgICBwYXJzZWQucGlwcyA9IG9wdGlvbnMucGlwcztcbiAgICAvLyBBbGwgcmVjZW50IGJyb3dzZXJzIGFjY2VwdCB1bnByZWZpeGVkIHRyYW5zZm9ybS5cbiAgICAvLyBXZSBuZWVkIC1tcy0gZm9yIElFOSBhbmQgLXdlYmtpdC0gZm9yIG9sZGVyIEFuZHJvaWQ7XG4gICAgLy8gQXNzdW1lIHVzZSBvZiAtd2Via2l0LSBpZiB1bnByZWZpeGVkIGFuZCAtbXMtIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9dHJhbnNmb3JtczJkXG4gICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHZhciBtc1ByZWZpeCA9IGQuc3R5bGUubXNUcmFuc2Zvcm0gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbm9QcmVmaXggPSBkLnN0eWxlLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkO1xuICAgIHBhcnNlZC50cmFuc2Zvcm1SdWxlID0gbm9QcmVmaXggPyBcInRyYW5zZm9ybVwiIDogbXNQcmVmaXggPyBcIm1zVHJhbnNmb3JtXCIgOiBcIndlYmtpdFRyYW5zZm9ybVwiO1xuICAgIC8vIFBpcHMgZG9uJ3QgbW92ZSwgc28gd2UgY2FuIHBsYWNlIHRoZW0gdXNpbmcgbGVmdC90b3AuXG4gICAgdmFyIHN0eWxlcyA9IFtcbiAgICAgICAgW1wibGVmdFwiLCBcInRvcFwiXSxcbiAgICAgICAgW1wicmlnaHRcIiwgXCJib3R0b21cIl0sXG4gICAgXTtcbiAgICBwYXJzZWQuc3R5bGUgPSBzdHlsZXNbcGFyc2VkLmRpcl1bcGFyc2VkLm9ydF07XG4gICAgcmV0dXJuIHBhcnNlZDtcbn1cbi8vZW5kcmVnaW9uXG5mdW5jdGlvbiBzY29wZSh0YXJnZXQsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucykge1xuICAgIHZhciBhY3Rpb25zID0gZ2V0QWN0aW9ucygpO1xuICAgIHZhciBzdXBwb3J0c1RvdWNoQWN0aW9uTm9uZSA9IGdldFN1cHBvcnRzVG91Y2hBY3Rpb25Ob25lKCk7XG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IHN1cHBvcnRzVG91Y2hBY3Rpb25Ob25lICYmIGdldFN1cHBvcnRzUGFzc2l2ZSgpO1xuICAgIC8vIEFsbCB2YXJpYWJsZXMgbG9jYWwgdG8gJ3Njb3BlJyBhcmUgcHJlZml4ZWQgd2l0aCAnc2NvcGVfJ1xuICAgIC8vIFNsaWRlciBET00gTm9kZXNcbiAgICB2YXIgc2NvcGVfVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHZhciBzY29wZV9CYXNlO1xuICAgIHZhciBzY29wZV9Db25uZWN0QmFzZTtcbiAgICB2YXIgc2NvcGVfSGFuZGxlcztcbiAgICB2YXIgc2NvcGVfQ29ubmVjdHM7XG4gICAgdmFyIHNjb3BlX1BpcHM7XG4gICAgdmFyIHNjb3BlX1Rvb2x0aXBzO1xuICAgIC8vIFNsaWRlciBzdGF0ZSB2YWx1ZXNcbiAgICB2YXIgc2NvcGVfU3BlY3RydW0gPSBvcHRpb25zLnNwZWN0cnVtO1xuICAgIHZhciBzY29wZV9WYWx1ZXMgPSBbXTtcbiAgICB2YXIgc2NvcGVfTG9jYXRpb25zID0gW107XG4gICAgdmFyIHNjb3BlX0hhbmRsZU51bWJlcnMgPSBbXTtcbiAgICB2YXIgc2NvcGVfQWN0aXZlSGFuZGxlc0NvdW50ID0gMDtcbiAgICB2YXIgc2NvcGVfRXZlbnRzID0ge307XG4gICAgdmFyIHNjb3BlX0Nvbm5lY3RzSW52ZXJ0ZWQgPSBmYWxzZTtcbiAgICAvLyBEb2N1bWVudCBOb2Rlc1xuICAgIHZhciBzY29wZV9Eb2N1bWVudCA9IHRhcmdldC5vd25lckRvY3VtZW50O1xuICAgIHZhciBzY29wZV9Eb2N1bWVudEVsZW1lbnQgPSBvcHRpb25zLmRvY3VtZW50RWxlbWVudCB8fCBzY29wZV9Eb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIHNjb3BlX0JvZHkgPSBzY29wZV9Eb2N1bWVudC5ib2R5O1xuICAgIC8vIEZvciBob3Jpem9udGFsIHNsaWRlcnMgaW4gc3RhbmRhcmQgbHRyIGRvY3VtZW50cyxcbiAgICAvLyBtYWtlIC5ub1VpLW9yaWdpbiBvdmVyZmxvdyB0byB0aGUgbGVmdCBzbyB0aGUgZG9jdW1lbnQgZG9lc24ndCBzY3JvbGwuXG4gICAgdmFyIHNjb3BlX0Rpck9mZnNldCA9IHNjb3BlX0RvY3VtZW50LmRpciA9PT0gXCJydGxcIiB8fCBvcHRpb25zLm9ydCA9PT0gMSA/IDAgOiAxMDA7XG4gICAgLy8gQ3JlYXRlcyBhIG5vZGUsIGFkZHMgaXQgdG8gdGFyZ2V0LCByZXR1cm5zIHRoZSBuZXcgbm9kZS5cbiAgICBmdW5jdGlvbiBhZGROb2RlVG8oYWRkVGFyZ2V0LCBjbGFzc05hbWUpIHtcbiAgICAgICAgdmFyIGRpdiA9IHNjb3BlX0RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGRpdiwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUYXJnZXQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9XG4gICAgLy8gQXBwZW5kIGEgb3Jp
10072Z2luIHRvIHRoZSBiYXNlXG4gICAgZnVuY3Rpb24gYWRkT3JpZ2luKGJhc2UsIGhhbmRsZU51bWJlcikge1xuICAgICAgICB2YXIgb3JpZ2luID0gYWRkTm9kZVRvKGJhc2UsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5vcmlnaW4pO1xuICAgICAgICB2YXIgaGFuZGxlID0gYWRkTm9kZVRvKG9yaWdpbiwgb3B0aW9ucy5jc3NDbGFzc2VzLmhhbmRsZSk7XG4gICAgICAgIGFkZE5vZGVUbyhoYW5kbGUsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50b3VjaEFyZWEpO1xuICAgICAgICBoYW5kbGUuc2V0QXR0cmlidXRlKFwiZGF0YS1oYW5kbGVcIiwgU3RyaW5nKGhhbmRsZU51bWJlcikpO1xuICAgICAgICBpZiAob3B0aW9ucy5rZXlib2FyZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvR2xvYmFsX2F0dHJpYnV0ZXMvdGFiaW5kZXhcbiAgICAgICAgICAgIC8vIDAgPSBmb2N1c2FibGUgYW5kIHJlYWNoYWJsZVxuICAgICAgICAgICAgaGFuZGxlLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRLZXlkb3duKGV2ZW50LCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaGFuZGxlQXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2Y
10072XIgYXR0cmlidXRlc18xID0gb3B0aW9ucy5oYW5kbGVBdHRyaWJ1dGVzW2hhbmRsZU51bWJlcl07XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzXzEpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhdHRyaWJ1dGVzXzFbYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGUuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInNsaWRlclwiKTtcbiAgICAgICAgaGFuZGxlLnNldEF0dHJpYnV0ZShcImFyaWEtb3JpZW50YXRpb25cIiwgb3B0aW9ucy5vcnQgPyBcInZlcnRpY2FsXCIgOiBcImhvcml6b250YWxcIik7XG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGhhbmRsZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmhhbmRsZUxvd2VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoYW5kbGVOdW1iZXIgPT09IG9wdGlvbnMuaGFuZGxlcyAtIDEpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGhhbmRsZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmhhbmRsZVVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnaW4uaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICByZXR1cm4gb3JpZ2luO1xuICAgIH1cbiAgICAvLyBJbnNlcnQgbm9kZXMgZm9yIGNvbm5lY3QgZWxlbWVudHNcbiAgICBmdW5jdGlvbiBhZGRDb25uZWN0KGJhc2UsIGFkZCkge1xuICAgICAgICBpZiAoIWFkZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGROb2RlVG8oYmFzZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmNvbm5lY3QpO1xuICAgIH1cbiAgICAvLyBBZGQgaGFuZGxlcyB0byB0aGUgc2xpZGVyIGJhc2UuXG4gICAgZnVuY3Rpb24gYWRkRWxlbWVudHMoY29ubmVjdE9wdGlvbnMsIGJhc2UpIHtcbiAgICAgICAgc2NvcGVfQ29ubmVjdEJhc2UgPSBhZGROb2RlVG8oYmFzZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmNvbm5lY3RzKTtcbiAgICAgICAgc2NvcGVfSGFuZGxlcyA9IFtdO1xuICAgICAgICBzY29wZV9Db25uZWN0cyA9IFtdO1xuICAgICAgICBzY29wZV9Db25uZWN0cy5wdXNoKGFkZENvbm5lY3Qoc2NvcGVfQ29ubmVjdEJhc2UsIGNvbm5lY3RPcHRpb25zWzBdKSk7XG4gICAgICAgIC8vIFs6Ojo6Tz09PT1PPT09PU89PT09XVxuICAgICAgICAvLyBjb25uZWN0T3B0aW9ucyA9IFswLCAxLCAxLCAxXVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMuaGFuZGxlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgYWRkZWQgaGFuZGxlcy5cbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXMucHVzaChhZGRPcmlnaW4oYmFzZSwgaSkpO1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVyc1tpXSA9IGk7XG4gICAgICAgICAgICBzY29wZV9Db25uZWN0cy5wdXNoKGFkZENvbm5lY3Qoc2NvcGVfQ29ubmVjdEJhc2UsIGNvbm5lY3RPcHRpb25zW2kgKyAxXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgYSBzaW5nbGUgc2xpZGVyLlxuICAgIGZ1bmN0aW9uIGFkZFNsaWRlcihhZGRUYXJnZXQpIHtcbiAgICAgICAgLy8gQXBwbHkgY2xhc3NlcyBhbmQgZGF0YSB0byB0aGUgdGFyZ2V0LlxuICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50YXJnZXQpO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXIgPT09IDApIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGFkZFRhcmdldCwgb3B0aW9ucy5jc3NDbGFzc2VzLmx0cik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5ydGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm9ydCA9PT0gMCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoYWRkVGFyZ2V0LCBvcHRpb25zLmNzc0NsYXNzZXMuaG9yaXpvbn
10072RhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy52ZXJ0aWNhbCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHREaXJlY3Rpb24gPSBnZXRDb21wdXRlZFN0eWxlKGFkZFRhcmdldCkuZGlyZWN0aW9uO1xuICAgICAgICBpZiAodGV4dERpcmVjdGlvbiA9PT0gXCJydGxcIikge1xuICAgICAgICAgICAgYWRkQ2xhc3MoYWRkVGFyZ2V0LCBvcHRpb25zLmNzc0NsYXNzZXMudGV4dERpcmVjdGlvblJ0bCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50ZXh0RGlyZWN0aW9uTHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkTm9kZVRvKGFkZFRhcmdldCwgb3B0aW9ucy5jc3NDbGFzc2VzLmJhc2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRUb29sdGlwKGhhbmRsZSwgaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy50b29sdGlwcyB8fCAhb3B0aW9ucy50b29sdGlwc1toYW5kbGVOdW1iZXJdKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZE5vZGVUbyhoYW5kbGUuZmlyc3RDaGlsZCwgb3B0aW9ucy5jc3NDbGFzc2VzLnRvb2x0aXApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1NsaWRlckRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gc2NvcGVfVGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIHRoZSBzbGlkZXIgZHJhZ2dpbmcgaWYgYW55IGhhbmRsZSBpcyBkaXNhYmxlZFxuICAgIGZ1bmN0aW9uIGlzSGFuZGxlRGlzYWJsZWQoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIHZhciBoYW5kbGVPcmlnaW4gPSBzY29wZV9IYW5kbGVzW2hhbmRsZU51bWJlcl07XG4gICAgICAgIHJldHVybiBoYW5kbGVPcmlnaW4uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGUoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXIgIT09IG51bGwgJiYgaGFuZGxlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5oYW5kbGUucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzY29wZV9UYXJnZXQuc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgXCJcIik7XG4gICAgICAgICAgICBzY29wZV9IYW5kbGVzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlbmFibGUoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXIgIT09IG51bGwgJiYgaGFuZGxlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5oYW5kbGUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2NvcGVfVGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlcy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVUb29sdGlwcygpIHtcbiAgICAgICAgaWYgKHNjb3BlX1Rvb2x0aXBzKSB7XG4gICAgICAgICAgICByZW1vdmVFdmVudChcInVwZGF0ZVwiICsgSU5URVJOQUxfRVZFTlRfTlMudG9vbHRpcHMpO1xuICAgICAgICAgICAgc2NvcGVfVG9vbHRpcHMuZm9yRWFjaChmdW5jdGlvbiAodG9vbHRpcCkge1xuICAgICAgICAgICAgICAgIGlmICh0b29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQodG9vbHRpcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzY29wZV9Ub29sdGlwcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIHRvb2x0aXBzIG9wdGlvbiBpcyBhIHNob3J0aGFuZCBmb3IgdXNpbmcgdGhlICd1cGRhdGUnIGV2ZW50LlxuICAgIGZ1bmN0aW9uIHRvb2x0aXBzKCkge1xuICAgICAgICByZW1vdmVUb29sdGlwcygpO1xuICAgICAgICAvLyBUb29sdGlwcyBhcmUgYWRkZWQgd2l0aCBvcHRpb25zLnRvb2x0aXBzIGluIG9yaWdpbmFsIG9yZGVyLlxuICAgICAgICBzY29wZV9Ub29sdGlwcyA9IHNjb3BlX0hhbmRsZXMubWFwKGFkZFRvb2x0aXApO1xuICAgICAgICBiaW5kRXZlbnQoXCJ1cGRhdGVcIiArIElOVEVSTkFMX0VWRU5UX05TLnRvb2x0aXBzLCBmdW5jdGlvbiAodmFsdWVzLCBoYW5kbGVOdW1iZXIsIHVuZW5jb2RlZCkge1xuICAgICAgICAgICAgaWYgKCFzY29wZV9Ub29sdGlwcyB8fCAhb3B0aW9ucy50b29sdGlwcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY29wZV9Ub29sdGlwc1toYW5kbGVOdW1iZXJdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlc1toYW5kbGVOdW1iZXJdO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudG9vbHRpcHNbaGFuZGxlTnVtYmVyXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlID0gb3B0aW9ucy50b29sdGlwc1toYW5kbGVOdW1iZXJdLnRvKHVuZW5jb2RlZ
10072FtoYW5kbGVOdW1iZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlX1Rvb2x0aXBzW2hhbmRsZU51bWJlcl0uaW5uZXJIVE1MID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcmlhKCkge1xuICAgICAgICByZW1vdmVFdmVudChcInVwZGF0ZVwiICsgSU5URVJOQUxfRVZFTlRfTlMuYXJpYSk7XG4gICAgICAgIGJpbmRFdmVudChcInVwZGF0ZVwiICsgSU5URVJOQUxfRVZFTlRfTlMuYXJpYSwgZnVuY3Rpb24gKHZhbHVlcywgaGFuZGxlTnVtYmVyLCB1bmVuY29kZWQsIHRhcCwgcG9zaXRpb25zKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgQXJpYSBWYWx1ZXMgZm9yIGFsbCBoYW5kbGVzLCBhcyBhIGNoYW5nZSBpbiBvbmUgY2hhbmdlcyBtaW4gYW5kIG1heCB2YWx1ZXMgZm9yIHRoZSBuZXh0LlxuICAgICAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBzY29wZV9IYW5kbGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgbWluID0gY2hlY2tIYW5kbGVQb3NpdGlvbihzY29wZV9Mb2NhdGlvbnMsIGluZGV4LCAwLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgbWF4ID0gY2hlY2tIYW5kbGVQb3NpdGlvbihzY29wZV9Mb2NhdGlvbnMsIGluZGV4LCAxMDAsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBub3cgPSBwb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIEZvcm1hdHRlZCB2YWx1ZSBmb3IgZGlzcGxheVxuICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gU3RyaW5nKG9wdGlvbnMuYXJpYUZvcm1hdC50byh1bmVuY29kZWRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgICAgLy8gTWFwIHRvIHNsaWRlciByYW5nZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBtaW4gPSBzY29wZV9TcGVjdHJ1bS5mcm9tU3RlcHBpbmcobWluKS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgICAgIG1heCA9IHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyhtYXgpLnRvRml4ZWQoMSk7XG4gICAgICAgICAgICAgICAgbm93ID0gc2NvcGVfU3BlY3RydW0uZnJvbVN0ZXBwaW5nKG5vdykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW1pblwiLCBtaW4pO1xuICAgICAgICAgICAgICAgIGhhbmRsZS5jaGlsZHJlblswXS5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbWF4XCIsIG1heCk7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIiwgbm93KTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIiwgdGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEdyb3VwKHBpcHMpIHtcbiAgICAgICAgLy8gVXNlIHRoZSByYW5nZS5cbiAgICAgICAgaWYgKHBpcHMubW9kZSA9PT0gUGlwc01vZGUuUmFuZ2UgfHwgcGlwcy5tb2RlID09PSBQaXBzTW9kZS5TdGVwcykge1xuICAgICAgICAgICAgcmV0dXJuIHNjb3BlX1NwZWN0cnVtLnhWYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpcHMubW9kZSA9PT0gUGlwc01vZGUuQ291bnQpIHtcbiAgICAgICAgICAgIGlmIChwaXBzLnZhbHVlcyA8IDIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAndmFsdWVzJyAoPj0gMikgcmVxdWlyZWQgZm9yIG1vZGUgJ2NvdW50Jy5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEaXZpZGUgMCAtIDEwMCBpbiAnY291bnQnIHBhcnRzLlxuICAgICAgICAgICAgdmFyIGludGVydmFsID0gcGlwcy52YWx1ZXMgLSAxO1xuICAgICAgICAgICAgdmFyIHNwcmVhZCA9IDEwMCAvIGludGVydmFsO1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgLy8gTGlzdCB0aGVzZSBwYXJ0cyBhbmQgaGF2ZSB0aGVtIGhhbmRsZWQgYXMgJ3Bvc2l0aW9ucycuXG4gICAgICAgICAgICB3aGlsZSAoaW50ZXJ2YWwtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpbnRlcnZhbF0gPSBpbnRlcnZhbCAqIHNwcmVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gbWFwVG9SYW5nZSh2YWx1ZXMsIHBpcHMuc3RlcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpcHMubW9kZSA9PT0gUGlwc01vZGUuUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAvLyBNYXAgYWxsIHBlcmNlbnRhZ2VzIHRvIG9uLXJhbmdlIHZhbHVlcy5cbiAgICAgICAgICAgIHJldHVybiBtYXBUb1JhbmdlKHBpcHMudmFsdWVzLCBwaXBzLnN0ZXBwZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaXBzLm1vZGUgPT09IFBpcHNNb2RlLlZhbHVlcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIG11c3QgYmUgc3RlcHBlZCwgaXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGVyY2VudGFnZSBmaXJzdC5cbiAgICAgICAgICAgIGlmIChwaXBzLnN0ZXBwZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGlwcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UsIGFwcGx5IHN0ZXAsIHJldHVybiB0byB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyhzY29wZV9TcGVjdHJ1bS5nZXRTdGVwKHNjb3BlX1NwZWN0cnVtLnRvU3RlcHBpbmcodmFsdWUpKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNhbiBzaW1wbHkgdXNlIHRoZSB2YWx1ZXMuXG4gICAgICAgICAgICByZXR1cm4gcGlwcy52YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdOyAvLyBwaXBzLm1vZGUgPSBuZXZlclxuICAgIH1cbiAgICBmdW5jdGlvbiBtYXBUb1JhbmdlKHZhbHVlcywgc3RlcHBlZCkge1xuICAgICAgICByZXR1cm4gdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgI
10072HJldHVybiBzY29wZV9TcGVjdHJ1bS5mcm9tU3RlcHBpbmcoc3RlcHBlZCA/IHNjb3BlX1NwZWN0cnVtLmdldFN0ZXAodmFsdWUpIDogdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVTcHJlYWQocGlwcykge1xuICAgICAgICBmdW5jdGlvbiBzYWZlSW5jcmVtZW50KHZhbHVlLCBpbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGZsb2F0aW5nIHBvaW50IHZhcmlhbmNlIGJ5IGRyb3BwaW5nIHRoZSBzbWFsbGVzdCBkZWNpbWFsIHBsYWNlcy5cbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoKHZhbHVlICsgaW5jcmVtZW50KS50b0ZpeGVkKDcpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JvdXAgPSBnZXRHcm91cChwaXBzKTtcbiAgICAgICAgdmFyIGluZGV4ZXMgPSB7fTtcbiAgICAgICAgdmFyIGZpcnN0SW5SYW5nZSA9IHNjb3BlX1NwZWN0cnVtLnhWYWxbMF07XG4gICAgICAgIHZhciBsYXN0SW5SYW5nZSA9IHNjb3BlX1NwZWN0cnVtLnhWYWxbc2NvcGVfU3BlY3RydW0ueFZhbC5sZW5ndGggLSAxXTtcbiAgICAgICAgdmFyIGlnbm9yZUZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHZhciBpZ25vcmVMYXN0ID0gZmFsc2U7XG4gICAgICAgIHZhciBwcmV2UGN0ID0gMDtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgZ3JvdXAsIHNvcnQgaXQgYW5kIGZpbHRlciBhd2F5IGFsbCBkdXBsaWNhdGVzLlxuICAgICAgICBncm91cCA9IHVuaXF1ZShncm91cC5zbGljZSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJhbmdlIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgICAgICBpZiAoZ3JvdXBbMF0gIT09IGZpcnN0SW5SYW5nZSkge1xuICAgICAgICAgICAgZ3JvdXAudW5zaGlmdChmaXJzdEluUmFuZ2UpO1xuICAgICAgICAgICAgaWdub3JlRmlyc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIExpa2V3aXNlIGZvciB0aGUgbGFzdCBvbmUuXG4gICAgICAgIGlmIChncm91cFtncm91cC5sZW5ndGggLSAxXSAhPT0gbGFzdEluUmFuZ2UpIHtcbiAgICAgICAgICAgIGdyb3VwLnB1c2gobGFzdEluUmFuZ2UpO1xuICAgICAgICAgICAgaWdub3JlTGFzdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBzdGVwIGFuZCB0aGUgbG93ZXIgKyB1cHBlciBwb3NpdGlvbnMuXG4gICAgICAgICAgICB2Y
10072XIgc3RlcDtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgdmFyIHE7XG4gICAgICAgICAgICB2YXIgbG93ID0gY3VycmVudDtcbiAgICAgICAgICAgIHZhciBoaWdoID0gZ3JvdXBbaW5kZXggKyAxXTtcbiAgICAgICAgICAgIHZhciBuZXdQY3Q7XG4gICAgICAgICAgICB2YXIgcGN0RGlmZmVyZW5jZTtcbiAgICAgICAgICAgIHZhciBwY3RQb3M7XG4gICAgICAgICAgICB2YXIgdHlwZTtcbiAgICAgICAgICAgIHZhciBzdGVwcztcbiAgICAgICAgICAgIHZhciByZWFsU3RlcHM7XG4gICAgICAgICAgICB2YXIgc3RlcFNpemU7XG4gICAgICAgICAgICB2YXIgaXNTdGVwcyA9IHBpcHMubW9kZSA9PT0gUGlwc01vZGUuU3RlcHM7XG4gICAgICAgICAgICAvLyBXaGVuIHVzaW5nICdzdGVwcycgbW9kZSwgdXNlIHRoZSBwcm92aWRlZCBzdGVwcy5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgc3RlcCBvbiB0byB0aGUgbmV4dCBzdWJyYW5nZS5cbiAgICAgICAgICAgIGlmIChpc1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IHNjb3BlX1NwZWN0cnVtLnhOdW1TdGVwc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGEgJ2Z1bGwnIHN0ZXAuXG4gICAgICAgICAgICBpZiAoIXN0ZXApIHtcbiAgICAgICAgICAgICAgICBzdGVwID0gaGlnaCAtIGxvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGhpZ2ggaXMgdW5kZWZpbmVkIHdlIGFyZSBhdCB0aGUgbGFzdCBzdWJyYW5nZS4gTWFrZSBzdXJlIGl0IGl0ZXJhdGVzIG9uY2UgKCMxMDg4KVxuICAgICAgICAgICAgaWYgKGhpZ2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBsb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgc3RlcCBpc24ndCAwLCB3aGljaCB3b3VsZCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wICgjNjU0KVxuICAgICAgICAgICAgc3RlcCA9IE1hdGgubWF4KHN0ZXAsIDAuMDAwMDAwMSk7XG4gICAgICAgICAgICAvLyBGaW5kIGFsbCBzdGVwcyBpbiB0aGUgc3VicmFuZ2UuXG4gICAgICAgICAgICBmb3IgKGkgPSBsb3c7IGkgPD0gaGlnaDsgaSA9IHNhZmVJbmNyZW1lbnQoaSwgc3RlcCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBlcmNlbnRhZ2UgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHN0ZXAsXG4gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBzaXplIGZvciB0aGUgc3VicmFuZ2UuXG4gICAgICAgICAgICAgICAgbmV3UGN0ID0gc2NvcGVfU3BlY3RydW0udG9TdGVwcGluZyhpKTtcbiAgICAgICAgICAgICAgICBwY3REaWZmZXJlbmNlID0gbmV3UGN0IC0gcHJldlBjdDtcbiAgICAgICAgICAgICAgICBzdGVwcyA9IHBjdERpZmZlcmVuY2UgLyAocGlwcy5kZW5zaXR5IHx8IDEpO1xuICAgICAgICAgICAgICAgIHJlYWxTdGVwcyA9IE1hdGgucm91bmQoc3RlcHMpO1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgcmF0aW8gcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHBlcmNlbnRhZ2Utc3BhY2UgYSBwb2ludCBpbmRpY2F0ZXMuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGEgZGVuc2l0eSAxIHRoZSBwb2ludHMvcGVyY2VudGFnZSA9IDEuIEZvciBkZW5zaXR5IDIsIHRoYXQgcGVyY2VudGFnZSBuZWVkcyB0byBiZSByZS1kaXZpZGVkLlxuICAgICAgICAgICAgICAgIC8vIFJvdW5kIHRoZSBwZXJjZW50YWdlIG9mZnNldCB0byBhbiBldmVuIG51bWJlciwgdGhlbiBkaXZpZGUgYnkgdHdvXG4gICAgICAgICAgICAgICAgLy8gdG8gc3ByZWFkIHRoZSBvZmZzZXQgb24gYm90aCBzaWRlcyBvZiB0aGUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgc3RlcFNpemUgPSBwY3REaWZmZXJlbmNlIC8gcmVhbFN0ZXBzO1xuICAgICAgICAgICAgICAgIC8vIERpdmlkZSBhbGwgcG9pbnRzIGV2ZW5seSwgYWRkaW5nIHRoZSBjb3JyZWN0IG51bWJlciB0byB0aGlzIHN1YnJhbmdlLlxuICAgICAgICAgICAgICAgIC8vIFJ1biB1cCB0byA8PSBzbyB0aGF0IDEwMCUgZ2V0cyBhIHBvaW50LCBldmVudCBpZiBpZ25vcmVMYXN0IGlzIHNldC5cbiAgICAgICAgICAgICAgICBmb3IgKHEgPSAxOyBxIDw9IHJlYWxTdGVwczsgcSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByYXRpbyBiZXR3ZWVuIHRoZSByb3VuZGVkIHZhbHVlIGFuZCB0aGUgYWN0dWFsIHNpemUgbWlnaHQgYmUgfjElIG9mZi5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgcGVyY2VudGFnZSBvZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwb2ludHNcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyIHN1YnJhbmdlLiBkZW5zaXR5ID0gMSB3aWxsIHJlc3VsdCBpbiAxMDAgcG9pbnRzIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBmdWxsIHJhbmdlLCAyIGZvciA1MCwgNCBmb3IgMjUsIGV0Yy5cbiAgICAgICAgICAgICAgICAgICAgcGN0UG9zID0gcHJldlBjdCArIHEgKiBzdGVwU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlc1twY3RQb3MudG9GaXhlZCg1KV0gPSBbc2NvcGVfU3BlY3RydW0uZnJvbVN0ZXBwaW5nKHBjdFBvcyksIDBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHBvaW50IHR5cGUuXG4gICAgICAgICAgICAgICAgdHlwZSA9IGdyb3VwLmluZGV4T2YoaSkgPiAtMSA/IFBpcHNUeXBlLkxhcmdlVmFsdWUgOiBpc1N0ZXBzID8gUGlwc1R5cGUuU21hbGxWYWx1ZSA6IFBpcHNUeXBlLk5vVmFsdWU7XG4gICAgICAgICAgICAgICAgLy8gRW5mb3JjZSB0aGUgJ2lnbm9yZUZpcnN0JyBvcHRpb24gYnkgb3ZlcndyaXRpbmcgdGhlIHR5cGUgZm9yIDAuXG4gICAgICAgICAgICAgICAgaWYgKCFpbmRleCAmJiBpZ25vcmVGaXJzdCAmJiBpICE9PSBoaWdoKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIShpID09PSBoaWdoICYmIGlnbm9yZUxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlICd0eXBlJyBvZiB0aGlzIHBvaW50LiAwID0gcGxhaW4sIDEgPSByZWFsIHZhbHVlLCAyID0gc3RlcCB2YWx1ZS
100725cbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlc1tuZXdQY3QudG9GaXhlZCg1KV0gPSBbaSwgdHlwZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVyY2VudGFnZSBjb3VudC5cbiAgICAgICAgICAgICAgICBwcmV2UGN0ID0gbmV3UGN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1hcmtpbmcoc3ByZWFkLCBmaWx0ZXJGdW5jLCBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBzY29wZV9Eb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgdmFsdWVTaXplQ2xhc3NlcyA9IChfYSA9IHt9LFxuICAgICAgICAgICAgX2FbUGlwc1R5cGUuTm9uZV0gPSBcIlwiLFxuICAgICAgICAgICAgX2FbUGlwc1R5cGUuTm9WYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVOb3JtYWwsXG4gICAgICAgICAgICBfYVtQaXBzVHlwZS5MYXJnZVZhbHVlXSA9IG9wdGlvbnMuY3NzQ2xhc3Nlcy52YWx1ZUxhcmdlLFxuICAgICAgICAgICAgX2FbUGlwc1R5cGUuU21hbGxWYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVTdWIsXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIHZhciBtYXJrZXJTaXplQ2xhc3NlcyA9IChfYiA9IHt9LFxuICAgICAgICAgICAgX2JbUGlwc1R5cGUuTm9uZV0gPSBcIlwiLFxuICAgICAgICAgICAgX2JbUGlwc1R5cGUuTm9WYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMubWFya2VyTm9ybWFsLFxuICAgICAgICAgICAgX2JbUGlwc1R5cGUuTGFyZ2VWYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMubWFya2VyTGFyZ2UsXG4gICAgICAgICAgICBfYltQaXBzVHlwZS5TbWFsbFZhbHVlXSA9IG9wdGlvbnMuY3NzQ2xhc3Nlcy5tYXJrZXJTdWIsXG4gICAgICAgICAgICBfYik7XG4gICAgICAgIHZhciB2YWx1ZU9yaWVudGF0aW9uQ2xhc3NlcyA9IFtvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVIb3Jpem9udGFsLCBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVWZXJ0aWNhbF07XG4gICAgICAgIHZhciBtYXJrZXJPcmllbnRhdGlvbkNsYXNzZXMgPSBbb3B0aW9ucy5jc3NDbGFzc2VzLm1hcmtlckhvcml6b250YWwsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5tYXJrZXJWZXJ0aWNhbF07XG4gICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5waXBzKTtcbiAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgb3B0aW9ucy5vcnQgPT09IDAgPyBvcHRpb25zLmNzc0NsYXNzZXMucGlwc0hvcml6b250YWwgOiBvcHRpb25zLmNzc0NsYXNzZXMucGlwc1ZlcnRpY2FsKTtcbiAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhc3Nlcyh0eXBlLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIHZhciBhID0gc291cmNlID09PSBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWU7XG4gICAgICAgICAgICB2Y
10072XIgb3JpZW50YXRpb25DbGFzc2VzID0gYSA/IHZhbHVlT3JpZW50YXRpb25DbGFzc2VzIDogbWFya2VyT3JpZW50YXRpb25DbGFzc2VzO1xuICAgICAgICAgICAgdmFyIHNpemVDbGFzc2VzID0gYSA/IHZhbHVlU2l6ZUNsYXNzZXMgOiBtYXJrZXJTaXplQ2xhc3NlcztcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2UgKyBcIiBcIiArIG9yaWVudGF0aW9uQ2xhc3Nlc1tvcHRpb25zLm9ydF0gKyBcIiBcIiArIHNpemVDbGFzc2VzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFkZFNwcmVhZChvZmZzZXQsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIGZ1bmN0aW9uLCBpZiBpdCBpcyBzZXQuXG4gICAgICAgICAgICB0eXBlID0gZmlsdGVyRnVuYyA/IGZpbHRlckZ1bmModmFsdWUsIHR5cGUpIDogdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBQaXBzVHlwZS5Ob25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWRkIGEgbWFya2VyIGZvciBldmVyeSBwb2ludFxuICAgICAgICAgICAgdmFyIG5vZGUgPSBhZGROb2RlVG8oZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAgICAgbm9kZS5jbGFzc05hbWUgPSBnZXRDbGFzc2VzKHR5cGUsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5tYXJrZXIpO1xuICAgICAgICAgICAgbm9kZS5zdHlsZVtvcHRpb25zLnN0eWxlXSA9IG9mZnNldCArIFwiJVwiO1xuICAgICAgICAgICAgLy8gVmFsdWVzIGFyZSBvbmx5IGFwcGVuZGVkIGZvciBwb2ludHMgbWFya2VkICcxJyBvciAnMicuXG4gICAgICAgICAgICBpZiAodHlwZSA+IFBpcHNUeXBlLk5vVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gYWRkTm9kZVRvKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBub2RlLmNsYXNzTmFtZSA9IGdldENsYXNzZXModHlwZSwgb3B0aW9ucy5jc3NDbGFzc2VzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtdmFsdWVcIiwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgbm9kZS5zdHlsZVtvcHRpb25zLnN0eWxlXSA9IG9mZnNldCArIFwiJVwiO1xuICAgICAgICAgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gU3RyaW5nKGZvcm1hdHRlci50byh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFwcGVuZCBhbGwgcG9pbnRzLlxuICAgICAgICBPYmplY3Qua2V5cyhzcHJlYWQpLmZvckVhY2goZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICAgICAgYWRkU3ByZWFkKG9mZnNldCwgc3ByZWFkW29mZnNldF1bMF0sIHNwcmVhZFtvZmZzZXRdWzFdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVQaXBzKCkge1xuICAgICAgICBpZiAoc2NvcGVfUGlwcykge1xuICAgICAgICAgICAgcmVtb3ZlRWxlbWVudChzY29wZV9QaXBzKTtcbiAgICAgICAgICAgIHNjb3BlX1BpcHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpcHMocGlwcykge1xuICAgICAgICAvLyBGaXggIzY2OVxuICAgICAgICByZW1vdmVQaXBzKCk7XG4gICAgICAgIHZhciBzcHJlYWQgPSBnZW5lcmF0ZVNwcmVhZChwaXBzKTtcbiAgICAgICAgdmFyIGZpbHRlciA9IHBpcHMuZmlsdGVyO1xuICAgICAgICB2Y
10072XIgZm9ybWF0ID0gcGlwcy5mb3JtYXQgfHwge1xuICAgICAgICAgICAgdG86IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGVfUGlwcyA9IHNjb3BlX1RhcmdldC5hcHBlbmRDaGlsZChhZGRNYXJraW5nKHNwcmVhZCwgZmlsdGVyLCBmb3JtYXQpKTtcbiAgICAgICAgcmV0dXJuIHNjb3BlX1BpcHM7XG4gICAgfVxuICAgIC8vIFNob3J0aGFuZCBmb3IgYmFzZSBkaW1lbnNpb25zLlxuICAgIGZ1bmN0aW9uIGJhc2VTaXplKCkge1xuICAgICAgICB2YXIgcmVjdCA9IHNjb3BlX0Jhc2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBhbHQgPSAoXCJvZmZzZXRcIiArIFtcIldpZHRoXCIsIFwiSGVpZ2h0XCJdW29wdGlvbnMub3J0XSk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9ydCA9PT0gMCA/IHJlY3Qud2lkdGggfHwgc2NvcGVfQmFzZVthbHRdIDogcmVjdC5oZWlnaHQgfHwgc2NvcGVfQmFzZVthbHRdO1xuICAgIH1cbiAgICAvLyBIYW5kbGVyIGZvciBhdHRhY2hpbmcgZXZlbnRzIHRyb3VnaCBhIHByb3h5LlxuICAgIGZ1bmN0aW9uIGF0dGFjaEV2ZW50KGV2ZW50cywgZWxlbWVudCwgY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byAnZmlsdGVyJyBldmVudHMgdG8gdGhlIHNsaWRlci5cbiAgICAgICAgLy8gZWxlbWVudCBpcyBhIG5vZGUsIG5vdCBhIG5vZGVMaXN0XG4gICAgICAgIHZhciBtZXRob2QgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBlID0gZml4RXZlbnQoZXZlbnQsIGRhdGEucGFnZU9mZnNldCwgZGF0YS50YXJnZXQgfHwgZWxlbWVudCk7XG4gICAgICAgICAgICAvLyBmaXhFdmVudCByZXR1cm5zIGZhbHNlIGlmIHRoaXMgZXZlbnQgaGFzIGEgZGlmZmVyZW50IHRhcmdldFxuICAgICAgICAgICAgLy8gd2hlbiBoYW5kbGluZyAobXVsdGktKSB0b3VjaCBldmVudHM7XG4gICAgICAgICAgICBpZiAoIWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb05vdFJlamVjdCBpcyBwYXNzZWQgYnkgYWxsIGVuZCBldmVudHMgdG8gbWFrZSBzdXJlIHJlbGVhc2VkIHRvdWNoZXNcbiAgICAgICAgICAgIC8vIGFyZSBub3QgcmVqZWN0ZWQsIGxlYXZpbmcgdGhlIHNsaWRlciBcInN0dWNrXCIgdG8gdGhlIGN1cnNvcjtcbiAgICAgICAgICAgIGlmIChpc1NsaWRlckRpc2FibGVkKCkgJiYgIWRhdGEuZG9Ob3RSZWplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdG9wIGlmIGFuIGFjdGl2ZSAndGFwJyB0cmFuc2l0aW9uIGlzIHRha2luZyBwbGFjZS5cbiAgICAgICAgICAgIGlmIChoYXNDbGFzcyhzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50YXApICYmICFkYXRhLmRvTm90UmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWdub3JlIHJpZ2h0IG9yIG1pZGRsZSBjbGlja3Mgb24gc3RhcnQgIzQ1NFxuICAgICAgICAgICAgaWYgKGV2ZW50cyA9PT0gYWN0aW9ucy5zdGFydCAmJiBlLmJ1dHRvbnMgIT09IHVuZGVmaW5lZCAmJiBlLmJ1dHRvbnMgPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWdub3JlIHJpZ2h0IG9yIG1pZGRsZSBjbGlja3Mgb24gc3RhcnQgIzQ1NFxuICAgICAgICAgICAgaWYgKGRhdGEuaG92ZXIgJiYgZS5idXR0b25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gJ3N1cHBvcnRzUGFzc2l2ZScgaXMgb25seSB0cnVlIGlmIGEgYnJvd3NlciBhbHNvIHN1cHBvcnRzIHRvdWNoLWFjdGlvbjogbm9uZSBpbiBDU1MuXG4gICAgICAgICAgICAvLyBpT1Mgc2FmYXJpIGRvZXMgbm90LCBzbyBpdCBkb2Vzbid0IGdldCB0byBiZW5lZml0IGZyb20gcGFzc2l2ZSBzY3JvbGxpbmcuIGlPUyBkb2VzIHN1cHBvcnRcbiAgICAgICAgICAgIC8vIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uLCBidXQgdGhhdCBhbGxvd3MgcGFubmluZywgd2hpY2ggYnJlYWtzXG4gICAgICAgICAgICAvLyBzbGlkZXJzIGFmdGVyIHpvb21pbmcvb24gbm9uLXJlc3BvbnNpdmUgcGFnZXMuXG4gICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzMxMTJcbiAgICAgICAgICAgIGlmICghc3VwcG9ydHNQYXNzaXZlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5jYWxjUG9pbnQgPSBlLnBvaW50c1tvcHRpb25zLm9ydF07XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyIHdpdGggdGhlIGV2ZW50IFsgYW5kIGFkZGl0aW9uYWwgZGF0YSBdLlxuICAgICAgICAgICAgY2FsbGJhY2soZSwgZGF0YSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH07XG4gICAgICAgIHZhciBtZXRob2RzID0gW107XG4gICAgICAgIC8vIEJpbmQgYSBjbG9zdXJlIG9uIHRoZSB0YXJnZXQgZm9yIGV2ZXJ5IGV2ZW50IHR5cGUuXG4gICAgICAgIGV2ZW50cy5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBtZXRob2QsIHN1cHBvcnRzUGFzc2l2ZSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogZmFsc2UpO1xuICAgICAgICAgICAgbWV0aG9kcy5wdXNoKFtldmVudE5hbWUsIG1ldGhvZF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZHM7XG4gICAgfVxuICAgIC8vIFByb3ZpZGUgYSBjbGVhbiBldmVudCB3aXRoIHN0YW5kYXJkaXplZCBvZmZzZXQgdmFsdWVzLlxuICAgIGZ1bmN0aW9uIGZpeEV2ZW50KGUsIHBhZ2VPZmZzZXQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIC8vIEZpbHRlciB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIHR5cGUsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyB0b3VjaCwgbW91c2Ugb3IgcG9pbnRlci4gT2Zmc2V0IGNoYW5nZXMgbmVlZCB0byBiZVxuICAgICAgICAvLyBtYWRlIG9uIGFuIGV2ZW50IHNwZWNpZmljIGJhc2lzLlxuICAgICAgICB2Y
10072XIgdG91Y2ggPSBlLnR5cGUuaW5kZXhPZihcInRvdWNoXCIpID09PSAwO1xuICAgICAgICB2YXIgbW91c2UgPSBlLnR5cGUuaW5kZXhPZihcIm1vdXNlXCIpID09PSAwO1xuICAgICAgICB2YXIgcG9pbnRlciA9IGUudHlwZS5pbmRleE9mKFwicG9pbnRlclwiKSA9PT0gMDtcbiAgICAgICAgdmFyIHggPSAwO1xuICAgICAgICB2YXIgeSA9IDA7XG4gICAgICAgIC8vIElFMTAgaW1wbGVtZW50ZWQgcG9pbnRlciBldmVudHMgd2l0aCBhIHByZWZpeDtcbiAgICAgICAgaWYgKGUudHlwZS5pbmRleE9mKFwiTVNQb2ludGVyXCIpID09PSAwKSB7XG4gICAgICAgICAgICBwb2ludGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFcnJvbmVvdXMgZXZlbnRzIHNlZW0gdG8gYmUgcGFzc2VkIGluIG9jY2FzaW9uYWxseSBvbiBpT1MvaVBhZE9TIGFmdGVyIHVzZXIgZmluaXNoZXMgaW50ZXJhY3Rpbmcgd2l0aFxuICAgICAgICAvLyB0aGUgc2xpZGVyLiBUaGV5IGFwcGVhciB0byBiZSBvZiB0eXBlIE1vdXNlRXZlbnQsIHlldCB0aGV5IGRvbid0IGhhdmUgdXN1YWwgcHJvcGVydGllcyBzZXQuIElnbm9yZVxuICAgICAgICAvLyBldmVudHMgdGhhdCBoYXZlIG5vIHRvdWNoZXMgb3IgYnV0dG9ucyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gKCMxMDU3LCAjMTA3OSwgIzEwOTUpXG4gICAgICAgIGlmIChlLnR5cGUgPT09IFwibW91c2Vkb3duXCIgJiYgIWUuYnV0dG9ucyAmJiAhZS50b3VjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgb25lIGhhbmRsZSBzaG91bGQgYmUgY29uY2VybmVkIGFib3V0IGlzIHRoZSB0b3VjaGVzIHRoYXQgb3JpZ2luYXRlZCBvbiB0b3Agb2YgaXQuXG4gICAgICAgIGlmICh0b3VjaCkge1xuICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGEgdG91Y2ggb3JpZ2luYXRlZCBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgICAgdmFyIGlzVG91Y2hPblRhcmdldCA9IGZ1bmN0aW9uIChjaGVja1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGNoZWNrVG91Y2gudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiAodGFyZ2V0ID09PSBldmVudFRhcmdldCB8fFxuICAgICAgICAgICAgICAgICAgICBldmVudFRhcmdldC5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlLmNvbXBvc2VkICYmIGUuY29tcG9zZWRQYXRoKCkuc2hpZnQoKSA9PT0gZXZlbnRUYXJnZXQpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0b3VjaHN0YXJ0IGV2ZW50cywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgc3RpbGwgbm8gbW9yZSB0aGFuIG9uZVxuICAgICAgICAgICAgLy8gdG91Y2ggb24gdGhlIHRhcmdldCBzbyB3ZSBsb29rIGFtb25nc3QgYWxsIHRvdWNoZXMuXG4gICAgICAgICAgICBpZiAoZS50eXBlID09PSBcInRvdWNoc3RhcnRcIikge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRUb3VjaGVzID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUudG91Y2hlcywgaXNUb3VjaE9uVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIHRvdWNoIHBlciBoYW5kbGUuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHggPSB0YXJnZXRUb3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgICAgICAgIHkgPSB0YXJnZXRUb3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIG90aGVyIGNhc2VzLCBmaW5kIG9uIGNoYW5nZWRUb3VjaGVzIGlzIGVub3VnaC5cbiAgICAgICAgICAgICAgICB2Y
10072XIgdGFyZ2V0VG91Y2ggPSBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKGUuY2hhbmdlZFRvdWNoZXMsIGlzVG91Y2hPblRhcmdldCk7XG4gICAgICAgICAgICAgICAgLy8gQ2FuY2VsIGlmIHRoZSB0YXJnZXQgdG91Y2ggaGFzIG5vdCBtb3ZlZC5cbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFRvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeCA9IHRhcmdldFRvdWNoLnBhZ2VYO1xuICAgICAgICAgICAgICAgIHkgPSB0YXJnZXRUb3VjaC5wYWdlWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwYWdlT2Zmc2V0ID0gcGFnZU9mZnNldCB8fCBnZXRQYWdlT2Zmc2V0KHNjb3BlX0RvY3VtZW50KTtcbiAgICAgICAgaWYgKG1vdXNlIHx8IHBvaW50ZXIpIHtcbiAgICAgICAgICAgIHggPSBlLmNsaWVudFggKyBwYWdlT2Zmc2V0Lng7XG4gICAgICAgICAgICB5ID0gZS5jbGllbnRZICsgcGFnZU9mZnNldC55O1xuICAgICAgICB9XG4gICAgICAgIGUucGFnZU9mZnNldCA9IHBhZ2VPZmZzZXQ7XG4gICAgICAgIGUucG9pbnRzID0gW3gsIHldO1xuICAgICAgICBlLmN1cnNvciA9IG1vdXNlIHx8IHBvaW50ZXI7IC8vIEZpeCAjNDM1XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICAvLyBUcmFuc2xhdGUgYSBjb29yZGluYXRlIGluIHRoZSBkb2N1bWVudCB0byBhIHBlcmNlbnRhZ2Ugb24gdGhlIHNsaWRlclxuICAgIGZ1bmN0aW9uIGNhbGNQb2ludFRvUGVyY2VudGFnZShjYWxjUG9pbnQpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uID0gY2FsY1BvaW50IC0gb2Zmc2V0KHNjb3BlX0Jhc2UsIG9wdGlvbnMub3J0KTtcbiAgICAgICAgdmFyIHByb3Bvc2FsID0gKGxvY2F0aW9uICogMTAwKSAvIGJhc2VTaXplKCk7XG4gICAgICAgIC8vIENsYW1wIHByb3Bvc2FsIGJldHdlZW4gMCUgYW5kIDEwMCVcbiAgICAgICAgLy8gT3V0LW9mLWJvdW5kIGNvb3JkaW5hdGVzIG1heSBvY2N1ciB3aGVuIC5ub1VpLWJhc2UgcHNldWRvLWVsZW1lbnRzXG4gICAgICAgIC8vIGFyZSB1c2VkIChlLmcuIGNvbnRhaW5lZCBoYW5kbGVzIGZlYXR1cmUpXG4gICAgICAgIHByb3Bvc2FsID0gbGltaXQocHJvcG9zYWwpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kaXIgPyAxMDAgLSBwcm9wb3NhbCA6IHByb3Bvc2FsO1xuICAgIH1cbiAgICAvLyBGaW5kIGhhbmRsZSBjbG9zZXN0IHRvIGEgY2VydGFpbiBwZXJjZW50YWdlIG9uIHRoZSBzbGlkZXJcbiAgICBmdW5jdGlvbiBnZXRDbG9zZXN0SGFuZGxlKGNsaWNrZWRQb3NpdGlvbikge1xuICAgICAgICB2Y
10072XIgc21hbGxlc3REaWZmZXJlbmNlID0gMTAwO1xuICAgICAgICB2YXIgaGFuZGxlTnVtYmVyID0gZmFsc2U7XG4gICAgICAgIHNjb3BlX0hhbmRsZXMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlLCBpbmRleCkge1xuICAgICAgICAgICAgLy8gRGlzYWJsZWQgaGFuZGxlcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgaWYgKGlzSGFuZGxlRGlzYWJsZWQoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhhbmRsZVBvc2l0aW9uID0gc2NvcGVfTG9jYXRpb25zW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBkaWZmZXJlbmNlV2l0aFRoaXNIYW5kbGUgPSBNYXRoLmFicyhoYW5kbGVQb3NpdGlvbiAtIGNsaWNrZWRQb3NpdGlvbik7XG4gICAgICAgICAgICAvLyBJbml0aWFsIHN0YXRlXG4gICAgICAgICAgICB2YXIgY2xpY2tBdEVkZ2UgPSBkaWZmZXJlbmNlV2l0aFRoaXNIYW5kbGUgPT09IDEwMCAmJiBzbWFsbGVzdERpZmZlcmVuY2UgPT09IDEwMDtcbiAgICAgICAgICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB0aGlzIGhhbmRsZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzbHkgY2hlY2tlZCBoYW5kbGVcbiAgICAgICAgICAgIHZhciBpc0Nsb3NlciA9IGRpZmZlcmVuY2VXaXRoVGhpc0hhbmRsZSA8IHNtYWxsZXN0RGlmZmVyZW5jZTtcbiAgICAgICAgICAgIHZhciBpc0Nsb3NlckFmdGVyID0gZGlmZmVyZW5jZVdpdGhUaGlzSGFuZGxlIDw9IHNtYWxsZXN0RGlmZmVyZW5jZSAmJiBjbGlja2VkUG9zaXRpb24gPiBoYW5kbGVQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmIChpc0Nsb3NlciB8fCBpc0Nsb3NlckFmdGVyIHx8IGNsaWNrQXRFZGdlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlTnVtYmVyID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgc21hbGxlc3REaWZmZXJlbmNlID0gZGlmZmVyZW5jZVdpdGhUaGlzSGFuZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZU51bWJlcjtcbiAgICB9XG4gICAgLy8gRmlyZSAnZW5kJyB3aGVuIGEgbW91c2Ugb3IgcGVuIGxlYXZlcyB0aGUgZG9jdW1lbnQuXG4gICAgZnVuY3Rpb24gZG9jdW1lbnRMZWF2ZShldmVudCwgZGF0YSkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJtb3VzZW91dFwiICYmXG4gICAgICAgICAgICBldmVudC50YXJnZXQubm9kZU5hbWUgPT09IFwiSFRNTFwiICYmXG4gICAgICAgICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudEVuZChldmVudCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlIG1vdmVtZW50IG9uIGRvY3VtZW50IGZvciBoYW5kbGUgYW5kIHJhbmdlIGRyYWcuXG4gICAgZnVuY3Rpb24gZXZlbnRNb3ZlKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIC8vIEZpeCAjNDk4XG4gICAgICAgIC8vIENoZWNrIHZhbHVlIG9mIC5idXR0b25zIGluICdzdGFydCcgdG8gd29yayBhcm91bmQgYSBidWcgaW4gSUUxMCBtb2JpbGUgKGRhdGEuYnV0dG9uc1Byb3BlcnR5KS5cbiAgICAgICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy85MjcwMDUvbW9iaWxlLWllMTAtd2luZG93cy1waG9uZS1idXR0b25zLXByb3BlcnR5LW9mLXBvaW50ZXJtb3ZlLWV2ZW50LWFsd2F5cy16ZXJvXG4gICAgICAgIC8vIElFOSBoYXMgLmJ1dHRvbnMgYW5kIC53aGljaCB6ZXJvIG9uIG1vdXNlbW92ZS5cbiAgICAgICAgLy8gRmlyZWZveCBicmVha3MgdGhlIHNwZWMgTUROIGRlZmluZXMuXG4gICAgICAgIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKFwiTVNJRSA5XCIpID09PSAtMSAmJiBldmVudC5idXR0b25zID09PSAwICYmIGRhdGEuYnV0dG9uc1Byb3BlcnR5ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRFbmQoZXZlbnQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBtb3ZpbmcgdXAgb3IgZG93blxuICAgICAgICB2Y
10072XIgbW92ZW1lbnQgPSAob3B0aW9ucy5kaXIgPyAtMSA6IDEpICogKGV2ZW50LmNhbGNQb2ludCAtIGRhdGEuc3RhcnRDYWxjUG9pbnQpO1xuICAgICAgICAvLyBDb252ZXJ0IHRoZSBtb3ZlbWVudCBpbnRvIGEgcGVyY2VudGFnZSBvZiB0aGUgc2xpZGVyIHdpZHRoL2hlaWdodFxuICAgICAgICB2YXIgcHJvcG9zYWwgPSAobW92ZW1lbnQgKiAxMDApIC8gZGF0YS5iYXNlU2l6ZTtcbiAgICAgICAgbW92ZUhhbmRsZXMobW92ZW1lbnQgPiAwLCBwcm9wb3NhbCwgZGF0YS5sb2NhdGlvbnMsIGRhdGEuaGFuZGxlTnVtYmVycywgZGF0YS5jb25uZWN0KTtcbiAgICB9XG4gICAgLy8gVW5iaW5kIG1vdmUgZXZlbnRzIG9uIGRvY3VtZW50LCBjYWxsIGNhbGxiYWNrcy5cbiAgICBmdW5jdGlvbiBldmVudEVuZChldmVudCwgZGF0YSkge1xuICAgICAgICAvLyBUaGUgaGFuZGxlIGlzIG5vIGxvbmdlciBhY3RpdmUsIHNvIHJlbW92ZSB0aGUgY2xhc3MuXG4gICAgICAgIGlmIChkYXRhLmhhbmRsZSkge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZGF0YS5oYW5kbGUsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5hY3RpdmUpO1xuICAgICAgICAgICAgc2NvcGVfQWN0aXZlSGFuZGxlc0NvdW50IC09IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5iaW5kIHRoZSBtb3ZlIGFuZCBlbmQgZXZlbnRzLCB3aGljaCBhcmUgYWRkZWQgb24gJ3N0YXJ0Jy5cbiAgICAgICAgZGF0YS5saXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgc2NvcGVfRG9jdW1lbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoY1swXSwgY1sxXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2NvcGVfQWN0aXZlSGFuZGxlc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgZHJhZ2dpbmcgY2xhc3MuXG4gICAgICAgICAgICByZW1vdmVDbGFzcyhzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5kcmFnKTtcbiAgICAgICAgICAgIHNldFppbmRleCgpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGN1cnNvciBzdHlsZXMgYW5kIHRleHQtc2VsZWN0aW9uIGV2ZW50cyBib3VuZCB0byB0aGUgYm9keS5cbiAgICAgICAgICAgIGlmIChldmVudC5jdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBzY29wZV9Cb2R5LnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgc2NvcGVfQm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0c3RhcnRcIiwgcHJldmVudERlZmF1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmV2ZW50cy5zbW9vdGhTdGVwcykge1xuICAgICAgICAgICAgZGF0YS5oYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgICAgIHNldEhhbmRsZShoYW5kbGVOdW1iZXIsIHNjb3BlX0xvY2F0aW9uc1toYW5kbGVOdW1iZXJdLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhLmhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KFwidXBkYXRlXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQoXCJjaGFuZ2VcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgICAgIGZpcmVFdmVudChcInNldFwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgZmlyZUV2ZW50KFwiZW5kXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBCaW5kIG1vdmUgZXZlbnRzIG9uIGRvY3VtZW50LlxuICAgIGZ1bmN0aW9uIGV2ZW50U3RhcnQoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgLy8gSWdub3JlIGV2ZW50IGlmIGFueSBoYW5kbGUgaXMgZGlzYWJsZWRcbiAgICAgICAgaWYgKGRhdGEuaGFuZGxlTnVtYmVycy5zb21lKGlzSGFuZGxlRGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhbmRsZTtcbiAgICAgICAgaWYgKGRhdGEuaGFuZGxlTnVtYmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVPcmlnaW4gPSBzY29wZV9IYW5kbGVzW2RhdGEuaGFuZGxlTnVtYmVyc1swXV07XG4gICAgICAgICAgICBoYW5kbGUgPSBoYW5kbGVPcmlnaW4uY2hpbGRyZW5bMF07XG4gICAgICAgICAgICBzY29wZV9BY3RpdmVIYW5kbGVzQ291bnQgKz0gMTtcbiAgICAgICAgICAgIC8vIE1hcmsgdGhlIGhhbmRsZSBhcyAnYWN0aXZlJyBzbyBpdCBjYW4gYmUgc3R5bGVkLlxuICAgICAgICAgICAgYWRkQ2xhc3MoaGFuZGxlLCBvcHRpb25zLmNzc0NsYXNzZXMuYWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGRyYWcgc2hvdWxkIG5ldmVyIHByb3BhZ2F0ZSB1cCB0byB0aGUgJ3RhcCcgZXZlbnQuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyBSZWNvcmQgdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgICAgICAvLyBBdHRhY2ggdGhlIG1vdmUgYW5kIGVuZCBldmVudHMuXG4gICAgICAgIHZhciBtb3ZlRXZlbnQgPSBhdHRhY2hFdmVudChhY3Rpb25zLm1vdmUsIHNjb3BlX0RvY3VtZW50RWxlbWVudCwgZXZlbnRNb3ZlLCB7XG4gICAgICAgICAgICAvLyBUaGUgZXZlbnQgdGFyZ2V0IGhhcyBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcHJvcGFnYXRlIHRoZSBvcmlnaW5hbCBvbmUgc28gdGhhdCB3ZSBrZWVwXG4gICAgICAgICAgICAvLyByZWx5aW5nIG9uIGl0IHRvIGV4dHJhY3QgdGFyZ2V0IHRvdWNoZXMuXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgICAgY29ubmVjdDogZGF0YS5jb25uZWN0LFxuICAgICAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsXG4gICAgICAgICAgICBzdGFydENhbGNQb2ludDogZXZlbnQuY2FsY1BvaW50LFxuICAgICAgICAgICAgYmFzZVNpemU6IGJhc2VTaXplKCksXG4gICAgICAgICAgICBwYWdlT2Zmc2V0OiBldmVudC5wYWdlT2Zmc2V0LFxuICAgICAgICAgICAgaGFuZGxlTnVtYmVyczogZGF0YS5oYW5kbGVOdW1iZXJzLFxuICAgICAgICAgICAgYnV0dG9uc1Byb3BlcnR5OiBldmVudC5idXR0b25zLFxuICAgICAgICAgICAgbG9jYXRpb25zOiBzY29wZV9Mb2NhdGlvbnMuc2xpY2UoKSxcbiAgICAgICAgfSk7XG4gICAgICAgI
10072HZhciBlbmRFdmVudCA9IGF0dGFjaEV2ZW50KGFjdGlvbnMuZW5kLCBzY29wZV9Eb2N1bWVudEVsZW1lbnQsIGV2ZW50RW5kLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsXG4gICAgICAgICAgICBkb05vdFJlamVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGhhbmRsZU51bWJlcnM6IGRhdGEuaGFuZGxlTnVtYmVycyxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBvdXRFdmVudCA9IGF0dGFjaEV2ZW50KFwibW91c2VvdXRcIiwgc2NvcGVfRG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudExlYXZlLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsXG4gICAgICAgICAgICBkb05vdFJlamVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGhhbmRsZU51bWJlcnM6IGRhdGEuaGFuZGxlTnVtYmVycyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIHB1c2hlZCB0aGUgbGlzdGVuZXJzIGluIHRoZSBsaXN0ZW5lciBsaXN0IHJhdGhlciB0aGFuIGNyZWF0aW5nXG4gICAgICAgIC8vIGEgbmV3IG9uZSBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgIGxpc3RlbmVycy5wdXNoLmFwcGx5KGxpc3RlbmVycywgbW92ZUV2ZW50LmNvbmNhdChlbmRFdmVudCwgb3V0RXZlbnQpKTtcbiAgICAgICAgLy8gVGV4dCBzZWxlY3Rpb24gaXNuJ3QgYW4gaXNzdWUgb24gdG91Y2ggZGV2aWNlcyxcbiAgICAgICAgLy8gc28gYWRkaW5nIGN1cnNvciBzdHlsZXMgY2FuIGJlIHNraXBwZWQuXG4gICAgICAgIGlmIChldmVudC5jdXJzb3IpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlICdJJyBjdXJzb3IgYW5kIGV4dGVuZCB0aGUgcmFuZ2UtZHJhZyBjdXJzb3IuXG4gICAgICAgICAgICBzY29wZV9Cb2R5LnN0eWxlLmN1cnNvciA9IGdldENvbXB1dGVkU3R5bGUoZXZlbnQudGFyZ2V0KS5jdXJzb3I7XG4gICAgICAgICAgICAvLyBNYXJrIHRoZSB0YXJnZXQgd2l0aCBhIGRyYWdnaW5nIHN0YXRlLlxuICAgICAgICAgICAgaWYgKHNjb3BlX0hhbmRsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGFkZENsYXNzKHNjb3BlX1RhcmdldCwgb3B0aW9ucy5jc3NDbGFzc2VzLmRyYWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvbiB3aGVuIGRyYWdnaW5nIHRoZSBoYW5kbGVzLlxuICAgICAgICAgICAgLy8gSW4gbm9VaVNsaWRlciA8PSA5LjIuMCwgdGhpcyB3YXMgaGFuZGxlZCBieSBjYWxsaW5nIHByZXZlbnREZWZhdWx0IG9uIG1vdXNlL3RvdWNoIHN0YXJ0L21vdmUsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyBzY3JvbGwgYmxvY2tpbmcuIFRoZSBzZWxlY3RzdGFydCBldmVudCBpcyBzdXBwb3J0ZWQgYnkgRmlyZUZveCBzdGFydGluZyBmcm9tIHZlcnNpb24gNTIsXG4gICAgICAgICAgICAvLyBtZWFuaW5nIHRoZSBvbmx5IGhvbGRvdXQgaXMgaU9TIFNhZmFyaS4gVGhpcyBkb2Vzbid0IG1hdHRlcjogdGV4dCBzZWxlY3Rpb24gaXNuJ3QgdHJpZ2dlcmVkIHRoZXJlLlxuICAgICAgICAgICAgLy8gVGhlICdjdXJzb3InIGZsYWcgaXMgZmFsc2UuXG4gICAgICAgICAgICAvLyBTZWU6IGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPXNlbGVjdHN0YXJ0XG4gICAgICAgICAgICBzY29wZV9Cb2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3RzdGFydFwiLCBwcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuaGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgIGZpcmVFdmVudChcInN0YXJ0XCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBNb3ZlIGNsb3Nlc3QgaGFuZGxlIHRvIHRhcHBlZCBsb2NhdGlvbi5cbiAgICBmdW5jdGlvbiBldmVudFRhcChldmVudCkge1xuICAgICAgICAvLyBUaGUgdGFwIGV2ZW50IHNob3VsZG4ndCBwcm9wYWdhdGUgdXBcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHZhciBwcm9wb3NhbCA9IGNhbGNQb2ludFRvUGVyY2VudGFnZShldmVudC5jYWxjUG9pbnQpO1xuICAgICAgICB2Y
10072XIgaGFuZGxlTnVtYmVyID0gZ2V0Q2xvc2VzdEhhbmRsZShwcm9wb3NhbCk7XG4gICAgICAgIC8vIFRhY2tsZSB0aGUgY2FzZSB0aGF0IGFsbCBoYW5kbGVzIGFyZSAnZGlzYWJsZWQnLlxuICAgICAgICBpZiAoaGFuZGxlTnVtYmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZsYWcgdGhlIHNsaWRlciBhcyBpdCBpcyBub3cgaW4gYSB0cmFuc2l0aW9uYWwgc3RhdGUuXG4gICAgICAgIC8vIFRyYW5zaXRpb24gdGFrZXMgYSBjb25maWd1cmFibGUgYW1vdW50IG9mIG1zIChkZWZhdWx0IDMwMCkuIFJlLWVuYWJsZSB0aGUgc2xpZGVyIGFmdGVyIHRoYXQuXG4gICAgICAgIGlmICghb3B0aW9ucy5ldmVudHMuc25hcCkge1xuICAgICAgICAgICAgYWRkQ2xhc3NGb3Ioc2NvcGVfVGFyZ2V0LCBvcHRpb25zLmNzc0NsYXNzZXMudGFwLCBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRIYW5kbGUoaGFuZGxlTnVtYmVyLCBwcm9wb3NhbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHNldFppbmRleCgpO1xuICAgICAgICBmaXJlRXZlbnQoXCJzbGlkZVwiLCBoYW5kbGVOdW1iZXIsIHRydWUpO1xuICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyLCB0cnVlKTtcbiAgICAgICAgaWYgKCFvcHRpb25zLmV2ZW50cy5zbmFwKSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQoXCJjaGFuZ2VcIiwgaGFuZGxlTnVtYmVyLCB0cnVlKTtcbiAgICAgICAgICAgIGZpcmVFdmVudChcInNldFwiLCBoYW5kbGVOdW1iZXIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXZlbnRTdGFydChldmVudCwgeyBoYW5kbGVOdW1iZXJzOiBbaGFuZGxlTnVtYmVyXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaXJlcyBhICdob3ZlcicgZXZlbnQgZm9yIGEgaG92ZXJlZCBtb3VzZS9wZW4gcG9zaXRpb24uXG4gICAgZnVuY3Rpb24gZXZlbnRIb3ZlcihldmVudCkge1xuICAgICAgICB2Y
10072XIgcHJvcG9zYWwgPSBjYWxjUG9pbnRUb1BlcmNlbnRhZ2UoZXZlbnQuY2FsY1BvaW50KTtcbiAgICAgICAgdmFyIHRvID0gc2NvcGVfU3BlY3RydW0uZ2V0U3RlcChwcm9wb3NhbCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyh0byk7XG4gICAgICAgIE9iamVjdC5rZXlzKHNjb3BlX0V2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0RXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChcImhvdmVyXCIgPT09IHRhcmdldEV2ZW50LnNwbGl0KFwiLlwiKVswXSkge1xuICAgICAgICAgICAgICAgIHNjb3BlX0V2ZW50c1t0YXJnZXRFdmVudF0uZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChzY29wZV9TZWxmLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBIYW5kbGVzIGtleWRvd24gb24gZm9jdXNlZCBoYW5kbGVzXG4gICAgLy8gRG9uJ3QgbW92ZSB0aGUgZG9jdW1lbnQgd2hlbiBwcmVzc2luZyBhcnJvdyBrZXlzIG9uIGZvY3VzZWQgaGFuZGxlc1xuICAgIGZ1bmN0aW9uIGV2ZW50S2V5ZG93bihldmVudCwgaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmIChpc1NsaWRlckRpc2FibGVkKCkgfHwgaXNIYW5kbGVEaXNhYmxlZChoYW5kbGVOdW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvcml6b250YWxLZXlzID0gW1wiTGVmdFwiLCBcIlJpZ2h0XCJdO1xuICAgICAgICB2Y
10072XIgdmVydGljYWxLZXlzID0gW1wiRG93blwiLCBcIlVwXCJdO1xuICAgICAgICB2YXIgbGFyZ2VTdGVwS2V5cyA9IFtcIlBhZ2VEb3duXCIsIFwiUGFnZVVwXCJdO1xuICAgICAgICB2YXIgZWRnZUtleXMgPSBbXCJIb21lXCIsIFwiRW5kXCJdO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXIgJiYgIW9wdGlvbnMub3J0KSB7XG4gICAgICAgICAgICAvLyBPbiBhbiByaWdodC10by1sZWZ0IHNsaWRlciwgdGhlIGxlZnQgYW5kIHJpZ2h0IGtleXMgYWN0IGludmVydGVkXG4gICAgICAgICAgICBob3Jpem9udGFsS2V5cy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5vcnQgJiYgIW9wdGlvbnMuZGlyKSB7XG4gICAgICAgICAgICAvLyBPbiBhIHRvcC10by1ib3R0b20gc2xpZGVyLCB0aGUgdXAgYW5kIGRvd24ga2V5cyBhY3QgaW52ZXJ0ZWRcbiAgICAgICAgICAgIHZlcnRpY2FsS2V5cy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBsYXJnZVN0ZXBLZXlzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpcCBcIkFycm93XCIgZm9yIElFIGNvbXBhdGliaWxpdHkuIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleVxuICAgICAgICB2YXIga2V5ID0gZXZlbnQua2V5LnJlcGxhY2UoXCJBcnJvd1wiLCBcIlwiKTtcbiAgICAgICAgdmFyIGlzTGFyZ2VEb3duID0ga2V5ID09PSBsYXJnZVN0ZXBLZXlzWzBdO1xuICAgICAgICB2YXIgaXNMYXJnZVVwID0ga2V5ID09PSBsYXJnZVN0ZXBLZXlzWzFdO1xuICAgICAgICB2Y
10072XIgaXNEb3duID0ga2V5ID09PSB2ZXJ0aWNhbEtleXNbMF0gfHwga2V5ID09PSBob3Jpem9udGFsS2V5c1swXSB8fCBpc0xhcmdlRG93bjtcbiAgICAgICAgdmFyIGlzVXAgPSBrZXkgPT09IHZlcnRpY2FsS2V5c1sxXSB8fCBrZXkgPT09IGhvcml6b250YWxLZXlzWzFdIHx8IGlzTGFyZ2VVcDtcbiAgICAgICAgdmFyIGlzTWluID0ga2V5ID09PSBlZGdlS2V5c1swXTtcbiAgICAgICAgdmFyIGlzTWF4ID0ga2V5ID09PSBlZGdlS2V5c1sxXTtcbiAgICAgICAgaWYgKCFpc0Rvd24gJiYgIWlzVXAgJiYgIWlzTWluICYmICFpc01heCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdmFyIHRvO1xuICAgICAgICBpZiAoaXNVcCB8fCBpc0Rvd24pIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBpc0Rvd24gPyAwIDogMTtcbiAgICAgICAgICAgIHZhciBzdGVwcyA9IGdldE5leHRTdGVwc0ZvckhhbmRsZShoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBzdGVwc1tkaXJlY3Rpb25dO1xuICAgICAgICAgICAgLy8gQXQgdGhlIGVkZ2Ugb2YgYSBzbGlkZXIsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIGlmIChzdGVwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm8gc3RlcCBzZXQsIHVzZSB0aGUgZGVmYXVsdCBvZiAxMCUgb2YgdGhlIHN1Yi1yYW5nZVxuICAgICAgICAgICAgaWYgKHN0ZXAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IHNjb3BlX1NwZWN0cnVtLmdldERlZmF1bHRTdGVwKHNjb3BlX0xvY2F0aW9uc1toYW5kbGVOdW1iZXJdLCBpc0Rvd24sIG9wdGlvbnMua2V5Ym9hcmREZWZhdWx0U3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMYXJnZVVwIHx8IGlzTGFyZ2VEb3duKSB7XG4gICAgICAgICAgICAgICAgc3RlcCAqPSBvcHRpb25zLmtleWJvYXJkUGFnZU11bHRpcGxpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGVwICo9IG9wdGlvbnMua2V5Ym9hcmRNdWx0aXBsaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RlcCBvdmVyIHplcm8tbGVuZ3RoIHJhbmdlcyAoIzk0OCk7XG4gICAgICAgICAgICBzdGVwID0gTWF0aC5tYXgoc3RlcCwgMC4wMDAwMDAxKTtcbiAgICAgICAgICAgIC8vIERlY3JlbWVudCBmb3IgZG93biBzdGVwc1xuICAgICAgICAgICAgc3RlcCA9IChpc0Rvd24gPyAtMSA6IDEpICogc3RlcDtcbiAgICAgICAgICAgIHRvID0gc2NvcGVf
10072VmFsdWVzW2hhbmRsZU51bWJlcl0gKyBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTWF4KSB7XG4gICAgICAgICAgICAvLyBFbmQga2V5XG4gICAgICAgICAgICB0byA9IG9wdGlvbnMuc3BlY3RydW0ueFZhbFtvcHRpb25zLnNwZWN0cnVtLnhWYWwubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBIb21lIGtleVxuICAgICAgICAgICAgdG8gPSBvcHRpb25zLnNwZWN0cnVtLnhWYWxbMF07XG4gICAgICAgIH1cbiAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgc2NvcGVfU3BlY3RydW0udG9TdGVwcGluZyh0byksIHRydWUsIHRydWUpO1xuICAgICAgICBmaXJlRXZlbnQoXCJzbGlkZVwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgZmlyZUV2ZW50KFwiY2hhbmdlXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIGZpcmVFdmVudChcInNldFwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEF0dGFjaCBldmVudHMgdG8gc2V2ZXJhbCBzbGlkZXIgcGFydHMuXG4gICAgZnVuY3Rpb24gYmluZFNsaWRlckV2ZW50cyhiZWhhdmlvdXIpIHtcbiAgICAgICAgLy8gQXR0YWNoIHRoZSBzdGFuZGFyZCBkcmFnIGV2ZW50IHRvIHRoZSBoYW5kbGVzLlxuICAgICAgICBpZiAoIWJlaGF2aW91ci5maXhlZCkge1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlcy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlc2UgZXZlbnRzIGFyZSBvbmx5IGJvdW5kIHRvIHRoZSB2aXN1YWwgaGFuZGxlXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudCwgbm90IHRoZSAncmVhbCcgb3JpZ2luIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgYXR0YWNoRXZlbnQoYWN0aW9ucy5zdGFydCwgaGFuZGxlLmNoaWxkcmVuWzBdLCBldmVudFN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU51bWJlcnM6IFtpbmRleF0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdHRhY2ggdGhlIHRhcCBldmVudCB0byB0aGUgc2xpZGVyIGJhc2UuXG4gICAgICAgIGlmIChiZWhhdmlvdXIudGFwKSB7XG4gICAgICAgICAgICBhdHRhY2hFdmVudChhY3Rpb25zLnN0YXJ0LCBzY29wZV9CYXNlLCBldmVudFRhcCwge30pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpcmUgaG92ZXIgZXZlbnRzXG4gICAgICAgIGlmIChiZWhhdmlvdXIuaG92ZXIpIHtcbiAgICAgICAgICAgIGF0dGFjaEV2ZW50KGFjdGlvbnMubW92ZSwgc2NvcGVfQmFzZSwgZXZlbnRIb3Zlciwge1xuICAgICAgICAgICAgICAgIGhvdmVyOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSB0aGUgcmFuZ2UgZHJhZ2dhYmxlLlxuICAgICAgICBpZiAoYmVoYXZpb3VyLmRyYWcpIHtcbiAgICAgICAgICAgIHNjb3BlX0Nvbm5lY3RzLmZvckVhY2goZnVuY3Rpb24gKGNvbm5lY3QsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3QgPT09IGZhbHNlIHx8IGluZGV4ID09PSAwIHx8IGluZGV4ID09PSBzY29wZV9Db25uZWN0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZUJlZm9yZSA9IHNjb3BlX0hhbmRsZXNbaW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICB2Y
10072XIgaGFuZGxlQWZ0ZXIgPSBzY29wZV9IYW5kbGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRIb2xkZXJzID0gW2Nvbm5lY3RdO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVzVG9EcmFnID0gW2hhbmRsZUJlZm9yZSwgaGFuZGxlQWZ0ZXJdO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVOdW1iZXJzVG9EcmFnID0gW2luZGV4IC0gMSwgaW5kZXhdO1xuICAgICAgICAgICAgICAgIGFkZENsYXNzKGNvbm5lY3QsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5kcmFnZ2FibGUpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJhbmdlIGlzIGZpeGVkLCB0aGUgZW50aXJlIHJhbmdlIGNhblxuICAgICAgICAgICAgICAgIC8vIGJlIGRyYWdnZWQgYnkgdGhlIGhhbmRsZXMuIFRoZSBoYW5kbGUgaW4gdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gb3JpZ2luIHdpbGwgcHJvcGFnYXRlIHRoZSBzdGFydCBldmVudCB1cHdhcmQsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGl0IG5lZWRzIHRvIGJlIGJvdW5kIG1hbnVhbGx5IG9uIHRoZSBvdGhlci5cbiAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3VyLmZpeGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50SG9sZGVycy5wdXNoKGhhbmRsZUJlZm9yZS5jaGlsZHJlblswXSk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50SG9sZGVycy5wdXNoKGhhbmRsZUFmdGVyLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91ci5kcmFnQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXNUb0RyYWcgPSBzY29wZV9IYW5kbGVzO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVOdW1iZXJzVG9EcmFnID0gc2NvcGVfSGFuZGxlTnVtYmVycztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnRIb2xkZXJzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50SG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50KGFjdGlvbnMuc3RhcnQsIGV2ZW50SG9sZGVyLCBldmVudFN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzOiBoYW5kbGVzVG9EcmFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTnVtYmVyczogaGFuZGxlTnVtYmVyc1RvRHJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Q6IGNvbm5lY3QsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXR0YWNoIGFuIGV2ZW50IHRvIHRoaXMgc2xpZGVyLCBwb3NzaWJseSBpbmNsdWRpbmcgYSBuYW1lc3BhY2VcbiAgICBmdW5jdGlvbiBiaW5kRXZlbnQobmFtZXNwYWNlZEV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgICBzY29wZV9FdmVudHNbbmFtZXNwYWNlZEV2ZW50XSA9IHNjb3BlX0V2ZW50c1tuYW1lc3BhY2VkRXZlbnRdIHx8IFtdO1xuICAgICAgICBzY29wZV9FdmVudHNbbmFtZXNwYWNlZEV2ZW50XS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGJvdW5kIGlzICd1cGRhdGUsJyBmaXJlIGl0IGltbWVkaWF0ZWx5IGZvciBhbGwgaGFuZGxlcy5cbiAgICAgICAgaWYgKG5hbWVzcGFjZWRFdmVudC5zcGxpdChcIi5cIilbMF0gPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXMuZm9yRWFjaChmdW5jdGlvbiAoYSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNJbnRlcm5hbE5hbWVzcGFjZShuYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSA9PT0gSU5URVJOQUxfRVZFTlRfTlMuYXJpYSB8fCBuYW1lc3BhY2UgPT09IElOVEVSTkFMX0VWRU5UX05TLnRvb2x0aXBzO1xuICAgIH1cbiAgICAvLyBVbmRvIGF0dGFjaG1lbnQgb2YgZXZlbnRcbiAgICBmdW5jdGlvbiByZW1vdmVFdmVudChuYW1lc3BhY2VkRXZlbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gbmFtZXNwYWNlZEV2ZW50ICYmIG5hbWVzcGFjZWRFdmVudC5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIHZhciBuYW1lc3BhY2UgPSBldmVudCA/IG5hbWVzcGFjZWRFdmVudC5zdWJzdHJpbmcoZXZlbnQubGVuZ3RoKSA6IG5hbWVzcGFjZWRFdmVudDtcbiAgICAgICAgT2JqZWN0LmtleXMoc2NvcGVfRXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kKSB7XG4gICAgICAgICAgICB2Y
10072XIgdEV2ZW50ID0gYmluZC5zcGxpdChcIi5cIilbMF07XG4gICAgICAgICAgICB2YXIgdE5hbWVzcGFjZSA9IGJpbmQuc3Vic3RyaW5nKHRFdmVudC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCghZXZlbnQgfHwgZXZlbnQgPT09IHRFdmVudCkgJiYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlID09PSB0TmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgZGVsZXRlIHByb3RlY3RlZCBpbnRlcm5hbCBldmVudCBpZiBpbnRlbnRpb25hbFxuICAgICAgICAgICAgICAgIGlmICghaXNJbnRlcm5hbE5hbWVzcGFjZSh0TmFtZXNwYWNlKSB8fCBuYW1lc3BhY2UgPT09IHROYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNjb3BlX0V2ZW50c1tiaW5kXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFeHRlcm5hbCBldmVudCBoYW5kbGluZ1xuICAgIGZ1bmN0aW9uIGZpcmVFdmVudChldmVudE5hbWUsIGhhbmRsZU51bWJlciwgdGFwKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHNjb3BlX0V2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0RXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBldmVudFR5cGUgPSB0YXJnZXRFdmVudC5zcGxpdChcIi5cIilbMF07XG4gICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSBldmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBzY29wZV9FdmVudHNbdGFyZ2V0RXZlbnRdLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc2xpZGVyIHB1YmxpYyBBUEkgYXMgdGhlIHNjb3BlICgndGhpcycpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlX1NlbGYsIFxuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdmFsdWVzIGFzIGFycmF5LCBzbyBhcmdfMVthcmdfMl0gaXMgYWx3YXlzIHZhbGlkLlxuICAgICAgICAgICAgICAgICAgICBzY29wZV9WYWx1ZXMubWFwKG9wdGlvbnMuZm9ybWF0LnRvKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbmRleCwgMCBvciAxXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgIC8vIFVuLWZvcm1hdHRlZCBzbGlkZXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlX1ZhbHVlcy5zbGljZSgpLCBcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgaXMgZmlyZWQgYnkgdGFwLCB0cnVlIG9yIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHRhcCB8fCBmYWxzZSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIExlZnQgb2Zmc2V0IG9mIHRoZSBoYW5kbGUsIGluIHJlbGF0aW9uIHRvIHRoZSBzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVfTG9jYXRpb25zLnNsaWNlKCksIFxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHNsaWRlciBwdWJsaWMgQVBJIHRvIGFuIGFjY2Vzc2libGUgcGFyYW1ldGVyIHdoZW4gdGhpcyBpcyB1bmF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICBzY29wZV9TZWxmKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFNwbGl0IG91dCB0aGUgaGFuZGxlIHBvc2l0aW9uaW5nIGxvZ2ljIHNvIHRoZSBNb3ZlIGV2ZW50IGNhbiB1c2UgaXQsIHRvb1xuICAgIGZ1bmN0aW9uIGNoZWNrSGFuZGxlUG9zaXRpb24ocmVmZXJlbmNlLCBoYW5kbGVOdW1iZXIsIHRvLCBsb29rQmFja3dhcmQsIGxvb2tGb3J3YXJkLCBnZXRWYWx1ZSwgc21vb3RoU3RlcHMpIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlO1xuICAgICAgICAvLyBGb3Igc2xpZGVycyB3aXRoIG11bHRpcGxlIGhhbmRsZXMsIGxpbWl0IG1vdmVtZW50IHRvIHRoZSBvdGhlciBoYW5kbGUuXG4gICAgICAgIC8vIEFwcGx5IHRoZSBtYXJnaW4gb3B0aW9uIGJ5IGFkZGluZyBpdCB0byB0aGUgaGFuZGxlIHBvc2l0aW9ucy5cbiAgICAgICAgaWYgKHNjb3BlX0hhbmRsZXMubGVuZ3RoID4gMSAmJiAhb3B0aW9ucy5ldmVudHMudW5jb25zdHJhaW5lZCkge1xuICAgICAgICAgICAgaWYgKGxvb2tCYWNrd2FyZCAmJiBoYW5kbGVOdW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKHJlZmVyZW5jZVtoYW5kbGVOdW1iZXIgLSAxXSwgb3B0aW9ucy5tYXJnaW4sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0byA9IE1hdGgubWF4KHRvLCBkaXN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9va0ZvcndhcmQgJiYgaGFuZGxlTnVtYmVyIDwgc2NvcGVfSGFuZGxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKHJlZmVyZW5jZVtoYW5kbGVOdW1iZXIgKyAxXSwgb3B0aW9ucy5tYXJnaW4sIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5taW4odG8sIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbGltaXQgb3B0aW9uIGhhcyB0aGUgb3Bwb3NpdGUgZWZmZWN0LCBsaW1pdGluZyBoYW5kbGVzIHRvIGFcbiAgICAgICAgLy8gbWF4aW11bSBkaXN0YW5jZSBmcm9tIGFub3RoZXIuIExpbWl0IG11c3QgYmUgPiAwLCBhcyBvdGhlcndpc2VcbiAgICAgICAgLy8gaGFuZGxlcyB3b3VsZCBiZSB1bm1vdmFibGUuXG4gICAgICAgIGlmIChzY29wZV9IYW5kbGVzLmxlbmd0aCA+IDEgJiYgb3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgICAgaWYgKGxvb2tCYWNrd2FyZCAmJiBoYW5kbGVOdW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKHJlZmVyZW5jZVtoYW5kbGVOdW1iZXIgLSAxXSwgb3B0aW9ucy5saW1pdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5taW4odG8sIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsb29rRm9yd2FyZCAmJiBoYW5kbGVOdW1iZXIgPCBzY29wZV9IYW5kbGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHNjb3BlX1NwZWN0cnVtLmdldEFic29sdXRlRGlzdGFuY2UocmVmZXJlbmNlW2hhbmRsZU51bWJlciArIDFdLCBvcHRpb25zLmxpbWl0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0byA9IE1hdGgubWF4KHRvLCBkaXN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgI
10072H1cbiAgICAgICAgLy8gVGhlIHBhZGRpbmcgb3B0aW9uIGtlZXBzIHRoZSBoYW5kbGVzIGEgY2VydGFpbiBkaXN0YW5jZSBmcm9tIHRoZVxuICAgICAgICAvLyBlZGdlcyBvZiB0aGUgc2xpZGVyLiBQYWRkaW5nIG11c3QgYmUgPiAwLlxuICAgICAgICBpZiAob3B0aW9ucy5wYWRkaW5nKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlTnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKDAsIG9wdGlvbnMucGFkZGluZ1swXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5tYXgodG8sIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGVOdW1iZXIgPT09IHNjb3BlX0hhbmRsZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gc2NvcGVfU3BlY3RydW0uZ2V0QWJzb2x1dGVEaXN0YW5jZSgxMDAsIG9wdGlvbnMucGFkZGluZ1sxXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdG8gPSBNYXRoLm1pbih0bywgZGlzdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc21vb3RoU3RlcHMpIHtcbiAgICAgICAgICAgIHRvID0gc2NvcGVfU3BlY3RydW0uZ2V0U3RlcCh0byk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGltaXQgcGVyY2VudGFnZSB0byB0aGUgMCAtIDEwMCByYW5nZVxuICAgICAgICB0byA9IGxpbWl0KHRvKTtcbiAgICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGhhbmRsZSBjYW4ndCBtb3ZlXG4gICAgICAgIGlmICh0byA9PT0gcmVmZXJlbmNlW2hhbmRsZU51bWJlcl0gJiYgIWdldFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cbiAgICAvLyBVc2VzIHNsaWRlciBvcmllbnRhdGlvbiB0byBjcmVhdGUgQ1NTIHJ1bGVzLiBhID0gYmFzZSB2YWx1ZTtcbiAgICBmdW5jdGlvbiBpblJ1bGVPcmRlcih2LCBhKSB7XG4gICAgICAgIHZhciBvID0gb3B0aW9ucy5vcnQ7XG4gICAgICAgIHJldHVybiAobyA/IGEgOiB2KSArIFwiLCBcIiArIChvID8gdiA6IGEpO1xuICAgIH1cbiAgICAvLyBNb3ZlcyBoYW5kbGUocykgYnkgYSBwZXJjZW50YWdlXG4gICAgLy8gKGJvb2wsICUgdG8gbW92ZSwgWyUgd2hlcmUgaGFuZGxlIHN0YXJ0ZWQsIC4uLl0sIFtpbmRleCBpbiBzY29wZV9IYW5kbGVzLCAuLi5dKVxuICAgIGZ1bmN0aW9uIG1vdmVIYW5kbGVzKHVwd2FyZCwgcHJvcG9zYWwsIGxvY2F0aW9ucywgaGFuZGxlTnVtYmVycywgY29ubmVjdCkge1xuICAgICAgICB2Y
10072XIgcHJvcG9zYWxzID0gbG9jYXRpb25zLnNsaWNlKCk7XG4gICAgICAgIC8vIFN0b3JlIGZpcnN0IGhhbmRsZSBub3csIHNvIHdlIHN0aWxsIGhhdmUgaXQgaW4gY2FzZSBoYW5kbGVOdW1iZXJzIGlzIHJldmVyc2VkXG4gICAgICAgIHZhciBmaXJzdEhhbmRsZSA9IGhhbmRsZU51bWJlcnNbMF07XG4gICAgICAgIHZhciBzbW9vdGhTdGVwcyA9IG9wdGlvbnMuZXZlbnRzLnNtb290aFN0ZXBzO1xuICAgICAgICB2YXIgYiA9IFshdXB3YXJkLCB1cHdhcmRdO1xuICAgICAgICB2YXIgZiA9IFt1cHdhcmQsICF1cHdhcmRdO1xuICAgICAgICAvLyBDb3B5IGhhbmRsZU51bWJlcnMgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhc2V0XG4gICAgICAgIGhhbmRsZU51bWJlcnMgPSBoYW5kbGVOdW1iZXJzLnNsaWNlKCk7XG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSB3aGljaCBoYW5kbGUgaXMgJ2xlYWRpbmcnLlxuICAgICAgICAvLyBJZiB0aGF0IG9uZSBjYW4ndCBtb3ZlIHRoZSBzZWNvbmQgY2FuJ3QgZWl0aGVyLlxuICAgICAgICBpZiAodXB3YXJkKSB7XG4gICAgICAgICAgICBoYW5kbGVOdW1iZXJzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwIDE6IGdldCB0aGUgbWF4aW11bSBwZXJjZW50YWdlIHRoYXQgYW55IG9mIHRoZSBoYW5kbGVzIGNhbiBtb3ZlXG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyLCBvKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvID0gY2hlY2tIYW5kbGVQb3NpdGlvbihwcm9wb3NhbHMsIGhhbmRsZU51bWJlciwgcHJvcG9zYWxzW2hhbmRsZU51bWJlcl0gKyBwcm9wb3NhbCwgYltvXSwgZltvXSwgZmFsc2UsIHNtb290aFN0ZXBzKTtcbiAgICAgICAgICAgICAgICAvLyBTdG9wIGlmIG9uZSBvZiB0aGUgaGFuZGxlcyBjYW4ndCBtb3ZlLlxuICAgICAgICAgICAgICAgIGlmICh0byA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSB0byAtIHByb3Bvc2Fsc1toYW5kbGVOdW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbHNbaGFuZGxlTnVtYmVyXSA9IHRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHVzaW5nIG9uZSBoYW5kbGUsIGNoZWNrIGJhY2t3YXJkIEFORCBmb3J3YXJkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYiA9IGYgPSBbdHJ1ZV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXRlID0gZmFsc2U7XG4gICAgICAgIC8vIFN0ZXAgMjogVHJ5IHRvIHNldCB0aGUgaGFuZGxlcyB3aXRoIHRoZSBmb3VuZCBwZXJjZW50YWdlXG4gICAgICAgIGhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyLCBvKSB7XG4gICAgICAgICAgICBzdGF0ZSA9XG4gICAgICAgICAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgbG9jYXRpb25zW2hhbmRsZU51bWJlcl0gKyBwcm9wb3NhbCwgYltvXSwgZltvXSwgZmFsc2UsIHNtb290aFN0ZXBzKSB8fCBzdGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFN0ZXAgMzogSWYgYSBoYW5kbGUgbW92ZWQsIGZpcmUgZXZlbnRzXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgaGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoXCJzbGlkZVwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiB0YXJnZXQgaXMgYSBjb25uZWN0LCB0aGVuIGZpcmUgZHJhZyBldmVudFxuICAgICAgICAgICAgaWYgKGNvbm5lY3QgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KFwiZHJhZ1wiLCBmaXJzdEhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGFrZXMgYSBiYXNlIHZhbHVlIGFuZCBhbiBvZmZzZXQuIFRoaXMgb2Zmc2V0IGlzIHVzZWQgZm9yIHRoZSBjb25uZWN0IGJhciBzaXplLlxuICAgIC8vIEluIHRoZSBpbml0aWFsIGRlc2lnbiBmb3IgdGhpcyBmZWF0dXJlLCB0aGUgb3JpZ2luIGVsZW1lbnQgd2FzIDElIHdpZGUuXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgYSByb3VuZGluZyBidWcgaW4gQ2hyb21lIG1ha2VzIGl0IGltcG9zc2libGUgdG8gaW1wbGVtZW50IHRoaXMgZmVhdHVyZVxuICAgIC8vIGluIHRoaXMgbWFubmVyOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD03OTgyMjNcbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1EaXJlY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kaXIgPyAxMDAgLSBhIC0gYiA6IGE7XG4gICAgfVxuICAgIC8vIFVwZGF0ZXMgc2NvcGVfTG9jYXRpb25zIGFuZCBzY29wZV9WYWx1ZXMsIHVwZGF0ZXMgdmlzdWFsIHN0YXRlXG4gICAgZnVuY3Rpb24gdXBkYXRlSGFuZGxlUG9zaXRpb24oaGFuZGxlTnVtYmVyLCB0bykge1xuICAgICAgICAvLyBVcGRhdGUgbG9jYXRpb25zLlxuICAgICAgICBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXSA9IHRvO1xuICAgICAgICAvLyBDb252ZXJ0IHRoZSB2YWx1ZSB0byB0aGUgc2xpZGVyIHN0ZXBwaW5nL3JhbmdlLlxuICAgICAgICBzY29wZV9WYWx1ZXNbaGFuZGxlTnVtYmVyXSA9IHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyh0byk7XG4gICAgICAgIHZhciB0cmFuc2xhdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbih0bywgMCkgLSBzY29wZV9EaXJPZmZzZXQ7XG4gICAgICAgIHZhciB0cmFuc2xhdGVSdWxlID0gXCJ0cmFuc2xhdGUoXCIgKyBpblJ1bGVPcmRlcih0cmFuc2xhdGlvbiArIFwiJVwiLCBcIjBcIikgKyBcIilcIjtcbiAgICAgICAgc2NvcGVfSGFuZGxlc1toYW5kbGVOdW1iZXJdLnN0eWxlW29wdGlvbnMudHJhbnNmb3JtUnVsZV0gPSB0cmFuc2xhdGVSdWxlO1xuICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZm9yIGF0IGxlYXN0IDIgaGFuZGxlcyAoZS5nLiBkdXJpbmcgc2V0dXApXG4gICAgICAgIGlmIChvcHRpb25zLmV2ZW50cy5pbnZlcnRDb25uZWN0cyAmJi
10072BzY29wZV9Mb2NhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaGFuZGxlcyBwYXNzZWQgZWFjaCBvdGhlciwgYnV0IGRvbid0IG1hdGNoIHRoZSBDb25uZWN0c0ludmVydGVkIHN0YXRlXG4gICAgICAgICAgICB2YXIgaGFuZGxlc0FyZUluT3JkZXIgPSBzY29wZV9Mb2NhdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHBvc2l0aW9uLCBpbmRleCwgbG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09PSAwIHx8IHBvc2l0aW9uID49IGxvY2F0aW9uc1tpbmRleCAtIDFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2NvcGVfQ29ubmVjdHNJbnZlcnRlZCAhPT0gIWhhbmRsZXNBcmVJbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gaW52ZXJ0IGNvbm5lY3RzIHdoZW4gaGFuZGxlcyBwYXNzIGVhY2ggb3RoZXJcbiAgICAgICAgICAgICAgICBpbnZlcnRDb25uZWN0cygpO1xuICAgICAgICAgICAgICAgIC8vIGludmVydENvbm5lY3RzIGFscmVhZHkgdXBkYXRlcyBhbGwgY29ubmVjdCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDb25uZWN0KGhhbmRsZU51bWJlcik7XG4gICAgICAgIHVwZGF0ZUNvbm5lY3QoaGFuZGxlTnVtYmVyICsgMSk7XG4gICAgICAgIGlmIChzY29wZV9Db25uZWN0c0ludmVydGVkKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNvbm5lY3RzIGFyZSBpbnZlcnRlZCwgd2UgYWxzbyBoYXZlIHRvIHVwZGF0ZSBhZGphY2VudCBjb25uZWN0c1xuICAgICAgICAgICAgdXBkYXRlQ29ubmVjdChoYW5kbGVOdW1iZXIgLSAxKTtcbiAgICAgICAgICAgIHVwZGF0ZUNvbm5lY3QoaGFuZGxlTnVtYmVyICsgMik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlcyBiZWZvcmUgdGhlIHNsaWRlciBtaWRkbGUgYXJlIHN0YWNrZWQgbGF0ZXIgPSBoaWdoZXIsXG4gICAgLy8gSGFuZGxlcyBhZnRlciB0aGUgbWlkZGxlIGxhdGVyIGlzIGxvd2VyXG4gICAgLy8gW1s3XSBbOF0gLi4uLi4uLi4uLiB8IC4uLi4uLi4uLi4gWzVdIFs0XVxuICAgIGZ1bmN0aW9uIHNldFppbmRleCgpIHtcbiAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBkaXIgPSBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXSA+IDUwID8gLTEgOiAxO1xuICAgICAgICAgICAgdmFyIHpJbmRleCA9IDMgKyAoc2NvcGVfSGFuZGxlcy5sZW5ndGggKyBkaXIgKiBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlc1toYW5kbGVOdW1iZXJdLnN0eWxlLnpJbmRleCA9IFN0cmluZyh6SW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVGVzdCBzdWdnZXN0ZWQgdmFsdWVzIGFuZCBhcHBseSBtYXJnaW4sIHN0ZXAuXG4gICAgLy8gaWYgZXhhY3RJbnB1dCBpcyB0cnVlLCBkb24ndCBydW4gY2hlY2tIYW5kbGVQb3NpdGlvbiwgdGhlbiB0aGUgaGFuZGxlIGNhbiBiZSBwbGFjZWQgaW4gYmV0d2VlbiBzdGVwcyAoIzQzNilcbiAgICBmdW5jdGlvbiBzZXRIYW5kbGUoaGFuZGxlTnVtYmVyLCB0bywgbG9va0JhY2t3YXJkLCBsb29rRm9yd2FyZCwgZXhhY3RJbnB1dCwgc21vb3RoU3RlcHMpIHtcbiAgICAgICAgaWYgKCFleGFjdElucHV0KSB7XG4gICAgICAgICAgICB0byA9IGNoZWNrSGFuZGxlUG9zaXRpb24oc2NvcGVfTG9jYXRpb25zLCBoYW5kbGVOdW1iZXIsIHRvLCBsb29rQmFja3dhcmQsIGxvb2tGb3J3YXJkLCBmYWxzZSwgc21vb3RoU3RlcHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIYW5kbGVQb3NpdGlvbihoYW5kbGVOdW1iZXIsIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFVwZGF0ZXMgc3R5bGUgYXR0cmlidXRlIGZvciBjb25uZWN0IG5vZGVzXG4gICAgZnVuY3Rpb24gdXBkYXRlQ29ubmVjdChpbmRleCkge1xuICAgICAgICAvLyBTa2lwIGNvbm5lY3RzIHNldCB0byBmYWxzZVxuICAgICAgICBpZiAoIXNjb3BlX0Nvbm5lY3RzW2luZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgbG9jYXRpb25zLCBzbyB3ZSBjYW4gc29ydCB0aGVtIGZvciB0aGUgbG9jYWwgc2NvcGUgbG9naWNcbiAgICAgICAgdmFyIGxvY2F0aW9ucyA9IHNjb3BlX0xvY2F0aW9ucy5zbGljZSgpO1xuICAgICAgICBpZiAoc2NvcGVfQ29ubmVjdHNJbnZlcnRlZCkge1xuICAgICAgICAgICAgbG9jYXRpb25zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2Y
10072XIgbCA9IDA7XG4gICAgICAgIHZhciBoID0gMTAwO1xuICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIGwgPSBsb2NhdGlvbnNbaW5kZXggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggIT09IHNjb3BlX0Nvbm5lY3RzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGggPSBsb2NhdGlvbnNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHVzZSB0d28gcnVsZXM6XG4gICAgICAgIC8vICd0cmFuc2xhdGUnIHRvIGNoYW5nZSB0aGUgbGVmdC90b3Agb2Zmc2V0O1xuICAgICAgICAvLyAnc2NhbGUnIHRvIGNoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGVsZW1lbnQ7XG4gICAgICAgIC8vIEFzIHRoZSBlbGVtZW50IGhhcyBhIHdpZHRoIG9mIDEwMCUsIGEgdHJhbnNsYXRpb24gb2YgMTAwJSBpcyBlcXVhbCB0byAxMDAlIG9mIHRoZSBwYXJlbnQgKC5ub1VpLWJhc2UpXG4gICAgICAgIHZhciBjb25uZWN0V2lkdGggPSBoIC0gbDtcbiAgICAgICAgdmFyIHRyYW5zbGF0ZVJ1bGUgPSBcInRyYW5zbGF0ZShcIiArIGluUnVsZU9yZGVyKHRyYW5zZm9ybURpcmVjdGlvbihsLCBjb25uZWN0V2lkdGgpICsgXCIlXCIsIFwiMFwiKSArIFwiKVwiO1xuICAgICAgICB2YXIgc2NhbGVSdWxlID0gXCJzY2FsZShcIiArIGluUnVsZU9yZGVyKGNvbm5lY3RXaWR0aCAvIDEwMCwgXCIxXCIpICsgXCIpXCI7XG4gICAgICAgIHNjb3BlX0Nvbm5lY3RzW2luZGV4XS5zdHlsZVtvcHRpb25zLnRyYW5zZm9ybVJ1bGVdID1cbiAgICAgICAgICAgIHRyYW5zbGF0ZVJ1bGUgKyBcIiBcIiArIHNjYWxlUnVsZTtcbiAgICB9XG4gICAgLy8gUGFyc2VzIHZhbHVlIHBhc3NlZCB0byAuc2V0IG1ldGhvZC4gUmV0dXJucyBjdXJyZW50IHZhbHVlIGlmIG5vdCBwYXJzZS1hYmxlLlxuICAgIGZ1bmN0aW9uIHJlc29sdmVUb1ZhbHVlKHRvLCBoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgLy8gU2V0dGluZyB3aXRoIG51bGwgaW5kaWNhdGVzIGFuICdpZ25vcmUnLlxuICAgICAgICAvLyBJbnB1dHRpbmcgJ2ZhbHNlJyBpcyBpbnZhbGlkLlxuICAgICAgICBpZiAodG8gPT09IG51bGwgfHwgdG8gPT09IGZhbHNlIHx8IHRvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhIGZvcm1hdHRlZCBudW1iZXIgd2FzIHBhc3NlZCwgYXR0ZW1wdCB0byBkZWNvZGUgaXQuXG4gICAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRvID0gU3RyaW5nKHRvKTtcbiAgICAgICAgfVxuICAgICAgICB0byA9IG9wdGlvbnMuZm9ybWF0LmZyb20odG8pO1xuICAgICAgICBpZiAodG8gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0byA9IHNjb3BlX1NwZWN0cnVtLnRvU3RlcHBpbmcodG8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHBhcnNpbmcgdGhlIG51bWJlciBmYWlsZWQsIHVzZSB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgaWYgKHRvID09PSBmYWxzZSB8fCBpc05hTih0bykpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuICAgIC8vIFNldCB0aGUgc2xpZGVyIHZhbHVlLlxuICAgIGZ1bmN0aW9uIHZhbHVlU2V0KGlucHV0LCBmaXJlU2V0RXZlbnQsIGV4YWN0SW5wdXQpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGFzQXJyYXkoaW5wdXQpO1xuICAgICAgICB2Y
10072XIgaXNJbml0ID0gc2NvcGVfTG9jYXRpb25zWzBdID09PSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEV2ZW50IGZpcmVzIGJ5IGRlZmF1bHRcbiAgICAgICAgZmlyZVNldEV2ZW50ID0gZmlyZVNldEV2ZW50ID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmlyZVNldEV2ZW50O1xuICAgICAgICAvLyBBbmltYXRpb24gaXMgb3B0aW9uYWwuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5pdGlhbCB2YWx1ZXMgd2VyZSBzZXQgYmVmb3JlIHVzaW5nIGFuaW1hdGVkIHBsYWNlbWVudC5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSAmJiAhaXNJbml0KSB7XG4gICAgICAgICAgICBhZGRDbGFzc0ZvcihzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50YXAsIG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpcnN0IHBhc3MsIHdpdGhvdXQgbG9va0FoZWFkIGJ1dCB3aXRoIGxvb2tCYWNrd2FyZC4gVmFsdWVzIGFyZSBzZXQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAgICBzY29wZV9IYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgcmVzb2x2ZVRvVmFsdWUodmFsdWVzW2hhbmRsZU51bWJlcl0sIGhhbmRsZU51bWJlciksIHRydWUsIGZhbHNlLCBleGFjdElucHV0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpID0gc2NvcGVfSGFuZGxlTnVtYmVycy5sZW5ndGggPT09IDEgPyAwIDogMTtcbiAgICAgICAgLy8gU3ByZWFkIGhhbmRsZXMgZXZlbmx5IGFjcm9zcyB0aGUgc2xpZGVyIGlmIHRoZSByYW5nZSBoYXMgbm8gc2l6ZSAobWluPW1heClcbiAgICAgICAgaWYgKGlzSW5pdCAmJiBzY29wZV9TcGVjdHJ1bS5oYXNOb1NpemUoKSkge1xuICAgICAgICAgICAgZXhhY3RJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICBzY29wZV9Mb2NhdGlvbnNbMF0gPSAwO1xuICAgICAgICAgICAgaWYgKHNjb3BlX0hhbmRsZU51bWJlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFjZV8xID0gMTAwIC8gKHNjb3BlX0hhbmRsZU51bWJlcnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVfTG9jYXRpb25zW2hhbmRsZU51bWJlcl0gPSBoYW5kbGVOdW1iZXIgKiBzcGFjZV8xO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlY29uZGFyeSBwYXNzZXMuIE5vdyB0aGF0IGFsbCBiYXNlIHZhbHVlcyBhcmUgc2V0LCBhcHBseSBjb25zdHJhaW50cy5cbiAgICAgICAgLy8gSXRlcmF0ZSBhbGwgaGFuZGxlcyB0byBlbnN1cmUgY29uc3RyYWludHMgYXJlIGFwcGxpZWQgZm9yIHRoZSBlbnRpcmUgc2xpZGVyIChJc3N1ZSAjMTAwOSlcbiAgICAgICAgZm9yICg7IGkgPCBzY29wZV9IYW5kbGVOdW1iZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBzY29wZV9IYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgICAgIHNldEhhbmRsZShoYW5kbGVOdW1iZXIsIHNjb3BlX0xvY2F0aW9uc1toYW5kbGVOdW1iZXJdLCB0cnVlLCB0cnVlLCBleGFjdElucHV0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldFppbmRleCgpO1xuICAgICAgICBzY29wZV9IYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgZmlyZUV2ZW50KFwidXBkYXRlXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgICAgICAvLyBGaXJlIHRoZSBldmVudCBvbmx5IGZvciBoYW5kbGVzIHRoYXQgcmVjZWl2ZWQgYSBuZXcgdmFsdWUsIGFzIHBlciAjNTc5XG4gICAgICAgICAgICBpZiAodmFsdWVzW2hhbmRsZU51bWJlcl0gIT09IG51bGwgJiYgZmlyZVNldEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KFwic2V0XCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBSZXNldCBzbGlkZXIgdG8gaW5pdGlhbCB2YWx1ZXNcbiAgICBmdW5jdGlvbiB2YWx1ZVJlc2V0KGZpcmVTZXRFdmVudCkge1xuICAgICAgICB2YWx1ZVNldChvcHRpb25zLnN0YXJ0LCBmaXJlU2V0RXZlbnQpO1xuICAgIH1cbiAgICAvLyBTZXQgdmFsdWUgZm9yIGEgc2luZ2xlIGhhbmRsZVxuICAgIGZ1bmN0aW9uIHZhbHVlU2V0SGFuZGxlKGhhbmRsZU51bWJlciwgdmFsdWUsIGZpcmVTZXRFdmVudCwgZXhhY3RJbnB1dCkge1xuICAgICAgICAvLyBFbnN1cmUgbnVtZXJpYyBpbnB1dFxuICAgICAgICBoYW5kbGVOdW1iZXIgPSBOdW1iZXIoaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgaWYgKCEoaGFuZGxlTnVtYmVyID49IDAgJiYgaGFuZGxlTnVtYmVyIDwgc2NvcGVfSGFuZGxlTnVtYmVycy5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBpbnZhbGlkIGhhbmRsZSBudW1iZXIsIGdvdDogXCIgKyBoYW5kbGVOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvb2sgYm90aCBiYWNrd2FyZCBhbmQgZm9yd2FyZCwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGlzIGhhbmRsZSB0byBcInB1c2hcIiBvdGhlciBoYW5kbGVzICgjOTYwKTtcbiAgICAgICAgLy8gVGhlIGV4YWN0SW5wdXQgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gaWdub3JlIHNsaWRlciBzdGVwcGluZyAoIzQzNilcbiAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgcmVzb2x2ZVRvVmFsdWUodmFsdWUsIGhhbmRsZU51bWJlciksIHRydWUsIHRydWUsIGV4YWN0SW5wdXQpO1xuICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgaWYgKGZpcmVTZXRFdmVudCkge1xuICAgICAgICAgICAgZmlyZUV2ZW50KFwic2V0XCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2V0IHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgZnVuY3Rpb24gdmFsdWVHZXQodW5lbmNvZGVkKSB7XG4gICAgICAgIGlmICh1bmVuY29kZWQgPT09IHZvaWQgMCkgeyB1bmVuY29kZWQgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodW5lbmNvZGVkKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gYSBjb3B5IG9mIHRoZSByYXcgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gc2NvcGVf
10072VmFsdWVzLmxlbmd0aCA9PT0gMSA/IHNjb3BlX1ZhbHVlc1swXSA6IHNjb3BlX1ZhbHVlcy5zbGljZSgwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gc2NvcGVfVmFsdWVzLm1hcChvcHRpb25zLmZvcm1hdC50byk7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIGhhbmRsZSBpcyB1c2VkLCByZXR1cm4gYSBzaW5nbGUgdmFsdWUuXG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIC8vIFJlbW92ZXMgY2xhc3NlcyBmcm9tIHRoZSByb290IGFuZCBlbXB0aWVzIGl0LlxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcm90ZWN0ZWQgaW50ZXJuYWwgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50KElOVEVSTkFMX0VWRU5UX05TLmFyaWEpO1xuICAgICAgICByZW1vdmVFdmVudChJTlRFUk5BTF9FVkVOVF9OUy50b29sdGlwcyk7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuY3NzQ2xhc3NlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyhzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChzY29wZV9UYXJnZXQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgc2NvcGVfVGFyZ2V0LnJlbW92ZUNoaWxkKHNjb3BlX1RhcmdldC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgc2NvcGVfVGFyZ2V0Lm5vVWlTbGlkZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE5leHRTdGVwc0ZvckhhbmRsZShoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uID0gc2NvcGVfTG9jYXRpb25zW2hhbmRsZU51bWJlcl07XG4gICAgICAgIHZhciBuZWFyYnlTdGVwcyA9IHNjb3BlX1NwZWN0cnVtLmdldE5lYXJieVN0ZXBzKGxvY2F0aW9uKTtcbiAgICAgICAgdmFyIHZhbHVlID0gc2NvcGVf
10072VmFsdWVzW2hhbmRsZU51bWJlcl07XG4gICAgICAgIHZhciBpbmNyZW1lbnQgPSBuZWFyYnlTdGVwcy50aGlzU3RlcC5zdGVwO1xuICAgICAgICB2YXIgZGVjcmVtZW50ID0gbnVsbDtcbiAgICAgICAgLy8gSWYgc25hcHBlZCwgZGlyZWN0bHkgdXNlIGRlZmluZWQgc3RlcCB2YWx1ZVxuICAgICAgICBpZiAob3B0aW9ucy5zbmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHZhbHVlIC0gbmVhcmJ5U3RlcHMuc3RlcEJlZm9yZS5zdGFydFZhbHVlIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbmVhcmJ5U3RlcHMuc3RlcEFmdGVyLnN0YXJ0VmFsdWUgLSB2YWx1ZSB8fCBudWxsLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgbmV4dCB2YWx1ZSBpbiB0aGlzIHN0ZXAgbW92ZXMgaW50byB0aGUgbmV4dCBzdGVwLFxuICAgICAgICAvLyB0aGUgaW5jcmVtZW50IGlzIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzdGVwIC0gdGhlIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgaWYgKGluY3JlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSArIGluY3JlbWVudCA+IG5lYXJieVN0ZXBzLnN0ZXBBZnRlci5zdGFydFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gbmVhcmJ5U3RlcHMuc3RlcEFmdGVyLnN0YXJ0VmFsdWUgLSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYmV5b25kIHRoZSBzdGFydGluZyBwb2ludFxuICAgICAgICBpZiAodmFsdWUgPiBuZWFyYnlTdGVwcy50aGlzU3RlcC5zdGFydFZhbHVlKSB7XG4gICAgICAgICAgICBkZWNyZW1lbnQgPSBuZWFyYnlTdGVwcy50aGlzU3RlcC5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5lYXJieVN0ZXBzLnN0ZXBCZWZvcmUuc3RlcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlY3JlbWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGEgaGFuZGxlIGlzIGF0IHRoZSBzdGFydCBvZiBhIHN0ZXAsIGl0IGFsd2F5cyBzdGVwcyBiYWNrIGludG8gdGhlIHByZXZpb3VzIHN0ZXAgZmlyc3RcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWNyZW1lbnQgPSB2YWx1ZSAtIG5lYXJieVN0ZXBzLnN0ZXBCZWZvcmUuaGlnaGVzdFN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm93LCBpZiBhdCB0aGUgc2xpZGVyIGVkZ2VzLCB0aGVyZSBpcyBubyBpbi9kZWNyZW1lbnRcbiAgICAgICAgaWYgKGxvY2F0aW9uID09PSAxMDApIHtcbiAgICAgICAgICAgIGluY3JlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIGRlY3JlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXMgcGVyICMzOTEsIHRoZSBjb21wYXJpc29uIGZvciB0aGUgZGVjcmVtZW50IHN0ZXAgY2FuIGhhdmUgc29tZSByb3VuZGluZyBpc3N1ZXMuXG4gICAgICAgIHZhciBzdGVwRGVjaW1hbHMgPSBzY29wZV9TcGVjdHJ1bS5jb3VudFN0ZXBEZWNpbWFscygpO1xuICAgICAgICAvLyBSb3VuZCBwZXIgIzM5MVxuICAgICAgICBpZiAoaW5jcmVtZW50ICE9PSBudWxsICYmIGluY3JlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGluY3JlbWVudCA9IE51bWJlcihpbmNyZW1lbnQudG9GaXhlZChzdGVwRGVjaW1hbHMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjcmVtZW50ICE9PSBudWxsICYmIGRlY3JlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlY3JlbWVudCA9IE51bWJlcihkZWNyZW1lbnQudG9GaXhlZChzdGVwRGVjaW1hbHMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2RlY3JlbWVudCwgaW5jcmVtZW50XTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHN0ZXAgc2l6ZSBmb3IgdGhlIHNsaWRlci5cbiAgICBmdW5jdGlvbiBnZXROZXh0U3RlcHMoKSB7XG4gICAgICAgIHJldHVybiBzY29wZV9IYW5kbGVOdW1iZXJzLm1hcChnZXROZXh0U3RlcHNGb3JIYW5kbGUpO1xuICAgIH1cbiAgICAvLyBVcGRhdGFibGU6IG1hcmdpbiwgbGltaXQsIHBhZGRpbmcsIHN0ZXAsIHJhbmdlLCBhbmltYXRlLCBzbmFwXG4gICAgZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhvcHRpb25zVG9VcGRhdGUsIGZpcmVTZXRFdmVudCkge1xuICAgICAgICAvLyBTcGVjdHJ1bSBpcyBjcmVhdGVkIHVzaW5nIHRoZSByYW5nZSwgc25hcCwgZGlyZWN0aW9uIGFuZCBzdGVwIG9wdGlvbnMuXG4gICAgICAgIC8vICdzbmFwJyBhbmQgJ3N0ZXAnIGNhbiBiZSB1cGRhdGVkLlxuICAgICAgICAvLyBJZiAnc25hcCcgYW5kICdzdGVwJyBhcmUgbm90IHBhc3NlZCwgdGhleSBzaG91bGQgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgICAgdmFyIHYgPSB2YWx1ZUdldCgpO1xuICAgICAgICB2Y
10072XIgdXBkYXRlQWJsZSA9IFtcbiAgICAgICAgICAgIFwibWFyZ2luXCIsXG4gICAgICAgICAgICBcImxpbWl0XCIsXG4gICAgICAgICAgICBcInBhZGRpbmdcIixcbiAgICAgICAgICAgIFwicmFuZ2VcIixcbiAgICAgICAgICAgIFwiYW5pbWF0ZVwiLFxuICAgICAgICAgICAgXCJzbmFwXCIsXG4gICAgICAgICAgICBcInN0ZXBcIixcbiAgICAgICAgICAgIFwiZm9ybWF0XCIsXG4gICAgICAgICAgICBcInBpcHNcIixcbiAgICAgICAgICAgIFwidG9vbHRpcHNcIixcbiAgICAgICAgICAgIFwiY29ubmVjdFwiLFxuICAgICAgICBdO1xuICAgICAgICAvLyBPbmx5IGNoYW5nZSBvcHRpb25zIHRoYXQgd2UncmUgYWN0dWFsbHkgcGFzc2VkIHRvIHVwZGF0ZS5cbiAgICAgICAgdXBkYXRlQWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdW5kZWZpbmVkLiBudWxsIHJlbW92ZXMgdGhlIHZhbHVlLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnNUb1VwZGF0ZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxPcHRpb25zW25hbWVdID0gb3B0aW9uc1RvVXBkYXRlW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSB0ZXN0T3B0aW9ucyhvcmlnaW5hbE9wdGlvbnMpO1xuICAgICAgICAvLyBMb2FkIG5ldyBvcHRpb25zIGludG8gdGhlIHNsaWRlciBzdGF0ZVxuICAgICAgICB1cGRhdGVBYmxlLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zVG9VcGRhdGVbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbbmFtZV0gPSBuZXdPcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGVfU3BlY3RydW0gPSBuZXdPcHRpb25zLnNwZWN0cnVtO1xuICAgICAgICAvLyBMaW1pdCwgbWFyZ2luIGFuZCBwYWRkaW5nIGRlcGVuZCBvbiB0aGUgc3BlY3RydW0gYnV0IGFyZSBzdG9yZWQgb3V0c2lkZSBvZiBpdC4gKCM2NzcpXG4gICAgICAgIG9wdGlvbnMubWFyZ2luID0gbmV3T3B0aW9ucy5tYXJnaW47XG4gICAgICAgIG9wdGlvbnMubGltaXQgPSBuZXdPcHRpb25zLmxpbWl0O1xuICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSBuZXdPcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIC8vIFVwZGF0ZSBwaXBzLCByZW1vdmVzIGV4aXN0aW5nLlxuICAgICAgICBpZiAob3B0aW9ucy5waXBzKSB7XG4gICAgICAgICAgICBwaXBzKG9wdGlvbnMucGlwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVQaXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRvb2x0aXBzLCByZW1vdmVzIGV4aXN0aW5nLlxuICAgICAgICBpZiAob3B0aW9ucy50b29sdGlwcykge1xuICAgICAgICAgICAgdG9vbHRpcHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZVRvb2x0aXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbmluZyBzbyB2YWx1ZVNldCBmb3JjZXMgYW4gdXBkYXRlLlxuICAgICAgICBzY29wZV9Mb2NhdGlvbnMgPSBbXTtcbiAgICAgICAgdmFsdWVTZXQoaXNTZXQob3B0aW9uc1RvVXBkYXRlLnN0YXJ0KSA/IG9wdGlvbnNUb1VwZGF0ZS5zdGFydCA6IHYsIGZpcmVTZXRFdmVudCk7XG4gICAgICAgIC8vIFVwZGF0ZSBjb25uZWN0cyBvbmx5IGlmIGl0IHdhcyBzZXRcbiAgICAgICAgaWYgKG9wdGlvbnNUb1VwZGF0ZS5jb25uZWN0KSB7XG4gICAgICAgICAgICB1cGRhdGVDb25uZWN0T3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ29ubmVjdE9wdGlvbigpIHtcbiAgICAgICAgLy8gSUUgc3VwcG9ydGVkIHdheSBvZiByZW1vdmluZyBjaGlsZHJlbiBpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgd2hpbGUgKHNjb3BlX0Nvbm5lY3RCYXNlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHNjb3BlX0Nvbm5lY3RCYXNlLnJlbW92ZUNoaWxkKHNjb3BlX0Nvbm5lY3RCYXNlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZGluZyBuZXcgY29ubmVjdHMgYWNjb3JkaW5nIHRvIHRoZSBuZXcgY29ubmVjdCBvcHRpb25zXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IG9wdGlvbnMuaGFuZGxlczsgaSsrKSB7XG4gICAgICAgICAgICBzY29wZV9Db25uZWN0c1tpXSA9IGFkZENvbm5lY3Qoc2NvcGVfQ29ubmVjdEJhc2UsIG9wdGlvbnMuY29ubmVjdFtpXSk7XG4gICAgICAgICAgICB1cGRhdGVDb25uZWN0KGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlLWFkZGluZyBkcmFnIGV2ZW50cyBmb3IgdGhlIG5ldyBjb25uZWN0IGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIGlnbm9yZSB0aGUgb3RoZXIgZXZlbnRzIHdlIGhhdmUgdG8gbmVnYXRlIHRoZSAnaWYgKCFiZWhhdmlvdXIuZml4ZWQpJyBjaGVja1xuICAgICAgICBiaW5kU2xpZGVyRXZlbnRzKHsgZHJhZzogb3B0aW9ucy5ldmVudHMuZHJhZywgZml4ZWQ6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIEludmVydCBvcHRpb25zIGZvciBjb25uZWN0IGhhbmRsZXNcbiAgICBmdW5jdGlvbiBpbnZlcnRDb25uZWN0cygpIHtcbiAgICAgICAgc2NvcGVfQ29ubmVjdHNJbnZlcnRlZCA9ICFzY29wZV9Db25uZWN0c0ludmVydGVkO1xuICAgICAgICB0ZXN0Q29ubmVjdChvcHRpb25zLCBcbiAgICAgICAgLy8gaW52ZXJzZSB0aGUgY29ubmVjdCBib29sZWFuIGFycmF5XG4gICAgICAgIG9wdGlvbnMuY29ubmVjdC5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuICFiOyB9KSk7XG4gICAgICAgIHVwZGF0ZUNvbm5lY3RPcHRpb24oKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6YXRpb24gc3RlcHNcbiAgICBmdW5jdGlvbiBzZXR1cFNsaWRlcigpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYXNlIGVsZW1lbnQsIGluaXRpYWxpemUgSFRNTCBhbmQgc2V0IGNsYXNzZXMuXG4gICAgICAgIC8vIEFkZCBoYW5kbGVzIGFuZCBjb25uZWN0IGVsZW1lbnRzLlxuICAgICAgICBzY29wZV9CYXNlID0gYWRkU2xpZGVyKHNjb3BlX1RhcmdldCk7XG4gICAgICAgIGFkZEVsZW1lbnRzKG9wdGlvbnMuY29ubmVjdCwgc2NvcGVfQmFzZSk7XG4gICAgICAgIC8vIEF0dGFjaCB1c2VyIGV2ZW50cy5cbiAgICAgICAgYmluZFNsaWRlckV2ZW50cyhvcHRpb25zLmV2ZW50cyk7XG4gICAgICAgIC8vIFVzZSB0aGUgcHVibGljIHZhbHVlIG1ldGhvZCB0byBzZXQgdGhlIHN0YXJ0IHZhbHVlcy5cbiAgICAgICAgdmFsdWVTZXQob3B0aW9ucy5zdGFydCk7XG4gICAgICAgIGlmIChvcHRpb25zLnBpcHMpIHtcbiAgICAgICAgICAgI
10072HBpcHMob3B0aW9ucy5waXBzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy50b29sdGlwcykge1xuICAgICAgICAgICAgdG9vbHRpcHMoKTtcbiAgICAgICAgfVxuICAgICAgICBhcmlhKCk7XG4gICAgfVxuICAgIHNldHVwU2xpZGVyKCk7XG4gICAgdmFyIHNjb3BlX1NlbGYgPSB7XG4gICAgICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgICAgIHN0ZXBzOiBnZXROZXh0U3RlcHMsXG4gICAgICAgIG9uOiBiaW5kRXZlbnQsXG4gICAgICAgIG9mZjogcmVtb3ZlRXZlbnQsXG4gICAgICAgIGdldDogdmFsdWVHZXQsXG4gICAgICAgIHNldDogdmFsdWVTZXQsXG4gICAgICAgIHNldEhhbmRsZTogdmFsdWVTZXRIYW5kbGUsXG4gICAgICAgIHJlc2V0OiB2YWx1ZVJlc2V0LFxuICAgICAgICBkaXNhYmxlOiBkaXNhYmxlLFxuICAgICAgICBlbmFibGU6IGVuYWJsZSxcbiAgICAgICAgLy8gRXhwb3NlZCBmb3IgdW5pdCB0ZXN0aW5nLCBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgICAgICBfX21vdmVIYW5kbGVzOiBmdW5jdGlvbiAodXB3YXJkLCBwcm9wb3NhbCwgaGFuZGxlTnVtYmVycykge1xuICAgICAgICAgICAgbW92ZUhhbmRsZXModXB3YXJkLCBwcm9wb3NhbCwgc2NvcGVfTG9jYXRpb25zLCBoYW5kbGVOdW1iZXJzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uczogb3JpZ2luYWxPcHRpb25zLFxuICAgICAgICB1cGRhdGVPcHRpb25zOiB1cGRhdGVPcHRpb25zLFxuICAgICAgICB0YXJnZXQ6IHNjb3BlX1RhcmdldCxcbiAgICAgICAgcmVtb3ZlUGlwczogcmVtb3ZlUGlwcyxcbiAgICAgICAgcmVtb3ZlVG9vbHRpcHM6IHJlbW92ZVRvb2x0aXBzLFxuICAgICAgICBnZXRQb3NpdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Mb2NhdGlvbnMuc2xpY2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VG9vbHRpcHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Ub29sdGlwcztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3JpZ2luczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNjb3BlX0hhbmRsZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHBpcHM6IHBpcHMsIC8vIElzc3VlICM1OTRcbiAgICB9O1xuICAgIHJldHVybiBzY29wZV9TZWxmO1xufVxuLy8gUnVuIHRoZSBzdGFuZGFyZCBpbml0aWFsaXplclxuZnVuY3Rpb24gaW5pdGlhbGl6ZSh0YXJnZXQsIG9yaWdpbmFsT3B0aW9ucykge1xuICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQubm9kZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogY3JlYXRlIHJlcXVpcmVzIGEgc2luZ2xlIGVsZW1lbnQsIGdvdDogXCIgKyB0YXJnZXQpO1xuICAgIH1cbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB0aGUgc2xpZGVyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLlxuICAgIGlmICh0YXJnZXQubm9VaVNsaWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBTbGlkZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuXCIpO1xuICAgIH1cbiAgICAvLyBUZXN0IHRoZSBvcHRpb25zIGFuZCBjcmVhdGUgdGhlIHNsaWRlciBlbnZpcm9ubWVudDtcbiAgICB2YXIgb3B0aW9ucyA9IHRlc3RPcHRpb25zKG9yaWdpbmFsT3B0aW9ucyk7XG4gICAgdmFyIGFwaSA9IHNjb3BlKHRhcmdldCwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zKTtcbiAgICB0YXJnZXQubm9VaVNsaWRlciA9IGFwaTtcbiAgICByZXR1cm4gYXBpO1xufVxuZXhwb3J0IHsgaW5pdGlhbGl6ZSBhcyBjcmVhdGUgfTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMgfTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBFeHBvc2VkIGZvciB1bml0IHRlc3RpbmcsIGRvbid0IHVzZSB0aGlzIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAgX19zcGVjdHJ1bTogU3BlY3RydW0sXG4gICAgLy8gQSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgY2xhc3NlcywgYWxsb3dzIGdsb2JhbCBjaGFuZ2VzLlxuICAgIC8vIFVzZSB0aGUgY3NzQ2xhc3NlcyBvcHRpb24gZm9yIGNoYW5nZXMgdG8gb25lIHNsaWRlci5cbiAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzLFxuICAgIGNyZWF0ZTogaW5pdGlhbGl6ZSxcbn07XG4iLCIvKiEgQHByZXNlcnZlXG4gKiBudW1lcmFsLmpzXG4gKiB2ZXJzaW9uIDogMi4wLjZcbiAqIGF1dGhvciA6IEFkYW0gRHJhcGVyXG4gKiBsaWNlbnNlIDogTUlUXG4gKiBodHRwOi8vYWRhbXdkcmFwZXIuZ2l0aHViLmNvbS9OdW1lcmFsLWpzL1xuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnbG9iYWwubnVtZXJhbCA9IGZhY3RvcnkoKTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIFZhcmlhYmxlc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHZhciBudW1lcmFsLFxuICAgICAgICBfLFxuICAgICAgICBWRVJTSU9OID0gJzIuMC42JyxcbiAgICAgICAgZm9ybWF0cyA9IHt9LFxuICAgICAgICBsb2NhbGVzID0ge30sXG4gICAgICAgIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgY3VycmVudExvY2FsZTogJ2VuJyxcbiAgICAgICAgICAgIHplcm9Gb3JtYXQ6IG51bGwsXG4gICAgICAgICAgICBudWxsRm9ybWF0OiBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdEZvcm1hdDogJzAsMCcsXG4gICAgICAgICAgICBzY2FsZVBlcmNlbnRCeTEwMDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgY3VycmVudExvY2FsZTogZGVmYXVsdHMuY3VycmVudExvY2FsZSxcbiAgICAgICAgICAgI
10072Hplcm9Gb3JtYXQ6IGRlZmF1bHRzLnplcm9Gb3JtYXQsXG4gICAgICAgICAgICBudWxsRm9ybWF0OiBkZWZhdWx0cy5udWxsRm9ybWF0LFxuICAgICAgICAgICAgZGVmYXVsdEZvcm1hdDogZGVmYXVsdHMuZGVmYXVsdEZvcm1hdCxcbiAgICAgICAgICAgIHNjYWxlUGVyY2VudEJ5MTAwOiBkZWZhdWx0cy5zY2FsZVBlcmNlbnRCeTEwMFxuICAgICAgICB9O1xuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIENvbnN0cnVjdG9yc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIC8vIE51bWVyYWwgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE51bWVyYWwoaW5wdXQsIG51bWJlcikge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbnVtYmVyO1xuICAgIH1cblxuICAgIG51bWVyYWwgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgdmFsdWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgdW5mb3JtYXRGdW5jdGlvbixcbiAgICAgICAgICAgIHJlZ2V4cDtcblxuICAgICAgICBpZiAobnVtZXJhbC5pc051bWVyYWwoaW5wdXQpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGlucHV0LnZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IDAgfHwgdHlwZW9mIGlucHV0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBudWxsIHx8IF8uaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuemVyb0Zvcm1hdCAmJiBpbnB1dCA9PT0gb3B0aW9ucy56ZXJvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm51bGxGb3JtYXQgJiYgaW5wdXQgPT09IG9wdGlvbnMubnVsbEZvcm1hdCB8fCAhaW5wdXQucmVwbGFjZSgvW14wLTldKy9nLCAnJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGtpbmQgaW4gZm9ybWF0cykge1xuICAgICAgICAgICAgICAgICAgICByZWdleHAgPSB0eXBlb2YgZm9ybWF0c1traW5kXS5yZWdleHBzLnVuZm9ybWF0ID09PSAnZnVuY3Rpb24nID8gZm9ybWF0c1traW5kXS5yZWdleHBzLnVuZm9ybWF0KCkgOiBmb3JtYXRzW2tpbmRdLnJlZ2V4cHMudW5mb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2V4cCAmJiBpbnB1dC5tYXRjaChyZWdleHApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmZvcm1hdEZ1bmN0aW9uID0gZm9ybWF0c1traW5kXS51bmZvcm1hdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB1bmZvcm1hdEZ1bmN0aW9uID0gdW5mb3JtYXRGdW5jdGlvbiB8fCBudW1lcmFsLl8uc3RyaW5nVG9OdW1iZXI7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZm9ybWF0RnVuY3Rpb24oaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoaW5wdXQpfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTnVtZXJhbChpbnB1dCwgdmFsdWUpO1xuICAgIH07XG5cbiAgICAvLyB2ZXJzaW9uIG51bWJlclxuICAgIG51bWVyYWwudmVyc2lvbiA9I
10072FZFUlNJT047XG5cbiAgICAvLyBjb21wYXJlIG51bWVyYWwgb2JqZWN0XG4gICAgbnVtZXJhbC5pc051bWVyYWwgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE51bWVyYWw7XG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbnNcbiAgICBudW1lcmFsLl8gPSBfID0ge1xuICAgICAgICAvLyBmb3JtYXRzIG51bWJlcnMgc2VwYXJhdG9ycywgZGVjaW1hbHMgcGxhY2VzLCBzaWducywgYWJicmV2aWF0aW9uc1xuICAgICAgICBudW1iZXJUb0Zvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSA9IGxvY2FsZXNbbnVtZXJhbC5vcHRpb25zLmN1cnJlbnRMb2NhbGVdLFxuICAgICAgICAgICAgICAgIG5lZ1AgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBvcHREZWMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBsZWFkaW5nQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIGFiYnIgPSAnJyxcbiAgICAgICAgICAgICAgICB0cmlsbGlvbiA9IDEwMDAwMDAwMDAwMDAsXG4gICAgICAgICAgICAgICAgYmlsbGlvbiA9IDEwMDAwMDAwMDAsXG4gICAgICAgICAgICAgICAgbWlsbGlvbiA9IDEwMDAwMDAsXG4gICAgICAgICAgICAgICAgdGhvdXNhbmQgPSAxMDAwLFxuICAgICAgICAgICAgICAgIGRlY2ltYWwgPSAnJyxcbiAgICAgICAgICAgICAgICBuZWcgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYmJyRm9yY2UsIC8vIGZvcmNlIGFiYnJldmlhdGlvblxuICAgICAgICAgICAgICAgIGFicyxcbiAgICAgICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgICAgIHBvd2VyLFxuICAgICAgICAgICAgICAgIGludCxcbiAgICAgICAgICAgICAgICBwcmVjaXNpb24sXG4gICAgICAgICAgICAgICAgc2lnbmVkLFxuICAgICAgICAgICAgICAgIHRob3VzYW5kcyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBuZXZlciBmb3JtYXQgYSBudWxsIHZhbHVlXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IDA7XG5cbiAgICAgICAgICAgIGFicyA9IE1hdGguYWJzKHZhbHVlKTtcblxuICAgICAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCB1c2UgcGFyZW50aGVzZXMgZm9yIG5lZ2F0aXZlIG51bWJlciBvciBpZiB3ZSBzaG91bGQgcHJlZml4IHdpdGggYSBzaWduXG4gICAgICAgICAgICAvLyBpZiBib3RoIGFyZSBwcmVzZW50IHdlIGRlZmF1bHQgdG8gcGFyZW50aGVzZXNcbiAgICAgICAgICAgIGlmIChudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnKCcpKSB7XG4gICAgICAgICAgICAgICAgbmVnUCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1tcXCh8XFwpXS9nLCAnJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICcrJykgfHwgbnVtZXJhbC5fLmluY2x1ZGVzKGZvcm1hdCwgJy0nKSkge1xuICAgICAgICAgICAgICAgIHNpZ25lZCA9IG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICcrJykgPyBmb3JtYXQuaW5kZXhPZignKycpIDogdmFsdWUgPCAwID8gZm9ybWF0LmluZGV4T2YoJy0nKSA6IC0xO1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9bXFwrfFxcLV0vZywgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZWUgaWYgYWJicmV2aWF0aW9uIGlzIHdhbnRlZFxuICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICdhJykpIHtcbiAgICAgICAgICAgICAgICBhYmJyRm9yY2UgPSBmb3JtYXQubWF0Y2goL2Eoa3xtfGJ8dCk/Lyk7XG5cbiAgICAgICAgICAgICAgICBhYmJyRm9yY2UgPSBhYmJyRm9yY2UgPyBhYmJyRm9yY2VbMV0gOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzcGFjZSBiZWZvcmUgYWJicmV2aWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICcgYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFiYnIgPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UobmV3IFJlZ0V4cChhYmJyICsgJ2Fba21idF0/JyksICcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChhYnMgPj0gdHJpbGxpb24gJiYgIWFiYnJGb3JjZSB8fCBhYmJyRm9yY2UgPT09ICd0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyB0cmlsbGlvblxuICAgICAgICAgICAgICAgICAgICBhYmJyICs9IGxvY2FsZS5hYmJyZXZpYXRpb25zLnRyaWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC8gdHJpbGxpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhYnMgPCB0cmlsbGlvbiAmJiBhYnMgPj0gYmlsbGlvbiAmJiAhYWJickZvcmNlIHx8IGFiYnJGb3JjZSA9PT0gJ2InKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJpbGxpb25cbiAgICAgICAgICAgICAgICAgICAgYWJiciArPSBsb2NhbGUuYWJicmV2aWF0aW9ucy5iaWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC8gYmlsbGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFicyA8IGJpbGxpb24gJiYgYWJzID49IG1pbGxpb24gJiYgIWFiYnJGb3JjZSB8fCBhYmJyRm9yY2UgPT09ICdtJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBtaWxsaW9uXG4gICAgICAgICAgICAgICAgICAgIGFiYnIgKz0gbG9jYWxlLmFiYnJldmlhdGlvbnMubWlsbGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAvIG1pbGxpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhYnMgPCBtaWxsaW9uICYmIGFicyA+PSB0aG91c2FuZCAmJiAhYWJickZvcmNlIHx8IGFiYnJGb3JjZSA9PT0gJ2snKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRob3VzYW5kXG4gICAgICAgICAgICAgICAgICAgIGFiYnIgKz0gbG9jYWxlLmFiYnJldmlhdGlvbnMudGhvdXNhbmQ7XG4gICAgICAgICAgICAgICAgICAgI
10072HZhbHVlID0gdmFsdWUgLyB0aG91c2FuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBvcHRpb25hbCBkZWNpbWFsc1xuICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICdbLl0nKSkge1xuICAgICAgICAgICAgICAgIG9wdERlYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoJ1suXScsICcuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJyZWFrIG51bWJlciBhbmQgZm9ybWF0XG4gICAgICAgICAgICBpbnQgPSB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICBwcmVjaXNpb24gPSBmb3JtYXQuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgIHRob3VzYW5kcyA9IGZvcm1hdC5pbmRleE9mKCcsJyk7XG4gICAgICAgICAgICBsZWFkaW5nQ291bnQgPSAoZm9ybWF0LnNwbGl0KCcuJylbMF0uc3BsaXQoJywnKVswXS5tYXRjaCgvMC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAocHJlY2lzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhwcmVjaXNpb24sICdbJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uLnJlcGxhY2UoJ10nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbi5zcGxpdCgnWycpO1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gbnVtZXJhbC5fLnRvRml4ZWQodmFsdWUsIChwcmVjaXNpb25bMF0ubGVuZ3RoICsgcHJlY2lzaW9uWzFdLmxlbmd0aCksIHJvdW5kaW5nRnVuY3Rpb24sIHByZWNpc2lvblsxXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBudW1lcmFsLl8udG9GaXhlZCh2YWx1ZSwgcHJlY2lzaW9uLmxlbmd0aCwgcm91bmRpbmdGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaW50ID0gZGVjaW1hbC5zcGxpdCgnLicpWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhkZWNpbWFsLCAnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVsaW1pdGVycy5kZWNpbWFsICsgZGVjaW1hbC5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSAnJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0RGVjICYmIE51bWJlcihkZWNpbWFsLnNsaWNlKDEpKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnQgPSBudW1lcmFsLl8udG9GaXhlZCh2YWx1ZSwgMCwgcm91bmRpbmdGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGFiYnJldmlhdGlvbiBhZ2FpbiBhZnRlciByb3VuZGluZ1xuICAgICAgICAgICAgaWYgKGFiYnIgJiYgIWFiYnJGb3JjZSAmJiBOdW1iZXIoaW50KSA+PSAxMDAwICYmIGFiYnIgIT09IGxvY2FsZS5hYmJyZXZpYXRpb25zLnRyaWxsaW9uKSB7XG4gICAgICAgICAgICAgICAgaW50ID0gU3RyaW5nKE51bWJlcihpbnQpIC8gMTAwMCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFiYnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsb2NhbGUuYWJicmV2aWF0aW9ucy50aG91c2FuZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYnIgPSBsb2NhbGUuYWJicmV2aWF0aW9ucy5taWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbG9jYWxlLmFiYnJldmlhdGlvbnMubWlsbGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYnIgPSBsb2NhbGUuYWJicmV2aWF0aW9ucy5iaWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbG9jYWxlLmFiYnJldmlhdGlvbnMuYmlsbGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYnIgPSBsb2NhbGUuYWJicmV2aWF0aW9ucy50cmlsbGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyBmb3JtYXQgbnVtYmVyXG4gICAgICAgICAgICBpZiAobnVtZXJhbC5fLmluY2x1ZGVzKGludCwgJy0nKSkge1xuICAgICAgICAgICAgICAgIGludCA9IGludC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBuZWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW50Lmxlbmd0aCA8IGxlYWRpbmdDb3VudCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBsZWFkaW5nQ291bnQgLSBpbnQubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGludCA9ICcwJyArIGludDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aG91c2FuZHMgPiAtMSkge1xuICAgICAgICAgICAgICAgIGludCA9IGludC50b1N0cmluZygpLnJlcGxhY2UoLyhcXGQpKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJyQxJ
10072yArIGxvY2FsZS5kZWxpbWl0ZXJzLnRob3VzYW5kcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtYXQuaW5kZXhPZignLicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaW50ID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG91dHB1dCA9IGludCArIGRlY2ltYWwgKyAoYWJiciA/IGFiYnIgOiAnJyk7XG5cbiAgICAgICAgICAgIGlmIChuZWdQKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKG5lZ1AgJiYgbmVnID8gJygnIDogJycpICsgb3V0cHV0ICsgKG5lZ1AgJiYgbmVnID8gJyknIDogJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc2lnbmVkID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc2lnbmVkID09PSAwID8gKG5lZyA/ICctJyA6ICcrJykgKyBvdXRwdXQgOiBvdXRwdXQgKyAobmVnID8gJy0nIDogJysnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5lZykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnLScgKyBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICAvLyB1bmZvcm1hdHMgbnVtYmVycyBzZXBhcmF0b3JzLCBkZWNpbWFscyBwbGFjZXMsIHNpZ25zLCBhYmJyZXZpYXRpb25zXG4gICAgICAgIHN0cmluZ1RvTnVtYmVyOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUgPSBsb2NhbGVzW29wdGlvbnMuY3VycmVudExvY2FsZV0sXG4gICAgICAgICAgICAgICAgc3RyaW5nT3JpZ2luYWwgPSBzdHJpbmcsXG4gICAgICAgICAgICAgICAgYWJicmV2aWF0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGhvdXNhbmQ6IDMsXG4gICAgICAgICAgICAgICAgICAgIG1pbGxpb246IDYsXG4gICAgICAgICAgICAgICAgICAgIGJpbGxpb246IDksXG4gICAgICAgICAgICAgICAgICAgIHRyaWxsaW9uOiAxMlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWJicmV2aWF0aW9uLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgcmVnZXhwO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy56ZXJvRm9ybWF0ICYmIHN0cmluZyA9PT0gb3B0aW9ucy56ZXJvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm51bGxGb3JtYXQgJiYgc3RyaW5nID09PSBvcHRpb25zLm51bGxGb3JtYXQgfHwgIXN0cmluZy5yZXBsYWNlKC9bXjAtOV0rL2csICcnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUuZGVsaW1pdGVycy5kZWNpbWFsICE9PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcLi9nLCAnJykucmVwbGFjZShsb2NhbGUuZGVsaW1pdGVycy5kZWNpbWFsLCAnLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoYWJicmV2aWF0aW9uIGluIGFiYnJldmlhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhwID0gbmV3IFJlZ0V4cCgnW15hLXpBLVpdJyArIGxvY2FsZS5hYmJyZXZpYXRpb25zW2FiYnJldmlhdGlvbl0gKyAnKD86XFxcXCl8KFxcXFwnICsgbG9jYWxlLmN1cnJlbmN5LnN5bWJvbCArICcpPyg/OlxcXFwpKT8pPyQnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nT3JpZ2luYWwubWF0Y2gocmVnZXhwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKj0gTWF0aC5wb3coMTAsIGFiYnJldmlhdGlvbnNbYWJicmV2aWF0aW9uXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAoc3RyaW5nLnNwbGl0KCctJykubGVuZ3RoICsgTWF0aC5taW4oc3RyaW5nLnNwbGl0KCcoJykubGVuZ3RoIC0gMSwgc3RyaW5nLnNwbGl0KCcpJykubGVuZ3RoIC0gMSkpICUgMiA/IDEgOiAtMTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBub24gbnVtYmVyc1xuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9bXjAtOVxcLl0rL2csICcnKTtcblxuICAgICAgICAgICAgICAgIHZhbHVlICo9IE51bWJlcihzdHJpbmcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGlzTmFOOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlczogZnVuY3Rpb24oc3RyaW5nLCBzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuaW5kZXhPZihzZWFyY2gpICE9PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0OiBmdW5jdGlvbihzdHJpbmcsIHN1YlN0cmluZywgc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMCwgc3RhcnQpICsgc3ViU3RyaW5nICsgc3RyaW5nLnNsaWNlKHN0YXJ0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVkdWNlOiBmdW5jdGlvbihhcnJheSwgY2FsbGJhY2sgLyosIGluaXRpYWxWYWx1ZSovKSB7XG4gICAgICAgICAgICBpZiAodGhpcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5yZWR1Y2UgY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNhbGxiYWNrICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2Y
10072XIgdCA9IE9iamVjdChhcnJheSksXG4gICAgICAgICAgICAgICAgbGVuID0gdC5sZW5ndGggPj4+IDAsXG4gICAgICAgICAgICAgICAgayA9IDAsXG4gICAgICAgICAgICAgICAgdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuICYmICEoayBpbiB0KSkge1xuICAgICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGsgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRbaysrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoayBpbiB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2sodmFsdWUsIHRba10sIGssIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXB1dGVzIHRoZSBtdWx0aXBsaWVyIG5lY2Vzc2FyeSB0byBtYWtlIHggPj0gMSxcbiAgICAgICAgICogZWZmZWN0aXZlbHkgZWxpbWluYXRpbmcgbWlzY2FsY3VsYXRpb25zIGNhdXNlZCBieVxuICAgICAgICAgKiBmaW5pdGUgcHJlY2lzaW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgbXVsdGlwbGllcjogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHgudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuXG4gICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoIDwgMiA/IDEgOiBNYXRoLnBvdygxMCwgcGFydHNbMV0ubGVuZ3RoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdpdmVuIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgcmV0dXJucyB0aGUgbWF4aW11bVxuICAgICAgICAgKiBtdWx0aXBsaWVyIHRoYXQgbXVzdCBiZSB1c2VkIHRvIG5vcm1hbGl6ZSBhbiBvcGVyYXRpb24gaW52b2x2aW5nXG4gICAgICAgICAqIGFsbCBvZiB0aGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgY29ycmVjdGlvbkZhY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICByZXR1cm4gYXJncy5yZWR1Y2UoZnVuY3Rpb24oYWNjdW0sIG5leHQpIHtcbiAgICAgICAgICAgICAgICB2Y
10072XIgbW4gPSBfLm11bHRpcGxpZXIobmV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtID4gbW4gPyBhY2N1bSA6IG1uO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0b0ZpeGVkKCkgdGhhdCB0cmVhdHMgZmxvYXRzIG1vcmUgbGlrZSBkZWNpbWFsc1xuICAgICAgICAgKlxuICAgICAgICAgKiBGaXhlcyBiaW5hcnkgcm91bmRpbmcgaXNzdWVzIChlZy4gKDAuNjE1KS50b0ZpeGVkKDIpID09PSAnMC42MScpIHRoYXQgcHJlc2VudFxuICAgICAgICAgKiBwcm9ibGVtcyBmb3IgYWNjb3VudGluZy0gYW5kIGZpbmFuY2UtcmVsYXRlZCBzb2Z0d2FyZS5cbiAgICAgICAgICovXG4gICAgICAgIHRvRml4ZWQ6IGZ1bmN0aW9uKHZhbHVlLCBtYXhEZWNpbWFscywgcm91bmRpbmdGdW5jdGlvbiwgb3B0aW9uYWxzKSB7XG4gICAgICAgICAgICB2YXIgc3BsaXRWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgICBtaW5EZWNpbWFscyA9IG1heERlY2ltYWxzIC0gKG9wdGlvbmFscyB8fCAwKSxcbiAgICAgICAgICAgICAgICBib3VuZGVkUHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsc1JlZ0V4cCxcbiAgICAgICAgICAgICAgICBwb3dlcixcbiAgICAgICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgICAgIC8vIFVzZSB0aGUgc21hbGxlc3QgcHJlY2lzaW9uIHZhbHVlIHBvc3NpYmxlIHRvIGF2b2lkIGVycm9ycyBmcm9tIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uXG4gICAgICAgICAgICBpZiAoc3BsaXRWYWx1ZS
100725sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgYm91bmRlZFByZWNpc2lvbiA9IE1hdGgubWluKE1hdGgubWF4KHNwbGl0VmFsdWVbMV0ubGVuZ3RoLCBtaW5EZWNpbWFscyksIG1heERlY2ltYWxzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJvdW5kZWRQcmVjaXNpb24gPSBtaW5EZWNpbWFscztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG93ZXIgPSBNYXRoLnBvdygxMCwgYm91bmRlZFByZWNpc2lvbik7XG5cbiAgICAgICAgICAgIC8vIE11bHRpcGx5IHVwIGJ5IHByZWNpc2lvbiwgcm91bmQgYWNjdXJhdGVseSwgdGhlbiBkaXZpZGUgYW5kIHVzZSBuYXRpdmUgdG9GaXhlZCgpOlxuICAgICAgICAgICAgb3V0cHV0ID0gKHJvdW5kaW5nRnVuY3Rpb24odmFsdWUgKyAnZSsnICsgYm91bmRlZFByZWNpc2lvbikgLyBwb3dlcikudG9GaXhlZChib3VuZGVkUHJlY2lzaW9uKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbmFscyA+IG1heERlY2ltYWxzIC0gYm91bmRlZFByZWNpc2lvbikge1xuICAgICAgICAgICAgICAgIG9wdGlvbmFsc1JlZ0V4cCA9IG5ldyBSZWdFeHAoJ1xcXFwuPzB7MSwnICsgKG9wdGlvbmFscyAtIChtYXhEZWNpbWFscyAtIGJvdW5kZWRQcmVjaXNpb24pKSArICd9JCcpO1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKG9wdGlvbmFsc1JlZ0V4cCwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIGF2YWxpYWJsZSBvcHRpb25zXG4gICAgbnVtZXJhbC5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIGF2YWxpYWJsZSBmb3JtYXRzXG4gICAgbnVtZXJhbC5mb3JtYXRzID0gZm9ybWF0cztcblxuICAgIC8vIGF2YWxpYWJsZSBmb3JtYXRzXG4gICAgbnVtZXJhbC5sb2NhbGVzID0gbG9jYWxlcztcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgY3VycmVudCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBudW1lcmFsLmxvY2FsZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBvcHRpb25zLmN1cnJlbnRMb2NhbGUgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmN1cnJlbnRMb2NhbGU7XG4gICAgfTtcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb2FkZWQgbG9jYWxlIGRhdGEuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnRcbiAgICAvLyBnbG9iYWwgbG9jYWxlIG9iamVjdC5cbiAgICBudW1lcmFsLmxvY2FsZURhdGEgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW29wdGlvbnMuY3VycmVudExvY2FsZV07XG4gICAgICAgIH1cblxuICAgICAgICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIWxvY2FsZXNba2V5XSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxvY2FsZSA6ICcgKyBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNba2V5XTtcbiAgICB9O1xuXG4gICAgbnVtZXJhbC5yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkZWZhdWx0cykge1xuICAgICAgICAgICAgb3B0aW9uc1twcm9wZXJ0eV0gPSBkZWZhdWx0c1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbnVtZXJhbC56ZXJvRm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIG9wdGlvbnMuemVyb0Zvcm1hdCA9IHR5cGVvZihmb3JtYXQpID09PSAnc3RyaW5nJyA/IGZvcm1hdCA6IG51bGw7XG4gICAgfTtcblxuICAgIG51bWVyYWwubnVsbEZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgb3B0aW9ucy5udWxsRm9ybWF0ID0gdHlwZW9mKGZvcm1hdCkgPT09ICdzdHJpbmcnID8gZm9ybWF0IDogbnVsbDtcbiAgICB9O1xuXG4gICAgbnVtZXJhbC5kZWZhdWx0Rm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdEZvcm1hdCA9IHR5cGVvZihmb3JtYXQpID09PSAnc3RyaW5nJyA/IGZvcm1hdCA6ICcwLjAnO1xuICAgIH07XG5cbiAgICBudW1lcmFsLnJlZ2lzdGVyID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgZm9ybWF0KSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRoaXNbdHlwZSArICdzJ11bbmFtZV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobmFtZSArICcgJyArIHR5cGUgKyAnIGFscmVhZHkgcmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbdHlwZSArICdzJ11bbmFtZV0gPSBmb3JtYXQ7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9O1xuXG5cbiAgICBudW1lcmFsLnZhbGlkYXRlID0gZnVuY3Rpb24odmFsLCBjdWx0dXJlKSB7XG4gICAgICAgIHZhciBfZGVjaW1hbFNlcCxcbiAgICAgICAgICAgIF90aG91c2FuZFNlcCxcbiAgICAgICAgICAgIF9jdXJyU3ltYm9sLFxuICAgICAgICAgICAgX3ZhbEFycmF5LFxuICAgICAgICAgICAgX2FiYnJPYmosXG4gICAgICAgICAgICBfdGhvdXNhbmRSZWdFeCxcbiAgICAgICAgICAgIGxvY2FsZURhdGEsXG4gICAgICAgICAgICB0ZW1wO1xuXG4gICAgICAgIC8vY29lcmNlIHZhbCB0byBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwgKz0gJyc7XG5cbiAgICAgICAgICAgIGlmIChjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ051bWVyYWwuanM6IFZhbHVlIGlzIG5vdCBzdHJpbmcuIEl0IGhhcyBiZWVuIGNvLWVyY2VkIHRvOiAnLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy90cmltIHdoaXRlc3BhY2VzIGZyb20gZWl0aGVyIHNpZGVzXG4gICAgICAgI
10072HZhbCA9IHZhbC50cmltKCk7XG5cbiAgICAgICAgLy9pZiB2YWwgaXMganVzdCBkaWdpdHMgcmV0dXJuIHRydWVcbiAgICAgICAgaWYgKCEhdmFsLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHZhbCBpcyBlbXB0eSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZ2V0IHRoZSBkZWNpbWFsIGFuZCB0aG91c2FuZHMgc2VwYXJhdG9yIGZyb20gbnVtZXJhbC5sb2NhbGVEYXRhXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZSBjdWx0dXJlIGlzIHVuZGVyc3Rvb2QgYnkgbnVtZXJhbC4gaWYgbm90LCBkZWZhdWx0IGl0IHRvIGN1cnJlbnQgbG9jYWxlXG4gICAgICAgICAgICBsb2NhbGVEYXRhID0gbnVtZXJhbC5sb2NhbGVEYXRhKGN1bHR1cmUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2NhbGVEYXRhID0gbnVtZXJhbC5sb2NhbGVEYXRhKG51bWVyYWwubG9jYWxlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9zZXR1cCB0aGUgZGVsaW1pdGVycyBhbmQgY3VycmVuY3kgc3ltYm9sIGJhc2VkIG9uIGN1bHR1cmUvbG9jYWxlXG4gICAgICAgIF9jdXJyU3ltYm9sID0gbG9jYWxlRGF0YS5jdXJyZW5jeS5zeW1ib2w7XG4gICAgICAgIF9hYmJyT2JqID0gbG9jYWxlRGF0YS5hYmJyZXZpYXRpb25zO1xuICAgICAgICBfZGVjaW1hbFNlcCA9IGxvY2FsZURhdGEuZGVsaW1pdGVycy5kZWNpbWFsO1xuICAgICAgICBpZiAobG9jYWxlRGF0YS5kZWxpbWl0ZXJzLnRob3VzYW5kcyA9PT0gJy4nKSB7XG4gICAgICAgICAgICBfdGhvdXNhbmRTZXAgPSAnXFxcXC4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3Rob3VzYW5kU2VwID0gbG9jYWxlRGF0YS5kZWxpbWl0ZXJzLnRob3VzYW5kcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkYXRpbmcgY3VycmVuY3kgc3ltYm9sXG4gICAgICAgIHRlbXAgPSB2YWwubWF0Y2goL15bXlxcZF0rLyk7XG4gICAgICAgIGlmICh0ZW1wICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyKDEpO1xuICAgICAgICAgICAgaWYgKHRlbXBbMF0gIT09IF9jdXJyU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0aW5nIGFiYnJldmlhdGlvbiBzeW1ib2xcbiAgICAgICAgdGVtcCA9IHZhbC5tYXRjaCgvW15cXGRdKyQvKTtcbiAgICAgICAgaWYgKHRlbXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICBpZiAodGVtcFswXSAhPT0gX2FiYnJPYmoudGhvdXNhbmQgJiYgdGVtcFswXSAhPT0gX2FiYnJPYmoubWlsbGlvbiAmJiB0ZW1wWzBdICE9PSBfYWJick9iai5iaWxsaW9uICYmIHRlbXBbMF0gIT09IF9hYmJyT2JqLnRyaWxsaW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Rob3VzYW5kUmVnRXggPSBuZXcgUmVnRXhwKF90aG91c2FuZFNlcCArICd7Mn0nKTtcblxuICAgICAgICBpZiAoIXZhbC5tYXRjaCgvW15cXGQuLF0vZykpIHtcbiAgICAgICAgICAgIF92YWxBcnJheSA9IHZhbC5zcGxpdChfZGVjaW1hbFNlcCk7XG4gICAgICAgICAgICBpZiAoX3ZhbEFycmF5Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChfdmFsQXJyYXkubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAhISBfdmFsQXJyYXlbMF0ubWF0Y2goL15cXGQrLipcXGQkLykgJiYgIV92YWxBcnJheVswXS5tYXRjaChfdGhvdXNhbmRSZWdFeCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdmFsQXJyYXlbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAhISBfdmFsQXJyYXlbMF0ubWF0Y2goL15cXGQrJC8pICYmICFfdmFsQXJyYXlbMF0ubWF0Y2goX3Rob3VzYW5kUmVnRXgpICYmICEhIF92YWxBcnJheVsxXS5tYXRjaCgvXlxcZCskLykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICggISEgX3ZhbEFycmF5WzBdLm1hdGNoKC9eXFxkKy4qXFxkJC8pICYmICFfdmFsQXJyYXlbMF0ubWF0Y2goX3Rob3VzYW5kUmVnRXgpICYmICEhIF92YWxBcnJheVsxXS5tYXRjaCgvXlxcZCskLykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgTnVtZXJhbCBQcm90b3R5cGVcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBudW1lcmFsLmZuID0gTnVtZXJhbC5wcm90b3R5cGUgPSB7XG4gICAgICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1lcmFsKHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKGlucHV0U3RyaW5nLCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgdmFsdWUgPSB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSBpbnB1dFN0cmluZyB8fCBvcHRpb25zLmRlZmF1bHRGb3JtYXQsXG4gICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgcm91bmRpbmdGdW5jdGlvblxuICAgICAgICAgICAgcm91bmRpbmdGdW5jdGlvbiA9IHJvdW5kaW5nRnVuY3Rpb24gfHwgTWF0aC5yb3VuZDtcblxuICAgICAgICAgICAgLy8gZm9ybWF0IGJhc2VkIG9uIHZhbHVlXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDAgJiYgb3B0aW9ucy56ZXJvRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3B0aW9ucy56ZXJvRm9ybWF0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBvcHRpb25zLm51bGxGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvcHRpb25zLm51bGxGb3JtYXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoa2luZCBpbiBmb3JtYXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQubWF0Y2goZm9ybWF0c1traW5kXS5yZWdleHBzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEZ1bmN0aW9uID0gZm9ybWF0c1traW5kXS5mb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb24gPSBmb3JtYXRGdW5jdGlvbiB8fCBudW1lcmFsLl8ubnVtYmVyVG9Gb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBmb3JtYXRGdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGFkZDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gXy5jb3JyZWN0aW9uRmFjdG9yLmNhbGwobnVsbCwgdGhpcy5fdmFsdWUsIHZhbHVlKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2JhY2soYWNjdW0sIGN1cnIsIGN1cnJJLCBPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtICsgTWF0aC5yb3VuZChjb3JyRmFjdG9yICogY3Vycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3RoaXMuX3ZhbHVlLCB2YWx1ZV0sIGNiYWNrLCAwKSAvIGNvcnJGYWN0b3I7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBzdWJ0cmFjdDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gXy5jb3JyZWN0aW9uRmFjdG9yLmNhbGwobnVsbCwgdGhpcy5fdmFsdWUsIHZhbHVlKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2JhY2soYWNjdW0sIGN1cnIsIGN1cnJJLCBPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtIC0gTWF0aC5yb3VuZChjb3JyRmFjdG9yICogY3Vycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3ZhbHVlXSwgY2JhY2ssIE1hdGgucm91bmQodGhpcy5fdmFsdWUgKiBjb3JyRmFjdG9yKSkgLyBjb3JyRmFjdG9yO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlwbHk6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBjYmFjayhhY2N1bSwgY3VyciwgY3VyckksIE8pIHtcbiAgICAgICAgICAgICAgICB2Y
10072XIgY29yckZhY3RvciA9IF8uY29ycmVjdGlvbkZhY3RvcihhY2N1bSwgY3Vycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYWNjdW0gKiBjb3JyRmFjdG9yKSAqIE1hdGgucm91bmQoY3VyciAqIGNvcnJGYWN0b3IpIC8gTWF0aC5yb3VuZChjb3JyRmFjdG9yICogY29yckZhY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3RoaXMuX3ZhbHVlLCB2YWx1ZV0sIGNiYWNrLCAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGRpdmlkZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNiYWNrKGFjY3VtLCBjdXJyLCBjdXJySSwgTykge1xuICAgICAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gXy5jb3JyZWN0aW9uRmFjdG9yKGFjY3VtLCBjdXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChhY2N1bSAqIGNvcnJGYWN0b3IpIC8gTWF0aC5yb3VuZChjdXJyICogY29yckZhY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3RoaXMuX3ZhbHVlLCB2YWx1ZV0sIGNiYWNrKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGRpZmZlcmVuY2U6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMobnVtZXJhbCh0aGlzLl92YWx1ZSkuc3VidHJhY3QodmFsdWUpLnZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRGVmYXVsdCBMb2NhbGUgJiYgRm9ybWF0XG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgbnVtZXJhbC5yZWdpc3RlcignbG9jYWxlJywgJ2VuJywge1xuICAgICAgICBkZWxpbWl0ZXJzOiB7XG4gICAgICAgICAgICB0aG91c2FuZHM6ICcsJyxcbiAgICAgICAgICAgIGRlY2ltYWw6ICcuJ1xuICAgICAgICB9LFxuICAgICAgICBhYmJyZXZpYXRpb25zOiB7XG4gICAgICAgICAgICB0aG91c2FuZDogJ2snLFxuICAgICAgICAgICAgbWlsbGlvbjogJ20nLFxuICAgICAgICAgICAgYmlsbGlvbjogJ2InLFxuICAgICAgICAgICAgdHJpbGxpb246ICd0J1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbihudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTA7XG4gICAgICAgICAgICByZXR1cm4gKH5+KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgfSxcbiAgICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgICAgIHN5bWJvbDogJyQnXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIG51bWVyYWwucmVnaXN0ZXIoJ2Zvcm1hdCcsICdicHMnLCB7XG4gICAgICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiAvKEJQUykvLFxuICAgICAgICAgICAgICAgIHVuZm9ybWF0OiAvKEJQUykvXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwYWNlID0gbnVtZXJhbC5fLmluY2x1ZGVzKGZvcm1hdCwgJyBCUFMnKSA/ICcgJyA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAwMDA7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYmVmb3JlIEJQU1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9cXHM/QlBTLywgJycpO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbnVtZXJhbC5fLm51bWJlclRvRm9ybWF0KHZhbHVlLCBmb3JtYXQsIHJvdW5kaW5nRnVuY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhvdXRwdXQsICcpJykpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnNwbGl0KCcnKTtcblxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BsaWNlKC0xLCAwLCBzcGFjZSArICdCUFMnKTtcblxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuam9pbignJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgc3BhY2UgKyAnQlBTJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKyhudW1lcmFsLl8uc3RyaW5nVG9OdW1iZXIoc3RyaW5nKSAqIDAuMDAwMSkudG9GaXhlZCgxNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xufSkoKTtcblxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkZWNpbWFsID0ge1xuICAgICAgICAgICAgYmFzZTogMTAwMCxcbiAgICAgICAgICAgIHN1ZmZpeGVzOiBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXVxuICAgICAgICB9LFxuICAgICAgICBiaW5hcnkgPSB7XG4gICAgICAgICAgICBiYXNlOiAxMDI0LFxuICAgICAgICAgICAgc3VmZml4ZXM6IFsnQicsICdLaUInLCAnTWlCJywgJ0dpQicsICdUaUInLCAnUGlCJywgJ0VpQicsICdaaUInLCAnWWlCJ11cbiAgICAgICAgfTtcblxuICAgIHZhciBhbGxTdWZmaXhlcyA9ICBkZWNpbWFsLnN1ZmZpeGVzLmNvbmNhdChiaW5hcnkuc3VmZml4ZXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjaW1hbC5zdWZmaXhlcy5pbmRleE9mKGl0ZW0pIDwgMDtcbiAgICAgICAgfSkpO1xuICAgICAgICB2Y
10072XIgdW5mb3JtYXRSZWdleCA9IGFsbFN1ZmZpeGVzLmpvaW4oJ3wnKTtcbiAgICAgICAgLy8gQWxsb3cgc3VwcG9ydCBmb3IgQlBTIChodHRwOi8vd3d3LmludmVzdG9wZWRpYS5jb20vdGVybXMvYi9iYXNpc3BvaW50LmFzcClcbiAgICAgICAgdW5mb3JtYXRSZWdleCA9ICcoJyArIHVuZm9ybWF0UmVnZXgucmVwbGFjZSgnQicsICdCKD8hUFMpJykgKyAnKSc7XG5cbiAgICBudW1lcmFsLnJlZ2lzdGVyKCdmb3JtYXQnLCAnYnl0ZXMnLCB7XG4gICAgICAgIHJlZ2V4cHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogLyhbMFxcc11pP2IpLyxcbiAgICAgICAgICAgIHVuZm9ybWF0OiBuZXcgUmVnRXhwKHVuZm9ybWF0UmVnZXgpXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCxcbiAgICAgICAgICAgICAgICBieXRlcyA9IG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICdpYicpID8gYmluYXJ5IDogZGVjaW1hbCxcbiAgICAgICAgICAgICAgICBzdWZmaXggPSBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnIGInKSB8fCBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnIGliJykgPyAnICcgOiAnJyxcbiAgICAgICAgICAgICAgICBwb3dlcixcbiAgICAgICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICAgICAgbWF4O1xuXG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYmVmb3JlXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXFxzP2k/Yi8sICcnKTtcblxuICAgICAgICAgICAgZm9yIChwb3dlciA9IDA7IHBvd2VyIDw9IGJ5dGVzLnN1ZmZpeGVzLmxlbmd0aDsgcG93ZXIrKykge1xuICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgucG93KGJ5dGVzLmJhc2UsIHBvd2VyKTtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLnBvdyhieXRlcy5iYXNlLCBwb3dlciArIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAwIHx8IHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8IG1heCkge1xuICAgICAgICAgICAgICAgICAgICBzdWZmaXggKz0gYnl0ZXMuc3VmZml4ZXNbcG93ZXJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC8gbWluO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRwdXQgPSBudW1lcmFsLl8ubnVtYmVyVG9Gb3JtYXQodmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzdWZmaXg7XG4gICAgICAgIH0sXG4gICAgICAgIHVuZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bWVyYWwuXy5zdHJpbmdUb051bWJlcihzdHJpbmcpLFxuICAgICAgICAgICAgICAgIHBvd2VyLFxuICAgICAgICAgICAgICAgIGJ5dGVzTXVsdGlwbGllcjtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChwb3dlciA9IGRlY2ltYWwuc3VmZml4ZXMubGVuZ3RoIC0gMTsgcG93ZXIgPj0gMDsgcG93ZXItLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnVtZXJhbC5fLmluY2x1ZGVzKHN0cmluZywgZGVjaW1hbC5zdWZmaXhlc1twb3dlcl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlc011bHRpcGxpZXIgPSBNYXRoLnBvdyhkZWNpbWFsLmJhc2UsIHBvd2VyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtZXJhbC5fLmluY2x1ZGVzKHN0cmluZywgYmluYXJ5LnN1ZmZpeGVzW3Bvd2VyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTXVsdGlwbGllciA9IE1hdGgucG93KGJpbmFyeS5iYXNlLCBwb3dlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUgKj0gKGJ5dGVzTXVsdGlwbGllciB8fCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG5cbihmdW5jdGlvbigpIHtcbiAgICAgICAgbnVtZXJhbC5yZWdpc3RlcignZm9ybWF0JywgJ2N1cnJlbmN5Jywge1xuICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6IC8oXFwkKS9cbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgbG9jYWxlID0gbnVtZXJhbC5sb2NhbGVzW251bWVyYWwub3B0aW9ucy5jdXJyZW50TG9jYWxlXSxcbiAgICAgICAgICAgICAgICBzeW1ib2xzID0ge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IGZvcm1hdC5tYXRjaCgvXihbXFwrfFxcLXxcXCh8XFxzfFxcJF0qKS8pWzBdLFxuICAgICAgICAgICAgICAgICAgICBhZnRlcjogZm9ybWF0Lm1hdGNoKC8oW1xcK3xcXC18XFwpfFxcc3xcXCRdKikkLylbMF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgLy8gc3RyaXAgZm9ybWF0IG9mIHNwYWNlcyBhbmQgJFxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1xccz9cXCRcXHM/LywgJycpO1xuXG4gICAgICAgICAgICAvLyBmb3JtYXQgdGhlIG51bWJlclxuICAgICAgICAgICAgb3V0cHV0ID0gbnVtZXJhbC5fLm51bWJlclRvRm9ybWF0KHZhbHVlLCBmb3JtYXQsIHJvdW5kaW5nRnVuY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgYmFzZWQgb24gdmFsdWVcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9scy5iZWZvcmUgPSBzeW1ib2xzLmJlZm9yZS5yZXBsYWNlKC9bXFwtXFwoXS8sICcnKTtcbiAgICAgICAgICAgICAgICBzeW1ib2xzLmFmdGVyID0gc3ltYm9scy5hZnRlci5yZXBsYWNlKC9bXFwtXFwpXS8sICcnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwICYmICghbnVtZXJhbC5fLmluY2x1ZGVzKHN5bWJvbHMuYmVmb3JlLCAnLScpICYmICFudW1lcmFsLl8uaW5jbHVkZXMoc3ltYm9scy5iZWZvcmUsICcoJykpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9scy5iZWZvcmUgPSAnLScgKyBzeW1ib2xzLmJlZm9yZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggYmVmb3JlIHN5bWJvbFxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbHMuYmVmb3JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sID0gc3ltYm9scy5iZWZvcmVbaV07XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICckJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG51bWVyYWwuXy5pbnNlcnQob3V0cHV0LCBsb2NhbGUuY3VycmVuY3kuc3ltYm9sLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG51bWVyYWwuXy5pbnNlcnQob3V0cHV0LCAnICcsIGkgKyBsb2NhbGUuY3VycmVuY3kuc3ltYm9sLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggZWFjaCBhZnRlciBzeW1ib2xcbiAgICAgICAgICAgIGZvciAoaSA9IHN5bWJvbHMuYWZ0ZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBzeW1ib2xzLmFmdGVyW2ldO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChzeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnJCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBpID09PSBzeW1ib2xzLmFmdGVyLmxlbmd0aCAtIDEgPyBvdXRwdXQgKyBsb2NhbGUuY3VycmVuY3kuc3ltYm9sIDogbnVtZXJhbC5fLmluc2VydChvdXRwdXQsIGxvY2FsZS5jdXJyZW5jeS5zeW1ib2wsIC0oc3ltYm9scy5hZnRlci5sZW5ndGggLSAoMSArIGkpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBpID09PSBzeW1ib2xzLmFmdGVyLmxlbmd0aCAtIDEgPyBvdXRwdXQgKyAnICcgOiBudW1lcmFsLl8uaW5zZXJ0KG91dHB1dCwgJyAnLCAtKHN5bWJvbHMuYWZ0ZXIubGVuZ3RoIC0gKDEgKyBpKSArIGxvY2FsZS5jdXJyZW5jeS5zeW1ib2wubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKCk7XG5cblxuKGZ1bmN0aW9uKCkge1xuICAgICAgICBudW1lcmFsLnJlZ2lzdGVyKCdmb3JtYXQnLCAnZXhwb25lbnRpYWwnLCB7XG4gICAgICAgIHJlZ2V4cHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogLyhlXFwrfGUtKS8sXG4gICAgICAgICAgICB1bmZvcm1hdDogLyhlXFwrfGUtKS9cbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgb3V0cHV0LFxuICAgICAgICAgICAgICAgIGV4cG9uZW50aWFsID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhbnVtZXJhbC5fLmlzTmFOKHZhbHVlKSA/IHZhbHVlLnRvRXhwb25lbnRpYWwoKSA6ICcwZSswJyxcbiAgICAgICAgICAgICAgICBwYXJ0cyA9IGV4cG9uZW50aWFsLnNwbGl0KCdlJyk7XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9lW1xcK3xcXC1dezF9MC8sICcnKTtcblxuICAgICAgICAgICAgb3V0cHV0ID0gbnVtZXJhbC5fLm51bWJlclRvRm9ybWF0KE51bWJlcihwYXJ0c1swXSksIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyAnZScgKyBwYXJ0c1sxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5mb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gbnVtZXJhbC5fLmluY2x1ZGVzKHN0cmluZywgJ2UrJykgPyBzdHJpbmcuc3BsaXQoJ2UrJykgOiBzdHJpbmcuc3BsaXQoJ2UtJyksXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIocGFydHNbMF0pLFxuICAgICAgICAgICAgICAgIHBvd2VyID0gTnVtYmVyKHBhcnRzWzFdKTtcblxuICAgICAgICAgICAgcG93ZXIgPSBudW1lcmFsLl8uaW5jbHVkZXMoc3RyaW5nLCAnZS0nKSA/IHBvd2VyICo9IC0xIDogcG93ZXI7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNiYWNrKGFjY3VtLCBjdXJyLCBjdXJySSwgTykge1xuICAgICAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gbnVtZXJhbC5fLmNvcnJlY3Rpb25GYWN0b3IoYWNjdW0sIGN1cnIpLFxuICAgICAgICAgICAgICAgICAgICBudW0gPSAoYWNjdW0gKiBjb3JyRmFjdG9yKSAqIChjdXJyICogY29yckZhY3RvcikgLyAoY29yckZhY3RvciAqIGNvcnJGYWN0b3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1lcmFsLl8ucmVkdWNlKFt2YWx1ZSwgTWF0aC5wb3coMTAsIHBvd2VyKV0sIGNiYWNrLCAxKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoKTtcblxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIG51bWVyYWwucmVnaXN0ZXIoJ2Zvcm1hdCcsICdvcmRpbmFsJywge1xuICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6IC8obykvXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSA9IG51bWVyYWwubG9jYWxlc1tudW1lcmFsLm9wdGlvbnMuY3VycmVudExvY2FsZV0sXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgIG9yZGluYWwgPSBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnIG8nKSA/ICcgJyA6ICcnO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYmVmb3JlXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXFxzP28vLCAnJyk7XG5cbiAgICAgICAgICAgIG9yZGluYWwgKz0gbG9jYWxlLm9yZGluYWwodmFsdWUpO1xuXG4gICAgICAgICAgICBvdXRwdXQgPSBudW1lcmFsLl8ubnVtYmVyVG9Gb3JtYXQodmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBvcmRpbmFsO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG5cbihmdW5jdGlvbigpIHtcbiAgICAgICAgbnVtZXJhbC5yZWdpc3RlcignZm9ybWF0JywgJ3BlcmNlbnRhZ2UnLCB7XG4gICAgICAgIHJlZ2V4cHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogLyglKS8sXG4gICAgICAgICAgICB1bmZvcm1hdDogLyglKS9cbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgc3BhY2UgPSBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnICUnKSA/ICcgJyA6ICcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICAgICAgaWYgKG51bWVyYWwub3B0aW9ucy5zY2FsZVBlcmNlbnRCeTEwMCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzcGFjZSBiZWZvcmUgJVxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1xccz9cXCUvLCAnJyk7XG5cbiAgICAgICAgICAgIG91dHB1dCA9IG51bWVyYWwuXy5udW1iZXJUb0Zvcm1hdCh2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKTtcblxuICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhvdXRwdXQsICcpJykpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuc3BsaXQoJycpO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0LnNwbGljZSgtMSwgMCwgc3BhY2UgKyAnJScpO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmpvaW4oJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKyBzcGFjZSArICclJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgdW5mb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICAgICAgdmFyIG51bWJlciA9IG51bWVyYWwuXy5zdHJpbmdUb051bWJlcihzdHJpbmcpO1xuICAgICAgICAgICAgaWYgKG51bWVyYWwub3B0aW9ucy5zY2FsZVBlcmNlbnRCeTEwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKiAwLjAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoKTtcblxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIG51bWVyYWwucmVnaXN0ZXIoJ2Zvcm1hdCcsICd0aW1lJywge1xuICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6IC8oOikvLFxuICAgICAgICAgICAgdW5mb3JtYXQ6IC8oOikvXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwIC8gNjApLFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIChob3VycyAqIDYwICogNjApKSAvIDYwKSxcbiAgICAgICAgICAgICAgICBzZWNvbmRzID0gTWF0aC5yb3VuZCh2YWx1ZSAtIChob3VycyAqIDYwICogNjApIC0gKG1pbnV0ZXMgKiA2MCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gaG91cnMgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5mb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICAgICAgdmFyIHRpbWVBcnJheSA9IHN0cmluZy5zcGxpdCgnOicpLFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSAwO1xuXG4gICAgICAgICAgICAvLyB0dXJuIGhvdXJzIGFuZCBtaW51dGVzIGludG8gc2Vjb25kcyBhbmQgYWRkIHRoZW0gYWxsIHVwXG4gICAgICAgICAgICBpZiAodGltZUFycmF5Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlY29uZHMgKyAoTnVtYmVyKHRpbWVBcnJheVswXSkgKiA2MCAqIDYwKTtcbiAgICAgICAgICAgICAgICAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlY29uZHMgKyAoTnVtYmVyKHRpbWVBcnJheVsxXSkgKiA2MCk7XG4gICAgICAgICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWNvbmRzICsgTnVtYmVyKHRpbWVBcnJheVsyXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVBcnJheS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlY29uZHMgKyAoTnVtYmVyKHRpbWVBcnJheVswXSkgKiA2MCk7XG4gICAgICAgICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWNvbmRzICsgTnVtYmVyKHRpbWVBcnJheVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHNlY29uZHMpO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG5yZXR1cm4gbnVtZXJhbDtcbn0pKTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIH
10072dyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBx
10072dWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2Y
10072XIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2Y
10072XIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaH
10072RtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybi
10072B1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGVcclxuICovXHJcblxyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFByaXZhdGVcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wXHJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGlzUHJvdGVjdGVkIChwcm9wLCB2YWx1ZSkge1xyXG4gIHJldHVybiBjb25zb2xlLndhcm4oYE1vZHVsZUxvYWRlci4ke3Byb3B9IGlzIHByb3RlY3RlZCBwcm9wZXJ0eSEgWW91IGNhbm5vdCBjaGFuZ2UgaXQgdG8gXCIke3ZhbHVlfVwiIGFmdGVyIGNyZWF0ZSFgKVxyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFB1YmxpY1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5jbGFzcyBNb2R1bGVMb2FkZXIge1xyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkZXJEYXRhXHJcbiAgICogQHBhcmFtIHtQcm9taXNlfSBbbG9hZGVyRGF0YS5pbXBvcnRQcm9taXNlPW51bGxdXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsb2FkZXJEYXRhLmluaXRTZWxlY3Rvcj0nLmpzLWluaXQnXVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbG9hZGVyRGF0YS5pbml0RnVuY3Rpb25OYW1lPSdsb2FkZXJJbml0J11cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW2xvYWRlckRhdGEubGlzdD17fV1cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW2xvYWRlckRhdGEuZGVidWc9ZmFsc2VdXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsb2FkZXJEYXRhLmxvYWRpbmdDbGFzcz0nX21vZHVsZS1sb2FkaW5nJ11cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xvYWRlckRhdGEubG9hZGVkQ2xhc3M9J19tb2R1bGUtbG9hZGVkJ11cclxuICAgKlxyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGluaXRTZWxlY3RvclxyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGluaXRGdW5jdGlvbk5hbWVcclxuICAgKiBAcHJvcCB7T2JqZWN0fSBsaXN0XHJcbiAgICogQHByb3Age09iamVjdH0gbW9kdWxlc1xyXG4gICAqIEBwcm9wIHtib29sZWFufSBkZWJ1Z1xyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGxvYWRpbmdDbGFzc1xyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGxvYWRlZENsYXNzXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IgKGxvYWRlckRhdGEpIHtcclxuICAgIGxldCB7XHJcbiAgICAgIGltcG9ydFByb21pc2UgPSBudWxsLFxyXG4gICAgICBpbml0U2VsZWN0b3IgPSAnLmpzLWluaXQnLFxyXG4gICAgICBpbml0RnVuY3Rpb25OYW1lID0gJ2xvYWRlckluaXQnLFxyXG4gICAgICBsaXN0ID0ge30sXHJcbiAgICAgIGxvYWRpbmdDbGFzcyA9ICdfbW9kdWxlLWxvYWRpbmcnLFxyXG4gICAgICBsb2FkZWRDbGFzcyA9ICdfbW9kdWxlLWxvYWRlZCcsXHJcbiAgICAgIGRlYnVnID0gZmFsc2VcclxuICAgIH0gPSBsb2FkZXJEYXRhXHJcblxyXG4gICAgaWYgKHR5cGVvZiBpbXBvcnRQcm9taXNlICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlTG9hZGVyIEVSUk9SISBZb3UgbXVzdCBzcGVjaWZ5IFwiaW1wb3J0UHJvbWlzZVwiIHByb3BlcnR5LCBhcyBGdW5jdGlvbiB3aXRoIGltcG9ydCgpJylcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGxpc3QgIT09ICdvYmplY3QnIHx8IE9iamVjdC5rZXlzKGxpc3QpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZUxvYWRlciBFUlJPUiEgWW91IG11c3Qgc3BlY2lmeSBcImxpc3RcIiBwcm9wZXJ0eSwgYXMgT2JqZWN0IHdpdGggdmFsdWVzJylcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIGxpc3QpIHtcclxuICAgICAgbGV0IHNlbGVjdG9ycyA9IGxpc3RbbW9kdWxlTmFtZV1cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0b3JzKSkge1xyXG4gICAgICAgIGxpc3RbbW9kdWxlTmFtZV0gPSBzZWxlY3RvcnMuam9pbignLCcpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb2R1bGVzID0ge31cclxuICAgIGZvciAobGV0IG1vZHVsZU5hbWUgaW4gbGlzdCkge1xyXG4gICAgICBtb2R1bGVzW21vZHVsZU5hbWVdID0gKCkgPT4gaW1wb3J0UHJvbWlzZShtb2R1bGVOYW1lKVxyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaW5pdFNlbGVjdG9yJywge1xyXG4gICAgICBnZXQ6ICgpID0+IGluaXRTZWxlY3RvcixcclxuICAgICAgc2V0OiB2YWwgPT4gaXNQcm90ZWN0ZWQoJ2luaXRTZWxlY3RvcicsIHZhbClcclxuICAgIH0pXHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpbml0RnVuY3Rpb25OYW1lJywge1xyXG4gICAgICBnZXQ6ICgpID0+IGluaXRGdW5jdGlvbk5hbWUsXHJcbiAgICAgIHNldDogdmFsID0+IGlzUHJvdGVjdGVkKCdpbml0RnVuY3Rpb25OYW1lJywgdmFsKVxyXG4gICAgfSlcclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2xpc3QnLCB7XHJcbiAgICAgIGdldDogKCkgPT4gbGlzdCxcclxuICAgICAgc2V0OiB2YWwgPT4gaXNQcm90ZWN0ZWQoJ2xpc3QnLCB2YWwpXHJcbiAgICB9KVxyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbW9kdWxlcycsIHtcclxuICAgICAgZ2V0OiAoKSA9PiBtb2R1bGVzLFxyXG4gICAgICBzZXQ6IHZhbCA9PiBpc1Byb3RlY3RlZCgnbW9kdWxlcycsIHZhbClcclxuICAgIH0pXHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdsb2FkaW5nQ2xhc3MnLCB7XHJcbiAgICAgIGdldDogKCkgPT4gbG9hZGluZ0NsYXNzLFxyXG4gICAgICBzZXQ6IHZhbCA9PiBpc1Byb3RlY3RlZCgnbG9hZGluZ0NsYXNzJywgdmFsKVxyXG4gICAgfSlcclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2xvYWRlZENsYXNzJywge1xyXG4gICAgICBnZXQ6ICgpID0+IGxvYWRlZENsYXNzLFxyXG4gICAgICBzZXQ6IHZhbCA9PiBpc1Byb3RlY3RlZCgnbG9hZGVkQ2xhc3MnLCB2YWwpXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNnXHJcbiAgICogQHBhcmFtIHsuLi4qfSBbZGF0YV1cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGxvZyAodHlwZSwgbXNnLCAuLi5kYXRhKSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICBjb25zb2xlW3R5cGVdKGBNb2R1bGVMb2FkZXIgJHt0eXBlfTogJHttc2d9YCwgLi4uZGF0YSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBbJGNvbnRleHQ9JChkb2N1bWVudCldXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3RvcnNdXHJcbiAgICogQHJldHVybnMge2pRdWVyeX1cclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgZ2V0RWxlbWVudHMgKCRjb250ZXh0ID0gJChkb2N1bWVudCksIHNlbGVjdG9ycykge1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGh
10072pcy5pbml0U2VsZWN0b3JcclxuICAgIGlmIChzZWxlY3RvcnMpIHtcclxuICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnMuc3BsaXQoJywnKS5tYXAoc2VsZWN0b3IgPT4gdGhpcy5pbml0U2VsZWN0b3IgKyBzZWxlY3Rvcikuam9pbignLCcpXHJcbiAgICB9XHJcbiAgICB0aGlzLmxvZygnaW5mbycsIGBHZXQgZWxlbWVudHMgXCIke3NlbGVjdG9yfVwiIGluYCwgJGNvbnRleHQpXHJcbiAgICByZXR1cm4gJGNvbnRleHQuZmluZChzZWxlY3RvcilcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVOYW1lXHJcbiAgICogQHBhcmFtIHtqUXVlcnl9IFskY29udGV4dF1cclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgcnVuTW9kdWxlIChtb2R1bGVOYW1lLCAkY29udGV4dCkge1xyXG4gICAgdGhpcy5sb2coJ3dhcm4nLCAnVXNlIC5sb2FkKCkgb25seSBtZXRob2QgYWZ0ZXIgLmluaXQoKScpXHJcbiAgICBjb25zb2xlLmxvZyhtb2R1bGVOYW1lLCAkY29udGV4dClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbWVudHNcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIG1hcmtBc0xvYWRpbmdFbGVtZW50cyAoJGVsZW1lbnRzKSB7XHJcbiAgICAkZWxlbWVudHMubm90KHRoaXMubG9hZGVkQ2xhc3MpLmFkZENsYXNzKHRoaXMubG9hZGluZ0NsYXNzKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtZW50c1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgbWFya0FzTG9hZGVkRWxlbWVudHMgKCRlbGVtZW50cykge1xyXG4gICAgJGVsZW1lbnRzLnJlbW92ZUNsYXNzKHRoaXMubG9hZGluZ0NsYXNzKS5hZGRDbGFzcyh0aGlzLmxvYWRlZENsYXNzKVxyXG4gICAgJGVsZW1lbnRzLmRhdGEoJ21vZHVsZUxvYWRlcicsIHRoaXMpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge2pRdWVyeX0gWyRjb250ZXh0PSQoZG9jdW1lbnQpXVxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBpbml0ICgkY29udGV4dCA9ICQoZG9jdW1lbnQpKSB7XHJcbiAgICBjb25zdCAkZWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzKCRjb250ZXh0KVxyXG4gICAgaWYgKCEkZWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMubG9nKCdpbmZvJywgYE5vIGluaXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvciBcIiR7dGhpcy5pbml0U2VsZWN0b3J9XCJgKVxyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJ1bk1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCAkY29udGV4dCkge1xyXG4gICAgICBjb25zdCBzZWxlY3RvcnMgPSB0aGlzLmxpc3RbbW9kdWxlTmFtZV1cclxuICAgICAgY29uc3QgJG1vZHVsZUVsZW1lbnRzID0gJGNvbnRleHQgPyB0aGlzLmdldEVsZW1lbnRzKCRjb250ZXh0LCBzZWxlY3RvcnMpIDogJGVsZW1lbnRzLmZpbHRlcihzZWxlY3RvcnMpXHJcbiAgICAgIHRoaXMubWFya0FzTG9hZGluZ0VsZW1lbnRzKCRtb2R1bGVFbGVtZW50cylcclxuXHJcbiAgICAgIGlmICgkbW9kdWxlRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5sb2coJ2luZm8nLCBgTG9hZCBtb2R1bGUgXCIke21vZHVsZU5hbWV9XCJgKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0oKS50aGVuKG1vZHVsZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpc0Z1bmN0aW9uID0gdHlwZW9mIG1vZHVsZVt0aGlzLmluaXRGdW5jdGlvbk5hbWVdID09PSAnZnVuY3Rpb24nXHJcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZygnaW5mbycsIGBJbml0IG1vZHVsZSBcIiR7bW9kdWxlTmFtZX1cImApXHJcbiAgICAgICAgICAgIHRoaXMubWFya0FzTG9hZGVkRWxlbWVudHMoJG1vZHVsZUVsZW1lbnRzKVxyXG4gICAgICAgICAgICBtb2R1bGVbdGhpcy5pbml0RnVuY3Rpb25OYW1lXSgkbW9kdWxlRWxlbWVudHMsIHRoaXMpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZygnd2FybicsIGBNb2R1bGUgXCIke21vZHVsZU5hbWV9XCIgaGFzIG5vIGV4cG9ydGVkIG1ldGhvZCBcIiR7dGhpcy5pbml0U2VsZWN0b3J9XCJgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubGlzdCkge1xyXG4gICAgICB0aGlzLnJ1bk1vZHVsZShtb2R1bGVOYW1lKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBFeHBvcnRzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZHVsZUxvYWRlclxyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogV2V6b20gU3RhbmRhcmQgVGFic1xyXG4gKiBAbW9kdWxlXHJcbiAqIEBhdXRob3IgT2xlZyBEdXRjaGVua28gPGR1dGNoZW5rby5vLmRldkBnbWFpbC5jb20+XHJcbiAqIEBsaWNlbmNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vV2V6b21BZ2VuY3kvd2V6b20tc3RhbmRhcmQtdGFicy9ibG9iL21hc3Rlci9MSUNFTlNFfVxyXG4gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gSW1wb3J0c1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgJ2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9nZXQtbXktZWxlbWVudHMnO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBQcml2YXRlXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7e215QmxvY2tzOiBzdHJpbmcsIG15QmxvY2s6IHN0cmluZywgbXlCdXR0b25zOiBzdHJpbmd9fVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgX2
1007215S2V5cyA9IHtcclxuXHRteUJsb2NrOiAnJG15V3NUYWJzQmxvY2snLFxyXG5cdG15QmxvY2tzOiAnJG15V3NUYWJzQmxvY2tzJyxcclxuXHRteUJ1dHRvbnM6ICckbXlXc1RhYnNCdXR0b25zJ1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkYnV0dG9uXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gX25vUmVhY3QgKCRidXR0b24pIHtcclxuXHRyZXR1cm4gJGJ1dHRvbi5oYXNDbGFzcyh3c1RhYnMuY3NzQ2xhc3MuYWN0aXZlKSB8fCAkYnV0dG9uLmhhc0NsYXNzKHdzVGFicy5jc3NDbGFzcy5kaXNhYmxlZCkgfHwgJGJ1dHRvbi5wcm9wKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtqUXVlcnl9ICRidXR0b25cclxuICogQHBhcmFtIHtqUXVlcnl9ICRjb250ZXh0XHJcbiAqIEByZXR1cm4ge3tteU5zOnN0cmluZywgbXlOYW1lOnN0cmluZywgYnV0dG9uc1NlbGVjdG9yOnN0cmluZywgYnV0dG9uU3luY1NlbGVjdG9yOnN0cmluZywgYmxvY2tzU2VsZWN0b3I6c3RyaW5nLCBibG9ja1NlbGVjdG9yOnN0cmluZywgJGJsb2NrOmpRdWVyeSwgJHNpYmxpbmdCbG9ja3M6alF1ZXJ5LCAkc2libGluZ0J1dHRvbnM6alF1ZXJ5LCAkc3luY0J1dHRvbnM6alF1ZXJ5fX1cclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIF9lamVjdERhdGEgKCRidXR0b24sICRjb250ZXh0KSB7XHJcblx0bGV0ICRzaWJsaW5nID0gbnVsbDtcclxuXHRjb25zdCBkYXRhID0ge1xyXG5cdFx0bXlOczogJGJ1dHRvbi5kYXRhKHdzVGFicy5rZXlzLm5zKSxcclxuXHRcdG15TmFtZTogJGJ1dHRvbi5kYXRhKHdzVGFicy5rZXlzLmJ1dHRvbiksXHJcblx0XHRnZXQgYnV0dG9uc1NlbGVjdG9yICgpIHtcclxuXHRcdFx0cmV0dXJuIGBbZGF0YS0ke3dzVGFicy5rZXlzLm5zfT1cIiR7dGhpcy5teU5zfVwiXVtkYXRhLSR7d3NUYWJzLmtleXMuYnV0dG9ufV1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCBidXR0b25TeW5jU2VsZWN0b3IgKCkge1xyXG5cdFx0XHRyZXR1cm4gYFtkYXRhLSR7d3NUYWJzLmtleXMubnN9PVwiJHt0aGlzLm15TnN9XCJdW2RhdGEtJHt3c1RhYnMua2V5cy5idXR0b259PVwiJHt0aGlzLm15TmFtZX1cIl1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCBibG9ja3NTZWxlY3RvciAoKSB7XHJcblx0XHRcdHJldHVybiBgW2RhdGEtJHt3c1RhYnMua2V5cy5uc309XCIke3RoaXMubXlOc31cIl1bZGF0YS0ke3dzVGFicy5rZXlzLmJsb2NrfV1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCBibG9ja1NlbGVjdG9yICgpIHtcclxuXHRcdFx0cmV0dXJuIGBbZGF0YS0ke3dzVGFicy5rZXlzLm5zfT1cIiR7dGhpcy5teU5zfVwiXVtkYXRhLSR7d3NUYWJzLmtleXMuYmxvY2t9PVwiJHt0aGlzLm15TmFtZX1cIl1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCAkYmxvY2sgKCkge1xyXG5cdFx0XHRyZXR1cm4gJGJ1dHRvbi5nZXRNeUVsZW1lbnRzKF9teUtleXMubXlCbG9jaywgdGhpcy5ibG9ja1NlbGVjdG9yKTtcclxuXHRcdH0sXHJcblx0XHRnZXQgJHNpYmxpbmdCbG9ja3MgKCkge1xyXG5cdFx0XHRsZXQgJGJsb2NrcyA9IHRoaXMuJGJsb2NrLmdldE15RWxlbWVudHMoX215S2V5cy5teUJsb2NrcywgdGhpcy5ibG9ja3NTZWxlY3RvciwgJGNvbnRleHQsIHRydWUpO1xyXG5cdFx0XHRyZXR1cm4gJGJsb2Nrcy5ub3QodGhpcy5ibG9ja1NlbGVjdG9yKTtcclxuXHRcdH0sXHJcblx0XHRnZXQgJHNpYmxpbmdCdXR0b25zICgpIHtcclxuXHRcdFx0cmV0dXJuICRzaWJsaW5nIHx8ICRidXR0b24uZ2V0TXlFbGVtZW50cyhfbXlLZXlzLm15QnV0dG9ucywgdGhpcy5idXR0b25zU2VsZWN0b3IsICRjb250ZXh0LCB0cnVlKTtcclxuXHRcdH0sXHJcblx0XHRnZXQgJHN5bmNCdXR0b25zICgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuJHNpYmxpbmdCdXR0b25zLmZpbHRlcih0aGlzLmJ1dHRvblN5bmNTZWxlY3Rvcik7XHJcblx0XHR9XHJcblx0fTtcclxuXHRpZiAoZGF0YS4kc3luY0J1dHRvbnMubGVuZ3RoKSB7XHJcblx0XHQkc2libGluZyA9IGRhdGEuJHNpYmxpbmdCdXR0b25zLm5vdChkYXRhLiRzeW5jQnV0dG9ucyk7XHJcblx0fVxyXG5cdHJldHVybiBkYXRhO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcclxuICogQHBhcmFtIHsqfSAuLi5hcmdzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBfcnVuSG9vayAobmFtZSwgLi4uYXJncykge1xyXG5cdGNvbnN0IGhvb2tzID0gd3NUYWJzLmhvb2tzW25hbWVdO1xyXG5cdGlmIChBcnJheS5pc0FycmF5KGhvb2tzKSkge1xyXG5cdFx0aG9va3MuZm9yRWFjaChob29rID0+IHtcclxuXHRcdFx0aWYgKHR5cGVvZiBob29rID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0aG9vayguLi5hcmdzKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtqUXVlcnl9ICRidXR0b25cclxuICogQHBhcmFtIHtqUXVlcnl9ICRjb250ZXh0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBfY2hhbmdlVGFiICgkYnV0dG9uLCAkY29udGV4dCkge1xyXG5cdGNvbnN0IHsgbXlOcywgbXlOYW1lLCAkYmxvY2ssICRzaWJsaW5nQmxvY2tzLCAkc2libGluZ0J1dHRvbnMsICRzeW5jQnV0dG9ucyB9ID0gX2VqZWN0RGF0YSgkYnV0dG9uLCAkY29udGV4dCk7XHJcblx0aWYgKF9ub1JlYWN0KCRidXR0b24pKSB7XHJcblx0XHRfcnVuSG9vaygnYmVmb3JlQWdhaW4nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jayk7XHJcblx0XHQkYnV0dG9uLmFkZCgkYmxvY2spLnRyaWdnZXIod3NUYWJzLmV2ZW50cy5hZ2Fpbik7XHJcblx0XHRfcnVuSG9vaygnYWdhaW4nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jayk7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRfcnVuSG9vaygnYmVmb3JlT2ZmJywgbXlOcywgbXlOYW1lLCAkc2libGluZ0J1dHRvbnMsICRzaWJsaW5nQmxvY2tzKTtcclxuXHRfcnVuSG9vaygnYmVmb3JlT24nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jaywgJHN5bmNCdXR0b25zKTtcclxuXHJcblx0JHNpYmxpbmdCdXR0b25zLmFkZCg
10072kc2libGluZ0Jsb2NrcykucmVtb3ZlQ2xhc3Mod3NUYWJzLmNzc0NsYXNzLmFjdGl2ZSkudHJpZ2dlcih3c1RhYnMuZXZlbnRzLm9mZik7XHJcblx0JGJ1dHRvbi5hZGQoJHN5bmNCdXR0b25zKS5hZGQoJGJsb2NrKS5hZGRDbGFzcyh3c1RhYnMuY3NzQ2xhc3MuYWN0aXZlKS50cmlnZ2VyKHdzVGFicy5ldmVudHMub24pO1xyXG5cclxuXHRfcnVuSG9vaygnb2ZmJywgbXlOcywgbXlOYW1lLCAkc2libGluZ0J1dHRvbnMsICRzaWJsaW5nQmxvY2tzKTtcclxuXHRfcnVuSG9vaygnb24nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jaywgJHN5bmNCdXR0b25zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkYnV0dG9uc1xyXG4gKiBAcGFyYW0ge2pRdWVyeX0gJGNvbnRleHRcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIHNldEFjdGl2ZUlmTm90SGF2ZSAoJGJ1dHRvbnMsICRjb250ZXh0KSB7XHJcblx0bGV0IG5zID0gJGJ1dHRvbnMuZGF0YSh3c1RhYnMua2V5cy5ucyk7XHJcblx0bGV0IHNlbGVjdG9yID0gYFtkYXRhLSR7d3NUYWJzLmtleXMubnN9PVwiJHtuc31cIl1gO1xyXG5cdGxldCAkZ3JvdXAgPSAkYnV0dG9ucy5maWx0ZXIoc2VsZWN0b3IpO1xyXG5cclxuXHRpZiAoJGdyb3VwLmxlbmd0aCkge1xyXG5cdFx0bGV0ICRhY3RpdmUgPSAkZ3JvdXAuZmlsdGVyKGAuJHt3c1RhYnMuY3NzQ2xhc3MuYWN0aXZlfWApO1xyXG5cdFx0aWYgKCEkYWN0aXZlLmxlbmd0aCkge1xyXG5cdFx0XHRfY2hhbmdlVGFiKCRncm91cC5lcSgwKSwgJGNvbnRleHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgkZ3JvdXAubGVuZ3RoIDwgJGJ1dHRvbnMubGVuZ3RoKSB7XHJcblx0XHRcdHNldEFjdGl2ZUlmTm90SGF2ZSgkYnV0dG9ucy5ub3Qoc2VsZWN0b3IpLCAkY29udGV4dCk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtqUXVlcnl9ICRsaXN0XHJcbiAqIEBwYXJhbSB7c3RyaWdbXX0ga2V5c1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gZHJvcERlcGVuZGVuY2llcyAoJGxpc3QsIGtleXMpIHtcclxuXHRjb25zdCB3c1RhYnNLZXlzID0gT2JqZWN0LmtleXMod3NUYWJzLmtleXMpO1xyXG5cdCRsaXN0LmVhY2goKGksIGVsKSA9PiB7XHJcblx0XHRsZXQgJGl0ZW0gPSAkKGVsKTtcclxuXHRcdHdzVGFic0tleXMuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHQkaXRlbS5kYXRhKGtleSwgbnVsbCk7XHJcblx0XHR9KTtcclxuXHR9KTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBQdWJsaWNcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2VcclxuICovXHJcbmNvbnN0IHdzVGFicyA9IHtcclxuXHQvKipcclxuXHQgKiBAZW51bSB7c3RyaW5nfVxyXG5cdCAqL1xyXG5cdGV2ZW50czoge1xyXG5cdFx0b246ICd3c3RhYnMtb24nLFxyXG5cdFx0b2ZmOiAnd3N0YWJzLW9mZicsXHJcblx0XHRhZ2FpbjogJ3dzdGFicy1hZ2FpbidcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBAZW51bSB7ZnVuY3Rpb25bXX1cclxuXHQgKi9cclxuXHRob29rczoge1xyXG5cdFx0YmVmb3JlT246IFtdLFxyXG5cdFx0YmVmb3JlT2ZmOiBbXSxcclxuXHRcdGJlZm9yZUFnYWluOiBbXSxcclxuXHRcdG9uOiBbXSxcclxuXHRcdG9mZjogW10sXHJcblx0XHRhZ2FpbjogW10sXHJcblx0XHR1cGRhdGU6IFtdXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQGVudW0ge3N0cmluZ31cclxuXHQgKi9cclxuXHRjc3NDbGFzczoge1xyXG5cdFx0YWN0aXZlOiAnaXMtYWN0aXZlJyxcclxuXHRcdGRpc2FibGVkOiAnaXMtZGlzYWJsZWQnXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQGVudW0ge3N0cmluZ31cclxuXHQgKi9cclxuXHRrZXlzOiB7XHJcblx0XHRuczogJ3dzdGFicy1ucycsXHJcblx0XHRidXR0b246ICd3c3RhYnMtYnV0dG9uJyxcclxuXHRcdGJsb2NrOiAnd3N0YWJzLWJsb2NrJ1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemUuXHJcblx0ICogU2V0IGRlcGVuZGVuY2llcyBhbmQgZGVsZWdhdGVkIGhhbmRsZXJzXHJcblx0ICogQHBhcmFtIHtqUXVlcnl9IFskY29udGV4dD0kKGRvY3VtZW50KV1cclxuXHQgKi9cclxuXHRpbml0ICgkY29udGV4dCA9ICQoZG9jdW1lbnQpKSB7XHJcblx0XHR0aGlzLnVwZGF0ZURlcGVuZGVuY2llcygkY29udGV4dCk7XHJcblx0XHQkY29udGV4dC5vbignY2xpY2snLCBgW2RhdGEtJHt0aGlzLmtleXMuYnV0dG9ufV1gLCB7ICRjb250ZXh0IH0sIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0X2NoYW5nZVRhYigkKHRoaXMpLCAkY29udGV4dCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQkY29udGV4dC5vbigna2V5ZG93bicsIGBbZGF0YS0ke3RoaXMua2V5cy5idXR0b259XWAsIHsgJGNvbnRleHQgfSwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdGxldCBjb2RlID0gbnVsbDtcclxuXHRcdFx0aWYgKGV2ZW50LmtleSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0Y29kZSA9IGV2ZW50LmtleTtcclxuXHRcdFx0fSBlbHNlIGlmIChldmVudC5rZXlJZGVudGlmaWVyICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRjb2RlID0gZXZlbnQua2V5SWRlbnRpZmllcjtcclxuXHRcdFx0fSBlbHNlIGlmIChldmVudC5rZXlDb2RlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRjb2RlID0gZXZlbnQua2V5Q29kZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoY29kZSA9PT0gMTMgfHwgY29kZS50b0xvd2VyQ2FzZSgpID09PSAnZW50ZXInKSB7XHJcblx0XHRcdFx0X2NoYW5nZVRhYigkKHRoaXMpLCAkY29udGV4dCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcmNlZCBhY3RpdmF0aW9uIG9mIHRhYnMgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBvbmVcclxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gWyRjb250ZXh0PSQoZG9jdW1lbnQpXVxyXG5cdCAqL1xyXG5cdHNldEFjdGl2ZSAoJGNvbnRleHQgPSAkKGRvY3VtZW50KSkge1xyXG5cdFx0bGV0ICRidXR0b25zID0gJGNvbn
10072RleHQuZmluZChgW2RhdGEtJHt0aGlzLmtleXMuYnV0dG9ufV1gKTtcclxuXHRcdHNldEFjdGl2ZUlmTm90SGF2ZSgkYnV0dG9ucywgJGNvbnRleHQpO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZSBhbGwgZGVwZW5kZW5jaWVzXHJcblx0ICogQHBhcmFtIHtqUXVlcnl9IFskY29udGV4dD0kKGRvY3VtZW50KV1cclxuXHQgKiBAcmV0dXJuIHt7JGJ1dHRvbnM6ICRqUXVlcnksICRibG9ja3M6ICRqUXVlcnl9fVxyXG5cdCAqL1xyXG5cdGRyb3BEZXBlbmRlbmNpZXMgKCRjb250ZXh0ID0gJChkb2N1bWVudCkpIHtcclxuXHRcdGxldCAkYnV0dG9ucyA9ICRjb250ZXh0LmZpbmQoYFtkYXRhLSR7dGhpcy5rZXlzLmJ1dHRvbn1dYCk7XHJcblx0XHRsZXQgJGJsb2NrcyA9ICRjb250ZXh0LmZpbmQoYFtkYXRhLSR7dGhpcy5rZXlzLmJsb2NrfV1gKTtcclxuXHRcdGRyb3BEZXBlbmRlbmNpZXMoJGJ1dHRvbnMsIFtfbXlLZXlzLm15QmxvY2ssIF9teUtleXMubXlCdXR0b25zXSk7XHJcblx0XHRkcm9wRGVwZW5kZW5jaWVzKCRibG9ja3MsIFtfbXlLZXlzLm15QmxvY2tzXSk7XHJcblx0XHRyZXR1cm4geyAkYnV0dG9ucywgJGJsb2NrcyB9O1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBhbGwgZGVwZW5kZW5jaWVzIHdpdGggcHJlLXJlc2V0LlxyXG5cdCAqIEFjdHVhbCB3aGVuIGR5bmFtaWNhbGx5IGFkZGluZyBuZXcgYnV0dG9ucyBhbmQgYmxvY2tzIHRvIGV4aXN0aW5nIHRhYiBncm91cHNcclxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gWyRjb250ZXh0PSQoZG9jdW1lbnQpXVxyXG5cdCAqL1xyXG5cdHVwZGF0ZURlcGVuZGVuY2llcyAoJGNvbnRleHQgPSAkKGRvY3VtZW50KSkge1xyXG5cdFx0Y29uc3QgeyAkYnV0dG9ucyB9ID0gdGhpcy5kcm9wRGVwZW5kZW5jaWVzKCRjb250ZXh0KTtcclxuXHRcdCRidXR0b25zLmVhY2goKGksIGJ1dHRvbikgPT4ge1xyXG5cdFx0XHRjb25zdCAkYnV0dG9uID0gJChidXR0b24pO1xyXG5cdFx0XHRjb25zdCB7IG15TnMsIG15TmFtZSwgJGJsb2NrLCAkc3luY0J1dHRvbnMgfSA9IF9lamVjdERhdGEoJGJ1dHRvbiwgJGNvbnRleHQpO1xyXG5cdFx0XHRfcnVuSG9vaygndXBkYXRlJywgbXlOcywgbXlOYW1lLCAkYnV0dG9uLCAkYmxvY2ssICRzeW5jQnV0dG9ucyk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gJGJ1dHRvblxyXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSBbJGNvbnRleHQ9JChkb2N1bWVudCldXHJcblx0ICogQHJldHVybnMge3tteU5zOiBzdHJpbmcsIG15TmFtZTogc3RyaW5nLCBidXR0b25zU2VsZWN0b3I6IHN0cmluZywgYnV0dG9uU3luY1NlbGVjdG9yOiBzdHJpbmcsIGJsb2Nrc1NlbGVjdG9yOiBzdHJpbmcsIGJsb2NrU2VsZWN0b3I6IHN0cmluZywgJGJsb2NrOiBqUXVlcnksICRzaWJsaW5nQmxvY2tzOiBqUXVlcnksICRzaWJsaW5nQnV0dG9uczogalF1ZXJ5LCAkc3luY0J1dHRvbnM6IGpRdWVyeX19XHJcblx0ICovXHJcblx0ZWplY3REYXRhICgkYnV0dG9uLCAkY29udGV4dCA9ICQoZG9jdW1lbnQpKSB7XHJcblx0XHRyZXR1cm4gX2VqZWN0RGF0YSgkYnV0dG9uLCAkY29udGV4dCk7XHJcblx0fVxyXG59O1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBFeHBvcnRzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdzVGFicztcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBqUXVlcnk7Il0sInNvdXJjZVJvb3QiOiIifQ==

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.