File: D:/HostingSpaces/SBogers10/slenders.komma.pro/wwwroot/js/site/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/site/app"],{
/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
!*** ./node_modules/process/browser.js ***!
\*****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// 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
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// 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.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;
process.listeners = function (name) { return [] }
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
/***/ }),
/***/ "./node_modules/setimmediate/setImmediate.js":
/*!***************************************************!*\
!*** ./node_modules/setimmediate/setImmediate.js ***!
\***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
"use strict";
if (global.setImmediate) {
return;
}
var nextHandle = 1; // Spec says greater than zero
var tasksByHandle = {};
var currentlyRunningATask = false;
var doc = global.document;
var registerImmediate;
function setImmediate(callback) {
// Callback can either be a function or a string
if (typeof callback !== "function") {
callback = new Function("" + callback);
}
// Copy function arguments
var args = new Array(arguments.length - 1);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i + 1];
}
// Store and register the task
var task = { callback: callback, args: args };
tasksByHandle[nextHandle] = task;
registerImmediate(nextHandle);
return nextHandle++;
}
function clearImmediate(handle) {
delete tasksByHandle[handle];
}
function run(task) {
var callback = task.callback;
var args = task.args;
switch (args.length) {
case 0:
callback();
break;
case 1:
callback(args[0]);
break;
case 2:
callback(args[0], args[1]);
break;
case 3:
callback(args[0], args[1], args[2]);
break;
default:
callback.apply(undefined, args);
break;
}
}
function runIfPresent(handle) {
// From the spec: "Wait until any invocations of this algorithm started before this one have completed."
// So if we're currently running a task, we'll need to delay this invocation.
if (currentlyRunningATask) {
// Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
// "too much recursion" error.
setTimeout(runIfPresent, 0, handle);
} else {
var task = tasksByHandle[handle];
if (task) {
currentlyRunningATask = true;
try {
run(task);
} finally {
clearImmediate(handle);
currentlyRunningATask = false;
}
}
}
}
function installNextTickImplementation() {
registerImmediate = function(handle) {
process.nextTick(function () { runIfPresent(handle); });
};
}
function canUsePostMessage() {
// The test against `importScripts` prevents this implementation from being installed inside a web worker,
// where `global.postMessage` means something completely different and can't be used for this purpose.
if (global.postMessage && !global.importScripts) {
var postMessageIsAsynchronous = true;
var oldOnMessage = global.onmessage;
global.onmessage = function() {
postMessageIsAsynchronous = false;
};
global.postMessage("", "*");
global.onmessage = oldOnMessage;
return postMessageIsAsynchronous;
}
}
function installPostMessageImplementation() {
// Installs an event handler on `global` for the `message` event: see
// * https://developer.mozilla.org/en/DOM/window.postMessage
// * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
var messagePrefix = "setImmediate$" + Math.random() + "$";
var onGlobalMessage = function(event) {
if (event.source === global &&
typeof event.data === "string" &&
event.data.indexOf(messagePrefix) === 0) {
runIfPresent(+event.data.slice(messagePrefix.length));
}
};
if (global.addEventListener) {
global.addEventListener("message", onGlobalMessage, false);
} else {
global.attachEvent("onmessage", onGlobalMessage);
}
registerImmediate = function(handle) {
global.postMessage(messagePrefix + handle, "*");
};
}
function installMessageChannelImplementation() {
var channel = new MessageChannel();
channel.port1.onmessage = function(event) {
var handle = event.data;
runIfPresent(handle);
};
registerImmediate = function(handle) {
channel.port2.postMessage(handle);
};
}
function installReadyStateChangeImplementation() {
var html = doc.documentElement;
registerImmediate = function(handle) {
// Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
// into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
var script = doc.createElement("script");
script.onreadystatechange = function () {
runIfPresent(handle);
script.onreadystatechange = null;
html.removeChild(script);
script = null;
};
html.appendChild(script);
};
}
function installSetTimeoutImplementation() {
registerImmediate = function(handle) {
setTimeout(runIfPresent, 0, handle);
};
}
// If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
// Don't get fooled by e.g. browserify environments.
if ({}.toString.call(global.process) === "[object process]") {
// For Node.js before 0.9
installNextTickImplementation();
} else if (canUsePostMessage()) {
// For non-IE10 modern browsers
installPostMessageImplementation();
} else if (global.MessageChannel) {
// For web workers, where supported
installMessageChannelImplementation();
} else if (doc && "onreadystatechange" in doc.createElement("script")) {
// For IE 6–8
installReadyStateChangeImplementation();
} else {
// For older browsers
installSetTimeoutImplementation();
}
attachTo.setImmediate = setImmediate;
attachTo.clearImmediate = clearImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
/* 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")))
/***/ }),
/***/ "./node_modules/timers-browserify/main.js":
/*!************************************************!*\
!*** ./node_modules/timers-browserify/main.js ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
(typeof self !== "undefined" && self) ||
window;
var apply = Function.prototype.apply;
// DOM APIs, for completeness
exports.setTimeout = function() {
return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
};
exports.setInterval = function() {
return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) {
if (timeout) {
timeout.close();
}
};
function Timeout(id, clearFn) {
this._id = id;
this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
this._clearFn.call(scope, this._id);
};
// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
clearTimeout(item._idleTimeoutId);
item._idleTimeout = msecs;
};
exports.unenroll = function(item) {
clearTimeout(item._idleTimeoutId);
item._idleTimeout = -1;
};
exports._unrefActive = exports.active = function(item) {
clearTimeout(item._idleTimeoutId);
var msecs = item._idleTimeout;
if (msecs >= 0) {
item._idleTimeoutId = setTimeout(function onTimeout() {
if (item._onTimeout)
item._onTimeout();
}, msecs);
}
};
// setimmediate attaches itself to the global object
__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js");
// On some exotic environments, it's not clear which object `setimmediate` was
// able to install onto. Search each possibility in the same order as the
// `setimmediate` library.
exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
(typeof global !== "undefined" && global.setImmediate) ||
(this && this.setImmediate);
exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
(typeof global !== "undefined" && global.clearImmediate) ||
(this && this.clearImmediate);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || new Function("return this")();
} catch (e) {
// This works if the window reference is available
if (typeof window === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/***/ "./node_modules/webpack/buildin/module.js":
/*!***********************************!*\
!*** (webpack)/buildin/module.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = function(module) {
if (!module.webpackPolyfill) {
module.deprecate = function() {};
module.paths = [];
// module.parent = undefined by default
if (!module.children) module.children = [];
Object.defineProperty(module, "loaded", {
enumerable: true,
get: function() {
return module.l;
}
});
Object.defineProperty(module, "id", {
enumerable: true,
get: function() {
return module.i;
}
});
module.webpackPolyfill = 1;
}
return module;
};
/***/ }),
/***/ "./resources/js/global/polyfills/eventPolyFill.js":
/*!********************************************************!*\
!*** ./resources/js/global/polyfills/eventPolyFill.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* Event semi polyfill. IE does not support new event. But does support document.createEvent.
* Same thing for dispatching events. But then with createEvent and fireEvent.
*/
function createNewEvent(eventName) {
var event;
if (typeof Event === 'function') {
//On ie it is typeOf object.
event = new Event(eventName); //Non-ie
} else {
event = document.createEvent('Event'); //ie
event.initEvent(eventName, true, true);
}
return event;
}
function dispatchEventForElement(element, event) {
if (document.createEvent) {
element.dispatchEvent(event);
} else {
element.fireEvent("on" + event.eventType, event);
}
}
/***/ }),
/***/ "./resources/js/global/polyfills/isInteger.js":
/*!****************************************************!*\
!*** ./resources/js/global/polyfills/isInteger.js ***!
\****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
Number.isInteger = Number.isInteger || function (value) {
return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};
/***/ }),
/***/ "./resources/js/global/polyfills/promise.js":
/*!**************************************************!*\
!*** ./resources/js/global/polyfills/promise.js ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(setImmediate, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
(function (global, factory) {
( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? factory() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
__WEBPACK_AMD_DEFINE_FACTORY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;
})(this, function () {
'use strict';
/**
* @this {Promise}
*/
function finallyConstructor(callback) {
var constructor = this.constructor;
return this.then(function (value) {
return constructor.resolve(callback()).then(function () {
return value;
});
}, function (reason) {
return constructor.resolve(callback()).then(function () {
return constructor.reject(reason);
});
});
} // Store setTimeout reference so promise-polyfill will be unaffected by
// other code modifying setTimeout (like sinon.useFakeTimers())
var setTimeoutFunc = setTimeout;
function noop() {} // Polyfill for Function.prototype.bind
function bind(fn, thisArg) {
return function () {
fn.apply(thisArg, arguments);
};
}
/**
* @constructor
* @param {Function} fn
*/
function Promise(fn) {
if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');
if (typeof fn !== 'function') throw new TypeError('not a function');
/** @type {!number} */
this._state = 0;
/** @type {!boolean} */
this._handled = false;
/** @type {Promise|undefined} */
this._value = undefined;
/** @type {!Array<!Function>} */
this._deferreds = [];
doResolve(fn, this);
}
function handle(self, deferred) {
while (self._state === 3) {
self = self._value;
}
if (self._state === 0) {
self._deferreds.push(deferred);
return;
}
self._handled = true;
Promise._immediateFn(function () {
var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
if (cb === null) {
(self._state === 1 ? resolve : reject)(deferred.promise, self._value);
return;
}
var ret;
try {
ret = cb(self._value);
} catch (e) {
reject(deferred.promise, e);
return;
}
resolve(deferred.promise, ret);
});
}
function resolve(self, newValue) {
try {
// Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');
if (newValue && (_typeof(newValue) === 'object' || typeof newValue === 'function')) {
var then = newValue.then;
if (newValue instanceof Promise) {
self._state = 3;
self._value = newValue;
finale(self);
return;
} else if (typeof then === 'function') {
doResolve(bind(then, newValue), self);
return;
}
}
self._state = 1;
self._value = newValue;
finale(self);
} catch (e) {
reject(self, e);
}
}
function reject(self, newValue) {
self._state = 2;
self._value = newValue;
finale(self);
}
function finale(self) {
if (self._state === 2 && self._deferreds.length === 0) {
Promise._immediateFn(function () {
if (!self._handled) {
Promise._unhandledRejectionFn(self._value);
}
});
}
for (var i = 0, len = self._deferreds.length; i < len; i++) {
handle(self, self._deferreds[i]);
}
self._deferreds = null;
}
/**
* @constructor
*/
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
this.onRejected = typeof onRejected === 'function' ? onRejected : null;
this.promise = promise;
}
/**
* Take a potentially misbehaving resolver function and make sure
* onFulfilled and onRejected are only called once.
*
* Makes no guarantees about asynchrony.
*/
function doResolve(fn, self) {
var done = false;
try {
fn(function (value) {
if (done) return;
done = true;
resolve(self, value);
}, function (reason) {
if (done) return;
done = true;
reject(self, reason);
});
} catch (ex) {
if (done) return;
done = true;
reject(self, ex);
}
}
Promise.prototype['catch'] = function (onRejected) {
return this.then(null, onRejected);
};
Promise.prototype.then = function (onFulfilled, onRejected) {
// @ts-ignore
var prom = new this.constructor(noop);
handle(this, new Handler(onFulfilled, onRejected, prom));
return prom;
};
Promise.prototype['finally'] = finallyConstructor;
Promise.all = function (arr) {
return new Promise(function (resolve, reject) {
if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');
var args = Array.prototype.slice.call(arr);
if (args.length === 0) return resolve([]);
var remaining = args.length;
function res(i, val) {
try {
if (val && (_typeof(val) === 'object' || typeof val === 'function')) {
var then = val.then;
if (typeof then === 'function') {
then.call(val, function (val) {
res(i, val);
}, reject);
return;
}
}
args[i] = val;
if (--remaining === 0) {
resolve(args);
}
} catch (ex) {
reject(ex);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
};
Promise.resolve = function (value) {
if (value && _typeof(value) === 'object' && value.constructor === Promise) {
return value;
}
return new Promise(function (resolve) {
resolve(value);
});
};
Promise.reject = function (value) {
return new Promise(function (resolve, reject) {
reject(value);
});
};
Promise.race = function (values) {
return new Promise(function (resolve, reject) {
for (var i = 0, len = values.length; i < len; i++) {
values[i].then(resolve, reject);
}
});
}; // Use polyfill for setImmediate for performance gains
Promise._immediateFn = typeof setImmediate === 'function' && function (fn) {
setImmediate(fn);
} || function (fn) {
setTimeoutFunc(fn, 0);
};
Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
if (typeof console !== 'undefined' && console) {
console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
}
};
/** @suppress {undefinedVars} */
var globalNS = function () {
// the only reliable means to get the global object is
// `Function('return this')()`
// However, this causes CSP violations in Chrome apps.
if (typeof self !== 'undefined') {
return self;
}
if (typeof window !== 'undefined') {
return window;
}
if (typeof global !== 'undefined') {
return global;
}
throw new Error('unable to locate global object');
}();
if (!('Promise' in globalNS)) {
globalNS['Promise'] = Promise;
} else if (!globalNS.Promise.prototype['finally']) {
globalNS.Promise.prototype['finally'] = finallyConstructor;
}
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./resources/js/global/polyfills/symbol-es6.min.js":
/*!*********************************************************!*\
!*** ./resources/js/global/polyfills/symbol-es6.min.js ***!
\*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global, module) {function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
!function (global, factory) {
"use strict";
"object" == ( false ? undefined : _typeof(module)) && "object" == _typeof(module.exports) ? module.exports = factory(global) : factory(global);
}("undefined" != typeof window ? window : global, function (global) {
"use strict";
var defineProperty = Object.defineProperty,
defineProperties = Object.defineProperties,
symbolHiddenCounter = 0,
globalSymbolRegistry = [],
slice = Array.prototype.slice,
ES6 = "object" == _typeof(global.ES6) ? global.ES6 : global.ES6 = {},
isArray = Array.isArray,
objectToString = Object.prototype.toString,
push = Array.prototype.push,
emptyFunction = function emptyFunction() {},
simpleFunction = function simpleFunction(arg) {
return arg;
},
isCallable = function isCallable(fn) {
return "function" == typeof fn;
},
Iterator = function Iterator() {},
ArrayIterator = function ArrayIterator(array, flag) {
this._array = array, this._flag = flag, this._nextIndex = 0;
},
StringIterator = function StringIterator(string, flag) {
this._string = string, this._flag = flag, this._nextIndex = 0;
},
isObject = function isObject(value) {
return null !== value && ("object" == _typeof(value) || "function" == typeof value);
},
setupSymbolInternals = function setupSymbolInternals(symbol, desc) {
return defineProperties(symbol, {
_description: {
value: desc
},
_isSymbol: {
value: !0
},
_id: {
value: symbolHiddenCounter++
}
}), symbol;
},
appendArray = function appendArray(array1, array2) {
if ("number" == typeof array1.length && array1.length >= 0 && "number" == typeof array2.length && array2.length >= 0) {
var length1 = Math.floor(array1.length),
length2 = Math.floor(array2.length),
i = 0;
for (array1.length = length1 + length2; i < length2; ++i) {
array2.hasOwnProperty(i) && (array1[length1 + i] = array2[i]);
}
}
},
simpleInheritance = function simpleInheritance(child, parent) {
if ("function" != typeof child || "function" != typeof parent) throw new TypeError("Child and Parent must be function type");
child.prototype = Object.create(parent.prototype), child.prototype.constructor = child;
},
_Symbol = function _Symbol2(desc) {
if (desc = void 0 === desc ? "" : String(desc), this instanceof _Symbol2) throw new TypeError("Symbol is not a constructor");
return setupSymbolInternals(Object.create(_Symbol2.prototype), desc);
};
defineProperties(_Symbol, {
"for": {
value: function value(key) {
key = String(key);
for (var record, registryLength = globalSymbolRegistry.length, i = 0; i < registryLength; ++i) {
if ((record = globalSymbolRegistry[i]).key === key) return record.symbol;
}
return record = {
key: key,
symbol: _Symbol(key)
}, globalSymbolRegistry.push(record), record.symbol;
},
writable: !0,
configurable: !0
},
keyFor: {
value: function value(symbol) {
if (!ES6.isSymbol(symbol)) throw new TypeError(String(symbol) + " is not a symbol");
for (var record, registryLength = globalSymbolRegistry.length, i = 0; i < registryLength; ++i) {
if ((record = globalSymbolRegistry[i]).symbol === symbol) return record.key;
}
},
writable: !0,
configurable: !0
},
hasInstance: {
value: _Symbol("Symbol.hasInstance")
},
isConcatSpreadable: {
value: _Symbol("Symbol.isConcatSpreadable")
},
iterator: {
value: _Symbol("Symbol.iterator")
},
toStringTag: {
value: _Symbol("Symbol.toStringTag")
}
}), _Symbol.prototype.toString = function () {
return "@@_____" + this._id + "_____";
}, _Symbol.prototype.valueOf = function () {
return this;
}, defineProperty(Iterator.prototype, _Symbol.iterator.toString(), {
value: function value() {
return this;
},
writable: !0,
configurable: !0
}), simpleInheritance(ArrayIterator, Iterator), simpleInheritance(StringIterator, Iterator), defineProperty(ArrayIterator.prototype, _Symbol.toStringTag.toString(), {
value: "Array Iterator",
configurable: !0
}), defineProperty(StringIterator.prototype, _Symbol.toStringTag.toString(), {
value: "String Iterator",
configurable: !0
}), ArrayIterator.prototype.next = function () {
if (!(this instanceof ArrayIterator)) throw new TypeError("Method Array Iterator.prototype.next called on incompatible receiver " + String(this));
var nextValue;
return -1 === this._nextIndex ? {
done: !0,
value: void 0
} : "number" == typeof this._array.length && this._array.length >= 0 && this._nextIndex < Math.floor(this._array.length) ? (1 === this._flag ? nextValue = [this._nextIndex, this._array[this._nextIndex]] : 2 === this._flag ? nextValue = this._array[this._nextIndex] : 3 === this._flag && (nextValue = this._nextIndex), this._nextIndex++, {
done: !1,
value: nextValue
}) : (this._nextIndex = -1, {
done: !0,
value: void 0
});
}, StringIterator.prototype.next = function () {
if (!(this instanceof StringIterator)) throw new TypeError("Method String Iterator.prototype.next called on incompatible receiver " + String(this));
var nextValue,
stringObject = new String(this._string);
return -1 === this._nextIndex ? {
done: !0,
value: void 0
} : this._nextIndex < stringObject.length ? (nextValue = stringObject[this._nextIndex], this._nextIndex++, {
done: !1,
value: nextValue
}) : (this._nextIndex = -1, {
done: !0,
value: void 0
});
};
var SpreadOperatorImpl = function SpreadOperatorImpl(target, thisArg) {
this._target = target, this._values = [], this._thisArg = thisArg;
};
SpreadOperatorImpl.prototype.spread = function () {
var self = this;
return slice.call(arguments).forEach(function (iterable) {
ES6.forOf(iterable, function (value) {
self._values.push(value);
});
}), self;
}, SpreadOperatorImpl.prototype.add = function () {
var self = this;
return slice.call(arguments).forEach(function (value) {
self._values.push(value);
}), self;
}, SpreadOperatorImpl.prototype.call = function (thisArg) {
if ("function" != typeof this._target) throw new TypeError("Target is not a function");
return thisArg = arguments.length <= 0 ? this._thisArg : thisArg, this._target.apply(thisArg, this._values);
}, SpreadOperatorImpl.prototype["new"] = function () {
if ("function" != typeof this._target) throw new TypeError("Target is not a constructor");
var temp, returnValue;
return temp = Object.create(this._target.prototype), returnValue = this._target.apply(temp, this._values), isObject(returnValue) ? returnValue : temp;
}, SpreadOperatorImpl.prototype.array = function () {
if (!isArray(this._target)) throw new TypeError("Target is not a array");
return push.apply(this._target, this._values), this._target;
};
return defineProperties(ES6, {
isSymbol: {
value: function value(symbol) {
return symbol instanceof _Symbol && function (symbol) {
return !0 === symbol._isSymbol && "number" == typeof symbol._id && "string" == typeof symbol._description;
}(symbol);
},
writable: !0,
configurable: !0
},
instanceOf: {
value: function value(object, constructor) {
if (!isObject(constructor)) throw new TypeError("Right-hand side of 'instanceof' is not an object");
var hasInstanceSymbolProp = constructor[_Symbol.hasInstance];
if (void 0 === hasInstanceSymbolProp) return object instanceof constructor;
if ("function" != typeof hasInstanceSymbolProp) throw new TypeError(_typeof(hasInstanceSymbolProp) + " is not a function");
return hasInstanceSymbolProp.call(constructor, object);
},
writable: !0,
configurable: !0
},
forOf: {
value: function value(iterable, callback, thisArg) {
if (callback = "function" != typeof callback ? emptyFunction : callback, "function" != typeof iterable[_Symbol.iterator]) throw new TypeError("Iterable[Symbol.iterator] is not a function");
var iterationResult,
iterator = iterable[_Symbol.iterator]();
if ("function" != typeof iterator.next) throw new TypeError(".iterator.next is not a function");
for (;;) {
if (iterationResult = iterator.next(), !isObject(iterationResult)) throw new TypeError("Iterator result " + iterationResult + " is not an object");
if (iterationResult.done) break;
callback.call(thisArg, iterationResult.value);
}
},
writable: !0,
configurable: !0
},
spreadOperator: {
value: function value(target, thisArg) {
if ("function" != typeof target && !isArray(target)) throw new TypeError("Spread operator only supports on array and function objects at this moment");
return new SpreadOperatorImpl(target, thisArg);
},
writable: !0,
configurable: !0
}
}), defineProperty(global, "Symbol", {
value: _Symbol,
writable: !0,
configurable: !0
}), defineProperty(Function.prototype, _Symbol.hasInstance.toString(), {
value: function value(instance) {
return "function" == typeof this && instance instanceof this;
}
}), defineProperty(Array.prototype, "concat", {
value: function value() {
if (void 0 === this || null === this) throw new TypeError("Array.prototype.concat called on null or undefined");
var self = Object(this),
targets = slice.call(arguments),
outputs = [];
return targets.unshift(self), targets.forEach(function (target) {
isObject(target) ? void 0 !== target[_Symbol.isConcatSpreadable] ? target[_Symbol.isConcatSpreadable] ? appendArray(outputs, target) : outputs.push(target) : isArray(target) ? appendArray(outputs, target) : outputs.push(target) : outputs.push(target);
}), outputs;
},
writable: !0,
configurable: !0
}), defineProperty(Object.prototype, "toString", {
value: function value() {
return void 0 === this || null === this ? objectToString.call(this) : "string" == typeof this[_Symbol.toStringTag] ? "[object " + this[_Symbol.toStringTag] + "]" : objectToString.call(this);
},
writable: !0,
configurable: !0
}), defineProperty(Array.prototype, _Symbol.iterator.toString(), {
value: function value() {
if (void 0 === this || null === this) throw new TypeError("Cannot convert undefined or null to object");
var self = Object(this);
return new ArrayIterator(self, 2);
},
writable: !0,
configurable: !0
}), defineProperty(Array, "from", {
value: function value(arrayLike, mapFn, thisArg) {
var constructor,
length,
outputs,
i = 0;
if (constructor = isCallable(this) ? this : Array, void 0 === arrayLike || null === arrayLike) throw new TypeError("Cannot convert undefined or null to object");
if (arrayLike = Object(arrayLike), void 0 === mapFn) mapFn = simpleFunction;else if (!isCallable(mapFn)) throw new TypeError(mapFn + " is not a function");
if (void 0 === arrayLike[_Symbol.iterator]) {
if (!("number" == typeof arrayLike.length && arrayLike.length >= 0)) return (outputs = new constructor(0)).length = 0, outputs;
for (length = Math.floor(arrayLike.length), (outputs = new constructor(length)).length = length; i < length; ++i) {
outputs[i] = mapFn.call(thisArg, arrayLike[i]);
}
} else (outputs = new constructor()).length = 0, ES6.forOf(arrayLike, function (value) {
outputs.length++, outputs[outputs.length - 1] = mapFn.call(thisArg, value);
});
return outputs;
},
writable: !0,
configurable: !0
}), defineProperty(Array.prototype, "entries", {
value: function value() {
if (void 0 === this || null === this) throw new TypeError("Cannot convert undefined or null to object");
var self = Object(this);
return new ArrayIterator(self, 1);
},
writable: !0,
configurable: !0
}), defineProperty(Array.prototype, "keys", {
value: function value() {
if (void 0 === this || null === this) throw new TypeError("Cannot convert undefined or null to object");
var self = Object(this);
return new ArrayIterator(self, 3);
},
writable: !0,
configurable: !0
}), defineProperty(String.prototype, _Symbol.iterator.toString(), {
value: function value() {
if (void 0 === this || null === this) throw new TypeError("String.prototype[Symbol.iterator] called on null or undefined");
return new StringIterator(String(this), 0);
},
writable: !0,
configurable: !0
}), ES6;
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
/***/ }),
/***/ "./resources/js/site/app.js":
/*!**********************************!*\
!*** ./resources/js/site/app.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/**
* JavaScript dependencies
*/
/**
* External dependencies
*/
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js"); // require('pjax');
__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");
/**
* Global custom dependencies
*/
__webpack_require__(/*! ./../global/polyfills/eventPolyFill */ "./resources/js/global/polyfills/eventPolyFill.js");
__webpack_require__(/*! ./../global/polyfills/isInteger */ "./resources/js/global/polyfills/isInteger.js");
__webpack_require__(/*! ./../global/polyfills/promise */ "./resources/js/global/polyfills/promise.js");
__webpack_require__(/*! ./../global/polyfills/symbol-es6.min */ "./resources/js/global/polyfills/symbol-es6.min.js");
/**
* Site wide functionality
*/
__webpack_require__(/*! ./global/helpers */ "./resources/js/site/global/helpers.js");
__webpack_require__(/*! ./global/browserHandler */ "./resources/js/site/global/browserHandler.js"); // require('./global/pagetransitionHandler');
// require('./global/resizeHandler');
// require('./global/scrollHandler');
/**
* Component specific functionality
*/
__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/site/components/chocolateFactory.js");
__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/site/components/cookieHandler.js");
__webpack_require__(/*! ./components/imageRackHandler */ "./resources/js/site/components/imageRackHandler.js");
__webpack_require__(/*! ./components/inputHandler */ "./resources/js/site/components/inputHandler.js");
__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/site/components/mapsHandler.js");
__webpack_require__(/*! ./components/navigationHandler */ "./resources/js/site/components/navigationHandler.js");
__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/site/components/scrollToHandler.js"); // require('./components/searchHandler');
// require('./components/shareButtonsHandler');
__webpack_require__(/*! ./components/slideProjectorHandler */ "./resources/js/site/components/slideProjectorHandler.js");
__webpack_require__(/*! ./components/clientReviewsHandler */ "./resources/js/site/components/clientReviewsHandler.js");
__webpack_require__(/*! ./components/uspImpressionsHandler */ "./resources/js/site/components/uspImpressionsHandler.js");
__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/site/components/youtubeHandler.js");
/***/ }),
/***/ "./resources/js/site/components/chocolateFactory.js":
/*!**********************************************************!*\
!*** ./resources/js/site/components/chocolateFactory.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
| Prevent Bots handler
|
| We named this chocolate factory and belonging confusing js hooks
| to prevent smart bots from blocking these variable or functions.
|
========================================================================== */
var ChocolateFactory = {
bannedVisitor: [],
/** Get all the chocolate factory and start
* Looping through those start flashing tickets
*/
enter: function enter() {
var chocolateFactories = document.querySelectorAll('.js-chocolate-factory');
if (isset(chocolateFactories)) {
var amountOfChocolateFactories = chocolateFactories.length;
for (var i = 0; i < amountOfChocolateFactories; i++) {
var ChocolateBar = chocolateFactories[i];
ChocolateFactory._flashTicket(ChocolateBar);
}
}
},
/**
* If factory has a golden ticket
* Then we can make them go on the tour if there has been click on the ticket
*
* @param chocolateBar
* @private
*/
_flashTicket: function _flashTicket(chocolateBar) {
// Try get the ticket from the chocolateBar
var goldenTicket = chocolateBar.querySelector('.js-golden-ticket'); // Only continue if chocolate bar has a golden ticket
if (isset(goldenTicket)) {
goldenTicket.addEventListener('click', function () {
ChocolateFactory.enjoyTheTour(chocolateBar);
});
} else {
console.log('To bad, no golden tickets has been found.');
}
},
/**
* Start the tour through the factory
* And get the names and properties of the members of the group
* If there are members in the group of course
*
* @param chocolateFactory
*/
enjoyTheTour: function enjoyTheTour(chocolateFactory) {
// Ask for the tour group
var tourGroup = chocolateFactory.querySelectorAll('input, textarea');
if (isset(tourGroup)) {
// For each visitor we want a belonging Oompa Loompa
var oompaLoompas = {};
var amountOfOompaLoompas = 0;
var tourGroupSize = tourGroup.length;
for (var i = 0; i < tourGroupSize; i++) {
// Get the visitor from the group
var visitor = tourGroup[i]; // Ask for its name
var visitorName = visitor.getAttribute('name'); // Check if the visitor is banned
if (ChocolateFactory._isVisitorBanned(visitorName)) continue;
oompaLoompas[visitorName] = ChocolateFactory._getArrangement(visitor);
amountOfOompaLoompas++;
} // Check for insurance that there are oompa loompas
if (amountOfOompaLoompas === 0) return; // Send submit request
ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);
} else {
console.log('To bad, no members to visit this factory');
}
},
/**
* Check if the visitor name isn't allow
*
* @param visitorName
* @returns {boolean}
* @private
*/
_isVisitorBanned: function _isVisitorBanned(visitorName) {
if (ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1) {
return true;
}
return false;
},
/**
* Most get visitor have a normal arrangement
* But sometimes there are special cases
* Like a Selector or checkbox
*
* @param visitor
* @returns {*}
* @private
*/
_getArrangement: function _getArrangement(visitor) {
var visitorType = visitor.nodeName;
switch (visitorType) {
default:
return visitor.value;
}
},
/**
* Finish the tour
* If successful show thanks message
* Or show defined error message or fallback
*
* @param group
* @param chocolateFactory
* @returns {*|void}
* @private
*/
_finishTour: function _finishTour(group, chocolateFactory) {
// Add willie to the group
group = ChocolateFactory._addWillieWonka(group); // Get the gate for finish the tour
var gate = '/contact/process';
try {
Ajax.post(gate, group, function (HttpRequest) {
var response = JSON.parse(HttpRequest.response);
switch (HttpRequest.status) {
case 200:
return ChocolateFactory._thanksForVisiting(response.redirectUrl);
case 422:
return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);
default:
break;
}
return ChocolateFactory._unknownGapInFactory(chocolateFactory);
});
} catch (e) {
return ChocolateFactory._unknownGapInFactory(chocolateFactory);
}
},
/**
* Add willie wonka to the group
* Ps... it actually the secret code!
*
* @param group
* @returns {*}
* @private
*/
_addWillieWonka: function _addWillieWonka(group) {
group._willie = 'wonka';
return group;
},
/**
* Add the feedback to the desired area.
* Most likely to the visitor directly, but sometime to the factory desired feedback area
*
* @param errors
* @param chocolateFactory
* @private
*/
_giveFeedbackToMembers: function _giveFeedbackToMembers(errors, chocolateFactory) {
// Grab the factory feedback area
var feedbackArea = chocolateFactory.querySelector('.js-error-area'); // Clear the current html
if (isset(feedbackArea)) feedbackArea.innerHTML = ''; // Clear the previous marked jackets
ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);
Object.keys(errors).forEach(function (visitor) {
var jacket = null;
var visitorFeedbackArea = null; // Honey elements doesn't has a accessible element
if (visitor !== '_honey' && visitor !== '_secretCode') {
// Grab the visitor
var visitorNode = chocolateFactory.querySelector('#' + visitor); // Find the jacket of a visitor
jacket = ChocolateFactory._grabVisitorJacket(visitorNode); // If found get the desired area
if (isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-element-error'); // Clear the current html
if (isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';
} // Get the feedback for this visitor
var visitorFeedback = errors[visitor]; // Spit out each line
var visitorFeedbackAmount = visitorFeedback.length;
for (var i = 0; i < visitorFeedbackAmount; i++) {
var visitorFeedbackLine = visitorFeedback[i]; // Honey elements doesn't has a accessible element area
if (visitor !== '_honey' && visitor !== '_secretCode') {
// Mark the jacket
if (isset(jacket)) jacket.classList.add('has-error'); // Append feedback to visitor feedback area if defined
if (isset(visitorFeedbackArea)) {
var currentFeedbackArea = visitorFeedbackArea.innerHTML;
currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
visitorFeedbackArea.innerHTML = currentFeedbackArea;
}
} // Append feedback to factory feedback area if defined
if (isset(feedbackArea)) {
var _currentFeedbackArea = feedbackArea.innerHTML;
_currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';
feedbackArea.innerHTML = _currentFeedbackArea;
}
}
});
},
/**
* Clear the previous marked jackets
*
* @param chocolateFactory
* @private
*/
_clearPreviousMarkedJackets: function _clearPreviousMarkedJackets(chocolateFactory) {
var markedJackets = chocolateFactory.querySelectorAll('.has-error');
var markedJacketsAmount = markedJackets.length;
for (var i = 0; i < markedJacketsAmount; i++) {
markedJackets[i].classList.remove('has-error');
}
},
/**
* Grab the jacket of the visitor
*
* @param visitor
* @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}
* @private
*/
_grabVisitorJacket: function _grabVisitorJacket(visitor) {
// Check if visitor is defined
if (!isset(visitor)) return null; // Do loop settings
currentLayer = visitor;
safetyBreak = 0; // Grab the next layer till it is the jacket (or safetyBreak has been reached
do {
safetyBreak++;
currentLayer = currentLayer.parentNode;
if (currentLayer.classList.contains('js-form-element')) return currentLayer;
} while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);
return null;
},
/**
* Redirect the visitor to the thanks page
*
* @param nextStop
* @private
*/
_thanksForVisiting: function _thanksForVisiting(nextStop) {
window.location = nextStop;
},
/**
* Unknown error occurred, log the error
*
* @param chocolateFactory
* @private
*/
_unknownGapInFactory: function _unknownGapInFactory(chocolateFactory) {
console.log(chocolateFactory);
console.log('ChocolateFactory: Unkown Error');
}
};
ChocolateFactory.enter();
/***/ }),
/***/ "./resources/js/site/components/clientReviewsHandler.js":
/*!**************************************************************!*\
!*** ./resources/js/site/components/clientReviewsHandler.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* Example
const headerImageSliderSetting = new SliderProjectorSetting({
sliderProjectorId: 'header-image-slider',
slideQuery: '#header-image-slider .placeholder figure',
dots: '#header-image-slider .slider-navigation-labels .navigation span',
captions: '#header-image-slider .slider-navigation-labels .caption p',
autoSlider: true,
sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();
const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();
*/
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");
var ClientReviewsHandler = {
init: function init() {
var clientReviews = [];
var clientReviewContainers = document.querySelectorAll('.js-client-reviews');
var clientReviewContainersLength = clientReviewContainers.length;
for (var i = 0; i < clientReviewContainersLength; i++) {
var clientReview = clientReviewContainers[i];
var clientReviewId = clientReview.getAttribute('id');
if (clientReviewId !== null) {
clientReviews.push(new ClientReview({
clientReviewId: clientReviewId,
slideQuery: '#' + clientReviewId + ' .js-client-review-slide',
navigationButtons: '#' + clientReviewId + ' .js-client-reviews-button'
}).init());
} else console.log('An image slider has no id...');
}
}
};
ClientReviewsHandler.init();
function ClientReview(settings) {
//Define SliderProjector object
var self = this;
this.clientReviewObject = ''; //SlideParameters
this.activeSlideId = 0;
this.previousSlideId = 0;
this.nextSlideId = 0;
this.availableSlides = 1;
this.slides = [];
this.settings = {};
this.init = function () {
//Append settings to self
this.settings = settings; //Assign needed elements and calculations
this.clientReviewObject = document.getElementById(this.settings.clientReviewId);
this.slides = document.querySelectorAll(this.settings.slideQuery);
this.availableSlides = this.slides.length;
this.activeSlideId = 0; // Set active slide (and possible previous and next classes)
this.setSlide(); // Swipe interaction
var swipeGestures = new Hammer(this.clientReviewObject);
swipeGestures.on('swipeleft', function () {
self.nextSlide();
self.setSlide();
});
swipeGestures.on('swiperight', function () {
self.previousSlide();
self.setSlide();
});
if (this.settings.navigationButtons !== '') {
// Click interaction
var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
var navigationButtonsLength = navigationButtons.length;
for (var i = 0; i < navigationButtonsLength; i++) {
var navigationButton = navigationButtons[i];
navigationButton.addEventListener('click', function () {
self.clickNavigationButton(this);
});
}
}
};
this.nextSlide = function () {
this.activeSlideId++;
if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
};
this.previousSlide = function () {
this.activeSlideId--;
if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
};
this.setPreviousAndNextSlide = function () {
this.nextSlideId = this.activeSlideId + 1;
if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;
this.previousSlideId = this.activeSlideId - 1;
if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;
};
this.setSlide = function () {
// Loop through the form elements
var slidesLength = self.slides.length;
for (var i = 0; i < slidesLength; i++) {
var slide = self.slides[i]; // Convert data set attribute to desired type
var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides
if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active'); // If we use the previous and next, also set those classes
if (self.settings.definedPreviousNext) {
if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');
if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
}
}
};
this.clickNavigationButton = function (navButton) {
self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
self.setPreviousAndNextSlide();
self.setSlide();
var next = document.querySelector(self.settings.navigationButtons + '.next');
var previous = document.querySelector(self.settings.navigationButtons + '.previous');
next.setAttribute('data-order', self.nextSlideId);
previous.setAttribute('data-order', self.previousSlideId);
};
}
/***/ }),
/***/ "./resources/js/site/components/cookieHandler.js":
/*!*******************************************************!*\
!*** ./resources/js/site/components/cookieHandler.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Cookie handler
- Primary usage for toggling the cookie message and/or switch
========================================================================== */
var CookieHandler = {
cookieBar: null,
cookieOverlay: null,
cookieMessage: null,
cookieSwitch: null,
cookieFadeOutAnimationDuration: 400,
acceptTracking: false,
// Initialize cookie handler
init: function init() {
// Bind cookie bar or overlay to cookieMessage
CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar, .js-cookie-overlay'); // Bind cookie bar to cookieBar
CookieHandler.cookieBar = document.querySelector('.js-cookie-bar'); // If isset init the functions for cookie bar
if (isset(CookieHandler.cookieBar)) {
CookieHandler.initCookieBar();
} else {
// Else try to connect cookie overlay with tracking to cookieOverlay
CookieHandler.cookieOverlay = document.querySelector('.js-cookie-overlay'); // If isset init the functions for cookie overlay
if (isset(CookieHandler.cookieOverlay)) {
CookieHandler.initCookieOverlay();
}
} // If either type of cookie has been found check if settings are defined
if (isset(CookieHandler.cookieMessage)) {
CookieHandler.checkForCookieSettings();
} // Bind cookie switch to Handler
CookieHandler.cookieSwitch = document.querySelector('.js-cookie-switch'); // If isset init the functions for cookie switch
if (isset(CookieHandler.cookieSwitch)) {
CookieHandler.initCookieSwitch();
}
},
// Init the cookie bar actions
initCookieBar: function initCookieBar() {
var closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');
if (isset(closeButton)) {
closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
}
},
// Init the cookie overlay actions
initCookieOverlay: function initCookieOverlay() {
// Open the cookie settings event
var openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.js-change-cookies-settings');
if (isset(openCookieSettingsButton)) {
openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);
} // Toggle of the tracking input
var toggleTrackingInput = CookieHandler.cookieMessage.querySelector('.c-cookie-type__input--tracking');
if (isset(toggleTrackingInput)) {
if (toggleTrackingInput.checked === true) {
CookieHandler.acceptTracking = true;
}
toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
} // Accept / Save cookies button event
var acceptButton = CookieHandler.cookieMessage.querySelector('.js-accept-cookies');
if (isset(acceptButton)) {
acceptButton.addEventListener('click', CookieHandler.setCookieSettings);
}
},
// Init the cookie switch actions
initCookieSwitch: function initCookieSwitch() {
// Toggle of the tracking input
var toggleTrackingInput = CookieHandler.cookieSwitch.querySelector('.c-cookie-type__input--tracking');
if (isset(toggleTrackingInput)) {
// Force the state of the cookie switch input because the pop-up is forced on checked
// while the switch checks by php if the cookie really exist or not
if (toggleTrackingInput.checked === true) {
CookieHandler.acceptTracking = true;
} else {
CookieHandler.acceptTracking = false;
}
toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
} // Save cookies button event
var saveButton = CookieHandler.cookieSwitch.querySelector('.js-save-cookie-settings');
if (isset(saveButton)) {
saveButton.addEventListener('click', function () {
CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)
CookieHandler.setCookieSettings();
});
}
},
checkForCookieSettings: function checkForCookieSettings() {
if (Cookie.get('cookieMessage')) {
CookieHandler.cookieMessage.classList.add('is-accepted');
} else {
CookieHandler.cookieMessage.classList.remove('is-accepted');
}
},
closeCookieMessage: function closeCookieMessage() {
Cookie.set('cookieMessage', true, 90);
CookieHandler.cookieMessage.classList.add('fade-out');
},
openCookieSettings: function openCookieSettings() {
CookieHandler.cookieOverlay.querySelector('.js-cookie-settings').classList.remove('is-hidden');
CookieHandler.cookieOverlay.querySelector('.js-cookie-info').classList.add('is-hidden');
},
toggleTrackingSetting: function toggleTrackingSetting() {
if (CookieHandler.acceptTracking) {
CookieHandler.acceptTracking = false;
} else {
CookieHandler.acceptTracking = true;
}
},
setCookieSettings: function setCookieSettings() {
// Set tracking cookie or delete it if isset according to the desired settings
if (CookieHandler.acceptTracking) {
Cookie.set('trackingCookieAccepted', 'true', 90);
} else {
if (Cookie.get('trackingCookieAccepted')) {
Cookie.erase('trackingCookieAccepted');
}
}
CookieHandler.closeCookieMessage(); // Reload after animation to automatically trigger the tracking after accepting it
setTimeout(function () {
location.reload();
}, CookieHandler.cookieFadeOutAnimationDuration);
}
};
CookieHandler.init();
/***/ }),
/***/ "./resources/js/site/components/imageRackHandler.js":
/*!**********************************************************!*\
!*** ./resources/js/site/components/imageRackHandler.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");
var ImageRackHandler = {
init: function init() {
var imageRackElements = document.querySelectorAll('.js-image-rack');
var imageRackElementsLength = imageRackElements.length;
for (var i = 0; i < imageRackElementsLength; i++) {
new ImageRack(imageRackElements[i]);
}
}
};
var ImageRack =
/*#__PURE__*/
function () {
function ImageRack(imageRack) {
_classCallCheck(this, ImageRack);
var self = this;
this.rack = imageRack;
this.slideArea = this.rack.querySelector('.js-image-rack-slide');
this.items = this.rack.querySelectorAll('.js-image-rack-item');
this.direction = this.rack.getAttribute('data-direction');
this.imageLoaded = false;
this.currentItem = 0;
this.maxItemPosition = this.items.length;
this.maxTranslated = 0;
this.steps = [];
this.previousButton = this.rack.querySelector('.js-image-rack-button.previous');
this.nextButton = this.rack.querySelector('.js-image-rack-button.next');
this.calculateSteps();
if (isset(this.previousButton)) {
this.previousButton.addEventListener('click', function () {
self.previousItem();
self.setImageRack();
});
}
if (isset(this.nextButton)) {
this.nextButton.addEventListener('click', function () {
self.nextItem();
self.setImageRack();
});
} // Swipe interaction
var swipeGestures = new Hammer(this.rack);
swipeGestures.on('swipeleft', function () {
console.log('swipe Left');
self.swipeLeft();
self.setImageRack();
});
swipeGestures.on('swiperight', function () {
console.log('swipe Rith');
self.swipeRight();
self.setImageRack();
});
this.debounceTimeout = null;
this.waitDebounce = 500; // Debounce Resize
window.addEventListener('resize', function () {
if (isset(self.debounceTimeout)) clearTimeout(self.debounceTimeout);
self.debounceTimeout = setTimeout(function () {
self.calculateSteps();
self.setImageRack();
}, self.waitDebounce);
});
}
_createClass(ImageRack, [{
key: "calculateSteps",
value: function calculateSteps() {
//Rest the steps array
this.steps = []; // Calculated the offset of the whole rack to know how much we may translate at most
var bodyOffset = window.bodyOffset(this.rack); // Calculated the available view area of the rack
var availableViewArea;
if (this.direction === 'ltr') availableViewArea = document.body.offsetWidth - bodyOffset.left;else availableViewArea = bodyOffset.left + this.rack.offsetWidth; // Get the racket Width
var rackWidth;
if (this.direction === 'ltr') rackWidth = this.items[this.items.length - 1].offsetLeft + this.items[this.items.length - 1].offsetWidth;else rackWidth = (this.items[this.items.length - 1].offsetLeft - this.rack.offsetWidth) * -1;
this.maxTranslated = rackWidth - availableViewArea;
var maxItemCalculated = false;
var imagesLoaded = true; // Calculated for each item the offset in the rack
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.offsetWidth === 0) imagesLoaded = false;
var offsetFromRightSide = void 0;
var offsetFromLeftSide = void 0;
if (this.direction === 'ltr') {
offsetFromRightSide = item.offsetLeft + item.offsetWidth;
offsetFromLeftSide = item.offsetLeft;
} else {
offsetFromRightSide = (this.rack.offsetWidth * -1 + (item.offsetLeft + item.offsetWidth)) * -1;
offsetFromLeftSide = (this.rack.offsetWidth * -1 + item.offsetLeft) * -1;
} // Append these offset to the offset position array
this.steps.push({
offsetFromLeftSide: offsetFromLeftSide,
offsetFromRightSide: offsetFromRightSide
}); // Define the compare variable
// Else we have to create a complex if statement...
var offsetCompareVariable = void 0;
if (this.direction === 'ltr') offsetCompareVariable = offsetFromRightSide;else offsetCompareVariable = offsetFromLeftSide; // If the max translated is smaller and isn't already defined
if (offsetCompareVariable > this.maxTranslated && !maxItemCalculated) {
this.maxItemPosition = i + 1;
maxItemCalculated = true;
}
} // Recalculated when the images aren't loaded
if (imagesLoaded) this.imageLoaded = true;
console.log(this.imageLoaded); // if(!imagesLoaded){
// console.warn("ImageRack: Recalculated width because images weren't loaded.");
// setTimeout(self.calculateSteps(), 4000);
// }
}
}, {
key: "nextItem",
value: function nextItem() {
this.currentItem++;
if (this.currentItem >= this.maxItemPosition) this.currentItem = this.maxItemPosition;
}
}, {
key: "previousItem",
value: function previousItem() {
this.currentItem--;
if (this.currentItem < 0) this.currentItem = 0;
} // We have to use these intervene functions to swap the function when the sliders as a different direction
}, {
key: "swipeLeft",
value: function swipeLeft() {
if (this.direction === 'ltr') this.nextItem();else this.previousItem();
}
}, {
key: "swipeRight",
value: function swipeRight() {
if (this.direction === 'ltr') this.previousItem();else this.nextItem();
}
}, {
key: "setImageRack",
value: function setImageRack() {
// Check if image are load when interaction
if (!this.imageLoaded) {
console.warn("ImageRack: Recalculated because images weren't loaded yet.");
this.calculateSteps();
}
var nextOffsetPosition;
if (this.direction === 'ltr') nextOffsetPosition = '-' + this.steps[this.currentItem].offsetFromLeftSide;else nextOffsetPosition = this.steps[this.currentItem].offsetFromRightSide;
this.slideArea.style.transform = 'translateX(' + nextOffsetPosition + 'px)';
}
}]);
return ImageRack;
}();
ImageRackHandler.init();
/***/ }),
/***/ "./resources/js/site/components/inputHandler.js":
/*!******************************************************!*\
!*** ./resources/js/site/components/inputHandler.js ***!
\******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Input handler
This handler can be remove when the css support for :focus-within is better
========================================================================== */
var InputHandler = {
inputFields: null,
init: function init() {
// Get the form inputs
InputHandler.inputFields = document.querySelectorAll('form input, form textarea');
var inputLength = InputHandler.inputFields.length;
for (var i = 0; i < inputLength; i++) {
var input = InputHandler.inputFields[i];
var inputId = input.getAttribute('id'); // Check if there is an id on the input
if (isset(inputId)) {
var inputLabel = document.querySelector('form label[for="' + inputId + '"]'); // // And if there is a belonging label
if (isset(inputLabel)) {
InputHandler.addEventListenersToInput(input);
}
}
}
},
addEventListenersToInput: function addEventListenersToInput(input) {
// Add the fill class and trigger removeFocus so the input will be automatic be marked as filled or not
parentElement = input.parentNode;
parentElement.classList.add('filled');
InputHandler.removeFocus(input);
input.addEventListener('focus', function () {
// We loop through the input elements because autocomplete (on chrome) triggers al the focus elements but none focus out
var inputLength = InputHandler.inputFields.length;
for (var i = 0; i < inputLength; i++) {
var loopedInput = InputHandler.inputFields[i]; // Trigger add focus on this focused element
if (loopedInput === input) {
InputHandler.addFocus(this);
} // Remove focus on all other input/textarea elements
else {
InputHandler.removeFocus(loopedInput);
}
}
});
input.addEventListener('focusout', function () {
InputHandler.removeFocus(this);
});
},
addFocus: function addFocus(input) {
if (isset(input)) {
var inputId = input.getAttribute('id');
parentElement = input.parentNode;
parentElement.classList.add('focused');
parentElement.classList.add('filled'); // If there is a error message remove it on focus
var errorMessage = document.querySelector('form .error-message#' + inputId + '-error');
if (isset(errorMessage)) {
errorMessage.classList.add('fade-out');
}
}
},
// Reset the label location only if the input is empty
removeFocus: function removeFocus(input) {
if (isset(input)) {
var inputValue = input.value;
parentElement = input.parentNode;
parentElement.classList.remove('focused');
if (!isset(inputValue) || inputValue === '') {
parentElement.classList.remove('filled');
}
}
}
};
InputHandler.init();
/***/ }),
/***/ "./resources/js/site/components/mapsHandler.js":
/*!*****************************************************!*\
!*** ./resources/js/site/components/mapsHandler.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Google Maps handler
- https://developers.google.com/maps/documentation/javascript/adding-a-google-map
========================================================================== */
var MapsHandler = {
map: '',
key: 'AIzaSyBv6FJHn23Lz3S0j9T1DYWr57zTBU-T0oY',
location: {
lat: 51.2618222,
lng: 5.5965538
},
styling: '',
init: function init() {
// Get map by id
MapsHandler.map = document.getElementById('map'); // Check if a map is defined
if (isset(MapsHandler.map)) {
if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));
if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));
MapsHandler.setCustomStyling(); // See if google variable exists
if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
// Load external script
getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);
} else {
MapsHandler.drawMap();
}
}
},
drawMap: function drawMap() {
// Create a map
var map = new google.maps.Map(MapsHandler.map, {
zoom: 11,
center: MapsHandler.location,
disableDefaultUI: true,
styles: MapsHandler.styling
}); // Add a marker
var marker = new google.maps.Marker({
position: MapsHandler.location,
map: map
});
},
setCustomStyling: function setCustomStyling() {
MapsHandler.styling = [{
"featureType": "poi",
"elementType": "labels.text.fill",
"stylers": [{
"color": "#747474"
}, {
"lightness": "23"
}]
}, {
"featureType": "poi.attraction",
"elementType": "geometry.fill",
"stylers": [{
"color": "#f38eb0"
}]
}, {
"featureType": "poi.government",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ced7db"
}]
}, {
"featureType": "poi.medical",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffa5a8"
}]
}, {
"featureType": "poi.park",
"elementType": "geometry.fill",
"stylers": [{
"color": "#c7e5c8"
}]
}, {
"featureType": "poi.place_of_worship",
"elementType": "geometry.fill",
"stylers": [{
"color": "#d6cbc7"
}]
}, {
"featureType": "poi.school",
"elementType": "geometry.fill",
"stylers": [{
"color": "#c4c9e8"
}]
}, {
"featureType": "poi.sports_complex",
"elementType": "geometry.fill",
"stylers": [{
"color": "#b1eaf1"
}]
}, {
"featureType": "road",
"elementType": "geometry",
"stylers": [{
"lightness": "100"
}]
}, {
"featureType": "road",
"elementType": "labels",
"stylers": [{
"visibility": "off"
}, {
"lightness": "100"
}]
}, {
"featureType": "road.highway",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffd4a5"
}]
}, {
"featureType": "road.arterial",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffe9d2"
}]
}, {
"featureType": "road.local",
"elementType": "all",
"stylers": [{
"visibility": "simplified"
}]
}, {
"featureType": "road.local",
"elementType": "geometry.fill",
"stylers": [{
"weight": "3.00"
}]
}, {
"featureType": "road.local",
"elementType": "geometry.stroke",
"stylers": [{
"weight": "0.30"
}]
}, {
"featureType": "road.local",
"elementType": "labels.text",
"stylers": [{
"visibility": "on"
}]
}, {
"featureType": "road.local",
"elementType": "labels.text.fill",
"stylers": [{
"color": "#747474"
}, {
"lightness": "36"
}]
}, {
"featureType": "road.local",
"elementType": "labels.text.stroke",
"stylers": [{
"color": "#e9e5dc"
}, {
"lightness": "30"
}]
}, {
"featureType": "transit.line",
"elementType": "geometry",
"stylers": [{
"visibility": "on"
}, {
"lightness": "100"
}]
}, {
"featureType": "water",
"elementType": "all",
"stylers": [{
"color": "#d2e7f7"
}]
}];
}
};
MapsHandler.init();
/***/ }),
/***/ "./resources/js/site/components/navigationHandler.js":
/*!***********************************************************!*\
!*** ./resources/js/site/components/navigationHandler.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Navigation handler
- Handles the navigation component which has the proper classes.
========================================================================== */
var NavigationHandler = {
navigationNode: null,
scrolledLog: 0,
isOpen: false,
init: function init() {
var navTriggers = document.querySelectorAll('.js-nav-trigger');
var closeButton = document.querySelector('.js-close-overlay-nav');
NavigationHandler.navigationNode = document.querySelector('.js-overlay-nav');
if (isset(NavigationHandler.navigationNode)) {
document.addEventListener('keydown', function (event) {
if (event.code === 'Escape') NavigationHandler.closeNavigation();
});
for (var i = 0; i < navTriggers.length; i++) {
NavigationHandler.initNavigation(navTriggers[i]);
}
closeButton.addEventListener('click', function () {
NavigationHandler.closeNavigation();
});
}
},
initNavigation: function initNavigation(navTrigger) {
navTrigger.addEventListener('click', NavigationHandler.toggleNavigation, false);
},
toggleNavigation: function toggleNavigation(event) {
// Prevent default link behavior
event.preventDefault();
NavigationHandler.scrolled = window.pageYOffset; // If the nav is already active, collapse it and quit
if (NavigationHandler.isOpen) NavigationHandler.closeNavigation();else NavigationHandler.openNavigation();
},
openNavigation: function openNavigation() {
NavigationHandler.isOpen = true;
NavigationHandler.scrolled = window.pageYOffset;
document.body.classList.add('nav-is-active');
setTimeout(function () {
document.body.classList.add('scroll-lock');
}, 400);
},
closeNavigation: function closeNavigation() {
document.body.classList.remove('scroll-lock');
window.pageYOffset = NavigationHandler.scrolled;
document.body.classList.remove('nav-is-active');
NavigationHandler.isOpen = false;
}
};
NavigationHandler.init();
/***/ }),
/***/ "./resources/js/site/components/scrollToHandler.js":
/*!*********************************************************!*\
!*** ./resources/js/site/components/scrollToHandler.js ***!
\*********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Scroll To Click handler
========================================================================== */
var ScrollToHandler = {
// Animation settings
offset: 60,
//pixel
duration: 1400,
//ms
// Animation variables
body: null,
start: 0,
change: 0,
currentTime: 0,
allowAnimation: false,
scrollToAnimation: null,
// Watch the EasingFunction helper for the available methods
easing: 'easeInOutQuad',
init: function init() {
var anchorLinks = document.querySelectorAll('.js-scroll-to-target');
var anchorLinksAmount = anchorLinks.length;
for (var i = 0; i < anchorLinksAmount; i++) {
var anchorLink = anchorLinks[i];
anchorLink.addEventListener('click', function (event) {
ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
event.preventDefault();
});
}
},
/**
* Prepare the Handler for the animation
*/
prepareScrollTo: function prepareScrollTo(elementId) {
// Get the scroll to element
elementId = elementId.substr(elementId.indexOf('#') + 1);
var scrollToElement = document.getElementById(elementId);
var scrollToElementPosition = scrollToElement.getBoundingClientRect(); // Reset or define the Handler variables
ScrollToHandler.body = document.documentElement;
ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop
ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
ScrollToHandler.allowAnimation = true; // Trigger animation
scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll); // Stop on scroll
window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
},
/*
* Animate the scroll position
*/
animateScroll: function animateScroll(timestamp) {
// Calculate progress from 0 - 1
var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
if (progress < 0) progress = 0; // Convert progress with easing function
progress = EasingFunctions[ScrollToHandler.easing](progress);
var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;
ScrollToHandler.body.scrollTop = newScrollTop;
if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop
if (progress < 1 && ScrollToHandler.allowAnimation) {
scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
}
},
/*
* Abort the scroll animation
*/
abortScrollAnimation: function abortScrollAnimation(event) {
ScrollToHandler.allowAnimation = false;
cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
}
};
ScrollToHandler.init();
/***/ }),
/***/ "./resources/js/site/components/slideProjectorHandler.js":
/*!***************************************************************!*\
!*** ./resources/js/site/components/slideProjectorHandler.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* Example
const headerImageSliderSetting = new SliderProjectorSetting({
sliderProjectorId: 'header-image-slider',
slideQuery: '#header-image-slider .placeholder figure',
dots: '#header-image-slider .slider-navigation-labels .navigation span',
captions: '#header-image-slider .slider-navigation-labels .caption p',
autoSlider: true,
sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();
const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();
*/
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");
var SliderProjectorHandler = {
init: function init() {
var slideProjectors = [];
var slideProjectorContainers = document.querySelectorAll('.js-slide-projector');
var slideProjectorContainersLength = slideProjectorContainers.length;
for (var i = 0; i < slideProjectorContainersLength; i++) {
var slideProjector = slideProjectorContainers[i];
var slideProjectorId = slideProjector.getAttribute('id');
var autoSlide = slideProjector.getAttribute('data-auto-slide');
if (slideProjectorId !== null) {
var slideProjectorSetting = new SliderProjectorSetting({
sliderId: slideProjectorId,
slideQuery: '#' + slideProjectorId + ' .js-slide-projector-slide',
navigationButtons: '#' + slideProjectorId + ' .js-slide-projector-button',
autoSlider: autoSlide,
sliderInterval: 6000
});
slideProjectors.push(new SliderProjector(slideProjectorSetting.prepareParameters()).init());
} else console.log('An image slider has no id...');
}
}
};
SliderProjectorHandler.init();
function SliderProjectorSetting(settingsObject) {
var self = this;
this.sliderId = '';
this.definedPreviousNext = true;
this.autoSlider = false;
this.sliderInterval = 4000;
this.navigationButtons = '';
this.dots = '';
this.captions = '';
this.slideQuery = '';
this.setSliderProjectorId = function (string) {
this.sliderId = string;
return this;
};
this.setDefinedPreviousNext = function (_boolean) {
this.definedPreviousNext = _boolean;
return this;
};
this.setAutoSlider = function (_boolean2) {
this.autoSlider = _boolean2;
return this;
};
this.setSliderInterval = function (integer) {
this.sliderInterval = integer;
return this;
};
this.setSlideQuery = function (string) {
this.slideQuery = string;
return this;
};
this.setNavigationButtons = function (string) {
this.navigationButtons = string;
return this;
};
this.setDots = function (string) {
this.dots = string;
return this;
};
this.setCaptions = function (string) {
this.captions = string;
return this;
};
this.getSliderProjectorId = function () {
return this.sliderId;
};
this.getDefinedPreviousNext = function () {
return this.definedPreviousNext;
};
this.getAutoSlider = function () {
return this.autoSlider;
};
this.getSliderInterval = function () {
return this.sliderInterval;
};
this.getSlideQuery = function () {
return this.slideQuery;
};
this.getNavigationButtons = function () {
return this.navigationButtons;
};
this.getDots = function () {
return this.dots;
};
this.getCaptions = function () {
return this.captions;
}; // Invert setters to getters
this.prepareParameters = function () {
return {
sliderId: self.getSliderProjectorId(),
definedPreviousNext: self.getDefinedPreviousNext(),
autoSlider: self.getAutoSlider(),
sliderInterval: self.getSliderInterval(),
navigationButtons: self.getNavigationButtons(),
dots: self.getDots(),
captions: self.getCaptions(),
slideQuery: self.getSlideQuery()
};
}; // Mass assign settings
this.fill = function () {
// Object.keys(settingsObject).forEach(function (key) {
// self[key] = settingsObject[key];
// });
var settingsObjectKeys = Object.keys(settingsObject);
var settingsObjectLength = settingsObjectKeys.length;
for (var i = 0; i < settingsObjectLength; i++) {
var key = settingsObjectKeys[i];
self[key] = settingsObject[key];
}
};
this.fill();
return {
sliderId: self.setSliderProjectorId,
definedPreviousNext: self.setDefinedPreviousNext,
autoSlider: self.setAutoSlider,
sliderInterval: self.setSliderInterval,
navigationButtons: self.setNavigationButtons,
dots: self.setDots,
captions: self.setCaptions,
slideQuery: self.setSlideQuery,
prepareParameters: self.prepareParameters
};
}
function SliderProjector(settings) {
//Define SliderProjector object
var self = this;
this.sliderObject = ''; //SlideParameters
this.activeSlideId = 0;
this.previousSlideId = 0;
this.nextSlideId = 0;
this.availableSlides = 1;
this.slides = [];
this.autoSliderInterval = null;
this.settings = {};
this.init = function () {
//Append settings to self
this.settings = settings; //Assign needed elements and calculations
this.sliderObject = document.getElementById(this.settings.sliderId);
this.slides = document.querySelectorAll(this.settings.slideQuery);
this.availableSlides = this.slides.length;
this.activeSlideId = 0; //Define previous and next if we want to use those
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide(); // Set active slide (and possible previous and next classes)
this.setSlide(); // Swipe interaction
var swipeGestures = new Hammer(this.sliderObject);
swipeGestures.on('swipeleft', function () {
self.resetAutoSlider();
self.nextSlide();
self.setSlide();
});
swipeGestures.on('swiperight', function () {
self.resetAutoSlider();
self.previousSlide();
self.setSlide();
});
if (this.settings.navigationButtons !== '') {
// Click interaction
var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
var navigationButtonsLength = navigationButtons.length;
for (var i = 0; i < navigationButtonsLength; i++) {
var navigationButton = navigationButtons[i];
navigationButton.addEventListener('click', function () {
self.clickNavigationButton(this);
});
}
}
if (this.settings.dots !== '') {
// Click interaction
var dots = document.querySelectorAll(this.settings.dots);
var dotsLength = dots.length; // console.log(this.settings.dots);
// console.log(dots);
for (var _i = 0; _i < dotsLength; _i++) {
var dot = dots[_i]; // console.log('hier');
dot.addEventListener('click', function () {
self.clickDot(this);
});
}
}
self.autoSlider();
};
this.autoSlider = function () {
if (this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);
if (this.settings.autoSlider && Number.isInteger(this.settings.sliderInterval)) {
this.autoSliderInterval = setInterval(function () {
self.nextSlide();
self.setSlide();
}, this.settings.sliderInterval);
}
};
this.resetAutoSlider = self.autoSlider;
this.nextSlide = function () {
this.activeSlideId++;
if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
};
this.previousSlide = function () {
this.activeSlideId--;
if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
};
this.setPreviousAndNextSlide = function () {
this.nextSlideId = this.activeSlideId + 1;
if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;
this.previousSlideId = this.activeSlideId - 1;
if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;
};
this.setSlide = function () {
// Loop through the form elements
var slidesLength = self.slides.length;
for (var i = 0; i < slidesLength; i++) {
var slide = self.slides[i]; // Convert data set attribute to desired type
var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides
if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active'); // If we use the previous and next, also set those classes
if (self.settings.definedPreviousNext) {
if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');
if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
}
}
if (self.settings.dots !== '') {
self.setActiveDot();
}
if (self.settings.captions !== '') {
self.setActiveCaption();
}
};
this.clickNavigationButton = function (navButton) {
self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();
self.setSlide();
var next = document.querySelector(self.settings.navigationButtons + '.next');
var previous = document.querySelector(self.settings.navigationButtons + '.previous');
next.setAttribute('data-order', self.nextSlideId);
previous.setAttribute('data-order', self.previousSlideId);
self.resetAutoSlider(); // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;
// previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;
};
this.clickDot = function (clickedDot) {
self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
self.setSlide();
self.resetAutoSlider();
};
this.setActiveDot = function () {
var dots = document.querySelectorAll(this.settings.dots);
var dotsLength = dots.length;
for (var i = 0; i < dotsLength; i++) {
var dot = dots[i];
dotOrder = parseInt(dot.getAttribute('data-order'));
if (dotOrder !== self.activeSlideId) dot.classList.remove('is-active');else dot.classList.add('is-active');
}
};
this.setActiveCaption = function () {
var captions = document.querySelectorAll(this.settings.captions);
var captionsLength = captions.length;
for (var i = 0; i < captionsLength; i++) {
var caption = captions[i];
captionOrder = parseInt(caption.getAttribute('data-order'));
if (captionOrder !== self.activeSlideId) caption.classList.remove('is-active');else caption.classList.add('is-active');
}
};
}
/***/ }),
/***/ "./resources/js/site/components/uspImpressionsHandler.js":
/*!***************************************************************!*\
!*** ./resources/js/site/components/uspImpressionsHandler.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/* ==========================================================================
Usp Impressions handler
========================================================================== */
var UspImpressionsHandler = {
timeout: null,
init: function init() {
var uspImpressionsTrays = document.querySelectorAll('.js-usp-impressions');
var uspImpressionsTraysLength = uspImpressionsTrays.length;
for (var i = 0; i < uspImpressionsTraysLength; i++) {
var uspImpressionsTray = uspImpressionsTrays[i];
var uspImpressionSlider = new UspImpressionSlider(uspImpressionsTray);
uspImpressionSlider.autoSlide();
}
}
};
var UspImpressionSlider =
/*#__PURE__*/
function () {
function UspImpressionSlider(slider) {
_classCallCheck(this, UspImpressionSlider);
this.slider = slider;
this.slides = this.slider.querySelectorAll('.js-usp-impression');
this.currentSlide = 0;
this.slideInterval = 4000;
}
_createClass(UspImpressionSlider, [{
key: "autoSlide",
value: function autoSlide() {
var self = this;
setTimeout(function () {
self.nextSlide();
self.autoSlide();
}, this.slideInterval);
}
}, {
key: "nextSlide",
value: function nextSlide() {
this.currentSlide++;
if (this.currentSlide >= this.slides.length) this.currentSlide = 0;
for (var i = 0; i < this.slides.length; i++) {
var slide = this.slides[i];
var slideId = slide.getAttribute('data-usp');
if (slideId == this.currentSlide) {
slide.classList.add('is-active');
} else {
slide.classList.remove('is-active');
}
}
}
}]);
return UspImpressionSlider;
}();
UspImpressionsHandler.init();
/***/ }),
/***/ "./resources/js/site/components/youtubeHandler.js":
/*!********************************************************!*\
!*** ./resources/js/site/components/youtubeHandler.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Youtube handler
========================================================================== */
var YoutubeHandler = {
youtubeClass: '.js-youtube-player',
players: [],
init: function init() {
// Get the youtube players containers
var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
var youtubePlayersAmount = youtubePlayers.length;
for (var i = 0; i < youtubePlayersAmount; i++) {
var youtubePlayer = youtubePlayers[i];
var youtubePlayerId = youtubePlayer.getAttribute('id');
if (youtubePlayerId !== null) {
// Strip the necessary data from the html and create objects from it
var youtubeElement = {
id: youtubePlayer.getAttribute('id'),
link: youtubePlayer.getAttribute('data-youtube-link'),
autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
};
YoutubeHandler.players.push(youtubeElement);
} else {
console.log("Element not include because there isn't a id on the player");
console.log(youtubePlayer);
}
}
if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
},
/**
* Check if external script is loaded
*
*/
initYoutube: function initYoutube() {
// See if YT variable exists
if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
// Setup API ready function
window.onYouTubePlayerAPIReady = function () {
YoutubeHandler.loadPlayers();
}; // Load external script
getScript('https://www.youtube.com/iframe_api'); // If YT already exists load player
} else {
YoutubeHandler.loadPlayers();
}
},
/**
* Create the Youtube player(s) with parameters
* And rewrite the players to key them by the element id
*
*/
loadPlayers: function loadPlayers() {
var players = [];
var youtubePlayersAmount = YoutubeHandler.players.length;
for (var i = 0; i < youtubePlayersAmount; i++) {
var youtubePlayer = YoutubeHandler.players[i]; // Load player
youtubePlayer.player = new YT.Player(youtubePlayer.id, {
height: 200,
width: 200,
videoId: youtubePlayer.link,
host: 'https://www.youtube-nocookie.com',
playerVars: {
modestbranding: 0,
rel: 0,
disablekb: 1,
autoplay: youtubePlayer.autoPlay
},
events: {
// 'onReady': YoutubeHandler.onReady,
'onStateChange': YoutubeHandler.onStateChange
}
});
players[youtubePlayer.id] = youtubePlayer;
}
YoutubeHandler.players = players;
},
/**
* When player is ready to play
*/
onReady: function onReady(event) {
var playerContainerId = event.target.getIframe().getAttribute('id');
var player = YoutubeHandler.players[playerContainerId].player; // Show video
// setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);
// If not on tablet or mobile, play on high quality
// player.mute();
// player.playVideo();
// player.setPlaybackQuality('hd1080');
},
/**
* Listener for Youtube state change
*/
onStateChange: function onStateChange(event) {
var playerContainerId = event.target.getIframe().getAttribute('id');
var player = YoutubeHandler.players[playerContainerId].player;
var videoState = event.data; // Loop video
if (event.data === YT.PlayerState.ENDED) {
player.playVideo();
}
}
};
YoutubeHandler.init();
/***/ }),
/***/ "./resources/js/site/global/browserHandler.js":
/*!****************************************************!*\
!*** ./resources/js/site/global/browserHandler.js ***!
\****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Browser Handler
========================================================================== */
var BrowserHandler = {
userAgent: '',
browserInfo: '',
init: function init() {
BrowserHandler.userAgent = window.navigator.userAgent;
BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
BrowserHandler.handleIE();
BrowserHandler.handleSafari();
},
handleIE: function handleIE() {
// Detect versions below ie11
var msie = BrowserHandler.userAgent.indexOf('MSIE ');
var ielt11 = msie > 0; // Detect ie11
var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./); // If Internet Explorer
if (ielt11 || ie11) {
// Default version
var version = '11'; // Way to detect version < 11
if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie))); // Append classes to HTML (we have to do this separately because else ie will fail)
document.body.classList.add('ie');
document.body.classList.add('v' + version);
}
},
// Fallback for older safari version
handleSafari: function handleSafari() {
if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
document.getElementsByTagName('html')[0].classList.add('ie');
}
},
getBrowserInfo: function getBrowserInfo() {
var ua = navigator.userAgent,
tem,
M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return {
name: 'IE ',
version: tem[1] || ''
};
}
if (M[1] === 'Chrome') {
tem = ua.match(/\bOPR\/(\d+)/);
if (tem != null) {
return {
name: 'Opera',
version: tem[1]
};
}
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) {
M.splice(1, 1, tem[1]);
}
return {
name: M[0],
version: M[1]
};
}
};
BrowserHandler.init();
/***/ }),
/***/ "./resources/js/site/global/helpers.js":
/*!*********************************************!*\
!*** ./resources/js/site/global/helpers.js ***!
\*********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Helper functions
========================================================================== */
/*
* Simple isset method for this does not exist in javascript
*/
window.isset = function (obj) {
return typeof obj !== 'undefined' && obj !== null;
};
/*
* Easing Functions - inspired from http://gizma.com/easing/
* only considering the t value for the range [0, 1] => [0, 1]
*/
window.EasingFunctions = {
// no easing, no acceleration
linear: function linear(t) {
return t;
},
// accelerating from zero velocity
easeInQuad: function easeInQuad(t) {
return t * t;
},
// decelerating to zero velocity
easeOutQuad: function easeOutQuad(t) {
return t * (2 - t);
},
// acceleration until halfway, then deceleration
easeInOutQuad: function easeInOutQuad(t) {
return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
},
// accelerating from zero velocity
easeInCubic: function easeInCubic(t) {
return t * t * t;
},
// decelerating to zero velocity
easeOutCubic: function easeOutCubic(t) {
return --t * t * t + 1;
},
// acceleration until halfway, then deceleration
easeInOutCubic: function easeInOutCubic(t) {
return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
},
// accelerating from zero velocity
easeInQuart: function easeInQuart(t) {
return t * t * t * t;
},
// decelerating to zero velocity
easeOutQuart: function easeOutQuart(t) {
return 1 - --t * t * t * t;
},
// acceleration until halfway, then deceleration
easeInOutQuart: function easeInOutQuart(t) {
return t < .5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
},
// accelerating from zero velocity
easeInQuint: function easeInQuint(t) {
return t * t * t * t * t;
},
// decelerating to zero velocity
easeOutQuint: function easeOutQuint(t) {
return 1 + --t * t * t * t * t;
},
// acceleration until halfway, then deceleration
easeInOutQuint: function easeInOutQuint(t) {
return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
}
};
/*
* Vanilla version of the $.getScript
*/
window.getScript = function (source, callback) {
var script = document.createElement('script');
script.async = 1;
var scripts = document.getElementsByTagName('script');
var prior = scripts[scripts.length - 1];
script.onload = script.onreadystatechange = function (_, isAbort) {
if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
script.onload = script.onreadystatechange = null;
script = undefined;
if (!isAbort) {
if (callback) callback();
}
}
};
script.src = source;
prior.parentNode.insertBefore(script, prior);
};
/**
* Returns a function, that, as long as it continues to be invoked, will not
* be triggered. The function will be called after it stops being called for
* N milliseconds. If `immediate` is passed, trigger the function on the
* leading edge, instead of the trailing.
* @param func
* @param wait
* @param immediate
* @returns {Function}
*/
window.debounce = function (func, wait, immediate) {
var timeout;
return function () {
var context = this,
args = arguments;
var later = function later() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
/*
* Cookie helper class
*/
window.Cookie = {
set: function set(name, value, days) {
var domain, domainParts, date, expires, host;
if (days) {
date = new Date();
date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
expires = "; expires=" + date.toGMTString();
} else {
expires = "";
}
host = location.host;
if (host.split('.').length === 1) {
// no "." in a domain - it's localhost or something similar
document.cookie = name + "=" + value + expires + "; path=/";
} else {
// Remember the cookie on all sub domains.
//
// Start with trying to set cookie to the top domain.
// (example: if user is on foo.com, try to set
// cookie to domain ".com")
//
// If the cookie will not be set, it means ".com"
// is a top level domain and we need to
// set the cookie to ".foo.com"
domainParts = host.split('.');
domainParts.shift();
domain = '.' + domainParts.join('.'); // For development purpose, remove this when moving to production
// domain = '.komma.pro';
document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain; // check if cookie was successfuly set to the given domain
// (otherwise it was a Top-Level Domain)
if (Cookie.get(name) == null || Cookie.get(name) != value) {
// append "." to current domain
domain = '.' + host;
document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
}
}
},
get: function get(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
},
erase: function erase(name) {
Cookie.set(name, '', -1);
}
};
/*
* Javascript version of the number_format method of PHP
*/
window.number_format = function (number, decimals, dec_point, thousands_sep) {
// Strip all characters but numerical ones.
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep,
dec = typeof dec_point === 'undefined' ? '.' : dec_point,
s = '',
toFixedFix = function toFixedFix(n, prec) {
var k = Math.pow(10, prec);
return '' + Math.round(n * k) / k;
}; // Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
};
/**
* Element.closest() polyfill
* https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
*/
if (!Element.prototype.closest) {
if (!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
Element.prototype.closest = function (s) {
var el = this;
var ancestor = this;
if (!document.documentElement.contains(el)) return null;
do {
if (ancestor.matches(s)) return ancestor;
ancestor = ancestor.parentElement;
} while (ancestor !== null);
return null;
};
}
window.Ajax = {
//TODO: Can we create a prepare request function ??
get: function get(url, callback) {
var xhr = new XMLHttpRequest();
var token = document.querySelector('meta[name="csrf-token"]').content;
xhr.open('get', url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('X-CSRF-TOKEN', token);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr);
}
};
xhr.send();
},
post: function post(url, data, callback) {
var xhr = new XMLHttpRequest();
var token = document.querySelector('meta[name="csrf-token"]').content;
xhr.open('post', url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('X-CSRF-TOKEN', token);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr);
}
};
xhr.send(JSON.stringify(data));
}
};
/**
* Capitalize the first letter of the string
* @param string
* @returns {string}
*/
window.capitalizeFirstLetter = function (string) {
return string.charAt(0).toUpperCase() + string.slice(1);
};
/**
* Convert snake case into camelcase
*
* @param string
* @returns {*}
*/
window.snakeToCamel = function (string) {
return string.replace(/(\-\w)/g, function (m) {
return m[1].toUpperCase();
});
};
/**
* Get the index of an element inside its parent
*/
window.indexInParent = function (node) {
var children = node.parentNode.childNodes;
var num = 0;
for (var i = 0; i < children.length; i++) {
if (children[i] == node) return num;
if (children[i].nodeType == 1) num++;
}
return -1;
};
/**
* For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.
* The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').
* Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard
* Code from: https://stackoverflow.com/a/46981847
*/
window.copyToClipboard = function (el) {
// resolve the element
el = typeof el === 'string' ? document.querySelector(el) : el; // handle iOS as a special case
if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
// save current contentEditable/readOnly status
var editable = el.contentEditable;
var readOnly = el.readOnly; // convert to editable with readonly to stop iOS keyboard opening
el.contentEditable = true;
el.readOnly = true; // create a selectable range
var range = document.createRange();
range.selectNodeContents(el); // select the range
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
el.setSelectionRange(0, 999999); // restore contentEditable/readOnly to original state
el.contentEditable = editable;
el.readOnly = readOnly;
} else {
el.select();
} // execute copy command
document.execCommand('copy');
};
/**
* Get the position of the element related to the body
*
* @param el
* @returns {{top: number, left: number}}
*/
window.bodyOffset = function (el) {
var rect = el.getBoundingClientRect(),
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
scrollTop = window.pageYOffset || document.documentElement.scrollTop;
return {
top: rect.top + scrollTop,
left: rect.left + scrollLeft
};
};
/***/ }),
/***/ "./resources/sass/kms/styles.sass":
/*!****************************************!*\
!*** ./resources/sass/kms/styles.sass ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ "./resources/sass/site/style.scss":
/*!****************************************!*\
!*** ./resources/sass/site/style.scss ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ 0:
/*!**********************************************************************************************************!*\
!*** multi ./resources/js/site/app.js ./resources/sass/site/style.scss ./resources/sass/kms/styles.sass ***!
\**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(/*! /Users/pascallemmen/Development/Slenders-Wooncomfort/resources/js/site/app.js */"./resources/js/site/app.js");
__webpack_require__(/*! /Users/pascallemmen/Development/Slenders-Wooncomfort/resources/sass/site/style.scss */"./resources/sass/site/style.scss");
module.exports = __webpack_require__(/*! /Users/pascallemmen/Development/Slenders-Wooncomfort/resources/sass/kms/styles.sass */"./resources/sass/kms/styles.sass");
/***/ })
},[[0,"/js/site/manifest","/js/site/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL3BvbHlmaWxscy9ldmVudFBvbHlGaWxsLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL2lzSW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL3BvbHlmaWxscy9wcm9taXNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL3N5bWJvbC1lczYubWluLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2FwcC5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9jbGllbnRSZXZpZXdzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL2Nvb2tpZUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9pbWFnZVJhY2tIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvaW5wdXRIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvbWFwc0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9uYXZpZ2F0aW9uSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3Njcm9sbFRvSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3NsaWRlUHJvamVjdG9ySGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3VzcEltcHJlc3Npb25zSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3lvdXR1YmVIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2dsb2JhbC9icm93c2VySGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9nbG9iYWwvaGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvc2Fzcy9rbXMvc3R5bGVzLnNhc3MiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3Mvc2l0ZS9zdHlsZS5zY3NzIl0sIm5hbWVzIjpbImNyZWF0ZU5ld0V2ZW50IiwiZXZlbnROYW1lIiwiZXZlbnQiLCJFdmVudCIsImRvY3VtZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50Rm9yRWxlbWVudCIsImVsZW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiZmlyZUV2ZW50IiwiZXZlbnRUeXBlIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwidmFsdWUiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImdsb2JhbCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiZmluYWxseUNvbnN0cnVjdG9yIiwiY2FsbGJhY2siLCJjb25zdHJ1Y3RvciIsInRoZW4iLCJyZXNvbHZlIiwicmVhc29uIiwicmVqZWN0Iiwic2V0VGltZW91dEZ1bmMiLCJzZXRUaW1lb3V0Iiwibm9vcCIsImJpbmQiLCJmbiIsInRoaXNBcmciLCJhcHBseSIsImFyZ3VtZW50cyIsIlByb21pc2UiLCJUeXBlRXJyb3IiLCJfc3RhdGUiLCJfaGFuZGxlZCIsIl92YWx1ZSIsInVuZGVmaW5lZCIsIl9kZWZlcnJlZHMiLCJkb1Jlc29sdmUiLCJoYW5kbGUiLCJzZWxmIiwiZGVmZXJyZWQiLCJwdXNoIiwiX2ltbWVkaWF0ZUZuIiwiY2IiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJwcm9taXNlIiwicmV0IiwiZSIsIm5ld1ZhbHVlIiwiZmluYWxlIiwibGVuZ3RoIiwiX3VuaGFuZGxlZFJlamVjdGlvbkZuIiwiaSIsImxlbiIsIkhhbmRsZXIiLCJkb25lIiwiZXgiLCJwcm90b3R5cGUiLCJwcm9tIiwiYWxsIiwiYXJyIiwiYXJncyIsIkFycmF5Iiwic2xpY2UiLCJjYWxsIiwicmVtYWluaW5nIiwicmVzIiwidmFsIiwicmFjZSIsInZhbHVlcyIsInNldEltbWVkaWF0ZSIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwiZ2xvYmFsTlMiLCJ3aW5kb3ciLCJFcnJvciIsImRlZmluZVByb3BlcnR5IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsInN5bWJvbEhpZGRlbkNvdW50ZXIiLCJnbG9iYWxTeW1ib2xSZWdpc3RyeSIsIkVTNiIsImlzQXJyYXkiLCJvYmplY3RUb1N0cmluZyIsInRvU3RyaW5nIiwiZW1wdHlGdW5jdGlvbiIsInNpbXBsZUZ1bmN0aW9uIiwiYXJnIiwiaXNDYWxsYWJsZSIsIkl0ZXJhdG9yIiwiQXJyYXlJdGVyYXRvciIsImFycmF5IiwiZmxhZyIsIl9hcnJheSIsIl9mbGFnIiwiX25leHRJbmRleCIsIlN0cmluZ0l0ZXJhdG9yIiwic3RyaW5nIiwiX3N0cmluZyIsImlzT2JqZWN0Iiwic2V0dXBTeW1ib2xJbnRlcm5hbHMiLCJzeW1ib2wiLCJkZXNjIiwiX2Rlc2NyaXB0aW9uIiwiX2lzU3ltYm9sIiwiX2lkIiwiYXBwZW5kQXJyYXkiLCJhcnJheTEiLCJhcnJheTIiLCJsZW5ndGgxIiwibGVuZ3RoMiIsImhhc093blByb3BlcnR5Iiwic2ltcGxlSW5oZXJpdGFuY2UiLCJjaGlsZCIsInBhcmVudCIsImNyZWF0ZSIsIlN5bWJvbCIsIlN0cmluZyIsImtleSIsInJlY29yZCIsInJlZ2lzdHJ5TGVuZ3RoIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJrZXlGb3IiLCJpc1N5bWJvbCIsImhhc0luc3RhbmNlIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwiaXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsInZhbHVlT2YiLCJuZXh0IiwibmV4dFZhbHVlIiwic3RyaW5nT2JqZWN0IiwiU3ByZWFkT3BlcmF0b3JJbXBsIiwidGFyZ2V0IiwiX3RhcmdldCIsIl92YWx1ZXMiLCJfdGhpc0FyZyIsInNwcmVhZCIsImZvckVhY2giLCJpdGVyYWJsZSIsImZvck9mIiwiYWRkIiwidGVtcCIsInJldHVyblZhbHVlIiwiaW5zdGFuY2VPZiIsIm9iamVjdCIsImhhc0luc3RhbmNlU3ltYm9sUHJvcCIsIml0ZXJhdGlvblJlc3VsdCIsInNwcmVhZE9wZXJhdG9yIiwiRnVuY3Rpb24iLCJpbnN0YW5jZSIsInRhcmdldHMiLCJvdXRwdXRzIiwidW5zaGlmdCIsImFycmF5TGlrZSIsIm1hcEZuIiwicmVxdWlyZSIsIkNob2NvbGF0ZUZhY3RvcnkiLCJiYW5uZWRWaXNpdG9yIiwiZW50ZXIiLCJjaG9jb2xhdGVGYWN0b3JpZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaXNzZXQiLCJhbW91bnRPZkNob2NvbGF0ZUZhY3RvcmllcyIsIkNob2NvbGF0ZUJhciIsIl9mbGFzaFRpY2tldCIsImNob2NvbGF0ZUJhciIsImdvbGRlblRpY2tldCIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZW5qb3lUaGVUb3VyIiwibG9nIiwiY2hvY29sYXRlRmFjdG9yeSIsInRvdXJHcm91cCIsIm9vbXBhTG9vbXBhcyIsImFtb3VudE9mT29tcGFMb29tcGFzIiwidG91ckdyb3VwU2l6ZSIsInZpc2l0b3IiLCJ2aXNpdG9yTmFtZSIsImdldEF0dHJpYnV0ZSIsIl9pc1Zpc2l0b3JCYW5uZWQiLCJfZ2V0QXJyYW5nZW1lbnQiLCJfZmluaXNoVG91ciIsImluZGV4T2YiLCJ2aXNpdG9yVHlwZSIsIm5vZGVOYW1lIiwiZ3JvdXAiLCJfYWRkV2lsbGllV29ua2EiLCJnYXRlIiwiQWpheCIsInBvc3QiLCJIdHRwUmVxdWVzdCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwic3RhdHVzIiwiX3RoYW5rc0ZvclZpc2l0aW5nIiwicmVkaXJlY3RVcmwiLCJfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzIiwiZXJyb3JzIiwiX3Vua25vd25HYXBJbkZhY3RvcnkiLCJfd2lsbGllIiwiZmVlZGJhY2tBcmVhIiwiaW5uZXJIVE1MIiwiX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzIiwia2V5cyIsImphY2tldCIsInZpc2l0b3JGZWVkYmFja0FyZWEiLCJ2aXNpdG9yTm9kZSIsIl9ncmFiVmlzaXRvckphY2tldCIsInZpc2l0b3JGZWVkYmFjayIsInZpc2l0b3JGZWVkYmFja0Ftb3VudCIsInZpc2l0b3JGZWVkYmFja0xpbmUiLCJjbGFzc0xpc3QiLCJjdXJyZW50RmVlZGJhY2tBcmVhIiwiY2FwaXRhbGl6ZUZpcnN0TGV0dGVyIiwibWFya2VkSmFja2V0cyIsIm1hcmtlZEphY2tldHNBbW91bnQiLCJyZW1vdmUiLCJjdXJyZW50TGF5ZXIiLCJzYWZldHlCcmVhayIsInBhcmVudE5vZGUiLCJjb250YWlucyIsInRhZ05hbWUiLCJuZXh0U3RvcCIsImxvY2F0aW9uIiwiQ2xpZW50UmV2aWV3c0hhbmRsZXIiLCJpbml0IiwiY2xpZW50UmV2aWV3cyIsImNsaWVudFJldmlld0NvbnRhaW5lcnMiLCJjbGllbnRSZXZpZXdDb250YWluZXJzTGVuZ3RoIiwiY2xpZW50UmV2aWV3IiwiY2xpZW50UmV2aWV3SWQiLCJDbGllbnRSZXZpZXciLCJzbGlkZVF1ZXJ5IiwibmF2aWdhdGlvbkJ1dHRvbnMiLCJzZXR0aW5ncyIsImNsaWVudFJldmlld09iamVjdCIsImFjdGl2ZVNsaWRlSWQiLCJwcmV2aW91c1NsaWRlSWQiLCJuZXh0U2xpZGVJZCIsImF2YWlsYWJsZVNsaWRlcyIsInNsaWRlcyIsImdldEVsZW1lbnRCeUlkIiwic2V0U2xpZGUiLCJzd2lwZUdlc3R1cmVzIiwiSGFtbWVyIiwib24iLCJuZXh0U2xpZGUiLCJwcmV2aW91c1NsaWRlIiwibmF2aWdhdGlvbkJ1dHRvbnNMZW5ndGgiLCJuYXZpZ2F0aW9uQnV0dG9uIiwiY2xpY2tOYXZpZ2F0aW9uQnV0dG9uIiwiZGVmaW5lZFByZXZpb3VzTmV4dCIsInNldFByZXZpb3VzQW5kTmV4dFNsaWRlIiwic2xpZGVzTGVuZ3RoIiwic2xpZGUiLCJzbGlkZU9yZGVyIiwicGFyc2VJbnQiLCJuYXZCdXR0b24iLCJwcmV2aW91cyIsInNldEF0dHJpYnV0ZSIsIkNvb2tpZUhhbmRsZXIiLCJjb29raWVCYXIiLCJjb29raWVPdmVybGF5IiwiY29va2llTWVzc2FnZSIsImNvb2tpZVN3aXRjaCIsImNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiIsImFjY2VwdFRyYWNraW5nIiwiaW5pdENvb2tpZUJhciIsImluaXRDb29raWVPdmVybGF5IiwiY2hlY2tGb3JDb29raWVTZXR0aW5ncyIsImluaXRDb29raWVTd2l0Y2giLCJjbG9zZUJ1dHRvbiIsImNsb3NlQ29va2llTWVzc2FnZSIsIm9wZW5Db29raWVTZXR0aW5nc0J1dHRvbiIsIm9wZW5Db29raWVTZXR0aW5ncyIsInRvZ2dsZVRyYWNraW5nSW5wdXQiLCJjaGVja2VkIiwidG9nZ2xlVHJhY2tpbmdTZXR0aW5nIiwiYWNjZXB0QnV0dG9uIiwic2V0Q29va2llU2V0dGluZ3MiLCJzYXZlQnV0dG9uIiwiQ29va2llIiwiZ2V0Iiwic2V0IiwiZXJhc2UiLCJyZWxvYWQiLCJJbWFnZVJhY2tIYW5kbGVyIiwiaW1hZ2VSYWNrRWxlbWVudHMiLCJpbWFnZVJhY2tFbGVtZW50c0xlbmd0aCIsIkltYWdlUmFjayIsImltYWdlUmFjayIsInJhY2siLCJzbGlkZUFyZWEiLCJpdGVtcyIsImRpcmVjdGlvbiIsImltYWdlTG9hZGVkIiwiY3VycmVudEl0ZW0iLCJtYXhJdGVtUG9zaXRpb24iLCJtYXhUcmFuc2xhdGVkIiwic3RlcHMiLCJwcmV2aW91c0J1dHRvbiIsIm5leHRCdXR0b24iLCJjYWxjdWxhdGVTdGVwcyIsInByZXZpb3VzSXRlbSIsInNldEltYWdlUmFjayIsIm5leHRJdGVtIiwic3dpcGVMZWZ0Iiwic3dpcGVSaWdodCIsImRlYm91bmNlVGltZW91dCIsIndhaXREZWJvdW5jZSIsImNsZWFyVGltZW91dCIsImJvZHlPZmZzZXQiLCJhdmFpbGFibGVWaWV3QXJlYSIsImJvZHkiLCJvZmZzZXRXaWR0aCIsImxlZnQiLCJyYWNrV2lkdGgiLCJvZmZzZXRMZWZ0IiwibWF4SXRlbUNhbGN1bGF0ZWQiLCJpbWFnZXNMb2FkZWQiLCJpdGVtIiwib2Zmc2V0RnJvbVJpZ2h0U2lkZSIsIm9mZnNldEZyb21MZWZ0U2lkZSIsIm9mZnNldENvbXBhcmVWYXJpYWJsZSIsIm5leHRPZmZzZXRQb3NpdGlvbiIsInN0eWxlIiwidHJhbnNmb3JtIiwiSW5wdXRIYW5kbGVyIiwiaW5wdXRGaWVsZHMiLCJpbnB1dExlbmd0aCIsImlucHV0IiwiaW5wdXRJZCIsImlucHV0TGFiZWwiLCJhZGRFdmVudExpc3RlbmVyc1RvSW5wdXQiLCJwYXJlbnRFbGVtZW50IiwicmVtb3ZlRm9jdXMiLCJsb29wZWRJbnB1dCIsImFkZEZvY3VzIiwiZXJyb3JNZXNzYWdlIiwiaW5wdXRWYWx1ZSIsIk1hcHNIYW5kbGVyIiwibWFwIiwibGF0IiwibG5nIiwic3R5bGluZyIsImhhc0F0dHJpYnV0ZSIsInBhcnNlRmxvYXQiLCJzZXRDdXN0b21TdHlsaW5nIiwiZ29vZ2xlIiwibWFwcyIsImdldFNjcmlwdCIsImRyYXdNYXAiLCJNYXAiLCJ6b29tIiwiY2VudGVyIiwiZGlzYWJsZURlZmF1bHRVSSIsInN0eWxlcyIsIm1hcmtlciIsIk1hcmtlciIsInBvc2l0aW9uIiwiTmF2aWdhdGlvbkhhbmRsZXIiLCJuYXZpZ2F0aW9uTm9kZSIsInNjcm9sbGVkTG9nIiwiaXNPcGVuIiwibmF2VHJpZ2dlcnMiLCJjb2RlIiwiY2xvc2VOYXZpZ2F0aW9uIiwiaW5pdE5hdmlnYXRpb24iLCJuYXZUcmlnZ2VyIiwidG9nZ2xlTmF2aWdhdGlvbiIsInByZXZlbnREZWZhdWx0Iiwic2Nyb2xsZWQiLCJwYWdlWU9mZnNldCIsIm9wZW5OYXZpZ2F0aW9uIiwiU2Nyb2xsVG9IYW5kbGVyIiwib2Zmc2V0IiwiZHVyYXRpb24iLCJzdGFydCIsImNoYW5nZSIsImN1cnJlbnRUaW1lIiwiYWxsb3dBbmltYXRpb24iLCJzY3JvbGxUb0FuaW1hdGlvbiIsImVhc2luZyIsImFuY2hvckxpbmtzIiwiYW5jaG9yTGlua3NBbW91bnQiLCJhbmNob3JMaW5rIiwicHJlcGFyZVNjcm9sbFRvIiwiZWxlbWVudElkIiwic3Vic3RyIiwic2Nyb2xsVG9FbGVtZW50Iiwic2Nyb2xsVG9FbGVtZW50UG9zaXRpb24iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJkb2N1bWVudEVsZW1lbnQiLCJtYXgiLCJzY3JvbGxUb3AiLCJ0b3AiLCJzdGFydFRpbWUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZVNjcm9sbCIsImFib3J0U2Nyb2xsQW5pbWF0aW9uIiwidGltZXN0YW1wIiwicHJvZ3Jlc3MiLCJtaW4iLCJFYXNpbmdGdW5jdGlvbnMiLCJuZXdTY3JvbGxUb3AiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsIlNsaWRlclByb2plY3RvckhhbmRsZXIiLCJzbGlkZVByb2plY3RvcnMiLCJzbGlkZVByb2plY3RvckNvbnRhaW5lcnMiLCJzbGlkZVByb2plY3RvckNvbnRhaW5lcnNMZW5ndGgiLCJzbGlkZVByb2plY3RvciIsInNsaWRlUHJvamVjdG9ySWQiLCJhdXRvU2xpZGUiLCJzbGlkZVByb2plY3RvclNldHRpbmciLCJTbGlkZXJQcm9qZWN0b3JTZXR0aW5nIiwic2xpZGVySWQiLCJhdXRvU2xpZGVyIiwic2xpZGVySW50ZXJ2YWwiLCJTbGlkZXJQcm9qZWN0b3IiLCJwcmVwYXJlUGFyYW1ldGVycyIsInNldHRpbmdzT2JqZWN0IiwiZG90cyIsImNhcHRpb25zIiwic2V0U2xpZGVyUHJvamVjdG9ySWQiLCJzZXREZWZpbmVkUHJldmlvdXNOZXh0IiwiYm9vbGVhbiIsInNldEF1dG9TbGlkZXIiLCJzZXRTbGlkZXJJbnRlcnZhbCIsImludGVnZXIiLCJzZXRTbGlkZVF1ZXJ5Iiwic2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJzZXREb3RzIiwic2V0Q2FwdGlvbnMiLCJnZXRTbGlkZXJQcm9qZWN0b3JJZCIsImdldERlZmluZWRQcmV2aW91c05leHQiLCJnZXRBdXRvU2xpZGVyIiwiZ2V0U2xpZGVySW50ZXJ2YWwiLCJnZXRTbGlkZVF1ZXJ5IiwiZ2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJnZXREb3RzIiwiZ2V0Q2FwdGlvbnMiLCJmaWxsIiwic2V0dGluZ3NPYmplY3RLZXlzIiwic2V0dGluZ3NPYmplY3RMZW5ndGgiLCJzbGlkZXJPYmplY3QiLCJhdXRvU2xpZGVySW50ZXJ2YWwiLCJyZXNldEF1dG9TbGlkZXIiLCJkb3RzTGVuZ3RoIiwiZG90IiwiY2xpY2tEb3QiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJzZXRBY3RpdmVEb3QiLCJzZXRBY3RpdmVDYXB0aW9uIiwiY2xpY2tlZERvdCIsImRvdE9yZGVyIiwiY2FwdGlvbnNMZW5ndGgiLCJjYXB0aW9uIiwiY2FwdGlvbk9yZGVyIiwiVXNwSW1wcmVzc2lvbnNIYW5kbGVyIiwidGltZW91dCIsInVzcEltcHJlc3Npb25zVHJheXMiLCJ1c3BJbXByZXNzaW9uc1RyYXlzTGVuZ3RoIiwidXNwSW1wcmVzc2lvbnNUcmF5IiwidXNwSW1wcmVzc2lvblNsaWRlciIsIlVzcEltcHJlc3Npb25TbGlkZXIiLCJzbGlkZXIiLCJjdXJyZW50U2xpZGUiLCJzbGlkZUludGVydmFsIiwic2xpZGVJZCIsIllvdXR1YmVIYW5kbGVyIiwieW91dHViZUNsYXNzIiwicGxheWVycyIsInlvdXR1YmVQbGF5ZXJzIiwieW91dHViZVBsYXllcnNBbW91bnQiLCJ5b3V0dWJlUGxheWVyIiwieW91dHViZVBsYXllcklkIiwieW91dHViZUVsZW1lbnQiLCJpZCIsImxpbmsiLCJhdXRvUGxheSIsImluaXRZb3V0dWJlIiwiWVQiLCJQbGF5ZXIiLCJvbllvdVR1YmVQbGF5ZXJBUElSZWFkeSIsImxvYWRQbGF5ZXJzIiwicGxheWVyIiwiaGVpZ2h0Iiwid2lkdGgiLCJ2aWRlb0lkIiwiaG9zdCIsInBsYXllclZhcnMiLCJtb2Rlc3RicmFuZGluZyIsInJlbCIsImRpc2FibGVrYiIsImF1dG9wbGF5IiwiZXZlbnRzIiwib25TdGF0ZUNoYW5nZSIsIm9uUmVhZHkiLCJwbGF5ZXJDb250YWluZXJJZCIsImdldElmcmFtZSIsInZpZGVvU3RhdGUiLCJkYXRhIiwiUGxheWVyU3RhdGUiLCJFTkRFRCIsInBsYXlWaWRlbyIsIkJyb3dzZXJIYW5kbGVyIiwidXNlckFnZW50IiwiYnJvd3NlckluZm8iLCJuYXZpZ2F0b3IiLCJnZXRCcm93c2VySW5mbyIsImhhbmRsZUlFIiwiaGFuZGxlU2FmYXJpIiwibXNpZSIsImllbHQxMSIsImllMTEiLCJtYXRjaCIsInZlcnNpb24iLCJzdWJzdHJpbmciLCJuYW1lIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ1YSIsInRlbSIsIk0iLCJ0ZXN0IiwiZXhlYyIsImFwcE5hbWUiLCJhcHBWZXJzaW9uIiwic3BsaWNlIiwib2JqIiwibGluZWFyIiwidCIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblF1aW50IiwiZWFzZU91dFF1aW50IiwiZWFzZUluT3V0UXVpbnQiLCJzb3VyY2UiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwiY29udGV4dCIsImxhdGVyIiwiY2FsbE5vdyIsImRheXMiLCJkb21haW4iLCJkb21haW5QYXJ0cyIsImRhdGUiLCJleHBpcmVzIiwic2V0VGltZSIsInRvR01UU3RyaW5nIiwic3BsaXQiLCJjb29raWUiLCJzaGlmdCIsImpvaW4iLCJuYW1lRVEiLCJjYSIsImMiLCJjaGFyQXQiLCJudW1iZXJfZm9ybWF0IiwibnVtYmVyIiwiZGVjaW1hbHMiLCJkZWNfcG9pbnQiLCJ0aG91c2FuZHNfc2VwIiwicmVwbGFjZSIsIm4iLCJwcmVjIiwiYWJzIiwic2VwIiwiZGVjIiwicyIsInRvRml4ZWRGaXgiLCJrIiwicG93Iiwicm91bmQiLCJFbGVtZW50IiwiY2xvc2VzdCIsIm1hdGNoZXMiLCJtc01hdGNoZXNTZWxlY3RvciIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsImVsIiwiYW5jZXN0b3IiLCJ1cmwiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsInRva2VuIiwiY29udGVudCIsIm9wZW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsInN0cmluZ2lmeSIsInRvVXBwZXJDYXNlIiwic25ha2VUb0NhbWVsIiwibSIsImluZGV4SW5QYXJlbnQiLCJub2RlIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGVzIiwibnVtIiwibm9kZVR5cGUiLCJjb3B5VG9DbGlwYm9hcmQiLCJlZGl0YWJsZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlYWRPbmx5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInJlY3QiLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LFFBQU0yQixTQUFTLEdBQUdoakIsTUFBTSxDQUFDaWpCLFlBQVAsRUFBbEI7QUFDQUQsYUFBUyxDQUFDRSxlQUFWO0FBQ0FGLGFBQVMsQ0FBQ0csUUFBVixDQUFtQk4sS0FBbkI7QUFDQXhCLE1BQUUsQ0FBQytCLGlCQUFILENBQXFCLENBQXJCLEVBQXdCLE1BQXhCLEVBbEJnRCxDQW9CaEQ7O0FBQ0EvQixNQUFFLENBQUNzQixlQUFILEdBQXFCRCxRQUFyQjtBQUNBckIsTUFBRSxDQUFDdUIsUUFBSCxHQUFjQSxRQUFkO0FBQ0gsR0F2QkQsTUF3Qks7QUFDRHZCLE1BQUUsQ0FBQ2dDLE1BQUg7QUFDSCxHQWhDa0MsQ0FrQ25DOzs7QUFDQXJvQixVQUFRLENBQUNzb0IsV0FBVCxDQUFxQixNQUFyQjtBQUNILENBcENEO0FBc0NBOzs7Ozs7OztBQU1BdGpCLE1BQU0sQ0FBQ2dQLFVBQVAsR0FBb0IsVUFBVXFTLEVBQVYsRUFBYztBQUM5QixNQUFNa0MsSUFBSSxHQUFHbEMsRUFBRSxDQUFDck4scUJBQUgsRUFBYjtBQUFBLE1BQ0l3UCxVQUFVLEdBQUd4akIsTUFBTSxDQUFDeWpCLFdBQVAsSUFBc0J6b0IsUUFBUSxDQUFDaVosZUFBVCxDQUF5QnVQLFVBRGhFO0FBQUEsTUFFSXJQLFNBQVMsR0FBR25VLE1BQU0sQ0FBQzZTLFdBQVAsSUFBc0I3WCxRQUFRLENBQUNpWixlQUFULENBQXlCRSxTQUYvRDtBQUdBLFNBQU87QUFBRUMsT0FBRyxFQUFFbVAsSUFBSSxDQUFDblAsR0FBTCxHQUFXRCxTQUFsQjtBQUE2Qi9FLFFBQUksRUFBRW1VLElBQUksQ0FBQ25VLElBQUwsR0FBWW9VO0FBQS9DLEdBQVA7QUFDSCxDQUxELEM7Ozs7Ozs7Ozs7O0FDcFdBLHlDOzs7Ozs7Ozs7OztBQ0FBLHlDIiwiZmlsZSI6Ii9qcy9zaXRlL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsIi8qKlxuICogRXZlbnQgc2VtaSBwb2x5ZmlsbC4gSUUgZG9lcyBub3Qgc3VwcG9ydCBuZXcgZXZlbnQuIEJ1dCBkb2VzIHN1cHBvcnQgZG9jdW1lbnQuY3JlYXRlRXZlbnQuXG4gKiBTYW1lIHRoaW5nIGZvciBkaXNwYXRjaGluZyBldmVudHMuIEJ1dCB0aGVuIHdpdGggY3JlYXRlRXZlbnQgYW5kIGZpcmVFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5ld0V2ZW50KGV2ZW50TmFtZSkge1xuICAgIGxldCBldmVudDtcbiAgICBpZiAodHlwZW9mKEV2ZW50KSA9PT0gJ2Z1bmN0aW9uJykgeyAvL09uIGllIGl0IGlzIHR5cGVPZiBvYmplY3QuXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50TmFtZSk7IC8vTm9uLWllXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTsgLy9pZVxuICAgICAgICBldmVudC5pbml0RXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yRWxlbWVudChlbGVtZW50LCBldmVudClcbntcbiAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHtcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmZpcmVFdmVudChcIm9uXCIgKyBldmVudC5ldmVudFR5cGUsIGV2ZW50KTtcbiAgICB9XG59XG5cbiIsIk51bWJlci5pc0ludGVnZXIgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICBpc0Zpbml0ZSh2YWx1ZSkgJiZcbiAgICAgICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufTsiLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoKSA6XG4gICAgICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgICAgICAgICAoZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyoqXG4gICAgICogQHRoaXMge1Byb21pc2V9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluYWxseUNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAgICAgICBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4vLyBTdG9yZSBzZXRUaW1lb3V0IHJlZmVyZW5jZSBzbyBwcm9taXNlLXBvbHlmaWxsIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuLy8gb3RoZXIgY29kZSBtb2RpZnlpbmcgc2V0VGltZW91dCAobGlrZSBzaW5vbi51c2VGYWtlVGltZXJzKCkpXG4gICAgdmFyIHNldFRpbWVvdXRGdW5jID0gc2V0VGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG4vLyBQb2x5ZmlsbCBmb3IgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbiAgICBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQcm9taXNlKGZuKSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAvKiogQHR5cGUgeyFudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICAgICAgLyoqIEB0eXBlIHshYm9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAvKiogQHR5cGUge1Byb21pc2V8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEB0eXBlIHshQXJyYXk8IUZ1bmN0aW9uPn0gKi9cbiAgICAgICAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgICAgICAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGUoc2VsZiwgZGVmZXJyZWQpIHtcbiAgICAgICAgd2hpbGUgKHNlbGYuX3N0YXRlID09PSAzKSB7XG4gICAgICAgICAgICBzZWxmID0gc2VsZi5fdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlID09PSAwKSB7XG4gICAgICAgICAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5faGFuZGxlZCA9IHRydWU7XG4gICAgICAgIFByb21pc2UuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNiID0gc2VsZi5fc3RhdGUgPT09IDEgPyBkZWZlcnJlZC5vbkZ1bGZpbGxlZCA6IGRlZmVycmVkLm9uUmVqZWN0ZWQ7XG4gICAgICAgICAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAoc2VsZi5fc3RhdGUgPT09IDEgPyByZXNvbHZlIDogcmVqZWN0KShkZWZlcnJlZC5wcm9taXNlLCBzZWxmLl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGRlZmVycmVkLnByb21pc2UsIHJldCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmUoc2VsZiwgbmV3VmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHNlbGYpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4nKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhciB0aGVuID0gbmV3VmFsdWUudGhlbjtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gMztcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxlKHNlbGYpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAxO1xuICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0KHNlbGYsIG5ld1ZhbHVlKSB7XG4gICAgICAgIHNlbGYuX3N0YXRlID0gMjtcbiAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgZmluYWxlKHNlbGYpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBQcm9taXNlLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaGFuZGxlKHNlbGYsIHNlbGYuX2RlZmVycmVkc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5fZGVmZXJyZWRzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9taXNlKSB7XG4gICAgICAgIHRoaXMub25GdWxmaWxsZWQgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IG51bGw7XG4gICAgICAgIHRoaXMub25SZWplY3RlZCA9IHR5cGVvZiBvblJlamVjdGVkID09PSAnZnVuY3Rpb24nID8gb25SZWplY3RlZCA6IG51bGw7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZSBhIHBvdGVudGlhbGx5IG1pc2JlaGF2aW5nIHJlc29sdmVyIGZ1bmN0aW9uIGFuZCBtYWtlIHN1cmVcbiAgICAgKiBvbkZ1bGZpbGxlZCBhbmQgb25SZWplY3RlZCBhcmUgb25seSBjYWxsZWQgb25jZS5cbiAgICAgKlxuICAgICAqIE1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgYXN5bmNocm9ueS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZuKFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNlbGYsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHNlbGYsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlamVjdChzZWxmLCBleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBQcm9taXNlLnByb3RvdHlwZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdmFyIHByb20gPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcblxuICAgICAgICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb20pKTtcbiAgICAgICAgcmV0dXJuIHByb207XG4gICAgfTtcblxuICAgIFByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10gPSBmaW5hbGx5Q29uc3RydWN0b3I7XG5cbiAgICBQcm9taXNlLmFsbCA9IGZ1bmN0aW9uKGFycikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyciB8fCB0eXBlb2YgYXJyLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZS5hbGwgYWNjZXB0cyBhbiBhcnJheScpO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnIpO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gYXJncy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhpLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzKGksIGFyZ3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVqZWN0KHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFByb21pc2UucmFjZSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzW2ldLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuLy8gVXNlIHBvbHlmaWxsIGZvciBzZXRJbW1lZGlhdGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zXG4gICAgUHJvbWlzZS5faW1tZWRpYXRlRm4gPVxuICAgICAgICAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pO1xuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXRGdW5jKGZuLCAwKTtcbiAgICAgICAgfTtcblxuICAgIFByb21pc2UuX3VuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3VuaGFuZGxlZFJlamVjdGlvbkZuKGVycikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOicsIGVycik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBAc3VwcHJlc3Mge3VuZGVmaW5lZFZhcnN9ICovXG4gICAgdmFyIGdsb2JhbE5TID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyB0aGUgb25seSByZWxpYWJsZSBtZWFucyB0byBnZXQgdGhlIGdsb2JhbCBvYmplY3QgaXNcbiAgICAgICAgLy8gYEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKClgXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIENTUCB2aW9sYXRpb25zIGluIENocm9tZSBhcHBzLlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Jyk7XG4gICAgfSkoKTtcblxuICAgIGlmICghKCdQcm9taXNlJyBpbiBnbG9iYWxOUykpIHtcbiAgICAgICAgZ2xvYmFsTlNbJ1Byb21pc2UnXSA9IFByb21pc2U7XG4gICAgfSBlbHNlIGlmICghZ2xvYmFsTlMuUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSkge1xuICAgICAgICBnbG9iYWxOUy5Qcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddID0gZmluYWxseUNvbnN0cnVjdG9yO1xuICAgIH1cblxufSkpKTsiLCIhZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe1widXNlIHN0cmljdFwiO1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1mYWN0b3J5KGdsb2JhbCk6ZmFjdG9yeShnbG9iYWwpfShcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpnbG9iYWwsZnVuY3Rpb24oZ2xvYmFsKXtcInVzZSBzdHJpY3RcIjt2YXIgZGVmaW5lUHJvcGVydHk9T2JqZWN0LmRlZmluZVByb3BlcnR5LGRlZmluZVByb3BlcnRpZXM9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsc3ltYm9sSGlkZGVuQ291bnRlcj0wLGdsb2JhbFN5bWJvbFJlZ2lzdHJ5PVtdLHNsaWNlPUFycmF5LnByb3RvdHlwZS5zbGljZSxFUzY9XCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbC5FUzY/Z2xvYmFsLkVTNjpnbG9iYWwuRVM2PXt9LGlzQXJyYXk9QXJyYXkuaXNBcnJheSxvYmplY3RUb1N0cmluZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHB1c2g9QXJyYXkucHJvdG90eXBlLnB1c2gsZW1wdHlGdW5jdGlvbj1mdW5jdGlvbigpe30sc2ltcGxlRnVuY3Rpb249ZnVuY3Rpb24oYXJnKXtyZXR1cm4gYXJnfSxpc0NhbGxhYmxlPWZ1bmN0aW9uKGZuKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBmbn0sSXRlcmF0b3I9ZnVuY3Rpb24oKXt9LEFycmF5SXRlcmF0b3I9ZnVuY3Rpb24oYXJyYXksZmxhZyl7dGhpcy5fYXJyYXk9YXJyYXksdGhpcy5fZmxhZz1mbGFnLHRoaXMuX25leHRJbmRleD0wfSxTdHJpbmdJdGVyYXRvcj1mdW5jdGlvbihzdHJpbmcsZmxhZyl7dGhpcy5fc3RyaW5nPXN0cmluZyx0aGlzLl9mbGFnPWZsYWcsdGhpcy5fbmV4dEluZGV4PTB9LGlzT2JqZWN0PWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gbnVsbCE9PXZhbHVlJiYoXCJvYmplY3RcIj09dHlwZW9mIHZhbHVlfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiB2YWx1ZSl9LHNldHVwU3ltYm9sSW50ZXJuYWxzPWZ1bmN0aW9uKHN5bWJvbCxkZXNjKXtyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW1ib2wse19kZXNjcmlwdGlvbjp7dmFsdWU6ZGVzY30sX2lzU3ltYm9sOnt2YWx1ZTohMH0sX2lkOnt2YWx1ZTpzeW1ib2xIaWRkZW5Db3VudGVyKyt9fSksc3ltYm9sfSxhcHBlbmRBcnJheT1mdW5jdGlvbihhcnJheTEsYXJyYXkyKXtpZihcIm51bWJlclwiPT10eXBlb2YgYXJyYXkxLmxlbmd0aCYmYXJyYXkxLmxlbmd0aD49MCYmXCJudW1iZXJcIj09dHlwZW9mIGFycmF5Mi5sZW5ndGgmJmFycmF5Mi5sZW5ndGg+PTApe3ZhciBsZW5ndGgxPU1hdGguZmxvb3IoYXJyYXkxLmxlbmd0aCksbGVuZ3RoMj1NYXRoLmZsb29yKGFycmF5Mi5sZW5ndGgpLGk9MDtmb3IoYXJyYXkxLmxlbmd0aD1sZW5ndGgxK2xlbmd0aDI7aTxsZW5ndGgyOysraSlhcnJheTIuaGFzT3duUHJvcGVydHkoaSkmJihhcnJheTFbbGVuZ3RoMStpXT1hcnJheTJbaV0pfX0sc2ltcGxlSW5oZXJpdGFuY2U9ZnVuY3Rpb24oY2hpbGQscGFyZW50KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBjaGlsZHx8XCJmdW5jdGlvblwiIT10eXBlb2YgcGFyZW50KXRocm93IG5ldyBUeXBlRXJyb3IoXCJDaGlsZCBhbmQgUGFyZW50IG11c3QgYmUgZnVuY3Rpb24gdHlwZVwiKTtjaGlsZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKSxjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2hpbGR9LFN5bWJvbD1mdW5jdGlvbiBTeW1ib2woZGVzYyl7aWYoZGVzYz12b2lkIDA9PT1kZXNjP1wiXCI6U3RyaW5nKGRlc2MpLHRoaXMgaW5zdGFuY2VvZiBTeW1ib2wpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvclwiKTtyZXR1cm4gc2V0dXBTeW1ib2xJbnRlcm5hbHMoT2JqZWN0LmNyZWF0ZShTeW1ib2wucHJvdG90eXBlKSxkZXNjKX07ZGVmaW5lUHJvcGVydGllcyhTeW1ib2wse2Zvcjp7dmFsdWU6ZnVuY3Rpb24oa2V5KXtrZXk9U3RyaW5nKGtleSk7Zm9yKHZhciByZWNvcmQscmVnaXN0cnlMZW5ndGg9Z2xvYmFsU3ltYm9sUmVnaXN0cnkubGVuZ3RoLGk9MDtpPHJlZ2lzdHJ5TGVuZ3RoOysraSlpZigocmVjb3JkPWdsb2JhbFN5bWJvbFJlZ2lzdHJ5W2ldKS5rZXk9PT1rZXkpcmV0dXJuIHJlY29yZC5zeW1ib2w7cmV0dXJuIHJlY29yZD17a2V5OmtleSxzeW1ib2w6U3ltYm9sKGtleSl9LGdsb2JhbFN5bWJvbFJlZ2lzdHJ5LnB1c2gocmVjb3JkKSxyZWNvcmQuc3ltYm9sfSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9LGtleUZvcjp7dmFsdWU6ZnVuY3Rpb24oc3ltYm9sKXtpZighRVM2LmlzU3ltYm9sKHN5bWJvbCkpdGhyb3cgbmV3IFR5cGVFcnJvcihTdHJpbmcoc3ltYm9sKStcIiBpcyBub3QgYSBzeW1ib2xcIik7Zm9yKHZhciByZWNvcmQscmVnaXN0cnlMZW5ndGg9Z2xvYmFsU3ltYm9sUmVnaXN0cnkubGVuZ3RoLGk9MDtpPHJlZ2lzdHJ5TGVuZ3RoOysraSlpZigocmVjb3JkPWdsb2JhbFN5bWJvbFJlZ2lzdHJ5W2ldKS5zeW1ib2w9PT1zeW1ib2wpcmV0dXJuIHJlY29yZC5rZXl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0saGFzSW5zdGFuY2U6e3ZhbHVlOlN5bWJvbChcIlN5bWJvbC5oYXNJbnN0YW5jZVwiKX0saXNDb25jYXRTcHJlYWRhYmxlOnt2YWx1ZTpTeW1ib2woXCJTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlXCIpfSxpdGVyYXRvcjp7dmFsdWU6U3ltYm9sKFwiU3ltYm9sLml0ZXJhdG9yXCIpfSx0b1N0cmluZ1RhZzp7dmFsdWU6U3ltYm9sKFwiU3ltYm9sLnRvU3RyaW5nVGFnXCIpfX0pLFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkBAX19fX19cIit0aGlzLl9pZCtcIl9fX19fXCJ9LFN5bWJvbC5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxkZWZpbmVQcm9wZXJ0eShJdGVyYXRvci5wcm90b3R5cGUsU3ltYm9sLml0ZXJhdG9yLnRvU3RyaW5nKCkse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHNpbXBsZUluaGVyaXRhbmNlKEFycmF5SXRlcmF0b3IsSXRlcmF0b3IpLHNpbXBsZUluaGVyaXRhbmNlKFN0cmluZ0l0ZXJhdG9yLEl0ZXJhdG9yKSxkZWZpbmVQcm9wZXJ0eShBcnJheUl0ZXJhdG9yLnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcudG9TdHJpbmcoKSx7dmFsdWU6XCJBcnJheSBJdGVyYXRvclwiLGNvbmZpZ3VyYWJsZTohMH0pLGRlZmluZVByb3BlcnR5KFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcudG9TdHJpbmcoKSx7dmFsdWU6XCJTdHJpbmcgSXRlcmF0b3JcIixjb25maWd1cmFibGU6ITB9KSxBcnJheUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgQXJyYXlJdGVyYXRvcikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1ldGhvZCBBcnJheSBJdGVyYXRvci5wcm90b3R5cGUubmV4dCBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyIFwiK1N0cmluZyh0aGlzKSk7dmFyIG5leHRWYWx1ZTtyZXR1cm4tMT09PXRoaXMuX25leHRJbmRleD97ZG9uZTohMCx2YWx1ZTp2b2lkIDB9OlwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9hcnJheS5sZW5ndGgmJnRoaXMuX2FycmF5Lmxlbmd0aD49MCYmdGhpcy5fbmV4dEluZGV4PE1hdGguZmxvb3IodGhpcy5fYXJyYXkubGVuZ3RoKT8oMT09PXRoaXMuX2ZsYWc/bmV4dFZhbHVlPVt0aGlzLl9uZXh0SW5kZXgsdGhpcy5fYXJyYXlbdGhpcy5fbmV4dEluZGV4XV06Mj09PXRoaXMuX2ZsYWc/bmV4dFZhbHVlPXRoaXMuX2FycmF5W3RoaXMuX25leHRJbmRleF06Mz09PXRoaXMuX2ZsYWcmJihuZXh0VmFsdWU9dGhpcy5fbmV4dEluZGV4KSx0aGlzLl9uZXh0SW5kZXgrKyx7ZG9uZTohMSx2YWx1ZTpuZXh0VmFsdWV9KToodGhpcy5fbmV4dEluZGV4PS0xLHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pfSxTdHJpbmdJdGVyYXRvci5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFN0cmluZ0l0ZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWV0aG9kIFN0cmluZyBJdGVyYXRvci5wcm90b3R5cGUubmV4dCBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyIFwiK1N0cmluZyh0aGlzKSk7dmFyIG5leHRWYWx1ZSxzdHJpbmdPYmplY3Q9bmV3IFN0cmluZyh0aGlzLl9zdHJpbmcpO3JldHVybi0xPT09dGhpcy5fbmV4dEluZGV4P3tkb25lOiEwLHZhbHVlOnZvaWQgMH06dGhpcy5fbmV4dEluZGV4PHN0cmluZ09iamVjdC5sZW5ndGg/KG5leHRWYWx1ZT1zdHJpbmdPYmplY3RbdGhpcy5fbmV4dEluZGV4XSx0aGlzLl9uZXh0SW5kZXgrKyx7ZG9uZTohMSx2YWx1ZTpuZXh0VmFsdWV9KToodGhpcy5fbmV4dEluZGV4PS0xLHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pfTt2YXIgU3ByZWFkT3BlcmF0b3JJbXBsPWZ1bmN0aW9uKHRhcmdldCx0aGlzQXJnKXt0aGlzLl90YXJnZXQ9dGFyZ2V0LHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl90aGlzQXJnPXRoaXNBcmd9O1NwcmVhZE9wZXJhdG9ySW1wbC5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gc2xpY2UuY2FsbChhcmd1bWVudHMpLmZvckVhY2goZnVuY3Rpb24oaXRlcmFibGUpe0VTNi5mb3JPZihpdGVyYWJsZSxmdW5jdGlvbih2YWx1ZSl7c2VsZi5fdmFsdWVzLnB1c2godmFsdWUpfSl9KSxzZWxmfSxTcHJlYWRPcGVyYXRvckltcGwucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIHNsaWNlLmNhbGwoYXJndW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtzZWxmLl92YWx1ZXMucHVzaCh2YWx1ZSl9KSxzZWxmfSxTcHJlYWRPcGVyYXRvckltcGwucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odGhpc0FyZyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpcy5fdGFyZ2V0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJUYXJnZXQgaXMgbm90IGEgZnVuY3Rpb25cIik7cmV0dXJuIHRoaXNBcmc9YXJndW1lbnRzLmxlbmd0aDw9MD90aGlzLl90aGlzQXJnOnRoaXNBcmcsdGhpcy5fdGFyZ2V0LmFwcGx5KHRoaXNBcmcsdGhpcy5fdmFsdWVzKX0sU3ByZWFkT3BlcmF0b3JJbXBsLnByb3RvdHlwZS5uZXc9ZnVuY3Rpb24oKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0aGlzLl90YXJnZXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRhcmdldCBpcyBub3QgYSBjb25zdHJ1Y3RvclwiKTt2YXIgdGVtcCxyZXR1cm5WYWx1ZTtyZXR1cm4gdGVtcD1PYmplY3QuY3JlYXRlKHRoaXMuX3RhcmdldC5wcm90b3R5cGUpLHJldHVyblZhbHVlPXRoaXMuX3RhcmdldC5hcHBseSh0ZW1wLHRoaXMuX3ZhbHVlcyksaXNPYmplY3QocmV0dXJuVmFsdWUpP3JldHVyblZhbHVlOnRlbXB9LFNwcmVhZE9wZXJhdG9ySW1wbC5wcm90b3R5cGUuYXJyYXk9ZnVuY3Rpb24oKXtpZighaXNBcnJheSh0aGlzLl90YXJnZXQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUYXJnZXQgaXMgbm90IGEgYXJyYXlcIik7cmV0dXJuIHB1c2guYXBwbHkodGhpcy5fdGFyZ2V0LHRoaXMuX3ZhbHVlcyksdGhpcy5fdGFyZ2V0fTtyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhFUzYse2lzU3ltYm9sOnt2YWx1ZTpmdW5jdGlvbihzeW1ib2wpe3JldHVybiBzeW1ib2wgaW5zdGFuY2VvZiBTeW1ib2wmJmZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuITA9PT1zeW1ib2wuX2lzU3ltYm9sJiZcIm51bWJlclwiPT10eXBlb2Ygc3ltYm9sLl9pZCYmXCJzdHJpbmdcIj09dHlwZW9mIHN5bWJvbC5fZGVzY3JpcHRpb259KHN5bWJvbCl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0saW5zdGFuY2VPZjp7dmFsdWU6ZnVuY3Rpb24ob2JqZWN0LGNvbnN0cnVjdG9yKXtpZighaXNPYmplY3QoY29uc3RydWN0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJSaWdodC1oYW5kIHNpZGUgb2YgJ2luc3RhbmNlb2YnIGlzIG5vdCBhbiBvYmplY3RcIik7dmFyIGhhc0luc3RhbmNlU3ltYm9sUHJvcD1jb25zdHJ1Y3RvcltTeW1ib2wuaGFzSW5zdGFuY2VdO2lmKHZvaWQgMD09PWhhc0luc3RhbmNlU3ltYm9sUHJvcClyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgaGFzSW5zdGFuY2VTeW1ib2xQcm9wKXRocm93IG5ldyBUeXBlRXJyb3IodHlwZW9mIGhhc0luc3RhbmNlU3ltYm9sUHJvcCtcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtyZXR1cm4gaGFzSW5zdGFuY2VTeW1ib2xQcm9wLmNhbGwoY29uc3RydWN0b3Isb2JqZWN0KX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSxmb3JPZjp7dmFsdWU6ZnVuY3Rpb24oaXRlcmFibGUsY2FsbGJhY2ssdGhpc0FyZyl7aWYoY2FsbGJhY2s9XCJmdW5jdGlvblwiIT10eXBlb2YgY2FsbGJhY2s/ZW1wdHlGdW5jdGlvbjpjYWxsYmFjayxcImZ1bmN0aW9uXCIhPXR5cGVvZiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKXRocm93IG5ldyBUeXBlRXJyb3IoXCJJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO3ZhciBpdGVyYXRpb25SZXN1bHQsaXRlcmF0b3I9aXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGl0ZXJhdG9yLm5leHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIi5pdGVyYXRvci5uZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCIpO2Zvcig7Oyl7aWYoaXRlcmF0aW9uUmVzdWx0PWl0ZXJhdG9yLm5leHQoKSwhaXNPYmplY3QoaXRlcmF0aW9uUmVzdWx0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiSXRlcmF0b3IgcmVzdWx0IFwiK2l0ZXJhdGlvblJlc3VsdCtcIiBpcyBub3QgYW4gb2JqZWN0XCIpO2lmKGl0ZXJhdGlvblJlc3VsdC5kb25lKWJyZWFrO2NhbGxiYWNrLmNhbGwodGhpc0FyZyxpdGVyYXRpb25SZXN1bHQudmFsdWUpfX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSxzcHJlYWRPcGVyYXRvcjp7dmFsdWU6ZnVuY3Rpb24odGFyZ2V0LHRoaXNBcmcpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRhcmdldCYmIWlzQXJyYXkodGFyZ2V0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ByZWFkIG9wZXJhdG9yIG9ubHkgc3VwcG9ydHMgb24gYXJyYXkgYW5kIGZ1bmN0aW9uIG9iamVjdHMgYXQgdGhpcyBtb21lbnRcIik7cmV0dXJuIG5ldyBTcHJlYWRPcGVyYXRvckltcGwodGFyZ2V0LHRoaXNBcmcpfSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZGVmaW5lUHJvcGVydHkoZ2xvYmFsLFwiU3ltYm9sXCIse3ZhbHVlOlN5bWJvbCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxkZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsU3ltYm9sLmhhc0luc3RhbmNlLnRvU3RyaW5nKCkse3ZhbHVlOmZ1bmN0aW9uKGluc3RhbmNlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzJiZpbnN0YW5jZSBpbnN0YW5jZW9mIHRoaXN9fSksZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLFwiY29uY2F0XCIse3ZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpc3x8bnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5LnByb3RvdHlwZS5jb25jYXQgY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkXCIpO3ZhciBzZWxmPU9iamVjdCh0aGlzKSx0YXJnZXRzPXNsaWNlLmNhbGwoYXJndW1lbnRzKSxvdXRwdXRzPVtdO3JldHVybiB0YXJnZXRzLnVuc2hpZnQoc2VsZiksdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHRhcmdldCl7aXNPYmplY3QodGFyZ2V0KT92b2lkIDAhPT10YXJnZXRbU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZV0/dGFyZ2V0W1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVdP2FwcGVuZEFycmF5KG91dHB1dHMsdGFyZ2V0KTpvdXRwdXRzLnB1c2godGFyZ2V0KTppc0FycmF5KHRhcmdldCk/YXBwZW5kQXJyYXkob3V0cHV0cyx0YXJnZXQpOm91dHB1dHMucHVzaCh0YXJnZXQpOm91dHB1dHMucHVzaCh0YXJnZXQpfSksb3V0cHV0c30sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSxcInRvU3RyaW5nXCIse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXN8fG51bGw9PT10aGlzP29iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk6XCJzdHJpbmdcIj09dHlwZW9mIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXT9cIltvYmplY3QgXCIrdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddK1wiXVwiOm9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxTeW1ib2wuaXRlcmF0b3IudG9TdHJpbmcoKSx7dmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0XCIpO3ZhciBzZWxmPU9iamVjdCh0aGlzKTtyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Ioc2VsZiwyKX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZGVmaW5lUHJvcGVydHkoQXJyYXksXCJmcm9tXCIse3ZhbHVlOmZ1bmN0aW9uKGFycmF5TGlrZSxtYXBGbix0aGlzQXJnKXt2YXIgY29uc3RydWN0b3IsbGVuZ3RoLG91dHB1dHMsaT0wO2lmKGNvbnN0cnVjdG9yPWlzQ2FsbGFibGUodGhpcyk/dGhpczpBcnJheSx2b2lkIDA9PT1hcnJheUxpa2V8fG51bGw9PT1hcnJheUxpa2UpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtpZihhcnJheUxpa2U9T2JqZWN0KGFycmF5TGlrZSksdm9pZCAwPT09bWFwRm4pbWFwRm49c2ltcGxlRnVuY3Rpb247ZWxzZSBpZighaXNDYWxsYWJsZShtYXBGbikpdGhyb3cgbmV3IFR5cGVFcnJvcihtYXBGbitcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtpZih2b2lkIDA9PT1hcnJheUxpa2VbU3ltYm9sLml0ZXJhdG9yXSl7aWYoIShcIm51bWJlclwiPT10eXBlb2YgYXJyYXlMaWtlLmxlbmd0aCYmYXJyYXlMaWtlLmxlbmd0aD49MCkpcmV0dXJuKG91dHB1dHM9bmV3IGNvbnN0cnVjdG9yKDApKS5sZW5ndGg9MCxvdXRwdXRzO2ZvcihsZW5ndGg9TWF0aC5mbG9vcihhcnJheUxpa2UubGVuZ3RoKSwob3V0cHV0cz1uZXcgY29uc3RydWN0b3IobGVuZ3RoKSkubGVuZ3RoPWxlbmd0aDtpPGxlbmd0aDsrK2kpb3V0cHV0c1tpXT1tYXBGbi5jYWxsKHRoaXNBcmcsYXJyYXlMaWtlW2ldKX1lbHNlKG91dHB1dHM9bmV3IGNvbnN0cnVjdG9yKS5sZW5ndGg9MCxFUzYuZm9yT2YoYXJyYXlMaWtlLGZ1bmN0aW9uKHZhbHVlKXtvdXRwdXRzLmxlbmd0aCsrLG91dHB1dHNbb3V0cHV0cy5sZW5ndGgtMV09bWFwRm4uY2FsbCh0aGlzQXJnLHZhbHVlKX0pO3JldHVybiBvdXRwdXRzfSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxkZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsXCJlbnRyaWVzXCIse3ZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpc3x8bnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTt2YXIgc2VsZj1PYmplY3QodGhpcyk7cmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHNlbGYsMSl9LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxcImtleXNcIix7dmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0XCIpO3ZhciBzZWxmPU9iamVjdCh0aGlzKTtyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Ioc2VsZiwzKX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSxTeW1ib2wuaXRlcmF0b3IudG9TdHJpbmcoKSx7dmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZFwiKTtyZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKFN0cmluZyh0aGlzKSwwKX0sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksRVM2fSk7IiwiLyoqXG4gKiBKYXZhU2NyaXB0IGRlcGVuZGVuY2llc1xuICovXG5cbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbnJlcXVpcmUoJ2hhbW1lcmpzJyk7XG4vLyByZXF1aXJlKCdwamF4Jyk7XG5yZXF1aXJlKCdvYmplY3RGaXRQb2x5ZmlsbCcpO1xuXG4vKipcbiAqIEdsb2JhbCBjdXN0b20gZGVwZW5kZW5jaWVzXG4gKi9cbnJlcXVpcmUoJy4vLi4vZ2xvYmFsL3BvbHlmaWxscy9ldmVudFBvbHlGaWxsJyk7XG5yZXF1aXJlKCcuLy4uL2dsb2JhbC9wb2x5ZmlsbHMvaXNJbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLy4uL2dsb2JhbC9wb2x5ZmlsbHMvcHJvbWlzZScpO1xucmVxdWlyZSgnLi8uLi9nbG9iYWwvcG9seWZpbGxzL3N5bWJvbC1lczYubWluJyk7XG5cblxuLyoqXG4gKiAgU2l0ZSB3aWRlIGZ1bmN0aW9uYWxpdHlcbiAqL1xucmVxdWlyZSgnLi9nbG9iYWwvaGVscGVycycpO1xucmVxdWlyZSgnLi9nbG9iYWwvYnJvd3NlckhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vZ2xvYmFsL3BhZ2V0cmFuc2l0aW9uSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9nbG9iYWwvcmVzaXplSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9nbG9iYWwvc2Nyb2xsSGFuZGxlcicpO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbiAqL1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnknKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jb29raWVIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvaW1hZ2VSYWNrSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2lucHV0SGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL21hcHNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvbmF2aWdhdGlvbkhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zY3JvbGxUb0hhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy9zZWFyY2hIYW5kbGVyJyk7XG4vLyByZXF1aXJlKCcuL2NvbXBvbmVudHMvc2hhcmVCdXR0b25zSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3NsaWRlUHJvamVjdG9ySGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NsaWVudFJldmlld3NIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdXNwSW1wcmVzc2lvbnNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXInKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIHwgUHJldmVudCBCb3RzIGhhbmRsZXJcbiB8XG4gfCBXZSBuYW1lZCB0aGlzIGNob2NvbGF0ZSBmYWN0b3J5IGFuZCBiZWxvbmdpbmcgY29uZnVzaW5nIGpzIGhvb2tzXG4gfCB0byBwcmV2ZW50IHNtYXJ0IGJvdHMgZnJvbSBibG9ja2luZyB0aGVzZSB2YXJpYWJsZSBvciBmdW5jdGlvbnMuXG4gfFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENob2NvbGF0ZUZhY3RvcnkgPSB7XG5cbiAgICBiYW5uZWRWaXNpdG9yOiBbXSxcblxuICAgIC8qKiBHZXQgYWxsIHRoZSBjaG9jb2xhdGUgZmFjdG9yeSBhbmQgc3RhcnRcbiAgICAgKiAgTG9vcGluZyB0aHJvdWdoIHRob3NlIHN0YXJ0IGZsYXNoaW5nIHRpY2tldHNcbiAgICAgKi9cbiAgICBlbnRlcjogZnVuY3Rpb24oKVxuICAgIHtcblxuICAgICAgICBjb25zdCBjaG9jb2xhdGVGYWN0b3JpZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2hvY29sYXRlLWZhY3RvcnknKTtcblxuICAgICAgICBpZihpc3NldChjaG9jb2xhdGVGYWN0b3JpZXMpKXtcblxuICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXMgPSBjaG9jb2xhdGVGYWN0b3JpZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzOyBpKyspe1xuXG4gICAgICAgICAgICAgICAgY29uc3QgQ2hvY29sYXRlQmFyID0gY2hvY29sYXRlRmFjdG9yaWVzW2ldO1xuICAgICAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2ZsYXNoVGlja2V0KENob2NvbGF0ZUJhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgZmFjdG9yeSBoYXMgYSBnb2xkZW4gdGlja2V0XG4gICAgICogVGhlbiB3ZSBjYW4gbWFrZSB0aGVtIGdvIG9uIHRoZSB0b3VyIGlmIHRoZXJlIGhhcyBiZWVuIGNsaWNrIG9uIHRoZSB0aWNrZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVCYXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9mbGFzaFRpY2tldDogZnVuY3Rpb24gKGNob2NvbGF0ZUJhcikge1xuXG4gICAgICAgIC8vIFRyeSBnZXQgdGhlIHRpY2tldCBmcm9tIHRoZSBjaG9jb2xhdGVCYXJcbiAgICAgICAgY29uc3QgZ29sZGVuVGlja2V0ID0gY2hvY29sYXRlQmFyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1nb2xkZW4tdGlja2V0Jyk7XG5cbiAgICAgICAgLy8gT25seSBjb250aW51ZSBpZiBjaG9jb2xhdGUgYmFyIGhhcyBhIGdvbGRlbiB0aWNrZXRcbiAgICAgICAgaWYoaXNzZXQoZ29sZGVuVGlja2V0KSl7XG5cbiAgICAgICAgICAgIGdvbGRlblRpY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5LmVuam95VGhlVG91cihjaG9jb2xhdGVCYXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUbyBiYWQsIG5vIGdvbGRlbiB0aWNrZXRzIGhhcyBiZWVuIGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSB0b3VyIHRocm91Z2ggdGhlIGZhY3RvcnlcbiAgICAgKiBBbmQgZ2V0IHRoZSBuYW1lcyBhbmQgcHJvcGVydGllcyBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXBcbiAgICAgKiBJZiB0aGVyZSBhcmUgbWVtYmVycyBpbiB0aGUgZ3JvdXAgb2YgY291cnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqL1xuICAgIGVuam95VGhlVG91cihjaG9jb2xhdGVGYWN0b3J5KXtcblxuICAgICAgICAvLyBBc2sgZm9yIHRoZSB0b3VyIGdyb3VwXG4gICAgICAgIGNvbnN0IHRvdXJHcm91cCA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHRleHRhcmVhJyk7XG5cbiAgICAgICAgaWYoaXNzZXQodG91ckdyb3VwKSl7XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHZpc2l0b3Igd2Ugd2FudCBhIGJlbG9uZ2luZyBPb21wYSBMb29tcGFcbiAgICAgICAgICAgIGxldCBvb21wYUxvb21wYXMgPSB7fTtcbiAgICAgICAgICAgIGxldCBhbW91bnRPZk9vbXBhTG9vbXBhcyA9IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvdXJHcm91cFNpemUgPSB0b3VyR3JvdXAubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRvdXJHcm91cFNpemU7IGkrKyl7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHZpc2l0b3IgZnJvbSB0aGUgZ3JvdXBcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yID0gdG91ckdyb3VwW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gQXNrIGZvciBpdHMgbmFtZVxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JOYW1lID0gdmlzaXRvci5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2aXNpdG9yIGlzIGJhbm5lZFxuICAgICAgICAgICAgICAgIGlmKCBDaG9jb2xhdGVGYWN0b3J5Ll9pc1Zpc2l0b3JCYW5uZWQodmlzaXRvck5hbWUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIG9vbXBhTG9vbXBhc1sgdmlzaXRvck5hbWUgXSA9IENob2NvbGF0ZUZhY3RvcnkuX2dldEFycmFuZ2VtZW50KHZpc2l0b3IpO1xuICAgICAgICAgICAgICAgIGFtb3VudE9mT29tcGFMb29tcGFzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbnN1cmFuY2UgdGhhdCB0aGVyZSBhcmUgb29tcGEgbG9vbXBhc1xuICAgICAgICAgICAgaWYoYW1vdW50T2ZPb21wYUxvb21wYXMgPT09IDApIHJldHVybjtcblxuICAgICAgICAgICAgLy8gU2VuZCBzdWJtaXQgcmVxdWVzdFxuICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fZmluaXNoVG91cihvb21wYUxvb21wYXMsIGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVG8gYmFkLCBubyBtZW1iZXJzIHRvIHZpc2l0IHRoaXMgZmFjdG9yeScpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHZpc2l0b3IgbmFtZSBpc24ndCBhbGxvd1xuICAgICAqXG4gICAgICogQHBhcmFtIHZpc2l0b3JOYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNWaXNpdG9yQmFubmVkOiBmdW5jdGlvbih2aXNpdG9yTmFtZSl7XG4gICAgICAgIGlmKENob2NvbGF0ZUZhY3RvcnkuYmFubmVkVmlzaXRvci5pbmRleE9mKHZpc2l0b3JOYW1lKSAhPT0gLTEpe1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNb3N0IGdldCB2aXNpdG9yIGhhdmUgYSBub3JtYWwgYXJyYW5nZW1lbnRcbiAgICAgKiBCdXQgc29tZXRpbWVzIHRoZXJlIGFyZSBzcGVjaWFsIGNhc2VzXG4gICAgICogTGlrZSBhIFNlbGVjdG9yIG9yIGNoZWNrYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvclxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldEFycmFuZ2VtZW50OiBmdW5jdGlvbih2aXNpdG9yKVxuICAgIHtcblxuICAgICAgICBjb25zdCB2aXNpdG9yVHlwZSA9IHZpc2l0b3Iubm9kZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoICh2aXNpdG9yVHlwZSkge1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggdGhlIHRvdXJcbiAgICAgKiBJZiBzdWNjZXNzZnVsIHNob3cgdGhhbmtzIG1lc3NhZ2VcbiAgICAgKiBPciBzaG93IGRlZmluZWQgZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFja1xuICAgICAqXG4gICAgICogQHBhcmFtIGdyb3VwXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKiBAcmV0dXJucyB7Knx2b2lkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2ZpbmlzaFRvdXI6IGZ1bmN0aW9uKGdyb3VwLCBjaG9jb2xhdGVGYWN0b3J5KVxuICAgIHtcbiAgICAgICAgLy8gQWRkIHdpbGxpZSB0byB0aGUgZ3JvdXBcbiAgICAgICAgZ3JvdXAgPSBDaG9jb2xhdGVGYWN0b3J5Ll9hZGRXaWxsaWVXb25rYShncm91cCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBnYXRlIGZvciBmaW5pc2ggdGhlIHRvdXJcbiAgICAgICAgY29uc3QgZ2F0ZSA9ICcvY29udGFjdC9wcm9jZXNzJztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgQWpheC5wb3N0KGdhdGUsIGdyb3VwLCBmdW5jdGlvbiAoSHR0cFJlcXVlc3QpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShIdHRwUmVxdWVzdC5yZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEh0dHBSZXF1ZXN0LnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaG9jb2xhdGVGYWN0b3J5Ll90aGFua3NGb3JWaXNpdGluZyhyZXNwb25zZS5yZWRpcmVjdFVybCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDIyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX2dpdmVGZWVkYmFja1RvTWVtYmVycyhyZXNwb25zZS5lcnJvcnMsIGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3Vua25vd25HYXBJbkZhY3RvcnkoY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3Vua25vd25HYXBJbkZhY3RvcnkoY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIHdpbGxpZSB3b25rYSB0byB0aGUgZ3JvdXBcbiAgICAgKiBQcy4uLiBpdCBhY3R1YWxseSB0aGUgc2VjcmV0IGNvZGUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRXaWxsaWVXb25rYTogZnVuY3Rpb24oZ3JvdXApe1xuICAgICAgICBncm91cC5fd2lsbGllID0gJ3dvbmthJztcbiAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIGZlZWRiYWNrIHRvIHRoZSBkZXNpcmVkIGFyZWEuXG4gICAgICogTW9zdCBsaWtlbHkgdG8gdGhlIHZpc2l0b3IgZGlyZWN0bHksIGJ1dCBzb21ldGltZSB0byB0aGUgZmFjdG9yeSBkZXNpcmVkIGZlZWRiYWNrIGFyZWFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvcnNcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dpdmVGZWVkYmFja1RvTWVtYmVyczogZnVuY3Rpb24oZXJyb3JzLCBjaG9jb2xhdGVGYWN0b3J5KXtcblxuICAgICAgICAvLyBHcmFiIHRoZSBmYWN0b3J5IGZlZWRiYWNrIGFyZWFcbiAgICAgICAgY29uc3QgZmVlZGJhY2tBcmVhID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yKCcuanMtZXJyb3ItYXJlYScpO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGh0bWxcbiAgICAgICAgaWYoaXNzZXQoZmVlZGJhY2tBcmVhKSkgZmVlZGJhY2tBcmVhLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBwcmV2aW91cyBtYXJrZWQgamFja2V0c1xuICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyhjaG9jb2xhdGVGYWN0b3J5KTtcblxuICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goZnVuY3Rpb24odmlzaXRvcikge1xuXG4gICAgICAgICAgICBsZXQgamFja2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB2aXNpdG9yRmVlZGJhY2tBcmVhID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSG9uZXkgZWxlbWVudHMgZG9lc24ndCBoYXMgYSBhY2Nlc3NpYmxlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmKHZpc2l0b3IgIT09ICdfaG9uZXknICYmIHZpc2l0b3IgIT09ICdfc2VjcmV0Q29kZScpIHtcblxuICAgICAgICAgICAgICAgIC8vIEdyYWIgdGhlIHZpc2l0b3JcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yTm9kZSA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvcignIycgKyB2aXNpdG9yKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGphY2tldCBvZiBhIHZpc2l0b3JcbiAgICAgICAgICAgICAgICBqYWNrZXQgPSBDaG9jb2xhdGVGYWN0b3J5Ll9ncmFiVmlzaXRvckphY2tldCh2aXNpdG9yTm9kZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBmb3VuZCBnZXQgdGhlIGRlc2lyZWQgYXJlYVxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KGphY2tldCkpIHZpc2l0b3JGZWVkYmFja0FyZWEgPSBqYWNrZXQucXVlcnlTZWxlY3RvcignLmpzLWZvcm0tZWxlbWVudC1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaHRtbFxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KHZpc2l0b3JGZWVkYmFja0FyZWEpKSB2aXNpdG9yRmVlZGJhY2tBcmVhLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZmVlZGJhY2sgZm9yIHRoaXMgdmlzaXRvclxuICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrID0gZXJyb3JzW3Zpc2l0b3JdO1xuXG4gICAgICAgICAgICAvLyBTcGl0IG91dCBlYWNoIGxpbmVcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFja0Ftb3VudCA9IHZpc2l0b3JGZWVkYmFjay5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdmlzaXRvckZlZWRiYWNrQW1vdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFja0xpbmUgPSB2aXNpdG9yRmVlZGJhY2tbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBIb25leSBlbGVtZW50cyBkb2Vzbid0IGhhcyBhIGFjY2Vzc2libGUgZWxlbWVudCBhcmVhXG4gICAgICAgICAgICAgICAgaWYodmlzaXRvciAhPT0gJ19ob25leScgJiYgdmlzaXRvciAhPT0gJ19zZWNyZXRDb2RlJykge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlIGphY2tldFxuICAgICAgICAgICAgICAgICAgICBpZihpc3NldChqYWNrZXQpKSBqYWNrZXQuY2xhc3NMaXN0LmFkZCgnaGFzLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZlZWRiYWNrIHRvIHZpc2l0b3IgZmVlZGJhY2sgYXJlYSBpZiBkZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KHZpc2l0b3JGZWVkYmFja0FyZWEpKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZlZWRiYWNrQXJlYSA9IHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZlZWRiYWNrQXJlYSArPSAnPHNwYW4+JyArIGNhcGl0YWxpemVGaXJzdExldHRlcih2aXNpdG9yRmVlZGJhY2tMaW5lKSArICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gY3VycmVudEZlZWRiYWNrQXJlYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBmZWVkYmFjayB0byBmYWN0b3J5IGZlZWRiYWNrIGFyZWEgaWYgZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KGZlZWRiYWNrQXJlYSkpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZlZWRiYWNrQXJlYSA9IGZlZWRiYWNrQXJlYS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGZWVkYmFja0FyZWEgKz0gJzxsaT4nICsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZpc2l0b3JGZWVkYmFja0xpbmUpICsgJzwvbGk+JztcbiAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmlubmVySFRNTCA9IGN1cnJlbnRGZWVkYmFja0FyZWE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIHByZXZpb3VzIG1hcmtlZCBqYWNrZXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzKGNob2NvbGF0ZUZhY3RvcnkpIHtcblxuICAgICAgICBjb25zdCBtYXJrZWRKYWNrZXRzID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWVycm9yJyk7XG4gICAgICAgIGNvbnN0IG1hcmtlZEphY2tldHNBbW91bnQgPSBtYXJrZWRKYWNrZXRzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbWFya2VkSmFja2V0c0Ftb3VudDsgaSsrKXtcbiAgICAgICAgICAgIG1hcmtlZEphY2tldHNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR3JhYiB0aGUgamFja2V0IG9mIHRoZSB2aXNpdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvclxuICAgICAqIEByZXR1cm5zIHtudWxsfCp8KCgpID0+IChOb2RlIHwgbnVsbCkpfEFjdGl2ZVguSVhNTERPTU5vZGV8KE5vZGUgJiBQYXJlbnROb2RlKX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9ncmFiVmlzaXRvckphY2tldDogZnVuY3Rpb24odmlzaXRvcil7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdmlzaXRvciBpcyBkZWZpbmVkXG4gICAgICAgIGlmICghaXNzZXQodmlzaXRvcikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIERvIGxvb3Agc2V0dGluZ3NcbiAgICAgICAgY3VycmVudExheWVyID0gdmlzaXRvcjtcbiAgICAgICAgc2FmZXR5QnJlYWsgPSAwO1xuXG4gICAgICAgIC8vIEdyYWIgdGhlIG5leHQgbGF5ZXIgdGlsbCBpdCBpcyB0aGUgamFja2V0IChvciBzYWZldHlCcmVhayBoYXMgYmVlbiByZWFjaGVkXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNhZmV0eUJyZWFrKys7XG4gICAgICAgICAgICBjdXJyZW50TGF5ZXIgPSBjdXJyZW50TGF5ZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmKGN1cnJlbnRMYXllci5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLWZvcm0tZWxlbWVudCcpKSByZXR1cm4gY3VycmVudExheWVyO1xuICAgICAgICB9IHdoaWxlIChjdXJyZW50TGF5ZXIudGFnTmFtZSAhPT0gJ0JPRFknICYmIHNhZmV0eUJyZWFrIDw9IDEwKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVkaXJlY3QgdGhlIHZpc2l0b3IgdG8gdGhlIHRoYW5rcyBwYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFN0b3BcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF90aGFua3NGb3JWaXNpdGluZzogZnVuY3Rpb24gKG5leHRTdG9wKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IG5leHRTdG9wO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmtub3duIGVycm9yIG9jY3VycmVkLCBsb2cgdGhlIGVycm9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Vua25vd25HYXBJbkZhY3Rvcnk6IGZ1bmN0aW9uIChjaG9jb2xhdGVGYWN0b3J5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hvY29sYXRlRmFjdG9yeTogVW5rb3duIEVycm9yJyk7XG4gICAgfSxcbn07XG5cbkNob2NvbGF0ZUZhY3RvcnkuZW50ZXIoKTsiLCIvKiBFeGFtcGxlXG5cbmNvbnN0IGhlYWRlckltYWdlU2xpZGVyU2V0dGluZyA9IG5ldyBTbGlkZXJQcm9qZWN0b3JTZXR0aW5nKHtcbiAgICBzbGlkZXJQcm9qZWN0b3JJZDogJ2hlYWRlci1pbWFnZS1zbGlkZXInLFxuICAgIHNsaWRlUXVlcnk6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAucGxhY2Vob2xkZXIgZmlndXJlJyxcbiAgICBkb3RzOiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnNsaWRlci1uYXZpZ2F0aW9uLWxhYmVscyAubmF2aWdhdGlvbiBzcGFuJyxcbiAgICBjYXB0aW9uczogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5zbGlkZXItbmF2aWdhdGlvbi1sYWJlbHMgLmNhcHRpb24gcCcsXG4gICAgYXV0b1NsaWRlcjogdHJ1ZSxcbiAgICBzbGlkZXJJbnRlcnZhbDogNDAwMFxufSk7XG5oZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcucHJlcGFyZVBhcmFtZXRlcnMoKTtcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXIgPSBuZXcgU2xpZGVyUHJvamVjdG9yKGhlYWRlckltYWdlU2xpZGVyU2V0dGluZykuaW5pdCgpO1xuXG4gKi9cblxucmVxdWlyZSgnaGFtbWVyanMnKTtcblxuY29uc3QgQ2xpZW50UmV2aWV3c0hhbmRsZXIgPSB7XG5cbiAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGNsaWVudFJldmlld3MgPSBbXTtcblxuICAgICAgY29uc3QgY2xpZW50UmV2aWV3Q29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1jbGllbnQtcmV2aWV3cycpO1xuICAgICAgY29uc3QgY2xpZW50UmV2aWV3Q29udGFpbmVyc0xlbmd0aCA9IGNsaWVudFJldmlld0NvbnRhaW5lcnMubGVuZ3RoO1xuXG4gICAgICBmb3IobGV0IGkgPTA7IGkgPCBjbGllbnRSZXZpZXdDb250YWluZXJzTGVuZ3RoOyBpKyspe1xuXG4gICAgICAgICAgY29uc3QgY2xpZW50UmV2aWV3ID0gY2xpZW50UmV2aWV3Q29udGFpbmVyc1tpXTtcbiAgICAgICAgICBjb25zdCBjbGllbnRSZXZpZXdJZCA9IGNsaWVudFJldmlldy5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAgICAgICBpZihjbGllbnRSZXZpZXdJZCAhPT0gbnVsbCl7XG5cbiAgICAgICAgICAgICAgY2xpZW50UmV2aWV3cy5wdXNoKCBuZXcgQ2xpZW50UmV2aWV3KCB7XG4gICAgICAgICAgICAgICAgICBjbGllbnRSZXZpZXdJZDogY2xpZW50UmV2aWV3SWQsXG4gICAgICAgICAgICAgICAgICBzbGlkZVF1ZXJ5OiAnIycgKyBjbGllbnRSZXZpZXdJZCArJyAuanMtY2xpZW50LXJldmlldy1zbGlkZScsXG4gICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogJyMnICsgY2xpZW50UmV2aWV3SWQgKycgLmpzLWNsaWVudC1yZXZpZXdzLWJ1dHRvbicgLFxuICAgICAgICAgICAgICB9ICkuaW5pdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBjb25zb2xlLmxvZygnQW4gaW1hZ2Ugc2xpZGVyIGhhcyBubyBpZC4uLicpO1xuICAgICAgfVxuICB9XG59O1xuXG5DbGllbnRSZXZpZXdzSGFuZGxlci5pbml0KCk7XG5cbmZ1bmN0aW9uIENsaWVudFJldmlldyhzZXR0aW5ncykge1xuXG4gICAgLy9EZWZpbmUgU2xpZGVyUHJvamVjdG9yIG9iamVjdFxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY2xpZW50UmV2aWV3T2JqZWN0ID0gJyc7XG5cbiAgICAvL1NsaWRlUGFyYW1ldGVyc1xuICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG4gICAgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSAwO1xuICAgIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuICAgIHRoaXMuYXZhaWxhYmxlU2xpZGVzID0gMTtcbiAgICB0aGlzLnNsaWRlcyA9IFtdO1xuXG4gICAgdGhpcy5zZXR0aW5ncyA9IHt9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vQXBwZW5kIHNldHRpbmdzIHRvIHNlbGZcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgICAgIC8vQXNzaWduIG5lZWRlZCBlbGVtZW50cyBhbmQgY2FsY3VsYXRpb25zXG4gICAgICAgIHRoaXMuY2xpZW50UmV2aWV3T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5jbGllbnRSZXZpZXdJZCk7XG4gICAgICAgIHRoaXMuc2xpZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLnNsaWRlUXVlcnkpO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZVNsaWRlcyA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICAvLyBTZXQgYWN0aXZlIHNsaWRlIChhbmQgcG9zc2libGUgcHJldmlvdXMgYW5kIG5leHQgY2xhc3NlcylcbiAgICAgICAgdGhpcy5zZXRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFN3aXBlIGludGVyYWN0aW9uXG4gICAgICAgIGNvbnN0IHN3aXBlR2VzdHVyZXMgPSBuZXcgSGFtbWVyKHRoaXMuY2xpZW50UmV2aWV3T2JqZWN0KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5uZXh0U2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXBlR2VzdHVyZXMub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnByZXZpb3VzU2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgIT09ICcnKSB7XG5cbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyk7XG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCA9IG5hdmlnYXRpb25CdXR0b25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uID0gbmF2aWdhdGlvbkJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja05hdmlnYXRpb25CdXR0b24odGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIHRoaXMubmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQrKztcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGVJZCA+PSB0aGlzLmF2YWlsYWJsZVNsaWRlcykgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgfTtcblxuICAgIHRoaXMucHJldmlvdXNTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkLS07XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPCAwKSB0aGlzLmFjdGl2ZVNsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5leHRTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkICsgMTtcbiAgICAgICAgaWYgKHRoaXMubmV4dFNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkIC0gMTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNTbGlkZUlkIDwgMCkgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0U2xpZGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmb3JtIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHNlbGYuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gc2VsZi5zbGlkZXNbaV07XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBzZXQgYXR0cmlidXRlIHRvIGRlc2lyZWQgdHlwZVxuICAgICAgICAgICAgY29uc3Qgc2xpZGVPcmRlciA9IHBhcnNlSW50KHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFuZCBzZXQgYWN0aXZlIGZvciBhbGwgc2xpZGVzXG4gICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5hY3RpdmVTbGlkZUlkKSBzbGlkZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0aGUgcHJldmlvdXMgYW5kIG5leHQsIGFsc28gc2V0IHRob3NlIGNsYXNzZXNcbiAgICAgICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzbGlkZU9yZGVyICE9PSBzZWxmLnByZXZpb3VzU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgncHJldmlvdXMnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ3ByZXZpb3VzJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5uZXh0U2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnbmV4dCcpO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnbmV4dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tOYXZpZ2F0aW9uQnV0dG9uID0gZnVuY3Rpb24gKG5hdkJ1dHRvbikge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChuYXZCdXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuICAgICAgICBzZWxmLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcblxuICAgICAgICBjb25zdCBuZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5uZXh0Jyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5wcmV2aW91cycpO1xuXG4gICAgICAgIG5leHQuc2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJywgc2VsZi5uZXh0U2xpZGVJZCk7XG4gICAgICAgIHByZXZpb3VzLnNldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicsIHNlbGYucHJldmlvdXNTbGlkZUlkKTtcbiAgICB9O1xufSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDb29raWUgaGFuZGxlclxuICAgLSBQcmltYXJ5IHVzYWdlIGZvciB0b2dnbGluZyB0aGUgY29va2llIG1lc3NhZ2UgYW5kL29yIHN3aXRjaFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENvb2tpZUhhbmRsZXIgPSB7XG5cbiAgICBjb29raWVCYXIgOiBudWxsLFxuICAgIGNvb2tpZU92ZXJsYXkgOiBudWxsLFxuICAgIGNvb2tpZU1lc3NhZ2UgOiBudWxsLFxuXG4gICAgY29va2llU3dpdGNoIDogbnVsbCxcblxuICAgIGNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiA6IDQwMCxcbiAgICBhY2NlcHRUcmFja2luZyA6IGZhbHNlLFxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb29raWUgaGFuZGxlclxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgb3Igb3ZlcmxheSB0byBjb29raWVNZXNzYWdlXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtYmFyLCAuanMtY29va2llLW92ZXJsYXknKTtcblxuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgdG8gY29va2llQmFyXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1iYXInKTtcblxuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBiYXJcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVCYXIpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZUJhcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICAvLyBFbHNlIHRyeSB0byBjb25uZWN0IGNvb2tpZSBvdmVybGF5IHdpdGggdHJhY2tpbmcgdG8gY29va2llT3ZlcmxheVxuICAgICAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgIC8vIElmIGlzc2V0IGluaXQgdGhlIGZ1bmN0aW9ucyBmb3IgY29va2llIG92ZXJsYXlcbiAgICAgICAgICAgIGlmKGlzc2V0KENvb2tpZUhhbmRsZXIuY29va2llT3ZlcmxheSkpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGVpdGhlciB0eXBlIG9mIGNvb2tpZSBoYXMgYmVlbiBmb3VuZCBjaGVjayBpZiBzZXR0aW5ncyBhcmUgZGVmaW5lZFxuICAgICAgICBpZihpc3NldChDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY2hlY2tGb3JDb29raWVTZXR0aW5ncygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCBjb29raWUgc3dpdGNoIHRvIEhhbmRsZXJcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY29va2llLXN3aXRjaCcpO1xuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBzd2l0Y2hcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZVN3aXRjaCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBiYXIgYWN0aW9uc1xuICAgIGluaXRDb29raWVCYXI6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVCYXIucXVlcnlTZWxlY3RvcignLmpzLWRpc2FibGUtY29va2llLWJhcicpO1xuICAgICAgICBpZihpc3NldChjbG9zZUJ1dHRvbikpe1xuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLmNsb3NlQ29va2llTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgY29va2llIG92ZXJsYXkgYWN0aW9uc1xuICAgIGluaXRDb29raWVPdmVybGF5OiBmdW5jdGlvbigpe1xuXG4gICAgICAgIC8vIE9wZW4gdGhlIGNvb2tpZSBzZXR0aW5ncyBldmVudFxuICAgICAgICBjb25zdCBvcGVuQ29va2llU2V0dGluZ3NCdXR0b24gPSBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UucXVlcnlTZWxlY3RvcignLmpzLWNoYW5nZS1jb29raWVzLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KG9wZW5Db29raWVTZXR0aW5nc0J1dHRvbikpe1xuICAgICAgICAgICAgb3BlbkNvb2tpZVNldHRpbmdzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgQ29va2llSGFuZGxlci5vcGVuQ29va2llU2V0dGluZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlLnF1ZXJ5U2VsZWN0b3IoJy5jLWNvb2tpZS10eXBlX19pbnB1dC0tdHJhY2tpbmcnKTtcbiAgICAgICAgaWYoaXNzZXQodG9nZ2xlVHJhY2tpbmdJbnB1dCkpe1xuXG4gICAgICAgICAgICBpZih0b2dnbGVUcmFja2luZ0lucHV0LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9nZ2xlVHJhY2tpbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBDb29raWVIYW5kbGVyLnRvZ2dsZVRyYWNraW5nU2V0dGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBY2NlcHQgLyBTYXZlIGNvb2tpZXMgYnV0dG9uIGV2ZW50XG4gICAgICAgIGNvbnN0IGFjY2VwdEJ1dHRvbiA9IENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5xdWVyeVNlbGVjdG9yKCcuanMtYWNjZXB0LWNvb2tpZXMnKTtcbiAgICAgICAgaWYoaXNzZXQoYWNjZXB0QnV0dG9uKSl7XG4gICAgICAgICAgICBhY2NlcHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLnNldENvb2tpZVNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBzd2l0Y2ggYWN0aW9uc1xuICAgIGluaXRDb29raWVTd2l0Y2g6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmMtY29va2llLXR5cGVfX2lucHV0LS10cmFja2luZycpO1xuICAgICAgICBpZihpc3NldCh0b2dnbGVUcmFja2luZ0lucHV0KSl7XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBzdGF0ZSBvZiB0aGUgY29va2llIHN3aXRjaCBpbnB1dCBiZWNhdXNlIHRoZSBwb3AtdXAgaXMgZm9yY2VkIG9uIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIHdoaWxlIHRoZSBzd2l0Y2ggY2hlY2tzIGJ5IHBocCBpZiB0aGUgY29va2llIHJlYWxseSBleGlzdCBvciBub3RcbiAgICAgICAgICAgIGlmKHRvZ2dsZVRyYWNraW5nSW5wdXQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvZ2dsZVRyYWNraW5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgQ29va2llSGFuZGxlci50b2dnbGVUcmFja2luZ1NldHRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBjb29raWVzIGJ1dHRvbiBldmVudFxuICAgICAgICBjb25zdCBzYXZlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmpzLXNhdmUtY29va2llLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KHNhdmVCdXR0b24pKXtcbiAgICAgICAgICAgIHNhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uID0gMDsgLy8gT24gdGhlIHN3aXRjaCBjbGljayB3ZSB3YW50IG5vIGRlbGF5IDopXG4gICAgICAgICAgICAgICAgQ29va2llSGFuZGxlci5zZXRDb29raWVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBjaGVja0ZvckNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoQ29va2llLmdldCgnY29va2llTWVzc2FnZScpKSB7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtYWNjZXB0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY2NlcHRlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsb3NlQ29va2llTWVzc2FnZTogZnVuY3Rpb24gKCl7XG4gICAgICAgIENvb2tpZS5zZXQoJ2Nvb2tpZU1lc3NhZ2UnLCB0cnVlLCA5MCk7XG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QuYWRkKCdmYWRlLW91dCcpO1xuICAgIH0sXG5cbiAgICBvcGVuQ29va2llU2V0dGluZ3M6IGZ1bmN0aW9uICgpe1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU92ZXJsYXkucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1zZXR0aW5ncycpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWhpZGRlbicpO1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU92ZXJsYXkucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1pbmZvJykuY2xhc3NMaXN0LmFkZCgnaXMtaGlkZGVuJyk7XG4gICAgfSxcblxuICAgIHRvZ2dsZVRyYWNraW5nU2V0dGluZzogZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoQ29va2llSGFuZGxlci5hY2NlcHRUcmFja2luZyl7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldENvb2tpZVNldHRpbmdzOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gU2V0IHRyYWNraW5nIGNvb2tpZSBvciBkZWxldGUgaXQgaWYgaXNzZXQgYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIHNldHRpbmdzXG4gICAgICAgIGlmKENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcpe1xuICAgICAgICAgICAgQ29va2llLnNldCgndHJhY2tpbmdDb29raWVBY2NlcHRlZCcsICd0cnVlJywgOTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBpZihDb29raWUuZ2V0KCd0cmFja2luZ0Nvb2tpZUFjY2VwdGVkJykpe1xuICAgICAgICAgICAgICAgIENvb2tpZS5lcmFzZSgndHJhY2tpbmdDb29raWVBY2NlcHRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQ29va2llSGFuZGxlci5jbG9zZUNvb2tpZU1lc3NhZ2UoKTtcblxuICAgICAgICAvLyBSZWxvYWQgYWZ0ZXIgYW5pbWF0aW9uIHRvIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgdHJhY2tpbmcgYWZ0ZXIgYWNjZXB0aW5nIGl0XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgIH0sIENvb2tpZUhhbmRsZXIuY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICB9LFxuXG59O1xuXG5Db29raWVIYW5kbGVyLmluaXQoKTsiLCJyZXF1aXJlKCdoYW1tZXJqcycpO1xuXG5jb25zdCBJbWFnZVJhY2tIYW5kbGVyID0ge1xuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbWFnZVJhY2tFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1pbWFnZS1yYWNrJyk7XG4gICAgICAgIGNvbnN0IGltYWdlUmFja0VsZW1lbnRzTGVuZ3RoID0gaW1hZ2VSYWNrRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbWFnZVJhY2tFbGVtZW50c0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIG5ldyBJbWFnZVJhY2soaW1hZ2VSYWNrRWxlbWVudHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuXG5jbGFzcyBJbWFnZVJhY2sge1xuXG4gICAgY29uc3RydWN0b3IoaW1hZ2VSYWNrKSB7XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5yYWNrID0gaW1hZ2VSYWNrO1xuICAgICAgICB0aGlzLnNsaWRlQXJlYSA9IHRoaXMucmFjay5xdWVyeVNlbGVjdG9yKCcuanMtaW1hZ2UtcmFjay1zbGlkZScpO1xuICAgICAgICB0aGlzLml0ZW1zICA9IHRoaXMucmFjay5xdWVyeVNlbGVjdG9yQWxsKCcuanMtaW1hZ2UtcmFjay1pdGVtJyk7XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLnJhY2suZ2V0QXR0cmlidXRlKCdkYXRhLWRpcmVjdGlvbicpO1xuICAgICAgICB0aGlzLmltYWdlTG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IDA7XG4gICAgICAgIHRoaXMubWF4SXRlbVBvc2l0aW9uID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICAgIHRoaXMubWF4VHJhbnNsYXRlZCA9IDA7XG5cbiAgICAgICAgdGhpcy5zdGVwcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNCdXR0b24gPSB0aGlzLnJhY2sucXVlcnlTZWxlY3RvcignLmpzLWltYWdlLXJhY2stYnV0dG9uLnByZXZpb3VzJyk7XG4gICAgICAgIHRoaXMubmV4dEJ1dHRvbiA9IHRoaXMucmFjay5xdWVyeVNlbGVjdG9yKCcuanMtaW1hZ2UtcmFjay1idXR0b24ubmV4dCcpO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlU3RlcHMoKTtcblxuICAgICAgICBpZihpc3NldCh0aGlzLnByZXZpb3VzQnV0dG9uKSkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnByZXZpb3VzSXRlbSgpO1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0SW1hZ2VSYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGlzc2V0KHRoaXMubmV4dEJ1dHRvbikpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm5leHRJdGVtKCk7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRJbWFnZVJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5yYWNrKTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3N3aXBlIExlZnQnKTtcbiAgICAgICAgICAgIHNlbGYuc3dpcGVMZWZ0KCk7XG4gICAgICAgICAgICBzZWxmLnNldEltYWdlUmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2lwZSBSaXRoJyk7XG4gICAgICAgICAgICBzZWxmLnN3aXBlUmlnaHQoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0SW1hZ2VSYWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVib3VuY2VUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy53YWl0RGVib3VuY2UgPSA1MDA7XG5cbiAgICAgICAgLy8gRGVib3VuY2UgUmVzaXplXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZihpc3NldChzZWxmLmRlYm91bmNlVGltZW91dCkpIGNsZWFyVGltZW91dChzZWxmLmRlYm91bmNlVGltZW91dCk7XG4gICAgICAgICAgICBzZWxmLmRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5jYWxjdWxhdGVTdGVwcygpO1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0SW1hZ2VSYWNrKCk7XG4gICAgICAgICAgICB9LCBzZWxmLndhaXREZWJvdW5jZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZVN0ZXBzKCkge1xuXG4gICAgICAgIC8vUmVzdCB0aGUgc3RlcHMgYXJyYXlcbiAgICAgICAgdGhpcy5zdGVwcyA9IFtdO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZWQgdGhlIG9mZnNldCBvZiB0aGUgd2hvbGUgcmFjayB0byBrbm93IGhvdyBtdWNoIHdlIG1heSB0cmFuc2xhdGUgYXQgbW9zdFxuICAgICAgICBjb25zdCBib2R5T2Zmc2V0ID0gd2luZG93LmJvZHlPZmZzZXQodGhpcy5yYWNrKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGVkIHRoZSBhdmFpbGFibGUgdmlldyBhcmVhIG9mIHRoZSByYWNrXG4gICAgICAgIGxldCBhdmFpbGFibGVWaWV3QXJlYTtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSBhdmFpbGFibGVWaWV3QXJlYSA9IGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLSBib2R5T2Zmc2V0LmxlZnQ7XG4gICAgICAgIGVsc2UgYXZhaWxhYmxlVmlld0FyZWEgPSBib2R5T2Zmc2V0LmxlZnQgKyB0aGlzLnJhY2sub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgLy8gR2V0IHRoZSByYWNrZXQgV2lkdGhcbiAgICAgICAgbGV0IHJhY2tXaWR0aDtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSByYWNrV2lkdGggPSB0aGlzLml0ZW1zW3RoaXMuaXRlbXMubGVuZ3RoIC0gMV0ub2Zmc2V0TGVmdCArIHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGggLSAxXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgZWxzZSByYWNrV2lkdGggPSAodGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aCAtIDFdLm9mZnNldExlZnQgLSB0aGlzLnJhY2sub2Zmc2V0V2lkdGgpICogLTE7XG4gICAgICAgIHRoaXMubWF4VHJhbnNsYXRlZCA9IHJhY2tXaWR0aCAtIGF2YWlsYWJsZVZpZXdBcmVhO1xuXG4gICAgICAgIGxldCBtYXhJdGVtQ2FsY3VsYXRlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaW1hZ2VzTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGVkIGZvciBlYWNoIGl0ZW0gdGhlIG9mZnNldCBpbiB0aGUgcmFja1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG5cbiAgICAgICAgICAgIGlmKGl0ZW0ub2Zmc2V0V2lkdGggPT09IDApIGltYWdlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBsZXQgb2Zmc2V0RnJvbVJpZ2h0U2lkZTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRGcm9tTGVmdFNpZGU7XG5cbiAgICAgICAgICAgIGlmKHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJykge1xuICAgICAgICAgICAgICAgIG9mZnNldEZyb21SaWdodFNpZGUgPSBpdGVtLm9mZnNldExlZnQgKyBpdGVtLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIG9mZnNldEZyb21MZWZ0U2lkZSA9IGl0ZW0ub2Zmc2V0TGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldEZyb21SaWdodFNpZGUgPSAoKHRoaXMucmFjay5vZmZzZXRXaWR0aCAqIC0gMSkgKyAoaXRlbS5vZmZzZXRMZWZ0ICsgaXRlbS5vZmZzZXRXaWR0aCkpICogLTE7XG4gICAgICAgICAgICAgICAgb2Zmc2V0RnJvbUxlZnRTaWRlID0gKCh0aGlzLnJhY2sub2Zmc2V0V2lkdGggKiAtIDEpICsgaXRlbS5vZmZzZXRMZWZ0KSAqIC0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlc2Ugb2Zmc2V0IHRvIHRoZSBvZmZzZXQgcG9zaXRpb24gYXJyYXlcbiAgICAgICAgICAgIHRoaXMuc3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEZyb21MZWZ0U2lkZTogb2Zmc2V0RnJvbUxlZnRTaWRlLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRGcm9tUmlnaHRTaWRlOiBvZmZzZXRGcm9tUmlnaHRTaWRlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gRGVmaW5lIHRoZSBjb21wYXJlIHZhcmlhYmxlXG4gICAgICAgICAgICAvLyBFbHNlIHdlIGhhdmUgdG8gY3JlYXRlIGEgY29tcGxleCBpZiBzdGF0ZW1lbnQuLi5cbiAgICAgICAgICAgIGxldCBvZmZzZXRDb21wYXJlVmFyaWFibGU7XG4gICAgICAgICAgICBpZih0aGlzLmRpcmVjdGlvbiA9PT0gJ2x0cicpIG9mZnNldENvbXBhcmVWYXJpYWJsZSA9IG9mZnNldEZyb21SaWdodFNpZGU7XG4gICAgICAgICAgICBlbHNlIG9mZnNldENvbXBhcmVWYXJpYWJsZSA9IG9mZnNldEZyb21MZWZ0U2lkZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG1heCB0cmFuc2xhdGVkIGlzIHNtYWxsZXIgYW5kIGlzbid0IGFscmVhZHkgZGVmaW5lZFxuICAgICAgICAgICAgaWYob2Zmc2V0Q29tcGFyZVZhcmlhYmxlID4gdGhpcy5tYXhUcmFuc2xhdGVkICYmICFtYXhJdGVtQ2FsY3VsYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4SXRlbVBvc2l0aW9uID0gKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBtYXhJdGVtQ2FsY3VsYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNhbGN1bGF0ZWQgd2hlbiB0aGUgaW1hZ2VzIGFyZW4ndCBsb2FkZWRcbiAgICAgICAgaWYoaW1hZ2VzTG9hZGVkKSB0aGlzLmltYWdlTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmltYWdlTG9hZGVkKTtcblxuICAgICAgICAvLyBpZighaW1hZ2VzTG9hZGVkKXtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUud2FybihcIkltYWdlUmFjazogUmVjYWxjdWxhdGVkIHdpZHRoIGJlY2F1c2UgaW1hZ2VzIHdlcmVuJ3QgbG9hZGVkLlwiKTtcbiAgICAgICAgLy8gICAgIHNldFRpbWVvdXQoc2VsZi5jYWxjdWxhdGVTdGVwcygpLCA0MDAwKTtcbiAgICAgICAgLy8gfVxuXG4gICAgfVxuXG4gICAgbmV4dEl0ZW0oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW0rKztcbiAgICAgICAgaWYodGhpcy5jdXJyZW50SXRlbSA+PSB0aGlzLm1heEl0ZW1Qb3NpdGlvbikgIHRoaXMuY3VycmVudEl0ZW0gPSB0aGlzLm1heEl0ZW1Qb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwcmV2aW91c0l0ZW0oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW0tLTtcbiAgICAgICAgaWYodGhpcy5jdXJyZW50SXRlbSA8IDApIHRoaXMuY3VycmVudEl0ZW0gPSAwO1xuICAgIH1cblxuICAgIC8vIFdlIGhhdmUgdG8gdXNlIHRoZXNlIGludGVydmVuZSBmdW5jdGlvbnMgdG8gc3dhcCB0aGUgZnVuY3Rpb24gd2hlbiB0aGUgc2xpZGVycyBhcyBhIGRpZmZlcmVudCBkaXJlY3Rpb25cbiAgICBzd2lwZUxlZnQoKSB7XG4gICAgICAgIGlmKHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJykgdGhpcy5uZXh0SXRlbSgpO1xuICAgICAgICBlbHNlIHRoaXMucHJldmlvdXNJdGVtKCk7XG4gICAgfVxuXG4gICAgc3dpcGVSaWdodCgpIHtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSB0aGlzLnByZXZpb3VzSXRlbSgpO1xuICAgICAgICBlbHNlIHRoaXMubmV4dEl0ZW0oKTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZVJhY2soKSB7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaW1hZ2UgYXJlIGxvYWQgd2hlbiBpbnRlcmFjdGlvblxuICAgICAgICBpZighdGhpcy5pbWFnZUxvYWRlZCl7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJJbWFnZVJhY2s6IFJlY2FsY3VsYXRlZCBiZWNhdXNlIGltYWdlcyB3ZXJlbid0IGxvYWRlZCB5ZXQuXCIpO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVTdGVwcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5leHRPZmZzZXRQb3NpdGlvbjtcbiAgICAgICAgaWYodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSBuZXh0T2Zmc2V0UG9zaXRpb24gPSAnLScgKyB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudEl0ZW1dLm9mZnNldEZyb21MZWZ0U2lkZTtcbiAgICAgICAgZWxzZSBuZXh0T2Zmc2V0UG9zaXRpb24gPSB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudEl0ZW1dLm9mZnNldEZyb21SaWdodFNpZGU7XG5cbiAgICAgICAgdGhpcy5zbGlkZUFyZWEuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoJyArIG5leHRPZmZzZXRQb3NpdGlvbiArICdweCknO1xuICAgIH1cbn1cblxuSW1hZ2VSYWNrSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBJbnB1dCBoYW5kbGVyXG5cbiAgICBUaGlzIGhhbmRsZXIgY2FuIGJlIHJlbW92ZSB3aGVuIHRoZSBjc3Mgc3VwcG9ydCBmb3IgOmZvY3VzLXdpdGhpbiBpcyBiZXR0ZXJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBJbnB1dEhhbmRsZXIgPSB7XG5cbiAgICBpbnB1dEZpZWxkczogbnVsbCxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIGZvcm0gaW5wdXRzXG4gICAgICAgIElucHV0SGFuZGxlci5pbnB1dEZpZWxkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm0gaW5wdXQsIGZvcm0gdGV4dGFyZWEnKTtcblxuICAgICAgICBjb25zdCBpbnB1dExlbmd0aCA9IElucHV0SGFuZGxlci5pbnB1dEZpZWxkcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSsrKXtcblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBJbnB1dEhhbmRsZXIuaW5wdXRGaWVsZHNbaV07XG4gICAgICAgICAgICBjb25zdCBpbnB1dElkID0gaW5wdXQuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBpZCBvbiB0aGUgaW5wdXRcbiAgICAgICAgICAgIGlmKGlzc2V0KGlucHV0SWQpKXtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGFiZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtIGxhYmVsW2Zvcj1cIicraW5wdXRJZCsnXCJdJyk7XG5cbiAgICAgICAgICAgICAgICAvLyAvLyBBbmQgaWYgdGhlcmUgaXMgYSBiZWxvbmdpbmcgbGFiZWxcbiAgICAgICAgICAgICAgICBpZihpc3NldChpbnB1dExhYmVsKSl7XG4gICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5hZGRFdmVudExpc3RlbmVyc1RvSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFkZEV2ZW50TGlzdGVuZXJzVG9JbnB1dCA6IGZ1bmN0aW9uKGlucHV0KVxuICAgIHtcbiAgICAgICAgLy8gQWRkIHRoZSBmaWxsIGNsYXNzIGFuZCB0cmlnZ2VyIHJlbW92ZUZvY3VzIHNvIHRoZSBpbnB1dCB3aWxsIGJlIGF1dG9tYXRpYyBiZSBtYXJrZWQgYXMgZmlsbGVkIG9yIG5vdFxuICAgICAgICBwYXJlbnRFbGVtZW50ID0gaW5wdXQucGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWxsZWQnKTtcbiAgICAgICAgSW5wdXRIYW5kbGVyLnJlbW92ZUZvY3VzKGlucHV0KTtcblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgLy8gV2UgbG9vcCB0aHJvdWdoIHRoZSBpbnB1dCBlbGVtZW50cyBiZWNhdXNlIGF1dG9jb21wbGV0ZSAob24gY2hyb21lKSB0cmlnZ2VycyBhbCB0aGUgZm9jdXMgZWxlbWVudHMgYnV0IG5vbmUgZm9jdXMgb3V0XG4gICAgICAgICAgICBjb25zdCBpbnB1dExlbmd0aCA9IElucHV0SGFuZGxlci5pbnB1dEZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9vcGVkSW5wdXQgPSBJbnB1dEhhbmRsZXIuaW5wdXRGaWVsZHNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGFkZCBmb2N1cyBvbiB0aGlzIGZvY3VzZWQgZWxlbWVudFxuICAgICAgICAgICAgICAgIGlmKGxvb3BlZElucHV0ID09PSBpbnB1dCl7XG4gICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5hZGRGb2N1cyh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGZvY3VzIG9uIGFsbCBvdGhlciBpbnB1dC90ZXh0YXJlYSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5yZW1vdmVGb2N1cyhsb29wZWRJbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgSW5wdXRIYW5kbGVyLnJlbW92ZUZvY3VzKHRoaXMpO1xuICAgICAgICB9KTtcblxuICAgIH0sXG5cbiAgICBhZGRGb2N1cyAgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgaWYoaXNzZXQoaW5wdXQpKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0SWQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSBpbnB1dC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZpbGxlZCcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGVycm9yIG1lc3NhZ2UgcmVtb3ZlIGl0IG9uIGZvY3VzXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtIC5lcnJvci1tZXNzYWdlIycgKyBpbnB1dElkICsgJy1lcnJvcicpO1xuICAgICAgICAgICAgaWYgKGlzc2V0KGVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnZmFkZS1vdXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIFJlc2V0IHRoZSBsYWJlbCBsb2NhdGlvbiBvbmx5IGlmIHRoZSBpbnB1dCBpcyBlbXB0eVxuICAgIHJlbW92ZUZvY3VzIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmKGlzc2V0KGlucHV0KSl7XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IGlucHV0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcblxuICAgICAgICAgICAgaWYoIWlzc2V0KGlucHV0VmFsdWUpIHx8IGlucHV0VmFsdWUgPT09ICcnKXtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxufTtcblxuSW5wdXRIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEdvb2dsZSBNYXBzIGhhbmRsZXJcbiAgICAtIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L2FkZGluZy1hLWdvb2dsZS1tYXBcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBNYXBzSGFuZGxlciA9IHtcblxuICAgIG1hcDogJycsXG4gICAga2V5OiAnQUl6YVN5QnY2RkpIbjIzTHozUzBqOVQxRFlXcjU3elRCVS1UMG9ZJyxcbiAgICBsb2NhdGlvbjoge2xhdDogNTEuMjYxODIyMiwgbG5nOiA1LjU5NjU1Mzh9LFxuICAgIHN0eWxpbmc6ICcnLFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBHZXQgbWFwIGJ5IGlkXG4gICAgICAgIE1hcHNIYW5kbGVyLm1hcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXAnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhIG1hcCBpcyBkZWZpbmVkXG4gICAgICAgIGlmIChpc3NldChNYXBzSGFuZGxlci5tYXApKSB7XG5cbiAgICAgICAgICAgIGlmKE1hcHNIYW5kbGVyLm1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpKSBNYXBzSGFuZGxlci5sb2NhdGlvbi5sYXQgPSBwYXJzZUZsb2F0KE1hcHNIYW5kbGVyLm1hcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpKTtcbiAgICAgICAgICAgIGlmKE1hcHNIYW5kbGVyLm1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxuZycpKSBNYXBzSGFuZGxlci5sb2NhdGlvbi5sbmcgPSBwYXJzZUZsb2F0KE1hcHNIYW5kbGVyLm1hcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxuZycpKTtcblxuICAgICAgICAgICAgTWFwc0hhbmRsZXIuc2V0Q3VzdG9tU3R5bGluZygpO1xuXG4gICAgICAgICAgICAvLyBTZWUgaWYgZ29vZ2xlIHZhcmlhYmxlIGV4aXN0c1xuICAgICAgICAgICAgaWYgKHR5cGVvZihnb29nbGUpID09ICd1bmRlZmluZWQnIHx8IHR5cGVvZihnb29nbGUubWFwcykgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgICAgIGdldFNjcmlwdCgnaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0nICsgTWFwc0hhbmRsZXIua2V5LCBNYXBzSGFuZGxlci5kcmF3TWFwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTWFwc0hhbmRsZXIuZHJhd01hcCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkcmF3TWFwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG1hcFxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKE1hcHNIYW5kbGVyLm1hcCwge1xuICAgICAgICAgICAgem9vbTogMTEsXG4gICAgICAgICAgICBjZW50ZXI6IE1hcHNIYW5kbGVyLmxvY2F0aW9uLFxuICAgICAgICAgICAgZGlzYWJsZURlZmF1bHRVSTogdHJ1ZSxcbiAgICAgICAgICAgIHN0eWxlczogTWFwc0hhbmRsZXIuc3R5bGluZ1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWRkIGEgbWFya2VyXG4gICAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICAgICAgcG9zaXRpb246IE1hcHNIYW5kbGVyLmxvY2F0aW9uLFxuICAgICAgICAgICAgbWFwOiBtYXBcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHNldEN1c3RvbVN0eWxpbmc6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBNYXBzSGFuZGxlci5zdHlsaW5nID1cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2lcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiIzc0NzQ3NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kuYXR0cmFjdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZjM4ZWIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLmdvdmVybm1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2NlZDdkYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5tZWRpY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmE1YThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kucGFya1wiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjYzdlNWM4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnBsYWNlX29mX3dvcnNoaXBcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2Q2Y2JjN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5zY2hvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2M0YzllOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5zcG9ydHNfY29tcGxleFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjYjFlYWYxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVsc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5oaWdod2F5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmQ0YTVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmFydGVyaWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmU5ZDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJzaW1wbGlmaWVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IFwiMy4wMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LnN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IFwiMC4zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMudGV4dC5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiM3NDc0NzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNlOWU1ZGNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwidHJhbnNpdC5saW5lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcIm9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogXCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJ3YXRlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNkMmU3ZjdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICB9XG59O1xuXG5NYXBzSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE5hdmlnYXRpb24gaGFuZGxlclxuICAgLSBIYW5kbGVzIHRoZSBuYXZpZ2F0aW9uIGNvbXBvbmVudCB3aGljaCBoYXMgdGhlIHByb3BlciBjbGFzc2VzLlxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IE5hdmlnYXRpb25IYW5kbGVyID0ge1xuXG4gICAgbmF2aWdhdGlvbk5vZGU6IG51bGwsXG4gICAgc2Nyb2xsZWRMb2c6IDAsXG4gICAgaXNPcGVuOiBmYWxzZSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBuYXZUcmlnZ2VycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1uYXYtdHJpZ2dlcicpO1xuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jbG9zZS1vdmVybGF5LW5hdicpO1xuICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5uYXZpZ2F0aW9uTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW5hdicpO1xuXG4gICAgICAgIGlmKGlzc2V0KE5hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRpb25Ob2RlKSl7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSBOYXZpZ2F0aW9uSGFuZGxlci5jbG9zZU5hdmlnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbmF2VHJpZ2dlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5pbml0TmF2aWdhdGlvbihuYXZUcmlnZ2Vyc1tpXSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIuY2xvc2VOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXROYXZpZ2F0aW9uOiBmdW5jdGlvbiAobmF2VHJpZ2dlcikge1xuICAgICAgICBuYXZUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgTmF2aWdhdGlvbkhhbmRsZXIudG9nZ2xlTmF2aWdhdGlvbiwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICB0b2dnbGVOYXZpZ2F0aW9uOiBmdW5jdGlvbiAoZXZlbnQpIHtcblxuICAgICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgbGluayBiZWhhdmlvclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5zY3JvbGxlZCA9IHdpbmRvdy5wYWdlWU9mZnNldDtcblxuICAgICAgICAvLyBJZiB0aGUgbmF2IGlzIGFscmVhZHkgYWN0aXZlLCBjb2xsYXBzZSBpdCBhbmQgcXVpdFxuICAgICAgICBpZiAoTmF2aWdhdGlvbkhhbmRsZXIuaXNPcGVuKSBOYXZpZ2F0aW9uSGFuZGxlci5jbG9zZU5hdmlnYXRpb24oKTtcbiAgICAgICAgZWxzZSBOYXZpZ2F0aW9uSGFuZGxlci5vcGVuTmF2aWdhdGlvbigpO1xuXG4gICAgfSxcblxuICAgIG9wZW5OYXZpZ2F0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIuc2Nyb2xsZWQgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCduYXYtaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbC1sb2NrJyk7XG4gICAgICAgIH0sIDQwMCk7XG4gICAgfSxcblxuICAgIGNsb3NlTmF2aWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrJyk7XG4gICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCA9IE5hdmlnYXRpb25IYW5kbGVyLnNjcm9sbGVkO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbmF2LWlzLWFjdGl2ZScpO1xuICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlci5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG59O1xuXG5OYXZpZ2F0aW9uSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBTY3JvbGwgVG8gQ2xpY2sgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbFRvSGFuZGxlciA9IHtcblxuICAgIC8vIEFuaW1hdGlvbiBzZXR0aW5nc1xuICAgIG9mZnNldCA6IDYwLCAvL3BpeGVsXG4gICAgZHVyYXRpb24gOiAxNDAwLCAvL21zXG5cbiAgICAvLyBBbmltYXRpb24gdmFyaWFibGVzXG4gICAgYm9keSA6IG51bGwsXG4gICAgc3RhcnQgOiAwLFxuICAgIGNoYW5nZSA6IDAsXG4gICAgY3VycmVudFRpbWUgOiAwLFxuICAgIGFsbG93QW5pbWF0aW9uIDogZmFsc2UsXG4gICAgc2Nyb2xsVG9BbmltYXRpb24gOiBudWxsLFxuXG4gICAgLy8gV2F0Y2ggdGhlIEVhc2luZ0Z1bmN0aW9uIGhlbHBlciBmb3IgdGhlIGF2YWlsYWJsZSBtZXRob2RzXG4gICAgZWFzaW5nOiAnZWFzZUluT3V0UXVhZCcsXG5cbiAgICBpbml0IDogZnVuY3Rpb24oKXtcblxuICAgICAgICBjb25zdCBhbmNob3JMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zY3JvbGwtdG8tdGFyZ2V0Jyk7XG4gICAgICAgIGNvbnN0IGFuY2hvckxpbmtzQW1vdW50ID0gYW5jaG9yTGlua3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhbmNob3JMaW5rc0Ftb3VudDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckxpbmsgPSBhbmNob3JMaW5rc1tpXTtcblxuICAgICAgICAgICAgYW5jaG9yTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIFNjcm9sbFRvSGFuZGxlci5wcmVwYXJlU2Nyb2xsVG8odGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIEhhbmRsZXIgZm9yIHRoZSBhbmltYXRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlU2Nyb2xsVG8gOiBmdW5jdGlvbihlbGVtZW50SWQpe1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2Nyb2xsIHRvIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudElkID0gZWxlbWVudElkLnN1YnN0cihlbGVtZW50SWQuaW5kZXhPZignIycpKzEpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiA9IHNjcm9sbFRvRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBSZXNldCBvciBkZWZpbmUgdGhlIEhhbmRsZXIgdmFyaWFibGVzXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5ib2R5ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuc3RhcnQgPSBNYXRoLm1heChTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLCB3aW5kb3cucGFnZVlPZmZzZXQpOyAvL1VzZSBNYXRoLm1heCBiZWNhdXNlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuY2hhbmdlID0gKChzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbi50b3AgKyBTY3JvbGxUb0hhbmRsZXIuc3RhcnQpIC0gU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0KSAtIFNjcm9sbFRvSGFuZGxlci5vZmZzZXQ7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5zdGFydFRpbWUgPSAnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS5ub3coKSA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uXG4gICAgICAgIHNjcm9sbFRvQW5pbWF0aW9uID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5hbmltYXRlU2Nyb2xsKTtcblxuICAgICAgICAvLyBTdG9wIG9uIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFuaW1hdGUgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAqL1xuICAgIGFuaW1hdGVTY3JvbGwgOiBmdW5jdGlvbiAodGltZXN0YW1wKSB7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHByb2dyZXNzIGZyb20gMCAtIDFcbiAgICAgICAgbGV0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKHRpbWVzdGFtcCAtICBTY3JvbGxUb0hhbmRsZXIuc3RhcnRUaW1lKSAvIFNjcm9sbFRvSGFuZGxlci5kdXJhdGlvbik7XG4gICAgICAgIGlmKHByb2dyZXNzIDwgMCkgcHJvZ3Jlc3MgPSAwO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcHJvZ3Jlc3Mgd2l0aCBlYXNpbmcgZnVuY3Rpb25cbiAgICAgICAgcHJvZ3Jlc3MgPSBFYXNpbmdGdW5jdGlvbnNbU2Nyb2xsVG9IYW5kbGVyLmVhc2luZ10ocHJvZ3Jlc3MpO1xuXG4gICAgICAgIGNvbnN0IG5ld1Njcm9sbFRvcCA9IFNjcm9sbFRvSGFuZGxlci5zdGFydCArICggU2Nyb2xsVG9IYW5kbGVyLmNoYW5nZSAqIHByb2dyZXNzICk7XG5cbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgICAgICBpZiggU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID09PSAwICkgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3A7IC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgc28gaWYgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wIGlzIDAgZm9yY2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvdWdoIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG5cbiAgICAgICAgaWYocHJvZ3Jlc3MgPCAxICYmIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbil7XG4gICAgICAgICAgICBzY3JvbGxUb0FuaW1hdGlvbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuYW5pbWF0ZVNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFib3J0IHRoZSBzY3JvbGwgYW5pbWF0aW9uXG4gICAgICovXG4gICAgYWJvcnRTY3JvbGxBbmltYXRpb24gOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5zY3JvbGxUb0FuaW1hdGlvbik7XG4gICAgfVxuXG59O1xuXG5TY3JvbGxUb0hhbmRsZXIuaW5pdCgpOyIsIi8qIEV4YW1wbGVcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nID0gbmV3IFNsaWRlclByb2plY3RvclNldHRpbmcoe1xuICAgIHNsaWRlclByb2plY3RvcklkOiAnaGVhZGVyLWltYWdlLXNsaWRlcicsXG4gICAgc2xpZGVRdWVyeTogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5wbGFjZWhvbGRlciBmaWd1cmUnLFxuICAgIGRvdHM6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAuc2xpZGVyLW5hdmlnYXRpb24tbGFiZWxzIC5uYXZpZ2F0aW9uIHNwYW4nLFxuICAgIGNhcHRpb25zOiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnNsaWRlci1uYXZpZ2F0aW9uLWxhYmVscyAuY2FwdGlvbiBwJyxcbiAgICBhdXRvU2xpZGVyOiB0cnVlLFxuICAgIHNsaWRlckludGVydmFsOiA0MDAwXG59KTtcbmhlYWRlckltYWdlU2xpZGVyU2V0dGluZyA9IGhlYWRlckltYWdlU2xpZGVyU2V0dGluZy5wcmVwYXJlUGFyYW1ldGVycygpO1xuXG5jb25zdCBoZWFkZXJJbWFnZVNsaWRlciA9IG5ldyBTbGlkZXJQcm9qZWN0b3IoaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nKS5pbml0KCk7XG5cbiAqL1xuXG5yZXF1aXJlKCdoYW1tZXJqcycpO1xuXG5jb25zdCBTbGlkZXJQcm9qZWN0b3JIYW5kbGVyID0ge1xuXG4gIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBzbGlkZVByb2plY3RvcnMgPSBbXTtcblxuICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3JDb250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXNsaWRlLXByb2plY3RvcicpO1xuICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3JDb250YWluZXJzTGVuZ3RoID0gc2xpZGVQcm9qZWN0b3JDb250YWluZXJzLmxlbmd0aDtcblxuICAgICAgZm9yKGxldCBpID0wOyBpIDwgc2xpZGVQcm9qZWN0b3JDb250YWluZXJzTGVuZ3RoOyBpKyspe1xuXG4gICAgICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3IgPSBzbGlkZVByb2plY3RvckNvbnRhaW5lcnNbaV07XG4gICAgICAgICAgY29uc3Qgc2xpZGVQcm9qZWN0b3JJZCA9IHNsaWRlUHJvamVjdG9yLmdldEF0dHJpYnV0ZSgnaWQnKTtcblxuICAgICAgICAgIGNvbnN0IGF1dG9TbGlkZSA9IHNsaWRlUHJvamVjdG9yLmdldEF0dHJpYnV0ZSgnZGF0YS1hdXRvLXNsaWRlJyk7XG5cbiAgICAgICAgICBpZihzbGlkZVByb2plY3RvcklkICE9PSBudWxsKXtcblxuICAgICAgICAgICAgICBjb25zdCBzbGlkZVByb2plY3RvclNldHRpbmcgPSBuZXcgU2xpZGVyUHJvamVjdG9yU2V0dGluZyh7XG4gICAgICAgICAgICAgICAgICBzbGlkZXJJZDogc2xpZGVQcm9qZWN0b3JJZCxcbiAgICAgICAgICAgICAgICAgIHNsaWRlUXVlcnk6ICcjJyArIHNsaWRlUHJvamVjdG9ySWQgKycgLmpzLXNsaWRlLXByb2plY3Rvci1zbGlkZScsXG4gICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogJyMnICsgc2xpZGVQcm9qZWN0b3JJZCArJyAuanMtc2xpZGUtcHJvamVjdG9yLWJ1dHRvbicgLFxuICAgICAgICAgICAgICAgICAgYXV0b1NsaWRlcjogYXV0b1NsaWRlLFxuICAgICAgICAgICAgICAgICAgc2xpZGVySW50ZXJ2YWw6IDYwMDBcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgc2xpZGVQcm9qZWN0b3JzLnB1c2goIG5ldyBTbGlkZXJQcm9qZWN0b3Ioc2xpZGVQcm9qZWN0b3JTZXR0aW5nLnByZXBhcmVQYXJhbWV0ZXJzKCkpLmluaXQoKSApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGNvbnNvbGUubG9nKCdBbiBpbWFnZSBzbGlkZXIgaGFzIG5vIGlkLi4uJyk7XG4gICAgICB9XG4gIH1cbn07XG5cblNsaWRlclByb2plY3RvckhhbmRsZXIuaW5pdCgpO1xuXG5mdW5jdGlvbiBTbGlkZXJQcm9qZWN0b3JTZXR0aW5nKHNldHRpbmdzT2JqZWN0KSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuc2xpZGVySWQgPSAnJztcbiAgICB0aGlzLmRlZmluZWRQcmV2aW91c05leHQgPSB0cnVlO1xuICAgIHRoaXMuYXV0b1NsaWRlciA9IGZhbHNlO1xuICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSA0MDAwO1xuICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSAnJztcbiAgICB0aGlzLmRvdHMgPSAnJztcbiAgICB0aGlzLmNhcHRpb25zID0gJyc7XG4gICAgdGhpcy5zbGlkZVF1ZXJ5ID0gJyc7XG5cbiAgICB0aGlzLnNldFNsaWRlclByb2plY3RvcklkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlcklkID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0RGVmaW5lZFByZXZpb3VzTmV4dCA9IGZ1bmN0aW9uIChib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lZFByZXZpb3VzTmV4dCA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRBdXRvU2xpZGVyID0gZnVuY3Rpb24gKGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hdXRvU2xpZGVyID0gYm9vbGVhbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldFNsaWRlckludGVydmFsID0gZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICAgICAgdGhpcy5zbGlkZXJJbnRlcnZhbCA9IGludGVnZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRTbGlkZVF1ZXJ5ID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlUXVlcnkgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uQnV0dG9ucyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldERvdHMgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZG90cyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldENhcHRpb25zID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLmNhcHRpb25zID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVyUHJvamVjdG9ySWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlcklkO1xuICAgIH07XG4gICAgdGhpcy5nZXREZWZpbmVkUHJldmlvdXNOZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbmVkUHJldmlvdXNOZXh0O1xuICAgIH07XG4gICAgdGhpcy5nZXRBdXRvU2xpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRvU2xpZGVyO1xuICAgIH07XG4gICAgdGhpcy5nZXRTbGlkZXJJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVySW50ZXJ2YWw7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlUXVlcnk7XG4gICAgfTtcbiAgICB0aGlzLmdldE5hdmlnYXRpb25CdXR0b25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucztcbiAgICB9O1xuICAgIHRoaXMuZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG90cztcbiAgICB9O1xuICAgIHRoaXMuZ2V0Q2FwdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcHRpb25zO1xuICAgIH07XG5cblxuICAgIC8vIEludmVydCBzZXR0ZXJzIHRvIGdldHRlcnNcbiAgICB0aGlzLnByZXBhcmVQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzbGlkZXJJZDogc2VsZi5nZXRTbGlkZXJQcm9qZWN0b3JJZCgpLFxuICAgICAgICAgICAgZGVmaW5lZFByZXZpb3VzTmV4dDogc2VsZi5nZXREZWZpbmVkUHJldmlvdXNOZXh0KCksXG4gICAgICAgICAgICBhdXRvU2xpZGVyOiBzZWxmLmdldEF1dG9TbGlkZXIoKSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLmdldFNsaWRlckludGVydmFsKCksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5nZXROYXZpZ2F0aW9uQnV0dG9ucygpLFxuICAgICAgICAgICAgZG90czogc2VsZi5nZXREb3RzKCksXG4gICAgICAgICAgICBjYXB0aW9uczogc2VsZi5nZXRDYXB0aW9ucygpLFxuICAgICAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5nZXRTbGlkZVF1ZXJ5KClcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8vIE1hc3MgYXNzaWduIHNldHRpbmdzXG4gICAgdGhpcy5maWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICBjb25zdCBzZXR0aW5nc09iamVjdEtleXMgPSBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzT2JqZWN0TGVuZ3RoID0gc2V0dGluZ3NPYmplY3RLZXlzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NPYmplY3RMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzZXR0aW5nc09iamVjdEtleXNbaV07XG4gICAgICAgICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdGhpcy5maWxsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzbGlkZXJJZDogc2VsZi5zZXRTbGlkZXJQcm9qZWN0b3JJZCxcbiAgICAgICAgZGVmaW5lZFByZXZpb3VzTmV4dDogc2VsZi5zZXREZWZpbmVkUHJldmlvdXNOZXh0LFxuICAgICAgICBhdXRvU2xpZGVyOiBzZWxmLnNldEF1dG9TbGlkZXIsXG4gICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLnNldFNsaWRlckludGVydmFsLFxuICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5zZXROYXZpZ2F0aW9uQnV0dG9ucyxcbiAgICAgICAgZG90czogc2VsZi5zZXREb3RzLFxuICAgICAgICBjYXB0aW9uczogc2VsZi5zZXRDYXB0aW9ucyxcbiAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5zZXRTbGlkZVF1ZXJ5LFxuICAgICAgICBwcmVwYXJlUGFyYW1ldGVyczogc2VsZi5wcmVwYXJlUGFyYW1ldGVyc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIFNsaWRlclByb2plY3RvcihzZXR0aW5ncykge1xuXG4gICAgLy9EZWZpbmUgU2xpZGVyUHJvamVjdG9yIG9iamVjdFxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc2xpZGVyT2JqZWN0ID0gJyc7XG5cbiAgICAvL1NsaWRlUGFyYW1ldGVyc1xuICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG4gICAgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSAwO1xuICAgIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuICAgIHRoaXMuYXZhaWxhYmxlU2xpZGVzID0gMTtcbiAgICB0aGlzLnNsaWRlcyA9IFtdO1xuICAgIHRoaXMuYXV0b1NsaWRlckludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL0FwcGVuZCBzZXR0aW5ncyB0byBzZWxmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgICAgICAvL0Fzc2lnbiBuZWVkZWQgZWxlbWVudHMgYW5kIGNhbGN1bGF0aW9uc1xuICAgICAgICB0aGlzLnNsaWRlck9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2xpZGVySWQpO1xuICAgICAgICB0aGlzLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5zbGlkZVF1ZXJ5KTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgLy9EZWZpbmUgcHJldmlvdXMgYW5kIG5leHQgaWYgd2Ugd2FudCB0byB1c2UgdGhvc2VcbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgc2xpZGUgKGFuZCBwb3NzaWJsZSBwcmV2aW91cyBhbmQgbmV4dCBjbGFzc2VzKVxuICAgICAgICB0aGlzLnNldFNsaWRlKCk7XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5zbGlkZXJPYmplY3QpO1xuICAgICAgICBzd2lwZUdlc3R1cmVzLm9uKCdzd2lwZWxlZnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgICAgICAgICAgc2VsZi5uZXh0U2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXBlR2VzdHVyZXMub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgICAgICAgICAgc2VsZi5wcmV2aW91c1NsaWRlKCk7XG4gICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgIH0pO1xuXG5cblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyAhPT0gJycpIHtcblxuICAgICAgICAgICAgLy8gQ2xpY2sgaW50ZXJhY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zKTtcbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b25zTGVuZ3RoID0gbmF2aWdhdGlvbkJ1dHRvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25CdXR0b25zTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b24gPSBuYXZpZ2F0aW9uQnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWNrTmF2aWdhdGlvbkJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZG90cyAhPT0gJycpIHtcbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICAgICAgY29uc3QgZG90c0xlbmd0aCA9IGRvdHMubGVuZ3RoO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRvdHMpO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGRvdHNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaGllcicpO1xuICAgICAgICAgICAgICAgIGRvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja0RvdCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5hdXRvU2xpZGVyKCk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5hdXRvU2xpZGVyID0gZnVuY3Rpb24gKCl7XG5cbiAgICAgICAgaWYodGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwgIT09IG51bGwpIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwpO1xuXG4gICAgICAgIGlmKHRoaXMuc2V0dGluZ3MuYXV0b1NsaWRlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuc2V0dGluZ3Muc2xpZGVySW50ZXJ2YWwpICl7XG5cbiAgICAgICAgICAgIHRoaXMuYXV0b1NsaWRlckludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubmV4dFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnNldHRpbmdzLnNsaWRlckludGVydmFsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucmVzZXRBdXRvU2xpZGVyID0gc2VsZi5hdXRvU2xpZGVyO1xuXG5cbiAgICB0aGlzLm5leHRTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkKys7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnByZXZpb3VzU2xpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZC0tO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVTbGlkZUlkIDwgMCkgdGhpcy5hY3RpdmVTbGlkZUlkID0gdGhpcy5hdmFpbGFibGVTbGlkZXMgLSAxO1xuXG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHRoaXMuc2V0UHJldmlvdXNBbmROZXh0U2xpZGUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5uZXh0U2xpZGVJZCA9IHRoaXMuYWN0aXZlU2xpZGVJZCArIDE7XG4gICAgICAgIGlmICh0aGlzLm5leHRTbGlkZUlkID49IHRoaXMuYXZhaWxhYmxlU2xpZGVzKSB0aGlzLm5leHRTbGlkZUlkID0gMDtcblxuICAgICAgICB0aGlzLnByZXZpb3VzU2xpZGVJZCA9IHRoaXMuYWN0aXZlU2xpZGVJZCAtIDE7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzU2xpZGVJZCA8IDApIHRoaXMucHJldmlvdXNTbGlkZUlkID0gdGhpcy5hdmFpbGFibGVTbGlkZXMgLSAxO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFNsaWRlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZm9ybSBlbGVtZW50c1xuICAgICAgICBjb25zdCBzbGlkZXNMZW5ndGggPSBzZWxmLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzbGlkZXNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBzbGlkZSA9IHNlbGYuc2xpZGVzW2ldO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGEgc2V0IGF0dHJpYnV0ZSB0byBkZXNpcmVkIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlT3JkZXIgPSBwYXJzZUludChzbGlkZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbmQgc2V0IGFjdGl2ZSBmb3IgYWxsIHNsaWRlc1xuICAgICAgICAgICAgaWYgKHNsaWRlT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSB1c2UgdGhlIHByZXZpb3VzIGFuZCBuZXh0LCBhbHNvIHNldCB0aG9zZSBjbGFzc2VzXG4gICAgICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5wcmV2aW91c1NsaWRlSWQpIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ3ByZXZpb3VzJyk7XG4gICAgICAgICAgICAgICAgZWxzZSBzbGlkZS5jbGFzc0xpc3QuYWRkKCdwcmV2aW91cycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNsaWRlT3JkZXIgIT09IHNlbGYubmV4dFNsaWRlSWQpIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ25leHQnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ25leHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRvdHMgIT09ICcnKSB7IHNlbGYuc2V0QWN0aXZlRG90KCk7IH1cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuY2FwdGlvbnMgIT09ICcnKSB7IHNlbGYuc2V0QWN0aXZlQ2FwdGlvbigpOyB9XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tOYXZpZ2F0aW9uQnV0dG9uID0gZnVuY3Rpb24gKG5hdkJ1dHRvbikge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChuYXZCdXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSBzZWxmLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcblxuICAgICAgICBjb25zdCBuZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5uZXh0Jyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICsgJy5wcmV2aW91cycpO1xuXG4gICAgICAgIG5leHQuc2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJywgc2VsZi5uZXh0U2xpZGVJZCk7XG4gICAgICAgIHByZXZpb3VzLnNldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicsIHNlbGYucHJldmlvdXNTbGlkZUlkKTtcblxuICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuXG4gICAgICAgIC8vIG5leHQucXVlcnlTZWxlY3RvcigncCcpLmlubmVySFRNTCA9IHNlbGYuc2xpZGVzW3NlbGYubmV4dFNsaWRlSWRdLmRhdGFzZXQubmFtZTtcbiAgICAgICAgLy8gcHJldmlvdXMucXVlcnlTZWxlY3RvcigncCcpLmlubmVySFRNTCA9IHNlbGYuc2xpZGVzW3NlbGYucHJldmlvdXNTbGlkZUlkXS5kYXRhc2V0Lm5hbWU7XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tEb3QgPSBmdW5jdGlvbiAoY2xpY2tlZERvdCkge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChjbGlja2VkRG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcbiAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldEFjdGl2ZURvdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICBjb25zdCBkb3RzTGVuZ3RoID0gZG90cy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgIGRvdE9yZGVyID0gcGFyc2VJbnQoZG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgaWYoZG90T3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgZG90LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgZWxzZSBkb3QuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zZXRBY3RpdmVDYXB0aW9uID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmNhcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdGlvbnNMZW5ndGggPSBjYXB0aW9ucy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjYXB0aW9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSBjYXB0aW9uc1tpXTtcbiAgICAgICAgICAgIGNhcHRpb25PcmRlciA9IHBhcnNlSW50KGNhcHRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuXG4gICAgICAgICAgICBpZihjYXB0aW9uT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgY2FwdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2UgY2FwdGlvbi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH07XG59IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBVc3AgSW1wcmVzc2lvbnMgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFVzcEltcHJlc3Npb25zSGFuZGxlciA9IHtcblxuICAgIHRpbWVvdXQ6IG51bGwsXG5cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uc1RyYXlzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXVzcC1pbXByZXNzaW9ucycpO1xuICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uc1RyYXlzTGVuZ3RoID0gdXNwSW1wcmVzc2lvbnNUcmF5cy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHVzcEltcHJlc3Npb25zVHJheXNMZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uc1RyYXkgPSB1c3BJbXByZXNzaW9uc1RyYXlzW2ldO1xuXG4gICAgICAgICAgICBjb25zdCB1c3BJbXByZXNzaW9uU2xpZGVyID0gbmV3IFVzcEltcHJlc3Npb25TbGlkZXIodXNwSW1wcmVzc2lvbnNUcmF5KTtcbiAgICAgICAgICAgIHVzcEltcHJlc3Npb25TbGlkZXIuYXV0b1NsaWRlKCk7XG5cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5jbGFzcyBVc3BJbXByZXNzaW9uU2xpZGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHNsaWRlcikge1xuICAgICAgICB0aGlzLnNsaWRlciA9IHNsaWRlcjtcbiAgICAgICAgdGhpcy5zbGlkZXMgID0gdGhpcy5zbGlkZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLXVzcC1pbXByZXNzaW9uJyk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuICAgICAgICB0aGlzLnNsaWRlSW50ZXJ2YWwgPSA0MDAwO1xuICAgIH1cblxuICAgIGF1dG9TbGlkZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5hdXRvU2xpZGUoKTtcbiAgICAgICAgfSwgdGhpcy5zbGlkZUludGVydmFsKTtcbiAgICB9XG5cbiAgICBuZXh0U2xpZGUoKSB7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgKys7XG4gICAgICAgIGlmKHRoaXMuY3VycmVudFNsaWRlID49IHRoaXMuc2xpZGVzLmxlbmd0aCkgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnNsaWRlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBjb25zdCBzbGlkZSA9IHRoaXMuc2xpZGVzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2xpZGVJZCA9IHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS11c3AnKTtcblxuICAgICAgICAgICAgaWYoIHNsaWRlSWQgPT0gdGhpcy5jdXJyZW50U2xpZGUgKSB7XG4gICAgICAgICAgICAgICAgc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5Vc3BJbXByZXNzaW9uc0hhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgWW91dHViZSBoYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgWW91dHViZUhhbmRsZXIgPSB7XG5cbiAgICB5b3V0dWJlQ2xhc3MgOiAnLmpzLXlvdXR1YmUtcGxheWVyJyxcbiAgICBwbGF5ZXJzOiBbXSxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIHlvdXR1YmUgcGxheWVycyBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChZb3V0dWJlSGFuZGxlci55b3V0dWJlQ2xhc3MpO1xuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IHlvdXR1YmVQbGF5ZXJzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXIgPSB5b3V0dWJlUGxheWVyc1tpXTtcblxuXG4gICAgICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVySWQgPSB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIGlmKHlvdXR1YmVQbGF5ZXJJZCAhPT0gbnVsbCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIGh0bWwgYW5kIGNyZWF0ZSBvYmplY3RzIGZyb20gaXRcbiAgICAgICAgICAgICAgICBjb25zdCB5b3V0dWJlRWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdpZCcpLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnZGF0YS15b3V0dWJlLWxpbmsnKSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXk6IHBhcnNlSW50KHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWF1dG8tcGxheScpKSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIucGxheWVycy5wdXNoKHlvdXR1YmVFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50IG5vdCBpbmNsdWRlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYSBpZCBvbiB0aGUgcGxheWVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHlvdXR1YmVQbGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoeW91dHViZVBsYXllcnNBbW91bnQgPj0gMSkgWW91dHViZUhhbmRsZXIuaW5pdFlvdXR1YmUoKTtcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRlcm5hbCBzY3JpcHQgaXMgbG9hZGVkXG4gICAgICpcbiAgICAgKi9cbiAgICBpbml0WW91dHViZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFNlZSBpZiBZVCB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZihZVCkgPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mKFlULlBsYXllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFNldHVwIEFQSSByZWFkeSBmdW5jdGlvblxuICAgICAgICAgICAgd2luZG93Lm9uWW91VHViZVBsYXllckFQSVJlYWR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgZ2V0U2NyaXB0KCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJyk7XG4gICAgICAgICAgICAvLyBJZiBZVCBhbHJlYWR5IGV4aXN0cyBsb2FkIHBsYXllclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIFlvdXR1YmUgcGxheWVyKHMpIHdpdGggcGFyYW1ldGVyc1xuICAgICAqIEFuZCByZXdyaXRlIHRoZSBwbGF5ZXJzIHRvIGtleSB0aGVtIGJ5IHRoZSBlbGVtZW50IGlkXG4gICAgICpcbiAgICAgKi9cbiAgICBsb2FkUGxheWVyczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgbGV0IHBsYXllcnMgPSBbXTtcblxuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGxldCB5b3V0dWJlUGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1tpXTtcblxuICAgICAgICAgICAgLy8gTG9hZCBwbGF5ZXJcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5ZXIucGxheWVyID0gbmV3IFlULlBsYXllcih5b3V0dWJlUGxheWVyLmlkLHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgIHZpZGVvSWQ6IHlvdXR1YmVQbGF5ZXIubGluayxcbiAgICAgICAgICAgICAgICBob3N0OiAnaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20nLFxuICAgICAgICAgICAgICAgIHBsYXllclZhcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlbDogMCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWtiOiAxLFxuICAgICAgICAgICAgICAgICAgICBhdXRvcGxheTogeW91dHViZVBsYXllci5hdXRvUGxheVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdvblJlYWR5JzogWW91dHViZUhhbmRsZXIub25SZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgJ29uU3RhdGVDaGFuZ2UnOiBZb3V0dWJlSGFuZGxlci5vblN0YXRlQ2hhbmdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBsYXllcnNbeW91dHViZVBsYXllci5pZF0gPSB5b3V0dWJlUGxheWVyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzID0gcGxheWVycztcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHBsYXllciBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgb25SZWFkeSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAvLyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoJyMnICsgcGxheWVyQ29udGFpbmVySWQpLnN0b3AoKS5hbmltYXRlKHsgb3BhY2l0eTogMSB9LDEwMDApIH0sODAwKTtcblxuICAgICAgICAvLyBJZiBub3Qgb24gdGFibGV0IG9yIG1vYmlsZSwgcGxheSBvbiBoaWdoIHF1YWxpdHlcbiAgICAgICAgLy8gcGxheWVyLm11dGUoKTtcbiAgICAgICAgLy8gcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICAvLyBwbGF5ZXIuc2V0UGxheWJhY2tRdWFsaXR5KCdoZDEwODAnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIFlvdXR1YmUgc3RhdGUgY2hhbmdlXG4gICAgICovXG4gICAgb25TdGF0ZUNoYW5nZSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgdmlkZW9TdGF0ZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgLy8gTG9vcCB2aWRlb1xuICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PT0gWVQuUGxheWVyU3RhdGUuRU5ERUQgKSB7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5Zb3V0dWJlSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJyb3dzZXIgSGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IEJyb3dzZXJIYW5kbGVyID0ge1xuXG4gICAgdXNlckFnZW50OiAnJyxcbiAgICBicm93c2VySW5mbzogJycsXG5cblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIudXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvID0gQnJvd3NlckhhbmRsZXIuZ2V0QnJvd3NlckluZm8oKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlSUUoKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlU2FmYXJpKCk7XG4gICAgfSxcblxuICAgIGhhbmRsZUlFOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHZlcnNpb25zIGJlbG93IGllMTFcbiAgICAgICAgbGV0IG1zaWUgPSBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSAnKTtcbiAgICAgICAgY29uc3QgaWVsdDExID0gbXNpZSA+IDA7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGllMTFcbiAgICAgICAgY29uc3QgaWUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgICAgIC8vIElmIEludGVybmV0IEV4cGxvcmVyXG4gICAgICAgIGlmIChpZWx0MTEgfHwgaWUxMSkge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgICAgICAgICBsZXQgdmVyc2lvbiA9ICcxMSc7XG5cbiAgICAgICAgICAgIC8vIFdheSB0byBkZXRlY3QgdmVyc2lvbiA8IDExXG4gICAgICAgICAgICBpZiAoaWVsdDExKSB2ZXJzaW9uID0gcGFyc2VJbnQoQnJvd3NlckhhbmRsZXIudXNlckFnZW50LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICBtc2llICsgNSxcbiAgICAgICAgICAgICAgICBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZihcIi5cIiwgbXNpZSlcbiAgICAgICAgICAgICkpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgY2xhc3NlcyB0byBIVE1MICh3ZSBoYXZlIHRvIGRvIHRoaXMgc2VwYXJhdGVseSBiZWNhdXNlIGVsc2UgaWUgd2lsbCBmYWlsKVxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2Jyt2ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBzYWZhcmkgdmVyc2lvblxuICAgIGhhbmRsZVNhZmFyaTogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGlmKEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLm5hbWUgPT09ICdTYWZhcmknICYmIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLnZlcnNpb24gPD0gMTApe1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgZ2V0QnJvd3NlckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHVhPW5hdmlnYXRvci51c2VyQWdlbnQsdGVtLE09dWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pKSB8fCBbXTtcbiAgICAgICAgaWYoL3RyaWRlbnQvaS50ZXN0KE1bMV0pKXtcbiAgICAgICAgICAgIHRlbT0vXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModWEpIHx8IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHtuYW1lOidJRSAnLHZlcnNpb246KHRlbVsxXXx8JycpfTtcbiAgICAgICAgfVxuICAgICAgICBpZihNWzFdPT09J0Nocm9tZScpe1xuICAgICAgICAgICAgdGVtPXVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKVxuICAgICAgICAgICAgaWYodGVtIT1udWxsKSAgIHtyZXR1cm4ge25hbWU6J09wZXJhJywgdmVyc2lvbjp0ZW1bMV19O31cbiAgICAgICAgfVxuICAgICAgICBNPU1bMl0/IFtNWzFdLCBNWzJdXTogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgICAgIGlmKCh0ZW09dWEubWF0Y2goL3ZlcnNpb25cXC8oXFxkKykvaSkpIT1udWxsKSB7TS5zcGxpY2UoMSwxLHRlbVsxXSk7fVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogTVswXSxcbiAgICAgICAgICAgIHZlcnNpb246IE1bMV1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5Ccm93c2VySGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBIZWxwZXIgZnVuY3Rpb25zXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIFNpbXBsZSBpc3NldCBtZXRob2QgZm9yIHRoaXMgZG9lcyBub3QgZXhpc3QgaW4gamF2YXNjcmlwdFxuICovXG53aW5kb3cuaXNzZXQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnICYmIG9iaiAhPT0gbnVsbDtcbn07XG5cbi8qXG4gKiBFYXNpbmcgRnVuY3Rpb25zIC0gaW5zcGlyZWQgZnJvbSBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbiAqIG9ubHkgY29uc2lkZXJpbmcgdGhlIHQgdmFsdWUgZm9yIHRoZSByYW5nZSBbMCwgMV0gPT4gWzAsIDFdXG4gKi9cbndpbmRvdy5FYXNpbmdGdW5jdGlvbnMgPSB7XG4gICAgLy8gbm8gZWFzaW5nLCBubyBhY2NlbGVyYXRpb25cbiAgICBsaW5lYXI6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqICgyIC0gdClcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAyICogdCAqIHQgOiAtMSArICg0IC0gMiAqIHQpICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJbkN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICgtLXQpICogdCAqIHQgKyAxXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDFcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSAtICgtLXQpICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAoLS10KSAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSArICgtLXQpICogdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogKC0tdCkgKiB0ICogdCAqIHQgKiB0XG4gICAgfVxufTtcblxuLypcbiAqIFZhbmlsbGEgdmVyc2lvbiBvZiB0aGUgJC5nZXRTY3JpcHRcbiAqL1xud2luZG93LmdldFNjcmlwdCA9IGZ1bmN0aW9uIChzb3VyY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5hc3luYyA9IDE7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgIGxldCBwcmlvciA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXTtcblxuICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKF8sIGlzQWJvcnQpIHtcbiAgICAgICAgaWYgKGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qoc2NyaXB0LnJlYWR5U3RhdGUpKSB7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBzY3JpcHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmICghaXNBYm9ydCkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzY3JpcHQuc3JjID0gc291cmNlO1xuICAgIHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgcHJpb3IpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gKiBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9wcyBiZWluZyBjYWxsZWQgZm9yXG4gKiBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAqIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gKiBAcGFyYW0gZnVuY1xuICogQHBhcmFtIHdhaXRcbiAqIEBwYXJhbSBpbW1lZGlhdGVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xud2luZG93LmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsZXQgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG59O1xuXG4vKlxuICogQ29va2llIGhlbHBlciBjbGFzc1xuICovXG53aW5kb3cuQ29va2llID0ge1xuICAgIHNldDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzKSB7XG4gICAgICAgIGxldCBkb21haW4sIGRvbWFpblBhcnRzLCBkYXRlLCBleHBpcmVzLCBob3N0O1xuXG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b0dNVFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBob3N0ID0gbG9jYXRpb24uaG9zdDtcbiAgICAgICAgaWYgKGhvc3Quc3BsaXQoJy4nKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIG5vIFwiLlwiIGluIGEgZG9tYWluIC0gaXQncyBsb2NhbGhvc3Qgb3Igc29tZXRoaW5nIHNpbWlsYXJcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBjb29raWUgb24gYWxsIHN1YiBkb21haW5zLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggdHJ5aW5nIHRvIHNldCBjb29raWUgdG8gdGhlIHRvcCBkb21haW4uXG4gICAgICAgICAgICAvLyAoZXhhbXBsZTogaWYgdXNlciBpcyBvbiBmb28uY29tLCB0cnkgdG8gc2V0XG4gICAgICAgICAgICAvLyAgY29va2llIHRvIGRvbWFpbiBcIi5jb21cIilcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29va2llIHdpbGwgbm90IGJlIHNldCwgaXQgbWVhbnMgXCIuY29tXCJcbiAgICAgICAgICAgIC8vIGlzIGEgdG9wIGxldmVsIGRvbWFpbiBhbmQgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBjb29raWUgdG8gXCIuZm9vLmNvbVwiXG4gICAgICAgICAgICBkb21haW5QYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBkb21haW4gPSAnLicgKyBkb21haW5QYXJ0cy5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgIC8vIEZvciBkZXZlbG9wbWVudCBwdXJwb3NlLCByZW1vdmUgdGhpcyB3aGVuIG1vdmluZyB0byBwcm9kdWN0aW9uXG4gICAgICAgICAgICAvLyBkb21haW4gPSAnLmtvbW1hLnBybyc7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS87IGRvbWFpbj1cIiArIGRvbWFpbjtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29va2llIHdhcyBzdWNjZXNzZnVseSBzZXQgdG8gdGhlIGdpdmVuIGRvbWFpblxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSBpdCB3YXMgYSBUb3AtTGV2ZWwgRG9tYWluKVxuICAgICAgICAgICAgaWYgKENvb2tpZS5nZXQobmFtZSkgPT0gbnVsbCB8fCBDb29raWUuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kIFwiLlwiIHRvIGN1cnJlbnQgZG9tYWluXG4gICAgICAgICAgICAgICAgZG9tYWluID0gJy4nICsgaG9zdDtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vOyBkb21haW49XCIgKyBkb21haW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBjb25zdCBuYW1lRVEgPSBuYW1lICsgXCI9XCI7XG4gICAgICAgIGNvbnN0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjID0gY2FbaV07XG4gICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgZXJhc2U6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIENvb2tpZS5zZXQobmFtZSwgJycsIC0xKTtcbiAgICB9XG59O1xuXG4vKlxuICogSmF2YXNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBudW1iZXJfZm9ybWF0IG1ldGhvZCBvZiBQSFBcbiAqL1xud2luZG93Lm51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbiAobnVtYmVyLCBkZWNpbWFscywgZGVjX3BvaW50LCB0aG91c2FuZHNfc2VwKSB7XG4gICAgLy8gU3RyaXAgYWxsIGNoYXJhY3RlcnMgYnV0IG51bWVyaWNhbCBvbmVzLlxuICAgIG51bWJlciA9IChudW1iZXIgKyAnJykucmVwbGFjZSgvW14wLTkrXFwtRWUuXS9nLCAnJyk7XG4gICAgbGV0IG4gPSAhaXNGaW5pdGUoK251bWJlcikgPyAwIDogK251bWJlcixcbiAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcbiAgICAgICAgc2VwID0gKHR5cGVvZiB0aG91c2FuZHNfc2VwID09PSAndW5kZWZpbmVkJykgPyAnLCcgOiB0aG91c2FuZHNfc2VwLFxuICAgICAgICBkZWMgPSAodHlwZW9mIGRlY19wb2ludCA9PT0gJ3VuZGVmaW5lZCcpID8gJy4nIDogZGVjX3BvaW50LFxuICAgICAgICBzID0gJycsXG4gICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnBvdygxMCwgcHJlYyk7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBNYXRoLnJvdW5kKG4gKiBrKSAvIGs7XG4gICAgICAgIH07XG4gICAgLy8gRml4IGZvciBJRSBwYXJzZUZsb2F0KDAuNTUpLnRvRml4ZWQoMCkgPSAwO1xuICAgIHMgPSAocHJlYyA/IHRvRml4ZWRGaXgobiwgcHJlYykgOiAnJyArIE1hdGgucm91bmQobikpLnNwbGl0KCcuJyk7XG4gICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuICAgICAgICBzWzBdID0gc1swXS5yZXBsYWNlKC9cXEIoPz0oPzpcXGR7M30pKyg/IVxcZCkpL2csIHNlcCk7XG4gICAgfVxuICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuICAgICAgICBzWzFdID0gc1sxXSB8fCAnJztcbiAgICAgICAgc1sxXSArPSBuZXcgQXJyYXkocHJlYyAtIHNbMV0ubGVuZ3RoICsgMSkuam9pbignMCcpO1xuICAgIH1cbiAgICByZXR1cm4gcy5qb2luKGRlYyk7XG59O1xuXG5cbi8qKlxuICogRWxlbWVudC5jbG9zZXN0KCkgcG9seWZpbGxcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2Nsb3Nlc3QjUG9seWZpbGxcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gICAgaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgICAgIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzO1xuICAgICAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHJldHVybiBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcyhzKSkgcmV0dXJuIGFuY2VzdG9yO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChhbmNlc3RvciAhPT0gbnVsbCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbndpbmRvdy5BamF4ID0ge1xuXG4gICAgLy9UT0RPOiBDYW4gd2UgY3JlYXRlIGEgcHJlcGFyZSByZXF1ZXN0IGZ1bmN0aW9uID8/XG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbignZ2V0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSxcblxuICAgIHBvc3Q6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRPS0VOJywgdG9rZW4pO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCggSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbndpbmRvdy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQ29udmVydCBzbmFrZSBjYXNlIGludG8gY2FtZWxjYXNlXG4gKlxuICogQHBhcmFtIHN0cmluZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbndpbmRvdy5zbmFrZVRvQ2FtZWwgPSBmdW5jdGlvbiAoc3RyaW5nKXtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhcXC1cXHcpL2csIGZ1bmN0aW9uKG0pe3JldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IGluc2lkZSBpdHMgcGFyZW50XG4gKi9cbndpbmRvdy5pbmRleEluUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgIGxldCBudW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIEZvciBzZWN1cml0eSByZWFzb25zIGlPUyBTYWZhcmkgb25seSBhbGxvd3MgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKSBmb3IgdGV4dCB3aXRoaW4gYSBjb250ZW50RWRpdGFibGUgY29udGFpbmVyLlxuICogVGhlIHdvcmthcm91bmQgaXMgdG8gZGV0ZWN0IGlPUyBTYWZhcmkgYW5kIHF1aWNrbHkgdG9nZ2xlIGNvbnRlbnRFZGl0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykuXG4gKiBXaGViIGlucHV0IG9yIHRleHRhcmVhIGlzIFJFQURPTkxZIHlvdSBjYW4gcHJldmVudCB0aGUgdW53YW50ZWQgcG9wdXAgd2l0aCBjb3B5L3Bhc3RlIGZ1bmN0aW9ucyBhbmQgdGhlIGlucHV0IGtleWJvYXJkXG4gKiBDb2RlIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80Njk4MTg0N1xuICovXG53aW5kb3cuY29weVRvQ2xpcGJvYXJkID0gZnVuY3Rpb24gKGVsKSB7XG5cbiAgICAvLyByZXNvbHZlIHRoZSBlbGVtZW50XG4gICAgZWwgPSAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKSA6IGVsO1xuXG4gICAgLy8gaGFuZGxlIGlPUyBhcyBhIHNwZWNpYWwgY2FzZVxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pcGFkfGlwb2R8aXBob25lL2kpKSB7XG5cbiAgICAgICAgLy8gc2F2ZSBjdXJyZW50IGNvbnRlbnRFZGl0YWJsZS9yZWFkT25seSBzdGF0dXNcbiAgICAgICAgY29uc3QgZWRpdGFibGUgPSBlbC5jb250ZW50RWRpdGFibGU7XG4gICAgICAgIGNvbnN0IHJlYWRPbmx5ID0gZWwucmVhZE9ubHk7XG5cbiAgICAgICAgLy8gY29udmVydCB0byBlZGl0YWJsZSB3aXRoIHJlYWRvbmx5IHRvIHN0b3AgaU9TIGtleWJvYXJkIG9wZW5pbmdcbiAgICAgICAgZWwuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgZWwucmVhZE9ubHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBhIHNlbGVjdGFibGUgcmFuZ2VcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcblxuICAgICAgICAvLyBzZWxlY3QgdGhlIHJhbmdlXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCA5OTk5OTkpO1xuXG4gICAgICAgIC8vIHJlc3RvcmUgY29udGVudEVkaXRhYmxlL3JlYWRPbmx5IHRvIG9yaWdpbmFsIHN0YXRlXG4gICAgICAgIGVsLmNvbnRlbnRFZGl0YWJsZSA9IGVkaXRhYmxlO1xuICAgICAgICBlbC5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZWwuc2VsZWN0KCk7XG4gICAgfVxuXG4gICAgLy8gZXhlY3V0ZSBjb3B5IGNvbW1hbmRcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgcmVsYXRlZCB0byB0aGUgYm9keVxuICpcbiAqIEBwYXJhbSBlbFxuICogQHJldHVybnMge3t0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfX1cbiAqL1xud2luZG93LmJvZHlPZmZzZXQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHNjcm9sbExlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AgKyBzY3JvbGxUb3AsIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbExlZnQgfVxufSIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9