blob: 52c287ac060d7508edef17d0f65c60e684a65d63 [file] [edit]
/* Sinon.JS 22.0.0, 2026-05-05, @license BSD-3 */(function(g,f){if(typeof exports=="object"&&typeof module<"u"){module.exports=f(require)}else if("function"==typeof define && define.amd){define("sinon",["timers","timers/promises","fs"],function(_d_0,_d_1,_d_2){var d={"timers": _d_0,"timers/promises": _d_1,"fs": _d_2},r=function(m){if(m in d) return d[m];if(typeof require=="function") return require(m);throw new Error("Cannot find module '"+m+"'")};return f(r)})}else {var gN={"timers":"timers","timers/promises":"timers/promises","fs":"fs"},gReq=function(r){var mod = r in gN ? g[gN[r]] : g[r]; return mod };g["sinon"]=f(gReq)}}(typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : this,function(require){var exports={};var __exports=exports;var module={exports};
"use strict";
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
// node_modules/@sinonjs/commons/lib/global.js
var require_global = __commonJS({
"node_modules/@sinonjs/commons/lib/global.js"(exports2, module2) {
"use strict";
var globalObject;
if (typeof global !== "undefined") {
globalObject = global;
} else if (typeof window !== "undefined") {
globalObject = window;
} else {
globalObject = self;
}
module2.exports = globalObject;
}
});
// node_modules/@sinonjs/commons/lib/prototypes/throws-on-proto.js
var require_throws_on_proto = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/throws-on-proto.js"(exports2, module2) {
"use strict";
var throwsOnProto;
try {
const object = {};
object.__proto__;
throwsOnProto = false;
} catch (_) {
throwsOnProto = true;
}
module2.exports = throwsOnProto;
}
});
// node_modules/@sinonjs/commons/lib/prototypes/copy-prototype-methods.js
var require_copy_prototype_methods = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/copy-prototype-methods.js"(exports2, module2) {
"use strict";
var call = Function.call;
var throwsOnProto = require_throws_on_proto();
var disallowedProperties = [
// ignore size because it throws from Map
"size",
"caller",
"callee",
"arguments"
];
if (throwsOnProto) {
disallowedProperties.push("__proto__");
}
module2.exports = function copyPrototypeMethods(prototype) {
return Object.getOwnPropertyNames(prototype).reduce(
function(result, name) {
if (disallowedProperties.includes(name)) {
return result;
}
if (typeof prototype[name] !== "function") {
return result;
}
result[name] = call.bind(prototype[name]);
return result;
},
/* @__PURE__ */ Object.create(null)
);
};
}
});
// node_modules/@sinonjs/commons/lib/prototypes/array.js
var require_array = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/array.js"(exports2, module2) {
"use strict";
var copyPrototype = require_copy_prototype_methods();
module2.exports = copyPrototype(Array.prototype);
}
});
// node_modules/@sinonjs/commons/lib/called-in-order.js
var require_called_in_order = __commonJS({
"node_modules/@sinonjs/commons/lib/called-in-order.js"(exports2, module2) {
"use strict";
var every = require_array().every;
function hasCallsLeft(callMap, spy) {
if (callMap[spy.id] === void 0) {
callMap[spy.id] = 0;
}
return callMap[spy.id] < spy.callCount;
}
function checkAdjacentCalls(callMap, spy, index, spies) {
var calledBeforeNext = true;
if (index !== spies.length - 1) {
calledBeforeNext = spy.calledBefore(spies[index + 1]);
}
if (hasCallsLeft(callMap, spy) && calledBeforeNext) {
callMap[spy.id] += 1;
return true;
}
return false;
}
function calledInOrder(spies) {
var callMap = {};
var _spies = arguments.length > 1 ? arguments : spies;
return every(_spies, checkAdjacentCalls.bind(null, callMap));
}
module2.exports = calledInOrder;
}
});
// node_modules/@sinonjs/commons/lib/class-name.js
var require_class_name = __commonJS({
"node_modules/@sinonjs/commons/lib/class-name.js"(exports2, module2) {
"use strict";
function className(value) {
const name = value.constructor && value.constructor.name;
return name || null;
}
module2.exports = className;
}
});
// node_modules/@sinonjs/commons/lib/deprecated.js
var require_deprecated = __commonJS({
"node_modules/@sinonjs/commons/lib/deprecated.js"(exports2) {
"use strict";
exports2.wrap = function(func, msg) {
var wrapped = function() {
exports2.printWarning(msg);
return func.apply(this, arguments);
};
if (func.prototype) {
wrapped.prototype = func.prototype;
}
return wrapped;
};
exports2.defaultMsg = function(packageName, funcName) {
return `${packageName}.${funcName} is deprecated and will be removed from the public API in a future version of ${packageName}.`;
};
exports2.printWarning = function(msg) {
if (typeof process === "object" && process.emitWarning) {
process.emitWarning(msg);
} else if (console.info) {
console.info(msg);
} else {
console.log(msg);
}
};
}
});
// node_modules/@sinonjs/commons/lib/every.js
var require_every = __commonJS({
"node_modules/@sinonjs/commons/lib/every.js"(exports2, module2) {
"use strict";
module2.exports = function every(obj, fn) {
var pass = true;
try {
obj.forEach(function() {
if (!fn.apply(this, arguments)) {
throw new Error();
}
});
} catch (e) {
pass = false;
}
return pass;
};
}
});
// node_modules/@sinonjs/commons/lib/function-name.js
var require_function_name = __commonJS({
"node_modules/@sinonjs/commons/lib/function-name.js"(exports2, module2) {
"use strict";
module2.exports = function functionName(func) {
if (!func) {
return "";
}
try {
return func.displayName || func.name || // Use function decomposition as a last resort to get function
// name. Does not rely on function decomposition to work - if it
// doesn't debugging will be slightly less informative
// (i.e. toString will say 'spy' rather than 'myFunc').
(String(func).match(/function ([^\s(]+)/) || [])[1];
} catch (e) {
return "";
}
};
}
});
// node_modules/@sinonjs/commons/lib/order-by-first-call.js
var require_order_by_first_call = __commonJS({
"node_modules/@sinonjs/commons/lib/order-by-first-call.js"(exports2, module2) {
"use strict";
var sort = require_array().sort;
var slice = require_array().slice;
function comparator(a, b) {
var aCall = a.getCall(0);
var bCall = b.getCall(0);
var aId = aCall && aCall.callId || -1;
var bId = bCall && bCall.callId || -1;
return aId < bId ? -1 : 1;
}
function orderByFirstCall(spies) {
return sort(slice(spies), comparator);
}
module2.exports = orderByFirstCall;
}
});
// node_modules/@sinonjs/commons/lib/prototypes/function.js
var require_function = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/function.js"(exports2, module2) {
"use strict";
var copyPrototype = require_copy_prototype_methods();
module2.exports = copyPrototype(Function.prototype);
}
});
// node_modules/@sinonjs/commons/lib/prototypes/map.js
var require_map = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/map.js"(exports2, module2) {
"use strict";
var copyPrototype = require_copy_prototype_methods();
module2.exports = copyPrototype(Map.prototype);
}
});
// node_modules/@sinonjs/commons/lib/prototypes/object.js
var require_object = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/object.js"(exports2, module2) {
"use strict";
var copyPrototype = require_copy_prototype_methods();
module2.exports = copyPrototype(Object.prototype);
}
});
// node_modules/@sinonjs/commons/lib/prototypes/set.js
var require_set = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/set.js"(exports2, module2) {
"use strict";
var copyPrototype = require_copy_prototype_methods();
module2.exports = copyPrototype(Set.prototype);
}
});
// node_modules/@sinonjs/commons/lib/prototypes/string.js
var require_string = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/string.js"(exports2, module2) {
"use strict";
var copyPrototype = require_copy_prototype_methods();
module2.exports = copyPrototype(String.prototype);
}
});
// node_modules/@sinonjs/commons/lib/prototypes/index.js
var require_prototypes = __commonJS({
"node_modules/@sinonjs/commons/lib/prototypes/index.js"(exports2, module2) {
"use strict";
module2.exports = {
array: require_array(),
function: require_function(),
map: require_map(),
object: require_object(),
set: require_set(),
string: require_string()
};
}
});
// node_modules/type-detect/type-detect.js
var require_type_detect = __commonJS({
"node_modules/type-detect/type-detect.js"(exports2, module2) {
(function(global2, factory) {
typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global2.typeDetect = factory();
})(exports2, (function() {
"use strict";
var promiseExists = typeof Promise === "function";
var globalObject = typeof self === "object" ? self : global;
var symbolExists = typeof Symbol !== "undefined";
var mapExists = typeof Map !== "undefined";
var setExists = typeof Set !== "undefined";
var weakMapExists = typeof WeakMap !== "undefined";
var weakSetExists = typeof WeakSet !== "undefined";
var dataViewExists = typeof DataView !== "undefined";
var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== "undefined";
var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== "undefined";
var setEntriesExists = setExists && typeof Set.prototype.entries === "function";
var mapEntriesExists = mapExists && typeof Map.prototype.entries === "function";
var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf((/* @__PURE__ */ new Set()).entries());
var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf((/* @__PURE__ */ new Map()).entries());
var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === "function";
var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());
var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === "function";
var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(""[Symbol.iterator]());
var toStringLeftSliceLength = 8;
var toStringRightSliceLength = -1;
function typeDetect(obj) {
var typeofObj = typeof obj;
if (typeofObj !== "object") {
return typeofObj;
}
if (obj === null) {
return "null";
}
if (obj === globalObject) {
return "global";
}
if (Array.isArray(obj) && (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))) {
return "Array";
}
if (typeof window === "object" && window !== null) {
if (typeof window.location === "object" && obj === window.location) {
return "Location";
}
if (typeof window.document === "object" && obj === window.document) {
return "Document";
}
if (typeof window.navigator === "object") {
if (typeof window.navigator.mimeTypes === "object" && obj === window.navigator.mimeTypes) {
return "MimeTypeArray";
}
if (typeof window.navigator.plugins === "object" && obj === window.navigator.plugins) {
return "PluginArray";
}
}
if ((typeof window.HTMLElement === "function" || typeof window.HTMLElement === "object") && obj instanceof window.HTMLElement) {
if (obj.tagName === "BLOCKQUOTE") {
return "HTMLQuoteElement";
}
if (obj.tagName === "TD") {
return "HTMLTableDataCellElement";
}
if (obj.tagName === "TH") {
return "HTMLTableHeaderCellElement";
}
}
}
var stringTag = symbolToStringTagExists && obj[Symbol.toStringTag];
if (typeof stringTag === "string") {
return stringTag;
}
var objPrototype = Object.getPrototypeOf(obj);
if (objPrototype === RegExp.prototype) {
return "RegExp";
}
if (objPrototype === Date.prototype) {
return "Date";
}
if (promiseExists && objPrototype === Promise.prototype) {
return "Promise";
}
if (setExists && objPrototype === Set.prototype) {
return "Set";
}
if (mapExists && objPrototype === Map.prototype) {
return "Map";
}
if (weakSetExists && objPrototype === WeakSet.prototype) {
return "WeakSet";
}
if (weakMapExists && objPrototype === WeakMap.prototype) {
return "WeakMap";
}
if (dataViewExists && objPrototype === DataView.prototype) {
return "DataView";
}
if (mapExists && objPrototype === mapIteratorPrototype) {
return "Map Iterator";
}
if (setExists && objPrototype === setIteratorPrototype) {
return "Set Iterator";
}
if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {
return "Array Iterator";
}
if (stringIteratorExists && objPrototype === stringIteratorPrototype) {
return "String Iterator";
}
if (objPrototype === null) {
return "Object";
}
return Object.prototype.toString.call(obj).slice(toStringLeftSliceLength, toStringRightSliceLength);
}
return typeDetect;
}));
}
});
// node_modules/@sinonjs/commons/lib/type-of.js
var require_type_of = __commonJS({
"node_modules/@sinonjs/commons/lib/type-of.js"(exports2, module2) {
"use strict";
var type = require_type_detect();
module2.exports = function typeOf(value) {
return type(value).toLowerCase();
};
}
});
// node_modules/@sinonjs/commons/lib/value-to-string.js
var require_value_to_string = __commonJS({
"node_modules/@sinonjs/commons/lib/value-to-string.js"(exports2, module2) {
"use strict";
function valueToString(value) {
if (value && value.toString) {
return value.toString();
}
return String(value);
}
module2.exports = valueToString;
}
});
// node_modules/@sinonjs/commons/lib/index.js
var require_lib = __commonJS({
"node_modules/@sinonjs/commons/lib/index.js"(exports2, module2) {
"use strict";
module2.exports = {
global: require_global(),
calledInOrder: require_called_in_order(),
className: require_class_name(),
deprecated: require_deprecated(),
every: require_every(),
functionName: require_function_name(),
orderByFirstCall: require_order_by_first_call(),
prototypes: require_prototypes(),
typeOf: require_type_of(),
valueToString: require_value_to_string()
};
}
});
// lib/sinon/util/core/extend.js
var require_extend = __commonJS({
"lib/sinon/util/core/extend.js"(exports2, module2) {
"use strict";
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes: commonsPrototypes } = commons__default.default;
var { array: arrayProto, object: objectProto } = commonsPrototypes;
var { hasOwnProperty } = objectProto;
var join = arrayProto.join;
var push = arrayProto.push;
var hasDontEnumBug = (function() {
const obj = {
constructor: function() {
return "0";
},
toString: function() {
return "1";
},
valueOf: function() {
return "2";
},
toLocaleString: function() {
return "3";
},
prototype: function() {
return "4";
},
isPrototypeOf: function() {
return "5";
},
propertyIsEnumerable: function() {
return "6";
},
hasOwnProperty: function() {
return "7";
},
length: function() {
return "8";
},
unique: function() {
return "9";
}
};
const result = [];
for (const prop in obj) {
if (hasOwnProperty(obj, prop)) {
push(result, obj[prop]());
}
}
return join(result, "") !== "0123456789";
})();
function extendCommon(target, sources, doCopy) {
let source, i, prop;
for (i = 0; i < sources.length; i++) {
source = sources[i];
for (prop in source) {
if (hasOwnProperty(source, prop)) {
doCopy(target, source, prop);
}
}
if (hasDontEnumBug && hasOwnProperty(source, "toString") && source.toString !== target.toString) {
target.toString = source.toString;
}
}
return target;
}
function extend(target, ...sources) {
return extendCommon(
target,
sources,
function copyValue(dest, source, prop) {
const destOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(
dest,
prop
);
const sourceOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(
source,
prop
);
if (prop === "name" && (!destOwnPropertyDescriptor || !destOwnPropertyDescriptor.writable)) {
return;
}
const descriptors = {
configurable: sourceOwnPropertyDescriptor.configurable,
enumerable: sourceOwnPropertyDescriptor.enumerable
};
if (hasOwnProperty(sourceOwnPropertyDescriptor, "writable")) {
descriptors.writable = sourceOwnPropertyDescriptor.writable;
descriptors.value = sourceOwnPropertyDescriptor.value;
} else {
if (sourceOwnPropertyDescriptor.get) {
descriptors.get = sourceOwnPropertyDescriptor.get.bind(dest);
}
if (sourceOwnPropertyDescriptor.set) {
descriptors.set = sourceOwnPropertyDescriptor.set.bind(dest);
}
}
Object.defineProperty(dest, prop, descriptors);
}
);
}
extend.nonEnum = function extendNonEnum(target, ...sources) {
return extendCommon(
target,
sources,
function copyProperty(dest, source, prop) {
Object.defineProperty(dest, prop, {
value: source[prop],
enumerable: false,
configurable: true,
writable: true
});
}
);
};
module2.exports = extend;
}
});
// lib/sinon/util/core/get-next-tick.js
var require_get_next_tick = __commonJS({
"lib/sinon/util/core/get-next-tick.js"(exports2, module2) {
"use strict";
function nextTick(callback) {
setTimeout(callback, 0);
}
function getNextTick(process2, setImmediate) {
if (typeof process2 === "object" && typeof process2.nextTick === "function") {
return process2.nextTick;
}
if (typeof setImmediate === "function") {
return setImmediate;
}
return nextTick;
}
module2.exports = getNextTick;
}
});
// lib/sinon/util/core/next-tick.js
var require_next_tick = __commonJS({
"lib/sinon/util/core/next-tick.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var getNextTick = require_get_next_tick();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { global: globalObject } = commons__default.default;
var nextTick = getNextTick(globalObject.process, globalObject.setImmediate);
module2.exports = nextTick;
}
});
// lib/sinon/util/core/export-async-behaviors.js
var require_export_async_behaviors = __commonJS({
"lib/sinon/util/core/export-async-behaviors.js"(exports2, module2) {
"use strict";
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { reduce } = prototypes.array;
function exportAsyncBehaviors(behaviorMethods) {
return reduce(
Object.keys(behaviorMethods),
function(acc, method) {
if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) {
acc[`${method}Async`] = function() {
const result = behaviorMethods[method].apply(
this,
arguments
);
this.callbackAsync = true;
return result;
};
}
return acc;
},
{}
);
}
module2.exports = exportAsyncBehaviors;
}
});
// lib/sinon/behavior.js
var require_behavior = __commonJS({
"lib/sinon/behavior.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var extend = require_extend();
var nextTick = require_next_tick();
var exportAsyncBehaviors = require_export_async_behaviors();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes: commonsPrototypes, functionName, valueToString } = commons__default.default;
var { array: arrayProto } = commonsPrototypes;
var concat = arrayProto.concat;
var join = arrayProto.join;
var reverse = arrayProto.reverse;
var slice = arrayProto.slice;
var useLeftMostCallback = -1;
var useRightMostCallback = -2;
function getCallback(behavior2, args) {
const callArgAt = behavior2.callArgAt;
if (callArgAt >= 0) {
return args[callArgAt];
}
let argumentList;
if (callArgAt === useLeftMostCallback) {
argumentList = args;
}
if (callArgAt === useRightMostCallback) {
argumentList = reverse(slice(args));
}
const callArgProp = behavior2.callArgProp;
for (let i = 0, l = argumentList.length; i < l; ++i) {
if (!callArgProp && typeof argumentList[i] === "function") {
return argumentList[i];
}
if (callArgProp && argumentList[i] && typeof argumentList[i][callArgProp] === "function") {
return argumentList[i][callArgProp];
}
}
return null;
}
function getCallbackError(behavior2, func, args) {
if (behavior2.callArgAt < 0) {
let msg;
if (behavior2.callArgProp) {
msg = `${functionName(
behavior2.stub
)} expected to yield to '${valueToString(
behavior2.callArgProp
)}', but no object with such a property was passed.`;
} else {
msg = `${functionName(
behavior2.stub
)} expected to yield, but no callback was passed.`;
}
if (args.length > 0) {
msg += ` Received [${join(args, ", ")}]`;
}
return msg;
}
return `argument at index ${behavior2.callArgAt} is not a function: ${func}`;
}
function ensureArgs(name, behavior2, args) {
const property = name.replace(/sArg/, "ArgAt");
const index = behavior2[property];
if (index >= args.length) {
throw new TypeError(
`${name} failed: ${index + 1} arguments required but only ${args.length} present`
);
}
}
function callCallback(behavior2, args) {
if (typeof behavior2.callArgAt === "number") {
ensureArgs("callsArg", behavior2, args);
const func = getCallback(behavior2, args);
if (typeof func !== "function") {
throw new TypeError(getCallbackError(behavior2, func, args));
}
if (behavior2.callbackAsync) {
nextTick(function() {
func.apply(
behavior2.callbackContext,
behavior2.callbackArguments
);
});
} else {
return func.apply(
behavior2.callbackContext,
behavior2.callbackArguments
);
}
}
return void 0;
}
var proto = {
create: function create(stub) {
const behavior2 = extend({}, proto);
delete behavior2.create;
delete behavior2.addBehavior;
delete behavior2.createBehavior;
behavior2.stub = stub;
if (stub.defaultBehavior && stub.defaultBehavior.promiseLibrary) {
behavior2.promiseLibrary = stub.defaultBehavior.promiseLibrary;
}
return behavior2;
},
isPresent: function isPresent() {
return typeof this.callArgAt === "number" || this.exception || this.exceptionCreator || typeof this.returnArgAt === "number" || this.returnThis || typeof this.resolveArgAt === "number" || this.resolveThis || typeof this.throwArgAt === "number" || this.fakeFn || this.returnValueDefined;
},
/*eslint complexity: ["error", 20]*/
invoke: function invoke(context, args) {
const returnValue = callCallback(this, args);
if (this.exception) {
throw this.exception;
} else if (this.exceptionCreator) {
this.exception = this.exceptionCreator();
this.exceptionCreator = void 0;
throw this.exception;
} else if (typeof this.returnArgAt === "number") {
ensureArgs("returnsArg", this, args);
return args[this.returnArgAt];
} else if (this.returnThis) {
return context;
} else if (typeof this.throwArgAt === "number") {
ensureArgs("throwsArg", this, args);
throw args[this.throwArgAt];
} else if (this.fakeFn) {
return this.fakeFn.apply(context, args);
} else if (typeof this.resolveArgAt === "number") {
ensureArgs("resolvesArg", this, args);
return (this.promiseLibrary || Promise).resolve(
args[this.resolveArgAt]
);
} else if (this.resolveThis) {
return (this.promiseLibrary || Promise).resolve(context);
} else if (this.resolve) {
return (this.promiseLibrary || Promise).resolve(this.returnValue);
} else if (this.reject) {
return (this.promiseLibrary || Promise).reject(this.returnValue);
} else if (this.callsThrough) {
const wrappedMethod = this.effectiveWrappedMethod();
return wrappedMethod.apply(context, args);
} else if (this.callsThroughWithNew) {
const WrappedClass = this.effectiveWrappedMethod();
const argsArray = slice(args);
const F = WrappedClass.bind.apply(
WrappedClass,
concat([null], argsArray)
);
return new F();
} else if (typeof this.returnValue !== "undefined") {
return this.returnValue;
} else if (typeof this.callArgAt === "number") {
return returnValue;
}
return this.returnValue;
},
effectiveWrappedMethod: function effectiveWrappedMethod() {
for (let stubb = this.stub; stubb; stubb = stubb.parent) {
if (stubb.wrappedMethod) {
return stubb.wrappedMethod;
}
}
throw new Error("Unable to find wrapped method");
},
onCall: function onCall(index) {
return this.stub.onCall(index);
},
onFirstCall: function onFirstCall() {
return this.stub.onFirstCall();
},
onSecondCall: function onSecondCall() {
return this.stub.onSecondCall();
},
onThirdCall: function onThirdCall() {
return this.stub.onThirdCall();
},
withArgs: function withArgs() {
throw new Error(
'Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.'
);
}
};
function createBehavior(behaviorMethod) {
return function() {
this.defaultBehavior = this.defaultBehavior || proto.create(this);
this.defaultBehavior[behaviorMethod].apply(
this.defaultBehavior,
arguments
);
return this;
};
}
function addBehavior(stub, name, fn) {
proto[name] = function() {
fn.apply(this, concat([this], slice(arguments)));
return this.stub || this;
};
stub[name] = createBehavior(name);
}
proto.addBehavior = addBehavior;
proto.createBehavior = createBehavior;
var asyncBehaviors = exportAsyncBehaviors(proto);
var behavior = extend.nonEnum({}, proto, asyncBehaviors);
module2.exports = behavior;
}
});
// node_modules/@sinonjs/samsam/lib/is-nan.js
var require_is_nan = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-nan.js"(exports2, module2) {
"use strict";
function isNaN2(value) {
return typeof value === "number" && value !== value;
}
module2.exports = isNaN2;
}
});
// node_modules/@sinonjs/samsam/lib/is-neg-zero.js
var require_is_neg_zero = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-neg-zero.js"(exports2, module2) {
"use strict";
function isNegZero(value) {
return value === 0 && 1 / value === -Infinity;
}
module2.exports = isNegZero;
}
});
// node_modules/@sinonjs/samsam/lib/identical.js
var require_identical = __commonJS({
"node_modules/@sinonjs/samsam/lib/identical.js"(exports2, module2) {
"use strict";
var isNaN2 = require_is_nan();
var isNegZero = require_is_neg_zero();
function identical(obj1, obj2) {
if (obj1 === obj2 || isNaN2(obj1) && isNaN2(obj2)) {
return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
}
return false;
}
module2.exports = identical;
}
});
// node_modules/@sinonjs/samsam/lib/get-class.js
var require_get_class = __commonJS({
"node_modules/@sinonjs/samsam/lib/get-class.js"(exports2, module2) {
"use strict";
var toString = require_lib().prototypes.object.toString;
function getClass(value) {
return toString(value).split(/[ \]]/)[1];
}
module2.exports = getClass;
}
});
// node_modules/@sinonjs/samsam/lib/is-arguments.js
var require_is_arguments = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-arguments.js"(exports2, module2) {
"use strict";
var getClass = require_get_class();
function isArguments(object) {
return getClass(object) === "Arguments";
}
module2.exports = isArguments;
}
});
// node_modules/@sinonjs/samsam/lib/is-element.js
var require_is_element = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-element.js"(exports2, module2) {
"use strict";
var div = typeof document !== "undefined" && document.createElement("div");
function isElement(object) {
if (!object || object.nodeType !== 1 || !div) {
return false;
}
try {
object.appendChild(div);
object.removeChild(div);
} catch (e) {
return false;
}
return true;
}
module2.exports = isElement;
}
});
// node_modules/@sinonjs/samsam/lib/is-set.js
var require_is_set = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-set.js"(exports2, module2) {
"use strict";
function isSet(val) {
return typeof Set !== "undefined" && val instanceof Set || false;
}
module2.exports = isSet;
}
});
// node_modules/@sinonjs/samsam/lib/is-map.js
var require_is_map = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-map.js"(exports2, module2) {
"use strict";
function isMap(value) {
return typeof Map !== "undefined" && value instanceof Map;
}
module2.exports = isMap;
}
});
// node_modules/@sinonjs/samsam/node_modules/type-detect/type-detect.js
var require_type_detect2 = __commonJS({
"node_modules/@sinonjs/samsam/node_modules/type-detect/type-detect.js"(exports2, module2) {
(function(global2, factory) {
typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, global2.typeDetect = factory());
})(exports2, (function() {
"use strict";
var promiseExists = typeof Promise === "function";
var globalObject = (function(Obj) {
if (typeof globalThis === "object") {
return globalThis;
}
Object.defineProperty(Obj, "typeDetectGlobalObject", {
get: function get() {
return this;
},
configurable: true
});
var global2 = typeDetectGlobalObject;
delete Obj.typeDetectGlobalObject;
return global2;
})(Object.prototype);
var symbolExists = typeof Symbol !== "undefined";
var mapExists = typeof Map !== "undefined";
var setExists = typeof Set !== "undefined";
var weakMapExists = typeof WeakMap !== "undefined";
var weakSetExists = typeof WeakSet !== "undefined";
var dataViewExists = typeof DataView !== "undefined";
var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== "undefined";
var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== "undefined";
var setEntriesExists = setExists && typeof Set.prototype.entries === "function";
var mapEntriesExists = mapExists && typeof Map.prototype.entries === "function";
var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf((/* @__PURE__ */ new Set()).entries());
var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf((/* @__PURE__ */ new Map()).entries());
var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === "function";
var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());
var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === "function";
var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(""[Symbol.iterator]());
var toStringLeftSliceLength = 8;
var toStringRightSliceLength = -1;
function typeDetect(obj) {
var typeofObj = typeof obj;
if (typeofObj !== "object") {
return typeofObj;
}
if (obj === null) {
return "null";
}
if (obj === globalObject) {
return "global";
}
if (Array.isArray(obj) && (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))) {
return "Array";
}
if (typeof window === "object" && window !== null) {
if (typeof window.location === "object" && obj === window.location) {
return "Location";
}
if (typeof window.document === "object" && obj === window.document) {
return "Document";
}
if (typeof window.navigator === "object") {
if (typeof window.navigator.mimeTypes === "object" && obj === window.navigator.mimeTypes) {
return "MimeTypeArray";
}
if (typeof window.navigator.plugins === "object" && obj === window.navigator.plugins) {
return "PluginArray";
}
}
if ((typeof window.HTMLElement === "function" || typeof window.HTMLElement === "object") && obj instanceof window.HTMLElement) {
if (obj.tagName === "BLOCKQUOTE") {
return "HTMLQuoteElement";
}
if (obj.tagName === "TD") {
return "HTMLTableDataCellElement";
}
if (obj.tagName === "TH") {
return "HTMLTableHeaderCellElement";
}
}
}
var stringTag = symbolToStringTagExists && obj[Symbol.toStringTag];
if (typeof stringTag === "string") {
return stringTag;
}
var objPrototype = Object.getPrototypeOf(obj);
if (objPrototype === RegExp.prototype) {
return "RegExp";
}
if (objPrototype === Date.prototype) {
return "Date";
}
if (promiseExists && objPrototype === Promise.prototype) {
return "Promise";
}
if (setExists && objPrototype === Set.prototype) {
return "Set";
}
if (mapExists && objPrototype === Map.prototype) {
return "Map";
}
if (weakSetExists && objPrototype === WeakSet.prototype) {
return "WeakSet";
}
if (weakMapExists && objPrototype === WeakMap.prototype) {
return "WeakMap";
}
if (dataViewExists && objPrototype === DataView.prototype) {
return "DataView";
}
if (mapExists && objPrototype === mapIteratorPrototype) {
return "Map Iterator";
}
if (setExists && objPrototype === setIteratorPrototype) {
return "Set Iterator";
}
if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {
return "Array Iterator";
}
if (stringIteratorExists && objPrototype === stringIteratorPrototype) {
return "String Iterator";
}
if (objPrototype === null) {
return "Object";
}
return Object.prototype.toString.call(obj).slice(toStringLeftSliceLength, toStringRightSliceLength);
}
return typeDetect;
}));
}
});
// node_modules/@sinonjs/samsam/lib/array-types.js
var require_array_types = __commonJS({
"node_modules/@sinonjs/samsam/lib/array-types.js"(exports2, module2) {
"use strict";
var ARRAY_TYPES = [
Array,
Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array
];
module2.exports = ARRAY_TYPES;
}
});
// node_modules/@sinonjs/samsam/lib/is-array-type.js
var require_is_array_type = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-array-type.js"(exports2, module2) {
"use strict";
var functionName = require_lib().functionName;
var indexOf = require_lib().prototypes.array.indexOf;
var map = require_lib().prototypes.array.map;
var ARRAY_TYPES = require_array_types();
var type = require_type_detect2();
function isArrayType(object) {
return indexOf(map(ARRAY_TYPES, functionName), type(object)) !== -1;
}
module2.exports = isArrayType;
}
});
// node_modules/@sinonjs/samsam/lib/is-date.js
var require_is_date = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-date.js"(exports2, module2) {
"use strict";
function isDate(value) {
return value instanceof Date;
}
module2.exports = isDate;
}
});
// node_modules/@sinonjs/samsam/lib/is-iterable.js
var require_is_iterable = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-iterable.js"(exports2, module2) {
"use strict";
function isIterable(val) {
if (typeof val !== "object") {
return false;
}
return typeof val[Symbol.iterator] === "function";
}
module2.exports = isIterable;
}
});
// node_modules/@sinonjs/samsam/lib/is-object.js
var require_is_object = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-object.js"(exports2, module2) {
"use strict";
function isObject(value) {
return typeof value === "object" && value !== null && // none of these are collection objects, so we can return false
!(value instanceof Boolean) && !(value instanceof Date) && !(value instanceof Error) && !(value instanceof Number) && !(value instanceof RegExp) && !(value instanceof String);
}
module2.exports = isObject;
}
});
// node_modules/@sinonjs/samsam/lib/is-subset.js
var require_is_subset = __commonJS({
"node_modules/@sinonjs/samsam/lib/is-subset.js"(exports2, module2) {
"use strict";
var forEach = require_lib().prototypes.set.forEach;
function isSubset(s1, s2, compare) {
var allContained = true;
forEach(s1, function(v1) {
var includes = false;
forEach(s2, function(v2) {
if (compare(v2, v1)) {
includes = true;
}
});
allContained = allContained && includes;
});
return allContained;
}
module2.exports = isSubset;
}
});
// node_modules/@sinonjs/samsam/lib/deep-equal.js
var require_deep_equal = __commonJS({
"node_modules/@sinonjs/samsam/lib/deep-equal.js"(exports2, module2) {
"use strict";
var valueToString = require_lib().valueToString;
var className = require_lib().className;
var typeOf = require_lib().typeOf;
var arrayProto = require_lib().prototypes.array;
var mapForEach = require_lib().prototypes.map.forEach;
var getClass = require_get_class();
var identical = require_identical();
var isArguments = require_is_arguments();
var isArrayType = require_is_array_type();
var isDate = require_is_date();
var isElement = require_is_element();
var isIterable = require_is_iterable();
var isMap = require_is_map();
var isNaN2 = require_is_nan();
var isObject = require_is_object();
var isSet = require_is_set();
var isSubset = require_is_subset();
var concat = arrayProto.concat;
var every = arrayProto.every;
var push = arrayProto.push;
var getTime = Date.prototype.getTime;
var indexOf = arrayProto.indexOf;
var objectKeys = Object.keys;
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
function allEnumerableKeysInProtoChain(object) {
const enumerableKeys = [];
for (const key in object) {
enumerableKeys.push(key);
}
return enumerableKeys;
}
function shouldComparePrototypeEnumerableKeys(object) {
return !isArrayType(object) && !isArguments(object);
}
function getEnumerableStringKeys(object) {
return shouldComparePrototypeEnumerableKeys(object) ? allEnumerableKeysInProtoChain(object) : objectKeys(object);
}
function hasAllEnumerableStringKeys(actualKeys, expectedKeys) {
return every(expectedKeys, function(key) {
return indexOf(actualKeys, key) !== -1;
});
}
function deepEqualCyclic(actual, expectation, match) {
var actualObjects = [];
var expectationObjects = [];
var actualPaths = [];
var expectationPaths = [];
var compared = {};
return (function deepEqual(actualObj, expectationObj, actualPath, expectationPath) {
if (match && match.isMatcher(expectationObj)) {
if (match.isMatcher(actualObj)) {
return actualObj === expectationObj;
}
return expectationObj.test(actualObj);
}
var actualType = typeof actualObj;
var expectationType = typeof expectationObj;
if (actualObj === expectationObj || isNaN2(actualObj) || isNaN2(expectationObj) || actualObj === null || expectationObj === null || actualObj === void 0 || expectationObj === void 0 || actualType !== "object" || expectationType !== "object") {
return identical(actualObj, expectationObj);
}
if (isElement(actualObj) || isElement(expectationObj)) {
return false;
}
var isActualDate = isDate(actualObj);
var isExpectationDate = isDate(expectationObj);
if (isActualDate || isExpectationDate) {
if (!isActualDate || !isExpectationDate || getTime.call(actualObj) !== getTime.call(expectationObj)) {
return false;
}
}
if (actualObj instanceof RegExp && expectationObj instanceof RegExp) {
if (valueToString(actualObj) !== valueToString(expectationObj)) {
return false;
}
}
if (actualObj instanceof Promise && expectationObj instanceof Promise) {
return actualObj === expectationObj;
}
if (actualObj instanceof Error && expectationObj instanceof Error) {
return actualObj === expectationObj;
}
var actualClass = getClass(actualObj);
var expectationClass = getClass(expectationObj);
var actualKeys = getEnumerableStringKeys(actualObj);
var expectationKeys = getEnumerableStringKeys(expectationObj);
var actualName = className(actualObj);
var expectationName = className(expectationObj);
var expectationSymbols = typeOf(getOwnPropertySymbols) === "function" ? getOwnPropertySymbols(expectationObj) : (
/* c8 ignore next: cannot collect coverage for engine that doesn't support Symbol */
[]
);
var expectationKeysAndSymbols = concat(
expectationKeys,
expectationSymbols
);
if (isArguments(actualObj) || isArguments(expectationObj)) {
if (actualObj.length !== expectationObj.length) {
return false;
}
} else {
if (actualType !== expectationType || actualClass !== expectationClass || actualKeys.length !== expectationKeys.length || !hasAllEnumerableStringKeys(actualKeys, expectationKeys) || !hasAllEnumerableStringKeys(expectationKeys, actualKeys) || actualName && expectationName && actualName !== expectationName) {
return false;
}
}
if (isSet(actualObj) || isSet(expectationObj)) {
if (!isSet(actualObj) || !isSet(expectationObj) || actualObj.size !== expectationObj.size) {
return false;
}
return isSubset(actualObj, expectationObj, deepEqual);
}
if (isMap(actualObj) || isMap(expectationObj)) {
if (!isMap(actualObj) || !isMap(expectationObj) || actualObj.size !== expectationObj.size) {
return false;
}
var mapsDeeplyEqual = true;
mapForEach(actualObj, function(value, key) {
mapsDeeplyEqual = mapsDeeplyEqual && deepEqualCyclic(value, expectationObj.get(key));
});
return mapsDeeplyEqual;
}
if (typeof actualObj.jquery === "string" && typeof actualObj.is === "function") {
return actualObj.is(expectationObj);
}
var isActualNonArrayIterable = isIterable(actualObj) && !isArrayType(actualObj) && !isArguments(actualObj);
var isExpectationNonArrayIterable = isIterable(expectationObj) && !isArrayType(expectationObj) && !isArguments(expectationObj);
if (isActualNonArrayIterable || isExpectationNonArrayIterable) {
var actualArray = Array.from(actualObj);
var expectationArray = Array.from(expectationObj);
if (actualArray.length !== expectationArray.length) {
return false;
}
var arrayDeeplyEquals = true;
every(actualArray, function(key) {
arrayDeeplyEquals = arrayDeeplyEquals && deepEqualCyclic(actualArray[key], expectationArray[key]);
});
return arrayDeeplyEquals;
}
return every(expectationKeysAndSymbols, function(key) {
var actualValue = actualObj[key];
var expectationValue = expectationObj[key];
var actualObject = isObject(actualValue);
var expectationObject = isObject(expectationValue);
var actualIndex = actualObject ? indexOf(actualObjects, actualValue) : -1;
var expectationIndex = expectationObject ? indexOf(expectationObjects, expectationValue) : -1;
var newActualPath = actualIndex !== -1 ? actualPaths[actualIndex] : `${actualPath}[${JSON.stringify(key)}]`;
var newExpectationPath = expectationIndex !== -1 ? expectationPaths[expectationIndex] : `${expectationPath}[${JSON.stringify(key)}]`;
var combinedPath = newActualPath + newExpectationPath;
if (compared[combinedPath]) {
return true;
}
if (actualIndex === -1 && actualObject) {
push(actualObjects, actualValue);
push(actualPaths, newActualPath);
}
if (expectationIndex === -1 && expectationObject) {
push(expectationObjects, expectationValue);
push(expectationPaths, newExpectationPath);
}
if (actualObject && expectationObject) {
compared[combinedPath] = true;
}
return deepEqual(
actualValue,
expectationValue,
newActualPath,
newExpectationPath
);
});
})(actual, expectation, "$1", "$2");
}
deepEqualCyclic.use = function(match) {
return function deepEqual(a, b) {
return deepEqualCyclic(a, b, match);
};
};
module2.exports = deepEqualCyclic;
}
});
// node_modules/@sinonjs/samsam/lib/iterable-to-string.js
var require_iterable_to_string = __commonJS({
"node_modules/@sinonjs/samsam/lib/iterable-to-string.js"(exports2, module2) {
"use strict";
var slice = require_lib().prototypes.string.slice;
var typeOf = require_lib().typeOf;
var valueToString = require_lib().valueToString;
function iterableToString(obj) {
if (typeOf(obj) === "map") {
return mapToString(obj);
}
return genericIterableToString(obj);
}
function mapToString(map) {
var representation = "";
map.forEach(function(value, key) {
representation += `[${stringify(key)},${stringify(value)}],`;
});
representation = slice(representation, 0, -1);
return representation;
}
function genericIterableToString(iterable) {
var representation = "";
iterable.forEach(function(value) {
representation += `${stringify(value)},`;
});
representation = slice(representation, 0, -1);
return representation;
}
function stringify(item) {
return typeof item === "string" ? `'${item}'` : valueToString(item);
}
module2.exports = iterableToString;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/matcher-prototype.js
var require_matcher_prototype = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/matcher-prototype.js"(exports2, module2) {
"use strict";
var matcherPrototype = {
toString: function() {
return this.message;
}
};
matcherPrototype.or = function(valueOrMatcher) {
var createMatcher = require_create_matcher();
var isMatcher = createMatcher.isMatcher;
if (!arguments.length) {
throw new TypeError("Matcher expected");
}
var m2 = isMatcher(valueOrMatcher) ? valueOrMatcher : createMatcher(valueOrMatcher);
var m1 = this;
var or = Object.create(matcherPrototype);
or.test = function(actual) {
return m1.test(actual) || m2.test(actual);
};
or.message = `${m1.message}.or(${m2.message})`;
return or;
};
matcherPrototype.and = function(valueOrMatcher) {
var createMatcher = require_create_matcher();
var isMatcher = createMatcher.isMatcher;
if (!arguments.length) {
throw new TypeError("Matcher expected");
}
var m2 = isMatcher(valueOrMatcher) ? valueOrMatcher : createMatcher(valueOrMatcher);
var m1 = this;
var and = Object.create(matcherPrototype);
and.test = function(actual) {
return m1.test(actual) && m2.test(actual);
};
and.message = `${m1.message}.and(${m2.message})`;
return and;
};
module2.exports = matcherPrototype;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/is-matcher.js
var require_is_matcher = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/is-matcher.js"(exports2, module2) {
"use strict";
var isPrototypeOf = require_lib().prototypes.object.isPrototypeOf;
var matcherPrototype = require_matcher_prototype();
function isMatcher(object) {
return isPrototypeOf(matcherPrototype, object);
}
module2.exports = isMatcher;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/assert-matcher.js
var require_assert_matcher = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/assert-matcher.js"(exports2, module2) {
"use strict";
var isMatcher = require_is_matcher();
function assertMatcher(value) {
if (!isMatcher(value)) {
throw new TypeError("Matcher expected");
}
}
module2.exports = assertMatcher;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/assert-method-exists.js
var require_assert_method_exists = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/assert-method-exists.js"(exports2, module2) {
"use strict";
function assertMethodExists(value, method, name, methodPath) {
if (value[method] === null || value[method] === void 0) {
throw new TypeError(`Expected ${name} to have method ${methodPath}`);
}
}
module2.exports = assertMethodExists;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/assert-type.js
var require_assert_type = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/assert-type.js"(exports2, module2) {
"use strict";
var typeOf = require_lib().typeOf;
function assertType(value, type, name) {
var actual = typeOf(value);
if (actual !== type) {
throw new TypeError(
`Expected type of ${name} to be ${type}, but was ${actual}`
);
}
}
module2.exports = assertType;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/is-iterable.js
var require_is_iterable2 = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/is-iterable.js"(exports2, module2) {
"use strict";
var typeOf = require_lib().typeOf;
function isIterable(value) {
return Boolean(value) && typeOf(value.forEach) === "function";
}
module2.exports = isIterable;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/match-object.js
var require_match_object = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/match-object.js"(exports2, module2) {
"use strict";
var every = require_lib().prototypes.array.every;
var concat = require_lib().prototypes.array.concat;
var typeOf = require_lib().typeOf;
var deepEqualFactory = require_deep_equal().use;
var identical = require_identical();
var isMatcher = require_is_matcher();
var keys = Object.keys;
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
function matchObject(actual, expectation, matcher) {
var deepEqual = deepEqualFactory(matcher);
if (actual === null || actual === void 0) {
return false;
}
var expectedKeys = keys(expectation);
if (typeOf(getOwnPropertySymbols) === "function") {
expectedKeys = concat(expectedKeys, getOwnPropertySymbols(expectation));
}
return every(expectedKeys, function(key) {
var exp = expectation[key];
var act = actual[key];
if (isMatcher(exp)) {
if (!exp.test(act)) {
return false;
}
} else if (typeOf(exp) === "object") {
if (identical(exp, act)) {
return true;
}
if (!matchObject(act, exp, matcher)) {
return false;
}
} else if (!deepEqual(act, exp)) {
return false;
}
return true;
});
}
module2.exports = matchObject;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher/type-map.js
var require_type_map = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher/type-map.js"(exports2, module2) {
"use strict";
var functionName = require_lib().functionName;
var join = require_lib().prototypes.array.join;
var map = require_lib().prototypes.array.map;
var stringIndexOf = require_lib().prototypes.string.indexOf;
var valueToString = require_lib().valueToString;
var matchObject = require_match_object();
var createTypeMap = function(match) {
return {
function: function(m, expectation, message) {
m.test = expectation;
m.message = message || `match(${functionName(expectation)})`;
},
number: function(m, expectation) {
m.test = function(actual) {
return expectation == actual;
};
},
object: function(m, expectation) {
var array = [];
if (typeof expectation.test === "function") {
m.test = function(actual) {
return expectation.test(actual) === true;
};
m.message = `match(${functionName(expectation.test)})`;
return m;
}
array = map(Object.keys(expectation), function(key) {
return `${key}: ${valueToString(expectation[key])}`;
});
m.test = function(actual) {
return matchObject(actual, expectation, match);
};
m.message = `match(${join(array, ", ")})`;
return m;
},
regexp: function(m, expectation) {
m.test = function(actual) {
return typeof actual === "string" && expectation.test(actual);
};
},
string: function(m, expectation) {
m.test = function(actual) {
return typeof actual === "string" && stringIndexOf(actual, expectation) !== -1;
};
m.message = `match("${expectation}")`;
}
};
};
module2.exports = createTypeMap;
}
});
// node_modules/@sinonjs/samsam/lib/create-matcher.js
var require_create_matcher = __commonJS({
"node_modules/@sinonjs/samsam/lib/create-matcher.js"(exports2, module2) {
"use strict";
var arrayProto = require_lib().prototypes.array;
var deepEqual = require_deep_equal().use(createMatcher);
var every = require_lib().every;
var functionName = require_lib().functionName;
var iterableToString = require_iterable_to_string();
var objectProto = require_lib().prototypes.object;
var typeOf = require_lib().typeOf;
var valueToString = require_lib().valueToString;
var assertMatcher = require_assert_matcher();
var assertMethodExists = require_assert_method_exists();
var assertType = require_assert_type();
var isIterable = require_is_iterable2();
var isMatcher = require_is_matcher();
var matcherPrototype = require_matcher_prototype();
var arrayIndexOf = arrayProto.indexOf;
var some = arrayProto.some;
var hasOwnProperty = objectProto.hasOwnProperty;
var objectToString = objectProto.toString;
var TYPE_MAP = require_type_map()(createMatcher);
function createMatcher(expectation, message) {
var m = Object.create(matcherPrototype);
var type = typeOf(expectation);
if (message !== void 0 && typeof message !== "string") {
throw new TypeError("Message should be a string");
}
if (arguments.length > 2) {
throw new TypeError(
`Expected 1 or 2 arguments, received ${arguments.length}`
);
}
if (type in TYPE_MAP) {
TYPE_MAP[type](m, expectation, message);
} else {
m.test = function(actual) {
return deepEqual(actual, expectation);
};
}
if (!m.message) {
m.message = `match(${valueToString(expectation)})`;
}
Object.defineProperty(m, "message", {
configurable: false,
writable: false,
value: m.message
});
return m;
}
createMatcher.isMatcher = isMatcher;
createMatcher.any = createMatcher(function() {
return true;
}, "any");
createMatcher.defined = createMatcher(function(actual) {
return actual !== null && actual !== void 0;
}, "defined");
createMatcher.truthy = createMatcher(function(actual) {
return Boolean(actual);
}, "truthy");
createMatcher.falsy = createMatcher(function(actual) {
return !actual;
}, "falsy");
createMatcher.same = function(expectation) {
return createMatcher(
function(actual) {
return expectation === actual;
},
`same(${valueToString(expectation)})`
);
};
createMatcher.in = function(arrayOfExpectations) {
if (typeOf(arrayOfExpectations) !== "array") {
throw new TypeError("array expected");
}
return createMatcher(
function(actual) {
return some(arrayOfExpectations, function(expectation) {
return expectation === actual;
});
},
`in(${valueToString(arrayOfExpectations)})`
);
};
createMatcher.typeOf = function(type) {
assertType(type, "string", "type");
return createMatcher(function(actual) {
return typeOf(actual) === type;
}, `typeOf("${type}")`);
};
createMatcher.instanceOf = function(type) {
if (typeof Symbol === "undefined" || typeof Symbol.hasInstance === "undefined") {
assertType(type, "function", "type");
} else {
assertMethodExists(
type,
Symbol.hasInstance,
"type",
"[Symbol.hasInstance]"
);
}
return createMatcher(
function(actual) {
return actual instanceof type;
},
`instanceOf(${functionName(type) || objectToString(type)})`
);
};
function createPropertyMatcher(propertyTest, messagePrefix) {
return function(property, value) {
assertType(property, "string", "property");
var onlyProperty = arguments.length === 1;
var message = `${messagePrefix}("${property}"`;
if (!onlyProperty) {
message += `, ${valueToString(value)}`;
}
message += ")";
return createMatcher(function(actual) {
if (actual === void 0 || actual === null || !propertyTest(actual, property)) {
return false;
}
return onlyProperty || deepEqual(actual[property], value);
}, message);
};
}
createMatcher.has = createPropertyMatcher(function(actual, property) {
if (typeof actual === "object") {
return property in actual;
}
return actual[property] !== void 0;
}, "has");
createMatcher.hasOwn = createPropertyMatcher(function(actual, property) {
return hasOwnProperty(actual, property);
}, "hasOwn");
createMatcher.hasNested = function(property, value) {
assertType(property, "string", "property");
var onlyProperty = arguments.length === 1;
var message = `hasNested("${property}"`;
if (!onlyProperty) {
message += `, ${valueToString(value)}`;
}
message += ")";
return createMatcher(function(actual) {
const parts = property.split(/(?:\.|\[|\])+?/).filter(Boolean);
let current = actual;
for (const part of parts) {
current = current?.[part];
if (current === void 0) {
return false;
}
}
return onlyProperty || deepEqual(current, value);
}, message);
};
var jsonParseResultTypes = {
null: true,
boolean: true,
number: true,
string: true,
object: true,
array: true
};
createMatcher.json = function(value) {
if (!jsonParseResultTypes[typeOf(value)]) {
throw new TypeError("Value cannot be the result of JSON.parse");
}
var message = `json(${JSON.stringify(value, null, " ")})`;
return createMatcher(function(actual) {
var parsed;
try {
parsed = JSON.parse(actual);
} catch (e) {
return false;
}
return deepEqual(parsed, value);
}, message);
};
createMatcher.every = function(predicate) {
assertMatcher(predicate);
return createMatcher(function(actual) {
if (typeOf(actual) === "object") {
return every(Object.keys(actual), function(key) {
return predicate.test(actual[key]);
});
}
return isIterable(actual) && every(actual, function(element) {
return predicate.test(element);
});
}, `every(${predicate.message})`);
};
createMatcher.some = function(predicate) {
assertMatcher(predicate);
return createMatcher(function(actual) {
if (typeOf(actual) === "object") {
return !every(Object.keys(actual), function(key) {
return !predicate.test(actual[key]);
});
}
return isIterable(actual) && !every(actual, function(element) {
return !predicate.test(element);
});
}, `some(${predicate.message})`);
};
createMatcher.array = createMatcher.typeOf("array");
createMatcher.array.deepEquals = function(expectation) {
return createMatcher(
function(actual) {
var sameLength = actual.length === expectation.length;
return typeOf(actual) === "array" && sameLength && every(actual, function(element, index) {
var expected = expectation[index];
return typeOf(expected) === "array" && typeOf(element) === "array" ? createMatcher.array.deepEquals(expected).test(element) : deepEqual(expected, element);
});
},
`deepEquals([${iterableToString(expectation)}])`
);
};
createMatcher.array.startsWith = function(expectation) {
return createMatcher(
function(actual) {
return typeOf(actual) === "array" && every(expectation, function(expectedElement, index) {
return actual[index] === expectedElement;
});
},
`startsWith([${iterableToString(expectation)}])`
);
};
createMatcher.array.endsWith = function(expectation) {
return createMatcher(
function(actual) {
var offset = actual.length - expectation.length;
return typeOf(actual) === "array" && every(expectation, function(expectedElement, index) {
return actual[offset + index] === expectedElement;
});
},
`endsWith([${iterableToString(expectation)}])`
);
};
createMatcher.array.contains = function(expectation) {
return createMatcher(
function(actual) {
return typeOf(actual) === "array" && every(expectation, function(expectedElement) {
return arrayIndexOf(actual, expectedElement) !== -1;
});
},
`contains([${iterableToString(expectation)}])`
);
};
createMatcher.map = createMatcher.typeOf("map");
createMatcher.map.deepEquals = function mapDeepEquals(expectation) {
return createMatcher(
function(actual) {
var sameLength = actual.size === expectation.size;
return typeOf(actual) === "map" && sameLength && every(actual, function(element, key) {
return expectation.has(key) && expectation.get(key) === element;
});
},
`deepEquals(Map[${iterableToString(expectation)}])`
);
};
createMatcher.map.contains = function mapContains(expectation) {
return createMatcher(
function(actual) {
return typeOf(actual) === "map" && every(expectation, function(element, key) {
return actual.has(key) && actual.get(key) === element;
});
},
`contains(Map[${iterableToString(expectation)}])`
);
};
createMatcher.set = createMatcher.typeOf("set");
createMatcher.set.deepEquals = function setDeepEquals(expectation) {
return createMatcher(
function(actual) {
var sameLength = actual.size === expectation.size;
return typeOf(actual) === "set" && sameLength && every(actual, function(element) {
return expectation.has(element);
});
},
`deepEquals(Set[${iterableToString(expectation)}])`
);
};
createMatcher.set.contains = function setContains(expectation) {
return createMatcher(
function(actual) {
return typeOf(actual) === "set" && every(expectation, function(element) {
return actual.has(element);
});
},
`contains(Set[${iterableToString(expectation)}])`
);
};
createMatcher.bool = createMatcher.typeOf("boolean");
createMatcher.number = createMatcher.typeOf("number");
createMatcher.string = createMatcher.typeOf("string");
createMatcher.object = createMatcher.typeOf("object");
createMatcher.func = createMatcher.typeOf("function");
createMatcher.regexp = createMatcher.typeOf("regexp");
createMatcher.date = createMatcher.typeOf("date");
createMatcher.symbol = createMatcher.typeOf("symbol");
module2.exports = createMatcher;
}
});
// node_modules/@sinonjs/samsam/lib/match.js
var require_match = __commonJS({
"node_modules/@sinonjs/samsam/lib/match.js"(exports2, module2) {
"use strict";
var valueToString = require_lib().valueToString;
var indexOf = require_lib().prototypes.string.indexOf;
var forEach = require_lib().prototypes.array.forEach;
var type = require_type_detect2();
var engineCanCompareMaps = typeof Array.from === "function";
var deepEqual = require_deep_equal().use(match);
var isArrayType = require_is_array_type();
var isSubset = require_is_subset();
var createMatcher = require_create_matcher();
function arrayContains(array, subset, compare) {
if (subset.length === 0) {
return true;
}
var i, l, j, k;
for (i = 0, l = array.length; i < l; ++i) {
if (compare(array[i], subset[0])) {
for (j = 0, k = subset.length; j < k; ++j) {
if (i + j >= l) {
return false;
}
if (!compare(array[i + j], subset[j])) {
return false;
}
}
return true;
}
}
return false;
}
function match(object, matcherOrValue) {
if (matcherOrValue && typeof matcherOrValue.test === "function") {
return matcherOrValue.test(object);
}
switch (type(matcherOrValue)) {
case "bigint":
case "boolean":
case "number":
case "symbol":
return matcherOrValue === object;
case "function":
return matcherOrValue(object) === true;
case "string":
var notNull = typeof object === "string" || Boolean(object);
return notNull && indexOf(
valueToString(object).toLowerCase(),
matcherOrValue.toLowerCase()
) >= 0;
case "null":
return object === null;
case "undefined":
return typeof object === "undefined";
case "Date":
if (type(object) === "Date") {
return object.getTime() === matcherOrValue.getTime();
}
break;
case "Array":
case "Int8Array":
case "Uint8Array":
case "Uint8ClampedArray":
case "Int16Array":
case "Uint16Array":
case "Int32Array":
case "Uint32Array":
case "Float32Array":
case "Float64Array":
return isArrayType(matcherOrValue) && arrayContains(object, matcherOrValue, match);
case "Map":
if (!engineCanCompareMaps) {
throw new Error(
"The JavaScript engine does not support Array.from and cannot reliably do value comparison of Map instances"
);
}
return type(object) === "Map" && arrayContains(
Array.from(object),
Array.from(matcherOrValue),
match
);
default:
break;
}
switch (type(object)) {
case "null":
return false;
case "Set":
return isSubset(matcherOrValue, object, match);
default:
break;
}
if (matcherOrValue && typeof matcherOrValue === "object") {
if (matcherOrValue === object) {
return true;
}
if (typeof object !== "object") {
return false;
}
var prop;
for (prop in matcherOrValue) {
var value = object[prop];
if (typeof value === "undefined" && typeof object.getAttribute === "function") {
value = object.getAttribute(prop);
}
if (matcherOrValue[prop] === null || typeof matcherOrValue[prop] === "undefined") {
if (value !== matcherOrValue[prop]) {
return false;
}
} else if (typeof value === "undefined" || !deepEqual(value, matcherOrValue[prop])) {
return false;
}
}
return true;
}
throw new Error("Matcher was an unknown or unsupported type");
}
forEach(Object.keys(createMatcher), function(key) {
match[key] = createMatcher[key];
});
module2.exports = match;
}
});
// node_modules/@sinonjs/samsam/lib/samsam.js
var require_samsam = __commonJS({
"node_modules/@sinonjs/samsam/lib/samsam.js"(exports2, module2) {
"use strict";
var identical = require_identical();
var isArguments = require_is_arguments();
var isElement = require_is_element();
var isNegZero = require_is_neg_zero();
var isSet = require_is_set();
var isMap = require_is_map();
var match = require_match();
var deepEqualCyclic = require_deep_equal().use(match);
var createMatcher = require_create_matcher();
module2.exports = {
createMatcher,
deepEqual: deepEqualCyclic,
identical,
isArguments,
isElement,
isMap,
isNegZero,
isSet,
match
};
}
});
// lib/sinon/util/core/walk.js
var require_walk = __commonJS({
"lib/sinon/util/core/walk.js"(exports2, module2) {
"use strict";
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var forEach = prototypes.array.forEach;
function walkInternal(obj, iterator, context, originalObj, seen) {
let prop;
const proto = Object.getPrototypeOf(obj);
if (typeof Object.getOwnPropertyNames !== "function") {
for (prop in obj) {
iterator.call(context, obj[prop], prop, obj);
}
return;
}
forEach(Object.getOwnPropertyNames(obj), function(k) {
if (k !== "__proto__" && seen[k] !== true) {
seen[k] = true;
const target = typeof Object.getOwnPropertyDescriptor(obj, k).get === "function" ? originalObj : obj;
iterator.call(context, k, target);
}
});
if (proto) {
walkInternal(proto, iterator, context, originalObj, seen);
}
}
var walk = function(obj, iterator, context) {
return walkInternal(obj, iterator, context, obj, /* @__PURE__ */ Object.create(null));
};
module2.exports = walk;
}
});
// lib/sinon/util/core/get-property-descriptor.js
var require_get_property_descriptor = __commonJS({
"lib/sinon/util/core/get-property-descriptor.js"(exports2, module2) {
"use strict";
function getPropertyDescriptor(object, property) {
let proto = object;
let descriptor;
const isOwn = Boolean(
object && Object.getOwnPropertyDescriptor(object, property)
);
while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {
proto = Object.getPrototypeOf(proto);
}
if (descriptor) {
descriptor.isOwn = isOwn;
}
return descriptor;
}
module2.exports = getPropertyDescriptor;
}
});
// lib/sinon/collect-own-methods.js
var require_collect_own_methods = __commonJS({
"lib/sinon/collect-own-methods.js"(exports2, module2) {
"use strict";
var walk = require_walk();
var getPropertyDescriptor = require_get_property_descriptor();
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { hasOwnProperty } = prototypes.object;
var { push } = prototypes.array;
function collectMethod(methods, object, prop, propOwner) {
const descriptor = getPropertyDescriptor(propOwner, prop);
const value = descriptor.value;
if (typeof value === "function" && hasOwnProperty(object, prop) && value && value.restore && value.restore.sinon) {
push(methods, value);
}
}
function collectOwnMethods(object) {
const methods = [];
walk(object, collectMethod.bind(null, methods, object));
return methods;
}
module2.exports = collectOwnMethods;
}
});
// lib/sinon/util/core/times-in-words.js
var require_times_in_words = __commonJS({
"lib/sinon/util/core/times-in-words.js"(exports2, module2) {
"use strict";
var array = [null, "once", "twice", "thrice"];
function timesInWords(count) {
return array[count] || `${count || 0} times`;
}
module2.exports = timesInWords;
}
});
// node_modules/has-symbols/shams.js
var require_shams = __commonJS({
"node_modules/has-symbols/shams.js"(exports2, module2) {
"use strict";
module2.exports = function hasSymbols() {
if (typeof Symbol !== "function" || typeof Object.getOwnPropertySymbols !== "function") {
return false;
}
if (typeof Symbol.iterator === "symbol") {
return true;
}
var obj = {};
var sym = /* @__PURE__ */ Symbol("test");
var symObj = Object(sym);
if (typeof sym === "string") {
return false;
}
if (Object.prototype.toString.call(sym) !== "[object Symbol]") {
return false;
}
if (Object.prototype.toString.call(symObj) !== "[object Symbol]") {
return false;
}
var symVal = 42;
obj[sym] = symVal;
for (var _ in obj) {
return false;
}
if (typeof Object.keys === "function" && Object.keys(obj).length !== 0) {
return false;
}
if (typeof Object.getOwnPropertyNames === "function" && Object.getOwnPropertyNames(obj).length !== 0) {
return false;
}
var syms = Object.getOwnPropertySymbols(obj);
if (syms.length !== 1 || syms[0] !== sym) {
return false;
}
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) {
return false;
}
if (typeof Object.getOwnPropertyDescriptor === "function") {
var descriptor = (
/** @type {PropertyDescriptor} */
Object.getOwnPropertyDescriptor(obj, sym)
);
if (descriptor.value !== symVal || descriptor.enumerable !== true) {
return false;
}
}
return true;
};
}
});
// node_modules/has-tostringtag/shams.js
var require_shams2 = __commonJS({
"node_modules/has-tostringtag/shams.js"(exports2, module2) {
"use strict";
var hasSymbols = require_shams();
module2.exports = function hasToStringTagShams() {
return hasSymbols() && !!Symbol.toStringTag;
};
}
});
// node_modules/es-object-atoms/index.js
var require_es_object_atoms = __commonJS({
"node_modules/es-object-atoms/index.js"(exports2, module2) {
"use strict";
module2.exports = Object;
}
});
// node_modules/es-errors/index.js
var require_es_errors = __commonJS({
"node_modules/es-errors/index.js"(exports2, module2) {
"use strict";
module2.exports = Error;
}
});
// node_modules/es-errors/eval.js
var require_eval = __commonJS({
"node_modules/es-errors/eval.js"(exports2, module2) {
"use strict";
module2.exports = EvalError;
}
});
// node_modules/es-errors/range.js
var require_range = __commonJS({
"node_modules/es-errors/range.js"(exports2, module2) {
"use strict";
module2.exports = RangeError;
}
});
// node_modules/es-errors/ref.js
var require_ref = __commonJS({
"node_modules/es-errors/ref.js"(exports2, module2) {
"use strict";
module2.exports = ReferenceError;
}
});
// node_modules/es-errors/syntax.js
var require_syntax = __commonJS({
"node_modules/es-errors/syntax.js"(exports2, module2) {
"use strict";
module2.exports = SyntaxError;
}
});
// node_modules/es-errors/type.js
var require_type = __commonJS({
"node_modules/es-errors/type.js"(exports2, module2) {
"use strict";
module2.exports = TypeError;
}
});
// node_modules/es-errors/uri.js
var require_uri = __commonJS({
"node_modules/es-errors/uri.js"(exports2, module2) {
"use strict";
module2.exports = URIError;
}
});
// node_modules/math-intrinsics/abs.js
var require_abs = __commonJS({
"node_modules/math-intrinsics/abs.js"(exports2, module2) {
"use strict";
module2.exports = Math.abs;
}
});
// node_modules/math-intrinsics/floor.js
var require_floor = __commonJS({
"node_modules/math-intrinsics/floor.js"(exports2, module2) {
"use strict";
module2.exports = Math.floor;
}
});
// node_modules/math-intrinsics/max.js
var require_max = __commonJS({
"node_modules/math-intrinsics/max.js"(exports2, module2) {
"use strict";
module2.exports = Math.max;
}
});
// node_modules/math-intrinsics/min.js
var require_min = __commonJS({
"node_modules/math-intrinsics/min.js"(exports2, module2) {
"use strict";
module2.exports = Math.min;
}
});
// node_modules/math-intrinsics/pow.js
var require_pow = __commonJS({
"node_modules/math-intrinsics/pow.js"(exports2, module2) {
"use strict";
module2.exports = Math.pow;
}
});
// node_modules/math-intrinsics/round.js
var require_round = __commonJS({
"node_modules/math-intrinsics/round.js"(exports2, module2) {
"use strict";
module2.exports = Math.round;
}
});
// node_modules/math-intrinsics/isNaN.js
var require_isNaN = __commonJS({
"node_modules/math-intrinsics/isNaN.js"(exports2, module2) {
"use strict";
module2.exports = Number.isNaN || function isNaN2(a) {
return a !== a;
};
}
});
// node_modules/math-intrinsics/sign.js
var require_sign = __commonJS({
"node_modules/math-intrinsics/sign.js"(exports2, module2) {
"use strict";
var $isNaN = require_isNaN();
module2.exports = function sign(number) {
if ($isNaN(number) || number === 0) {
return number;
}
return number < 0 ? -1 : 1;
};
}
});
// node_modules/gopd/gOPD.js
var require_gOPD = __commonJS({
"node_modules/gopd/gOPD.js"(exports2, module2) {
"use strict";
module2.exports = Object.getOwnPropertyDescriptor;
}
});
// node_modules/gopd/index.js
var require_gopd = __commonJS({
"node_modules/gopd/index.js"(exports2, module2) {
"use strict";
var $gOPD = require_gOPD();
if ($gOPD) {
try {
$gOPD([], "length");
} catch (e) {
$gOPD = null;
}
}
module2.exports = $gOPD;
}
});
// node_modules/es-define-property/index.js
var require_es_define_property = __commonJS({
"node_modules/es-define-property/index.js"(exports2, module2) {
"use strict";
var $defineProperty = Object.defineProperty || false;
if ($defineProperty) {
try {
$defineProperty({}, "a", { value: 1 });
} catch (e) {
$defineProperty = false;
}
}
module2.exports = $defineProperty;
}
});
// node_modules/has-symbols/index.js
var require_has_symbols = __commonJS({
"node_modules/has-symbols/index.js"(exports2, module2) {
"use strict";
var origSymbol = typeof Symbol !== "undefined" && Symbol;
var hasSymbolSham = require_shams();
module2.exports = function hasNativeSymbols() {
if (typeof origSymbol !== "function") {
return false;
}
if (typeof Symbol !== "function") {
return false;
}
if (typeof origSymbol("foo") !== "symbol") {
return false;
}
if (typeof /* @__PURE__ */ Symbol("bar") !== "symbol") {
return false;
}
return hasSymbolSham();
};
}
});
// node_modules/get-proto/Reflect.getPrototypeOf.js
var require_Reflect_getPrototypeOf = __commonJS({
"node_modules/get-proto/Reflect.getPrototypeOf.js"(exports2, module2) {
"use strict";
module2.exports = typeof Reflect !== "undefined" && Reflect.getPrototypeOf || null;
}
});
// node_modules/get-proto/Object.getPrototypeOf.js
var require_Object_getPrototypeOf = __commonJS({
"node_modules/get-proto/Object.getPrototypeOf.js"(exports2, module2) {
"use strict";
var $Object = require_es_object_atoms();
module2.exports = $Object.getPrototypeOf || null;
}
});
// node_modules/function-bind/implementation.js
var require_implementation = __commonJS({
"node_modules/function-bind/implementation.js"(exports2, module2) {
"use strict";
var ERROR_MESSAGE = "Function.prototype.bind called on incompatible ";
var toStr = Object.prototype.toString;
var max = Math.max;
var funcType = "[object Function]";
var concatty = function concatty2(a, b) {
var arr = [];
for (var i = 0; i < a.length; i += 1) {
arr[i] = a[i];
}
for (var j = 0; j < b.length; j += 1) {
arr[j + a.length] = b[j];
}
return arr;
};
var slicy = function slicy2(arrLike, offset) {
var arr = [];
for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
arr[j] = arrLike[i];
}
return arr;
};
var joiny = function(arr, joiner) {
var str = "";
for (var i = 0; i < arr.length; i += 1) {
str += arr[i];
if (i + 1 < arr.length) {
str += joiner;
}
}
return str;
};
module2.exports = function bind(that) {
var target = this;
if (typeof target !== "function" || toStr.apply(target) !== funcType) {
throw new TypeError(ERROR_MESSAGE + target);
}
var args = slicy(arguments, 1);
var bound;
var binder = function() {
if (this instanceof bound) {
var result = target.apply(
this,
concatty(args, arguments)
);
if (Object(result) === result) {
return result;
}
return this;
}
return target.apply(
that,
concatty(args, arguments)
);
};
var boundLength = max(0, target.length - args.length);
var boundArgs = [];
for (var i = 0; i < boundLength; i++) {
boundArgs[i] = "$" + i;
}
bound = Function("binder", "return function (" + joiny(boundArgs, ",") + "){ return binder.apply(this,arguments); }")(binder);
if (target.prototype) {
var Empty = function Empty2() {
};
Empty.prototype = target.prototype;
bound.prototype = new Empty();
Empty.prototype = null;
}
return bound;
};
}
});
// node_modules/function-bind/index.js
var require_function_bind = __commonJS({
"node_modules/function-bind/index.js"(exports2, module2) {
"use strict";
var implementation = require_implementation();
module2.exports = Function.prototype.bind || implementation;
}
});
// node_modules/call-bind-apply-helpers/functionCall.js
var require_functionCall = __commonJS({
"node_modules/call-bind-apply-helpers/functionCall.js"(exports2, module2) {
"use strict";
module2.exports = Function.prototype.call;
}
});
// node_modules/call-bind-apply-helpers/functionApply.js
var require_functionApply = __commonJS({
"node_modules/call-bind-apply-helpers/functionApply.js"(exports2, module2) {
"use strict";
module2.exports = Function.prototype.apply;
}
});
// node_modules/call-bind-apply-helpers/reflectApply.js
var require_reflectApply = __commonJS({
"node_modules/call-bind-apply-helpers/reflectApply.js"(exports2, module2) {
"use strict";
module2.exports = typeof Reflect !== "undefined" && Reflect && Reflect.apply;
}
});
// node_modules/call-bind-apply-helpers/actualApply.js
var require_actualApply = __commonJS({
"node_modules/call-bind-apply-helpers/actualApply.js"(exports2, module2) {
"use strict";
var bind = require_function_bind();
var $apply = require_functionApply();
var $call = require_functionCall();
var $reflectApply = require_reflectApply();
module2.exports = $reflectApply || bind.call($call, $apply);
}
});
// node_modules/call-bind-apply-helpers/index.js
var require_call_bind_apply_helpers = __commonJS({
"node_modules/call-bind-apply-helpers/index.js"(exports2, module2) {
"use strict";
var bind = require_function_bind();
var $TypeError = require_type();
var $call = require_functionCall();
var $actualApply = require_actualApply();
module2.exports = function callBindBasic(args) {
if (args.length < 1 || typeof args[0] !== "function") {
throw new $TypeError("a function is required");
}
return $actualApply(bind, $call, args);
};
}
});
// node_modules/dunder-proto/get.js
var require_get = __commonJS({
"node_modules/dunder-proto/get.js"(exports2, module2) {
"use strict";
var callBind = require_call_bind_apply_helpers();
var gOPD = require_gopd();
var hasProtoAccessor;
try {
hasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */
[].__proto__ === Array.prototype;
} catch (e) {
if (!e || typeof e !== "object" || !("code" in e) || e.code !== "ERR_PROTO_ACCESS") {
throw e;
}
}
var desc = !!hasProtoAccessor && gOPD && gOPD(
Object.prototype,
/** @type {keyof typeof Object.prototype} */
"__proto__"
);
var $Object = Object;
var $getPrototypeOf = $Object.getPrototypeOf;
module2.exports = desc && typeof desc.get === "function" ? callBind([desc.get]) : typeof $getPrototypeOf === "function" ? (
/** @type {import('./get')} */
function getDunder(value) {
return $getPrototypeOf(value == null ? value : $Object(value));
}
) : false;
}
});
// node_modules/get-proto/index.js
var require_get_proto = __commonJS({
"node_modules/get-proto/index.js"(exports2, module2) {
"use strict";
var reflectGetProto = require_Reflect_getPrototypeOf();
var originalGetProto = require_Object_getPrototypeOf();
var getDunderProto = require_get();
module2.exports = reflectGetProto ? function getProto(O) {
return reflectGetProto(O);
} : originalGetProto ? function getProto(O) {
if (!O || typeof O !== "object" && typeof O !== "function") {
throw new TypeError("getProto: not an object");
}
return originalGetProto(O);
} : getDunderProto ? function getProto(O) {
return getDunderProto(O);
} : null;
}
});
// node_modules/hasown/index.js
var require_hasown = __commonJS({
"node_modules/hasown/index.js"(exports2, module2) {
"use strict";
var call = Function.prototype.call;
var $hasOwn = Object.prototype.hasOwnProperty;
var bind = require_function_bind();
module2.exports = bind.call(call, $hasOwn);
}
});
// node_modules/get-intrinsic/index.js
var require_get_intrinsic = __commonJS({
"node_modules/get-intrinsic/index.js"(exports2, module2) {
"use strict";
var undefined2;
var $Object = require_es_object_atoms();
var $Error = require_es_errors();
var $EvalError = require_eval();
var $RangeError = require_range();
var $ReferenceError = require_ref();
var $SyntaxError = require_syntax();
var $TypeError = require_type();
var $URIError = require_uri();
var abs = require_abs();
var floor = require_floor();
var max = require_max();
var min = require_min();
var pow = require_pow();
var round = require_round();
var sign = require_sign();
var $Function = Function;
var getEvalledConstructor = function(expressionSyntax) {
try {
return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")();
} catch (e) {
}
};
var $gOPD = require_gopd();
var $defineProperty = require_es_define_property();
var throwTypeError = function() {
throw new $TypeError();
};
var ThrowTypeError = $gOPD ? (function() {
try {
arguments.callee;
return throwTypeError;
} catch (calleeThrows) {
try {
return $gOPD(arguments, "callee").get;
} catch (gOPDthrows) {
return throwTypeError;
}
}
})() : throwTypeError;
var hasSymbols = require_has_symbols()();
var getProto = require_get_proto();
var $ObjectGPO = require_Object_getPrototypeOf();
var $ReflectGPO = require_Reflect_getPrototypeOf();
var $apply = require_functionApply();
var $call = require_functionCall();
var needsEval = {};
var TypedArray = typeof Uint8Array === "undefined" || !getProto ? undefined2 : getProto(Uint8Array);
var INTRINSICS = {
__proto__: null,
"%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError,
"%Array%": Array,
"%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer,
"%ArrayIteratorPrototype%": hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined2,
"%AsyncFromSyncIteratorPrototype%": undefined2,
"%AsyncFunction%": needsEval,
"%AsyncGenerator%": needsEval,
"%AsyncGeneratorFunction%": needsEval,
"%AsyncIteratorPrototype%": needsEval,
"%Atomics%": typeof Atomics === "undefined" ? undefined2 : Atomics,
"%BigInt%": typeof BigInt === "undefined" ? undefined2 : BigInt,
"%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined2 : BigInt64Array,
"%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined2 : BigUint64Array,
"%Boolean%": Boolean,
"%DataView%": typeof DataView === "undefined" ? undefined2 : DataView,
"%Date%": Date,
"%decodeURI%": decodeURI,
"%decodeURIComponent%": decodeURIComponent,
"%encodeURI%": encodeURI,
"%encodeURIComponent%": encodeURIComponent,
"%Error%": $Error,
"%eval%": eval,
// eslint-disable-line no-eval
"%EvalError%": $EvalError,
"%Float16Array%": typeof Float16Array === "undefined" ? undefined2 : Float16Array,
"%Float32Array%": typeof Float32Array === "undefined" ? undefined2 : Float32Array,
"%Float64Array%": typeof Float64Array === "undefined" ? undefined2 : Float64Array,
"%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined2 : FinalizationRegistry,
"%Function%": $Function,
"%GeneratorFunction%": needsEval,
"%Int8Array%": typeof Int8Array === "undefined" ? undefined2 : Int8Array,
"%Int16Array%": typeof Int16Array === "undefined" ? undefined2 : Int16Array,
"%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array,
"%isFinite%": isFinite,
"%isNaN%": isNaN,
"%IteratorPrototype%": hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined2,
"%JSON%": typeof JSON === "object" ? JSON : undefined2,
"%Map%": typeof Map === "undefined" ? undefined2 : Map,
"%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Map())[Symbol.iterator]()),
"%Math%": Math,
"%Number%": Number,
"%Object%": $Object,
"%Object.getOwnPropertyDescriptor%": $gOPD,
"%parseFloat%": parseFloat,
"%parseInt%": parseInt,
"%Promise%": typeof Promise === "undefined" ? undefined2 : Promise,
"%Proxy%": typeof Proxy === "undefined" ? undefined2 : Proxy,
"%RangeError%": $RangeError,
"%ReferenceError%": $ReferenceError,
"%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect,
"%RegExp%": RegExp,
"%Set%": typeof Set === "undefined" ? undefined2 : Set,
"%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Set())[Symbol.iterator]()),
"%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer,
"%String%": String,
"%StringIteratorPrototype%": hasSymbols && getProto ? getProto(""[Symbol.iterator]()) : undefined2,
"%Symbol%": hasSymbols ? Symbol : undefined2,
"%SyntaxError%": $SyntaxError,
"%ThrowTypeError%": ThrowTypeError,
"%TypedArray%": TypedArray,
"%TypeError%": $TypeError,
"%Uint8Array%": typeof Uint8Array === "undefined" ? undefined2 : Uint8Array,
"%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined2 : Uint8ClampedArray,
"%Uint16Array%": typeof Uint16Array === "undefined" ? undefined2 : Uint16Array,
"%Uint32Array%": typeof Uint32Array === "undefined" ? undefined2 : Uint32Array,
"%URIError%": $URIError,
"%WeakMap%": typeof WeakMap === "undefined" ? undefined2 : WeakMap,
"%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef,
"%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet,
"%Function.prototype.call%": $call,
"%Function.prototype.apply%": $apply,
"%Object.defineProperty%": $defineProperty,
"%Object.getPrototypeOf%": $ObjectGPO,
"%Math.abs%": abs,
"%Math.floor%": floor,
"%Math.max%": max,
"%Math.min%": min,
"%Math.pow%": pow,
"%Math.round%": round,
"%Math.sign%": sign,
"%Reflect.getPrototypeOf%": $ReflectGPO
};
if (getProto) {
try {
null.error;
} catch (e) {
errorProto = getProto(getProto(e));
INTRINSICS["%Error.prototype%"] = errorProto;
}
}
var errorProto;
var doEval = function doEval2(name) {
var value;
if (name === "%AsyncFunction%") {
value = getEvalledConstructor("async function () {}");
} else if (name === "%GeneratorFunction%") {
value = getEvalledConstructor("function* () {}");
} else if (name === "%AsyncGeneratorFunction%") {
value = getEvalledConstructor("async function* () {}");
} else if (name === "%AsyncGenerator%") {
var fn = doEval2("%AsyncGeneratorFunction%");
if (fn) {
value = fn.prototype;
}
} else if (name === "%AsyncIteratorPrototype%") {
var gen = doEval2("%AsyncGenerator%");
if (gen && getProto) {
value = getProto(gen.prototype);
}
}
INTRINSICS[name] = value;
return value;
};
var LEGACY_ALIASES = {
__proto__: null,
"%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"],
"%ArrayPrototype%": ["Array", "prototype"],
"%ArrayProto_entries%": ["Array", "prototype", "entries"],
"%ArrayProto_forEach%": ["Array", "prototype", "forEach"],
"%ArrayProto_keys%": ["Array", "prototype", "keys"],
"%ArrayProto_values%": ["Array", "prototype", "values"],
"%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"],
"%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"],
"%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"],
"%BooleanPrototype%": ["Boolean", "prototype"],
"%DataViewPrototype%": ["DataView", "prototype"],
"%DatePrototype%": ["Date", "prototype"],
"%ErrorPrototype%": ["Error", "prototype"],
"%EvalErrorPrototype%": ["EvalError", "prototype"],
"%Float32ArrayPrototype%": ["Float32Array", "prototype"],
"%Float64ArrayPrototype%": ["Float64Array", "prototype"],
"%FunctionPrototype%": ["Function", "prototype"],
"%Generator%": ["GeneratorFunction", "prototype"],
"%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"],
"%Int8ArrayPrototype%": ["Int8Array", "prototype"],
"%Int16ArrayPrototype%": ["Int16Array", "prototype"],
"%Int32ArrayPrototype%": ["Int32Array", "prototype"],
"%JSONParse%": ["JSON", "parse"],
"%JSONStringify%": ["JSON", "stringify"],
"%MapPrototype%": ["Map", "prototype"],
"%NumberPrototype%": ["Number", "prototype"],
"%ObjectPrototype%": ["Object", "prototype"],
"%ObjProto_toString%": ["Object", "prototype", "toString"],
"%ObjProto_valueOf%": ["Object", "prototype", "valueOf"],
"%PromisePrototype%": ["Promise", "prototype"],
"%PromiseProto_then%": ["Promise", "prototype", "then"],
"%Promise_all%": ["Promise", "all"],
"%Promise_reject%": ["Promise", "reject"],
"%Promise_resolve%": ["Promise", "resolve"],
"%RangeErrorPrototype%": ["RangeError", "prototype"],
"%ReferenceErrorPrototype%": ["ReferenceError", "prototype"],
"%RegExpPrototype%": ["RegExp", "prototype"],
"%SetPrototype%": ["Set", "prototype"],
"%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"],
"%StringPrototype%": ["String", "prototype"],
"%SymbolPrototype%": ["Symbol", "prototype"],
"%SyntaxErrorPrototype%": ["SyntaxError", "prototype"],
"%TypedArrayPrototype%": ["TypedArray", "prototype"],
"%TypeErrorPrototype%": ["TypeError", "prototype"],
"%Uint8ArrayPrototype%": ["Uint8Array", "prototype"],
"%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"],
"%Uint16ArrayPrototype%": ["Uint16Array", "prototype"],
"%Uint32ArrayPrototype%": ["Uint32Array", "prototype"],
"%URIErrorPrototype%": ["URIError", "prototype"],
"%WeakMapPrototype%": ["WeakMap", "prototype"],
"%WeakSetPrototype%": ["WeakSet", "prototype"]
};
var bind = require_function_bind();
var hasOwn = require_hasown();
var $concat = bind.call($call, Array.prototype.concat);
var $spliceApply = bind.call($apply, Array.prototype.splice);
var $replace = bind.call($call, String.prototype.replace);
var $strSlice = bind.call($call, String.prototype.slice);
var $exec = bind.call($call, RegExp.prototype.exec);
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g;
var stringToPath = function stringToPath2(string) {
var first = $strSlice(string, 0, 1);
var last = $strSlice(string, -1);
if (first === "%" && last !== "%") {
throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`");
} else if (last === "%" && first !== "%") {
throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`");
}
var result = [];
$replace(string, rePropName, function(match, number, quote, subString) {
result[result.length] = quote ? $replace(subString, reEscapeChar, "$1") : number || match;
});
return result;
};
var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) {
var intrinsicName = name;
var alias;
if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
alias = LEGACY_ALIASES[intrinsicName];
intrinsicName = "%" + alias[0] + "%";
}
if (hasOwn(INTRINSICS, intrinsicName)) {
var value = INTRINSICS[intrinsicName];
if (value === needsEval) {
value = doEval(intrinsicName);
}
if (typeof value === "undefined" && !allowMissing) {
throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!");
}
return {
alias,
name: intrinsicName,
value
};
}
throw new $SyntaxError("intrinsic " + name + " does not exist!");
};
module2.exports = function GetIntrinsic(name, allowMissing) {
if (typeof name !== "string" || name.length === 0) {
throw new $TypeError("intrinsic name must be a non-empty string");
}
if (arguments.length > 1 && typeof allowMissing !== "boolean") {
throw new $TypeError('"allowMissing" argument must be a boolean');
}
if ($exec(/^%?[^%]*%?$/, name) === null) {
throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name");
}
var parts = stringToPath(name);
var intrinsicBaseName = parts.length > 0 ? parts[0] : "";
var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing);
var intrinsicRealName = intrinsic.name;
var value = intrinsic.value;
var skipFurtherCaching = false;
var alias = intrinsic.alias;
if (alias) {
intrinsicBaseName = alias[0];
$spliceApply(parts, $concat([0, 1], alias));
}
for (var i = 1, isOwn = true; i < parts.length; i += 1) {
var part = parts[i];
var first = $strSlice(part, 0, 1);
var last = $strSlice(part, -1);
if ((first === '"' || first === "'" || first === "`" || (last === '"' || last === "'" || last === "`")) && first !== last) {
throw new $SyntaxError("property names with quotes must have matching quotes");
}
if (part === "constructor" || !isOwn) {
skipFurtherCaching = true;
}
intrinsicBaseName += "." + part;
intrinsicRealName = "%" + intrinsicBaseName + "%";
if (hasOwn(INTRINSICS, intrinsicRealName)) {
value = INTRINSICS[intrinsicRealName];
} else if (value != null) {
if (!(part in value)) {
if (!allowMissing) {
throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available.");
}
return void undefined2;
}
if ($gOPD && i + 1 >= parts.length) {
var desc = $gOPD(value, part);
isOwn = !!desc;
if (isOwn && "get" in desc && !("originalValue" in desc.get)) {
value = desc.get;
} else {
value = value[part];
}
} else {
isOwn = hasOwn(value, part);
value = value[part];
}
if (isOwn && !skipFurtherCaching) {
INTRINSICS[intrinsicRealName] = value;
}
}
}
return value;
};
}
});
// node_modules/call-bound/index.js
var require_call_bound = __commonJS({
"node_modules/call-bound/index.js"(exports2, module2) {
"use strict";
var GetIntrinsic = require_get_intrinsic();
var callBindBasic = require_call_bind_apply_helpers();
var $indexOf = callBindBasic([GetIntrinsic("%String.prototype.indexOf%")]);
module2.exports = function callBoundIntrinsic(name, allowMissing) {
var intrinsic = (
/** @type {(this: unknown, ...args: unknown[]) => unknown} */
GetIntrinsic(name, !!allowMissing)
);
if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) {
return callBindBasic(
/** @type {const} */
[intrinsic]
);
}
return intrinsic;
};
}
});
// node_modules/is-arguments/index.js
var require_is_arguments2 = __commonJS({
"node_modules/is-arguments/index.js"(exports2, module2) {
"use strict";
var hasToStringTag = require_shams2()();
var callBound = require_call_bound();
var $toString = callBound("Object.prototype.toString");
var isStandardArguments = function isArguments(value) {
if (hasToStringTag && value && typeof value === "object" && Symbol.toStringTag in value) {
return false;
}
return $toString(value) === "[object Arguments]";
};
var isLegacyArguments = function isArguments(value) {
if (isStandardArguments(value)) {
return true;
}
return value !== null && typeof value === "object" && "length" in value && typeof value.length === "number" && value.length >= 0 && $toString(value) !== "[object Array]" && "callee" in value && $toString(value.callee) === "[object Function]";
};
var supportsStandardArguments = (function() {
return isStandardArguments(arguments);
})();
isStandardArguments.isLegacyArguments = isLegacyArguments;
module2.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;
}
});
// node_modules/is-regex/index.js
var require_is_regex = __commonJS({
"node_modules/is-regex/index.js"(exports2, module2) {
"use strict";
var callBound = require_call_bound();
var hasToStringTag = require_shams2()();
var hasOwn = require_hasown();
var gOPD = require_gopd();
var fn;
if (hasToStringTag) {
$exec = callBound("RegExp.prototype.exec");
isRegexMarker = {};
throwRegexMarker = function() {
throw isRegexMarker;
};
badStringifier = {
toString: throwRegexMarker,
valueOf: throwRegexMarker
};
if (typeof Symbol.toPrimitive === "symbol") {
badStringifier[Symbol.toPrimitive] = throwRegexMarker;
}
fn = function isRegex(value) {
if (!value || typeof value !== "object") {
return false;
}
var descriptor = (
/** @type {NonNullable<typeof gOPD>} */
gOPD(
/** @type {{ lastIndex?: unknown }} */
value,
"lastIndex"
)
);
var hasLastIndexDataProperty = descriptor && hasOwn(descriptor, "value");
if (!hasLastIndexDataProperty) {
return false;
}
try {
$exec(
value,
/** @type {string} */
/** @type {unknown} */
badStringifier
);
} catch (e) {
return e === isRegexMarker;
}
};
} else {
$toString = callBound("Object.prototype.toString");
regexClass = "[object RegExp]";
fn = function isRegex(value) {
if (!value || typeof value !== "object" && typeof value !== "function") {
return false;
}
return $toString(value) === regexClass;
};
}
var $exec;
var isRegexMarker;
var throwRegexMarker;
var badStringifier;
var $toString;
var regexClass;
module2.exports = fn;
}
});
// node_modules/safe-regex-test/index.js
var require_safe_regex_test = __commonJS({
"node_modules/safe-regex-test/index.js"(exports2, module2) {
"use strict";
var callBound = require_call_bound();
var isRegex = require_is_regex();
var $exec = callBound("RegExp.prototype.exec");
var $TypeError = require_type();
module2.exports = function regexTester(regex) {
if (!isRegex(regex)) {
throw new $TypeError("`regex` must be a RegExp");
}
return function test(s) {
return $exec(regex, s) !== null;
};
};
}
});
// node_modules/generator-function/index.js
var require_generator_function = __commonJS({
"node_modules/generator-function/index.js"(exports2, module2) {
"use strict";
var cached = (
/** @type {GeneratorFunctionConstructor} */
function* () {
}.constructor
);
module2.exports = () => cached;
}
});
// node_modules/is-generator-function/index.js
var require_is_generator_function = __commonJS({
"node_modules/is-generator-function/index.js"(exports2, module2) {
"use strict";
var callBound = require_call_bound();
var safeRegexTest = require_safe_regex_test();
var isFnRegex = safeRegexTest(/^\s*(?:function)?\*/);
var hasToStringTag = require_shams2()();
var getProto = require_get_proto();
var toStr = callBound("Object.prototype.toString");
var fnToStr = callBound("Function.prototype.toString");
var getGeneratorFunction = require_generator_function();
module2.exports = function isGeneratorFunction(fn) {
if (typeof fn !== "function") {
return false;
}
if (isFnRegex(fnToStr(fn))) {
return true;
}
if (!hasToStringTag) {
var str = toStr(fn);
return str === "[object GeneratorFunction]";
}
if (!getProto) {
return false;
}
var GeneratorFunction = getGeneratorFunction();
return GeneratorFunction && getProto(fn) === GeneratorFunction.prototype;
};
}
});
// node_modules/is-callable/index.js
var require_is_callable = __commonJS({
"node_modules/is-callable/index.js"(exports2, module2) {
"use strict";
var fnToStr = Function.prototype.toString;
var reflectApply = typeof Reflect === "object" && Reflect !== null && Reflect.apply;
var badArrayLike;
var isCallableMarker;
if (typeof reflectApply === "function" && typeof Object.defineProperty === "function") {
try {
badArrayLike = Object.defineProperty({}, "length", {
get: function() {
throw isCallableMarker;
}
});
isCallableMarker = {};
reflectApply(function() {
throw 42;
}, null, badArrayLike);
} catch (_) {
if (_ !== isCallableMarker) {
reflectApply = null;
}
}
} else {
reflectApply = null;
}
var constructorRegex = /^\s*class\b/;
var isES6ClassFn = function isES6ClassFunction(value) {
try {
var fnStr = fnToStr.call(value);
return constructorRegex.test(fnStr);
} catch (e) {
return false;
}
};
var tryFunctionObject = function tryFunctionToStr(value) {
try {
if (isES6ClassFn(value)) {
return false;
}
fnToStr.call(value);
return true;
} catch (e) {
return false;
}
};
var toStr = Object.prototype.toString;
var objectClass = "[object Object]";
var fnClass = "[object Function]";
var genClass = "[object GeneratorFunction]";
var ddaClass = "[object HTMLAllCollection]";
var ddaClass2 = "[object HTML document.all class]";
var ddaClass3 = "[object HTMLCollection]";
var hasToStringTag = typeof Symbol === "function" && !!Symbol.toStringTag;
var isIE68 = !(0 in [,]);
var isDDA = function isDocumentDotAll() {
return false;
};
if (typeof document === "object") {
all = document.all;
if (toStr.call(all) === toStr.call(document.all)) {
isDDA = function isDocumentDotAll(value) {
if ((isIE68 || !value) && (typeof value === "undefined" || typeof value === "object")) {
try {
var str = toStr.call(value);
return (str === ddaClass || str === ddaClass2 || str === ddaClass3 || str === objectClass) && value("") == null;
} catch (e) {
}
}
return false;
};
}
}
var all;
module2.exports = reflectApply ? function isCallable(value) {
if (isDDA(value)) {
return true;
}
if (!value) {
return false;
}
if (typeof value !== "function" && typeof value !== "object") {
return false;
}
try {
reflectApply(value, null, badArrayLike);
} catch (e) {
if (e !== isCallableMarker) {
return false;
}
}
return !isES6ClassFn(value) && tryFunctionObject(value);
} : function isCallable(value) {
if (isDDA(value)) {
return true;
}
if (!value) {
return false;
}
if (typeof value !== "function" && typeof value !== "object") {
return false;
}
if (hasToStringTag) {
return tryFunctionObject(value);
}
if (isES6ClassFn(value)) {
return false;
}
var strClass = toStr.call(value);
if (strClass !== fnClass && strClass !== genClass && !/^\[object HTML/.test(strClass)) {
return false;
}
return tryFunctionObject(value);
};
}
});
// node_modules/for-each/index.js
var require_for_each = __commonJS({
"node_modules/for-each/index.js"(exports2, module2) {
"use strict";
var isCallable = require_is_callable();
var toStr = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var forEachArray = function forEachArray2(array, iterator, receiver) {
for (var i = 0, len = array.length; i < len; i++) {
if (hasOwnProperty.call(array, i)) {
if (receiver == null) {
iterator(array[i], i, array);
} else {
iterator.call(receiver, array[i], i, array);
}
}
}
};
var forEachString = function forEachString2(string, iterator, receiver) {
for (var i = 0, len = string.length; i < len; i++) {
if (receiver == null) {
iterator(string.charAt(i), i, string);
} else {
iterator.call(receiver, string.charAt(i), i, string);
}
}
};
var forEachObject = function forEachObject2(object, iterator, receiver) {
for (var k in object) {
if (hasOwnProperty.call(object, k)) {
if (receiver == null) {
iterator(object[k], k, object);
} else {
iterator.call(receiver, object[k], k, object);
}
}
}
};
function isArray(x) {
return toStr.call(x) === "[object Array]";
}
module2.exports = function forEach(list, iterator, thisArg) {
if (!isCallable(iterator)) {
throw new TypeError("iterator must be a function");
}
var receiver;
if (arguments.length >= 3) {
receiver = thisArg;
}
if (isArray(list)) {
forEachArray(list, iterator, receiver);
} else if (typeof list === "string") {
forEachString(list, iterator, receiver);
} else {
forEachObject(list, iterator, receiver);
}
};
}
});
// node_modules/possible-typed-array-names/index.js
var require_possible_typed_array_names = __commonJS({
"node_modules/possible-typed-array-names/index.js"(exports2, module2) {
"use strict";
module2.exports = [
"Float16Array",
"Float32Array",
"Float64Array",
"Int8Array",
"Int16Array",
"Int32Array",
"Uint8Array",
"Uint8ClampedArray",
"Uint16Array",
"Uint32Array",
"BigInt64Array",
"BigUint64Array"
];
}
});
// node_modules/available-typed-arrays/index.js
var require_available_typed_arrays = __commonJS({
"node_modules/available-typed-arrays/index.js"(exports2, module2) {
"use strict";
var possibleNames = require_possible_typed_array_names();
var g = typeof globalThis === "undefined" ? global : globalThis;
module2.exports = function availableTypedArrays() {
var out = [];
for (var i = 0; i < possibleNames.length; i++) {
if (typeof g[possibleNames[i]] === "function") {
out[out.length] = possibleNames[i];
}
}
return out;
};
}
});
// node_modules/define-data-property/index.js
var require_define_data_property = __commonJS({
"node_modules/define-data-property/index.js"(exports2, module2) {
"use strict";
var $defineProperty = require_es_define_property();
var $SyntaxError = require_syntax();
var $TypeError = require_type();
var gopd = require_gopd();
module2.exports = function defineDataProperty(obj, property, value) {
if (!obj || typeof obj !== "object" && typeof obj !== "function") {
throw new $TypeError("`obj` must be an object or a function`");
}
if (typeof property !== "string" && typeof property !== "symbol") {
throw new $TypeError("`property` must be a string or a symbol`");
}
if (arguments.length > 3 && typeof arguments[3] !== "boolean" && arguments[3] !== null) {
throw new $TypeError("`nonEnumerable`, if provided, must be a boolean or null");
}
if (arguments.length > 4 && typeof arguments[4] !== "boolean" && arguments[4] !== null) {
throw new $TypeError("`nonWritable`, if provided, must be a boolean or null");
}
if (arguments.length > 5 && typeof arguments[5] !== "boolean" && arguments[5] !== null) {
throw new $TypeError("`nonConfigurable`, if provided, must be a boolean or null");
}
if (arguments.length > 6 && typeof arguments[6] !== "boolean") {
throw new $TypeError("`loose`, if provided, must be a boolean");
}
var nonEnumerable = arguments.length > 3 ? arguments[3] : null;
var nonWritable = arguments.length > 4 ? arguments[4] : null;
var nonConfigurable = arguments.length > 5 ? arguments[5] : null;
var loose = arguments.length > 6 ? arguments[6] : false;
var desc = !!gopd && gopd(obj, property);
if ($defineProperty) {
$defineProperty(obj, property, {
configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable,
enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable,
value,
writable: nonWritable === null && desc ? desc.writable : !nonWritable
});
} else if (loose || !nonEnumerable && !nonWritable && !nonConfigurable) {
obj[property] = value;
} else {
throw new $SyntaxError("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");
}
};
}
});
// node_modules/has-property-descriptors/index.js
var require_has_property_descriptors = __commonJS({
"node_modules/has-property-descriptors/index.js"(exports2, module2) {
"use strict";
var $defineProperty = require_es_define_property();
var hasPropertyDescriptors = function hasPropertyDescriptors2() {
return !!$defineProperty;
};
hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {
if (!$defineProperty) {
return null;
}
try {
return $defineProperty([], "length", { value: 1 }).length !== 1;
} catch (e) {
return true;
}
};
module2.exports = hasPropertyDescriptors;
}
});
// node_modules/set-function-length/index.js
var require_set_function_length = __commonJS({
"node_modules/set-function-length/index.js"(exports2, module2) {
"use strict";
var GetIntrinsic = require_get_intrinsic();
var define2 = require_define_data_property();
var hasDescriptors = require_has_property_descriptors()();
var gOPD = require_gopd();
var $TypeError = require_type();
var $floor = GetIntrinsic("%Math.floor%");
module2.exports = function setFunctionLength(fn, length) {
if (typeof fn !== "function") {
throw new $TypeError("`fn` is not a function");
}
if (typeof length !== "number" || length < 0 || length > 4294967295 || $floor(length) !== length) {
throw new $TypeError("`length` must be a positive 32-bit integer");
}
var loose = arguments.length > 2 && !!arguments[2];
var functionLengthIsConfigurable = true;
var functionLengthIsWritable = true;
if ("length" in fn && gOPD) {
var desc = gOPD(fn, "length");
if (desc && !desc.configurable) {
functionLengthIsConfigurable = false;
}
if (desc && !desc.writable) {
functionLengthIsWritable = false;
}
}
if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) {
if (hasDescriptors) {
define2(
/** @type {Parameters<define>[0]} */
fn,
"length",
length,
true,
true
);
} else {
define2(
/** @type {Parameters<define>[0]} */
fn,
"length",
length
);
}
}
return fn;
};
}
});
// node_modules/call-bind-apply-helpers/applyBind.js
var require_applyBind = __commonJS({
"node_modules/call-bind-apply-helpers/applyBind.js"(exports2, module2) {
"use strict";
var bind = require_function_bind();
var $apply = require_functionApply();
var actualApply = require_actualApply();
module2.exports = function applyBind() {
return actualApply(bind, $apply, arguments);
};
}
});
// node_modules/call-bind/index.js
var require_call_bind = __commonJS({
"node_modules/call-bind/index.js"(exports2, module2) {
"use strict";
var setFunctionLength = require_set_function_length();
var $defineProperty = require_es_define_property();
var callBindBasic = require_call_bind_apply_helpers();
var applyBind = require_applyBind();
module2.exports = function callBind(originalFunction) {
var func = callBindBasic(arguments);
var adjustedLength = 1 + originalFunction.length - (arguments.length - 1);
return setFunctionLength(
func,
adjustedLength > 0 ? adjustedLength : 0,
true
);
};
if ($defineProperty) {
$defineProperty(module2.exports, "apply", { value: applyBind });
} else {
module2.exports.apply = applyBind;
}
}
});
// node_modules/which-typed-array/index.js
var require_which_typed_array = __commonJS({
"node_modules/which-typed-array/index.js"(exports2, module2) {
"use strict";
var forEach = require_for_each();
var availableTypedArrays = require_available_typed_arrays();
var callBind = require_call_bind();
var callBound = require_call_bound();
var gOPD = require_gopd();
var getProto = require_get_proto();
var $toString = callBound("Object.prototype.toString");
var hasToStringTag = require_shams2()();
var g = typeof globalThis === "undefined" ? global : globalThis;
var typedArrays = availableTypedArrays();
var $slice = callBound("String.prototype.slice");
var $indexOf = callBound("Array.prototype.indexOf", true) || function indexOf(array, value) {
for (var i = 0; i < array.length; i += 1) {
if (array[i] === value) {
return i;
}
}
return -1;
};
var cache = { __proto__: null };
if (hasToStringTag && gOPD && getProto) {
forEach(typedArrays, function(typedArray) {
var arr = new g[typedArray]();
if (Symbol.toStringTag in arr && getProto) {
var proto = getProto(arr);
var descriptor = gOPD(proto, Symbol.toStringTag);
if (!descriptor && proto) {
var superProto = getProto(proto);
descriptor = gOPD(superProto, Symbol.toStringTag);
}
if (descriptor && descriptor.get) {
var bound = callBind(descriptor.get);
cache[
/** @type {`$${import('.').TypedArrayName}`} */
"$" + typedArray
] = bound;
}
}
});
} else {
forEach(typedArrays, function(typedArray) {
var arr = new g[typedArray]();
var fn = arr.slice || arr.set;
if (fn) {
var bound = (
/** @type {import('./types').BoundSlice | import('./types').BoundSet} */
// @ts-expect-error TODO FIXME
callBind(fn)
);
cache[
/** @type {`$${import('.').TypedArrayName}`} */
"$" + typedArray
] = bound;
}
});
}
var tryTypedArrays = function tryAllTypedArrays(value) {
var found = false;
forEach(
/** @type {Record<`\$${import('.').TypedArrayName}`, Getter>} */
cache,
/** @type {(getter: Getter, name: `\$${import('.').TypedArrayName}`) => void} */
function(getter, typedArray) {
if (!found) {
try {
if ("$" + getter(value) === typedArray) {
found = /** @type {import('.').TypedArrayName} */
$slice(typedArray, 1);
}
} catch (e) {
}
}
}
);
return found;
};
var trySlices = function tryAllSlices(value) {
var found = false;
forEach(
/** @type {Record<`\$${import('.').TypedArrayName}`, Getter>} */
cache,
/** @type {(getter: Getter, name: `\$${import('.').TypedArrayName}`) => void} */
function(getter, name) {
if (!found) {
try {
getter(value);
found = /** @type {import('.').TypedArrayName} */
$slice(name, 1);
} catch (e) {
}
}
}
);
return found;
};
module2.exports = function whichTypedArray(value) {
if (!value || typeof value !== "object") {
return false;
}
if (!hasToStringTag) {
var tag = $slice($toString(value), 8, -1);
if ($indexOf(typedArrays, tag) > -1) {
return tag;
}
if (tag !== "Object") {
return false;
}
return trySlices(value);
}
if (!gOPD) {
return null;
}
return tryTypedArrays(value);
};
}
});
// node_modules/is-typed-array/index.js
var require_is_typed_array = __commonJS({
"node_modules/is-typed-array/index.js"(exports2, module2) {
"use strict";
var whichTypedArray = require_which_typed_array();
module2.exports = function isTypedArray(value) {
return !!whichTypedArray(value);
};
}
});
// node_modules/util/support/types.js
var require_types = __commonJS({
"node_modules/util/support/types.js"(exports2) {
"use strict";
var isArgumentsObject = require_is_arguments2();
var isGeneratorFunction = require_is_generator_function();
var whichTypedArray = require_which_typed_array();
var isTypedArray = require_is_typed_array();
function uncurryThis(f) {
return f.call.bind(f);
}
var BigIntSupported = typeof BigInt !== "undefined";
var SymbolSupported = typeof Symbol !== "undefined";
var ObjectToString = uncurryThis(Object.prototype.toString);
var numberValue = uncurryThis(Number.prototype.valueOf);
var stringValue = uncurryThis(String.prototype.valueOf);
var booleanValue = uncurryThis(Boolean.prototype.valueOf);
if (BigIntSupported) {
bigIntValue = uncurryThis(BigInt.prototype.valueOf);
}
var bigIntValue;
if (SymbolSupported) {
symbolValue = uncurryThis(Symbol.prototype.valueOf);
}
var symbolValue;
function checkBoxedPrimitive(value, prototypeValueOf) {
if (typeof value !== "object") {
return false;
}
try {
prototypeValueOf(value);
return true;
} catch (e) {
return false;
}
}
exports2.isArgumentsObject = isArgumentsObject;
exports2.isGeneratorFunction = isGeneratorFunction;
exports2.isTypedArray = isTypedArray;
function isPromise(input) {
return typeof Promise !== "undefined" && input instanceof Promise || input !== null && typeof input === "object" && typeof input.then === "function" && typeof input.catch === "function";
}
exports2.isPromise = isPromise;
function isArrayBufferView(value) {
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) {
return ArrayBuffer.isView(value);
}
return isTypedArray(value) || isDataView(value);
}
exports2.isArrayBufferView = isArrayBufferView;
function isUint8Array(value) {
return whichTypedArray(value) === "Uint8Array";
}
exports2.isUint8Array = isUint8Array;
function isUint8ClampedArray(value) {
return whichTypedArray(value) === "Uint8ClampedArray";
}
exports2.isUint8ClampedArray = isUint8ClampedArray;
function isUint16Array(value) {
return whichTypedArray(value) === "Uint16Array";
}
exports2.isUint16Array = isUint16Array;
function isUint32Array(value) {
return whichTypedArray(value) === "Uint32Array";
}
exports2.isUint32Array = isUint32Array;
function isInt8Array(value) {
return whichTypedArray(value) === "Int8Array";
}
exports2.isInt8Array = isInt8Array;
function isInt16Array(value) {
return whichTypedArray(value) === "Int16Array";
}
exports2.isInt16Array = isInt16Array;
function isInt32Array(value) {
return whichTypedArray(value) === "Int32Array";
}
exports2.isInt32Array = isInt32Array;
function isFloat32Array(value) {
return whichTypedArray(value) === "Float32Array";
}
exports2.isFloat32Array = isFloat32Array;
function isFloat64Array(value) {
return whichTypedArray(value) === "Float64Array";
}
exports2.isFloat64Array = isFloat64Array;
function isBigInt64Array(value) {
return whichTypedArray(value) === "BigInt64Array";
}
exports2.isBigInt64Array = isBigInt64Array;
function isBigUint64Array(value) {
return whichTypedArray(value) === "BigUint64Array";
}
exports2.isBigUint64Array = isBigUint64Array;
function isMapToString(value) {
return ObjectToString(value) === "[object Map]";
}
isMapToString.working = typeof Map !== "undefined" && isMapToString(/* @__PURE__ */ new Map());
function isMap(value) {
if (typeof Map === "undefined") {
return false;
}
return isMapToString.working ? isMapToString(value) : value instanceof Map;
}
exports2.isMap = isMap;
function isSetToString(value) {
return ObjectToString(value) === "[object Set]";
}
isSetToString.working = typeof Set !== "undefined" && isSetToString(/* @__PURE__ */ new Set());
function isSet(value) {
if (typeof Set === "undefined") {
return false;
}
return isSetToString.working ? isSetToString(value) : value instanceof Set;
}
exports2.isSet = isSet;
function isWeakMapToString(value) {
return ObjectToString(value) === "[object WeakMap]";
}
isWeakMapToString.working = typeof WeakMap !== "undefined" && isWeakMapToString(/* @__PURE__ */ new WeakMap());
function isWeakMap(value) {
if (typeof WeakMap === "undefined") {
return false;
}
return isWeakMapToString.working ? isWeakMapToString(value) : value instanceof WeakMap;
}
exports2.isWeakMap = isWeakMap;
function isWeakSetToString(value) {
return ObjectToString(value) === "[object WeakSet]";
}
isWeakSetToString.working = typeof WeakSet !== "undefined" && isWeakSetToString(/* @__PURE__ */ new WeakSet());
function isWeakSet(value) {
return isWeakSetToString(value);
}
exports2.isWeakSet = isWeakSet;
function isArrayBufferToString(value) {
return ObjectToString(value) === "[object ArrayBuffer]";
}
isArrayBufferToString.working = typeof ArrayBuffer !== "undefined" && isArrayBufferToString(new ArrayBuffer());
function isArrayBuffer(value) {
if (typeof ArrayBuffer === "undefined") {
return false;
}
return isArrayBufferToString.working ? isArrayBufferToString(value) : value instanceof ArrayBuffer;
}
exports2.isArrayBuffer = isArrayBuffer;
function isDataViewToString(value) {
return ObjectToString(value) === "[object DataView]";
}
isDataViewToString.working = typeof ArrayBuffer !== "undefined" && typeof DataView !== "undefined" && isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1));
function isDataView(value) {
if (typeof DataView === "undefined") {
return false;
}
return isDataViewToString.working ? isDataViewToString(value) : value instanceof DataView;
}
exports2.isDataView = isDataView;
var SharedArrayBufferCopy = typeof SharedArrayBuffer !== "undefined" ? SharedArrayBuffer : void 0;
function isSharedArrayBufferToString(value) {
return ObjectToString(value) === "[object SharedArrayBuffer]";
}
function isSharedArrayBuffer(value) {
if (typeof SharedArrayBufferCopy === "undefined") {
return false;
}
if (typeof isSharedArrayBufferToString.working === "undefined") {
isSharedArrayBufferToString.working = isSharedArrayBufferToString(new SharedArrayBufferCopy());
}
return isSharedArrayBufferToString.working ? isSharedArrayBufferToString(value) : value instanceof SharedArrayBufferCopy;
}
exports2.isSharedArrayBuffer = isSharedArrayBuffer;
function isAsyncFunction(value) {
return ObjectToString(value) === "[object AsyncFunction]";
}
exports2.isAsyncFunction = isAsyncFunction;
function isMapIterator(value) {
return ObjectToString(value) === "[object Map Iterator]";
}
exports2.isMapIterator = isMapIterator;
function isSetIterator(value) {
return ObjectToString(value) === "[object Set Iterator]";
}
exports2.isSetIterator = isSetIterator;
function isGeneratorObject(value) {
return ObjectToString(value) === "[object Generator]";
}
exports2.isGeneratorObject = isGeneratorObject;
function isWebAssemblyCompiledModule(value) {
return ObjectToString(value) === "[object WebAssembly.Module]";
}
exports2.isWebAssemblyCompiledModule = isWebAssemblyCompiledModule;
function isNumberObject(value) {
return checkBoxedPrimitive(value, numberValue);
}
exports2.isNumberObject = isNumberObject;
function isStringObject(value) {
return checkBoxedPrimitive(value, stringValue);
}
exports2.isStringObject = isStringObject;
function isBooleanObject(value) {
return checkBoxedPrimitive(value, booleanValue);
}
exports2.isBooleanObject = isBooleanObject;
function isBigIntObject(value) {
return BigIntSupported && checkBoxedPrimitive(value, bigIntValue);
}
exports2.isBigIntObject = isBigIntObject;
function isSymbolObject(value) {
return SymbolSupported && checkBoxedPrimitive(value, symbolValue);
}
exports2.isSymbolObject = isSymbolObject;
function isBoxedPrimitive(value) {
return isNumberObject(value) || isStringObject(value) || isBooleanObject(value) || isBigIntObject(value) || isSymbolObject(value);
}
exports2.isBoxedPrimitive = isBoxedPrimitive;
function isAnyArrayBuffer(value) {
return typeof Uint8Array !== "undefined" && (isArrayBuffer(value) || isSharedArrayBuffer(value));
}
exports2.isAnyArrayBuffer = isAnyArrayBuffer;
["isProxy", "isExternal", "isModuleNamespaceObject"].forEach(function(method) {
Object.defineProperty(exports2, method, {
enumerable: false,
value: function() {
throw new Error(method + " is not supported in userland");
}
});
});
}
});
// node_modules/util/support/isBufferBrowser.js
var require_isBufferBrowser = __commonJS({
"node_modules/util/support/isBufferBrowser.js"(exports2, module2) {
module2.exports = function isBuffer(arg) {
return arg && typeof arg === "object" && typeof arg.copy === "function" && typeof arg.fill === "function" && typeof arg.readUInt8 === "function";
};
}
});
// node_modules/inherits/inherits_browser.js
var require_inherits_browser = __commonJS({
"node_modules/inherits/inherits_browser.js"(exports2, module2) {
if (typeof Object.create === "function") {
module2.exports = function inherits(ctor, superCtor) {
if (superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
}
};
} else {
module2.exports = function inherits(ctor, superCtor) {
if (superCtor) {
ctor.super_ = superCtor;
var TempCtor = function() {
};
TempCtor.prototype = superCtor.prototype;
ctor.prototype = new TempCtor();
ctor.prototype.constructor = ctor;
}
};
}
}
});
// node_modules/util/util.js
var require_util = __commonJS({
"node_modules/util/util.js"(exports2) {
var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || function getOwnPropertyDescriptors2(obj) {
var keys = Object.keys(obj);
var descriptors = {};
for (var i = 0; i < keys.length; i++) {
descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);
}
return descriptors;
};
var formatRegExp = /%[sdj%]/g;
exports2.format = function(f) {
if (!isString(f)) {
var objects = [];
for (var i = 0; i < arguments.length; i++) {
objects.push(inspect(arguments[i]));
}
return objects.join(" ");
}
var i = 1;
var args = arguments;
var len = args.length;
var str = String(f).replace(formatRegExp, function(x2) {
if (x2 === "%%") return "%";
if (i >= len) return x2;
switch (x2) {
case "%s":
return String(args[i++]);
case "%d":
return Number(args[i++]);
case "%j":
try {
return JSON.stringify(args[i++]);
} catch (_) {
return "[Circular]";
}
default:
return x2;
}
});
for (var x = args[i]; i < len; x = args[++i]) {
if (isNull(x) || !isObject(x)) {
str += " " + x;
} else {
str += " " + inspect(x);
}
}
return str;
};
exports2.deprecate = function(fn, msg) {
if (typeof process !== "undefined" && process.noDeprecation === true) {
return fn;
}
if (typeof process === "undefined") {
return function() {
return exports2.deprecate(fn, msg).apply(this, arguments);
};
}
var warned = false;
function deprecated() {
if (!warned) {
if (process.throwDeprecation) {
throw new Error(msg);
} else if (process.traceDeprecation) {
console.trace(msg);
} else {
console.error(msg);
}
warned = true;
}
return fn.apply(this, arguments);
}
return deprecated;
};
var debugs = {};
var debugEnvRegex = /^$/;
if ("") {
debugEnv = "";
debugEnv = debugEnv.replace(/[|\\{}()[\]^$+?.]/g, "\\$&").replace(/\*/g, ".*").replace(/,/g, "$|^").toUpperCase();
debugEnvRegex = new RegExp("^" + debugEnv + "$", "i");
}
var debugEnv;
exports2.debuglog = function(set) {
set = set.toUpperCase();
if (!debugs[set]) {
if (debugEnvRegex.test(set)) {
var pid = process.pid;
debugs[set] = function() {
var msg = exports2.format.apply(exports2, arguments);
console.error("%s %d: %s", set, pid, msg);
};
} else {
debugs[set] = function() {
};
}
}
return debugs[set];
};
function inspect(obj, opts) {
var ctx = {
seen: [],
stylize: stylizeNoColor
};
if (arguments.length >= 3) ctx.depth = arguments[2];
if (arguments.length >= 4) ctx.colors = arguments[3];
if (isBoolean(opts)) {
ctx.showHidden = opts;
} else if (opts) {
exports2._extend(ctx, opts);
}
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
if (isUndefined(ctx.depth)) ctx.depth = 2;
if (isUndefined(ctx.colors)) ctx.colors = false;
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
if (ctx.colors) ctx.stylize = stylizeWithColor;
return formatValue(ctx, obj, ctx.depth);
}
exports2.inspect = inspect;
inspect.colors = {
"bold": [1, 22],
"italic": [3, 23],
"underline": [4, 24],
"inverse": [7, 27],
"white": [37, 39],
"grey": [90, 39],
"black": [30, 39],
"blue": [34, 39],
"cyan": [36, 39],
"green": [32, 39],
"magenta": [35, 39],
"red": [31, 39],
"yellow": [33, 39]
};
inspect.styles = {
"special": "cyan",
"number": "yellow",
"boolean": "yellow",
"undefined": "grey",
"null": "bold",
"string": "green",
"date": "magenta",
// "name": intentionally not styling
"regexp": "red"
};
function stylizeWithColor(str, styleType) {
var style = inspect.styles[styleType];
if (style) {
return "\x1B[" + inspect.colors[style][0] + "m" + str + "\x1B[" + inspect.colors[style][1] + "m";
} else {
return str;
}
}
function stylizeNoColor(str, styleType) {
return str;
}
function arrayToHash(array) {
var hash = {};
array.forEach(function(val, idx) {
hash[val] = true;
});
return hash;
}
function formatValue(ctx, value, recurseTimes) {
if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special
value.inspect !== exports2.inspect && // Also filter out any prototype objects using the circular check.
!(value.constructor && value.constructor.prototype === value)) {
var ret = value.inspect(recurseTimes, ctx);
if (!isString(ret)) {
ret = formatValue(ctx, ret, recurseTimes);
}
return ret;
}
var primitive = formatPrimitive(ctx, value);
if (primitive) {
return primitive;
}
var keys = Object.keys(value);
var visibleKeys = arrayToHash(keys);
if (ctx.showHidden) {
keys = Object.getOwnPropertyNames(value);
}
if (isError(value) && (keys.indexOf("message") >= 0 || keys.indexOf("description") >= 0)) {
return formatError(value);
}
if (keys.length === 0) {
if (isFunction(value)) {
var name = value.name ? ": " + value.name : "";
return ctx.stylize("[Function" + name + "]", "special");
}
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), "regexp");
}
if (isDate(value)) {
return ctx.stylize(Date.prototype.toString.call(value), "date");
}
if (isError(value)) {
return formatError(value);
}
}
var base = "", array = false, braces = ["{", "}"];
if (isArray(value)) {
array = true;
braces = ["[", "]"];
}
if (isFunction(value)) {
var n = value.name ? ": " + value.name : "";
base = " [Function" + n + "]";
}
if (isRegExp(value)) {
base = " " + RegExp.prototype.toString.call(value);
}
if (isDate(value)) {
base = " " + Date.prototype.toUTCString.call(value);
}
if (isError(value)) {
base = " " + formatError(value);
}
if (keys.length === 0 && (!array || value.length == 0)) {
return braces[0] + base + braces[1];
}
if (recurseTimes < 0) {
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), "regexp");
} else {
return ctx.stylize("[Object]", "special");
}
}
ctx.seen.push(value);
var output;
if (array) {
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
} else {
output = keys.map(function(key) {
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
});
}
ctx.seen.pop();
return reduceToSingleString(output, base, braces);
}
function formatPrimitive(ctx, value) {
if (isUndefined(value))
return ctx.stylize("undefined", "undefined");
if (isString(value)) {
var simple = "'" + JSON.stringify(value).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
return ctx.stylize(simple, "string");
}
if (isNumber(value))
return ctx.stylize("" + value, "number");
if (isBoolean(value))
return ctx.stylize("" + value, "boolean");
if (isNull(value))
return ctx.stylize("null", "null");
}
function formatError(value) {
return "[" + Error.prototype.toString.call(value) + "]";
}
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
var output = [];
for (var i = 0, l = value.length; i < l; ++i) {
if (hasOwnProperty(value, String(i))) {
output.push(formatProperty(
ctx,
value,
recurseTimes,
visibleKeys,
String(i),
true
));
} else {
output.push("");
}
}
keys.forEach(function(key) {
if (!key.match(/^\d+$/)) {
output.push(formatProperty(
ctx,
value,
recurseTimes,
visibleKeys,
key,
true
));
}
});
return output;
}
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
var name, str, desc;
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
if (desc.get) {
if (desc.set) {
str = ctx.stylize("[Getter/Setter]", "special");
} else {
str = ctx.stylize("[Getter]", "special");
}
} else {
if (desc.set) {
str = ctx.stylize("[Setter]", "special");
}
}
if (!hasOwnProperty(visibleKeys, key)) {
name = "[" + key + "]";
}
if (!str) {
if (ctx.seen.indexOf(desc.value) < 0) {
if (isNull(recurseTimes)) {
str = formatValue(ctx, desc.value, null);
} else {
str = formatValue(ctx, desc.value, recurseTimes - 1);
}
if (str.indexOf("\n") > -1) {
if (array) {
str = str.split("\n").map(function(line) {
return " " + line;
}).join("\n").slice(2);
} else {
str = "\n" + str.split("\n").map(function(line) {
return " " + line;
}).join("\n");
}
}
} else {
str = ctx.stylize("[Circular]", "special");
}
}
if (isUndefined(name)) {
if (array && key.match(/^\d+$/)) {
return str;
}
name = JSON.stringify("" + key);
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
name = name.slice(1, -1);
name = ctx.stylize(name, "name");
} else {
name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'");
name = ctx.stylize(name, "string");
}
}
return name + ": " + str;
}
function reduceToSingleString(output, base, braces) {
var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
numLinesEst++;
if (cur.indexOf("\n") >= 0) numLinesEst++;
return prev + cur.replace(/\u001b\[\d\d?m/g, "").length + 1;
}, 0);
if (length > 60) {
return braces[0] + (base === "" ? "" : base + "\n ") + " " + output.join(",\n ") + " " + braces[1];
}
return braces[0] + base + " " + output.join(", ") + " " + braces[1];
}
exports2.types = require_types();
function isArray(ar) {
return Array.isArray(ar);
}
exports2.isArray = isArray;
function isBoolean(arg) {
return typeof arg === "boolean";
}
exports2.isBoolean = isBoolean;
function isNull(arg) {
return arg === null;
}
exports2.isNull = isNull;
function isNullOrUndefined(arg) {
return arg == null;
}
exports2.isNullOrUndefined = isNullOrUndefined;
function isNumber(arg) {
return typeof arg === "number";
}
exports2.isNumber = isNumber;
function isString(arg) {
return typeof arg === "string";
}
exports2.isString = isString;
function isSymbol(arg) {
return typeof arg === "symbol";
}
exports2.isSymbol = isSymbol;
function isUndefined(arg) {
return arg === void 0;
}
exports2.isUndefined = isUndefined;
function isRegExp(re) {
return isObject(re) && objectToString(re) === "[object RegExp]";
}
exports2.isRegExp = isRegExp;
exports2.types.isRegExp = isRegExp;
function isObject(arg) {
return typeof arg === "object" && arg !== null;
}
exports2.isObject = isObject;
function isDate(d) {
return isObject(d) && objectToString(d) === "[object Date]";
}
exports2.isDate = isDate;
exports2.types.isDate = isDate;
function isError(e) {
return isObject(e) && (objectToString(e) === "[object Error]" || e instanceof Error);
}
exports2.isError = isError;
exports2.types.isNativeError = isError;
function isFunction(arg) {
return typeof arg === "function";
}
exports2.isFunction = isFunction;
function isPrimitive(arg) {
return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || // ES6 symbol
typeof arg === "undefined";
}
exports2.isPrimitive = isPrimitive;
exports2.isBuffer = require_isBufferBrowser();
function objectToString(o) {
return Object.prototype.toString.call(o);
}
function pad(n) {
return n < 10 ? "0" + n.toString(10) : n.toString(10);
}
var months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
function timestamp() {
var d = /* @__PURE__ */ new Date();
var time = [
pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())
].join(":");
return [d.getDate(), months[d.getMonth()], time].join(" ");
}
exports2.log = function() {
console.log("%s - %s", timestamp(), exports2.format.apply(exports2, arguments));
};
exports2.inherits = require_inherits_browser();
exports2._extend = function(origin, add) {
if (!add || !isObject(add)) return origin;
var keys = Object.keys(add);
var i = keys.length;
while (i--) {
origin[keys[i]] = add[keys[i]];
}
return origin;
};
function hasOwnProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
var kCustomPromisifiedSymbol = typeof Symbol !== "undefined" ? /* @__PURE__ */ Symbol("util.promisify.custom") : void 0;
exports2.promisify = function promisify(original) {
if (typeof original !== "function")
throw new TypeError('The "original" argument must be of type Function');
if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {
var fn = original[kCustomPromisifiedSymbol];
if (typeof fn !== "function") {
throw new TypeError('The "util.promisify.custom" argument must be of type Function');
}
Object.defineProperty(fn, kCustomPromisifiedSymbol, {
value: fn,
enumerable: false,
writable: false,
configurable: true
});
return fn;
}
function fn() {
var promiseResolve, promiseReject;
var promise = new Promise(function(resolve, reject) {
promiseResolve = resolve;
promiseReject = reject;
});
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
args.push(function(err, value) {
if (err) {
promiseReject(err);
} else {
promiseResolve(value);
}
});
try {
original.apply(this, args);
} catch (err) {
promiseReject(err);
}
return promise;
}
Object.setPrototypeOf(fn, Object.getPrototypeOf(original));
if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, {
value: fn,
enumerable: false,
writable: false,
configurable: true
});
return Object.defineProperties(
fn,
getOwnPropertyDescriptors(original)
);
};
exports2.promisify.custom = kCustomPromisifiedSymbol;
function callbackifyOnRejected(reason, cb) {
if (!reason) {
var newReason = new Error("Promise was rejected with a falsy value");
newReason.reason = reason;
reason = newReason;
}
return cb(reason);
}
function callbackify(original) {
if (typeof original !== "function") {
throw new TypeError('The "original" argument must be of type Function');
}
function callbackified() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
var maybeCb = args.pop();
if (typeof maybeCb !== "function") {
throw new TypeError("The last argument must be of type Function");
}
var self2 = this;
var cb = function() {
return maybeCb.apply(self2, arguments);
};
original.apply(this, args).then(
function(ret) {
process.nextTick(cb.bind(null, null, ret));
},
function(rej) {
process.nextTick(callbackifyOnRejected.bind(null, rej, cb));
}
);
}
Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original));
Object.defineProperties(
callbackified,
getOwnPropertyDescriptors(original)
);
return callbackified;
}
exports2.callbackify = callbackify;
}
});
// lib/sinon/assert.js
var require_assert = __commonJS({
"lib/sinon/assert.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var samsam = require_samsam();
var timesInWords = require_times_in_words();
var util = require_util();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var {
prototypes,
calledInOrder,
orderByFirstCall,
global: globalObject
} = commons__default.default;
var { createMatcher } = samsam__default.default;
var { slice: arraySlice, concat, forEach, join, splice } = prototypes.array;
var { slice: stringSlice } = prototypes.string;
function applyDefaults(obj, defaults) {
for (const key of Object.keys(defaults)) {
const val = obj[key];
if (val === null || typeof val === "undefined") {
obj[key] = defaults[key];
}
}
}
function createAssertObject(opts) {
const cleanedAssertOptions = opts || {};
applyDefaults(cleanedAssertOptions, {
shouldLimitAssertionLogs: false,
assertionLogLimit: 1e4
});
const assert2 = {
fail: function fail(message) {
let msg = message;
if (cleanedAssertOptions.shouldLimitAssertionLogs) {
msg = message.substring(
0,
cleanedAssertOptions.assertionLogLimit
);
}
const error = new Error(msg);
error.name = "AssertError";
throw error;
},
pass: function pass() {
return;
},
callOrder: function assertCallOrder() {
verifyIsStub.apply(null, arguments);
let expected = "";
let actual = "";
if (!calledInOrder(arguments)) {
try {
expected = join(arguments, ", ");
const calls = arraySlice(arguments);
let i = calls.length;
while (i) {
if (!calls[--i].called) {
splice(calls, i, 1);
}
}
actual = join(orderByFirstCall(calls), ", ");
} catch (e) {
}
failAssertion(
this,
`expected ${expected} to be called in order but were called as ${actual}`
);
} else {
assert2.pass("callOrder");
}
},
callCount: function assertCallCount(method, count) {
verifyIsStub(method);
let msg;
if (typeof count !== "number") {
msg = `expected ${util.inspect(count)} to be a number but was of type ${typeof count}`;
failAssertion(this, msg);
} else if (method.callCount !== count) {
msg = `expected %n to be called ${timesInWords(count)} but was called %c%C`;
failAssertion(this, method.printf(msg));
} else {
assert2.pass("callCount");
}
},
expose: function expose(target, options) {
if (!target) {
throw new TypeError("target is null or undefined");
}
const o = options || {};
const prefix = typeof o.prefix === "undefined" && "assert" || o.prefix;
const includeFail = typeof o.includeFail === "undefined" || Boolean(o.includeFail);
const instance = this;
forEach(Object.keys(instance), function(method) {
if (method !== "expose" && (includeFail || !/^(fail)/.test(method))) {
target[exposedName(prefix, method)] = instance[method];
}
});
return target;
},
match: function match(actual, expectation) {
const matcher = createMatcher(expectation);
if (matcher.test(actual)) {
assert2.pass("match");
} else {
const formatted = [
"expected value to match",
` expected = ${util.inspect(expectation)}`,
` actual = ${util.inspect(actual)}`
];
failAssertion(this, join(formatted, "\n"));
}
}
};
function verifyIsStub() {
const args = arraySlice(arguments);
forEach(args, function(method) {
if (!method) {
assert2.fail("fake is not a spy");
}
if (method.proxy && method.proxy.isSinonProxy) {
verifyIsStub(method.proxy);
} else {
if (typeof method !== "function") {
assert2.fail(`${method} is not a function`);
}
if (typeof method.getCall !== "function") {
assert2.fail(`${method} is not stubbed`);
}
}
});
}
function verifyIsValidAssertion(assertionMethod, assertionArgs) {
switch (assertionMethod) {
case "notCalled":
case "called":
case "calledOnce":
case "calledTwice":
case "calledThrice":
if (assertionArgs.length !== 0) {
assert2.fail(
`${assertionMethod} takes 1 argument but was called with ${assertionArgs.length + 1} arguments`
);
}
break;
}
}
function failAssertion(object, msg) {
const obj = object || globalObject;
const failMethod = obj.fail || assert2.fail;
failMethod.call(obj, msg);
}
function mirrorPropAsAssertion(name, method, message) {
let msg = message;
let meth = method;
if (arguments.length === 2) {
msg = method;
meth = name;
}
assert2[name] = function(fake) {
verifyIsStub(fake);
const args = arraySlice(arguments, 1);
let failed = false;
verifyIsValidAssertion(name, args);
if (typeof meth === "function") {
failed = !meth(fake);
} else {
failed = typeof fake[meth] === "function" ? !fake[meth].apply(fake, args) : !fake[meth];
}
if (failed) {
failAssertion(
this,
(fake.printf || fake.proxy.printf).apply(
fake,
concat([msg], args)
)
);
} else {
assert2.pass(name);
}
};
}
function exposedName(prefix, prop) {
return !prefix || /^fail/.test(prop) ? prop : prefix + stringSlice(prop, 0, 1).toUpperCase() + stringSlice(prop, 1);
}
mirrorPropAsAssertion(
"called",
"expected %n to have been called at least once but was never called"
);
mirrorPropAsAssertion(
"notCalled",
function(spy) {
return !spy.called;
},
"expected %n to not have been called but was called %c%C"
);
mirrorPropAsAssertion(
"calledOnce",
"expected %n to be called once but was called %c%C"
);
mirrorPropAsAssertion(
"calledTwice",
"expected %n to be called twice but was called %c%C"
);
mirrorPropAsAssertion(
"calledThrice",
"expected %n to be called thrice but was called %c%C"
);
mirrorPropAsAssertion(
"calledOn",
"expected %n to be called with %1 as this but was called with %t"
);
mirrorPropAsAssertion(
"alwaysCalledOn",
"expected %n to always be called with %1 as this but was called with %t"
);
mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
mirrorPropAsAssertion(
"alwaysCalledWithNew",
"expected %n to always be called with new"
);
mirrorPropAsAssertion(
"calledWith",
"expected %n to be called with arguments %D"
);
mirrorPropAsAssertion(
"calledWithMatch",
"expected %n to be called with match %D"
);
mirrorPropAsAssertion(
"alwaysCalledWith",
"expected %n to always be called with arguments %D"
);
mirrorPropAsAssertion(
"alwaysCalledWithMatch",
"expected %n to always be called with match %D"
);
mirrorPropAsAssertion(
"calledWithExactly",
"expected %n to be called with exact arguments %D"
);
mirrorPropAsAssertion(
"calledOnceWith",
"expected %n to be called once and with arguments %D"
);
mirrorPropAsAssertion(
"calledOnceWithExactly",
"expected %n to be called once and with exact arguments %D"
);
mirrorPropAsAssertion(
"calledOnceWithMatch",
"expected %n to be called once and with match %D"
);
mirrorPropAsAssertion(
"alwaysCalledWithExactly",
"expected %n to always be called with exact arguments %D"
);
mirrorPropAsAssertion(
"neverCalledWith",
"expected %n to never be called with arguments %*%C"
);
mirrorPropAsAssertion(
"neverCalledWithMatch",
"expected %n to never be called with match %*%C"
);
mirrorPropAsAssertion("threw", "%n did not throw exception%C");
mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
return assert2;
}
var assert = createAssertObject();
assert.createAssertObject = createAssertObject;
module2.exports = assert;
}
});
// node_modules/@sinonjs/fake-timers/src/fake-timers-src.js
var require_fake_timers_src = __commonJS({
"node_modules/@sinonjs/fake-timers/src/fake-timers-src.js"(exports2, module2) {
"use strict";
var globalObject = require_lib().global;
var timersModule;
var timersPromisesModule;
if (typeof require === "function" && typeof module2 === "object") {
try {
timersModule = require("timers");
} catch {
}
try {
timersPromisesModule = require("timers/promises");
} catch {
}
}
function withGlobal(_global) {
const maxTimeout = Math.pow(2, 31) - 1;
const idCounterStart = 1e12;
const NOOP = function() {
return void 0;
};
const NOOP_ARRAY = function() {
return [];
};
const isPresent = {};
let timeoutResult, addTimerReturnsObject = false;
if (_global.setTimeout) {
isPresent.setTimeout = true;
timeoutResult = _global.setTimeout(NOOP, 0);
addTimerReturnsObject = typeof timeoutResult === "object";
}
isPresent.clearTimeout = Boolean(_global.clearTimeout);
isPresent.setInterval = Boolean(_global.setInterval);
isPresent.clearInterval = Boolean(_global.clearInterval);
isPresent.hrtime = _global.process && typeof _global.process.hrtime === "function";
isPresent.hrtimeBigint = isPresent.hrtime && typeof _global.process.hrtime.bigint === "function";
isPresent.nextTick = _global.process && typeof _global.process.nextTick === "function";
const utilPromisify = _global.process && require_util().promisify;
isPresent.performance = _global.performance && typeof _global.performance.now === "function";
const hasPerformancePrototype = _global.Performance && (typeof _global.Performance).match(/^(function|object)$/);
const hasPerformanceConstructorPrototype = _global.performance && _global.performance.constructor && _global.performance.constructor.prototype;
isPresent.queueMicrotask = Object.prototype.hasOwnProperty.call(
_global,
"queueMicrotask"
);
isPresent.requestAnimationFrame = _global.requestAnimationFrame && typeof _global.requestAnimationFrame === "function";
isPresent.cancelAnimationFrame = _global.cancelAnimationFrame && typeof _global.cancelAnimationFrame === "function";
isPresent.requestIdleCallback = _global.requestIdleCallback && typeof _global.requestIdleCallback === "function";
isPresent.cancelIdleCallback = _global.cancelIdleCallback && typeof _global.cancelIdleCallback === "function";
isPresent.setImmediate = _global.setImmediate && typeof _global.setImmediate === "function";
isPresent.clearImmediate = _global.clearImmediate && typeof _global.clearImmediate === "function";
isPresent.Intl = _global.Intl && typeof _global.Intl === "object";
isPresent.Temporal = _global.Temporal !== null && typeof _global.Temporal === "object" && typeof _global.Temporal.Now !== "undefined" && typeof _global.Temporal.Instant !== "undefined";
if (_global.clearTimeout) {
_global.clearTimeout(timeoutResult);
}
const NativeDate = _global.Date;
const NativeIntl = isPresent.Intl ? Object.defineProperties(
/* @__PURE__ */ Object.create(null),
Object.getOwnPropertyDescriptors(_global.Intl)
) : void 0;
const NativeTemporal = isPresent.Temporal ? _global.Temporal : void 0;
let uniqueTimerId = idCounterStart;
let uniqueTimerOrder = 0;
if (NativeDate === void 0) {
throw new Error(
"The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)"
);
}
isPresent.Date = true;
class FakePerformanceEntry {
constructor(name, entryType, startTime, duration) {
this.name = name;
this.entryType = entryType;
this.startTime = startTime;
this.duration = duration;
}
toJSON() {
return JSON.stringify({ ...this });
}
}
function isNumberFinite(num) {
if (Number.isFinite) {
return Number.isFinite(num);
}
return isFinite(num);
}
function checkIsNearInfiniteLimit(clock, i) {
if (clock.loopLimit && i === clock.loopLimit - 1) {
clock.isNearInfiniteLimit = true;
}
}
function resetIsNearInfiniteLimit(clock) {
if (clock) {
clock.isNearInfiniteLimit = false;
}
}
function parseTime(str) {
if (!str) {
return 0;
}
const strings = str.split(":");
const l = strings.length;
let i = l;
let ms = 0;
let parsed;
if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
throw new Error(
"tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits"
);
}
while (i--) {
parsed = parseInt(strings[i], 10);
if (parsed >= 60) {
throw new Error(`Invalid time ${str}`);
}
ms += parsed * Math.pow(60, l - i - 1);
}
return ms * 1e3;
}
function nanoRemainder(msFloat) {
const modulo = 1e6;
const remainder = msFloat * 1e6 % modulo;
const positiveRemainder = remainder < 0 ? remainder + modulo : remainder;
return Math.floor(positiveRemainder);
}
function getEpoch(epoch) {
if (!epoch) {
return 0;
}
if (typeof epoch === "number") {
return epoch;
}
if (typeof /** @type {Date} */
epoch.getTime === "function") {
return (
/** @type {Date} */
epoch.getTime()
);
}
if (typeof /** @type {TemporalTimelike} */
epoch.epochMilliseconds === "number") {
return (
/** @type {TemporalTimelike} */
epoch.epochMilliseconds
);
}
throw new TypeError("now should be milliseconds since UNIX epoch");
}
function inRange(from, to, timer) {
return timer && timer.callAt >= from && timer.callAt <= to;
}
function getInfiniteLoopError(clock, job) {
const infiniteLoopError = new Error(
`Aborting after running ${clock.loopLimit} timers, assuming an infinite loop!`
);
if (!job.error) {
return infiniteLoopError;
}
const computedTargetPattern = /target\.*[<|(|[].*?[>|\]|)]\s*/;
let clockMethodPattern = new RegExp(
String(Object.keys(clock).join("|"))
);
if (addTimerReturnsObject) {
clockMethodPattern = new RegExp(
`\\s+at (Object\\.)?(?:${Object.keys(clock).join("|")})\\s+`
);
}
let matchedLineIndex = -1;
job.error.stack.split("\n").some(function(line, i) {
const matchedComputedTarget = line.match(computedTargetPattern);
if (matchedComputedTarget) {
matchedLineIndex = i;
return true;
}
const matchedClockMethod = line.match(clockMethodPattern);
if (matchedClockMethod) {
matchedLineIndex = i;
return false;
}
return matchedLineIndex >= 0;
});
const stack = `${infiniteLoopError}
${job.type || "Microtask"} - ${job.func.name || "anonymous"}
${job.error.stack.split("\n").slice(matchedLineIndex + 1).join("\n")}`;
try {
Object.defineProperty(infiniteLoopError, "stack", {
value: stack
});
} catch {
}
return infiniteLoopError;
}
function createDate() {
class ClockDate extends NativeDate {
/** @type {Clock} */
static clock;
constructor(...args) {
if (args.length === 0) {
super(ClockDate.clock.now);
} else {
super(...args);
}
Object.defineProperty(this, "constructor", {
value: NativeDate,
enumerable: false
});
}
static [Symbol.hasInstance](instance) {
return instance instanceof NativeDate;
}
}
ClockDate.isFake = true;
if (NativeDate.now) {
ClockDate.now = function now() {
return ClockDate.clock.now;
};
}
const NativeDateWithToSource = (
/** @type {typeof Date & { toSource?: () => string }} */
NativeDate
);
if (NativeDateWithToSource.toSource) {
ClockDate.toSource = function toSource() {
return NativeDateWithToSource.toSource();
};
}
ClockDate.toString = function toString() {
return NativeDateWithToSource.toString();
};
const ClockDateProxy = new Proxy(ClockDate, {
// handler for [[Call]] invocations (i.e. not using `new`)
apply() {
if (this instanceof ClockDate) {
throw new TypeError(
"A Proxy should only capture `new` calls with the `construct` handler. This is not supposed to be possible, so check the logic."
);
}
return new NativeDate(ClockDate.clock.now).toString();
}
});
return (
/** @type {typeof Date & { clock: Clock }} */
/** @type {unknown} */
ClockDateProxy
);
}
function createIntl(clock) {
const IntlWithClock = { clock };
Object.getOwnPropertyNames(NativeIntl).forEach(
(property) => IntlWithClock[property] = NativeIntl[property]
);
IntlWithClock.DateTimeFormat = function(...args) {
const realFormatter = new NativeIntl.DateTimeFormat(...args);
const formatter = {};
["formatRange", "formatRangeToParts", "resolvedOptions"].forEach(
(method) => {
formatter[method] = realFormatter[method].bind(realFormatter);
}
);
["format", "formatToParts"].forEach((method) => {
formatter[method] = function(date) {
return realFormatter[method](
date || IntlWithClock.clock.now
);
};
});
return formatter;
};
IntlWithClock.DateTimeFormat.prototype = Object.create(
NativeIntl.DateTimeFormat.prototype
);
IntlWithClock.DateTimeFormat.supportedLocalesOf = NativeIntl.DateTimeFormat.supportedLocalesOf;
return IntlWithClock;
}
function createTemporal(clock, getNanos) {
const fakeNow = {
instant() {
return NativeTemporal.Instant.fromEpochNanoseconds(
BigInt(clock.now) * 1000000n + BigInt(getNanos())
);
},
timeZoneId() {
return NativeTemporal.Now.timeZoneId();
},
zonedDateTimeISO(timeZone) {
const tz = timeZone ?? NativeTemporal.Now.timeZoneId();
return fakeNow.instant().toZonedDateTimeISO(tz);
},
plainDateTimeISO(timeZone) {
return fakeNow.zonedDateTimeISO(timeZone).toPlainDateTime();
},
plainDateISO(timeZone) {
return fakeNow.zonedDateTimeISO(timeZone).toPlainDate();
},
plainTimeISO(timeZone) {
return fakeNow.zonedDateTimeISO(timeZone).toPlainTime();
}
};
const TemporalWithClock = Object.create(
Object.getPrototypeOf(NativeTemporal)
);
[
...Object.getOwnPropertyNames(NativeTemporal),
...Object.getOwnPropertySymbols(NativeTemporal)
].forEach((prop) => {
Object.defineProperty(
TemporalWithClock,
prop,
Object.getOwnPropertyDescriptor(NativeTemporal, prop)
);
});
Object.defineProperty(TemporalWithClock, "Now", {
value: fakeNow,
writable: true,
enumerable: false,
configurable: true
});
return TemporalWithClock;
}
function enqueueJob(clock, job) {
if (!clock.jobs) {
clock.jobs = [];
}
clock.jobs.push(job);
}
function runJobs(clock) {
if (!clock.jobs) {
return;
}
const wasNearLimit = clock.isNearInfiniteLimit;
for (let i = 0; i < clock.jobs.length; i++) {
const job = clock.jobs[i];
job.func.apply(null, job.args);
checkIsNearInfiniteLimit(clock, i);
if (clock.loopLimit && i > clock.loopLimit) {
throw getInfiniteLoopError(clock, job);
}
}
if (!wasNearLimit) {
resetIsNearInfiniteLimit(clock);
}
clock.jobs = [];
}
class TimerHeap {
constructor() {
this.timers = [];
}
/**
* Look at the next timer without removing it.
* This is the timer the clock would run first if time advanced now.
* @returns {Timer}
*/
peek() {
return this.timers[0];
}
/**
* Add a timer to the waiting room, then move it upward until it is in
* the right place relative to the timers it should run before and after.
* @param {Timer} timer
*/
push(timer) {
this.timers.push(timer);
this.bubbleUp(this.timers.length - 1);
}
/**
* Remove and return the next timer to run.
*
* We pull the front timer out, move the last timer into the empty spot,
* and then shift that replacement down until the ordering is correct
* again. That avoids rebuilding the whole list from scratch.
* @returns {Timer|undefined}
*/
pop() {
if (this.timers.length === 0) {
return void 0;
}
const first = this.timers[0];
const last = this.timers.pop();
if (this.timers.length > 0) {
this.timers[0] = last;
last.heapIndex = 0;
this.bubbleDown(0);
}
delete first.heapIndex;
return first;
}
/**
* Remove a specific timer from the waiting room.
*
* The heap stores timers in a shape that lets us jump directly to the
* timer's current position, replace it with the last timer, and then
* move that replacement up or down until the ordering is correct again.
* @param {Timer} timer
* @returns {boolean}
*/
remove(timer) {
const index = timer.heapIndex;
if (index === void 0 || this.timers[index] !== timer) {
return false;
}
const last = this.timers.pop();
if (timer !== last) {
this.timers[index] = last;
last.heapIndex = index;
if (compareTimers(last, timer) < 0) {
this.bubbleUp(index);
} else {
this.bubbleDown(index);
}
}
delete timer.heapIndex;
return true;
}
/**
* Move a timer toward the front until it is no longer "earlier" than
* the timer above it.
*
* Conceptually, this is what happens when something newly scheduled
* turns out to belong ahead of its parent in the waiting room. We keep
* swapping it upward until it is no longer out of place.
* @param {number} index
*/
bubbleUp(index) {
const timer = this.timers[index];
let currentIndex = index;
while (currentIndex > 0) {
const parentIndex = Math.floor((currentIndex - 1) / 2);
const parent = this.timers[parentIndex];
if (compareTimers(timer, parent) < 0) {
this.timers[currentIndex] = parent;
parent.heapIndex = currentIndex;
currentIndex = parentIndex;
} else {
break;
}
}
this.timers[currentIndex] = timer;
timer.heapIndex = currentIndex;
}
/**
* Move a timer away from the front until the timer below it is no
* longer supposed to run after it.
*
* This is the opposite of `bubbleUp`: when a timer at the front is
* removed or moved, the replacement may be too far ahead, so we
* repeatedly swap it downward with the best child until the waiting
* room is ordered again.
* @param {number} index
*/
bubbleDown(index) {
const timer = this.timers[index];
let currentIndex = index;
const halfLength = Math.floor(this.timers.length / 2);
while (currentIndex < halfLength) {
const leftIndex = currentIndex * 2 + 1;
const rightIndex = leftIndex + 1;
let bestChildIndex = leftIndex;
let bestChild = this.timers[leftIndex];
if (rightIndex < this.timers.length && compareTimers(this.timers[rightIndex], bestChild) < 0) {
bestChildIndex = rightIndex;
bestChild = this.timers[rightIndex];
}
if (compareTimers(bestChild, timer) < 0) {
this.timers[currentIndex] = bestChild;
bestChild.heapIndex = currentIndex;
currentIndex = bestChildIndex;
} else {
break;
}
}
this.timers[currentIndex] = timer;
timer.heapIndex = currentIndex;
}
}
function ensureTimerState(clock) {
if (!clock.timers) {
clock.timers = /* @__PURE__ */ new Map();
clock.timerHeap = new TimerHeap();
}
}
function hasTimer(clock, id) {
return clock.timers ? clock.timers.has(id) : false;
}
function getTimer(clock, id) {
return clock.timers ? clock.timers.get(id) : void 0;
}
function setTimer(clock, timer) {
ensureTimerState(clock);
clock.timers.set(timer.id, timer);
}
function deleteTimer(clock, id) {
return clock.timers ? clock.timers.delete(id) : false;
}
function forEachActiveTimer(clock, callback) {
if (!clock.timers) {
return;
}
for (const timer of clock.timers.values()) {
callback(timer);
}
}
function rebuildTimerHeap(clock) {
clock.timerHeap = new TimerHeap();
forEachActiveTimer(clock, (timer) => {
clock.timerHeap.push(timer);
});
}
function addTimer(clock, timer) {
if (timer.func === void 0) {
throw new Error("Callback must be provided to timer calls");
}
if (typeof timer.func !== "function") {
throw new TypeError(
`[ERR_INVALID_CALLBACK]: Callback must be a function. Received ${timer.func} of type ${typeof timer.func}`
);
}
if (clock.isNearInfiniteLimit) {
timer.error = new Error();
}
timer.type = timer.immediate ? "Immediate" : "Timeout";
if (Object.prototype.hasOwnProperty.call(timer, "delay")) {
if (typeof timer.delay !== "number") {
timer.delay = parseInt(timer.delay, 10);
}
if (!isNumberFinite(timer.delay)) {
timer.delay = 0;
}
timer.delay = timer.delay > maxTimeout ? 1 : timer.delay;
timer.delay = Math.max(0, timer.delay);
}
if (Object.prototype.hasOwnProperty.call(timer, "interval")) {
timer.type = "Interval";
timer.interval = timer.interval > maxTimeout ? 1 : timer.interval;
}
if (Object.prototype.hasOwnProperty.call(timer, "animation")) {
timer.type = "AnimationFrame";
timer.animation = true;
}
if (Object.prototype.hasOwnProperty.call(timer, "requestIdleCallback")) {
if (!timer.delay) {
timer.type = "IdleCallback";
}
timer.requestIdleCallback = true;
}
ensureTimerState(clock);
while (hasTimer(clock, uniqueTimerId)) {
uniqueTimerId++;
if (uniqueTimerId >= Number.MAX_SAFE_INTEGER) {
uniqueTimerId = idCounterStart;
}
}
timer.id = uniqueTimerId++;
if (uniqueTimerId >= Number.MAX_SAFE_INTEGER) {
uniqueTimerId = idCounterStart;
}
timer.order = uniqueTimerOrder++;
timer.createdAt = clock.now;
timer.callAt = clock.now + (parseInt(String(timer.delay)) || (clock.duringTick ? 1 : 0));
setTimer(clock, timer);
clock.timerHeap.push(timer);
if (addTimerReturnsObject) {
const res = {
refed: true,
ref: function() {
this.refed = true;
return this;
},
unref: function() {
this.refed = false;
return this;
},
hasRef: function() {
return this.refed;
},
refresh: function() {
timer.callAt = clock.now + (parseInt(String(timer.delay)) || (clock.duringTick ? 1 : 0));
clock.timerHeap.remove(timer);
timer.order = uniqueTimerOrder++;
setTimer(clock, timer);
clock.timerHeap.push(timer);
return this;
},
[Symbol.toPrimitive]: function() {
return timer.id;
}
};
return res;
}
return timer.id;
}
function compareTimers(a, b) {
if (a.type === "IdleCallback" && b.type !== "IdleCallback") {
return 1;
}
if (a.type !== "IdleCallback" && b.type === "IdleCallback") {
return -1;
}
if (a.callAt < b.callAt) {
return -1;
}
if (a.callAt > b.callAt) {
return 1;
}
if (a.immediate && !b.immediate) {
return -1;
}
if (!a.immediate && b.immediate) {
return 1;
}
if (a.order < b.order) {
return -1;
}
if (a.order > b.order) {
return 1;
}
if (a.createdAt < b.createdAt) {
return -1;
}
if (a.createdAt > b.createdAt) {
return 1;
}
if (a.id < b.id) {
return -1;
}
if (a.id > b.id) {
return 1;
}
return 0;
}
function firstTimerInRange(clock, from, to) {
if (!clock.timerHeap) {
return null;
}
const timers2 = clock.timerHeap.timers;
if (timers2.length === 1 && timers2[0].requestIdleCallback) {
return timers2[0];
}
const first = clock.timerHeap.peek();
if (first && inRange(from, to, first)) {
return first;
}
let timer = null;
for (let i = 0; i < timers2.length; i++) {
if (inRange(from, to, timers2[i]) && (!timer || compareTimers(timer, timers2[i]) === 1)) {
timer = timers2[i];
}
}
return timer;
}
function firstTimer(clock) {
if (!clock.timerHeap) {
return null;
}
return clock.timerHeap.peek() || null;
}
function lastTimer(clock) {
if (!clock.timerHeap) {
return null;
}
const timers2 = clock.timerHeap.timers;
let timer = null;
for (let i = 0; i < timers2.length; i++) {
if (!timer || compareTimers(timer, timers2[i]) === -1) {
timer = timers2[i];
}
}
return timer;
}
function callTimer(clock, timer) {
if (typeof timer.interval === "number") {
clock.timerHeap.remove(timer);
timer.callAt += timer.interval;
timer.order = uniqueTimerOrder++;
if (clock.isNearInfiniteLimit) {
timer.error = new Error();
}
clock.timerHeap.push(timer);
} else {
deleteTimer(clock, timer.id);
clock.timerHeap.remove(timer);
}
if (typeof timer.func === "function") {
timer.func.apply(null, timer.args);
}
}
function getClearHandler(ttype) {
if (ttype === "IdleCallback" || ttype === "AnimationFrame") {
return `cancel${ttype}`;
}
return `clear${ttype}`;
}
function getScheduleHandler(ttype) {
if (ttype === "IdleCallback" || ttype === "AnimationFrame") {
return `request${ttype}`;
}
return `set${ttype}`;
}
function createWarnOnce() {
let calls = 0;
return function(msg) {
!calls++ && console.warn(msg);
};
}
const warnOnce = createWarnOnce();
function clearTimer(clock, timerId, ttype) {
if (!timerId) {
return;
}
const id = Number(timerId);
if (Number.isNaN(id) || id < idCounterStart) {
const handlerName = getClearHandler(ttype);
if (clock.shouldClearNativeTimers === true) {
const nativeHandler = clock[`_${handlerName}`];
return typeof nativeHandler === "function" ? nativeHandler(timerId) : void 0;
}
const stackTrace = new Error().stack.split("\n").slice(1).join("\n");
warnOnce(
`FakeTimers: ${handlerName} was invoked to clear a native timer instead of one created by this library.
To automatically clean-up native timers, use \`shouldClearNativeTimers\`.
${stackTrace}`
);
}
if (hasTimer(clock, id)) {
const timer = getTimer(clock, id);
if (timer.type === ttype || timer.type === "Timeout" && ttype === "Interval" || timer.type === "Interval" && ttype === "Timeout") {
deleteTimer(clock, id);
clock.timerHeap.remove(timer);
} else {
const clear = getClearHandler(ttype);
const schedule = getScheduleHandler(timer.type);
throw new Error(
`Cannot clear timer: timer created with ${schedule}() but cleared with ${clear}()`
);
}
}
}
function hijackMethod(target, method, clock) {
clock[method].hasOwnProperty = Object.prototype.hasOwnProperty.call(
target,
method
);
clock[`_${method}`] = target[method];
if (method === "Date") {
target[method] = clock[method];
} else if (method === "Intl") {
target[method] = clock[method];
} else if (method === "Temporal") {
target[method] = clock[method];
} else if (method === "performance") {
const originalPerfDescriptor = Object.getOwnPropertyDescriptor(
target,
method
);
if (originalPerfDescriptor && originalPerfDescriptor.get && !originalPerfDescriptor.set) {
Object.defineProperty(
clock,
`_${method}`,
originalPerfDescriptor
);
const perfDescriptor = Object.getOwnPropertyDescriptor(
clock,
method
);
Object.defineProperty(target, method, perfDescriptor);
} else {
target[method] = clock[method];
}
} else {
target[method] = function() {
return clock[method].apply(clock, arguments);
};
Object.defineProperties(
target[method],
Object.getOwnPropertyDescriptors(clock[method])
);
}
target[method].clock = clock;
}
function doIntervalTick(clock, advanceTimeDelta) {
clock.tick(advanceTimeDelta);
}
const timers = {
setTimeout: _global.setTimeout,
clearTimeout: _global.clearTimeout,
setInterval: _global.setInterval,
clearInterval: _global.clearInterval,
Date: _global.Date
};
if (isPresent.setImmediate) {
timers.setImmediate = _global.setImmediate;
}
if (isPresent.clearImmediate) {
timers.clearImmediate = _global.clearImmediate;
}
if (isPresent.hrtime) {
timers.hrtime = _global.process.hrtime;
}
if (isPresent.nextTick) {
timers.nextTick = _global.process.nextTick;
}
if (isPresent.performance) {
timers.performance = _global.performance;
}
if (isPresent.requestAnimationFrame) {
timers.requestAnimationFrame = _global.requestAnimationFrame;
}
if (isPresent.queueMicrotask) {
timers.queueMicrotask = _global.queueMicrotask;
}
if (isPresent.cancelAnimationFrame) {
timers.cancelAnimationFrame = _global.cancelAnimationFrame;
}
if (isPresent.requestIdleCallback) {
timers.requestIdleCallback = _global.requestIdleCallback;
}
if (isPresent.cancelIdleCallback) {
timers.cancelIdleCallback = _global.cancelIdleCallback;
}
if (isPresent.Intl) {
timers.Intl = NativeIntl;
}
if (isPresent.Temporal) {
timers.Temporal = NativeTemporal;
}
const originalSetTimeout = _global.setImmediate || _global.setTimeout;
const originalClearInterval = _global.clearInterval;
const originalSetInterval = _global.setInterval;
function createClock(start, loopLimit) {
start = Math.floor(getEpoch(start));
const startTimestamp = start;
loopLimit = loopLimit || 1e3;
let nanos = 0;
let uninstalled = false;
const adjustedSystemTime = [0, 0];
const clock = (
/** @type {Clock} */
{
now: start,
Date: createDate(),
loopLimit,
isNearInfiniteLimit: false,
tickMode: { mode: "manual", counter: 0, delta: void 0 }
}
);
clock.Date.clock = clock;
function getTimeToNextFrame() {
return 16 - (clock.now - startTimestamp) % 16;
}
function hrtime(prev) {
const millisSinceStart = clock.now - adjustedSystemTime[0] - startTimestamp;
const secsSinceStart = Math.floor(millisSinceStart / 1e3);
const remainderInNanos = (millisSinceStart - secsSinceStart * 1e3) * 1e6 + nanos - adjustedSystemTime[1];
if (Array.isArray(prev)) {
if (prev[1] > 1e9) {
throw new TypeError(
"Number of nanoseconds can't exceed a billion"
);
}
const oldSecs = prev[0];
let nanoDiff = remainderInNanos - prev[1];
let secDiff = secsSinceStart - oldSecs;
if (nanoDiff < 0) {
nanoDiff += 1e9;
secDiff -= 1;
}
return [secDiff, nanoDiff];
}
return [secsSinceStart, remainderInNanos];
}
function fakePerformanceNow() {
const hrt = hrtime();
const millis = hrt[0] * 1e3 + hrt[1] / 1e6;
return millis;
}
if (isPresent.hrtimeBigint) {
hrtime.bigint = function() {
const parts = hrtime();
return BigInt(parts[0]) * BigInt(1e9) + BigInt(parts[1]);
};
}
if (isPresent.Intl) {
clock.Intl = createIntl(clock);
clock.Intl.clock = clock;
}
if (isPresent.Temporal) {
clock.Temporal = createTemporal(clock, () => nanos);
}
clock.setTickMode = function(tickModeConfig) {
const { mode: newMode, delta: newDelta } = (
/** @type {SetTickModeConfig} */
tickModeConfig
);
const { mode: oldMode, delta: oldDelta } = clock.tickMode;
if (newMode === oldMode && newDelta === oldDelta) {
return;
}
if (oldMode === "interval") {
originalClearInterval(clock.attachedInterval);
}
clock.tickMode = {
counter: clock.tickMode.counter + 1,
mode: newMode,
delta: newDelta
};
if (newMode === "nextAsync") {
advanceUntilModeChanges();
} else if (newMode === "interval") {
createIntervalTick(clock, newDelta || 20);
}
};
async function advanceUntilModeChanges() {
async function newMacrotask() {
const channel = new MessageChannel();
await new Promise((resolve) => {
channel.port1.onmessage = () => {
resolve(void 0);
channel.port1.close();
};
channel.port2.postMessage(void 0);
});
channel.port1.close();
channel.port2.close();
await new Promise((resolve) => {
originalSetTimeout(resolve);
});
}
const { counter } = clock.tickMode;
while (clock.tickMode.counter === counter) {
await newMacrotask();
if (clock.tickMode.counter !== counter) {
return;
}
clock.next();
}
}
function pauseAutoTickUntilFinished(promise) {
if (clock.tickMode.mode !== "nextAsync") {
return promise;
}
clock.setTickMode({ mode: "manual" });
return promise.finally(() => {
if (!uninstalled) {
clock.setTickMode({ mode: "nextAsync" });
}
});
}
function getTimeToNextIdlePeriod() {
let timeToNextIdlePeriod = 0;
if (clock.countTimers() > 0) {
timeToNextIdlePeriod = 50;
}
return timeToNextIdlePeriod;
}
clock.requestIdleCallback = function requestIdleCallback(func, { timeout } = (
/** @type {{ timeout?: number }} */
{}
)) {
const idleDeadline = {
didTimeout: true,
timeRemaining: getTimeToNextIdlePeriod
};
const result = addTimer(clock, {
func,
args: [idleDeadline],
delay: timeout,
requestIdleCallback: true
});
return Number(result);
};
clock.cancelIdleCallback = function cancelIdleCallback(timerId) {
return clearTimer(clock, timerId, "IdleCallback");
};
clock.setTimeout = function setTimeout2(func, timeout) {
return addTimer(clock, {
func,
args: Array.prototype.slice.call(arguments, 2),
delay: timeout
});
};
if (typeof _global.Promise !== "undefined" && utilPromisify) {
clock.setTimeout[utilPromisify.custom] = function promisifiedSetTimeout(timeout, arg) {
return new _global.Promise(function setTimeoutExecutor(resolve) {
addTimer(clock, {
func: resolve,
args: [arg],
delay: timeout
});
});
};
}
clock.clearTimeout = function clearTimeout2(timerId) {
return clearTimer(clock, timerId, "Timeout");
};
clock.nextTick = function nextTick(func) {
return enqueueJob(clock, {
func,
args: Array.prototype.slice.call(arguments, 1),
error: clock.isNearInfiniteLimit ? new Error() : null
});
};
clock.queueMicrotask = function queueMicrotask(func) {
return clock.nextTick(func);
};
clock.setInterval = function setInterval2(func, timeout) {
timeout = parseInt(String(timeout), 10);
return addTimer(clock, {
func,
args: Array.prototype.slice.call(arguments, 2),
delay: timeout,
interval: timeout
});
};
clock.clearInterval = function clearInterval2(timerId) {
return clearTimer(clock, timerId, "Interval");
};
if (isPresent.setImmediate) {
clock.setImmediate = /** @type {SetImmediate} */
(function setImmediate(func) {
return addTimer(clock, {
func,
args: Array.prototype.slice.call(arguments, 1),
immediate: true
});
});
if (typeof _global.Promise !== "undefined" && utilPromisify) {
clock.setImmediate[utilPromisify.custom] = function promisifiedSetImmediate(arg) {
return new _global.Promise(
function setImmediateExecutor(resolve) {
addTimer(clock, {
func: resolve,
args: [arg],
immediate: true
});
}
);
};
}
clock.clearImmediate = function clearImmediate(timerId) {
return clearTimer(clock, timerId, "Immediate");
};
}
clock.countTimers = function countTimers() {
return (clock.timerHeap ? clock.timerHeap.timers.length : 0) + (clock.jobs || []).length;
};
clock.requestAnimationFrame = function requestAnimationFrame(func) {
const result = addTimer(clock, {
func,
delay: getTimeToNextFrame(),
get args() {
return [fakePerformanceNow()];
},
animation: true
});
return Number(result);
};
clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) {
return clearTimer(clock, timerId, "AnimationFrame");
};
clock.runMicrotasks = function runMicrotasks() {
runJobs(clock);
};
function durationToMs(duration) {
const relativeTo = NativeTemporal.Instant.fromEpochMilliseconds(
clock.now
).toZonedDateTimeISO(NativeTemporal.Now.timeZoneId());
return duration.total({ unit: "millisecond", relativeTo });
}
function tickValueToMs(tickValue) {
if (typeof tickValue === "number") {
return tickValue;
}
if (isPresent.Temporal && tickValue !== null && typeof tickValue === "object" && typeof /** @type {TemporalDuration} */
tickValue.total === "function") {
return durationToMs(
/** @type {TemporalDuration} */
tickValue
);
}
return parseTime(
/** @type {string} */
tickValue
);
}
function createTickState(tickValue) {
const msFloat = tickValueToMs(tickValue);
const ms = Math.floor(msFloat);
const remainder = nanoRemainder(msFloat);
let nanosTotal = nanos + remainder;
let tickTo = clock.now + ms;
if (msFloat < 0) {
throw new TypeError("Negative ticks are not supported");
}
if (nanosTotal >= 1e6) {
tickTo += 1;
nanosTotal -= 1e6;
}
return (
/** @type {ClockState} */
{
msFloat,
ms,
nanosTotal,
tickFrom: clock.now,
tickTo,
previous: clock.now,
timer: null,
firstException: null,
oldNow: null
}
);
}
function applyClockChangeCompensation(state, oldNow, options) {
if (oldNow !== clock.now) {
const difference = clock.now - oldNow;
state.tickFrom += difference;
state.tickTo += difference;
if (options && options.includePrevious) {
state.previous += difference;
}
}
}
function runInitialJobs(state) {
state.oldNow = clock.now;
runJobs(clock);
applyClockChangeCompensation(state, state.oldNow);
}
function runPostLoopJobs(state) {
state.oldNow = clock.now;
runJobs(clock);
applyClockChangeCompensation(state, state.oldNow);
}
function selectNextTimerInRange(state) {
state.timer = firstTimerInRange(
clock,
state.previous,
state.tickTo
);
state.previous = state.tickFrom;
}
function runTimersInRange(state, isAsync, nextPromiseTick, compensationCheck) {
state.timer = firstTimerInRange(
clock,
state.tickFrom,
state.tickTo
);
while (state.timer && state.tickFrom <= state.tickTo) {
if (hasTimer(clock, state.timer.id)) {
state.tickFrom = state.timer.callAt;
clock.now = state.timer.callAt;
state.oldNow = clock.now;
try {
runJobs(clock);
callTimer(clock, state.timer);
} catch (e) {
state.firstException = state.firstException || e;
}
if (isAsync) {
originalSetTimeout(nextPromiseTick);
return true;
}
compensationCheck();
}
selectNextTimerInRange(state);
}
return false;
}
function finalizeTick(state, isAsync, resolve) {
state.timer = firstTimerInRange(
clock,
state.tickFrom,
state.tickTo
);
if (state.timer) {
try {
clock.tick(state.tickTo - clock.now);
} catch (e) {
state.firstException = state.firstException || e;
}
} else {
clock.now = state.tickTo;
nanos = state.nanosTotal;
}
if (state.firstException) {
throw state.firstException;
}
if (isAsync) {
resolve(clock.now);
} else {
return clock.now;
}
}
function doTick(tickValue, isAsync, resolve, reject) {
const state = createTickState(tickValue);
nanos = state.nanosTotal;
clock.duringTick = true;
runInitialJobs(state);
const compensationCheck = function() {
applyClockChangeCompensation(state, state.oldNow, {
includePrevious: true
});
};
const nextPromiseTick = isAsync && function() {
try {
compensationCheck();
selectNextTimerInRange(state);
doTickInner();
} catch (e) {
reject(e);
}
};
function doTickInner() {
if (runTimersInRange(
state,
isAsync,
nextPromiseTick,
compensationCheck
)) {
return;
}
runPostLoopJobs(state);
clock.duringTick = false;
return finalizeTick(state, isAsync, resolve);
}
return doTickInner();
}
clock.tick = function tick(tickValue) {
return doTick(tickValue, false);
};
clock.next = function next() {
runJobs(clock);
const timer = firstTimer(clock);
if (!timer) {
return clock.now;
}
clock.duringTick = true;
try {
clock.now = timer.callAt;
callTimer(clock, timer);
runJobs(clock);
return clock.now;
} finally {
clock.duringTick = false;
}
};
function runAsyncWithNativeTimeout(callback) {
return pauseAutoTickUntilFinished(
new _global.Promise(function(resolve, reject) {
originalSetTimeout(function() {
try {
callback(resolve, reject);
} catch (e) {
reject(e);
}
});
})
);
}
clock.runAll = function runAll() {
runJobs(clock);
for (let i = 0; i < clock.loopLimit; i++) {
if (!clock.timers) {
resetIsNearInfiniteLimit(clock);
return clock.now;
}
const numTimers = clock.timerHeap.timers.length;
if (numTimers === 0) {
resetIsNearInfiniteLimit(clock);
return clock.now;
}
checkIsNearInfiniteLimit(clock, i);
clock.next();
}
const excessJob = firstTimer(clock);
throw getInfiniteLoopError(clock, excessJob);
};
clock.runToFrame = function runToFrame() {
return clock.tick(getTimeToNextFrame());
};
clock.runToLast = function runToLast() {
const timer = lastTimer(clock);
if (!timer) {
runJobs(clock);
return clock.now;
}
return clock.tick(timer.callAt - clock.now);
};
if (typeof _global.Promise !== "undefined") {
clock.tickAsync = function tickAsync(tickValue) {
return runAsyncWithNativeTimeout(function(resolve, reject) {
doTick(tickValue, true, resolve, reject);
});
};
clock.nextAsync = function nextAsync() {
return runAsyncWithNativeTimeout(function(resolve, reject) {
const timer = firstTimer(clock);
if (!timer) {
resolve(clock.now);
return;
}
let err;
clock.duringTick = true;
clock.now = timer.callAt;
try {
callTimer(clock, timer);
} catch (e) {
err = e;
}
clock.duringTick = false;
originalSetTimeout(function() {
if (err) {
reject(err);
} else {
resolve(clock.now);
}
});
});
};
clock.runAllAsync = function runAllAsync() {
let i = 0;
function doRun(resolve, reject) {
try {
runJobs(clock);
let numTimers;
if (i < clock.loopLimit) {
if (!clock.timerHeap) {
resetIsNearInfiniteLimit(clock);
resolve(clock.now);
return;
}
numTimers = clock.timerHeap.timers.length;
if (numTimers === 0) {
resetIsNearInfiniteLimit(clock);
resolve(clock.now);
return;
}
checkIsNearInfiniteLimit(clock, i);
clock.next();
i++;
originalSetTimeout(function() {
doRun(resolve, reject);
});
return;
}
const excessJob = firstTimer(clock);
reject(getInfiniteLoopError(clock, excessJob));
} catch (e) {
reject(e);
}
}
return runAsyncWithNativeTimeout(function(resolve, reject) {
doRun(resolve, reject);
});
};
clock.runToLastAsync = function runToLastAsync() {
return runAsyncWithNativeTimeout(function(resolve) {
const timer = lastTimer(clock);
if (!timer) {
runJobs(clock);
resolve(clock.now);
return;
}
resolve(clock.tickAsync(timer.callAt - clock.now));
});
};
}
clock.reset = function reset() {
nanos = 0;
clock.timers = /* @__PURE__ */ new Map();
clock.timerHeap = new TimerHeap();
clock.jobs = [];
clock.now = start;
};
clock.setSystemTime = function setSystemTime(systemTime) {
const newNow = getEpoch(systemTime);
const difference = newNow - clock.now;
adjustedSystemTime[0] = adjustedSystemTime[0] + difference;
adjustedSystemTime[1] = adjustedSystemTime[1] + nanos;
clock.now = newNow;
nanos = 0;
forEachActiveTimer(clock, (timer) => {
timer.createdAt += difference;
timer.callAt += difference;
});
};
clock.jump = function jump(tickValue) {
const msFloat = tickValueToMs(tickValue);
const ms = Math.floor(msFloat);
forEachActiveTimer(clock, (timer) => {
if (clock.now + ms > timer.callAt) {
timer.callAt = clock.now + ms;
}
});
rebuildTimerHeap(clock);
clock.tick(ms);
return clock.now;
};
if (isPresent.performance) {
clock.performance = /* @__PURE__ */ Object.create(null);
clock.performance.now = fakePerformanceNow;
}
if (isPresent.hrtime) {
clock.hrtime = hrtime;
}
clock.uninstall = function() {
uninstalled = true;
clock.setTickMode({ mode: "manual" });
if (clock.methods) {
const installedHrTime = "_hrtime";
const installedNextTick = "_nextTick";
let method, i, l;
for (i = 0, l = clock.methods.length; i < l; i++) {
method = clock.methods[i];
if (method === "hrtime" && _global.process) {
_global.process.hrtime = clock[installedHrTime];
} else if (method === "nextTick" && _global.process) {
_global.process.nextTick = clock[installedNextTick];
} else if (method === "performance") {
const originalPerfDescriptor = Object.getOwnPropertyDescriptor(
clock,
`_${method}`
);
if (originalPerfDescriptor && originalPerfDescriptor.get && !originalPerfDescriptor.set) {
Object.defineProperty(
_global,
method,
originalPerfDescriptor
);
} else if (originalPerfDescriptor.configurable) {
_global[method] = clock[`_${method}`];
}
} else {
if (clock[method] && clock[method].hasOwnProperty) {
_global[method] = clock[`_${method}`];
} else {
try {
delete _global[method];
} catch {
}
}
}
if (clock.timersModuleMethods !== void 0) {
for (let j = 0; j < clock.timersModuleMethods.length; j++) {
const entry = clock.timersModuleMethods[j];
timersModule[entry.methodName] = entry.original;
}
}
if (clock.timersPromisesModuleMethods !== void 0) {
for (let j = 0; j < clock.timersPromisesModuleMethods.length; j++) {
const entry = clock.timersPromisesModuleMethods[j];
timersPromisesModule[entry.methodName] = entry.original;
}
}
}
clock.methods = [];
}
if (clock.abortListenerMap) {
for (const [
listener,
signal
] of clock.abortListenerMap.entries()) {
signal.removeEventListener("abort", listener);
clock.abortListenerMap.delete(listener);
}
}
if (!clock.timerHeap) {
return [];
}
return clock.timerHeap.timers.slice();
};
return clock;
}
function createIntervalTick(clock, delta) {
const intervalTick = doIntervalTick.bind(null, clock, delta);
const intervalId = originalSetInterval(intervalTick, delta);
clock.attachedInterval = intervalId;
}
function install(config) {
if (arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === "number") {
throw new TypeError(
`FakeTimers.install called with ${String(
config
)} install requires an object parameter`
);
}
if (_global.Date.isFake === true) {
throw new TypeError(
"Can't install fake timers twice on the same global object."
);
}
config = typeof config !== "undefined" ? config : {};
config.shouldAdvanceTime = config.shouldAdvanceTime || false;
config.advanceTimeDelta = config.advanceTimeDelta || 20;
config.shouldClearNativeTimers = config.shouldClearNativeTimers || false;
const hasToFake = Object.prototype.hasOwnProperty.call(
config,
"toFake"
);
const hasToNotFake = Object.prototype.hasOwnProperty.call(
config,
"toNotFake"
);
if (hasToFake && hasToNotFake) {
throw new TypeError(
"config.toFake and config.toNotFake cannot be used together"
);
}
if (config.target) {
throw new TypeError(
"config.target is no longer supported. Use `withGlobal(target)` instead."
);
}
function handleMissingTimer(timer) {
if (config.ignoreMissingTimers) {
return;
}
throw new ReferenceError(
`non-existent timers and/or objects cannot be faked: '${timer}'`
);
}
let i, l;
const clock = createClock(config.now, config.loopLimit);
clock.shouldClearNativeTimers = config.shouldClearNativeTimers;
clock.abortListenerMap = /* @__PURE__ */ new Map();
if (hasToFake) {
clock.methods = /** @type {FakeMethod[]} */
config.toFake || [];
if (clock.methods.length === 0) {
clock.methods = /** @type {FakeMethod[]} */
Object.keys(timers);
}
} else if (hasToNotFake) {
const methodsToNotFake = (
/** @type {string[]} */
config.toNotFake || []
);
clock.methods = /** @type {FakeMethod[]} */
Object.keys(timers).filter(
(method) => !methodsToNotFake.includes(method)
);
} else {
clock.methods = /** @type {FakeMethod[]} */
Object.keys(timers);
}
if (config.shouldAdvanceTime === true) {
clock.setTickMode({
mode: "interval",
delta: config.advanceTimeDelta
});
}
if (clock.methods.includes("performance")) {
const proto = (() => {
if (hasPerformanceConstructorPrototype) {
return _global.performance.constructor.prototype;
}
if (hasPerformancePrototype) {
return _global.Performance.prototype;
}
})();
if (proto) {
Object.getOwnPropertyNames(proto).forEach(function(name) {
if (name !== "now") {
clock.performance[name] = name.indexOf("getEntries") === 0 ? NOOP_ARRAY : NOOP;
}
});
clock.performance.mark = (name) => new FakePerformanceEntry(name, "mark", 0, 0);
clock.performance.measure = (name) => new FakePerformanceEntry(name, "measure", 0, 100);
clock.performance.timeOrigin = getEpoch(config.now);
} else if ((config.toFake || []).includes("performance")) {
handleMissingTimer("performance");
}
}
if (_global === globalObject && timersModule) {
clock.timersModuleMethods = [];
}
if (_global === globalObject && timersPromisesModule) {
clock.timersPromisesModuleMethods = [];
}
for (i = 0, l = clock.methods.length; i < l; i++) {
const nameOfMethodToReplace = clock.methods[i];
if (!isPresent[nameOfMethodToReplace]) {
handleMissingTimer(nameOfMethodToReplace);
continue;
}
if (nameOfMethodToReplace === "hrtime") {
if (_global.process && typeof _global.process.hrtime === "function") {
hijackMethod(_global.process, nameOfMethodToReplace, clock);
}
} else if (nameOfMethodToReplace === "nextTick") {
if (_global.process && typeof _global.process.nextTick === "function") {
hijackMethod(_global.process, nameOfMethodToReplace, clock);
}
} else {
hijackMethod(_global, nameOfMethodToReplace, clock);
}
if (clock.timersModuleMethods !== void 0 && timersModule[nameOfMethodToReplace]) {
const original = timersModule[nameOfMethodToReplace];
clock.timersModuleMethods.push({
methodName: nameOfMethodToReplace,
original
});
timersModule[nameOfMethodToReplace] = _global[nameOfMethodToReplace];
}
if (clock.timersPromisesModuleMethods !== void 0) {
if (nameOfMethodToReplace === "setTimeout") {
clock.timersPromisesModuleMethods.push({
methodName: "setTimeout",
original: timersPromisesModule.setTimeout
});
timersPromisesModule.setTimeout = (delay, value, options = {}) => new Promise((resolve, reject) => {
const abort = () => {
options.signal.removeEventListener(
"abort",
abort
);
clock.abortListenerMap.delete(abort);
clock.clearTimeout(handle);
reject(options.signal.reason);
};
const handle = clock.setTimeout(() => {
if (options.signal) {
options.signal.removeEventListener(
"abort",
abort
);
clock.abortListenerMap.delete(abort);
}
resolve(value);
}, delay);
if (options.signal) {
if (options.signal.aborted) {
abort();
} else {
options.signal.addEventListener(
"abort",
abort
);
clock.abortListenerMap.set(
abort,
options.signal
);
}
}
});
} else if (nameOfMethodToReplace === "setImmediate") {
clock.timersPromisesModuleMethods.push({
methodName: "setImmediate",
original: timersPromisesModule.setImmediate
});
timersPromisesModule.setImmediate = (value, options = {}) => new Promise((resolve, reject) => {
const abort = () => {
options.signal.removeEventListener(
"abort",
abort
);
clock.abortListenerMap.delete(abort);
clock.clearImmediate(handle);
reject(options.signal.reason);
};
const handle = clock.setImmediate(() => {
if (options.signal) {
options.signal.removeEventListener(
"abort",
abort
);
clock.abortListenerMap.delete(abort);
}
resolve(value);
});
if (options.signal) {
if (options.signal.aborted) {
abort();
} else {
options.signal.addEventListener(
"abort",
abort
);
clock.abortListenerMap.set(
abort,
options.signal
);
}
}
});
} else if (nameOfMethodToReplace === "setInterval") {
clock.timersPromisesModuleMethods.push({
methodName: "setInterval",
original: timersPromisesModule.setInterval
});
timersPromisesModule.setInterval = (delay, value, options = {}) => ({
[Symbol.asyncIterator]: () => {
const createResolvable = () => {
let resolve, reject;
const promise = (
/** @type {Promise<unknown> & { resolve: (value: unknown) => void; reject: (reason: unknown) => void }} */
new Promise((res, rej) => {
resolve = res;
reject = rej;
})
);
promise.resolve = resolve;
promise.reject = reject;
return promise;
};
let done = false;
let hasThrown = false;
let returnCall;
let nextAvailable = 0;
const nextQueue = [];
const handle = clock.setInterval(() => {
if (nextQueue.length > 0) {
nextQueue.shift().resolve();
} else {
nextAvailable++;
}
}, delay);
const abort = () => {
options.signal.removeEventListener(
"abort",
abort
);
clock.abortListenerMap.delete(abort);
clock.clearInterval(handle);
done = true;
for (const resolvable of nextQueue) {
resolvable.resolve();
}
};
if (options.signal) {
if (options.signal.aborted) {
done = true;
} else {
options.signal.addEventListener(
"abort",
abort
);
clock.abortListenerMap.set(
abort,
options.signal
);
}
}
return {
next: async () => {
if (options.signal?.aborted && !hasThrown) {
hasThrown = true;
throw options.signal.reason;
}
if (done) {
return { done: true, value: void 0 };
}
if (nextAvailable > 0) {
nextAvailable--;
return { done: false, value };
}
const resolvable = createResolvable();
nextQueue.push(resolvable);
await resolvable;
if (returnCall && nextQueue.length === 0) {
returnCall.resolve();
}
if (options.signal?.aborted && !hasThrown) {
hasThrown = true;
throw options.signal.reason;
}
if (done) {
return { done: true, value: void 0 };
}
return { done: false, value };
},
return: async () => {
if (done) {
return { done: true, value: void 0 };
}
if (nextQueue.length > 0) {
returnCall = createResolvable();
await returnCall;
}
clock.clearInterval(handle);
done = true;
if (options.signal) {
options.signal.removeEventListener(
"abort",
abort
);
clock.abortListenerMap.delete(abort);
}
return { done: true, value: void 0 };
}
};
}
});
}
}
}
return clock;
}
return {
timers,
createClock,
install,
withGlobal
};
}
var defaultImplementation = withGlobal(globalObject);
exports2.timers = defaultImplementation.timers;
exports2.createClock = defaultImplementation.createClock;
exports2.install = defaultImplementation.install;
exports2.withGlobal = withGlobal;
}
});
// lib/sinon/util/fake-timers.js
var require_fake_timers = __commonJS({
"lib/sinon/util/fake-timers.js"(exports2) {
"use strict";
var extend = require_extend();
var FakeTimers = require_fake_timers_src();
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var FakeTimers__default = /* @__PURE__ */ _interopDefault(FakeTimers);
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { global: globalObject } = commons__default.default;
function createClock(config, globalCtx) {
let FakeTimersCtx = FakeTimers__default.default;
if (globalCtx !== null && typeof globalCtx === "object") {
FakeTimersCtx = FakeTimers__default.default.withGlobal(globalCtx);
}
const clock2 = FakeTimersCtx.install(config);
clock2.restore = clock2.uninstall;
return clock2;
}
function addIfDefined(obj, globalPropName) {
const globalProp = globalObject[globalPropName];
if (typeof globalProp !== "undefined") {
obj[globalPropName] = globalProp;
}
}
function useFakeTimers(dateOrConfig) {
const hasArguments = typeof dateOrConfig !== "undefined";
const argumentIsDateLike = (typeof dateOrConfig === "number" || dateOrConfig instanceof Date) && arguments.length === 1;
const argumentIsObject = dateOrConfig !== null && typeof dateOrConfig === "object" && arguments.length === 1;
if (!hasArguments) {
return createClock({
now: 0
});
}
if (argumentIsDateLike) {
return createClock({
now: dateOrConfig
});
}
if (argumentIsObject) {
const config = extend.nonEnum({}, dateOrConfig);
const globalCtx = config.global;
delete config.global;
return createClock(config, globalCtx);
}
throw new TypeError(
"useFakeTimers expected epoch or config object. See https://github.com/sinonjs/sinon"
);
}
var clock = {
create: function(now) {
return FakeTimers__default.default.createClock(now);
}
};
var timers = {
setTimeout,
clearTimeout,
setInterval,
clearInterval,
Date
};
addIfDefined(timers, "setImmediate");
addIfDefined(timers, "clearImmediate");
addIfDefined(timers, "Temporal");
addIfDefined(timers, "performance");
addIfDefined(timers, "requestAnimationFrame");
addIfDefined(timers, "cancelAnimationFrame");
addIfDefined(timers, "requestIdleCallback");
addIfDefined(timers, "cancelIdleCallback");
addIfDefined(timers, "hrtime");
addIfDefined(timers, "nextTick");
addIfDefined(timers, "queueMicrotask");
exports2.clock = clock;
exports2.timers = timers;
exports2.useFakeTimers = useFakeTimers;
}
});
// lib/sinon/proxy-call-util.js
var require_proxy_call_util = __commonJS({
"lib/sinon/proxy-call-util.js"(exports2) {
"use strict";
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { push } = prototypes.array;
function incrementCallCount(proxy) {
proxy.called = true;
proxy.callCount += 1;
proxy.notCalled = false;
proxy.calledOnce = proxy.callCount === 1;
proxy.calledTwice = proxy.callCount === 2;
proxy.calledThrice = proxy.callCount === 3;
}
function createCallProperties(proxy) {
proxy.firstCall = proxy.getCall(0);
proxy.secondCall = proxy.getCall(1);
proxy.thirdCall = proxy.getCall(2);
proxy.lastCall = proxy.getCall(proxy.callCount - 1);
}
function delegateToCalls(proxy, method, matchAny, actual, returnsValues, notCalled, totalCallCount) {
proxy[method] = function() {
if (!this.called) {
if (notCalled) {
return notCalled.apply(this, arguments);
}
return false;
}
if (totalCallCount !== void 0 && this.callCount !== totalCallCount) {
return false;
}
let currentCall;
let matches = 0;
const returnValues = [];
for (let i = 0, l = this.callCount; i < l; i += 1) {
currentCall = this.getCall(i);
const returnValue = currentCall[actual || method].apply(
currentCall,
arguments
);
push(returnValues, returnValue);
if (returnValue) {
matches += 1;
if (matchAny) {
return true;
}
}
}
if (returnsValues) {
return returnValues;
}
return matches === this.callCount;
};
}
exports2.createCallProperties = createCallProperties;
exports2.delegateToCalls = delegateToCalls;
exports2.incrementCallCount = incrementCallCount;
}
});
// lib/sinon/proxy-invoke.js
var require_proxy_invoke = __commonJS({
"lib/sinon/proxy-invoke.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var proxyCallUtil = require_proxy_call_util();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { push, forEach, concat } = prototypes.array;
var ErrorConstructor = Error.prototype.constructor;
var { bind } = Function.prototype;
var callId = 0;
var maxSafeInteger = Number.MAX_SAFE_INTEGER;
function invoke(func, thisValue, args) {
const matchings = this.matchingFakes(args);
const currentCallId = callId;
callId = callId >= maxSafeInteger ? 0 : callId + 1;
let exception, returnValue;
proxyCallUtil.incrementCallCount(this);
push(this.thisValues, thisValue);
push(this.args, args);
push(this.callIds, currentCallId);
forEach(matchings, function(matching) {
proxyCallUtil.incrementCallCount(matching);
push(matching.thisValues, thisValue);
push(matching.args, args);
push(matching.callIds, currentCallId);
});
proxyCallUtil.createCallProperties(this);
forEach(matchings, proxyCallUtil.createCallProperties);
try {
this.invoking = true;
const thisCall = this.getCall(this.callCount - 1);
if (thisCall.calledWithNew()) {
returnValue = new (bind.apply(
this.func || func,
concat([thisValue], args)
))();
if (typeof returnValue !== "object" && typeof returnValue !== "function") {
returnValue = thisValue;
}
} else {
returnValue = (this.func || func).apply(thisValue, args);
}
} catch (e) {
exception = e;
} finally {
delete this.invoking;
}
push(this.exceptions, exception);
push(this.returnValues, returnValue);
forEach(matchings, function(matching) {
push(matching.exceptions, exception);
push(matching.returnValues, returnValue);
});
const err = new ErrorConstructor();
try {
throw err;
} catch (e) {
}
push(this.errorsWithCallStack, err);
forEach(matchings, function(matching) {
push(matching.errorsWithCallStack, err);
});
proxyCallUtil.createCallProperties(this);
forEach(matchings, proxyCallUtil.createCallProperties);
if (exception !== void 0) {
throw exception;
}
return returnValue;
}
module2.exports = invoke;
}
});
// lib/sinon/proxy-call.js
var require_proxy_call = __commonJS({
"lib/sinon/proxy-call.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var samsam = require_samsam();
var util = require_util();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var { prototypes, functionName, valueToString } = commons__default.default;
var { createMatcher: match, deepEqual } = samsam__default.default;
var { concat, filter, join, map, reduce, slice } = prototypes.array;
function throwYieldError(proxy, text, args) {
let msg = functionName(proxy) + text;
if (args.length) {
msg += ` Received [${join(slice(args), ", ")}]`;
}
throw new Error(msg);
}
var callProto = {
calledOn: function calledOn(thisValue) {
if (match.isMatcher(thisValue)) {
return thisValue.test(this.thisValue);
}
return this.thisValue === thisValue;
},
calledWith: function calledWith() {
const self2 = this;
const calledWithArgs = slice(arguments);
if (calledWithArgs.length > self2.args.length) {
return false;
}
return reduce(
calledWithArgs,
function(prev, arg, i) {
return prev && deepEqual(self2.args[i], arg);
},
true
);
},
calledWithMatch: function calledWithMatch() {
const self2 = this;
const calledWithMatchArgs = slice(arguments);
if (calledWithMatchArgs.length > self2.args.length) {
return false;
}
return reduce(
calledWithMatchArgs,
function(prev, expectation, i) {
const actual = self2.args[i];
return prev && match(expectation).test(actual);
},
true
);
},
calledWithExactly: function calledWithExactly() {
return arguments.length === this.args.length && this.calledWith.apply(this, arguments);
},
notCalledWith: function notCalledWith() {
return !this.calledWith.apply(this, arguments);
},
notCalledWithMatch: function notCalledWithMatch() {
return !this.calledWithMatch.apply(this, arguments);
},
returned: function returned(value) {
return deepEqual(this.returnValue, value);
},
threw: function threw(error) {
if (typeof error === "undefined" || !this.exception) {
return Boolean(this.exception);
}
return this.exception === error || this.exception.name === error;
},
calledWithNew: function calledWithNew() {
return this.proxy.prototype && this.thisValue instanceof this.proxy;
},
calledBefore: function(other) {
return this.callId < other.callId;
},
calledAfter: function(other) {
return this.callId > other.callId;
},
calledImmediatelyBefore: function(other) {
return this.callId === other.callId - 1;
},
calledImmediatelyAfter: function(other) {
return this.callId === other.callId + 1;
},
callArg: function(pos) {
this.ensureArgIsAFunction(pos);
return this.args[pos]();
},
callArgOn: function(pos, thisValue) {
this.ensureArgIsAFunction(pos);
return this.args[pos].apply(thisValue);
},
callArgWith: function(pos) {
return this.callArgOnWith.apply(
this,
concat([pos, null], slice(arguments, 1))
);
},
callArgOnWith: function(pos, thisValue) {
this.ensureArgIsAFunction(pos);
const args = slice(arguments, 2);
return this.args[pos].apply(thisValue, args);
},
throwArg: function(pos) {
if (pos > this.args.length) {
throw new TypeError(
`Not enough arguments: ${pos} required but only ${this.args.length} present`
);
}
throw this.args[pos];
},
yield: function() {
return this.yieldOn.apply(this, concat([null], slice(arguments, 0)));
},
yieldOn: function(thisValue) {
const args = slice(this.args);
const yieldFn = filter(args, function(arg) {
return typeof arg === "function";
})[0];
if (!yieldFn) {
throwYieldError(
this.proxy,
" cannot yield since no callback was passed.",
args
);
}
return yieldFn.apply(thisValue, slice(arguments, 1));
},
yieldTo: function(prop) {
return this.yieldToOn.apply(
this,
concat([prop, null], slice(arguments, 1))
);
},
yieldToOn: function(prop, thisValue) {
const args = slice(this.args);
const yieldArg = filter(args, function(arg) {
return arg && typeof arg[prop] === "function";
})[0];
const yieldFn = yieldArg && yieldArg[prop];
if (!yieldFn) {
throwYieldError(
this.proxy,
` cannot yield to '${valueToString(
prop
)}' since no callback was passed.`,
args
);
}
return yieldFn.apply(thisValue, slice(arguments, 2));
},
toString: function() {
if (!this.args) {
return ":(";
}
let callStr = this.proxy ? `${String(this.proxy)}(` : "";
const formattedArgs = map(this.args, function(arg) {
return util.inspect(arg);
});
callStr = `${callStr + join(formattedArgs, ", ")})`;
if (typeof this.returnValue !== "undefined") {
callStr += ` => ${util.inspect(this.returnValue)}`;
}
if (this.exception) {
callStr += ` !${this.exception.name}`;
if (this.exception.message) {
callStr += `(${this.exception.message})`;
}
}
if (this.stack) {
callStr += (this.stack.split("\n")[3] || "unknown").replace(
/^\s*(?:at\s+|@)?/,
" at "
);
}
return callStr;
},
ensureArgIsAFunction: function(pos) {
if (typeof this.args[pos] !== "function") {
throw new TypeError(
`Expected argument at position ${pos} to be a Function, but was ${typeof this.args[pos]}`
);
}
}
};
Object.defineProperty(callProto, "stack", {
enumerable: true,
configurable: true,
get: function() {
return this.errorWithCallStack && this.errorWithCallStack.stack || "";
}
});
callProto.invokeCallback = callProto.yield;
function createProxyCall(proxy, thisValue, args, returnValue, exception, id, errorWithCallStack) {
if (typeof id !== "number") {
throw new TypeError("Call id is not a number");
}
let firstArg, lastArg;
if (args.length > 0) {
firstArg = args[0];
lastArg = args[args.length - 1];
}
const proxyCall = Object.create(callProto);
const callback = lastArg && typeof lastArg === "function" ? lastArg : void 0;
proxyCall.proxy = proxy;
proxyCall.thisValue = thisValue;
proxyCall.args = args;
proxyCall.firstArg = firstArg;
proxyCall.lastArg = lastArg;
proxyCall.callback = callback;
proxyCall.returnValue = returnValue;
proxyCall.exception = exception;
proxyCall.callId = id;
proxyCall.errorWithCallStack = errorWithCallStack;
return proxyCall;
}
createProxyCall.toString = callProto.toString;
module2.exports = createProxyCall;
}
});
// lib/sinon/util/core/is-property-configurable.js
var require_is_property_configurable = __commonJS({
"lib/sinon/util/core/is-property-configurable.js"(exports2, module2) {
"use strict";
var getPropertyDescriptor = require_get_property_descriptor();
function isPropertyConfigurable(obj, propName) {
const propertyDescriptor = getPropertyDescriptor(obj, propName);
return propertyDescriptor ? propertyDescriptor.configurable : true;
}
module2.exports = isPropertyConfigurable;
}
});
// lib/sinon/default-behaviors.js
var require_default_behaviors = __commonJS({
"lib/sinon/default-behaviors.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var isPropertyConfigurable = require_is_property_configurable();
var exportAsyncBehaviors = require_export_async_behaviors();
var extend = require_extend();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { slice } = prototypes.array;
var useLeftMostCallback = -1;
var useRightMostCallback = -2;
function throwsException(fake, error, message) {
if (typeof error === "function") {
fake.exceptionCreator = error;
} else if (typeof error === "string") {
fake.exceptionCreator = function() {
const newException = new Error(
message || `Sinon-provided ${error}`
);
newException.name = error;
return newException;
};
} else if (!error) {
fake.exceptionCreator = function() {
return new Error("Error");
};
} else {
fake.exception = error;
}
}
var defaultBehaviors = {
callsFake: function callsFake(fake, fn) {
fake.fakeFn = fn;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.callsThrough = false;
},
callsArg: function callsArg(fake, index) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.callArgAt = index;
fake.callbackArguments = [];
fake.callbackContext = void 0;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.callsThrough = false;
},
callsArgOn: function callsArgOn(fake, index, context) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.callArgAt = index;
fake.callbackArguments = [];
fake.callbackContext = context;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.callsThrough = false;
},
callsArgWith: function callsArgWith(fake, index) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.callArgAt = index;
fake.callbackArguments = slice(arguments, 2);
fake.callbackContext = void 0;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.callsThrough = false;
},
callsArgOnWith: function callsArgWith(fake, index, context) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.callArgAt = index;
fake.callbackArguments = slice(arguments, 3);
fake.callbackContext = context;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.callsThrough = false;
},
yields: function(fake) {
fake.callArgAt = useLeftMostCallback;
fake.callbackArguments = slice(arguments, 1);
fake.callbackContext = void 0;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.fakeFn = void 0;
fake.callsThrough = false;
},
yieldsRight: function(fake) {
fake.callArgAt = useRightMostCallback;
fake.callbackArguments = slice(arguments, 1);
fake.callbackContext = void 0;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.callsThrough = false;
fake.fakeFn = void 0;
},
yieldsOn: function(fake, context) {
fake.callArgAt = useLeftMostCallback;
fake.callbackArguments = slice(arguments, 2);
fake.callbackContext = context;
fake.callArgProp = void 0;
fake.callbackAsync = false;
fake.callsThrough = false;
fake.fakeFn = void 0;
},
yieldsTo: function(fake, prop) {
fake.callArgAt = useLeftMostCallback;
fake.callbackArguments = slice(arguments, 2);
fake.callbackContext = void 0;
fake.callArgProp = prop;
fake.callbackAsync = false;
fake.callsThrough = false;
fake.fakeFn = void 0;
},
yieldsToOn: function(fake, prop, context) {
fake.callArgAt = useLeftMostCallback;
fake.callbackArguments = slice(arguments, 3);
fake.callbackContext = context;
fake.callArgProp = prop;
fake.callbackAsync = false;
fake.fakeFn = void 0;
},
throws: throwsException,
throwsException,
returns: function returns(fake, value) {
fake.callsThrough = false;
fake.returnValue = value;
fake.resolve = false;
fake.reject = false;
fake.returnValueDefined = true;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.fakeFn = void 0;
},
returnsArg: function returnsArg(fake, index) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.callsThrough = false;
fake.returnArgAt = index;
},
throwsArg: function throwsArg(fake, index) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.callsThrough = false;
fake.throwArgAt = index;
},
returnsThis: function returnsThis(fake) {
fake.returnThis = true;
fake.callsThrough = false;
},
resolves: function resolves(fake, value) {
fake.returnValue = value;
fake.resolve = true;
fake.resolveThis = false;
fake.reject = false;
fake.returnValueDefined = true;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.fakeFn = void 0;
fake.callsThrough = false;
},
resolvesArg: function resolvesArg(fake, index) {
if (typeof index !== "number") {
throw new TypeError("argument index is not number");
}
fake.resolveArgAt = index;
fake.returnValue = void 0;
fake.resolve = true;
fake.resolveThis = false;
fake.reject = false;
fake.returnValueDefined = false;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.fakeFn = void 0;
fake.callsThrough = false;
},
rejects: function rejects(fake, error, message) {
let reason;
if (typeof error === "string") {
reason = new Error(message || "");
reason.name = error;
} else if (!error) {
reason = new Error("Error");
} else {
reason = error;
}
fake.returnValue = reason;
fake.resolve = false;
fake.resolveThis = false;
fake.reject = true;
fake.returnValueDefined = true;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.fakeFn = void 0;
fake.callsThrough = false;
return fake;
},
resolvesThis: function resolvesThis(fake) {
fake.returnValue = void 0;
fake.resolve = false;
fake.resolveThis = true;
fake.reject = false;
fake.returnValueDefined = false;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.fakeFn = void 0;
fake.callsThrough = false;
},
callThrough: function callThrough(fake) {
fake.callsThrough = true;
fake.callArgAt = void 0;
fake.callsThroughWithNew = false;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.fakeFn = void 0;
fake.reject = false;
fake.resolve = false;
fake.resolveArgAt = void 0;
fake.resolveThis = false;
fake.returnArgAt = void 0;
fake.returnThis = false;
fake.returnValue = void 0;
fake.throwArgAt = void 0;
fake.callArgProp = void 0;
fake.callbackArguments = [];
fake.callbackContext = void 0;
fake.callbackAsync = false;
fake.returnValueDefined = false;
},
callThroughWithNew: function callThroughWithNew(fake) {
fake.callsThroughWithNew = true;
fake.callArgAt = void 0;
fake.exception = void 0;
fake.exceptionCreator = void 0;
fake.throwArgAt = void 0;
fake.callArgProp = void 0;
fake.callbackArguments = [];
fake.callbackContext = void 0;
fake.callbackAsync = false;
},
get: function get(fake, getterFunction) {
const rootStub = fake.stub || fake;
Object.defineProperty(rootStub.rootObj, rootStub.propName, {
get: getterFunction,
configurable: isPropertyConfigurable(
rootStub.rootObj,
rootStub.propName
)
});
return fake;
},
set: function set(fake, setterFunction) {
const rootStub = fake.stub || fake;
Object.defineProperty(
rootStub.rootObj,
rootStub.propName,
// eslint-disable-next-line accessor-pairs
{
set: setterFunction,
configurable: isPropertyConfigurable(
rootStub.rootObj,
rootStub.propName
)
}
);
return fake;
},
value: function value(fake, newVal) {
const rootStub = fake.stub || fake;
Object.defineProperty(rootStub.rootObj, rootStub.propName, {
value: newVal,
enumerable: true,
writable: true,
configurable: rootStub.shadowsPropOnPrototype || isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
});
return fake;
}
};
var asyncBehaviors = exportAsyncBehaviors(defaultBehaviors);
var behaviors = extend({}, defaultBehaviors, asyncBehaviors);
module2.exports = behaviors;
}
});
// lib/sinon/util/core/function-to-string.js
var require_function_to_string = __commonJS({
"lib/sinon/util/core/function-to-string.js"(exports2, module2) {
"use strict";
function functionToString() {
let i, prop, thisValue;
if (this.getCall && this.callCount) {
i = this.callCount;
while (i--) {
thisValue = this.getCall(i).thisValue;
for (prop in thisValue) {
try {
if (thisValue[prop] === this) {
return prop;
}
} catch (e) {
}
}
}
}
return this.displayName || "sinon fake";
}
module2.exports = functionToString;
}
});
// lib/sinon/colorizer.js
var require_colorizer = __commonJS({
"lib/sinon/colorizer.js"(exports2, module2) {
"use strict";
function getSupportsColor() {
if (typeof process === "undefined" || typeof process.stdout === "undefined") {
return { stdout: false };
}
return { stdout: Boolean(process.stdout.isTTY) };
}
var Colorizer = class {
/**
* @param {object} [supportsColorModule] The supports-color module
*/
constructor(supportsColorModule = getSupportsColor()) {
this.supportsColor = supportsColorModule;
}
/**
* Colorizes a string with the given color code.
*
* @param {string} str The string to colorize
* @param {number} color The color code
* @returns {string} The colorized string
* @private
*/
colorize(str, color) {
if (this.supportsColor.stdout === false) {
return str;
}
return `\x1B[${color}m${str}\x1B[0m`;
}
/**
* Colorizes a string red.
*
* @param {string} str The string to colorize
* @returns {string} The colorized string
*/
red(str) {
return this.colorize(str, 31);
}
/**
* Colorizes a string green.
*
* @param {string} str The string to colorize
* @returns {string} The colorized string
*/
green(str) {
return this.colorize(str, 32);
}
/**
* Colorizes a string cyan.
*
* @param {string} str The string to colorize
* @returns {string} The colorized string
*/
cyan(str) {
return this.colorize(str, 96);
}
/**
* Colorizes a string white.
*
* @param {string} str The string to colorize
* @returns {string} The colorized string
*/
white(str) {
return this.colorize(str, 39);
}
/**
* Colorizes a string bold.
*
* @param {string} str The string to colorize
* @returns {string} The colorized string
*/
bold(str) {
return this.colorize(str, 1);
}
};
module2.exports = Colorizer;
}
});
// node_modules/diff/libcjs/diff/base.js
var require_base = __commonJS({
"node_modules/diff/libcjs/diff/base.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var Diff = class {
diff(oldStr, newStr, options = {}) {
let callback;
if (typeof options === "function") {
callback = options;
options = {};
} else if ("callback" in options) {
callback = options.callback;
}
const oldString = this.castInput(oldStr, options);
const newString = this.castInput(newStr, options);
const oldTokens = this.removeEmpty(this.tokenize(oldString, options));
const newTokens = this.removeEmpty(this.tokenize(newString, options));
return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);
}
diffWithOptionsObj(oldTokens, newTokens, options, callback) {
var _a;
const done = (value) => {
value = this.postProcess(value, options);
if (callback) {
setTimeout(function() {
callback(value);
}, 0);
return void 0;
} else {
return value;
}
};
const newLen = newTokens.length, oldLen = oldTokens.length;
let editLength = 1;
let maxEditLength = newLen + oldLen;
if (options.maxEditLength != null) {
maxEditLength = Math.min(maxEditLength, options.maxEditLength);
}
const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;
const abortAfterTimestamp = Date.now() + maxExecutionTime;
const bestPath = [{ oldPos: -1, lastComponent: void 0 }];
let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);
if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {
return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));
}
let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;
const execEditLength = () => {
for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {
let basePath;
const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];
if (removePath) {
bestPath[diagonalPath - 1] = void 0;
}
let canAdd = false;
if (addPath) {
const addPathNewPos = addPath.oldPos - diagonalPath;
canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;
}
const canRemove = removePath && removePath.oldPos + 1 < oldLen;
if (!canAdd && !canRemove) {
bestPath[diagonalPath] = void 0;
continue;
}
if (!canRemove || canAdd && removePath.oldPos < addPath.oldPos) {
basePath = this.addToPath(addPath, true, false, 0, options);
} else {
basePath = this.addToPath(removePath, false, true, 1, options);
}
newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);
if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {
return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;
} else {
bestPath[diagonalPath] = basePath;
if (basePath.oldPos + 1 >= oldLen) {
maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);
}
if (newPos + 1 >= newLen) {
minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);
}
}
}
editLength++;
};
if (callback) {
(function exec() {
setTimeout(function() {
if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {
return callback(void 0);
}
if (!execEditLength()) {
exec();
}
}, 0);
})();
} else {
while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {
const ret = execEditLength();
if (ret) {
return ret;
}
}
}
}
addToPath(path, added, removed, oldPosInc, options) {
const last = path.lastComponent;
if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {
return {
oldPos: path.oldPos + oldPosInc,
lastComponent: { count: last.count + 1, added, removed, previousComponent: last.previousComponent }
};
} else {
return {
oldPos: path.oldPos + oldPosInc,
lastComponent: { count: 1, added, removed, previousComponent: last }
};
}
}
extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {
const newLen = newTokens.length, oldLen = oldTokens.length;
let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;
while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {
newPos++;
oldPos++;
commonCount++;
if (options.oneChangePerToken) {
basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };
}
}
if (commonCount && !options.oneChangePerToken) {
basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };
}
basePath.oldPos = oldPos;
return newPos;
}
equals(left, right, options) {
if (options.comparator) {
return options.comparator(left, right);
} else {
return left === right || !!options.ignoreCase && left.toLowerCase() === right.toLowerCase();
}
}
removeEmpty(array) {
const ret = [];
for (let i = 0; i < array.length; i++) {
if (array[i]) {
ret.push(array[i]);
}
}
return ret;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
castInput(value, options) {
return value;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
tokenize(value, options) {
return Array.from(value);
}
join(chars) {
return chars.join("");
}
postProcess(changeObjects, options) {
return changeObjects;
}
get useLongestToken() {
return false;
}
buildValues(lastComponent, newTokens, oldTokens) {
const components = [];
let nextComponent;
while (lastComponent) {
components.push(lastComponent);
nextComponent = lastComponent.previousComponent;
delete lastComponent.previousComponent;
lastComponent = nextComponent;
}
components.reverse();
const componentLen = components.length;
let componentPos = 0, newPos = 0, oldPos = 0;
for (; componentPos < componentLen; componentPos++) {
const component = components[componentPos];
if (!component.removed) {
if (!component.added && this.useLongestToken) {
let value = newTokens.slice(newPos, newPos + component.count);
value = value.map(function(value2, i) {
const oldValue = oldTokens[oldPos + i];
return oldValue.length > value2.length ? oldValue : value2;
});
component.value = this.join(value);
} else {
component.value = this.join(newTokens.slice(newPos, newPos + component.count));
}
newPos += component.count;
if (!component.added) {
oldPos += component.count;
}
} else {
component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));
oldPos += component.count;
}
}
return components;
}
};
exports2.default = Diff;
}
});
// node_modules/diff/libcjs/diff/character.js
var require_character = __commonJS({
"node_modules/diff/libcjs/diff/character.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.characterDiff = void 0;
exports2.diffChars = diffChars;
var base_js_1 = __importDefault(require_base());
var CharacterDiff = class extends base_js_1.default {
};
exports2.characterDiff = new CharacterDiff();
function diffChars(oldStr, newStr, options) {
return exports2.characterDiff.diff(oldStr, newStr, options);
}
}
});
// node_modules/diff/libcjs/util/string.js
var require_string2 = __commonJS({
"node_modules/diff/libcjs/util/string.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.longestCommonPrefix = longestCommonPrefix;
exports2.longestCommonSuffix = longestCommonSuffix;
exports2.replacePrefix = replacePrefix;
exports2.replaceSuffix = replaceSuffix;
exports2.removePrefix = removePrefix;
exports2.removeSuffix = removeSuffix;
exports2.maximumOverlap = maximumOverlap;
exports2.hasOnlyWinLineEndings = hasOnlyWinLineEndings;
exports2.hasOnlyUnixLineEndings = hasOnlyUnixLineEndings;
exports2.segment = segment;
exports2.trailingWs = trailingWs;
exports2.leadingWs = leadingWs;
exports2.leadingAndTrailingWs = leadingAndTrailingWs;
function longestCommonPrefix(str1, str2) {
let i;
for (i = 0; i < str1.length && i < str2.length; i++) {
if (str1[i] != str2[i]) {
return str1.slice(0, i);
}
}
return str1.slice(0, i);
}
function longestCommonSuffix(str1, str2) {
let i;
if (!str1 || !str2 || str1[str1.length - 1] != str2[str2.length - 1]) {
return "";
}
for (i = 0; i < str1.length && i < str2.length; i++) {
if (str1[str1.length - (i + 1)] != str2[str2.length - (i + 1)]) {
return str1.slice(-i);
}
}
return str1.slice(-i);
}
function replacePrefix(string, oldPrefix, newPrefix) {
if (string.slice(0, oldPrefix.length) != oldPrefix) {
throw Error(`string ${JSON.stringify(string)} doesn't start with prefix ${JSON.stringify(oldPrefix)}; this is a bug`);
}
return newPrefix + string.slice(oldPrefix.length);
}
function replaceSuffix(string, oldSuffix, newSuffix) {
if (!oldSuffix) {
return string + newSuffix;
}
if (string.slice(-oldSuffix.length) != oldSuffix) {
throw Error(`string ${JSON.stringify(string)} doesn't end with suffix ${JSON.stringify(oldSuffix)}; this is a bug`);
}
return string.slice(0, -oldSuffix.length) + newSuffix;
}
function removePrefix(string, oldPrefix) {
return replacePrefix(string, oldPrefix, "");
}
function removeSuffix(string, oldSuffix) {
return replaceSuffix(string, oldSuffix, "");
}
function maximumOverlap(string1, string2) {
return string2.slice(0, overlapCount(string1, string2));
}
function overlapCount(a, b) {
let startA = 0;
if (a.length > b.length) {
startA = a.length - b.length;
}
let endB = b.length;
if (a.length < b.length) {
endB = a.length;
}
const map = Array(endB);
let k = 0;
map[0] = 0;
for (let j = 1; j < endB; j++) {
if (b[j] == b[k]) {
map[j] = map[k];
} else {
map[j] = k;
}
while (k > 0 && b[j] != b[k]) {
k = map[k];
}
if (b[j] == b[k]) {
k++;
}
}
k = 0;
for (let i = startA; i < a.length; i++) {
while (k > 0 && a[i] != b[k]) {
k = map[k];
}
if (a[i] == b[k]) {
k++;
}
}
return k;
}
function hasOnlyWinLineEndings(string) {
return string.includes("\r\n") && !string.startsWith("\n") && !string.match(/[^\r]\n/);
}
function hasOnlyUnixLineEndings(string) {
return !string.includes("\r\n") && string.includes("\n");
}
function segment(string, segmenter) {
const parts = [];
for (const segmentObj of Array.from(segmenter.segment(string))) {
const segment2 = segmentObj.segment;
if (parts.length && /\s/.test(parts[parts.length - 1]) && /\s/.test(segment2)) {
parts[parts.length - 1] += segment2;
} else {
parts.push(segment2);
}
}
return parts;
}
function trailingWs(string, segmenter) {
if (segmenter) {
return leadingAndTrailingWs(string, segmenter)[1];
}
let i;
for (i = string.length - 1; i >= 0; i--) {
if (!string[i].match(/\s/)) {
break;
}
}
return string.substring(i + 1);
}
function leadingWs(string, segmenter) {
if (segmenter) {
return leadingAndTrailingWs(string, segmenter)[0];
}
const match = string.match(/^\s*/);
return match ? match[0] : "";
}
function leadingAndTrailingWs(string, segmenter) {
if (!segmenter) {
return [leadingWs(string), trailingWs(string)];
}
if (segmenter.resolvedOptions().granularity != "word") {
throw new Error('The segmenter passed must have a granularity of "word"');
}
const segments = segment(string, segmenter);
const firstSeg = segments[0];
const lastSeg = segments[segments.length - 1];
const head = /\s/.test(firstSeg) ? firstSeg : "";
const tail = /\s/.test(lastSeg) ? lastSeg : "";
return [head, tail];
}
}
});
// node_modules/diff/libcjs/diff/word.js
var require_word = __commonJS({
"node_modules/diff/libcjs/diff/word.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.wordsWithSpaceDiff = exports2.wordDiff = void 0;
exports2.diffWords = diffWords;
exports2.diffWordsWithSpace = diffWordsWithSpace;
var base_js_1 = __importDefault(require_base());
var string_js_1 = require_string2();
var extendedWordChars = "a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}";
var tokenizeIncludingWhitespace = new RegExp(`[${extendedWordChars}]+|\\s+|[^${extendedWordChars}]`, "ug");
var WordDiff = class extends base_js_1.default {
equals(left, right, options) {
if (options.ignoreCase) {
left = left.toLowerCase();
right = right.toLowerCase();
}
return left.trim() === right.trim();
}
tokenize(value, options = {}) {
let parts;
if (options.intlSegmenter) {
const segmenter = options.intlSegmenter;
if (segmenter.resolvedOptions().granularity != "word") {
throw new Error('The segmenter passed must have a granularity of "word"');
}
parts = (0, string_js_1.segment)(value, segmenter);
} else {
parts = value.match(tokenizeIncludingWhitespace) || [];
}
const tokens = [];
let prevPart = null;
parts.forEach((part) => {
if (/\s/.test(part)) {
if (prevPart == null) {
tokens.push(part);
} else {
tokens.push(tokens.pop() + part);
}
} else if (prevPart != null && /\s/.test(prevPart)) {
if (tokens[tokens.length - 1] == prevPart) {
tokens.push(tokens.pop() + part);
} else {
tokens.push(prevPart + part);
}
} else {
tokens.push(part);
}
prevPart = part;
});
return tokens;
}
join(tokens) {
return tokens.map((token, i) => {
if (i == 0) {
return token;
} else {
return token.replace(/^\s+/, "");
}
}).join("");
}
postProcess(changes, options) {
if (!changes || options.oneChangePerToken) {
return changes;
}
let lastKeep = null;
let insertion = null;
let deletion = null;
changes.forEach((change) => {
if (change.added) {
insertion = change;
} else if (change.removed) {
deletion = change;
} else {
if (insertion || deletion) {
dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, change, options.intlSegmenter);
}
lastKeep = change;
insertion = null;
deletion = null;
}
});
if (insertion || deletion) {
dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, null, options.intlSegmenter);
}
return changes;
}
};
exports2.wordDiff = new WordDiff();
function diffWords(oldStr, newStr, options) {
if ((options === null || options === void 0 ? void 0 : options.ignoreWhitespace) != null && !options.ignoreWhitespace) {
return diffWordsWithSpace(oldStr, newStr, options);
}
return exports2.wordDiff.diff(oldStr, newStr, options);
}
function dedupeWhitespaceInChangeObjects(startKeep, deletion, insertion, endKeep, segmenter) {
if (deletion && insertion) {
const [oldWsPrefix, oldWsSuffix] = (0, string_js_1.leadingAndTrailingWs)(deletion.value, segmenter);
const [newWsPrefix, newWsSuffix] = (0, string_js_1.leadingAndTrailingWs)(insertion.value, segmenter);
if (startKeep) {
const commonWsPrefix = (0, string_js_1.longestCommonPrefix)(oldWsPrefix, newWsPrefix);
startKeep.value = (0, string_js_1.replaceSuffix)(startKeep.value, newWsPrefix, commonWsPrefix);
deletion.value = (0, string_js_1.removePrefix)(deletion.value, commonWsPrefix);
insertion.value = (0, string_js_1.removePrefix)(insertion.value, commonWsPrefix);
}
if (endKeep) {
const commonWsSuffix = (0, string_js_1.longestCommonSuffix)(oldWsSuffix, newWsSuffix);
endKeep.value = (0, string_js_1.replacePrefix)(endKeep.value, newWsSuffix, commonWsSuffix);
deletion.value = (0, string_js_1.removeSuffix)(deletion.value, commonWsSuffix);
insertion.value = (0, string_js_1.removeSuffix)(insertion.value, commonWsSuffix);
}
} else if (insertion) {
if (startKeep) {
const ws = (0, string_js_1.leadingWs)(insertion.value, segmenter);
insertion.value = insertion.value.substring(ws.length);
}
if (endKeep) {
const ws = (0, string_js_1.leadingWs)(endKeep.value, segmenter);
endKeep.value = endKeep.value.substring(ws.length);
}
} else if (startKeep && endKeep) {
const newWsFull = (0, string_js_1.leadingWs)(endKeep.value, segmenter), [delWsStart, delWsEnd] = (0, string_js_1.leadingAndTrailingWs)(deletion.value, segmenter);
const newWsStart = (0, string_js_1.longestCommonPrefix)(newWsFull, delWsStart);
deletion.value = (0, string_js_1.removePrefix)(deletion.value, newWsStart);
const newWsEnd = (0, string_js_1.longestCommonSuffix)((0, string_js_1.removePrefix)(newWsFull, newWsStart), delWsEnd);
deletion.value = (0, string_js_1.removeSuffix)(deletion.value, newWsEnd);
endKeep.value = (0, string_js_1.replacePrefix)(endKeep.value, newWsFull, newWsEnd);
startKeep.value = (0, string_js_1.replaceSuffix)(startKeep.value, newWsFull, newWsFull.slice(0, newWsFull.length - newWsEnd.length));
} else if (endKeep) {
const endKeepWsPrefix = (0, string_js_1.leadingWs)(endKeep.value, segmenter);
const deletionWsSuffix = (0, string_js_1.trailingWs)(deletion.value, segmenter);
const overlap = (0, string_js_1.maximumOverlap)(deletionWsSuffix, endKeepWsPrefix);
deletion.value = (0, string_js_1.removeSuffix)(deletion.value, overlap);
} else if (startKeep) {
const startKeepWsSuffix = (0, string_js_1.trailingWs)(startKeep.value, segmenter);
const deletionWsPrefix = (0, string_js_1.leadingWs)(deletion.value, segmenter);
const overlap = (0, string_js_1.maximumOverlap)(startKeepWsSuffix, deletionWsPrefix);
deletion.value = (0, string_js_1.removePrefix)(deletion.value, overlap);
}
}
var WordsWithSpaceDiff = class extends base_js_1.default {
tokenize(value) {
const regex = new RegExp(`(\\r?\\n)|[${extendedWordChars}]+|[^\\S\\n\\r]+|[^${extendedWordChars}]`, "ug");
return value.match(regex) || [];
}
};
exports2.wordsWithSpaceDiff = new WordsWithSpaceDiff();
function diffWordsWithSpace(oldStr, newStr, options) {
return exports2.wordsWithSpaceDiff.diff(oldStr, newStr, options);
}
}
});
// node_modules/diff/libcjs/util/params.js
var require_params = __commonJS({
"node_modules/diff/libcjs/util/params.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.generateOptions = generateOptions;
function generateOptions(options, defaults) {
if (typeof options === "function") {
defaults.callback = options;
} else if (options) {
for (const name in options) {
if (Object.prototype.hasOwnProperty.call(options, name)) {
defaults[name] = options[name];
}
}
}
return defaults;
}
}
});
// node_modules/diff/libcjs/diff/line.js
var require_line = __commonJS({
"node_modules/diff/libcjs/diff/line.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.lineDiff = void 0;
exports2.diffLines = diffLines;
exports2.diffTrimmedLines = diffTrimmedLines;
exports2.tokenize = tokenize;
var base_js_1 = __importDefault(require_base());
var params_js_1 = require_params();
var LineDiff = class extends base_js_1.default {
constructor() {
super(...arguments);
this.tokenize = tokenize;
}
equals(left, right, options) {
if (options.ignoreWhitespace) {
if (!options.newlineIsToken || !left.includes("\n")) {
left = left.trim();
}
if (!options.newlineIsToken || !right.includes("\n")) {
right = right.trim();
}
} else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {
if (left.endsWith("\n")) {
left = left.slice(0, -1);
}
if (right.endsWith("\n")) {
right = right.slice(0, -1);
}
}
return super.equals(left, right, options);
}
};
exports2.lineDiff = new LineDiff();
function diffLines(oldStr, newStr, options) {
return exports2.lineDiff.diff(oldStr, newStr, options);
}
function diffTrimmedLines(oldStr, newStr, options) {
options = (0, params_js_1.generateOptions)(options, { ignoreWhitespace: true });
return exports2.lineDiff.diff(oldStr, newStr, options);
}
function tokenize(value, options) {
if (options.stripTrailingCr) {
value = value.replace(/\r\n/g, "\n");
}
const retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/);
if (!linesAndNewlines[linesAndNewlines.length - 1]) {
linesAndNewlines.pop();
}
for (let i = 0; i < linesAndNewlines.length; i++) {
const line = linesAndNewlines[i];
if (i % 2 && !options.newlineIsToken) {
retLines[retLines.length - 1] += line;
} else {
retLines.push(line);
}
}
return retLines;
}
}
});
// node_modules/diff/libcjs/diff/sentence.js
var require_sentence = __commonJS({
"node_modules/diff/libcjs/diff/sentence.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.sentenceDiff = void 0;
exports2.diffSentences = diffSentences;
var base_js_1 = __importDefault(require_base());
function isSentenceEndPunct(char) {
return char == "." || char == "!" || char == "?";
}
var SentenceDiff = class extends base_js_1.default {
tokenize(value) {
var _a;
const result = [];
let tokenStartI = 0;
for (let i = 0; i < value.length; i++) {
if (i == value.length - 1) {
result.push(value.slice(tokenStartI));
break;
}
if (isSentenceEndPunct(value[i]) && value[i + 1].match(/\s/)) {
result.push(value.slice(tokenStartI, i + 1));
i = tokenStartI = i + 1;
while ((_a = value[i + 1]) === null || _a === void 0 ? void 0 : _a.match(/\s/)) {
i++;
}
result.push(value.slice(tokenStartI, i + 1));
tokenStartI = i + 1;
}
}
return result;
}
};
exports2.sentenceDiff = new SentenceDiff();
function diffSentences(oldStr, newStr, options) {
return exports2.sentenceDiff.diff(oldStr, newStr, options);
}
}
});
// node_modules/diff/libcjs/diff/css.js
var require_css = __commonJS({
"node_modules/diff/libcjs/diff/css.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.cssDiff = void 0;
exports2.diffCss = diffCss;
var base_js_1 = __importDefault(require_base());
var CssDiff = class extends base_js_1.default {
tokenize(value) {
return value.split(/([{}:;,]|\s+)/);
}
};
exports2.cssDiff = new CssDiff();
function diffCss(oldStr, newStr, options) {
return exports2.cssDiff.diff(oldStr, newStr, options);
}
}
});
// node_modules/diff/libcjs/diff/json.js
var require_json = __commonJS({
"node_modules/diff/libcjs/diff/json.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.jsonDiff = void 0;
exports2.diffJson = diffJson;
exports2.canonicalize = canonicalize;
var base_js_1 = __importDefault(require_base());
var line_js_1 = require_line();
var JsonDiff = class extends base_js_1.default {
constructor() {
super(...arguments);
this.tokenize = line_js_1.tokenize;
}
get useLongestToken() {
return true;
}
castInput(value, options) {
const { undefinedReplacement, stringifyReplacer = (k, v) => typeof v === "undefined" ? undefinedReplacement : v } = options;
return typeof value === "string" ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), null, " ");
}
equals(left, right, options) {
return super.equals(left.replace(/,([\r\n])/g, "$1"), right.replace(/,([\r\n])/g, "$1"), options);
}
};
exports2.jsonDiff = new JsonDiff();
function diffJson(oldStr, newStr, options) {
return exports2.jsonDiff.diff(oldStr, newStr, options);
}
function canonicalize(obj, stack, replacementStack, replacer, key) {
stack = stack || [];
replacementStack = replacementStack || [];
if (replacer) {
obj = replacer(key === void 0 ? "" : key, obj);
}
let i;
for (i = 0; i < stack.length; i += 1) {
if (stack[i] === obj) {
return replacementStack[i];
}
}
let canonicalizedObj;
if ("[object Array]" === Object.prototype.toString.call(obj)) {
stack.push(obj);
canonicalizedObj = new Array(obj.length);
replacementStack.push(canonicalizedObj);
for (i = 0; i < obj.length; i += 1) {
canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, String(i));
}
stack.pop();
replacementStack.pop();
return canonicalizedObj;
}
if (obj && obj.toJSON) {
obj = obj.toJSON();
}
if (typeof obj === "object" && obj !== null) {
stack.push(obj);
canonicalizedObj = {};
replacementStack.push(canonicalizedObj);
const sortedKeys = [];
let key2;
for (key2 in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key2)) {
sortedKeys.push(key2);
}
}
sortedKeys.sort();
for (i = 0; i < sortedKeys.length; i += 1) {
key2 = sortedKeys[i];
canonicalizedObj[key2] = canonicalize(obj[key2], stack, replacementStack, replacer, key2);
}
stack.pop();
replacementStack.pop();
} else {
canonicalizedObj = obj;
}
return canonicalizedObj;
}
}
});
// node_modules/diff/libcjs/diff/array.js
var require_array2 = __commonJS({
"node_modules/diff/libcjs/diff/array.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.arrayDiff = void 0;
exports2.diffArrays = diffArrays;
var base_js_1 = __importDefault(require_base());
var ArrayDiff = class extends base_js_1.default {
tokenize(value) {
return value.slice();
}
join(value) {
return value;
}
removeEmpty(value) {
return value;
}
};
exports2.arrayDiff = new ArrayDiff();
function diffArrays(oldArr, newArr, options) {
return exports2.arrayDiff.diff(oldArr, newArr, options);
}
}
});
// node_modules/diff/libcjs/patch/line-endings.js
var require_line_endings = __commonJS({
"node_modules/diff/libcjs/patch/line-endings.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.unixToWin = unixToWin;
exports2.winToUnix = winToUnix;
exports2.isUnix = isUnix;
exports2.isWin = isWin;
function unixToWin(patch) {
if (Array.isArray(patch)) {
return patch.map((p) => unixToWin(p));
}
return Object.assign(Object.assign({}, patch), { hunks: patch.hunks.map((hunk) => Object.assign(Object.assign({}, hunk), { lines: hunk.lines.map((line, i) => {
var _a;
return line.startsWith("\\") || line.endsWith("\r") || ((_a = hunk.lines[i + 1]) === null || _a === void 0 ? void 0 : _a.startsWith("\\")) ? line : line + "\r";
}) })) });
}
function winToUnix(patch) {
if (Array.isArray(patch)) {
return patch.map((p) => winToUnix(p));
}
return Object.assign(Object.assign({}, patch), { hunks: patch.hunks.map((hunk) => Object.assign(Object.assign({}, hunk), { lines: hunk.lines.map((line) => line.endsWith("\r") ? line.substring(0, line.length - 1) : line) })) });
}
function isUnix(patch) {
if (!Array.isArray(patch)) {
patch = [patch];
}
return !patch.some((index) => index.hunks.some((hunk) => hunk.lines.some((line) => !line.startsWith("\\") && line.endsWith("\r"))));
}
function isWin(patch) {
if (!Array.isArray(patch)) {
patch = [patch];
}
return patch.some((index) => index.hunks.some((hunk) => hunk.lines.some((line) => line.endsWith("\r")))) && patch.every((index) => index.hunks.every((hunk) => hunk.lines.every((line, i) => {
var _a;
return line.startsWith("\\") || line.endsWith("\r") || ((_a = hunk.lines[i + 1]) === null || _a === void 0 ? void 0 : _a.startsWith("\\"));
})));
}
}
});
// node_modules/diff/libcjs/patch/parse.js
var require_parse = __commonJS({
"node_modules/diff/libcjs/patch/parse.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.parsePatch = parsePatch;
function parsePatch(uniDiff) {
const diffstr = uniDiff.split(/\n/), list = [];
let i = 0;
function isGitDiffHeader(line) {
return /^diff --git /.test(line);
}
function isDiffHeader(line) {
return isGitDiffHeader(line) || /^Index:\s/.test(line) || /^diff(?: -r \w+)+\s/.test(line);
}
function isFileHeader(line) {
return /^(---|\+\+\+)\s/.test(line);
}
function isHunkHeader(line) {
return /^@@\s/.test(line);
}
function parseIndex() {
var _a;
const index = {};
index.hunks = [];
list.push(index);
let seenDiffHeader = false;
while (i < diffstr.length) {
const line = diffstr[i];
if (isFileHeader(line) || isHunkHeader(line)) {
break;
}
if (isGitDiffHeader(line)) {
if (seenDiffHeader) {
return;
}
seenDiffHeader = true;
index.isGit = true;
const paths = parseGitDiffHeader(line);
if (paths) {
index.oldFileName = paths.oldFileName;
index.newFileName = paths.newFileName;
}
i++;
while (i < diffstr.length) {
const extLine = diffstr[i];
if (isFileHeader(extLine) || isHunkHeader(extLine) || isDiffHeader(extLine)) {
break;
}
const renameFromMatch = /^rename from (.*)/.exec(extLine);
if (renameFromMatch) {
index.oldFileName = "a/" + unquoteIfQuoted(renameFromMatch[1]);
index.isRename = true;
}
const renameToMatch = /^rename to (.*)/.exec(extLine);
if (renameToMatch) {
index.newFileName = "b/" + unquoteIfQuoted(renameToMatch[1]);
index.isRename = true;
}
const copyFromMatch = /^copy from (.*)/.exec(extLine);
if (copyFromMatch) {
index.oldFileName = "a/" + unquoteIfQuoted(copyFromMatch[1]);
index.isCopy = true;
}
const copyToMatch = /^copy to (.*)/.exec(extLine);
if (copyToMatch) {
index.newFileName = "b/" + unquoteIfQuoted(copyToMatch[1]);
index.isCopy = true;
}
const newFileModeMatch = /^new file mode (\d+)/.exec(extLine);
if (newFileModeMatch) {
index.isCreate = true;
index.newMode = newFileModeMatch[1];
}
const deletedFileModeMatch = /^deleted file mode (\d+)/.exec(extLine);
if (deletedFileModeMatch) {
index.isDelete = true;
index.oldMode = deletedFileModeMatch[1];
}
const oldModeMatch = /^old mode (\d+)/.exec(extLine);
if (oldModeMatch) {
index.oldMode = oldModeMatch[1];
}
const newModeMatch = /^new mode (\d+)/.exec(extLine);
if (newModeMatch) {
index.newMode = newModeMatch[1];
}
if (/^Binary files /.test(extLine)) {
index.isBinary = true;
}
i++;
}
continue;
} else if (isDiffHeader(line)) {
if (seenDiffHeader) {
return;
}
seenDiffHeader = true;
const headerMatch = /^(?:Index:|diff(?: -r \w+)+)\s+/.exec(line);
if (headerMatch) {
index.index = line.substring(headerMatch[0].length).trim();
}
}
i++;
}
parseFileHeader(index);
parseFileHeader(index);
if (index.oldFileName === void 0 !== (index.newFileName === void 0)) {
throw new Error("Missing " + (index.oldFileName !== void 0 ? '"+++ ..."' : '"--- ..."') + " file header for " + ((_a = index.oldFileName) !== null && _a !== void 0 ? _a : index.newFileName));
}
while (i < diffstr.length) {
const line = diffstr[i];
if (isDiffHeader(line) || isFileHeader(line) || /^===================================================================/.test(line)) {
break;
} else if (isHunkHeader(line)) {
index.hunks.push(parseHunk());
} else {
i++;
}
}
}
function parseGitDiffHeader(line) {
const rest = line.substring("diff --git ".length);
if (rest.startsWith('"')) {
const oldPath = parseQuotedFileName(rest);
if (oldPath === null) {
return null;
}
const afterOld = rest.substring(oldPath.rawLength + 1);
let newFileName;
if (afterOld.startsWith('"')) {
const newPath = parseQuotedFileName(afterOld);
if (newPath === null) {
return null;
}
newFileName = newPath.fileName;
} else {
newFileName = afterOld;
}
return {
oldFileName: oldPath.fileName,
newFileName
};
}
const quoteIdx = rest.indexOf('"');
if (quoteIdx > 0) {
const oldFileName = rest.substring(0, quoteIdx - 1);
const newPath = parseQuotedFileName(rest.substring(quoteIdx));
if (newPath === null) {
return null;
}
return {
oldFileName,
newFileName: newPath.fileName
};
}
if (rest.startsWith("a/")) {
const splits = [];
let idx = 0;
while (true) {
idx = rest.indexOf(" b/", idx + 1);
if (idx === -1) {
break;
}
splits.push(idx);
}
if (splits.length > 0) {
const mid = splits[Math.floor(splits.length / 2)];
return {
oldFileName: rest.substring(0, mid),
newFileName: rest.substring(mid + 1)
};
}
}
return null;
}
function unquoteIfQuoted(s) {
if (s.startsWith('"')) {
const parsed = parseQuotedFileName(s);
if (parsed) {
return parsed.fileName;
}
}
return s;
}
function parseQuotedFileName(s) {
if (!s.startsWith('"')) {
return null;
}
let result = "";
let j = 1;
while (j < s.length) {
if (s[j] === '"') {
return { fileName: result, rawLength: j + 1 };
}
if (s[j] === "\\" && j + 1 < s.length) {
j++;
switch (s[j]) {
case "a":
result += "\x07";
break;
case "b":
result += "\b";
break;
case "f":
result += "\f";
break;
case "n":
result += "\n";
break;
case "r":
result += "\r";
break;
case "t":
result += " ";
break;
case "v":
result += "\v";
break;
case "\\":
result += "\\";
break;
case '"':
result += '"';
break;
case "0":
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7": {
if (j + 2 >= s.length || s[j + 1] < "0" || s[j + 1] > "7" || s[j + 2] < "0" || s[j + 2] > "7") {
return null;
}
const bytes = [parseInt(s.substring(j, j + 3), 8)];
j += 3;
while (s[j] === "\\" && s[j + 1] >= "0" && s[j + 1] <= "7") {
if (j + 3 >= s.length || s[j + 2] < "0" || s[j + 2] > "7" || s[j + 3] < "0" || s[j + 3] > "7") {
return null;
}
bytes.push(parseInt(s.substring(j + 1, j + 4), 8));
j += 4;
}
result += new TextDecoder("utf-8").decode(new Uint8Array(bytes));
continue;
}
// Note that in C, there are also three kinds of hex escape sequences:
// - \xhh
// - \uhhhh
// - \Uhhhhhhhh
// We do not bother to parse them here because, so far as we know,
// they are never emitted by any tools that generate unified diff
// format diffs, and so for now jsdiff does not consider them legal.
default:
return null;
}
} else {
result += s[j];
}
j++;
}
return null;
}
function parseFileHeader(index) {
const fileHeaderMatch = /^(---|\+\+\+)\s+/.exec(diffstr[i]);
if (fileHeaderMatch) {
const prefix = fileHeaderMatch[1], data = diffstr[i].substring(3).trim().split(" ", 2), header = (data[1] || "").trim();
let fileName = data[0];
if (fileName.startsWith('"')) {
fileName = unquoteIfQuoted(fileName);
} else {
fileName = fileName.replace(/\\\\/g, "\\");
}
if (prefix === "---") {
index.oldFileName = fileName;
index.oldHeader = header;
} else {
index.newFileName = fileName;
index.newHeader = header;
}
i++;
}
}
function parseHunk() {
var _a;
const chunkHeaderIndex = i, chunkHeaderLine = diffstr[i++], chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
const hunk = {
oldStart: +chunkHeader[1],
oldLines: typeof chunkHeader[2] === "undefined" ? 1 : +chunkHeader[2],
newStart: +chunkHeader[3],
newLines: typeof chunkHeader[4] === "undefined" ? 1 : +chunkHeader[4],
lines: []
};
if (hunk.oldLines === 0) {
hunk.oldStart += 1;
}
if (hunk.newLines === 0) {
hunk.newStart += 1;
}
let addCount = 0, removeCount = 0;
for (; i < diffstr.length && (removeCount < hunk.oldLines || addCount < hunk.newLines || ((_a = diffstr[i]) === null || _a === void 0 ? void 0 : _a.startsWith("\\"))); i++) {
const operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? " " : diffstr[i][0];
if (operation === "+" || operation === "-" || operation === " " || operation === "\\") {
hunk.lines.push(diffstr[i]);
if (operation === "+") {
addCount++;
} else if (operation === "-") {
removeCount++;
} else if (operation === " ") {
addCount++;
removeCount++;
}
} else {
throw new Error(`Hunk at line ${chunkHeaderIndex + 1} contained invalid line ${diffstr[i]}`);
}
}
if (!addCount && hunk.newLines === 1) {
hunk.newLines = 0;
}
if (!removeCount && hunk.oldLines === 1) {
hunk.oldLines = 0;
}
if (addCount !== hunk.newLines) {
throw new Error("Added line count did not match for hunk at line " + (chunkHeaderIndex + 1));
}
if (removeCount !== hunk.oldLines) {
throw new Error("Removed line count did not match for hunk at line " + (chunkHeaderIndex + 1));
}
if (i < diffstr.length && diffstr[i] && /^[+ -]/.test(diffstr[i]) && !isFileHeader(diffstr[i])) {
throw new Error("Hunk at line " + (chunkHeaderIndex + 1) + " has more lines than expected (expected " + hunk.oldLines + " old lines and " + hunk.newLines + " new lines)");
}
return hunk;
}
while (i < diffstr.length) {
parseIndex();
}
return list;
}
}
});
// node_modules/diff/libcjs/util/distance-iterator.js
var require_distance_iterator = __commonJS({
"node_modules/diff/libcjs/util/distance-iterator.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.default = default_1;
function default_1(start, minLine, maxLine) {
let wantForward = true, backwardExhausted = false, forwardExhausted = false, localOffset = 1;
return function iterator() {
if (wantForward && !forwardExhausted) {
if (backwardExhausted) {
localOffset++;
} else {
wantForward = false;
}
if (start + localOffset <= maxLine) {
return start + localOffset;
}
forwardExhausted = true;
}
if (!backwardExhausted) {
if (!forwardExhausted) {
wantForward = true;
}
if (minLine <= start - localOffset) {
return start - localOffset++;
}
backwardExhausted = true;
return iterator();
}
return void 0;
};
}
}
});
// node_modules/diff/libcjs/patch/apply.js
var require_apply = __commonJS({
"node_modules/diff/libcjs/patch/apply.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.applyPatch = applyPatch;
exports2.applyPatches = applyPatches;
var string_js_1 = require_string2();
var line_endings_js_1 = require_line_endings();
var parse_js_1 = require_parse();
var distance_iterator_js_1 = __importDefault(require_distance_iterator());
function applyPatch(source, patch, options = {}) {
let patches;
if (typeof patch === "string") {
patches = (0, parse_js_1.parsePatch)(patch);
} else if (Array.isArray(patch)) {
patches = patch;
} else {
patches = [patch];
}
if (patches.length > 1) {
throw new Error("applyPatch only works with a single input.");
}
return applyStructuredPatch(source, patches[0], options);
}
function applyStructuredPatch(source, patch, options = {}) {
if (options.autoConvertLineEndings || options.autoConvertLineEndings == null) {
if ((0, string_js_1.hasOnlyWinLineEndings)(source) && (0, line_endings_js_1.isUnix)(patch)) {
patch = (0, line_endings_js_1.unixToWin)(patch);
} else if ((0, string_js_1.hasOnlyUnixLineEndings)(source) && (0, line_endings_js_1.isWin)(patch)) {
patch = (0, line_endings_js_1.winToUnix)(patch);
}
}
const lines = source.split("\n"), hunks = patch.hunks, compareLine = options.compareLine || ((lineNumber, line, operation, patchContent) => line === patchContent), fuzzFactor = options.fuzzFactor || 0;
let minLine = 0;
if (fuzzFactor < 0 || !Number.isInteger(fuzzFactor)) {
throw new Error("fuzzFactor must be a non-negative integer");
}
if (!hunks.length) {
return source;
}
let prevLine = "", removeEOFNL = false, addEOFNL = false;
for (let i = 0; i < hunks[hunks.length - 1].lines.length; i++) {
const line = hunks[hunks.length - 1].lines[i];
if (line[0] == "\\") {
if (prevLine[0] == "+") {
removeEOFNL = true;
} else if (prevLine[0] == "-") {
addEOFNL = true;
}
}
prevLine = line;
}
if (removeEOFNL) {
if (addEOFNL) {
if (!fuzzFactor && lines[lines.length - 1] == "") {
return false;
}
} else if (lines[lines.length - 1] == "") {
lines.pop();
} else if (!fuzzFactor) {
return false;
}
} else if (addEOFNL) {
if (lines[lines.length - 1] != "") {
lines.push("");
} else if (!fuzzFactor) {
return false;
}
}
function applyHunk(hunkLines, toPos, maxErrors, hunkLinesI = 0, lastContextLineMatched = true, patchedLines = [], patchedLinesLength = 0) {
let nConsecutiveOldContextLines = 0;
let nextContextLineMustMatch = false;
for (; hunkLinesI < hunkLines.length; hunkLinesI++) {
const hunkLine = hunkLines[hunkLinesI], operation = hunkLine.length > 0 ? hunkLine[0] : " ", content = hunkLine.length > 0 ? hunkLine.substr(1) : hunkLine;
if (operation === "-") {
if (compareLine(toPos + 1, lines[toPos], operation, content)) {
toPos++;
nConsecutiveOldContextLines = 0;
} else {
if (!maxErrors || lines[toPos] == null) {
return null;
}
patchedLines[patchedLinesLength] = lines[toPos];
return applyHunk(hunkLines, toPos + 1, maxErrors - 1, hunkLinesI, false, patchedLines, patchedLinesLength + 1);
}
}
if (operation === "+") {
if (!lastContextLineMatched) {
return null;
}
patchedLines[patchedLinesLength] = content;
patchedLinesLength++;
nConsecutiveOldContextLines = 0;
nextContextLineMustMatch = true;
}
if (operation === " ") {
nConsecutiveOldContextLines++;
patchedLines[patchedLinesLength] = lines[toPos];
if (compareLine(toPos + 1, lines[toPos], operation, content)) {
patchedLinesLength++;
lastContextLineMatched = true;
nextContextLineMustMatch = false;
toPos++;
} else {
if (nextContextLineMustMatch || !maxErrors) {
return null;
}
return lines[toPos] && (applyHunk(hunkLines, toPos + 1, maxErrors - 1, hunkLinesI + 1, false, patchedLines, patchedLinesLength + 1) || applyHunk(hunkLines, toPos + 1, maxErrors - 1, hunkLinesI, false, patchedLines, patchedLinesLength + 1)) || applyHunk(hunkLines, toPos, maxErrors - 1, hunkLinesI + 1, false, patchedLines, patchedLinesLength);
}
}
}
patchedLinesLength -= nConsecutiveOldContextLines;
toPos -= nConsecutiveOldContextLines;
patchedLines.length = patchedLinesLength;
return {
patchedLines,
oldLineLastI: toPos - 1
};
}
const resultLines = [];
let prevHunkOffset = 0;
for (let i = 0; i < hunks.length; i++) {
const hunk = hunks[i];
let hunkResult;
const maxLine = lines.length - hunk.oldLines + fuzzFactor;
let toPos;
for (let maxErrors = 0; maxErrors <= fuzzFactor; maxErrors++) {
toPos = hunk.oldStart + prevHunkOffset - 1;
const iterator = (0, distance_iterator_js_1.default)(toPos, minLine, maxLine);
for (; toPos !== void 0; toPos = iterator()) {
hunkResult = applyHunk(hunk.lines, toPos, maxErrors);
if (hunkResult) {
break;
}
}
if (hunkResult) {
break;
}
}
if (!hunkResult) {
return false;
}
for (let i2 = minLine; i2 < toPos; i2++) {
resultLines.push(lines[i2]);
}
for (let i2 = 0; i2 < hunkResult.patchedLines.length; i2++) {
const line = hunkResult.patchedLines[i2];
resultLines.push(line);
}
minLine = hunkResult.oldLineLastI + 1;
prevHunkOffset = toPos + 1 - hunk.oldStart;
}
for (let i = minLine; i < lines.length; i++) {
resultLines.push(lines[i]);
}
return resultLines.join("\n");
}
function applyPatches(uniDiff, options) {
const spDiff = typeof uniDiff === "string" ? (0, parse_js_1.parsePatch)(uniDiff) : uniDiff;
let currentIndex = 0;
function processIndex() {
const index = spDiff[currentIndex++];
if (!index) {
return options.complete();
}
options.loadFile(index, function(err, data) {
if (err) {
return options.complete(err);
}
const updatedContent = applyPatch(data, index, options);
options.patched(index, updatedContent, function(err2) {
if (err2) {
return options.complete(err2);
}
processIndex();
});
});
}
processIndex();
}
}
});
// node_modules/diff/libcjs/patch/reverse.js
var require_reverse = __commonJS({
"node_modules/diff/libcjs/patch/reverse.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.reversePatch = reversePatch;
function swapPrefix(fileName) {
if (fileName === void 0 || fileName === "/dev/null") {
return fileName;
}
if (fileName.startsWith("a/")) {
return "b/" + fileName.slice(2);
}
if (fileName.startsWith("b/")) {
return "a/" + fileName.slice(2);
}
return fileName;
}
function reversePatch(structuredPatch) {
if (Array.isArray(structuredPatch)) {
return structuredPatch.map((patch) => reversePatch(patch)).reverse();
}
const reversed = Object.assign(Object.assign({}, structuredPatch), { oldFileName: structuredPatch.isGit ? swapPrefix(structuredPatch.newFileName) : structuredPatch.newFileName, oldHeader: structuredPatch.newHeader, newFileName: structuredPatch.isGit ? swapPrefix(structuredPatch.oldFileName) : structuredPatch.oldFileName, newHeader: structuredPatch.oldHeader, oldMode: structuredPatch.newMode, newMode: structuredPatch.oldMode, isCreate: structuredPatch.isDelete, isDelete: structuredPatch.isCreate, hunks: structuredPatch.hunks.map((hunk) => {
return {
oldLines: hunk.newLines,
oldStart: hunk.newStart,
newLines: hunk.oldLines,
newStart: hunk.oldStart,
lines: hunk.lines.map((l) => {
if (l.startsWith("-")) {
return `+${l.slice(1)}`;
}
if (l.startsWith("+")) {
return `-${l.slice(1)}`;
}
return l;
})
};
}) });
if (structuredPatch.isCopy) {
reversed.newFileName = "/dev/null";
reversed.newHeader = void 0;
reversed.isDelete = true;
delete reversed.isCreate;
delete reversed.isCopy;
delete reversed.isRename;
reversed.hunks = [];
}
return reversed;
}
}
});
// node_modules/diff/libcjs/patch/create.js
var require_create = __commonJS({
"node_modules/diff/libcjs/patch/create.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.OMIT_HEADERS = exports2.FILE_HEADERS_ONLY = exports2.INCLUDE_HEADERS = void 0;
exports2.structuredPatch = structuredPatch;
exports2.formatPatch = formatPatch;
exports2.createTwoFilesPatch = createTwoFilesPatch;
exports2.createPatch = createPatch;
var line_js_1 = require_line();
function needsQuoting(s) {
for (let i = 0; i < s.length; i++) {
if (s[i] < " " || s[i] > "~" || s[i] === '"' || s[i] === "\\") {
return true;
}
}
return false;
}
function quoteFileNameIfNeeded(s) {
if (!needsQuoting(s)) {
return s;
}
let result = '"';
const bytes = new TextEncoder().encode(s);
let i = 0;
while (i < bytes.length) {
const b = bytes[i];
if (b === 7) {
result += "\\a";
} else if (b === 8) {
result += "\\b";
} else if (b === 9) {
result += "\\t";
} else if (b === 10) {
result += "\\n";
} else if (b === 11) {
result += "\\v";
} else if (b === 12) {
result += "\\f";
} else if (b === 13) {
result += "\\r";
} else if (b === 34) {
result += '\\"';
} else if (b === 92) {
result += "\\\\";
} else if (b >= 32 && b <= 126) {
result += String.fromCharCode(b);
} else {
result += "\\" + b.toString(8).padStart(3, "0");
}
i++;
}
result += '"';
return result;
}
exports2.INCLUDE_HEADERS = {
includeIndex: true,
includeUnderline: true,
includeFileHeaders: true
};
exports2.FILE_HEADERS_ONLY = {
includeIndex: false,
includeUnderline: false,
includeFileHeaders: true
};
exports2.OMIT_HEADERS = {
includeIndex: false,
includeUnderline: false,
includeFileHeaders: false
};
function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
let optionsObj;
if (!options) {
optionsObj = {};
} else if (typeof options === "function") {
optionsObj = { callback: options };
} else {
optionsObj = options;
}
if (typeof optionsObj.context === "undefined") {
optionsObj.context = 4;
}
const context = optionsObj.context;
if (optionsObj.newlineIsToken) {
throw new Error("newlineIsToken may not be used with patch-generation functions, only with diffing functions");
}
if (!optionsObj.callback) {
return diffLinesResultToPatch((0, line_js_1.diffLines)(oldStr, newStr, optionsObj));
} else {
const { callback } = optionsObj;
(0, line_js_1.diffLines)(oldStr, newStr, Object.assign(Object.assign({}, optionsObj), { callback: (diff) => {
const patch = diffLinesResultToPatch(diff);
callback(patch);
} }));
}
function diffLinesResultToPatch(diff) {
if (!diff) {
return;
}
diff.push({ value: "", lines: [] });
function contextLines(lines) {
return lines.map(function(entry) {
return " " + entry;
});
}
const hunks = [];
let oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1;
for (let i = 0; i < diff.length; i++) {
const current = diff[i], lines = current.lines || splitLines(current.value);
current.lines = lines;
if (current.added || current.removed) {
if (!oldRangeStart) {
const prev = diff[i - 1];
oldRangeStart = oldLine;
newRangeStart = newLine;
if (prev) {
curRange = context > 0 ? contextLines(prev.lines.slice(-context)) : [];
oldRangeStart -= curRange.length;
newRangeStart -= curRange.length;
}
}
for (const line of lines) {
curRange.push((current.added ? "+" : "-") + line);
}
if (current.added) {
newLine += lines.length;
} else {
oldLine += lines.length;
}
} else {
if (oldRangeStart) {
if (lines.length <= context * 2 && i < diff.length - 2) {
for (const line of contextLines(lines)) {
curRange.push(line);
}
} else {
const contextSize = Math.min(lines.length, context);
for (const line of contextLines(lines.slice(0, contextSize))) {
curRange.push(line);
}
const hunk = {
oldStart: oldRangeStart,
oldLines: oldLine - oldRangeStart + contextSize,
newStart: newRangeStart,
newLines: newLine - newRangeStart + contextSize,
lines: curRange
};
hunks.push(hunk);
oldRangeStart = 0;
newRangeStart = 0;
curRange = [];
}
}
oldLine += lines.length;
newLine += lines.length;
}
}
for (const hunk of hunks) {
for (let i = 0; i < hunk.lines.length; i++) {
if (hunk.lines[i].endsWith("\n")) {
hunk.lines[i] = hunk.lines[i].slice(0, -1);
} else {
hunk.lines.splice(i + 1, 0, "\\ No newline at end of file");
i++;
}
}
}
return {
oldFileName,
newFileName,
oldHeader,
newHeader,
hunks
};
}
}
function formatPatch(patch, headerOptions) {
var _a, _b, _c, _d, _e, _f;
if (!headerOptions) {
headerOptions = exports2.INCLUDE_HEADERS;
}
if (Array.isArray(patch)) {
if (patch.length > 1 && !headerOptions.includeFileHeaders && !patch.every((p) => p.isGit)) {
throw new Error("Cannot omit file headers on a multi-file patch. (The result would be unparseable; how would a tool trying to apply the patch know which changes are to which file?)");
}
return patch.map((p) => formatPatch(p, headerOptions)).join("\n");
}
const ret = [];
if (patch.isGit) {
headerOptions = exports2.INCLUDE_HEADERS;
if (!patch.oldFileName) {
throw new Error("oldFileName must be specified for Git patches");
}
if (!patch.newFileName) {
throw new Error("newFileName must be specified for Git patches");
}
let gitOldName = patch.oldFileName;
let gitNewName = patch.newFileName;
if (patch.isCreate && gitOldName === "/dev/null") {
gitOldName = gitNewName.replace(/^b\//, "a/");
} else if (patch.isDelete && gitNewName === "/dev/null") {
gitNewName = gitOldName.replace(/^a\//, "b/");
}
ret.push("diff --git " + quoteFileNameIfNeeded(gitOldName) + " " + quoteFileNameIfNeeded(gitNewName));
if (patch.isDelete) {
ret.push("deleted file mode " + ((_a = patch.oldMode) !== null && _a !== void 0 ? _a : "100644"));
}
if (patch.isCreate) {
ret.push("new file mode " + ((_b = patch.newMode) !== null && _b !== void 0 ? _b : "100644"));
}
if (patch.oldMode && patch.newMode && !patch.isDelete && !patch.isCreate) {
ret.push("old mode " + patch.oldMode);
ret.push("new mode " + patch.newMode);
}
if (patch.isRename) {
ret.push("rename from " + quoteFileNameIfNeeded(((_c = patch.oldFileName) !== null && _c !== void 0 ? _c : "").replace(/^a\//, "")));
ret.push("rename to " + quoteFileNameIfNeeded(((_d = patch.newFileName) !== null && _d !== void 0 ? _d : "").replace(/^b\//, "")));
}
if (patch.isCopy) {
ret.push("copy from " + quoteFileNameIfNeeded(((_e = patch.oldFileName) !== null && _e !== void 0 ? _e : "").replace(/^a\//, "")));
ret.push("copy to " + quoteFileNameIfNeeded(((_f = patch.newFileName) !== null && _f !== void 0 ? _f : "").replace(/^b\//, "")));
}
} else {
if (headerOptions.includeIndex && patch.oldFileName == patch.newFileName && patch.oldFileName !== void 0) {
ret.push("Index: " + patch.oldFileName);
}
if (headerOptions.includeUnderline) {
ret.push("===================================================================");
}
}
const hasHunks = patch.hunks.length > 0;
if (headerOptions.includeFileHeaders && patch.oldFileName !== void 0 && patch.newFileName !== void 0 && (!patch.isGit || hasHunks)) {
ret.push("--- " + quoteFileNameIfNeeded(patch.oldFileName) + (patch.oldHeader ? " " + patch.oldHeader : ""));
ret.push("+++ " + quoteFileNameIfNeeded(patch.newFileName) + (patch.newHeader ? " " + patch.newHeader : ""));
}
for (let i = 0; i < patch.hunks.length; i++) {
const hunk = patch.hunks[i];
const oldStart = hunk.oldLines === 0 ? hunk.oldStart - 1 : hunk.oldStart;
const newStart = hunk.newLines === 0 ? hunk.newStart - 1 : hunk.newStart;
ret.push("@@ -" + oldStart + "," + hunk.oldLines + " +" + newStart + "," + hunk.newLines + " @@");
for (const line of hunk.lines) {
ret.push(line);
}
}
return ret.join("\n") + "\n";
}
function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
if (typeof options === "function") {
options = { callback: options };
}
if (!(options === null || options === void 0 ? void 0 : options.callback)) {
const patchObj = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);
if (!patchObj) {
return;
}
return formatPatch(patchObj, options === null || options === void 0 ? void 0 : options.headerOptions);
} else {
const { callback } = options;
structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, Object.assign(Object.assign({}, options), { callback: (patchObj) => {
if (!patchObj) {
callback(void 0);
} else {
callback(formatPatch(patchObj, options.headerOptions));
}
} }));
}
}
function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {
return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);
}
function splitLines(text) {
const hasTrailingNl = text.endsWith("\n");
const result = text.split("\n").map((line) => line + "\n");
if (hasTrailingNl) {
result.pop();
} else {
result.push(result.pop().slice(0, -1));
}
return result;
}
}
});
// node_modules/diff/libcjs/convert/dmp.js
var require_dmp = __commonJS({
"node_modules/diff/libcjs/convert/dmp.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.convertChangesToDMP = convertChangesToDMP;
function convertChangesToDMP(changes) {
const ret = [];
let change, operation;
for (let i = 0; i < changes.length; i++) {
change = changes[i];
if (change.added) {
operation = 1;
} else if (change.removed) {
operation = -1;
} else {
operation = 0;
}
ret.push([operation, change.value]);
}
return ret;
}
}
});
// node_modules/diff/libcjs/convert/xml.js
var require_xml = __commonJS({
"node_modules/diff/libcjs/convert/xml.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.convertChangesToXML = convertChangesToXML;
function convertChangesToXML(changes) {
const ret = [];
for (let i = 0; i < changes.length; i++) {
const change = changes[i];
if (change.added) {
ret.push("<ins>");
} else if (change.removed) {
ret.push("<del>");
}
ret.push(escapeHTML(change.value));
if (change.added) {
ret.push("</ins>");
} else if (change.removed) {
ret.push("</del>");
}
}
return ret.join("");
}
function escapeHTML(s) {
let n = s;
n = n.replace(/&/g, "&amp;");
n = n.replace(/</g, "&lt;");
n = n.replace(/>/g, "&gt;");
n = n.replace(/"/g, "&quot;");
return n;
}
}
});
// node_modules/diff/libcjs/index.js
var require_libcjs = __commonJS({
"node_modules/diff/libcjs/index.js"(exports2) {
"use strict";
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.canonicalize = exports2.convertChangesToXML = exports2.convertChangesToDMP = exports2.reversePatch = exports2.parsePatch = exports2.applyPatches = exports2.applyPatch = exports2.OMIT_HEADERS = exports2.FILE_HEADERS_ONLY = exports2.INCLUDE_HEADERS = exports2.formatPatch = exports2.createPatch = exports2.createTwoFilesPatch = exports2.structuredPatch = exports2.arrayDiff = exports2.diffArrays = exports2.jsonDiff = exports2.diffJson = exports2.cssDiff = exports2.diffCss = exports2.sentenceDiff = exports2.diffSentences = exports2.diffTrimmedLines = exports2.lineDiff = exports2.diffLines = exports2.wordsWithSpaceDiff = exports2.diffWordsWithSpace = exports2.wordDiff = exports2.diffWords = exports2.characterDiff = exports2.diffChars = exports2.Diff = void 0;
var base_js_1 = __importDefault(require_base());
exports2.Diff = base_js_1.default;
var character_js_1 = require_character();
Object.defineProperty(exports2, "diffChars", { enumerable: true, get: function() {
return character_js_1.diffChars;
} });
Object.defineProperty(exports2, "characterDiff", { enumerable: true, get: function() {
return character_js_1.characterDiff;
} });
var word_js_1 = require_word();
Object.defineProperty(exports2, "diffWords", { enumerable: true, get: function() {
return word_js_1.diffWords;
} });
Object.defineProperty(exports2, "diffWordsWithSpace", { enumerable: true, get: function() {
return word_js_1.diffWordsWithSpace;
} });
Object.defineProperty(exports2, "wordDiff", { enumerable: true, get: function() {
return word_js_1.wordDiff;
} });
Object.defineProperty(exports2, "wordsWithSpaceDiff", { enumerable: true, get: function() {
return word_js_1.wordsWithSpaceDiff;
} });
var line_js_1 = require_line();
Object.defineProperty(exports2, "diffLines", { enumerable: true, get: function() {
return line_js_1.diffLines;
} });
Object.defineProperty(exports2, "diffTrimmedLines", { enumerable: true, get: function() {
return line_js_1.diffTrimmedLines;
} });
Object.defineProperty(exports2, "lineDiff", { enumerable: true, get: function() {
return line_js_1.lineDiff;
} });
var sentence_js_1 = require_sentence();
Object.defineProperty(exports2, "diffSentences", { enumerable: true, get: function() {
return sentence_js_1.diffSentences;
} });
Object.defineProperty(exports2, "sentenceDiff", { enumerable: true, get: function() {
return sentence_js_1.sentenceDiff;
} });
var css_js_1 = require_css();
Object.defineProperty(exports2, "diffCss", { enumerable: true, get: function() {
return css_js_1.diffCss;
} });
Object.defineProperty(exports2, "cssDiff", { enumerable: true, get: function() {
return css_js_1.cssDiff;
} });
var json_js_1 = require_json();
Object.defineProperty(exports2, "diffJson", { enumerable: true, get: function() {
return json_js_1.diffJson;
} });
Object.defineProperty(exports2, "canonicalize", { enumerable: true, get: function() {
return json_js_1.canonicalize;
} });
Object.defineProperty(exports2, "jsonDiff", { enumerable: true, get: function() {
return json_js_1.jsonDiff;
} });
var array_js_1 = require_array2();
Object.defineProperty(exports2, "diffArrays", { enumerable: true, get: function() {
return array_js_1.diffArrays;
} });
Object.defineProperty(exports2, "arrayDiff", { enumerable: true, get: function() {
return array_js_1.arrayDiff;
} });
var apply_js_1 = require_apply();
Object.defineProperty(exports2, "applyPatch", { enumerable: true, get: function() {
return apply_js_1.applyPatch;
} });
Object.defineProperty(exports2, "applyPatches", { enumerable: true, get: function() {
return apply_js_1.applyPatches;
} });
var parse_js_1 = require_parse();
Object.defineProperty(exports2, "parsePatch", { enumerable: true, get: function() {
return parse_js_1.parsePatch;
} });
var reverse_js_1 = require_reverse();
Object.defineProperty(exports2, "reversePatch", { enumerable: true, get: function() {
return reverse_js_1.reversePatch;
} });
var create_js_1 = require_create();
Object.defineProperty(exports2, "structuredPatch", { enumerable: true, get: function() {
return create_js_1.structuredPatch;
} });
Object.defineProperty(exports2, "createTwoFilesPatch", { enumerable: true, get: function() {
return create_js_1.createTwoFilesPatch;
} });
Object.defineProperty(exports2, "createPatch", { enumerable: true, get: function() {
return create_js_1.createPatch;
} });
Object.defineProperty(exports2, "formatPatch", { enumerable: true, get: function() {
return create_js_1.formatPatch;
} });
Object.defineProperty(exports2, "INCLUDE_HEADERS", { enumerable: true, get: function() {
return create_js_1.INCLUDE_HEADERS;
} });
Object.defineProperty(exports2, "FILE_HEADERS_ONLY", { enumerable: true, get: function() {
return create_js_1.FILE_HEADERS_ONLY;
} });
Object.defineProperty(exports2, "OMIT_HEADERS", { enumerable: true, get: function() {
return create_js_1.OMIT_HEADERS;
} });
var dmp_js_1 = require_dmp();
Object.defineProperty(exports2, "convertChangesToDMP", { enumerable: true, get: function() {
return dmp_js_1.convertChangesToDMP;
} });
var xml_js_1 = require_xml();
Object.defineProperty(exports2, "convertChangesToXML", { enumerable: true, get: function() {
return xml_js_1.convertChangesToXML;
} });
}
});
// lib/sinon/spy-formatters.js
var require_spy_formatters = __commonJS({
"lib/sinon/spy-formatters.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var colorizer$1 = require_colorizer();
var samsam = require_samsam();
var timesInWords = require_times_in_words();
var util = require_util();
var jsDiff = require_libcjs();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = /* @__PURE__ */ Object.create(null);
if (e) {
Object.keys(e).forEach(function(k) {
if (k !== "default") {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function() {
return e[k];
}
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var jsDiff__namespace = /* @__PURE__ */ _interopNamespace(jsDiff);
var { prototypes } = commons__default.default;
var { createMatcher: match } = samsam__default.default;
var { join, map, push, slice } = prototypes.array;
var colorizer = new colorizer$1();
function colorSinonMatchText(matcher, calledArg, calledArgMessage) {
let calledArgumentMessage = calledArgMessage;
let matcherMessage = matcher.message;
if (!matcher.test(calledArg)) {
matcherMessage = colorizer.red(matcher.message);
if (calledArgumentMessage) {
calledArgumentMessage = colorizer.green(calledArgumentMessage);
}
}
return `${calledArgumentMessage} ${matcherMessage}`;
}
function colorDiffText(diff) {
const objects = map(diff, function(part) {
let text = part.value;
if (part.added) {
text = colorizer.green(text);
} else if (part.removed) {
text = colorizer.red(text);
}
if (diff.length === 2) {
text += " ";
}
return text;
});
return join(objects, "");
}
function quoteStringValue(value) {
if (typeof value === "string") {
return JSON.stringify(value);
}
return value;
}
var formatters = {
c: function(spyInstance) {
return timesInWords(spyInstance.callCount);
},
n: function(spyInstance) {
return spyInstance.toString();
},
D: function(spyInstance, args) {
let message = "";
for (let i = 0, l = spyInstance.callCount; i < l; ++i) {
if (l > 1) {
message += `
Call ${i + 1}:`;
}
const calledArgs = spyInstance.getCall(i).args;
const expectedArgs = slice(args);
for (let j = 0; j < calledArgs.length || j < expectedArgs.length; ++j) {
let calledArg = calledArgs[j];
let expectedArg = expectedArgs[j];
if (calledArg) {
calledArg = quoteStringValue(calledArg);
}
if (expectedArg) {
expectedArg = quoteStringValue(expectedArg);
}
message += "\n";
const calledArgMessage = j < calledArgs.length ? util.inspect(calledArg) : "";
if (match.isMatcher(expectedArg)) {
message += colorSinonMatchText(
expectedArg,
calledArg,
calledArgMessage
);
} else {
const expectedArgMessage = j < expectedArgs.length ? util.inspect(expectedArg) : "";
const diff = jsDiff__namespace.diffJson(
calledArgMessage,
expectedArgMessage
);
message += colorDiffText(diff);
}
}
}
return message;
},
C: function(spyInstance) {
const calls = [];
for (let i = 0, l = spyInstance.callCount; i < l; ++i) {
let stringifiedCall = ` ${spyInstance.getCall(i).toString()}`;
if (/\n/.test(calls[i - 1])) {
stringifiedCall = `
${stringifiedCall}`;
}
push(calls, stringifiedCall);
}
return calls.length > 0 ? `
${join(calls, "\n")}` : "";
},
t: function(spyInstance) {
const objects = [];
for (let i = 0, l = spyInstance.callCount; i < l; ++i) {
push(objects, util.inspect(spyInstance.thisValues[i]));
}
return join(objects, ", ");
},
"*": function(spyInstance, args) {
return join(
map(args, function(arg) {
return util.inspect(arg);
}),
", "
);
}
};
module2.exports = formatters;
}
});
// lib/sinon/proxy.js
var require_proxy = __commonJS({
"lib/sinon/proxy.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var extend = require_extend();
var functionToString = require_function_to_string();
var proxyCall = require_proxy_call();
var proxyCallUtil = require_proxy_call_util();
var proxyInvoke = require_proxy_invoke();
var util = require_util();
var spyFormatters = require_spy_formatters();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { push, forEach, slice } = prototypes.array;
var emptyFakes = [];
var proxyApi = {
toString: functionToString,
named: function named(name) {
this.displayName = name;
const nameDescriptor = Object.getOwnPropertyDescriptor(this, "name");
if (nameDescriptor && nameDescriptor.configurable) {
nameDescriptor.value = name;
Object.defineProperty(this, "name", nameDescriptor);
}
return this;
},
invoke: proxyInvoke,
/*
* Hook for derived implementation to return fake instances matching the
* given arguments.
*/
matchingFakes: function() {
return emptyFakes;
},
getCall: function getCall(index) {
let i = index;
if (i < 0) {
i += this.callCount;
}
if (i < 0 || i >= this.callCount) {
return null;
}
return proxyCall(
this,
this.thisValues[i],
this.args[i],
this.returnValues[i],
this.exceptions[i],
this.callIds[i],
this.errorsWithCallStack[i]
);
},
getCalls: function() {
const calls = [];
let i;
for (i = 0; i < this.callCount; i++) {
push(calls, this.getCall(i));
}
return calls;
},
calledBefore: function calledBefore(proxy) {
if (!this.called) {
return false;
}
if (!proxy.called) {
return true;
}
return this.callIds[0] < proxy.callIds[proxy.callIds.length - 1];
},
calledAfter: function calledAfter(proxy) {
if (!this.called || !proxy.called) {
return false;
}
return this.callIds[this.callCount - 1] > proxy.callIds[0];
},
calledImmediatelyBefore: function calledImmediatelyBefore(proxy) {
if (!this.called || !proxy.called) {
return false;
}
return this.callIds[this.callCount - 1] === proxy.callIds[proxy.callCount - 1] - 1;
},
calledImmediatelyAfter: function calledImmediatelyAfter(proxy) {
if (!this.called || !proxy.called) {
return false;
}
return this.callIds[this.callCount - 1] === proxy.callIds[proxy.callCount - 1] + 1;
},
formatters: spyFormatters,
printf: function(format) {
const spyInstance = this;
const args = slice(arguments, 1);
let formatter;
return (format || "").replace(/%(.)/g, function(match, specifier) {
formatter = proxyApi.formatters[specifier];
if (typeof formatter === "function") {
return String(formatter(spyInstance, args));
} else if (!isNaN(parseInt(specifier, 10))) {
return util.inspect(args[specifier - 1]);
}
return `%${specifier}`;
});
},
resetHistory: function() {
if (this.invoking) {
const err = new Error(
"Cannot reset Sinon function while invoking it. Move the call to .resetHistory outside of the callback."
);
err.name = "InvalidResetException";
throw err;
}
this.called = false;
this.notCalled = true;
this.calledOnce = false;
this.calledTwice = false;
this.calledThrice = false;
this.callCount = 0;
this.firstCall = null;
this.secondCall = null;
this.thirdCall = null;
this.lastCall = null;
this.lastArg = null;
this.args = [];
this.firstArg = null;
this.returnValues = [];
this.thisValues = [];
this.exceptions = [];
this.callIds = [];
this.errorsWithCallStack = [];
if (this.fakes) {
forEach(this.fakes, function(fake) {
fake.resetHistory();
});
}
return this;
}
};
var delegateToCalls = proxyCallUtil.delegateToCalls;
delegateToCalls(proxyApi, "calledOn", true);
delegateToCalls(proxyApi, "alwaysCalledOn", false, "calledOn");
delegateToCalls(proxyApi, "calledWith", true);
delegateToCalls(
proxyApi,
"calledOnceWith",
true,
"calledWith",
false,
void 0,
1
);
delegateToCalls(proxyApi, "calledWithMatch", true);
delegateToCalls(proxyApi, "alwaysCalledWith", false, "calledWith");
delegateToCalls(proxyApi, "alwaysCalledWithMatch", false, "calledWithMatch");
delegateToCalls(proxyApi, "calledWithExactly", true);
delegateToCalls(
proxyApi,
"calledOnceWithExactly",
true,
"calledWithExactly",
false,
void 0,
1
);
delegateToCalls(
proxyApi,
"calledOnceWithMatch",
true,
"calledWithMatch",
false,
void 0,
1
);
delegateToCalls(
proxyApi,
"alwaysCalledWithExactly",
false,
"calledWithExactly"
);
delegateToCalls(
proxyApi,
"neverCalledWith",
false,
"notCalledWith",
false,
function() {
return true;
}
);
delegateToCalls(
proxyApi,
"neverCalledWithMatch",
false,
"notCalledWithMatch",
false,
function() {
return true;
}
);
delegateToCalls(proxyApi, "threw", true);
delegateToCalls(proxyApi, "alwaysThrew", false, "threw");
delegateToCalls(proxyApi, "returned", true);
delegateToCalls(proxyApi, "alwaysReturned", false, "returned");
delegateToCalls(proxyApi, "calledWithNew", true);
delegateToCalls(proxyApi, "alwaysCalledWithNew", false, "calledWithNew");
function wrapFunction(func, originalFunc) {
const arity = originalFunc.length;
let p;
switch (arity) {
/*eslint-disable no-unused-vars*/
case 0:
p = function proxy() {
return p.invoke(func, this, slice(arguments));
};
break;
case 1:
p = function proxy(a) {
return p.invoke(func, this, slice(arguments));
};
break;
case 2:
p = function proxy(a, b) {
return p.invoke(func, this, slice(arguments));
};
break;
case 3:
p = function proxy(a, b, c) {
return p.invoke(func, this, slice(arguments));
};
break;
case 4:
p = function proxy(a, b, c, d) {
return p.invoke(func, this, slice(arguments));
};
break;
case 5:
p = function proxy(a, b, c, d, e) {
return p.invoke(func, this, slice(arguments));
};
break;
case 6:
p = function proxy(a, b, c, d, e, f) {
return p.invoke(func, this, slice(arguments));
};
break;
case 7:
p = function proxy(a, b, c, d, e, f, g) {
return p.invoke(func, this, slice(arguments));
};
break;
case 8:
p = function proxy(a, b, c, d, e, f, g, h) {
return p.invoke(func, this, slice(arguments));
};
break;
case 9:
p = function proxy(a, b, c, d, e, f, g, h, i) {
return p.invoke(func, this, slice(arguments));
};
break;
case 10:
p = function proxy(a, b, c, d, e, f, g, h, i, j) {
return p.invoke(func, this, slice(arguments));
};
break;
case 11:
p = function proxy(a, b, c, d, e, f, g, h, i, j, k) {
return p.invoke(func, this, slice(arguments));
};
break;
case 12:
p = function proxy(a, b, c, d, e, f, g, h, i, j, k, l) {
return p.invoke(func, this, slice(arguments));
};
break;
default:
p = function proxy() {
return p.invoke(func, this, slice(arguments));
};
break;
}
const nameDescriptor = Object.getOwnPropertyDescriptor(
originalFunc,
"name"
);
if (nameDescriptor && nameDescriptor.configurable) {
Object.defineProperty(p, "name", nameDescriptor);
}
extend.nonEnum(p, {
isSinonProxy: true,
called: false,
notCalled: true,
calledOnce: false,
calledTwice: false,
calledThrice: false,
callCount: 0,
firstCall: null,
firstArg: null,
secondCall: null,
thirdCall: null,
lastCall: null,
lastArg: null,
args: [],
returnValues: [],
thisValues: [],
exceptions: [],
callIds: [],
errorsWithCallStack: []
});
return p;
}
function createProxy(func, originalFunc) {
const proxy = wrapFunction(func, originalFunc);
extend(proxy, func);
proxy.prototype = func.prototype;
extend.nonEnum(proxy, proxyApi);
return proxy;
}
module2.exports = createProxy;
}
});
// lib/sinon/util/core/is-non-existent-property.js
var require_is_non_existent_property = __commonJS({
"lib/sinon/util/core/is-non-existent-property.js"(exports2, module2) {
"use strict";
function isNonExistentProperty(object, property) {
return Boolean(
object && typeof property !== "undefined" && !(property in object)
);
}
module2.exports = isNonExistentProperty;
}
});
// lib/sinon/util/core/is-es-module.js
var require_is_es_module = __commonJS({
"lib/sinon/util/core/is-es-module.js"(exports2, module2) {
"use strict";
function isEsModule(object) {
return object && typeof Symbol !== "undefined" && object[Symbol.toStringTag] === "Module" && Object.isSealed(object);
}
module2.exports = isEsModule;
}
});
// lib/sinon/util/core/walk-object.js
var require_walk_object = __commonJS({
"lib/sinon/util/core/walk-object.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var getPropertyDescriptor = require_get_property_descriptor();
var walk = require_walk();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { functionName } = commons__default.default;
var walkObject = function(mutator, object, filter) {
let called = false;
const name = functionName(mutator);
if (!object) {
throw new Error(
`Trying to ${name} object but received ${String(object)}`
);
}
walk(object, function(prop, propOwner) {
if (propOwner !== Object.prototype && prop !== "constructor" && typeof getPropertyDescriptor(propOwner, prop).value === "function") {
if (filter) {
if (filter(object, prop)) {
called = true;
mutator(object, prop);
}
} else {
called = true;
mutator(object, prop);
}
}
});
if (!called) {
throw new Error(
`Found no methods on object to which we could apply mutations`
);
}
return object;
};
module2.exports = walkObject;
}
});
// lib/sinon/util/core/sinon-type.js
var require_sinon_type = __commonJS({
"lib/sinon/util/core/sinon-type.js"(exports2, module2) {
"use strict";
var sinonTypeSymbolProperty = /* @__PURE__ */ Symbol("SinonType");
var sinonType = {
/**
* Set the type of a Sinon object to make it possible to identify it later at runtime
*
* @param {object|((...args: unknown[]) => unknown)} object object/function to set the type on
* @param {string} type the named type of the object/function
*/
set(object, type) {
Object.defineProperty(object, sinonTypeSymbolProperty, {
value: type,
configurable: false,
enumerable: false
});
},
get(object) {
return object && object[sinonTypeSymbolProperty];
}
};
module2.exports = sinonType;
}
});
// lib/sinon/util/core/wrap-method.js
var require_wrap_method = __commonJS({
"lib/sinon/util/core/wrap-method.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var getPropertyDescriptor = require_get_property_descriptor();
var extend = require_extend();
var sinonType = require_sinon_type();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes, valueToString } = commons__default.default;
var { hasOwnProperty } = prototypes.object;
var { push } = prototypes.array;
var noop = () => {
};
function isFunction(obj) {
return typeof obj === "function" || Boolean(obj && obj.constructor && obj.call && obj.apply);
}
function mirrorProperties(target, source) {
for (const prop in source) {
if (!hasOwnProperty(target, prop)) {
target[prop] = source[prop];
}
}
}
function getAccessor(object, property, method) {
const accessors = ["get", "set"];
const descriptor = getPropertyDescriptor(object, property);
for (let i = 0; i < accessors.length; i++) {
if (descriptor[accessors[i]] && descriptor[accessors[i]].name === method.name) {
return accessors[i];
}
}
return null;
}
var hasES5Support = "keys" in Object;
function wrapMethod(object, property, method) {
if (!object) {
throw new TypeError("Should wrap property of object");
}
if (typeof method !== "function" && typeof method !== "object") {
throw new TypeError(
"Method wrapper should be a function or a property descriptor"
);
}
function checkWrappedMethod(wrappedMethod2) {
let error2;
if (!isFunction(wrappedMethod2)) {
error2 = new TypeError(
`Attempted to wrap ${typeof wrappedMethod2} property ${valueToString(
property
)} as function`
);
} else if (wrappedMethod2.restore && wrappedMethod2.restore.sinon) {
error2 = new TypeError(
`Attempted to wrap ${valueToString(
property
)} which is already wrapped`
);
} else if (wrappedMethod2.calledBefore) {
const verb = wrappedMethod2.returns ? "stubbed" : "spied on";
error2 = new TypeError(
`Attempted to wrap ${valueToString(
property
)} which is already ${verb}`
);
}
if (error2) {
if (wrappedMethod2 && wrappedMethod2.stackTraceError) {
error2.stack += `
--------------
${wrappedMethod2.stackTraceError.stack}`;
}
throw error2;
}
}
let error, wrappedMethod, i, wrappedMethodDesc, target, accessor;
const wrappedMethods = [];
function simplePropertyAssignment() {
wrappedMethod = object[property];
checkWrappedMethod(wrappedMethod);
object[property] = method;
method.displayName = property;
}
const owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwnProperty(object, property);
if (hasES5Support) {
const methodDesc = typeof method === "function" ? { value: method } : method;
wrappedMethodDesc = getPropertyDescriptor(object, property);
if (!wrappedMethodDesc) {
error = new TypeError(
`Attempted to wrap ${typeof wrappedMethod} property ${property} as function`
);
} else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {
error = new TypeError(
`Attempted to wrap ${property} which is already wrapped`
);
}
if (error) {
if (wrappedMethodDesc && wrappedMethodDesc.stackTraceError) {
error.stack += `
--------------
${wrappedMethodDesc.stackTraceError.stack}`;
}
throw error;
}
const types = Object.keys(methodDesc);
for (i = 0; i < types.length; i++) {
wrappedMethod = wrappedMethodDesc[types[i]];
checkWrappedMethod(wrappedMethod);
push(wrappedMethods, wrappedMethod);
}
mirrorProperties(methodDesc, wrappedMethodDesc);
for (i = 0; i < types.length; i++) {
mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);
}
if (!owned) {
methodDesc.configurable = true;
}
Object.defineProperty(object, property, methodDesc);
if (typeof method === "function" && object[property] !== method) {
delete object[property];
simplePropertyAssignment();
}
} else {
simplePropertyAssignment();
}
function restore() {
accessor = getAccessor(object, property, this.wrappedMethod);
let descriptor;
if (accessor) {
if (!owned) {
try {
delete object[property][accessor];
} catch (e) {
}
} else if (hasES5Support) {
descriptor = getPropertyDescriptor(object, property);
descriptor[accessor] = wrappedMethodDesc[accessor];
Object.defineProperty(object, property, descriptor);
}
if (hasES5Support) {
descriptor = getPropertyDescriptor(object, property);
if (descriptor && descriptor.value === target) {
object[property][accessor] = this.wrappedMethod;
}
} else {
if (object[property][accessor] === target) {
object[property][accessor] = this.wrappedMethod;
}
}
} else {
if (!owned) {
try {
delete object[property];
} catch (e) {
}
} else if (hasES5Support) {
Object.defineProperty(object, property, wrappedMethodDesc);
}
if (hasES5Support) {
descriptor = getPropertyDescriptor(object, property);
if (descriptor && descriptor.value === target) {
object[property] = this.wrappedMethod;
}
} else {
if (object[property] === target) {
object[property] = this.wrappedMethod;
}
}
}
if (sinonType.get(object) === "stub-instance") {
object[property] = noop;
}
}
function extendObjectWithWrappedMethods() {
for (i = 0; i < wrappedMethods.length; i++) {
accessor = getAccessor(object, property, wrappedMethods[i]);
target = accessor ? method[accessor] : method;
extend.nonEnum(target, {
displayName: property,
wrappedMethod: wrappedMethods[i],
// Set up an Error object for a stack trace which can be used later to find what line of
// code the original method was created on.
stackTraceError: new Error("Stack Trace for original"),
restore
});
target.restore.sinon = true;
if (!hasES5Support) {
mirrorProperties(target, wrappedMethod);
}
}
}
extendObjectWithWrappedMethods();
return method;
}
module2.exports = wrapMethod;
}
});
// lib/sinon/spy.js
var require_spy = __commonJS({
"lib/sinon/spy.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var samsam = require_samsam();
var proxy = require_proxy();
var extend = require_extend();
var getPropertyDescriptor = require_get_property_descriptor();
var isEsModule = require_is_es_module();
var proxyCallUtil = require_proxy_call_util();
var walkObject = require_walk_object();
var wrapMethod = require_wrap_method();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var { prototypes, functionName, valueToString } = commons__default.default;
var { deepEqual } = samsam__default.default;
var { forEach, pop, push, slice } = prototypes.array;
var filter = Array.prototype.filter;
var uuid = 0;
function matches(fake, args, strict) {
const margs = fake.matchingArguments;
if (margs.length <= args.length && deepEqual(slice(args, 0, margs.length), margs)) {
return !strict || margs.length === args.length;
}
return false;
}
var spyApi = {
withArgs: function() {
const args = slice(arguments);
const matching = pop(this.matchingFakes(args, true));
if (matching) {
return matching;
}
const original = this;
const fakeInstance = this.instantiateFake();
fakeInstance.matchingArguments = args;
fakeInstance.parent = this;
push(this.fakes, fakeInstance);
fakeInstance.withArgs = function() {
return original.withArgs.apply(original, arguments);
};
forEach(original.args, function(arg, i) {
if (!matches(fakeInstance, arg)) {
return;
}
proxyCallUtil.incrementCallCount(fakeInstance);
push(fakeInstance.thisValues, original.thisValues[i]);
push(fakeInstance.args, arg);
push(fakeInstance.returnValues, original.returnValues[i]);
push(fakeInstance.exceptions, original.exceptions[i]);
push(fakeInstance.callIds, original.callIds[i]);
});
proxyCallUtil.createCallProperties(fakeInstance);
return fakeInstance;
},
// Override proxy default implementation
matchingFakes: function(args, strict) {
return filter.call(this.fakes, function(fakeInstance) {
return matches(fakeInstance, args, strict);
});
}
};
var delegateToCalls = proxyCallUtil.delegateToCalls;
delegateToCalls(spyApi, "callArg", false, "callArgWith", true, function() {
throw new Error(
`${this.toString()} cannot call arg since it was not yet invoked.`
);
});
spyApi.callArgWith = spyApi.callArg;
delegateToCalls(spyApi, "callArgOn", false, "callArgOnWith", true, function() {
throw new Error(
`${this.toString()} cannot call arg since it was not yet invoked.`
);
});
spyApi.callArgOnWith = spyApi.callArgOn;
delegateToCalls(spyApi, "throwArg", false, "throwArg", false, function() {
throw new Error(
`${this.toString()} cannot throw arg since it was not yet invoked.`
);
});
delegateToCalls(spyApi, "yield", false, "yield", true, function() {
throw new Error(
`${this.toString()} cannot yield since it was not yet invoked.`
);
});
spyApi.invokeCallback = spyApi.yield;
delegateToCalls(spyApi, "yieldOn", false, "yieldOn", true, function() {
throw new Error(
`${this.toString()} cannot yield since it was not yet invoked.`
);
});
delegateToCalls(spyApi, "yieldTo", false, "yieldTo", true, function(property) {
throw new Error(
`${this.toString()} cannot yield to '${valueToString(
property
)}' since it was not yet invoked.`
);
});
delegateToCalls(
spyApi,
"yieldToOn",
false,
"yieldToOn",
true,
function(property) {
throw new Error(
`${this.toString()} cannot yield to '${valueToString(
property
)}' since it was not yet invoked.`
);
}
);
function createSpy(func) {
let name;
let funk = func;
if (typeof funk !== "function") {
funk = function() {
return;
};
} else {
name = functionName(funk);
}
const proxy$1 = proxy(funk, funk);
extend.nonEnum(proxy$1, spyApi);
extend.nonEnum(proxy$1, {
displayName: name || "spy",
fakes: [],
instantiateFake: createSpy,
id: `spy#${uuid++}`
});
return proxy$1;
}
function spy(object, property, types) {
if (isEsModule(object)) {
throw new TypeError("ES Modules cannot be spied");
}
if (!property && typeof object === "function") {
return createSpy(object);
}
if (!property && typeof object === "object") {
return walkObject(spy, object);
}
if (!object && !property) {
return createSpy(function() {
return;
});
}
if (!types) {
return wrapMethod(object, property, createSpy(object[property]));
}
const descriptor = {};
const methodDesc = getPropertyDescriptor(object, property);
forEach(types, function(type) {
descriptor[type] = createSpy(methodDesc[type]);
});
return wrapMethod(object, property, descriptor);
}
extend(spy, spyApi);
module2.exports = spy;
}
});
// lib/sinon/throw-on-falsy-object.js
var require_throw_on_falsy_object = __commonJS({
"lib/sinon/throw-on-falsy-object.js"(exports2, module2) {
"use strict";
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { valueToString } = commons__default.default;
function throwOnFalsyObject(object, property) {
if (property && !object) {
const type = object === null ? "null" : "undefined";
throw new Error(
`Trying to stub property '${valueToString(property)}' of ${type}`
);
}
}
module2.exports = throwOnFalsyObject;
}
});
// lib/sinon/stub.js
var require_stub = __commonJS({
"lib/sinon/stub.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var behavior = require_behavior();
var defaultBehaviors = require_default_behaviors();
var proxy = require_proxy();
var isNonExistentProperty = require_is_non_existent_property();
var spy = require_spy();
var extend = require_extend();
var getPropertyDescriptor = require_get_property_descriptor();
var isEsModule = require_is_es_module();
var sinonType = require_sinon_type();
var wrapMethod = require_wrap_method();
var throwOnFalsyObject = require_throw_on_falsy_object();
var walkObject = require_walk_object();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes: commonsPrototypes, functionName, valueToString } = commons__default.default;
var { array: arrayProto, object: objectProto } = commonsPrototypes;
var { hasOwnProperty } = objectProto;
var forEach = arrayProto.forEach;
var pop = arrayProto.pop;
var slice = arrayProto.slice;
var sort = arrayProto.sort;
var uuid = 0;
function createStub(originalFunc) {
let proxy$1;
function functionStub() {
const args = slice(arguments);
const matchings = proxy$1.matchingFakes(args);
const fnStub = pop(
sort(matchings, function(a, b) {
return a.matchingArguments.length - b.matchingArguments.length;
})
) || proxy$1;
return getCurrentBehavior(fnStub).invoke(this, arguments);
}
proxy$1 = proxy(functionStub, originalFunc || functionStub);
extend.nonEnum(proxy$1, spy);
extend.nonEnum(proxy$1, stub);
const name = originalFunc ? functionName(originalFunc) : null;
extend.nonEnum(proxy$1, {
fakes: [],
instantiateFake: createStub,
displayName: name || "stub",
defaultBehavior: null,
behaviors: [],
id: `stub#${uuid++}`
});
sinonType.set(proxy$1, "stub");
return proxy$1;
}
function stub(object, property) {
if (arguments.length > 2) {
throw new TypeError(
"stub(obj, 'meth', fn) has been removed, see documentation"
);
}
if (isEsModule(object)) {
throw new TypeError("ES Modules cannot be stubbed");
}
throwOnFalsyObject.apply(null, arguments);
if (isNonExistentProperty(object, property)) {
throw new TypeError(
`Cannot stub non-existent property ${valueToString(property)}`
);
}
const actualDescriptor = getPropertyDescriptor(object, property);
assertValidPropertyDescriptor(actualDescriptor, property);
const isObjectOrFunction = typeof object === "object" || typeof object === "function";
const isStubbingEntireObject = typeof property === "undefined" && isObjectOrFunction;
const isCreatingNewStub = !object && typeof property === "undefined";
const isStubbingNonFuncProperty = isObjectOrFunction && typeof property !== "undefined" && (typeof actualDescriptor === "undefined" || typeof actualDescriptor.value !== "function");
if (isStubbingEntireObject) {
return walkObject(stub, object);
}
if (isCreatingNewStub) {
return createStub();
}
const func = typeof actualDescriptor.value === "function" ? actualDescriptor.value : null;
const s = createStub(func);
extend.nonEnum(s, {
rootObj: object,
propName: property,
shadowsPropOnPrototype: !actualDescriptor.isOwn,
restore: function restore() {
if (actualDescriptor !== void 0 && actualDescriptor.isOwn) {
Object.defineProperty(object, property, actualDescriptor);
return;
}
delete object[property];
}
});
return isStubbingNonFuncProperty ? s : wrapMethod(object, property, s);
}
function assertValidPropertyDescriptor(descriptor, property) {
if (!descriptor || !property) {
return;
}
if (descriptor.isOwn && !descriptor.configurable && !descriptor.writable) {
throw new TypeError(
`The descriptor for property \`${property}\` is non-configurable and non-writable. Sinon cannot stub properties that are immutable. See https://sinonjs.org/faq#property-descriptor-errors for help fixing this issue.`
);
}
if ((descriptor.get || descriptor.set) && !descriptor.configurable) {
throw new TypeError(
`Descriptor for accessor property ${property} is non-configurable`
);
}
if (isDataDescriptor(descriptor) && !descriptor.writable) {
throw new TypeError(
`Descriptor for data property ${property} is non-writable`
);
}
}
function isDataDescriptor(descriptor) {
return !descriptor.value && !descriptor.writable && !descriptor.set && !descriptor.get;
}
function getParentBehaviour(stubInstance) {
return stubInstance.parent && getCurrentBehavior(stubInstance.parent);
}
function getDefaultBehavior(stubInstance) {
return stubInstance.defaultBehavior || getParentBehaviour(stubInstance) || behavior.create(stubInstance);
}
function getCurrentBehavior(stubInstance) {
const currentBehavior = stubInstance.behaviors[stubInstance.callCount - 1];
return currentBehavior && currentBehavior.isPresent() ? currentBehavior : getDefaultBehavior(stubInstance);
}
var proto = {
resetBehavior: function() {
this.defaultBehavior = null;
this.behaviors = [];
delete this.returnValue;
delete this.returnArgAt;
delete this.throwArgAt;
delete this.resolveArgAt;
delete this.fakeFn;
this.returnThis = false;
this.resolveThis = false;
forEach(this.fakes, function(fake) {
fake.resetBehavior();
});
},
reset: function() {
this.resetHistory();
this.resetBehavior();
},
onCall: function onCall(index) {
if (!this.behaviors[index]) {
this.behaviors[index] = behavior.create(this);
}
return this.behaviors[index];
},
onFirstCall: function onFirstCall() {
return this.onCall(0);
},
onSecondCall: function onSecondCall() {
return this.onCall(1);
},
onThirdCall: function onThirdCall() {
return this.onCall(2);
},
withArgs: function withArgs() {
const fake = spy.withArgs.apply(this, arguments);
if (this.defaultBehavior && this.defaultBehavior.promiseLibrary) {
fake.defaultBehavior = fake.defaultBehavior || behavior.create(fake);
fake.defaultBehavior.promiseLibrary = this.defaultBehavior.promiseLibrary;
}
return fake;
}
};
forEach(Object.keys(behavior), function(method) {
if (hasOwnProperty(behavior, method) && !hasOwnProperty(proto, method) && method !== "create" && method !== "invoke") {
proto[method] = behavior.createBehavior(method);
}
});
forEach(Object.keys(defaultBehaviors), function(method) {
if (hasOwnProperty(defaultBehaviors, method) && !hasOwnProperty(proto, method)) {
behavior.addBehavior(stub, method, defaultBehaviors[method]);
}
});
extend(stub, proto);
module2.exports = stub;
}
});
// lib/sinon/mock-expectation.js
var require_mock_expectation = __commonJS({
"lib/sinon/mock-expectation.js"(exports2, module2) {
"use strict";
var util = require_util();
var commons = require_lib();
var samsam = require_samsam();
var proxyInvoke = require_proxy_invoke();
var proxyCall = require_proxy_call();
var timesInWords = require_times_in_words();
var extend = require_extend();
var stub = require_stub();
var assert = require_assert();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var { prototypes: commonsPrototypes, valueToString } = commons__default.default;
var { array: arrayProto } = commonsPrototypes;
var { createMatcher: match, deepEqual } = samsam__default.default;
var every = arrayProto.every;
var forEach = arrayProto.forEach;
var push = arrayProto.push;
var slice = arrayProto.slice;
function callCountInWords(callCount) {
if (callCount === 0) {
return "never called";
}
return `called ${timesInWords(callCount)}`;
}
function expectedCallCountInWords(expectation) {
const min = expectation.minCalls;
const max = expectation.maxCalls;
if (typeof min === "number" && typeof max === "number") {
let str = timesInWords(min);
if (min !== max) {
str = `at least ${str} and at most ${timesInWords(max)}`;
}
return str;
}
if (typeof min === "number") {
return `at least ${timesInWords(min)}`;
}
return `at most ${timesInWords(max)}`;
}
function receivedMinCalls(expectation) {
const hasMinLimit = typeof expectation.minCalls === "number";
return !hasMinLimit || expectation.callCount >= expectation.minCalls;
}
function receivedMaxCalls(expectation) {
if (typeof expectation.maxCalls !== "number") {
return false;
}
return expectation.callCount === expectation.maxCalls;
}
function verifyMatcher(possibleMatcher, arg) {
const isMatcher = match.isMatcher(possibleMatcher);
return isMatcher && possibleMatcher.test(arg) || true;
}
var mockExpectation = {
minCalls: 1,
maxCalls: 1,
create: function create(methodName) {
const expectation = extend.nonEnum(stub(), mockExpectation);
delete expectation.create;
expectation.method = methodName;
return expectation;
},
invoke: function invoke(func, thisValue, args) {
this.verifyCallAllowed(thisValue, args);
return proxyInvoke.apply(this, arguments);
},
atLeast: function atLeast(num) {
if (typeof num !== "number") {
throw new TypeError(`'${valueToString(num)}' is not number`);
}
if (!this.limitsSet) {
this.maxCalls = null;
this.limitsSet = true;
}
this.minCalls = num;
return this;
},
atMost: function atMost(num) {
if (typeof num !== "number") {
throw new TypeError(`'${valueToString(num)}' is not number`);
}
if (!this.limitsSet) {
this.minCalls = null;
this.limitsSet = true;
}
this.maxCalls = num;
return this;
},
never: function never() {
return this.exactly(0);
},
once: function once() {
return this.exactly(1);
},
twice: function twice() {
return this.exactly(2);
},
thrice: function thrice() {
return this.exactly(3);
},
exactly: function exactly(num) {
if (typeof num !== "number") {
throw new TypeError(`'${valueToString(num)}' is not a number`);
}
this.atLeast(num);
return this.atMost(num);
},
met: function met() {
return !this.failed && receivedMinCalls(this);
},
verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
const expectedArguments = this.expectedArguments;
if (receivedMaxCalls(this)) {
this.failed = true;
mockExpectation.fail(
`${this.method} already called ${timesInWords(this.maxCalls)}`
);
}
if ("expectedThis" in this && this.expectedThis !== thisValue) {
mockExpectation.fail(
`${this.method} called with ${valueToString(
thisValue
)} as thisValue, expected ${valueToString(this.expectedThis)}`
);
}
if (!("expectedArguments" in this)) {
return;
}
if (!args) {
mockExpectation.fail(
`${this.method} received no arguments, expected ${util.inspect(
expectedArguments
)}`
);
}
if (args.length < expectedArguments.length) {
mockExpectation.fail(
`${this.method} received too few arguments (${util.inspect(
args
)}), expected ${util.inspect(expectedArguments)}`
);
}
if (this.expectsExactArgCount && args.length !== expectedArguments.length) {
mockExpectation.fail(
`${this.method} received too many arguments (${util.inspect(
args
)}), expected ${util.inspect(expectedArguments)}`
);
}
forEach(
expectedArguments,
function(expectedArgument, i) {
if (!verifyMatcher(expectedArgument, args[i])) ;
if (!deepEqual(args[i], expectedArgument)) {
mockExpectation.fail(
`${this.method} received wrong arguments ${util.inspect(
args
)}, expected ${util.inspect(expectedArguments)}`
);
}
},
this
);
},
allowsCall: function allowsCall(thisValue, args) {
const expectedArguments = this.expectedArguments;
if (this.met() && receivedMaxCalls(this)) {
return false;
}
if ("expectedThis" in this && this.expectedThis !== thisValue) {
return false;
}
if (!("expectedArguments" in this)) {
return true;
}
const _args = args || [];
if (_args.length < expectedArguments.length) {
return false;
}
if (this.expectsExactArgCount && _args.length !== expectedArguments.length) {
return false;
}
return every(expectedArguments, function(expectedArgument, i) {
if (!verifyMatcher(expectedArgument, _args[i])) ;
if (!deepEqual(_args[i], expectedArgument)) {
return false;
}
return true;
});
},
withArgs: function withArgs() {
this.expectedArguments = slice(arguments);
return this;
},
withExactArgs: function withExactArgs() {
this.withArgs.apply(this, arguments);
this.expectsExactArgCount = true;
return this;
},
on: function on(thisValue) {
this.expectedThis = thisValue;
return this;
},
toString: function() {
const args = slice(this.expectedArguments || []);
if (!this.expectsExactArgCount) {
push(args, "[...]");
}
const callStr = proxyCall.toString.call({
proxy: this.method || "anonymous mock expectation",
args
});
const message = `${callStr.replace(
", [...",
"[, ..."
)} ${expectedCallCountInWords(this)}`;
if (this.met()) {
return `Expectation met: ${message}`;
}
return `Expected ${message} (${callCountInWords(this.callCount)})`;
},
verify: function verify() {
if (!this.met()) {
mockExpectation.fail(String(this));
} else {
mockExpectation.pass(String(this));
}
return true;
},
pass: function pass(message) {
assert.pass(message);
},
fail: function fail(message) {
const exception = new Error(message);
exception.name = "ExpectationError";
throw exception;
}
};
module2.exports = mockExpectation;
}
});
// lib/sinon/mock.js
var require_mock = __commonJS({
"lib/sinon/mock.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var mockExpectation = require_mock_expectation();
var proxyCall = require_proxy_call();
var extend = require_extend();
var samsam = require_samsam();
var wrapMethod = require_wrap_method();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var { prototypes } = commons__default.default;
var { deepEqual } = samsam__default.default;
var { concat, filter, forEach, every, join, push, slice, unshift } = prototypes.array;
function mock(object) {
if (!object || typeof object === "string") {
return mockExpectation.create(object ? object : "Anonymous mock");
}
return mock.create(object);
}
function each(collection, callback) {
const col = collection || [];
forEach(col, callback);
}
function arrayEquals(arr1, arr2, compareLength) {
if (compareLength && arr1.length !== arr2.length) {
return false;
}
return every(arr1, function(element, i) {
return deepEqual(arr2[i], element);
});
}
extend(mock, {
create: function create(object) {
if (!object) {
throw new TypeError("object is null");
}
const mockObject = extend.nonEnum({}, mock, { object });
delete mockObject.create;
return mockObject;
},
expects: function expects(method) {
if (!method) {
throw new TypeError("method is falsy");
}
if (!this.expectations) {
this.expectations = {};
this.proxies = [];
this.failures = [];
}
if (!this.expectations[method]) {
this.expectations[method] = [];
const mockObject = this;
wrapMethod(this.object, method, function() {
return mockObject.invokeMethod(method, this, arguments);
});
push(this.proxies, method);
}
const expectation = mockExpectation.create(method);
expectation.wrappedMethod = this.object[method].wrappedMethod;
push(this.expectations[method], expectation);
return expectation;
},
restore: function restore() {
const object = this.object;
each(this.proxies, function(proxy) {
if (typeof object[proxy].restore === "function") {
object[proxy].restore();
}
});
},
verify: function verify() {
const expectations = this.expectations || {};
const messages = this.failures ? slice(this.failures) : [];
const met = [];
each(this.proxies, function(proxy) {
each(expectations[proxy], function(expectation) {
if (!expectation.met()) {
push(messages, String(expectation));
} else {
push(met, String(expectation));
}
});
});
this.restore();
if (messages.length > 0) {
mockExpectation.fail(join(concat(messages, met), "\n"));
} else if (met.length > 0) {
mockExpectation.pass(join(concat(messages, met), "\n"));
}
return true;
},
invokeMethod: function invokeMethod(method, thisValue, args) {
const expectations = this.expectations && this.expectations[method] ? this.expectations[method] : [];
const currentArgs = args || [];
let available;
const expectationsWithMatchingArgs = filter(
expectations,
function(expectation) {
const expectedArgs = expectation.expectedArguments || [];
return arrayEquals(
expectedArgs,
currentArgs,
expectation.expectsExactArgCount
);
}
);
const expectationsToApply = filter(
expectationsWithMatchingArgs,
function(expectation) {
return !expectation.met() && expectation.allowsCall(thisValue, args);
}
);
if (expectationsToApply.length > 0) {
return expectationsToApply[0].apply(thisValue, args);
}
const messages = [];
let exhausted = 0;
forEach(expectationsWithMatchingArgs, function(expectation) {
if (expectation.allowsCall(thisValue, args)) {
available = available || expectation;
} else {
exhausted += 1;
}
});
if (available && exhausted === 0) {
return available.apply(thisValue, args);
}
forEach(expectations, function(expectation) {
push(messages, ` ${String(expectation)}`);
});
unshift(
messages,
`Unexpected call: ${proxyCall.toString.call({
proxy: method,
args
})}`
);
const err = new Error();
if (!err.stack) {
try {
throw err;
} catch (e) {
}
}
push(
this.failures,
`Unexpected call: ${proxyCall.toString.call({
proxy: method,
args,
stack: err.stack
})}`
);
mockExpectation.fail(join(messages, "\n"));
}
});
module2.exports = mock;
}
});
// lib/sinon/create-stub-instance.js
var require_create_stub_instance = __commonJS({
"lib/sinon/create-stub-instance.js"(exports2, module2) {
"use strict";
var stub = require_stub();
var sinonType = require_sinon_type();
var commons = require_lib();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { forEach } = prototypes.array;
function isStub(value) {
return sinonType.get(value) === "stub";
}
function createStubInstance(constructor, overrides) {
if (typeof constructor !== "function") {
throw new TypeError("The constructor should be a function.");
}
const stubInstance = Object.create(constructor.prototype);
sinonType.set(stubInstance, "stub-instance");
const stubbedObject = stub(stubInstance);
forEach(Object.keys(overrides || {}), function(propertyName) {
if (propertyName in stubbedObject) {
const value = overrides[propertyName];
if (isStub(value)) {
stubbedObject[propertyName] = value;
} else {
stubbedObject[propertyName].returns(value);
}
} else {
throw new Error(
`Cannot stub ${propertyName}. Property does not exist!`
);
}
});
return stubbedObject;
}
module2.exports = createStubInstance;
}
});
// lib/sinon/fake.js
var require_fake = __commonJS({
"lib/sinon/fake.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var proxy = require_proxy();
var nextTick = require_next_tick();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { prototypes } = commons__default.default;
var { slice } = prototypes.array;
function fake(f) {
if (arguments.length > 0 && typeof f !== "function") {
throw new TypeError("Expected f argument to be a Function");
}
return wrapFunc(f);
}
fake.returns = function returns(value) {
function f() {
return value;
}
return wrapFunc(f);
};
fake.throws = function throws(value) {
function f() {
throw getError(value);
}
return wrapFunc(f);
};
fake.resolves = function resolves(value) {
function f() {
return Promise.resolve(value);
}
return wrapFunc(f);
};
fake.rejects = function rejects(value) {
function f() {
return Promise.reject(getError(value));
}
return wrapFunc(f);
};
fake.yields = function yields() {
const values = slice(arguments);
function f() {
const callback = arguments[arguments.length - 1];
if (typeof callback !== "function") {
throw new TypeError("Expected last argument to be a function");
}
callback.apply(null, values);
}
return wrapFunc(f);
};
fake.yieldsAsync = function yieldsAsync() {
const values = slice(arguments);
function f() {
const callback = arguments[arguments.length - 1];
if (typeof callback !== "function") {
throw new TypeError("Expected last argument to be a function");
}
nextTick(function() {
callback.apply(null, values);
});
}
return wrapFunc(f);
};
var uuid = 0;
function wrapFunc(f) {
const fakeInstance = function() {
let firstArg, lastArg;
if (arguments.length > 0) {
firstArg = arguments[0];
lastArg = arguments[arguments.length - 1];
}
const callback = lastArg && typeof lastArg === "function" ? lastArg : void 0;
proxy$1.firstArg = firstArg;
proxy$1.lastArg = lastArg;
proxy$1.callback = callback;
return f && f.apply(this, arguments);
};
const proxy$1 = proxy(fakeInstance, f || fakeInstance);
Object.defineProperty(proxy$1, "name", {
value: "fake",
configurable: true
});
proxy$1.displayName = "fake";
proxy$1.id = `fake#${uuid++}`;
return proxy$1;
}
function getError(value) {
return value instanceof Error ? value : new Error(value);
}
module2.exports = fake;
}
});
// lib/sinon/sandbox.js
var require_sandbox = __commonJS({
"lib/sinon/sandbox.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var samsam = require_samsam();
var collectOwnMethods = require_collect_own_methods();
var getPropertyDescriptor = require_get_property_descriptor();
var assert = require_assert();
var fakeTimers = require_fake_timers();
var mock = require_mock();
var spy = require_spy();
var stub = require_stub();
var createStubInstance = require_create_stub_instance();
var fake = require_fake();
var extend = require_extend();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
var { array: arrayProto } = commons__default.default.prototypes;
var { deprecated: logger, valueToString } = commons__default.default;
var { createMatcher: match } = samsam__default.default;
var DEFAULT_LEAK_THRESHOLD = 1e4;
var filter = arrayProto.filter;
var forEach = arrayProto.forEach;
var push = arrayProto.push;
var reverse = arrayProto.reverse;
function applyOnEach(fakes, method) {
const matchingFakes = filter(fakes, function(fake2) {
return typeof fake2[method] === "function";
});
forEach(matchingFakes, function(fake2) {
fake2[method]();
});
}
function throwOnAccessors(descriptor) {
if (typeof descriptor.get === "function") {
throw new Error("Use sandbox.replaceGetter for replacing getters");
}
if (typeof descriptor.set === "function") {
throw new Error("Use sandbox.replaceSetter for replacing setters");
}
}
function verifySameType(object, property, replacement) {
const original = object[property];
const originalType = typeof original;
const replacementType = typeof replacement;
if (originalType !== replacementType) {
throw new TypeError(
`Cannot replace ${originalType} with ${replacementType}`
);
}
}
function checkForValidArguments(descriptor, property, replacement) {
if (typeof descriptor === "undefined") {
throw new TypeError(
`Cannot replace non-existent property ${valueToString(
property
)}. Perhaps you meant sandbox.define()?`
);
}
if (typeof replacement === "undefined") {
throw new TypeError("Expected replacement argument to be defined");
}
}
function Sandbox(opts = {}) {
const sandbox = this;
const assertOptions = opts.assertOptions || {};
const fakeRestorers = [];
let collection = [];
let loggedLeakWarning = false;
sandbox.leakThreshold = DEFAULT_LEAK_THRESHOLD;
function addToCollection(object) {
if (push(collection, object) > sandbox.leakThreshold && !loggedLeakWarning) {
logger.printWarning(
`Sinon sandbox: The number of fakes in the sandbox has exceeded the leak threshold of ${sandbox.leakThreshold}. To avoid memory leaks, ensure you are restoring the sandbox after each test. To disable this warning, modify the leakThreshold property of your sandbox.`
);
loggedLeakWarning = true;
}
}
sandbox.assert = assert.createAssertObject(assertOptions);
sandbox.getFakes = function getFakes() {
return collection;
};
sandbox.createStubInstance = function createStubInstance$1() {
const stubbed = createStubInstance.apply(null, arguments);
const ownMethods = collectOwnMethods(stubbed);
forEach(ownMethods, function(method) {
addToCollection(method);
});
return stubbed;
};
sandbox.inject = function inject(obj) {
obj.spy = function spy2() {
return sandbox.spy.apply(null, arguments);
};
obj.stub = function stub2() {
return sandbox.stub.apply(null, arguments);
};
obj.mock = function mock2() {
return sandbox.mock.apply(null, arguments);
};
obj.createStubInstance = function createStubInstanceWrapper() {
return sandbox.createStubInstance.apply(sandbox, arguments);
};
obj.fake = function fake2() {
return sandbox.fake.apply(null, arguments);
};
obj.define = function define2() {
return sandbox.define.apply(null, arguments);
};
obj.replace = function replace() {
return sandbox.replace.apply(null, arguments);
};
obj.replaceSetter = function replaceSetter() {
return sandbox.replaceSetter.apply(null, arguments);
};
obj.replaceGetter = function replaceGetter() {
return sandbox.replaceGetter.apply(null, arguments);
};
if (sandbox.clock) {
obj.clock = sandbox.clock;
}
obj.match = match;
return obj;
};
function commonPostInitSetup(args, spy2, isStub, shouldAddToCollection = true) {
if (isStub && args.length >= 3) {
throw new TypeError(
"stub(obj, 'meth', fn) has been removed, see documentation"
);
}
if (shouldAddToCollection) {
addToCollection(spy2);
}
return spy2;
}
function addReturnedMethodsToCollection(result) {
if (result && (typeof result === "object" || typeof result === "function")) {
forEach(collectOwnMethods(result), addToCollection);
}
}
sandbox.spy = function() {
const createdSpy = spy.apply(spy, arguments);
const result = commonPostInitSetup(
arguments,
createdSpy,
false,
!(arguments.length === 1 && typeof arguments[0] === "object")
);
addReturnedMethodsToCollection(result);
return result;
};
Object.defineProperty(sandbox.spy, "name", {
value: "spy",
configurable: true
});
Object.defineProperty(sandbox.spy, "length", {
value: 0,
configurable: true
});
extend(sandbox.spy, spy);
sandbox.stub = function() {
const createdStub = stub.apply(stub, arguments);
const result = commonPostInitSetup(
arguments,
createdStub,
true,
!(arguments.length === 1 && typeof arguments[0] === "object")
);
addReturnedMethodsToCollection(result);
return result;
};
Object.defineProperty(sandbox.stub, "name", {
value: "stub",
configurable: true
});
Object.defineProperty(sandbox.stub, "length", {
value: 0,
configurable: true
});
extend(sandbox.stub, stub);
sandbox.mock = function() {
const m = mock.apply(null, arguments);
addToCollection(m);
return m;
};
Object.defineProperty(sandbox.mock, "name", {
value: "mock",
configurable: true
});
Object.defineProperty(sandbox.mock, "length", {
value: 0,
configurable: true
});
extend(sandbox.mock, mock);
sandbox.reset = function reset() {
applyOnEach(collection, "reset");
applyOnEach(collection, "resetHistory");
};
sandbox.resetBehavior = function resetBehavior() {
applyOnEach(collection, "resetBehavior");
};
sandbox.resetHistory = function resetHistory() {
for (let i = 0; i < collection.length; i++) {
const f = collection[i];
const method = f.resetHistory || f.reset;
if (typeof method === "function") {
method.call(f);
}
}
};
sandbox.verify = function verify() {
applyOnEach(collection, "verify");
};
sandbox.verifyAndRestore = function verifyAndRestore() {
let exception;
try {
sandbox.verify();
} catch (e) {
exception = e;
}
sandbox.restore();
if (exception) {
throw exception;
}
};
sandbox.restore = function restore() {
if (arguments.length) {
throw new Error(
"sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()"
);
}
reverse(fakeRestorers);
forEach(fakeRestorers, function(restorer) {
restorer();
});
fakeRestorers.length = 0;
reverse(collection);
applyOnEach(collection, "restore");
collection = [];
};
sandbox.restoreContext = function restoreContext() {
forEach(sandbox.injectedKeys, function(injectedKey) {
delete sandbox.injectInto[injectedKey];
});
sandbox.injectedKeys.length = 0;
};
function getFakeRestorer(object, property, forceAssignment = false) {
const descriptor = getPropertyDescriptor(object, property);
const value = forceAssignment && object[property];
function restorer() {
if (forceAssignment) {
object[property] = value;
} else if (descriptor?.isOwn) {
Object.defineProperty(object, property, descriptor);
} else {
delete object[property];
}
}
restorer.sinon = true;
restorer.object = object;
restorer.property = property;
return restorer;
}
function verifyNotReplaced(object, property) {
forEach(fakeRestorers, function(fakeRestorer) {
if (fakeRestorer.object === object && fakeRestorer.property === property) {
throw new TypeError(
`Attempted to replace ${valueToString(
property
)} which is already replaced`
);
}
});
}
sandbox.replace = function replace(object, property, replacement) {
const descriptor = getPropertyDescriptor(object, property);
checkForValidArguments(descriptor, property, replacement);
verifyNotReplaced(object, property);
throwOnAccessors(descriptor);
verifySameType(object, property, replacement);
push(fakeRestorers, getFakeRestorer(object, property));
object[property] = replacement;
return replacement;
};
sandbox.replace.usingAccessor = function replaceUsingAccessor(object, property, replacement) {
const descriptor = getPropertyDescriptor(object, property);
checkForValidArguments(descriptor, property, replacement);
verifyNotReplaced(object, property);
verifySameType(object, property, replacement);
push(fakeRestorers, getFakeRestorer(object, property, true));
object[property] = replacement;
return replacement;
};
sandbox.define = function define2(object, property, value) {
const descriptor = getPropertyDescriptor(object, property);
if (typeof property === "undefined") {
throw new TypeError(
`Cannot define the already existing property ${valueToString(
property
)}. Perhaps you meant sandbox.replace()?`
);
}
if (descriptor && descriptor.isOwn) {
throw new TypeError(
`Cannot define the already existing property ${valueToString(
property
)}. Perhaps you meant sandbox.replace()?`
);
}
push(fakeRestorers, getFakeRestorer(object, property));
Object.defineProperty(object, property, {
value,
configurable: true,
enumerable: true,
writable: true
});
return value;
};
sandbox.replaceSetter = function replaceSetter(object, property, replacement) {
const descriptor = getPropertyDescriptor(object, property);
if (typeof descriptor === "undefined") {
throw new TypeError(
`Cannot replace non-existent property ${valueToString(
property
)}`
);
}
if (typeof replacement !== "function") {
throw new TypeError(
"Expected replacement argument to be a function"
);
}
verifyNotReplaced(object, property);
if (typeof descriptor.set !== "function") {
throw new Error("`object.property` is not a setter");
}
if (!descriptor.configurable) {
throw new TypeError(
`Descriptor for property ${valueToString(
property
)} is not configurable`
);
}
push(fakeRestorers, getFakeRestorer(object, property));
Object.defineProperty(object, property, {
set: replacement,
configurable: true,
enumerable: descriptor.enumerable
});
return replacement;
};
sandbox.replaceGetter = function replaceGetter(object, property, replacement) {
const descriptor = getPropertyDescriptor(object, property);
if (typeof descriptor === "undefined") {
throw new TypeError(
`Cannot replace non-existent property ${valueToString(
property
)}`
);
}
if (typeof replacement !== "function") {
throw new TypeError(
"Expected replacement argument to be a function"
);
}
verifyNotReplaced(object, property);
if (typeof descriptor.get !== "function") {
throw new Error("`object.property` is not a getter");
}
if (!descriptor.configurable) {
throw new TypeError(
`Descriptor for property ${valueToString(
property
)} is not configurable`
);
}
push(fakeRestorers, getFakeRestorer(object, property));
Object.defineProperty(object, property, {
get: replacement,
configurable: true,
enumerable: descriptor.enumerable
});
return replacement;
};
sandbox.useFakeTimers = function useFakeTimers(args) {
const clock = fakeTimers.useFakeTimers.call(null, args);
sandbox.clock = clock;
addToCollection(clock);
return clock;
};
sandbox.fake = function fake$1() {
const createdFake = fake.apply(fake, arguments);
const result = commonPostInitSetup(arguments, createdFake, false);
addToCollection(result);
return result;
};
Object.defineProperty(sandbox.fake, "name", {
value: "fake",
configurable: true
});
Object.defineProperty(sandbox.fake, "length", {
value: 1,
configurable: true
});
extend(sandbox.fake, fake);
Object.defineProperty(sandbox.fake, "name", {
value: "fake",
configurable: true
});
Object.defineProperty(sandbox.fake, "length", {
value: 1,
configurable: true
});
function addFakeBehaviorToCollection(method) {
const original = sandbox.fake[method];
sandbox.fake[method] = function() {
const result = original.apply(fake, arguments);
addToCollection(result);
return result;
};
}
addFakeBehaviorToCollection("returns");
addFakeBehaviorToCollection("throws");
addFakeBehaviorToCollection("resolves");
addFakeBehaviorToCollection("rejects");
addFakeBehaviorToCollection("yields");
addFakeBehaviorToCollection("yieldsAsync");
}
Sandbox.prototype.match = match;
module2.exports = Sandbox;
}
});
// lib/sinon/create-sandbox.js
var require_create_sandbox = __commonJS({
"lib/sinon/create-sandbox.js"(exports2, module2) {
"use strict";
var commons = require_lib();
var sandbox = require_sandbox();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var commons__default = /* @__PURE__ */ _interopDefault(commons);
var { forEach, push } = commons__default.default.prototypes.array;
function prepareSandboxFromConfig(config) {
const sandbox$1 = new sandbox({ assertOptions: config.assertOptions });
if (config.useFakeTimers) {
if (typeof config.useFakeTimers === "object") {
sandbox$1.useFakeTimers(config.useFakeTimers);
} else {
sandbox$1.useFakeTimers();
}
}
return sandbox$1;
}
function exposeValue(sandbox2, config, key, value) {
if (!value) {
return;
}
if (config.injectInto && !(key in config.injectInto)) {
config.injectInto[key] = value;
push(sandbox2.injectedKeys, key);
} else {
push(sandbox2.args, value);
}
}
function createSandbox(config) {
if (!config) {
return new sandbox();
}
const configuredSandbox = prepareSandboxFromConfig(config);
configuredSandbox.args = configuredSandbox.args || [];
configuredSandbox.injectedKeys = [];
configuredSandbox.injectInto = config.injectInto;
const exposed = configuredSandbox.inject({});
if (config.properties) {
forEach(config.properties, function(prop) {
const value = exposed[prop] || prop === "sandbox" && configuredSandbox;
exposeValue(configuredSandbox, config, prop, value);
});
} else {
exposeValue(configuredSandbox, config, "sandbox");
}
return configuredSandbox;
}
module2.exports = createSandbox;
}
});
// lib/sinon/util/core/is-restorable.js
var require_is_restorable = __commonJS({
"lib/sinon/util/core/is-restorable.js"(exports2, module2) {
"use strict";
function isRestorable(obj) {
return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
}
module2.exports = isRestorable;
}
});
// lib/sinon/promise.js
var require_promise = __commonJS({
"lib/sinon/promise.js"(exports2, module2) {
"use strict";
var fake = require_fake();
var isRestorable = require_is_restorable();
var STATUS_PENDING = "pending";
var STATUS_RESOLVED = "resolved";
var STATUS_REJECTED = "rejected";
function getFakeExecutor(executor) {
if (isRestorable(executor)) {
return executor;
}
if (executor) {
return fake(executor);
}
return fake();
}
function promise(executor) {
const fakeExecutor = getFakeExecutor(executor);
const sinonPromise = new Promise(fakeExecutor);
sinonPromise.status = STATUS_PENDING;
sinonPromise.then(function(value) {
sinonPromise.status = STATUS_RESOLVED;
sinonPromise.resolvedValue = value;
}).catch(function(reason) {
sinonPromise.status = STATUS_REJECTED;
sinonPromise.rejectedValue = reason;
});
function finalize(status, value, callback) {
if (sinonPromise.status !== STATUS_PENDING) {
throw new Error(`Promise already ${sinonPromise.status}`);
}
sinonPromise.status = status;
callback(value);
}
sinonPromise.resolve = function(value) {
finalize(STATUS_RESOLVED, value, fakeExecutor.firstCall.args[0]);
return sinonPromise;
};
sinonPromise.reject = function(reason) {
finalize(STATUS_REJECTED, reason, fakeExecutor.firstCall.args[1]);
return new Promise(function(resolve) {
sinonPromise.catch(() => resolve());
});
};
return sinonPromise;
}
module2.exports = promise;
}
});
// lib/sinon/restore-object.js
var require_restore_object = __commonJS({
"lib/sinon/restore-object.js"(exports2, module2) {
"use strict";
var walkObject = require_walk_object();
function filter(object, property) {
return object[property].restore && object[property].restore.sinon;
}
function restore(object, property) {
object[property].restore();
}
function restoreObject(object) {
if (!object) {
throw new Error(
`Trying to restore object but received ${String(object)}`
);
}
return walkObject(restore, object, filter);
}
module2.exports = restoreObject;
}
});
// lib/create-sinon-api.js
var require_create_sinon_api = __commonJS({
"lib/create-sinon-api.js"(exports2, module2) {
"use strict";
var behavior = require_behavior();
var createSandbox = require_create_sandbox();
var createStubInstance = require_create_stub_instance();
var collectOwnMethods = require_collect_own_methods();
var extend = require_extend();
var fakeTimers = require_fake_timers();
var sandbox = require_sandbox();
var stub = require_stub();
var promise = require_promise();
var samsam = require_samsam();
var restoreObject = require_restore_object();
var mockExpectation = require_mock_expectation();
function _interopDefault(e) {
return e && e.__esModule ? e : { default: e };
}
var samsam__default = /* @__PURE__ */ _interopDefault(samsam);
function createApi() {
const sandbox$1 = new sandbox();
const apiMethods = {
// `createSandbox` returns an isolated sandbox: its fakes are tracked
// on its own collection so consumers can rely on `subSandbox.restore()`
// (and only that) for cleanup. Don't push it into the global sandbox's
// collection — doing so caused `sinon.restore()` to cascade-restore
// sub-sandboxes (regression in 21.1.0, see #2701).
createSandbox,
match: samsam__default.default.createMatcher,
restoreObject,
expectation: mockExpectation,
timers: fakeTimers.timers,
createStubInstance: function createStubInstance$1() {
const stubbed = createStubInstance.apply(null, arguments);
for (const method of collectOwnMethods(stubbed)) {
sandbox$1.getFakes().push(method);
}
return stubbed;
},
addBehavior: function(name, fn) {
behavior.addBehavior(stub, name, fn);
},
promise
};
Object.defineProperty(apiMethods.createSandbox, "name", {
value: "createSandbox",
configurable: true
});
Object.defineProperty(apiMethods.createSandbox, "length", {
value: 1,
configurable: true
});
Object.defineProperty(apiMethods.createStubInstance, "name", {
value: "createStubInstance",
configurable: true
});
Object.defineProperty(apiMethods.createStubInstance, "length", {
value: 1,
configurable: true
});
return extend(sandbox$1, apiMethods);
}
module2.exports = createApi;
}
});
// lib/sinon.js
var createSinonApi = require_create_sinon_api();
var sinon = createSinonApi();
module.exports = sinon;
if(__exports != exports)module.exports = exports;return module.exports}));
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy90aHJvd3Mtb24tcHJvdG8uanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvY29weS1wcm90b3R5cGUtbWV0aG9kcy5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9hcnJheS5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvY2FsbGVkLWluLW9yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9jbGFzcy1uYW1lLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9kZXByZWNhdGVkLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9ldmVyeS5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvZnVuY3Rpb24tbmFtZS5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvb3JkZXItYnktZmlyc3QtY2FsbC5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9mdW5jdGlvbi5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9tYXAuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9wcm90b3R5cGVzL3NldC5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3R5cGUtZGV0ZWN0L3R5cGUtZGV0ZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi92YWx1ZS10by1zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL2luZGV4LmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvZXh0ZW5kLmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvZ2V0LW5leHQtdGljay5qcyIsICJsaWIvc2lub24vdXRpbC9jb3JlL25leHQtdGljay5qcyIsICJsaWIvc2lub24vdXRpbC9jb3JlL2V4cG9ydC1hc3luYy1iZWhhdmlvcnMuanMiLCAibGliL3Npbm9uL2JlaGF2aW9yLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLW5hbi5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1uZWctemVyby5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pZGVudGljYWwuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvZ2V0LWNsYXNzLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLWFyZ3VtZW50cy5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1lbGVtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLXNldC5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1tYXAuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9ub2RlX21vZHVsZXMvdHlwZS1kZXRlY3QvdHlwZS1kZXRlY3QuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvYXJyYXktdHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXMtYXJyYXktdHlwZS5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1kYXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLWl0ZXJhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1zdWJzZXQuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvZGVlcC1lcXVhbC5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pdGVyYWJsZS10by1zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvbWF0Y2hlci1wcm90b3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvaXMtbWF0Y2hlci5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9hc3NlcnQtbWF0Y2hlci5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9hc3NlcnQtbWV0aG9kLWV4aXN0cy5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9hc3NlcnQtdHlwZS5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9pcy1pdGVyYWJsZS5qcyIsICJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9tYXRjaC1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvdHlwZS1tYXAuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIuanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvbWF0Y2guanMiLCAibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvc2Ftc2FtLmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvd2Fsay5qcyIsICJsaWIvc2lub24vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwgImxpYi9zaW5vbi9jb2xsZWN0LW93bi1tZXRob2RzLmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvdGltZXMtaW4td29yZHMuanMiLCAibm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL3NoYW1zLmpzIiwgIm5vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiLCAibm9kZV9tb2R1bGVzL2VzLW9iamVjdC1hdG9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JhbmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9lcy1lcnJvcnMvcmVmLmpzIiwgIm5vZGVfbW9kdWxlcy9lcy1lcnJvcnMvc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIsICJub2RlX21vZHVsZXMvZXMtZXJyb3JzL3VyaS5qcyIsICJub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2Ficy5qcyIsICJub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2Zsb29yLmpzIiwgIm5vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvbWF4LmpzIiwgIm5vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvbWluLmpzIiwgIm5vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvcG93LmpzIiwgIm5vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvcm91bmQuanMiLCAibm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9pc05hTi5qcyIsICJub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL3NpZ24uanMiLCAibm9kZV9tb2R1bGVzL2dvcGQvZ09QRC5qcyIsICJub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXMtZGVmaW5lLXByb3BlcnR5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YuanMiLCAibm9kZV9tb2R1bGVzL2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YuanMiLCAibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQ2FsbC5qcyIsICJub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25BcHBseS5qcyIsICJub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvcmVmbGVjdEFwcGx5LmpzIiwgIm5vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9hY3R1YWxBcHBseS5qcyIsICJub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2R1bmRlci1wcm90by9nZXQuanMiLCAibm9kZV9tb2R1bGVzL2dldC1wcm90by9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFzb3duL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9jYWxsLWJvdW5kL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1hcmd1bWVudHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLXJlZ2V4L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zYWZlLXJlZ2V4LXRlc3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2dlbmVyYXRvci1mdW5jdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtZ2VuZXJhdG9yLWZ1bmN0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1jYWxsYWJsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZm9yLWVhY2gvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3Bvc3NpYmxlLXR5cGVkLWFycmF5LW5hbWVzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9hdmFpbGFibGUtdHlwZWQtYXJyYXlzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zZXQtZnVuY3Rpb24tbGVuZ3RoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9hcHBseUJpbmQuanMiLCAibm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvd2hpY2gtdHlwZWQtYXJyYXkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLXR5cGVkLWFycmF5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvdHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsICJsaWIvc2lub24vYXNzZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9mYWtlLXRpbWVycy9zcmMvZmFrZS10aW1lcnMtc3JjLmpzIiwgImxpYi9zaW5vbi91dGlsL2Zha2UtdGltZXJzLmpzIiwgImxpYi9zaW5vbi9wcm94eS1jYWxsLXV0aWwuanMiLCAibGliL3Npbm9uL3Byb3h5LWludm9rZS5qcyIsICJsaWIvc2lub24vcHJveHktY2FsbC5qcyIsICJsaWIvc2lub24vdXRpbC9jb3JlL2lzLXByb3BlcnR5LWNvbmZpZ3VyYWJsZS5qcyIsICJsaWIvc2lub24vZGVmYXVsdC1iZWhhdmlvcnMuanMiLCAibGliL3Npbm9uL3V0aWwvY29yZS9mdW5jdGlvbi10by1zdHJpbmcuanMiLCAibGliL3Npbm9uL2NvbG9yaXplci5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvZGlmZi9iYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kaWZmL2xpYmNqcy9kaWZmL2NoYXJhY3Rlci5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvdXRpbC9zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL2RpZmYvbGliY2pzL2RpZmYvd29yZC5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvdXRpbC9wYXJhbXMuanMiLCAibm9kZV9tb2R1bGVzL2RpZmYvbGliY2pzL2RpZmYvbGluZS5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvZGlmZi9zZW50ZW5jZS5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvZGlmZi9jc3MuanMiLCAibm9kZV9tb2R1bGVzL2RpZmYvbGliY2pzL2RpZmYvanNvbi5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvZGlmZi9hcnJheS5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvcGF0Y2gvbGluZS1lbmRpbmdzLmpzIiwgIm5vZGVfbW9kdWxlcy9kaWZmL2xpYmNqcy9wYXRjaC9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvdXRpbC9kaXN0YW5jZS1pdGVyYXRvci5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvcGF0Y2gvYXBwbHkuanMiLCAibm9kZV9tb2R1bGVzL2RpZmYvbGliY2pzL3BhdGNoL3JldmVyc2UuanMiLCAibm9kZV9tb2R1bGVzL2RpZmYvbGliY2pzL3BhdGNoL2NyZWF0ZS5qcyIsICJub2RlX21vZHVsZXMvZGlmZi9saWJjanMvY29udmVydC9kbXAuanMiLCAibm9kZV9tb2R1bGVzL2RpZmYvbGliY2pzL2NvbnZlcnQveG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9kaWZmL2xpYmNqcy9pbmRleC5qcyIsICJsaWIvc2lub24vc3B5LWZvcm1hdHRlcnMuanMiLCAibGliL3Npbm9uL3Byb3h5LmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvaXMtbm9uLWV4aXN0ZW50LXByb3BlcnR5LmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvaXMtZXMtbW9kdWxlLmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvd2Fsay1vYmplY3QuanMiLCAibGliL3Npbm9uL3V0aWwvY29yZS9zaW5vbi10eXBlLmpzIiwgImxpYi9zaW5vbi91dGlsL2NvcmUvd3JhcC1tZXRob2QuanMiLCAibGliL3Npbm9uL3NweS5qcyIsICJsaWIvc2lub24vdGhyb3ctb24tZmFsc3ktb2JqZWN0LmpzIiwgImxpYi9zaW5vbi9zdHViLmpzIiwgImxpYi9zaW5vbi9tb2NrLWV4cGVjdGF0aW9uLmpzIiwgImxpYi9zaW5vbi9tb2NrLmpzIiwgImxpYi9zaW5vbi9jcmVhdGUtc3R1Yi1pbnN0YW5jZS5qcyIsICJsaWIvc2lub24vZmFrZS5qcyIsICJsaWIvc2lub24vc2FuZGJveC5qcyIsICJsaWIvc2lub24vY3JlYXRlLXNhbmRib3guanMiLCAibGliL3Npbm9uL3V0aWwvY29yZS9pcy1yZXN0b3JhYmxlLmpzIiwgImxpYi9zaW5vbi9wcm9taXNlLmpzIiwgImxpYi9zaW5vbi9yZXN0b3JlLW9iamVjdC5qcyIsICJsaWIvY3JlYXRlLXNpbm9uLWFwaS5qcyIsICJsaWIvc2lub24uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG4gKiBAdHlwZSB7b2JqZWN0fSBnbG9iYWxPYmplY3RcbiAqL1xudmFyIGdsb2JhbE9iamVjdDtcblxuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbmlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgLy8gTm9kZVxuICAgIGdsb2JhbE9iamVjdCA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIEJyb3dzZXJcbiAgICBnbG9iYWxPYmplY3QgPSB3aW5kb3c7XG59IGVsc2Uge1xuICAgIC8vIFdlYldvcmtlclxuICAgIGdsb2JhbE9iamVjdCA9IHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsT2JqZWN0O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIElzIHRydWUgd2hlbiB0aGUgZW52aXJvbm1lbnQgY2F1c2VzIGFuIGVycm9yIHRvIGJlIHRocm93biBmb3IgYWNjZXNzaW5nIHRoZVxuICogX19wcm90b19fIHByb3BlcnR5LlxuICogVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gc3VwcG9ydCBgbm9kZSAtLWRpc2FibGUtcHJvdG89dGhyb3dgLlxuICpcbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvcHJvdG9cbiAqIEB0eXBlIHtib29sZWFufVxuICovXG5sZXQgdGhyb3dzT25Qcm90bztcbnRyeSB7XG4gICAgY29uc3Qgb2JqZWN0ID0ge307XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvLCBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICBvYmplY3QuX19wcm90b19fO1xuICAgIHRocm93c09uUHJvdG8gPSBmYWxzZTtcbn0gY2F0Y2ggKF8pIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyBjb3ZlcmVkIHdoZW4gdGVzdHMgYXJlIHJ1biB3aXRoIGAtLWRpc2FibGUtcHJvdG89dGhyb3dgLFxuICAgIC8vIGhvd2V2ZXIgd2UgY2FuIHRlc3QgYm90aCBicmFuY2hlcyBhdCB0aGUgc2FtZSB0aW1lLCBzbyB0aGlzIGlzIGlnbm9yZWRcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93c09uUHJvdG8gPSB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm93c09uUHJvdG87XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24uY2FsbDtcbnZhciB0aHJvd3NPblByb3RvID0gcmVxdWlyZShcIi4vdGhyb3dzLW9uLXByb3RvXCIpO1xuXG52YXIgZGlzYWxsb3dlZFByb3BlcnRpZXMgPSBbXG4gICAgLy8gaWdub3JlIHNpemUgYmVjYXVzZSBpdCB0aHJvd3MgZnJvbSBNYXBcbiAgICBcInNpemVcIixcbiAgICBcImNhbGxlclwiLFxuICAgIFwiY2FsbGVlXCIsXG4gICAgXCJhcmd1bWVudHNcIixcbl07XG5cbi8vIFRoaXMgYnJhbmNoIGlzIGNvdmVyZWQgd2hlbiB0ZXN0cyBhcmUgcnVuIHdpdGggYC0tZGlzYWJsZS1wcm90bz10aHJvd2AsXG4vLyBob3dldmVyIHdlIGNhbiB0ZXN0IGJvdGggYnJhbmNoZXMgYXQgdGhlIHNhbWUgdGltZSwgc28gdGhpcyBpcyBpZ25vcmVkXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKHRocm93c09uUHJvdG8pIHtcbiAgICBkaXNhbGxvd2VkUHJvcGVydGllcy5wdXNoKFwiX19wcm90b19fXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvcHlQcm90b3R5cGVNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc2lub25qcy9uby1wcm90b3R5cGUtbWV0aG9kcy9uby1wcm90b3R5cGUtbWV0aG9kc1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpLnJlZHVjZShmdW5jdGlvbiAoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgbmFtZVxuICAgICkge1xuICAgICAgICBpZiAoZGlzYWxsb3dlZFByb3BlcnRpZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZVtuYW1lXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0W25hbWVdID0gY2FsbC5iaW5kKHByb3RvdHlwZVtuYW1lXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvcHlQcm90b3R5cGUgPSByZXF1aXJlKFwiLi9jb3B5LXByb3RvdHlwZS1tZXRob2RzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlQcm90b3R5cGUoQXJyYXkucHJvdG90eXBlKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIGV2ZXJ5ID0gcmVxdWlyZShcIi4vcHJvdG90eXBlcy9hcnJheVwiKS5ldmVyeTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBoYXNDYWxsc0xlZnQoY2FsbE1hcCwgc3B5KSB7XG4gICAgaWYgKGNhbGxNYXBbc3B5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbGxNYXBbc3B5LmlkXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGxNYXBbc3B5LmlkXSA8IHNweS5jYWxsQ291bnQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tBZGphY2VudENhbGxzKGNhbGxNYXAsIHNweSwgaW5kZXgsIHNwaWVzKSB7XG4gICAgdmFyIGNhbGxlZEJlZm9yZU5leHQgPSB0cnVlO1xuXG4gICAgaWYgKGluZGV4ICE9PSBzcGllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNhbGxlZEJlZm9yZU5leHQgPSBzcHkuY2FsbGVkQmVmb3JlKHNwaWVzW2luZGV4ICsgMV0pO1xuICAgIH1cblxuICAgIGlmIChoYXNDYWxsc0xlZnQoY2FsbE1hcCwgc3B5KSAmJiBjYWxsZWRCZWZvcmVOZXh0KSB7XG4gICAgICAgIGNhbGxNYXBbc3B5LmlkXSArPSAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQSBTaW5vbiBwcm94eSBvYmplY3QgKGZha2UsIHNweSwgc3R1YilcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpbm9uUHJveHlcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGNhbGxlZEJlZm9yZSAtIEEgbWV0aG9kIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGlzIHByb3h5IHdhcyBjYWxsZWQgYmVmb3JlIGFub3RoZXIgb25lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTb21lIGlkXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FsbENvdW50IC0gTnVtYmVyIG9mIHRpbWVzIHRoaXMgcHJveHkgaGFzIGJlZW4gY2FsbGVkXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgc3BpZXMgaGF2ZSBiZWVuIGNhbGxlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHN1cHBsaWVkIGluXG4gKiBAcGFyYW0gIHtTaW5vblByb3h5W10gfCBTaW5vblByb3h5fSBzcGllcyBBbiBhcnJheSBvZiBwcm94aWVzLCBvciBzZXZlcmFsIHByb3hpZXMgYXMgYXJndW1lbnRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSB3aGVuIHNwaWVzIGFyZSBjYWxsZWQgaW4gb3JkZXIsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBjYWxsZWRJbk9yZGVyKHNwaWVzKSB7XG4gICAgdmFyIGNhbGxNYXAgPSB7fTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICB2YXIgX3NwaWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHMgOiBzcGllcztcblxuICAgIHJldHVybiBldmVyeShfc3BpZXMsIGNoZWNrQWRqYWNlbnRDYWxscy5iaW5kKG51bGwsIGNhbGxNYXApKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYWxsZWRJbk9yZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYSBkaXNwbGF5IG5hbWUgZm9yIGEgdmFsdWUgZnJvbSBhIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtvYmplY3R9IHZhbHVlIEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMgeyhzdHJpbmd8bnVsbCl9IEEgc3RyaW5nIG9yIG51bGxcbiAqL1xuZnVuY3Rpb24gY2xhc3NOYW1lKHZhbHVlKSB7XG4gICAgY29uc3QgbmFtZSA9IHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIG5hbWUgfHwgbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWU7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBpbnZva2UgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGFuZCBwcmludCBhXG4gKiBkZXByZWNhdGlvbiB3YXJuaW5nIHRvIHRoZSBjb25zb2xlIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZnVuY1xuICogQHBhcmFtICB7c3RyaW5nfSBtc2dcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0cy53cmFwID0gZnVuY3Rpb24gKGZ1bmMsIG1zZykge1xuICAgIHZhciB3cmFwcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBvcnRzLnByaW50V2FybmluZyhtc2cpO1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgaWYgKGZ1bmMucHJvdG90eXBlKSB7XG4gICAgICAgIHdyYXBwZWQucHJvdG90eXBlID0gZnVuYy5wcm90b3R5cGU7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBgd3JhcCgpYCB0byBub3RpZnkgdGhlIHVzZXIgdGhhdCBhXG4gKiBwYXJ0aWN1bGFyIHBhcnQgb2YgdGhlIHNpbm9uIEFQSSBoYXMgYmVlbiBkZXByZWNhdGVkLlxuICogQHBhcmFtICB7c3RyaW5nfSBwYWNrYWdlTmFtZVxuICogQHBhcmFtICB7c3RyaW5nfSBmdW5jTmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5kZWZhdWx0TXNnID0gZnVuY3Rpb24gKHBhY2thZ2VOYW1lLCBmdW5jTmFtZSkge1xuICAgIHJldHVybiBgJHtwYWNrYWdlTmFtZX0uJHtmdW5jTmFtZX0gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHB1YmxpYyBBUEkgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiAke3BhY2thZ2VOYW1lfS5gO1xufTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIG9uIHRoZSBjb25zb2xlLCB3aGVuIGl0IGV4aXN0c1xuICogQHBhcmFtICB7c3RyaW5nfSBtc2dcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydHMucHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gKG1zZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZW1pdFdhcm5pbmcpIHtcbiAgICAgICAgLy8gRW1pdCBXYXJuaW5ncyBpbiBOb2RlXG4gICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobXNnKTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUuaW5mbykge1xuICAgICAgICBjb25zb2xlLmluZm8obXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgIH1cbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gZm4gcmV0dXJucyB0cnVlIGZvciBhbGwgbWVtYmVycyBvZiBvYmouXG4gKiBUaGlzIGlzIGFuIGV2ZXJ5IGltcGxlbWVudGF0aW9uIHRoYXQgd29ya3MgZm9yIGFsbCBpdGVyYWJsZXNcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXZlcnkob2JqLCBmbikge1xuICAgIHZhciBwYXNzID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc2lub25qcy9uby1wcm90b3R5cGUtbWV0aG9kcy9uby1wcm90b3R5cGUtbWV0aG9kc1xuICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBUaHJvd2luZyBhbiBlcnJvciBpcyB0aGUgb25seSB3YXkgdG8gYnJlYWsgYGZvckVhY2hgXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcGFzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXNzO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZGlzcGxheSBuYW1lIGZvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZnVuY1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmdW5jdGlvbk5hbWUoZnVuYykge1xuICAgIGlmICghZnVuYykge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZnVuYy5kaXNwbGF5TmFtZSB8fFxuICAgICAgICAgICAgZnVuYy5uYW1lIHx8XG4gICAgICAgICAgICAvLyBVc2UgZnVuY3Rpb24gZGVjb21wb3NpdGlvbiBhcyBhIGxhc3QgcmVzb3J0IHRvIGdldCBmdW5jdGlvblxuICAgICAgICAgICAgLy8gbmFtZS4gRG9lcyBub3QgcmVseSBvbiBmdW5jdGlvbiBkZWNvbXBvc2l0aW9uIHRvIHdvcmsgLSBpZiBpdFxuICAgICAgICAgICAgLy8gZG9lc24ndCBkZWJ1Z2dpbmcgd2lsbCBiZSBzbGlnaHRseSBsZXNzIGluZm9ybWF0aXZlXG4gICAgICAgICAgICAvLyAoaS5lLiB0b1N0cmluZyB3aWxsIHNheSAnc3B5JyByYXRoZXIgdGhhbiAnbXlGdW5jJykuXG4gICAgICAgICAgICAoU3RyaW5nKGZ1bmMpLm1hdGNoKC9mdW5jdGlvbiAoW15cXHMoXSspLykgfHwgW10pWzFdXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBTdHJpbmdpZnkgbWF5IGZhaWwgYW5kIHdlIG1pZ2h0IGdldCBhbiBleGNlcHRpb24sIGFzIGEgbGFzdC1sYXN0XG4gICAgICAgIC8vIHJlc29ydCBmYWxsIGJhY2sgdG8gZW1wdHkgc3RyaW5nLlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG59O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc29ydCA9IHJlcXVpcmUoXCIuL3Byb3RvdHlwZXMvYXJyYXlcIikuc29ydDtcbnZhciBzbGljZSA9IHJlcXVpcmUoXCIuL3Byb3RvdHlwZXMvYXJyYXlcIikuc2xpY2U7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29tcGFyYXRvcihhLCBiKSB7XG4gICAgLy8gdXVpZCwgd29uJ3QgZXZlciBiZSBlcXVhbFxuICAgIHZhciBhQ2FsbCA9IGEuZ2V0Q2FsbCgwKTtcbiAgICB2YXIgYkNhbGwgPSBiLmdldENhbGwoMCk7XG4gICAgdmFyIGFJZCA9IChhQ2FsbCAmJiBhQ2FsbC5jYWxsSWQpIHx8IC0xO1xuICAgIHZhciBiSWQgPSAoYkNhbGwgJiYgYkNhbGwuY2FsbElkKSB8fCAtMTtcblxuICAgIHJldHVybiBhSWQgPCBiSWQgPyAtMSA6IDE7XG59XG5cbi8qKlxuICogQSBTaW5vbiBwcm94eSBvYmplY3QgKGZha2UsIHNweSwgc3R1YilcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpbm9uUHJveHlcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldENhbGwgLSBBIG1ldGhvZCB0aGF0IGNhbiByZXR1cm4gdGhlIGZpcnN0IGNhbGxcbiAqL1xuXG4vKipcbiAqIFNvcnRzIGFuIGFycmF5IG9mIFNpbm9uUHJveHkgaW5zdGFuY2VzIChmYWtlLCBzcHksIHN0dWIpIGJ5IHRoZWlyIGZpcnN0IGNhbGxcbiAqIEBwYXJhbSAge1Npbm9uUHJveHlbXSB8IFNpbm9uUHJveHl9IHNwaWVzXG4gKiBAcmV0dXJucyB7U2lub25Qcm94eVtdfVxuICovXG5mdW5jdGlvbiBvcmRlckJ5Rmlyc3RDYWxsKHNwaWVzKSB7XG4gICAgcmV0dXJuIHNvcnQoc2xpY2Uoc3BpZXMpLCBjb21wYXJhdG9yKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvcmRlckJ5Rmlyc3RDYWxsO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlLW1ldGhvZHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVByb3RvdHlwZShGdW5jdGlvbi5wcm90b3R5cGUpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlLW1ldGhvZHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVByb3RvdHlwZShNYXAucHJvdG90eXBlKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvcHlQcm90b3R5cGUgPSByZXF1aXJlKFwiLi9jb3B5LXByb3RvdHlwZS1tZXRob2RzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlQcm90b3R5cGUoT2JqZWN0LnByb3RvdHlwZSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb3B5UHJvdG90eXBlID0gcmVxdWlyZShcIi4vY29weS1wcm90b3R5cGUtbWV0aG9kc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5UHJvdG90eXBlKFNldC5wcm90b3R5cGUpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlLW1ldGhvZHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVByb3RvdHlwZShTdHJpbmcucHJvdG90eXBlKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXk6IHJlcXVpcmUoXCIuL2FycmF5XCIpLFxuICAgIGZ1bmN0aW9uOiByZXF1aXJlKFwiLi9mdW5jdGlvblwiKSxcbiAgICBtYXA6IHJlcXVpcmUoXCIuL21hcFwiKSxcbiAgICBvYmplY3Q6IHJlcXVpcmUoXCIuL29iamVjdFwiKSxcbiAgICBzZXQ6IHJlcXVpcmUoXCIuL3NldFwiKSxcbiAgICBzdHJpbmc6IHJlcXVpcmUoXCIuL3N0cmluZ1wiKSxcbn07XG4iLCAiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLnR5cGVEZXRlY3QgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIHR5cGUtZGV0ZWN0XG4gKiBDb3B5cmlnaHQoYykgMjAxMyBqYWtlIGx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG52YXIgcHJvbWlzZUV4aXN0cyA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xudmFyIGdsb2JhbE9iamVjdCA9IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyA/IHNlbGYgOiBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaWQtYmxhY2tsaXN0XG5cbnZhciBzeW1ib2xFeGlzdHMgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbnZhciBtYXBFeGlzdHMgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJztcbnZhciBzZXRFeGlzdHMgPSB0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciB3ZWFrTWFwRXhpc3RzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtTZXRFeGlzdHMgPSB0eXBlb2YgV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgZGF0YVZpZXdFeGlzdHMgPSB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbEl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEVudHJpZXNFeGlzdHMgPSBzZXRFeGlzdHMgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBtYXBFbnRyaWVzRXhpc3RzID0gbWFwRXhpc3RzICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG52YXIgc2V0SXRlcmF0b3JQcm90b3R5cGUgPSBzZXRFbnRyaWVzRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgU2V0KCkuZW50cmllcygpKTtcbnZhciBtYXBJdGVyYXRvclByb3RvdHlwZSA9IG1hcEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBNYXAoKS5lbnRyaWVzKCkpO1xudmFyIGFycmF5SXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgYXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgc3RyaW5nSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xudmFyIHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlID0gc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgdG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGggPSA4O1xudmFyIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCA9IC0xO1xuLyoqXG4gKiAjIyMgdHlwZU9mIChvYmopXG4gKlxuICogVXNlcyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIG9iamVjdCxcbiAqIG5vcm1hbGlzaW5nIGJlaGF2aW91ciBhY3Jvc3MgZW5naW5lIHZlcnNpb25zICYgd2VsbCBvcHRpbWlzZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9iamVjdCB0eXBlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiB0eXBlRGV0ZWN0KG9iaikge1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMywwMzksMDM1IG9wcy9zZWMgXHUwMEIxMS42MiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAxLDQyNCwxMzggb3BzL3NlYyBcdTAwQjE0LjU0JSAoNzUgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDEsNjUzLDE1MyBvcHMvc2VjIFx1MDBCMTEuOTElICg4MiBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggOSw5NzgsNjYwIG9wcy9zZWMgXHUwMEIxMS45MiUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAyLDU1Niw3Njkgb3BzL3NlYyBcdTAwQjExLjczJSAoNzcgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDM4LDU2NCw3OTYgb3BzL3NlYyBcdTAwQjExLjE1JSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIGJvb2xlYW4gbGl0ZXJhbCAgICB4IDMxLDE0OCw5NDAgb3BzL3NlYyBcdTAwQjExLjEwJSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDMyLDY3OSwzMzAgb3BzL3NlYyBcdTAwQjExLjkwJSAoNzggcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDMyLDM2MywzNjggb3BzL3NlYyBcdTAwQjExLjA3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIGZ1bmN0aW9uICAgICAgICAgICB4IDMxLDI5Niw4NzAgb3BzL3NlYyBcdTAwQjEwLjk2JSAoODMgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGVvZk9iajtcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAyOCw2NDUsNzY1IG9wcy9zZWMgXHUwMEIxMS4xNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogUG9zdDpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAzNiw0MjgsOTYyIG9wcy9zZWMgXHUwMEIxMS4zNyUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgICovXG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93KWBgXG4gICAqICAtIE5vZGUgPT09IFwiW29iamVjdCBnbG9iYWxdXCJcbiAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gUGhhbnRvbUpTID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSAxMSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSBFZGdlID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcylgYFxuICAgKiAgLSBDaHJvbWUgV29ya2VyID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggV29ya2VyID09PSBcIltvYmplY3QgRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICogIC0gU2FmYXJpIFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIDExIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIEVkZ2UgV29ya2VyID09PSBcIltvYmplY3QgV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICovXG4gIGlmIChvYmogPT09IGdsb2JhbE9iamVjdCkge1xuICAgIHJldHVybiAnZ2xvYmFsJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBhcnJheSBsaXRlcmFsICAgICAgeCAyLDg4OCwzNTIgb3BzL3NlYyBcdTAwQjEwLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIyLDQ3OSw2NTAgb3BzL3NlYyBcdTAwQjEwLjk2JSAoODEgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkob2JqKSAmJlxuICAgIChzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyA9PT0gZmFsc2UgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gb2JqKSlcbiAgKSB7XG4gICAgcmV0dXJuICdBcnJheSc7XG4gIH1cblxuICAvLyBOb3QgY2FjaGluZyBleGlzdGVuY2Ugb2YgYHdpbmRvd2AgYW5kIHJlbGF0ZWQgcHJvcGVydGllcyBkdWUgdG8gcG90ZW50aWFsXG4gIC8vIGZvciBgd2luZG93YCB0byBiZSB1bnNldCBiZWZvcmUgdGVzdHMgaW4gcXVhc2ktYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cgIT09IG51bGwpIHtcbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNsb2NhdGlvbilcbiAgICAgKiBXaGF0V0cgSFRNTCQ3LjcuMyAtIFRoZSBgTG9jYXRpb25gIGludGVyZmFjZVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LmxvY2F0aW9uKWBgXG4gICAgICogIC0gSUUgPD0xMSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqICAtIElFIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2F0aW9uID09PSAnb2JqZWN0JyAmJiBvYmogPT09IHdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgcmV0dXJuICdMb2NhdGlvbic7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvY3VtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDMuMS4xIC0gVGhlIGBEb2N1bWVudGAgb2JqZWN0XG4gICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC0yNjgwOTI2OClcbiAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICogICAgICAgV2hhdFdHIEhUTUwgc3RhdGVzOlxuICAgICAqICAgICAgICAgPiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBXaW5kb3cgb2JqZWN0cyBtdXN0IGFsc28gaGF2ZSBhXG4gICAgICogICAgICAgICA+IHdyaXRhYmxlLCBjb25maWd1cmFibGUsIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVkXG4gICAgICogICAgICAgICA+IEhUTUxEb2N1bWVudCB3aG9zZSB2YWx1ZSBpcyB0aGUgRG9jdW1lbnQgaW50ZXJmYWNlIG9iamVjdC5cbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50KWBgXG4gICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDExID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgPT09ICdvYmplY3QnICYmIG9iaiA9PT0gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gJ0RvY3VtZW50JztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjbWltZXR5cGVhcnJheSlcbiAgICAgICAqIFdoYXRXRyBIVE1MJDguNi4xLjUgLSBQbHVnaW5zIC0gSW50ZXJmYWNlIE1pbWVUeXBlQXJyYXlcbiAgICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLm1pbWVUeXBlcylgYFxuICAgICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TTWltZVR5cGVzQ29sbGVjdGlvbl1cIlxuICAgICAgICovXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubWltZVR5cGVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIG9iaiA9PT0gd2luZG93Lm5hdmlnYXRvci5taW1lVHlwZXMpIHtcbiAgICAgICAgcmV0dXJuICdNaW1lVHlwZUFycmF5JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3BsdWdpbmFycmF5KVxuICAgICAgICogV2hhdFdHIEhUTUwkOC42LjEuNSAtIFBsdWdpbnMgLSBJbnRlcmZhY2UgUGx1Z2luQXJyYXlcbiAgICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLnBsdWdpbnMpYGBcbiAgICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBNU1BsdWdpbnNDb2xsZWN0aW9uXVwiXG4gICAgICAgKi9cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIG9iaiA9PT0gd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiAnUGx1Z2luQXJyYXknO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgodHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LkhUTUxFbGVtZW50ID09PSAnb2JqZWN0JykgJiZcbiAgICAgICAgb2JqIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7XG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgICogV2hhdFdHIEhUTUwkNC40LjQgLSBUaGUgYGJsb2NrcXVvdGVgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxRdW90ZUVsZW1lbnRgXG4gICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmxvY2txdW90ZScpKWBgXG4gICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBIVE1MQmxvY2tFbGVtZW50XVwiXG4gICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnQkxPQ0tRVU9URScpIHtcbiAgICAgICAgcmV0dXJuICdIVE1MUXVvdGVFbGVtZW50JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlZGF0YWNlbGxlbGVtZW50KVxuICAgICAgICogV2hhdFdHIEhUTUwkNC45LjkgLSBUaGUgYHRkYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnRgXG4gICAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtODI5MTUwNzUpXG4gICAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgICAqIFRlc3Q6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpKVxuICAgICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnVEQnKSB7XG4gICAgICAgIHJldHVybiAnSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlaGVhZGVyY2VsbGVsZW1lbnQpXG4gICAgICAgKiBXaGF0V0cgSFRNTCQ0LjkuOSAtIFRoZSBgdGRgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50YFxuICAgICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKSlcbiAgICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKi9cbiAgICAgIGlmIChvYmoudGFnTmFtZSA9PT0gJ1RIJykge1xuICAgICAgICByZXR1cm4gJ0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50JztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDYyNSw2NDQgb3BzL3NlYyBcdTAwQjExLjU4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggMSwyNzksODUyIG9wcy9zZWMgXHUwMEIxMi45MSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDEsMTc4LDE4NSBvcHMvc2VjIFx1MDBCMTEuOTUlICg4MyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCAxLDAwOCwzODAgb3BzL3NlYyBcdTAwQjEyLjI1JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggMSwxMjgsMDQwIG9wcy9zZWMgXHUwMEIxMi4xMSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDEsMTcwLDExOSBvcHMvc2VjIFx1MDBCMTIuODglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCAxLDE3NiwzNDggb3BzL3NlYyBcdTAwQjE1Ljc5JSAoODYgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggMSwwNTgsNzA3IG9wcy9zZWMgXHUwMEIxNC45NCUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDEsMTEwLDYzMyBvcHMvc2VjIFx1MDBCMTQuMjAlICg4MCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDcsMTA1LDY3MSBvcHMvc2VjIFx1MDBCMTEzLjQ3JSAoNjQgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggNSw4ODcsOTEyIG9wcy9zZWMgXHUwMEIxMS40NiUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDYsNDkxLDY2MSBvcHMvc2VjIFx1MDBCMTEuNzYlICg3OSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCA2LDU1OSw3OTUgb3BzL3NlYyBcdTAwQjExLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggNiw0NjMsOTY2IG9wcy9zZWMgXHUwMEIxMS40MyUgKDg1IHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDUsNjQxLDg0MSBvcHMvc2VjIFx1MDBCMTMuNDklICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCA2LDU4Myw1MTEgb3BzL3NlYyBcdTAwQjExLjk4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggNiw2MDYsMDc4IG9wcy9zZWMgXHUwMEIxMS43NCUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDYsNjAyLDIyNCBvcHMvc2VjIFx1MDBCMTEuNzclICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIHZhciBzdHJpbmdUYWcgPSAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgJiYgb2JqW1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICBpZiAodHlwZW9mIHN0cmluZ1RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG5cbiAgdmFyIG9ialByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDEsNzcyLDM4NSBvcHMvc2VjIFx1MDBCMTEuODUlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICByZWdleCBjb25zdHJ1Y3RvciAgeCAyLDE0Myw2MzQgb3BzL3NlYyBcdTAwQjEyLjQ2JSAoNzggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICByZWdleCBsaXRlcmFsICAgICAgeCAzLDkyOCwwMDkgb3BzL3NlYyBcdTAwQjEwLjY1JSAoNzggcnVucyBzYW1wbGVkKVxuICAqICAgcmVnZXggY29uc3RydWN0b3IgIHggMyw5MzEsMTA4IG9wcy9zZWMgXHUwMEIxMC41OCUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gUmVnRXhwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUmVnRXhwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMiwxMzAsMDc0IG9wcy9zZWMgXHUwMEIxNC40MiUgKDY4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMyw5NTMsNzc5IG9wcy9zZWMgXHUwMEIxMS4zNSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gRGF0ZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGUnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLXByb21pc2UucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNS40LjUuNCAtIFByb21pc2UucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlByb21pc2VcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQcm9taXNlLnJlc29sdmUoKSlgYFxuICAgKiAgLSBDaHJvbWUgPD00NyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKiAgLSBFZGdlIDw9MjAgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRmlyZWZveCAyOS1MYXRlc3QgPT09IFwiW29iamVjdCBQcm9taXNlXVwiXG4gICAqICAtIFNhZmFyaSA3LjEtTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKi9cbiAgaWYgKHByb21pc2VFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBQcm9taXNlLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUHJvbWlzZSc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDIsMjIyLDE4NiBvcHMvc2VjIFx1MDBCMTEuMzElICg4MiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDQsNTQ1LDg3OSBvcHMvc2VjIFx1MDBCMTEuMTMlICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChzZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBTZXQucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTZXQnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCAyLDM5Niw4NDIgb3BzL3NlYyBcdTAwQjExLjU5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCA0LDE4Myw5NDUgb3BzL3NlYyBcdTAwQjE2LjU5JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggMSwzMjMsMjIwIG9wcy9zZWMgXHUwMEIxMi4xNyUgKDc2IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggNCwyMzcsNTEwIG9wcy9zZWMgXHUwMEIxMi4wMSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtTZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDEsNTAwLDI2MCBvcHMvc2VjIFx1MDBCMTIuMDIlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDMsODgxLDM4NCBvcHMvc2VjIFx1MDBCMTEuNDUlICg4MiBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmICh3ZWFrTWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gV2Vha01hcC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWRhdGF2aWV3LnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjQuMi40LjIxIC0gRGF0YVZpZXcucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkRhdGFWaWV3XCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoZGF0YVZpZXdFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBEYXRhVmlldy5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGFWaWV3JztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lbWFwaXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMy4xLjUuMi4yIC0gJU1hcEl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJNYXAgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgTWFwKCkuZW50cmllcygpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKG1hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IG1hcEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdNYXAgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVzZXRpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIzLjIuNS4yLjIgLSAlU2V0SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlNldCBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBTZXQoKS5lbnRyaWVzKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc2V0SXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1NldCBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMi4xLjUuMi4yIC0gJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkFycmF5IEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoW11bU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBhcnJheUl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdBcnJheSBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjEuMS41LjIuMiAtICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiU3RyaW5nIEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoJydbU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKHN0cmluZ0l0ZXJhdG9yRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc3RyaW5nSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1N0cmluZyBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDIsNDI0LDMyMCBvcHMvc2VjIFx1MDBCMTEuNjclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDUsODM4LDAwMCBvcHMvc2VjIFx1MDBCMTAuOTklICg4NCBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0XG4gICAgLnByb3RvdHlwZVxuICAgIC50b1N0cmluZ1xuICAgIC5jYWxsKG9iailcbiAgICAuc2xpY2UodG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGgsIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCk7XG59XG5cbnJldHVybiB0eXBlRGV0ZWN0O1xuXG59KSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdHlwZSA9IHJlcXVpcmUoXCJ0eXBlLWRldGVjdFwiKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIHJlc3VsdCBvZiBydW5uaW5nIHR5cGUgZnJvbSB0eXBlLWRldGVjdCBvbiB0aGUgdmFsdWVcbiAqIEBwYXJhbSAgeyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHR5cGVPZih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZVxuICogQHBhcmFtICB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlVG9TdHJpbmcodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9TdHJpbmcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBzaW5vbmpzL25vLXByb3RvdHlwZS1tZXRob2RzL25vLXByb3RvdHlwZS1tZXRob2RzXG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZVRvU3RyaW5nO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBnbG9iYWw6IHJlcXVpcmUoXCIuL2dsb2JhbFwiKSxcbiAgICBjYWxsZWRJbk9yZGVyOiByZXF1aXJlKFwiLi9jYWxsZWQtaW4tb3JkZXJcIiksXG4gICAgY2xhc3NOYW1lOiByZXF1aXJlKFwiLi9jbGFzcy1uYW1lXCIpLFxuICAgIGRlcHJlY2F0ZWQ6IHJlcXVpcmUoXCIuL2RlcHJlY2F0ZWRcIiksXG4gICAgZXZlcnk6IHJlcXVpcmUoXCIuL2V2ZXJ5XCIpLFxuICAgIGZ1bmN0aW9uTmFtZTogcmVxdWlyZShcIi4vZnVuY3Rpb24tbmFtZVwiKSxcbiAgICBvcmRlckJ5Rmlyc3RDYWxsOiByZXF1aXJlKFwiLi9vcmRlci1ieS1maXJzdC1jYWxsXCIpLFxuICAgIHByb3RvdHlwZXM6IHJlcXVpcmUoXCIuL3Byb3RvdHlwZXNcIiksXG4gICAgdHlwZU9mOiByZXF1aXJlKFwiLi90eXBlLW9mXCIpLFxuICAgIHZhbHVlVG9TdHJpbmc6IHJlcXVpcmUoXCIuL3ZhbHVlLXRvLXN0cmluZ1wiKSxcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG52YXIgY29tbW9uc19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHQoY29tbW9ucyk7XG5cbmNvbnN0IHsgcHJvdG90eXBlczogY29tbW9uc1Byb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgYXJyYXk6IGFycmF5UHJvdG8sIG9iamVjdDogb2JqZWN0UHJvdG8gfSA9IGNvbW1vbnNQcm90b3R5cGVzO1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gb2JqZWN0UHJvdG87XG5cbmNvbnN0IGpvaW4gPSBhcnJheVByb3RvLmpvaW47XG5jb25zdCBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9FQ01BU2NyaXB0X0RvbnRFbnVtX2F0dHJpYnV0ZSNKU2NyaXB0X0RvbnRFbnVtX0J1Z1xuY29uc3QgaGFzRG9udEVudW1CdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjBcIjtcbiAgICAgICAgfSxcbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjFcIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVPZjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMlwiO1xuICAgICAgICB9LFxuICAgICAgICB0b0xvY2FsZVN0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiM1wiO1xuICAgICAgICB9LFxuICAgICAgICBwcm90b3R5cGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjRcIjtcbiAgICAgICAgfSxcbiAgICAgICAgaXNQcm90b3R5cGVPZjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiNVwiO1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiNlwiO1xuICAgICAgICB9LFxuICAgICAgICBoYXNPd25Qcm9wZXJ0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiN1wiO1xuICAgICAgICB9LFxuICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjhcIjtcbiAgICAgICAgfSxcbiAgICAgICAgdW5pcXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI5XCI7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkpIHtcbiAgICAgICAgICAgIHB1c2gocmVzdWx0LCBvYmpbcHJvcF0oKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpvaW4ocmVzdWx0LCBcIlwiKSAhPT0gXCIwMTIzNDU2Nzg5XCI7XG59KSgpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gc291cmNlc1xuICogQHBhcmFtIGRvQ29weVxuICogQHJldHVybnMge3Vua25vd259IHRhcmdldFxuICovXG5mdW5jdGlvbiBleHRlbmRDb21tb24odGFyZ2V0LCBzb3VyY2VzLCBkb0NvcHkpIHtcbiAgICBsZXQgc291cmNlLCBpLCBwcm9wO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291cmNlID0gc291cmNlc1tpXTtcblxuICAgICAgICBmb3IgKHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGRvQ29weSh0YXJnZXQsIHNvdXJjZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29weSAob3duKSB0b1N0cmluZyBtZXRob2QgZXZlbiB3aGVuIGluIEpTY3JpcHQgd2l0aCBEb250RW51bSBidWdcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvRUNNQVNjcmlwdF9Eb250RW51bV9hdHRyaWJ1dGUjSlNjcmlwdF9Eb250RW51bV9CdWdcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaGFzRG9udEVudW1CdWcgJiZcbiAgICAgICAgICAgIGhhc093blByb3BlcnR5KHNvdXJjZSwgXCJ0b1N0cmluZ1wiKSAmJlxuICAgICAgICAgICAgc291cmNlLnRvU3RyaW5nICE9PSB0YXJnZXQudG9TdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0YXJnZXQudG9TdHJpbmcgPSBzb3VyY2UudG9TdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFB1YmxpYzogRXh0ZW5kIHRhcmdldCBpbiBwbGFjZSB3aXRoIGFsbCAob3duKSBwcm9wZXJ0aWVzLCBleGNlcHQgJ25hbWUnIHdoZW4gW1t3cml0YWJsZV1dIGlzIGZhbHNlLFxuICogICAgICAgICBmcm9tIHNvdXJjZXMgaW4tb3JkZXIuIFRodXMsIGxhc3Qgc291cmNlIHdpbGwgb3ZlcnJpZGUgcHJvcGVydGllcyBpbiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBUaGUgT2JqZWN0IHRvIGV4dGVuZFxuICogQHBhcmFtIHtvYmplY3RbXX0gc291cmNlcyAtIE9iamVjdHMgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgZXh0ZW5kZWQgdGFyZ2V0XG4gKi9cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gZXh0ZW5kQ29tbW9uKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHNvdXJjZXMsXG4gICAgICAgIGZ1bmN0aW9uIGNvcHlWYWx1ZShkZXN0LCBzb3VyY2UsIHByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgIGRlc3QsXG4gICAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHByb3AgPT09IFwibmFtZVwiICYmXG4gICAgICAgICAgICAgICAgKCFkZXN0T3duUHJvcGVydHlEZXNjcmlwdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgICFkZXN0T3duUHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHNvdXJjZU93blByb3BlcnR5RGVzY3JpcHRvci5lbnVtZXJhYmxlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgaWYgdGhlIHNvdXJjZSBoYXMgYW4gQWNjZXNzb3IgcHJvcGVydHkgY29weSBvdmVyIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgKGdldCBhbmQgc2V0KVxuICAgICAgICAgICAgICAgIGRhdGEgcHJvcGVydGllcyBoYXMgd3JpdGFibGUgYXR0cmlidXRlIHdoZXJlIGFzIGFjY2Vzc29yIHByb3BlcnR5IGRvbid0XG4gICAgICAgICAgICAgICAgUkVGOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0RhdGFfc3RydWN0dXJlcyNwcm9wZXJ0aWVzXG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlT3duUHJvcGVydHlEZXNjcmlwdG9yLCBcIndyaXRhYmxlXCIpKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMud3JpdGFibGUgPSBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMudmFsdWUgPSBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZ2V0LmJpbmQoZGVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLnNldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2V0LmJpbmQoZGVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIHByb3AsIGRlc2NyaXB0b3JzKTtcbiAgICAgICAgfSxcbiAgICApO1xufVxuXG4vKipcbiAqIFB1YmxpYzogRXh0ZW5kIHRhcmdldCBpbiBwbGFjZSB3aXRoIGFsbCAob3duKSBwcm9wZXJ0aWVzIGZyb20gc291cmNlcyBpbi1vcmRlci4gVGh1cywgbGFzdCBzb3VyY2Ugd2lsbFxuICogICAgICAgICBvdmVycmlkZSBwcm9wZXJ0aWVzIGluIHByZXZpb3VzIHNvdXJjZXMuIERlZmluZSB0aGUgcHJvcGVydGllcyBhcyBub24gZW51bWVyYWJsZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gVGhlIE9iamVjdCB0byBleHRlbmRcbiAqIEBwYXJhbSB7b2JqZWN0W119IHNvdXJjZXMgLSBPYmplY3RzIHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHJldHVybnMge29iamVjdH0gdGhlIGV4dGVuZGVkIHRhcmdldFxuICovXG5leHRlbmQubm9uRW51bSA9IGZ1bmN0aW9uIGV4dGVuZE5vbkVudW0odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIGV4dGVuZENvbW1vbihcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBzb3VyY2VzLFxuICAgICAgICBmdW5jdGlvbiBjb3B5UHJvcGVydHkoZGVzdCwgc291cmNlLCBwcm9wKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzdCwgcHJvcCwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBzb3VyY2VbcHJvcF0sXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgOiBub3QgdGVzdGluZyB0aGF0IHNldFRpbWVvdXQgd29ya3MgKi9cbmZ1bmN0aW9uIG5leHRUaWNrKGNhbGxiYWNrKSB7XG4gICAgc2V0VGltZW91dChjYWxsYmFjaywgMCk7XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIE5leHRUaWNrRnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gYXJnc1xuICogQHJldHVybnMge3Vua25vd259XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV4dC10aWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvY2Vzc10gVGhlIHByb2Nlc3Mgb2JqZWN0XG4gKiBAcGFyYW0ge05leHRUaWNrRnVuY3Rpb259IFtzZXRJbW1lZGlhdGVdIFRoZSBzZXRJbW1lZGlhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtOZXh0VGlja0Z1bmN0aW9ufSBUaGUgbmV4dC10aWNrIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE5leHRUaWNrKHByb2Nlc3MsIHNldEltbWVkaWF0ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dFRpY2s7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmV4dFRpY2s7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBnZXROZXh0VGljayA9IHJlcXVpcmUoJy4vZ2V0LW5leHQtdGljay5qcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcblxuY29uc3QgeyBnbG9iYWw6IGdsb2JhbE9iamVjdCB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0O1xuXG4vKipcbiAqIEEgcGxhdGZvcm0tYWdub3N0aWMgbmV4dC10aWNrIGZ1bmN0aW9uLlxuICovXG52YXIgbmV4dFRpY2sgPSBnZXROZXh0VGljayhnbG9iYWxPYmplY3QucHJvY2VzcywgZ2xvYmFsT2JqZWN0LnNldEltbWVkaWF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV4dFRpY2s7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG52YXIgY29tbW9uc19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHQoY29tbW9ucyk7XG5cbmNvbnN0IHsgcHJvdG90eXBlcyB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0O1xuXG5jb25zdCB7IHJlZHVjZSB9ID0gcHJvdG90eXBlcy5hcnJheTtcblxuLyoqXG4gKiBFeHBvcnRzIGFzeW5jIHZlcnNpb25zIG9mIGJlaGF2aW9yIG1ldGhvZHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGJlaGF2aW9yTWV0aG9kcyBUaGUgYmVoYXZpb3IgbWV0aG9kcyB0byBleHBvcnRcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBhc3luYyB2ZXJzaW9ucyBvZiB0aGUgYmVoYXZpb3IgbWV0aG9kc1xuICovXG5mdW5jdGlvbiBleHBvcnRBc3luY0JlaGF2aW9ycyhiZWhhdmlvck1ldGhvZHMpIHtcbiAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgICBPYmplY3Qua2V5cyhiZWhhdmlvck1ldGhvZHMpLFxuICAgICAgICBmdW5jdGlvbiAoYWNjLCBtZXRob2QpIHtcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gYXZvaWQgY3JlYXRpbmcgYW5vdGhlciBhc3luYyB2ZXJzaW9ucyBvZiB0aGUgbmV3bHkgYWRkZWQgYXN5bmMgbWV0aG9kc1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tYXRjaCgvXihjYWxsc0FyZ3x5aWVsZHMpLykgJiYgIW1ldGhvZC5tYXRjaCgvQXN5bmMvKSkge1xuICAgICAgICAgICAgICAgIGFjY1tgJHttZXRob2R9QXN5bmNgXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmVoYXZpb3JNZXRob2RzW21ldGhvZF0uYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrQXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7fSxcbiAgICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydEFzeW5jQmVoYXZpb3JzO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvZXh0ZW5kLmpzJyk7XG52YXIgbmV4dFRpY2sgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9uZXh0LXRpY2suanMnKTtcbnZhciBleHBvcnRBc3luY0JlaGF2aW9ycyA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2V4cG9ydC1hc3luYy1iZWhhdmlvcnMuanMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG52YXIgY29tbW9uc19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHQoY29tbW9ucyk7XG5cbmNvbnN0IHsgcHJvdG90eXBlczogY29tbW9uc1Byb3RvdHlwZXMsIGZ1bmN0aW9uTmFtZSwgdmFsdWVUb1N0cmluZyB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0O1xuY29uc3QgeyBhcnJheTogYXJyYXlQcm90byB9ID0gY29tbW9uc1Byb3RvdHlwZXM7XG5cbmNvbnN0IGNvbmNhdCA9IGFycmF5UHJvdG8uY29uY2F0O1xuY29uc3Qgam9pbiA9IGFycmF5UHJvdG8uam9pbjtcbmNvbnN0IHJldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7XG5jb25zdCBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbmNvbnN0IHVzZUxlZnRNb3N0Q2FsbGJhY2sgPSAtMTtcbmNvbnN0IHVzZVJpZ2h0TW9zdENhbGxiYWNrID0gLTI7XG5cbmZ1bmN0aW9uIGdldENhbGxiYWNrKGJlaGF2aW9yLCBhcmdzKSB7XG4gICAgY29uc3QgY2FsbEFyZ0F0ID0gYmVoYXZpb3IuY2FsbEFyZ0F0O1xuXG4gICAgaWYgKGNhbGxBcmdBdCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2NhbGxBcmdBdF07XG4gICAgfVxuXG4gICAgbGV0IGFyZ3VtZW50TGlzdDtcblxuICAgIGlmIChjYWxsQXJnQXQgPT09IHVzZUxlZnRNb3N0Q2FsbGJhY2spIHtcbiAgICAgICAgYXJndW1lbnRMaXN0ID0gYXJncztcbiAgICB9XG5cbiAgICBpZiAoY2FsbEFyZ0F0ID09PSB1c2VSaWdodE1vc3RDYWxsYmFjaykge1xuICAgICAgICBhcmd1bWVudExpc3QgPSByZXZlcnNlKHNsaWNlKGFyZ3MpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsQXJnUHJvcCA9IGJlaGF2aW9yLmNhbGxBcmdQcm9wO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcmd1bWVudExpc3QubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmICghY2FsbEFyZ1Byb3AgJiYgdHlwZW9mIGFyZ3VtZW50TGlzdFtpXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRMaXN0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FsbEFyZ1Byb3AgJiZcbiAgICAgICAgICAgIGFyZ3VtZW50TGlzdFtpXSAmJlxuICAgICAgICAgICAgdHlwZW9mIGFyZ3VtZW50TGlzdFtpXVtjYWxsQXJnUHJvcF0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudExpc3RbaV1bY2FsbEFyZ1Byb3BdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldENhbGxiYWNrRXJyb3IoYmVoYXZpb3IsIGZ1bmMsIGFyZ3MpIHtcbiAgICBpZiAoYmVoYXZpb3IuY2FsbEFyZ0F0IDwgMCkge1xuICAgICAgICBsZXQgbXNnO1xuXG4gICAgICAgIGlmIChiZWhhdmlvci5jYWxsQXJnUHJvcCkge1xuICAgICAgICAgICAgbXNnID0gYCR7ZnVuY3Rpb25OYW1lKFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yLnN0dWIsXG4gICAgICAgICAgICApfSBleHBlY3RlZCB0byB5aWVsZCB0byAnJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yLmNhbGxBcmdQcm9wLFxuICAgICAgICAgICAgKX0nLCBidXQgbm8gb2JqZWN0IHdpdGggc3VjaCBhIHByb3BlcnR5IHdhcyBwYXNzZWQuYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1zZyA9IGAke2Z1bmN0aW9uTmFtZShcbiAgICAgICAgICAgICAgICBiZWhhdmlvci5zdHViLFxuICAgICAgICAgICAgKX0gZXhwZWN0ZWQgdG8geWllbGQsIGJ1dCBubyBjYWxsYmFjayB3YXMgcGFzc2VkLmA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtc2cgKz0gYCBSZWNlaXZlZCBbJHtqb2luKGFyZ3MsIFwiLCBcIil9XWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXNnO1xuICAgIH1cblxuICAgIHJldHVybiBgYXJndW1lbnQgYXQgaW5kZXggJHtiZWhhdmlvci5jYWxsQXJnQXR9IGlzIG5vdCBhIGZ1bmN0aW9uOiAke2Z1bmN9YDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlQXJncyhuYW1lLCBiZWhhdmlvciwgYXJncykge1xuICAgIC8vIG1hcCBmdW5jdGlvbiBuYW1lIHRvIGludGVybmFsIHByb3BlcnR5XG4gICAgLy8gICBjYWxsc0FyZyA9PiBjYWxsQXJnQXRcbiAgICBjb25zdCBwcm9wZXJ0eSA9IG5hbWUucmVwbGFjZSgvc0FyZy8sIFwiQXJnQXRcIik7XG4gICAgY29uc3QgaW5kZXggPSBiZWhhdmlvcltwcm9wZXJ0eV07XG5cbiAgICBpZiAoaW5kZXggPj0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGAke25hbWV9IGZhaWxlZDogJHtpbmRleCArIDF9IGFyZ3VtZW50cyByZXF1aXJlZCBidXQgb25seSAke1xuICAgICAgICAgICAgICAgIGFyZ3MubGVuZ3RoXG4gICAgICAgICAgICB9IHByZXNlbnRgLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGJlaGF2aW9yLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBiZWhhdmlvci5jYWxsQXJnQXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgZW5zdXJlQXJncyhcImNhbGxzQXJnXCIsIGJlaGF2aW9yLCBhcmdzKTtcbiAgICAgICAgY29uc3QgZnVuYyA9IGdldENhbGxiYWNrKGJlaGF2aW9yLCBhcmdzKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihnZXRDYWxsYmFja0Vycm9yKGJlaGF2aW9yLCBmdW5jLCBhcmdzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVoYXZpb3IuY2FsbGJhY2tBc3luYykge1xuICAgICAgICAgICAgbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yLmNhbGxiYWNrQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IuY2FsbGJhY2tBcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoXG4gICAgICAgICAgICAgICAgYmVoYXZpb3IuY2FsbGJhY2tDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yLmNhbGxiYWNrQXJndW1lbnRzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IHByb3RvID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKHN0dWIpIHtcbiAgICAgICAgY29uc3QgYmVoYXZpb3IgPSBleHRlbmQoe30sIHByb3RvKTtcbiAgICAgICAgZGVsZXRlIGJlaGF2aW9yLmNyZWF0ZTtcbiAgICAgICAgZGVsZXRlIGJlaGF2aW9yLmFkZEJlaGF2aW9yO1xuICAgICAgICBkZWxldGUgYmVoYXZpb3IuY3JlYXRlQmVoYXZpb3I7XG4gICAgICAgIGJlaGF2aW9yLnN0dWIgPSBzdHViO1xuXG4gICAgICAgIGlmIChzdHViLmRlZmF1bHRCZWhhdmlvciAmJiBzdHViLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeSkge1xuICAgICAgICAgICAgYmVoYXZpb3IucHJvbWlzZUxpYnJhcnkgPSBzdHViLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZWhhdmlvcjtcbiAgICB9LFxuXG4gICAgaXNQcmVzZW50OiBmdW5jdGlvbiBpc1ByZXNlbnQoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5jYWxsQXJnQXQgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uIHx8XG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbkNyZWF0b3IgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJldHVybkFyZ0F0ID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0aGlzLnJldHVyblRoaXMgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJlc29sdmVBcmdBdCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVGhpcyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudGhyb3dBcmdBdCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdGhpcy5mYWtlRm4gfHxcbiAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWVEZWZpbmVkXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qZXNsaW50IGNvbXBsZXhpdHk6IFtcImVycm9yXCIsIDIwXSovXG4gICAgaW52b2tlOiBmdW5jdGlvbiBpbnZva2UoY29udGV4dCwgYXJncykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBjYWxsQ2FsbGJhY2sgKGNvbmRpdGlvbmFsbHkpIGNhbGxzIGVuc3VyZUFyZ3NcbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogY2FsbENhbGxiYWNrIGludGVudGlvbmFsbHkgaGFwcGVucyBiZWZvcmVcbiAgICAgICAgICogZXZlcnl0aGluZyBlbHNlIGFuZCBjYW5ub3QgYmUgbW92ZWQgbG93ZXJcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gY2FsbENhbGxiYWNrKHRoaXMsIGFyZ3MpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5leGNlcHRpb247XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5leGNlcHRpb25DcmVhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IHRoaXMuZXhjZXB0aW9uQ3JlYXRvcigpO1xuICAgICAgICAgICAgdGhpcy5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5leGNlcHRpb247XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmV0dXJuQXJnQXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVuc3VyZUFyZ3MoXCJyZXR1cm5zQXJnXCIsIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3NbdGhpcy5yZXR1cm5BcmdBdF07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXR1cm5UaGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy50aHJvd0FyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBlbnN1cmVBcmdzKFwidGhyb3dzQXJnXCIsIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgdGhyb3cgYXJnc1t0aGlzLnRocm93QXJnQXRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmFrZUZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWtlRm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVzb2x2ZUFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBlbnN1cmVBcmdzKFwicmVzb2x2ZXNBcmdcIiwgdGhpcywgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucHJvbWlzZUxpYnJhcnkgfHwgUHJvbWlzZSkucmVzb2x2ZShcbiAgICAgICAgICAgICAgICBhcmdzW3RoaXMucmVzb2x2ZUFyZ0F0XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvbHZlVGhpcykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlc29sdmUoY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvbHZlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucHJvbWlzZUxpYnJhcnkgfHwgUHJvbWlzZSkucmVzb2x2ZSh0aGlzLnJldHVyblZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlamVjdCh0aGlzLnJldHVyblZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxzVGhyb3VnaCkge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZE1ldGhvZCA9IHRoaXMuZWZmZWN0aXZlV3JhcHBlZE1ldGhvZCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZE1ldGhvZC5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxzVGhyb3VnaFdpdGhOZXcpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgbWV0aG9kIChhc3N1bWVkIHRvIGJlIGEgY29uc3RydWN0b3IgaW4gdGhpcyBjYXNlKVxuICAgICAgICAgICAgY29uc3QgV3JhcHBlZENsYXNzID0gdGhpcy5lZmZlY3RpdmVXcmFwcGVkTWV0aG9kKCk7XG4gICAgICAgICAgICAvLyBUdXJuIHRoZSBhcmd1bWVudHMgb2JqZWN0IGludG8gYSBub3JtYWwgYXJyYXlcbiAgICAgICAgICAgIGNvbnN0IGFyZ3NBcnJheSA9IHNsaWNlKGFyZ3MpO1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIGNvbnN0IEYgPSBXcmFwcGVkQ2xhc3MuYmluZC5hcHBseShcbiAgICAgICAgICAgICAgICBXcmFwcGVkQ2xhc3MsXG4gICAgICAgICAgICAgICAgY29uY2F0KFtudWxsXSwgYXJnc0FycmF5KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEYoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY2FsbEFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5WYWx1ZTtcbiAgICB9LFxuXG4gICAgZWZmZWN0aXZlV3JhcHBlZE1ldGhvZDogZnVuY3Rpb24gZWZmZWN0aXZlV3JhcHBlZE1ldGhvZCgpIHtcbiAgICAgICAgZm9yIChsZXQgc3R1YmIgPSB0aGlzLnN0dWI7IHN0dWJiOyBzdHViYiA9IHN0dWJiLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHN0dWJiLndyYXBwZWRNZXRob2QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R1YmIud3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCB3cmFwcGVkIG1ldGhvZFwiKTtcbiAgICB9LFxuXG4gICAgb25DYWxsOiBmdW5jdGlvbiBvbkNhbGwoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vbkNhbGwoaW5kZXgpO1xuICAgIH0sXG5cbiAgICBvbkZpcnN0Q2FsbDogZnVuY3Rpb24gb25GaXJzdENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0dWIub25GaXJzdENhbGwoKTtcbiAgICB9LFxuXG4gICAgb25TZWNvbmRDYWxsOiBmdW5jdGlvbiBvblNlY29uZENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0dWIub25TZWNvbmRDYWxsKCk7XG4gICAgfSxcblxuICAgIG9uVGhpcmRDYWxsOiBmdW5jdGlvbiBvblRoaXJkQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vblRoaXJkQ2FsbCgpO1xuICAgIH0sXG5cbiAgICB3aXRoQXJnczogZnVuY3Rpb24gd2l0aEFyZ3MoLyogYXJndW1lbnRzICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdEZWZpbmluZyBhIHN0dWIgYnkgaW52b2tpbmcgXCJzdHViLm9uQ2FsbCguLi4pLndpdGhBcmdzKC4uLilcIiAnICtcbiAgICAgICAgICAgICAgICAnaXMgbm90IHN1cHBvcnRlZC4gVXNlIFwic3R1Yi53aXRoQXJncyguLi4pLm9uQ2FsbCguLi4pXCIgJyArXG4gICAgICAgICAgICAgICAgXCJ0byBkZWZpbmUgc2VxdWVudGlhbCBiZWhhdmlvciBmb3IgY2FsbHMgd2l0aCBjZXJ0YWluIGFyZ3VtZW50cy5cIixcbiAgICAgICAgKTtcbiAgICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlQmVoYXZpb3IoYmVoYXZpb3JNZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvciA9IHRoaXMuZGVmYXVsdEJlaGF2aW9yIHx8IHByb3RvLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QmVoYXZpb3JbYmVoYXZpb3JNZXRob2RdLmFwcGx5KFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0QmVoYXZpb3IsXG4gICAgICAgICAgICBhcmd1bWVudHMsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGFkZEJlaGF2aW9yKHN0dWIsIG5hbWUsIGZuKSB7XG4gICAgcHJvdG9bbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGNvbmNhdChbdGhpc10sIHNsaWNlKGFyZ3VtZW50cykpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1YiB8fCB0aGlzO1xuICAgIH07XG5cbiAgICBzdHViW25hbWVdID0gY3JlYXRlQmVoYXZpb3IobmFtZSk7XG59XG5cbnByb3RvLmFkZEJlaGF2aW9yID0gYWRkQmVoYXZpb3I7XG5wcm90by5jcmVhdGVCZWhhdmlvciA9IGNyZWF0ZUJlaGF2aW9yO1xuXG5jb25zdCBhc3luY0JlaGF2aW9ycyA9IGV4cG9ydEFzeW5jQmVoYXZpb3JzKHByb3RvKTtcblxudmFyIGJlaGF2aW9yID0gZXh0ZW5kLm5vbkVudW0oe30sIHByb3RvLCBhc3luY0JlaGF2aW9ycyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmVoYXZpb3I7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29tcGFyZXMgYSBgdmFsdWVgIHRvIGBOYU5gXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiBgdmFsdWVgIGlzIGBOYU5gXG4gKi9cbmZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgLy8gVW5saWtlIGdsb2JhbCBgaXNOYU5gLCB0aGlzIGZ1bmN0aW9uIGF2b2lkcyB0eXBlIGNvZXJjaW9uXG4gICAgLy8gYHR5cGVvZmAgY2hlY2sgYXZvaWRzIElFIGhvc3Qgb2JqZWN0IGlzc3VlcywgaGF0IHRpcCB0b1xuICAgIC8vIGxvZGFzaFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTmFOO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gYHZhbHVlYCBpcyBgLTBgXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5pc05lZ1plcm9cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCB3aGVuIGB2YWx1ZWAgaXMgYC0wYFxuICovXG5mdW5jdGlvbiBpc05lZ1plcm8odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlID09PSAtSW5maW5pdHk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOZWdaZXJvO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNOYU4gPSByZXF1aXJlKFwiLi9pcy1uYW5cIik7XG52YXIgaXNOZWdaZXJvID0gcmVxdWlyZShcIi4vaXMtbmVnLXplcm9cIik7XG5cbi8qKlxuICogU3RyaWN0IGVxdWFsaXR5IGNoZWNrIGFjY29yZGluZyB0byBFY21hU2NyaXB0IEhhcm1vbnkncyBgZWdhbGAuXG4gKlxuICogKipGcm9tIHRoZSBIYXJtb255IHdpa2k6KipcbiAqID4gQW4gYGVnYWxgIGZ1bmN0aW9uIHNpbXBseSBtYWtlcyBhdmFpbGFibGUgdGhlIGludGVybmFsIGBTYW1lVmFsdWVgIGZ1bmN0aW9uXG4gKiA+IGZyb20gc2VjdGlvbiA5LjEyIG9mIHRoZSBFUzUgc3BlYy4gSWYgdHdvIHZhbHVlcyBhcmUgZWdhbCwgdGhlbiB0aGV5IGFyZSBub3RcbiAqID4gb2JzZXJ2YWJseSBkaXN0aW5ndWlzaGFibGUuXG4gKlxuICogYGlkZW50aWNhbGAgcmV0dXJucyBgdHJ1ZWAgd2hlbiBgPT09YCBpcyBgdHJ1ZWAsIGV4Y2VwdCBmb3IgYC0wYCBhbmRcbiAqIGArMGAsIHdoZXJlIGl0IHJldHVybnMgYGZhbHNlYC4gQWRkaXRpb25hbGx5LCBpdCByZXR1cm5zIGB0cnVlYCB3aGVuXG4gKiBgTmFOYCBpcyBjb21wYXJlZCB0byBpdHNlbGYuXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5pZGVudGljYWxcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqMSBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICogQHBhcmFtIHt1bmtub3dufSBvYmoyIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIHdoZW4gdGhlIG9iamVjdHMgYXJlICplZ2FsKiwgYGZhbHNlYCBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gaWRlbnRpY2FsKG9iajEsIG9iajIpIHtcbiAgICBpZiAob2JqMSA9PT0gb2JqMiB8fCAoaXNOYU4ob2JqMSkgJiYgaXNOYU4ob2JqMikpKSB7XG4gICAgICAgIHJldHVybiBvYmoxICE9PSAwIHx8IGlzTmVnWmVybyhvYmoxKSA9PT0gaXNOZWdaZXJvKG9iajIpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGljYWw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMub2JqZWN0LnRvU3RyaW5nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGludGVybmFsIGBDbGFzc2AgYnkgY2FsbGluZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2BcbiAqIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlIGFzIGB0aGlzYC4gUmV0dXJuIHZhbHVlIGlzIGEgYFN0cmluZ2AsIG5hbWluZyB0aGVcbiAqIGludGVybmFsIGNsYXNzLCBlLmcuIFwiQXJyYXlcIlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHsqfSB2YWx1ZSAtIEFueSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ30gLSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYENsYXNzYCBvZiBgdmFsdWVgXG4gKi9cbmZ1bmN0aW9uIGdldENsYXNzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS5zcGxpdCgvWyBcXF1dLylbMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0Q2xhc3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnZXRDbGFzcyA9IHJlcXVpcmUoXCIuL2dldC1jbGFzc1wiKTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGBvYmplY3RgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLmlzQXJndW1lbnRzXG4gKiBAcGFyYW0gIHt1bmtub3dufSAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKG9iamVjdCkge1xuICAgIHJldHVybiBnZXRDbGFzcyhvYmplY3QpID09PSBcIkFyZ3VtZW50c1wiO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZGl2ID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBgb2JqZWN0YCBpcyBhIERPTSBlbGVtZW50IG5vZGUuXG4gKlxuICogVW5saWtlIFVuZGVyc2NvcmUuanMvbG9kYXNoLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgYG9iamVjdGBcbiAqIGlzIGFuICplbGVtZW50LWxpa2UqIG9iamVjdCwgaS5lLiBhIHJlZ3VsYXIgb2JqZWN0IHdpdGggYSBgbm9kZVR5cGVgXG4gKiBwcm9wZXJ0eSB0aGF0IGhvbGRzIHRoZSB2YWx1ZSBgMWAuXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5pc0VsZW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgZm9yIERPTSBlbGVtZW50IG5vZGVzXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCB8fCBvYmplY3Qubm9kZVR5cGUgIT09IDEgfHwgIWRpdikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIG9iamVjdC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICBvYmplY3QucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFbGVtZW50O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIFNldCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLmlzU2V0XG4gKiBAcGFyYW0gIHt1bmtub3dufSAgdmFsIC0gQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgU2V0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1NldCh2YWwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsIGluc3RhbmNlb2YgU2V0KSB8fCBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1NldDtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGB2YWx1ZWAgaXMgYSBNYXBcbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCB3aGVuIGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYE1hcGAsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc01hcCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwgIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLnR5cGVEZXRlY3QgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHByb21pc2VFeGlzdHMgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB2YXIgZ2xvYmFsT2JqZWN0ID0gKGZ1bmN0aW9uIChPYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iaiwgJ3R5cGVEZXRlY3RHbG9iYWxPYmplY3QnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZ2xvYmFsID0gdHlwZURldGVjdEdsb2JhbE9iamVjdDtcbiAgICAgICAgZGVsZXRlIE9iai50eXBlRGV0ZWN0R2xvYmFsT2JqZWN0O1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH0pKE9iamVjdC5wcm90b3R5cGUpO1xuICAgIHZhciBzeW1ib2xFeGlzdHMgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbiAgICB2YXIgbWFwRXhpc3RzID0gdHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgdmFyIHNldEV4aXN0cyA9IHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnO1xuICAgIHZhciB3ZWFrTWFwRXhpc3RzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xuICAgIHZhciB3ZWFrU2V0RXhpc3RzID0gdHlwZW9mIFdlYWtTZXQgIT09ICd1bmRlZmluZWQnO1xuICAgIHZhciBkYXRhVmlld0V4aXN0cyA9IHR5cGVvZiBEYXRhVmlldyAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgdmFyIHN5bWJvbEl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnO1xuICAgIHZhciBzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyA9IHN5bWJvbEV4aXN0cyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnICE9PSAndW5kZWZpbmVkJztcbiAgICB2YXIgc2V0RW50cmllc0V4aXN0cyA9IHNldEV4aXN0cyAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xuICAgIHZhciBtYXBFbnRyaWVzRXhpc3RzID0gbWFwRXhpc3RzICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIHNldEl0ZXJhdG9yUHJvdG90eXBlID0gc2V0RW50cmllc0V4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IFNldCgpLmVudHJpZXMoKSk7XG4gICAgdmFyIG1hcEl0ZXJhdG9yUHJvdG90eXBlID0gbWFwRW50cmllc0V4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IE1hcCgpLmVudHJpZXMoKSk7XG4gICAgdmFyIGFycmF5SXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIGFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBhcnJheUl0ZXJhdG9yRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICAgIHZhciBzdHJpbmdJdGVyYXRvckV4aXN0cyA9IHN5bWJvbEl0ZXJhdG9yRXhpc3RzICYmIHR5cGVvZiBTdHJpbmcucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlID0gc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG4gICAgdmFyIHRvU3RyaW5nTGVmdFNsaWNlTGVuZ3RoID0gODtcbiAgICB2YXIgdG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoID0gLTE7XG4gICAgZnVuY3Rpb24gdHlwZURldGVjdChvYmopIHtcbiAgICAgICAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gICAgICAgIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mT2JqO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iaiA9PT0gZ2xvYmFsT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2dsb2JhbCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJlxuICAgICAgICAgICAgKHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID09PSBmYWxzZSB8fCAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBvYmopKSkge1xuICAgICAgICAgICAgcmV0dXJuICdBcnJheSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmIHdpbmRvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYXRpb24gPT09ICdvYmplY3QnICYmIG9iaiA9PT0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdMb2NhdGlvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5kb2N1bWVudCA9PT0gJ29iamVjdCcgJiYgb2JqID09PSB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0RvY3VtZW50JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubWltZVR5cGVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICBvYmogPT09IHdpbmRvdy5uYXZpZ2F0b3IubWltZVR5cGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnTWltZVR5cGVBcnJheSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICBvYmogPT09IHdpbmRvdy5uYXZpZ2F0b3IucGx1Z2lucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1BsdWdpbkFycmF5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgPT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93LkhUTUxFbGVtZW50ID09PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAgICBvYmogaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT09ICdCTE9DS1FVT1RFJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0hUTUxRdW90ZUVsZW1lbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT09ICdURCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT09ICdUSCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzdHJpbmdUYWcgPSAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgJiYgb2JqW1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICAgICAgICBpZiAodHlwZW9mIHN0cmluZ1RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdUYWc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9ialByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgICBpZiAob2JqUHJvdG90eXBlID09PSBSZWdFeHAucHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1JlZ0V4cCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ialByb3RvdHlwZSA9PT0gRGF0ZS5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiAnRGF0ZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21pc2VFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBQcm9taXNlLnByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuICdQcm9taXNlJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gU2V0LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuICdTZXQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBNYXAucHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01hcCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlYWtTZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrU2V0LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuICdXZWFrU2V0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAod2Vha01hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFdlYWtNYXAucHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1dlYWtNYXAnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhVmlld0V4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IERhdGFWaWV3LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuICdEYXRhVmlldyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IG1hcEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01hcCBJdGVyYXRvcic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IHNldEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1NldCBJdGVyYXRvcic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBhcnJheUl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0FycmF5IEl0ZXJhdG9yJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBzdHJpbmdJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuICdTdHJpbmcgSXRlcmF0b3InO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmpQcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnT2JqZWN0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0XG4gICAgICAgICAgICAucHJvdG90eXBlXG4gICAgICAgICAgICAudG9TdHJpbmdcbiAgICAgICAgICAgIC5jYWxsKG9iailcbiAgICAgICAgICAgIC5zbGljZSh0b1N0cmluZ0xlZnRTbGljZUxlbmd0aCwgdG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZURldGVjdDtcblxufSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQVJSQVlfVFlQRVMgPSBbXG4gICAgQXJyYXksXG4gICAgSW50OEFycmF5LFxuICAgIFVpbnQ4QXJyYXksXG4gICAgVWludDhDbGFtcGVkQXJyYXksXG4gICAgSW50MTZBcnJheSxcbiAgICBVaW50MTZBcnJheSxcbiAgICBJbnQzMkFycmF5LFxuICAgIFVpbnQzMkFycmF5LFxuICAgIEZsb2F0MzJBcnJheSxcbiAgICBGbG9hdDY0QXJyYXksXG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFSUkFZX1RZUEVTO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmluZGV4T2Y7XG52YXIgbWFwID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5tYXA7XG52YXIgQVJSQVlfVFlQRVMgPSByZXF1aXJlKFwiLi9hcnJheS10eXBlc1wiKTtcbnZhciB0eXBlID0gcmVxdWlyZShcInR5cGUtZGV0ZWN0XCIpO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYW4gYXJyYXkgdHlwZSwgYGZhbHNlYCBvdGhlcndpc2VcbiAqXG4gKiBAcGFyYW0gIHsqfSAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYW4gYXJyYXkgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNBcnJheVR5cGUob2JqZWN0KSB7XG4gICAgcmV0dXJuIGluZGV4T2YobWFwKEFSUkFZX1RZUEVTLCBmdW5jdGlvbk5hbWUpLCB0eXBlKG9iamVjdCkpICE9PSAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5VHlwZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtEYXRlfSAgdmFsdWUgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtib29sZWFufSAgICAgYHRydWVgIHdoZW4gYHZhbHVlYCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNEYXRlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGFuIGl0ZXJhYmxlLCBgZmFsc2VgIG90aGVyd2lzZVxuICogQGFsaWFzIG1vZHVsZTpzYW1zYW0uaXNJdGVyYWJsZVxuICogQHBhcmFtICB7dW5rbm93bn0gIHZhbCAtIEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGFuIGl0ZXJhYmxlLCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbCkge1xuICAgIC8vIGNoZWNrcyBmb3IgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgaWYgKHR5cGVvZiB2YWwgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHZhbFtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJdGVyYWJsZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyBhIHJlZ3VsYXIgT2JqZWN0IGFuZCBub3QgYSBzcGVjaWFsaXplZCBPYmplY3RcbiAqXG4gKiBUaGlzIGhlbHBzIHNwZWVkIHVwIGRlZXBFcXVhbCBjeWNsaWMgY2hlY2tzXG4gKlxuICogVGhlIHByZW1pc2UgaXMgdGhhdCBvbmx5IE9iamVjdHMgYXJlIHN0b3JlZCBpbiB0aGUgdmlzaXRlZCBhcnJheS5cbiAqIFNvIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgd2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGVcbiAqIGV4cGVuc2l2ZSBvcGVyYXRpb24gb2Ygc2VhcmNoaW5nIGZvciB0aGUgdmFsdWUgaW4gdGhlIHRoZSBhcnJheSBvZiBhbHJlYWR5XG4gKiB2aXNpdGVkIG9iamVjdHNcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7b2JqZWN0fSAgIHZhbHVlIFRoZSBvYmplY3QgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59ICAgICAgIGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgYSBub24tc3BlY2lhbGlzZWQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgIC8vIG5vbmUgb2YgdGhlc2UgYXJlIGNvbGxlY3Rpb24gb2JqZWN0cywgc28gd2UgY2FuIHJldHVybiBmYWxzZVxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpICYmXG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZylcbiAgICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuc2V0LmZvckVhY2g7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBgczFgIGlzIGEgc3Vic2V0IG9mIGBzMmAsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0FycmF5fFNldH0gIHMxICAgICAgVGhlIHRhcmdldCB2YWx1ZVxuICogQHBhcmFtICB7QXJyYXl8U2V0fSAgczIgICAgICBUaGUgY29udGFpbmluZyB2YWx1ZVxuICogQHBhcmFtICB7RnVuY3Rpb259ICBjb21wYXJlIEEgY29tcGFyaXNvbiBmdW5jdGlvbiwgc2hvdWxkIHJldHVybiBgdHJ1ZWAgd2hlblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVhbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIHdoZW4gYHMxYCBpcyBhIHN1YnNldCBvZiBgczJgLCBgZmFsc2VgYCBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gaXNTdWJzZXQoczEsIHMyLCBjb21wYXJlKSB7XG4gICAgdmFyIGFsbENvbnRhaW5lZCA9IHRydWU7XG4gICAgZm9yRWFjaChzMSwgZnVuY3Rpb24gKHYxKSB7XG4gICAgICAgIHZhciBpbmNsdWRlcyA9IGZhbHNlO1xuICAgICAgICBmb3JFYWNoKHMyLCBmdW5jdGlvbiAodjIpIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlKHYyLCB2MSkpIHtcbiAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBhbGxDb250YWluZWQgPSBhbGxDb250YWluZWQgJiYgaW5jbHVkZXM7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWxsQ29udGFpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3Vic2V0O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG52YXIgY2xhc3NOYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuY2xhc3NOYW1lO1xudmFyIHR5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnR5cGVPZjtcbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBtYXBGb3JFYWNoID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5tYXAuZm9yRWFjaDtcblxudmFyIGdldENsYXNzID0gcmVxdWlyZShcIi4vZ2V0LWNsYXNzXCIpO1xudmFyIGlkZW50aWNhbCA9IHJlcXVpcmUoXCIuL2lkZW50aWNhbFwiKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoXCIuL2lzLWFyZ3VtZW50c1wiKTtcbnZhciBpc0FycmF5VHlwZSA9IHJlcXVpcmUoXCIuL2lzLWFycmF5LXR5cGVcIik7XG52YXIgaXNEYXRlID0gcmVxdWlyZShcIi4vaXMtZGF0ZVwiKTtcbnZhciBpc0VsZW1lbnQgPSByZXF1aXJlKFwiLi9pcy1lbGVtZW50XCIpO1xudmFyIGlzSXRlcmFibGUgPSByZXF1aXJlKFwiLi9pcy1pdGVyYWJsZVwiKTtcbnZhciBpc01hcCA9IHJlcXVpcmUoXCIuL2lzLW1hcFwiKTtcbnZhciBpc05hTiA9IHJlcXVpcmUoXCIuL2lzLW5hblwiKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoXCIuL2lzLW9iamVjdFwiKTtcbnZhciBpc1NldCA9IHJlcXVpcmUoXCIuL2lzLXNldFwiKTtcbnZhciBpc1N1YnNldCA9IHJlcXVpcmUoXCIuL2lzLXN1YnNldFwiKTtcblxudmFyIGNvbmNhdCA9IGFycmF5UHJvdG8uY29uY2F0O1xudmFyIGV2ZXJ5ID0gYXJyYXlQcm90by5ldmVyeTtcbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xuXG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG52YXIgaW5kZXhPZiA9IGFycmF5UHJvdG8uaW5kZXhPZjtcbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBXZSBleHBsaWNpdGx5IHdhbnQgdG8gZ2V0IHByb3BzIG9uIHByb3RvIGNoYWluXG4gKlxuICogT2JqZWN0cyBzdWNoIGFzIFVSTCBpbiB0aGUgYnJvd3NlciBkbyBub3QgaGF2ZSBhbnlcbiAqIGVudW1lcmFibGUga2V5cyBvZiBpdHMgb3duLiBBbGwgbWVhbmluZ2Z1bCBwcm9wc1xuICogdG8gY29tcGFyZSBhcmUgZW51bWVyYWJsZSBnZXR0ZXJzIGZ1cnRoZXIgdXAgdGhlIGNoYWluXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gdGhlIGxpc3Qgb2YgZW51bWVyYWJsZSBrZXlzXG4gKi9cbmZ1bmN0aW9uIGFsbEVudW1lcmFibGVLZXlzSW5Qcm90b0NoYWluKG9iamVjdCkge1xuICAgIGNvbnN0IGVudW1lcmFibGVLZXlzID0gW107XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgZW51bWVyYWJsZUtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gZW51bWVyYWJsZUtleXM7XG59XG5cbi8qKlxuICogQXJyYXktbGlrZSB2YWx1ZXMgc2hvdWxkIG9ubHkgY29tcGFyZSB0aGVpciBvd24gZW51bWVyYWJsZSBrZXlzLlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCB3aGVuIHByb3RvdHlwZS1jaGFpbiBrZXlzIHNob3VsZCBiZSBjb21wYXJlZFxuICovXG5mdW5jdGlvbiBzaG91bGRDb21wYXJlUHJvdG90eXBlRW51bWVyYWJsZUtleXMob2JqZWN0KSB7XG4gICAgcmV0dXJuICFpc0FycmF5VHlwZShvYmplY3QpICYmICFpc0FyZ3VtZW50cyhvYmplY3QpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGVudW1lcmFibGUgc3RyaW5nIGtleXMgcmVsZXZhbnQgZm9yIGRlZXAgZXF1YWxpdHkuXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gZW51bWVyYWJsZSBzdHJpbmcga2V5cyB0byBjb21wYXJlXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVTdHJpbmdLZXlzKG9iamVjdCkge1xuICAgIC8vIEJ1ZmZlcnMgYW5kIHR5cGVkIGFycmF5cyBjYW4gZXhwb3NlIGluaGVyaXRlZCBhY2Nlc3NvcnMgbGlrZSBgb2Zmc2V0YC5cbiAgICAvLyBUaG9zZSB2YWx1ZXMgcmVmbGVjdCBwb29sZWQgYmFja2luZy1zdG9yZSBsYXlvdXQsIG5vdCBsb2dpY2FsIGNvbnRlbnQuXG4gICAgcmV0dXJuIHNob3VsZENvbXBhcmVQcm90b3R5cGVFbnVtZXJhYmxlS2V5cyhvYmplY3QpXG4gICAgICAgID8gYWxsRW51bWVyYWJsZUtleXNJblByb3RvQ2hhaW4ob2JqZWN0KVxuICAgICAgICA6IG9iamVjdEtleXMob2JqZWN0KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbGwgZXhwZWN0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5cyBhcmUgcHJlc2VudC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYWN0dWFsS2V5c1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBleHBlY3RlZEtleXNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgd2hlbiBhbGwgZXhwZWN0ZWQga2V5cyBhcmUgcHJlc2VudFxuICovXG5mdW5jdGlvbiBoYXNBbGxFbnVtZXJhYmxlU3RyaW5nS2V5cyhhY3R1YWxLZXlzLCBleHBlY3RlZEtleXMpIHtcbiAgICByZXR1cm4gZXZlcnkoZXhwZWN0ZWRLZXlzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBpbmRleE9mKGFjdHVhbEtleXMsIGtleSkgIT09IC0xO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIERlZXAgZXF1YWwgY29tcGFyaXNvbi4gVHdvIHZhbHVlcyBhcmUgXCJkZWVwIGVxdWFsXCIgd2hlbjpcbiAqXG4gKiAtIFRoZXkgYXJlIGVxdWFsLCBhY2NvcmRpbmcgdG8gc2Ftc2FtLmlkZW50aWNhbFxuICogLSBUaGV5IGFyZSBib3RoIGRhdGUgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHNhbWUgdGltZVxuICogLSBUaGV5IGFyZSBib3RoIGFycmF5cyBjb250YWluaW5nIGVsZW1lbnRzIHRoYXQgYXJlIGFsbCBkZWVwRXF1YWxcbiAqIC0gVGhleSBhcmUgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLCBhbmQgZWFjaCBwcm9wZXJ0eVxuICogaW4gYGBhY3R1YWxgYCBpcyBkZWVwRXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaW4gYGBleHBlY3RhdGlvbmBgXG4gKlxuICogU3VwcG9ydHMgY3ljbGljIG9iamVjdHMuXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5kZWVwRXF1YWxcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsIFRoZSBvYmplY3QgdG8gZXhhbWluZVxuICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RhdGlvbiBUaGUgb2JqZWN0IGFjdHVhbCBpcyBleHBlY3RlZCB0byBiZSBlcXVhbCB0b1xuICogQHBhcmFtIHtvYmplY3R9IG1hdGNoIEEgdmFsdWUgdG8gbWF0Y2ggb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgd2hlbiBhY3R1YWwgYW5kIGV4cGVjdGF0aW9uIGFyZSBjb25zaWRlcmVkIGVxdWFsXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbEN5Y2xpYyhhY3R1YWwsIGV4cGVjdGF0aW9uLCBtYXRjaCkge1xuICAgIC8vIHVzZWQgZm9yIGN5Y2xpYyBjb21wYXJpc29uXG4gICAgLy8gY29udGFpbiBhbHJlYWR5IHZpc2l0ZWQgb2JqZWN0c1xuICAgIHZhciBhY3R1YWxPYmplY3RzID0gW107XG4gICAgdmFyIGV4cGVjdGF0aW9uT2JqZWN0cyA9IFtdO1xuICAgIC8vIGNvbnRhaW4gcGF0aGVzIChwb3NpdGlvbiBpbiB0aGUgb2JqZWN0IHN0cnVjdHVyZSlcbiAgICAvLyBvZiB0aGUgYWxyZWFkeSB2aXNpdGVkIG9iamVjdHNcbiAgICAvLyBpbmRleGVzIHNhbWUgYXMgaW4gb2JqZWN0cyBhcnJheXNcbiAgICB2YXIgYWN0dWFsUGF0aHMgPSBbXTtcbiAgICB2YXIgZXhwZWN0YXRpb25QYXRocyA9IFtdO1xuICAgIC8vIGNvbnRhaW5zIGNvbWJpbmF0aW9ucyBvZiBhbHJlYWR5IGNvbXBhcmVkIG9iamVjdHNcbiAgICAvLyBpbiB0aGUgbWFubmVyOiB7IFwiJDFbJ3JlZiddJDJbJ3JlZiddXCI6IHRydWUgfVxuICAgIHZhciBjb21wYXJlZCA9IHt9O1xuXG4gICAgLy8gZG9lcyB0aGUgcmVjdXJzaW9uIGZvciB0aGUgZGVlcCBlcXVhbCBjaGVja1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgcmV0dXJuIChmdW5jdGlvbiBkZWVwRXF1YWwoXG4gICAgICAgIGFjdHVhbE9iaixcbiAgICAgICAgZXhwZWN0YXRpb25PYmosXG4gICAgICAgIGFjdHVhbFBhdGgsXG4gICAgICAgIGV4cGVjdGF0aW9uUGF0aCxcbiAgICApIHtcbiAgICAgICAgLy8gSWYgYm90aCBhcmUgbWF0Y2hlcnMgdGhleSBtdXN0IGJlIHRoZSBzYW1lIGluc3RhbmNlIGluIG9yZGVyIHRvIGJlXG4gICAgICAgIC8vIGNvbnNpZGVyZWQgZXF1YWwgSWYgd2UgZGlkbid0IGRvIHRoYXQgd2Ugd291bGQgZW5kIHVwIHJ1bm5pbmcgb25lXG4gICAgICAgIC8vIG1hdGNoZXIgYWdhaW5zdCB0aGUgb3RoZXJcbiAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmlzTWF0Y2hlcihleHBlY3RhdGlvbk9iaikpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaC5pc01hdGNoZXIoYWN0dWFsT2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxPYmogPT09IGV4cGVjdGF0aW9uT2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uT2JqLnRlc3QoYWN0dWFsT2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3R1YWxUeXBlID0gdHlwZW9mIGFjdHVhbE9iajtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uVHlwZSA9IHR5cGVvZiBleHBlY3RhdGlvbk9iajtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBhY3R1YWxPYmogPT09IGV4cGVjdGF0aW9uT2JqIHx8XG4gICAgICAgICAgICBpc05hTihhY3R1YWxPYmopIHx8XG4gICAgICAgICAgICBpc05hTihleHBlY3RhdGlvbk9iaikgfHxcbiAgICAgICAgICAgIGFjdHVhbE9iaiA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgZXhwZWN0YXRpb25PYmogPT09IG51bGwgfHxcbiAgICAgICAgICAgIGFjdHVhbE9iaiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBleHBlY3RhdGlvbk9iaiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBhY3R1YWxUeXBlICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICAgICBleHBlY3RhdGlvblR5cGUgIT09IFwib2JqZWN0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gaWRlbnRpY2FsKGFjdHVhbE9iaiwgZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWxlbWVudHMgYXJlIG9ubHkgZXF1YWwgaWYgaWRlbnRpY2FsKGV4cGVjdGVkLCBhY3R1YWwpXG4gICAgICAgIGlmIChpc0VsZW1lbnQoYWN0dWFsT2JqKSB8fCBpc0VsZW1lbnQoZXhwZWN0YXRpb25PYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXNBY3R1YWxEYXRlID0gaXNEYXRlKGFjdHVhbE9iaik7XG4gICAgICAgIHZhciBpc0V4cGVjdGF0aW9uRGF0ZSA9IGlzRGF0ZShleHBlY3RhdGlvbk9iaik7XG4gICAgICAgIGlmIChpc0FjdHVhbERhdGUgfHwgaXNFeHBlY3RhdGlvbkRhdGUpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaXNBY3R1YWxEYXRlIHx8XG4gICAgICAgICAgICAgICAgIWlzRXhwZWN0YXRpb25EYXRlIHx8XG4gICAgICAgICAgICAgICAgZ2V0VGltZS5jYWxsKGFjdHVhbE9iaikgIT09IGdldFRpbWUuY2FsbChleHBlY3RhdGlvbk9iailcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxPYmogaW5zdGFuY2VvZiBSZWdFeHAgJiYgZXhwZWN0YXRpb25PYmogaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVRvU3RyaW5nKGFjdHVhbE9iaikgIT09IHZhbHVlVG9TdHJpbmcoZXhwZWN0YXRpb25PYmopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdHVhbE9iaiBpbnN0YW5jZW9mIFByb21pc2UgJiYgZXhwZWN0YXRpb25PYmogaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxPYmogaW5zdGFuY2VvZiBFcnJvciAmJiBleHBlY3RhdGlvbk9iaiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3R1YWxDbGFzcyA9IGdldENsYXNzKGFjdHVhbE9iaik7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbkNsYXNzID0gZ2V0Q2xhc3MoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB2YXIgYWN0dWFsS2V5cyA9IGdldEVudW1lcmFibGVTdHJpbmdLZXlzKGFjdHVhbE9iaik7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbktleXMgPSBnZXRFbnVtZXJhYmxlU3RyaW5nS2V5cyhleHBlY3RhdGlvbk9iaik7XG4gICAgICAgIHZhciBhY3R1YWxOYW1lID0gY2xhc3NOYW1lKGFjdHVhbE9iaik7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbk5hbWUgPSBjbGFzc05hbWUoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25TeW1ib2xzID1cbiAgICAgICAgICAgIHR5cGVPZihnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICA/IGdldE93blByb3BlcnR5U3ltYm9scyhleHBlY3RhdGlvbk9iailcbiAgICAgICAgICAgICAgICA6IC8qIGM4IGlnbm9yZSBuZXh0OiBjYW5ub3QgY29sbGVjdCBjb3ZlcmFnZSBmb3IgZW5naW5lIHRoYXQgZG9lc24ndCBzdXBwb3J0IFN5bWJvbCAqL1xuICAgICAgICAgICAgICAgICAgW107XG4gICAgICAgIHZhciBleHBlY3RhdGlvbktleXNBbmRTeW1ib2xzID0gY29uY2F0KFxuICAgICAgICAgICAgZXhwZWN0YXRpb25LZXlzLFxuICAgICAgICAgICAgZXhwZWN0YXRpb25TeW1ib2xzLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpc0FyZ3VtZW50cyhhY3R1YWxPYmopIHx8IGlzQXJndW1lbnRzKGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgaWYgKGFjdHVhbE9iai5sZW5ndGggIT09IGV4cGVjdGF0aW9uT2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3R1YWxUeXBlICE9PSBleHBlY3RhdGlvblR5cGUgfHxcbiAgICAgICAgICAgICAgICBhY3R1YWxDbGFzcyAhPT0gZXhwZWN0YXRpb25DbGFzcyB8fFxuICAgICAgICAgICAgICAgIGFjdHVhbEtleXMubGVuZ3RoICE9PSBleHBlY3RhdGlvbktleXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgIWhhc0FsbEVudW1lcmFibGVTdHJpbmdLZXlzKGFjdHVhbEtleXMsIGV4cGVjdGF0aW9uS2V5cykgfHxcbiAgICAgICAgICAgICAgICAhaGFzQWxsRW51bWVyYWJsZVN0cmluZ0tleXMoZXhwZWN0YXRpb25LZXlzLCBhY3R1YWxLZXlzKSB8fFxuICAgICAgICAgICAgICAgIChhY3R1YWxOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxOYW1lICE9PSBleHBlY3RhdGlvbk5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTZXQoYWN0dWFsT2JqKSB8fCBpc1NldChleHBlY3RhdGlvbk9iaikpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaXNTZXQoYWN0dWFsT2JqKSB8fFxuICAgICAgICAgICAgICAgICFpc1NldChleHBlY3RhdGlvbk9iaikgfHxcbiAgICAgICAgICAgICAgICBhY3R1YWxPYmouc2l6ZSAhPT0gZXhwZWN0YXRpb25PYmouc2l6ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXNTdWJzZXQoYWN0dWFsT2JqLCBleHBlY3RhdGlvbk9iaiwgZGVlcEVxdWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01hcChhY3R1YWxPYmopIHx8IGlzTWFwKGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFpc01hcChhY3R1YWxPYmopIHx8XG4gICAgICAgICAgICAgICAgIWlzTWFwKGV4cGVjdGF0aW9uT2JqKSB8fFxuICAgICAgICAgICAgICAgIGFjdHVhbE9iai5zaXplICE9PSBleHBlY3RhdGlvbk9iai5zaXplXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtYXBzRGVlcGx5RXF1YWwgPSB0cnVlO1xuICAgICAgICAgICAgbWFwRm9yRWFjaChhY3R1YWxPYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgbWFwc0RlZXBseUVxdWFsID1cbiAgICAgICAgICAgICAgICAgICAgbWFwc0RlZXBseUVxdWFsICYmXG4gICAgICAgICAgICAgICAgICAgIGRlZXBFcXVhbEN5Y2xpYyh2YWx1ZSwgZXhwZWN0YXRpb25PYmouZ2V0KGtleSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXBzRGVlcGx5RXF1YWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBqUXVlcnkgb2JqZWN0cyBoYXZlIGl0ZXJhdGlvbiBwcm90b2NvbHNcbiAgICAgICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9JdGVyYXRpb25fcHJvdG9jb2xzXG4gICAgICAgIC8vIEJ1dCwgdGhleSBkb24ndCB3b3JrIHdlbGwgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gY29uY2VybmluZyBpdGVyYWJsZXMgYmVsb3csXG4gICAgICAgIC8vIHNvIHdlIHdpbGwgZGV0ZWN0IHRoZW0gYW5kIHVzZSBqUXVlcnkncyBvd24gZXF1YWxpdHkgZnVuY3Rpb25cbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0OiB0aGlzIGNhbiBvbmx5IGJlIHRlc3RlZCBpbiB0aGUgYHRlc3QtaGVhZGxlc3NgIHNjcmlwdCAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgYWN0dWFsT2JqLmpxdWVyeSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGFjdHVhbE9iai5pcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdHVhbE9iai5pcyhleHBlY3RhdGlvbk9iaik7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cblxuICAgICAgICB2YXIgaXNBY3R1YWxOb25BcnJheUl0ZXJhYmxlID1cbiAgICAgICAgICAgIGlzSXRlcmFibGUoYWN0dWFsT2JqKSAmJlxuICAgICAgICAgICAgIWlzQXJyYXlUeXBlKGFjdHVhbE9iaikgJiZcbiAgICAgICAgICAgICFpc0FyZ3VtZW50cyhhY3R1YWxPYmopO1xuICAgICAgICB2YXIgaXNFeHBlY3RhdGlvbk5vbkFycmF5SXRlcmFibGUgPVxuICAgICAgICAgICAgaXNJdGVyYWJsZShleHBlY3RhdGlvbk9iaikgJiZcbiAgICAgICAgICAgICFpc0FycmF5VHlwZShleHBlY3RhdGlvbk9iaikgJiZcbiAgICAgICAgICAgICFpc0FyZ3VtZW50cyhleHBlY3RhdGlvbk9iaik7XG4gICAgICAgIGlmIChpc0FjdHVhbE5vbkFycmF5SXRlcmFibGUgfHwgaXNFeHBlY3RhdGlvbk5vbkFycmF5SXRlcmFibGUpIHtcbiAgICAgICAgICAgIHZhciBhY3R1YWxBcnJheSA9IEFycmF5LmZyb20oYWN0dWFsT2JqKTtcbiAgICAgICAgICAgIHZhciBleHBlY3RhdGlvbkFycmF5ID0gQXJyYXkuZnJvbShleHBlY3RhdGlvbk9iaik7XG4gICAgICAgICAgICBpZiAoYWN0dWFsQXJyYXkubGVuZ3RoICE9PSBleHBlY3RhdGlvbkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFycmF5RGVlcGx5RXF1YWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIGV2ZXJ5KGFjdHVhbEFycmF5LCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlEZWVwbHlFcXVhbHMgPVxuICAgICAgICAgICAgICAgICAgICBhcnJheURlZXBseUVxdWFscyAmJlxuICAgICAgICAgICAgICAgICAgICBkZWVwRXF1YWxDeWNsaWMoYWN0dWFsQXJyYXlba2V5XSwgZXhwZWN0YXRpb25BcnJheVtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXJyYXlEZWVwbHlFcXVhbHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXZlcnkoZXhwZWN0YXRpb25LZXlzQW5kU3ltYm9scywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIGFjdHVhbFZhbHVlID0gYWN0dWFsT2JqW2tleV07XG4gICAgICAgICAgICB2YXIgZXhwZWN0YXRpb25WYWx1ZSA9IGV4cGVjdGF0aW9uT2JqW2tleV07XG4gICAgICAgICAgICB2YXIgYWN0dWFsT2JqZWN0ID0gaXNPYmplY3QoYWN0dWFsVmFsdWUpO1xuICAgICAgICAgICAgdmFyIGV4cGVjdGF0aW9uT2JqZWN0ID0gaXNPYmplY3QoZXhwZWN0YXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmVzLCBpZiB0aGUgb2JqZWN0cyB3ZXJlIGFscmVhZHkgdmlzaXRlZFxuICAgICAgICAgICAgLy8gKGl0J3MgZmFzdGVyIHRvIGNoZWNrIGZvciBpc09iamVjdCBmaXJzdCwgdGhhbiB0b1xuICAgICAgICAgICAgLy8gZ2V0IC0xIGZyb20gZ2V0SW5kZXggZm9yIG5vbiBvYmplY3RzKVxuICAgICAgICAgICAgdmFyIGFjdHVhbEluZGV4ID0gYWN0dWFsT2JqZWN0XG4gICAgICAgICAgICAgICAgPyBpbmRleE9mKGFjdHVhbE9iamVjdHMsIGFjdHVhbFZhbHVlKVxuICAgICAgICAgICAgICAgIDogLTE7XG4gICAgICAgICAgICB2YXIgZXhwZWN0YXRpb25JbmRleCA9IGV4cGVjdGF0aW9uT2JqZWN0XG4gICAgICAgICAgICAgICAgPyBpbmRleE9mKGV4cGVjdGF0aW9uT2JqZWN0cywgZXhwZWN0YXRpb25WYWx1ZSlcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lcyB0aGUgbmV3IHBhdGhzIG9mIHRoZSBvYmplY3RzXG4gICAgICAgICAgICAvLyAtIGZvciBub24gY3ljbGljIG9iamVjdHMgdGhlIGN1cnJlbnQgcGF0aCB3aWxsIGJlIGV4dGVuZGVkXG4gICAgICAgICAgICAvLyAgIGJ5IGN1cnJlbnQgcHJvcGVydHkgbmFtZVxuICAgICAgICAgICAgLy8gLSBmb3IgY3ljbGljIG9iamVjdHMgdGhlIHN0b3JlZCBwYXRoIGlzIHRha2VuXG4gICAgICAgICAgICB2YXIgbmV3QWN0dWFsUGF0aCA9XG4gICAgICAgICAgICAgICAgYWN0dWFsSW5kZXggIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gYWN0dWFsUGF0aHNbYWN0dWFsSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgIDogYCR7YWN0dWFsUGF0aH1bJHtKU09OLnN0cmluZ2lmeShrZXkpfV1gO1xuICAgICAgICAgICAgdmFyIG5ld0V4cGVjdGF0aW9uUGF0aCA9XG4gICAgICAgICAgICAgICAgZXhwZWN0YXRpb25JbmRleCAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyBleHBlY3RhdGlvblBhdGhzW2V4cGVjdGF0aW9uSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgIDogYCR7ZXhwZWN0YXRpb25QYXRofVske0pTT04uc3RyaW5naWZ5KGtleSl9XWA7XG4gICAgICAgICAgICB2YXIgY29tYmluZWRQYXRoID0gbmV3QWN0dWFsUGF0aCArIG5ld0V4cGVjdGF0aW9uUGF0aDtcblxuICAgICAgICAgICAgLy8gc3RvcCByZWN1cnNpb24gaWYgY3VycmVudCBvYmplY3RzIGFyZSBhbHJlYWR5IGNvbXBhcmVkXG4gICAgICAgICAgICBpZiAoY29tcGFyZWRbY29tYmluZWRQYXRoXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZW1lbWJlciB0aGUgY3VycmVudCBvYmplY3RzIGFuZCB0aGVpciBwYXRoc1xuICAgICAgICAgICAgaWYgKGFjdHVhbEluZGV4ID09PSAtMSAmJiBhY3R1YWxPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBwdXNoKGFjdHVhbE9iamVjdHMsIGFjdHVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICBwdXNoKGFjdHVhbFBhdGhzLCBuZXdBY3R1YWxQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbkluZGV4ID09PSAtMSAmJiBleHBlY3RhdGlvbk9iamVjdCkge1xuICAgICAgICAgICAgICAgIHB1c2goZXhwZWN0YXRpb25PYmplY3RzLCBleHBlY3RhdGlvblZhbHVlKTtcbiAgICAgICAgICAgICAgICBwdXNoKGV4cGVjdGF0aW9uUGF0aHMsIG5ld0V4cGVjdGF0aW9uUGF0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoYXQgdGhlIGN1cnJlbnQgb2JqZWN0cyBhcmUgYWxyZWFkeSBjb21wYXJlZFxuICAgICAgICAgICAgaWYgKGFjdHVhbE9iamVjdCAmJiBleHBlY3RhdGlvbk9iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBhcmVkW2NvbWJpbmVkUGF0aF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgb2YgY3ljbGljIGxvZ2ljXG5cbiAgICAgICAgICAgIC8vIG5laXRoZXIgYWN0dWFsVmFsdWUgbm9yIGV4cGVjdGF0aW9uVmFsdWUgaXMgYSBjeWNsZVxuICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBuZXh0IGxldmVsXG4gICAgICAgICAgICByZXR1cm4gZGVlcEVxdWFsKFxuICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgbmV3QWN0dWFsUGF0aCxcbiAgICAgICAgICAgICAgICBuZXdFeHBlY3RhdGlvblBhdGgsXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9KShhY3R1YWwsIGV4cGVjdGF0aW9uLCBcIiQxXCIsIFwiJDJcIik7XG59XG5cbmRlZXBFcXVhbEN5Y2xpYy51c2UgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbEN5Y2xpYyhhLCBiLCBtYXRjaCk7XG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcEVxdWFsQ3ljbGljO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc2xpY2UgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZy5zbGljZTtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbmF0aW9uIG9mIGFuIGl0ZXJhYmxlIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gICB7b2JqZWN0fSBvYmogVGhlIGl0ZXJhYmxlIG9iamVjdCB0byBzdHJpbmdpZnlcbiAqIEByZXR1cm5zIHtzdHJpbmd9ICAgICBBIHN0cmluZyByZXByZXNlbnRhdGlvblxuICovXG5mdW5jdGlvbiBpdGVyYWJsZVRvU3RyaW5nKG9iaikge1xuICAgIGlmICh0eXBlT2Yob2JqKSA9PT0gXCJtYXBcIikge1xuICAgICAgICByZXR1cm4gbWFwVG9TdHJpbmcob2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2VuZXJpY0l0ZXJhYmxlVG9TdHJpbmcob2JqKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgTWFwXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtNYXB9IG1hcCAgICBUaGUgbWFwIHRvIHN0cmluZ2lmeVxuICogQHJldHVybnMge3N0cmluZ30gICAgIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIG1hcFRvU3RyaW5nKG1hcCkge1xuICAgIHZhciByZXByZXNlbnRhdGlvbiA9IFwiXCI7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICByZXByZXNlbnRhdGlvbiArPSBgWyR7c3RyaW5naWZ5KGtleSl9LCR7c3RyaW5naWZ5KHZhbHVlKX1dLGA7XG4gICAgfSk7XG5cbiAgICByZXByZXNlbnRhdGlvbiA9IHNsaWNlKHJlcHJlc2VudGF0aW9uLCAwLCAtMSk7XG4gICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbmF0aW9uIGZvciBhbiBpdGVyYWJsZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gICB7b2JqZWN0fSBpdGVyYWJsZSBUaGUgaXRlcmFibGUgdG8gc3RyaW5naWZ5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgICAgICBBIHN0cmluZyByZXByZXNlbnRhdGlvblxuICovXG5mdW5jdGlvbiBnZW5lcmljSXRlcmFibGVUb1N0cmluZyhpdGVyYWJsZSkge1xuICAgIHZhciByZXByZXNlbnRhdGlvbiA9IFwiXCI7XG5cbiAgICBpdGVyYWJsZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXByZXNlbnRhdGlvbiArPSBgJHtzdHJpbmdpZnkodmFsdWUpfSxgO1xuICAgIH0pO1xuXG4gICAgcmVwcmVzZW50YXRpb24gPSBzbGljZShyZXByZXNlbnRhdGlvbiwgMCwgLTEpO1xuICAgIHJldHVybiByZXByZXNlbnRhdGlvbjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXNzZWQgYGl0ZW1gXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge29iamVjdH0gaXRlbSBUaGUgaXRlbSB0byBzdHJpbmdpZnlcbiAqIEByZXR1cm5zIHtzdHJpbmd9ICAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYGl0ZW1gXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeShpdGVtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiID8gYCcke2l0ZW19J2AgOiB2YWx1ZVRvU3RyaW5nKGl0ZW0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGl0ZXJhYmxlVG9TdHJpbmc7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtYXRjaGVyUHJvdG90eXBlID0ge1xuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfSxcbn07XG5cbm1hdGNoZXJQcm90b3R5cGUub3IgPSBmdW5jdGlvbiAodmFsdWVPck1hdGNoZXIpIHtcbiAgICB2YXIgY3JlYXRlTWF0Y2hlciA9IHJlcXVpcmUoXCIuLi9jcmVhdGUtbWF0Y2hlclwiKTtcbiAgICB2YXIgaXNNYXRjaGVyID0gY3JlYXRlTWF0Y2hlci5pc01hdGNoZXI7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hdGNoZXIgZXhwZWN0ZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIG0yID0gaXNNYXRjaGVyKHZhbHVlT3JNYXRjaGVyKVxuICAgICAgICA/IHZhbHVlT3JNYXRjaGVyXG4gICAgICAgIDogY3JlYXRlTWF0Y2hlcih2YWx1ZU9yTWF0Y2hlcik7XG4gICAgdmFyIG0xID0gdGhpcztcbiAgICB2YXIgb3IgPSBPYmplY3QuY3JlYXRlKG1hdGNoZXJQcm90b3R5cGUpO1xuICAgIG9yLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiBtMS50ZXN0KGFjdHVhbCkgfHwgbTIudGVzdChhY3R1YWwpO1xuICAgIH07XG4gICAgb3IubWVzc2FnZSA9IGAke20xLm1lc3NhZ2V9Lm9yKCR7bTIubWVzc2FnZX0pYDtcbiAgICByZXR1cm4gb3I7XG59O1xuXG5tYXRjaGVyUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uICh2YWx1ZU9yTWF0Y2hlcikge1xuICAgIHZhciBjcmVhdGVNYXRjaGVyID0gcmVxdWlyZShcIi4uL2NyZWF0ZS1tYXRjaGVyXCIpO1xuICAgIHZhciBpc01hdGNoZXIgPSBjcmVhdGVNYXRjaGVyLmlzTWF0Y2hlcjtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF0Y2hlciBleHBlY3RlZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgbTIgPSBpc01hdGNoZXIodmFsdWVPck1hdGNoZXIpXG4gICAgICAgID8gdmFsdWVPck1hdGNoZXJcbiAgICAgICAgOiBjcmVhdGVNYXRjaGVyKHZhbHVlT3JNYXRjaGVyKTtcbiAgICB2YXIgbTEgPSB0aGlzO1xuICAgIHZhciBhbmQgPSBPYmplY3QuY3JlYXRlKG1hdGNoZXJQcm90b3R5cGUpO1xuICAgIGFuZC50ZXN0ID0gZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gbTEudGVzdChhY3R1YWwpICYmIG0yLnRlc3QoYWN0dWFsKTtcbiAgICB9O1xuICAgIGFuZC5tZXNzYWdlID0gYCR7bTEubWVzc2FnZX0uYW5kKCR7bTIubWVzc2FnZX0pYDtcbiAgICByZXR1cm4gYW5kO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaGVyUHJvdG90eXBlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMub2JqZWN0LmlzUHJvdG90eXBlT2Y7XG5cbnZhciBtYXRjaGVyUHJvdG90eXBlID0gcmVxdWlyZShcIi4vbWF0Y2hlci1wcm90b3R5cGVcIik7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBgb2JqZWN0YCBpcyBhIG1hdGNoZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3QgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiBgb2JqZWN0YCBpcyBhIG1hdGNoZXJcbiAqL1xuZnVuY3Rpb24gaXNNYXRjaGVyKG9iamVjdCkge1xuICAgIHJldHVybiBpc1Byb3RvdHlwZU9mKG1hdGNoZXJQcm90b3R5cGUsIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXRjaGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNNYXRjaGVyID0gcmVxdWlyZShcIi4vaXMtbWF0Y2hlclwiKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBUeXBlRXJyb3Igd2hlbiBgdmFsdWVgIGlzIG5vdCBhIG1hdGNoZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICovXG5mdW5jdGlvbiBhc3NlcnRNYXRjaGVyKHZhbHVlKSB7XG4gICAgaWYgKCFpc01hdGNoZXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYXRjaGVyIGV4cGVjdGVkXCIpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NlcnRNYXRjaGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFRocm93cyBhIFR5cGVFcnJvciB3aGVuIGV4cGVjdGVkIG1ldGhvZCBkb2Vzbid0IGV4aXN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gbG9vayBmb3JcbiAqIEBwYXJhbSB7bmFtZX0gbmFtZSBBIG5hbWUgdG8gdXNlIGZvciB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFBhdGggVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byB1c2UgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdoZW4gdGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydE1ldGhvZEV4aXN0cyh2YWx1ZSwgbWV0aG9kLCBuYW1lLCBtZXRob2RQYXRoKSB7XG4gICAgaWYgKHZhbHVlW21ldGhvZF0gPT09IG51bGwgfHwgdmFsdWVbbWV0aG9kXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICR7bmFtZX0gdG8gaGF2ZSBtZXRob2QgJHttZXRob2RQYXRofWApO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NlcnRNZXRob2RFeGlzdHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHZhbHVlIGlzIG9mIHR5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSBBIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEEgYmFzaWMgSmF2YVNjcmlwdCB0eXBlIHRvIGNvbXBhcmUgdG8sIGUuZy4gXCJvYmplY3RcIiwgXCJzdHJpbmdcIlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQSBzdHJpbmcgdG8gdXNlIGZvciB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB2YWx1ZSBpcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFR5cGUodmFsdWUsIHR5cGUsIG5hbWUpIHtcbiAgICB2YXIgYWN0dWFsID0gdHlwZU9mKHZhbHVlKTtcbiAgICBpZiAoYWN0dWFsICE9PSB0eXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdHlwZSBvZiAke25hbWV9IHRvIGJlICR7dHlwZX0sIGJ1dCB3YXMgJHthY3R1YWx9YCxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0VHlwZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIHR5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnR5cGVPZjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBmb3IgaXRlcmFibGVzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiBgdmFsdWVgIGxvb2tzIGxpa2UgYW4gaXRlcmFibGVcbiAqL1xuZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiBCb29sZWFuKHZhbHVlKSAmJiB0eXBlT2YodmFsdWUuZm9yRWFjaCkgPT09IFwiZnVuY3Rpb25cIjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhYmxlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZXZlcnkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmV2ZXJ5O1xudmFyIGNvbmNhdCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXkuY29uY2F0O1xudmFyIHR5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnR5cGVPZjtcblxudmFyIGRlZXBFcXVhbEZhY3RvcnkgPSByZXF1aXJlKFwiLi4vZGVlcC1lcXVhbFwiKS51c2U7XG5cbnZhciBpZGVudGljYWwgPSByZXF1aXJlKFwiLi4vaWRlbnRpY2FsXCIpO1xudmFyIGlzTWF0Y2hlciA9IHJlcXVpcmUoXCIuL2lzLW1hdGNoZXJcIik7XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBNYXRjaGVzIGBhY3R1YWxgIHdpdGggYGV4cGVjdGF0aW9uYFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3Vua25vd259IGFjdHVhbCBBIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBlY3RhdGlvbiBBbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIG1hdGNoIG9uXG4gKiBAcGFyYW0ge29iamVjdH0gbWF0Y2hlciBBIG1hdGNoZXIgdG8gdXNlIGZvciBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIHdoZW4gYGFjdHVhbGAgbWF0Y2hlcyBhbGwgcHJvcGVydGllcyBpbiBgZXhwZWN0YXRpb25gXG4gKi9cbmZ1bmN0aW9uIG1hdGNoT2JqZWN0KGFjdHVhbCwgZXhwZWN0YXRpb24sIG1hdGNoZXIpIHtcbiAgICB2YXIgZGVlcEVxdWFsID0gZGVlcEVxdWFsRmFjdG9yeShtYXRjaGVyKTtcbiAgICBpZiAoYWN0dWFsID09PSBudWxsIHx8IGFjdHVhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZXhwZWN0ZWRLZXlzID0ga2V5cyhleHBlY3RhdGlvbik7XG4gICAgaWYgKHR5cGVPZihnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhwZWN0ZWRLZXlzID0gY29uY2F0KGV4cGVjdGVkS2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV4cGVjdGF0aW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZXJ5KGV4cGVjdGVkS2V5cywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgZXhwID0gZXhwZWN0YXRpb25ba2V5XTtcbiAgICAgICAgdmFyIGFjdCA9IGFjdHVhbFtrZXldO1xuXG4gICAgICAgIGlmIChpc01hdGNoZXIoZXhwKSkge1xuICAgICAgICAgICAgaWYgKCFleHAudGVzdChhY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVPZihleHApID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoaWRlbnRpY2FsKGV4cCwgYWN0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXRjaE9iamVjdChhY3QsIGV4cCwgbWF0Y2hlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWRlZXBFcXVhbChhY3QsIGV4cCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdGNoT2JqZWN0O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xudmFyIGpvaW4gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmpvaW47XG52YXIgbWFwID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5tYXA7XG52YXIgc3RyaW5nSW5kZXhPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuc3RyaW5nLmluZGV4T2Y7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBtYXRjaE9iamVjdCA9IHJlcXVpcmUoXCIuL21hdGNoLW9iamVjdFwiKTtcblxudmFyIGNyZWF0ZVR5cGVNYXAgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmdW5jdGlvbjogZnVuY3Rpb24gKG0sIGV4cGVjdGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBleHBlY3RhdGlvbjtcbiAgICAgICAgICAgIG0ubWVzc2FnZSA9IG1lc3NhZ2UgfHwgYG1hdGNoKCR7ZnVuY3Rpb25OYW1lKGV4cGVjdGF0aW9uKX0pYDtcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyOiBmdW5jdGlvbiAobSwgZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIG0udGVzdCA9IGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHR5cGUgY29lcmNpb24gaGVyZVxuICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbiA9PSBhY3R1YWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvYmplY3Q6IGZ1bmN0aW9uIChtLCBleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgdmFyIGFycmF5ID0gW107XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwZWN0YXRpb24udGVzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbS50ZXN0ID0gZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24udGVzdChhY3R1YWwpID09PSB0cnVlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbS5tZXNzYWdlID0gYG1hdGNoKCR7ZnVuY3Rpb25OYW1lKGV4cGVjdGF0aW9uLnRlc3QpfSlgO1xuICAgICAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhcnJheSA9IG1hcChPYmplY3Qua2V5cyhleHBlY3RhdGlvbiksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uW2tleV0pfWA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbS50ZXN0ID0gZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE9iamVjdChhY3R1YWwsIGV4cGVjdGF0aW9uLCBtYXRjaCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbS5tZXNzYWdlID0gYG1hdGNoKCR7am9pbihhcnJheSwgXCIsIFwiKX0pYDtcblxuICAgICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH0sXG4gICAgICAgIHJlZ2V4cDogZnVuY3Rpb24gKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhY3R1YWwgPT09IFwic3RyaW5nXCIgJiYgZXhwZWN0YXRpb24udGVzdChhY3R1YWwpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaW5nOiBmdW5jdGlvbiAobSwgZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIG0udGVzdCA9IGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYWN0dWFsID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ0luZGV4T2YoYWN0dWFsLCBleHBlY3RhdGlvbikgIT09IC0xXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtLm1lc3NhZ2UgPSBgbWF0Y2goXCIke2V4cGVjdGF0aW9ufVwiKWA7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVHlwZU1hcDtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCIuL2RlZXAtZXF1YWxcIikudXNlKGNyZWF0ZU1hdGNoZXIpO1xudmFyIGV2ZXJ5ID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZXZlcnk7XG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xudmFyIGl0ZXJhYmxlVG9TdHJpbmcgPSByZXF1aXJlKFwiLi9pdGVyYWJsZS10by1zdHJpbmdcIik7XG52YXIgb2JqZWN0UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdDtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBhc3NlcnRNYXRjaGVyID0gcmVxdWlyZShcIi4vY3JlYXRlLW1hdGNoZXIvYXNzZXJ0LW1hdGNoZXJcIik7XG52YXIgYXNzZXJ0TWV0aG9kRXhpc3RzID0gcmVxdWlyZShcIi4vY3JlYXRlLW1hdGNoZXIvYXNzZXJ0LW1ldGhvZC1leGlzdHNcIik7XG52YXIgYXNzZXJ0VHlwZSA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyL2Fzc2VydC10eXBlXCIpO1xudmFyIGlzSXRlcmFibGUgPSByZXF1aXJlKFwiLi9jcmVhdGUtbWF0Y2hlci9pcy1pdGVyYWJsZVwiKTtcbnZhciBpc01hdGNoZXIgPSByZXF1aXJlKFwiLi9jcmVhdGUtbWF0Y2hlci9pcy1tYXRjaGVyXCIpO1xuXG52YXIgbWF0Y2hlclByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyL21hdGNoZXItcHJvdG90eXBlXCIpO1xuXG52YXIgYXJyYXlJbmRleE9mID0gYXJyYXlQcm90by5pbmRleE9mO1xudmFyIHNvbWUgPSBhcnJheVByb3RvLnNvbWU7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbnZhciBUWVBFX01BUCA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyL3R5cGUtbWFwXCIpKGNyZWF0ZU1hdGNoZXIpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRjaGVyIG9iamVjdCBmb3IgdGhlIHBhc3NlZCBleHBlY3RhdGlvbi5cbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLmNyZWF0ZU1hdGNoZXJcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXhwZWN0YXRpb24gQW4gZXhwZWN0YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIEEgbWVzc2FnZSBmb3IgdGhlIGV4cGVjdGF0aW9uXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBIG1hdGNoZXIgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1hdGNoZXIoZXhwZWN0YXRpb24sIG1lc3NhZ2UpIHtcbiAgICB2YXIgbSA9IE9iamVjdC5jcmVhdGUobWF0Y2hlclByb3RvdHlwZSk7XG4gICAgdmFyIHR5cGUgPSB0eXBlT2YoZXhwZWN0YXRpb24pO1xuXG4gICAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWVzc2FnZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSBzaG91bGQgYmUgYSBzdHJpbmdcIik7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgMSBvciAyIGFyZ3VtZW50cywgcmVjZWl2ZWQgJHthcmd1bWVudHMubGVuZ3RofWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgaW4gVFlQRV9NQVApIHtcbiAgICAgICAgVFlQRV9NQVBbdHlwZV0obSwgZXhwZWN0YXRpb24sIG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG0udGVzdCA9IGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RhdGlvbik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFtLm1lc3NhZ2UpIHtcbiAgICAgICAgbS5tZXNzYWdlID0gYG1hdGNoKCR7dmFsdWVUb1N0cmluZyhleHBlY3RhdGlvbil9KWA7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHRoYXQgbm90aGluZyBtdXRhdGVzIHRoZSBleHBvcnRlZCBtZXNzYWdlIHZhbHVlLCByZWYgaHR0cHM6Ly9naXRodWIuY29tL3Npbm9uanMvc2lub24vaXNzdWVzLzI1MDJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobSwgXCJtZXNzYWdlXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbS5tZXNzYWdlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG07XG59XG5cbmNyZWF0ZU1hdGNoZXIuaXNNYXRjaGVyID0gaXNNYXRjaGVyO1xuXG5jcmVhdGVNYXRjaGVyLmFueSA9IGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cnVlO1xufSwgXCJhbnlcIik7XG5cbmNyZWF0ZU1hdGNoZXIuZGVmaW5lZCA9IGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgIHJldHVybiBhY3R1YWwgIT09IG51bGwgJiYgYWN0dWFsICE9PSB1bmRlZmluZWQ7XG59LCBcImRlZmluZWRcIik7XG5cbmNyZWF0ZU1hdGNoZXIudHJ1dGh5ID0gY3JlYXRlTWF0Y2hlcihmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYWN0dWFsKTtcbn0sIFwidHJ1dGh5XCIpO1xuXG5jcmVhdGVNYXRjaGVyLmZhbHN5ID0gY3JlYXRlTWF0Y2hlcihmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgcmV0dXJuICFhY3R1YWw7XG59LCBcImZhbHN5XCIpO1xuXG5jcmVhdGVNYXRjaGVyLnNhbWUgPSBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihcbiAgICAgICAgZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uID09PSBhY3R1YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGBzYW1lKCR7dmFsdWVUb1N0cmluZyhleHBlY3RhdGlvbil9KWAsXG4gICAgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuaW4gPSBmdW5jdGlvbiAoYXJyYXlPZkV4cGVjdGF0aW9ucykge1xuICAgIGlmICh0eXBlT2YoYXJyYXlPZkV4cGVjdGF0aW9ucykgIT09IFwiYXJyYXlcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoXG4gICAgICAgIGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBzb21lKGFycmF5T2ZFeHBlY3RhdGlvbnMsIGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbiA9PT0gYWN0dWFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGBpbigke3ZhbHVlVG9TdHJpbmcoYXJyYXlPZkV4cGVjdGF0aW9ucyl9KWAsXG4gICAgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIudHlwZU9mID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBhc3NlcnRUeXBlKHR5cGUsIFwic3RyaW5nXCIsIFwidHlwZVwiKTtcbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiB0eXBlT2YoYWN0dWFsKSA9PT0gdHlwZTtcbiAgICB9LCBgdHlwZU9mKFwiJHt0eXBlfVwiKWApO1xufTtcblxuY3JlYXRlTWF0Y2hlci5pbnN0YW5jZU9mID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgdHlwZW9mIFN5bWJvbC5oYXNJbnN0YW5jZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICBhc3NlcnRUeXBlKHR5cGUsIFwiZnVuY3Rpb25cIiwgXCJ0eXBlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydE1ldGhvZEV4aXN0cyhcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBTeW1ib2wuaGFzSW5zdGFuY2UsXG4gICAgICAgICAgICBcInR5cGVcIixcbiAgICAgICAgICAgIFwiW1N5bWJvbC5oYXNJbnN0YW5jZV1cIixcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihcbiAgICAgICAgZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdHVhbCBpbnN0YW5jZW9mIHR5cGU7XG4gICAgICAgIH0sXG4gICAgICAgIGBpbnN0YW5jZU9mKCR7ZnVuY3Rpb25OYW1lKHR5cGUpIHx8IG9iamVjdFRvU3RyaW5nKHR5cGUpfSlgLFxuICAgICk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBtYXRjaGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHByb3BlcnR5VGVzdCBBIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIHByb3BlcnR5IGFnYWluc3QgYSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VQcmVmaXggQSBwcmVmaXggdG8gdXNlIGZvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgdGhlIG1hdGNoZXJcbiAqIEByZXR1cm5zIHtvYmplY3R9IEEgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eU1hdGNoZXIocHJvcGVydHlUZXN0LCBtZXNzYWdlUHJlZml4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VHlwZShwcm9wZXJ0eSwgXCJzdHJpbmdcIiwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgdmFyIG9ubHlQcm9wZXJ0eSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDE7XG4gICAgICAgIHZhciBtZXNzYWdlID0gYCR7bWVzc2FnZVByZWZpeH0oXCIke3Byb3BlcnR5fVwiYDtcbiAgICAgICAgaWYgKCFvbmx5UHJvcGVydHkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCwgJHt2YWx1ZVRvU3RyaW5nKHZhbHVlKX1gO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gXCIpXCI7XG4gICAgICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3R1YWwgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIGFjdHVhbCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICFwcm9wZXJ0eVRlc3QoYWN0dWFsLCBwcm9wZXJ0eSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvbmx5UHJvcGVydHkgfHwgZGVlcEVxdWFsKGFjdHVhbFtwcm9wZXJ0eV0sIHZhbHVlKTtcbiAgICAgICAgfSwgbWVzc2FnZSk7XG4gICAgfTtcbn1cblxuY3JlYXRlTWF0Y2hlci5oYXMgPSBjcmVhdGVQcm9wZXJ0eU1hdGNoZXIoZnVuY3Rpb24gKGFjdHVhbCwgcHJvcGVydHkpIHtcbiAgICBpZiAodHlwZW9mIGFjdHVhbCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gcHJvcGVydHkgaW4gYWN0dWFsO1xuICAgIH1cbiAgICByZXR1cm4gYWN0dWFsW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkO1xufSwgXCJoYXNcIik7XG5cbmNyZWF0ZU1hdGNoZXIuaGFzT3duID0gY3JlYXRlUHJvcGVydHlNYXRjaGVyKGZ1bmN0aW9uIChhY3R1YWwsIHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGhhc093blByb3BlcnR5KGFjdHVhbCwgcHJvcGVydHkpO1xufSwgXCJoYXNPd25cIik7XG5cbmNyZWF0ZU1hdGNoZXIuaGFzTmVzdGVkID0gZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGFzc2VydFR5cGUocHJvcGVydHksIFwic3RyaW5nXCIsIFwicHJvcGVydHlcIik7XG4gICAgdmFyIG9ubHlQcm9wZXJ0eSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDE7XG4gICAgdmFyIG1lc3NhZ2UgPSBgaGFzTmVzdGVkKFwiJHtwcm9wZXJ0eX1cImA7XG4gICAgaWYgKCFvbmx5UHJvcGVydHkpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgLCAke3ZhbHVlVG9TdHJpbmcodmFsdWUpfWA7XG4gICAgfVxuICAgIG1lc3NhZ2UgKz0gXCIpXCI7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHByb3BlcnR5LnNwbGl0KC8oPzpcXC58XFxbfFxcXSkrPy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBhY3R1YWw7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQ/LltwYXJ0XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ubHlQcm9wZXJ0eSB8fCBkZWVwRXF1YWwoY3VycmVudCwgdmFsdWUpO1xuICAgIH0sIG1lc3NhZ2UpO1xufTtcblxudmFyIGpzb25QYXJzZVJlc3VsdFR5cGVzID0ge1xuICAgIG51bGw6IHRydWUsXG4gICAgYm9vbGVhbjogdHJ1ZSxcbiAgICBudW1iZXI6IHRydWUsXG4gICAgc3RyaW5nOiB0cnVlLFxuICAgIG9iamVjdDogdHJ1ZSxcbiAgICBhcnJheTogdHJ1ZSxcbn07XG5jcmVhdGVNYXRjaGVyLmpzb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIWpzb25QYXJzZVJlc3VsdFR5cGVzW3R5cGVPZih2YWx1ZSldKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJWYWx1ZSBjYW5ub3QgYmUgdGhlIHJlc3VsdCBvZiBKU09OLnBhcnNlXCIpO1xuICAgIH1cbiAgICB2YXIgbWVzc2FnZSA9IGBqc29uKCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIFwiICBcIil9KWA7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICB2YXIgcGFyc2VkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShhY3R1YWwpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbChwYXJzZWQsIHZhbHVlKTtcbiAgICB9LCBtZXNzYWdlKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuZXZlcnkgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgYXNzZXJ0TWF0Y2hlcihwcmVkaWNhdGUpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICBpZiAodHlwZU9mKGFjdHVhbCkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVyeShPYmplY3Qua2V5cyhhY3R1YWwpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZS50ZXN0KGFjdHVhbFtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzSXRlcmFibGUoYWN0dWFsKSAmJlxuICAgICAgICAgICAgZXZlcnkoYWN0dWFsLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUudGVzdChlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgYGV2ZXJ5KCR7cHJlZGljYXRlLm1lc3NhZ2V9KWApO1xufTtcblxuY3JlYXRlTWF0Y2hlci5zb21lID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkge1xuICAgIGFzc2VydE1hdGNoZXIocHJlZGljYXRlKTtcblxuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgaWYgKHR5cGVPZihhY3R1YWwpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gIWV2ZXJ5KE9iamVjdC5rZXlzKGFjdHVhbCksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS50ZXN0KGFjdHVhbFtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzSXRlcmFibGUoYWN0dWFsKSAmJlxuICAgICAgICAgICAgIWV2ZXJ5KGFjdHVhbCwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS50ZXN0KGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBgc29tZSgke3ByZWRpY2F0ZS5tZXNzYWdlfSlgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuYXJyYXkgPSBjcmVhdGVNYXRjaGVyLnR5cGVPZihcImFycmF5XCIpO1xuXG5jcmVhdGVNYXRjaGVyLmFycmF5LmRlZXBFcXVhbHMgPSBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihcbiAgICAgICAgZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgLy8gQ29tcGFyaW5nIGxlbmd0aHMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIHNwb3QgYSBkaWZmZXJlbmNlIGJlZm9yZSBpdGVyYXRpbmcgdGhyb3VnaCBldmVyeSBpdGVtXG4gICAgICAgICAgICB2YXIgc2FtZUxlbmd0aCA9IGFjdHVhbC5sZW5ndGggPT09IGV4cGVjdGF0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwiYXJyYXlcIiAmJlxuICAgICAgICAgICAgICAgIHNhbWVMZW5ndGggJiZcbiAgICAgICAgICAgICAgICBldmVyeShhY3R1YWwsIGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBleHBlY3RhdGlvbltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlT2YoZXhwZWN0ZWQpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPZihlbGVtZW50KSA9PT0gXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNyZWF0ZU1hdGNoZXIuYXJyYXkuZGVlcEVxdWFscyhleHBlY3RlZCkudGVzdChlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWVwRXF1YWwoZXhwZWN0ZWQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBgZGVlcEVxdWFscyhbJHtpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKX1dKWAsXG4gICAgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuYXJyYXkuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKFxuICAgICAgICBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24gKGV4cGVjdGVkRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFtpbmRleF0gPT09IGV4cGVjdGVkRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgYHN0YXJ0c1dpdGgoWyR7aXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbil9XSlgLFxuICAgICk7XG59O1xuXG5jcmVhdGVNYXRjaGVyLmFycmF5LmVuZHNXaXRoID0gZnVuY3Rpb24gKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoXG4gICAgICAgIGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoZSBpbmRleCBpbiB3aGljaCB3ZSBzaG91bGQgc3RhcnQgbWF0Y2hpbmdcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBhY3R1YWwubGVuZ3RoIC0gZXhwZWN0YXRpb24ubGVuZ3RoO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24gKGV4cGVjdGVkRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFtvZmZzZXQgKyBpbmRleF0gPT09IGV4cGVjdGVkRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGVuZHNXaXRoKFske2l0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pfV0pYCxcbiAgICApO1xufTtcblxuY3JlYXRlTWF0Y2hlci5hcnJheS5jb250YWlucyA9IGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKFxuICAgICAgICBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24gKGV4cGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGFjdHVhbCwgZXhwZWN0ZWRFbGVtZW50KSAhPT0gLTE7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGBjb250YWlucyhbJHtpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKX1dKWAsXG4gICAgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIubWFwID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJtYXBcIik7XG5cbmNyZWF0ZU1hdGNoZXIubWFwLmRlZXBFcXVhbHMgPSBmdW5jdGlvbiBtYXBEZWVwRXF1YWxzKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoXG4gICAgICAgIGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgIC8vIENvbXBhcmluZyBsZW5ndGhzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBzcG90IGEgZGlmZmVyZW5jZSBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnkgaXRlbVxuICAgICAgICAgICAgdmFyIHNhbWVMZW5ndGggPSBhY3R1YWwuc2l6ZSA9PT0gZXhwZWN0YXRpb24uc2l6ZTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwibWFwXCIgJiZcbiAgICAgICAgICAgICAgICBzYW1lTGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgZXZlcnkoYWN0dWFsLCBmdW5jdGlvbiAoZWxlbWVudCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RhdGlvbi5oYXMoa2V5KSAmJiBleHBlY3RhdGlvbi5nZXQoa2V5KSA9PT0gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBgZGVlcEVxdWFscyhNYXBbJHtpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKX1dKWAsXG4gICAgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIubWFwLmNvbnRhaW5zID0gZnVuY3Rpb24gbWFwQ29udGFpbnMoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihcbiAgICAgICAgZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0eXBlT2YoYWN0dWFsKSA9PT0gXCJtYXBcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbiAoZWxlbWVudCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWwuaGFzKGtleSkgJiYgYWN0dWFsLmdldChrZXkpID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBgY29udGFpbnMoTWFwWyR7aXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbil9XSlgLFxuICAgICk7XG59O1xuXG5jcmVhdGVNYXRjaGVyLnNldCA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwic2V0XCIpO1xuXG5jcmVhdGVNYXRjaGVyLnNldC5kZWVwRXF1YWxzID0gZnVuY3Rpb24gc2V0RGVlcEVxdWFscyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKFxuICAgICAgICBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICAvLyBDb21wYXJpbmcgbGVuZ3RocyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gc3BvdCBhIGRpZmZlcmVuY2UgYmVmb3JlIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IGl0ZW1cbiAgICAgICAgICAgIHZhciBzYW1lTGVuZ3RoID0gYWN0dWFsLnNpemUgPT09IGV4cGVjdGF0aW9uLnNpemU7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcInNldFwiICYmXG4gICAgICAgICAgICAgICAgc2FtZUxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIGV2ZXJ5KGFjdHVhbCwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLmhhcyhlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRlZXBFcXVhbHMoU2V0WyR7aXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbil9XSlgLFxuICAgICk7XG59O1xuXG5jcmVhdGVNYXRjaGVyLnNldC5jb250YWlucyA9IGZ1bmN0aW9uIHNldENvbnRhaW5zKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoXG4gICAgICAgIGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwic2V0XCIgJiZcbiAgICAgICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC5oYXMoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGBjb250YWlucyhTZXRbJHtpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKX1dKWAsXG4gICAgKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuYm9vbCA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwiYm9vbGVhblwiKTtcbmNyZWF0ZU1hdGNoZXIubnVtYmVyID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJudW1iZXJcIik7XG5jcmVhdGVNYXRjaGVyLnN0cmluZyA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwic3RyaW5nXCIpO1xuY3JlYXRlTWF0Y2hlci5vYmplY3QgPSBjcmVhdGVNYXRjaGVyLnR5cGVPZihcIm9iamVjdFwiKTtcbmNyZWF0ZU1hdGNoZXIuZnVuYyA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwiZnVuY3Rpb25cIik7XG5jcmVhdGVNYXRjaGVyLnJlZ2V4cCA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwicmVnZXhwXCIpO1xuY3JlYXRlTWF0Y2hlci5kYXRlID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJkYXRlXCIpO1xuY3JlYXRlTWF0Y2hlci5zeW1ib2wgPSBjcmVhdGVNYXRjaGVyLnR5cGVPZihcInN5bWJvbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVNYXRjaGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuc3RyaW5nLmluZGV4T2Y7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXkuZm9yRWFjaDtcbnZhciB0eXBlID0gcmVxdWlyZShcInR5cGUtZGV0ZWN0XCIpO1xuXG52YXIgZW5naW5lQ2FuQ29tcGFyZU1hcHMgPSB0eXBlb2YgQXJyYXkuZnJvbSA9PT0gXCJmdW5jdGlvblwiO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCIuL2RlZXAtZXF1YWxcIikudXNlKG1hdGNoKTtcbnZhciBpc0FycmF5VHlwZSA9IHJlcXVpcmUoXCIuL2lzLWFycmF5LXR5cGVcIik7XG52YXIgaXNTdWJzZXQgPSByZXF1aXJlKFwiLi9pcy1zdWJzZXRcIik7XG52YXIgY3JlYXRlTWF0Y2hlciA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyXCIpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGBhcnJheWAgY29udGFpbnMgYWxsIG9mIGBzdWJzZXRgIGFzIGRlZmluZWQgYnkgdGhlIGBjb21wYXJlYFxuICogYXJndW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gYXJyYXkgICBBbiBhcnJheSB0byBzZWFyY2ggZm9yIGEgc3Vic2V0XG4gKiBAcGFyYW0gIHtBcnJheX0gc3Vic2V0ICBUaGUgc3Vic2V0IHRvIGZpbmQgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY29tcGFyZSBBIGNvbXBhcmlzb24gZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyYXksIHN1YnNldCwgY29tcGFyZSkge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgaSwgbCwgaiwgaztcbiAgICBmb3IgKGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmIChjb21wYXJlKGFycmF5W2ldLCBzdWJzZXRbMF0pKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwLCBrID0gc3Vic2V0Lmxlbmd0aDsgaiA8IGs7ICsraikge1xuICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlKGFycmF5W2kgKyBqXSwgc3Vic2V0W2pdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4vKipcbiAqIE1hdGNoZXMgYW4gb2JqZWN0IHdpdGggYSBtYXRjaGVyIChvciB2YWx1ZSlcbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLm1hdGNoXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgY2FuZGlkYXRlIHRvIG1hdGNoXG4gKiBAcGFyYW0ge29iamVjdH0gbWF0Y2hlck9yVmFsdWUgQSBtYXRjaGVyIG9yIHZhbHVlIHRvIG1hdGNoIGFnYWluc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHdoZW4gYG9iamVjdGAgbWF0Y2hlcyBgbWF0Y2hlck9yVmFsdWVgXG4gKi9cbmZ1bmN0aW9uIG1hdGNoKG9iamVjdCwgbWF0Y2hlck9yVmFsdWUpIHtcbiAgICBpZiAobWF0Y2hlck9yVmFsdWUgJiYgdHlwZW9mIG1hdGNoZXJPclZhbHVlLnRlc3QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gbWF0Y2hlck9yVmFsdWUudGVzdChvYmplY3QpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZShtYXRjaGVyT3JWYWx1ZSkpIHtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyT3JWYWx1ZSA9PT0gb2JqZWN0O1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyT3JWYWx1ZShvYmplY3QpID09PSB0cnVlO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICB2YXIgbm90TnVsbCA9IHR5cGVvZiBvYmplY3QgPT09IFwic3RyaW5nXCIgfHwgQm9vbGVhbihvYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBub3ROdWxsICYmXG4gICAgICAgICAgICAgICAgaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb1N0cmluZyhvYmplY3QpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXJPclZhbHVlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgKSA+PSAwXG4gICAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09IFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICAgICAgICBpZiAodHlwZShvYmplY3QpID09PSBcIkRhdGVcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuZ2V0VGltZSgpID09PSBtYXRjaGVyT3JWYWx1ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dDogdGhpcyBpcyBiYXNpY2FsbHkgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uLCB3aGljaCBpcyBjb3ZlcmVkICovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJJbnQ4QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIlVpbnQ4QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIlVpbnQ4Q2xhbXBlZEFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJJbnQxNkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50MTZBcnJheVwiOlxuICAgICAgICBjYXNlIFwiSW50MzJBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkZsb2F0MzJBcnJheVwiOlxuICAgICAgICBjYXNlIFwiRmxvYXQ2NEFycmF5XCI6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKG1hdGNoZXJPclZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIGFycmF5Q29udGFpbnMob2JqZWN0LCBtYXRjaGVyT3JWYWx1ZSwgbWF0Y2gpXG4gICAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiTWFwXCI6XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQ6IHRoaXMgaXMgY292ZXJlZCBieSBhIHRlc3QsIHRoYXQgaXMgb25seSBydW4gaW4gSUUsIGJ1dCB3ZSBjb2xsZWN0IGNvdmVyYWdlIGluZm9ybWF0aW9uIGluIG5vZGUqL1xuICAgICAgICAgICAgaWYgKCFlbmdpbmVDYW5Db21wYXJlTWFwcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUaGUgSmF2YVNjcmlwdCBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBBcnJheS5mcm9tIGFuZCBjYW5ub3QgcmVsaWFibHkgZG8gdmFsdWUgY29tcGFyaXNvbiBvZiBNYXAgaW5zdGFuY2VzXCIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGUob2JqZWN0KSA9PT0gXCJNYXBcIiAmJlxuICAgICAgICAgICAgICAgIGFycmF5Q29udGFpbnMoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20ob2JqZWN0KSxcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbShtYXRjaGVyT3JWYWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUob2JqZWN0KSkge1xuICAgICAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICByZXR1cm4gaXNTdWJzZXQobWF0Y2hlck9yVmFsdWUsIG9iamVjdCwgbWF0Y2gpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZXJPclZhbHVlICYmIHR5cGVvZiBtYXRjaGVyT3JWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAobWF0Y2hlck9yVmFsdWUgPT09IG9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgICBmb3IgKHByb3AgaW4gbWF0Y2hlck9yVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb2JqZWN0LmdldEF0dHJpYnV0ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdC5nZXRBdHRyaWJ1dGUocHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWF0Y2hlck9yVmFsdWVbcHJvcF0gPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWF0Y2hlck9yVmFsdWVbcHJvcF0gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbWF0Y2hlck9yVmFsdWVbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgICAgICAgIWRlZXBFcXVhbCh2YWx1ZSwgbWF0Y2hlck9yVmFsdWVbcHJvcF0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWF0Y2hlciB3YXMgYW4gdW5rbm93biBvciB1bnN1cHBvcnRlZCB0eXBlXCIpO1xufVxuLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbmZvckVhY2goT2JqZWN0LmtleXMoY3JlYXRlTWF0Y2hlciksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBtYXRjaFtrZXldID0gY3JlYXRlTWF0Y2hlcltrZXldO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2g7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQG1vZHVsZSBzYW1zYW1cbiAqL1xudmFyIGlkZW50aWNhbCA9IHJlcXVpcmUoXCIuL2lkZW50aWNhbFwiKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoXCIuL2lzLWFyZ3VtZW50c1wiKTtcbnZhciBpc0VsZW1lbnQgPSByZXF1aXJlKFwiLi9pcy1lbGVtZW50XCIpO1xudmFyIGlzTmVnWmVybyA9IHJlcXVpcmUoXCIuL2lzLW5lZy16ZXJvXCIpO1xudmFyIGlzU2V0ID0gcmVxdWlyZShcIi4vaXMtc2V0XCIpO1xudmFyIGlzTWFwID0gcmVxdWlyZShcIi4vaXMtbWFwXCIpO1xudmFyIG1hdGNoID0gcmVxdWlyZShcIi4vbWF0Y2hcIik7XG52YXIgZGVlcEVxdWFsQ3ljbGljID0gcmVxdWlyZShcIi4vZGVlcC1lcXVhbFwiKS51c2UobWF0Y2gpO1xudmFyIGNyZWF0ZU1hdGNoZXIgPSByZXF1aXJlKFwiLi9jcmVhdGUtbWF0Y2hlclwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgY3JlYXRlTWF0Y2hlcjogY3JlYXRlTWF0Y2hlcixcbiAgICBkZWVwRXF1YWw6IGRlZXBFcXVhbEN5Y2xpYyxcbiAgICBpZGVudGljYWw6IGlkZW50aWNhbCxcbiAgICBpc0FyZ3VtZW50czogaXNBcmd1bWVudHMsXG4gICAgaXNFbGVtZW50OiBpc0VsZW1lbnQsXG4gICAgaXNNYXA6IGlzTWFwLFxuICAgIGlzTmVnWmVybzogaXNOZWdaZXJvLFxuICAgIGlzU2V0OiBpc1NldCxcbiAgICBtYXRjaDogbWF0Y2gsXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IHByb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcblxuY29uc3QgZm9yRWFjaCA9IHByb3RvdHlwZXMuYXJyYXkuZm9yRWFjaDtcblxuLyoqXG4gKiBAY2FsbGJhY2sgV2Fsa0l0ZXJhdG9yXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiB3YWxrSW50ZXJuYWwob2JqLCBpdGVyYXRvciwgY29udGV4dCwgb3JpZ2luYWxPYmosIHNlZW4pIHtcbiAgICBsZXQgcHJvcDtcbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgd2FudCB0byBlbnVtZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHByb3RvdHlwZSdzIHByb3BlcnRpZXNcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCB0aGVyZWZvcmUgd2UgZGVsaWJlcmF0ZWx5IGxlYXZlIG91dCBhbiBvd24gcHJvcGVydHkgY2hlY2suXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW4gKi9cbiAgICAgICAgZm9yIChwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbcHJvcF0sIHByb3AsIG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yRWFjaChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLCBmdW5jdGlvbiAoaykge1xuICAgICAgICAvLyBTa2lwIF9fcHJvdG9fXyBiZWNhdXNlOlxuICAgICAgICAvLyAtIEl0J3Mgbm90IGN1cnJlbnRseSB1c2VmdWwgaW4gdGhpcyBwcm9qZWN0LlxuICAgICAgICAvLyAtIEl0J3MgYXV0b21hdGljLCBwcm9ibGVtYXRpYywgYW5kIGRlcHJlY2F0ZWQuXG4gICAgICAgIC8vIC0gQXNzaWduaW5nIHRvIGl0IGhhcyBzcGVjaWFsIGVmZmVjdHMgKG9yIG5vIGVmZmVjdCBmb3Igbm9uLW9iamVjdClcbiAgICAgICAgLy8gICB3aGljaCBtYXkgbm90IGJlIGV4cGVjdGVkL2hhbmRsZWQgcHJvcGVybHkgYnkgaXRlcmF0b3IgY2FsbGJhY2suXG4gICAgICAgIC8vIC0gR2V0dGluZyBpdCB0aHJvd3MgRXJyb3Igd2l0aCBub2RlIC0tZGlzYWJsZS1wcm90bz10aHJvdy5cbiAgICAgICAgaWYgKGsgIT09IFwiX19wcm90b19fXCIgJiYgc2VlbltrXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2VlbltrXSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgaykuZ2V0ID09PVxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IG9yaWdpbmFsT2JqXG4gICAgICAgICAgICAgICAgICAgIDogb2JqO1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBrLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgd2Fsa0ludGVybmFsKHByb3RvLCBpdGVyYXRvciwgY29udGV4dCwgb3JpZ2luYWxPYmosIHNlZW4pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCBhbmQgaXRlcmF0ZXMgb3ZlciBldmVyeSBvd24gcHJvcGVydHlcbiAqIG5hbWUgZW5jb3VudGVyZWQuIFRoZSBpdGVyYXRvciBpcyBjYWxsZWQgaW4gdGhlIHNhbWUgZmFzaGlvbiB0aGF0IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gKiB3b3Jrcywgd2hlcmUgaXQgaXMgcGFzc2VkIHRoZSB2YWx1ZSwga2V5LCBhbmQgb3duIG9iamVjdCBhcyB0aGUgMXN0LCAybmQsIGFuZCAzcmQgcG9zaXRpb25hbFxuICogYXJndW1lbnQsIHJlc3BlY3RpdmVseS4gSW4gY2FzZXMgd2hlcmUgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgaXMgbm90IGF2YWlsYWJsZSwgd2FsayB3aWxsXG4gKiBkZWZhdWx0IHRvIHVzaW5nIGEgc2ltcGxlIGZvci4uaW4gbG9vcC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gVGhlIG9iamVjdCB0byB3YWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gZm9yLlxuICogQHBhcmFtIHtXYWxrSXRlcmF0b3J9IGl0ZXJhdG9yIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIHBhc3Mgb2YgdGhlIHdhbGsuXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gKE9wdGlvbmFsKSBXaGVuIGdpdmVuLCB0aGUgaXRlcmF0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGlzIG9iamVjdCBhcyB0aGUgcmVjZWl2ZXIuXG4gKiBAcmV0dXJucyB7dm9pZH0gbm90aGluZ1xuICovXG5jb25zdCB3YWxrID0gZnVuY3Rpb24gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gd2Fsa0ludGVybmFsKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQsIG9iaiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdhbGs7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByb3BlcnR5RGVzY3JpcHRvclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvZGVmaW5lUHJvcGVydHkjZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZmlndXJhYmxlIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVudW1lcmFibGUgICBkZWZhdWx0cyB0byBmYWxzZVxuICogQHByb3BlcnR5IHtib29sZWFufSB3cml0YWJsZSAgICAgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bn0gdmFsdWUgZGVmYXVsdHMgdG8gdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkgeygpID0+IHVua25vd259IGdldCBkZWZhdWx0cyB0byB1bmRlZmluZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiB1bmtub3duKSA9PiB2b2lkfSBzZXQgZGVmYXVsdHMgdG8gdW5kZWZpbmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2lzT3duOiBib29sZWFufSAmIFByb3BlcnR5RGVzY3JpcHRvcn0gU2lub25Qcm9wZXJ0eURlc2NyaXB0b3JcbiAqIGEgc2xpZ2h0bHkgZW5yaWNoZWQgcHJvcGVydHkgZGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtib29sZWFufSBpc093biB0cnVlIGlmIHRoZSBkZXNjcmlwdG9yIGlzIG93bmVkIGJ5IHRoaXMgb2JqZWN0LCBmYWxzZSBpZiBpdCBjb21lcyBmcm9tIHRoZSBwcm90b3R5cGVcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBzbGlnaHRseSBtb2RpZmllZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRoYXQgb25lIGNhbiB0ZWxsIGlzIGZyb20gdGhlIG9iamVjdCBvciB0aGUgcHJvdG90eXBlXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVxuICogQHJldHVybnMge1Npbm9uUHJvcGVydHlEZXNjcmlwdG9yfVxuICovXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIGxldCBwcm90byA9IG9iamVjdDtcbiAgICBsZXQgZGVzY3JpcHRvcjtcbiAgICBjb25zdCBpc093biA9IEJvb2xlYW4oXG4gICAgICAgIG9iamVjdCAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpLFxuICAgICk7XG5cbiAgICB3aGlsZSAoXG4gICAgICAgIHByb3RvICYmXG4gICAgICAgICEoZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3BlcnR5KSlcbiAgICApIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgIGRlc2NyaXB0b3IuaXNPd24gPSBpc093bjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2FsayA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL3dhbGsuanMnKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9nZXQtcHJvcGVydHktZGVzY3JpcHRvci5qcycpO1xudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IHByb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IHByb3RvdHlwZXMub2JqZWN0O1xuY29uc3QgeyBwdXNoIH0gPSBwcm90b3R5cGVzLmFycmF5O1xuXG5mdW5jdGlvbiBjb2xsZWN0TWV0aG9kKG1ldGhvZHMsIG9iamVjdCwgcHJvcCwgcHJvcE93bmVyKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wT3duZXIsIHByb3ApO1xuICAgIGNvbnN0IHZhbHVlID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgaGFzT3duUHJvcGVydHkob2JqZWN0LCBwcm9wKSAmJlxuICAgICAgICB2YWx1ZSAmJlxuICAgICAgICB2YWx1ZS5yZXN0b3JlICYmXG4gICAgICAgIHZhbHVlLnJlc3RvcmUuc2lub25cbiAgICApIHtcbiAgICAgICAgcHVzaChtZXRob2RzLCB2YWx1ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBvd24gbWV0aG9kcyBvbiB0aGUgcGFzc2VkIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29sbGVjdCBtZXRob2RzIGZyb21cbiAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgbWV0aG9kc1xuICovXG5mdW5jdGlvbiBjb2xsZWN0T3duTWV0aG9kcyhvYmplY3QpIHtcbiAgICBjb25zdCBtZXRob2RzID0gW107XG5cbiAgICB3YWxrKG9iamVjdCwgY29sbGVjdE1ldGhvZC5iaW5kKG51bGwsIG1ldGhvZHMsIG9iamVjdCkpO1xuXG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGVjdE93bk1ldGhvZHM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhcnJheSA9IFtudWxsLCBcIm9uY2VcIiwgXCJ0d2ljZVwiLCBcInRocmljZVwiXTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHRpbWVzSW5Xb3Jkcyhjb3VudCkge1xuICAgIHJldHVybiBhcnJheVtjb3VudF0gfHwgYCR7Y291bnQgfHwgMH0gdGltZXNgO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRpbWVzSW5Xb3JkcztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3NoYW1zJyl9ICovXG4vKiBlc2xpbnQgY29tcGxleGl0eTogWzIsIDE4XSwgbWF4LXN0YXRlbWVudHM6IFsyLCAzM10gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJykgeyByZXR1cm4gdHJ1ZTsgfVxuXG5cdC8qKiBAdHlwZSB7eyBbayBpbiBzeW1ib2xdPzogdW5rbm93biB9fSAqL1xuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHZhciBfIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tdW5yZWFjaGFibGUtbG9vcFxuXHRpZiAodHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG5cdGlmIChzeW1zLmxlbmd0aCAhPT0gMSB8fCBzeW1zWzBdICE9PSBzeW0pIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHR2YXIgZGVzY3JpcHRvciA9IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSkpO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scy9zaGFtcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNUb1N0cmluZ1RhZ1NoYW1zKCkge1xuXHRyZXR1cm4gaGFzU3ltYm9scygpICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZXZhbCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFdmFsRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yYW5nZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSYW5nZUVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcmVmJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmVyZW5jZUVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdHlwZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBUeXBlRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi91cmknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gVVJJRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9hYnMnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5hYnM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mbG9vcicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmZsb29yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbWF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubWF4O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbWluJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubWluO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcG93Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgucG93O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcm91bmQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5yb3VuZDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2lzTmFOJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc05hTihhKSB7XG5cdHJldHVybiBhICE9PSBhO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2lzTmFOJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3NpZ24nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2lnbihudW1iZXIpIHtcblx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gMCkge1xuXHRcdHJldHVybiBudW1iZXI7XG5cdH1cblx0cmV0dXJuIG51bWJlciA8IDAgPyAtMSA6ICsxO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dPUEQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGdPUEQgPSByZXF1aXJlKCcuL2dPUEQnKTtcblxuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoW10sICdsZW5ndGgnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGdPUERcblx0XHQkZ09QRCA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAkZ09QRDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZhbHNlO1xuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRkZWZpbmVQcm9wZXJ0eTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vUmVmbGVjdC5nZXRQcm90b3R5cGVPZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAodHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YpIHx8IG51bGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJ2VzLW9iamVjdC1hdG9tcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9PYmplY3QuZ2V0UHJvdG90eXBlT2YnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gJE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBudWxsO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxudmFyIGNvbmNhdHR5ID0gZnVuY3Rpb24gY29uY2F0dHkoYSwgYikge1xuICAgIHZhciBhcnIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJbaV0gPSBhW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgYXJyW2ogKyBhLmxlbmd0aF0gPSBiW2pdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgc2xpY3kgPSBmdW5jdGlvbiBzbGljeShhcnJMaWtlLCBvZmZzZXQpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldCB8fCAwLCBqID0gMDsgaSA8IGFyckxpa2UubGVuZ3RoOyBpICs9IDEsIGogKz0gMSkge1xuICAgICAgICBhcnJbal0gPSBhcnJMaWtlW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIGpvaW55ID0gZnVuY3Rpb24gKGFyciwgam9pbmVyKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBhcnJbaV07XG4gICAgICAgIGlmIChpICsgMSA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0ciArPSBqb2luZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuYXBwbHkodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljeShhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICk7XG5cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gbWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3NbaV0gPSAnJCcgKyBpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBqb2lueShib3VuZEFyZ3MsICcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2Z1bmN0aW9uQ2FsbCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2Z1bmN0aW9uQXBwbHknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcmVmbGVjdEFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuYXBwbHk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxudmFyICRhcHBseSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25BcHBseScpO1xudmFyICRjYWxsID0gcmVxdWlyZSgnLi9mdW5jdGlvbkNhbGwnKTtcbnZhciAkcmVmbGVjdEFwcGx5ID0gcmVxdWlyZSgnLi9yZWZsZWN0QXBwbHknKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vYWN0dWFsQXBwbHknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gJHJlZmxlY3RBcHBseSB8fCBiaW5kLmNhbGwoJGNhbGwsICRhcHBseSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcblxudmFyICRjYWxsID0gcmVxdWlyZSgnLi9mdW5jdGlvbkNhbGwnKTtcbnZhciAkYWN0dWFsQXBwbHkgPSByZXF1aXJlKCcuL2FjdHVhbEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7KGFyZ3M6IFtGdW5jdGlvbiwgdGhpc0FyZz86IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXV0pID0+IEZ1bmN0aW9ufSBUT0RPIEZJWE1FLCBmaW5kIGEgd2F5IHRvIHVzZSBpbXBvcnQoJy4nKSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZEJhc2ljKGFyZ3MpIHtcblx0aWYgKGFyZ3MubGVuZ3RoIDwgMSB8fCB0eXBlb2YgYXJnc1swXSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblx0cmV0dXJuICRhY3R1YWxBcHBseShiaW5kLCAkY2FsbCwgYXJncyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xuXG52YXIgaGFzUHJvdG9BY2Nlc3NvcjtcbnRyeSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnMsIG5vLXByb3RvXG5cdGhhc1Byb3RvQWNjZXNzb3IgPSAvKiogQHR5cGUge3sgX19wcm90b19fPzogdHlwZW9mIEFycmF5LnByb3RvdHlwZSB9fSAqLyAoW10pLl9fcHJvdG9fXyA9PT0gQXJyYXkucHJvdG90eXBlO1xufSBjYXRjaCAoZSkge1xuXHRpZiAoIWUgfHwgdHlwZW9mIGUgIT09ICdvYmplY3QnIHx8ICEoJ2NvZGUnIGluIGUpIHx8IGUuY29kZSAhPT0gJ0VSUl9QUk9UT19BQ0NFU1MnKSB7XG5cdFx0dGhyb3cgZTtcblx0fVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG52YXIgZGVzYyA9ICEhaGFzUHJvdG9BY2Nlc3NvciAmJiBnT1BEICYmIGdPUEQoT2JqZWN0LnByb3RvdHlwZSwgLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgT2JqZWN0LnByb3RvdHlwZX0gKi8gKCdfX3Byb3RvX18nKSk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyICRnZXRQcm90b3R5cGVPZiA9ICRPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dldCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBkZXNjICYmIHR5cGVvZiBkZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJ1xuXHQ/IGNhbGxCaW5kKFtkZXNjLmdldF0pXG5cdDogdHlwZW9mICRnZXRQcm90b3R5cGVPZiA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdD8gLyoqIEB0eXBlIHtpbXBvcnQoJy4vZ2V0Jyl9ICovIGZ1bmN0aW9uIGdldER1bmRlcih2YWx1ZSkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0cmV0dXJuICRnZXRQcm90b3R5cGVPZih2YWx1ZSA9PSBudWxsID8gdmFsdWUgOiAkT2JqZWN0KHZhbHVlKSk7XG5cdFx0fVxuXHRcdDogZmFsc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmbGVjdEdldFByb3RvID0gcmVxdWlyZSgnLi9SZWZsZWN0LmdldFByb3RvdHlwZU9mJyk7XG52YXIgb3JpZ2luYWxHZXRQcm90byA9IHJlcXVpcmUoJy4vT2JqZWN0LmdldFByb3RvdHlwZU9mJyk7XG5cbnZhciBnZXREdW5kZXJQcm90byA9IHJlcXVpcmUoJ2R1bmRlci1wcm90by9nZXQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gcmVmbGVjdEdldFByb3RvXG5cdD8gZnVuY3Rpb24gZ2V0UHJvdG8oTykge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdHJldHVybiByZWZsZWN0R2V0UHJvdG8oTyk7XG5cdH1cblx0OiBvcmlnaW5hbEdldFByb3RvXG5cdFx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0XHRpZiAoIU8gfHwgKHR5cGVvZiBPICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgTyAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0UHJvdG86IG5vdCBhbiBvYmplY3QnKTtcblx0XHRcdH1cblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdFx0cmV0dXJuIG9yaWdpbmFsR2V0UHJvdG8oTyk7XG5cdFx0fVxuXHRcdDogZ2V0RHVuZGVyUHJvdG9cblx0XHRcdD8gZnVuY3Rpb24gZ2V0UHJvdG8oTykge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNhbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlLCBmb3Igc29tZSByZWFzb25cblx0XHRcdFx0cmV0dXJuIGdldER1bmRlclByb3RvKE8pO1xuXHRcdFx0fVxuXHRcdFx0OiBudWxsO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciAkaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoY2FsbCwgJGhhc093bik7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdW5kZWZpbmVkO1xuXG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJ2VzLW9iamVjdC1hdG9tcycpO1xuXG52YXIgJEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzJyk7XG52YXIgJEV2YWxFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9ldmFsJyk7XG52YXIgJFJhbmdlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvcmFuZ2UnKTtcbnZhciAkUmVmZXJlbmNlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvcmVmJyk7XG52YXIgJFN5bnRheEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3N5bnRheCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRVUklFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy91cmknKTtcblxudmFyIGFicyA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9hYnMnKTtcbnZhciBmbG9vciA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9mbG9vcicpO1xudmFyIG1heCA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9tYXgnKTtcbnZhciBtaW4gPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvbWluJyk7XG52YXIgcG93ID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3BvdycpO1xudmFyIHJvdW5kID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3JvdW5kJyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9zaWduJyk7XG5cbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgZ2V0RXZhbGxlZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGV4cHJlc3Npb25TeW50YXgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gJEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjsgcmV0dXJuICgnICsgZXhwcmVzc2lvblN5bnRheCArICcpLmNvbnN0cnVjdG9yOycpKCk7XG5cdH0gY2F0Y2ggKGUpIHt9XG59O1xuXG52YXIgJGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciB0aHJvd1R5cGVFcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoKTtcbn07XG52YXIgVGhyb3dUeXBlRXJyb3IgPSAkZ09QRFxuXHQ/IChmdW5jdGlvbiAoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMsIG5vLWNhbGxlciwgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG5cdFx0XHRhcmd1bWVudHMuY2FsbGVlOyAvLyBJRSA4IGRvZXMgbm90IHRocm93IGhlcmVcblx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHR9IGNhdGNoIChjYWxsZWVUaHJvd3MpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIElFIDggdGhyb3dzIG9uIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnJylcblx0XHRcdFx0cmV0dXJuICRnT1BEKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDtcblx0XHRcdH0gY2F0Y2ggKGdPUER0aHJvd3MpIHtcblx0XHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSgpKVxuXHQ6IHRocm93VHlwZUVycm9yO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxudmFyIGdldFByb3RvID0gcmVxdWlyZSgnZ2V0LXByb3RvJyk7XG52YXIgJE9iamVjdEdQTyA9IHJlcXVpcmUoJ2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YnKTtcbnZhciAkUmVmbGVjdEdQTyA9IHJlcXVpcmUoJ2dldC1wcm90by9SZWZsZWN0LmdldFByb3RvdHlwZU9mJyk7XG5cbnZhciAkYXBwbHkgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkFwcGx5Jyk7XG52YXIgJGNhbGwgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkNhbGwnKTtcblxudmFyIG5lZWRzRXZhbCA9IHt9O1xuXG52YXIgVHlwZWRBcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogJEVycm9yLFxuXHQnJWV2YWwlJzogZXZhbCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXG5cdCclRXZhbEVycm9yJSc6ICRFdmFsRXJyb3IsXG5cdCclRmxvYXQxNkFycmF5JSc6IHR5cGVvZiBGbG9hdDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQxNkFycmF5LFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6ICRPYmplY3QsXG5cdCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnOiAkZ09QRCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6ICRSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6ICRSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJVN0cmluZyUnOiBTdHJpbmcsXG5cdCclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCclU3ludGF4RXJyb3IlJzogJFN5bnRheEVycm9yLFxuXHQnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4QXJyYXksXG5cdCclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHQnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MTZBcnJheSxcblx0JyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDMyQXJyYXksXG5cdCclVVJJRXJyb3IlJzogJFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0LFxuXG5cdCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJzogJGNhbGwsXG5cdCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JSc6ICRhcHBseSxcblx0JyVPYmplY3QuZGVmaW5lUHJvcGVydHklJzogJGRlZmluZVByb3BlcnR5LFxuXHQnJU9iamVjdC5nZXRQcm90b3R5cGVPZiUnOiAkT2JqZWN0R1BPLFxuXHQnJU1hdGguYWJzJSc6IGFicyxcblx0JyVNYXRoLmZsb29yJSc6IGZsb29yLFxuXHQnJU1hdGgubWF4JSc6IG1heCxcblx0JyVNYXRoLm1pbiUnOiBtaW4sXG5cdCclTWF0aC5wb3clJzogcG93LFxuXHQnJU1hdGgucm91bmQlJzogcm91bmQsXG5cdCclTWF0aC5zaWduJSc6IHNpZ24sXG5cdCclUmVmbGVjdC5nZXRQcm90b3R5cGVPZiUnOiAkUmVmbGVjdEdQT1xufTtcblxuaWYgKGdldFByb3RvKSB7XG5cdHRyeSB7XG5cdFx0bnVsbC5lcnJvcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNoYWRvd3JlYWxtL3B1bGwvMzg0I2lzc3VlY29tbWVudC0xMzY0MjY0MjI5XG5cdFx0dmFyIGVycm9yUHJvdG8gPSBnZXRQcm90byhnZXRQcm90byhlKSk7XG5cdFx0SU5UUklOU0lDU1snJUVycm9yLnByb3RvdHlwZSUnXSA9IGVycm9yUHJvdG87XG5cdH1cbn1cblxudmFyIGRvRXZhbCA9IGZ1bmN0aW9uIGRvRXZhbChuYW1lKSB7XG5cdHZhciB2YWx1ZTtcblx0aWYgKG5hbWUgPT09ICclQXN5bmNGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2FzeW5jIGZ1bmN0aW9uICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVHZW5lcmF0b3JGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2Z1bmN0aW9uKiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2FzeW5jIGZ1bmN0aW9uKiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNHZW5lcmF0b3IlJykge1xuXHRcdHZhciBmbiA9IGRvRXZhbCgnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJyk7XG5cdFx0aWYgKGZuKSB7XG5cdFx0XHR2YWx1ZSA9IGZuLnByb3RvdHlwZTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJScpIHtcblx0XHR2YXIgZ2VuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3IlJyk7XG5cdFx0aWYgKGdlbiAmJiBnZXRQcm90bykge1xuXHRcdFx0dmFsdWUgPSBnZXRQcm90byhnZW4ucHJvdG90eXBlKTtcblx0XHR9XG5cdH1cblxuXHRJTlRSSU5TSUNTW25hbWVdID0gdmFsdWU7XG5cblx0cmV0dXJuIHZhbHVlO1xufTtcblxudmFyIExFR0FDWV9BTElBU0VTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzb3duJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbCgkY2FsbCwgQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG52YXIgJHNwbGljZUFwcGx5ID0gYmluZC5jYWxsKCRhcHBseSwgQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG52YXIgJHJlcGxhY2UgPSBiaW5kLmNhbGwoJGNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKCRjYWxsLCBTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcbnZhciAkZXhlYyA9IGJpbmQuY2FsbCgkY2FsbCwgUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcblxuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZzsgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuXHR2YXIgZmlyc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAwLCAxKTtcblx0dmFyIGxhc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAtMSk7XG5cdGlmIChmaXJzdCA9PT0gJyUnICYmIGxhc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAnKTtcblx0fSBlbHNlIGlmIChsYXN0ID09PSAnJScgJiYgZmlyc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gW107XG5cdCRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcblx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljTmFtZSA9IG5hbWU7XG5cdHZhciBhbGlhcztcblx0aWYgKGhhc093bihMRUdBQ1lfQUxJQVNFUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHRhbGlhcyA9IExFR0FDWV9BTElBU0VTW2ludHJpbnNpY05hbWVdO1xuXHRcdGludHJpbnNpY05hbWUgPSAnJScgKyBhbGlhc1swXSArICclJztcblx0fVxuXG5cdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHR2YXIgdmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gbmVlZHNFdmFsKSB7XG5cdFx0XHR2YWx1ZSA9IGRvRXZhbChpbnRyaW5zaWNOYW1lKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdG5hbWU6IGludHJpbnNpY05hbWUsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG5cblx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHRpZiAoJGV4ZWMoL14lP1teJV0qJT8kLywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmRCYXNpYyA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzJyk7XG5cbi8qKiBAdHlwZSB7KHRoaXNBcmc6IHN0cmluZywgc2VhcmNoU3RyaW5nOiBzdHJpbmcsIHBvc2l0aW9uPzogbnVtYmVyKSA9PiBudW1iZXJ9ICovXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZEJhc2ljKFtHZXRJbnRyaW5zaWMoJyVTdHJpbmcucHJvdG90eXBlLmluZGV4T2YlJyldKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJvdW5kSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHQvKiBlc2xpbnQgbm8tZXh0cmEtcGFyZW5zOiAwICovXG5cblx0dmFyIGludHJpbnNpYyA9IC8qKiBAdHlwZSB7KHRoaXM6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bn0gKi8gKEdldEludHJpbnNpYyhuYW1lLCAhIWFsbG93TWlzc2luZykpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kQmFzaWMoLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtpbnRyaW5zaWNdKSk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xudmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoXG5cdFx0aGFzVG9TdHJpbmdUYWdcblx0XHQmJiB2YWx1ZVxuXHRcdCYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcblx0XHQmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWVcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiAkdG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgaXNMZWdhY3lBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoaXNTdGFuZGFyZEFyZ3VtZW50cyh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gdmFsdWUgIT09IG51bGxcblx0XHQmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG5cdFx0JiYgJ2xlbmd0aCcgaW4gdmFsdWVcblx0XHQmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJ1xuXHRcdCYmIHZhbHVlLmxlbmd0aCA+PSAwXG5cdFx0JiYgJHRvU3RyaW5nKHZhbHVlKSAhPT0gJ1tvYmplY3QgQXJyYXldJ1xuXHRcdCYmICdjYWxsZWUnIGluIHZhbHVlXG5cdFx0JiYgJHRvU3RyaW5nKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cyk7XG59KCkpO1xuXG4vLyBAdHMtZXhwZWN0LWVycm9yIFRPRE8gbWFrZSB0aGlzIG5vdCBlcnJvclxuaXNTdGFuZGFyZEFyZ3VtZW50cy5pc0xlZ2FjeUFyZ3VtZW50cyA9IGlzTGVnYWN5QXJndW1lbnRzOyAvLyBmb3IgdGVzdHNcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJ2hhc293bicpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgZm47XG5cbmlmIChoYXNUb1N0cmluZ1RhZykge1xuXHQvKiogQHR5cGUgeyhyZWNlaXZlcjogVGhpc1BhcmFtZXRlclR5cGU8dHlwZW9mIFJlZ0V4cC5wcm90b3R5cGUuZXhlYz4sIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIFJlZ0V4cC5wcm90b3R5cGUuZXhlYz4pID0+IFJldHVyblR5cGU8dHlwZW9mIFJlZ0V4cC5wcm90b3R5cGUuZXhlYz59ICovXG5cdHZhciAkZXhlYyA9IGNhbGxCb3VuZCgnUmVnRXhwLnByb3RvdHlwZS5leGVjJyk7XG5cdC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuXHR2YXIgaXNSZWdleE1hcmtlciA9IHt9O1xuXG5cdHZhciB0aHJvd1JlZ2V4TWFya2VyID0gZnVuY3Rpb24gKCkge1xuXHRcdHRocm93IGlzUmVnZXhNYXJrZXI7XG5cdH07XG5cdC8qKiBAdHlwZSB7eyB0b1N0cmluZygpOiBuZXZlciwgdmFsdWVPZigpOiBuZXZlciwgW1N5bWJvbC50b1ByaW1pdGl2ZV0/KCk6IG5ldmVyIH19ICovXG5cdHZhciBiYWRTdHJpbmdpZmllciA9IHtcblx0XHR0b1N0cmluZzogdGhyb3dSZWdleE1hcmtlcixcblx0XHR2YWx1ZU9mOiB0aHJvd1JlZ2V4TWFya2VyXG5cdH07XG5cblx0aWYgKHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgPT09ICdzeW1ib2wnKSB7XG5cdFx0YmFkU3RyaW5naWZpZXJbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IHRocm93UmVnZXhNYXJrZXI7XG5cdH1cblxuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNhbid0IGZpZ3VyZSBvdXQgdGhhdCB0aGUgJGV4ZWMgY2FsbCBhbHdheXMgdGhyb3dzXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRmbiA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0XHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0dmFyIGRlc2NyaXB0b3IgPSAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiBnT1BEPn0gKi8gKGdPUEQpKC8qKiBAdHlwZSB7eyBsYXN0SW5kZXg/OiB1bmtub3duIH19ICovICh2YWx1ZSksICdsYXN0SW5kZXgnKTtcblx0XHR2YXIgaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBoYXNPd24oZGVzY3JpcHRvciwgJ3ZhbHVlJyk7XG5cdFx0aWYgKCFoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0JGV4ZWModmFsdWUsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoYmFkU3RyaW5naWZpZXIpKSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGUgPT09IGlzUmVnZXhNYXJrZXI7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblx0LyoqIEB0eXBlIHsocmVjZWl2ZXI6IFRoaXNQYXJhbWV0ZXJUeXBlPHR5cGVvZiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nPiwgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz4pID0+IFJldHVyblR5cGU8dHlwZW9mIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc+fSAqL1xuXHR2YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cdC8qKiBAY29uc3QgQHR5cGUgeydbb2JqZWN0IFJlZ0V4cF0nfSAqL1xuXHR2YXIgcmVnZXhDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nO1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5cdGZuID0gZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRcdC8vIEluIG9sZGVyIGJyb3dzZXJzLCB0eXBlb2YgcmVnZXggaW5jb3JyZWN0bHkgcmV0dXJucyAnZnVuY3Rpb24nXG5cdFx0aWYgKCF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm47XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1ib3VuZCcpO1xudmFyIGlzUmVnZXggPSByZXF1aXJlKCdpcy1yZWdleCcpO1xuXG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZWdleFRlc3RlcihyZWdleCkge1xuXHRpZiAoIWlzUmVnZXgocmVnZXgpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ByZWdleGAgbXVzdCBiZSBhIFJlZ0V4cCcpO1xuXHR9XG5cdHJldHVybiBmdW5jdGlvbiB0ZXN0KHMpIHtcblx0XHRyZXR1cm4gJGV4ZWMocmVnZXgsIHMpICE9PSBudWxsO1xuXHR9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnMsIG5vLWVtcHR5LWZ1bmN0aW9uXG5jb25zdCBjYWNoZWQgPSAvKiogQHR5cGUge0dlbmVyYXRvckZ1bmN0aW9uQ29uc3RydWN0b3J9ICovIChmdW5jdGlvbiogKCkge30uY29uc3RydWN0b3IpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAoKSA9PiBjYWNoZWQ7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgc2FmZVJlZ2V4VGVzdCA9IHJlcXVpcmUoJ3NhZmUtcmVnZXgtdGVzdCcpO1xudmFyIGlzRm5SZWdleCA9IHNhZmVSZWdleFRlc3QoL15cXHMqKD86ZnVuY3Rpb24pP1xcKi8pO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJ2dldC1wcm90bycpO1xuXG52YXIgdG9TdHIgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBmblRvU3RyID0gY2FsbEJvdW5kKCdGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIGdldEdlbmVyYXRvckZ1bmN0aW9uID0gcmVxdWlyZSgnZ2VuZXJhdG9yLWZ1bmN0aW9uJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzR2VuZXJhdG9yRnVuY3Rpb24oZm4pIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoaXNGblJlZ2V4KGZuVG9TdHIoZm4pKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcpIHtcblx0XHR2YXIgc3RyID0gdG9TdHIoZm4pO1xuXHRcdHJldHVybiBzdHIgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG5cdH1cblx0aWYgKCFnZXRQcm90bykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR2YXIgR2VuZXJhdG9yRnVuY3Rpb24gPSBnZXRHZW5lcmF0b3JGdW5jdGlvbigpO1xuXHRyZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24gJiYgZ2V0UHJvdG8oZm4pID09PSBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgcmVmbGVjdEFwcGx5ID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U7XG52YXIgaXNDYWxsYWJsZU1hcmtlcjtcbmlmICh0eXBlb2YgcmVmbGVjdEFwcGx5ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0dHJ5IHtcblx0XHRiYWRBcnJheUxpa2UgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdsZW5ndGgnLCB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpc0NhbGxhYmxlTWFya2VyID0ge307XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcblx0XHRyZWZsZWN0QXBwbHkoZnVuY3Rpb24gKCkgeyB0aHJvdyA0MjsgfSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcblx0fSBjYXRjaCAoXykge1xuXHRcdGlmIChfICE9PSBpc0NhbGxhYmxlTWFya2VyKSB7XG5cdFx0XHRyZWZsZWN0QXBwbHkgPSBudWxsO1xuXHRcdH1cblx0fVxufSBlbHNlIHtcblx0cmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0dmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cblx0fVxufTtcblxudmFyIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25Ub1N0cih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgZm5DbGFzcyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG52YXIgZ2VuQ2xhc3MgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xudmFyIGRkYUNsYXNzID0gJ1tvYmplY3QgSFRNTEFsbENvbGxlY3Rpb25dJzsgLy8gSUUgMTFcbnZhciBkZGFDbGFzczIgPSAnW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10nO1xudmFyIGRkYUNsYXNzMyA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7IC8vIElFIDktMTBcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7IC8vIGJldHRlcjogdXNlIGBoYXMtdG9zdHJpbmd0YWdgXG5cbnZhciBpc0lFNjggPSAhKDAgaW4gWyxdKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zcGFyc2UtYXJyYXlzLCBjb21tYS1zcGFjaW5nXG5cbnZhciBpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG5cdC8vIEZpcmVmb3ggMyBjYW5vbmljYWxpemVzIEREQSB0byB1bmRlZmluZWQgd2hlbiBpdCdzIG5vdCBhY2Nlc3NlZCBkaXJlY3RseVxuXHR2YXIgYWxsID0gZG9jdW1lbnQuYWxsO1xuXHRpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcblx0XHRpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwodmFsdWUpIHtcblx0XHRcdC8qIGdsb2JhbHMgZG9jdW1lbnQ6IGZhbHNlICovXG5cdFx0XHQvLyBpbiBJRSA2LTgsIHR5cGVvZiBkb2N1bWVudC5hbGwgaXMgXCJvYmplY3RcIiBhbmQgaXQncyB0cnV0aHlcblx0XHRcdGlmICgoaXNJRTY4IHx8ICF2YWx1ZSkgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdHN0ciA9PT0gZGRhQ2xhc3Ncblx0XHRcdFx0XHRcdHx8IHN0ciA9PT0gZGRhQ2xhc3MyXG5cdFx0XHRcdFx0XHR8fCBzdHIgPT09IGRkYUNsYXNzMyAvLyBvcGVyYSAxMi4xNlxuXHRcdFx0XHRcdFx0fHwgc3RyID09PSBvYmplY3RDbGFzcyAvLyBJRSA2LThcblx0XHRcdFx0XHQpICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7IC8qKi8gfVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0QXBwbHlcblx0PyBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7XG5cdFx0aWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdHRyeSB7XG5cdFx0XHRyZWZsZWN0QXBwbHkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0fVxuXHRcdHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG5cdH1cblx0OiBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7XG5cdFx0aWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGlmIChoYXNUb1N0cmluZ1RhZykgeyByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpOyB9XG5cdFx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0dmFyIHN0ckNsYXNzID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0aWYgKHN0ckNsYXNzICE9PSBmbkNsYXNzICYmIHN0ckNsYXNzICE9PSBnZW5DbGFzcyAmJiAhKC9eXFxbb2JqZWN0IEhUTUwvKS50ZXN0KHN0ckNsYXNzKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRyZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xuXHR9O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEB0eXBlIHs8VGhpcywgQSBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oYXJyOiBBLCBpdGVyYXRvcjogKHRoaXM6IFRoaXMgfCB2b2lkLCB2YWx1ZTogQVtudW1iZXJdLCBpbmRleDogbnVtYmVyLCBhcnI6IEEpID0+IHZvaWQsIHJlY2VpdmVyOiBUaGlzIHwgdW5kZWZpbmVkKSA9PiB2b2lkfSAqL1xudmFyIGZvckVhY2hBcnJheSA9IGZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCBpKSkge1xuICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJheVtpXSwgaSwgYXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBhcnJheVtpXSwgaSwgYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqIEB0eXBlIHs8VGhpcywgUyBleHRlbmRzIHN0cmluZz4oc3RyaW5nOiBTLCBpdGVyYXRvcjogKHRoaXM6IFRoaXMgfCB2b2lkLCB2YWx1ZTogU1tudW1iZXJdLCBpbmRleDogbnVtYmVyLCBzdHJpbmc6IFMpID0+IHZvaWQsIHJlY2VpdmVyOiBUaGlzIHwgdW5kZWZpbmVkKSA9PiB2b2lkfSAqL1xudmFyIGZvckVhY2hTdHJpbmcgPSBmdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy5cbiAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqIEB0eXBlIHs8VGhpcywgTz4ob2JqOiBPLCBpdGVyYXRvcjogKHRoaXM6IFRoaXMgfCB2b2lkLCB2YWx1ZTogT1trZXlvZiBPXSwgaW5kZXg6IGtleW9mIE8sIG9iajogTykgPT4gdm9pZCwgcmVjZWl2ZXI6IFRoaXMgfCB1bmRlZmluZWQpID0+IHZvaWR9ICovXG52YXIgZm9yRWFjaE9iamVjdCA9IGZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpIHtcbiAgICBmb3IgKHZhciBrIGluIG9iamVjdCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGspKSB7XG4gICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG9iamVjdFtrXSwgaywgb2JqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChyZWNlaXZlciwgb2JqZWN0W2tdLCBrLCBvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqIEB0eXBlIHsoeDogdW5rbm93bikgPT4geCBpcyByZWFkb25seSB1bmtub3duW119ICovXG5mdW5jdGlvbiBpc0FycmF5KHgpIHtcbiAgICByZXR1cm4gdG9TdHIuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5faW50ZXJuYWx9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvckVhY2gobGlzdCwgaXRlcmF0b3IsIHRoaXNBcmcpIHtcbiAgICBpZiAoIWlzQ2FsbGFibGUoaXRlcmF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHZhciByZWNlaXZlcjtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIHJlY2VpdmVyID0gdGhpc0FyZztcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheShsaXN0KSkge1xuICAgICAgICBmb3JFYWNoQXJyYXkobGlzdCwgaXRlcmF0b3IsIHJlY2VpdmVyKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBmb3JFYWNoU3RyaW5nKGxpc3QsIGl0ZXJhdG9yLCByZWNlaXZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yRWFjaE9iamVjdChsaXN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpO1xuICAgIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBbXG5cdCdGbG9hdDE2QXJyYXknLFxuXHQnRmxvYXQzMkFycmF5Jyxcblx0J0Zsb2F0NjRBcnJheScsXG5cdCdJbnQ4QXJyYXknLFxuXHQnSW50MTZBcnJheScsXG5cdCdJbnQzMkFycmF5Jyxcblx0J1VpbnQ4QXJyYXknLFxuXHQnVWludDhDbGFtcGVkQXJyYXknLFxuXHQnVWludDE2QXJyYXknLFxuXHQnVWludDMyQXJyYXknLFxuXHQnQmlnSW50NjRBcnJheScsXG5cdCdCaWdVaW50NjRBcnJheSdcbl07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcG9zc2libGVOYW1lcyA9IHJlcXVpcmUoJ3Bvc3NpYmxlLXR5cGVkLWFycmF5LW5hbWVzJyk7XG5cbnZhciBnID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogZ2xvYmFsVGhpcztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXZhaWxhYmxlVHlwZWRBcnJheXMoKSB7XG5cdHZhciAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGF2YWlsYWJsZVR5cGVkQXJyYXlzPn0gKi8gb3V0ID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcG9zc2libGVOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgZ1twb3NzaWJsZU5hbWVzW2ldXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvclxuXHRcdFx0b3V0W291dC5sZW5ndGhdID0gcG9zc2libGVOYW1lc1tpXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciBnb3BkID0gcmVxdWlyZSgnZ29wZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkoXG5cdG9iaixcblx0cHJvcGVydHksXG5cdHZhbHVlXG4pIHtcblx0aWYgKCFvYmogfHwgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BvYmpgIG11c3QgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb25gJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSAnc3ltYm9sJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHR5cGVvZiBhcmd1bWVudHNbM10gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbM10gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkVudW1lcmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNCAmJiB0eXBlb2YgYXJndW1lbnRzWzRdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzRdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Xcml0YWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIHR5cGVvZiBhcmd1bWVudHNbNV0gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbNV0gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIHR5cGVvZiBhcmd1bWVudHNbNl0gIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBub25FbnVtZXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXHR2YXIgbm9uV3JpdGFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IG51bGw7XG5cdHZhciBub25Db25maWd1cmFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ID8gYXJndW1lbnRzWzZdIDogZmFsc2U7XG5cblx0LyogQHR5cGUge2ZhbHNlIHwgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj59ICovXG5cdHZhciBkZXNjID0gISFnb3BkICYmIGdvcGQob2JqLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IG5vbkNvbmZpZ3VyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5jb25maWd1cmFibGUgOiAhbm9uQ29uZmlndXJhYmxlLFxuXHRcdFx0ZW51bWVyYWJsZTogbm9uRW51bWVyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5lbnVtZXJhYmxlIDogIW5vbkVudW1lcmFibGUsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogbm9uV3JpdGFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2Mud3JpdGFibGUgOiAhbm9uV3JpdGFibGVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChsb29zZSB8fCAoIW5vbkVudW1lcmFibGUgJiYgIW5vbldyaXRhYmxlICYmICFub25Db25maWd1cmFibGUpKSB7XG5cdFx0Ly8gbXVzdCBmYWxsIGJhY2sgdG8gW1tTZXRdXSwgYW5kIHdhcyBub3QgZXhwbGljaXRseSBhc2tlZCB0byBtYWtlIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1jb25maWd1cmFibGVcblx0XHRvYmpbcHJvcGVydHldID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZGVmaW5pbmcgYSBwcm9wZXJ0eSBhcyBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1lbnVtZXJhYmxlLicpO1xuXHR9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKSB7XG5cdHJldHVybiAhISRkZWZpbmVQcm9wZXJ0eTtcbn07XG5cbmhhc1Byb3BlcnR5RGVzY3JpcHRvcnMuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcgPSBmdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1ZygpIHtcblx0Ly8gbm9kZSB2MC42IGhhcyBhIGJ1ZyB3aGVyZSBhcnJheSBsZW5ndGhzIGNhbiBiZSBTZXQgYnV0IG5vdCBEZWZpbmVkXG5cdGlmICghJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gJGRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB2YWx1ZTogMSB9KS5sZW5ndGggIT09IDE7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBGaXJlZm94IDQtMjIsIGRlZmluaW5nIGxlbmd0aCBvbiBhbiBhcnJheSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1kYXRhLXByb3BlcnR5Jyk7XG52YXIgaGFzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdoYXMtcHJvcGVydHktZGVzY3JpcHRvcnMnKSgpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkZmxvb3IgPSBHZXRJbnRyaW5zaWMoJyVNYXRoLmZsb29yJScpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXRGdW5jdGlvbkxlbmd0aChmbiwgbGVuZ3RoKSB7XG5cdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGZuYCBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHR9XG5cdGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBsZW5ndGggPCAwIHx8IGxlbmd0aCA+IDB4RkZGRkZGRkYgfHwgJGZsb29yKGxlbmd0aCkgIT09IGxlbmd0aCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbGVuZ3RoYCBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXInKTtcblx0fVxuXG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmICEhYXJndW1lbnRzWzJdO1xuXG5cdHZhciBmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlID0gdHJ1ZTtcblx0dmFyIGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSA9IHRydWU7XG5cdGlmICgnbGVuZ3RoJyBpbiBmbiAmJiBnT1BEKSB7XG5cdFx0dmFyIGRlc2MgPSBnT1BEKGZuLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHRmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChkZXNjICYmICFkZXNjLndyaXRhYmxlKSB7XG5cdFx0XHRmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSB8fCBmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgfHwgIWxvb3NlKSB7XG5cdFx0aWYgKGhhc0Rlc2NyaXB0b3JzKSB7XG5cdFx0XHRkZWZpbmUoLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPGRlZmluZT5bMF19ICovIChmbiksICdsZW5ndGgnLCBsZW5ndGgsIHRydWUsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWZpbmUoLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPGRlZmluZT5bMF19ICovIChmbiksICdsZW5ndGgnLCBsZW5ndGgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm47XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgJGFwcGx5ID0gcmVxdWlyZSgnLi9mdW5jdGlvbkFwcGx5Jyk7XG52YXIgYWN0dWFsQXBwbHkgPSByZXF1aXJlKCcuL2FjdHVhbEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FwcGx5QmluZCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG5cdHJldHVybiBhY3R1YWxBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHNldEZ1bmN0aW9uTGVuZ3RoID0gcmVxdWlyZSgnc2V0LWZ1bmN0aW9uLWxlbmd0aCcpO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBjYWxsQmluZEJhc2ljID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMnKTtcbnZhciBhcHBseUJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycy9hcHBseUJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdHZhciBmdW5jID0gY2FsbEJpbmRCYXNpYyhhcmd1bWVudHMpO1xuXHR2YXIgYWRqdXN0ZWRMZW5ndGggPSAxICsgb3JpZ2luYWxGdW5jdGlvbi5sZW5ndGggLSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXHRyZXR1cm4gc2V0RnVuY3Rpb25MZW5ndGgoXG5cdFx0ZnVuYyxcblx0XHRhZGp1c3RlZExlbmd0aCA+IDAgPyBhZGp1c3RlZExlbmd0aCA6IDAsXG5cdFx0dHJ1ZVxuXHQpO1xufTtcblxuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHQkZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhcHBseScsIHsgdmFsdWU6IGFwcGx5QmluZCB9KTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzLmFwcGx5ID0gYXBwbHlCaW5kO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpO1xudmFyIGF2YWlsYWJsZVR5cGVkQXJyYXlzID0gcmVxdWlyZSgnYXZhaWxhYmxlLXR5cGVkLWFycmF5cycpO1xudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1ib3VuZCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG52YXIgZ2V0UHJvdG8gPSByZXF1aXJlKCdnZXQtcHJvdG8nKTtcblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xudmFyIHR5cGVkQXJyYXlzID0gYXZhaWxhYmxlVHlwZWRBcnJheXMoKTtcblxudmFyICRzbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xuXG4vKiogQHR5cGUgezxUID0gdW5rbm93bj4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgdmFsdWU6IHVua25vd24pID0+IG51bWJlcn0gKi9cbnZhciAkaW5kZXhPZiA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLmluZGV4T2YnLCB0cnVlKSB8fCBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0aWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIGk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiAtMTtcbn07XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL3R5cGVzJykuR2V0dGVyfSBHZXR0ZXIgKi9cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3R5cGVzJykuQ2FjaGV9ICovXG52YXIgY2FjaGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuaWYgKGhhc1RvU3RyaW5nVGFnICYmIGdPUEQgJiYgZ2V0UHJvdG8pIHtcblx0Zm9yRWFjaCh0eXBlZEFycmF5cywgZnVuY3Rpb24gKHR5cGVkQXJyYXkpIHtcblx0XHR2YXIgYXJyID0gbmV3IGdbdHlwZWRBcnJheV0oKTtcblx0XHRpZiAoU3ltYm9sLnRvU3RyaW5nVGFnIGluIGFyciAmJiBnZXRQcm90bykge1xuXHRcdFx0dmFyIHByb3RvID0gZ2V0UHJvdG8oYXJyKTtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgd29uJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmVcblx0XHRcdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdGlmICghZGVzY3JpcHRvciAmJiBwcm90bykge1xuXHRcdFx0XHR2YXIgc3VwZXJQcm90byA9IGdldFByb3RvKHByb3RvKTtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyB3b24ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZVxuXHRcdFx0XHRkZXNjcmlwdG9yID0gZ09QRChzdXBlclByb3RvLCBTeW1ib2wudG9TdHJpbmdUYWcpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5nZXQpIHtcblx0XHRcdFx0dmFyIGJvdW5kID0gY2FsbEJpbmQoZGVzY3JpcHRvci5nZXQpO1xuXHRcdFx0XHRjYWNoZVtcblx0XHRcdFx0XHQvKiogQHR5cGUge2AkJHtpbXBvcnQoJy4nKS5UeXBlZEFycmF5TmFtZX1gfSAqLyAoJyQnICsgdHlwZWRBcnJheSlcblx0XHRcdFx0XSA9IGJvdW5kO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59IGVsc2Uge1xuXHRmb3JFYWNoKHR5cGVkQXJyYXlzLCBmdW5jdGlvbiAodHlwZWRBcnJheSkge1xuXHRcdHZhciBhcnIgPSBuZXcgZ1t0eXBlZEFycmF5XSgpO1xuXHRcdHZhciBmbiA9IGFyci5zbGljZSB8fCBhcnIuc2V0O1xuXHRcdGlmIChmbikge1xuXHRcdFx0dmFyIGJvdW5kID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4vdHlwZXMnKS5Cb3VuZFNsaWNlIHwgaW1wb3J0KCcuL3R5cGVzJykuQm91bmRTZXR9ICovIChcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPIEZJWE1FXG5cdFx0XHRcdGNhbGxCaW5kKGZuKVxuXHRcdFx0KTtcblx0XHRcdGNhY2hlW1xuXHRcdFx0XHQvKiogQHR5cGUge2AkJHtpbXBvcnQoJy4nKS5UeXBlZEFycmF5TmFtZX1gfSAqLyAoJyQnICsgdHlwZWRBcnJheSlcblx0XHRcdF0gPSBib3VuZDtcblx0XHR9XG5cdH0pO1xufVxuXG4vKiogQHR5cGUgeyh2YWx1ZTogb2JqZWN0KSA9PiBmYWxzZSB8IGltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfSAqL1xudmFyIHRyeVR5cGVkQXJyYXlzID0gZnVuY3Rpb24gdHJ5QWxsVHlwZWRBcnJheXModmFsdWUpIHtcblx0LyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiB0cnlBbGxUeXBlZEFycmF5cz59ICovIHZhciBmb3VuZCA9IGZhbHNlO1xuXHRmb3JFYWNoKFxuXHRcdC8qKiBAdHlwZSB7UmVjb3JkPGBcXCQke2ltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfWAsIEdldHRlcj59ICovIChjYWNoZSksXG5cdFx0LyoqIEB0eXBlIHsoZ2V0dGVyOiBHZXR0ZXIsIG5hbWU6IGBcXCQke2ltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfWApID0+IHZvaWR9ICovXG5cdFx0ZnVuY3Rpb24gKGdldHRlciwgdHlwZWRBcnJheSkge1xuXHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgYSB0aHJvdyBpcyBmaW5lIGhlcmVcblx0XHRcdFx0XHRpZiAoJyQnICsgZ2V0dGVyKHZhbHVlKSA9PT0gdHlwZWRBcnJheSkge1xuXHRcdFx0XHRcdFx0Zm91bmQgPSAvKiogQHR5cGUge2ltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfSAqLyAoJHNsaWNlKHR5cGVkQXJyYXksIDEpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xuXHRyZXR1cm4gZm91bmQ7XG59O1xuXG4vKiogQHR5cGUgeyh2YWx1ZTogb2JqZWN0KSA9PiBmYWxzZSB8IGltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfSAqL1xudmFyIHRyeVNsaWNlcyA9IGZ1bmN0aW9uIHRyeUFsbFNsaWNlcyh2YWx1ZSkge1xuXHQvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHRyeUFsbFNsaWNlcz59ICovIHZhciBmb3VuZCA9IGZhbHNlO1xuXHRmb3JFYWNoKFxuXHRcdC8qKiBAdHlwZSB7UmVjb3JkPGBcXCQke2ltcG9ydCgnLicpLlR5cGVkQXJyYXlOYW1lfWAsIEdldHRlcj59ICovKGNhY2hlKSxcblx0XHQvKiogQHR5cGUgeyhnZXR0ZXI6IEdldHRlciwgbmFtZTogYFxcJCR7aW1wb3J0KCcuJykuVHlwZWRBcnJheU5hbWV9YCkgPT4gdm9pZH0gKi8gZnVuY3Rpb24gKGdldHRlciwgbmFtZSkge1xuXHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgYSB0aHJvdyBpcyBmaW5lIGhlcmVcblx0XHRcdFx0XHRnZXR0ZXIodmFsdWUpO1xuXHRcdFx0XHRcdGZvdW5kID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5UeXBlZEFycmF5TmFtZX0gKi8gKCRzbGljZShuYW1lLCAxKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xuXHRyZXR1cm4gZm91bmQ7XG59O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGljaFR5cGVkQXJyYXkodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoIWhhc1RvU3RyaW5nVGFnKSB7XG5cdFx0LyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cdFx0dmFyIHRhZyA9ICRzbGljZSgkdG9TdHJpbmcodmFsdWUpLCA4LCAtMSk7XG5cdFx0aWYgKCRpbmRleE9mKHR5cGVkQXJyYXlzLCB0YWcpID4gLTEpIHtcblx0XHRcdHJldHVybiB0YWc7XG5cdFx0fVxuXHRcdGlmICh0YWcgIT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIG5vZGUgPCAwLjYgaGl0cyBoZXJlIG9uIHJlYWwgVHlwZWQgQXJyYXlzXG5cdFx0cmV0dXJuIHRyeVNsaWNlcyh2YWx1ZSk7XG5cdH1cblx0aWYgKCFnT1BEKSB7IHJldHVybiBudWxsOyB9IC8vIHVua25vd24gZW5naW5lXG5cdHJldHVybiB0cnlUeXBlZEFycmF5cyh2YWx1ZSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHdoaWNoVHlwZWRBcnJheSA9IHJlcXVpcmUoJ3doaWNoLXR5cGVkLWFycmF5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRyZXR1cm4gISF3aGljaFR5cGVkQXJyYXkodmFsdWUpO1xufTtcbiIsICIvLyBDdXJyZW50bHkgaW4gc3luYyB3aXRoIE5vZGUuanMgbGliL2ludGVybmFsL3V0aWwvdHlwZXMuanNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9jb21taXQvMTEyY2M3YzI3NTUxMjU0YWEyYjE3MDk4ZmI3NzQ4NjdmMDVlZDBkOVxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0FyZ3VtZW50c09iamVjdCA9IHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpO1xudmFyIGlzR2VuZXJhdG9yRnVuY3Rpb24gPSByZXF1aXJlKCdpcy1nZW5lcmF0b3ItZnVuY3Rpb24nKTtcbnZhciB3aGljaFR5cGVkQXJyYXkgPSByZXF1aXJlKCd3aGljaC10eXBlZC1hcnJheScpO1xudmFyIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJ2lzLXR5cGVkLWFycmF5Jyk7XG5cbmZ1bmN0aW9uIHVuY3VycnlUaGlzKGYpIHtcbiAgcmV0dXJuIGYuY2FsbC5iaW5kKGYpO1xufVxuXG52YXIgQmlnSW50U3VwcG9ydGVkID0gdHlwZW9mIEJpZ0ludCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgU3ltYm9sU3VwcG9ydGVkID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbnZhciBPYmplY3RUb1N0cmluZyA9IHVuY3VycnlUaGlzKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuXG52YXIgbnVtYmVyVmFsdWUgPSB1bmN1cnJ5VGhpcyhOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YpO1xudmFyIHN0cmluZ1ZhbHVlID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mKTtcbnZhciBib29sZWFuVmFsdWUgPSB1bmN1cnJ5VGhpcyhCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mKTtcblxuaWYgKEJpZ0ludFN1cHBvcnRlZCkge1xuICB2YXIgYmlnSW50VmFsdWUgPSB1bmN1cnJ5VGhpcyhCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YpO1xufVxuXG5pZiAoU3ltYm9sU3VwcG9ydGVkKSB7XG4gIHZhciBzeW1ib2xWYWx1ZSA9IHVuY3VycnlUaGlzKFN5bWJvbC5wcm90b3R5cGUudmFsdWVPZik7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsIHByb3RvdHlwZVZhbHVlT2YpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBwcm90b3R5cGVWYWx1ZU9mKHZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydHMuaXNBcmd1bWVudHNPYmplY3QgPSBpc0FyZ3VtZW50c09iamVjdDtcbmV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGlzR2VuZXJhdG9yRnVuY3Rpb247XG5leHBvcnRzLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcblxuLy8gVGFrZW4gZnJvbSBoZXJlIGFuZCBtb2RpZmllZCBmb3IgYmV0dGVyIGJyb3dzZXIgc3VwcG9ydFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9wLWlzLXByb21pc2UvYmxvYi9jZGEzNWE1MTNiZGEwM2Y5NzdhZDVjZGUzYTA3OWQyMzdlODJkN2VmL2luZGV4LmpzXG5mdW5jdGlvbiBpc1Byb21pc2UoaW5wdXQpIHtcblx0cmV0dXJuIChcblx0XHQoXG5cdFx0XHR0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcblx0XHRcdGlucHV0IGluc3RhbmNlb2YgUHJvbWlzZVxuXHRcdCkgfHxcblx0XHQoXG5cdFx0XHRpbnB1dCAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIGlucHV0LnRoZW4gPT09ICdmdW5jdGlvbicgJiZcblx0XHRcdHR5cGVvZiBpbnB1dC5jYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdClcblx0KTtcbn1cbmV4cG9ydHMuaXNQcm9taXNlID0gaXNQcm9taXNlO1xuXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgaXNUeXBlZEFycmF5KHZhbHVlKSB8fFxuICAgIGlzRGF0YVZpZXcodmFsdWUpXG4gICk7XG59XG5leHBvcnRzLmlzQXJyYXlCdWZmZXJWaWV3ID0gaXNBcnJheUJ1ZmZlclZpZXc7XG5cblxuZnVuY3Rpb24gaXNVaW50OEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnVWludDhBcnJheSc7XG59XG5leHBvcnRzLmlzVWludDhBcnJheSA9IGlzVWludDhBcnJheTtcblxuZnVuY3Rpb24gaXNVaW50OENsYW1wZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ1VpbnQ4Q2xhbXBlZEFycmF5Jztcbn1cbmV4cG9ydHMuaXNVaW50OENsYW1wZWRBcnJheSA9IGlzVWludDhDbGFtcGVkQXJyYXk7XG5cbmZ1bmN0aW9uIGlzVWludDE2QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdVaW50MTZBcnJheSc7XG59XG5leHBvcnRzLmlzVWludDE2QXJyYXkgPSBpc1VpbnQxNkFycmF5O1xuXG5mdW5jdGlvbiBpc1VpbnQzMkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnVWludDMyQXJyYXknO1xufVxuZXhwb3J0cy5pc1VpbnQzMkFycmF5ID0gaXNVaW50MzJBcnJheTtcblxuZnVuY3Rpb24gaXNJbnQ4QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdJbnQ4QXJyYXknO1xufVxuZXhwb3J0cy5pc0ludDhBcnJheSA9IGlzSW50OEFycmF5O1xuXG5mdW5jdGlvbiBpc0ludDE2QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdJbnQxNkFycmF5Jztcbn1cbmV4cG9ydHMuaXNJbnQxNkFycmF5ID0gaXNJbnQxNkFycmF5O1xuXG5mdW5jdGlvbiBpc0ludDMyQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdJbnQzMkFycmF5Jztcbn1cbmV4cG9ydHMuaXNJbnQzMkFycmF5ID0gaXNJbnQzMkFycmF5O1xuXG5mdW5jdGlvbiBpc0Zsb2F0MzJBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0Zsb2F0MzJBcnJheSc7XG59XG5leHBvcnRzLmlzRmxvYXQzMkFycmF5ID0gaXNGbG9hdDMyQXJyYXk7XG5cbmZ1bmN0aW9uIGlzRmxvYXQ2NEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnRmxvYXQ2NEFycmF5Jztcbn1cbmV4cG9ydHMuaXNGbG9hdDY0QXJyYXkgPSBpc0Zsb2F0NjRBcnJheTtcblxuZnVuY3Rpb24gaXNCaWdJbnQ2NEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnQmlnSW50NjRBcnJheSc7XG59XG5leHBvcnRzLmlzQmlnSW50NjRBcnJheSA9IGlzQmlnSW50NjRBcnJheTtcblxuZnVuY3Rpb24gaXNCaWdVaW50NjRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0JpZ1VpbnQ2NEFycmF5Jztcbn1cbmV4cG9ydHMuaXNCaWdVaW50NjRBcnJheSA9IGlzQmlnVWludDY0QXJyYXk7XG5cbmZ1bmN0aW9uIGlzTWFwVG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgTWFwXSc7XG59XG5pc01hcFRvU3RyaW5nLndvcmtpbmcgPSAoXG4gIHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnICYmXG4gIGlzTWFwVG9TdHJpbmcobmV3IE1hcCgpKVxuKTtcblxuZnVuY3Rpb24gaXNNYXAodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzTWFwVG9TdHJpbmcud29ya2luZ1xuICAgID8gaXNNYXBUb1N0cmluZyh2YWx1ZSlcbiAgICA6IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuZXhwb3J0cy5pc01hcCA9IGlzTWFwO1xuXG5mdW5jdGlvbiBpc1NldFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFNldF0nO1xufVxuaXNTZXRUb1N0cmluZy53b3JraW5nID0gKFxuICB0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJlxuICBpc1NldFRvU3RyaW5nKG5ldyBTZXQoKSlcbik7XG5mdW5jdGlvbiBpc1NldCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNTZXRUb1N0cmluZy53b3JraW5nXG4gICAgPyBpc1NldFRvU3RyaW5nKHZhbHVlKVxuICAgIDogdmFsdWUgaW5zdGFuY2VvZiBTZXQ7XG59XG5leHBvcnRzLmlzU2V0ID0gaXNTZXQ7XG5cbmZ1bmN0aW9uIGlzV2Vha01hcFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFdlYWtNYXBdJztcbn1cbmlzV2Vha01hcFRvU3RyaW5nLndvcmtpbmcgPSAoXG4gIHR5cGVvZiBXZWFrTWFwICE9PSAndW5kZWZpbmVkJyAmJlxuICBpc1dlYWtNYXBUb1N0cmluZyhuZXcgV2Vha01hcCgpKVxuKTtcbmZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzV2Vha01hcFRvU3RyaW5nLndvcmtpbmdcbiAgICA/IGlzV2Vha01hcFRvU3RyaW5nKHZhbHVlKVxuICAgIDogdmFsdWUgaW5zdGFuY2VvZiBXZWFrTWFwO1xufVxuZXhwb3J0cy5pc1dlYWtNYXAgPSBpc1dlYWtNYXA7XG5cbmZ1bmN0aW9uIGlzV2Vha1NldFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFdlYWtTZXRdJztcbn1cbmlzV2Vha1NldFRvU3RyaW5nLndvcmtpbmcgPSAoXG4gIHR5cGVvZiBXZWFrU2V0ICE9PSAndW5kZWZpbmVkJyAmJlxuICBpc1dlYWtTZXRUb1N0cmluZyhuZXcgV2Vha1NldCgpKVxuKTtcbmZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSkge1xuICByZXR1cm4gaXNXZWFrU2V0VG9TdHJpbmcodmFsdWUpO1xufVxuZXhwb3J0cy5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG5cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nO1xufVxuaXNBcnJheUJ1ZmZlclRvU3RyaW5nLndvcmtpbmcgPSAoXG4gIHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgaXNBcnJheUJ1ZmZlclRvU3RyaW5nKG5ldyBBcnJheUJ1ZmZlcigpKVxuKTtcbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNBcnJheUJ1ZmZlclRvU3RyaW5nLndvcmtpbmdcbiAgICA/IGlzQXJyYXlCdWZmZXJUb1N0cmluZyh2YWx1ZSlcbiAgICA6IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59XG5leHBvcnRzLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyO1xuXG5mdW5jdGlvbiBpc0RhdGFWaWV3VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0YVZpZXddJztcbn1cbmlzRGF0YVZpZXdUb1N0cmluZy53b3JraW5nID0gKFxuICB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBEYXRhVmlldyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgaXNEYXRhVmlld1RvU3RyaW5nKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSksIDAsIDEpKVxuKTtcbmZ1bmN0aW9uIGlzRGF0YVZpZXcodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNEYXRhVmlld1RvU3RyaW5nLndvcmtpbmdcbiAgICA/IGlzRGF0YVZpZXdUb1N0cmluZyh2YWx1ZSlcbiAgICA6IHZhbHVlIGluc3RhbmNlb2YgRGF0YVZpZXc7XG59XG5leHBvcnRzLmlzRGF0YVZpZXcgPSBpc0RhdGFWaWV3O1xuXG4vLyBTdG9yZSBhIGNvcHkgb2YgU2hhcmVkQXJyYXlCdWZmZXIgaW4gY2FzZSBpdCdzIGRlbGV0ZWQgZWxzZXdoZXJlXG52YXIgU2hhcmVkQXJyYXlCdWZmZXJDb3B5ID0gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyA/IFNoYXJlZEFycmF5QnVmZmVyIDogdW5kZWZpbmVkO1xuZnVuY3Rpb24gaXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSc7XG59XG5mdW5jdGlvbiBpc1NoYXJlZEFycmF5QnVmZmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXJDb3B5ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nLndvcmtpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nLndvcmtpbmcgPSBpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcobmV3IFNoYXJlZEFycmF5QnVmZmVyQ29weSgpKTtcbiAgfVxuXG4gIHJldHVybiBpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZ1xuICAgID8gaXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nKHZhbHVlKVxuICAgIDogdmFsdWUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlckNvcHk7XG59XG5leHBvcnRzLmlzU2hhcmVkQXJyYXlCdWZmZXIgPSBpc1NoYXJlZEFycmF5QnVmZmVyO1xuXG5mdW5jdGlvbiBpc0FzeW5jRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nO1xufVxuZXhwb3J0cy5pc0FzeW5jRnVuY3Rpb24gPSBpc0FzeW5jRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzTWFwSXRlcmF0b3IodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgTWFwIEl0ZXJhdG9yXSc7XG59XG5leHBvcnRzLmlzTWFwSXRlcmF0b3IgPSBpc01hcEl0ZXJhdG9yO1xuXG5mdW5jdGlvbiBpc1NldEl0ZXJhdG9yKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFNldCBJdGVyYXRvcl0nO1xufVxuZXhwb3J0cy5pc1NldEl0ZXJhdG9yID0gaXNTZXRJdGVyYXRvcjtcblxuZnVuY3Rpb24gaXNHZW5lcmF0b3JPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgR2VuZXJhdG9yXSc7XG59XG5leHBvcnRzLmlzR2VuZXJhdG9yT2JqZWN0ID0gaXNHZW5lcmF0b3JPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzV2ViQXNzZW1ibHlDb21waWxlZE1vZHVsZSh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBXZWJBc3NlbWJseS5Nb2R1bGVdJztcbn1cbmV4cG9ydHMuaXNXZWJBc3NlbWJseUNvbXBpbGVkTW9kdWxlID0gaXNXZWJBc3NlbWJseUNvbXBpbGVkTW9kdWxlO1xuXG5mdW5jdGlvbiBpc051bWJlck9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSwgbnVtYmVyVmFsdWUpO1xufVxuZXhwb3J0cy5pc051bWJlck9iamVjdCA9IGlzTnVtYmVyT2JqZWN0O1xuXG5mdW5jdGlvbiBpc1N0cmluZ09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSwgc3RyaW5nVmFsdWUpO1xufVxuZXhwb3J0cy5pc1N0cmluZ09iamVjdCA9IGlzU3RyaW5nT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsIGJvb2xlYW5WYWx1ZSk7XG59XG5leHBvcnRzLmlzQm9vbGVhbk9iamVjdCA9IGlzQm9vbGVhbk9iamVjdDtcblxuZnVuY3Rpb24gaXNCaWdJbnRPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIEJpZ0ludFN1cHBvcnRlZCAmJiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLCBiaWdJbnRWYWx1ZSk7XG59XG5leHBvcnRzLmlzQmlnSW50T2JqZWN0ID0gaXNCaWdJbnRPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBTeW1ib2xTdXBwb3J0ZWQgJiYgY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSwgc3ltYm9sVmFsdWUpO1xufVxuZXhwb3J0cy5pc1N5bWJvbE9iamVjdCA9IGlzU3ltYm9sT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0JveGVkUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaXNOdW1iZXJPYmplY3QodmFsdWUpIHx8XG4gICAgaXNTdHJpbmdPYmplY3QodmFsdWUpIHx8XG4gICAgaXNCb29sZWFuT2JqZWN0KHZhbHVlKSB8fFxuICAgIGlzQmlnSW50T2JqZWN0KHZhbHVlKSB8fFxuICAgIGlzU3ltYm9sT2JqZWN0KHZhbHVlKVxuICApO1xufVxuZXhwb3J0cy5pc0JveGVkUHJpbWl0aXZlID0gaXNCb3hlZFByaW1pdGl2ZTtcblxuZnVuY3Rpb24gaXNBbnlBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIChcbiAgICBpc0FycmF5QnVmZmVyKHZhbHVlKSB8fFxuICAgIGlzU2hhcmVkQXJyYXlCdWZmZXIodmFsdWUpXG4gICk7XG59XG5leHBvcnRzLmlzQW55QXJyYXlCdWZmZXIgPSBpc0FueUFycmF5QnVmZmVyO1xuXG5bJ2lzUHJveHknLCAnaXNFeHRlcm5hbCcsICdpc01vZHVsZU5hbWVzcGFjZU9iamVjdCddLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBtZXRob2QsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kICsgJyBpcyBub3Qgc3VwcG9ydGVkIGluIHVzZXJsYW5kJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCAiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIHx8XG4gIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzY3JpcHRvcnNba2V5c1tpXV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgfTtcblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZSZWdleCA9IC9eJC87XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSB7XG4gIHZhciBkZWJ1Z0VudiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUc7XG4gIGRlYnVnRW52ID0gZGVidWdFbnYucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCs/Ll0vZywgJ1xcXFwkJicpXG4gICAgLnJlcGxhY2UoL1xcKi9nLCAnLionKVxuICAgIC5yZXBsYWNlKC8sL2csICckfF4nKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuICBkZWJ1Z0VudlJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBkZWJ1Z0VudiArICckJywgJ2knKTtcbn1cbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAoZGVidWdFbnZSZWdleC50ZXN0KHNldCkpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc2xpY2UoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZXhwb3J0cy50eXBlcyA9IHJlcXVpcmUoJy4vc3VwcG9ydC90eXBlcycpO1xuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuZXhwb3J0cy50eXBlcy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcbmV4cG9ydHMudHlwZXMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5leHBvcnRzLnR5cGVzLmlzTmF0aXZlRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG52YXIga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2woJ3V0aWwucHJvbWlzaWZ5LmN1c3RvbScpIDogdW5kZWZpbmVkO1xuXG5leHBvcnRzLnByb21pc2lmeSA9IGZ1bmN0aW9uIHByb21pc2lmeShvcmlnaW5hbCkge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9yaWdpbmFsXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG5cbiAgaWYgKGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCAmJiBvcmlnaW5hbFtrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xdKSB7XG4gICAgdmFyIGZuID0gb3JpZ2luYWxba0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ1dGlsLnByb21pc2lmeS5jdXN0b21cIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmbiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgZnVuY3Rpb24gZm4oKSB7XG4gICAgdmFyIHByb21pc2VSZXNvbHZlLCBwcm9taXNlUmVqZWN0O1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgcHJvbWlzZVJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcHJvbWlzZVJlamVjdChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUodmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcHJvbWlzZVJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGZuLCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKTtcblxuICBpZiAoa0N1c3RvbVByb21pc2lmaWVkU3ltYm9sKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuICAgIHZhbHVlOiBmbiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG4gICAgZm4sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbClcbiAgKTtcbn1cblxuZXhwb3J0cy5wcm9taXNpZnkuY3VzdG9tID0ga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXG5cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5T25SZWplY3RlZChyZWFzb24sIGNiKSB7XG4gIC8vIGAhcmVhc29uYCBndWFyZCBpbnNwaXJlZCBieSBibHVlYmlyZCAoUmVmOiBodHRwczovL2dvby5nbC90NUlTNk0pLlxuICAvLyBCZWNhdXNlIGBudWxsYCBpcyBhIHNwZWNpYWwgZXJyb3IgdmFsdWUgaW4gY2FsbGJhY2tzIHdoaWNoIG1lYW5zIFwibm8gZXJyb3JcbiAgLy8gb2NjdXJyZWRcIiwgd2UgZXJyb3Itd3JhcCBzbyB0aGUgY2FsbGJhY2sgY29uc3VtZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW5cbiAgLy8gXCJ0aGUgcHJvbWlzZSByZWplY3RlZCB3aXRoIG51bGxcIiBvciBcInRoZSBwcm9taXNlIGZ1bGZpbGxlZCB3aXRoIHVuZGVmaW5lZFwiLlxuICBpZiAoIXJlYXNvbikge1xuICAgIHZhciBuZXdSZWFzb24gPSBuZXcgRXJyb3IoJ1Byb21pc2Ugd2FzIHJlamVjdGVkIHdpdGggYSBmYWxzeSB2YWx1ZScpO1xuICAgIG5ld1JlYXNvbi5yZWFzb24gPSByZWFzb247XG4gICAgcmVhc29uID0gbmV3UmVhc29uO1xuICB9XG4gIHJldHVybiBjYihyZWFzb24pO1xufVxuXG5mdW5jdGlvbiBjYWxsYmFja2lmeShvcmlnaW5hbCkge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3JpZ2luYWxcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgfVxuXG4gIC8vIFdlIERPIE5PVCByZXR1cm4gdGhlIHByb21pc2UgYXMgaXQgZ2l2ZXMgdGhlIHVzZXIgYSBmYWxzZSBzZW5zZSB0aGF0XG4gIC8vIHRoZSBwcm9taXNlIGlzIGFjdHVhbGx5IHNvbWVob3cgcmVsYXRlZCB0byB0aGUgY2FsbGJhY2sncyBleGVjdXRpb25cbiAgLy8gYW5kIHRoYXQgdGhlIGNhbGxiYWNrIHRocm93aW5nIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlLlxuICBmdW5jdGlvbiBjYWxsYmFja2lmaWVkKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIHZhciBtYXliZUNiID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIG1heWJlQ2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbWF5YmVDYi5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgLy8gSW4gdHJ1ZSBub2RlIHN0eWxlIHdlIHByb2Nlc3MgdGhlIGNhbGxiYWNrIG9uIGBuZXh0VGlja2Agd2l0aCBhbGwgdGhlXG4gICAgLy8gaW1wbGljYXRpb25zIChzdGFjaywgYHVuY2F1Z2h0RXhjZXB0aW9uYCwgYGFzeW5jX2hvb2tzYClcbiAgICBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgLnRoZW4oZnVuY3Rpb24ocmV0KSB7IHByb2Nlc3MubmV4dFRpY2soY2IuYmluZChudWxsLCBudWxsLCByZXQpKSB9LFxuICAgICAgICAgICAgZnVuY3Rpb24ocmVqKSB7IHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2tpZnlPblJlamVjdGVkLmJpbmQobnVsbCwgcmVqLCBjYikpIH0pO1xuICB9XG5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGNhbGxiYWNraWZpZWQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjYWxsYmFja2lmaWVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKSk7XG4gIHJldHVybiBjYWxsYmFja2lmaWVkO1xufVxuZXhwb3J0cy5jYWxsYmFja2lmeSA9IGNhbGxiYWNraWZ5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG52YXIgc2Ftc2FtID0gcmVxdWlyZSgnQHNpbm9uanMvc2Ftc2FtJyk7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvdGltZXMtaW4td29yZHMuanMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcbnZhciBzYW1zYW1fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KHNhbXNhbSk7XG5cbmNvbnN0IHtcbiAgICBwcm90b3R5cGVzLFxuICAgIGNhbGxlZEluT3JkZXIsXG4gICAgb3JkZXJCeUZpcnN0Q2FsbCxcbiAgICBnbG9iYWw6IGdsb2JhbE9iamVjdCxcbn0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGNyZWF0ZU1hdGNoZXIgfSA9IHNhbXNhbV9fZGVmYXVsdC5kZWZhdWx0O1xuY29uc3QgeyBzbGljZTogYXJyYXlTbGljZSwgY29uY2F0LCBmb3JFYWNoLCBqb2luLCBzcGxpY2UgfSA9IHByb3RvdHlwZXMuYXJyYXk7XG5jb25zdCB7IHNsaWNlOiBzdHJpbmdTbGljZSB9ID0gcHJvdG90eXBlcy5zdHJpbmc7XG5cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdHMob2JqLCBkZWZhdWx0cykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGRlZmF1bHRzKSkge1xuICAgICAgICBjb25zdCB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ3JlYXRlQXNzZXJ0T3B0aW9uc1xuICogQGdsb2JhbFxuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Nob3VsZExpbWl0QXNzZXJ0aW9uTG9nc10gZGVmYXVsdCBpcyBmYWxzZVxuICogQHByb3BlcnR5IHtudW1iZXJ9ICBbYXNzZXJ0aW9uTG9nTGltaXRdIGRlZmF1bHQgaXMgMTBLXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYW4gYXNzZXJ0aW9uIG9iamVjdCB0aGF0IGV4cG9zZXMgc2V2ZXJhbCBtZXRob2RzIHRvIGludm9rZVxuICpcbiAqIEBwYXJhbSB7Q3JlYXRlQXNzZXJ0T3B0aW9uc30gIFtvcHRzXSBvcHRpb25zIGJhZ1xuICogQHJldHVybnMge29iamVjdH0gb2JqZWN0IHdpdGggbXVsdGlwbGUgYXNzZXJ0aW9uIG1ldGhvZHNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzZXJ0T2JqZWN0KG9wdHMpIHtcbiAgICBjb25zdCBjbGVhbmVkQXNzZXJ0T3B0aW9ucyA9IG9wdHMgfHwge307XG4gICAgYXBwbHlEZWZhdWx0cyhjbGVhbmVkQXNzZXJ0T3B0aW9ucywge1xuICAgICAgICBzaG91bGRMaW1pdEFzc2VydGlvbkxvZ3M6IGZhbHNlLFxuICAgICAgICBhc3NlcnRpb25Mb2dMaW1pdDogMWU0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXNzZXJ0ID0ge1xuICAgICAgICBmYWlsOiBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGNsZWFuZWRBc3NlcnRPcHRpb25zLnNob3VsZExpbWl0QXNzZXJ0aW9uTG9ncykge1xuICAgICAgICAgICAgICAgIG1zZyA9IG1lc3NhZ2Uuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICBjbGVhbmVkQXNzZXJ0T3B0aW9ucy5hc3NlcnRpb25Mb2dMaW1pdCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSBcIkFzc2VydEVycm9yXCI7XG5cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9LFxuXG4gICAgICAgIHBhc3M6IGZ1bmN0aW9uIHBhc3MoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FsbE9yZGVyOiBmdW5jdGlvbiBhc3NlcnRDYWxsT3JkZXIoKSB7XG4gICAgICAgICAgICB2ZXJpZnlJc1N0dWIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgYWN0dWFsID0gXCJcIjtcblxuICAgICAgICAgICAgaWYgKCFjYWxsZWRJbk9yZGVyKGFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGpvaW4oYXJndW1lbnRzLCBcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxscyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBjYWxscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxzWy0taV0uY2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlKGNhbGxzLCBpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBqb2luKG9yZGVyQnlGaXJzdENhbGwoY2FsbHMpLCBcIiwgXCIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBmYWlscywgd2UnbGwganVzdCBmYWxsIGJhY2sgdG8gdGhlIGJsYW5rIHN0cmluZ1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZhaWxBc3NlcnRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGBleHBlY3RlZCAke2V4cGVjdGVkfSB0byBiZSBjYWxsZWQgaW4gb3JkZXIgYnV0IHdlcmUgY2FsbGVkIGFzICR7YWN0dWFsfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnBhc3MoXCJjYWxsT3JkZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FsbENvdW50OiBmdW5jdGlvbiBhc3NlcnRDYWxsQ291bnQobWV0aG9kLCBjb3VudCkge1xuICAgICAgICAgICAgdmVyaWZ5SXNTdHViKG1ldGhvZCk7XG5cbiAgICAgICAgICAgIGxldCBtc2c7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvdW50ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAgICAgYGV4cGVjdGVkICR7dXRpbC5pbnNwZWN0KGNvdW50KX0gdG8gYmUgYSBudW1iZXIgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgd2FzIG9mIHR5cGUgJHt0eXBlb2YgY291bnR9YDtcbiAgICAgICAgICAgICAgICBmYWlsQXNzZXJ0aW9uKHRoaXMsIG1zZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5jYWxsQ291bnQgIT09IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAgICAgYGV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCAke3RpbWVzSW5Xb3Jkcyhjb3VudCl9IGAgK1xuICAgICAgICAgICAgICAgICAgICBgYnV0IHdhcyBjYWxsZWQgJWMlQ2A7XG4gICAgICAgICAgICAgICAgZmFpbEFzc2VydGlvbih0aGlzLCBtZXRob2QucHJpbnRmKG1zZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQucGFzcyhcImNhbGxDb3VudFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBleHBvc2U6IGZ1bmN0aW9uIGV4cG9zZSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInRhcmdldCBpcyBudWxsIG9yIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPVxuICAgICAgICAgICAgICAgICh0eXBlb2Ygby5wcmVmaXggPT09IFwidW5kZWZpbmVkXCIgJiYgXCJhc3NlcnRcIikgfHwgby5wcmVmaXg7XG4gICAgICAgICAgICBjb25zdCBpbmNsdWRlRmFpbCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIG8uaW5jbHVkZUZhaWwgPT09IFwidW5kZWZpbmVkXCIgfHwgQm9vbGVhbihvLmluY2x1ZGVGYWlsKTtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcztcblxuICAgICAgICAgICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnN0YW5jZSksIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCAhPT0gXCJleHBvc2VcIiAmJlxuICAgICAgICAgICAgICAgICAgICAoaW5jbHVkZUZhaWwgfHwgIS9eKGZhaWwpLy50ZXN0KG1ldGhvZCkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtleHBvc2VkTmFtZShwcmVmaXgsIG1ldGhvZCldID0gaW5zdGFuY2VbbWV0aG9kXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfSxcblxuICAgICAgICBtYXRjaDogZnVuY3Rpb24gbWF0Y2goYWN0dWFsLCBleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IGNyZWF0ZU1hdGNoZXIoZXhwZWN0YXRpb24pO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIudGVzdChhY3R1YWwpKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnBhc3MoXCJtYXRjaFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gW1xuICAgICAgICAgICAgICAgICAgICBcImV4cGVjdGVkIHZhbHVlIHRvIG1hdGNoXCIsXG4gICAgICAgICAgICAgICAgICAgIGAgICAgZXhwZWN0ZWQgPSAke3V0aWwuaW5zcGVjdChleHBlY3RhdGlvbil9YCxcbiAgICAgICAgICAgICAgICAgICAgYCAgICBhY3R1YWwgPSAke3V0aWwuaW5zcGVjdChhY3R1YWwpfWAsXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGZhaWxBc3NlcnRpb24odGhpcywgam9pbihmb3JtYXR0ZWQsIFwiXFxuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdmVyaWZ5SXNTdHViKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGZvckVhY2goYXJncywgZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChcImZha2UgaXMgbm90IGEgc3B5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWV0aG9kLnByb3h5ICYmIG1ldGhvZC5wcm94eS5pc1Npbm9uUHJveHkpIHtcbiAgICAgICAgICAgICAgICB2ZXJpZnlJc1N0dWIobWV0aG9kLnByb3h5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChgJHttZXRob2R9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QuZ2V0Q2FsbCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKGAke21ldGhvZH0gaXMgbm90IHN0dWJiZWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZlcmlmeUlzVmFsaWRBc3NlcnRpb24oYXNzZXJ0aW9uTWV0aG9kLCBhc3NlcnRpb25BcmdzKSB7XG4gICAgICAgIHN3aXRjaCAoYXNzZXJ0aW9uTWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFwibm90Q2FsbGVkXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2FsbGVkXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2FsbGVkT25jZVwiOlxuICAgICAgICAgICAgY2FzZSBcImNhbGxlZFR3aWNlXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2FsbGVkVGhyaWNlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGFzc2VydGlvbkFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7YXNzZXJ0aW9uTWV0aG9kfSB0YWtlcyAxIGFyZ3VtZW50IGJ1dCB3YXMgY2FsbGVkIHdpdGggJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRpb25BcmdzLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXJndW1lbnRzYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmYWlsQXNzZXJ0aW9uKG9iamVjdCwgbXNnKSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IG9iamVjdCB8fCBnbG9iYWxPYmplY3Q7XG4gICAgICAgIGNvbnN0IGZhaWxNZXRob2QgPSBvYmouZmFpbCB8fCBhc3NlcnQuZmFpbDtcbiAgICAgICAgZmFpbE1ldGhvZC5jYWxsKG9iaiwgbXNnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXJyb3JQcm9wQXNBc3NlcnRpb24obmFtZSwgbWV0aG9kLCBtZXNzYWdlKSB7XG4gICAgICAgIGxldCBtc2cgPSBtZXNzYWdlO1xuICAgICAgICBsZXQgbWV0aCA9IG1ldGhvZDtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIG1zZyA9IG1ldGhvZDtcbiAgICAgICAgICAgIG1ldGggPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0W25hbWVdID0gZnVuY3Rpb24gKGZha2UpIHtcbiAgICAgICAgICAgIHZlcmlmeUlzU3R1YihmYWtlKTtcblxuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgdmVyaWZ5SXNWYWxpZEFzc2VydGlvbihuYW1lLCBhcmdzKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQgPSAhbWV0aChmYWtlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGZha2VbbWV0aF0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAhZmFrZVttZXRoXS5hcHBseShmYWtlLCBhcmdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAhZmFrZVttZXRoXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgICAgIGZhaWxBc3NlcnRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIChmYWtlLnByaW50ZiB8fCBmYWtlLnByb3h5LnByaW50ZikuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWtlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KFttc2ddLCBhcmdzKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQucGFzcyhuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBvc2VkTmFtZShwcmVmaXgsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuICFwcmVmaXggfHwgL15mYWlsLy50ZXN0KHByb3ApXG4gICAgICAgICAgICA/IHByb3BcbiAgICAgICAgICAgIDogcHJlZml4ICtcbiAgICAgICAgICAgICAgICAgIHN0cmluZ1NsaWNlKHByb3AsIDAsIDEpLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICAgICAgICAgc3RyaW5nU2xpY2UocHJvcCwgMSk7XG4gICAgfVxuXG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZFwiLFxuICAgICAgICBcImV4cGVjdGVkICVuIHRvIGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBidXQgd2FzIG5ldmVyIGNhbGxlZFwiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcIm5vdENhbGxlZFwiLFxuICAgICAgICBmdW5jdGlvbiAoc3B5KSB7XG4gICAgICAgICAgICByZXR1cm4gIXNweS5jYWxsZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZXhwZWN0ZWQgJW4gdG8gbm90IGhhdmUgYmVlbiBjYWxsZWQgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZE9uY2VcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgb25jZSBidXQgd2FzIGNhbGxlZCAlYyVDXCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXG4gICAgICAgIFwiY2FsbGVkVHdpY2VcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgdHdpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZFRocmljZVwiLFxuICAgICAgICBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB0aHJpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZE9uXCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgJW4gdG8gYmUgY2FsbGVkIHdpdGggJTEgYXMgdGhpcyBidXQgd2FzIGNhbGxlZCB3aXRoICV0XCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXG4gICAgICAgIFwiYWx3YXlzQ2FsbGVkT25cIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggJTEgYXMgdGhpcyBidXQgd2FzIGNhbGxlZCB3aXRoICV0XCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRXaXRoTmV3XCIsIFwiZXhwZWN0ZWQgJW4gdG8gYmUgY2FsbGVkIHdpdGggbmV3XCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcbiAgICAgICAgXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG5ld1wiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZFdpdGhcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgJURcIixcbiAgICApO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcbiAgICAgICAgXCJjYWxsZWRXaXRoTWF0Y2hcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBtYXRjaCAlRFwiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImFsd2F5c0NhbGxlZFdpdGhcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzICVEXCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXG4gICAgICAgIFwiYWx3YXlzQ2FsbGVkV2l0aE1hdGNoXCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG1hdGNoICVEXCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXG4gICAgICAgIFwiY2FsbGVkV2l0aEV4YWN0bHlcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBleGFjdCBhcmd1bWVudHMgJURcIixcbiAgICApO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcbiAgICAgICAgXCJjYWxsZWRPbmNlV2l0aFwiLFxuICAgICAgICBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCBvbmNlIGFuZCB3aXRoIGFyZ3VtZW50cyAlRFwiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZE9uY2VXaXRoRXhhY3RseVwiLFxuICAgICAgICBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCBvbmNlIGFuZCB3aXRoIGV4YWN0IGFyZ3VtZW50cyAlRFwiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImNhbGxlZE9uY2VXaXRoTWF0Y2hcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgb25jZSBhbmQgd2l0aCBtYXRjaCAlRFwiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcImFsd2F5c0NhbGxlZFdpdGhFeGFjdGx5XCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIGV4YWN0IGFyZ3VtZW50cyAlRFwiLFxuICAgICk7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgICAgICBcIm5ldmVyQ2FsbGVkV2l0aFwiLFxuICAgICAgICBcImV4cGVjdGVkICVuIHRvIG5ldmVyIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyAlKiVDXCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXG4gICAgICAgIFwibmV2ZXJDYWxsZWRXaXRoTWF0Y2hcIixcbiAgICAgICAgXCJleHBlY3RlZCAlbiB0byBuZXZlciBiZSBjYWxsZWQgd2l0aCBtYXRjaCAlKiVDXCIsXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJ0aHJld1wiLCBcIiVuIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uJUNcIik7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiYWx3YXlzVGhyZXdcIiwgXCIlbiBkaWQgbm90IGFsd2F5cyB0aHJvdyBleGNlcHRpb24lQ1wiKTtcblxuICAgIHJldHVybiBhc3NlcnQ7XG59XG5cbmNvbnN0IGFzc2VydCA9IGNyZWF0ZUFzc2VydE9iamVjdCgpO1xuYXNzZXJ0LmNyZWF0ZUFzc2VydE9iamVjdCA9IGNyZWF0ZUFzc2VydE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3NlcnQ7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IGdsb2JhbE9iamVjdCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmdsb2JhbDtcbmxldCB0aW1lcnNNb2R1bGUsIHRpbWVyc1Byb21pc2VzTW9kdWxlO1xuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHRyeSB7XG4gICAgICAgIHRpbWVyc01vZHVsZSA9IHJlcXVpcmUoXCJ0aW1lcnNcIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZWRcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgdGltZXJzUHJvbWlzZXNNb2R1bGUgPSByZXF1aXJlKFwidGltZXJzL3Byb21pc2VzXCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpZ25vcmVkXG4gICAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtcIm5leHRBc3luY1wiIHwgXCJtYW51YWxcIiB8IFwiaW50ZXJ2YWxcIn0gVGlja01vZGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5leHRBc3luY1RpY2tNb2RlXG4gKiBAcHJvcGVydHkge1wibmV4dEFzeW5jXCJ9IG1vZGUgLSBydW5zIHRpbWVycyBvbmUgbWFjcm90YXNrIGF0IGEgdGltZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWFudWFsVGlja01vZGVcbiAqIEBwcm9wZXJ0eSB7XCJtYW51YWxcIn0gbW9kZSAtIGFkdmFuY2VzIG9ubHkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgdGlja3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludGVydmFsVGlja01vZGVcbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcnZhbFwifSBtb2RlIC0gYWR2YW5jZXMgYXV0b21hdGljYWxseSBvbiBhIG5hdGl2ZSBpbnRlcnZhbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWx0YV0gLSBpbnRlcnZhbCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJbnRlcnZhbFRpY2tNb2RlIHwgTmV4dEFzeW5jVGlja01vZGUgfCBNYW51YWxUaWNrTW9kZX0gVGltZXJUaWNrTW9kZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEZha2VUaW1lcnNGdW5jdGlvblxuICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3NcbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZvaWRWYXJBcmdzRnVuY1xuICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBvcHRpb25hbCBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTmV4dFRpY2tcbiAqIEBwYXJhbSB7Vm9pZFZhckFyZ3NGdW5jfSBjYWxsYmFjayAtIHRoZSBjYWxsYmFjayB0byBydW5cbiAqIEBwYXJhbSB7Li4udW5rbm93bltdfSBhcmdzIC0gb3B0aW9uYWwgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGhcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNldEltbWVkaWF0ZVxuICogQHBhcmFtIHtWb2lkVmFyQXJnc0Z1bmN9IGNhbGxiYWNrIC0gdGhlIGNhbGxiYWNrIHRvIHJ1blxuICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBvcHRpb25hbCBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aFxuICogQHJldHVybnMge05vZGVJbW1lZGlhdGV9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0VGltZW91dFxuICogQHBhcmFtIHtWb2lkVmFyQXJnc0Z1bmN9IGNhbGxiYWNrIC0gdGhlIGNhbGxiYWNrIHRvIHJ1blxuICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gLSBvcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7Li4udW5rbm93bltdfSBhcmdzIC0gb3B0aW9uYWwgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGhcbiAqIEByZXR1cm5zIHtUaW1lcklkfSAtIHRoZSB0aW1lb3V0IGlkZW50aWZpZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDbGVhclRpbWVvdXRcbiAqIEBwYXJhbSB7VGltZXJJZH0gW2lkXSAtIHRoZSB0aW1lb3V0IGlkZW50aWZpZXIgdG8gY2xlYXJcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNldEludGVydmFsXG4gKiBAcGFyYW0ge1ZvaWRWYXJBcmdzRnVuY30gY2FsbGJhY2sgLSB0aGUgY2FsbGJhY2sgdG8gcnVuXG4gKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSAtIG9wdGlvbmFsIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBvcHRpb25hbCBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aFxuICogQHJldHVybnMge1RpbWVySWR9IC0gdGhlIGludGVydmFsIGlkZW50aWZpZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDbGVhckludGVydmFsXG4gKiBAcGFyYW0ge1RpbWVySWR9IFtpZF0gLSB0aGUgaW50ZXJ2YWwgaWRlbnRpZmllciB0byBjbGVhclxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUXVldWVNaWNyb3Rhc2tcbiAqIEBwYXJhbSB7Vm9pZFZhckFyZ3NGdW5jfSBjYWxsYmFjayAtIHRoZSBjYWxsYmFjayB0byBydW5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFRpbWVSZW1haW5pbmdcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJZGxlRGVhZGxpbmVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGlkVGltZW91dCAtIHdoZXRoZXIgb3Igbm90IHRoZSBjYWxsYmFjayB3YXMgY2FsbGVkIGJlZm9yZSByZWFjaGluZyB0aGUgb3B0aW9uYWwgdGltZW91dFxuICogQHByb3BlcnR5IHtUaW1lUmVtYWluaW5nfSB0aW1lUmVtYWluaW5nIC0gYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBwcm92aWRpbmcgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcmVtYWluaW5nIGluIHRoZSBjdXJyZW50IGlkbGUgcGVyaW9kXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVxdWVzdElkbGVDYWxsYmFja0NhbGxiYWNrXG4gKiBAcGFyYW0ge0lkbGVEZWFkbGluZX0gZGVhZGxpbmVcbiAqL1xuXG4vKipcbiAqIFF1ZXVlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBkdXJpbmcgYSBicm93c2VyJ3MgaWRsZSBwZXJpb2RzXG4gKiBAY2FsbGJhY2sgUmVxdWVzdElkbGVDYWxsYmFja1xuICogQHBhcmFtIHtSZXF1ZXN0SWRsZUNhbGxiYWNrQ2FsbGJhY2t9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge3t0aW1lb3V0PzogbnVtYmVyfX0gW29wdGlvbnNdIC0gYW4gb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBpZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFuaW1hdGlvbkZyYW1lQ2FsbGJhY2tcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc3RhbXBcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAqIEBwYXJhbSB7QW5pbWF0aW9uRnJhbWVDYWxsYmFja30gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtUaW1lcklkfSAtIHRoZSByZXF1ZXN0IGlkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2FuY2VsQW5pbWF0aW9uRnJhbWVcbiAqIEBwYXJhbSB7VGltZXJJZH0gaWQgLSBjYW5jZWxzIGEgZnJhbWUgY2FsbGJhY2tcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENhbmNlbElkbGVDYWxsYmFja1xuICogQHBhcmFtIHtUaW1lcklkfSBpZCAtIGNhbmNlbHMgYSBzY2hlZHVsZWQgaWRsZSBjYWxsYmFja1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2xlYXJJbW1lZGlhdGVcbiAqIEBwYXJhbSB7Tm9kZUltbWVkaWF0ZX0gaWQgLSBmYWtlZCBgY2xlYXJJbW1lZGlhdGVgXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb3VudFRpbWVyc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSdW5NaWNyb3Rhc2tzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRlbXBvcmFsRHVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5ZWFycyAtIHllYXJzIGNvbXBvbmVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1vbnRocyAtIG1vbnRocyBjb21wb25lbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWVrcyAtIHdlZWtzIGNvbXBvbmVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRheXMgLSBkYXlzIGNvbXBvbmVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhvdXJzIC0gaG91cnMgY29tcG9uZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gbWludXRlcyAtIG1pbnV0ZXMgY29tcG9uZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2Vjb25kcyAtIHNlY29uZHMgY29tcG9uZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gbWlsbGlzZWNvbmRzIC0gbWlsbGlzZWNvbmRzIGNvbXBvbmVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pY3Jvc2Vjb25kcyAtIG1pY3Jvc2Vjb25kcyBjb21wb25lbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBuYW5vc2Vjb25kcyAtIG5hbm9zZWNvbmRzIGNvbXBvbmVudFxuICogQHByb3BlcnR5IHsob3B0aW9uczoge3VuaXQ6IHN0cmluZywgcmVsYXRpdmVUbz86IHVua25vd259KSA9PiBudW1iZXJ9IHRvdGFsIC0gY29udmVydHMgdG8gYSBzaW5nbGUgdW5pdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGVtcG9yYWxUaW1lbGlrZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGVwb2NoTWlsbGlzZWNvbmRzIC0gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBVbml4IGVwb2NoIChwcmVzZW50IG9uIFRlbXBvcmFsLkluc3RhbnQgYW5kIFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWUpXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVGlja1xuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfFRlbXBvcmFsRHVyYXRpb259IHRpY2tWYWx1ZSBtaWxsaXNlY29uZHMsIGEgc3RyaW5nIHBhcnNlYWJsZSBieSBwYXJzZVRpbWUsIG9yIGEgVGVtcG9yYWwuRHVyYXRpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IHdpbGwgcmV0dXJuIHRoZSBuZXcgYG5vd2AgdmFsdWVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBUaWNrQXN5bmNcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xUZW1wb3JhbER1cmF0aW9ufSB0aWNrVmFsdWUgbWlsbGlzZWNvbmRzLCBhIHN0cmluZyBwYXJzZWFibGUgYnkgcGFyc2VUaW1lLCBvciBhIFRlbXBvcmFsLkR1cmF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE5leHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTmV4dEFzeW5jXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJ1bkFsbFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSdW5Ub0ZyYW1lXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJ1bkFsbEFzeW5jXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJ1blRvTGFzdFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSdW5Ub0xhc3RBc3luY1xuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXNldFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0U3lzdGVtVGltZVxuICogQHBhcmFtIHtudW1iZXJ8RGF0ZXxUZW1wb3JhbFRpbWVsaWtlfSBbbm93XSBpbml0aWFsIG1vY2tlZCB0aW1lLCBhcyBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gsIGEgRGF0ZSwgYSBUZW1wb3JhbC5JbnN0YW50LCBvciBhIFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEp1bXBcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xUZW1wb3JhbER1cmF0aW9ufSB0aWNrVmFsdWUgbWlsbGlzZWNvbmRzLCBhIGh1bWFuLXJlYWRhYmxlIHZhbHVlIGxpa2UgXCIwMToxMToxNVwiLCBvciBhIFRlbXBvcmFsLkR1cmF0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVuaW5zdGFsbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0VGlja01vZGVcbiAqIEBwYXJhbSB7U2V0VGlja01vZGVDb25maWd9IHRpY2tNb2RlQ29uZmlnIC0gVGhlIG5ldyBjb25maWd1cmF0aW9uIGZvciBob3cgdGhlIGNsb2NrIHNob3VsZCB0aWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHJ0aW1lXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtwcmV2XVxuICogQHJldHVybnMge0FycmF5PG51bWJlcj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV2l0aEdsb2JhbFxuICogQHBhcmFtIHtvYmplY3R9IF9nbG9iYWwgTmFtZXNwYWNlIHRvIG1vY2sgKGUuZy4gYHdpbmRvd2ApXG4gKiBAcmV0dXJucyB7RmFrZVRpbWVyc31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtcInNldFRpbWVvdXRcIiB8IFwiY2xlYXJUaW1lb3V0XCIgfCBcInNldEltbWVkaWF0ZVwiIHwgXCJjbGVhckltbWVkaWF0ZVwiIHwgXCJzZXRJbnRlcnZhbFwiIHwgXCJjbGVhckludGVydmFsXCIgfCBcIkRhdGVcIiB8IFwibmV4dFRpY2tcIiB8IFwiaHJ0aW1lXCIgfCBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiIHwgXCJjYW5jZWxBbmltYXRpb25GcmFtZVwiIHwgXCJyZXF1ZXN0SWRsZUNhbGxiYWNrXCIgfCBcImNhbmNlbElkbGVDYWxsYmFja1wiIHwgXCJwZXJmb3JtYW5jZVwiIHwgXCJxdWV1ZU1pY3JvdGFza1wiIHwgXCJJbnRsXCIgfCBcIlRlbXBvcmFsXCJ9IEZha2VNZXRob2RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBOb2RlSW1tZWRpYXRlIHwgVGltZXJ9IFRpbWVySWRcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZWplY3QtYW55LXR5cGUgKi9cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT4gJiB7XG4gKiAgIHNldFRpbWVvdXQ/OiBTZXRUaW1lb3V0LFxuICogICBjbGVhclRpbWVvdXQ/OiBDbGVhclRpbWVvdXQsXG4gKiAgIHNldEludGVydmFsPzogU2V0SW50ZXJ2YWwsXG4gKiAgIGNsZWFySW50ZXJ2YWw/OiBDbGVhckludGVydmFsLFxuICogICBzZXRJbW1lZGlhdGU/OiBTZXRJbW1lZGlhdGUsXG4gKiAgIGNsZWFySW1tZWRpYXRlPzogQ2xlYXJJbW1lZGlhdGUsXG4gKiAgIHF1ZXVlTWljcm90YXNrPzogUXVldWVNaWNyb3Rhc2ssXG4gKiAgIHJlcXVlc3RBbmltYXRpb25GcmFtZT86IFJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAqICAgY2FuY2VsQW5pbWF0aW9uRnJhbWU/OiBDYW5jZWxBbmltYXRpb25GcmFtZSxcbiAqICAgcmVxdWVzdElkbGVDYWxsYmFjaz86IFJlcXVlc3RJZGxlQ2FsbGJhY2ssXG4gKiAgIGNhbmNlbElkbGVDYWxsYmFjaz86IENhbmNlbElkbGVDYWxsYmFjayxcbiAqICAgcHJvY2Vzcz86IGFueSxcbiAqICAgcGVyZm9ybWFuY2U/OiBhbnksXG4gKiAgIFBlcmZvcm1hbmNlPzogYW55LFxuICogICBJbnRsPzogYW55LFxuICogICBUZW1wb3JhbD86IGFueSxcbiAqICAgUHJvbWlzZT86IHR5cGVvZiBQcm9taXNlLFxuICogICBEYXRlOiB0eXBlb2YgRGF0ZSAmIHsgaXNGYWtlPzogYm9vbGVhbiwgdG9Tb3VyY2U/OiAoKSA9PiBzdHJpbmcsIGNsb2NrPzogYW55IH1cbiAqIH19IEdsb2JhbE9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZXJIZWFwXG4gKiBAcHJvcGVydHkge1RpbWVyW119IHRpbWVycyAtIHRoZSBoZWFwLW9yZGVyZWQgdGltZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IFRpbWVyIHwgdW5kZWZpbmVkfSBwZWVrIC0gcmV0dXJucyB0aGUgbmV4dCB0aW1lciB3aXRob3V0IHJlbW92aW5nIGl0XG4gKiBAcHJvcGVydHkgeyh0aW1lcjogVGltZXIpID0+IHZvaWR9IHB1c2ggLSBhZGRzIGEgdGltZXIgdG8gdGhlIGhlYXBcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVGltZXIgfCB1bmRlZmluZWR9IHBvcCAtIHJlbW92ZXMgYW5kIHJldHVybnMgdGhlIG5leHQgdGltZXJcbiAqIEBwcm9wZXJ0eSB7KHRpbWVyOiBUaW1lcikgPT4gdm9pZH0gcmVtb3ZlIC0gcmVtb3ZlcyBhIHNwZWNpZmljIHRpbWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9ja1RpY2tNb2RlXG4gKiBAcHJvcGVydHkge1RpY2tNb2RlfSBtb2RlIC0gYWN0aXZlIHRpY2sgbW9kZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50ZXIgLSBpbmNyZW1lbnRzIHdoZW5ldmVyIHRoZSBtb2RlIGNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsdGFdIC0gaW50ZXJ2YWwgbGVuZ3RoIGluIG1pbGxpc2Vjb25kc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2V0VGlja01vZGVDb25maWdcbiAqIEBwcm9wZXJ0eSB7VGlja01vZGV9IG1vZGUgLSBkZXNpcmVkIHRpY2sgbW9kZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWx0YV0gLSBpbnRlcnZhbCBsZW5ndGggaW4gbWlsbGlzZWNvbmRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgYW55PiAmIHsgY2xvY2s6IENsb2NrIH19IEludGxXaXRoQ2xvY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBub3c6ICgpID0+IG51bWJlciB9fSBQZXJmb3JtYW5jZUxpa2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRpbWVyc1xuICogQHByb3BlcnR5IHtTZXRUaW1lb3V0fSBzZXRUaW1lb3V0IC0gbmF0aXZlIGBzZXRUaW1lb3V0YFxuICogQHByb3BlcnR5IHtDbGVhclRpbWVvdXR9IGNsZWFyVGltZW91dCAtIG5hdGl2ZSBgY2xlYXJUaW1lb3V0YFxuICogQHByb3BlcnR5IHtTZXRJbnRlcnZhbH0gc2V0SW50ZXJ2YWwgLSBuYXRpdmUgYHNldEludGVydmFsYFxuICogQHByb3BlcnR5IHtDbGVhckludGVydmFsfSBjbGVhckludGVydmFsIC0gbmF0aXZlIGBjbGVhckludGVydmFsYFxuICogQHByb3BlcnR5IHt0eXBlb2YgRGF0ZX0gRGF0ZSAtIG5hdGl2ZSBgRGF0ZWBcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIEludGx9IFtJbnRsXSAtIG5hdGl2ZSBgSW50bGBcbiAqIEBwcm9wZXJ0eSB7YW55fSBbVGVtcG9yYWxdIC0gbmF0aXZlIGBUZW1wb3JhbGBcbiAqIEBwcm9wZXJ0eSB7U2V0SW1tZWRpYXRlfSBbc2V0SW1tZWRpYXRlXSAtIG5hdGl2ZSBgc2V0SW1tZWRpYXRlYCwgaWYgYXZhaWxhYmxlXG4gKiBAcHJvcGVydHkge0NsZWFySW1tZWRpYXRlfSBbY2xlYXJJbW1lZGlhdGVdIC0gbmF0aXZlIGBjbGVhckltbWVkaWF0ZWAsIGlmIGF2YWlsYWJsZVxuICogQHByb3BlcnR5IHtIcnRpbWV9IFtocnRpbWVdIC0gbmF0aXZlIGBwcm9jZXNzLmhydGltZWAsIGlmIGF2YWlsYWJsZVxuICogQHByb3BlcnR5IHtOZXh0VGlja30gW25leHRUaWNrXSAtIG5hdGl2ZSBgcHJvY2Vzcy5uZXh0VGlja2AsIGlmIGF2YWlsYWJsZVxuICogQHByb3BlcnR5IHtQZXJmb3JtYW5jZUxpa2V9IFtwZXJmb3JtYW5jZV0gLSBuYXRpdmUgYHBlcmZvcm1hbmNlYCwgaWYgYXZhaWxhYmxlXG4gKiBAcHJvcGVydHkge1JlcXVlc3RBbmltYXRpb25GcmFtZX0gW3JlcXVlc3RBbmltYXRpb25GcmFtZV0gLSBuYXRpdmUgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsIGlmIGF2YWlsYWJsZVxuICogQHByb3BlcnR5IHtRdWV1ZU1pY3JvdGFza30gW3F1ZXVlTWljcm90YXNrXSAtIHdoZXRoZXIgYHF1ZXVlTWljcm90YXNrYCBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7Q2FuY2VsQW5pbWF0aW9uRnJhbWV9IFtjYW5jZWxBbmltYXRpb25GcmFtZV0gLSBuYXRpdmUgYGNhbmNlbEFuaW1hdGlvbkZyYW1lYCwgaWYgYXZhaWxhYmxlXG4gKiBAcHJvcGVydHkge1JlcXVlc3RJZGxlQ2FsbGJhY2t9IFtyZXF1ZXN0SWRsZUNhbGxiYWNrXSAtIG5hdGl2ZSBgcmVxdWVzdElkbGVDYWxsYmFja2AsIGlmIGF2YWlsYWJsZVxuICogQHByb3BlcnR5IHtDYW5jZWxJZGxlQ2FsbGJhY2t9IFtjYW5jZWxJZGxlQ2FsbGJhY2tdIC0gbmF0aXZlIGBjYW5jZWxJZGxlQ2FsbGJhY2tgLCBpZiBhdmFpbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENsb2NrU3RhdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aWNrRnJvbSAtIGxvd2VyIGJvdW5kIG9mIHRoZSBjdXJyZW50IHRpY2sgcmFuZ2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aWNrVG8gLSB1cHBlciBib3VuZCBvZiB0aGUgY3VycmVudCB0aWNrIHJhbmdlXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ByZXZpb3VzXSAtIHByZXZpb3VzIHRpbWVyIHRpbWUgdXNlZCBkdXJpbmcgdGlja2luZ1xuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbb2xkTm93XSAtIHByZXZpb3VzIHZhbHVlIG9mIGBub3dgXG4gKiBAcHJvcGVydHkge1RpbWVyfSBbdGltZXJdIC0gdGltZXIgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZFxuICogQHByb3BlcnR5IHt1bmtub3dufSBbZmlyc3RFeGNlcHRpb25dIC0gZmlyc3QgZXhjZXB0aW9uIHJhaXNlZCB3aGlsZSBwcm9jZXNzaW5nIHRpbWVyc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtuYW5vc1RvdGFsXSAtIGFjY3VtdWxhdGVkIG5hbm9zZWNvbmRzIGZyb20gZnJhY3Rpb25hbCB0aWNrc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFttc0Zsb2F0XSAtIGFjY3VtdWxhdGVkIGZyYWN0aW9uYWwgbWlsbGlzZWNvbmRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21zXSAtIGFjY3VtdWxhdGVkIHdob2xlIG1pbGxpc2Vjb25kc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZXJJbml0aWFsUHJvcHNcbiAqIEBwcm9wZXJ0eSB7Vm9pZFZhckFyZ3NGdW5jfSBmdW5jIC0gY2FsbGJhY2sgb3Igc3RyaW5nIHRvIGV4ZWN1dGVcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbYXJnc10gLSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsYmFja1xuICogQHByb3BlcnR5IHsnVGltZW91dCcgfCAnSW50ZXJ2YWwnIHwgJ0ltbWVkaWF0ZScgfCAnQW5pbWF0aW9uRnJhbWUnIHwgJ0lkbGVDYWxsYmFjayd9IFt0eXBlXSAtIHRpbWVyIGtpbmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldIC0gcmVxdWVzdGVkIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjYWxsQXRdIC0gc2NoZWR1bGVkIGV4ZWN1dGlvbiB0aW1lXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NyZWF0ZWRBdF0gLSB0aW1lIGF0IHdoaWNoIHRoZSB0aW1lciB3YXMgY3JlYXRlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW1tZWRpYXRlXSAtIHdoZXRoZXIgdGhpcyB0aW1lciBzaG91bGQgcnVuIGJlZm9yZSBub24taW1tZWRpYXRlIHRpbWVycyBhdCB0aGUgc2FtZSB0aW1lXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2lkXSAtIHVuaXF1ZSB0aW1lciBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge0Vycm9yfSBbZXJyb3JdIC0gY2FwdHVyZWQgc3RhY2sgZm9yIGxvb3AgZGlhZ25vc3RpY3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW50ZXJ2YWxdIC0gaW50ZXJ2YWwgZm9yIHJlcGVhdGVkIHRpbWVyc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbYW5pbWF0aW9uXSAtIHdoZXRoZXIgdGhpcyBpcyBhbiBhbmltYXRpb24gZnJhbWUgdGltZXJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JlcXVlc3RJZGxlQ2FsbGJhY2tdIC0gd2hldGhlciB0aGlzIGlzIGFuIGlkbGUgY2FsbGJhY2sgdGltZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb3JkZXJdIC0gZXhlY3V0aW9uIG9yZGVyIGZvciB0aW1lcnMgYXQgdGhlIHNhbWUgdGltZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtoZWFwSW5kZXhdIC0gaW5kZXggaW4gdGhlIHRpbWVyIGhlYXBcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVDbG9ja0NhbGxiYWNrXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfFRlbXBvcmFsVGltZWxpa2V9IFtzdGFydF0gaW5pdGlhbCBtb2NrZWQgdGltZSwgYXMgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLCBhIERhdGUsIGEgVGVtcG9yYWwuSW5zdGFudCwgb3IgYSBUZW1wb3JhbC5ab25lZERhdGVUaW1lXG4gKiBAcGFyYW0ge251bWJlcn0gW2xvb3BMaW1pdF0gbWF4aW11bSBudW1iZXIgb2YgdGltZXJzIHJ1biBiZWZvcmUgYWJvcnRpbmcgd2l0aCBhbiBpbmZpbml0ZS1sb29wIGVycm9yXG4gKiBAcmV0dXJucyB7Q2xvY2t9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbENhbGxiYWNrXG4gKiBAcGFyYW0ge0NvbmZpZ30gW2NvbmZpZ10gT3B0aW9uYWwgY29uZmlnXG4gKiBAcmV0dXJucyB7Q2xvY2t9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGYWtlVGltZXJzXG4gKiBAcHJvcGVydHkge1RpbWVyc30gdGltZXJzIC0gdGhlIG5hdGl2ZSB0aW1lciBBUElzIHNhdmVkIGZvciBsYXRlciByZXN0b3JhdGlvblxuICogQHByb3BlcnR5IHtDcmVhdGVDbG9ja0NhbGxiYWNrfSBjcmVhdGVDbG9jayAtIGNyZWF0ZXMgYSBuZXcgZmFrZSBjbG9ja1xuICogQHByb3BlcnR5IHtJbnN0YWxsQ2FsbGJhY2t9IGluc3RhbGwgLSBpbnN0YWxscyB0aGUgZmFrZSB0aW1lcnMgb250byB0aGUgZGVmYXVsdCBnbG9iYWwgb2JqZWN0XG4gKiBAcHJvcGVydHkge1dpdGhHbG9iYWx9IHdpdGhHbG9iYWwgLSBjcmVhdGVzIGEgZmFrZS10aW1lcnMgaW5zdGFuY2UgZm9yIGEgcHJvdmlkZWQgZ2xvYmFsIG9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ2xvY2tcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBub3cgLSBjdXJyZW50IG1vY2tlZCB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHt0eXBlb2YgRGF0ZSAmIHtjbG9jaz86IENsb2NrLCBpc0Zha2U/OiBib29sZWFuLCB0b1NvdXJjZT86ICgpID0+IHN0cmluZ319IERhdGUgLSBmYWtlIERhdGUgY29uc3RydWN0b3IgYm91bmQgdG8gdGhpcyBjbG9ja1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvb3BMaW1pdCAtIG1heGltdW0gbnVtYmVyIG9mIHRpbWVycyBiZWZvcmUgYXNzdW1pbmcgYW4gaW5maW5pdGUgbG9vcFxuICogQHByb3BlcnR5IHtSZXF1ZXN0SWRsZUNhbGxiYWNrfSByZXF1ZXN0SWRsZUNhbGxiYWNrIC0gc2NoZWR1bGVzIGFuIGlkbGUgY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7Q2FuY2VsSWRsZUNhbGxiYWNrfSBjYW5jZWxJZGxlQ2FsbGJhY2sgLSBjYW5jZWxzIGEgc2NoZWR1bGVkIGlkbGUgY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7U2V0VGltZW91dH0gc2V0VGltZW91dCAtIGZha2VkIGBzZXRUaW1lb3V0YFxuICogQHByb3BlcnR5IHtDbGVhclRpbWVvdXR9IGNsZWFyVGltZW91dCAtIGZha2VkIGBjbGVhclRpbWVvdXRgXG4gKiBAcHJvcGVydHkge05leHRUaWNrfSBuZXh0VGljayAtIGZha2VkIGBwcm9jZXNzLm5leHRUaWNrYFxuICogQHByb3BlcnR5IHtRdWV1ZU1pY3JvdGFza30gcXVldWVNaWNyb3Rhc2sgLSBmYWtlZCBgcXVldWVNaWNyb3Rhc2tgXG4gKiBAcHJvcGVydHkge1NldEludGVydmFsfSBzZXRJbnRlcnZhbCAtIGZha2VkIGBzZXRJbnRlcnZhbGBcbiAqIEBwcm9wZXJ0eSB7Q2xlYXJJbnRlcnZhbH0gY2xlYXJJbnRlcnZhbCAtIGZha2VkIGBjbGVhckludGVydmFsYFxuICogQHByb3BlcnR5IHtTZXRJbW1lZGlhdGV9IHNldEltbWVkaWF0ZSAtIGZha2VkIGBzZXRJbW1lZGlhdGVgXG4gKiBAcHJvcGVydHkge0NsZWFySW1tZWRpYXRlfSBjbGVhckltbWVkaWF0ZSAtIGZha2VkIGBjbGVhckltbWVkaWF0ZWBcbiAqIEBwcm9wZXJ0eSB7Q291bnRUaW1lcnN9IGNvdW50VGltZXJzIC0gY291bnRzIHNjaGVkdWxlZCB0aW1lcnNcbiAqIEBwcm9wZXJ0eSB7UmVxdWVzdEFuaW1hdGlvbkZyYW1lfSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgLSBzY2hlZHVsZXMgYSBmcmFtZSBjYWxsYmFja1xuICogQHByb3BlcnR5IHtDYW5jZWxBbmltYXRpb25GcmFtZX0gY2FuY2VsQW5pbWF0aW9uRnJhbWUgLSBjYW5jZWxzIGEgZnJhbWUgY2FsbGJhY2tcbiAqIEBwcm9wZXJ0eSB7UnVuTWljcm90YXNrc30gcnVuTWljcm90YXNrcyAtIGRyYWlucyBtaWNyb3Rhc2tzXG4gKiBAcHJvcGVydHkge1RpY2t9IHRpY2sgLSBhZHZhbmNlcyBmYWtlIHRpbWUgc3luY2hyb25vdXNseVxuICogQHByb3BlcnR5IHtUaWNrQXN5bmN9IHRpY2tBc3luYyAtIGFkdmFuY2VzIGZha2UgdGltZSBhc3luY2hyb25vdXNseVxuICogQHByb3BlcnR5IHtOZXh0fSBuZXh0IC0gcnVucyB0aGUgbmV4dCBzY2hlZHVsZWQgdGltZXJcbiAqIEBwcm9wZXJ0eSB7TmV4dEFzeW5jfSBuZXh0QXN5bmMgLSBydW5zIHRoZSBuZXh0IHNjaGVkdWxlZCB0aW1lciBhc3luY2hyb25vdXNseVxuICogQHByb3BlcnR5IHtSdW5BbGx9IHJ1bkFsbCAtIHJ1bnMgYWxsIHNjaGVkdWxlZCB0aW1lcnNcbiAqIEBwcm9wZXJ0eSB7UnVuVG9GcmFtZX0gcnVuVG9GcmFtZSAtIHJ1bnMgdGltZXJzIHVwIHRvIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICogQHByb3BlcnR5IHtSdW5BbGxBc3luY30gcnVuQWxsQXN5bmMgLSBydW5zIGFsbCBzY2hlZHVsZWQgdGltZXJzIGFzeW5jaHJvbm91c2x5XG4gKiBAcHJvcGVydHkge1J1blRvTGFzdH0gcnVuVG9MYXN0IC0gcnVucyB0aW1lcnMgdXAgdG8gdGhlIGxhc3Qgc2NoZWR1bGVkIHRpbWVyXG4gKiBAcHJvcGVydHkge1J1blRvTGFzdEFzeW5jfSBydW5Ub0xhc3RBc3luYyAtIHJ1bnMgdGltZXJzIHVwIHRvIHRoZSBsYXN0IHNjaGVkdWxlZCB0aW1lciBhc3luY2hyb25vdXNseVxuICogQHByb3BlcnR5IHtSZXNldH0gcmVzZXQgLSBjbGVhcnMgYWxsIHRpbWVycyBhbmQgcmVzZXRzIHRoZSBjbG9ja1xuICogQHByb3BlcnR5IHtTZXRTeXN0ZW1UaW1lfSBzZXRTeXN0ZW1UaW1lIC0gc2V0cyB0aGUgY2xvY2sgdG8gYSBzcGVjaWZpYyB3YWxsLWNsb2NrIHRpbWVcbiAqIEBwcm9wZXJ0eSB7SnVtcH0ganVtcCAtIGFkdmFuY2VzIHRpbWUgYW5kIHJldHVybnMgdGhlIG5ldyBgbm93YFxuICogQHByb3BlcnR5IHthbnl9IHBlcmZvcm1hbmNlIC0gZmFrZSBwZXJmb3JtYW5jZSBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7SHJ0aW1lfSBocnRpbWUgLSBmYWtlZCBgcHJvY2Vzcy5ocnRpbWVgXG4gKiBAcHJvcGVydHkge1VuaW5zdGFsbH0gdW5pbnN0YWxsIC0gcmVzdG9yZXMgbmF0aXZlIHRpbWVyc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gbWV0aG9kcyAtIG5hbWVzIG9mIGZha2VkIG1ldGhvZHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Nob3VsZENsZWFyTmF0aXZlVGltZXJzXSAtIGluaGVyaXRlZCBmcm9tIGNvbmZpZ1xuICogQHByb3BlcnR5IHt7bWV0aG9kTmFtZTpzdHJpbmcsIG9yaWdpbmFsOnVua25vd259W10gfCB1bmRlZmluZWR9IHRpbWVyc01vZHVsZU1ldGhvZHMgLSBzYXZlZCBOb2RlIHRpbWVycyBtb2R1bGUgbWV0aG9kc1xuICogQHByb3BlcnR5IHt7bWV0aG9kTmFtZTpzdHJpbmcsIG9yaWdpbmFsOnVua25vd259W10gfCB1bmRlZmluZWR9IHRpbWVyc1Byb21pc2VzTW9kdWxlTWV0aG9kcyAtIHNhdmVkIE5vZGUgdGltZXJzL3Byb21pc2VzIG1ldGhvZHNcbiAqIEBwcm9wZXJ0eSB7TWFwPFZvaWRWYXJBcmdzRnVuYywgQWJvcnRTaWduYWw+fSBhYm9ydExpc3RlbmVyTWFwIC0gYWN0aXZlIGFib3J0IGxpc3RlbmVyc1xuICogQHByb3BlcnR5IHtTZXRUaWNrTW9kZX0gc2V0VGlja01vZGUgLSBzd2l0Y2hlcyB0aGUgYXV0by10aWNrIG1vZGVcbiAqIEBwcm9wZXJ0eSB7TWFwPG51bWJlciwgVGltZXI+fSBbdGltZXJzXSAtIGludGVybmFsIHRpbWVyIHN0b3JhZ2VcbiAqIEBwcm9wZXJ0eSB7VGltZXJIZWFwfSBbdGltZXJIZWFwXSAtIGludGVybmFsIHRpbWVyIGhlYXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmluZ1RpY2tdIC0gaW50ZXJuYWwgZmxhZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBpc05lYXJJbmZpbml0ZUxpbWl0IC0gaW50ZXJuYWwgZmxhZyBpbmRpY2F0aW5nIHRoZSBsb29wIGxpbWl0IGlzIG5lYXJseSByZWFjaGVkXG4gKiBAcHJvcGVydHkge1RpbWVySWR9IFthdHRhY2hlZEludGVydmFsXSAtIGludGVybmFsIGZsYWdcbiAqIEBwcm9wZXJ0eSB7Q2xvY2tUaWNrTW9kZX0gW3RpY2tNb2RlXSAtIGludGVybmFsIGZsYWdcbiAqIEBwcm9wZXJ0eSB7VGltZXJbXX0gW2pvYnNdIC0gaW50ZXJuYWwgZmxhZ1xuICogQHByb3BlcnR5IHtJbnRsV2l0aENsb2NrfSBbSW50bF0gLSBmYWtlIEludGwgb2JqZWN0XG4gKiBAcHJvcGVydHkge2FueX0gW1RlbXBvcmFsXSAtIGZha2UgVGVtcG9yYWwgb2JqZWN0XG4gKi9cbi8qIGVzbGludC1lbmFibGUganNkb2MvcmVqZWN0LWFueS10eXBlICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBgaW5zdGFsbGAgbWV0aG9kLlxuICogQHR5cGVkZWYge29iamVjdH0gQ29uZmlnXG4gKiBAcHJvcGVydHkge251bWJlcnxEYXRlfFRlbXBvcmFsVGltZWxpa2V9IFtub3ddIGluaXRpYWwgbW9ja2VkIHRpbWUsIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCwgYSBEYXRlLCBhIFRlbXBvcmFsLkluc3RhbnQsIG9yIGEgVGVtcG9yYWwuWm9uZWREYXRlVGltZVxuICogQHByb3BlcnR5IHtGYWtlTWV0aG9kW119IFt0b0Zha2VdIG1ldGhvZCBuYW1lcyB0aGF0IHNob3VsZCBiZSBmYWtlZFxuICogQHByb3BlcnR5IHtGYWtlTWV0aG9kW119IFt0b05vdEZha2VdIG1ldGhvZCBuYW1lcyB0aGF0IHNob3VsZCByZW1haW4gbmF0aXZlXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xvb3BMaW1pdF0gbWF4aW11bSBudW1iZXIgb2YgdGltZXJzIHJ1biBiZWZvcmUgYWJvcnRpbmcgd2l0aCBhbiBpbmZpbml0ZS1sb29wIGVycm9yXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzaG91bGRBZHZhbmNlVGltZV0gYXV0b21hdGljYWxseSBpbmNyZW1lbnRzIG1vY2tlZCB0aW1lIHdoaWxlIHRoZSBjbG9jayBpcyBpbnN0YWxsZWRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYWR2YW5jZVRpbWVEZWx0YV0gaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHVzZWQgd2hlbiBgc2hvdWxkQWR2YW5jZVRpbWVgIGlzIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Nob3VsZENsZWFyTmF0aXZlVGltZXJzXSBmb3J3YXJkcyBjbGVhciBjYWxscyB0byBuYXRpdmUgbWV0aG9kcyB3aGVuIHRoZSB0aW1lciBpcyBub3QgZmFrZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlTWlzc2luZ1RpbWVyc10gc3VwcHJlc3NlcyBlcnJvcnMgd2hlbiBhIHJlcXVlc3RlZCB0aW1lciBpcyBtaXNzaW5nIGZyb20gdGhlIGdsb2JhbCBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7R2xvYmFsT2JqZWN0fSBbdGFyZ2V0XSBnbG9iYWwgb2JqZWN0IHRvIGluc3RhbGwgb250b1xuICovXG5cbi8qKlxuICogVGhlIGludGVybmFsIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHNjaGVkdWxlZCBmYWtlIHRpbWVyXG4gKiBAdHlwZWRlZiB7VGltZXJJbml0aWFsUHJvcHN9IFRpbWVyXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gYXJncyAtIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FsbEF0IC0gc2NoZWR1bGVkIGV4ZWN1dGlvbiB0aW1lXG4gKiBAcHJvcGVydHkge251bWJlcn0gY3JlYXRlZEF0IC0gdGltZSBhdCB3aGljaCB0aGUgdGltZXIgd2FzIGNyZWF0ZWRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZCAtIHVuaXF1ZSB0aW1lciBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgeydUaW1lb3V0JyB8ICdJbnRlcnZhbCcgfCAnSW1tZWRpYXRlJyB8ICdBbmltYXRpb25GcmFtZScgfCAnSWRsZUNhbGxiYWNrJ30gdHlwZSAtIHRpbWVyIGtpbmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBOb2RlSW1tZWRpYXRlSGFzUmVmXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBOb2RlSW1tZWRpYXRlUmVmXG4gKiBAcmV0dXJucyB7Tm9kZUltbWVkaWF0ZX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBOb2RlSW1tZWRpYXRlVW5yZWZcbiAqIEByZXR1cm5zIHtOb2RlSW1tZWRpYXRlfVxuICovXG5cbi8qKlxuICogQSBOb2RlIHRpbWVyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb2RlSW1tZWRpYXRlXG4gKiBAcHJvcGVydHkge05vZGVJbW1lZGlhdGVIYXNSZWZ9IGhhc1JlZiAtIHJlcG9ydHMgd2hldGhlciB0aGUgdGltZXIga2VlcHMgdGhlIGV2ZW50IGxvb3AgYWxpdmVcbiAqIEBwcm9wZXJ0eSB7Tm9kZUltbWVkaWF0ZVJlZn0gcmVmIC0gbWFya3MgdGhlIHRpbWVyIGFzIHJlZmVyZW5jZWRcbiAqIEBwcm9wZXJ0eSB7Tm9kZUltbWVkaWF0ZVVucmVmfSB1bnJlZiAtIG1hcmtzIHRoZSB0aW1lciBhcyB1bnJlZmVyZW5jZWRcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5cbi8qKlxuICogTW9ja3MgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIG5hbWVzcGFjZS5cbiAqIEBwYXJhbSB7R2xvYmFsT2JqZWN0fSBfZ2xvYmFsIE5hbWVzcGFjZSB0byBtb2NrIChlLmcuIGB3aW5kb3dgKVxuICogQHJldHVybnMge0Zha2VUaW1lcnN9XG4gKi9cbmZ1bmN0aW9uIHdpdGhHbG9iYWwoX2dsb2JhbCkge1xuICAgIGNvbnN0IG1heFRpbWVvdXQgPSBNYXRoLnBvdygyLCAzMSkgLSAxOyAvL3NlZSBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNhYnN0cmFjdC1vcGRlZi1jb252ZXJ0dG9pbnRcbiAgICBjb25zdCBpZENvdW50ZXJTdGFydCA9IDFlMTI7IC8vIGFyYml0cmFyaWx5IGxhcmdlIG51bWJlciB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggbmF0aXZlIHRpbWVyIElEc1xuICAgIGNvbnN0IE5PT1AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBjb25zdCBOT09QX0FSUkFZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICBjb25zdCBpc1ByZXNlbnQgPSB7fTtcbiAgICBsZXQgdGltZW91dFJlc3VsdCxcbiAgICAgICAgYWRkVGltZXJSZXR1cm5zT2JqZWN0ID0gZmFsc2U7XG5cbiAgICBpZiAoX2dsb2JhbC5zZXRUaW1lb3V0KSB7XG4gICAgICAgIGlzUHJlc2VudC5zZXRUaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgdGltZW91dFJlc3VsdCA9IF9nbG9iYWwuc2V0VGltZW91dChOT09QLCAwKTtcbiAgICAgICAgYWRkVGltZXJSZXR1cm5zT2JqZWN0ID0gdHlwZW9mIHRpbWVvdXRSZXN1bHQgPT09IFwib2JqZWN0XCI7XG4gICAgfVxuICAgIGlzUHJlc2VudC5jbGVhclRpbWVvdXQgPSBCb29sZWFuKF9nbG9iYWwuY2xlYXJUaW1lb3V0KTtcbiAgICBpc1ByZXNlbnQuc2V0SW50ZXJ2YWwgPSBCb29sZWFuKF9nbG9iYWwuc2V0SW50ZXJ2YWwpO1xuICAgIGlzUHJlc2VudC5jbGVhckludGVydmFsID0gQm9vbGVhbihfZ2xvYmFsLmNsZWFySW50ZXJ2YWwpO1xuICAgIGlzUHJlc2VudC5ocnRpbWUgPVxuICAgICAgICBfZ2xvYmFsLnByb2Nlc3MgJiYgdHlwZW9mIF9nbG9iYWwucHJvY2Vzcy5ocnRpbWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpc1ByZXNlbnQuaHJ0aW1lQmlnaW50ID1cbiAgICAgICAgaXNQcmVzZW50LmhydGltZSAmJiB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzLmhydGltZS5iaWdpbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpc1ByZXNlbnQubmV4dFRpY2sgPVxuICAgICAgICBfZ2xvYmFsLnByb2Nlc3MgJiYgdHlwZW9mIF9nbG9iYWwucHJvY2Vzcy5uZXh0VGljayA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IHV0aWxQcm9taXNpZnkgPSBfZ2xvYmFsLnByb2Nlc3MgJiYgcmVxdWlyZShcInV0aWxcIikucHJvbWlzaWZ5O1xuICAgIGlzUHJlc2VudC5wZXJmb3JtYW5jZSA9XG4gICAgICAgIF9nbG9iYWwucGVyZm9ybWFuY2UgJiYgdHlwZW9mIF9nbG9iYWwucGVyZm9ybWFuY2Uubm93ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgY29uc3QgaGFzUGVyZm9ybWFuY2VQcm90b3R5cGUgPVxuICAgICAgICBfZ2xvYmFsLlBlcmZvcm1hbmNlICYmXG4gICAgICAgICh0eXBlb2YgX2dsb2JhbC5QZXJmb3JtYW5jZSkubWF0Y2goL14oZnVuY3Rpb258b2JqZWN0KSQvKTtcbiAgICBjb25zdCBoYXNQZXJmb3JtYW5jZUNvbnN0cnVjdG9yUHJvdG90eXBlID1cbiAgICAgICAgX2dsb2JhbC5wZXJmb3JtYW5jZSAmJlxuICAgICAgICBfZ2xvYmFsLnBlcmZvcm1hbmNlLmNvbnN0cnVjdG9yICYmXG4gICAgICAgIF9nbG9iYWwucGVyZm9ybWFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIGlzUHJlc2VudC5xdWV1ZU1pY3JvdGFzayA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgX2dsb2JhbCxcbiAgICAgICAgXCJxdWV1ZU1pY3JvdGFza1wiLFxuICAgICk7XG4gICAgaXNQcmVzZW50LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgIF9nbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lICYmXG4gICAgICAgIHR5cGVvZiBfZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGlzUHJlc2VudC5jYW5jZWxBbmltYXRpb25GcmFtZSA9XG4gICAgICAgIF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgJiZcbiAgICAgICAgdHlwZW9mIF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpc1ByZXNlbnQucmVxdWVzdElkbGVDYWxsYmFjayA9XG4gICAgICAgIF9nbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjayAmJlxuICAgICAgICB0eXBlb2YgX2dsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCI7XG4gICAgaXNQcmVzZW50LmNhbmNlbElkbGVDYWxsYmFjayA9XG4gICAgICAgIF9nbG9iYWwuY2FuY2VsSWRsZUNhbGxiYWNrICYmXG4gICAgICAgIHR5cGVvZiBfZ2xvYmFsLmNhbmNlbElkbGVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGlzUHJlc2VudC5zZXRJbW1lZGlhdGUgPVxuICAgICAgICBfZ2xvYmFsLnNldEltbWVkaWF0ZSAmJiB0eXBlb2YgX2dsb2JhbC5zZXRJbW1lZGlhdGUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpc1ByZXNlbnQuY2xlYXJJbW1lZGlhdGUgPVxuICAgICAgICBfZ2xvYmFsLmNsZWFySW1tZWRpYXRlICYmIHR5cGVvZiBfZ2xvYmFsLmNsZWFySW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCI7XG4gICAgaXNQcmVzZW50LkludGwgPSBfZ2xvYmFsLkludGwgJiYgdHlwZW9mIF9nbG9iYWwuSW50bCA9PT0gXCJvYmplY3RcIjtcbiAgICBpc1ByZXNlbnQuVGVtcG9yYWwgPVxuICAgICAgICBfZ2xvYmFsLlRlbXBvcmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBfZ2xvYmFsLlRlbXBvcmFsID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiBfZ2xvYmFsLlRlbXBvcmFsLk5vdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgX2dsb2JhbC5UZW1wb3JhbC5JbnN0YW50ICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gICAgaWYgKF9nbG9iYWwuY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIF9nbG9iYWwuY2xlYXJUaW1lb3V0KHRpbWVvdXRSZXN1bHQpO1xuICAgIH1cblxuICAgIGNvbnN0IE5hdGl2ZURhdGUgPSBfZ2xvYmFsLkRhdGU7XG4gICAgY29uc3QgTmF0aXZlSW50bCA9IGlzUHJlc2VudC5JbnRsXG4gICAgICAgID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG4gICAgICAgICAgICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKF9nbG9iYWwuSW50bCksXG4gICAgICAgICAgKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBOYXRpdmVUZW1wb3JhbCA9IGlzUHJlc2VudC5UZW1wb3JhbCA/IF9nbG9iYWwuVGVtcG9yYWwgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHVuaXF1ZVRpbWVySWQgPSBpZENvdW50ZXJTdGFydDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICBsZXQgdW5pcXVlVGltZXJPcmRlciA9IDA7XG5cbiAgICBpZiAoTmF0aXZlRGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiVGhlIGdsb2JhbCBzY29wZSBkb2Vzbid0IGhhdmUgYSBgRGF0ZWAgb2JqZWN0XCIgK1xuICAgICAgICAgICAgICAgIFwiIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Npbm9uanMvc2lub24vaXNzdWVzLzE4NTIjaXNzdWVjb21tZW50LTQxOTYyMjc4MClcIixcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaXNQcmVzZW50LkRhdGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBlcmZvcm1hbmNlRW50cnkgb2JqZWN0IGVuY2Fwc3VsYXRlcyBhIHNpbmdsZSBwZXJmb3JtYW5jZSBtZXRyaWNcbiAgICAgKiB0aGF0IGlzIHBhcnQgb2YgdGhlIGJyb3dzZXIncyBwZXJmb3JtYW5jZSB0aW1lbGluZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYW4gb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBgbWFya2AgYW5kIGBtZWFzdXJlYCBtZXRob2RzIG9uIHRoZSBQZXJmb3JtYW5jZSBwcm90b3R5cGVcbiAgICAgKi9cbiAgICBjbGFzcyBGYWtlUGVyZm9ybWFuY2VFbnRyeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKG5hbWUsIGVudHJ5VHlwZSwgc3RhcnRUaW1lLCBkdXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuZW50cnlUeXBlID0gZW50cnlUeXBlO1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7XG4gICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICB0b0pTT04oKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyAuLi50aGlzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyRmluaXRlKG51bSkge1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hlY2tJc05lYXJJbmZpbml0ZUxpbWl0KGNsb2NrLCBpKSB7XG4gICAgICAgIGlmIChjbG9jay5sb29wTGltaXQgJiYgaSA9PT0gY2xvY2subG9vcExpbWl0IC0gMSkge1xuICAgICAgICAgICAgY2xvY2suaXNOZWFySW5maW5pdGVMaW1pdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc2V0SXNOZWFySW5maW5pdGVMaW1pdChjbG9jaykge1xuICAgICAgICBpZiAoY2xvY2spIHtcbiAgICAgICAgICAgIGNsb2NrLmlzTmVhckluZmluaXRlTGltaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHN0cmluZ3MgbGlrZSBcIjAxOjEwOjAwXCIgKG1lYW5pbmcgMSBob3VyLCAxMCBtaW51dGVzLCAwIHNlY29uZHMpIGludG9cbiAgICAgKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBodW1hbi1yZWFkYWJsZSBzdHJpbmdzIHBhc3NlZFxuICAgICAqIHRvIGNsb2NrLnRpY2soKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlVGltZShzdHIpIHtcbiAgICAgICAgaWYgKCFzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IHN0ci5zcGxpdChcIjpcIik7XG4gICAgICAgIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aDtcbiAgICAgICAgbGV0IGkgPSBsO1xuICAgICAgICBsZXQgbXMgPSAwO1xuICAgICAgICBsZXQgcGFyc2VkO1xuXG4gICAgICAgIGlmIChsID4gMyB8fCAhL14oXFxkXFxkOil7MCwyfVxcZFxcZD8kLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcInRpY2sgb25seSB1bmRlcnN0YW5kcyBudW1iZXJzLCAnbTpzJyBhbmQgJ2g6bTpzJy4gRWFjaCBwYXJ0IG11c3QgYmUgdHdvIGRpZ2l0c1wiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZ3NbaV0sIDEwKTtcblxuICAgICAgICAgICAgaWYgKHBhcnNlZCA+PSA2MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0aW1lICR7c3RyfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtcyArPSBwYXJzZWQgKiBNYXRoLnBvdyg2MCwgbCAtIGkgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtcyAqIDEwMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWNpbWFsIHBhcnQgb2YgdGhlIG1pbGxpc2Vjb25kIHZhbHVlIGFzIG5hbm9zZWNvbmRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1zRmxvYXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBhbiBpbnRlZ2VyIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpbiB0aGUgcmFuZ2UgWzAsMWU2KVxuICAgICAqXG4gICAgICogRXhhbXBsZTogbmFub1JlbWFpbmVyKDEyMy40NTY3ODkpIC0+IDQ1Njc4OVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hbm9SZW1haW5kZXIobXNGbG9hdCkge1xuICAgICAgICBjb25zdCBtb2R1bG8gPSAxZTY7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IChtc0Zsb2F0ICogMWU2KSAlIG1vZHVsbztcbiAgICAgICAgY29uc3QgcG9zaXRpdmVSZW1haW5kZXIgPVxuICAgICAgICAgICAgcmVtYWluZGVyIDwgMCA/IHJlbWFpbmRlciArIG1vZHVsbyA6IHJlbWFpbmRlcjtcblxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihwb3NpdGl2ZVJlbWFpbmRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBncm9rIHRoZSBgbm93YCBwYXJhbWV0ZXIgdG8gY3JlYXRlQ2xvY2suXG4gICAgICogQHBhcmFtIHtEYXRlfG51bWJlcnxUZW1wb3JhbFRpbWVsaWtlfSBlcG9jaCB0aGUgc3lzdGVtIHRpbWVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEVwb2NoKGVwb2NoKSB7XG4gICAgICAgIGlmICghZXBvY2gpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXBvY2ggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBlcG9jaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mICgvKiogQHR5cGUge0RhdGV9ICovIChlcG9jaCkuZ2V0VGltZSkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7RGF0ZX0gKi8gKGVwb2NoKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIChcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge1RlbXBvcmFsVGltZWxpa2V9ICovIChlcG9jaCkuZXBvY2hNaWxsaXNlY29uZHNcbiAgICAgICAgICAgICkgPT09IFwibnVtYmVyXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBUZW1wb3JhbC5JbnN0YW50IGFuZCBUZW1wb3JhbC5ab25lZERhdGVUaW1lIGJvdGggaGF2ZSBlcG9jaE1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7VGVtcG9yYWxUaW1lbGlrZX0gKi8gKGVwb2NoKS5lcG9jaE1pbGxpc2Vjb25kcztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibm93IHNob3VsZCBiZSBtaWxsaXNlY29uZHMgc2luY2UgVU5JWCBlcG9jaFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b1xuICAgICAqIEBwYXJhbSB7VGltZXJ9IHRpbWVyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZShmcm9tLCB0bywgdGltZXIpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVyICYmIHRpbWVyLmNhbGxBdCA+PSBmcm9tICYmIHRpbWVyLmNhbGxBdCA8PSB0bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqIEBwYXJhbSB7VGltZXJ9IGpvYlxuICAgICAqIEByZXR1cm5zIHtFcnJvcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJbmZpbml0ZUxvb3BFcnJvcihjbG9jaywgam9iKSB7XG4gICAgICAgIGNvbnN0IGluZmluaXRlTG9vcEVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFib3J0aW5nIGFmdGVyIHJ1bm5pbmcgJHtjbG9jay5sb29wTGltaXR9IHRpbWVycywgYXNzdW1pbmcgYW4gaW5maW5pdGUgbG9vcCFgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICgham9iLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5maW5pdGVMb29wRXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXR0ZXJuIG5ldmVyIG1hdGNoZWQgaW4gTm9kZVxuICAgICAgICBjb25zdCBjb21wdXRlZFRhcmdldFBhdHRlcm4gPSAvdGFyZ2V0XFwuKls8fCh8W10uKj9bPnxcXF18KV1cXHMqLztcbiAgICAgICAgbGV0IGNsb2NrTWV0aG9kUGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBTdHJpbmcoT2JqZWN0LmtleXMoY2xvY2spLmpvaW4oXCJ8XCIpKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYWRkVGltZXJSZXR1cm5zT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBub2RlLmpzIGVudmlyb25tZW50XG4gICAgICAgICAgICBjbG9ja01ldGhvZFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgIGBcXFxccythdCAoT2JqZWN0XFxcXC4pPyg/OiR7T2JqZWN0LmtleXMoY2xvY2spLmpvaW4oXCJ8XCIpfSlcXFxccytgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXRjaGVkTGluZUluZGV4ID0gLTE7XG4gICAgICAgIGpvYi5lcnJvci5zdGFjay5zcGxpdChcIlxcblwiKS5zb21lKGZ1bmN0aW9uIChsaW5lLCBpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSd2ZSBtYXRjaGVkIGEgY29tcHV0ZWQgdGFyZ2V0IGxpbmUgKGUuZy4gc2V0VGltZW91dCkgdGhlbiB3ZVxuICAgICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBsb29rIGFueSBmdXJ0aGVyLiBSZXR1cm4gdHJ1ZSB0byBzdG9wIGl0ZXJhdGluZy5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb21wdXRlZFRhcmdldCA9IGxpbmUubWF0Y2goY29tcHV0ZWRUYXJnZXRQYXR0ZXJuKTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRDb21wdXRlZFRhcmdldCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWRMaW5lSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSd2ZSBtYXRjaGVkIGEgY2xvY2sgbWV0aG9kIGxpbmUsIHRoZW4gdGhlcmUgbWF5IHN0aWxsIGJlXG4gICAgICAgICAgICAvLyBvdGhlcnMgZnVydGhlciBkb3duIHRoZSB0cmFjZS4gUmV0dXJuIGZhbHNlIHRvIGtlZXAgaXRlcmF0aW5nLlxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENsb2NrTWV0aG9kID0gbGluZS5tYXRjaChjbG9ja01ldGhvZFBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRDbG9ja01ldGhvZCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWRMaW5lSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBtYXRjaGVkIGFueXRoaW5nIG9uIHRoaXMgbGluZSwgYnV0IHdlIG1hdGNoZWRcbiAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgYW5kIHNldCB0aGUgbWF0Y2hlZCBsaW5lIGluZGV4LCB0aGVuIHdlIGNhbiBzdG9wLlxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBtYXRjaGVkIHByZXZpb3VzbHksIHRoZW4gd2Ugc2hvdWxkIGtlZXAgaXRlcmF0aW5nLlxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRMaW5lSW5kZXggPj0gMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBgJHtpbmZpbml0ZUxvb3BFcnJvcn1cXG4ke2pvYi50eXBlIHx8IFwiTWljcm90YXNrXCJ9IC0gJHtcbiAgICAgICAgICAgIGpvYi5mdW5jLm5hbWUgfHwgXCJhbm9ueW1vdXNcIlxuICAgICAgICB9XFxuJHtqb2IuZXJyb3Iuc3RhY2tcbiAgICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgICAgLnNsaWNlKG1hdGNoZWRMaW5lSW5kZXggKyAxKVxuICAgICAgICAgICAgLmpvaW4oXCJcXG5cIil9YDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluZmluaXRlTG9vcEVycm9yLCBcInN0YWNrXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RhY2ssXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5maW5pdGVMb29wRXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge3R5cGVvZiBEYXRlICYgeyBjbG9jazogQ2xvY2sgfX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlKCkge1xuICAgICAgICBjbGFzcyBDbG9ja0RhdGUgZXh0ZW5kcyBOYXRpdmVEYXRlIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7Q2xvY2t9ICovXG4gICAgICAgICAgICBzdGF0aWMgY2xvY2s7XG5cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSBmYWtlIHRpbWUgd2hlbiBEYXRlIGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cy5cbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIoQ2xvY2tEYXRlLmNsb2NrLm5vdyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1YmNsYXNzIGlzIGludGVudGlvbmFsbHkgdGhpbiBmb3IgZXhwbGljaXQgYXJncy5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBEYXRlIGNvbnN0cnVjdG9yIG92ZXJsb2FkcyBhcmUgaW50ZW50aW9uYWxseSBkeW5hbWljLlxuICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBlbnN1cmVzIGlkZW50aXR5IGNoZWNrcyB1c2luZyB0aGUgY29uc3RydWN0b3IgcHJvcCBzdGlsbCB3b3Jrc1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGhhdmUgbm8gb3RoZXIgZnVuY3Rpb25hbCBlZmZlY3RcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBOYXRpdmVEYXRlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlIGluc3RhbmNlb2YgTmF0aXZlRGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIENsb2NrRGF0ZS5pc0Zha2UgPSB0cnVlO1xuXG4gICAgICAgIGlmIChOYXRpdmVEYXRlLm5vdykge1xuICAgICAgICAgICAgQ2xvY2tEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2xvY2tEYXRlLmNsb2NrLm5vdztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBOYXRpdmVEYXRlV2l0aFRvU291cmNlID1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7dHlwZW9mIERhdGUgJiB7IHRvU291cmNlPzogKCkgPT4gc3RyaW5nIH19ICovIChcbiAgICAgICAgICAgICAgICBOYXRpdmVEYXRlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmIChOYXRpdmVEYXRlV2l0aFRvU291cmNlLnRvU291cmNlKSB7XG4gICAgICAgICAgICBDbG9ja0RhdGUudG9Tb3VyY2UgPSBmdW5jdGlvbiB0b1NvdXJjZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZVdpdGhUb1NvdXJjZS50b1NvdXJjZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIENsb2NrRGF0ZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGVXaXRoVG9Tb3VyY2UudG9TdHJpbmcoKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBub2luc3BlY3Rpb24gVW5uZWNlc3NhcnlMb2NhbFZhcmlhYmxlSlNcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbm9ybWFsIENsYXNzIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBgbmV3YCwgYnV0IERhdGUgY2FuLCBzbyB3ZSBuZWVkXG4gICAgICAgICAqIHRvIHdyYXAgaXQgaW4gYSBQcm94eSBpbiBvcmRlciB0byBlbnN1cmUgdGhpcyBmdW5jdGlvbmFsaXR5IG9mIERhdGUgaXMga2VwdCBpbnRhY3RcbiAgICAgICAgICogQHR5cGUge3R5cGVvZiBDbG9ja0RhdGV9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBDbG9ja0RhdGVQcm94eSA9IG5ldyBQcm94eShDbG9ja0RhdGUsIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIFtbQ2FsbF1dIGludm9jYXRpb25zIChpLmUuIG5vdCB1c2luZyBgbmV3YClcbiAgICAgICAgICAgIGFwcGx5KCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBEYXRlIGNvbnN0cnVjdG9yIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCByZWYgRWNtYS0yNjIgRWRpdGlvbiA1LjEsIHNlY3Rpb24gMTUuOS4yLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVtYWlucyBzbyBpbiB0aGUgMTB0aCBlZGl0aW9uIG9mIDIwMTkgYXMgd2VsbC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENsb2NrRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBIFByb3h5IHNob3VsZCBvbmx5IGNhcHR1cmUgYG5ld2AgY2FsbHMgd2l0aCB0aGUgYGNvbnN0cnVjdGAgaGFuZGxlci4gVGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcG9zc2libGUsIHNvIGNoZWNrIHRoZSBsb2dpYy5cIixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoQ2xvY2tEYXRlLmNsb2NrLm5vdykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBEYXRlICYgeyBjbG9jazogQ2xvY2sgfX0gKi8gKFxuICAgICAgICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoQ2xvY2tEYXRlUHJveHkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWlycm9yIEludGwgYnkgZGVmYXVsdCBvbiBvdXIgZmFrZSBpbXBsZW1lbnRhdGlvblxuICAgICAqXG4gICAgICogTW9zdCBvZiB0aGUgcHJvcGVydGllcyBhcmUgdGhlIG9yaWdpbmFsIG5hdGl2ZSBvbmVzLFxuICAgICAqIGJ1dCB3ZSBuZWVkIHRvIHRha2UgY29udHJvbCBvZiB0aG9zZSB0aGF0IGhhdmUgYVxuICAgICAqIGRlcGVuZGVuY3kgb24gdGhlIGN1cnJlbnQgY2xvY2suXG4gICAgICogQHBhcmFtIHtDbG9ja30gY2xvY2tcbiAgICAgKiBAcmV0dXJucyB7SW50bFdpdGhDbG9ja30gdGhlIHBhcnRseSBmYWtlIEludGwgaW1wbGVtZW50YXRpb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnRsKGNsb2NrKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7SW50bFdpdGhDbG9ja30gKi9cbiAgICAgICAgY29uc3QgSW50bFdpdGhDbG9jayA9IHsgY2xvY2s6IGNsb2NrIH07XG4gICAgICAgIC8qXG4gICAgICAgICAqIEFsbCBwcm9wZXJ0aWVzIG9mIEludGwgYXJlIG5vbi1lbnVtZXJhYmxlLCBzbyB3ZSBuZWVkXG4gICAgICAgICAqIHRvIGRvIGEgYml0IG9mIHdvcmsgdG8gZ2V0IHRoZW0gb3V0LlxuICAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlSW50bCkuZm9yRWFjaChcbiAgICAgICAgICAgIChwcm9wZXJ0eSkgPT4gKEludGxXaXRoQ2xvY2tbcHJvcGVydHldID0gTmF0aXZlSW50bFtwcm9wZXJ0eV0pLFxuICAgICAgICApO1xuXG4gICAgICAgIEludGxXaXRoQ2xvY2suRGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgcmVhbEZvcm1hdHRlciA9IG5ldyBOYXRpdmVJbnRsLkRhdGVUaW1lRm9ybWF0KC4uLmFyZ3MpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0ge307XG5cbiAgICAgICAgICAgIFtcImZvcm1hdFJhbmdlXCIsIFwiZm9ybWF0UmFuZ2VUb1BhcnRzXCIsIFwicmVzb2x2ZWRPcHRpb25zXCJdLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJbbWV0aG9kXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsRm9ybWF0dGVyW21ldGhvZF0uYmluZChyZWFsRm9ybWF0dGVyKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgW1wiZm9ybWF0XCIsIFwiZm9ybWF0VG9QYXJ0c1wiXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXJbbWV0aG9kXSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRm9ybWF0dGVyW21ldGhvZF0oXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlIHx8IEludGxXaXRoQ2xvY2suY2xvY2subm93LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlcjtcbiAgICAgICAgfTtcblxuICAgICAgICBJbnRsV2l0aENsb2NrLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXG4gICAgICAgICAgICBOYXRpdmVJbnRsLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZSxcbiAgICAgICAgKTtcblxuICAgICAgICBJbnRsV2l0aENsb2NrLkRhdGVUaW1lRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZiA9XG4gICAgICAgICAgICBOYXRpdmVJbnRsLkRhdGVUaW1lRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZjtcblxuICAgICAgICByZXR1cm4gSW50bFdpdGhDbG9jaztcbiAgICB9XG5cbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgZnVuY3Rpb24gY3JlYXRlVGVtcG9yYWwoY2xvY2ssIGdldE5hbm9zKSB7XG4gICAgICAgIGNvbnN0IGZha2VOb3cgPSB7XG4gICAgICAgICAgICBpbnN0YW50KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYXRpdmVUZW1wb3JhbC5JbnN0YW50LmZyb21FcG9jaE5hbm9zZWNvbmRzKFxuICAgICAgICAgICAgICAgICAgICBCaWdJbnQoY2xvY2subm93KSAqIDFfMDAwXzAwMG4gKyBCaWdJbnQoZ2V0TmFub3MoKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lWm9uZUlkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYXRpdmVUZW1wb3JhbC5Ob3cudGltZVpvbmVJZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHpvbmVkRGF0ZVRpbWVJU08odGltZVpvbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eiA9IHRpbWVab25lID8/IE5hdGl2ZVRlbXBvcmFsLk5vdy50aW1lWm9uZUlkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZha2VOb3cuaW5zdGFudCgpLnRvWm9uZWREYXRlVGltZUlTTyh0eik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGxhaW5EYXRlVGltZUlTTyh0aW1lWm9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWtlTm93LnpvbmVkRGF0ZVRpbWVJU08odGltZVpvbmUpLnRvUGxhaW5EYXRlVGltZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBsYWluRGF0ZUlTTyh0aW1lWm9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWtlTm93LnpvbmVkRGF0ZVRpbWVJU08odGltZVpvbmUpLnRvUGxhaW5EYXRlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGxhaW5UaW1lSVNPKHRpbWVab25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZha2VOb3cuem9uZWREYXRlVGltZUlTTyh0aW1lWm9uZSkudG9QbGFpblRpbWUoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgVGVtcG9yYWxXaXRoQ2xvY2sgPSBPYmplY3QuY3JlYXRlKFxuICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKE5hdGl2ZVRlbXBvcmFsKSxcbiAgICAgICAgKTtcbiAgICAgICAgW1xuICAgICAgICAgICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlVGVtcG9yYWwpLFxuICAgICAgICAgICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhOYXRpdmVUZW1wb3JhbCksXG4gICAgICAgIF0uZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgIFRlbXBvcmFsV2l0aENsb2NrLFxuICAgICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOYXRpdmVUZW1wb3JhbCwgcHJvcCksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gVGVtcG9yYWwuTm93IGlzIHdyaXRhYmxlOmZhbHNlIGluIHRoZSBzcGVjIHNvIHdlIG11c3QgdXNlIGRlZmluZVByb3BlcnR5XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZW1wb3JhbFdpdGhDbG9jaywgXCJOb3dcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGZha2VOb3csXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gVGVtcG9yYWxXaXRoQ2xvY2s7XG4gICAgfVxuXG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGZ1bmN0aW9uIGVucXVldWVKb2IoY2xvY2ssIGpvYikge1xuICAgICAgICAvLyBlbnF1ZXVlcyBhIG1pY3JvdGljay1kZWZlcnJlZCB0YXNrIC0gZWNtYTI2Mi8jc2VjLWVucXVldWVqb2JcbiAgICAgICAgaWYgKCFjbG9jay5qb2JzKSB7XG4gICAgICAgICAgICBjbG9jay5qb2JzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgY2xvY2suam9icy5wdXNoKGpvYik7XG4gICAgfVxuXG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGZ1bmN0aW9uIHJ1bkpvYnMoY2xvY2spIHtcbiAgICAgICAgLy8gcnVucyBhbGwgbWljcm90aWNrLWRlZmVycmVkIHRhc2tzIC0gZWNtYTI2Mi8jc2VjLXJ1bmpvYnNcbiAgICAgICAgaWYgKCFjbG9jay5qb2JzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2FzTmVhckxpbWl0ID0gY2xvY2suaXNOZWFySW5maW5pdGVMaW1pdDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG9jay5qb2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBqb2IgPSBjbG9jay5qb2JzW2ldO1xuICAgICAgICAgICAgam9iLmZ1bmMuYXBwbHkobnVsbCwgam9iLmFyZ3MpO1xuXG4gICAgICAgICAgICBjaGVja0lzTmVhckluZmluaXRlTGltaXQoY2xvY2ssIGkpO1xuICAgICAgICAgICAgaWYgKGNsb2NrLmxvb3BMaW1pdCAmJiBpID4gY2xvY2subG9vcExpbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZ2V0SW5maW5pdGVMb29wRXJyb3IoY2xvY2ssIGpvYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXNOZWFyTGltaXQpIHtcbiAgICAgICAgICAgIHJlc2V0SXNOZWFySW5maW5pdGVMaW1pdChjbG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvY2suam9icyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgY29tcGFjdCBcInNvb25lc3QgdGltZXIgZmlyc3RcIiBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBUaGluayBvZiB0aGlzIGFzIGEgd2FpdGluZyByb29tIGZvciBzY2hlZHVsZWQgY2FsbGJhY2tzIHdoZXJlIHRoZSBuZXh0XG4gICAgICogY2FsbGJhY2sgdG8gcnVuIGlzIGFsd2F5cyBrZXB0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gVGhlIGludGVybmFsXG4gICAgICogYXJyYXkgaXMgYXJyYW5nZWQgc28gd2UgY2FuIGZpbmQsIGFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciB0aW1lcnNcbiAgICAgKiBlZmZpY2llbnRseSB3aXRob3V0IHNvcnRpbmcgdGhlIHdob2xlIGxpc3QgZXZlcnkgdGltZSBzb21ldGhpbmcgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIFRoZSBpbXBvcnRhbnQgaWRlYSBpcyBub3QgdGhlIGRhdGEgc3RydWN0dXJlIG5hbWUsIGJ1dCB0aGUgYmVoYXZpb3I6XG4gICAgICogdGhlIHRpbWVyIHRoYXQgc2hvdWxkIHJ1biBuZXh0IHN0YXlzIG5lYXIgdGhlIGZyb250LCBhbmQgd2hlbiBvbmUgdGltZXJcbiAgICAgKiBtb3ZlcywgdGhlIHJlc3QgYXJlIHNoaWZ0ZWQganVzdCBlbm91Z2ggdG8ga2VlcCB0aGF0IHByb21pc2UgdHJ1ZS5cbiAgICAgKi9cbiAgICBjbGFzcyBUaW1lckhlYXAge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRoaXMudGltZXJzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9vayBhdCB0aGUgbmV4dCB0aW1lciB3aXRob3V0IHJlbW92aW5nIGl0LlxuICAgICAgICAgKiBUaGlzIGlzIHRoZSB0aW1lciB0aGUgY2xvY2sgd291bGQgcnVuIGZpcnN0IGlmIHRpbWUgYWR2YW5jZWQgbm93LlxuICAgICAgICAgKiBAcmV0dXJucyB7VGltZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBwZWVrKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZXJzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIHRpbWVyIHRvIHRoZSB3YWl0aW5nIHJvb20sIHRoZW4gbW92ZSBpdCB1cHdhcmQgdW50aWwgaXQgaXMgaW5cbiAgICAgICAgICogdGhlIHJpZ2h0IHBsYWNlIHJlbGF0aXZlIHRvIHRoZSB0aW1lcnMgaXQgc2hvdWxkIHJ1biBiZWZvcmUgYW5kIGFmdGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RpbWVyfSB0aW1lclxuICAgICAgICAgKi9cbiAgICAgICAgcHVzaCh0aW1lcikge1xuICAgICAgICAgICAgdGhpcy50aW1lcnMucHVzaCh0aW1lcik7XG4gICAgICAgICAgICB0aGlzLmJ1YmJsZVVwKHRoaXMudGltZXJzLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBuZXh0IHRpbWVyIHRvIHJ1bi5cbiAgICAgICAgICpcbiAgICAgICAgICogV2UgcHVsbCB0aGUgZnJvbnQgdGltZXIgb3V0LCBtb3ZlIHRoZSBsYXN0IHRpbWVyIGludG8gdGhlIGVtcHR5IHNwb3QsXG4gICAgICAgICAqIGFuZCB0aGVuIHNoaWZ0IHRoYXQgcmVwbGFjZW1lbnQgZG93biB1bnRpbCB0aGUgb3JkZXJpbmcgaXMgY29ycmVjdFxuICAgICAgICAgKiBhZ2Fpbi4gVGhhdCBhdm9pZHMgcmVidWlsZGluZyB0aGUgd2hvbGUgbGlzdCBmcm9tIHNjcmF0Y2guXG4gICAgICAgICAqIEByZXR1cm5zIHtUaW1lcnx1bmRlZmluZWR9XG4gICAgICAgICAqL1xuICAgICAgICBwb3AoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy50aW1lcnNbMF07XG4gICAgICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy50aW1lcnMucG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJzWzBdID0gbGFzdDtcbiAgICAgICAgICAgICAgICBsYXN0LmhlYXBJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5idWJibGVEb3duKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGZpcnN0LmhlYXBJbmRleDtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmUgYSBzcGVjaWZpYyB0aW1lciBmcm9tIHRoZSB3YWl0aW5nIHJvb20uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBoZWFwIHN0b3JlcyB0aW1lcnMgaW4gYSBzaGFwZSB0aGF0IGxldHMgdXMganVtcCBkaXJlY3RseSB0byB0aGVcbiAgICAgICAgICogdGltZXIncyBjdXJyZW50IHBvc2l0aW9uLCByZXBsYWNlIGl0IHdpdGggdGhlIGxhc3QgdGltZXIsIGFuZCB0aGVuXG4gICAgICAgICAqIG1vdmUgdGhhdCByZXBsYWNlbWVudCB1cCBvciBkb3duIHVudGlsIHRoZSBvcmRlcmluZyBpcyBjb3JyZWN0IGFnYWluLlxuICAgICAgICAgKiBAcGFyYW0ge1RpbWVyfSB0aW1lclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHJlbW92ZSh0aW1lcikge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aW1lci5oZWFwSW5kZXg7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCB0aGlzLnRpbWVyc1tpbmRleF0gIT09IHRpbWVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMudGltZXJzLnBvcCgpO1xuICAgICAgICAgICAgaWYgKHRpbWVyICE9PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcnNbaW5kZXhdID0gbGFzdDtcbiAgICAgICAgICAgICAgICBsYXN0LmhlYXBJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVGltZXJzKGxhc3QsIHRpbWVyKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWJibGVVcChpbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWJibGVEb3duKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGltZXIuaGVhcEluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTW92ZSBhIHRpbWVyIHRvd2FyZCB0aGUgZnJvbnQgdW50aWwgaXQgaXMgbm8gbG9uZ2VyIFwiZWFybGllclwiIHRoYW5cbiAgICAgICAgICogdGhlIHRpbWVyIGFib3ZlIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBDb25jZXB0dWFsbHksIHRoaXMgaXMgd2hhdCBoYXBwZW5zIHdoZW4gc29tZXRoaW5nIG5ld2x5IHNjaGVkdWxlZFxuICAgICAgICAgKiB0dXJucyBvdXQgdG8gYmVsb25nIGFoZWFkIG9mIGl0cyBwYXJlbnQgaW4gdGhlIHdhaXRpbmcgcm9vbS4gV2Uga2VlcFxuICAgICAgICAgKiBzd2FwcGluZyBpdCB1cHdhcmQgdW50aWwgaXQgaXMgbm8gbG9uZ2VyIG91dCBvZiBwbGFjZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBidWJibGVVcChpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnRpbWVyc1tpbmRleF07XG4gICAgICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gTWF0aC5mbG9vcigoY3VycmVudEluZGV4IC0gMSkgLyAyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnRpbWVyc1twYXJlbnRJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUaW1lcnModGltZXIsIHBhcmVudCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJzW2N1cnJlbnRJbmRleF0gPSBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5oZWFwSW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHBhcmVudEluZGV4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGltZXJzW2N1cnJlbnRJbmRleF0gPSB0aW1lcjtcbiAgICAgICAgICAgIHRpbWVyLmhlYXBJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNb3ZlIGEgdGltZXIgYXdheSBmcm9tIHRoZSBmcm9udCB1bnRpbCB0aGUgdGltZXIgYmVsb3cgaXQgaXMgbm9cbiAgICAgICAgICogbG9uZ2VyIHN1cHBvc2VkIHRvIHJ1biBhZnRlciBpdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgYGJ1YmJsZVVwYDogd2hlbiBhIHRpbWVyIGF0IHRoZSBmcm9udCBpc1xuICAgICAgICAgKiByZW1vdmVkIG9yIG1vdmVkLCB0aGUgcmVwbGFjZW1lbnQgbWF5IGJlIHRvbyBmYXIgYWhlYWQsIHNvIHdlXG4gICAgICAgICAqIHJlcGVhdGVkbHkgc3dhcCBpdCBkb3dud2FyZCB3aXRoIHRoZSBiZXN0IGNoaWxkIHVudGlsIHRoZSB3YWl0aW5nXG4gICAgICAgICAqIHJvb20gaXMgb3JkZXJlZCBhZ2Fpbi5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBidWJibGVEb3duKGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMudGltZXJzW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBjdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGhhbGZMZW5ndGggPSBNYXRoLmZsb29yKHRoaXMudGltZXJzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IGhhbGZMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0SW5kZXggPSBjdXJyZW50SW5kZXggKiAyICsgMTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBsZXQgYmVzdENoaWxkSW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICAgICAgICAgICAgbGV0IGJlc3RDaGlsZCA9IHRoaXMudGltZXJzW2xlZnRJbmRleF07XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SW5kZXggPCB0aGlzLnRpbWVycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyZVRpbWVycyh0aGlzLnRpbWVyc1tyaWdodEluZGV4XSwgYmVzdENoaWxkKSA8IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdENoaWxkSW5kZXggPSByaWdodEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBiZXN0Q2hpbGQgPSB0aGlzLnRpbWVyc1tyaWdodEluZGV4XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVRpbWVycyhiZXN0Q2hpbGQsIHRpbWVyKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcnNbY3VycmVudEluZGV4XSA9IGJlc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYmVzdENoaWxkLmhlYXBJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gYmVzdENoaWxkSW5kZXg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50aW1lcnNbY3VycmVudEluZGV4XSA9IHRpbWVyO1xuICAgICAgICAgICAgdGltZXIuaGVhcEluZGV4ID0gY3VycmVudEluZGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlIHRpbWVyIHN0b3JhZ2UgYW5kIGhlYXAgc3RheSBpbiBzeW5jIGV2ZW4gaWYgYSBjbGVhciBwYXRoIHRvdWNoZXNcbiAgICAgKiB0aW1lciBzdGF0ZSBiZWZvcmUgYW55dGhpbmcgaGFzIGJlZW4gc2NoZWR1bGVkLlxuICAgICAqXG4gICAgICogV2h5IGRvIHdlIG5lZWQgdHdvIGRhdGEgc3RydWN0dXJlcyB0byBrZWVwIHRhYnMgb24gdGltZXJzP1xuICAgICAqIDEuIEZhc3QgSUQgTG9va3VwIChjbG9jay50aW1lcnMpOiBUaGlzIGlzIGEgTWFwIGZyb20gdGltZXIgSURzIHRvIHRoZWlyIHJlc3BlY3RpdmUgdGltZXIgb2JqZWN0cy4gSXQgYWxsb3dzIGNsZWFyVGltZW91dChpZCkgYW5kXG4gICAgICogY2xlYXJJbnRlcnZhbChpZCkgdG8gYmUgJE8oMSkkIG9wZXJhdGlvbnMuIFdpdGhvdXQgdGhpcyBtYXAsIGZpbmRpbmcgYSBzcGVjaWZpYyB0aW1lciBpbiB0aGUgaGVhcCB0byByZW1vdmUgaXQgd291bGQgcmVxdWlyZSBhIGxpbmVhclxuICAgICAqICRPKG4pJCBzZWFyY2gsIHdoaWNoIHdvdWxkIHNpZ25pZmljYW50bHkgZGVncmFkZSBwZXJmb3JtYW5jZSBhcyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0aW1lcnMgZ3Jvd3MuXG4gICAgICogMi4gRWZmaWNpZW50IFNjaGVkdWxpbmcgKGNsb2NrLnRpbWVySGVhcCk6IFRoaXMgaXMgYSBwcmlvcml0eSBxdWV1ZSAobWluLWhlYXApIHRoYXQga2VlcHMgdGltZXJzIG9yZGVyZWQgYnkgdGhlaXIgZXhlY3V0aW9uIHRpbWUgKGNhbGxBdCkuIEl0XG4gICAgICogYWxsb3dzIHRoZSBsaWJyYXJ5IHRvIGluc3RhbnRseSBmaW5kIHRoZSBuZXh0IHRpbWVyIHRvIHJ1biAocGVlaygpIGluICRPKDEpJCkgYW5kIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgc2NoZWR1bGUgd2hlbiB0aW1lcnMgYXJlIGFkZGVkIG9yXG4gICAgICogcmVtb3ZlZCAoJE8oXFxsb2cgbikkKS5cbiAgICAgKlxuICAgICAqIEluIHNob3J0OiBjbG9jay50aW1lcnMgcHJvdmlkZXMgZmFzdCBhY2Nlc3MgYnkgSUQsIHdoaWxlIGNsb2NrLnRpbWVySGVhcCBwcm92aWRlcyBmYXN0IGFjY2VzcyBieSBUaW1lLiBSZW1vdmluZyBlaXRoZXIgb25lIHdvdWxkIG1ha2UgY29tbW9uXG4gICAgICogb3BlcmF0aW9ucyAobGlrZSBjbGVhcmluZyBvciBmaW5kaW5nIHRoZSBuZXh0IHRpbWVyKSBtdWNoIHNsb3dlci5cbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuc3VyZVRpbWVyU3RhdGUoY2xvY2spIHtcbiAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgIGNsb2NrLnRpbWVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNsb2NrLnRpbWVySGVhcCA9IG5ldyBUaW1lckhlYXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzVGltZXIoY2xvY2ssIGlkKSB7XG4gICAgICAgIHJldHVybiBjbG9jay50aW1lcnMgPyBjbG9jay50aW1lcnMuaGFzKGlkKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAgICogQHJldHVybnMge1RpbWVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFRpbWVyKGNsb2NrLCBpZCkge1xuICAgICAgICByZXR1cm4gY2xvY2sudGltZXJzID8gY2xvY2sudGltZXJzLmdldChpZCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDbG9ja30gY2xvY2tcbiAgICAgKiBAcGFyYW0ge1RpbWVyfSB0aW1lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFRpbWVyKGNsb2NrLCB0aW1lcikge1xuICAgICAgICBlbnN1cmVUaW1lclN0YXRlKGNsb2NrKTtcbiAgICAgICAgY2xvY2sudGltZXJzLnNldCh0aW1lci5pZCwgdGltZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsZXRlVGltZXIoY2xvY2ssIGlkKSB7XG4gICAgICAgIHJldHVybiBjbG9jay50aW1lcnMgPyBjbG9jay50aW1lcnMuZGVsZXRlKGlkKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHsodGltZXI6IFRpbWVyKSA9PiB2b2lkfSBjYWxsYmFja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2hBY3RpdmVUaW1lcihjbG9jaywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdGltZXIgb2YgY2xvY2sudGltZXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aW1lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlYnVpbGRUaW1lckhlYXAoY2xvY2spIHtcbiAgICAgICAgY2xvY2sudGltZXJIZWFwID0gbmV3IFRpbWVySGVhcCgpO1xuICAgICAgICBmb3JFYWNoQWN0aXZlVGltZXIoY2xvY2ssICh0aW1lcikgPT4ge1xuICAgICAgICAgICAgY2xvY2sudGltZXJIZWFwLnB1c2godGltZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqIEBwYXJhbSB7VGltZXJJbml0aWFsUHJvcHN9IHRpbWVyXG4gICAgICogQHJldHVybnMge1RpbWVySWR9IGlkIG9mIHRoZSBjcmVhdGVkIHRpbWVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkVGltZXIoY2xvY2ssIHRpbWVyKSB7XG4gICAgICAgIGlmICh0aW1lci5mdW5jID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQgdG8gdGltZXIgY2FsbHNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRpbWVyLmZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgW0VSUl9JTlZBTElEX0NBTExCQUNLXTogQ2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLiBSZWNlaXZlZCAke1xuICAgICAgICAgICAgICAgICAgICB0aW1lci5mdW5jXG4gICAgICAgICAgICAgICAgfSBvZiB0eXBlICR7dHlwZW9mIHRpbWVyLmZ1bmN9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xvY2suaXNOZWFySW5maW5pdGVMaW1pdCkge1xuICAgICAgICAgICAgdGltZXIuZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWVyLnR5cGUgPSB0aW1lci5pbW1lZGlhdGUgPyBcIkltbWVkaWF0ZVwiIDogXCJUaW1lb3V0XCI7XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aW1lciwgXCJkZWxheVwiKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aW1lci5kZWxheSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHRpbWVyLmRlbGF5ID0gcGFyc2VJbnQodGltZXIuZGVsYXksIDEwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc051bWJlckZpbml0ZSh0aW1lci5kZWxheSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lci5kZWxheSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lci5kZWxheSA9IHRpbWVyLmRlbGF5ID4gbWF4VGltZW91dCA/IDEgOiB0aW1lci5kZWxheTtcbiAgICAgICAgICAgIHRpbWVyLmRlbGF5ID0gTWF0aC5tYXgoMCwgdGltZXIuZGVsYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aW1lciwgXCJpbnRlcnZhbFwiKSkge1xuICAgICAgICAgICAgdGltZXIudHlwZSA9IFwiSW50ZXJ2YWxcIjtcbiAgICAgICAgICAgIHRpbWVyLmludGVydmFsID0gdGltZXIuaW50ZXJ2YWwgPiBtYXhUaW1lb3V0ID8gMSA6IHRpbWVyLmludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aW1lciwgXCJhbmltYXRpb25cIikpIHtcbiAgICAgICAgICAgIHRpbWVyLnR5cGUgPSBcIkFuaW1hdGlvbkZyYW1lXCI7XG4gICAgICAgICAgICB0aW1lci5hbmltYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRpbWVyLCBcInJlcXVlc3RJZGxlQ2FsbGJhY2tcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBtYXJrIHRpbWVyIGFzIElkbGVDYWxsYmFjayB0eXBlIGlmIGl0IGhhcyBubyBkZWxheSwgb3RoZXJ3aXNlIGl0J2QgYmUgb2YgdHlwZSB0aW1lb3V0XG4gICAgICAgICAgICAvLyB0aGlzIHdheSB3ZSBhcmUgYWJsZSB0byBzb3J0IHN1Y2ggdGhhdCB0aGUgdGltZXIgb25seSBnZXRzIGNhbGxlZCB3aGVuIHRoZXJlJ3MgdHJ1bHkgbm8gcGVuZGluZyB0YXNrIHRvIHJ1blxuICAgICAgICAgICAgaWYgKCF0aW1lci5kZWxheSkge1xuICAgICAgICAgICAgICAgIHRpbWVyLnR5cGUgPSBcIklkbGVDYWxsYmFja1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXIucmVxdWVzdElkbGVDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBlbnN1cmVUaW1lclN0YXRlKGNsb2NrKTtcblxuICAgICAgICB3aGlsZSAoaGFzVGltZXIoY2xvY2ssIHVuaXF1ZVRpbWVySWQpKSB7XG4gICAgICAgICAgICB1bmlxdWVUaW1lcklkKys7XG4gICAgICAgICAgICBpZiAodW5pcXVlVGltZXJJZCA+PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgICAgIHVuaXF1ZVRpbWVySWQgPSBpZENvdW50ZXJTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWVyLmlkID0gdW5pcXVlVGltZXJJZCsrO1xuICAgICAgICBpZiAodW5pcXVlVGltZXJJZCA+PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgdW5pcXVlVGltZXJJZCA9IGlkQ291bnRlclN0YXJ0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZXIub3JkZXIgPSB1bmlxdWVUaW1lck9yZGVyKys7XG4gICAgICAgIHRpbWVyLmNyZWF0ZWRBdCA9IGNsb2NrLm5vdztcbiAgICAgICAgdGltZXIuY2FsbEF0ID1cbiAgICAgICAgICAgIGNsb2NrLm5vdyArXG4gICAgICAgICAgICAocGFyc2VJbnQoU3RyaW5nKHRpbWVyLmRlbGF5KSkgfHwgKGNsb2NrLmR1cmluZ1RpY2sgPyAxIDogMCkpO1xuXG4gICAgICAgIHNldFRpbWVyKGNsb2NrLCB0aW1lcik7XG4gICAgICAgIGNsb2NrLnRpbWVySGVhcC5wdXNoKHRpbWVyKTtcblxuICAgICAgICBpZiAoYWRkVGltZXJSZXR1cm5zT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICAgICAgcmVmZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVmOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVucmVmOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYXNSZWY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyLmNhbGxBdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5ub3cgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnNlSW50KFN0cmluZyh0aW1lci5kZWxheSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsb2NrLmR1cmluZ1RpY2sgPyAxIDogMCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnRpbWVySGVhcC5yZW1vdmUodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aW1lci5vcmRlciA9IHVuaXF1ZVRpbWVyT3JkZXIrKztcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZXIoY2xvY2ssIHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvY2sudGltZXJIZWFwLnB1c2godGltZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1N5bWJvbC50b1ByaW1pdGl2ZV06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVyLmlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lci5pZDtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQgY29uc2lzdGVudC1yZXR1cm46IFwib2ZmXCIgKi9cbiAgICAvKipcbiAgICAgKiBUaW1lciBjb21wYXJhdG9yXG4gICAgICogQHBhcmFtIHtUaW1lcn0gYVxuICAgICAqIEBwYXJhbSB7VGltZXJ9IGJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVUaW1lcnMoYSwgYikge1xuICAgICAgICAvLyBTb3J0IElkbGVDYWxsYmFjayB0aW1lcnMgdG8gdGhlIGJvdHRvbSB3aGVuIHNjaGVkdWxlZCBmb3IgdGhlIHNhbWUgdGltZVxuICAgICAgICBpZiAoYS50eXBlID09PSBcIklkbGVDYWxsYmFja1wiICYmIGIudHlwZSAhPT0gXCJJZGxlQ2FsbGJhY2tcIikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEudHlwZSAhPT0gXCJJZGxlQ2FsbGJhY2tcIiAmJiBiLnR5cGUgPT09IFwiSWRsZUNhbGxiYWNrXCIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgZmlyc3QgYnkgYWJzb2x1dGUgdGltaW5nXG4gICAgICAgIGlmIChhLmNhbGxBdCA8IGIuY2FsbEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY2FsbEF0ID4gYi5jYWxsQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGltbWVkaWF0ZSwgaW1tZWRpYXRlIHRpbWVycyB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKGEuaW1tZWRpYXRlICYmICFiLmltbWVkaWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYS5pbW1lZGlhdGUgJiYgYi5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEub3JkZXIgPCBiLm9yZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEub3JkZXIgPiBiLm9yZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgbmV4dCBieSBjcmVhdGlvbiB0aW1lLCBlYXJsaWVyLWNyZWF0ZWQgdGltZXJzIHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBpZiAoYS5jcmVhdGVkQXQgPCBiLmNyZWF0ZWRBdCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmNyZWF0ZWRBdCA+IGIuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgbmV4dCBieSBpZCwgbG93ZXItaWQgdGltZXJzIHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBpZiAoYS5pZCA8IGIuaWQpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5pZCA+IGIuaWQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXMgdGltZXIgaWRzIGFyZSB1bmlxdWUsIG5vIGZhbGxiYWNrIGAwYCBpcyBuZWNlc3NhcnlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDbG9ja30gY2xvY2tcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b1xuICAgICAqIEByZXR1cm5zIHtUaW1lcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaXJzdFRpbWVySW5SYW5nZShjbG9jaywgZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKCFjbG9jay50aW1lckhlYXApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZXJzID0gY2xvY2sudGltZXJIZWFwLnRpbWVycztcbiAgICAgICAgaWYgKHRpbWVycy5sZW5ndGggPT09IDEgJiYgdGltZXJzWzBdLnJlcXVlc3RJZGxlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aW1lcnNbMF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdCA9IGNsb2NrLnRpbWVySGVhcC5wZWVrKCk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBpblJhbmdlKGZyb20sIHRvLCBmaXJzdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7P1RpbWVyfVxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHRpbWVyID0gbnVsbDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGluUmFuZ2UoZnJvbSwgdG8sIHRpbWVyc1tpXSkgJiZcbiAgICAgICAgICAgICAgICAoIXRpbWVyIHx8IGNvbXBhcmVUaW1lcnModGltZXIsIHRpbWVyc1tpXSkgPT09IDEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqIEByZXR1cm5zIHtUaW1lcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaXJzdFRpbWVyKGNsb2NrKSB7XG4gICAgICAgIGlmICghY2xvY2sudGltZXJIZWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvY2sudGltZXJIZWFwLnBlZWsoKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHJldHVybnMge1RpbWVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RUaW1lcihjbG9jaykge1xuICAgICAgICBpZiAoIWNsb2NrLnRpbWVySGVhcCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZXJzID0gY2xvY2sudGltZXJIZWFwLnRpbWVycztcbiAgICAgICAgbGV0IHRpbWVyID0gbnVsbDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaV0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gdGltZXJzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHtUaW1lcn0gdGltZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZXIuaW50ZXJ2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNsb2NrLnRpbWVySGVhcC5yZW1vdmUodGltZXIpO1xuICAgICAgICAgICAgdGltZXIuY2FsbEF0ICs9IHRpbWVyLmludGVydmFsO1xuICAgICAgICAgICAgdGltZXIub3JkZXIgPSB1bmlxdWVUaW1lck9yZGVyKys7XG4gICAgICAgICAgICBpZiAoY2xvY2suaXNOZWFySW5maW5pdGVMaW1pdCkge1xuICAgICAgICAgICAgICAgIHRpbWVyLmVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbG9jay50aW1lckhlYXAucHVzaCh0aW1lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGVUaW1lcihjbG9jaywgdGltZXIuaWQpO1xuICAgICAgICAgICAgY2xvY2sudGltZXJIZWFwLnJlbW92ZSh0aW1lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRpbWVyLmZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGltZXIuZnVuYy5hcHBseShudWxsLCB0aW1lci5hcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY2xlYXIgaGFuZGxlciBuYW1lIGZvciBhIGdpdmVuIHRpbWVyIHR5cGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHR5cGVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldENsZWFySGFuZGxlcih0dHlwZSkge1xuICAgICAgICBpZiAodHR5cGUgPT09IFwiSWRsZUNhbGxiYWNrXCIgfHwgdHR5cGUgPT09IFwiQW5pbWF0aW9uRnJhbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBjYW5jZWwke3R0eXBlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBjbGVhciR7dHR5cGV9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHNjaGVkdWxlIGhhbmRsZXIgbmFtZSBmb3IgYSBnaXZlbiB0aW1lciB0eXBlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR0eXBlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRTY2hlZHVsZUhhbmRsZXIodHR5cGUpIHtcbiAgICAgICAgaWYgKHR0eXBlID09PSBcIklkbGVDYWxsYmFja1wiIHx8IHR0eXBlID09PSBcIkFuaW1hdGlvbkZyYW1lXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgcmVxdWVzdCR7dHR5cGV9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYHNldCR7dHR5cGV9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFub255bW91cyBmdW5jdGlvbiB0byB3YXJuIG9ubHkgb25jZVxuICAgICAqIEByZXR1cm5zIHsobXNnOiBzdHJpbmcpID0+IHZvaWR9XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV2Fybk9uY2UoKSB7XG4gICAgICAgIGxldCBjYWxscyA9IDA7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICFjYWxscysrICYmIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB3YXJuT25jZSA9IGNyZWF0ZVdhcm5PbmNlKCk7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb2NrfSBjbG9ja1xuICAgICAqIEBwYXJhbSB7VGltZXJJZH0gdGltZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0dHlwZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIHR0eXBlKSB7XG4gICAgICAgIGlmICghdGltZXJJZCkge1xuICAgICAgICAgICAgLy8gbnVsbCBhcHBlYXJzIHRvIGJlIGFsbG93ZWQgaW4gbW9zdCBicm93c2VycywgYW5kIGFwcGVhcnMgdG8gYmVcbiAgICAgICAgICAgIC8vIHJlbGllZCB1cG9uIGJ5IHNvbWUgbGlicmFyaWVzLCBsaWtlIEJvb3RzdHJhcCBjYXJvdXNlbFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW4gTm9kZSwgdGhlIElEIGlzIHN0b3JlZCBhcyB0aGUgcHJpbWl0aXZlIHZhbHVlIGZvciBgVGltZW91dGAgb2JqZWN0c1xuICAgICAgICAvLyBmb3IgYEltbWVkaWF0ZWAgb2JqZWN0cywgbm8gSUQgZXhpc3RzLCBzbyBpdCBnZXRzIGNvZXJjZWQgdG8gTmFOXG4gICAgICAgIGNvbnN0IGlkID0gTnVtYmVyKHRpbWVySWQpO1xuXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaWQpIHx8IGlkIDwgaWRDb3VudGVyU3RhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJOYW1lID0gZ2V0Q2xlYXJIYW5kbGVyKHR0eXBlKTtcblxuICAgICAgICAgICAgaWYgKGNsb2NrLnNob3VsZENsZWFyTmF0aXZlVGltZXJzID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlSGFuZGxlciA9IGNsb2NrW2BfJHtoYW5kbGVyTmFtZX1gXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIG5hdGl2ZUhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IG5hdGl2ZUhhbmRsZXIodGltZXJJZClcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgdGhlIHN0YWNrdHJhY2UsIGV4Y2x1ZGluZyB0aGUgJ2Vycm9yJyBsaW5lXG4gICAgICAgICAgICBjb25zdCBzdGFja1RyYWNlID0gbmV3IEVycm9yKCkuc3RhY2tcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAuam9pbihcIlxcblwiKTtcblxuICAgICAgICAgICAgd2Fybk9uY2UoXG4gICAgICAgICAgICAgICAgYEZha2VUaW1lcnM6ICR7aGFuZGxlck5hbWV9IHdhcyBpbnZva2VkIHRvIGNsZWFyIGEgbmF0aXZlIHRpbWVyIGluc3RlYWQgb2Ygb25lIGNyZWF0ZWQgYnkgdGhpcyBsaWJyYXJ5LmAgK1xuICAgICAgICAgICAgICAgICAgICBcIlxcblRvIGF1dG9tYXRpY2FsbHkgY2xlYW4tdXAgbmF0aXZlIHRpbWVycywgdXNlIGBzaG91bGRDbGVhck5hdGl2ZVRpbWVyc2AuXCIgK1xuICAgICAgICAgICAgICAgICAgICBgXFxuJHtzdGFja1RyYWNlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1RpbWVyKGNsb2NrLCBpZCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIElEIG1hdGNoZXMgYSB0aW1lciBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IGdldFRpbWVyKGNsb2NrLCBpZCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGltZXIudHlwZSA9PT0gdHR5cGUgfHxcbiAgICAgICAgICAgICAgICAodGltZXIudHlwZSA9PT0gXCJUaW1lb3V0XCIgJiYgdHR5cGUgPT09IFwiSW50ZXJ2YWxcIikgfHxcbiAgICAgICAgICAgICAgICAodGltZXIudHlwZSA9PT0gXCJJbnRlcnZhbFwiICYmIHR0eXBlID09PSBcIlRpbWVvdXRcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZVRpbWVyKGNsb2NrLCBpZCk7XG4gICAgICAgICAgICAgICAgY2xvY2sudGltZXJIZWFwLnJlbW92ZSh0aW1lcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFyID0gZ2V0Q2xlYXJIYW5kbGVyKHR0eXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlZHVsZSA9IGdldFNjaGVkdWxlSGFuZGxlcih0aW1lci50eXBlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgY2xlYXIgdGltZXI6IHRpbWVyIGNyZWF0ZWQgd2l0aCAke3NjaGVkdWxlfSgpIGJ1dCBjbGVhcmVkIHdpdGggJHtjbGVhcn0oKWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgdGhlIHRhcmdldCBjb250YWluaW5nIHRoZSBtZXRob2QgdG8gcmVwbGFjZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgdGhlIGtleW5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgdGFyZ2V0XG4gICAgICogQHBhcmFtIHtDbG9ja30gY2xvY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoaWphY2tNZXRob2QodGFyZ2V0LCBtZXRob2QsIGNsb2NrKSB7XG4gICAgICAgIGNsb2NrW21ldGhvZF0uaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgICAgIGNsb2NrW2BfJHttZXRob2R9YF0gPSB0YXJnZXRbbWV0aG9kXTtcblxuICAgICAgICBpZiAobWV0aG9kID09PSBcIkRhdGVcIikge1xuICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1ttZXRob2RdO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJJbnRsXCIpIHtcbiAgICAgICAgICAgIHRhcmdldFttZXRob2RdID0gY2xvY2tbbWV0aG9kXTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwiVGVtcG9yYWxcIikge1xuICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1ttZXRob2RdO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJwZXJmb3JtYW5jZVwiKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIEpTRE9NIGhhcyBhIHJlYWQgb25seSBwZXJmb3JtYW5jZSBmaWVsZCBzbyB3ZSBoYXZlIHRvIHNhdmUvY29weSBpdCBkaWZmZXJlbnRseVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUGVyZkRlc2NyaXB0b3IgJiZcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yLmdldCAmJlxuICAgICAgICAgICAgICAgICFvcmlnaW5hbFBlcmZEZXNjcmlwdG9yLnNldFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBjbG9jayxcbiAgICAgICAgICAgICAgICAgICAgYF8ke21ldGhvZH1gLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2QsIHBlcmZEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1ttZXRob2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrW21ldGhvZF0uYXBwbHkoY2xvY2ssIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSxcbiAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjbG9ja1ttZXRob2RdKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRbbWV0aG9kXS5jbG9jayA9IGNsb2NrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFkdmFuY2VUaW1lRGVsdGFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkb0ludGVydmFsVGljayhjbG9jaywgYWR2YW5jZVRpbWVEZWx0YSkge1xuICAgICAgICBjbG9jay50aWNrKGFkdmFuY2VUaW1lRGVsdGEpO1xuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7VGltZXJzfSAqL1xuICAgIGNvbnN0IHRpbWVycyA9IHtcbiAgICAgICAgc2V0VGltZW91dDogX2dsb2JhbC5zZXRUaW1lb3V0LFxuICAgICAgICBjbGVhclRpbWVvdXQ6IF9nbG9iYWwuY2xlYXJUaW1lb3V0LFxuICAgICAgICBzZXRJbnRlcnZhbDogX2dsb2JhbC5zZXRJbnRlcnZhbCxcbiAgICAgICAgY2xlYXJJbnRlcnZhbDogX2dsb2JhbC5jbGVhckludGVydmFsLFxuICAgICAgICBEYXRlOiBfZ2xvYmFsLkRhdGUsXG4gICAgfTtcblxuICAgIGlmIChpc1ByZXNlbnQuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHRpbWVycy5zZXRJbW1lZGlhdGUgPSBfZ2xvYmFsLnNldEltbWVkaWF0ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50LmNsZWFySW1tZWRpYXRlKSB7XG4gICAgICAgIHRpbWVycy5jbGVhckltbWVkaWF0ZSA9IF9nbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJlc2VudC5ocnRpbWUpIHtcbiAgICAgICAgdGltZXJzLmhydGltZSA9IF9nbG9iYWwucHJvY2Vzcy5ocnRpbWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJlc2VudC5uZXh0VGljaykge1xuICAgICAgICB0aW1lcnMubmV4dFRpY2sgPSBfZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2s7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJlc2VudC5wZXJmb3JtYW5jZSkge1xuICAgICAgICB0aW1lcnMucGVyZm9ybWFuY2UgPSBfZ2xvYmFsLnBlcmZvcm1hbmNlO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIHRpbWVycy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBfZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50LnF1ZXVlTWljcm90YXNrKSB7XG4gICAgICAgIHRpbWVycy5xdWV1ZU1pY3JvdGFzayA9IF9nbG9iYWwucXVldWVNaWNyb3Rhc2s7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJlc2VudC5jYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgICAgICB0aW1lcnMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBfZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQucmVxdWVzdElkbGVDYWxsYmFjaykge1xuICAgICAgICB0aW1lcnMucmVxdWVzdElkbGVDYWxsYmFjayA9IF9nbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaztcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50LmNhbmNlbElkbGVDYWxsYmFjaykge1xuICAgICAgICB0aW1lcnMuY2FuY2VsSWRsZUNhbGxiYWNrID0gX2dsb2JhbC5jYW5jZWxJZGxlQ2FsbGJhY2s7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJlc2VudC5JbnRsKSB7XG4gICAgICAgIHRpbWVycy5JbnRsID0gTmF0aXZlSW50bDtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50LlRlbXBvcmFsKSB7XG4gICAgICAgIHRpbWVycy5UZW1wb3JhbCA9IE5hdGl2ZVRlbXBvcmFsO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IF9nbG9iYWwuc2V0SW1tZWRpYXRlIHx8IF9nbG9iYWwuc2V0VGltZW91dDtcbiAgICBjb25zdCBvcmlnaW5hbENsZWFySW50ZXJ2YWwgPSBfZ2xvYmFsLmNsZWFySW50ZXJ2YWw7XG4gICAgY29uc3Qgb3JpZ2luYWxTZXRJbnRlcnZhbCA9IF9nbG9iYWwuc2V0SW50ZXJ2YWw7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RhdGV8bnVtYmVyfFRlbXBvcmFsVGltZWxpa2V9IFtzdGFydF0gdGhlIHN5c3RlbSB0aW1lIC0gbm9uLWludGVnZXIgdmFsdWVzIGFyZSBmbG9vcmVkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb29wTGltaXRdIG1heGltdW0gbnVtYmVyIG9mIHRpbWVycyB0aGF0IHdpbGwgYmUgcnVuIHdoZW4gY2FsbGluZyBydW5BbGwoKVxuICAgICAqIEByZXR1cm5zIHtDbG9ja31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDbG9jayhzdGFydCwgbG9vcExpbWl0KSB7XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKGdldEVwb2NoKHN0YXJ0KSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZXN0YW1wID0gc3RhcnQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBsb29wTGltaXQgPSBsb29wTGltaXQgfHwgMTAwMDtcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGxldCBuYW5vcyA9IDA7XG4gICAgICAgIGxldCB1bmluc3RhbGxlZCA9IGZhbHNlO1xuICAgICAgICAvKiogQHR5cGUge251bWJlcltdfSAqL1xuICAgICAgICBjb25zdCBhZGp1c3RlZFN5c3RlbVRpbWUgPSBbMCwgMF07IC8vIFttaWxsaXMsIG5hbm9yZW1haW5kZXJdXG5cbiAgICAgICAgLyoqIEB0eXBlIHtDbG9ja30gKi9cbiAgICAgICAgY29uc3QgY2xvY2sgPSAvKiogQHR5cGUge0Nsb2NrfSAqLyAoe1xuICAgICAgICAgICAgbm93OiBzdGFydCxcbiAgICAgICAgICAgIERhdGU6IGNyZWF0ZURhdGUoKSxcbiAgICAgICAgICAgIGxvb3BMaW1pdDogbG9vcExpbWl0LFxuICAgICAgICAgICAgaXNOZWFySW5maW5pdGVMaW1pdDogZmFsc2UsXG4gICAgICAgICAgICB0aWNrTW9kZTogeyBtb2RlOiBcIm1hbnVhbFwiLCBjb3VudGVyOiAwLCBkZWx0YTogdW5kZWZpbmVkIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNsb2NrLkRhdGUuY2xvY2sgPSBjbG9jaztcblxuICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgICAgIGZ1bmN0aW9uIGdldFRpbWVUb05leHRGcmFtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiAxNiAtICgoY2xvY2subm93IC0gc3RhcnRUaW1lc3RhbXApICUgMTYpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgICAgICBmdW5jdGlvbiBocnRpbWUocHJldikge1xuICAgICAgICAgICAgY29uc3QgbWlsbGlzU2luY2VTdGFydCA9XG4gICAgICAgICAgICAgICAgY2xvY2subm93IC0gYWRqdXN0ZWRTeXN0ZW1UaW1lWzBdIC0gc3RhcnRUaW1lc3RhbXA7XG4gICAgICAgICAgICBjb25zdCBzZWNzU2luY2VTdGFydCA9IE1hdGguZmxvb3IobWlsbGlzU2luY2VTdGFydCAvIDEwMDApO1xuICAgICAgICAgICAgY29uc3QgcmVtYWluZGVySW5OYW5vcyA9XG4gICAgICAgICAgICAgICAgKG1pbGxpc1NpbmNlU3RhcnQgLSBzZWNzU2luY2VTdGFydCAqIDFlMykgKiAxZTYgK1xuICAgICAgICAgICAgICAgIG5hbm9zIC1cbiAgICAgICAgICAgICAgICBhZGp1c3RlZFN5c3RlbVRpbWVbMV07XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXYpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZbMV0gPiAxZTkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTnVtYmVyIG9mIG5hbm9zZWNvbmRzIGNhbid0IGV4Y2VlZCBhIGJpbGxpb25cIixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbGRTZWNzID0gcHJldlswXTtcbiAgICAgICAgICAgICAgICBsZXQgbmFub0RpZmYgPSByZW1haW5kZXJJbk5hbm9zIC0gcHJldlsxXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VjRGlmZiA9IHNlY3NTaW5jZVN0YXJ0IC0gb2xkU2VjcztcblxuICAgICAgICAgICAgICAgIGlmIChuYW5vRGlmZiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmFub0RpZmYgKz0gMWU5O1xuICAgICAgICAgICAgICAgICAgICBzZWNEaWZmIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzZWNEaWZmLCBuYW5vRGlmZl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW3NlY3NTaW5jZVN0YXJ0LCByZW1haW5kZXJJbk5hbm9zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgKiBAdHlwZWRlZiB7bnVtYmVyfSBET01IaWdoUmVzVGltZVN0YW1wXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBwZXJmb3JtYW5jZS5ub3coKVxuICAgICAgICAgKiBAcmV0dXJucyB7RE9NSGlnaFJlc1RpbWVTdGFtcH1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGZha2VQZXJmb3JtYW5jZU5vdygpIHtcbiAgICAgICAgICAgIGNvbnN0IGhydCA9IGhydGltZSgpO1xuICAgICAgICAgICAgY29uc3QgbWlsbGlzID0gaHJ0WzBdICogMTAwMCArIGhydFsxXSAvIDFlNjtcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNQcmVzZW50LmhydGltZUJpZ2ludCkge1xuICAgICAgICAgICAgaHJ0aW1lLmJpZ2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGhydGltZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBCaWdJbnQocGFydHNbMF0pICogQmlnSW50KDFlOSkgKyBCaWdJbnQocGFydHNbMV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1ByZXNlbnQuSW50bCkge1xuICAgICAgICAgICAgY2xvY2suSW50bCA9IGNyZWF0ZUludGwoY2xvY2spO1xuICAgICAgICAgICAgY2xvY2suSW50bC5jbG9jayA9IGNsb2NrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUHJlc2VudC5UZW1wb3JhbCkge1xuICAgICAgICAgICAgY2xvY2suVGVtcG9yYWwgPSBjcmVhdGVUZW1wb3JhbChjbG9jaywgKCkgPT4gbmFub3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7U2V0VGlja01vZGVDb25maWd9IHRpY2tNb2RlQ29uZmlnIC0gVGhlIG5ldyBjb25maWd1cmF0aW9uIGZvciBob3cgdGhlIGNsb2NrIHNob3VsZCB0aWNrLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xvY2suc2V0VGlja01vZGUgPSBmdW5jdGlvbiAodGlja01vZGVDb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbW9kZTogbmV3TW9kZSwgZGVsdGE6IG5ld0RlbHRhIH0gPVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7U2V0VGlja01vZGVDb25maWd9ICovICh0aWNrTW9kZUNvbmZpZyk7XG4gICAgICAgICAgICBjb25zdCB7IG1vZGU6IG9sZE1vZGUsIGRlbHRhOiBvbGREZWx0YSB9ID0gY2xvY2sudGlja01vZGU7XG4gICAgICAgICAgICBpZiAobmV3TW9kZSA9PT0gb2xkTW9kZSAmJiBuZXdEZWx0YSA9PT0gb2xkRGVsdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRNb2RlID09PSBcImludGVydmFsXCIpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENsZWFySW50ZXJ2YWwoY2xvY2suYXR0YWNoZWRJbnRlcnZhbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsb2NrLnRpY2tNb2RlID0ge1xuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNsb2NrLnRpY2tNb2RlLmNvdW50ZXIgKyAxLFxuICAgICAgICAgICAgICAgIG1vZGU6IG5ld01vZGUsXG4gICAgICAgICAgICAgICAgZGVsdGE6IG5ld0RlbHRhLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKG5ld01vZGUgPT09IFwibmV4dEFzeW5jXCIpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlVW50aWxNb2RlQ2hhbmdlcygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdNb2RlID09PSBcImludGVydmFsXCIpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVJbnRlcnZhbFRpY2soY2xvY2ssIG5ld0RlbHRhIHx8IDIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgYWR2YW5jaW5nIHRoZSBuYXRpdmUgZXZlbnQgbG9vcCB1bnRpbCB0aGUgdGljayBtb2RlIGNoYW5nZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYWR2YW5jZVVudGlsTW9kZUNoYW5nZXMoKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdhaXRzIGZvciBvbmUgbmF0aXZlIG1hY3JvdGFzayBhbmQgdGhlbiBvbmUgbWljcm90YXNrIHR1cm4uXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gbmV3TWFjcm90YXNrKCkge1xuICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VDaGFubmVsIGVuc3VyZXMgdGhhdCBzZXRUaW1lb3V0IGlzIG5vdCB0aHJvdHRsZWQgdG8gNG1zLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9zZXRUaW1lb3V0I3JlYXNvbnNfZm9yX2RlbGF5c19sb25nZXJfdGhhbl9zcGVjaWZpZWRcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvc3RhY2tibGl0ei1zdGFydGVycy1xdGxwY2NcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnBvcnQxLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjaGFubmVsLnBvcnQxLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIC8vIHNldFRpbWVvdXQgZW5zdXJlcyBtaWNyb3Rhc2sgcXVldWUgaXMgZW1wdGllZFxuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2V0VGltZW91dChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyBjb3VudGVyIH0gPSBjbG9jay50aWNrTW9kZTtcbiAgICAgICAgICAgIHdoaWxlIChjbG9jay50aWNrTW9kZS5jb3VudGVyID09PSBjb3VudGVyKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3TWFjcm90YXNrKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNsb2NrLnRpY2tNb2RlLmNvdW50ZXIgIT09IGNvdW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjbG9jay5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGVtcG9yYXJpbHkgcGF1c2VzIG5leHRBc3luYyBhdXRvLXRpY2tpbmcgd2hpbGUgYW4gYXN5bmMgb3BlcmF0aW9uIHJ1bnMuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvbWlzZTx1bmtub3duPn0gcHJvbWlzZVxuICAgICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHBhdXNlQXV0b1RpY2tVbnRpbEZpbmlzaGVkKHByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChjbG9jay50aWNrTW9kZS5tb2RlICE9PSBcIm5leHRBc3luY1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbG9jay5zZXRUaWNrTW9kZSh7IG1vZGU6IFwibWFudWFsXCIgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXVuaW5zdGFsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnNldFRpY2tNb2RlKHsgbW9kZTogXCJuZXh0QXN5bmNcIiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSByZW1haW5pbmcgdGltZSBpbiB0aGUgY3VycmVudCBpZGxlIHdpbmRvdy5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldFRpbWVUb05leHRJZGxlUGVyaW9kKCkge1xuICAgICAgICAgICAgbGV0IHRpbWVUb05leHRJZGxlUGVyaW9kID0gMDtcblxuICAgICAgICAgICAgaWYgKGNsb2NrLmNvdW50VGltZXJzKCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGltZVRvTmV4dElkbGVQZXJpb2QgPSA1MDsgLy8gY29uc3QgZm9yIG5vd1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGltZVRvTmV4dElkbGVQZXJpb2Q7XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5yZXF1ZXN0SWRsZUNhbGxiYWNrID0gZnVuY3Rpb24gcmVxdWVzdElkbGVDYWxsYmFjayhcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICB7IHRpbWVvdXQgfSA9IC8qKiBAdHlwZSB7eyB0aW1lb3V0PzogbnVtYmVyIH19ICovICh7fSksXG4gICAgICAgICkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAdHlwZSB7SWRsZURlYWRsaW5lfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpZGxlRGVhZGxpbmUgPSB7XG4gICAgICAgICAgICAgICAgZGlkVGltZW91dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aW1lUmVtYWluaW5nOiBnZXRUaW1lVG9OZXh0SWRsZVBlcmlvZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbaWRsZURlYWRsaW5lXSxcbiAgICAgICAgICAgICAgICBkZWxheTogdGltZW91dCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWRsZUNhbGxiYWNrOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIocmVzdWx0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jYW5jZWxJZGxlQ2FsbGJhY2sgPSBmdW5jdGlvbiBjYW5jZWxJZGxlQ2FsbGJhY2sodGltZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiSWRsZUNhbGxiYWNrXCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnNldFRpbWVvdXQgPSBmdW5jdGlvbiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRUaW1lcihjbG9jaywge1xuICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmMsXG4gICAgICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgICAgICAgICAgICBkZWxheTogdGltZW91dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIF9nbG9iYWwuUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB1dGlsUHJvbWlzaWZ5KSB7XG4gICAgICAgICAgICBjbG9jay5zZXRUaW1lb3V0W3V0aWxQcm9taXNpZnkuY3VzdG9tXSA9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJvbWlzaWZpZWRTZXRUaW1lb3V0KHRpbWVvdXQsIGFyZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IF9nbG9iYWwuUHJvbWlzZShmdW5jdGlvbiBzZXRUaW1lb3V0RXhlY3V0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbYXJnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvY2suY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gY2xlYXJUaW1lb3V0KHRpbWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIlRpbWVvdXRcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2submV4dFRpY2sgPSBmdW5jdGlvbiBuZXh0VGljayhmdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5xdWV1ZUpvYihjbG9jaywge1xuICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmMsXG4gICAgICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogY2xvY2suaXNOZWFySW5maW5pdGVMaW1pdCA/IG5ldyBFcnJvcigpIDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnF1ZXVlTWljcm90YXNrID0gZnVuY3Rpb24gcXVldWVNaWNyb3Rhc2soZnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5leHRUaWNrKGZ1bmMpOyAvLyBleHBsaWNpdGx5IGRyb3AgYWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uIHNldEludGVydmFsKGZ1bmMsIHRpbWVvdXQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgdGltZW91dCA9IHBhcnNlSW50KFN0cmluZyh0aW1lb3V0KSwgMTApO1xuICAgICAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgICAgICAgICAgIGRlbGF5OiB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGludGVydmFsOiB0aW1lb3V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2suY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwodGltZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiSW50ZXJ2YWxcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGlzUHJlc2VudC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIGNsb2NrLnNldEltbWVkaWF0ZSA9IC8qKiBAdHlwZSB7U2V0SW1tZWRpYXRlfSAqLyAoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBfZ2xvYmFsLlByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgdXRpbFByb21pc2lmeSkge1xuICAgICAgICAgICAgICAgIGNsb2NrLnNldEltbWVkaWF0ZVt1dGlsUHJvbWlzaWZ5LmN1c3RvbV0gPVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcm9taXNpZmllZFNldEltbWVkaWF0ZShhcmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgX2dsb2JhbC5Qcm9taXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmM6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbYXJnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsb2NrLmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUodGltZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIkltbWVkaWF0ZVwiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5jb3VudFRpbWVycyA9IGZ1bmN0aW9uIGNvdW50VGltZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAoY2xvY2sudGltZXJIZWFwID8gY2xvY2sudGltZXJIZWFwLnRpbWVycy5sZW5ndGggOiAwKSArXG4gICAgICAgICAgICAgICAgKGNsb2NrLmpvYnMgfHwgW10pLmxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuYykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGRlbGF5OiBnZXRUaW1lVG9OZXh0RnJhbWUoKSxcbiAgICAgICAgICAgICAgICBnZXQgYXJncygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtmYWtlUGVyZm9ybWFuY2VOb3coKV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IHRydWUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiQW5pbWF0aW9uRnJhbWVcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuTWljcm90YXNrcyA9IGZ1bmN0aW9uIHJ1bk1pY3JvdGFza3MoKSB7XG4gICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgICAgIGZ1bmN0aW9uIGR1cmF0aW9uVG9NcyhkdXJhdGlvbikge1xuICAgICAgICAgICAgLy8gcmVsYXRpdmVUbyB1c2VzIHRoZSByZWFsIHN5c3RlbSB0aW1lem9uZSBcdTIwMTQgZmFrZS10aW1lcnMgZmFrZXMgdGltZSwgbm90IHBsYWNlLlxuICAgICAgICAgICAgLy8gQ2FsZW5kYXItdW5pdCBkdXJhdGlvbnMgKG1vbnRocywgeWVhcnMpIHdpbGwgcmVzb2x2ZSBEU1QvbGVuZ3RoIHVzaW5nIHRoZSBob3N0IHR6LlxuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVUbyA9IE5hdGl2ZVRlbXBvcmFsLkluc3RhbnQuZnJvbUVwb2NoTWlsbGlzZWNvbmRzKFxuICAgICAgICAgICAgICAgIGNsb2NrLm5vdyxcbiAgICAgICAgICAgICkudG9ab25lZERhdGVUaW1lSVNPKE5hdGl2ZVRlbXBvcmFsLk5vdy50aW1lWm9uZUlkKCkpO1xuICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uLnRvdGFsKHsgdW5pdDogXCJtaWxsaXNlY29uZFwiLCByZWxhdGl2ZVRvIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xUZW1wb3JhbER1cmF0aW9ufSB0aWNrVmFsdWVcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gbWlsbGlzZWNvbmRzIGFzIGEgZmxvYXRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHRpY2tWYWx1ZVRvTXModGlja1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRpY2tWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aWNrVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNQcmVzZW50LlRlbXBvcmFsICYmXG4gICAgICAgICAgICAgICAgdGlja1ZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRpY2tWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiAoLyoqIEB0eXBlIHtUZW1wb3JhbER1cmF0aW9ufSAqLyAodGlja1ZhbHVlKS50b3RhbCkgPT09XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uVG9NcyhcbiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtUZW1wb3JhbER1cmF0aW9ufSAqLyAodGlja1ZhbHVlKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZSgvKiogQHR5cGUge3N0cmluZ30gKi8gKHRpY2tWYWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xUZW1wb3JhbER1cmF0aW9ufSB0aWNrVmFsdWUgbWlsbGlzZWNvbmRzLCBhIHN0cmluZyBwYXJzZWFibGUgYnkgcGFyc2VUaW1lLCBvciBhIFRlbXBvcmFsLkR1cmF0aW9uXG4gICAgICAgICAqIEByZXR1cm5zIHtDbG9ja1N0YXRlfSBhIG11dGFibGUgc3RhdGUgb2JqZWN0IGZvciB0aGUgdGljayBleGVjdXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVRpY2tTdGF0ZSh0aWNrVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zRmxvYXQgPSB0aWNrVmFsdWVUb01zKHRpY2tWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBtcyA9IE1hdGguZmxvb3IobXNGbG9hdCk7XG4gICAgICAgICAgICBjb25zdCByZW1haW5kZXIgPSBuYW5vUmVtYWluZGVyKG1zRmxvYXQpO1xuICAgICAgICAgICAgbGV0IG5hbm9zVG90YWwgPSBuYW5vcyArIHJlbWFpbmRlcjtcbiAgICAgICAgICAgIGxldCB0aWNrVG8gPSBjbG9jay5ub3cgKyBtcztcblxuICAgICAgICAgICAgaWYgKG1zRmxvYXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5lZ2F0aXZlIHRpY2tzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGp1c3QgZm9yIHBvc2l0aXZlIG92ZXJmbG93XG4gICAgICAgICAgICBpZiAobmFub3NUb3RhbCA+PSAxZTYpIHtcbiAgICAgICAgICAgICAgICB0aWNrVG8gKz0gMTtcbiAgICAgICAgICAgICAgICBuYW5vc1RvdGFsIC09IDFlNjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Q2xvY2tTdGF0ZX0gKi8gKHtcbiAgICAgICAgICAgICAgICBtc0Zsb2F0OiBtc0Zsb2F0LFxuICAgICAgICAgICAgICAgIG1zOiBtcyxcbiAgICAgICAgICAgICAgICBuYW5vc1RvdGFsOiBuYW5vc1RvdGFsLFxuICAgICAgICAgICAgICAgIHRpY2tGcm9tOiBjbG9jay5ub3csXG4gICAgICAgICAgICAgICAgdGlja1RvOiB0aWNrVG8sXG4gICAgICAgICAgICAgICAgcHJldmlvdXM6IGNsb2NrLm5vdyxcbiAgICAgICAgICAgICAgICB0aW1lcjogbnVsbCxcbiAgICAgICAgICAgICAgICBmaXJzdEV4Y2VwdGlvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBvbGROb3c6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge0Nsb2NrU3RhdGV9IHN0YXRlIG11dGFibGUgdGljayBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2xkTm93IHRoZSBjbG9jay5ub3cgYmVmb3JlIHNvbWUgYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gY29tcGVuc2F0aW9uIG9wdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pbmNsdWRlUHJldmlvdXNdIHdoZXRoZXIgdG8gYWxzbyB1cGRhdGUgc3RhdGUucHJldmlvdXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q2xvY2tDaGFuZ2VDb21wZW5zYXRpb24oc3RhdGUsIG9sZE5vdywgb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9sZE5vdyAhPT0gY2xvY2subm93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgICAgICBzdGF0ZS50aWNrRnJvbSArPSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgIHN0YXRlLnRpY2tUbyArPSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZVByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByZXZpb3VzICs9IGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7Q2xvY2tTdGF0ZX0gc3RhdGUgbXV0YWJsZSB0aWNrIHN0YXRlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBydW5Jbml0aWFsSm9icyhzdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUub2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICBhcHBseUNsb2NrQ2hhbmdlQ29tcGVuc2F0aW9uKHN0YXRlLCBzdGF0ZS5vbGROb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7Q2xvY2tTdGF0ZX0gc3RhdGUgbXV0YWJsZSB0aWNrIHN0YXRlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBydW5Qb3N0TG9vcEpvYnMoc3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLm9sZE5vdyA9IGNsb2NrLm5vdztcbiAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgYXBwbHlDbG9ja0NoYW5nZUNvbXBlbnNhdGlvbihzdGF0ZSwgc3RhdGUub2xkTm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge0Nsb2NrU3RhdGV9IHN0YXRlIG11dGFibGUgdGljayBzdGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0TmV4dFRpbWVySW5SYW5nZShzdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUudGltZXIgPSBmaXJzdFRpbWVySW5SYW5nZShcbiAgICAgICAgICAgICAgICBjbG9jayxcbiAgICAgICAgICAgICAgICBzdGF0ZS5wcmV2aW91cyxcbiAgICAgICAgICAgICAgICBzdGF0ZS50aWNrVG8sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RhdGUucHJldmlvdXMgPSBzdGF0ZS50aWNrRnJvbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge0Nsb2NrU3RhdGV9IHN0YXRlIG11dGFibGUgdGljayBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXN5bmMgd2hldGhlciB0aGlzIGlzIGFuIGFzeW5jIHRpY2tcbiAgICAgICAgICogQHBhcmFtIHtGYWtlVGltZXJzRnVuY3Rpb259IG5leHRQcm9taXNlVGljayBjYWxsYmFjayBmb3IgYXN5bmMgcHJvbWlzZSBzZXR0bGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7RmFrZVRpbWVyc0Z1bmN0aW9ufSBjb21wZW5zYXRpb25DaGVjayBjYWxsYmFjayBmb3IgY2xvY2sgY2hhbmdlIGNvbXBlbnNhdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciBhbiBlYXJseSByZXR1cm4gd2FzIHRyaWdnZXJlZCAoYXN5bmMgbW9kZSlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHJ1blRpbWVyc0luUmFuZ2UoXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIGlzQXN5bmMsXG4gICAgICAgICAgICBuZXh0UHJvbWlzZVRpY2ssXG4gICAgICAgICAgICBjb21wZW5zYXRpb25DaGVjayxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzdGF0ZS50aW1lciA9IGZpcnN0VGltZXJJblJhbmdlKFxuICAgICAgICAgICAgICAgIGNsb2NrLFxuICAgICAgICAgICAgICAgIHN0YXRlLnRpY2tGcm9tLFxuICAgICAgICAgICAgICAgIHN0YXRlLnRpY2tUbyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHdoaWxlIChzdGF0ZS50aW1lciAmJiBzdGF0ZS50aWNrRnJvbSA8PSBzdGF0ZS50aWNrVG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzVGltZXIoY2xvY2ssIHN0YXRlLnRpbWVyLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50aWNrRnJvbSA9IHN0YXRlLnRpbWVyLmNhbGxBdDtcbiAgICAgICAgICAgICAgICAgICAgY2xvY2subm93ID0gc3RhdGUudGltZXIuY2FsbEF0O1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5vbGROb3cgPSBjbG9jay5ub3c7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxUaW1lcihjbG9jaywgc3RhdGUudGltZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maXJzdEV4Y2VwdGlvbiA9IHN0YXRlLmZpcnN0RXhjZXB0aW9uIHx8IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoIHVwIGFmdGVyIG5hdGl2ZSBzZXRJbW1lZGlhdGUgY2FsbGJhY2sgdG8gYWxsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuYXRpdmUgZXM2IHByb21pc2VzIHRvIHByb2Nlc3MgdGhlaXIgY2FsbGJhY2tzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHRpbWVyIGZpcmVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTZXRUaW1lb3V0KG5leHRQcm9taXNlVGljayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGlvbkNoZWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VsZWN0TmV4dFRpbWVySW5SYW5nZShzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtDbG9ja1N0YXRlfSBzdGF0ZSBtdXRhYmxlIHRpY2sgc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBpc0FzeW5jIHdoZXRoZXIgdGhpcyBpcyBhbiBhc3luYyB0aWNrXG4gICAgICAgICAqIEBwYXJhbSB7RmFrZVRpbWVyc0Z1bmN0aW9ufSByZXNvbHZlIHByb21pc2UgcmVzb2x2ZSBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH0gdGhlIG5ldyBjbG9jay5ub3cgb3Igbm90aGluZyBmb3IgYXN5bmNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGZpbmFsaXplVGljayhzdGF0ZSwgaXNBc3luYywgcmVzb2x2ZSkge1xuICAgICAgICAgICAgLy8gY29ybmVyIGNhc2U6IGR1cmluZyBydW5Kb2JzIG5ldyB0aW1lcnMgd2VyZSBzY2hlZHVsZWQgd2hpY2ggY291bGQgYmUgaW4gdGhlIHJhbmdlIFtjbG9jay5ub3csIHRpY2tUb11cbiAgICAgICAgICAgIHN0YXRlLnRpbWVyID0gZmlyc3RUaW1lckluUmFuZ2UoXG4gICAgICAgICAgICAgICAgY2xvY2ssXG4gICAgICAgICAgICAgICAgc3RhdGUudGlja0Zyb20sXG4gICAgICAgICAgICAgICAgc3RhdGUudGlja1RvLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS50aW1lcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnRpY2soc3RhdGUudGlja1RvIC0gY2xvY2subm93KTsgLy8gZG8gaXQgYWxsIGFnYWluIC0gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlcXVlc3RlZCByYW5nZVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmlyc3RFeGNlcHRpb24gPSBzdGF0ZS5maXJzdEV4Y2VwdGlvbiB8fCBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gdGltZXJzIHJlbWFpbmluZyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlOiBtb3ZlIHRoZSBjbG9jayBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgY2xvY2subm93ID0gc3RhdGUudGlja1RvO1xuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIG5hbm9zXG4gICAgICAgICAgICAgICAgbmFub3MgPSBzdGF0ZS5uYW5vc1RvdGFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZpcnN0RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RhdGUuZmlyc3RFeGNlcHRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0FzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjbG9jay5ub3cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xUZW1wb3JhbER1cmF0aW9ufSB0aWNrVmFsdWUgbWlsbGlzZWNvbmRzIG9yIGEgc3RyaW5nIHBhcnNlYWJsZSBieSBwYXJzZVRpbWVcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBpc0FzeW5jIHdoZXRoZXIgdGhpcyBpcyBhbiBhc3luYyB0aWNrXG4gICAgICAgICAqIEBwYXJhbSB7RmFrZVRpbWVyc0Z1bmN0aW9ufSBbcmVzb2x2ZV0gcHJvbWlzZSByZXNvbHZlIGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RmFrZVRpbWVyc0Z1bmN0aW9ufSBbcmVqZWN0XSBwcm9taXNlIHJlamVjdCBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH0gdGhlIG5ldyBjbG9jay5ub3cgb3Igbm90aGluZyBmb3IgYXN5bmNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRvVGljayh0aWNrVmFsdWUsIGlzQXN5bmMsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHtDbG9ja1N0YXRlfSAqL1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVUaWNrU3RhdGUodGlja1ZhbHVlKTtcblxuICAgICAgICAgICAgbmFub3MgPSBzdGF0ZS5uYW5vc1RvdGFsO1xuICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG5cbiAgICAgICAgICAgIHJ1bkluaXRpYWxKb2JzKHN0YXRlKTtcblxuICAgICAgICAgICAgY29uc3QgY29tcGVuc2F0aW9uQ2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlDbG9ja0NoYW5nZUNvbXBlbnNhdGlvbihzdGF0ZSwgc3RhdGUub2xkTm93LCB7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQcmV2aW91czogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRQcm9taXNlVGljayA9XG4gICAgICAgICAgICAgICAgaXNBc3luYyAmJlxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGlvbkNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3ROZXh0VGltZXJJblJhbmdlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvVGlja0lubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRvVGlja0lubmVyKCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcnVuVGltZXJzSW5SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9taXNlVGljayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGlvbkNoZWNrLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBydW5Qb3N0TG9vcEpvYnMoc3RhdGUpO1xuICAgICAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbGl6ZVRpY2soc3RhdGUsIGlzQXN5bmMsIHJlc29sdmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZG9UaWNrSW5uZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8VGVtcG9yYWxEdXJhdGlvbn0gdGlja1ZhbHVlIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIGEgaHVtYW4tcmVhZGFibGUgdmFsdWUgbGlrZSBcIjAxOjExOjE1XCIsIG9yIGEgVGVtcG9yYWwuRHVyYXRpb25cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gd2lsbCByZXR1cm4gdGhlIG5ldyBgbm93YCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgY2xvY2sudGljayA9IGZ1bmN0aW9uIHRpY2sodGlja1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9UaWNrKHRpY2tWYWx1ZSwgZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLm5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IGZpcnN0VGltZXIoY2xvY2spO1xuICAgICAgICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9jay5ub3c7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjbG9jay5ub3cgPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICAgICAgY2FsbFRpbWVyKGNsb2NrLCB0aW1lcik7XG4gICAgICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0geyhyZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQpID0+IHZvaWR9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJ1biBpbnNpZGUgbmF0aXZlIHNldFRpbWVvdXRcbiAgICAgICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBydW5Bc3luY1dpdGhOYXRpdmVUaW1lb3V0KGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF1c2VBdXRvVGlja1VudGlsRmluaXNoZWQoXG4gICAgICAgICAgICAgICAgbmV3IF9nbG9iYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5ydW5BbGwgPSBmdW5jdGlvbiBydW5BbGwoKSB7XG4gICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvY2subG9vcExpbWl0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgICAgICAgICByZXNldElzTmVhckluZmluaXRlTGltaXQoY2xvY2spO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG51bVRpbWVycyA9IGNsb2NrLnRpbWVySGVhcC50aW1lcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChudW1UaW1lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRJc05lYXJJbmZpbml0ZUxpbWl0KGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjaGVja0lzTmVhckluZmluaXRlTGltaXQoY2xvY2ssIGkpO1xuICAgICAgICAgICAgICAgIGNsb2NrLm5leHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZXhjZXNzSm9iID0gZmlyc3RUaW1lcihjbG9jayk7XG4gICAgICAgICAgICB0aHJvdyBnZXRJbmZpbml0ZUxvb3BFcnJvcihjbG9jaywgZXhjZXNzSm9iKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5ydW5Ub0ZyYW1lID0gZnVuY3Rpb24gcnVuVG9GcmFtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9jay50aWNrKGdldFRpbWVUb05leHRGcmFtZSgpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5ydW5Ub0xhc3QgPSBmdW5jdGlvbiBydW5Ub0xhc3QoKSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IGxhc3RUaW1lcihjbG9jayk7XG4gICAgICAgICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLnRpY2sodGltZXIuY2FsbEF0IC0gY2xvY2subm93KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIF9nbG9iYWwuUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8VGVtcG9yYWxEdXJhdGlvbn0gdGlja1ZhbHVlIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIGEgaHVtYW4tcmVhZGFibGUgdmFsdWUgbGlrZSBcIjAxOjExOjE1XCIsIG9yIGEgVGVtcG9yYWwuRHVyYXRpb25cbiAgICAgICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjbG9jay50aWNrQXN5bmMgPSBmdW5jdGlvbiB0aWNrQXN5bmModGlja1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bkFzeW5jV2l0aE5hdGl2ZVRpbWVvdXQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBkb1RpY2sodGlja1ZhbHVlLCB0cnVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY2xvY2submV4dEFzeW5jID0gZnVuY3Rpb24gbmV4dEFzeW5jKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydW5Bc3luY1dpdGhOYXRpdmVUaW1lb3V0KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBmaXJzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycjtcbiAgICAgICAgICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLm5vdyA9IHRpbWVyLmNhbGxBdDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxUaW1lcihjbG9jaywgdGltZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNsb2NrLm5vdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY2xvY2sucnVuQWxsQXN5bmMgPSBmdW5jdGlvbiBydW5BbGxBc3luYygpIHtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHsodmFsdWU6IHVua25vd24pID0+IHZvaWR9IHJlc29sdmUgcHJvbWlzZSByZXNvbHZlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHsocmVhc29uPzogdW5rbm93bikgPT4gdm9pZH0gcmVqZWN0IHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9SdW4ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bVRpbWVycztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgY2xvY2subG9vcExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9jay50aW1lckhlYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRJc05lYXJJbmZpbml0ZUxpbWl0KGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGltZXJzID0gY2xvY2sudGltZXJIZWFwLnRpbWVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRpbWVycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldElzTmVhckluZmluaXRlTGltaXQoY2xvY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNsb2NrLm5vdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0lzTmVhckluZmluaXRlTGltaXQoY2xvY2ssIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlc3NKb2IgPSBmaXJzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChnZXRJbmZpbml0ZUxvb3BFcnJvcihjbG9jaywgZXhjZXNzSm9iKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBydW5Bc3luY1dpdGhOYXRpdmVUaW1lb3V0KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9SdW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNsb2NrLnJ1blRvTGFzdEFzeW5jID0gZnVuY3Rpb24gcnVuVG9MYXN0QXN5bmMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bkFzeW5jV2l0aE5hdGl2ZVRpbWVvdXQoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBsYXN0VGltZXIoY2xvY2spO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2xvY2subm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2xvY2sudGlja0FzeW5jKHRpbWVyLmNhbGxBdCAtIGNsb2NrLm5vdykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsb2NrLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICBuYW5vcyA9IDA7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjbG9jay50aW1lckhlYXAgPSBuZXcgVGltZXJIZWFwKCk7XG4gICAgICAgICAgICBjbG9jay5qb2JzID0gW107XG4gICAgICAgICAgICBjbG9jay5ub3cgPSBzdGFydDtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRTeXN0ZW1UaW1lID0gZnVuY3Rpb24gc2V0U3lzdGVtVGltZShzeXN0ZW1UaW1lKSB7XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGltZSBkaWZmZXJlbmNlXG4gICAgICAgICAgICBjb25zdCBuZXdOb3cgPSBnZXRFcG9jaChzeXN0ZW1UaW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBuZXdOb3cgLSBjbG9jay5ub3c7XG5cbiAgICAgICAgICAgIGFkanVzdGVkU3lzdGVtVGltZVswXSA9IGFkanVzdGVkU3lzdGVtVGltZVswXSArIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICBhZGp1c3RlZFN5c3RlbVRpbWVbMV0gPSBhZGp1c3RlZFN5c3RlbVRpbWVbMV0gKyBuYW5vcztcbiAgICAgICAgICAgIC8vIHVwZGF0ZSAnc3lzdGVtIGNsb2NrJ1xuICAgICAgICAgICAgY2xvY2subm93ID0gbmV3Tm93O1xuICAgICAgICAgICAgbmFub3MgPSAwO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGltZXJzIGFuZCBpbnRlcnZhbHMgdG8ga2VlcCB0aGVtIHN0YWJsZVxuICAgICAgICAgICAgZm9yRWFjaEFjdGl2ZVRpbWVyKGNsb2NrLCAodGltZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aW1lci5jcmVhdGVkQXQgKz0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB0aW1lci5jYWxsQXQgKz0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8VGVtcG9yYWxEdXJhdGlvbn0gdGlja1ZhbHVlIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIGEgaHVtYW4tcmVhZGFibGUgdmFsdWUgbGlrZSBcIjAxOjExOjE1XCIsIG9yIGEgVGVtcG9yYWwuRHVyYXRpb25cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gdGhlIG5ldyBgbm93YCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgY2xvY2suanVtcCA9IGZ1bmN0aW9uIGp1bXAodGlja1ZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBtc0Zsb2F0ID0gdGlja1ZhbHVlVG9Ncyh0aWNrVmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgbXMgPSBNYXRoLmZsb29yKG1zRmxvYXQpO1xuXG4gICAgICAgICAgICBmb3JFYWNoQWN0aXZlVGltZXIoY2xvY2ssICh0aW1lcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjbG9jay5ub3cgKyBtcyA+IHRpbWVyLmNhbGxBdCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lci5jYWxsQXQgPSBjbG9jay5ub3cgKyBtcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVidWlsZCBoZWFwIGFzIG9yZGVyIG1pZ2h0IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgcmVidWlsZFRpbWVySGVhcChjbG9jayk7XG5cbiAgICAgICAgICAgIGNsb2NrLnRpY2sobXMpO1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaXNQcmVzZW50LnBlcmZvcm1hbmNlKSB7XG4gICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZS5ub3cgPSBmYWtlUGVyZm9ybWFuY2VOb3c7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNQcmVzZW50LmhydGltZSkge1xuICAgICAgICAgICAgY2xvY2suaHJ0aW1lID0gaHJ0aW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm5zIHtUaW1lcltdfVxuICAgICAgICAgKi9cbiAgICAgICAgY2xvY2sudW5pbnN0YWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdW5pbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xvY2suc2V0VGlja01vZGUoeyBtb2RlOiBcIm1hbnVhbFwiIH0pO1xuXG4gICAgICAgICAgICBpZiAoY2xvY2subWV0aG9kcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbGxlZEhyVGltZSA9IFwiX2hydGltZVwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbGxlZE5leHRUaWNrID0gXCJfbmV4dFRpY2tcIjtcbiAgICAgICAgICAgICAgICBsZXQgbWV0aG9kLCBpLCBsO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBjbG9jay5tZXRob2RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBjbG9jay5tZXRob2RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBcImhydGltZVwiICYmIF9nbG9iYWwucHJvY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2dsb2JhbC5wcm9jZXNzLmhydGltZSA9IGNsb2NrW2luc3RhbGxlZEhyVGltZV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcIm5leHRUaWNrXCIgJiYgX2dsb2JhbC5wcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2sgPSBjbG9ja1tpbnN0YWxsZWROZXh0VGlja107XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcInBlcmZvcm1hbmNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUGVyZkRlc2NyaXB0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXyR7bWV0aG9kfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxQZXJmRGVzY3JpcHRvci5nZXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3JpZ2luYWxQZXJmRGVzY3JpcHRvci5zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dsb2JhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsUGVyZkRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dsb2JhbFttZXRob2RdID0gY2xvY2tbYF8ke21ldGhvZH1gXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9ja1ttZXRob2RdICYmIGNsb2NrW21ldGhvZF0uaGFzT3duUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2xvYmFsW21ldGhvZF0gPSBjbG9ja1tgXyR7bWV0aG9kfWBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX2dsb2JhbFttZXRob2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQgbm8tZW1wdHk6IFwib2ZmXCIgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsb2NrLnRpbWVyc01vZHVsZU1ldGhvZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA8IGNsb2NrLnRpbWVyc01vZHVsZU1ldGhvZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjbG9jay50aW1lcnNNb2R1bGVNZXRob2RzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyc01vZHVsZVtlbnRyeS5tZXRob2ROYW1lXSA9IGVudHJ5Lm9yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbG9jay50aW1lcnNQcm9taXNlc01vZHVsZU1ldGhvZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA8IGNsb2NrLnRpbWVyc1Byb21pc2VzTW9kdWxlTWV0aG9kcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNsb2NrLnRpbWVyc1Byb21pc2VzTW9kdWxlTWV0aG9kc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcnNQcm9taXNlc01vZHVsZVtlbnRyeS5tZXRob2ROYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm9yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBleGVjdXRpb25zIHdoaWNoIHdpbGwgY29tcGxldGVseSByZW1vdmUgdGhlc2UgcHJvcHNcbiAgICAgICAgICAgICAgICBjbG9jay5tZXRob2RzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjbG9jay5hYm9ydExpc3RlbmVyTWFwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICAgICAgXSBvZiBjbG9jay5hYm9ydExpc3RlbmVyTWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvY2suYWJvcnRMaXN0ZW5lck1hcC5kZWxldGUobGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmV0dXJuIHBlbmRpbmcgdGltZXJzLCB0byBlbmFibGUgY2hlY2tpbmcgd2hhdCB0aW1lcnMgcmVtYWluZWQgb24gdW5pbnN0YWxsXG4gICAgICAgICAgICBpZiAoIWNsb2NrLnRpbWVySGVhcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9jay50aW1lckhlYXAudGltZXJzLnNsaWNlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGNsb2NrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgaW50ZXJ2YWwgdXNlZCB0byBhZHZhbmNlIHRoZSBjbG9jayBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEBwYXJhbSB7Q2xvY2t9IGNsb2NrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSW50ZXJ2YWxUaWNrKGNsb2NrLCBkZWx0YSkge1xuICAgICAgICBjb25zdCBpbnRlcnZhbFRpY2sgPSBkb0ludGVydmFsVGljay5iaW5kKG51bGwsIGNsb2NrLCBkZWx0YSk7XG4gICAgICAgIGNvbnN0IGludGVydmFsSWQgPSBvcmlnaW5hbFNldEludGVydmFsKGludGVydmFsVGljaywgZGVsdGEpO1xuICAgICAgICBjbG9jay5hdHRhY2hlZEludGVydmFsID0gaW50ZXJ2YWxJZDtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NvbmZpZz19IFtjb25maWddIE9wdGlvbmFsIGNvbmZpZ1xuICAgICAqIEByZXR1cm5zIHtDbG9ja31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnN0YWxsKGNvbmZpZykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSB8fFxuICAgICAgICAgICAgY29uZmlnIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjb25maWcpIHx8XG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnID09PSBcIm51bWJlclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgRmFrZVRpbWVycy5pbnN0YWxsIGNhbGxlZCB3aXRoICR7U3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgKX0gaW5zdGFsbCByZXF1aXJlcyBhbiBvYmplY3QgcGFyYW1ldGVyYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2dsb2JhbC5EYXRlLmlzRmFrZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gVGltZXJzIGFyZSBhbHJlYWR5IGZha2VkOyB0aGlzIGlzIGEgcHJvYmxlbS5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVzZXIgcmVzZXQgdGltZXJzIGJlZm9yZSBjb250aW51aW5nLlxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNhbid0IGluc3RhbGwgZmFrZSB0aW1lcnMgdHdpY2Ugb24gdGhlIHNhbWUgZ2xvYmFsIG9iamVjdC5cIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY29uZmlnID0gdHlwZW9mIGNvbmZpZyAhPT0gXCJ1bmRlZmluZWRcIiA/IGNvbmZpZyA6IHt9O1xuICAgICAgICBjb25maWcuc2hvdWxkQWR2YW5jZVRpbWUgPSBjb25maWcuc2hvdWxkQWR2YW5jZVRpbWUgfHwgZmFsc2U7XG4gICAgICAgIGNvbmZpZy5hZHZhbmNlVGltZURlbHRhID0gY29uZmlnLmFkdmFuY2VUaW1lRGVsdGEgfHwgMjA7XG4gICAgICAgIGNvbmZpZy5zaG91bGRDbGVhck5hdGl2ZVRpbWVycyA9XG4gICAgICAgICAgICBjb25maWcuc2hvdWxkQ2xlYXJOYXRpdmVUaW1lcnMgfHwgZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaGFzVG9GYWtlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgXCJ0b0Zha2VcIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaGFzVG9Ob3RGYWtlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgXCJ0b05vdEZha2VcIixcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGFzVG9GYWtlICYmIGhhc1RvTm90RmFrZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcImNvbmZpZy50b0Zha2UgYW5kIGNvbmZpZy50b05vdEZha2UgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLnRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcImNvbmZpZy50YXJnZXQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGB3aXRoR2xvYmFsKHRhcmdldClgIGluc3RlYWQuXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXMgYSBtaXNzaW5nIHRpbWVyIG9yIEFQSSBuYW1lIGR1cmluZyBpbnN0YWxsYXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lciAtIHRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIHRpbWVyIG9yIG9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlTWlzc2luZ1RpbWVyKHRpbWVyKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmlnbm9yZU1pc3NpbmdUaW1lcnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgICBgbm9uLWV4aXN0ZW50IHRpbWVycyBhbmQvb3Igb2JqZWN0cyBjYW5ub3QgYmUgZmFrZWQ6ICcke3RpbWVyfSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpLCBsO1xuICAgICAgICBjb25zdCBjbG9jayA9IGNyZWF0ZUNsb2NrKGNvbmZpZy5ub3csIGNvbmZpZy5sb29wTGltaXQpO1xuICAgICAgICBjbG9jay5zaG91bGRDbGVhck5hdGl2ZVRpbWVycyA9IGNvbmZpZy5zaG91bGRDbGVhck5hdGl2ZVRpbWVycztcblxuICAgICAgICBjbG9jay5hYm9ydExpc3RlbmVyTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIGlmIChoYXNUb0Zha2UpIHtcbiAgICAgICAgICAgIGNsb2NrLm1ldGhvZHMgPSAvKiogQHR5cGUge0Zha2VNZXRob2RbXX0gKi8gKGNvbmZpZy50b0Zha2UgfHwgW10pO1xuICAgICAgICAgICAgaWYgKGNsb2NrLm1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2xvY2subWV0aG9kcyA9IC8qKiBAdHlwZSB7RmFrZU1ldGhvZFtdfSAqLyAoXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbWVycylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGhhc1RvTm90RmFrZSkge1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kc1RvTm90RmFrZSA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChcbiAgICAgICAgICAgICAgICBjb25maWcudG9Ob3RGYWtlIHx8IFtdXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY2xvY2subWV0aG9kcyA9IC8qKiBAdHlwZSB7RmFrZU1ldGhvZFtdfSAqLyAoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGltZXJzKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChtZXRob2QpID0+ICFtZXRob2RzVG9Ob3RGYWtlLmluY2x1ZGVzKG1ldGhvZCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsb2NrLm1ldGhvZHMgPSAvKiogQHR5cGUge0Zha2VNZXRob2RbXX0gKi8gKE9iamVjdC5rZXlzKHRpbWVycykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2xvY2suc2V0VGlja01vZGUoe1xuICAgICAgICAgICAgICAgIG1vZGU6IFwiaW50ZXJ2YWxcIixcbiAgICAgICAgICAgICAgICBkZWx0YTogY29uZmlnLmFkdmFuY2VUaW1lRGVsdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbG9jay5tZXRob2RzLmluY2x1ZGVzKFwicGVyZm9ybWFuY2VcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzUGVyZm9ybWFuY2VDb25zdHJ1Y3RvclByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2dsb2JhbC5wZXJmb3JtYW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoYXNQZXJmb3JtYW5jZVByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2dsb2JhbC5QZXJmb3JtYW5jZS5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIGlmIChwcm90bykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9PSBcIm5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZVtuYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5pbmRleE9mKFwiZ2V0RW50cmllc1wiKSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5PT1BfQVJSQVlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOT09QO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZW5zdXJlIGBtYXJrYCByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyB2YWxpZFxuICAgICAgICAgICAgICAgIGNsb2NrLnBlcmZvcm1hbmNlLm1hcmsgPSAobmFtZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IEZha2VQZXJmb3JtYW5jZUVudHJ5KG5hbWUsIFwibWFya1wiLCAwLCAwKTtcbiAgICAgICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZS5tZWFzdXJlID0gKG5hbWUpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGYWtlUGVyZm9ybWFuY2VFbnRyeShuYW1lLCBcIm1lYXN1cmVcIiwgMCwgMTAwKTtcbiAgICAgICAgICAgICAgICAvLyBgdGltZU9yaWdpbmAgc2hvdWxkIHJldHVybiB0aGUgdGltZSBvZiB3aGVuIHRoZSBXaW5kb3cgc2Vzc2lvbiBzdGFydGVkXG4gICAgICAgICAgICAgICAgLy8gKG9yIHRoZSBXb3JrZXIgd2FzIGluc3RhbGxlZClcbiAgICAgICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZS50aW1lT3JpZ2luID0gZ2V0RXBvY2goY29uZmlnLm5vdyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChjb25maWcudG9GYWtlIHx8IFtdKS5pbmNsdWRlcyhcInBlcmZvcm1hbmNlXCIpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlTWlzc2luZ1RpbWVyKFwicGVyZm9ybWFuY2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9nbG9iYWwgPT09IGdsb2JhbE9iamVjdCAmJiB0aW1lcnNNb2R1bGUpIHtcbiAgICAgICAgICAgIGNsb2NrLnRpbWVyc01vZHVsZU1ldGhvZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2dsb2JhbCA9PT0gZ2xvYmFsT2JqZWN0ICYmIHRpbWVyc1Byb21pc2VzTW9kdWxlKSB7XG4gICAgICAgICAgICBjbG9jay50aW1lcnNQcm9taXNlc01vZHVsZU1ldGhvZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gY2xvY2subWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVPZk1ldGhvZFRvUmVwbGFjZSA9IGNsb2NrLm1ldGhvZHNbaV07XG5cbiAgICAgICAgICAgIGlmICghaXNQcmVzZW50W25hbWVPZk1ldGhvZFRvUmVwbGFjZV0pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNaXNzaW5nVGltZXIobmFtZU9mTWV0aG9kVG9SZXBsYWNlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5hbWVPZk1ldGhvZFRvUmVwbGFjZSA9PT0gXCJocnRpbWVcIikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgX2dsb2JhbC5wcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MuaHJ0aW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaGlqYWNrTWV0aG9kKF9nbG9iYWwucHJvY2VzcywgbmFtZU9mTWV0aG9kVG9SZXBsYWNlLCBjbG9jayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lT2ZNZXRob2RUb1JlcGxhY2UgPT09IFwibmV4dFRpY2tcIikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgX2dsb2JhbC5wcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2sgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBoaWphY2tNZXRob2QoX2dsb2JhbC5wcm9jZXNzLCBuYW1lT2ZNZXRob2RUb1JlcGxhY2UsIGNsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhpamFja01ldGhvZChfZ2xvYmFsLCBuYW1lT2ZNZXRob2RUb1JlcGxhY2UsIGNsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjbG9jay50aW1lcnNNb2R1bGVNZXRob2RzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICB0aW1lcnNNb2R1bGVbbmFtZU9mTWV0aG9kVG9SZXBsYWNlXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSB0aW1lcnNNb2R1bGVbbmFtZU9mTWV0aG9kVG9SZXBsYWNlXTtcbiAgICAgICAgICAgICAgICBjbG9jay50aW1lcnNNb2R1bGVNZXRob2RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lOiBuYW1lT2ZNZXRob2RUb1JlcGxhY2UsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aW1lcnNNb2R1bGVbbmFtZU9mTWV0aG9kVG9SZXBsYWNlXSA9XG4gICAgICAgICAgICAgICAgICAgIF9nbG9iYWxbbmFtZU9mTWV0aG9kVG9SZXBsYWNlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjbG9jay50aW1lcnNQcm9taXNlc01vZHVsZU1ldGhvZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lT2ZNZXRob2RUb1JlcGxhY2UgPT09IFwic2V0VGltZW91dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnRpbWVyc1Byb21pc2VzTW9kdWxlTWV0aG9kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWU6IFwic2V0VGltZW91dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRpbWVyc1Byb21pc2VzTW9kdWxlLnNldFRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyc1Byb21pc2VzTW9kdWxlLnNldFRpbWVvdXQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9LFxuICAgICAgICAgICAgICAgICAgICApID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFib3J0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suYWJvcnRMaXN0ZW5lck1hcC5kZWxldGUoYWJvcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgc2FmZSwgdGhlcmUgaXMgbm8gY29kZSBwYXRoIHRoYXQgbGVhZHMgdG8gdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBpbnZva2VkIGJlZm9yZSBoYW5kbGUgaGFzIGJlZW4gYXNzaWduZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5jbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG9wdGlvbnMuc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGNsb2NrLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmFib3J0TGlzdGVuZXJNYXAuZGVsZXRlKGFib3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRlbGF5KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmFib3J0TGlzdGVuZXJNYXAuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZU9mTWV0aG9kVG9SZXBsYWNlID09PSBcInNldEltbWVkaWF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnRpbWVyc1Byb21pc2VzTW9kdWxlTWV0aG9kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWU6IFwic2V0SW1tZWRpYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbDogdGltZXJzUHJvbWlzZXNNb2R1bGUuc2V0SW1tZWRpYXRlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aW1lcnNQcm9taXNlc01vZHVsZS5zZXRJbW1lZGlhdGUgPSAodmFsdWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5hYm9ydExpc3RlbmVyTWFwLmRlbGV0ZShhYm9ydCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBzYWZlLCB0aGVyZSBpcyBubyBjb2RlIHBhdGggdGhhdCBsZWFkcyB0byB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlaW5nIGludm9rZWQgYmVmb3JlIGhhbmRsZSBoYXMgYmVlbiBhc3NpZ25lZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChvcHRpb25zLnNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBjbG9jay5zZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmFib3J0TGlzdGVuZXJNYXAuZGVsZXRlKGFib3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFib3J0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suYWJvcnRMaXN0ZW5lck1hcC5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lT2ZNZXRob2RUb1JlcGxhY2UgPT09IFwic2V0SW50ZXJ2YWxcIikge1xuICAgICAgICAgICAgICAgICAgICBjbG9jay50aW1lcnNQcm9taXNlc01vZHVsZU1ldGhvZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lOiBcInNldEludGVydmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbDogdGltZXJzUHJvbWlzZXNNb2R1bGUuc2V0SW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyc1Byb21pc2VzTW9kdWxlLnNldEludGVydmFsID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZVJlc29sdmFibGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPHVua25vd24+ICYgeyByZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQ7IHJlamVjdDogKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCB9fSAqLyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNUaHJvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuQ2FsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dEF2YWlsYWJsZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFF1ZXVlID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBjbG9jay5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFF1ZXVlLnNoaWZ0KCkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEF2YWlsYWJsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGVsYXkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFib3J0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suYWJvcnRMaXN0ZW5lck1hcC5kZWxldGUoYWJvcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmNsZWFySW50ZXJ2YWwoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2YWJsZSBvZiBuZXh0UXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmFibGUucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5hYm9ydExpc3RlbmVyTWFwLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWduYWw/LmFib3J0ZWQgJiYgIWhhc1Rocm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Rocm93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3B0aW9ucy5zaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRBdmFpbGFibGUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEF2YWlsYWJsZS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2YWJsZSA9IGNyZWF0ZVJlc29sdmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRRdWV1ZS5wdXNoKHJlc29sdmFibGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZhYmxlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuQ2FsbCAmJiBuZXh0UXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ2FsbC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCAmJiAhaGFzVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGhyb3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcHRpb25zLnNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNhbGwgPSBjcmVhdGVSZXNvbHZhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmV0dXJuQ2FsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suY2xlYXJJbnRlcnZhbChoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5hYm9ydExpc3RlbmVyTWFwLmRlbGV0ZShhYm9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb2NrO1xuICAgIH1cblxuICAgIC8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGltZXJzOiB0aW1lcnMsXG4gICAgICAgIGNyZWF0ZUNsb2NrOiBjcmVhdGVDbG9jayxcbiAgICAgICAgaW5zdGFsbDogaW5zdGFsbCxcbiAgICAgICAgd2l0aEdsb2JhbDogd2l0aEdsb2JhbCxcbiAgICB9O1xufVxuXG4vKiogQHR5cGUge0Zha2VUaW1lcnN9ICovXG5jb25zdCBkZWZhdWx0SW1wbGVtZW50YXRpb24gPSB3aXRoR2xvYmFsKGdsb2JhbE9iamVjdCk7XG5cbmV4cG9ydHMudGltZXJzID0gZGVmYXVsdEltcGxlbWVudGF0aW9uLnRpbWVycztcbmV4cG9ydHMuY3JlYXRlQ2xvY2sgPSBkZWZhdWx0SW1wbGVtZW50YXRpb24uY3JlYXRlQ2xvY2s7XG5leHBvcnRzLmluc3RhbGwgPSBkZWZhdWx0SW1wbGVtZW50YXRpb24uaW5zdGFsbDtcbi8qKiBAdHlwZSB7V2l0aEdsb2JhbH0gKi9cbmV4cG9ydHMud2l0aEdsb2JhbCA9IHdpdGhHbG9iYWw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnLi9jb3JlL2V4dGVuZC5qcycpO1xudmFyIEZha2VUaW1lcnMgPSByZXF1aXJlKCdAc2lub25qcy9mYWtlLXRpbWVycycpO1xudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIEZha2VUaW1lcnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KEZha2VUaW1lcnMpO1xudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IGdsb2JhbDogZ2xvYmFsT2JqZWN0IH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBjb25maWdcbiAqIEBwYXJhbSBnbG9iYWxDdHhcbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgY2xvY2ssIGFmdGVyIGluc3RhbGxpbmcgaXQgb24gdGhlIGdsb2JhbCBjb250ZXh0LCBpZiBnaXZlblxuICovXG5mdW5jdGlvbiBjcmVhdGVDbG9jayhjb25maWcsIGdsb2JhbEN0eCkge1xuICAgIGxldCBGYWtlVGltZXJzQ3R4ID0gRmFrZVRpbWVyc19fZGVmYXVsdC5kZWZhdWx0O1xuICAgIGlmIChnbG9iYWxDdHggIT09IG51bGwgJiYgdHlwZW9mIGdsb2JhbEN0eCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBGYWtlVGltZXJzQ3R4ID0gRmFrZVRpbWVyc19fZGVmYXVsdC5kZWZhdWx0LndpdGhHbG9iYWwoZ2xvYmFsQ3R4KTtcbiAgICB9XG4gICAgY29uc3QgY2xvY2sgPSBGYWtlVGltZXJzQ3R4Lmluc3RhbGwoY29uZmlnKTtcbiAgICBjbG9jay5yZXN0b3JlID0gY2xvY2sudW5pbnN0YWxsO1xuICAgIHJldHVybiBjbG9jaztcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIGdsb2JhbFByb3BOYW1lXG4gKi9cbmZ1bmN0aW9uIGFkZElmRGVmaW5lZChvYmosIGdsb2JhbFByb3BOYW1lKSB7XG4gICAgY29uc3QgZ2xvYmFsUHJvcCA9IGdsb2JhbE9iamVjdFtnbG9iYWxQcm9wTmFtZV07XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxQcm9wICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG9ialtnbG9iYWxQcm9wTmFtZV0gPSBnbG9iYWxQcm9wO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfG9iamVjdH0gZGF0ZU9yQ29uZmlnIFRoZSB1bml4IGVwb2NoIHZhbHVlIHRvIGluc3RhbGwgd2l0aCAoZGVmYXVsdCAwKVxuICogQHJldHVybnMge29iamVjdH0gUmV0dXJucyBhIGxvbGV4IGNsb2NrIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIHVzZUZha2VUaW1lcnMoZGF0ZU9yQ29uZmlnKSB7XG4gICAgY29uc3QgaGFzQXJndW1lbnRzID0gdHlwZW9mIGRhdGVPckNvbmZpZyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICBjb25zdCBhcmd1bWVudElzRGF0ZUxpa2UgPVxuICAgICAgICAodHlwZW9mIGRhdGVPckNvbmZpZyA9PT0gXCJudW1iZXJcIiB8fCBkYXRlT3JDb25maWcgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuICAgIGNvbnN0IGFyZ3VtZW50SXNPYmplY3QgPVxuICAgICAgICBkYXRlT3JDb25maWcgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGRhdGVPckNvbmZpZyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuXG4gICAgaWYgKCFoYXNBcmd1bWVudHMpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNsb2NrKHtcbiAgICAgICAgICAgIG5vdzogMCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50SXNEYXRlTGlrZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQ2xvY2soe1xuICAgICAgICAgICAgbm93OiBkYXRlT3JDb25maWcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudElzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGV4dGVuZC5ub25FbnVtKHt9LCBkYXRlT3JDb25maWcpO1xuICAgICAgICBjb25zdCBnbG9iYWxDdHggPSBjb25maWcuZ2xvYmFsO1xuICAgICAgICBkZWxldGUgY29uZmlnLmdsb2JhbDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNsb2NrKGNvbmZpZywgZ2xvYmFsQ3R4KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcInVzZUZha2VUaW1lcnMgZXhwZWN0ZWQgZXBvY2ggb3IgY29uZmlnIG9iamVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5vbmpzL3Npbm9uXCIsXG4gICAgKTtcbn1cblxuY29uc3QgY2xvY2sgPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgIHJldHVybiBGYWtlVGltZXJzX19kZWZhdWx0LmRlZmF1bHQuY3JlYXRlQ2xvY2sobm93KTtcbiAgICB9LFxufTtcblxuY29uc3QgdGltZXJzID0ge1xuICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBjbGVhclRpbWVvdXQsXG4gICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgRGF0ZTogRGF0ZSxcbn07XG5hZGRJZkRlZmluZWQodGltZXJzLCBcInNldEltbWVkaWF0ZVwiKTtcbmFkZElmRGVmaW5lZCh0aW1lcnMsIFwiY2xlYXJJbW1lZGlhdGVcIik7XG5hZGRJZkRlZmluZWQodGltZXJzLCBcIlRlbXBvcmFsXCIpO1xuYWRkSWZEZWZpbmVkKHRpbWVycywgXCJwZXJmb3JtYW5jZVwiKTtcbmFkZElmRGVmaW5lZCh0aW1lcnMsIFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIpO1xuYWRkSWZEZWZpbmVkKHRpbWVycywgXCJjYW5jZWxBbmltYXRpb25GcmFtZVwiKTtcbmFkZElmRGVmaW5lZCh0aW1lcnMsIFwicmVxdWVzdElkbGVDYWxsYmFja1wiKTtcbmFkZElmRGVmaW5lZCh0aW1lcnMsIFwiY2FuY2VsSWRsZUNhbGxiYWNrXCIpO1xuYWRkSWZEZWZpbmVkKHRpbWVycywgXCJocnRpbWVcIik7XG5hZGRJZkRlZmluZWQodGltZXJzLCBcIm5leHRUaWNrXCIpO1xuYWRkSWZEZWZpbmVkKHRpbWVycywgXCJxdWV1ZU1pY3JvdGFza1wiKTtcblxuZXhwb3J0cy5jbG9jayA9IGNsb2NrO1xuZXhwb3J0cy50aW1lcnMgPSB0aW1lcnM7XG5leHBvcnRzLnVzZUZha2VUaW1lcnMgPSB1c2VGYWtlVGltZXJzO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IHByb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcblxuY29uc3QgeyBwdXNoIH0gPSBwcm90b3R5cGVzLmFycmF5O1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaW5vbkZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLnVua25vd259IGFyZ3NcbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlbGVnYXRlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gYXJnc1xuICogQHJldHVybnMge3Vua25vd259XG4gKi9cblxuLyoqXG4gKiBJbmNyZW1lbnRzIHRoZSBjYWxsIGNvdW50IG9mIGEgcHJveHkgYW5kIHVwZGF0ZXMgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm94eSBUaGUgcHJveHkgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluY3JlbWVudENhbGxDb3VudChwcm94eSkge1xuICAgIHByb3h5LmNhbGxlZCA9IHRydWU7XG4gICAgcHJveHkuY2FsbENvdW50ICs9IDE7XG4gICAgcHJveHkubm90Q2FsbGVkID0gZmFsc2U7XG4gICAgcHJveHkuY2FsbGVkT25jZSA9IHByb3h5LmNhbGxDb3VudCA9PT0gMTtcbiAgICBwcm94eS5jYWxsZWRUd2ljZSA9IHByb3h5LmNhbGxDb3VudCA9PT0gMjtcbiAgICBwcm94eS5jYWxsZWRUaHJpY2UgPSBwcm94eS5jYWxsQ291bnQgPT09IDM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBwcm9wZXJ0aWVzIG9uIGEgcHJveHkgdGhhdCBwb2ludCB0byBzcGVjaWZpYyBjYWxscyAoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGxhc3QpLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm94eSBUaGUgcHJveHkgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhbGxQcm9wZXJ0aWVzKHByb3h5KSB7XG4gICAgcHJveHkuZmlyc3RDYWxsID0gcHJveHkuZ2V0Q2FsbCgwKTtcbiAgICBwcm94eS5zZWNvbmRDYWxsID0gcHJveHkuZ2V0Q2FsbCgxKTtcbiAgICBwcm94eS50aGlyZENhbGwgPSBwcm94eS5nZXRDYWxsKDIpO1xuICAgIHByb3h5Lmxhc3RDYWxsID0gcHJveHkuZ2V0Q2FsbChwcm94eS5jYWxsQ291bnQgLSAxKTtcbn1cblxuLyoqXG4gKiBEZWxlZ2F0ZXMgYSBwcm94eSBtZXRob2QgY2FsbCB0byBhbGwgaXRzIGluZGl2aWR1YWwgY2FsbHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHByb3h5IFRoZSBwcm94eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG1hdGNoQW55IFdoZXRoZXIgdG8gcmV0dXJuIHRydWUgaWYgYW55IGNhbGwgbWF0Y2hlc1xuICogQHBhcmFtIHtzdHJpbmd9IFthY3R1YWxdIFRoZSBhY3R1YWwgbWV0aG9kIG5hbWUgb24gdGhlIGNhbGwgb2JqZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXR1cm5zVmFsdWVzXSBXaGV0aGVyIHRvIHJldHVybiBhbiBhcnJheSBvZiByZXR1cm4gdmFsdWVzXG4gKiBAcGFyYW0ge0RlbGVnYXRlQ2FsbGJhY2t9IFtub3RDYWxsZWRdIEZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIHByb3h5IGhhcyBub3QgYmVlbiBjYWxsZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdG90YWxDYWxsQ291bnRdIFRoZSBleHBlY3RlZCB0b3RhbCBjYWxsIGNvdW50XG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlVG9DYWxscyhcbiAgICBwcm94eSxcbiAgICBtZXRob2QsXG4gICAgbWF0Y2hBbnksXG4gICAgYWN0dWFsLFxuICAgIHJldHVybnNWYWx1ZXMsXG4gICAgbm90Q2FsbGVkLFxuICAgIHRvdGFsQ2FsbENvdW50LFxuKSB7XG4gICAgcHJveHlbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCkge1xuICAgICAgICAgICAgaWYgKG5vdENhbGxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3RDYWxsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b3RhbENhbGxDb3VudCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY2FsbENvdW50ICE9PSB0b3RhbENhbGxDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbnRDYWxsO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IDA7XG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlcyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5jYWxsQ291bnQ7IGkgPCBsOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDYWxsID0gdGhpcy5nZXRDYWxsKGkpO1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBjdXJyZW50Q2FsbFthY3R1YWwgfHwgbWV0aG9kXS5hcHBseShcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbCxcbiAgICAgICAgICAgICAgICBhcmd1bWVudHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHVzaChyZXR1cm5WYWx1ZXMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaEFueSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0dXJuc1ZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcyA9PT0gdGhpcy5jYWxsQ291bnQ7XG4gICAgfTtcbn1cblxuZXhwb3J0cy5jcmVhdGVDYWxsUHJvcGVydGllcyA9IGNyZWF0ZUNhbGxQcm9wZXJ0aWVzO1xuZXhwb3J0cy5kZWxlZ2F0ZVRvQ2FsbHMgPSBkZWxlZ2F0ZVRvQ2FsbHM7XG5leHBvcnRzLmluY3JlbWVudENhbGxDb3VudCA9IGluY3JlbWVudENhbGxDb3VudDtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xudmFyIHByb3h5Q2FsbFV0aWwgPSByZXF1aXJlKCcuL3Byb3h5LWNhbGwtdXRpbC5qcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcblxuY29uc3QgeyBwcm90b3R5cGVzIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5cbmNvbnN0IHsgcHVzaCwgZm9yRWFjaCwgY29uY2F0IH0gPSBwcm90b3R5cGVzLmFycmF5O1xuY29uc3QgRXJyb3JDb25zdHJ1Y3RvciA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG5sZXQgY2FsbElkID0gMDtcbmNvbnN0IG1heFNhZmVJbnRlZ2VyID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cbi8qKlxuICogQGNhbGxiYWNrIFNpbm9uRnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gYXJnc1xuICogQHJldHVybnMge3Vua25vd259XG4gKi9cblxuLyoqXG4gKiBJbnZva2VzIGEgcHJveHkgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtTaW5vbkZ1bmN0aW9ufSBmdW5jIFRoZSBvcmlnaW5hbCBmdW5jdGlvblxuICogQHBhcmFtIHt1bmtub3dufSB0aGlzVmFsdWUgVGhlIGB0aGlzYCBjb250ZXh0IGZvciB0aGUgY2FsbFxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgY2FsbFxuICogQHJldHVybnMge3Vua25vd259IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxcbiAqL1xuZnVuY3Rpb24gaW52b2tlKGZ1bmMsIHRoaXNWYWx1ZSwgYXJncykge1xuICAgIGNvbnN0IG1hdGNoaW5ncyA9IHRoaXMubWF0Y2hpbmdGYWtlcyhhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50Q2FsbElkID0gY2FsbElkO1xuICAgIGNhbGxJZCA9IGNhbGxJZCA+PSBtYXhTYWZlSW50ZWdlciA/IDAgOiBjYWxsSWQgKyAxO1xuICAgIGxldCBleGNlcHRpb24sIHJldHVyblZhbHVlO1xuXG4gICAgcHJveHlDYWxsVXRpbC5pbmNyZW1lbnRDYWxsQ291bnQodGhpcyk7XG4gICAgcHVzaCh0aGlzLnRoaXNWYWx1ZXMsIHRoaXNWYWx1ZSk7XG4gICAgcHVzaCh0aGlzLmFyZ3MsIGFyZ3MpO1xuICAgIHB1c2godGhpcy5jYWxsSWRzLCBjdXJyZW50Q2FsbElkKTtcbiAgICBmb3JFYWNoKG1hdGNoaW5ncywgZnVuY3Rpb24gKG1hdGNoaW5nKSB7XG4gICAgICAgIHByb3h5Q2FsbFV0aWwuaW5jcmVtZW50Q2FsbENvdW50KG1hdGNoaW5nKTtcbiAgICAgICAgcHVzaChtYXRjaGluZy50aGlzVmFsdWVzLCB0aGlzVmFsdWUpO1xuICAgICAgICBwdXNoKG1hdGNoaW5nLmFyZ3MsIGFyZ3MpO1xuICAgICAgICBwdXNoKG1hdGNoaW5nLmNhbGxJZHMsIGN1cnJlbnRDYWxsSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gTWFrZSBjYWxsIHByb3BlcnRpZXMgYXZhaWxhYmxlIGZyb20gd2l0aGluIHRoZSBzcGllZCBmdW5jdGlvbjpcbiAgICBwcm94eUNhbGxVdGlsLmNyZWF0ZUNhbGxQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIGZvckVhY2gobWF0Y2hpbmdzLCBwcm94eUNhbGxVdGlsLmNyZWF0ZUNhbGxQcm9wZXJ0aWVzKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHRoaXMuaW52b2tpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHRoaXNDYWxsID0gdGhpcy5nZXRDYWxsKHRoaXMuY2FsbENvdW50IC0gMSk7XG5cbiAgICAgICAgaWYgKHRoaXNDYWxsLmNhbGxlZFdpdGhOZXcoKSkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aHJvdWdoIHdpdGggYG5ld2BcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gbmV3IChiaW5kLmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMuZnVuYyB8fCBmdW5jLFxuICAgICAgICAgICAgICAgIGNvbmNhdChbdGhpc1ZhbHVlXSwgYXJncyksXG4gICAgICAgICAgICApKSgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJldHVyblZhbHVlICE9PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJldHVyblZhbHVlICE9PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gdGhpc1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAodGhpcy5mdW5jIHx8IGZ1bmMpLmFwcGx5KHRoaXNWYWx1ZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW52b2tpbmc7XG4gICAgfVxuXG4gICAgcHVzaCh0aGlzLmV4Y2VwdGlvbnMsIGV4Y2VwdGlvbik7XG4gICAgcHVzaCh0aGlzLnJldHVyblZhbHVlcywgcmV0dXJuVmFsdWUpO1xuICAgIGZvckVhY2gobWF0Y2hpbmdzLCBmdW5jdGlvbiAobWF0Y2hpbmcpIHtcbiAgICAgICAgcHVzaChtYXRjaGluZy5leGNlcHRpb25zLCBleGNlcHRpb24pO1xuICAgICAgICBwdXNoKG1hdGNoaW5nLnJldHVyblZhbHVlcywgcmV0dXJuVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yQ29uc3RydWN0b3IoKTtcbiAgICAvLyAxLiBQbGVhc2UgZG8gbm90IGdldCBzdGFjayBhdCB0aGlzIHBvaW50LiBJdCBtYXkgYmUgc28gdmVyeSBzbG93LCBhbmQgbm90IGFjdHVhbGx5IHVzZWRcbiAgICAvLyAyLiBQaGFudG9tSlMgZG9lcyBub3Qgc2VyaWFsaXplIHRoZSBzdGFjayB0cmFjZSB1bnRpbCB0aGUgZXJyb3IgaGFzIGJlZW4gdGhyb3duOlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yL1N0YWNrXG4gICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLyogZW1wdHkgKi9cbiAgICB9XG4gICAgcHVzaCh0aGlzLmVycm9yc1dpdGhDYWxsU3RhY2ssIGVycik7XG4gICAgZm9yRWFjaChtYXRjaGluZ3MsIGZ1bmN0aW9uIChtYXRjaGluZykge1xuICAgICAgICBwdXNoKG1hdGNoaW5nLmVycm9yc1dpdGhDYWxsU3RhY2ssIGVycik7XG4gICAgfSk7XG5cbiAgICAvLyBNYWtlIHJldHVybiB2YWx1ZSBhbmQgZXhjZXB0aW9uIGF2YWlsYWJsZSBpbiB0aGUgY2FsbHM6XG4gICAgcHJveHlDYWxsVXRpbC5jcmVhdGVDYWxsUHJvcGVydGllcyh0aGlzKTtcbiAgICBmb3JFYWNoKG1hdGNoaW5ncywgcHJveHlDYWxsVXRpbC5jcmVhdGVDYWxsUHJvcGVydGllcyk7XG5cbiAgICBpZiAoZXhjZXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnZva2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBzYW1zYW0gPSByZXF1aXJlKCdAc2lub25qcy9zYW1zYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcbnZhciBzYW1zYW1fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KHNhbXNhbSk7XG5cbmNvbnN0IHsgcHJvdG90eXBlcywgZnVuY3Rpb25OYW1lLCB2YWx1ZVRvU3RyaW5nIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGNyZWF0ZU1hdGNoZXI6IG1hdGNoLCBkZWVwRXF1YWwgfSA9IHNhbXNhbV9fZGVmYXVsdC5kZWZhdWx0O1xuY29uc3QgeyBjb25jYXQsIGZpbHRlciwgam9pbiwgbWFwLCByZWR1Y2UsIHNsaWNlIH0gPSBwcm90b3R5cGVzLmFycmF5O1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaW5vbkZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLnVua25vd259IGFyZ3NcbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICovXG5cbi8qKlxuICogQHBhcmFtIHByb3h5XG4gKiBAcGFyYW0gdGV4dFxuICogQHBhcmFtIGFyZ3NcbiAqL1xuZnVuY3Rpb24gdGhyb3dZaWVsZEVycm9yKHByb3h5LCB0ZXh0LCBhcmdzKSB7XG4gICAgbGV0IG1zZyA9IGZ1bmN0aW9uTmFtZShwcm94eSkgKyB0ZXh0O1xuICAgIGlmIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBtc2cgKz0gYCBSZWNlaXZlZCBbJHtqb2luKHNsaWNlKGFyZ3MpLCBcIiwgXCIpfV1gO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxuY29uc3QgY2FsbFByb3RvID0ge1xuICAgIGNhbGxlZE9uOiBmdW5jdGlvbiBjYWxsZWRPbih0aGlzVmFsdWUpIHtcbiAgICAgICAgaWYgKG1hdGNoLmlzTWF0Y2hlcih0aGlzVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1ZhbHVlLnRlc3QodGhpcy50aGlzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRoaXNWYWx1ZSA9PT0gdGhpc1ZhbHVlO1xuICAgIH0sXG5cbiAgICBjYWxsZWRXaXRoOiBmdW5jdGlvbiBjYWxsZWRXaXRoKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgY2FsbGVkV2l0aEFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoQXJncy5sZW5ndGggPiBzZWxmLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgICAgICAgY2FsbGVkV2l0aEFyZ3MsXG4gICAgICAgICAgICBmdW5jdGlvbiAocHJldiwgYXJnLCBpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgJiYgZGVlcEVxdWFsKHNlbGYuYXJnc1tpXSwgYXJnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBjYWxsZWRXaXRoTWF0Y2g6IGZ1bmN0aW9uIGNhbGxlZFdpdGhNYXRjaCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxlZFdpdGhNYXRjaEFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoTWF0Y2hBcmdzLmxlbmd0aCA+IHNlbGYuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWR1Y2UoXG4gICAgICAgICAgICBjYWxsZWRXaXRoTWF0Y2hBcmdzLFxuICAgICAgICAgICAgZnVuY3Rpb24gKHByZXYsIGV4cGVjdGF0aW9uLCBpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gc2VsZi5hcmdzW2ldO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgJiYgbWF0Y2goZXhwZWN0YXRpb24pLnRlc3QoYWN0dWFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBjYWxsZWRXaXRoRXhhY3RseTogZnVuY3Rpb24gY2FsbGVkV2l0aEV4YWN0bHkoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBhcmd1bWVudHMubGVuZ3RoID09PSB0aGlzLmFyZ3MubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLmNhbGxlZFdpdGguYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBub3RDYWxsZWRXaXRoOiBmdW5jdGlvbiBub3RDYWxsZWRXaXRoKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2FsbGVkV2l0aC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBub3RDYWxsZWRXaXRoTWF0Y2g6IGZ1bmN0aW9uIG5vdENhbGxlZFdpdGhNYXRjaCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNhbGxlZFdpdGhNYXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICByZXR1cm5lZDogZnVuY3Rpb24gcmV0dXJuZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbCh0aGlzLnJldHVyblZhbHVlLCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIHRocmV3OiBmdW5jdGlvbiB0aHJldyhlcnJvcikge1xuICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInVuZGVmaW5lZFwiIHx8ICF0aGlzLmV4Y2VwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5leGNlcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjZXB0aW9uID09PSBlcnJvciB8fCB0aGlzLmV4Y2VwdGlvbi5uYW1lID09PSBlcnJvcjtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aE5ldzogZnVuY3Rpb24gY2FsbGVkV2l0aE5ldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkucHJvdG90eXBlICYmIHRoaXMudGhpc1ZhbHVlIGluc3RhbmNlb2YgdGhpcy5wcm94eTtcbiAgICB9LFxuXG4gICAgY2FsbGVkQmVmb3JlOiBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbElkIDwgb3RoZXIuY2FsbElkO1xuICAgIH0sXG5cbiAgICBjYWxsZWRBZnRlcjogZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA+IG90aGVyLmNhbGxJZDtcbiAgICB9LFxuXG4gICAgY2FsbGVkSW1tZWRpYXRlbHlCZWZvcmU6IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWQgPT09IG90aGVyLmNhbGxJZCAtIDE7XG4gICAgfSxcblxuICAgIGNhbGxlZEltbWVkaWF0ZWx5QWZ0ZXI6IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWQgPT09IG90aGVyLmNhbGxJZCArIDE7XG4gICAgfSxcblxuICAgIGNhbGxBcmc6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVBcmdJc0FGdW5jdGlvbihwb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzW3Bvc10oKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ09uOiBmdW5jdGlvbiAocG9zLCB0aGlzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVBcmdJc0FGdW5jdGlvbihwb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzW3Bvc10uYXBwbHkodGhpc1ZhbHVlKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ1dpdGg6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFyZ09uV2l0aC5hcHBseShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjb25jYXQoW3BvcywgbnVsbF0sIHNsaWNlKGFyZ3VtZW50cywgMSkpLFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBjYWxsQXJnT25XaXRoOiBmdW5jdGlvbiAocG9zLCB0aGlzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVBcmdJc0FGdW5jdGlvbihwb3MpO1xuICAgICAgICBjb25zdCBhcmdzID0gc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJnc1twb3NdLmFwcGx5KHRoaXNWYWx1ZSwgYXJncyk7XG4gICAgfSxcblxuICAgIHRocm93QXJnOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPiB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBOb3QgZW5vdWdoIGFyZ3VtZW50czogJHtwb3N9IHJlcXVpcmVkIGJ1dCBvbmx5ICR7dGhpcy5hcmdzLmxlbmd0aH0gcHJlc2VudGAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgdGhpcy5hcmdzW3Bvc107XG4gICAgfSxcblxuICAgIHlpZWxkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkT24uYXBwbHkodGhpcywgY29uY2F0KFtudWxsXSwgc2xpY2UoYXJndW1lbnRzLCAwKSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZE9uOiBmdW5jdGlvbiAodGhpc1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBzbGljZSh0aGlzLmFyZ3MpO1xuICAgICAgICBjb25zdCB5aWVsZEZuID0gZmlsdGVyKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH0pWzBdO1xuXG4gICAgICAgIGlmICgheWllbGRGbikge1xuICAgICAgICAgICAgdGhyb3dZaWVsZEVycm9yKFxuICAgICAgICAgICAgICAgIHRoaXMucHJveHksXG4gICAgICAgICAgICAgICAgXCIgY2Fubm90IHlpZWxkIHNpbmNlIG5vIGNhbGxiYWNrIHdhcyBwYXNzZWQuXCIsXG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geWllbGRGbi5hcHBseSh0aGlzVmFsdWUsIHNsaWNlKGFyZ3VtZW50cywgMSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZFRvOiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZFRvT24uYXBwbHkoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgY29uY2F0KFtwcm9wLCBudWxsXSwgc2xpY2UoYXJndW1lbnRzLCAxKSksXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIHlpZWxkVG9PbjogZnVuY3Rpb24gKHByb3AsIHRoaXNWYWx1ZSkge1xuICAgICAgICBjb25zdCBhcmdzID0gc2xpY2UodGhpcy5hcmdzKTtcbiAgICAgICAgY29uc3QgeWllbGRBcmcgPSBmaWx0ZXIoYXJncywgZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnW3Byb3BdID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICBjb25zdCB5aWVsZEZuID0geWllbGRBcmcgJiYgeWllbGRBcmdbcHJvcF07XG5cbiAgICAgICAgaWYgKCF5aWVsZEZuKSB7XG4gICAgICAgICAgICB0aHJvd1lpZWxkRXJyb3IoXG4gICAgICAgICAgICAgICAgdGhpcy5wcm94eSxcbiAgICAgICAgICAgICAgICBgIGNhbm5vdCB5aWVsZCB0byAnJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICAgICl9JyBzaW5jZSBubyBjYWxsYmFjayB3YXMgcGFzc2VkLmAsXG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geWllbGRGbi5hcHBseSh0aGlzVmFsdWUsIHNsaWNlKGFyZ3VtZW50cywgMikpO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIFwiOihcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjYWxsU3RyID0gdGhpcy5wcm94eSA/IGAke1N0cmluZyh0aGlzLnByb3h5KX0oYCA6IFwiXCI7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3MgPSBtYXAodGhpcy5hcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbC5pbnNwZWN0KGFyZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxTdHIgPSBgJHtjYWxsU3RyICsgam9pbihmb3JtYXR0ZWRBcmdzLCBcIiwgXCIpfSlgO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FsbFN0ciArPSBgID0+ICR7dXRpbC5pbnNwZWN0KHRoaXMucmV0dXJuVmFsdWUpfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIGNhbGxTdHIgKz0gYCAhJHt0aGlzLmV4Y2VwdGlvbi5uYW1lfWA7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbi5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY2FsbFN0ciArPSBgKCR7dGhpcy5leGNlcHRpb24ubWVzc2FnZX0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGFjaykge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHN0YWNrLCBhZGQgdGhlIGZpcnN0IGZyYW1lIHRoYXQncyBpbiBlbmQtdXNlciBjb2RlXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCB0d28gZnJhbWVzIGJlY2F1c2UgdGhleSB3aWxsIHJlZmVyIHRvIFNpbm9uIGNvZGVcbiAgICAgICAgICAgIGNhbGxTdHIgKz0gKHRoaXMuc3RhY2suc3BsaXQoXCJcXG5cIilbM10gfHwgXCJ1bmtub3duXCIpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgL15cXHMqKD86YXRcXHMrfEApPy8sXG4gICAgICAgICAgICAgICAgXCIgYXQgXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxTdHI7XG4gICAgfSxcblxuICAgIGVuc3VyZUFyZ0lzQUZ1bmN0aW9uOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hcmdzW3Bvc10gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgYXJndW1lbnQgYXQgcG9zaXRpb24gJHtwb3N9IHRvIGJlIGEgRnVuY3Rpb24sIGJ1dCB3YXMgJHt0eXBlb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAuYXJnc1twb3NdfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoY2FsbFByb3RvLCBcInN0YWNrXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmVycm9yV2l0aENhbGxTdGFjayAmJiB0aGlzLmVycm9yV2l0aENhbGxTdGFjay5zdGFjaykgfHwgXCJcIjtcbiAgICB9LFxufSk7XG5cbmNhbGxQcm90by5pbnZva2VDYWxsYmFjayA9IGNhbGxQcm90by55aWVsZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJveHkgY2FsbCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3dufSBwcm94eSBUaGUgcHJveHkgZnVuY3Rpb25cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1ZhbHVlIFRoZSBgdGhpc2AgY29udGV4dCBmb3IgdGhlIGNhbGxcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGNhbGxcbiAqIEBwYXJhbSB7dW5rbm93bn0gcmV0dXJuVmFsdWUgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbFxuICogQHBhcmFtIHt1bmtub3dufSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGNhbGxcbiAqIEBwYXJhbSB7bnVtYmVyfSBpZCBUaGUgY2FsbCBpZFxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JXaXRoQ2FsbFN0YWNrIEVycm9yIG9iamVjdCB1c2VkIGZvciBzdGFjayB0cmFjZVxuICogQHJldHVybnMge29iamVjdH0gcHJveHlDYWxsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3h5Q2FsbChcbiAgICBwcm94eSxcbiAgICB0aGlzVmFsdWUsXG4gICAgYXJncyxcbiAgICByZXR1cm5WYWx1ZSxcbiAgICBleGNlcHRpb24sXG4gICAgaWQsXG4gICAgZXJyb3JXaXRoQ2FsbFN0YWNrLFxuKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FsbCBpZCBpcyBub3QgYSBudW1iZXJcIik7XG4gICAgfVxuXG4gICAgbGV0IGZpcnN0QXJnLCBsYXN0QXJnO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBmaXJzdEFyZyA9IGFyZ3NbMF07XG4gICAgICAgIGxhc3RBcmcgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlDYWxsID0gT2JqZWN0LmNyZWF0ZShjYWxsUHJvdG8pO1xuICAgIGNvbnN0IGNhbGxiYWNrID1cbiAgICAgICAgbGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gXCJmdW5jdGlvblwiID8gbGFzdEFyZyA6IHVuZGVmaW5lZDtcblxuICAgIHByb3h5Q2FsbC5wcm94eSA9IHByb3h5O1xuICAgIHByb3h5Q2FsbC50aGlzVmFsdWUgPSB0aGlzVmFsdWU7XG4gICAgcHJveHlDYWxsLmFyZ3MgPSBhcmdzO1xuICAgIHByb3h5Q2FsbC5maXJzdEFyZyA9IGZpcnN0QXJnO1xuICAgIHByb3h5Q2FsbC5sYXN0QXJnID0gbGFzdEFyZztcbiAgICBwcm94eUNhbGwuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBwcm94eUNhbGwucmV0dXJuVmFsdWUgPSByZXR1cm5WYWx1ZTtcbiAgICBwcm94eUNhbGwuZXhjZXB0aW9uID0gZXhjZXB0aW9uO1xuICAgIHByb3h5Q2FsbC5jYWxsSWQgPSBpZDtcbiAgICBwcm94eUNhbGwuZXJyb3JXaXRoQ2FsbFN0YWNrID0gZXJyb3JXaXRoQ2FsbFN0YWNrO1xuXG4gICAgcmV0dXJuIHByb3h5Q2FsbDtcbn1cbmNyZWF0ZVByb3h5Q2FsbC50b1N0cmluZyA9IGNhbGxQcm90by50b1N0cmluZzsgLy8gdXNlZCBieSBtb2Nrc1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVByb3h5Q2FsbDtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogVGhlIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBjb25maWd1cmFibGVcbiAqL1xuZnVuY3Rpb24gaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmosIHByb3BOYW1lKSB7XG4gICAgY29uc3QgcHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcE5hbWUpO1xuXG4gICAgcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvciA/IHByb3BlcnR5RGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUHJvcGVydHlDb25maWd1cmFibGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBpc1Byb3BlcnR5Q29uZmlndXJhYmxlID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvaXMtcHJvcGVydHktY29uZmlndXJhYmxlLmpzJyk7XG52YXIgZXhwb3J0QXN5bmNCZWhhdmlvcnMgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9leHBvcnQtYXN5bmMtYmVoYXZpb3JzLmpzJyk7XG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvZXh0ZW5kLmpzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IHByb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcblxuY29uc3QgeyBzbGljZSB9ID0gcHJvdG90eXBlcy5hcnJheTtcblxuY29uc3QgdXNlTGVmdE1vc3RDYWxsYmFjayA9IC0xO1xuY29uc3QgdXNlUmlnaHRNb3N0Q2FsbGJhY2sgPSAtMjtcblxuZnVuY3Rpb24gdGhyb3dzRXhjZXB0aW9uKGZha2UsIGVycm9yLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IGVycm9yO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0V4Y2VwdGlvbiA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBtZXNzYWdlIHx8IGBTaW5vbi1wcm92aWRlZCAke2Vycm9yfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbmV3RXhjZXB0aW9uLm5hbWUgPSBlcnJvcjtcbiAgICAgICAgICAgIHJldHVybiBuZXdFeGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIkVycm9yXCIpO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gZXJyb3I7XG4gICAgfVxufVxuXG5jb25zdCBkZWZhdWx0QmVoYXZpb3JzID0ge1xuICAgIGNhbGxzRmFrZTogZnVuY3Rpb24gY2FsbHNGYWtlKGZha2UsIGZuKSB7XG4gICAgICAgIGZha2UuZmFrZUZuID0gZm47XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxzQXJnOiBmdW5jdGlvbiBjYWxsc0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gaW5kZXg7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ09uOiBmdW5jdGlvbiBjYWxsc0FyZ09uKGZha2UsIGluZGV4LCBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBpbmRleCBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSBpbmRleDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IFtdO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ1dpdGg6IGZ1bmN0aW9uIGNhbGxzQXJnV2l0aChmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gaW5kZXg7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxzQXJnT25XaXRoOiBmdW5jdGlvbiBjYWxsc0FyZ1dpdGgoZmFrZSwgaW5kZXgsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IGluZGV4O1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAzKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5jYWxsc1Rocm91Z2ggPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgeWllbGRzOiBmdW5jdGlvbiAoZmFrZSkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDEpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNSaWdodDogZnVuY3Rpb24gKGZha2UpIHtcbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSB1c2VSaWdodE1vc3RDYWxsYmFjaztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5jYWxsc1Rocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHlpZWxkc09uOiBmdW5jdGlvbiAoZmFrZSwgY29udGV4dCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgeWllbGRzVG86IGZ1bmN0aW9uIChmYWtlLCBwcm9wKSB7XG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gdXNlTGVmdE1vc3RDYWxsYmFjaztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlKGFyZ3VtZW50cywgMik7XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gcHJvcDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gZmFsc2U7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUb09uOiBmdW5jdGlvbiAoZmFrZSwgcHJvcCwgY29udGV4dCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDMpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSBwcm9wO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHRocm93czogdGhyb3dzRXhjZXB0aW9uLFxuICAgIHRocm93c0V4Y2VwdGlvbjogdGhyb3dzRXhjZXB0aW9uLFxuXG4gICAgcmV0dXJuczogZnVuY3Rpb24gcmV0dXJucyhmYWtlLCB2YWx1ZSkge1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlID0gdmFsdWU7XG4gICAgICAgIGZha2UucmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlamVjdCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlRGVmaW5lZCA9IHRydWU7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZXR1cm5zQXJnOiBmdW5jdGlvbiByZXR1cm5zQXJnKGZha2UsIGluZGV4KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBpbmRleCBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gZmFsc2U7XG5cbiAgICAgICAgZmFrZS5yZXR1cm5BcmdBdCA9IGluZGV4O1xuICAgIH0sXG5cbiAgICB0aHJvd3NBcmc6IGZ1bmN0aW9uIHRocm93c0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuXG4gICAgICAgIGZha2UudGhyb3dBcmdBdCA9IGluZGV4O1xuICAgIH0sXG5cbiAgICByZXR1cm5zVGhpczogZnVuY3Rpb24gcmV0dXJuc1RoaXMoZmFrZSkge1xuICAgICAgICBmYWtlLnJldHVyblRoaXMgPSB0cnVlO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICByZXNvbHZlczogZnVuY3Rpb24gcmVzb2x2ZXMoZmFrZSwgdmFsdWUpIHtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSB0cnVlO1xuICAgICAgICBmYWtlLnJlc29sdmVUaGlzID0gZmFsc2U7XG4gICAgICAgIGZha2UucmVqZWN0ID0gZmFsc2U7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWVEZWZpbmVkID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gZmFsc2U7XG4gICAgfSxcblxuICAgIHJlc29sdmVzQXJnOiBmdW5jdGlvbiByZXNvbHZlc0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmYWtlLnJlc29sdmVBcmdBdCA9IGluZGV4O1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSB0cnVlO1xuICAgICAgICBmYWtlLnJlc29sdmVUaGlzID0gZmFsc2U7XG4gICAgICAgIGZha2UucmVqZWN0ID0gZmFsc2U7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWVEZWZpbmVkID0gZmFsc2U7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICByZWplY3RzOiBmdW5jdGlvbiByZWplY3RzKGZha2UsIGVycm9yLCBtZXNzYWdlKSB7XG4gICAgICAgIGxldCByZWFzb247XG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlYXNvbiA9IG5ldyBFcnJvcihtZXNzYWdlIHx8IFwiXCIpO1xuICAgICAgICAgICAgcmVhc29uLm5hbWUgPSBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIHJlYXNvbiA9IG5ldyBFcnJvcihcIkVycm9yXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVhc29uID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHJlYXNvbjtcbiAgICAgICAgZmFrZS5yZXNvbHZlID0gZmFsc2U7XG4gICAgICAgIGZha2UucmVzb2x2ZVRoaXMgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZWplY3QgPSB0cnVlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlRGVmaW5lZCA9IHRydWU7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH0sXG5cbiAgICByZXNvbHZlc1RoaXM6IGZ1bmN0aW9uIHJlc29sdmVzVGhpcyhmYWtlKSB7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UucmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlc29sdmVUaGlzID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZWplY3QgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxUaHJvdWdoOiBmdW5jdGlvbiBjYWxsVGhyb3VnaChmYWtlKSB7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gdHJ1ZTtcblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsc1Rocm91Z2hXaXRoTmV3ID0gZmFsc2U7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLnJlamVjdCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlQXJnQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UucmVzb2x2ZVRoaXMgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXR1cm5BcmdBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5yZXR1cm5UaGlzID0gZmFsc2U7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UudGhyb3dBcmdBdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gW107XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgY2FsbFRocm91Z2hXaXRoTmV3OiBmdW5jdGlvbiBjYWxsVGhyb3VnaFdpdGhOZXcoZmFrZSkge1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaFdpdGhOZXcgPSB0cnVlO1xuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLnRocm93QXJnQXQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IFtdO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGZha2UsIGdldHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJvb3RTdHViID0gZmFrZS5zdHViIHx8IGZha2U7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lLCB7XG4gICAgICAgICAgICBnZXQ6IGdldHRlckZ1bmN0aW9uLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKFxuICAgICAgICAgICAgICAgIHJvb3RTdHViLnJvb3RPYmosXG4gICAgICAgICAgICAgICAgcm9vdFN0dWIucHJvcE5hbWUsXG4gICAgICAgICAgICApLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoZmFrZSwgc2V0dGVyRnVuY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgcm9vdFN0dWIgPSBmYWtlLnN0dWIgfHwgZmFrZTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICByb290U3R1Yi5yb290T2JqLFxuICAgICAgICAgICAgcm9vdFN0dWIucHJvcE5hbWUsXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYWNjZXNzb3ItcGFpcnNcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZXQ6IHNldHRlckZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShcbiAgICAgICAgICAgICAgICAgICAgcm9vdFN0dWIucm9vdE9iaixcbiAgICAgICAgICAgICAgICAgICAgcm9vdFN0dWIucHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGZha2U7XG4gICAgfSxcblxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShmYWtlLCBuZXdWYWwpIHtcbiAgICAgICAgY29uc3Qgcm9vdFN0dWIgPSBmYWtlLnN0dWIgfHwgZmFrZTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9vdFN0dWIucm9vdE9iaiwgcm9vdFN0dWIucHJvcE5hbWUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBuZXdWYWwsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6XG4gICAgICAgICAgICAgICAgcm9vdFN0dWIuc2hhZG93c1Byb3BPblByb3RvdHlwZSB8fFxuICAgICAgICAgICAgICAgIGlzUHJvcGVydHlDb25maWd1cmFibGUocm9vdFN0dWIucm9vdE9iaiwgcm9vdFN0dWIucHJvcE5hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxufTtcblxuY29uc3QgYXN5bmNCZWhhdmlvcnMgPSBleHBvcnRBc3luY0JlaGF2aW9ycyhkZWZhdWx0QmVoYXZpb3JzKTtcblxudmFyIGJlaGF2aW9ycyA9IGV4dGVuZCh7fSwgZGVmYXVsdEJlaGF2aW9ycywgYXN5bmNCZWhhdmlvcnMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJlaGF2aW9ycztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIFNpbm9uIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uVG9TdHJpbmcoKSB7XG4gICAgbGV0IGksIHByb3AsIHRoaXNWYWx1ZTtcbiAgICBpZiAodGhpcy5nZXRDYWxsICYmIHRoaXMuY2FsbENvdW50KSB7XG4gICAgICAgIGkgPSB0aGlzLmNhbGxDb3VudDtcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICB0aGlzVmFsdWUgPSB0aGlzLmdldENhbGwoaSkudGhpc1ZhbHVlO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgICAgICAgICBmb3IgKHByb3AgaW4gdGhpc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNWYWx1ZVtwcm9wXSA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vLW9wIC0gYWNjZXNzaW5nIHByb3BzIGNhbiB0aHJvdyBhbiBlcnJvciwgbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheU5hbWUgfHwgXCJzaW5vbiBmYWtlXCI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb25Ub1N0cmluZztcbiIsICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRzQ29sb3IoKSB7XG4gICAgaWYgKFxuICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQgPT09IFwidW5kZWZpbmVkXCJcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHsgc3Rkb3V0OiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0ZG91dDogQm9vbGVhbihwcm9jZXNzLnN0ZG91dC5pc1RUWSkgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZvciBjb2xvcml6aW5nIGNvbnNvbGUgb3V0cHV0LlxuICovXG5jbGFzcyBDb2xvcml6ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbc3VwcG9ydHNDb2xvck1vZHVsZV0gVGhlIHN1cHBvcnRzLWNvbG9yIG1vZHVsZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN1cHBvcnRzQ29sb3JNb2R1bGUgPSBnZXRTdXBwb3J0c0NvbG9yKCkpIHtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0NvbG9yID0gc3VwcG9ydHNDb2xvck1vZHVsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xvcml6ZXMgYSBzdHJpbmcgd2l0aCB0aGUgZ2l2ZW4gY29sb3IgY29kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBjb2xvcml6ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2xvciBUaGUgY29sb3IgY29kZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb2xvcml6ZWQgc3RyaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb2xvcml6ZShzdHIsIGNvbG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzQ29sb3Iuc3Rkb3V0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgXFx4MWJbJHtjb2xvcn1tJHtzdHJ9XFx4MWJbMG1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbG9yaXplcyBhIHN0cmluZyByZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY29sb3JpemVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29sb3JpemVkIHN0cmluZ1xuICAgICAqL1xuICAgIHJlZChzdHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JpemUoc3RyLCAzMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sb3JpemVzIGEgc3RyaW5nIGdyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNvbG9yaXplXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbG9yaXplZCBzdHJpbmdcbiAgICAgKi9cbiAgICBncmVlbihzdHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JpemUoc3RyLCAzMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sb3JpemVzIGEgc3RyaW5nIGN5YW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY29sb3JpemVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29sb3JpemVkIHN0cmluZ1xuICAgICAqL1xuICAgIGN5YW4oc3RyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yaXplKHN0ciwgOTYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbG9yaXplcyBhIHN0cmluZyB3aGl0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBjb2xvcml6ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb2xvcml6ZWQgc3RyaW5nXG4gICAgICovXG4gICAgd2hpdGUoc3RyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yaXplKHN0ciwgMzkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbG9yaXplcyBhIHN0cmluZyBib2xkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNvbG9yaXplXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbG9yaXplZCBzdHJpbmdcbiAgICAgKi9cbiAgICBib2xkKHN0cikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xvcml6ZShzdHIsIDEpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb2xvcml6ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jbGFzcyBEaWZmIHtcbiAgICBkaWZmKG9sZFN0ciwgbmV3U3RyLCBcbiAgICAvLyBUeXBlIGJlbG93IGlzIG5vdCBhY2N1cmF0ZS9jb21wbGV0ZSAtIHNlZSBhYm92ZSBmb3IgZnVsbCBwb3NzaWJpbGl0aWVzIC0gYnV0IGl0IGNvbXBpbGVzXG4gICAgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJ2NhbGxiYWNrJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBtYXNzYWdlIHRoZSBpbnB1dCBwcmlvciB0byBydW5uaW5nXG4gICAgICAgIGNvbnN0IG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0ciwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0ciwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG9sZFRva2VucyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcsIG9wdGlvbnMpKTtcbiAgICAgICAgY29uc3QgbmV3VG9rZW5zID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZywgb3B0aW9ucykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWZmV2l0aE9wdGlvbnNPYmoob2xkVG9rZW5zLCBuZXdUb2tlbnMsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZGlmZldpdGhPcHRpb25zT2JqKG9sZFRva2VucywgbmV3VG9rZW5zLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGRvbmUgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wb3N0UHJvY2Vzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2FsbGJhY2sodmFsdWUpOyB9LCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBuZXdUb2tlbnMubGVuZ3RoLCBvbGRMZW4gPSBvbGRUb2tlbnMubGVuZ3RoO1xuICAgICAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgICAgIGxldCBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgICAgICBpZiAob3B0aW9ucy5tYXhFZGl0TGVuZ3RoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1heEVkaXRMZW5ndGggPSBNYXRoLm1pbihtYXhFZGl0TGVuZ3RoLCBvcHRpb25zLm1heEVkaXRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heEV4ZWN1dGlvblRpbWUgPSAoX2EgPSBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IEluZmluaXR5O1xuICAgICAgICBjb25zdCBhYm9ydEFmdGVyVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIG1heEV4ZWN1dGlvblRpbWU7XG4gICAgICAgIGNvbnN0IGJlc3RQYXRoID0gW3sgb2xkUG9zOiAtMSwgbGFzdENvbXBvbmVudDogdW5kZWZpbmVkIH1dO1xuICAgICAgICAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgICAgICBsZXQgbmV3UG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdUb2tlbnMsIG9sZFRva2VucywgMCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChiZXN0UGF0aFswXS5vbGRQb3MgKyAxID49IG9sZExlbiAmJiBuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICAgICAgICByZXR1cm4gZG9uZSh0aGlzLmJ1aWxkVmFsdWVzKGJlc3RQYXRoWzBdLmxhc3RDb21wb25lbnQsIG5ld1Rva2Vucywgb2xkVG9rZW5zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25jZSB3ZSBoaXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGVkaXQgZ3JhcGggb24gc29tZSBkaWFnb25hbCBrLCB3ZSBjYW5cbiAgICAgICAgLy8gZGVmaW5pdGVseSByZWFjaCB0aGUgZW5kIG9mIHRoZSBlZGl0IGdyYXBoIGluIG5vIG1vcmUgdGhhbiBrIGVkaXRzLCBzb1xuICAgICAgICAvLyB0aGVyZSdzIG5vIHBvaW50IGluIGNvbnNpZGVyaW5nIGFueSBtb3ZlcyB0byBkaWFnb25hbCBrKzEgYW55IG1vcmUgKGZyb21cbiAgICAgICAgLy8gd2hpY2ggd2UncmUgZ3VhcmFudGVlZCB0byBuZWVkIGF0IGxlYXN0IGsrMSBtb3JlIGVkaXRzKS5cbiAgICAgICAgLy8gU2ltaWxhcmx5LCBvbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdCBncmFwaCwgdGhlcmUncyBub1xuICAgICAgICAvLyBwb2ludCBjb25zaWRlcmluZyBtb3ZlcyB0byBsb3dlciBkaWFnb25hbHMuXG4gICAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGZhY3QgYnkgc2V0dGluZyBtaW5EaWFnb25hbFRvQ29uc2lkZXIgYW5kXG4gICAgICAgIC8vIG1heERpYWdvbmFsVG9Db25zaWRlciB0byBzb21lIGZpbml0ZSB2YWx1ZSBvbmNlIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZlxuICAgICAgICAvLyB0aGUgZWRpdCBncmFwaC5cbiAgICAgICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gaXMgbm90IGZhaXRoZnVsIHRvIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0gcHJlc2VudGVkIGluXG4gICAgICAgIC8vIE15ZXJzJ3MgcGFwZXIsIHdoaWNoIGluc3RlYWQgcG9pbnRsZXNzbHkgZXh0ZW5kcyBELXBhdGhzIG9mZiB0aGUgZW5kIG9mXG4gICAgICAgIC8vIHRoZSBlZGl0IGdyYXBoIC0gc2VlIHBhZ2UgNyBvZiBNeWVycydzIHBhcGVyIHdoaWNoIG5vdGVzIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gZXhwbGljaXRseSBhbmQgaWxsdXN0cmF0ZXMgaXQgd2l0aCBhIGRpYWdyYW0uIFRoaXMgaGFzIG1ham9yIHBlcmZvcm1hbmNlXG4gICAgICAgIC8vIGltcGxpY2F0aW9ucyBmb3Igc29tZSBjb21tb24gc2NlbmFyaW9zLiBGb3IgaW5zdGFuY2UsIHRvIGNvbXB1dGUgYSBkaWZmXG4gICAgICAgIC8vIHdoZXJlIHRoZSBuZXcgdGV4dCBzaW1wbHkgYXBwZW5kcyBkIGNoYXJhY3RlcnMgb24gdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gb3JpZ2luYWwgdGV4dCBvZiBsZW5ndGggbiwgdGhlIHRydWUgTXllcnMgYWxnb3JpdGhtIHdpbGwgdGFrZSBPKG4rZF4yKVxuICAgICAgICAvLyB0aW1lIHdoaWxlIHRoaXMgb3B0aW1pemF0aW9uIG5lZWRzIG9ubHkgTyhuK2QpIHRpbWUuXG4gICAgICAgIGxldCBtaW5EaWFnb25hbFRvQ29uc2lkZXIgPSAtSW5maW5pdHksIG1heERpYWdvbmFsVG9Db25zaWRlciA9IEluZmluaXR5O1xuICAgICAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgICAgIGNvbnN0IGV4ZWNFZGl0TGVuZ3RoID0gKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7IGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlUGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gcGVyZiBvcHRpbWlzYXRpb24uIFRoaXMgdHlwZS12aW9sYXRpbmcgdmFsdWUgd2lsbCBuZXZlciBiZSByZWFkLlxuICAgICAgICAgICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNhbkFkZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgbmV3UG9zIHdpbGwgYmUgYWZ0ZXIgd2UgZG8gYW4gaW5zZXJ0aW9uOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRQYXRoTmV3UG9zID0gYWRkUGF0aC5vbGRQb3MgLSBkaWFnb25hbFBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGNhbkFkZCA9IGFkZFBhdGggJiYgMCA8PSBhZGRQYXRoTmV3UG9zICYmIGFkZFBhdGhOZXdQb3MgPCBuZXdMZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuICAgICAgICAgICAgICAgIGlmICghY2FuQWRkICYmICFjYW5SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gcGVyZiBvcHRpbWlzYXRpb24uIFRoaXMgdHlwZS12aW9sYXRpbmcgdmFsdWUgd2lsbCBuZXZlciBiZSByZWFkLlxuICAgICAgICAgICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZG9lcyBub3QgcGFzcyB0aGUgYm91bmRzIG9mIHRoZSBkaWZmIGdyYXBoXG4gICAgICAgICAgICAgICAgaWYgKCFjYW5SZW1vdmUgfHwgKGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyA8IGFkZFBhdGgub2xkUG9zKSkge1xuICAgICAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYWRkVG9QYXRoKGFkZFBhdGgsIHRydWUsIGZhbHNlLCAwLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5hZGRUb1BhdGgocmVtb3ZlUGF0aCwgZmFsc2UsIHRydWUsIDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1Rva2Vucywgb2xkVG9rZW5zLCBkaWFnb25hbFBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlUGF0aC5vbGRQb3MgKyAxID49IG9sZExlbiAmJiBuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZSh0aGlzLmJ1aWxkVmFsdWVzKGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIG5ld1Rva2Vucywgb2xkVG9rZW5zKSkgfHwgdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXRoLm9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhEaWFnb25hbFRvQ29uc2lkZXIgPSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGRpYWdvbmFsUGF0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVkaXRMZW5ndGgrKztcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAgICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgICAgICAvLyBpcyBwcm9kdWNlZCwgb3IgdW50aWwgdGhlIGVkaXQgbGVuZ3RoIGV4Y2VlZHMgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoIChpZiBnaXZlbiksXG4gICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGggfHwgRGF0ZS5ub3coKSA+IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlYygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCAmJiBEYXRlLm5vdygpIDw9IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkVG9QYXRoKHBhdGgsIGFkZGVkLCByZW1vdmVkLCBvbGRQb3NJbmMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHBhdGgubGFzdENvbXBvbmVudDtcbiAgICAgICAgaWYgKGxhc3QgJiYgIW9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4gJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9sZFBvczogcGF0aC5vbGRQb3MgKyBvbGRQb3NJbmMsXG4gICAgICAgICAgICAgICAgbGFzdENvbXBvbmVudDogeyBjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCwgcHJldmlvdXNDb21wb25lbnQ6IGxhc3QucHJldmlvdXNDb21wb25lbnQgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2xkUG9zOiBwYXRoLm9sZFBvcyArIG9sZFBvc0luYyxcbiAgICAgICAgICAgICAgICBsYXN0Q29tcG9uZW50OiB7IGNvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQsIHByZXZpb3VzQ29tcG9uZW50OiBsYXN0IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3VG9rZW5zLCBvbGRUb2tlbnMsIGRpYWdvbmFsUGF0aCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBuZXdUb2tlbnMubGVuZ3RoLCBvbGRMZW4gPSBvbGRUb2tlbnMubGVuZ3RoO1xuICAgICAgICBsZXQgb2xkUG9zID0gYmFzZVBhdGgub2xkUG9zLCBuZXdQb3MgPSBvbGRQb3MgLSBkaWFnb25hbFBhdGgsIGNvbW1vbkNvdW50ID0gMDtcbiAgICAgICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhvbGRUb2tlbnNbb2xkUG9zICsgMV0sIG5ld1Rva2Vuc1tuZXdQb3MgKyAxXSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG5ld1BvcysrO1xuICAgICAgICAgICAgb2xkUG9zKys7XG4gICAgICAgICAgICBjb21tb25Db3VudCsrO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aC5sYXN0Q29tcG9uZW50ID0geyBjb3VudDogMSwgcHJldmlvdXNDb21wb25lbnQ6IGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIGFkZGVkOiBmYWxzZSwgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uQ291bnQgJiYgIW9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4pIHtcbiAgICAgICAgICAgIGJhc2VQYXRoLmxhc3RDb21wb25lbnQgPSB7IGNvdW50OiBjb21tb25Db3VudCwgcHJldmlvdXNDb21wb25lbnQ6IGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIGFkZGVkOiBmYWxzZSwgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlUGF0aC5vbGRQb3MgPSBvbGRQb3M7XG4gICAgICAgIHJldHVybiBuZXdQb3M7XG4gICAgfVxuICAgIGVxdWFscyhsZWZ0LCByaWdodCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodFxuICAgICAgICAgICAgICAgIHx8ICghIW9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgICAgIGNvbnN0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNhc3RJbnB1dCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB0b2tlbml6ZSh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIGpvaW4oY2hhcnMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyBWYWx1ZVQgaXMgc3RyaW5nLCB3aGljaCBpcyB0aGUgY2FzZSBmb3IgbW9zdCBzdWJjbGFzc2VzLlxuICAgICAgICAvLyBXaGVuIGl0J3MgZmFsc2UsIGUuZy4gaW4gZGlmZkFycmF5cywgdGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbiAoZS5nLiB3aXRoIGEgbm8tb3ApXG4gICAgICAgIC8vIFllcywgdGhlIGNhc3RzIGFyZSB2ZXJib3NlIGFuZCB1Z2x5LCBiZWNhdXNlIHRoaXMgcGF0dGVybiAtIG9mIGhhdmluZyB0aGUgYmFzZSBjbGFzcyBTT1JUIE9GXG4gICAgICAgIC8vIGFzc3VtZSB0b2tlbnMgYW5kIHZhbHVlcyBhcmUgc3RyaW5ncywgYnV0IG5vdCBjb21wbGV0ZWx5IC0gaXMgd2VpcmQgYW5kIGphbmt5LlxuICAgICAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gICAgfVxuICAgIHBvc3RQcm9jZXNzKGNoYW5nZU9iamVjdHMsIFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VPYmplY3RzO1xuICAgIH1cbiAgICBnZXQgdXNlTG9uZ2VzdFRva2VuKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGJ1aWxkVmFsdWVzKGxhc3RDb21wb25lbnQsIG5ld1Rva2Vucywgb2xkVG9rZW5zKSB7XG4gICAgICAgIC8vIEZpcnN0IHdlIGNvbnZlcnQgb3VyIGxpbmtlZCBsaXN0IG9mIGNvbXBvbmVudHMgaW4gcmV2ZXJzZSBvcmRlciB0byBhblxuICAgICAgICAvLyBhcnJheSBpbiB0aGUgcmlnaHQgb3JkZXI6XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgbGV0IG5leHRDb21wb25lbnQ7XG4gICAgICAgIHdoaWxlIChsYXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobGFzdENvbXBvbmVudCk7XG4gICAgICAgICAgICBuZXh0Q29tcG9uZW50ID0gbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICAgICAgICAgIGRlbGV0ZSBsYXN0Q29tcG9uZW50LnByZXZpb3VzQ29tcG9uZW50O1xuICAgICAgICAgICAgbGFzdENvbXBvbmVudCA9IG5leHRDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50cy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICBsZXQgY29tcG9uZW50UG9zID0gMCwgbmV3UG9zID0gMCwgb2xkUG9zID0gMDtcbiAgICAgICAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB0aGlzLnVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBuZXdUb2tlbnMuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkVG9rZW5zW29sZFBvcyArIGldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSB0aGlzLmpvaW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gdGhpcy5qb2luKG5ld1Rva2Vucy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgICAgICAgICAgIC8vIENvbW1vbiBjYXNlXG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSB0aGlzLmpvaW4ob2xkVG9rZW5zLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICAgICAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEaWZmO1xuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jaGFyYWN0ZXJEaWZmID0gdm9pZCAwO1xuZXhwb3J0cy5kaWZmQ2hhcnMgPSBkaWZmQ2hhcnM7XG5jb25zdCBiYXNlX2pzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vYmFzZS5qc1wiKSk7XG5jbGFzcyBDaGFyYWN0ZXJEaWZmIGV4dGVuZHMgYmFzZV9qc18xLmRlZmF1bHQge1xufVxuZXhwb3J0cy5jaGFyYWN0ZXJEaWZmID0gbmV3IENoYXJhY3RlckRpZmYoKTtcbmZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBleHBvcnRzLmNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxvbmdlc3RDb21tb25QcmVmaXggPSBsb25nZXN0Q29tbW9uUHJlZml4O1xuZXhwb3J0cy5sb25nZXN0Q29tbW9uU3VmZml4ID0gbG9uZ2VzdENvbW1vblN1ZmZpeDtcbmV4cG9ydHMucmVwbGFjZVByZWZpeCA9IHJlcGxhY2VQcmVmaXg7XG5leHBvcnRzLnJlcGxhY2VTdWZmaXggPSByZXBsYWNlU3VmZml4O1xuZXhwb3J0cy5yZW1vdmVQcmVmaXggPSByZW1vdmVQcmVmaXg7XG5leHBvcnRzLnJlbW92ZVN1ZmZpeCA9IHJlbW92ZVN1ZmZpeDtcbmV4cG9ydHMubWF4aW11bU92ZXJsYXAgPSBtYXhpbXVtT3ZlcmxhcDtcbmV4cG9ydHMuaGFzT25seVdpbkxpbmVFbmRpbmdzID0gaGFzT25seVdpbkxpbmVFbmRpbmdzO1xuZXhwb3J0cy5oYXNPbmx5VW5peExpbmVFbmRpbmdzID0gaGFzT25seVVuaXhMaW5lRW5kaW5ncztcbmV4cG9ydHMuc2VnbWVudCA9IHNlZ21lbnQ7XG5leHBvcnRzLnRyYWlsaW5nV3MgPSB0cmFpbGluZ1dzO1xuZXhwb3J0cy5sZWFkaW5nV3MgPSBsZWFkaW5nV3M7XG5leHBvcnRzLmxlYWRpbmdBbmRUcmFpbGluZ1dzID0gbGVhZGluZ0FuZFRyYWlsaW5nV3M7XG5mdW5jdGlvbiBsb25nZXN0Q29tbW9uUHJlZml4KHN0cjEsIHN0cjIpIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyMS5sZW5ndGggJiYgaSA8IHN0cjIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cjFbaV0gIT0gc3RyMltpXSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjEuc2xpY2UoMCwgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjEuc2xpY2UoMCwgaSk7XG59XG5mdW5jdGlvbiBsb25nZXN0Q29tbW9uU3VmZml4KHN0cjEsIHN0cjIpIHtcbiAgICBsZXQgaTtcbiAgICAvLyBVbmxpa2UgbG9uZ2VzdENvbW1vblByZWZpeCwgd2UgbmVlZCBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgYWxsIHNjZW5hcmlvc1xuICAgIC8vIHdoZXJlIHdlIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIHNpbmNlIHN0cjEuc2xpY2UoLTApIHdpbGwgcmV0dXJuIHRoZVxuICAgIC8vIGVudGlyZSBzdHJpbmcuXG4gICAgaWYgKCFzdHIxIHx8ICFzdHIyIHx8IHN0cjFbc3RyMS5sZW5ndGggLSAxXSAhPSBzdHIyW3N0cjIubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyMS5sZW5ndGggJiYgaSA8IHN0cjIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cjFbc3RyMS5sZW5ndGggLSAoaSArIDEpXSAhPSBzdHIyW3N0cjIubGVuZ3RoIC0gKGkgKyAxKV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIxLnNsaWNlKC1pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyMS5zbGljZSgtaSk7XG59XG5mdW5jdGlvbiByZXBsYWNlUHJlZml4KHN0cmluZywgb2xkUHJlZml4LCBuZXdQcmVmaXgpIHtcbiAgICBpZiAoc3RyaW5nLnNsaWNlKDAsIG9sZFByZWZpeC5sZW5ndGgpICE9IG9sZFByZWZpeCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgc3RyaW5nICR7SlNPTi5zdHJpbmdpZnkoc3RyaW5nKX0gZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCAke0pTT04uc3RyaW5naWZ5KG9sZFByZWZpeCl9OyB0aGlzIGlzIGEgYnVnYCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQcmVmaXggKyBzdHJpbmcuc2xpY2Uob2xkUHJlZml4Lmxlbmd0aCk7XG59XG5mdW5jdGlvbiByZXBsYWNlU3VmZml4KHN0cmluZywgb2xkU3VmZml4LCBuZXdTdWZmaXgpIHtcbiAgICBpZiAoIW9sZFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nICsgbmV3U3VmZml4O1xuICAgIH1cbiAgICBpZiAoc3RyaW5nLnNsaWNlKC1vbGRTdWZmaXgubGVuZ3RoKSAhPSBvbGRTdWZmaXgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYHN0cmluZyAke0pTT04uc3RyaW5naWZ5KHN0cmluZyl9IGRvZXNuJ3QgZW5kIHdpdGggc3VmZml4ICR7SlNPTi5zdHJpbmdpZnkob2xkU3VmZml4KX07IHRoaXMgaXMgYSBidWdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCAtb2xkU3VmZml4Lmxlbmd0aCkgKyBuZXdTdWZmaXg7XG59XG5mdW5jdGlvbiByZW1vdmVQcmVmaXgoc3RyaW5nLCBvbGRQcmVmaXgpIHtcbiAgICByZXR1cm4gcmVwbGFjZVByZWZpeChzdHJpbmcsIG9sZFByZWZpeCwgJycpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3VmZml4KHN0cmluZywgb2xkU3VmZml4KSB7XG4gICAgcmV0dXJuIHJlcGxhY2VTdWZmaXgoc3RyaW5nLCBvbGRTdWZmaXgsICcnKTtcbn1cbmZ1bmN0aW9uIG1heGltdW1PdmVybGFwKHN0cmluZzEsIHN0cmluZzIpIHtcbiAgICByZXR1cm4gc3RyaW5nMi5zbGljZSgwLCBvdmVybGFwQ291bnQoc3RyaW5nMSwgc3RyaW5nMikpO1xufVxuLy8gTmlja2VkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYwNDIyODUzLzE3MDk1ODdcbmZ1bmN0aW9uIG92ZXJsYXBDb3VudChhLCBiKSB7XG4gICAgLy8gRGVhbCB3aXRoIGNhc2VzIHdoZXJlIHRoZSBzdHJpbmdzIGRpZmZlciBpbiBsZW5ndGhcbiAgICBsZXQgc3RhcnRBID0gMDtcbiAgICBpZiAoYS5sZW5ndGggPiBiLmxlbmd0aCkge1xuICAgICAgICBzdGFydEEgPSBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgZW5kQiA9IGIubGVuZ3RoO1xuICAgIGlmIChhLmxlbmd0aCA8IGIubGVuZ3RoKSB7XG4gICAgICAgIGVuZEIgPSBhLmxlbmd0aDtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgYmFjay1yZWZlcmVuY2UgZm9yIGVhY2ggaW5kZXhcbiAgICAvLyAgIHRoYXQgc2hvdWxkIGJlIGZvbGxvd2VkIGluIGNhc2Ugb2YgYSBtaXNtYXRjaC5cbiAgICAvLyAgIFdlIG9ubHkgbmVlZCBCIHRvIG1ha2UgdGhlc2UgcmVmZXJlbmNlczpcbiAgICBjb25zdCBtYXAgPSBBcnJheShlbmRCKTtcbiAgICBsZXQgayA9IDA7IC8vIEluZGV4IHRoYXQgbGFncyBiZWhpbmQgalxuICAgIG1hcFswXSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPCBlbmRCOyBqKyspIHtcbiAgICAgICAgaWYgKGJbal0gPT0gYltrXSkge1xuICAgICAgICAgICAgbWFwW2pdID0gbWFwW2tdOyAvLyBza2lwIG92ZXIgdGhlIHNhbWUgY2hhcmFjdGVyIChvcHRpb25hbCBvcHRpbWlzYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtYXBbal0gPSBrO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChrID4gMCAmJiBiW2pdICE9IGJba10pIHtcbiAgICAgICAgICAgIGsgPSBtYXBba107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJbal0gPT0gYltrXSkge1xuICAgICAgICAgICAgaysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFBoYXNlIDI6IHVzZSB0aGVzZSByZWZlcmVuY2VzIHdoaWxlIGl0ZXJhdGluZyBvdmVyIEFcbiAgICBrID0gMDtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRBOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3aGlsZSAoayA+IDAgJiYgYVtpXSAhPSBiW2tdKSB7XG4gICAgICAgICAgICBrID0gbWFwW2tdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhW2ldID09IGJba10pIHtcbiAgICAgICAgICAgIGsrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaztcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgY29uc2lzdGVudGx5IHVzZXMgV2luZG93cyBsaW5lIGVuZGluZ3MuXG4gKi9cbmZ1bmN0aW9uIGhhc09ubHlXaW5MaW5lRW5kaW5ncyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLmluY2x1ZGVzKCdcXHJcXG4nKSAmJiAhc3RyaW5nLnN0YXJ0c1dpdGgoJ1xcbicpICYmICFzdHJpbmcubWF0Y2goL1teXFxyXVxcbi8pO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBjb25zaXN0ZW50bHkgdXNlcyBVbml4IGxpbmUgZW5kaW5ncy5cbiAqL1xuZnVuY3Rpb24gaGFzT25seVVuaXhMaW5lRW5kaW5ncyhzdHJpbmcpIHtcbiAgICByZXR1cm4gIXN0cmluZy5pbmNsdWRlcygnXFxyXFxuJykgJiYgc3RyaW5nLmluY2x1ZGVzKCdcXG4nKTtcbn1cbi8qKlxuICogU3BsaXQgYSBzdHJpbmcgaW50byBzZWdtZW50cyB1c2luZyBhIHdvcmQgc2VnbWVudGVyLCBtZXJnaW5nIGNvbnNlY3V0aXZlXG4gKiBzZWdtZW50cyBpZiB0aGV5IGFyZSBib3RoIHdoaXRlc3BhY2Ugc2VnbWVudHMuIFdoaXRlc3BhY2Ugc2VnbWVudHMgY2FuXG4gKiBhcHBlYXIgYWRqYWNlbnQgdG8gb25lIGFub3RoZXIgZm9yIHR3byByZWFzb25zOlxuICogLSBuZXdsaW5lcyBhbHdheXMgZ2V0IHRoZWlyIG93biBzZWdtZW50XG4gKiAtIHdoZXJlIGEgZGlhY3JpdGljIGlzIGF0dGFjaGVkIHRvIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIHRleHQsIHRoZVxuICogICBzZWdtZW50IGVuZHMgYWZ0ZXIgdGhlIGRpYWNyaXRpYywgc28gZS5nLiBcIiBcXHUwMzAwIFwiIGJlY29tZXMgdHdvIHNlZ21lbnRzLlxuICogVGhpcyBmdW5jdGlvbiB0aGVyZWZvcmUgcnVucyB0aGUgc2VnbWVudGVyJ3MgLnNlZ21lbnQoKSBtZXRob2QgYW5kIHRoZW5cbiAqIG1lcmdlcyBjb25zZWN1dGl2ZSBzZWdtZW50cyBvZiB3aGl0ZXNwYWNlIGludG8gYSBzaW5nbGUgcGFydC5cbiAqL1xuZnVuY3Rpb24gc2VnbWVudChzdHJpbmcsIHNlZ21lbnRlcikge1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChjb25zdCBzZWdtZW50T2JqIG9mIEFycmF5LmZyb20oc2VnbWVudGVyLnNlZ21lbnQoc3RyaW5nKSkpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRPYmouc2VnbWVudDtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAmJiAoL1xccy8pLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICYmICgvXFxzLykudGVzdChzZWdtZW50KSkge1xuICAgICAgICAgICAgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gKz0gc2VnbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuLy8gVGhlIGZ1bmN0aW9ucyBiZWxvdyB0YWtlIGEgYHNlZ21lbnRlcmAgYXJndW1lbnQgc28gdGhhdCwgd2hlbiBjYWxsZWQgZnJvbVxuLy8gZGlmZldvcmRzIHdoZW4gaXQgaXMgdXNpbmcgYSBzZWdtZW50ZXIsIHRoZXkgY2FuIHVzZSBhIG5vdGlvbiBvZiB3aGF0XG4vLyBjb25zdGl0dXRlcyBcIndoaXRlc3BhY2VcIiB0aGF0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgc2VnbWVudGVyLlxuLy9cbi8vIFVTVUFMTFkgdGhpcyB3aWxsIGJlIGlkZW50aWNhbCB0byB0aGUgcmVzdWx0IG9mIHRoZSBub24tc2VnbWVudGVyLWJhc2VkXG4vLyBsb2dpYywgYnV0IGl0IGRpZmZlcnMgaW4gYXQgbGVhc3Qgb25lIGNhc2U6IHdoZW4gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZVxuLy8gbW9kaWZpZWQgYnkgZGlhY3JpdGljcy4gQSB3b3JkIHNlZ21lbnRlciBjb25zaWRlcnMgdGhlc2UgZGlhY3JpdGljcyB0byBiZVxuLy8gcGFydCBvZiB0aGUgd2hpdGVzcGFjZSwgd2hlcmVhcyBvdXIgbm9uLXNlZ21lbnRlci1iYXNlZCBsb2dpYyBkb2VzIG5vdC5cbi8vXG4vLyBCZWNhdXNlIHRoZSBzZWdtZW50ZXItYmFzZWQgYXBwcm9hY2ggbmVjZXNzYXJpbHkgcmVxdWlyZXMgc2VnbWVudGluZyB0aGVcbi8vIGVudGlyZSBzdHJpbmcsIHdlIG9mZmVyIGEgbGVhZGluZ0FuZFRyYWlsaW5nV3MgZnVuY3Rpb24gdG8gYWxsb3cgZ2V0dGluZyB0aGVcbi8vIHdoaXRlc3BhY2UgcHJlZml4IEFORCB3aGl0ZXNwYWNlIHN1ZmZpeCB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gdGhlIHNlZ21lbnRlcixcbi8vIGZvciBlZmZpY2llbmN5J3Mgc2FrZS5cbmZ1bmN0aW9uIHRyYWlsaW5nV3Moc3RyaW5nLCBzZWdtZW50ZXIpIHtcbiAgICBpZiAoc2VnbWVudGVyKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nQW5kVHJhaWxpbmdXcyhzdHJpbmcsIHNlZ21lbnRlcilbMV07XG4gICAgfVxuICAgIC8vIFllcywgdGhpcyBsb29rcyBvdmVyY29tcGxpY2F0ZWQgYW5kIGR1bWIgLSB3aHkgbm90IHJlcGxhY2UgdGhlIHdob2xlIGZ1bmN0aW9uIHdpdGhcbiAgICAvLyAgICAgcmV0dXJuIHN0cmluZy5tYXRjaCgvXFxzKiQvKVswXVxuICAgIC8vIHlvdSBhc2s/IEJlY2F1c2U6XG4gICAgLy8gMS4gdGhlIHRyYXAgZGVzY3JpYmVkIGF0IGh0dHBzOi8vbWFya2FtZXJ5LmNvbS9ibG9nL3F1YWRyYXRpYy10aW1lLXJlZ2V4ZXMvIHdvdWxkIG1lYW4gZG9pbmdcbiAgICAvLyAgICB0aGlzIHdvdWxkIGNhdXNlIHRoaXMgZnVuY3Rpb24gdG8gdGFrZSBPKG5cdTAwQjIpIHRpbWUgaW4gdGhlIHdvcnN0IGNhc2UgKHNwZWNpZmljYWxseSB3aGVuXG4gICAgLy8gICAgdGhlcmUgaXMgYSBtYXNzaXZlIHJ1biBvZiBOT04tVFJBSUxJTkcgd2hpdGVzcGFjZSBpbiBgc3RyaW5nYCksIGFuZFxuICAgIC8vIDIuIHRoZSBmaXggcHJvcG9zZWQgaW4gdGhlIHNhbWUgYmxvZyBwb3N0LCBvZiB1c2luZyBhIG5lZ2F0aXZlIGxvb2tiZWhpbmQsIGlzIGluY29tcGF0aWJsZVxuICAgIC8vICAgIHdpdGggb2xkIFNhZmFyaSB2ZXJzaW9ucyB0aGF0IHdlJ2QgbGlrZSB0byBub3QgYnJlYWsgaWYgcG9zc2libGUgKHNlZVxuICAgIC8vICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9rcGRlY2tlci9qc2RpZmYvcHVsbC81NTApXG4gICAgLy8gSXQgZmVlbHMgYWJzdXJkIHRvIGRvIHRoaXMgd2l0aCBhbiBleHBsaWNpdCBsb29wIGluc3RlYWQgb2YgYSByZWdleCwgYnV0IEkgcmVhbGx5IGNhbid0IHNlZSBhXG4gICAgLy8gYmV0dGVyIHdheSB0aGF0IGRvZXNuJ3QgcmVzdWx0IGluIGJyb2tlbiBiZWhhdmlvdXIuXG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gc3RyaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICghc3RyaW5nW2ldLm1hdGNoKC9cXHMvKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoaSArIDEpO1xufVxuZnVuY3Rpb24gbGVhZGluZ1dzKHN0cmluZywgc2VnbWVudGVyKSB7XG4gICAgaWYgKHNlZ21lbnRlcikge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0FuZFRyYWlsaW5nV3Moc3RyaW5nLCBzZWdtZW50ZXIpWzBdO1xuICAgIH1cbiAgICAvLyBUaGFua2Z1bGx5IHRoZSBhbm5veWluZyBjb25zaWRlcmF0aW9ucyBkZXNjcmliZWQgaW4gdHJhaWxpbmdXcyBkb24ndCBhcHBseSBoZXJlOlxuICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nLm1hdGNoKC9eXFxzKi8pO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG59XG5mdW5jdGlvbiBsZWFkaW5nQW5kVHJhaWxpbmdXcyhzdHJpbmcsIHNlZ21lbnRlcikge1xuICAgIGlmICghc2VnbWVudGVyKSB7XG4gICAgICAgIHJldHVybiBbbGVhZGluZ1dzKHN0cmluZyksIHRyYWlsaW5nV3Moc3RyaW5nKV07XG4gICAgfVxuICAgIGlmIChzZWdtZW50ZXIucmVzb2x2ZWRPcHRpb25zKCkuZ3JhbnVsYXJpdHkgIT0gJ3dvcmQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlZ21lbnRlciBwYXNzZWQgbXVzdCBoYXZlIGEgZ3JhbnVsYXJpdHkgb2YgXCJ3b3JkXCInKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudHMgPSBzZWdtZW50KHN0cmluZywgc2VnbWVudGVyKTtcbiAgICBjb25zdCBmaXJzdFNlZyA9IHNlZ21lbnRzWzBdO1xuICAgIGNvbnN0IGxhc3RTZWcgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBoZWFkID0gKC9cXHMvKS50ZXN0KGZpcnN0U2VnKSA/IGZpcnN0U2VnIDogJyc7XG4gICAgY29uc3QgdGFpbCA9ICgvXFxzLykudGVzdChsYXN0U2VnKSA/IGxhc3RTZWcgOiAnJztcbiAgICByZXR1cm4gW2hlYWQsIHRhaWxdO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy53b3Jkc1dpdGhTcGFjZURpZmYgPSBleHBvcnRzLndvcmREaWZmID0gdm9pZCAwO1xuZXhwb3J0cy5kaWZmV29yZHMgPSBkaWZmV29yZHM7XG5leHBvcnRzLmRpZmZXb3Jkc1dpdGhTcGFjZSA9IGRpZmZXb3Jkc1dpdGhTcGFjZTtcbmNvbnN0IGJhc2VfanNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlLmpzXCIpKTtcbmNvbnN0IHN0cmluZ19qc18xID0gcmVxdWlyZShcIi4uL3V0aWwvc3RyaW5nLmpzXCIpO1xuLy8gQmFzZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fc2NyaXB0X2luX1VuaWNvZGVcbi8vXG4vLyBDaGFycy9yYW5nZXMgY291bnRlZCBhcyBcIndvcmRcIiBjaGFyYWN0ZXJzIGJ5IHRoaXMgcmVnZXggYXJlIGFzIGZvbGxvd3M6XG4vL1xuLy8gKyBVKzAwQUQgIFNvZnQgaHlwaGVuXG4vLyArIDAwQzBcdTIwMTMwMEZGIChsZXR0ZXJzIHdpdGggZGlhY3JpdGljcyBmcm9tIHRoZSBMYXRpbi0xIFN1cHBsZW1lbnQpLCBleGNlcHQ6XG4vLyAgIC0gVSswMEQ3ICBcdTAwRDcgTXVsdGlwbGljYXRpb24gc2lnblxuLy8gICAtIFUrMDBGNyAgXHUwMEY3IERpdmlzaW9uIHNpZ25cbi8vICsgTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMFx1MjAxMzAxN0Zcbi8vICsgTGF0aW4gRXh0ZW5kZWQtQiwgMDE4MFx1MjAxMzAyNEZcbi8vICsgSVBBIEV4dGVuc2lvbnMsIDAyNTBcdTIwMTMwMkFGXG4vLyArIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMFx1MjAxMzAyRkYsIGV4Y2VwdDpcbi8vICAgLSBVKzAyQzcgIFx1MDJDNyAmIzcxMTsgIENhcm9uXG4vLyAgIC0gVSswMkQ4ICBcdTAyRDggJiM3Mjg7ICBCcmV2ZVxuLy8gICAtIFUrMDJEOSAgXHUwMkQ5ICYjNzI5OyAgRG90IEFib3ZlXG4vLyAgIC0gVSswMkRBICBcdTAyREEgJiM3MzA7ICBSaW5nIEFib3ZlXG4vLyAgIC0gVSswMkRCICBcdTAyREIgJiM3MzE7ICBPZ29uZWtcbi8vICAgLSBVKzAyREMgIFx1MDJEQyAmIzczMjsgIFNtYWxsIFRpbGRlXG4vLyAgIC0gVSswMkREICBcdTAyREQgJiM3MzM7ICBEb3VibGUgQWN1dGUgQWNjZW50XG4vLyArIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDBcdTIwMTMxRUZGXG5jb25zdCBleHRlbmRlZFdvcmRDaGFycyA9ICdhLXpBLVowLTlfXFxcXHV7QUR9XFxcXHV7QzB9LVxcXFx1e0Q2fVxcXFx1e0Q4fS1cXFxcdXtGNn1cXFxcdXtGOH0tXFxcXHV7MkM2fVxcXFx1ezJDOH0tXFxcXHV7MkQ3fVxcXFx1ezJERX0tXFxcXHV7MkZGfVxcXFx1ezFFMDB9LVxcXFx1ezFFRkZ9Jztcbi8vIEVhY2ggdG9rZW4gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4vLyAtIEEgcHVuY3R1YXRpb24gbWFyayBwbHVzIHRoZSBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlXG4vLyAtIEEgd29yZCBwbHVzIHRoZSBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlXG4vLyAtIFB1cmUgd2hpdGVzcGFjZSAoYnV0IG9ubHkgaW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgZW50aXJlIHRleHRcbi8vICAgaXMganVzdCB3aGl0ZXNwYWNlKVxuLy9cbi8vIFdlIGhhdmUgdG8gaW5jbHVkZSBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIGluIHRoZSB0b2tlbnMgYmVjYXVzZSB0aGUgdHdvXG4vLyBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzIHByb2R1Y2UgaG9ycmlibHkgYnJva2VuIHJlc3VsdHM6XG4vLyAqIElmIHdlIGp1c3QgZGlzY2FyZCB0aGUgd2hpdGVzcGFjZSwgd2UgY2FuJ3QgZnVsbHkgcmVwcm9kdWNlIHRoZSBvcmlnaW5hbFxuLy8gICB0ZXh0IGZyb20gdGhlIHNlcXVlbmNlIG9mIHRva2VucyBhbmQgYW55IGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBkaWZmIHdpbGxcbi8vICAgZ2V0IHRoZSB3aGl0ZXNwYWNlIHdyb25nLlxuLy8gKiBJZiB3ZSBoYXZlIHNlcGFyYXRlIHRva2VucyBmb3Igd2hpdGVzcGFjZSwgdGhlbiBpbiBhIHR5cGljYWwgdGV4dCBldmVyeVxuLy8gICBzZWNvbmQgdG9rZW4gd2lsbCBiZSBhIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXIuIEJ1dCB0aGlzIG9mdGVuIHJlc3VsdHMgaW5cbi8vICAgdGhlIG9wdGltYWwgZGlmZiBiZXR3ZWVuIHR3byB0ZXh0cyBiZWluZyBhIHBlcnZlcnNlIG9uZSB0aGF0IHByZXNlcnZlc1xuLy8gICB0aGUgc3BhY2VzIGJldHdlZW4gd29yZHMgYnV0IGRlbGV0ZXMgYW5kIHJlaW5zZXJ0cyBhY3R1YWwgY29tbW9uIHdvcmRzLlxuLy8gICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2twZGVja2VyL2pzZGlmZi9pc3N1ZXMvMTYwI2lzc3VlY29tbWVudC0xODY2MDk5NjQwXG4vLyAgIGZvciBhbiBleGFtcGxlLlxuLy9cbi8vIEtlZXBpbmcgdGhlIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2Ugb2YgY291cnNlIGhhcyBpbXBsaWNhdGlvbnMgZm9yIC5lcXVhbHNcbi8vIGFuZCAuam9pbiwgbm90IGp1c3QgLnRva2VuaXplLlxuLy8gVGhpcyByZWdleCBkb2VzIE5PVCBmdWxseSBpbXBsZW1lbnQgdGhlIHRva2VuaXphdGlvbiBydWxlcyBkZXNjcmliZWQgYWJvdmUuXG4vLyBJbnN0ZWFkLCBpdCBnaXZlcyBydW5zIG9mIHdoaXRlc3BhY2UgdGhlaXIgb3duIFwidG9rZW5cIi4gVGhlIHRva2VuaXplIG1ldGhvZFxuLy8gdGhlbiBoYW5kbGVzIHN0aXRjaGluZyB3aGl0ZXNwYWNlIHRva2VucyBvbnRvIGFkamFjZW50IHdvcmQgb3IgcHVuY3R1YXRpb25cbi8vIHRva2Vucy5cbmNvbnN0IHRva2VuaXplSW5jbHVkaW5nV2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoYFske2V4dGVuZGVkV29yZENoYXJzfV0rfFxcXFxzK3xbXiR7ZXh0ZW5kZWRXb3JkQ2hhcnN9XWAsICd1ZycpO1xuY2xhc3MgV29yZERpZmYgZXh0ZW5kcyBiYXNlX2pzXzEuZGVmYXVsdCB7XG4gICAgZXF1YWxzKGxlZnQsIHJpZ2h0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmlnbm9yZUNhc2UpIHtcbiAgICAgICAgICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlZnQudHJpbSgpID09PSByaWdodC50cmltKCk7XG4gICAgfVxuICAgIHRva2VuaXplKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHBhcnRzO1xuICAgICAgICBpZiAob3B0aW9ucy5pbnRsU2VnbWVudGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ZXIgPSBvcHRpb25zLmludGxTZWdtZW50ZXI7XG4gICAgICAgICAgICBpZiAoc2VnbWVudGVyLnJlc29sdmVkT3B0aW9ucygpLmdyYW51bGFyaXR5ICE9ICd3b3JkJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlZ21lbnRlciBwYXNzZWQgbXVzdCBoYXZlIGEgZ3JhbnVsYXJpdHkgb2YgXCJ3b3JkXCInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIHdhbnQgYHBhcnRzYCB0byBiZSBhbiBhcnJheSB3aG9zZSBlbGVtZW50cyBhbHRlcm5hdGUgYmV0d2VlbiBiZWluZ1xuICAgICAgICAgICAgLy8gcHVyZSB3aGl0ZXNwYWNlIGFuZCBiZWluZyBwdXJlIG5vbi13aGl0ZXNwYWNlLiBUaGlzIGlzIEFMTU9TVCB3aGF0IHRoZVxuICAgICAgICAgICAgLy8gc2VnbWVudHMgcmV0dXJuZWQgYnkgYSB3b3JkLWJhc2VkIEludGwuU2VnbWVudGVyIGFscmVhZHkgbG9vayBsaWtlLFxuICAgICAgICAgICAgLy8gYnV0IG5vdCBxdWl0ZSAtIHNlZSBleHBsYW5hdGlvbiBpbiB0aGUgZG9jcyBvZiBvdXIgY3VzdG9tIHNlZ21lbnQoKVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24uXG4gICAgICAgICAgICBwYXJ0cyA9ICgwLCBzdHJpbmdfanNfMS5zZWdtZW50KSh2YWx1ZSwgc2VnbWVudGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcnRzID0gdmFsdWUubWF0Y2godG9rZW5pemVJbmNsdWRpbmdXaGl0ZXNwYWNlKSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgICAgICAgbGV0IHByZXZQYXJ0ID0gbnVsbDtcbiAgICAgICAgcGFydHMuZm9yRWFjaChwYXJ0ID0+IHtcbiAgICAgICAgICAgIGlmICgoL1xccy8pLnRlc3QocGFydCkpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldlBhcnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2Vucy5wb3AoKSArIHBhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByZXZQYXJ0ICE9IG51bGwgJiYgKC9cXHMvKS50ZXN0KHByZXZQYXJ0KSkge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID09IHByZXZQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2Vucy5wb3AoKSArIHBhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2gocHJldlBhcnQgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZQYXJ0ID0gcGFydDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuICAgIGpvaW4odG9rZW5zKSB7XG4gICAgICAgIC8vIFRva2VucyBiZWluZyBqb2luZWQgaGVyZSB3aWxsIGFsd2F5cyBoYXZlIGFwcGVhcmVkIGNvbnNlY3V0aXZlbHkgaW4gdGhlXG4gICAgICAgIC8vIHNhbWUgdGV4dCwgc28gd2UgY2FuIHNpbXBseSBzdHJpcCBvZmYgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGFsbCB0aGVcbiAgICAgICAgLy8gdG9rZW5zIGV4Y2VwdCB0aGUgZmlyc3QgKGFuZCBleGNlcHQgYW55IHdoaXRlc3BhY2Utb25seSB0b2tlbnMgLSBidXQgc3VjaFxuICAgICAgICAvLyBhIHRva2VuIHdpbGwgYWx3YXlzIGJlIHRoZSBmaXJzdCBhbmQgb25seSB0b2tlbiBhbnl3YXkpIGFuZCB0aGVuIGpvaW4gdGhlbVxuICAgICAgICAvLyBhbmQgdGhlIHdoaXRlc3BhY2UgYXJvdW5kIHdvcmRzIGFuZCBwdW5jdHVhdGlvbiB3aWxsIGVuZCB1cCBjb3JyZWN0LlxuICAgICAgICByZXR1cm4gdG9rZW5zLm1hcCgodG9rZW4sIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4ucmVwbGFjZSgoL15cXHMrLyksICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuam9pbignJyk7XG4gICAgfVxuICAgIHBvc3RQcm9jZXNzKGNoYW5nZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFjaGFuZ2VzIHx8IG9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXN0S2VlcCA9IG51bGw7XG4gICAgICAgIC8vIENoYW5nZSBvYmplY3RzIHJlcHJlc2VudGluZyBhbnkgaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIHNpbmNlIHRoZSBsYXN0XG4gICAgICAgIC8vIFwia2VlcFwiIGNoYW5nZSBvYmplY3QuIFRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZSBvZiBlYWNoLlxuICAgICAgICBsZXQgaW5zZXJ0aW9uID0gbnVsbDtcbiAgICAgICAgbGV0IGRlbGV0aW9uID0gbnVsbDtcbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW9uID0gY2hhbmdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGlvbiA9IGNoYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb24gfHwgZGVsZXRpb24pIHsgLy8gTWF5IGJlIGZhbHNlIGF0IHN0YXJ0IG9mIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZGVkdXBlV2hpdGVzcGFjZUluQ2hhbmdlT2JqZWN0cyhsYXN0S2VlcCwgZGVsZXRpb24sIGluc2VydGlvbiwgY2hhbmdlLCBvcHRpb25zLmludGxTZWdtZW50ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0S2VlcCA9IGNoYW5nZTtcbiAgICAgICAgICAgICAgICBpbnNlcnRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIGRlbGV0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbnNlcnRpb24gfHwgZGVsZXRpb24pIHtcbiAgICAgICAgICAgIGRlZHVwZVdoaXRlc3BhY2VJbkNoYW5nZU9iamVjdHMobGFzdEtlZXAsIGRlbGV0aW9uLCBpbnNlcnRpb24sIG51bGwsIG9wdGlvbnMuaW50bFNlZ21lbnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfVxufVxuZXhwb3J0cy53b3JkRGlmZiA9IG5ldyBXb3JkRGlmZigpO1xuZnVuY3Rpb24gZGlmZldvcmRzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gICAgLy8gVGhpcyBvcHRpb24gaGFzIG5ldmVyIGJlZW4gZG9jdW1lbnRlZCBhbmQgbmV2ZXIgd2lsbCBiZSAoaXQncyBjbGVhcmVyIHRvXG4gICAgLy8ganVzdCBjYWxsIGBkaWZmV29yZHNXaXRoU3BhY2VgIGRpcmVjdGx5IGlmIHlvdSBuZWVkIHRoYXQgYmVoYXZpb3IpLCBidXRcbiAgICAvLyBoYXMgZXhpc3RlZCBpbiBqc2RpZmYgZm9yIGEgbG9uZyB0aW1lLCBzbyB3ZSByZXRhaW4gc3VwcG9ydCBmb3IgaXQgaGVyZVxuICAgIC8vIGZvciB0aGUgc2FrZSBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSAhPSBudWxsICYmICFvcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBleHBvcnRzLndvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gZGVkdXBlV2hpdGVzcGFjZUluQ2hhbmdlT2JqZWN0cyhzdGFydEtlZXAsIGRlbGV0aW9uLCBpbnNlcnRpb24sIGVuZEtlZXAsIHNlZ21lbnRlcikge1xuICAgIC8vIEJlZm9yZSByZXR1cm5pbmcsIHdlIHRpZHkgdXAgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb2YgdGhlXG4gICAgLy8gY2hhbmdlIG9iamVjdHMgdG8gZWxpbWluYXRlIGNhc2VzIHdoZXJlIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gb25lIG9iamVjdFxuICAgIC8vIGlzIHJlcGVhdGVkIGFzIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiB0aGUgbmV4dC5cbiAgICAvLyBCZWxvdyBhcmUgZXhhbXBsZXMgb2YgdGhlIG91dGNvbWVzIHdlIHdhbnQgaGVyZSB0byBleHBsYWluIHRoZSBjb2RlLlxuICAgIC8vIEk9aW5zZXJ0LCBLPWtlZXAsIEQ9ZGVsZXRlXG4gICAgLy8gMS4gZGlmZmluZyAnZm9vIGJhciBiYXonIHZzICdmb28gYmF6J1xuICAgIC8vICAgIFByaW9yIHRvIGNsZWFudXAsIHdlIGhhdmUgSzonZm9vICcgRDonIGJhciAnIEs6JyBiYXonXG4gICAgLy8gICAgQWZ0ZXIgY2xlYW51cCwgd2Ugd2FudDogICBLOidmb28gJyBEOidiYXIgJyBLOidiYXonXG4gICAgLy9cbiAgICAvLyAyLiBEaWZmaW5nICdmb28gYmFyIGJheicgdnMgJ2ZvbyBxdXggYmF6J1xuICAgIC8vICAgIFByaW9yIHRvIGNsZWFudXAsIHdlIGhhdmUgSzonZm9vICcgRDonIGJhciAnIEk6JyBxdXggJyBLOicgYmF6J1xuICAgIC8vICAgIEFmdGVyIGNsZWFudXAsIHdlIHdhbnQgSzonZm9vICcgRDonYmFyJyBJOidxdXgnIEs6JyBiYXonXG4gICAgLy9cbiAgICAvLyAzLiBEaWZmaW5nICdmb29cXG5iYXIgYmF6JyB2cyAnZm9vIGJheidcbiAgICAvLyAgICBQcmlvciB0byBjbGVhbnVwLCB3ZSBoYXZlIEs6J2ZvbyAnIEQ6J1xcbmJhciAnIEs6JyBiYXonXG4gICAgLy8gICAgQWZ0ZXIgY2xlYW51cCwgd2Ugd2FudCBLJ2ZvbycgRDonXFxuYmFyJyBLOicgYmF6J1xuICAgIC8vXG4gICAgLy8gNC4gRGlmZmluZyAnZm9vIGJheicgdnMgJ2Zvb1xcbmJhciBiYXonXG4gICAgLy8gICAgUHJpb3IgdG8gY2xlYW51cCwgd2UgaGF2ZSBLOidmb29cXG4nIEk6J1xcbmJhciAnIEs6JyBiYXonXG4gICAgLy8gICAgQWZ0ZXIgY2xlYW51cCwgd2UgaWRlYWxseSB3YW50IEsnZm9vJyBJOidcXG5iYXInIEs6JyBiYXonXG4gICAgLy8gICAgYnV0IGRvbid0IGFjdHVhbGx5IG1hbmFnZSB0aGlzIGN1cnJlbnRseSAodGhlIHByZS1jbGVhbnVwIGNoYW5nZVxuICAgIC8vICAgIG9iamVjdHMgZG9uJ3QgY29udGFpbiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbWFrZSBpdCBwb3NzaWJsZSkuXG4gICAgLy9cbiAgICAvLyA1LiBEaWZmaW5nICdmb28gICBiYXIgYmF6JyB2cyAnZm9vICBiYXonXG4gICAgLy8gICAgUHJpb3IgdG8gY2xlYW51cCwgd2UgaGF2ZSBLOidmb28gICcgRDonICAgYmFyICcgSzonICBiYXonXG4gICAgLy8gICAgQWZ0ZXIgY2xlYW51cCwgd2Ugd2FudCBLOidmb28gICcgRDonIGJhciAnIEs6J2JheidcbiAgICAvL1xuICAgIC8vIE91ciBoYW5kbGluZyBpcyB1bmF2b2lkYWJseSBpbXBlcmZlY3QgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUncyBhIHNpbmdsZVxuICAgIC8vIGluZGVsIGJldHdlZW4ga2VlcHMgYW5kIHRoZSB3aGl0ZXNwYWNlIGhhcyBjaGFuZ2VkLiBGb3IgaW5zdGFuY2UsIGNvbnNpZGVyXG4gICAgLy8gZGlmZmluZyAnZm9vXFx0YmFyXFxuYmF6JyB2cyAnZm9vIGJheicuIFVubGVzcyB3ZSBjcmVhdGUgYW4gZXh0cmEgY2hhbmdlXG4gICAgLy8gb2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBzcGFjZSBjaGFyYWN0ZXIgKHdoaWNoIGlzbid0IGV2ZW5cbiAgICAvLyBhIHRva2VuKSwgd2UgaGF2ZSBubyB3YXkgdG8gYXZvaWQgbG9zaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0cydcbiAgICAvLyBvcmlnaW5hbCB3aGl0ZXNwYWNlIGluIHRoZSByZXN1bHQgd2UgcmV0dXJuLiBTdGlsbCwgd2UgZG8gb3VyIGJlc3QgdG9cbiAgICAvLyBvdXRwdXQgc29tZXRoaW5nIHRoYXQgd2lsbCBsb29rIHNlbnNpYmxlIGlmIHdlIGUuZy4gcHJpbnQgaXQgd2l0aFxuICAgIC8vIGluc2VydGlvbnMgaW4gZ3JlZW4gYW5kIGRlbGV0aW9ucyBpbiByZWQuXG4gICAgLy8gQmV0d2VlbiB0d28gXCJrZWVwXCIgY2hhbmdlIG9iamVjdHMgKG9yIGJlZm9yZSB0aGUgZmlyc3Qgb3IgYWZ0ZXIgdGhlIGxhc3RcbiAgICAvLyBjaGFuZ2Ugb2JqZWN0KSwgd2UgY2FuIGhhdmUgZWl0aGVyOlxuICAgIC8vICogQSBcImRlbGV0ZVwiIGZvbGxvd2VkIGJ5IGFuIFwiaW5zZXJ0XCJcbiAgICAvLyAqIEp1c3QgYW4gXCJpbnNlcnRcIlxuICAgIC8vICogSnVzdCBhIFwiZGVsZXRlXCJcbiAgICAvLyBXZSBoYW5kbGUgdGhlIHRocmVlIGNhc2VzIHNlcGFyYXRlbHkuXG4gICAgaWYgKGRlbGV0aW9uICYmIGluc2VydGlvbikge1xuICAgICAgICBjb25zdCBbb2xkV3NQcmVmaXgsIG9sZFdzU3VmZml4XSA9ICgwLCBzdHJpbmdfanNfMS5sZWFkaW5nQW5kVHJhaWxpbmdXcykoZGVsZXRpb24udmFsdWUsIHNlZ21lbnRlcik7XG4gICAgICAgIGNvbnN0IFtuZXdXc1ByZWZpeCwgbmV3V3NTdWZmaXhdID0gKDAsIHN0cmluZ19qc18xLmxlYWRpbmdBbmRUcmFpbGluZ1dzKShpbnNlcnRpb24udmFsdWUsIHNlZ21lbnRlcik7XG4gICAgICAgIGlmIChzdGFydEtlZXApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbldzUHJlZml4ID0gKDAsIHN0cmluZ19qc18xLmxvbmdlc3RDb21tb25QcmVmaXgpKG9sZFdzUHJlZml4LCBuZXdXc1ByZWZpeCk7XG4gICAgICAgICAgICBzdGFydEtlZXAudmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVwbGFjZVN1ZmZpeCkoc3RhcnRLZWVwLnZhbHVlLCBuZXdXc1ByZWZpeCwgY29tbW9uV3NQcmVmaXgpO1xuICAgICAgICAgICAgZGVsZXRpb24udmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVtb3ZlUHJlZml4KShkZWxldGlvbi52YWx1ZSwgY29tbW9uV3NQcmVmaXgpO1xuICAgICAgICAgICAgaW5zZXJ0aW9uLnZhbHVlID0gKDAsIHN0cmluZ19qc18xLnJlbW92ZVByZWZpeCkoaW5zZXJ0aW9uLnZhbHVlLCBjb21tb25Xc1ByZWZpeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZEtlZXApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbldzU3VmZml4ID0gKDAsIHN0cmluZ19qc18xLmxvbmdlc3RDb21tb25TdWZmaXgpKG9sZFdzU3VmZml4LCBuZXdXc1N1ZmZpeCk7XG4gICAgICAgICAgICBlbmRLZWVwLnZhbHVlID0gKDAsIHN0cmluZ19qc18xLnJlcGxhY2VQcmVmaXgpKGVuZEtlZXAudmFsdWUsIG5ld1dzU3VmZml4LCBjb21tb25Xc1N1ZmZpeCk7XG4gICAgICAgICAgICBkZWxldGlvbi52YWx1ZSA9ICgwLCBzdHJpbmdfanNfMS5yZW1vdmVTdWZmaXgpKGRlbGV0aW9uLnZhbHVlLCBjb21tb25Xc1N1ZmZpeCk7XG4gICAgICAgICAgICBpbnNlcnRpb24udmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVtb3ZlU3VmZml4KShpbnNlcnRpb24udmFsdWUsIGNvbW1vbldzU3VmZml4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gVGhlIHdoaXRlc3BhY2VzIGFsbCByZWZsZWN0IHdoYXQgd2FzIGluIHRoZSBuZXcgdGV4dCByYXRoZXIgdGhhblxuICAgICAgICAvLyB0aGUgb2xkLCBzbyB3ZSBlc3NlbnRpYWxseSBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IHdoaXRlc3BhY2VcbiAgICAgICAgLy8gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uLiBXZSBqdXN0IHdhbnQgdG8gZGVkdXBlIHRoZSB3aGl0ZXNwYWNlLlxuICAgICAgICAvLyBXZSBkbyB0aGF0IGJ5IGhhdmluZyBlYWNoIGNoYW5nZSBvYmplY3Qga2VlcCBpdHMgdHJhaWxpbmdcbiAgICAgICAgLy8gd2hpdGVzcGFjZSBhbmQgZGVsZXRpbmcgZHVwbGljYXRlIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVyZVxuICAgICAgICAvLyBwcmVzZW50LlxuICAgICAgICBpZiAoc3RhcnRLZWVwKSB7XG4gICAgICAgICAgICBjb25zdCB3cyA9ICgwLCBzdHJpbmdfanNfMS5sZWFkaW5nV3MpKGluc2VydGlvbi52YWx1ZSwgc2VnbWVudGVyKTtcbiAgICAgICAgICAgIGluc2VydGlvbi52YWx1ZSA9IGluc2VydGlvbi52YWx1ZS5zdWJzdHJpbmcod3MubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kS2VlcCkge1xuICAgICAgICAgICAgY29uc3Qgd3MgPSAoMCwgc3RyaW5nX2pzXzEubGVhZGluZ1dzKShlbmRLZWVwLnZhbHVlLCBzZWdtZW50ZXIpO1xuICAgICAgICAgICAgZW5kS2VlcC52YWx1ZSA9IGVuZEtlZXAudmFsdWUuc3Vic3RyaW5nKHdzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIHdlJ3ZlIGdvdCBhIGRlbGV0aW9uIGFuZCBubyBpbnNlcnRpb25cbiAgICB9XG4gICAgZWxzZSBpZiAoc3RhcnRLZWVwICYmIGVuZEtlZXApIHtcbiAgICAgICAgY29uc3QgbmV3V3NGdWxsID0gKDAsIHN0cmluZ19qc18xLmxlYWRpbmdXcykoZW5kS2VlcC52YWx1ZSwgc2VnbWVudGVyKSwgW2RlbFdzU3RhcnQsIGRlbFdzRW5kXSA9ICgwLCBzdHJpbmdfanNfMS5sZWFkaW5nQW5kVHJhaWxpbmdXcykoZGVsZXRpb24udmFsdWUsIHNlZ21lbnRlcik7XG4gICAgICAgIC8vIEFueSB3aGl0ZXNwYWNlIHRoYXQgY29tZXMgc3RyYWlnaHQgYWZ0ZXIgc3RhcnRLZWVwIGluIGJvdGggdGhlIG9sZCBhbmRcbiAgICAgICAgLy8gbmV3IHRleHRzLCBhc3NpZ24gdG8gc3RhcnRLZWVwIGFuZCByZW1vdmUgZnJvbSB0aGUgZGVsZXRpb24uXG4gICAgICAgIGNvbnN0IG5ld1dzU3RhcnQgPSAoMCwgc3RyaW5nX2pzXzEubG9uZ2VzdENvbW1vblByZWZpeCkobmV3V3NGdWxsLCBkZWxXc1N0YXJ0KTtcbiAgICAgICAgZGVsZXRpb24udmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVtb3ZlUHJlZml4KShkZWxldGlvbi52YWx1ZSwgbmV3V3NTdGFydCk7XG4gICAgICAgIC8vIEFueSB3aGl0ZXNwYWNlIHRoYXQgY29tZXMgc3RyYWlnaHQgYmVmb3JlIGVuZEtlZXAgaW4gYm90aCB0aGUgb2xkIGFuZFxuICAgICAgICAvLyBuZXcgdGV4dHMsIGFuZCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGFzc2lnbmVkIHRvIHN0YXJ0S2VlcCwgYXNzaWduIHRvXG4gICAgICAgIC8vIGVuZEtlZXAgYW5kIHJlbW92ZSBmcm9tIHRoZSBkZWxldGlvbi5cbiAgICAgICAgY29uc3QgbmV3V3NFbmQgPSAoMCwgc3RyaW5nX2pzXzEubG9uZ2VzdENvbW1vblN1ZmZpeCkoKDAsIHN0cmluZ19qc18xLnJlbW92ZVByZWZpeCkobmV3V3NGdWxsLCBuZXdXc1N0YXJ0KSwgZGVsV3NFbmQpO1xuICAgICAgICBkZWxldGlvbi52YWx1ZSA9ICgwLCBzdHJpbmdfanNfMS5yZW1vdmVTdWZmaXgpKGRlbGV0aW9uLnZhbHVlLCBuZXdXc0VuZCk7XG4gICAgICAgIGVuZEtlZXAudmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVwbGFjZVByZWZpeCkoZW5kS2VlcC52YWx1ZSwgbmV3V3NGdWxsLCBuZXdXc0VuZCk7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW55IHdoaXRlc3BhY2UgZnJvbSB0aGUgbmV3IHRleHQgdGhhdCBIQVNOJ1QgYWxyZWFkeSBiZWVuXG4gICAgICAgIC8vIGFzc2lnbmVkLCBhc3NpZ24gaXQgdG8gdGhlIHN0YXJ0OlxuICAgICAgICBzdGFydEtlZXAudmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVwbGFjZVN1ZmZpeCkoc3RhcnRLZWVwLnZhbHVlLCBuZXdXc0Z1bGwsIG5ld1dzRnVsbC5zbGljZSgwLCBuZXdXc0Z1bGwubGVuZ3RoIC0gbmV3V3NFbmQubGVuZ3RoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVuZEtlZXApIHtcbiAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dC4gUHJlc2VydmUgYWxsIHRoZSB3aGl0ZXNwYWNlIG9uXG4gICAgICAgIC8vIGVuZEtlZXAsIGFuZCBqdXN0IHJlbW92ZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBkZWxldGlvbiB0byB0aGVcbiAgICAgICAgLy8gZXh0ZW50IHRoYXQgaXQgb3ZlcmxhcHMgd2l0aCB0aGUgc3RhcnQgb2YgZW5kS2VlcC5cbiAgICAgICAgY29uc3QgZW5kS2VlcFdzUHJlZml4ID0gKDAsIHN0cmluZ19qc18xLmxlYWRpbmdXcykoZW5kS2VlcC52YWx1ZSwgc2VnbWVudGVyKTtcbiAgICAgICAgY29uc3QgZGVsZXRpb25Xc1N1ZmZpeCA9ICgwLCBzdHJpbmdfanNfMS50cmFpbGluZ1dzKShkZWxldGlvbi52YWx1ZSwgc2VnbWVudGVyKTtcbiAgICAgICAgY29uc3Qgb3ZlcmxhcCA9ICgwLCBzdHJpbmdfanNfMS5tYXhpbXVtT3ZlcmxhcCkoZGVsZXRpb25Xc1N1ZmZpeCwgZW5kS2VlcFdzUHJlZml4KTtcbiAgICAgICAgZGVsZXRpb24udmFsdWUgPSAoMCwgc3RyaW5nX2pzXzEucmVtb3ZlU3VmZml4KShkZWxldGlvbi52YWx1ZSwgb3ZlcmxhcCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN0YXJ0S2VlcCkge1xuICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIEVORCBvZiB0aGUgdGV4dC4gUHJlc2VydmUgYWxsIHRoZSB3aGl0ZXNwYWNlIG9uXG4gICAgICAgIC8vIHN0YXJ0S2VlcCwgYW5kIGp1c3QgcmVtb3ZlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQgb2YgZGVsZXRpb24gdG9cbiAgICAgICAgLy8gdGhlIGV4dGVudCB0aGF0IGl0IG92ZXJsYXBzIHdpdGggdGhlIGVuZCBvZiBzdGFydEtlZXAuXG4gICAgICAgIGNvbnN0IHN0YXJ0S2VlcFdzU3VmZml4ID0gKDAsIHN0cmluZ19qc18xLnRyYWlsaW5nV3MpKHN0YXJ0S2VlcC52YWx1ZSwgc2VnbWVudGVyKTtcbiAgICAgICAgY29uc3QgZGVsZXRpb25Xc1ByZWZpeCA9ICgwLCBzdHJpbmdfanNfMS5sZWFkaW5nV3MpKGRlbGV0aW9uLnZhbHVlLCBzZWdtZW50ZXIpO1xuICAgICAgICBjb25zdCBvdmVybGFwID0gKDAsIHN0cmluZ19qc18xLm1heGltdW1PdmVybGFwKShzdGFydEtlZXBXc1N1ZmZpeCwgZGVsZXRpb25Xc1ByZWZpeCk7XG4gICAgICAgIGRlbGV0aW9uLnZhbHVlID0gKDAsIHN0cmluZ19qc18xLnJlbW92ZVByZWZpeCkoZGVsZXRpb24udmFsdWUsIG92ZXJsYXApO1xuICAgIH1cbn1cbmNsYXNzIFdvcmRzV2l0aFNwYWNlRGlmZiBleHRlbmRzIGJhc2VfanNfMS5kZWZhdWx0IHtcbiAgICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgICAgICAvLyBTbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIHRva2VuaXplSW5jbHVkaW5nV2hpdGVzcGFjZSByZWdleCB1c2VkIGFib3ZlIGluXG4gICAgICAgIC8vIHRoYXQgdGhpcyBvbmUgdHJlYXRzIGVhY2ggaW5kaXZpZHVhbCBuZXdsaW5lIGFzIGEgZGlzdGluY3QgdG9rZW4sIHJhdGhlclxuICAgICAgICAvLyB0aGFuIG1lcmdpbmcgdGhlbSBpbnRvIG90aGVyIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UuIFRoaXMgd2FzIHJlcXVlc3RlZFxuICAgICAgICAvLyBpbiBodHRwczovL2dpdGh1Yi5jb20va3BkZWNrZXIvanNkaWZmL2lzc3Vlcy8xODAgJlxuICAgICAgICAvLyAgICBodHRwczovL2dpdGh1Yi5jb20va3BkZWNrZXIvanNkaWZmL2lzc3Vlcy8yMTFcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAoXFxcXHI/XFxcXG4pfFske2V4dGVuZGVkV29yZENoYXJzfV0rfFteXFxcXFNcXFxcblxcXFxyXSt8W14ke2V4dGVuZGVkV29yZENoYXJzfV1gLCAndWcnKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hdGNoKHJlZ2V4KSB8fCBbXTtcbiAgICB9XG59XG5leHBvcnRzLndvcmRzV2l0aFNwYWNlRGlmZiA9IG5ldyBXb3Jkc1dpdGhTcGFjZURpZmYoKTtcbmZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBleHBvcnRzLndvcmRzV2l0aFNwYWNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2VuZXJhdGVPcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zO1xuZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1tuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5saW5lRGlmZiA9IHZvaWQgMDtcbmV4cG9ydHMuZGlmZkxpbmVzID0gZGlmZkxpbmVzO1xuZXhwb3J0cy5kaWZmVHJpbW1lZExpbmVzID0gZGlmZlRyaW1tZWRMaW5lcztcbmV4cG9ydHMudG9rZW5pemUgPSB0b2tlbml6ZTtcbmNvbnN0IGJhc2VfanNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlLmpzXCIpKTtcbmNvbnN0IHBhcmFtc19qc18xID0gcmVxdWlyZShcIi4uL3V0aWwvcGFyYW1zLmpzXCIpO1xuY2xhc3MgTGluZURpZmYgZXh0ZW5kcyBiYXNlX2pzXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudG9rZW5pemUgPSB0b2tlbml6ZTtcbiAgICB9XG4gICAgZXF1YWxzKGxlZnQsIHJpZ2h0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIGlnbm9yaW5nIHdoaXRlc3BhY2UsIHdlIG5lZWQgdG8gbm9ybWFsaXNlIGxpbmVzIGJ5IHN0cmlwcGluZ1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyBlcXVhbGl0eS4gKFRoaXMgaGFzIGFuIGFubm95aW5nIGludGVyYWN0aW9uXG4gICAgICAgIC8vIHdpdGggbmV3bGluZUlzVG9rZW4gdGhhdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nOiBpZiBuZXdsaW5lcyBnZXQgdGhlaXJcbiAgICAgICAgLy8gb3duIHRva2VuLCB0aGVuIHdlIERPTidUIHdhbnQgdG8gdHJpbSB0aGUgKm5ld2xpbmUqIHRva2VucyBkb3duIHRvIGVtcHR5XG4gICAgICAgIC8vIHN0cmluZ3MsIHNpbmNlIHRoaXMgd291bGQgY2F1c2UgdXMgdG8gdHJlYXQgd2hpdGVzcGFjZS1vbmx5IGxpbmUgY29udGVudFxuICAgICAgICAvLyBhcyBlcXVhbCB0byBhIHNlcGFyYXRvciBiZXR3ZWVuIGxpbmVzLCB3aGljaCB3b3VsZCBiZSB3ZWlyZCBhbmRcbiAgICAgICAgLy8gaW5jb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3Igb2YgdGhlIG9wdGlvbnMuKVxuICAgICAgICBpZiAob3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMubmV3bGluZUlzVG9rZW4gfHwgIWxlZnQuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLm5ld2xpbmVJc1Rva2VuIHx8ICFyaWdodC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0LnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmlnbm9yZU5ld2xpbmVBdEVvZiAmJiAhb3B0aW9ucy5uZXdsaW5lSXNUb2tlbikge1xuICAgICAgICAgICAgaWYgKGxlZnQuZW5kc1dpdGgoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJpZ2h0LmVuZHNXaXRoKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobGVmdCwgcmlnaHQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMubGluZURpZmYgPSBuZXcgTGluZURpZmYoKTtcbmZ1bmN0aW9uIGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBleHBvcnRzLmxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSAoMCwgcGFyYW1zX2pzXzEuZ2VuZXJhdGVPcHRpb25zKShvcHRpb25zLCB7IGlnbm9yZVdoaXRlc3BhY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIGV4cG9ydHMubGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4vLyBFeHBvcnRlZCBzdGFuZGFsb25lIHNvIGl0IGNhbiBiZSB1c2VkIGZyb20ganNvbkRpZmYgdG9vLlxuZnVuY3Rpb24gdG9rZW5pemUodmFsdWUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zdHJpcFRyYWlsaW5nQ3IpIHtcbiAgICAgICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICAgIH1cbiAgICBjb25zdCByZXRMaW5lcyA9IFtdLCBsaW5lc0FuZE5ld2xpbmVzID0gdmFsdWUuc3BsaXQoLyhcXG58XFxyXFxuKS8pO1xuICAgIC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuICAgIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGxpbmVzQW5kTmV3bGluZXMucG9wKCk7XG4gICAgfVxuICAgIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuICAgICAgICBpZiAoaSAlIDIgJiYgIW9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgICAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXRMaW5lcztcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2VudGVuY2VEaWZmID0gdm9pZCAwO1xuZXhwb3J0cy5kaWZmU2VudGVuY2VzID0gZGlmZlNlbnRlbmNlcztcbmNvbnN0IGJhc2VfanNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlLmpzXCIpKTtcbmZ1bmN0aW9uIGlzU2VudGVuY2VFbmRQdW5jdChjaGFyKSB7XG4gICAgcmV0dXJuIGNoYXIgPT0gJy4nIHx8IGNoYXIgPT0gJyEnIHx8IGNoYXIgPT0gJz8nO1xufVxuY2xhc3MgU2VudGVuY2VEaWZmIGV4dGVuZHMgYmFzZV9qc18xLmRlZmF1bHQge1xuICAgIHRva2VuaXplKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gSWYgaW4gZnV0dXJlIHdlIGRyb3Agc3VwcG9ydCBmb3IgZW52aXJvbm1lbnRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBsb29rYmVoaW5kcywgd2UgY2FuIHJlcGxhY2VcbiAgICAgICAgLy8gdGhpcyBlbnRpcmUgZnVuY3Rpb24gd2l0aDpcbiAgICAgICAgLy8gICAgIHJldHVybiB2YWx1ZS5zcGxpdCgvKD88PVsuIT9dKShcXHMrfCQpLyk7XG4gICAgICAgIC8vIGJ1dCB1bnRpbCB0aGVuLCBmb3Igc2ltaWxhciByZWFzb25zIHRvIHRoZSB0cmFpbGluZ1dzIGZ1bmN0aW9uIGluIHN0cmluZy50cywgd2UgYXJlIGZvcmNlZFxuICAgICAgICAvLyB0byBkbyB0aGlzIHZlcmJvc2VseSBcImJ5IGhhbmRcIiBpbnN0ZWFkIG9mIHVzaW5nIGEgcmVnZXguXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5TdGFydEkgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PSB2YWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUuc2xpY2UodG9rZW5TdGFydEkpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1NlbnRlbmNlRW5kUHVuY3QodmFsdWVbaV0pICYmIHZhbHVlW2kgKyAxXS5tYXRjaCgvXFxzLykpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSd2ZSBoaXQgYSBzZW50ZW5jZSBicmVhayAtIGkuZS4gYSBwdW5jdHVhdGlvbiBtYXJrIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuXG4gICAgICAgICAgICAgICAgLy8gV2Ugbm93IHdhbnQgdG8gcHVzaCBUV08gdG9rZW5zIHRvIHRoZSByZXN1bHQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gdGhlIHNlbnRlbmNlXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUuc2xpY2UodG9rZW5TdGFydEksIGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgLy8gMi4gdGhlIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBpID0gdG9rZW5TdGFydEkgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKF9hID0gdmFsdWVbaSArIDFdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWF0Y2goL1xccy8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUuc2xpY2UodG9rZW5TdGFydEksIGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgLy8gVGhlbiB0aGUgbmV4dCB0b2tlbiAoYSBzZW50ZW5jZSkgc3RhcnRzIG9uIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICAgICAgLy8gKEl0J3Mgb2theSBpZiB0aGlzIGlzIG9mZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgLSB0aGVuIHRoZSBvdXRlciBsb29wIHdpbGwgdGVybWluYXRlXG4gICAgICAgICAgICAgICAgLy8gaGVyZSBhbnl3YXkuKVxuICAgICAgICAgICAgICAgIHRva2VuU3RhcnRJID0gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLnNlbnRlbmNlRGlmZiA9IG5ldyBTZW50ZW5jZURpZmYoKTtcbmZ1bmN0aW9uIGRpZmZTZW50ZW5jZXMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5zZW50ZW5jZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNzc0RpZmYgPSB2b2lkIDA7XG5leHBvcnRzLmRpZmZDc3MgPSBkaWZmQ3NzO1xuY29uc3QgYmFzZV9qc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2UuanNcIikpO1xuY2xhc3MgQ3NzRGlmZiBleHRlbmRzIGJhc2VfanNfMS5kZWZhdWx0IHtcbiAgICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG4gICAgfVxufVxuZXhwb3J0cy5jc3NEaWZmID0gbmV3IENzc0RpZmYoKTtcbmZ1bmN0aW9uIGRpZmZDc3Mob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jc3NEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5qc29uRGlmZiA9IHZvaWQgMDtcbmV4cG9ydHMuZGlmZkpzb24gPSBkaWZmSnNvbjtcbmV4cG9ydHMuY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplO1xuY29uc3QgYmFzZV9qc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2UuanNcIikpO1xuY29uc3QgbGluZV9qc18xID0gcmVxdWlyZShcIi4vbGluZS5qc1wiKTtcbmNsYXNzIEpzb25EaWZmIGV4dGVuZHMgYmFzZV9qc18xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnRva2VuaXplID0gbGluZV9qc18xLnRva2VuaXplO1xuICAgIH1cbiAgICBnZXQgdXNlTG9uZ2VzdFRva2VuKCkge1xuICAgICAgICAvLyBEaXNjcmltaW5hdGUgYmV0d2VlbiB0d28gbGluZXMgb2YgcHJldHR5LXByaW50ZWQsIHNlcmlhbGl6ZWQgSlNPTiB3aGVyZSBvbmUgb2YgdGhlbSBoYXMgYVxuICAgICAgICAvLyBkYW5nbGluZyBjb21tYSBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuIFR1cm5zIG91dCBpbmNsdWRpbmcgdGhlIGRhbmdsaW5nIGNvbW1hIHlpZWxkcyB0aGUgbmljZXN0IG91dHB1dDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhc3RJbnB1dCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IHVuZGVmaW5lZFJlcGxhY2VtZW50LCBzdHJpbmdpZnlSZXBsYWNlciA9IChrLCB2KSA9PiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWRSZXBsYWNlbWVudCA6IHYgfSA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeShjYW5vbmljYWxpemUodmFsdWUsIG51bGwsIG51bGwsIHN0cmluZ2lmeVJlcGxhY2VyKSwgbnVsbCwgJyAgJyk7XG4gICAgfVxuICAgIGVxdWFscyhsZWZ0LCByaWdodCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpLCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLmpzb25EaWZmID0gbmV3IEpzb25EaWZmKCk7XG5mdW5jdGlvbiBkaWZmSnNvbihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBleHBvcnRzLmpzb25EaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5mdW5jdGlvbiBjYW5vbmljYWxpemUob2JqLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaywgcmVwbGFjZXIsIGtleSkge1xuICAgIHN0YWNrID0gc3RhY2sgfHwgW107XG4gICAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG4gICAgaWYgKHJlcGxhY2VyKSB7XG4gICAgICAgIG9iaiA9IHJlcGxhY2VyKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksIG9iaik7XG4gICAgfVxuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoc3RhY2tbaV0gPT09IG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50U3RhY2tbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNhbm9uaWNhbGl6ZWRPYmo7XG4gICAgaWYgKCdbb2JqZWN0IEFycmF5XScgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICAgICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICAgICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjYW5vbmljYWxpemVkT2JqW2ldID0gY2Fub25pY2FsaXplKG9ialtpXSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBTdHJpbmcoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgICB9XG4gICAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgICAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcbiAgICAgICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuICAgICAgICBjb25zdCBzb3J0ZWRLZXlzID0gW107XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgc29ydGVkS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc29ydGVkS2V5cy5zb3J0KCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBrZXkgPSBzb3J0ZWRLZXlzW2ldO1xuICAgICAgICAgICAgY2Fub25pY2FsaXplZE9ialtrZXldID0gY2Fub25pY2FsaXplKG9ialtrZXldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaywgcmVwbGFjZXIsIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuICAgIH1cbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYXJyYXlEaWZmID0gdm9pZCAwO1xuZXhwb3J0cy5kaWZmQXJyYXlzID0gZGlmZkFycmF5cztcbmNvbnN0IGJhc2VfanNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlLmpzXCIpKTtcbmNsYXNzIEFycmF5RGlmZiBleHRlbmRzIGJhc2VfanNfMS5kZWZhdWx0IHtcbiAgICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc2xpY2UoKTtcbiAgICB9XG4gICAgam9pbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJlbW92ZUVtcHR5KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmFycmF5RGlmZiA9IG5ldyBBcnJheURpZmYoKTtcbmZ1bmN0aW9uIGRpZmZBcnJheXMob2xkQXJyLCBuZXdBcnIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5hcnJheURpZmYuZGlmZihvbGRBcnIsIG5ld0Fyciwgb3B0aW9ucyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVuaXhUb1dpbiA9IHVuaXhUb1dpbjtcbmV4cG9ydHMud2luVG9Vbml4ID0gd2luVG9Vbml4O1xuZXhwb3J0cy5pc1VuaXggPSBpc1VuaXg7XG5leHBvcnRzLmlzV2luID0gaXNXaW47XG5mdW5jdGlvbiB1bml4VG9XaW4ocGF0Y2gpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRjaCkpIHtcbiAgICAgICAgLy8gSXQgd291bGQgYmUgY2xlYW5lciBpZiBpbnN0ZWFkIG9mIHRoZSBsaW5lIGJlbG93IHdlIGNvdWxkIGp1c3Qgd3JpdGVcbiAgICAgICAgLy8gICAgIHJldHVybiBwYXRjaC5tYXAodW5peFRvV2luKVxuICAgICAgICAvLyBidXQgbXlzdGVyaW91c2x5IFR5cGVTY3JpcHQgKHY1LjcuMyBhdCB0aGUgdGltZSBvZiB3cml0aW5nKSBkb2VzIG5vdCBsaWtlIHRoaXMgYW5kIGl0IHdpbGxcbiAgICAgICAgLy8gcmVmdXNlIHRvIGNvbXBpbGUsIHRoaW5raW5nIHRoYXQgdW5peFRvV2luIGNvdWxkIHRoZW4gcmV0dXJuIFN0cnVjdHVyZWRQYXRjaFtdW10gYW5kIHRoZVxuICAgICAgICAvLyByZXN1bHQgd291bGQgYmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIG92ZXJsb2FkIHNpZ25hdHVyZXMuXG4gICAgICAgIC8vIFNlZSBidWcgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNjEzOTguXG4gICAgICAgIHJldHVybiBwYXRjaC5tYXAocCA9PiB1bml4VG9XaW4ocCkpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXRjaCksIHsgaHVua3M6IHBhdGNoLmh1bmtzLm1hcChodW5rID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGh1bmspLCB7IGxpbmVzOiBodW5rLmxpbmVzLm1hcCgobGluZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGxpbmUuc3RhcnRzV2l0aCgnXFxcXCcpIHx8IGxpbmUuZW5kc1dpdGgoJ1xccicpIHx8ICgoX2EgPSBodW5rLmxpbmVzW2kgKyAxXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXJ0c1dpdGgoJ1xcXFwnKSkpXG4gICAgICAgICAgICAgICAgICAgID8gbGluZVxuICAgICAgICAgICAgICAgICAgICA6IGxpbmUgKyAnXFxyJztcbiAgICAgICAgICAgIH0pIH0pKSkgfSk7XG59XG5mdW5jdGlvbiB3aW5Ub1VuaXgocGF0Y2gpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRjaCkpIHtcbiAgICAgICAgLy8gKFNlZSBjb21tZW50IGFib3ZlIGVxdWl2YWxlbnQgbGluZSBpbiB1bml4VG9XaW4pXG4gICAgICAgIHJldHVybiBwYXRjaC5tYXAocCA9PiB3aW5Ub1VuaXgocCkpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXRjaCksIHsgaHVua3M6IHBhdGNoLmh1bmtzLm1hcChodW5rID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGh1bmspLCB7IGxpbmVzOiBodW5rLmxpbmVzLm1hcChsaW5lID0+IGxpbmUuZW5kc1dpdGgoJ1xccicpID8gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSA6IGxpbmUpIH0pKSkgfSk7XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0Y2ggY29uc2lzdGVudGx5IHVzZXMgVW5peCBsaW5lIGVuZGluZ3MgKG9yIG9ubHkgaW52b2x2ZXMgb25lIGxpbmUgYW5kIGhhc1xuICogbm8gbGluZSBlbmRpbmdzKS5cbiAqL1xuZnVuY3Rpb24gaXNVbml4KHBhdGNoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgICBwYXRjaCA9IFtwYXRjaF07XG4gICAgfVxuICAgIHJldHVybiAhcGF0Y2guc29tZShpbmRleCA9PiBpbmRleC5odW5rcy5zb21lKGh1bmsgPT4gaHVuay5saW5lcy5zb21lKGxpbmUgPT4gIWxpbmUuc3RhcnRzV2l0aCgnXFxcXCcpICYmIGxpbmUuZW5kc1dpdGgoJ1xccicpKSkpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGNoIHVzZXMgV2luZG93cyBsaW5lIGVuZGluZ3MgYW5kIG9ubHkgV2luZG93cyBsaW5lIGVuZGluZ3MuXG4gKi9cbmZ1bmN0aW9uIGlzV2luKHBhdGNoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgICBwYXRjaCA9IFtwYXRjaF07XG4gICAgfVxuICAgIHJldHVybiBwYXRjaC5zb21lKGluZGV4ID0+IGluZGV4Lmh1bmtzLnNvbWUoaHVuayA9PiBodW5rLmxpbmVzLnNvbWUobGluZSA9PiBsaW5lLmVuZHNXaXRoKCdcXHInKSkpKVxuICAgICAgICAmJiBwYXRjaC5ldmVyeShpbmRleCA9PiBpbmRleC5odW5rcy5ldmVyeShodW5rID0+IGh1bmsubGluZXMuZXZlcnkoKGxpbmUsIGkpID0+IHsgdmFyIF9hOyByZXR1cm4gbGluZS5zdGFydHNXaXRoKCdcXFxcJykgfHwgbGluZS5lbmRzV2l0aCgnXFxyJykgfHwgKChfYSA9IGh1bmsubGluZXNbaSArIDFdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhcnRzV2l0aCgnXFxcXCcpKTsgfSkpKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VQYXRjaCA9IHBhcnNlUGF0Y2g7XG4vKipcbiAqIFBhcnNlcyBhIHVuaWZpZWQgZGlmZiBmb3JtYXQgcGF0Y2ggaW50byBhIHN0cnVjdHVyZWQgcGF0Y2ggb2JqZWN0LlxuICpcbiAqIGBwYXJzZVBhdGNoYCBoYXMgc29tZSB1bmRlcnN0YW5kaW5nIG9mIEdpdCdzIHBhcnRpY3VsYXIgZGlhbGVjdCBvZiB1bmlmaWVkIGRpZmYgZm9ybWF0LlxuICogV2hlbiBwYXJzaW5nIGEgR2l0IHBhdGNoLCBlYWNoIGluZGV4IGluIHRoZSByZXN1bHQgbWF5IGNvbnRhaW4gYWRkaXRpb25hbFxuICogZmllbGRzIChgaXNSZW5hbWVgLCBgaXNCaW5hcnlgLCBldGMpIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnlcbiAqIGBzdHJ1Y3R1cmVkUGF0Y2hgOyBzZWUgdGhlIGBTdHJ1Y3R1cmVkUGF0Y2hgIGludGVyZmFjZSBmb3IgYSBmdWxsIGxpc3QuXG4gKlxuICogQHJldHVybiBhIEpTT04gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRjaCwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSBgYXBwbHlQYXRjaGBcbiAqIG1ldGhvZC4gVGhpcyBwYXJzZXMgdG8gdGhlIHNhbWUgc3RydWN0dXJlIHJldHVybmVkIGJ5IGBzdHJ1Y3R1cmVkUGF0Y2hgLCBleGNlcHQgdGhhdFxuICogYG9sZEZpbGVOYW1lYCBhbmQgYG5ld0ZpbGVOYW1lYCBtYXkgYmUgYHVuZGVmaW5lZGAgaWYgdGhlIHBhdGNoIGRvZXNuJ3QgY29udGFpbiBlbm91Z2hcbiAqIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGVtIChlLmcuIGEgaHVuay1vbmx5IHBhdGNoIHdpdGggbm8gZmlsZSBoZWFkZXJzKS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG4gICAgY29uc3QgZGlmZnN0ciA9IHVuaURpZmYuc3BsaXQoL1xcbi8pLCBsaXN0ID0gW107XG4gICAgbGV0IGkgPSAwO1xuICAgIC8vIFRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaWRlbnRpZnkgbGluZSB0eXBlcyB0aGF0IGNhbiBhcHBlYXIgYmV0d2VlbiBmaWxlc1xuICAgIC8vIGluIGEgbXVsdGktZmlsZSBwYXRjaC4gS2VlcGluZyB0aGVtIGluIG9uZSBwbGFjZSBhdm9pZHMgc3VidGxlXG4gICAgLy8gaW5jb25zaXN0ZW5jaWVzIGZyb20gaGF2aW5nIHRoZSBzYW1lIHJlZ2V4ZXMgZHVwbGljYXRlZCBpbiBtdWx0aXBsZSBwbGFjZXMuXG4gICAgLy8gTWF0Y2hlcyBgZGlmZiAtLWdpdCAuLi5gIGxpbmVzIHNwZWNpZmljYWxseS5cbiAgICBmdW5jdGlvbiBpc0dpdERpZmZIZWFkZXIobGluZSkge1xuICAgICAgICByZXR1cm4gKC9eZGlmZiAtLWdpdCAvKS50ZXN0KGxpbmUpO1xuICAgIH1cbiAgICAvLyBNYXRjaGVzIGxpbmVzIHRoYXQgZGVub3RlIHRoZSBzdGFydCBvZiBhIG5ldyBkaWZmJ3Mgc2VjdGlvbiBpbiBhXG4gICAgLy8gbXVsdGktZmlsZSBwYXRjaDogYGRpZmYgLS1naXQgLi4uYCwgYEluZGV4OiAuLi5gLCBvciBgZGlmZiAtciAuLi5gLlxuICAgIGZ1bmN0aW9uIGlzRGlmZkhlYWRlcihsaW5lKSB7XG4gICAgICAgIHJldHVybiBpc0dpdERpZmZIZWFkZXIobGluZSlcbiAgICAgICAgICAgIHx8ICgvXkluZGV4Olxccy8pLnRlc3QobGluZSlcbiAgICAgICAgICAgIHx8ICgvXmRpZmYoPzogLXIgXFx3KykrXFxzLykudGVzdChsaW5lKTtcbiAgICB9XG4gICAgLy8gTWF0Y2hlcyBgLS0tIC4uLmAgYW5kIGArKysgLi4uYCBmaWxlIGhlYWRlciBsaW5lcy5cbiAgICBmdW5jdGlvbiBpc0ZpbGVIZWFkZXIobGluZSkge1xuICAgICAgICByZXR1cm4gKC9eKC0tLXxcXCtcXCtcXCspXFxzLykudGVzdChsaW5lKTtcbiAgICB9XG4gICAgLy8gTWF0Y2hlcyBgQEAgLi4uYCBodW5rIGhlYWRlciBsaW5lcy5cbiAgICBmdW5jdGlvbiBpc0h1bmtIZWFkZXIobGluZSkge1xuICAgICAgICByZXR1cm4gKC9eQEBcXHMvKS50ZXN0KGxpbmUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXJzZUluZGV4KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ge307XG4gICAgICAgIGluZGV4Lmh1bmtzID0gW107XG4gICAgICAgIGxpc3QucHVzaChpbmRleCk7XG4gICAgICAgIC8vIFBhcnNlIGRpZmYgbWV0YWRhdGFcbiAgICAgICAgbGV0IHNlZW5EaWZmSGVhZGVyID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBkaWZmc3RyW2ldO1xuICAgICAgICAgICAgLy8gRmlsZSBoZWFkZXIgKC0tLSwgKysrKSBvciBodW5rIGhlYWRlciAoQEApIGZvdW5kOyBlbmQgcGFyc2luZyBkaWZmIG1ldGFkYXRhXG4gICAgICAgICAgICBpZiAoaXNGaWxlSGVhZGVyKGxpbmUpIHx8IGlzSHVua0hlYWRlcihsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIG5leHQgdHdvIGJyYW5jaGVzIGhhbmRsZSByZWNvZ25pemVkIGRpZmYgaGVhZGVycy4gTm90ZSB0aGF0XG4gICAgICAgICAgICAvLyBpc0RpZmZIZWFkZXIgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIG1hdGNoIGFyYml0cmFyeSBgZGlmZmBcbiAgICAgICAgICAgIC8vIGNvbW1hbmRzIGxpa2UgYGRpZmYgLXUgLXAgLXIxLjEgLXIxLjJgLCBiZWNhdXNlIGluIHNvbWVcbiAgICAgICAgICAgIC8vIGZvcm1hdHMgKGUuZy4gQ1ZTIGRpZmZzKSBzdWNoIGxpbmVzIGFwcGVhciBhcyBtZXRhZGF0YSB3aXRoaW5cbiAgICAgICAgICAgIC8vIGEgc2luZ2xlIGZpbGUncyBoZWFkZXIgc2VjdGlvbiwgYWZ0ZXIgYW4gYEluZGV4OmAgbGluZS4gU2VlIHRoZVxuICAgICAgICAgICAgLy8gZGlmZnggZG9jdW1lbnRhdGlvbiAoaHR0cHM6Ly9kaWZmeC5vcmcpIGZvciBleGFtcGxlcy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbiBib3RoIGJyYW5jaGVzOiBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gYSBkaWZmIGhlYWRlciBmb3IgKnRoaXMqXG4gICAgICAgICAgICAvLyBmaWxlIGFuZCBub3cgd2UgZW5jb3VudGVyIGFub3RoZXIgb25lLCBpdCBtdXN0IGJlbG9uZyB0byB0aGVcbiAgICAgICAgICAgIC8vIG5leHQgZmlsZSwgc28gYnJlYWsuXG4gICAgICAgICAgICBpZiAoaXNHaXREaWZmSGVhZGVyKGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5EaWZmSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VlbkRpZmZIZWFkZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGluZGV4LmlzR2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgb2xkIGFuZCBuZXcgZmlsZW5hbWVzIGZyb20gdGhlIGBkaWZmIC0tZ2l0YCBoZWFkZXIgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGVudGF0aXZlbHkgc2V0IG9sZEZpbGVOYW1lIGFuZCBuZXdGaWxlTmFtZSBmcm9tIHRoZW0uIFRoZXNlIG1heVxuICAgICAgICAgICAgICAgIC8vIGJlIG92ZXJyaWRkZW4gYmVsb3cgYnkgYHJlbmFtZSBmcm9tYCAvIGByZW5hbWUgdG9gIG9yIGBjb3B5IGZyb21gIC9cbiAgICAgICAgICAgICAgICAvLyBgY29weSB0b2AgZXh0ZW5kZWQgaGVhZGVycywgb3IgYnkgLS0tIGFuZCArKysgbGluZXMuIEJ1dCBmb3IgR2l0XG4gICAgICAgICAgICAgICAgLy8gZGlmZnMgdGhhdCBsYWNrIGFsbCBvZiB0aG9zZSAoZS5nLiBtb2RlLW9ubHkgY2hhbmdlcywgYmluYXJ5XG4gICAgICAgICAgICAgICAgLy8gZmlsZSBjaGFuZ2VzIHdpdGhvdXQgcmVuYW1lKSwgdGhlc2UgYXJlIHRoZSBvbmx5IGZpbGVuYW1lcyB3ZVxuICAgICAgICAgICAgICAgIC8vIGdldC5cbiAgICAgICAgICAgICAgICAvLyBwYXJzZUdpdERpZmZIZWFkZXIgcmV0dXJucyBudWxsIGlmIHRoZSBoZWFkZXIgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICAgICAgICAgICAgLy8gKGUuZy4gdW50ZXJtaW5hdGVkIHF1b3RlZCBmaWxlbmFtZSwgb3IgdW5leHBlY3RlZCBmb3JtYXQpLiBJblxuICAgICAgICAgICAgICAgIC8vIHRoYXQgY2FzZSB3ZSBza2lwIHNldHRpbmcgZmlsZW5hbWVzIGhlcmU7IHRoZXkgbWF5IHN0aWxsIGJlXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZyb20gLS0tIC8gKysrIG9yIHJlbmFtZSBmcm9tIC8gcmVuYW1lIHRvIGxpbmVzIGJlbG93LlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gcGFyc2VHaXREaWZmSGVhZGVyKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChwYXRocykge1xuICAgICAgICAgICAgICAgICAgICBpbmRleC5vbGRGaWxlTmFtZSA9IHBhdGhzLm9sZEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICBpbmRleC5uZXdGaWxlTmFtZSA9IHBhdGhzLm5ld0ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb25zdW1lIEdpdCBleHRlbmRlZCBoZWFkZXJzIChgb2xkIG1vZGVgLCBgbmV3IG1vZGVgLCBgcmVuYW1lIGZyb21gLFxuICAgICAgICAgICAgICAgIC8vIGByZW5hbWUgdG9gLCBgc2ltaWxhcml0eSBpbmRleGAsIGBpbmRleGAsIGBCaW5hcnkgZmlsZXMgLi4uIGRpZmZlcmAsXG4gICAgICAgICAgICAgICAgLy8gZXRjLilcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRMaW5lID0gZGlmZnN0cltpXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBjb25zdW1pbmcgZXh0ZW5kZWQgaGVhZGVycyBpZiB3ZSBoaXQgYSBmaWxlIGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgLy8gaHVuayBoZWFkZXIsIG9yIGFub3RoZXIgZGlmZiBoZWFkZXIuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpbGVIZWFkZXIoZXh0TGluZSkgfHwgaXNIdW5rSGVhZGVyKGV4dExpbmUpIHx8IGlzRGlmZkhlYWRlcihleHRMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgYHJlbmFtZSBmcm9tYCAvIGByZW5hbWUgdG9gIGxpbmVzIC0gdGhlc2UgZ2l2ZSB1c1xuICAgICAgICAgICAgICAgICAgICAvLyB1bmFtYmlndW91cyBmaWxlbmFtZXMuIFRoZXNlIGxpbmVzIGRvbid0IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEvIGFuZCBiLyBwcmVmaXhlcyB0aGF0IGFwcGVhciBpbiB0aGUgYGRpZmYgLS1naXRgIGhlYWRlclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgLS0tIC8gKysrIGxpbmVzLCBzbyB3ZSBhZGQgdGhlbSBmb3IgY29uc2lzdGVuY3kuXG4gICAgICAgICAgICAgICAgICAgIC8vIEdpdCBDLXN0eWxlIHF1b3RlcyBmaWxlbmFtZXMgY29udGFpbmluZyBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHRhYnMsIG5ld2xpbmVzLCBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcyksIHNvIHdlIG11c3RcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5xdW90ZSB0aGVtIHdoZW4gcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuYW1lRnJvbU1hdGNoID0gKC9ecmVuYW1lIGZyb20gKC4qKS8pLmV4ZWMoZXh0TGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVGcm9tTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm9sZEZpbGVOYW1lID0gJ2EvJyArIHVucXVvdGVJZlF1b3RlZChyZW5hbWVGcm9tTWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguaXNSZW5hbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZVRvTWF0Y2ggPSAoL15yZW5hbWUgdG8gKC4qKS8pLmV4ZWMoZXh0TGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVUb01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uZXdGaWxlTmFtZSA9ICdiLycgKyB1bnF1b3RlSWZRdW90ZWQocmVuYW1lVG9NYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5pc1JlbmFtZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgY29weSBmcm9tIC8gY29weSB0byBsaW5lcyBzaW1pbGFybHlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29weUZyb21NYXRjaCA9ICgvXmNvcHkgZnJvbSAoLiopLykuZXhlYyhleHRMaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHlGcm9tTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm9sZEZpbGVOYW1lID0gJ2EvJyArIHVucXVvdGVJZlF1b3RlZChjb3B5RnJvbU1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LmlzQ29weSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29weVRvTWF0Y2ggPSAoL15jb3B5IHRvICguKikvKS5leGVjKGV4dExpbmUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29weVRvTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5ld0ZpbGVOYW1lID0gJ2IvJyArIHVucXVvdGVJZlF1b3RlZChjb3B5VG9NYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5pc0NvcHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ZpbGVNb2RlTWF0Y2ggPSAoL15uZXcgZmlsZSBtb2RlIChcXGQrKS8pLmV4ZWMoZXh0TGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdGaWxlTW9kZU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5pc0NyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uZXdNb2RlID0gbmV3RmlsZU1vZGVNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVkRmlsZU1vZGVNYXRjaCA9ICgvXmRlbGV0ZWQgZmlsZSBtb2RlIChcXGQrKS8pLmV4ZWMoZXh0TGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVkRmlsZU1vZGVNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguaXNEZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgub2xkTW9kZSA9IGRlbGV0ZWRGaWxlTW9kZU1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZE1vZGVNYXRjaCA9ICgvXm9sZCBtb2RlIChcXGQrKS8pLmV4ZWMoZXh0TGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRNb2RlTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm9sZE1vZGUgPSBvbGRNb2RlTWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3TW9kZU1hdGNoID0gKC9ebmV3IG1vZGUgKFxcZCspLykuZXhlYyhleHRMaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01vZGVNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgubmV3TW9kZSA9IG5ld01vZGVNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKC9eQmluYXJ5IGZpbGVzIC8pLnRlc3QoZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LmlzQmluYXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNEaWZmSGVhZGVyKGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5EaWZmSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VlbkRpZmZIZWFkZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEZvciBNZXJjdXJpYWwtc3R5bGUgaGVhZGVycyBsaWtlXG4gICAgICAgICAgICAgICAgLy8gICAgIGRpZmYgLXIgOTExN2M2NTYxYjBiIC1yIDI3M2NlMTJhZDhmMSAuaGdpZ25vcmVcbiAgICAgICAgICAgICAgICAvLyBvciBJbmRleDogaGVhZGVycyBsaWtlXG4gICAgICAgICAgICAgICAgLy8gICAgIEluZGV4OiBzb21ldGhpbmcgd2l0aCBtdWx0aXBsZSB3b3Jkc1xuICAgICAgICAgICAgICAgIC8vIHdlIGV4dHJhY3QgdGhlIHRyYWlsaW5nIGZpbGVuYW1lIGFzIHRoZSBpbmRleC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEl0IHNlZW1zIGF3a3dhcmQgdGhhdCB3ZSBpbmRpc2NyaW1pbmF0ZWx5IHRyaW0gb2ZmXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHJhaWxpbmcgd2hpdGVzcGFjZSBoZXJlLiBUaGVvcmV0aWNhbGx5LCBjb3VsZG4ndCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gICAgICAgYmUgbWVhbmluZ2Z1bCAtIGUuZy4gaWYgdGhlIHBhdGNoIHJlcHJlc2VudHMgYSBkaWZmIG9mIGFcbiAgICAgICAgICAgICAgICAvLyAgICAgICBmaWxlIHdob3NlIG5hbWUgZW5kcyB3aXRoIGEgc3BhY2U/IFNlZW1zIHdyb25nIHRvIG51a2VcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpdC4gQnV0IHRoaXMgYmVoYXZpb3VyIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSB2Mi4yLjEgaW5cbiAgICAgICAgICAgICAgICAvLyAgICAgICAyMDE1LCBzbyBpZiBpdCdzIGdvaW5nIHRvIGNoYW5nZSwgaXQgc2hvdWxkIGJlIGRvbmVcbiAgICAgICAgICAgICAgICAvLyAgICAgICBjYXV0aW91c2x5IGFuZCBpbiBhIG5ldyBtYWpvciByZWxlYXNlLCBmb3JcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiYWNrd2FyZHMtY29tcGF0IHJlYXNvbnMuXG4gICAgICAgICAgICAgICAgLy8gICAgICAgLS0gRXhwbG9kaW5nQ2FiYmFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlck1hdGNoID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysvKS5leGVjKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXJNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleC5pbmRleCA9IGxpbmUuc3Vic3RyaW5nKGhlYWRlck1hdGNoWzBdLmxlbmd0aCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgICAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcbiAgICAgICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcbiAgICAgICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcbiAgICAgICAgLy8gSWYgd2UgZ290IG9uZSBmaWxlIGhlYWRlciBidXQgbm90IHRoZSBvdGhlciwgdGhhdCdzIGEgbWFsZm9ybWVkIHBhdGNoLlxuICAgICAgICBpZiAoKGluZGV4Lm9sZEZpbGVOYW1lID09PSB1bmRlZmluZWQpICE9PSAoaW5kZXgubmV3RmlsZU5hbWUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyAnICsgKGluZGV4Lm9sZEZpbGVOYW1lICE9PSB1bmRlZmluZWQgPyAnXCIrKysgLi4uXCInIDogJ1wiLS0tIC4uLlwiJylcbiAgICAgICAgICAgICAgICArICcgZmlsZSBoZWFkZXIgZm9yICcgKyAoKF9hID0gaW5kZXgub2xkRmlsZU5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGluZGV4Lm5ld0ZpbGVOYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGRpZmZzdHJbaV07XG4gICAgICAgICAgICBpZiAoaXNEaWZmSGVhZGVyKGxpbmUpIHx8IGlzRmlsZUhlYWRlcihsaW5lKSB8fCAoL149PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LykudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNIdW5rSGVhZGVyKGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXguaHVua3MucHVzaChwYXJzZUh1bmsoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIGJsYW5rIGxpbmVzIGFuZCBhbnkgb3RoZXIgdW5yZWNvZ25pemVkIGNvbnRlbnQgYmV0d2VlblxuICAgICAgICAgICAgICAgIC8vIG9yIGFmdGVyIGh1bmtzLiBSZWFsLXdvcmxkIGV4YW1wbGVzIG9mIHN1Y2ggY29udGVudCBpbmNsdWRlOlxuICAgICAgICAgICAgICAgIC8vICAgLSBgT25seSBpbiA8ZGlyPjogPGZpbGU+YCBmcm9tIEdOVSBgZGlmZiAtcmBcbiAgICAgICAgICAgICAgICAvLyAgIC0gYFByb3BlcnR5IGNoYW5nZXMgb246YCBzZWN0aW9ucyBmcm9tIGBzdm4gZGlmZmBcbiAgICAgICAgICAgICAgICAvLyAgIC0gVHJhaWxpbmcgcHJvc2Ugb3IgY29tbWVudGFyeSBpbiBlbWFpbCBwYXRjaGVzXG4gICAgICAgICAgICAgICAgLy8gR05VIGBwYXRjaGAgdG9sZXJhdGVzIGFsbCBvZiB0aGVzZSwgYW5kIHNvIGRvIHdlLlxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdGhlIG9sZCBhbmQgbmV3IGZpbGVuYW1lcyBmcm9tIGEgYGRpZmYgLS1naXRgIGhlYWRlciBsaW5lLlxuICAgICAqXG4gICAgICogVGhlIGZvcm1hdCBpczpcbiAgICAgKiAgICAgZGlmZiAtLWdpdCBhLzxvbGQtcGF0aD4gYi88bmV3LXBhdGg+XG4gICAgICpcbiAgICAgKiBXaGVuIGZpbGVuYW1lcyBjb250YWluIHNwZWNpYWwgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmVzLCB0YWJzLFxuICAgICAqIGJhY2tzbGFzaGVzLCBvciBkb3VibGUgcXVvdGVzKSwgR2l0IHF1b3RlcyB0aGVtIHdpdGggQy1zdHlsZSBlc2NhcGluZzpcbiAgICAgKiAgICAgZGlmZiAtLWdpdCBcImEvZmlsZVxcdHdpdGhcXHR0YWJzLnR4dFwiIFwiYi9maWxlXFx0d2l0aFxcdHRhYnMudHh0XCJcbiAgICAgKlxuICAgICAqIFdoZW4gZmlsZW5hbWVzIGRvbid0IGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCB0aGUgb2xkIGFuZCBuZXcgbmFtZXNcbiAgICAgKiBhcmUgdGhlIHNhbWUsIHdlIGNhbiB1bmFtYmlndW91c2x5IHNwbGl0IG9uIGAgYi9gIGJ5IGZpbmRpbmcgd2hlcmUgdGhlXG4gICAgICogdHdvIGhhbHZlcyAoaW5jbHVkaW5nIHRoZWlyIGEvIGFuZCBiLyBwcmVmaXhlcykgeWllbGQgbWF0Y2hpbmcgYmFyZSBuYW1lcy5cbiAgICAgKlxuICAgICAqIEEgcGF0aG9sb2dpY2FsIGNhc2UgZXhpc3RzIGluIHdoaWNoIHdlIGNhbm5vdCByZWxpYWJseSBkZXRlcm1pbmUgdGhlIHBhdGhzXG4gICAgICogZnJvbSB0aGUgYGRpZmYgLS1naXRgIGhlYWRlci4gVGhpcyBjYXNlIGlzIHdoZW4gdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZTpcbiAgICAgKiAtIHRoZSBvbGQgYW5kIG5ldyBmaWxlIHBhdGhzIGRpZmZlclxuICAgICAqIC0gdGhleSBhcmUgYm90aCB1bnF1b3RlZCAoaS5lLiBjb250YWluIG5vIHNwZWNpYWwgY2hhcmFjdGVycylcbiAgICAgKiAtIGF0IGxlYXN0IG9uZSBvZiB0aGUgdW5kZXJseWluZyBmaWxlIHBhdGhzIGluY2x1ZGVzIHRoZSBzdWJzdHJpbmcgYCBiL2BcbiAgICAgKiBJbiB0aGlzIHNjZW5hcmlvLCB3ZSBkbyBub3Qga25vdyB3aGljaCBvY2N1cnJlbmNlIG9mIGAgYi9gIGluZGljYXRlcyB0aGVcbiAgICAgKiBzdGFydCBvZiB0aGUgbmV3IGZpbGUgcGF0aCwgc28gdGhlIGhlYWRlciBpcyBpbmhlcmVudGx5IGFtYmlndW91cy4gV2UgdGh1c1xuICAgICAqIHNlbGVjdCBhIHBvc3NpYmxlIGludGVycHJldGF0aW9uIGFyYml0cmFyaWx5IGFuZCByZXR1cm4gdGhhdC5cbiAgICAgKlxuICAgICAqIEZvcnR1bmF0ZWx5LCB0aGlzIGFtYmlndWl0eSBzaG91bGQgbmV2ZXIgbWF0dGVyLCBiZWNhdXNlIGluIGFueSBwYXRjaFxuICAgICAqIGdlbnVpbmVseSBvdXRwdXQgYnkgR2l0IGluIHdoaWNoIHRoaXMgcGF0aG9sb2dpY2FsIHNjZW5hcmlvIG9jY3VycywgdGhlcmVcbiAgICAgKiBtdXN0IGFsc28gYmUgYHJlbmFtZSBmcm9tYC9gcmVuYW1lIHRvYCBvciBgY29weSBmcm9tYC9gY29weSB0b2AgZXh0ZW5kZWRcbiAgICAgKiBoZWFkZXJzIHByZXNlbnQgYmVsb3cgdGhlIGBkaWZmIC0tZ2l0YCBoZWFkZXIuIGBwYXJzZUluZGV4YCB3aWxsIHBhcnNlXG4gICAgICogVEhPU0UgaGVhZGVycywgZnJvbSB3aGljaCB3ZSBDQU4gdW5hbWJpZ3VvdXNseSBkZXRlcm1pbmUgdGhlIGZpbGVuYW1lcyxcbiAgICAgKiBhbmQgd2lsbCBkaXNjYXJkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgaGVhZGVyIGNhbid0IGJlIHBhcnNlZCBhdCBhbGwgXHUyMDE0IGUuZy4gYSBxdW90ZWQgZmlsZW5hbWVcbiAgICAgKiBoYXMgYW4gdW50ZXJtaW5hdGVkIHF1b3RlLCBvciBpZiB0aGUgdW5xdW90ZWQgaGVhZGVyIGRvZXNuJ3QgbWF0Y2ggdGhlXG4gICAgICogZXhwZWN0ZWQgYGEvLi4uIGIvLi4uYCBmb3JtYXQuIEluIHRoYXQgY2FzZSwgdGhlIGNhbGxlciAocGFyc2VJbmRleClcbiAgICAgKiBza2lwcyBzZXR0aW5nIG9sZEZpbGVOYW1lL25ld0ZpbGVOYW1lIGZyb20gdGhpcyBoZWFkZXIsIGJ1dCB0aGV5IG1heVxuICAgICAqIHN0aWxsIGJlIHNldCBsYXRlciBmcm9tIGAtLS1gL2ArKytgIGxpbmVzIG9yIGByZW5hbWUgZnJvbWAvYHJlbmFtZSB0b2BcbiAgICAgKiBleHRlbmRlZCBoZWFkZXJzOyBpZiBub25lIG9mIHRob3NlIGFyZSBwcmVzZW50IGVpdGhlciwgdGhleSdsbCByZW1haW5cbiAgICAgKiB1bmRlZmluZWQgaW4gdGhlIG91dHB1dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUdpdERpZmZIZWFkZXIobGluZSkge1xuICAgICAgICAvLyBTdHJpcCB0aGUgXCJkaWZmIC0tZ2l0IFwiIHByZWZpeFxuICAgICAgICBjb25zdCByZXN0ID0gbGluZS5zdWJzdHJpbmcoJ2RpZmYgLS1naXQgJy5sZW5ndGgpO1xuICAgICAgICAvLyBIYW5kbGUgcXVvdGVkIHBhdGhzOiBcImEvcGF0aFwiIFwiYi9wYXRoXCJcbiAgICAgICAgLy8gR2l0IHF1b3RlcyBwYXRocyB3aGVuIHRoZXkgY29udGFpbiBjaGFyYWN0ZXJzIGxpa2UgbmV3bGluZXMsIHRhYnMsXG4gICAgICAgIC8vIGJhY2tzbGFzaGVzLCBvciBkb3VibGUgcXVvdGVzIChidXQgbm90YWJseSBub3Qgc3BhY2VzKS5cbiAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgY29uc3Qgb2xkUGF0aCA9IHBhcnNlUXVvdGVkRmlsZU5hbWUocmVzdCk7XG4gICAgICAgICAgICBpZiAob2xkUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJPbGQgPSByZXN0LnN1YnN0cmluZyhvbGRQYXRoLnJhd0xlbmd0aCArIDEpOyAvLyArMSBmb3Igc3BhY2VcbiAgICAgICAgICAgIGxldCBuZXdGaWxlTmFtZTtcbiAgICAgICAgICAgIGlmIChhZnRlck9sZC5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IHBhcnNlUXVvdGVkRmlsZU5hbWUoYWZ0ZXJPbGQpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdQYXRoID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdGaWxlTmFtZSA9IG5ld1BhdGguZmlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdGaWxlTmFtZSA9IGFmdGVyT2xkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvbGRGaWxlTmFtZTogb2xkUGF0aC5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICBuZXdGaWxlTmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2Vjb25kIHBhdGggaXMgcXVvdGVkXG4gICAgICAgIC8vIGUuZy4gZGlmZiAtLWdpdCBhL3NpbXBsZSBcImIvcmVuYW1lZFxcbm5ld2xpbmUudHh0XCJcbiAgICAgICAgY29uc3QgcXVvdGVJZHggPSByZXN0LmluZGV4T2YoJ1wiJyk7XG4gICAgICAgIGlmIChxdW90ZUlkeCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZpbGVOYW1lID0gcmVzdC5zdWJzdHJpbmcoMCwgcXVvdGVJZHggLSAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXJzZVF1b3RlZEZpbGVOYW1lKHJlc3Quc3Vic3RyaW5nKHF1b3RlSWR4KSk7XG4gICAgICAgICAgICBpZiAobmV3UGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvbGRGaWxlTmFtZSxcbiAgICAgICAgICAgICAgICBuZXdGaWxlTmFtZTogbmV3UGF0aC5maWxlTmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVbnF1b3RlZCBwYXRocy4gVHJ5IHRvIGZpbmQgdGhlIHNwbGl0IHBvaW50LlxuICAgICAgICAvLyBUaGUgZm9ybWF0IGlzOiBhLzxvbGQtcGF0aD4gYi88bmV3LXBhdGg+XG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGUgdGhlIHBvdGVudGlhbCBhbWJpZ3VpdHkgY2F1c2VkIGJ5IHRoZSBwb3NzaWJpbGl0eSBvZiB0aGUgZmlsZSBwYXRoc1xuICAgICAgICAvLyB0aGVtc2VsdmVzIGNvbnRhaW5pbmcgdGhlIHN1YnN0cmluZyBgIGIvYCwgcGx1cyB0aGUgcGF0aG9sb2dpY2FsIGNhc2VcbiAgICAgICAgLy8gZGVzY3JpYmVkIGluIHRoZSBjb21tZW50IGFib3ZlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTdHJhdGVneTogZmluZCBhbGwgb2NjdXJyZW5jZXMgb2YgXCIgYi9cIiBhbmQgc3BsaXQgb24gdGhlIG1pZGRsZVxuICAgICAgICAvLyBvbmUuIFdoZW4gb2xkIGFuZCBuZXcgbmFtZXMgYXJlIHRoZSBzYW1lICh3aGljaCBpcyB0aGUgb25seSBjYXNlIHdoZXJlXG4gICAgICAgIC8vIHdlIGNhbid0IHJlbHkgb24gZXh0ZW5kZWQgaGVhZGVycyBsYXRlciBpbiB0aGUgcGF0Y2ggc28gSEFWRSB0byBnZXRcbiAgICAgICAgLy8gdGhpcyByaWdodCksIHRoaXMgd2lsbCBhbHdheXMgYmUgdGhlIGNvcnJlY3Qgc3BsaXQuXG4gICAgICAgIGlmIChyZXN0LnN0YXJ0c1dpdGgoJ2EvJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlkeCA9IHJlc3QuaW5kZXhPZignIGIvJywgaWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwbGl0cy5wdXNoKGlkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BsaXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaWQgPSBzcGxpdHNbTWF0aC5mbG9vcihzcGxpdHMubGVuZ3RoIC8gMildO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEZpbGVOYW1lOiByZXN0LnN1YnN0cmluZygwLCBtaWQpLFxuICAgICAgICAgICAgICAgICAgICBuZXdGaWxlTmFtZTogcmVzdC5zdWJzdHJpbmcobWlkICsgMSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrOiBjYW4ndCBwYXJzZSwgcmV0dXJuIG51bGxcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBzYCBzdGFydHMgd2l0aCBhIGRvdWJsZSBxdW90ZSwgdW5xdW90ZXMgaXQgdXNpbmcgQy1zdHlsZSBlc2NhcGVcbiAgICAgKiBydWxlcyAoYXMgdXNlZCBieSBHaXQpLiBPdGhlcndpc2UgcmV0dXJucyBgc2AgYXMtaXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5xdW90ZUlmUXVvdGVkKHMpIHtcbiAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VRdW90ZWRGaWxlTmFtZShzKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkLmZpbGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBDLXN0eWxlIHF1b3RlZCBmaWxlbmFtZSBhcyB1c2VkIGJ5IEdpdCBvciBHTlUgYGRpZmYgLXVgLlxuICAgICAqIFJldHVybnMgdGhlIHVuZXNjYXBlZCBmaWxlbmFtZSBhbmQgdGhlIHJhdyBsZW5ndGggY29uc3VtZWQgKGluY2x1ZGluZyBxdW90ZXMpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlUXVvdGVkRmlsZU5hbWUocykge1xuICAgICAgICBpZiAoIXMuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBsZXQgaiA9IDE7IC8vIHNraXAgb3BlbmluZyBxdW90ZVxuICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc1tqXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGZpbGVOYW1lOiByZXN1bHQsIHJhd0xlbmd0aDogaiArIDEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzW2pdID09PSAnXFxcXCcgJiYgaiArIDEgPCBzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHNbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xceDA3JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxiJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxmJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICduJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFx0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFx2JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdcXFxcJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICc1JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnNic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzcnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDLXN0eWxlIG9jdGFsIGVzY2FwZXMgcmVwcmVzZW50IHJhdyBieXRlcy4gQ29sbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc2VjdXRpdmUgb2N0YWwtZXNjYXBlZCBieXRlcyBhbmQgZGVjb2RlIGFzIFVURi04LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB3ZSBoYXZlIGEgZnVsbCAzLWRpZ2l0IG9jdGFsIGVzY2FwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogKyAyID49IHMubGVuZ3RoIHx8IHNbaiArIDFdIDwgJzAnIHx8IHNbaiArIDFdID4gJzcnIHx8IHNbaiArIDJdIDwgJzAnIHx8IHNbaiArIDJdID4gJzcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IFtwYXJzZUludChzLnN1YnN0cmluZyhqLCBqICsgMyksIDgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzW2pdID09PSAnXFxcXCcgJiYgc1tqICsgMV0gPj0gJzAnICYmIHNbaiArIDFdIDw9ICc3Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICsgMyA+PSBzLmxlbmd0aCB8fCBzW2ogKyAyXSA8ICcwJyB8fCBzW2ogKyAyXSA+ICc3JyB8fCBzW2ogKyAzXSA8ICcwJyB8fCBzW2ogKyAzXSA+ICc3Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaChwYXJzZUludChzLnN1YnN0cmluZyhqICsgMSwgaiArIDQpLCA4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBqIGFscmVhZHkgcG9pbnRzIGF0IHRoZSBuZXh0IGNoYXJhY3RlclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbiBDLCB0aGVyZSBhcmUgYWxzbyB0aHJlZSBraW5kcyBvZiBoZXggZXNjYXBlIHNlcXVlbmNlczpcbiAgICAgICAgICAgICAgICAgICAgLy8gLSBcXHhoaFxuICAgICAgICAgICAgICAgICAgICAvLyAtIFxcdWhoaGhcbiAgICAgICAgICAgICAgICAgICAgLy8gLSBcXFVoaGhoaGhoaFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgYm90aGVyIHRvIHBhcnNlIHRoZW0gaGVyZSBiZWNhdXNlLCBzbyBmYXIgYXMgd2Uga25vdyxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgbmV2ZXIgZW1pdHRlZCBieSBhbnkgdG9vbHMgdGhhdCBnZW5lcmF0ZSB1bmlmaWVkIGRpZmZcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IGRpZmZzLCBhbmQgc28gZm9yIG5vdyBqc2RpZmYgZG9lcyBub3QgY29uc2lkZXIgdGhlbSBsZWdhbC5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW50ZXJtaW5hdGVkIHF1b3RlXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAgIC8vIGFyZSBjb25zdW1lZC5cbiAgICBmdW5jdGlvbiBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgZmlsZUhlYWRlck1hdGNoID0gKC9eKC0tLXxcXCtcXCtcXCspXFxzKy8pLmV4ZWMoZGlmZnN0cltpXSk7XG4gICAgICAgIGlmIChmaWxlSGVhZGVyTWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGZpbGVIZWFkZXJNYXRjaFsxXSwgZGF0YSA9IGRpZmZzdHJbaV0uc3Vic3RyaW5nKDMpLnRyaW0oKS5zcGxpdCgnXFx0JywgMiksIGhlYWRlciA9IChkYXRhWzFdIHx8ICcnKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBkYXRhWzBdO1xuICAgICAgICAgICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVucXVvdGVJZlF1b3RlZChmaWxlTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSAnLS0tJykge1xuICAgICAgICAgICAgICAgIGluZGV4Lm9sZEZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgaW5kZXgub2xkSGVhZGVyID0gaGVhZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXgubmV3RmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBpbmRleC5uZXdIZWFkZXIgPSBoZWFkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUGFyc2VzIGEgaHVua1xuICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSBodW5rLlxuICAgIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjaHVua0hlYWRlckluZGV4ID0gaSwgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLCBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcbiAgICAgICAgY29uc3QgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICAgICAgICBvbGRMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzJdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbMl0sXG4gICAgICAgICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuICAgICAgICAgICAgbmV3TGluZXM6IHR5cGVvZiBjaHVua0hlYWRlcls0XSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzRdLFxuICAgICAgICAgICAgbGluZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgICAgIC8vIHRoZSBmaXJzdCBudW1iZXIgaXMgb25lIGxvd2VyIHRoYW4gb25lIHdvdWxkIGV4cGVjdC5cbiAgICAgICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICAgICAgICBodW5rLm9sZFN0YXJ0ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgICAgICAgIGh1bmsubmV3U3RhcnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWRkQ291bnQgPSAwLCByZW1vdmVDb3VudCA9IDA7XG4gICAgICAgIGZvciAoOyBpIDwgZGlmZnN0ci5sZW5ndGggJiYgKHJlbW92ZUNvdW50IDwgaHVuay5vbGRMaW5lcyB8fCBhZGRDb3VudCA8IGh1bmsubmV3TGluZXMgfHwgKChfYSA9IGRpZmZzdHJbaV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGFydHNXaXRoKCdcXFxcJykpKTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSAoZGlmZnN0cltpXS5sZW5ndGggPT0gMCAmJiBpICE9IChkaWZmc3RyLmxlbmd0aCAtIDEpKSA/ICcgJyA6IGRpZmZzdHJbaV1bMF07XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycgfHwgb3BlcmF0aW9uID09PSAnLScgfHwgb3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIdW5rIGF0IGxpbmUgJHtjaHVua0hlYWRlckluZGV4ICsgMX0gY29udGFpbmVkIGludmFsaWQgbGluZSAke2RpZmZzdHJbaV19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBlbXB0eSBibG9jayBjb3VudCBjYXNlXG4gICAgICAgIGlmICghYWRkQ291bnQgJiYgaHVuay5uZXdMaW5lcyA9PT0gMSkge1xuICAgICAgICAgICAgaHVuay5uZXdMaW5lcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZW1vdmVDb3VudCAmJiBodW5rLm9sZExpbmVzID09PSAxKSB7XG4gICAgICAgICAgICBodW5rLm9sZExpbmVzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJmb3JtIHNhbml0eSBjaGVja2luZ1xuICAgICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWRkZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmEgaHVuay1ib2R5LWxpa2UgbGluZXMgYWZ0ZXIgdGhlIGRlY2xhcmVkIGxpbmUgY291bnRzXG4gICAgICAgIC8vIHdlcmUgZXhoYXVzdGVkLiBJZiB0aGUgdmVyeSBuZXh0IGxpbmUgc3RhcnRzIHdpdGggJyAnLCAnKycsIG9yICctJyxcbiAgICAgICAgLy8gdGhlIGh1bmsncyBsaW5lIGNvdW50cyB3ZXJlIHByb2JhYmx5IHdyb25nIFx1MjAxNCB1bmxlc3MgaXQncyBhIGZpbGVcbiAgICAgICAgLy8gaGVhZGVyICgtLS0gb3IgKysrKSwgd2hpY2ggbGVnaXRpbWF0ZWx5IGFwcGVhcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAgICAgICAvLyBodW5rIGluIG11bHRpLWZpbGUgZGlmZnMgd2l0aG91dCBJbmRleCBsaW5lcy5cbiAgICAgICAgaWYgKGkgPCBkaWZmc3RyLmxlbmd0aCAmJiBkaWZmc3RyW2ldICYmICgvXlsrIC1dLykudGVzdChkaWZmc3RyW2ldKVxuICAgICAgICAgICAgJiYgIWlzRmlsZUhlYWRlcihkaWZmc3RyW2ldKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdIdW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICArICcgaGFzIG1vcmUgbGluZXMgdGhhbiBleHBlY3RlZCAoZXhwZWN0ZWQgJ1xuICAgICAgICAgICAgICAgICsgaHVuay5vbGRMaW5lcyArICcgb2xkIGxpbmVzIGFuZCAnICsgaHVuay5uZXdMaW5lcyArICcgbmV3IGxpbmVzKScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodW5rO1xuICAgIH1cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICAgIHBhcnNlSW5kZXgoKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG4vLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbi8vIGJ5IGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdGFydCBwb3NpdGlvbi4gSS5lLiBmb3IgWzAsIDRdLCB3aXRoXG4vLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuZnVuY3Rpb24gZGVmYXVsdF8xKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gICAgbGV0IHdhbnRGb3J3YXJkID0gdHJ1ZSwgYmFja3dhcmRFeGhhdXN0ZWQgPSBmYWxzZSwgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLCBsb2NhbE9mZnNldCA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGl0ZXJhdG9yKCkge1xuICAgICAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICAgICAgICAgIGxvY2FsT2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3YW50Rm9yd2FyZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgICAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG4gICAgICAgICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgbG9jYWxPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3J3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJhY2t3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgICAgICBpZiAoIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0cnlpbmcgdG8gZml0IGJlZm9yZSB0ZXh0IGJlZ2lubmluZywgYW5kIGlmIG5vdCwgY2hlY2sgaXQgZml0c1xuICAgICAgICAgICAgLy8gYmVmb3JlIG9mZnNldCBsb2NhdGlvblxuICAgICAgICAgICAgaWYgKG1pbkxpbmUgPD0gc3RhcnQgLSBsb2NhbE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCAtIGxvY2FsT2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuICAgICAgICAvLyBodW5rIGNhbid0IGZpdCBvbiB0aGUgdGV4dC4gUmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFwcGx5UGF0Y2ggPSBhcHBseVBhdGNoO1xuZXhwb3J0cy5hcHBseVBhdGNoZXMgPSBhcHBseVBhdGNoZXM7XG5jb25zdCBzdHJpbmdfanNfMSA9IHJlcXVpcmUoXCIuLi91dGlsL3N0cmluZy5qc1wiKTtcbmNvbnN0IGxpbmVfZW5kaW5nc19qc18xID0gcmVxdWlyZShcIi4vbGluZS1lbmRpbmdzLmpzXCIpO1xuY29uc3QgcGFyc2VfanNfMSA9IHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpO1xuY29uc3QgZGlzdGFuY2VfaXRlcmF0b3JfanNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vdXRpbC9kaXN0YW5jZS1pdGVyYXRvci5qc1wiKSk7XG4vKipcbiAqIGF0dGVtcHRzIHRvIGFwcGx5IGEgdW5pZmllZCBkaWZmIHBhdGNoLlxuICpcbiAqIEh1bmtzIGFyZSBhcHBsaWVkIGZpcnN0IHRvIGxhc3QuXG4gKiBgYXBwbHlQYXRjaGAgZmlyc3QgdHJpZXMgdG8gYXBwbHkgdGhlIGZpcnN0IGh1bmsgYXQgdGhlIGxpbmUgbnVtYmVyIHNwZWNpZmllZCBpbiB0aGUgaHVuayBoZWFkZXIsIGFuZCB3aXRoIGFsbCBjb250ZXh0IGxpbmVzIG1hdGNoaW5nIGV4YWN0bHkuXG4gKiBJZiB0aGF0IGZhaWxzLCBpdCB0cmllcyBzY2FubmluZyBiYWNrd2FyZHMgYW5kIGZvcndhcmRzLCBvbmUgbGluZSBhdCBhIHRpbWUsIHRvIGZpbmQgYSBwbGFjZSB0byBhcHBseSB0aGUgaHVuayB3aGVyZSB0aGUgY29udGV4dCBsaW5lcyBtYXRjaCBleGFjdGx5LlxuICogSWYgdGhhdCBzdGlsbCBmYWlscywgYW5kIGBmdXp6RmFjdG9yYCBpcyBncmVhdGVyIHRoYW4gemVybywgaXQgaW5jcmVtZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyAobWlzc2luZywgZXh0cmEsIG9yIGNoYW5nZWQgY29udGV4dCBsaW5lcykgdGhhdCB0aGVyZSBjYW4gYmUgYmV0d2VlbiB0aGUgaHVuayBjb250ZXh0IGFuZCBhIHJlZ2lvbiB3aGVyZSB3ZSBhcmUgdHJ5aW5nIHRvIGFwcGx5IHRoZSBwYXRjaCBzdWNoIHRoYXQgdGhlIGh1bmsgd2lsbCBzdGlsbCBiZSBjb25zaWRlcmVkIHRvIG1hdGNoLlxuICogUmVnYXJkbGVzcyBvZiBgZnV6ekZhY3RvcmAsIGxpbmVzIHRvIGJlIGRlbGV0ZWQgaW4gdGhlIGh1bmsgKm11c3QqIGJlIHByZXNlbnQgZm9yIGEgaHVuayB0byBtYXRjaCwgYW5kIHRoZSBjb250ZXh0IGxpbmVzICppbW1lZGlhdGVseSogYmVmb3JlIGFuZCBhZnRlciBhbiBpbnNlcnRpb24gbXVzdCBtYXRjaCBleGFjdGx5LlxuICpcbiAqIE9uY2UgYSBodW5rIGlzIHN1Y2Nlc3NmdWxseSBmaXR0ZWQsIHRoZSBwcm9jZXNzIGJlZ2lucyBhZ2FpbiB3aXRoIHRoZSBuZXh0IGh1bmsuXG4gKiBSZWdhcmRsZXNzIG9mIGBmdXp6RmFjdG9yYCwgbGF0ZXIgaHVua3MgbXVzdCBiZSBhcHBsaWVkIGxhdGVyIGluIHRoZSBmaWxlIHRoYW4gZWFybGllciBodW5rcy5cbiAqXG4gKiBJZiBhIGh1bmsgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBmaXR0ZWQgKmFueXdoZXJlKiB3aXRoIGZld2VyIHRoYW4gYGZ1enpGYWN0b3JgIG1pc21hdGNoZXMsIGBhcHBseVBhdGNoYCBmYWlscyBhbmQgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIElmIGEgaHVuayBpcyBzdWNjZXNzZnVsbHkgZml0dGVkIGJ1dCBub3QgYXQgdGhlIGxpbmUgbnVtYmVyIHNwZWNpZmllZCBieSB0aGUgaHVuayBoZWFkZXIsIGFsbCBzdWJzZXF1ZW50IGh1bmtzIGhhdmUgdGhlaXIgdGFyZ2V0IGxpbmUgbnVtYmVyIGFkanVzdGVkIGFjY29yZGluZ2x5LlxuICogKGUuZy4gaWYgdGhlIGZpcnN0IGh1bmsgaXMgYXBwbGllZCAxMCBsaW5lcyBiZWxvdyB3aGVyZSB0aGUgaHVuayBoZWFkZXIgc2FpZCBpdCBzaG91bGQgZml0LCBgYXBwbHlQYXRjaGAgd2lsbCAqc3RhcnQqIGxvb2tpbmcgZm9yIHNvbWV3aGVyZSB0byBhcHBseSB0aGUgc2Vjb25kIGh1bmsgMTAgbGluZXMgYmVsb3cgd2hlcmUgaXRzIGh1bmsgaGVhZGVyIHNheXMgaXQgZ29lcy4pXG4gKlxuICogSWYgdGhlIHBhdGNoIHdhcyBhcHBsaWVkIHN1Y2Nlc3NmdWxseSwgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXRjaGVkIHRleHQuXG4gKiBJZiB0aGUgcGF0Y2ggY291bGQgbm90IGJlIGFwcGxpZWQgKGJlY2F1c2Ugc29tZSBodW5rcyBpbiB0aGUgcGF0Y2ggY291bGRuJ3QgYmUgZml0dGVkIHRvIHRoZSB0ZXh0IGluIGBzb3VyY2VgKSwgYGFwcGx5UGF0Y2hgIHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHBhdGNoIGEgc3RyaW5nIGRpZmYgb3IgdGhlIG91dHB1dCBmcm9tIHRoZSBgcGFyc2VQYXRjaGAgb3IgYHN0cnVjdHVyZWRQYXRjaGAgbWV0aG9kcy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlQYXRjaChzb3VyY2UsIHBhdGNoLCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgcGF0Y2hlcztcbiAgICBpZiAodHlwZW9mIHBhdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXRjaGVzID0gKDAsIHBhcnNlX2pzXzEucGFyc2VQYXRjaCkocGF0Y2gpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgICBwYXRjaGVzID0gcGF0Y2g7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwYXRjaGVzID0gW3BhdGNoXTtcbiAgICB9XG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHlTdHJ1Y3R1cmVkUGF0Y2goc291cmNlLCBwYXRjaGVzWzBdLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGFwcGx5U3RydWN0dXJlZFBhdGNoKHNvdXJjZSwgcGF0Y2gsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChvcHRpb25zLmF1dG9Db252ZXJ0TGluZUVuZGluZ3MgfHwgb3B0aW9ucy5hdXRvQ29udmVydExpbmVFbmRpbmdzID09IG51bGwpIHtcbiAgICAgICAgaWYgKCgwLCBzdHJpbmdfanNfMS5oYXNPbmx5V2luTGluZUVuZGluZ3MpKHNvdXJjZSkgJiYgKDAsIGxpbmVfZW5kaW5nc19qc18xLmlzVW5peCkocGF0Y2gpKSB7XG4gICAgICAgICAgICBwYXRjaCA9ICgwLCBsaW5lX2VuZGluZ3NfanNfMS51bml4VG9XaW4pKHBhdGNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgc3RyaW5nX2pzXzEuaGFzT25seVVuaXhMaW5lRW5kaW5ncykoc291cmNlKSAmJiAoMCwgbGluZV9lbmRpbmdzX2pzXzEuaXNXaW4pKHBhdGNoKSkge1xuICAgICAgICAgICAgcGF0Y2ggPSAoMCwgbGluZV9lbmRpbmdzX2pzXzEud2luVG9Vbml4KShwYXRjaCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gICAgY29uc3QgbGluZXMgPSBzb3VyY2Uuc3BsaXQoJ1xcbicpLCBodW5rcyA9IHBhdGNoLmh1bmtzLCBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSwgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwO1xuICAgIGxldCBtaW5MaW5lID0gMDtcbiAgICBpZiAoZnV6ekZhY3RvciA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIoZnV6ekZhY3RvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdXp6RmFjdG9yIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHBhdGNoLlxuICAgIGlmICghaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlLCBoYW5kbGUgRU9GTkwgaW5zZXJ0aW9uL3JlbW92YWwuIElmIHRoZSBwYXRjaCB0ZWxscyB1cyB0byBtYWtlIGEgY2hhbmdlXG4gICAgLy8gdG8gdGhlIEVPRk5MIHRoYXQgaXMgcmVkdW5kYW50L2ltcG9zc2libGUgLSBpLmUuIHRvIHJlbW92ZSBhIG5ld2xpbmUgdGhhdCdzIG5vdCB0aGVyZSwgb3IgYWRkIGFcbiAgICAvLyBuZXdsaW5lIHRoYXQgYWxyZWFkeSBleGlzdHMgLSB0aGVuIHdlIGVpdGhlciByZXR1cm4gZmFsc2UgYW5kIGZhaWwgdG8gYXBwbHkgdGhlIHBhdGNoIChpZlxuICAgIC8vIGZ1enpGYWN0b3IgaXMgMCkgb3Igc2ltcGx5IGlnbm9yZSB0aGUgcHJvYmxlbSBhbmQgZG8gbm90aGluZyAoaWYgZnV6ekZhY3RvciBpcyA+MCkuXG4gICAgLy8gSWYgd2UgZG8gbmVlZCB0byByZW1vdmUvYWRkIGEgbmV3bGluZSBhdCBFT0YsIHRoaXMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGZpbmFsIGh1bms6XG4gICAgbGV0IHByZXZMaW5lID0gJycsIHJlbW92ZUVPRk5MID0gZmFsc2UsIGFkZEVPRk5MID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rc1todW5rcy5sZW5ndGggLSAxXS5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gaHVua3NbaHVua3MubGVuZ3RoIC0gMV0ubGluZXNbaV07XG4gICAgICAgIGlmIChsaW5lWzBdID09ICdcXFxcJykge1xuICAgICAgICAgICAgaWYgKHByZXZMaW5lWzBdID09ICcrJykge1xuICAgICAgICAgICAgICAgIHJlbW92ZUVPRk5MID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByZXZMaW5lWzBdID09ICctJykge1xuICAgICAgICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmV2TGluZSA9IGxpbmU7XG4gICAgfVxuICAgIGlmIChyZW1vdmVFT0ZOTCkge1xuICAgICAgICBpZiAoYWRkRU9GTkwpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIGZpbmFsIGxpbmUgZ2V0cyBjaGFuZ2VkIGJ1dCBkb2Vzbid0IGhhdmUgYSB0cmFpbGluZyBuZXdsaW5lIGluIGVpdGhlciB0aGVcbiAgICAgICAgICAgIC8vIG9yaWdpbmFsIG9yIHBhdGNoZWQgdmVyc2lvbi4gSW4gdGhhdCBjYXNlLCB3ZSBkbyBub3RoaW5nIGlmIGZ1enpGYWN0b3IgPiAwLCBhbmQgaWZcbiAgICAgICAgICAgIC8vIGZ1enpGYWN0b3IgaXMgMCwgd2Ugc2ltcGx5IHZhbGlkYXRlIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGhhcyBubyB0cmFpbGluZyBuZXdsaW5lLlxuICAgICAgICAgICAgaWYgKCFmdXp6RmFjdG9yICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09ICcnKSB7XG4gICAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgICAgIGlmIChsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSAhPSAnJykge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgY2FuIGJlIG1hZGUgdG8gZml0IGF0IHRoZSBwcm92aWRlZCBsb2NhdGlvbiB3aXRoIGF0IG1vc3QgYG1heEVycm9yc2BcbiAgICAgKiBpbnNlcnRpb25zLCBzdWJzdGl0dXRpb25zLCBvciBkZWxldGlvbnMsIHdoaWxlIGVuc3VyaW5nIGFsc28gdGhhdDpcbiAgICAgKiAtIGxpbmVzIGRlbGV0ZWQgaW4gdGhlIGh1bmsgbWF0Y2ggZXhhY3RseSwgYW5kXG4gICAgICogLSB3aGVyZXZlciBhbiBpbnNlcnRpb24gb3BlcmF0aW9uIG9yIGJsb2NrIG9mIGluc2VydGlvbiBvcGVyYXRpb25zIGFwcGVhcnMgaW4gdGhlIGh1bmssIHRoZVxuICAgICAqICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgbGluZXMgb2YgY29udGV4dCBtYXRjaCBleGFjdGx5XG4gICAgICpcbiAgICAgKiBgdG9Qb3NgIHNob3VsZCBiZSBzZXQgc3VjaCB0aGF0IGxpbmVzW3RvUG9zXSBpcyBtZWFudCB0byBtYXRjaCBodW5rTGluZXNbMF0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgaHVuayBjYW4gYmUgYXBwbGllZCwgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBvbGRMaW5lTGFzdElgIGFuZFxuICAgICAqIGByZXBsYWNlbWVudExpbmVzYC4gT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXBwbHlIdW5rKGh1bmtMaW5lcywgdG9Qb3MsIG1heEVycm9ycywgaHVua0xpbmVzSSA9IDAsIGxhc3RDb250ZXh0TGluZU1hdGNoZWQgPSB0cnVlLCBwYXRjaGVkTGluZXMgPSBbXSwgcGF0Y2hlZExpbmVzTGVuZ3RoID0gMCkge1xuICAgICAgICBsZXQgbkNvbnNlY3V0aXZlT2xkQ29udGV4dExpbmVzID0gMDtcbiAgICAgICAgbGV0IG5leHRDb250ZXh0TGluZU11c3RNYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKDsgaHVua0xpbmVzSSA8IGh1bmtMaW5lcy5sZW5ndGg7IGh1bmtMaW5lc0krKykge1xuICAgICAgICAgICAgY29uc3QgaHVua0xpbmUgPSBodW5rTGluZXNbaHVua0xpbmVzSV0sIG9wZXJhdGlvbiA9IChodW5rTGluZS5sZW5ndGggPiAwID8gaHVua0xpbmVbMF0gOiAnICcpLCBjb250ZW50ID0gKGh1bmtMaW5lLmxlbmd0aCA+IDAgPyBodW5rTGluZS5zdWJzdHIoMSkgOiBodW5rTGluZSk7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9Qb3MrKztcbiAgICAgICAgICAgICAgICAgICAgbkNvbnNlY3V0aXZlT2xkQ29udGV4dExpbmVzID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWF4RXJyb3JzIHx8IGxpbmVzW3RvUG9zXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXRjaGVkTGluZXNbcGF0Y2hlZExpbmVzTGVuZ3RoXSA9IGxpbmVzW3RvUG9zXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5SHVuayhodW5rTGluZXMsIHRvUG9zICsgMSwgbWF4RXJyb3JzIC0gMSwgaHVua0xpbmVzSSwgZmFsc2UsIHBhdGNoZWRMaW5lcywgcGF0Y2hlZExpbmVzTGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0Q29udGV4dExpbmVNYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXRjaGVkTGluZXNbcGF0Y2hlZExpbmVzTGVuZ3RoXSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgcGF0Y2hlZExpbmVzTGVuZ3RoKys7XG4gICAgICAgICAgICAgICAgbkNvbnNlY3V0aXZlT2xkQ29udGV4dExpbmVzID0gMDtcbiAgICAgICAgICAgICAgICBuZXh0Q29udGV4dExpbmVNdXN0TWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgbkNvbnNlY3V0aXZlT2xkQ29udGV4dExpbmVzKys7XG4gICAgICAgICAgICAgICAgcGF0Y2hlZExpbmVzW3BhdGNoZWRMaW5lc0xlbmd0aF0gPSBsaW5lc1t0b1Bvc107XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVMaW5lKHRvUG9zICsgMSwgbGluZXNbdG9Qb3NdLCBvcGVyYXRpb24sIGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoZWRMaW5lc0xlbmd0aCsrO1xuICAgICAgICAgICAgICAgICAgICBsYXN0Q29udGV4dExpbmVNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dENvbnRleHRMaW5lTXVzdE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRvUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENvbnRleHRMaW5lTXVzdE1hdGNoIHx8ICFtYXhFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIDMgcG9zc2liaWxpdGllcyBpbiBzZXF1ZW5jZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gMS4gbGluZXMgY29udGFpbnMgYSAqc3Vic3RpdHV0aW9uKiBub3QgaW5jbHVkZWQgaW4gdGhlIHBhdGNoIGNvbnRleHQsIG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIGxpbmVzIGNvbnRhaW5zIGFuICppbnNlcnRpb24qIG5vdCBpbmNsdWRlZCBpbiB0aGUgcGF0Y2ggY29udGV4dCwgb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gMy4gbGluZXMgY29udGFpbnMgYSAqZGVsZXRpb24qIG5vdCBpbmNsdWRlZCBpbiB0aGUgcGF0Y2ggY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdHdvIG9wdGlvbnMgYXJlIG9mIGNvdXJzZSBvbmx5IHBvc3NpYmxlIGlmIHRoZSBsaW5lIGZyb20gbGluZXMgaXMgbm9uLW51bGwgLVxuICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG9ubHkgb3B0aW9uIDMgaXMgcG9zc2libGUgaWYgd2UndmUgb3ZlcnJ1biB0aGUgZW5kIG9mIHRoZSBvbGQgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsaW5lc1t0b1Bvc10gJiYgKGFwcGx5SHVuayhodW5rTGluZXMsIHRvUG9zICsgMSwgbWF4RXJyb3JzIC0gMSwgaHVua0xpbmVzSSArIDEsIGZhbHNlLCBwYXRjaGVkTGluZXMsIHBhdGNoZWRMaW5lc0xlbmd0aCArIDEpIHx8IGFwcGx5SHVuayhodW5rTGluZXMsIHRvUG9zICsgMSwgbWF4RXJyb3JzIC0gMSwgaHVua0xpbmVzSSwgZmFsc2UsIHBhdGNoZWRMaW5lcywgcGF0Y2hlZExpbmVzTGVuZ3RoICsgMSkpIHx8IGFwcGx5SHVuayhodW5rTGluZXMsIHRvUG9zLCBtYXhFcnJvcnMgLSAxLCBodW5rTGluZXNJICsgMSwgZmFsc2UsIHBhdGNoZWRMaW5lcywgcGF0Y2hlZExpbmVzTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJlZm9yZSByZXR1cm5pbmcsIHRyaW0gYW55IHVubW9kaWZpZWQgY29udGV4dCBsaW5lcyBvZmYgdGhlIGVuZCBvZiBwYXRjaGVkTGluZXMgYW5kIHJlZHVjZVxuICAgICAgICAvLyB0b1BvcyAoYW5kIHRodXMgb2xkTGluZUxhc3RJKSBhY2NvcmRpbmdseS4gVGhpcyBhbGxvd3MgbGF0ZXIgaHVua3MgdG8gYmUgYXBwbGllZCB0byBhIHJlZ2lvblxuICAgICAgICAvLyB0aGF0IHN0YXJ0cyBpbiB0aGlzIGh1bmsncyB0cmFpbGluZyBjb250ZXh0LlxuICAgICAgICBwYXRjaGVkTGluZXNMZW5ndGggLT0gbkNvbnNlY3V0aXZlT2xkQ29udGV4dExpbmVzO1xuICAgICAgICB0b1BvcyAtPSBuQ29uc2VjdXRpdmVPbGRDb250ZXh0TGluZXM7XG4gICAgICAgIHBhdGNoZWRMaW5lcy5sZW5ndGggPSBwYXRjaGVkTGluZXNMZW5ndGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRjaGVkTGluZXMsXG4gICAgICAgICAgICBvbGRMaW5lTGFzdEk6IHRvUG9zIC0gMVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRMaW5lcyA9IFtdO1xuICAgIC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcbiAgICBsZXQgcHJldkh1bmtPZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaHVuayA9IGh1bmtzW2ldO1xuICAgICAgICBsZXQgaHVua1Jlc3VsdDtcbiAgICAgICAgY29uc3QgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMgKyBmdXp6RmFjdG9yO1xuICAgICAgICBsZXQgdG9Qb3M7XG4gICAgICAgIGZvciAobGV0IG1heEVycm9ycyA9IDA7IG1heEVycm9ycyA8PSBmdXp6RmFjdG9yOyBtYXhFcnJvcnMrKykge1xuICAgICAgICAgICAgdG9Qb3MgPSBodW5rLm9sZFN0YXJ0ICsgcHJldkh1bmtPZmZzZXQgLSAxO1xuICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSAoMCwgZGlzdGFuY2VfaXRlcmF0b3JfanNfMS5kZWZhdWx0KSh0b1BvcywgbWluTGluZSwgbWF4TGluZSk7XG4gICAgICAgICAgICBmb3IgKDsgdG9Qb3MgIT09IHVuZGVmaW5lZDsgdG9Qb3MgPSBpdGVyYXRvcigpKSB7XG4gICAgICAgICAgICAgICAgaHVua1Jlc3VsdCA9IGFwcGx5SHVuayhodW5rLmxpbmVzLCB0b1BvcywgbWF4RXJyb3JzKTtcbiAgICAgICAgICAgICAgICBpZiAoaHVua1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaHVua1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaHVua1Jlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvcHkgZXZlcnl0aGluZyBmcm9tIHRoZSBlbmQgb2Ygd2hlcmUgd2UgYXBwbGllZCB0aGUgbGFzdCBodW5rIHRvIHRoZSBzdGFydCBvZiB0aGlzIGh1bmtcbiAgICAgICAgZm9yIChsZXQgaSA9IG1pbkxpbmU7IGkgPCB0b1BvczsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgdGhlIGxpbmVzIHByb2R1Y2VkIGJ5IGFwcGx5aW5nIHRoZSBodW5rOlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtSZXN1bHQucGF0Y2hlZExpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gaHVua1Jlc3VsdC5wYXRjaGVkTGluZXNbaV07XG4gICAgICAgICAgICByZXN1bHRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG4gICAgICAgIG1pbkxpbmUgPSBodW5rUmVzdWx0Lm9sZExpbmVMYXN0SSArIDE7XG4gICAgICAgIC8vIE5vdGUgdGhlIG9mZnNldCBiZXR3ZWVuIHdoZXJlIHRoZSBwYXRjaCBzYWlkIHRoZSBodW5rIHNob3VsZCd2ZSBhcHBsaWVkIGFuZCB3aGVyZSB3ZVxuICAgICAgICAvLyBhcHBsaWVkIGl0LCBzbyB3ZSBjYW4gYWRqdXN0IGZ1dHVyZSBodW5rcyBhY2NvcmRpbmdseTpcbiAgICAgICAgcHJldkh1bmtPZmZzZXQgPSB0b1BvcyArIDEgLSBodW5rLm9sZFN0YXJ0O1xuICAgIH1cbiAgICAvLyBDb3B5IG92ZXIgdGhlIHJlc3Qgb2YgdGhlIGxpbmVzIGZyb20gdGhlIG9sZCB0ZXh0XG4gICAgZm9yIChsZXQgaSA9IG1pbkxpbmU7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdExpbmVzLmpvaW4oJ1xcbicpO1xufVxuLyoqXG4gKiBhcHBsaWVzIG9uZSBvciBtb3JlIHBhdGNoZXMuXG4gKlxuICogYHBhdGNoYCBtYXkgYmUgZWl0aGVyIGFuIGFycmF5IG9mIHN0cnVjdHVyZWQgcGF0Y2ggb2JqZWN0cywgb3IgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgcGF0Y2ggaW4gdW5pZmllZCBkaWZmIGZvcm1hdCAod2hpY2ggbWF5IHBhdGNoIG9uZSBvciBtb3JlIGZpbGVzKS5cbiAqXG4gKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgY29udGVudHMgb2YgdGhlIHBhdGNoIGFuZCBhcHBseSB0byBkYXRhIHByb3ZpZGVkIHRocm91Z2ggY2FsbGJhY2tzLiBUaGUgZ2VuZXJhbCBmbG93IGZvciBlYWNoIHBhdGNoIGluZGV4IGlzOlxuICpcbiAqIC0gYG9wdGlvbnMubG9hZEZpbGUoaW5kZXgsIGNhbGxiYWNrKWAgaXMgY2FsbGVkLiBUaGUgY2FsbGVyIHNob3VsZCB0aGVuIGxvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFuZCB0aGVuIHBhc3MgdGhhdCB0byB0aGUgYGNhbGxiYWNrKGVyciwgZGF0YSlgIGNhbGxiYWNrLiBQYXNzaW5nIGFuIGBlcnJgIHdpbGwgdGVybWluYXRlIGZ1cnRoZXIgcGF0Y2ggZXhlY3V0aW9uLlxuICogLSBgb3B0aW9ucy5wYXRjaGVkKGluZGV4LCBjb250ZW50LCBjYWxsYmFjaylgIGlzIGNhbGxlZCBvbmNlIHRoZSBwYXRjaCBoYXMgYmVlbiBhcHBsaWVkLiBgY29udGVudGAgd2lsbCBiZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYGFwcGx5UGF0Y2hgLiBXaGVuIGl0J3MgcmVhZHksIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgYGNhbGxiYWNrKGVycilgIGNhbGxiYWNrLiBQYXNzaW5nIGFuIGBlcnJgIHdpbGwgdGVybWluYXRlIGZ1cnRoZXIgcGF0Y2ggZXhlY3V0aW9uLlxuICpcbiAqIE9uY2UgYWxsIHBhdGNoZXMgaGF2ZSBiZWVuIGFwcGxpZWQgb3IgYW4gZXJyb3Igb2NjdXJzLCB0aGUgYG9wdGlvbnMuY29tcGxldGUoZXJyKWAgY2FsbGJhY2sgaXMgbWFkZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlQYXRjaGVzKHVuaURpZmYsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzcERpZmYgPSB0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycgPyAoMCwgcGFyc2VfanNfMS5wYXJzZVBhdGNoKSh1bmlEaWZmKSA6IHVuaURpZmY7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0luZGV4KCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHNwRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgICAgIGlmICghaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5sb2FkRmlsZShpbmRleCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGFwcGx5UGF0Y2goZGF0YSwgaW5kZXgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgb3B0aW9ucy5wYXRjaGVkKGluZGV4LCB1cGRhdGVkQ29udGVudCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0luZGV4KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByb2Nlc3NJbmRleCgpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZXZlcnNlUGF0Y2ggPSByZXZlcnNlUGF0Y2g7XG5mdW5jdGlvbiBzd2FwUHJlZml4KGZpbGVOYW1lKSB7XG4gICAgaWYgKGZpbGVOYW1lID09PSB1bmRlZmluZWQgfHwgZmlsZU5hbWUgPT09ICcvZGV2L251bGwnKSB7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2EvJykpIHtcbiAgICAgICAgcmV0dXJuICdiLycgKyBmaWxlTmFtZS5zbGljZSgyKTtcbiAgICB9XG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2IvJykpIHtcbiAgICAgICAgcmV0dXJuICdhLycgKyBmaWxlTmFtZS5zbGljZSgyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xufVxuZnVuY3Rpb24gcmV2ZXJzZVBhdGNoKHN0cnVjdHVyZWRQYXRjaCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN0cnVjdHVyZWRQYXRjaCkpIHtcbiAgICAgICAgLy8gKFNlZSBjb21tZW50IGluIHVuaXhUb1dpbiBmb3Igd2h5IHdlIG5lZWQgdGhlIHBvaW50bGVzcy1sb29raW5nIGFub255bW91cyBmdW5jdGlvbiBoZXJlKVxuICAgICAgICByZXR1cm4gc3RydWN0dXJlZFBhdGNoLm1hcChwYXRjaCA9PiByZXZlcnNlUGF0Y2gocGF0Y2gpKS5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGNvbnN0IHJldmVyc2VkID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHJ1Y3R1cmVkUGF0Y2gpLCB7IG9sZEZpbGVOYW1lOiBzdHJ1Y3R1cmVkUGF0Y2guaXNHaXQgPyBzd2FwUHJlZml4KHN0cnVjdHVyZWRQYXRjaC5uZXdGaWxlTmFtZSkgOiBzdHJ1Y3R1cmVkUGF0Y2gubmV3RmlsZU5hbWUsIG9sZEhlYWRlcjogc3RydWN0dXJlZFBhdGNoLm5ld0hlYWRlciwgbmV3RmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5pc0dpdCA/IHN3YXBQcmVmaXgoc3RydWN0dXJlZFBhdGNoLm9sZEZpbGVOYW1lKSA6IHN0cnVjdHVyZWRQYXRjaC5vbGRGaWxlTmFtZSwgbmV3SGVhZGVyOiBzdHJ1Y3R1cmVkUGF0Y2gub2xkSGVhZGVyLCBvbGRNb2RlOiBzdHJ1Y3R1cmVkUGF0Y2gubmV3TW9kZSwgbmV3TW9kZTogc3RydWN0dXJlZFBhdGNoLm9sZE1vZGUsIGlzQ3JlYXRlOiBzdHJ1Y3R1cmVkUGF0Y2guaXNEZWxldGUsIGlzRGVsZXRlOiBzdHJ1Y3R1cmVkUGF0Y2guaXNDcmVhdGUsIGh1bmtzOiBzdHJ1Y3R1cmVkUGF0Y2guaHVua3MubWFwKGh1bmsgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvbGRMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgICAgICAgICAgICBvbGRTdGFydDogaHVuay5uZXdTdGFydCxcbiAgICAgICAgICAgICAgICBuZXdMaW5lczogaHVuay5vbGRMaW5lcyxcbiAgICAgICAgICAgICAgICBuZXdTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgICAgICAgICAgICBsaW5lczogaHVuay5saW5lcy5tYXAobCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGArJHtsLnNsaWNlKDEpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGwuc3RhcnRzV2l0aCgnKycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC0ke2wuc2xpY2UoMSl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkgfSk7XG4gICAgaWYgKHN0cnVjdHVyZWRQYXRjaC5pc0NvcHkpIHtcbiAgICAgICAgLy8gUmV2ZXJzaW5nIGEgY29weSBtZWFucyBkZWxldGluZyB0aGUgZmlsZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSBjb3B5LlxuICAgICAgICAvLyBUaGUgXCJvbGRcIiBmaWxlIGluIHRoZSByZXZlcnNlZCBwYXRjaCBpcyB0aGUgY29weSBkZXN0aW5hdGlvbiAod2hpY2hcbiAgICAgICAgLy8gZXhpc3RzIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCksIGFuZCB0aGUgXCJuZXdcIiBmaWxlIGlzIC9kZXYvbnVsbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogd2UgY2xlYXIgdGhlIGh1bmtzIGJlY2F1c2UgdGhlIG9yaWdpbmFsIGNvcHkncyBodW5rcyBkZXNjcmliZVxuICAgICAgICAvLyB0aGUgZGlmZiBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLCBub3QgdGhlIGZ1bGwgY29udGVudCBvZlxuICAgICAgICAvLyB0aGUgZGVzdGluYXRpb24gZmlsZSwgc28gdGhleSBjYW4ndCBiZSBtZWFuaW5nZnVsbHkgcmV2ZXJzZWQgaW50byBhXG4gICAgICAgIC8vIGRlbGV0aW9uIGh1bmsuIFRoaXMgbWVhbnMgdGhlIHJlc3VsdGluZyBwYXRjaCBpcyBub3Qgc29tZXRoaW5nXG4gICAgICAgIC8vIGBnaXQgYXBwbHlgIHdpbGwgYWNjZXB0IChpdCByZXF1aXJlcyBkZWxldGlvbiBwYXRjaGVzIHRvIGluY2x1ZGUgYVxuICAgICAgICAvLyBodW5rIHJlbW92aW5nIGV2ZXJ5IGxpbmUpLiBQcm9kdWNpbmcgYSBjb3JyZWN0IGRlbGV0aW9uIGh1bmsgd291bGRcbiAgICAgICAgLy8gcmVxdWlyZSBrbm93aW5nIHRoZSBmdWxsIGNvbnRlbnQgb2YgdGhlIGNvcHkgZGVzdGluYXRpb24sIHdoaWNoIHdlXG4gICAgICAgIC8vIGRvbid0IGhhdmUuIENvbnN1bWVycyB0aGF0IG5lZWQgYSBgZ2l0IGFwcGx5YC1jb21wYXRpYmxlIHBhdGNoIHdpbGxcbiAgICAgICAgLy8gbmVlZCB0byByZXNvbHZlIHRoZSBmdWxsIGZpbGUgY29udGVudCB0aGVtc2VsdmVzLlxuICAgICAgICByZXZlcnNlZC5uZXdGaWxlTmFtZSA9ICcvZGV2L251bGwnO1xuICAgICAgICByZXZlcnNlZC5uZXdIZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldmVyc2VkLmlzRGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHJldmVyc2VkLmlzQ3JlYXRlO1xuICAgICAgICBkZWxldGUgcmV2ZXJzZWQuaXNDb3B5O1xuICAgICAgICBkZWxldGUgcmV2ZXJzZWQuaXNSZW5hbWU7XG4gICAgICAgIHJldmVyc2VkLmh1bmtzID0gW107XG4gICAgfVxuICAgIC8vIFJldmVyc2luZyBhIHJlbmFtZSBpcyBqdXN0IGEgcmVuYW1lIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb247XG4gICAgLy8gaXNSZW5hbWUgc3RheXMgc2V0IGFuZCB0aGUgZmlsZW5hbWVzIGFyZSBhbHJlYWR5IHN3YXBwZWQgYWJvdmUuXG4gICAgcmV0dXJuIHJldmVyc2VkO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PTUlUX0hFQURFUlMgPSBleHBvcnRzLkZJTEVfSEVBREVSU19PTkxZID0gZXhwb3J0cy5JTkNMVURFX0hFQURFUlMgPSB2b2lkIDA7XG5leHBvcnRzLnN0cnVjdHVyZWRQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaDtcbmV4cG9ydHMuZm9ybWF0UGF0Y2ggPSBmb3JtYXRQYXRjaDtcbmV4cG9ydHMuY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5leHBvcnRzLmNyZWF0ZVBhdGNoID0gY3JlYXRlUGF0Y2g7XG5jb25zdCBsaW5lX2pzXzEgPSByZXF1aXJlKFwiLi4vZGlmZi9saW5lLmpzXCIpO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGVuYW1lIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCByZXF1aXJlIEMtc3R5bGVcbiAqIHF1b3RpbmcgKGFzIHVzZWQgYnkgR2l0IGFuZCBHTlUgZGlmZnV0aWxzIGluIGRpZmYgb3V0cHV0KS5cbiAqL1xuZnVuY3Rpb24gbmVlZHNRdW90aW5nKHMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNbaV0gPCAnXFx4MjAnIHx8IHNbaV0gPiAnXFx4N2UnIHx8IHNbaV0gPT09ICdcIicgfHwgc1tpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEMtc3R5bGUgcXVvdGVzIGEgZmlsZW5hbWUsIGVuY29kaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzXG4gKiBhbmQgbm9uLUFTQ0lJIGJ5dGVzIGFzIG9jdGFsIGVzY2FwZXMuIFRoaXMgaXMgdGhlIGludmVyc2Ugb2ZcbiAqIGBwYXJzZVF1b3RlZEZpbGVOYW1lYCBpbiBwYXJzZS50cy5cbiAqXG4gKiBOb24tQVNDSUkgYnl0ZXMgYXJlIGVuY29kZWQgYXMgVVRGLTggYmVmb3JlIGJlaW5nIGVtaXR0ZWQgYXMgb2N0YWwgZXNjYXBlcy5cbiAqIFRoaXMgbWF0Y2hlcyB0aGUgYmVoYXZpb3VyIG9mIGJvdGggR2l0IGFuZCBHTlUgZGlmZnV0aWxzLCB3aGljaCBhbHdheXMgZW1pdFxuICogVVRGLTggb2N0YWwgZXNjYXBlcyByZWdhcmRsZXNzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gZW5jb2RpbmcgKGUuZy5cbiAqIEdpdCBmb3IgV2luZG93cyBjb252ZXJ0cyBmcm9tIE5URlMncyBVVEYtMTYgdG8gVVRGLTggaW50ZXJuYWxseSkuXG4gKlxuICogSWYgdGhlIGZpbGVuYW1lIGRvZXNuJ3QgbmVlZCBxdW90aW5nLCByZXR1cm5zIGl0IGFzLWlzLlxuICovXG5mdW5jdGlvbiBxdW90ZUZpbGVOYW1lSWZOZWVkZWQocykge1xuICAgIGlmICghbmVlZHNRdW90aW5nKHMpKSB7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gJ1wiJztcbiAgICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYiA9IGJ5dGVzW2ldO1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXNjYXBlX3NlcXVlbmNlc19pbl9DI0VzY2FwZV9zZXF1ZW5jZXNcbiAgICAgICAgaWYgKGIgPT09IDB4MDcpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXGEnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MDgpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXGInO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MDkpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXHQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MGEpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MGIpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXHYnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MGMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXGYnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MGQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXHInO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDB4MjIpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXFwiJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID09PSAweDVjKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFxcXFxcJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID49IDB4MjAgJiYgYiA8PSAweDdlKSB7XG4gICAgICAgICAgICAvLyBKdXN0IGEgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlciB0aGF0IGlzIG5laXRoZXIgYSBkb3VibGUgcXVvdGUgbm9yIGFcbiAgICAgICAgICAgIC8vIGJhY2tzbGFzaDsgbm8gbmVlZCB0byBlc2NhcGUgaXQuXG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVpdGhlciBwYXJ0IG9mIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvciBhIGNvbnRyb2wgY2hhcmFjdGVyIHdpdGhvdXQgYVxuICAgICAgICAgICAgLy8gc3BlY2lhbCBlc2NhcGUgc2VxdWVuY2U7IG5lZWRzIGVzY2FwaW5nIGFzIGEgMy1kaWdpdCBvY3RhbCBlc2NhcGVcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCcgKyBiLnRvU3RyaW5nKDgpLnBhZFN0YXJ0KDMsICcwJyk7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXN1bHQgKz0gJ1wiJztcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5JTkNMVURFX0hFQURFUlMgPSB7XG4gICAgaW5jbHVkZUluZGV4OiB0cnVlLFxuICAgIGluY2x1ZGVVbmRlcmxpbmU6IHRydWUsXG4gICAgaW5jbHVkZUZpbGVIZWFkZXJzOiB0cnVlXG59O1xuZXhwb3J0cy5GSUxFX0hFQURFUlNfT05MWSA9IHtcbiAgICBpbmNsdWRlSW5kZXg6IGZhbHNlLFxuICAgIGluY2x1ZGVVbmRlcmxpbmU6IGZhbHNlLFxuICAgIGluY2x1ZGVGaWxlSGVhZGVyczogdHJ1ZVxufTtcbmV4cG9ydHMuT01JVF9IRUFERVJTID0ge1xuICAgIGluY2x1ZGVJbmRleDogZmFsc2UsXG4gICAgaW5jbHVkZVVuZGVybGluZTogZmFsc2UsXG4gICAgaW5jbHVkZUZpbGVIZWFkZXJzOiBmYWxzZVxufTtcbmZ1bmN0aW9uIHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICAgIGxldCBvcHRpb25zT2JqO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zT2JqID0ge307XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnNPYmogPSB7IGNhbGxiYWNrOiBvcHRpb25zIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvcHRpb25zT2JqID0gb3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT2JqLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wdGlvbnNPYmouY29udGV4dCA9IDQ7XG4gICAgfVxuICAgIC8vIFdlIGNvcHkgdGhpcyBpbnRvIGl0cyBvd24gdmFyaWFibGUgdG8gcGxhY2F0ZSBUeXBlU2NyaXB0LCB3aGljaCB0aGlua3NcbiAgICAvLyBvcHRpb25zT2JqLmNvbnRleHQgbWlnaHQgYmUgdW5kZWZpbmVkIGluIHRoZSBjYWxsYmFja3MgYmVsb3cuXG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnNPYmouY29udGV4dDtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIChydW50aW1lIGNoZWNrIGZvciBzb21ldGhpbmcgdGhhdCBpcyBjb3JyZWN0bHkgYSBzdGF0aWMgdHlwZSBlcnJvcilcbiAgICBpZiAob3B0aW9uc09iai5uZXdsaW5lSXNUb2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25ld2xpbmVJc1Rva2VuIG1heSBub3QgYmUgdXNlZCB3aXRoIHBhdGNoLWdlbmVyYXRpb24gZnVuY3Rpb25zLCBvbmx5IHdpdGggZGlmZmluZyBmdW5jdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zT2JqLmNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBkaWZmTGluZXNSZXN1bHRUb1BhdGNoKCgwLCBsaW5lX2pzXzEuZGlmZkxpbmVzKShvbGRTdHIsIG5ld1N0ciwgb3B0aW9uc09iaikpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjayB9ID0gb3B0aW9uc09iajtcbiAgICAgICAgKDAsIGxpbmVfanNfMS5kaWZmTGluZXMpKG9sZFN0ciwgbmV3U3RyLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnNPYmopLCB7IGNhbGxiYWNrOiAoZGlmZikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoID0gZGlmZkxpbmVzUmVzdWx0VG9QYXRjaChkaWZmKTtcbiAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGlzIHVuaGFwcHkgd2l0aG91dCB0aGUgY2FzdCBiZWNhdXNlIGl0IGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCBgcGF0Y2hgIG1heVxuICAgICAgICAgICAgICAgIC8vIGJlIHVuZGVmaW5lZCBoZXJlIG9ubHkgaWYgYGNhbGxiYWNrYCBpcyBTdHJ1Y3R1cmVkUGF0Y2hDYWxsYmFja0Fib3J0YWJsZTpcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhwYXRjaCk7XG4gICAgICAgICAgICB9IH0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlmZkxpbmVzUmVzdWx0VG9QYXRjaChkaWZmKSB7XG4gICAgICAgIC8vIFNURVAgMTogQnVpbGQgdXAgdGhlIHBhdGNoIHdpdGggbm8gXCJcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlXCIgbGluZXMgYW5kIHdpdGggdGhlIGFycmF5c1xuICAgICAgICAvLyAgICAgICAgIG9mIGxpbmVzIGNvbnRhaW5pbmcgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXJzLiBXZSdsbCB0aWR5IHVwIGxhdGVyLi4uXG4gICAgICAgIGlmICghZGlmZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpZmYucHVzaCh7IHZhbHVlOiAnJywgbGluZXM6IFtdIH0pOyAvLyBBcHBlbmQgYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBjbGVhbnVwIGVhc2llclxuICAgICAgICBmdW5jdGlvbiBjb250ZXh0TGluZXMobGluZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiAnICcgKyBlbnRyeTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHVua3MgPSBbXTtcbiAgICAgICAgbGV0IG9sZFJhbmdlU3RhcnQgPSAwLCBuZXdSYW5nZVN0YXJ0ID0gMCwgY3VyUmFuZ2UgPSBbXSwgb2xkTGluZSA9IDEsIG5ld0xpbmUgPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLCBsaW5lcyA9IGN1cnJlbnQubGluZXMgfHwgc3BsaXRMaW5lcyhjdXJyZW50LnZhbHVlKTtcbiAgICAgICAgICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcHJldmlvdXMgY29udGV4dCwgc3RhcnQgd2l0aCB0aGF0XG4gICAgICAgICAgICAgICAgaWYgKCFvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBkaWZmW2kgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgb2xkUmFuZ2VTdGFydCA9IG9sZExpbmU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSBuZXdMaW5lO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyUmFuZ2UgPSBjb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1jb250ZXh0KSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gT3V0cHV0IG91ciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJhbmdlLnB1c2goKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgbGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRyYWNrIHRoZSB1cGRhdGVkIGZpbGUgcG9zaXRpb25cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5hZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElkZW50aWNhbCBjb250ZXh0IGxpbmVzLiBUcmFjayBsaW5lIGNoYW5nZXNcbiAgICAgICAgICAgICAgICBpZiAob2xkUmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBvdXQgYW55IGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0IChvciBqb2luIG92ZXJsYXBwaW5nKVxuICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoIDw9IGNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGV4dExpbmVzKGxpbmVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clJhbmdlLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgdGhlIHJhbmdlIGFuZCBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHRTaXplID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clJhbmdlLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBodW5rID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExpbmVzOiAob2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhcnQ6IG5ld1JhbmdlU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lczogY3VyUmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUmFuZ2VTdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RlcCAyOiBlbGltaW5hdGUgdGhlIHRyYWlsaW5nIGBcXG5gIGZyb20gZWFjaCBsaW5lIG9mIGVhY2ggaHVuaywgYW5kLCB3aGVyZSBuZWVkZWQsIGFkZFxuICAgICAgICAvLyAgICAgICAgIFwiXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZVwiLlxuICAgICAgICBmb3IgKGNvbnN0IGh1bmsgb2YgaHVua3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaHVuay5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChodW5rLmxpbmVzW2ldLmVuZHNXaXRoKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgICAgICBodW5rLmxpbmVzW2ldID0gaHVuay5saW5lc1tpXS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBodW5rLmxpbmVzLnNwbGljZShpICsgMSwgMCwgJ1xcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZScpO1xuICAgICAgICAgICAgICAgICAgICBpKys7IC8vIFNraXAgdGhlIGxpbmUgd2UganVzdCBhZGRlZCwgdGhlbiBjb250aW51ZSBpdGVyYXRpbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWU6IG5ld0ZpbGVOYW1lLFxuICAgICAgICAgICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuICAgICAgICAgICAgaHVua3M6IGh1bmtzXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBjcmVhdGVzIGEgdW5pZmllZCBkaWZmIHBhdGNoLlxuICpcbiAqIEBwYXJhbSBwYXRjaCBlaXRoZXIgYSBzaW5nbGUgc3RydWN0dXJlZCBwYXRjaCBvYmplY3QgKGFzIHJldHVybmVkIGJ5IGBzdHJ1Y3R1cmVkUGF0Y2hgKSBvciBhblxuICogICBhcnJheSBvZiB0aGVtIChhcyByZXR1cm5lZCBieSBgcGFyc2VQYXRjaGApLlxuICogQHBhcmFtIGhlYWRlck9wdGlvbnMgYmVoYXZlcyB0aGUgc2FtZSBhcyB0aGUgYGhlYWRlck9wdGlvbnNgIG9wdGlvbiBvZiBgY3JlYXRlVHdvRmlsZXNQYXRjaGAuXG4gKiAgIElnbm9yZWQgZm9yIHBhdGNoZXMgd2hlcmUgYGlzR2l0YCBpcyBgdHJ1ZWAuXG4gKlxuICogV2hlbiBhIHBhdGNoIGhhcyBgaXNHaXQ6IHRydWVgLCBgZm9ybWF0UGF0Y2hgIG91dHB1dCBpcyBjaGFuZ2VkIHRvIG1vcmUgY2xvc2VseSBtYXRjaCBHaXQnc1xuICogb3V0cHV0OiBpdCBlbWl0cyBhIGBkaWZmIC0tZ2l0YCBoZWFkZXIsIGVtaXRzIEdpdCBleHRlbmRlZCBoZWFkZXJzIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uXG4gKiBwcm9wZXJ0aWVzIGxpa2UgYGlzUmVuYW1lYCwgYGlzQ3JlYXRlYCwgYG5ld01vZGVgLCBldGMsIGFuZCB3aWxsIG9taXQgYC0tLWAvYCsrK2AgZmlsZVxuICogaGVhZGVycyBmb3IgcGF0Y2hlcyB3aXRoIG5vIGh1bmtzIChlLmcuIHJlbmFtZXMgd2l0aG91dCBjb250ZW50IGNoYW5nZXMpLlxuICovXG5mdW5jdGlvbiBmb3JtYXRQYXRjaChwYXRjaCwgaGVhZGVyT3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgIGlmICghaGVhZGVyT3B0aW9ucykge1xuICAgICAgICBoZWFkZXJPcHRpb25zID0gZXhwb3J0cy5JTkNMVURFX0hFQURFUlM7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgICBpZiAocGF0Y2gubGVuZ3RoID4gMSAmJiAhaGVhZGVyT3B0aW9ucy5pbmNsdWRlRmlsZUhlYWRlcnMgJiYgIXBhdGNoLmV2ZXJ5KHAgPT4gcC5pc0dpdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG9taXQgZmlsZSBoZWFkZXJzIG9uIGEgbXVsdGktZmlsZSBwYXRjaC4gJ1xuICAgICAgICAgICAgICAgICsgJyhUaGUgcmVzdWx0IHdvdWxkIGJlIHVucGFyc2VhYmxlOyBob3cgd291bGQgYSB0b29sIHRyeWluZyB0byBhcHBseSAnXG4gICAgICAgICAgICAgICAgKyAndGhlIHBhdGNoIGtub3cgd2hpY2ggY2hhbmdlcyBhcmUgdG8gd2hpY2ggZmlsZT8pJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGNoLm1hcChwID0+IGZvcm1hdFBhdGNoKHAsIGhlYWRlck9wdGlvbnMpKS5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gW107XG4gICAgLy8gR2l0IHBhdGNoZXMgaGF2ZSBhIGZpeGVkIGhlYWRlciBmb3JtYXQgKGRpZmYgLS1naXQsIGV4dGVuZGVkIGhlYWRlcnMsXG4gICAgLy8gYW5kIC0tLS8rKysgd2hlbiBodW5rcyBhcmUgcHJlc2VudCksIHNvIGhlYWRlck9wdGlvbnMgaXMgaWdub3JlZC5cbiAgICBpZiAocGF0Y2guaXNHaXQpIHtcbiAgICAgICAgaGVhZGVyT3B0aW9ucyA9IGV4cG9ydHMuSU5DTFVERV9IRUFERVJTO1xuICAgICAgICAvLyBFbWl0IEdpdC1zdHlsZSBkaWZmIC0tZ2l0IGhlYWRlciBhbmQgZXh0ZW5kZWQgaGVhZGVycy5cbiAgICAgICAgLy8gR2l0IG5ldmVyIHB1dHMgL2Rldi9udWxsIGluIHRoZSBcImRpZmYgLS1naXRcIiBsaW5lOyBmb3IgZmlsZVxuICAgICAgICAvLyBjcmVhdGlvbnMvZGVsZXRpb25zIGl0IHVzZXMgdGhlIHJlYWwgZmlsZW5hbWUgb24gYm90aCBzaWRlcy5cbiAgICAgICAgaWYgKCFwYXRjaC5vbGRGaWxlTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbGRGaWxlTmFtZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgR2l0IHBhdGNoZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhdGNoLm5ld0ZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25ld0ZpbGVOYW1lIG11c3QgYmUgc3BlY2lmaWVkIGZvciBHaXQgcGF0Y2hlcycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBnaXRPbGROYW1lID0gcGF0Y2gub2xkRmlsZU5hbWU7XG4gICAgICAgIGxldCBnaXROZXdOYW1lID0gcGF0Y2gubmV3RmlsZU5hbWU7XG4gICAgICAgIGlmIChwYXRjaC5pc0NyZWF0ZSAmJiBnaXRPbGROYW1lID09PSAnL2Rldi9udWxsJykge1xuICAgICAgICAgICAgZ2l0T2xkTmFtZSA9IGdpdE5ld05hbWUucmVwbGFjZSgvXmJcXC8vLCAnYS8nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXRjaC5pc0RlbGV0ZSAmJiBnaXROZXdOYW1lID09PSAnL2Rldi9udWxsJykge1xuICAgICAgICAgICAgZ2l0TmV3TmFtZSA9IGdpdE9sZE5hbWUucmVwbGFjZSgvXmFcXC8vLCAnYi8nKTtcbiAgICAgICAgfVxuICAgICAgICByZXQucHVzaCgnZGlmZiAtLWdpdCAnICsgcXVvdGVGaWxlTmFtZUlmTmVlZGVkKGdpdE9sZE5hbWUpICsgJyAnICsgcXVvdGVGaWxlTmFtZUlmTmVlZGVkKGdpdE5ld05hbWUpKTtcbiAgICAgICAgaWYgKHBhdGNoLmlzRGVsZXRlKSB7XG4gICAgICAgICAgICByZXQucHVzaCgnZGVsZXRlZCBmaWxlIG1vZGUgJyArICgoX2EgPSBwYXRjaC5vbGRNb2RlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnMTAwNjQ0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaC5pc0NyZWF0ZSkge1xuICAgICAgICAgICAgcmV0LnB1c2goJ25ldyBmaWxlIG1vZGUgJyArICgoX2IgPSBwYXRjaC5uZXdNb2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnMTAwNjQ0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaC5vbGRNb2RlICYmIHBhdGNoLm5ld01vZGUgJiYgIXBhdGNoLmlzRGVsZXRlICYmICFwYXRjaC5pc0NyZWF0ZSkge1xuICAgICAgICAgICAgcmV0LnB1c2goJ29sZCBtb2RlICcgKyBwYXRjaC5vbGRNb2RlKTtcbiAgICAgICAgICAgIHJldC5wdXNoKCduZXcgbW9kZSAnICsgcGF0Y2gubmV3TW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoLmlzUmVuYW1lKSB7XG4gICAgICAgICAgICByZXQucHVzaCgncmVuYW1lIGZyb20gJyArIHF1b3RlRmlsZU5hbWVJZk5lZWRlZCgoKF9jID0gcGF0Y2gub2xkRmlsZU5hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICcnKS5yZXBsYWNlKC9eYVxcLy8sICcnKSkpO1xuICAgICAgICAgICAgcmV0LnB1c2goJ3JlbmFtZSB0byAnICsgcXVvdGVGaWxlTmFtZUlmTmVlZGVkKCgoX2QgPSBwYXRjaC5uZXdGaWxlTmFtZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycpLnJlcGxhY2UoL15iXFwvLywgJycpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoLmlzQ29weSkge1xuICAgICAgICAgICAgcmV0LnB1c2goJ2NvcHkgZnJvbSAnICsgcXVvdGVGaWxlTmFtZUlmTmVlZGVkKCgoX2UgPSBwYXRjaC5vbGRGaWxlTmFtZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogJycpLnJlcGxhY2UoL15hXFwvLywgJycpKSk7XG4gICAgICAgICAgICByZXQucHVzaCgnY29weSB0byAnICsgcXVvdGVGaWxlTmFtZUlmTmVlZGVkKCgoX2YgPSBwYXRjaC5uZXdGaWxlTmFtZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogJycpLnJlcGxhY2UoL15iXFwvLywgJycpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChoZWFkZXJPcHRpb25zLmluY2x1ZGVJbmRleCAmJiBwYXRjaC5vbGRGaWxlTmFtZSA9PSBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5vbGRGaWxlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXQucHVzaCgnSW5kZXg6ICcgKyBwYXRjaC5vbGRGaWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlck9wdGlvbnMuaW5jbHVkZVVuZGVybGluZSkge1xuICAgICAgICAgICAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBFbWl0IC0tLSAvICsrKyBmaWxlIGhlYWRlcnMuIEZvciBHaXQgcGF0Y2hlcyB3aXRoIG5vIGh1bmtzIChlLmcuXG4gICAgLy8gcHVyZSByZW5hbWVzLCBtb2RlLW9ubHkgY2hhbmdlcyksIEdpdCBvbWl0cyB0aGVzZSwgc28gd2UgZG8gdG9vLlxuICAgIGNvbnN0IGhhc0h1bmtzID0gcGF0Y2guaHVua3MubGVuZ3RoID4gMDtcbiAgICBpZiAoaGVhZGVyT3B0aW9ucy5pbmNsdWRlRmlsZUhlYWRlcnMgJiYgcGF0Y2gub2xkRmlsZU5hbWUgIT09IHVuZGVmaW5lZCAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmICghcGF0Y2guaXNHaXQgfHwgaGFzSHVua3MpKSB7XG4gICAgICAgIHJldC5wdXNoKCctLS0gJyArIHF1b3RlRmlsZU5hbWVJZk5lZWRlZChwYXRjaC5vbGRGaWxlTmFtZSkgKyAocGF0Y2gub2xkSGVhZGVyID8gJ1xcdCcgKyBwYXRjaC5vbGRIZWFkZXIgOiAnJykpO1xuICAgICAgICByZXQucHVzaCgnKysrICcgKyBxdW90ZUZpbGVOYW1lSWZOZWVkZWQocGF0Y2gubmV3RmlsZU5hbWUpICsgKHBhdGNoLm5ld0hlYWRlciA/ICdcXHQnICsgcGF0Y2gubmV3SGVhZGVyIDogJycpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaC5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBodW5rID0gcGF0Y2guaHVua3NbaV07XG4gICAgICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgICAgIC8vIHRoZSBmaXJzdCBudW1iZXIgaXMgb25lIGxvd2VyIHRoYW4gb25lIHdvdWxkIGV4cGVjdC5cbiAgICAgICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgICAgIGNvbnN0IG9sZFN0YXJ0ID0gaHVuay5vbGRMaW5lcyA9PT0gMCA/IGh1bmsub2xkU3RhcnQgLSAxIDogaHVuay5vbGRTdGFydDtcbiAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBodW5rLm5ld0xpbmVzID09PSAwID8gaHVuay5uZXdTdGFydCAtIDEgOiBodW5rLm5ld1N0YXJ0O1xuICAgICAgICByZXQucHVzaCgnQEAgLScgKyBvbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICAgICAgICsgJyArJyArIG5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lc1xuICAgICAgICAgICAgKyAnIEBAJyk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBodW5rLmxpbmVzKSB7XG4gICAgICAgICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0LmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5mdW5jdGlvbiBjcmVhdGVUd29GaWxlc1BhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IGNhbGxiYWNrOiBvcHRpb25zIH07XG4gICAgfVxuICAgIGlmICghKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYWxsYmFjaykpIHtcbiAgICAgICAgY29uc3QgcGF0Y2hPYmogPSBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXBhdGNoT2JqKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdFBhdGNoKHBhdGNoT2JqLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVyT3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuICAgICAgICBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgY2FsbGJhY2s6IHBhdGNoT2JqID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdGNoT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmb3JtYXRQYXRjaChwYXRjaE9iaiwgb3B0aW9ucy5oZWFkZXJPcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB9KSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUGF0Y2goZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICAgIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogU3BsaXQgYHRleHRgIGludG8gYW4gYXJyYXkgb2YgbGluZXMsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXIgKHdoZXJlIHByZXNlbnQpXG4gKi9cbmZ1bmN0aW9uIHNwbGl0TGluZXModGV4dCkge1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nTmwgPSB0ZXh0LmVuZHNXaXRoKCdcXG4nKTtcbiAgICBjb25zdCByZXN1bHQgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAobGluZSA9PiBsaW5lICsgJ1xcbicpO1xuICAgIGlmIChoYXNUcmFpbGluZ05sKSB7XG4gICAgICAgIHJlc3VsdC5wb3AoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdC5wb3AoKS5zbGljZSgwLCAtMSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvRE1QID0gY29udmVydENoYW5nZXNUb0RNUDtcbi8qKlxuICogY29udmVydHMgYSBsaXN0IG9mIGNoYW5nZSBvYmplY3RzIHRvIHRoZSBmb3JtYXQgcmV0dXJuZWQgYnkgR29vZ2xlJ3MgW2RpZmYtbWF0Y2gtcGF0Y2hdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZGlmZi1tYXRjaC1wYXRjaCkgbGlicmFyeVxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvRE1QKGNoYW5nZXMpIHtcbiAgICBjb25zdCByZXQgPSBbXTtcbiAgICBsZXQgY2hhbmdlLCBvcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXQucHVzaChbb3BlcmF0aW9uLCBjaGFuZ2UudmFsdWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydENoYW5nZXNUb1hNTCA9IGNvbnZlcnRDaGFuZ2VzVG9YTUw7XG4vKipcbiAqIGNvbnZlcnRzIGEgbGlzdCBvZiBjaGFuZ2Ugb2JqZWN0cyB0byBhIHNlcmlhbGl6ZWQgWE1MIGZvcm1hdFxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvWE1MKGNoYW5nZXMpIHtcbiAgICBjb25zdCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY2hhbmdlc1tpXTtcbiAgICAgICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgICAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuICAgICAgICB9XG4gICAgICAgIHJldC5wdXNoKGVzY2FwZUhUTUwoY2hhbmdlLnZhbHVlKSk7XG4gICAgICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgICAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQuam9pbignJyk7XG59XG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgICBsZXQgbiA9IHM7XG4gICAgbiA9IG4ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKTtcbiAgICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gICAgbiA9IG4ucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuICAgIG4gPSBuLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbiAgICByZXR1cm4gbjtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIFNlZSBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zIG9mIHVzZSAqL1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jYW5vbmljYWxpemUgPSBleHBvcnRzLmNvbnZlcnRDaGFuZ2VzVG9YTUwgPSBleHBvcnRzLmNvbnZlcnRDaGFuZ2VzVG9ETVAgPSBleHBvcnRzLnJldmVyc2VQYXRjaCA9IGV4cG9ydHMucGFyc2VQYXRjaCA9IGV4cG9ydHMuYXBwbHlQYXRjaGVzID0gZXhwb3J0cy5hcHBseVBhdGNoID0gZXhwb3J0cy5PTUlUX0hFQURFUlMgPSBleHBvcnRzLkZJTEVfSEVBREVSU19PTkxZID0gZXhwb3J0cy5JTkNMVURFX0hFQURFUlMgPSBleHBvcnRzLmZvcm1hdFBhdGNoID0gZXhwb3J0cy5jcmVhdGVQYXRjaCA9IGV4cG9ydHMuY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGV4cG9ydHMuc3RydWN0dXJlZFBhdGNoID0gZXhwb3J0cy5hcnJheURpZmYgPSBleHBvcnRzLmRpZmZBcnJheXMgPSBleHBvcnRzLmpzb25EaWZmID0gZXhwb3J0cy5kaWZmSnNvbiA9IGV4cG9ydHMuY3NzRGlmZiA9IGV4cG9ydHMuZGlmZkNzcyA9IGV4cG9ydHMuc2VudGVuY2VEaWZmID0gZXhwb3J0cy5kaWZmU2VudGVuY2VzID0gZXhwb3J0cy5kaWZmVHJpbW1lZExpbmVzID0gZXhwb3J0cy5saW5lRGlmZiA9IGV4cG9ydHMuZGlmZkxpbmVzID0gZXhwb3J0cy53b3Jkc1dpdGhTcGFjZURpZmYgPSBleHBvcnRzLmRpZmZXb3Jkc1dpdGhTcGFjZSA9IGV4cG9ydHMud29yZERpZmYgPSBleHBvcnRzLmRpZmZXb3JkcyA9IGV4cG9ydHMuY2hhcmFjdGVyRGlmZiA9IGV4cG9ydHMuZGlmZkNoYXJzID0gZXhwb3J0cy5EaWZmID0gdm9pZCAwO1xuLypcbiAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElzOlxuICogRGlmZi5kaWZmQ2hhcnM6IENoYXJhY3RlciBieSBjaGFyYWN0ZXIgZGlmZlxuICogRGlmZi5kaWZmV29yZHM6IFdvcmQgKGFzIGRlZmluZWQgYnkgXFxiIHJlZ2V4KSBkaWZmIHdoaWNoIGlnbm9yZXMgd2hpdGVzcGFjZVxuICogRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuICpcbiAqIERpZmYuZGlmZkNzczogRGlmZiB0YXJnZXRlZCBhdCBDU1MgY29udGVudFxuICpcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wb3NlZCBpblxuICogXCJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIFZhcmlhdGlvbnNcIiAoTXllcnMsIDE5ODYpLlxuICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS40LjY5MjdcbiAqL1xuY29uc3QgYmFzZV9qc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RpZmYvYmFzZS5qc1wiKSk7XG5leHBvcnRzLkRpZmYgPSBiYXNlX2pzXzEuZGVmYXVsdDtcbmNvbnN0IGNoYXJhY3Rlcl9qc18xID0gcmVxdWlyZShcIi4vZGlmZi9jaGFyYWN0ZXIuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmQ2hhcnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNoYXJhY3Rlcl9qc18xLmRpZmZDaGFyczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNoYXJhY3RlckRpZmZcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNoYXJhY3Rlcl9qc18xLmNoYXJhY3RlckRpZmY7IH0gfSk7XG5jb25zdCB3b3JkX2pzXzEgPSByZXF1aXJlKFwiLi9kaWZmL3dvcmQuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmV29yZHNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdvcmRfanNfMS5kaWZmV29yZHM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmV29yZHNXaXRoU3BhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdvcmRfanNfMS5kaWZmV29yZHNXaXRoU3BhY2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ3b3JkRGlmZlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gd29yZF9qc18xLndvcmREaWZmOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwid29yZHNXaXRoU3BhY2VEaWZmXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB3b3JkX2pzXzEud29yZHNXaXRoU3BhY2VEaWZmOyB9IH0pO1xuY29uc3QgbGluZV9qc18xID0gcmVxdWlyZShcIi4vZGlmZi9saW5lLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZkxpbmVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5lX2pzXzEuZGlmZkxpbmVzOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZlRyaW1tZWRMaW5lc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGluZV9qc18xLmRpZmZUcmltbWVkTGluZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsaW5lRGlmZlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGluZV9qc18xLmxpbmVEaWZmOyB9IH0pO1xuY29uc3Qgc2VudGVuY2VfanNfMSA9IHJlcXVpcmUoXCIuL2RpZmYvc2VudGVuY2UuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmU2VudGVuY2VzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZW50ZW5jZV9qc18xLmRpZmZTZW50ZW5jZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzZW50ZW5jZURpZmZcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbnRlbmNlX2pzXzEuc2VudGVuY2VEaWZmOyB9IH0pO1xuY29uc3QgY3NzX2pzXzEgPSByZXF1aXJlKFwiLi9kaWZmL2Nzcy5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpZmZDc3NcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNzc19qc18xLmRpZmZDc3M7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjc3NEaWZmXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjc3NfanNfMS5jc3NEaWZmOyB9IH0pO1xuY29uc3QganNvbl9qc18xID0gcmVxdWlyZShcIi4vZGlmZi9qc29uLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZkpzb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzb25fanNfMS5kaWZmSnNvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNhbm9uaWNhbGl6ZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNvbl9qc18xLmNhbm9uaWNhbGl6ZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImpzb25EaWZmXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBqc29uX2pzXzEuanNvbkRpZmY7IH0gfSk7XG5jb25zdCBhcnJheV9qc18xID0gcmVxdWlyZShcIi4vZGlmZi9hcnJheS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpZmZBcnJheXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFycmF5X2pzXzEuZGlmZkFycmF5czsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFycmF5RGlmZlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJyYXlfanNfMS5hcnJheURpZmY7IH0gfSk7XG5jb25zdCBhcHBseV9qc18xID0gcmVxdWlyZShcIi4vcGF0Y2gvYXBwbHkuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhcHBseVBhdGNoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBhcHBseV9qc18xLmFwcGx5UGF0Y2g7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhcHBseVBhdGNoZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFwcGx5X2pzXzEuYXBwbHlQYXRjaGVzOyB9IH0pO1xuY29uc3QgcGFyc2VfanNfMSA9IHJlcXVpcmUoXCIuL3BhdGNoL3BhcnNlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2VQYXRjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGFyc2VfanNfMS5wYXJzZVBhdGNoOyB9IH0pO1xuY29uc3QgcmV2ZXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGF0Y2gvcmV2ZXJzZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJldmVyc2VQYXRjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmV2ZXJzZV9qc18xLnJldmVyc2VQYXRjaDsgfSB9KTtcbmNvbnN0IGNyZWF0ZV9qc18xID0gcmVxdWlyZShcIi4vcGF0Y2gvY3JlYXRlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RydWN0dXJlZFBhdGNoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVfanNfMS5zdHJ1Y3R1cmVkUGF0Y2g7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjcmVhdGVUd29GaWxlc1BhdGNoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVfanNfMS5jcmVhdGVUd29GaWxlc1BhdGNoOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlUGF0Y2hcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNyZWF0ZV9qc18xLmNyZWF0ZVBhdGNoOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZm9ybWF0UGF0Y2hcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNyZWF0ZV9qc18xLmZvcm1hdFBhdGNoOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSU5DTFVERV9IRUFERVJTXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVfanNfMS5JTkNMVURFX0hFQURFUlM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJGSUxFX0hFQURFUlNfT05MWVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY3JlYXRlX2pzXzEuRklMRV9IRUFERVJTX09OTFk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJPTUlUX0hFQURFUlNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNyZWF0ZV9qc18xLk9NSVRfSEVBREVSUzsgfSB9KTtcbmNvbnN0IGRtcF9qc18xID0gcmVxdWlyZShcIi4vY29udmVydC9kbXAuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjb252ZXJ0Q2hhbmdlc1RvRE1QXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkbXBfanNfMS5jb252ZXJ0Q2hhbmdlc1RvRE1QOyB9IH0pO1xuY29uc3QgeG1sX2pzXzEgPSByZXF1aXJlKFwiLi9jb252ZXJ0L3htbC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbnZlcnRDaGFuZ2VzVG9YTUxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHhtbF9qc18xLmNvbnZlcnRDaGFuZ2VzVG9YTUw7IH0gfSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBjb2xvcml6ZXIkMSA9IHJlcXVpcmUoJy4vY29sb3JpemVyLmpzJyk7XG52YXIgc2Ftc2FtID0gcmVxdWlyZSgnQHNpbm9uanMvc2Ftc2FtJyk7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvdGltZXMtaW4td29yZHMuanMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGpzRGlmZiA9IHJlcXVpcmUoJ2RpZmYnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcE5hbWVzcGFjZShlKSB7XG4gICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICB2YXIgbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKGUpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgaWYgKGsgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgIHZhciBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBrKTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgaywgZC5nZXQgPyBkIDoge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVba107IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG4uZGVmYXVsdCA9IGU7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUobik7XG59XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcbnZhciBzYW1zYW1fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KHNhbXNhbSk7XG52YXIganNEaWZmX19uYW1lc3BhY2UgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BOYW1lc3BhY2UoanNEaWZmKTtcblxuY29uc3QgeyBwcm90b3R5cGVzIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGNyZWF0ZU1hdGNoZXI6IG1hdGNoIH0gPSBzYW1zYW1fX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgam9pbiwgbWFwLCBwdXNoLCBzbGljZSB9ID0gcHJvdG90eXBlcy5hcnJheTtcbmNvbnN0IGNvbG9yaXplciA9IG5ldyBjb2xvcml6ZXIkMSgpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gbWF0Y2hlclxuICogQHBhcmFtIGNhbGxlZEFyZ1xuICogQHBhcmFtIGNhbGxlZEFyZ01lc3NhZ2VcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgY29sb3JlZCB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGNvbG9yU2lub25NYXRjaFRleHQobWF0Y2hlciwgY2FsbGVkQXJnLCBjYWxsZWRBcmdNZXNzYWdlKSB7XG4gICAgbGV0IGNhbGxlZEFyZ3VtZW50TWVzc2FnZSA9IGNhbGxlZEFyZ01lc3NhZ2U7XG4gICAgbGV0IG1hdGNoZXJNZXNzYWdlID0gbWF0Y2hlci5tZXNzYWdlO1xuICAgIGlmICghbWF0Y2hlci50ZXN0KGNhbGxlZEFyZykpIHtcbiAgICAgICAgbWF0Y2hlck1lc3NhZ2UgPSBjb2xvcml6ZXIucmVkKG1hdGNoZXIubWVzc2FnZSk7XG4gICAgICAgIGlmIChjYWxsZWRBcmd1bWVudE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNhbGxlZEFyZ3VtZW50TWVzc2FnZSA9IGNvbG9yaXplci5ncmVlbihjYWxsZWRBcmd1bWVudE1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtjYWxsZWRBcmd1bWVudE1lc3NhZ2V9ICR7bWF0Y2hlck1lc3NhZ2V9YDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZGlmZlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBjb2xvcmVkIGRpZmZcbiAqL1xuZnVuY3Rpb24gY29sb3JEaWZmVGV4dChkaWZmKSB7XG4gICAgY29uc3Qgb2JqZWN0cyA9IG1hcChkaWZmLCBmdW5jdGlvbiAocGFydCkge1xuICAgICAgICBsZXQgdGV4dCA9IHBhcnQudmFsdWU7XG4gICAgICAgIGlmIChwYXJ0LmFkZGVkKSB7XG4gICAgICAgICAgICB0ZXh0ID0gY29sb3JpemVyLmdyZWVuKHRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnQucmVtb3ZlZCkge1xuICAgICAgICAgICAgdGV4dCA9IGNvbG9yaXplci5yZWQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpZmYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IFwiIFwiOyAvLyBmb3JtYXQgc2ltcGxlIGRpZmZzXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpvaW4ob2JqZWN0cywgXCJcIik7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ30gYSBxdW90ZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHF1b3RlU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIGZvcm1hdHRlcnMgPSB7XG4gICAgYzogZnVuY3Rpb24gKHNweUluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiB0aW1lc0luV29yZHMoc3B5SW5zdGFuY2UuY2FsbENvdW50KTtcbiAgICB9LFxuXG4gICAgbjogZnVuY3Rpb24gKHNweUluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBzcHlJbnN0YW5jZS50b1N0cmluZygpO1xuICAgIH0sXG5cbiAgICBEOiBmdW5jdGlvbiAoc3B5SW5zdGFuY2UsIGFyZ3MpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3B5SW5zdGFuY2UuY2FsbENvdW50OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyBkZXNjcmliZSBtdWx0aXBsZSBjYWxsc1xuICAgICAgICAgICAgaWYgKGwgPiAxKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgXFxuQ2FsbCAke2kgKyAxfTpgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2FsbGVkQXJncyA9IHNweUluc3RhbmNlLmdldENhbGwoaSkuYXJncztcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkQXJncyA9IHNsaWNlKGFyZ3MpO1xuXG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgICAgICBqIDwgY2FsbGVkQXJncy5sZW5ndGggfHwgaiA8IGV4cGVjdGVkQXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgKytqXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FsbGVkQXJnID0gY2FsbGVkQXJnc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWRBcmcgPSBleHBlY3RlZEFyZ3Nbal07XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxlZEFyZykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsZWRBcmcgPSBxdW90ZVN0cmluZ1ZhbHVlKGNhbGxlZEFyZyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkQXJnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQXJnID0gcXVvdGVTdHJpbmdWYWx1ZShleHBlY3RlZEFyZyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIlxcblwiO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGVkQXJnTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgIGogPCBjYWxsZWRBcmdzLmxlbmd0aCA/IHV0aWwuaW5zcGVjdChjYWxsZWRBcmcpIDogXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2guaXNNYXRjaGVyKGV4cGVjdGVkQXJnKSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGNvbG9yU2lub25NYXRjaFRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEFyZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZEFyZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZEFyZ01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRBcmdNZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGogPCBleHBlY3RlZEFyZ3MubGVuZ3RoID8gdXRpbC5pbnNwZWN0KGV4cGVjdGVkQXJnKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBqc0RpZmZfX25hbWVzcGFjZS5kaWZmSnNvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZEFyZ01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEFyZ01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gY29sb3JEaWZmVGV4dChkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuXG4gICAgQzogZnVuY3Rpb24gKHNweUluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGNhbGxzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzcHlJbnN0YW5jZS5jYWxsQ291bnQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmdpZmllZENhbGwgPSBgICAgICR7c3B5SW5zdGFuY2UuZ2V0Q2FsbChpKS50b1N0cmluZygpfWA7XG4gICAgICAgICAgICBpZiAoL1xcbi8udGVzdChjYWxsc1tpIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgc3RyaW5naWZpZWRDYWxsID0gYFxcbiR7c3RyaW5naWZpZWRDYWxsfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwdXNoKGNhbGxzLCBzdHJpbmdpZmllZENhbGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxzLmxlbmd0aCA+IDAgPyBgXFxuJHtqb2luKGNhbGxzLCBcIlxcblwiKX1gIDogXCJcIjtcbiAgICB9LFxuXG4gICAgdDogZnVuY3Rpb24gKHNweUluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNweUluc3RhbmNlLmNhbGxDb3VudDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgcHVzaChvYmplY3RzLCB1dGlsLmluc3BlY3Qoc3B5SW5zdGFuY2UudGhpc1ZhbHVlc1tpXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGpvaW4ob2JqZWN0cywgXCIsIFwiKTtcbiAgICB9LFxuXG4gICAgXCIqXCI6IGZ1bmN0aW9uIChzcHlJbnN0YW5jZSwgYXJncykge1xuICAgICAgICByZXR1cm4gam9pbihcbiAgICAgICAgICAgIG1hcChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuaW5zcGVjdChhcmcpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBcIiwgXCIsXG4gICAgICAgICk7XG4gICAgfSxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZm9ybWF0dGVycztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2V4dGVuZC5qcycpO1xudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9mdW5jdGlvbi10by1zdHJpbmcuanMnKTtcbnZhciBwcm94eUNhbGwgPSByZXF1aXJlKCcuL3Byb3h5LWNhbGwuanMnKTtcbnZhciBwcm94eUNhbGxVdGlsID0gcmVxdWlyZSgnLi9wcm94eS1jYWxsLXV0aWwuanMnKTtcbnZhciBwcm94eUludm9rZSA9IHJlcXVpcmUoJy4vcHJveHktaW52b2tlLmpzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBzcHlGb3JtYXR0ZXJzID0gcmVxdWlyZSgnLi9zcHktZm9ybWF0dGVycy5qcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcblxuY29uc3QgeyBwcm90b3R5cGVzIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IHB1c2gsIGZvckVhY2gsIHNsaWNlIH0gPSBwcm90b3R5cGVzLmFycmF5O1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaW5vbkZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLnVua25vd259IGFyZ3NcbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICovXG5cbmNvbnN0IGVtcHR5RmFrZXMgPSBbXTtcblxuLy8gUHVibGljIEFQSVxuY29uc3QgcHJveHlBcGkgPSB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uVG9TdHJpbmcsXG5cbiAgICBuYW1lZDogZnVuY3Rpb24gbmFtZWQobmFtZSkge1xuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgY29uc3QgbmFtZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFwibmFtZVwiKTtcbiAgICAgICAgaWYgKG5hbWVEZXNjcmlwdG9yICYmIG5hbWVEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgICAgLy8gSUUgMTEgZnVuY3Rpb25zIGRvbid0IGhhdmUgYSBuYW1lLlxuICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIG5hbWVzIHRoYXQgYXJlIG5vdCBjb25maWd1cmFibGUuXG4gICAgICAgICAgICBuYW1lRGVzY3JpcHRvci52YWx1ZSA9IG5hbWU7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIG5hbWVEZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgaW52b2tlOiBwcm94eUludm9rZSxcblxuICAgIC8qXG4gICAgICogSG9vayBmb3IgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gZmFrZSBpbnN0YW5jZXMgbWF0Y2hpbmcgdGhlXG4gICAgICogZ2l2ZW4gYXJndW1lbnRzLlxuICAgICAqL1xuICAgIG1hdGNoaW5nRmFrZXM6IGZ1bmN0aW9uICgvKmFyZ3MsIHN0cmljdCovKSB7XG4gICAgICAgIHJldHVybiBlbXB0eUZha2VzO1xuICAgIH0sXG5cbiAgICBnZXRDYWxsOiBmdW5jdGlvbiBnZXRDYWxsKGluZGV4KSB7XG4gICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgLy8gTmVnYXRpdmUgaW5kaWNlcyBtZWFucyBjb3VudGluZyBiYWNrd2FyZHMgZnJvbSB0aGUgbGFzdCBjYWxsXG4gICAgICAgICAgICBpICs9IHRoaXMuY2FsbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuY2FsbENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm94eUNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy50aGlzVmFsdWVzW2ldLFxuICAgICAgICAgICAgdGhpcy5hcmdzW2ldLFxuICAgICAgICAgICAgdGhpcy5yZXR1cm5WYWx1ZXNbaV0sXG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbnNbaV0sXG4gICAgICAgICAgICB0aGlzLmNhbGxJZHNbaV0sXG4gICAgICAgICAgICB0aGlzLmVycm9yc1dpdGhDYWxsU3RhY2tbaV0sXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGdldENhbGxzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNhbGxzID0gW107XG4gICAgICAgIGxldCBpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNhbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBwdXNoKGNhbGxzLCB0aGlzLmdldENhbGwoaSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxzO1xuICAgIH0sXG5cbiAgICBjYWxsZWRCZWZvcmU6IGZ1bmN0aW9uIGNhbGxlZEJlZm9yZShwcm94eSkge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb3h5LmNhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzWzBdIDwgcHJveHkuY2FsbElkc1twcm94eS5jYWxsSWRzLmxlbmd0aCAtIDFdO1xuICAgIH0sXG5cbiAgICBjYWxsZWRBZnRlcjogZnVuY3Rpb24gY2FsbGVkQWZ0ZXIocHJveHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCB8fCAhcHJveHkuY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzW3RoaXMuY2FsbENvdW50IC0gMV0gPiBwcm94eS5jYWxsSWRzWzBdO1xuICAgIH0sXG5cbiAgICBjYWxsZWRJbW1lZGlhdGVseUJlZm9yZTogZnVuY3Rpb24gY2FsbGVkSW1tZWRpYXRlbHlCZWZvcmUocHJveHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCB8fCAhcHJveHkuY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jYWxsSWRzW3RoaXMuY2FsbENvdW50IC0gMV0gPT09XG4gICAgICAgICAgICBwcm94eS5jYWxsSWRzW3Byb3h5LmNhbGxDb3VudCAtIDFdIC0gMVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBjYWxsZWRJbW1lZGlhdGVseUFmdGVyOiBmdW5jdGlvbiBjYWxsZWRJbW1lZGlhdGVseUFmdGVyKHByb3h5KSB7XG4gICAgICAgIGlmICghdGhpcy5jYWxsZWQgfHwgIXByb3h5LmNhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY2FsbElkc1t0aGlzLmNhbGxDb3VudCAtIDFdID09PVxuICAgICAgICAgICAgcHJveHkuY2FsbElkc1twcm94eS5jYWxsQ291bnQgLSAxXSArIDFcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgZm9ybWF0dGVyczogc3B5Rm9ybWF0dGVycyxcbiAgICBwcmludGY6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgY29uc3Qgc3B5SW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICBjb25zdCBhcmdzID0gc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlcjtcblxuICAgICAgICByZXR1cm4gKGZvcm1hdCB8fCBcIlwiKS5yZXBsYWNlKC8lKC4pL2csIGZ1bmN0aW9uIChtYXRjaCwgc3BlY2lmaWVyKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBwcm94eUFwaS5mb3JtYXR0ZXJzW3NwZWNpZmllcl07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGZvcm1hdHRlcihzcHlJbnN0YW5jZSwgYXJncykpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4ocGFyc2VJbnQoc3BlY2lmaWVyLCAxMCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuaW5zcGVjdChhcmdzW3NwZWNpZmllciAtIDFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGAlJHtzcGVjaWZpZXJ9YDtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc2V0SGlzdG9yeTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbnZva2luZykge1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2Fubm90IHJlc2V0IFNpbm9uIGZ1bmN0aW9uIHdoaWxlIGludm9raW5nIGl0LiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiTW92ZSB0aGUgY2FsbCB0byAucmVzZXRIaXN0b3J5IG91dHNpZGUgb2YgdGhlIGNhbGxiYWNrLlwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gXCJJbnZhbGlkUmVzZXRFeGNlcHRpb25cIjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYWxsZWRPbmNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbGVkVHdpY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsZWRUaHJpY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmZpcnN0Q2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2Vjb25kQ2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMudGhpcmRDYWxsID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0Q2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEFyZyA9IG51bGw7XG4gICAgICAgIHRoaXMuYXJncyA9IFtdO1xuICAgICAgICB0aGlzLmZpcnN0QXJnID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXR1cm5WYWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy50aGlzVmFsdWVzID0gW107XG4gICAgICAgIHRoaXMuZXhjZXB0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNhbGxJZHMgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvcnNXaXRoQ2FsbFN0YWNrID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuZmFrZXMpIHtcbiAgICAgICAgICAgIGZvckVhY2godGhpcy5mYWtlcywgZnVuY3Rpb24gKGZha2UpIHtcbiAgICAgICAgICAgICAgICBmYWtlLnJlc2V0SGlzdG9yeSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxufTtcblxuY29uc3QgZGVsZWdhdGVUb0NhbGxzID0gcHJveHlDYWxsVXRpbC5kZWxlZ2F0ZVRvQ2FsbHM7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkT25cIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiYWx3YXlzQ2FsbGVkT25cIiwgZmFsc2UsIFwiY2FsbGVkT25cIik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkV2l0aFwiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcbiAgICBwcm94eUFwaSxcbiAgICBcImNhbGxlZE9uY2VXaXRoXCIsXG4gICAgdHJ1ZSxcbiAgICBcImNhbGxlZFdpdGhcIixcbiAgICBmYWxzZSxcbiAgICB1bmRlZmluZWQsXG4gICAgMSxcbik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkV2l0aE1hdGNoXCIsIHRydWUpO1xuZGVsZWdhdGVUb0NhbGxzKHByb3h5QXBpLCBcImFsd2F5c0NhbGxlZFdpdGhcIiwgZmFsc2UsIFwiY2FsbGVkV2l0aFwiKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJhbHdheXNDYWxsZWRXaXRoTWF0Y2hcIiwgZmFsc2UsIFwiY2FsbGVkV2l0aE1hdGNoXCIpO1xuZGVsZWdhdGVUb0NhbGxzKHByb3h5QXBpLCBcImNhbGxlZFdpdGhFeGFjdGx5XCIsIHRydWUpO1xuZGVsZWdhdGVUb0NhbGxzKFxuICAgIHByb3h5QXBpLFxuICAgIFwiY2FsbGVkT25jZVdpdGhFeGFjdGx5XCIsXG4gICAgdHJ1ZSxcbiAgICBcImNhbGxlZFdpdGhFeGFjdGx5XCIsXG4gICAgZmFsc2UsXG4gICAgdW5kZWZpbmVkLFxuICAgIDEsXG4pO1xuZGVsZWdhdGVUb0NhbGxzKFxuICAgIHByb3h5QXBpLFxuICAgIFwiY2FsbGVkT25jZVdpdGhNYXRjaFwiLFxuICAgIHRydWUsXG4gICAgXCJjYWxsZWRXaXRoTWF0Y2hcIixcbiAgICBmYWxzZSxcbiAgICB1bmRlZmluZWQsXG4gICAgMSxcbik7XG5kZWxlZ2F0ZVRvQ2FsbHMoXG4gICAgcHJveHlBcGksXG4gICAgXCJhbHdheXNDYWxsZWRXaXRoRXhhY3RseVwiLFxuICAgIGZhbHNlLFxuICAgIFwiY2FsbGVkV2l0aEV4YWN0bHlcIixcbik7XG5kZWxlZ2F0ZVRvQ2FsbHMoXG4gICAgcHJveHlBcGksXG4gICAgXCJuZXZlckNhbGxlZFdpdGhcIixcbiAgICBmYWxzZSxcbiAgICBcIm5vdENhbGxlZFdpdGhcIixcbiAgICBmYWxzZSxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4pO1xuZGVsZWdhdGVUb0NhbGxzKFxuICAgIHByb3h5QXBpLFxuICAgIFwibmV2ZXJDYWxsZWRXaXRoTWF0Y2hcIixcbiAgICBmYWxzZSxcbiAgICBcIm5vdENhbGxlZFdpdGhNYXRjaFwiLFxuICAgIGZhbHNlLFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwidGhyZXdcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiYWx3YXlzVGhyZXdcIiwgZmFsc2UsIFwidGhyZXdcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwicmV0dXJuZWRcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiYWx3YXlzUmV0dXJuZWRcIiwgZmFsc2UsIFwicmV0dXJuZWRcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkV2l0aE5ld1wiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsIGZhbHNlLCBcImNhbGxlZFdpdGhOZXdcIik7XG5cbmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jLCBvcmlnaW5hbEZ1bmMpIHtcbiAgICBjb25zdCBhcml0eSA9IG9yaWdpbmFsRnVuYy5sZW5ndGg7XG4gICAgbGV0IHA7XG4gICAgLy8gRG8gbm90IGNoYW5nZSB0aGlzIHRvIHVzZSBhbiBldmFsLiBQcm9qZWN0cyB0aGF0IGRlcGVuZCBvbiBzaW5vbiBibG9jayB0aGUgdXNlIG9mIGV2YWwuXG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vc2lub25qcy9zaW5vbi9pc3N1ZXMvNzEwXG4gICAgc3dpdGNoIChhcml0eSkge1xuICAgICAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzKi9cbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYsIGcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8qZXNsaW50LWVuYWJsZSovXG4gICAgfVxuICAgIGNvbnN0IG5hbWVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgb3JpZ2luYWxGdW5jLFxuICAgICAgICBcIm5hbWVcIixcbiAgICApO1xuICAgIGlmIChuYW1lRGVzY3JpcHRvciAmJiBuYW1lRGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgLy8gSUUgMTEgZnVuY3Rpb25zIGRvbid0IGhhdmUgYSBuYW1lLlxuICAgICAgICAvLyBTYWZhcmkgOSBoYXMgbmFtZXMgdGhhdCBhcmUgbm90IGNvbmZpZ3VyYWJsZS5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHAsIFwibmFtZVwiLCBuYW1lRGVzY3JpcHRvcik7XG4gICAgfVxuICAgIGV4dGVuZC5ub25FbnVtKHAsIHtcbiAgICAgICAgaXNTaW5vblByb3h5OiB0cnVlLFxuXG4gICAgICAgIGNhbGxlZDogZmFsc2UsXG4gICAgICAgIG5vdENhbGxlZDogdHJ1ZSxcbiAgICAgICAgY2FsbGVkT25jZTogZmFsc2UsXG4gICAgICAgIGNhbGxlZFR3aWNlOiBmYWxzZSxcbiAgICAgICAgY2FsbGVkVGhyaWNlOiBmYWxzZSxcbiAgICAgICAgY2FsbENvdW50OiAwLFxuICAgICAgICBmaXJzdENhbGw6IG51bGwsXG4gICAgICAgIGZpcnN0QXJnOiBudWxsLFxuICAgICAgICBzZWNvbmRDYWxsOiBudWxsLFxuICAgICAgICB0aGlyZENhbGw6IG51bGwsXG4gICAgICAgIGxhc3RDYWxsOiBudWxsLFxuICAgICAgICBsYXN0QXJnOiBudWxsLFxuICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgcmV0dXJuVmFsdWVzOiBbXSxcbiAgICAgICAgdGhpc1ZhbHVlczogW10sXG4gICAgICAgIGV4Y2VwdGlvbnM6IFtdLFxuICAgICAgICBjYWxsSWRzOiBbXSxcbiAgICAgICAgZXJyb3JzV2l0aENhbGxTdGFjazogW10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb3h5IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U2lub25GdW5jdGlvbn0gZnVuYyBUaGUgb3JpZ2luYWwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7U2lub25GdW5jdGlvbn0gb3JpZ2luYWxGdW5jIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiAoZm9yIGFyaXR5IGFuZCBuYW1lKVxuICogQHJldHVybnMge1Npbm9uRnVuY3Rpb259IFRoZSBwcm94eSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm94eShmdW5jLCBvcmlnaW5hbEZ1bmMpIHtcbiAgICBjb25zdCBwcm94eSA9IHdyYXBGdW5jdGlvbihmdW5jLCBvcmlnaW5hbEZ1bmMpO1xuXG4gICAgLy8gSW5oZXJpdCBmdW5jdGlvbiBwcm9wZXJ0aWVzOlxuICAgIGV4dGVuZChwcm94eSwgZnVuYyk7XG5cbiAgICBwcm94eS5wcm90b3R5cGUgPSBmdW5jLnByb3RvdHlwZTtcblxuICAgIGV4dGVuZC5ub25FbnVtKHByb3h5LCBwcm94eUFwaSk7XG5cbiAgICByZXR1cm4gcHJveHk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUHJveHk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIGEgcHJvcCBleGlzdHMgaW4gdGhlIHByb3RvdHlwZSBjaGFpblxuICovXG5mdW5jdGlvbiBpc05vbkV4aXN0ZW50UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICBvYmplY3QgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSBcInVuZGVmaW5lZFwiICYmICEocHJvcGVydHkgaW4gb2JqZWN0KSxcbiAgICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTm9uRXhpc3RlbnRQcm9wZXJ0eTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVmVyaWZ5IGlmIGFuIG9iamVjdCBpcyBhIEVDTUFTY3JpcHQgTW9kdWxlXG4gKlxuICogQXMgdGhlIGV4cG9ydHMgZnJvbSBhIG1vZHVsZSBpcyBpbW11dGFibGUgd2UgY2Fubm90IGFsdGVyIHRoZSBleHBvcnRzXG4gKiB1c2luZyBzcGllcyBvciBzdHVicy4gTGV0IHRoZSBjb25zdW1lciBrbm93IHRoaXMgdG8gYXZvaWQgYnVnIHJlcG9ydHNcbiAqIG9uIHdlaXJkIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSB3aGVuIHRoZSBvYmplY3QgaXMgYSBtb2R1bGVcbiAqL1xuZnVuY3Rpb24gaXNFc01vZHVsZShvYmplY3QpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3QgJiZcbiAgICAgICAgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICBvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gXCJNb2R1bGVcIiAmJlxuICAgICAgICBPYmplY3QuaXNTZWFsZWQob2JqZWN0KVxuICAgICk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFc01vZHVsZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3IuanMnKTtcbnZhciB3YWxrID0gcmVxdWlyZSgnLi93YWxrLmpzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IGZ1bmN0aW9uTmFtZSB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0O1xuXG4vKipcbiAqIEBjYWxsYmFjayBPYmplY3RNdXRhdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE9iamVjdEZpbHRlclxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEEgdXRpbGl0eSB0aGF0IGFsbG93cyB0cmF2ZXJzaW5nIGFuIG9iamVjdCwgYXBwbHlpbmcgbXV0YXRpbmcgZnVuY3Rpb25zIG9uIHRoZSBwcm9wZXJ0aWVzXG4gKlxuICogQHBhcmFtIHtPYmplY3RNdXRhdG9yfSBtdXRhdG9yIGNhbGxlZCBvbiBlYWNoIHByb3BlcnR5XG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IHRoZSBvYmplY3Qgd2UgYXJlIHdhbGtpbmcgb3ZlclxuICogQHBhcmFtIHtPYmplY3RGaWx0ZXJ9IGZpbHRlciBhIHByZWRpY2F0ZSAoYm9vbGVhbiBmdW5jdGlvbikgdGhhdCB3aWxsIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhcHBseSB0aGUgbXV0YXRvciB0byB0aGUgY3VycmVudCBwcm9wZXJ0eVxuICogQHJldHVybnMge3ZvaWR9IG5vdGhpbmdcbiAqL1xuY29uc3Qgd2Fsa09iamVjdCA9IGZ1bmN0aW9uIChtdXRhdG9yLCBvYmplY3QsIGZpbHRlcikge1xuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuYW1lID0gZnVuY3Rpb25OYW1lKG11dGF0b3IpO1xuXG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRyeWluZyB0byAke25hbWV9IG9iamVjdCBidXQgcmVjZWl2ZWQgJHtTdHJpbmcob2JqZWN0KX1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHdhbGsob2JqZWN0LCBmdW5jdGlvbiAocHJvcCwgcHJvcE93bmVyKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gc3R1YiB0aGluZ3MgbGlrZSB0b1N0cmluZygpLCB2YWx1ZU9mKCksIGV0Yy4gc28gd2Ugb25seSBzdHViIGlmIHRoZSBvYmplY3RcbiAgICAgICAgLy8gaXMgbm90IE9iamVjdC5wcm90b3R5cGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvcE93bmVyICE9PSBPYmplY3QucHJvdG90eXBlICYmXG4gICAgICAgICAgICBwcm9wICE9PSBcImNvbnN0cnVjdG9yXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcE93bmVyLCBwcm9wKS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIob2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBtdXRhdG9yKG9iamVjdCwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG11dGF0b3Iob2JqZWN0LCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZvdW5kIG5vIG1ldGhvZHMgb24gb2JqZWN0IHRvIHdoaWNoIHdlIGNvdWxkIGFwcGx5IG11dGF0aW9uc2AsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gd2Fsa09iamVjdDtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHNpbm9uVHlwZVN5bWJvbFByb3BlcnR5ID0gU3ltYm9sKFwiU2lub25UeXBlXCIpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaW5vbkZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLnVua25vd259IGFyZ3NcbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICovXG5cbnZhciBzaW5vblR5cGUgPSB7XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB0eXBlIG9mIGEgU2lub24gb2JqZWN0IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaWRlbnRpZnkgaXQgbGF0ZXIgYXQgcnVudGltZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R8KCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pfSBvYmplY3QgIG9iamVjdC9mdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0aGUgbmFtZWQgdHlwZSBvZiB0aGUgb2JqZWN0L2Z1bmN0aW9uXG4gICAgICovXG4gICAgc2V0KG9iamVjdCwgdHlwZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBzaW5vblR5cGVTeW1ib2xQcm9wZXJ0eSwge1xuICAgICAgICAgICAgdmFsdWU6IHR5cGUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0KG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdFtzaW5vblR5cGVTeW1ib2xQcm9wZXJ0eV07XG4gICAgfSxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gc2lub25UeXBlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9nZXQtcHJvcGVydHktZGVzY3JpcHRvci5qcycpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4vZXh0ZW5kLmpzJyk7XG52YXIgc2lub25UeXBlID0gcmVxdWlyZSgnLi9zaW5vbi10eXBlLmpzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IHByb3RvdHlwZXMsIHZhbHVlVG9TdHJpbmcgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcblxuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gcHJvdG90eXBlcy5vYmplY3Q7XG5jb25zdCB7IHB1c2ggfSA9IHByb3RvdHlwZXMuYXJyYXk7XG5cbi8qKlxuICogQGNhbGxiYWNrIFNpbm9uRnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gYXJnc1xuICogQHJldHVybnMge3Vua25vd259XG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIEJvb2xlYW4ob2JqICYmIG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY2FsbCAmJiBvYmouYXBwbHkpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gbWlycm9yUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh0YXJnZXQsIHByb3ApKSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjY2Vzc29yKG9iamVjdCwgcHJvcGVydHksIG1ldGhvZCkge1xuICAgIGNvbnN0IGFjY2Vzc29ycyA9IFtcImdldFwiLCBcInNldFwiXTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY2Nlc3NvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGVzY3JpcHRvclthY2Nlc3NvcnNbaV1dICYmXG4gICAgICAgICAgICBkZXNjcmlwdG9yW2FjY2Vzc29yc1tpXV0ubmFtZSA9PT0gbWV0aG9kLm5hbWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXNzb3JzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vLyBDaGVhcCB3YXkgdG8gZGV0ZWN0IGlmIHdlIGhhdmUgRVM1IHN1cHBvcnQuXG5jb25zdCBoYXNFUzVTdXBwb3J0ID0gXCJrZXlzXCIgaW4gT2JqZWN0O1xuXG4vKipcbiAqIFdyYXBzIGEgbWV0aG9kIG9uIGFuIG9iamVjdCB3aXRoIGFub3RoZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gd3JhcFxuICogQHBhcmFtIHtTaW5vbkZ1bmN0aW9ufG9iamVjdH0gbWV0aG9kIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIG9yIGEgcHJvcGVydHkgZGVzY3JpcHRvclxuICogQHJldHVybnMge1Npbm9uRnVuY3Rpb259IFRoZSB3cmFwcGVkIG1ldGhvZFxuICovXG5mdW5jdGlvbiB3cmFwTWV0aG9kKG9iamVjdCwgcHJvcGVydHksIG1ldGhvZCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTaG91bGQgd3JhcCBwcm9wZXJ0eSBvZiBvYmplY3RcIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgbWV0aG9kICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBcIk1ldGhvZCB3cmFwcGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9yIGEgcHJvcGVydHkgZGVzY3JpcHRvclwiLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV3JhcHBlZE1ldGhvZCh3cmFwcGVkTWV0aG9kKSB7XG4gICAgICAgIGxldCBlcnJvcjtcblxuICAgICAgICBpZiAoIWlzRnVuY3Rpb24od3JhcHBlZE1ldGhvZCkpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgQXR0ZW1wdGVkIHRvIHdyYXAgJHt0eXBlb2Ygd3JhcHBlZE1ldGhvZH0gcHJvcGVydHkgJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICApfSBhcyBmdW5jdGlvbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHdyYXBwZWRNZXRob2QucmVzdG9yZSAmJiB3cmFwcGVkTWV0aG9kLnJlc3RvcmUuc2lub24pIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgQXR0ZW1wdGVkIHRvIHdyYXAgJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICApfSB3aGljaCBpcyBhbHJlYWR5IHdyYXBwZWRgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkTWV0aG9kLmNhbGxlZEJlZm9yZSkge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IHdyYXBwZWRNZXRob2QucmV0dXJucyA/IFwic3R1YmJlZFwiIDogXCJzcGllZCBvblwiO1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBBdHRlbXB0ZWQgdG8gd3JhcCAke3ZhbHVlVG9TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICl9IHdoaWNoIGlzIGFscmVhZHkgJHt2ZXJifWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAod3JhcHBlZE1ldGhvZCAmJiB3cmFwcGVkTWV0aG9kLnN0YWNrVHJhY2VFcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrICs9IGBcXG4tLS0tLS0tLS0tLS0tLVxcbiR7d3JhcHBlZE1ldGhvZC5zdGFja1RyYWNlRXJyb3Iuc3RhY2t9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVycm9yLCB3cmFwcGVkTWV0aG9kLCBpLCB3cmFwcGVkTWV0aG9kRGVzYywgdGFyZ2V0LCBhY2Nlc3NvcjtcblxuICAgIGNvbnN0IHdyYXBwZWRNZXRob2RzID0gW107XG5cbiAgICBmdW5jdGlvbiBzaW1wbGVQcm9wZXJ0eUFzc2lnbm1lbnQoKSB7XG4gICAgICAgIHdyYXBwZWRNZXRob2QgPSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCk7XG4gICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBtZXRob2Q7XG4gICAgICAgIG1ldGhvZC5kaXNwbGF5TmFtZSA9IHByb3BlcnR5O1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggaGFzIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGhhc093bi5jYWxsIG9uIG9iamVjdHMgZnJvbSBvdGhlciBmcmFtZXMuXG4gICAgY29uc3Qgb3duZWQgPSBvYmplY3QuaGFzT3duUHJvcGVydHlcbiAgICAgICAgPyBvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydHkpXG4gICAgICAgIDogaGFzT3duUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICBpZiAoaGFzRVM1U3VwcG9ydCkge1xuICAgICAgICBjb25zdCBtZXRob2REZXNjID1cbiAgICAgICAgICAgIHR5cGVvZiBtZXRob2QgPT09IFwiZnVuY3Rpb25cIiA/IHsgdmFsdWU6IG1ldGhvZCB9IDogbWV0aG9kO1xuICAgICAgICB3cmFwcGVkTWV0aG9kRGVzYyA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAoIXdyYXBwZWRNZXRob2REZXNjKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEF0dGVtcHRlZCB0byB3cmFwICR7dHlwZW9mIHdyYXBwZWRNZXRob2R9IHByb3BlcnR5ICR7cHJvcGVydHl9IGFzIGZ1bmN0aW9uYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB3cmFwcGVkTWV0aG9kRGVzYy5yZXN0b3JlICYmXG4gICAgICAgICAgICB3cmFwcGVkTWV0aG9kRGVzYy5yZXN0b3JlLnNpbm9uXG4gICAgICAgICkge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBBdHRlbXB0ZWQgdG8gd3JhcCAke3Byb3BlcnR5fSB3aGljaCBpcyBhbHJlYWR5IHdyYXBwZWRgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh3cmFwcGVkTWV0aG9kRGVzYyAmJiB3cmFwcGVkTWV0aG9kRGVzYy5zdGFja1RyYWNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5zdGFjayArPSBgXFxuLS0tLS0tLS0tLS0tLS1cXG4ke3dyYXBwZWRNZXRob2REZXNjLnN0YWNrVHJhY2VFcnJvci5zdGFja31gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlcyA9IE9iamVjdC5rZXlzKG1ldGhvZERlc2MpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHdyYXBwZWRNZXRob2QgPSB3cmFwcGVkTWV0aG9kRGVzY1t0eXBlc1tpXV07XG4gICAgICAgICAgICBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCk7XG4gICAgICAgICAgICBwdXNoKHdyYXBwZWRNZXRob2RzLCB3cmFwcGVkTWV0aG9kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1pcnJvclByb3BlcnRpZXMobWV0aG9kRGVzYywgd3JhcHBlZE1ldGhvZERlc2MpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG1pcnJvclByb3BlcnRpZXMobWV0aG9kRGVzY1t0eXBlc1tpXV0sIHdyYXBwZWRNZXRob2REZXNjW3R5cGVzW2ldXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGZsaXAgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wIG9uIGFuXG4gICAgICAgIC8vIGV4aXN0aW5nIGRlc2NyaXB0b3IgdG8gYW55dGhpbmcgYnV0IGZhbHNlICgjMjUxNClcbiAgICAgICAgaWYgKCFvd25lZCkge1xuICAgICAgICAgICAgbWV0aG9kRGVzYy5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIG1ldGhvZERlc2MpO1xuXG4gICAgICAgIC8vIGNhdGNoIGZhaWxpbmcgYXNzaWdubWVudFxuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjb252ZXJzZSBvZiB0aGUgY2hlY2sgaW4gYC5yZXN0b3JlYCBiZWxvd1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gXCJmdW5jdGlvblwiICYmIG9iamVjdFtwcm9wZXJ0eV0gIT09IG1ldGhvZCkge1xuICAgICAgICAgICAgLy8gY29ycmVjdCBhbnkgd3Jvbmdkb2luZ3MgY2F1c2VkIGJ5IHRoZSBkZWZpbmVQcm9wZXJ0eSBjYWxsIGFib3ZlLFxuICAgICAgICAgICAgLy8gc3VjaCBhcyBhZGRpbmcgbmV3IGl0ZW1zIChpZiBvYmplY3Qgd2FzIGEgU3RvcmFnZSBvYmplY3QpXG4gICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIHNpbXBsZVByb3BlcnR5QXNzaWdubWVudCgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2ltcGxlUHJvcGVydHlBc3NpZ25tZW50KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzdG9yZSgpIHtcbiAgICAgICAgYWNjZXNzb3IgPSBnZXRBY2Nlc3NvcihvYmplY3QsIHByb3BlcnR5LCB0aGlzLndyYXBwZWRNZXRob2QpO1xuICAgICAgICBsZXQgZGVzY3JpcHRvcjtcbiAgICAgICAgLy8gRm9yIHByb3RvdHlwZSBwcm9wZXJ0aWVzIHRyeSB0byByZXNldCBieSBkZWxldGUgZmlyc3QuXG4gICAgICAgIC8vIElmIHRoaXMgZmFpbHMgKGV4OiBsb2NhbFN0b3JhZ2Ugb24gbW9iaWxlIHNhZmFyaSkgdGhlbiBmb3JjZSBhIHJlc2V0XG4gICAgICAgIC8vIHZpYSBkaXJlY3QgYXNzaWdubWVudC5cbiAgICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgICAgICBpZiAoIW93bmVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyBgZGVsZXRlYCBtYXkgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV1bYWNjZXNzb3JdO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICAgICAgICAvLyBGb3IgbmF0aXZlIGNvZGUgZnVuY3Rpb25zIGBkZWxldGVgIGZhaWxzIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAvLyBvbiBDaHJvbWUgPCA0MywgUGhhbnRvbUpTLCBldGMuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JbYWNjZXNzb3JdID0gd3JhcHBlZE1ldGhvZERlc2NbYWNjZXNzb3JdO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWUgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldW2FjY2Vzc29yXSA9IHRoaXMud3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbiB0byBjaGVjayBmYWlsdXJlcyB0aGVuIGZvcmNlIGEgcmVzZXRcbiAgICAgICAgICAgICAgICAvLyB2aWEgZGlyZWN0IGFzc2lnbm1lbnQuXG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdFtwcm9wZXJ0eV1bYWNjZXNzb3JdID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XVthY2Nlc3Nvcl0gPSB0aGlzLndyYXBwZWRNZXRob2Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFvd25lZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRVM1U3VwcG9ydCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB3cmFwcGVkTWV0aG9kRGVzYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChoYXNFUzVTdXBwb3J0KSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IHRoaXMud3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3RbcHJvcGVydHldID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IHRoaXMud3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpbm9uVHlwZS5nZXQob2JqZWN0KSA9PT0gXCJzdHViLWluc3RhbmNlXCIpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgc2ltcGx5IHRvIGF2b2lkIGVycm9ycyBhZnRlciByZXN0b3JpbmcgaWYgc29tZXRoaW5nIHNob3VsZFxuICAgICAgICAgICAgLy8gdHJhdmVyc2UgdGhlIG9iamVjdCBpbiBhIGNsZWFudXAgcGhhc2UsIHJlZiAjMjQ3N1xuICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmRPYmplY3RXaXRoV3JhcHBlZE1ldGhvZHMoKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB3cmFwcGVkTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWNjZXNzb3IgPSBnZXRBY2Nlc3NvcihvYmplY3QsIHByb3BlcnR5LCB3cmFwcGVkTWV0aG9kc1tpXSk7XG4gICAgICAgICAgICB0YXJnZXQgPSBhY2Nlc3NvciA/IG1ldGhvZFthY2Nlc3Nvcl0gOiBtZXRob2Q7XG4gICAgICAgICAgICBleHRlbmQubm9uRW51bSh0YXJnZXQsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogcHJvcGVydHksXG4gICAgICAgICAgICAgICAgd3JhcHBlZE1ldGhvZDogd3JhcHBlZE1ldGhvZHNbaV0sXG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdXAgYW4gRXJyb3Igb2JqZWN0IGZvciBhIHN0YWNrIHRyYWNlIHdoaWNoIGNhbiBiZSB1c2VkIGxhdGVyIHRvIGZpbmQgd2hhdCBsaW5lIG9mXG4gICAgICAgICAgICAgICAgLy8gY29kZSB0aGUgb3JpZ2luYWwgbWV0aG9kIHdhcyBjcmVhdGVkIG9uLlxuICAgICAgICAgICAgICAgIHN0YWNrVHJhY2VFcnJvcjogbmV3IEVycm9yKFwiU3RhY2sgVHJhY2UgZm9yIG9yaWdpbmFsXCIpLFxuXG4gICAgICAgICAgICAgICAgcmVzdG9yZTogcmVzdG9yZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0YXJnZXQucmVzdG9yZS5zaW5vbiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIWhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICBtaXJyb3JQcm9wZXJ0aWVzKHRhcmdldCwgd3JhcHBlZE1ldGhvZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleHRlbmRPYmplY3RXaXRoV3JhcHBlZE1ldGhvZHMoKTtcblxuICAgIHJldHVybiBtZXRob2Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcE1ldGhvZDtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xudmFyIHNhbXNhbSA9IHJlcXVpcmUoJ0BzaW5vbmpzL3NhbXNhbScpO1xudmFyIHByb3h5ID0gcmVxdWlyZSgnLi9wcm94eS5qcycpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2V4dGVuZC5qcycpO1xudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzJyk7XG52YXIgaXNFc01vZHVsZSA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2lzLWVzLW1vZHVsZS5qcycpO1xudmFyIHByb3h5Q2FsbFV0aWwgPSByZXF1aXJlKCcuL3Byb3h5LWNhbGwtdXRpbC5qcycpO1xudmFyIHdhbGtPYmplY3QgPSByZXF1aXJlKCcuL3V0aWwvY29yZS93YWxrLW9iamVjdC5qcycpO1xudmFyIHdyYXBNZXRob2QgPSByZXF1aXJlKCcuL3V0aWwvY29yZS93cmFwLW1ldGhvZC5qcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcbnZhciBzYW1zYW1fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KHNhbXNhbSk7XG5cbmNvbnN0IHsgcHJvdG90eXBlcywgZnVuY3Rpb25OYW1lLCB2YWx1ZVRvU3RyaW5nIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGRlZXBFcXVhbCB9ID0gc2Ftc2FtX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGZvckVhY2gsIHBvcCwgcHVzaCwgc2xpY2UgfSA9IHByb3RvdHlwZXMuYXJyYXk7XG5jb25zdCBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaW5vbkZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLnVua25vd259IGFyZ3NcbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICovXG5cbmxldCB1dWlkID0gMDtcblxuZnVuY3Rpb24gbWF0Y2hlcyhmYWtlLCBhcmdzLCBzdHJpY3QpIHtcbiAgICBjb25zdCBtYXJncyA9IGZha2UubWF0Y2hpbmdBcmd1bWVudHM7XG4gICAgaWYgKFxuICAgICAgICBtYXJncy5sZW5ndGggPD0gYXJncy5sZW5ndGggJiZcbiAgICAgICAgZGVlcEVxdWFsKHNsaWNlKGFyZ3MsIDAsIG1hcmdzLmxlbmd0aCksIG1hcmdzKVxuICAgICkge1xuICAgICAgICByZXR1cm4gIXN0cmljdCB8fCBtYXJncy5sZW5ndGggPT09IGFyZ3MubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFB1YmxpYyBBUElcbmNvbnN0IHNweUFwaSA9IHtcbiAgICB3aXRoQXJnczogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gc2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSBwb3AodGhpcy5tYXRjaGluZ0Zha2VzKGFyZ3MsIHRydWUpKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGZha2VJbnN0YW5jZSA9IHRoaXMuaW5zdGFudGlhdGVGYWtlKCk7XG4gICAgICAgIGZha2VJbnN0YW5jZS5tYXRjaGluZ0FyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIGZha2VJbnN0YW5jZS5wYXJlbnQgPSB0aGlzO1xuICAgICAgICBwdXNoKHRoaXMuZmFrZXMsIGZha2VJbnN0YW5jZSk7XG5cbiAgICAgICAgZmFrZUluc3RhbmNlLndpdGhBcmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLndpdGhBcmdzLmFwcGx5KG9yaWdpbmFsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvckVhY2gob3JpZ2luYWwuYXJncywgZnVuY3Rpb24gKGFyZywgaSkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGZha2VJbnN0YW5jZSwgYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJveHlDYWxsVXRpbC5pbmNyZW1lbnRDYWxsQ291bnQoZmFrZUluc3RhbmNlKTtcbiAgICAgICAgICAgIHB1c2goZmFrZUluc3RhbmNlLnRoaXNWYWx1ZXMsIG9yaWdpbmFsLnRoaXNWYWx1ZXNbaV0pO1xuICAgICAgICAgICAgcHVzaChmYWtlSW5zdGFuY2UuYXJncywgYXJnKTtcbiAgICAgICAgICAgIHB1c2goZmFrZUluc3RhbmNlLnJldHVyblZhbHVlcywgb3JpZ2luYWwucmV0dXJuVmFsdWVzW2ldKTtcbiAgICAgICAgICAgIHB1c2goZmFrZUluc3RhbmNlLmV4Y2VwdGlvbnMsIG9yaWdpbmFsLmV4Y2VwdGlvbnNbaV0pO1xuICAgICAgICAgICAgcHVzaChmYWtlSW5zdGFuY2UuY2FsbElkcywgb3JpZ2luYWwuY2FsbElkc1tpXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb3h5Q2FsbFV0aWwuY3JlYXRlQ2FsbFByb3BlcnRpZXMoZmFrZUluc3RhbmNlKTtcblxuICAgICAgICByZXR1cm4gZmFrZUluc3RhbmNlO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSBwcm94eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uXG4gICAgbWF0Y2hpbmdGYWtlczogZnVuY3Rpb24gKGFyZ3MsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5mYWtlcywgZnVuY3Rpb24gKGZha2VJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMoZmFrZUluc3RhbmNlLCBhcmdzLCBzdHJpY3QpO1xuICAgICAgICB9KTtcbiAgICB9LFxufTtcblxuY29uc3QgZGVsZWdhdGVUb0NhbGxzID0gcHJveHlDYWxsVXRpbC5kZWxlZ2F0ZVRvQ2FsbHM7XG5kZWxlZ2F0ZVRvQ2FsbHMoc3B5QXBpLCBcImNhbGxBcmdcIiwgZmFsc2UsIFwiY2FsbEFyZ1dpdGhcIiwgdHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7dGhpcy50b1N0cmluZygpfSBjYW5ub3QgY2FsbCBhcmcgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5gLFxuICAgICk7XG59KTtcbnNweUFwaS5jYWxsQXJnV2l0aCA9IHNweUFwaS5jYWxsQXJnO1xuZGVsZWdhdGVUb0NhbGxzKHNweUFwaSwgXCJjYWxsQXJnT25cIiwgZmFsc2UsIFwiY2FsbEFyZ09uV2l0aFwiLCB0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLnRvU3RyaW5nKCl9IGNhbm5vdCBjYWxsIGFyZyBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLmAsXG4gICAgKTtcbn0pO1xuc3B5QXBpLmNhbGxBcmdPbldpdGggPSBzcHlBcGkuY2FsbEFyZ09uO1xuZGVsZWdhdGVUb0NhbGxzKHNweUFwaSwgXCJ0aHJvd0FyZ1wiLCBmYWxzZSwgXCJ0aHJvd0FyZ1wiLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7dGhpcy50b1N0cmluZygpfSBjYW5ub3QgdGhyb3cgYXJnIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuYCxcbiAgICApO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoc3B5QXBpLCBcInlpZWxkXCIsIGZhbHNlLCBcInlpZWxkXCIsIHRydWUsIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMudG9TdHJpbmcoKX0gY2Fubm90IHlpZWxkIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuYCxcbiAgICApO1xufSk7XG4vLyBcImludm9rZUNhbGxiYWNrXCIgaXMgYW4gYWxpYXMgZm9yIFwieWllbGRcIiBzaW5jZSBcInlpZWxkXCIgaXMgaW52YWxpZCBpbiBzdHJpY3QgbW9kZS5cbnNweUFwaS5pbnZva2VDYWxsYmFjayA9IHNweUFwaS55aWVsZDtcbmRlbGVnYXRlVG9DYWxscyhzcHlBcGksIFwieWllbGRPblwiLCBmYWxzZSwgXCJ5aWVsZE9uXCIsIHRydWUsIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMudG9TdHJpbmcoKX0gY2Fubm90IHlpZWxkIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuYCxcbiAgICApO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoc3B5QXBpLCBcInlpZWxkVG9cIiwgZmFsc2UsIFwieWllbGRUb1wiLCB0cnVlLCBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMudG9TdHJpbmcoKX0gY2Fubm90IHlpZWxkIHRvICcke3ZhbHVlVG9TdHJpbmcoXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgKX0nIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuYCxcbiAgICApO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXG4gICAgc3B5QXBpLFxuICAgIFwieWllbGRUb09uXCIsXG4gICAgZmFsc2UsXG4gICAgXCJ5aWVsZFRvT25cIixcbiAgICB0cnVlLFxuICAgIGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHt0aGlzLnRvU3RyaW5nKCl9IGNhbm5vdCB5aWVsZCB0byAnJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgKX0nIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuYCxcbiAgICAgICAgKTtcbiAgICB9LFxuKTtcblxuZnVuY3Rpb24gY3JlYXRlU3B5KGZ1bmMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBsZXQgZnVuayA9IGZ1bmM7XG5cbiAgICBpZiAodHlwZW9mIGZ1bmsgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBmdW5rID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSBmdW5jdGlvbk5hbWUoZnVuayk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJveHkkMSA9IHByb3h5KGZ1bmssIGZ1bmspO1xuXG4gICAgLy8gSW5oZXJpdCBzcHkgQVBJOlxuICAgIGV4dGVuZC5ub25FbnVtKHByb3h5JDEsIHNweUFwaSk7XG4gICAgZXh0ZW5kLm5vbkVudW0ocHJveHkkMSwge1xuICAgICAgICBkaXNwbGF5TmFtZTogbmFtZSB8fCBcInNweVwiLFxuICAgICAgICBmYWtlczogW10sXG4gICAgICAgIGluc3RhbnRpYXRlRmFrZTogY3JlYXRlU3B5LFxuICAgICAgICBpZDogYHNweSMke3V1aWQrK31gLFxuICAgIH0pO1xuICAgIHJldHVybiBwcm94eSQxO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzcHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8U2lub25GdW5jdGlvbn0gW29iamVjdF0gVGhlIG9iamVjdCBvciBmdW5jdGlvbiB0byBzcHkgb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHNweSBvblxuICogQHBhcmFtIHtBcnJheX0gW3R5cGVzXSBUeXBlcyBvZiBhY2Nlc3NvciB0byBzcHkgb24gKGdldCwgc2V0KVxuICogQHJldHVybnMge1Npbm9uRnVuY3Rpb258b2JqZWN0fSBUaGUgc3B5IG9yIGFuIG9iamVjdCB3aXRoIHNwaWVkIGFjY2Vzc29yc1xuICovXG5mdW5jdGlvbiBzcHkob2JqZWN0LCBwcm9wZXJ0eSwgdHlwZXMpIHtcbiAgICBpZiAoaXNFc01vZHVsZShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUyBNb2R1bGVzIGNhbm5vdCBiZSBzcGllZFwiKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BlcnR5ICYmIHR5cGVvZiBvYmplY3QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3B5KG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wZXJ0eSAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiB3YWxrT2JqZWN0KHNweSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICBpZiAoIW9iamVjdCAmJiAhcHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNweShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgY3JlYXRlU3B5KG9iamVjdFtwcm9wZXJ0eV0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcmlwdG9yID0ge307XG4gICAgY29uc3QgbWV0aG9kRGVzYyA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGZvckVhY2godHlwZXMsIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbdHlwZV0gPSBjcmVhdGVTcHkobWV0aG9kRGVzY1t0eXBlXSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd3JhcE1ldGhvZChvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcbn1cblxuZXh0ZW5kKHNweSwgc3B5QXBpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzcHk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG52YXIgY29tbW9uc19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHQoY29tbW9ucyk7XG5cbmNvbnN0IHsgdmFsdWVUb1N0cmluZyB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0O1xuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgb2JqZWN0IGlzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIHN0dWIgYSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIHByb3BlcnR5IG5hbWVcbiAqL1xuZnVuY3Rpb24gdGhyb3dPbkZhbHN5T2JqZWN0KG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBpZiAocHJvcGVydHkgJiYgIW9iamVjdCkge1xuICAgICAgICBjb25zdCB0eXBlID0gb2JqZWN0ID09PSBudWxsID8gXCJudWxsXCIgOiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVHJ5aW5nIHRvIHN0dWIgcHJvcGVydHkgJyR7dmFsdWVUb1N0cmluZyhwcm9wZXJ0eSl9JyBvZiAke3R5cGV9YCxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3dPbkZhbHN5T2JqZWN0O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbnMgPSByZXF1aXJlKCdAc2lub25qcy9jb21tb25zJyk7XG52YXIgYmVoYXZpb3IgPSByZXF1aXJlKCcuL2JlaGF2aW9yLmpzJyk7XG52YXIgZGVmYXVsdEJlaGF2aW9ycyA9IHJlcXVpcmUoJy4vZGVmYXVsdC1iZWhhdmlvcnMuanMnKTtcbnZhciBwcm94eSA9IHJlcXVpcmUoJy4vcHJveHkuanMnKTtcbnZhciBpc05vbkV4aXN0ZW50UHJvcGVydHkgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9pcy1ub24tZXhpc3RlbnQtcHJvcGVydHkuanMnKTtcbnZhciBzcHkgPSByZXF1aXJlKCcuL3NweS5qcycpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2V4dGVuZC5qcycpO1xudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzJyk7XG52YXIgaXNFc01vZHVsZSA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2lzLWVzLW1vZHVsZS5qcycpO1xudmFyIHNpbm9uVHlwZSA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL3Npbm9uLXR5cGUuanMnKTtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvd3JhcC1tZXRob2QuanMnKTtcbnZhciB0aHJvd09uRmFsc3lPYmplY3QgPSByZXF1aXJlKCcuL3Rocm93LW9uLWZhbHN5LW9iamVjdC5qcycpO1xudmFyIHdhbGtPYmplY3QgPSByZXF1aXJlKCcuL3V0aWwvY29yZS93YWxrLW9iamVjdC5qcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcblxuY29uc3QgeyBwcm90b3R5cGVzOiBjb21tb25zUHJvdG90eXBlcywgZnVuY3Rpb25OYW1lLCB2YWx1ZVRvU3RyaW5nIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGFycmF5OiBhcnJheVByb3RvLCBvYmplY3Q6IG9iamVjdFByb3RvIH0gPSBjb21tb25zUHJvdG90eXBlcztcbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IG9iamVjdFByb3RvO1xuXG5jb25zdCBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xuY29uc3QgcG9wID0gYXJyYXlQcm90by5wb3A7XG5jb25zdCBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5jb25zdCBzb3J0ID0gYXJyYXlQcm90by5zb3J0O1xuXG5sZXQgdXVpZCA9IDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0dWIob3JpZ2luYWxGdW5jKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCBwcm94eSQxO1xuXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25TdHViKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gc2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdzID0gcHJveHkkMS5tYXRjaGluZ0Zha2VzKGFyZ3MpO1xuXG4gICAgICAgIGNvbnN0IGZuU3R1YiA9XG4gICAgICAgICAgICBwb3AoXG4gICAgICAgICAgICAgICAgc29ydChtYXRjaGluZ3MsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBhLm1hdGNoaW5nQXJndW1lbnRzLmxlbmd0aCAtIGIubWF0Y2hpbmdBcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApIHx8IHByb3h5JDE7XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50QmVoYXZpb3IoZm5TdHViKS5pbnZva2UodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBwcm94eSQxID0gcHJveHkoZnVuY3Rpb25TdHViLCBvcmlnaW5hbEZ1bmMgfHwgZnVuY3Rpb25TdHViKTtcbiAgICAvLyBJbmhlcml0IHNweSBBUEk6XG4gICAgZXh0ZW5kLm5vbkVudW0ocHJveHkkMSwgc3B5KTtcbiAgICAvLyBJbmhlcml0IHN0dWIgQVBJOlxuICAgIGV4dGVuZC5ub25FbnVtKHByb3h5JDEsIHN0dWIpO1xuXG4gICAgY29uc3QgbmFtZSA9IG9yaWdpbmFsRnVuYyA/IGZ1bmN0aW9uTmFtZShvcmlnaW5hbEZ1bmMpIDogbnVsbDtcbiAgICBleHRlbmQubm9uRW51bShwcm94eSQxLCB7XG4gICAgICAgIGZha2VzOiBbXSxcbiAgICAgICAgaW5zdGFudGlhdGVGYWtlOiBjcmVhdGVTdHViLFxuICAgICAgICBkaXNwbGF5TmFtZTogbmFtZSB8fCBcInN0dWJcIixcbiAgICAgICAgZGVmYXVsdEJlaGF2aW9yOiBudWxsLFxuICAgICAgICBiZWhhdmlvcnM6IFtdLFxuICAgICAgICBpZDogYHN0dWIjJHt1dWlkKyt9YCxcbiAgICB9KTtcblxuICAgIHNpbm9uVHlwZS5zZXQocHJveHkkMSwgXCJzdHViXCIpO1xuXG4gICAgcmV0dXJuIHByb3h5JDE7XG59XG5cbmZ1bmN0aW9uIHN0dWIob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCJzdHViKG9iaiwgJ21ldGgnLCBmbikgaGFzIGJlZW4gcmVtb3ZlZCwgc2VlIGRvY3VtZW50YXRpb25cIixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFc01vZHVsZShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUyBNb2R1bGVzIGNhbm5vdCBiZSBzdHViYmVkXCIpO1xuICAgIH1cblxuICAgIHRocm93T25GYWxzeU9iamVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKGlzTm9uRXhpc3RlbnRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBzdHViIG5vbi1leGlzdGVudCBwcm9wZXJ0eSAke3ZhbHVlVG9TdHJpbmcocHJvcGVydHkpfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsRGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGFzc2VydFZhbGlkUHJvcGVydHlEZXNjcmlwdG9yKGFjdHVhbERlc2NyaXB0b3IsIHByb3BlcnR5KTtcblxuICAgIGNvbnN0IGlzT2JqZWN0T3JGdW5jdGlvbiA9XG4gICAgICAgIHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iamVjdCA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IGlzU3R1YmJpbmdFbnRpcmVPYmplY3QgPVxuICAgICAgICB0eXBlb2YgcHJvcGVydHkgPT09IFwidW5kZWZpbmVkXCIgJiYgaXNPYmplY3RPckZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzQ3JlYXRpbmdOZXdTdHViID0gIW9iamVjdCAmJiB0eXBlb2YgcHJvcGVydHkgPT09IFwidW5kZWZpbmVkXCI7XG4gICAgY29uc3QgaXNTdHViYmluZ05vbkZ1bmNQcm9wZXJ0eSA9XG4gICAgICAgIGlzT2JqZWN0T3JGdW5jdGlvbiAmJlxuICAgICAgICB0eXBlb2YgcHJvcGVydHkgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgKHR5cGVvZiBhY3R1YWxEZXNjcmlwdG9yID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgICB0eXBlb2YgYWN0dWFsRGVzY3JpcHRvci52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKTtcblxuICAgIGlmIChpc1N0dWJiaW5nRW50aXJlT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB3YWxrT2JqZWN0KHN0dWIsIG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3JlYXRpbmdOZXdTdHViKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdHViKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuYyA9XG4gICAgICAgIHR5cGVvZiBhY3R1YWxEZXNjcmlwdG9yLnZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gYWN0dWFsRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHMgPSBjcmVhdGVTdHViKGZ1bmMpO1xuXG4gICAgZXh0ZW5kLm5vbkVudW0ocywge1xuICAgICAgICByb290T2JqOiBvYmplY3QsXG4gICAgICAgIHByb3BOYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgc2hhZG93c1Byb3BPblByb3RvdHlwZTogIWFjdHVhbERlc2NyaXB0b3IuaXNPd24sXG4gICAgICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgICAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbERlc2NyaXB0b3IuaXNPd24pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgYWN0dWFsRGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpc1N0dWJiaW5nTm9uRnVuY1Byb3BlcnR5ID8gcyA6IHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgcyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkUHJvcGVydHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHByb3BlcnR5KSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFwcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdG9yLmlzT3duICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSAmJiAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBkZXNjcmlwdG9yIGZvciBwcm9wZXJ0eSBcXGAke3Byb3BlcnR5fVxcYCBpcyBub24tY29uZmlndXJhYmxlIGFuZCBub24td3JpdGFibGUuIGAgK1xuICAgICAgICAgICAgICAgIGBTaW5vbiBjYW5ub3Qgc3R1YiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGltbXV0YWJsZS4gYCArXG4gICAgICAgICAgICAgICAgYFNlZSBodHRwczovL3Npbm9uanMub3JnL2ZhcSNwcm9wZXJ0eS1kZXNjcmlwdG9yLWVycm9ycyBmb3IgaGVscCBmaXhpbmcgdGhpcyBpc3N1ZS5gLFxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAoKGRlc2NyaXB0b3IuZ2V0IHx8IGRlc2NyaXB0b3Iuc2V0KSAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBEZXNjcmlwdG9yIGZvciBhY2Nlc3NvciBwcm9wZXJ0eSAke3Byb3BlcnR5fSBpcyBub24tY29uZmlndXJhYmxlYCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0YURlc2NyaXB0b3IoZGVzY3JpcHRvcikgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBEZXNjcmlwdG9yIGZvciBkYXRhIHByb3BlcnR5ICR7cHJvcGVydHl9IGlzIG5vbi13cml0YWJsZWAsXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0RhdGFEZXNjcmlwdG9yKGRlc2NyaXB0b3IpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAhZGVzY3JpcHRvci52YWx1ZSAmJlxuICAgICAgICAhZGVzY3JpcHRvci53cml0YWJsZSAmJlxuICAgICAgICAhZGVzY3JpcHRvci5zZXQgJiZcbiAgICAgICAgIWRlc2NyaXB0b3IuZ2V0XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50QmVoYXZpb3VyKHN0dWJJbnN0YW5jZSkge1xuICAgIHJldHVybiBzdHViSW5zdGFuY2UucGFyZW50ICYmIGdldEN1cnJlbnRCZWhhdmlvcihzdHViSW5zdGFuY2UucGFyZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEJlaGF2aW9yKHN0dWJJbnN0YW5jZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIHN0dWJJbnN0YW5jZS5kZWZhdWx0QmVoYXZpb3IgfHxcbiAgICAgICAgZ2V0UGFyZW50QmVoYXZpb3VyKHN0dWJJbnN0YW5jZSkgfHxcbiAgICAgICAgYmVoYXZpb3IuY3JlYXRlKHN0dWJJbnN0YW5jZSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50QmVoYXZpb3Ioc3R1Ykluc3RhbmNlKSB7XG4gICAgY29uc3QgY3VycmVudEJlaGF2aW9yID0gc3R1Ykluc3RhbmNlLmJlaGF2aW9yc1tzdHViSW5zdGFuY2UuY2FsbENvdW50IC0gMV07XG4gICAgcmV0dXJuIGN1cnJlbnRCZWhhdmlvciAmJiBjdXJyZW50QmVoYXZpb3IuaXNQcmVzZW50KClcbiAgICAgICAgPyBjdXJyZW50QmVoYXZpb3JcbiAgICAgICAgOiBnZXREZWZhdWx0QmVoYXZpb3Ioc3R1Ykluc3RhbmNlKTtcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gICAgcmVzZXRCZWhhdmlvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvciA9IG51bGw7XG4gICAgICAgIHRoaXMuYmVoYXZpb3JzID0gW107XG5cbiAgICAgICAgZGVsZXRlIHRoaXMucmV0dXJuVmFsdWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnJldHVybkFyZ0F0O1xuICAgICAgICBkZWxldGUgdGhpcy50aHJvd0FyZ0F0O1xuICAgICAgICBkZWxldGUgdGhpcy5yZXNvbHZlQXJnQXQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmZha2VGbjtcbiAgICAgICAgdGhpcy5yZXR1cm5UaGlzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzb2x2ZVRoaXMgPSBmYWxzZTtcblxuICAgICAgICBmb3JFYWNoKHRoaXMuZmFrZXMsIGZ1bmN0aW9uIChmYWtlKSB7XG4gICAgICAgICAgICBmYWtlLnJlc2V0QmVoYXZpb3IoKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgIHRoaXMucmVzZXRCZWhhdmlvcigpO1xuICAgIH0sXG5cbiAgICBvbkNhbGw6IGZ1bmN0aW9uIG9uQ2FsbChpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuYmVoYXZpb3JzW2luZGV4XSkge1xuICAgICAgICAgICAgdGhpcy5iZWhhdmlvcnNbaW5kZXhdID0gYmVoYXZpb3IuY3JlYXRlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3JzW2luZGV4XTtcbiAgICB9LFxuXG4gICAgb25GaXJzdENhbGw6IGZ1bmN0aW9uIG9uRmlyc3RDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkNhbGwoMCk7XG4gICAgfSxcblxuICAgIG9uU2Vjb25kQ2FsbDogZnVuY3Rpb24gb25TZWNvbmRDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkNhbGwoMSk7XG4gICAgfSxcblxuICAgIG9uVGhpcmRDYWxsOiBmdW5jdGlvbiBvblRoaXJkQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25DYWxsKDIpO1xuICAgIH0sXG5cbiAgICB3aXRoQXJnczogZnVuY3Rpb24gd2l0aEFyZ3MoKSB7XG4gICAgICAgIGNvbnN0IGZha2UgPSBzcHkud2l0aEFyZ3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEJlaGF2aW9yICYmIHRoaXMuZGVmYXVsdEJlaGF2aW9yLnByb21pc2VMaWJyYXJ5KSB7XG4gICAgICAgICAgICBmYWtlLmRlZmF1bHRCZWhhdmlvciA9XG4gICAgICAgICAgICAgICAgZmFrZS5kZWZhdWx0QmVoYXZpb3IgfHwgYmVoYXZpb3IuY3JlYXRlKGZha2UpO1xuICAgICAgICAgICAgZmFrZS5kZWZhdWx0QmVoYXZpb3IucHJvbWlzZUxpYnJhcnkgPVxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJlaGF2aW9yLnByb21pc2VMaWJyYXJ5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH0sXG59O1xuXG5mb3JFYWNoKE9iamVjdC5rZXlzKGJlaGF2aW9yKSwgZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIGlmIChcbiAgICAgICAgaGFzT3duUHJvcGVydHkoYmVoYXZpb3IsIG1ldGhvZCkgJiZcbiAgICAgICAgIWhhc093blByb3BlcnR5KHByb3RvLCBtZXRob2QpICYmXG4gICAgICAgIG1ldGhvZCAhPT0gXCJjcmVhdGVcIiAmJlxuICAgICAgICBtZXRob2QgIT09IFwiaW52b2tlXCJcbiAgICApIHtcbiAgICAgICAgcHJvdG9bbWV0aG9kXSA9IGJlaGF2aW9yLmNyZWF0ZUJlaGF2aW9yKG1ldGhvZCk7XG4gICAgfVxufSk7XG5cbmZvckVhY2goT2JqZWN0LmtleXMoZGVmYXVsdEJlaGF2aW9ycyksIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkoZGVmYXVsdEJlaGF2aW9ycywgbWV0aG9kKSAmJiAhaGFzT3duUHJvcGVydHkocHJvdG8sIG1ldGhvZCkpIHtcbiAgICAgICAgYmVoYXZpb3IuYWRkQmVoYXZpb3Ioc3R1YiwgbWV0aG9kLCBkZWZhdWx0QmVoYXZpb3JzW21ldGhvZF0pO1xuICAgIH1cbn0pO1xuXG5leHRlbmQoc3R1YiwgcHJvdG8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWI7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xudmFyIHNhbXNhbSA9IHJlcXVpcmUoJ0BzaW5vbmpzL3NhbXNhbScpO1xudmFyIHByb3h5SW52b2tlID0gcmVxdWlyZSgnLi9wcm94eS1pbnZva2UuanMnKTtcbnZhciBwcm94eUNhbGwgPSByZXF1aXJlKCcuL3Byb3h5LWNhbGwuanMnKTtcbnZhciB0aW1lc0luV29yZHMgPSByZXF1aXJlKCcuL3V0aWwvY29yZS90aW1lcy1pbi13b3Jkcy5qcycpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2V4dGVuZC5qcycpO1xudmFyIHN0dWIgPSByZXF1aXJlKCcuL3N0dWIuanMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCcuL2Fzc2VydC5qcycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcbnZhciBzYW1zYW1fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KHNhbXNhbSk7XG5cbmNvbnN0IHsgcHJvdG90eXBlczogY29tbW9uc1Byb3RvdHlwZXMsIHZhbHVlVG9TdHJpbmcgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgYXJyYXk6IGFycmF5UHJvdG8gfSA9IGNvbW1vbnNQcm90b3R5cGVzO1xuY29uc3QgeyBjcmVhdGVNYXRjaGVyOiBtYXRjaCwgZGVlcEVxdWFsIH0gPSBzYW1zYW1fX2RlZmF1bHQuZGVmYXVsdDtcblxuY29uc3QgZXZlcnkgPSBhcnJheVByb3RvLmV2ZXJ5O1xuY29uc3QgZm9yRWFjaCA9IGFycmF5UHJvdG8uZm9yRWFjaDtcbmNvbnN0IHB1c2ggPSBhcnJheVByb3RvLnB1c2g7XG5jb25zdCBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbmZ1bmN0aW9uIGNhbGxDb3VudEluV29yZHMoY2FsbENvdW50KSB7XG4gICAgaWYgKGNhbGxDb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJuZXZlciBjYWxsZWRcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYGNhbGxlZCAke3RpbWVzSW5Xb3JkcyhjYWxsQ291bnQpfWA7XG59XG5cbmZ1bmN0aW9uIGV4cGVjdGVkQ2FsbENvdW50SW5Xb3JkcyhleHBlY3RhdGlvbikge1xuICAgIGNvbnN0IG1pbiA9IGV4cGVjdGF0aW9uLm1pbkNhbGxzO1xuICAgIGNvbnN0IG1heCA9IGV4cGVjdGF0aW9uLm1heENhbGxzO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBsZXQgc3RyID0gdGltZXNJbldvcmRzKG1pbik7XG5cbiAgICAgICAgaWYgKG1pbiAhPT0gbWF4KSB7XG4gICAgICAgICAgICBzdHIgPSBgYXQgbGVhc3QgJHtzdHJ9IGFuZCBhdCBtb3N0ICR7dGltZXNJbldvcmRzKG1heCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGBhdCBsZWFzdCAke3RpbWVzSW5Xb3JkcyhtaW4pfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBhdCBtb3N0ICR7dGltZXNJbldvcmRzKG1heCl9YDtcbn1cblxuZnVuY3Rpb24gcmVjZWl2ZWRNaW5DYWxscyhleHBlY3RhdGlvbikge1xuICAgIGNvbnN0IGhhc01pbkxpbWl0ID0gdHlwZW9mIGV4cGVjdGF0aW9uLm1pbkNhbGxzID09PSBcIm51bWJlclwiO1xuICAgIHJldHVybiAhaGFzTWluTGltaXQgfHwgZXhwZWN0YXRpb24uY2FsbENvdW50ID49IGV4cGVjdGF0aW9uLm1pbkNhbGxzO1xufVxuXG5mdW5jdGlvbiByZWNlaXZlZE1heENhbGxzKGV4cGVjdGF0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBleHBlY3RhdGlvbi5tYXhDYWxscyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGF0aW9uLmNhbGxDb3VudCA9PT0gZXhwZWN0YXRpb24ubWF4Q2FsbHM7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeU1hdGNoZXIocG9zc2libGVNYXRjaGVyLCBhcmcpIHtcbiAgICBjb25zdCBpc01hdGNoZXIgPSBtYXRjaC5pc01hdGNoZXIocG9zc2libGVNYXRjaGVyKTtcblxuICAgIHJldHVybiAoaXNNYXRjaGVyICYmIHBvc3NpYmxlTWF0Y2hlci50ZXN0KGFyZykpIHx8IHRydWU7XG59XG5cbmNvbnN0IG1vY2tFeHBlY3RhdGlvbiA9IHtcbiAgICBtaW5DYWxsczogMSxcbiAgICBtYXhDYWxsczogMSxcblxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0YXRpb24gPSBleHRlbmQubm9uRW51bShzdHViKCksIG1vY2tFeHBlY3RhdGlvbik7XG4gICAgICAgIGRlbGV0ZSBleHBlY3RhdGlvbi5jcmVhdGU7XG4gICAgICAgIGV4cGVjdGF0aW9uLm1ldGhvZCA9IG1ldGhvZE5hbWU7XG5cbiAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uO1xuICAgIH0sXG5cbiAgICBpbnZva2U6IGZ1bmN0aW9uIGludm9rZShmdW5jLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlDYWxsQWxsb3dlZCh0aGlzVmFsdWUsIGFyZ3MpO1xuXG4gICAgICAgIHJldHVybiBwcm94eUludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBhdExlYXN0OiBmdW5jdGlvbiBhdExlYXN0KG51bSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJyR7dmFsdWVUb1N0cmluZyhudW0pfScgaXMgbm90IG51bWJlcmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpbWl0c1NldCkge1xuICAgICAgICAgICAgdGhpcy5tYXhDYWxscyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxpbWl0c1NldCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1pbkNhbGxzID0gbnVtO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBhdE1vc3Q6IGZ1bmN0aW9uIGF0TW9zdChudW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCcke3ZhbHVlVG9TdHJpbmcobnVtKX0nIGlzIG5vdCBudW1iZXJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5saW1pdHNTZXQpIHtcbiAgICAgICAgICAgIHRoaXMubWluQ2FsbHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5saW1pdHNTZXQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYXhDYWxscyA9IG51bTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgbmV2ZXI6IGZ1bmN0aW9uIG5ldmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGFjdGx5KDApO1xuICAgIH0sXG5cbiAgICBvbmNlOiBmdW5jdGlvbiBvbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGFjdGx5KDEpO1xuICAgIH0sXG5cbiAgICB0d2ljZTogZnVuY3Rpb24gdHdpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMik7XG4gICAgfSxcblxuICAgIHRocmljZTogZnVuY3Rpb24gdGhyaWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGFjdGx5KDMpO1xuICAgIH0sXG5cbiAgICBleGFjdGx5OiBmdW5jdGlvbiBleGFjdGx5KG51bSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJyR7dmFsdWVUb1N0cmluZyhudW0pfScgaXMgbm90IGEgbnVtYmVyYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0TGVhc3QobnVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXRNb3N0KG51bSk7XG4gICAgfSxcblxuICAgIG1ldDogZnVuY3Rpb24gbWV0KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZmFpbGVkICYmIHJlY2VpdmVkTWluQ2FsbHModGhpcyk7XG4gICAgfSxcblxuICAgIHZlcmlmeUNhbGxBbGxvd2VkOiBmdW5jdGlvbiB2ZXJpZnlDYWxsQWxsb3dlZCh0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRBcmd1bWVudHMgPSB0aGlzLmV4cGVjdGVkQXJndW1lbnRzO1xuXG4gICAgICAgIGlmIChyZWNlaXZlZE1heENhbGxzKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChcbiAgICAgICAgICAgICAgICBgJHt0aGlzLm1ldGhvZH0gYWxyZWFkeSBjYWxsZWQgJHt0aW1lc0luV29yZHModGhpcy5tYXhDYWxscyl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXCJleHBlY3RlZFRoaXNcIiBpbiB0aGlzICYmIHRoaXMuZXhwZWN0ZWRUaGlzICE9PSB0aGlzVmFsdWUpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFxuICAgICAgICAgICAgICAgIGAke3RoaXMubWV0aG9kfSBjYWxsZWQgd2l0aCAke3ZhbHVlVG9TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXNWYWx1ZSxcbiAgICAgICAgICAgICAgICApfSBhcyB0aGlzVmFsdWUsIGV4cGVjdGVkICR7dmFsdWVUb1N0cmluZyh0aGlzLmV4cGVjdGVkVGhpcyl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShcImV4cGVjdGVkQXJndW1lbnRzXCIgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYXJncykge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5tZXRob2R9IHJlY2VpdmVkIG5vIGFyZ3VtZW50cywgZXhwZWN0ZWQgJHt1dGlsLmluc3BlY3QoXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBleHBlY3RlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFxuICAgICAgICAgICAgICAgIGAke3RoaXMubWV0aG9kfSByZWNlaXZlZCB0b28gZmV3IGFyZ3VtZW50cyAoJHt1dGlsLmluc3BlY3QoXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgKX0pLCBleHBlY3RlZCAke3V0aWwuaW5zcGVjdChleHBlY3RlZEFyZ3VtZW50cyl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cGVjdHNFeGFjdEFyZ0NvdW50ICYmXG4gICAgICAgICAgICBhcmdzLmxlbmd0aCAhPT0gZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5tZXRob2R9IHJlY2VpdmVkIHRvbyBtYW55IGFyZ3VtZW50cyAoJHt1dGlsLmluc3BlY3QoXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgKX0pLCBleHBlY3RlZCAke3V0aWwuaW5zcGVjdChleHBlY3RlZEFyZ3VtZW50cyl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgZXhwZWN0ZWRBcmd1bWVudHMsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXhwZWN0ZWRBcmd1bWVudCwgaSkge1xuICAgICAgICAgICAgICAgIGlmICghdmVyaWZ5TWF0Y2hlcihleHBlY3RlZEFyZ3VtZW50LCBhcmdzW2ldKSkgO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYXJnc1tpXSwgZXhwZWN0ZWRBcmd1bWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLm1ldGhvZH0gcmVjZWl2ZWQgd3JvbmcgYXJndW1lbnRzICR7dXRpbC5pbnNwZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICApfSwgZXhwZWN0ZWQgJHt1dGlsLmluc3BlY3QoZXhwZWN0ZWRBcmd1bWVudHMpfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGFsbG93c0NhbGw6IGZ1bmN0aW9uIGFsbG93c0NhbGwodGhpc1ZhbHVlLCBhcmdzKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkQXJndW1lbnRzID0gdGhpcy5leHBlY3RlZEFyZ3VtZW50cztcblxuICAgICAgICBpZiAodGhpcy5tZXQoKSAmJiByZWNlaXZlZE1heENhbGxzKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXCJleHBlY3RlZFRoaXNcIiBpbiB0aGlzICYmIHRoaXMuZXhwZWN0ZWRUaGlzICE9PSB0aGlzVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKFwiZXhwZWN0ZWRBcmd1bWVudHNcIiBpbiB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgY29uc3QgX2FyZ3MgPSBhcmdzIHx8IFtdO1xuXG4gICAgICAgIGlmIChfYXJncy5sZW5ndGggPCBleHBlY3RlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0c0V4YWN0QXJnQ291bnQgJiZcbiAgICAgICAgICAgIF9hcmdzLmxlbmd0aCAhPT0gZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV2ZXJ5KGV4cGVjdGVkQXJndW1lbnRzLCBmdW5jdGlvbiAoZXhwZWN0ZWRBcmd1bWVudCwgaSkge1xuICAgICAgICAgICAgaWYgKCF2ZXJpZnlNYXRjaGVyKGV4cGVjdGVkQXJndW1lbnQsIF9hcmdzW2ldKSkgO1xuXG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChfYXJnc1tpXSwgZXhwZWN0ZWRBcmd1bWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgd2l0aEFyZ3M6IGZ1bmN0aW9uIHdpdGhBcmdzKCkge1xuICAgICAgICB0aGlzLmV4cGVjdGVkQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHdpdGhFeGFjdEFyZ3M6IGZ1bmN0aW9uIHdpdGhFeGFjdEFyZ3MoKSB7XG4gICAgICAgIHRoaXMud2l0aEFyZ3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gb24odGhpc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRUaGlzID0gdGhpc1ZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHNsaWNlKHRoaXMuZXhwZWN0ZWRBcmd1bWVudHMgfHwgW10pO1xuXG4gICAgICAgIGlmICghdGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCkge1xuICAgICAgICAgICAgcHVzaChhcmdzLCBcIlsuLi5dXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsbFN0ciA9IHByb3h5Q2FsbC50b1N0cmluZy5jYWxsKHtcbiAgICAgICAgICAgIHByb3h5OiB0aGlzLm1ldGhvZCB8fCBcImFub255bW91cyBtb2NrIGV4cGVjdGF0aW9uXCIsXG4gICAgICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYCR7Y2FsbFN0ci5yZXBsYWNlKFxuICAgICAgICAgICAgXCIsIFsuLi5cIixcbiAgICAgICAgICAgIFwiWywgLi4uXCIsXG4gICAgICAgICl9ICR7ZXhwZWN0ZWRDYWxsQ291bnRJbldvcmRzKHRoaXMpfWA7XG5cbiAgICAgICAgaWYgKHRoaXMubWV0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBgRXhwZWN0YXRpb24gbWV0OiAke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHttZXNzYWdlfSAoJHtjYWxsQ291bnRJbldvcmRzKHRoaXMuY2FsbENvdW50KX0pYDtcbiAgICB9LFxuXG4gICAgdmVyaWZ5OiBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gICAgICAgIGlmICghdGhpcy5tZXQoKSkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoU3RyaW5nKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5wYXNzKFN0cmluZyh0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgcGFzczogZnVuY3Rpb24gcGFzcyhtZXNzYWdlKSB7XG4gICAgICAgIGFzc2VydC5wYXNzKG1lc3NhZ2UpO1xuICAgIH0sXG5cbiAgICBmYWlsOiBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBleGNlcHRpb24ubmFtZSA9IFwiRXhwZWN0YXRpb25FcnJvclwiO1xuXG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb2NrRXhwZWN0YXRpb247XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBtb2NrRXhwZWN0YXRpb24gPSByZXF1aXJlKCcuL21vY2stZXhwZWN0YXRpb24uanMnKTtcbnZhciBwcm94eUNhbGwgPSByZXF1aXJlKCcuL3Byb3h5LWNhbGwuanMnKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9leHRlbmQuanMnKTtcbnZhciBzYW1zYW0gPSByZXF1aXJlKCdAc2lub25qcy9zYW1zYW0nKTtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvd3JhcC1tZXRob2QuanMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG52YXIgY29tbW9uc19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHQoY29tbW9ucyk7XG52YXIgc2Ftc2FtX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChzYW1zYW0pO1xuXG5jb25zdCB7IHByb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgZGVlcEVxdWFsIH0gPSBzYW1zYW1fX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgY29uY2F0LCBmaWx0ZXIsIGZvckVhY2gsIGV2ZXJ5LCBqb2luLCBwdXNoLCBzbGljZSwgdW5zaGlmdCB9ID1cbiAgICBwcm90b3R5cGVzLmFycmF5O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtb2NrIGZvciBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8c3RyaW5nfSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2NrLCBvciBhIG5hbWUgZm9yIGFuIGFub255bW91cyBtb2NrXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgbW9jayBvYmplY3RcbiAqL1xuZnVuY3Rpb24gbW9jayhvYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBtb2NrRXhwZWN0YXRpb24uY3JlYXRlKG9iamVjdCA/IG9iamVjdCA6IFwiQW5vbnltb3VzIG1vY2tcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vY2suY3JlYXRlKG9iamVjdCk7XG59XG5cbmZ1bmN0aW9uIGVhY2goY29sbGVjdGlvbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb2wgPSBjb2xsZWN0aW9uIHx8IFtdO1xuXG4gICAgZm9yRWFjaChjb2wsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlFcXVhbHMoYXJyMSwgYXJyMiwgY29tcGFyZUxlbmd0aCkge1xuICAgIGlmIChjb21wYXJlTGVuZ3RoICYmIGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZXJ5KGFycjEsIGZ1bmN0aW9uIChlbGVtZW50LCBpKSB7XG4gICAgICAgIHJldHVybiBkZWVwRXF1YWwoYXJyMltpXSwgZWxlbWVudCk7XG4gICAgfSk7XG59XG5cbmV4dGVuZChtb2NrLCB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUob2JqZWN0KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwib2JqZWN0IGlzIG51bGxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2NrT2JqZWN0ID0gZXh0ZW5kLm5vbkVudW0oe30sIG1vY2ssIHsgb2JqZWN0OiBvYmplY3QgfSk7XG4gICAgICAgIGRlbGV0ZSBtb2NrT2JqZWN0LmNyZWF0ZTtcblxuICAgICAgICByZXR1cm4gbW9ja09iamVjdDtcbiAgICB9LFxuXG4gICAgZXhwZWN0czogZnVuY3Rpb24gZXhwZWN0cyhtZXRob2QpIHtcbiAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtZXRob2QgaXMgZmFsc3lcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZXhwZWN0YXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdGF0aW9ucyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgICAgICB0aGlzLmZhaWx1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZXhwZWN0YXRpb25zW21ldGhvZF0pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0YXRpb25zW21ldGhvZF0gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG1vY2tPYmplY3QgPSB0aGlzO1xuXG4gICAgICAgICAgICB3cmFwTWV0aG9kKHRoaXMub2JqZWN0LCBtZXRob2QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9ja09iamVjdC5pbnZva2VNZXRob2QobWV0aG9kLCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHB1c2godGhpcy5wcm94aWVzLCBtZXRob2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwZWN0YXRpb24gPSBtb2NrRXhwZWN0YXRpb24uY3JlYXRlKG1ldGhvZCk7XG4gICAgICAgIGV4cGVjdGF0aW9uLndyYXBwZWRNZXRob2QgPSB0aGlzLm9iamVjdFttZXRob2RdLndyYXBwZWRNZXRob2Q7XG4gICAgICAgIHB1c2godGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSwgZXhwZWN0YXRpb24pO1xuXG4gICAgICAgIHJldHVybiBleHBlY3RhdGlvbjtcbiAgICB9LFxuXG4gICAgcmVzdG9yZTogZnVuY3Rpb24gcmVzdG9yZSgpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3Q7XG5cbiAgICAgICAgZWFjaCh0aGlzLnByb3hpZXMsIGZ1bmN0aW9uIChwcm94eSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJveHldLnJlc3RvcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIG9iamVjdFtwcm94eV0ucmVzdG9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgdmVyaWZ5OiBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGF0aW9ucyA9IHRoaXMuZXhwZWN0YXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZmFpbHVyZXMgPyBzbGljZSh0aGlzLmZhaWx1cmVzKSA6IFtdO1xuICAgICAgICBjb25zdCBtZXQgPSBbXTtcblxuICAgICAgICBlYWNoKHRoaXMucHJveGllcywgZnVuY3Rpb24gKHByb3h5KSB7XG4gICAgICAgICAgICBlYWNoKGV4cGVjdGF0aW9uc1twcm94eV0sIGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICghZXhwZWN0YXRpb24ubWV0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaChtZXNzYWdlcywgU3RyaW5nKGV4cGVjdGF0aW9uKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaChtZXQsIFN0cmluZyhleHBlY3RhdGlvbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcblxuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoam9pbihjb25jYXQobWVzc2FnZXMsIG1ldCksIFwiXFxuXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLnBhc3Moam9pbihjb25jYXQobWVzc2FnZXMsIG1ldCksIFwiXFxuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBpbnZva2VNZXRob2Q6IGZ1bmN0aW9uIGludm9rZU1ldGhvZChtZXRob2QsIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICAvKiBpZiB3ZSBjYW5ub3QgZmluZCBhbnkgbWF0Y2hpbmcgZmlsZXMgd2Ugd2lsbCBleHBsaWNpdGx5IGNhbGwgbW9ja0V4cGVjdGlvbiNmYWlsIHdpdGggZXJyb3IgbWVzc2FnZXMgKi9cbiAgICAgICAgLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIm9mZlwiICovXG4gICAgICAgIGNvbnN0IGV4cGVjdGF0aW9ucyA9XG4gICAgICAgICAgICB0aGlzLmV4cGVjdGF0aW9ucyAmJiB0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdXG4gICAgICAgICAgICAgICAgPyB0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdXG4gICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgY3VycmVudEFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICBsZXQgYXZhaWxhYmxlO1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGF0aW9uc1dpdGhNYXRjaGluZ0FyZ3MgPSBmaWx0ZXIoXG4gICAgICAgICAgICBleHBlY3RhdGlvbnMsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZEFyZ3MgPSBleHBlY3RhdGlvbi5leHBlY3RlZEFyZ3VtZW50cyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRBcmdzLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXJncyxcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0YXRpb24uZXhwZWN0c0V4YWN0QXJnQ291bnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZXhwZWN0YXRpb25zVG9BcHBseSA9IGZpbHRlcihcbiAgICAgICAgICAgIGV4cGVjdGF0aW9uc1dpdGhNYXRjaGluZ0FyZ3MsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAhZXhwZWN0YXRpb24ubWV0KCkgJiZcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0YXRpb24uYWxsb3dzQ2FsbCh0aGlzVmFsdWUsIGFyZ3MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4cGVjdGF0aW9uc1RvQXBwbHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uc1RvQXBwbHlbMF0uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW107XG4gICAgICAgIGxldCBleGhhdXN0ZWQgPSAwO1xuXG4gICAgICAgIGZvckVhY2goZXhwZWN0YXRpb25zV2l0aE1hdGNoaW5nQXJncywgZnVuY3Rpb24gKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhwZWN0YXRpb24uYWxsb3dzQ2FsbCh0aGlzVmFsdWUsIGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gYXZhaWxhYmxlIHx8IGV4cGVjdGF0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGhhdXN0ZWQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZSAmJiBleGhhdXN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGUuYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2goZXhwZWN0YXRpb25zLCBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIHB1c2gobWVzc2FnZXMsIGAgICAgJHtTdHJpbmcoZXhwZWN0YXRpb24pfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICB1bnNoaWZ0KFxuICAgICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgICBgVW5leHBlY3RlZCBjYWxsOiAke3Byb3h5Q2FsbC50b1N0cmluZy5jYWxsKHtcbiAgICAgICAgICAgICAgICBwcm94eTogbWV0aG9kLFxuICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICAgICAgICB9KX1gLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcigpO1xuICAgICAgICBpZiAoIWVyci5zdGFjaykge1xuICAgICAgICAgICAgLy8gUGhhbnRvbUpTIGRvZXMgbm90IHNlcmlhbGl6ZSB0aGUgc3RhY2sgdHJhY2UgdW50aWwgdGhlIGVycm9yIGhhcyBiZWVuIHRocm93blxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLyogZW1wdHkgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXNoKFxuICAgICAgICAgICAgdGhpcy5mYWlsdXJlcyxcbiAgICAgICAgICAgIGBVbmV4cGVjdGVkIGNhbGw6ICR7cHJveHlDYWxsLnRvU3RyaW5nLmNhbGwoe1xuICAgICAgICAgICAgICAgIHByb3h5OiBtZXRob2QsXG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgfSl9YCxcbiAgICAgICAgKTtcblxuICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChqb2luKG1lc3NhZ2VzLCBcIlxcblwiKSk7XG4gICAgfSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vY2s7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3R1YiA9IHJlcXVpcmUoJy4vc3R1Yi5qcycpO1xudmFyIHNpbm9uVHlwZSA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL3Npbm9uLXR5cGUuanMnKTtcbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5cbnZhciBjb21tb25zX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChjb21tb25zKTtcblxuY29uc3QgeyBwcm90b3R5cGVzIH0gPSBjb21tb25zX19kZWZhdWx0LmRlZmF1bHQ7XG5jb25zdCB7IGZvckVhY2ggfSA9IHByb3RvdHlwZXMuYXJyYXk7XG5cbmZ1bmN0aW9uIGlzU3R1Yih2YWx1ZSkge1xuICAgIHJldHVybiBzaW5vblR5cGUuZ2V0KHZhbHVlKSA9PT0gXCJzdHViXCI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0dWIgaW5zdGFuY2Ugb2YgYSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge25ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBvYmplY3R9IGNvbnN0cnVjdG9yIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvdmVycmlkZXNdIE9wdGlvbmFsIG92ZXJyaWRlcyBmb3IgdGhlIHN0dWJiZWQgbWV0aG9kc1xuICogQHJldHVybnMge29iamVjdH0gVGhlIHN0dWJiZWQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3R1Ykluc3RhbmNlKGNvbnN0cnVjdG9yLCBvdmVycmlkZXMpIHtcbiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R1Ykluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZShjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIHNpbm9uVHlwZS5zZXQoc3R1Ykluc3RhbmNlLCBcInN0dWItaW5zdGFuY2VcIik7XG5cbiAgICBjb25zdCBzdHViYmVkT2JqZWN0ID0gc3R1YihzdHViSW5zdGFuY2UpO1xuXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhvdmVycmlkZXMgfHwge30pLCBmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gc3R1YmJlZE9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvdmVycmlkZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmIChpc1N0dWIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc3R1YmJlZE9iamVjdFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0dWJiZWRPYmplY3RbcHJvcGVydHlOYW1lXS5yZXR1cm5zKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IHN0dWIgJHtwcm9wZXJ0eU5hbWV9LiBQcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCFgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdHViYmVkT2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVN0dWJJbnN0YW5jZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb25zID0gcmVxdWlyZSgnQHNpbm9uanMvY29tbW9ucycpO1xudmFyIHByb3h5ID0gcmVxdWlyZSgnLi9wcm94eS5qcycpO1xudmFyIG5leHRUaWNrID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvbmV4dC10aWNrLmpzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IHByb3RvdHlwZXMgfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdDtcbmNvbnN0IHsgc2xpY2UgfSA9IHByb3RvdHlwZXMuYXJyYXk7XG5cbi8qKlxuICogQGNhbGxiYWNrIFNpbm9uRnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gYXJnc1xuICogQHJldHVybnMge3Vua25vd259XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgYGZha2VgIHRoYXQgcmVjb3JkcyBhbGwgY2FsbHMsIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcy5cbiAqXG4gKiBXaGVuIGFuIGBmYCBhcmd1bWVudCBpcyBzdXBwbGllZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQuXG4gKlxuICogQHBhcmFtIHtTaW5vbkZ1bmN0aW9ufHVuZGVmaW5lZH0gW2ZdXG4gKiBAcmV0dXJucyB7U2lub25GdW5jdGlvbn1cbiAqIEBuYW1lc3BhY2VcbiAqL1xuZnVuY3Rpb24gZmFrZShmKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGYgYXJndW1lbnQgdG8gYmUgYSBGdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcEZ1bmMoZik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBmYWtlYCB0aGF0IHJldHVybnMgdGhlIHByb3ZpZGVkIGB2YWx1ZWAsIGFzIHdlbGwgYXMgcmVjb3JkaW5nIGFsbFxuICogY2FsbHMsIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcy5cbiAqXG4gKiBAbWVtYmVyb2YgZmFrZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge1Npbm9uRnVuY3Rpb259XG4gKi9cbmZha2UucmV0dXJucyA9IGZ1bmN0aW9uIHJldHVybnModmFsdWUpIHtcbiAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGZha2VgIHRoYXQgdGhyb3dzIGFuIEVycm9yLlxuICpcbiAqIEBtZW1iZXJvZiBmYWtlXG4gKiBAcGFyYW0ge3Vua25vd258RXJyb3J9IHZhbHVlXG4gKiBAcmV0dXJucyB7U2lub25GdW5jdGlvbn1cbiAqL1xuZmFrZS50aHJvd3MgPSBmdW5jdGlvbiB0aHJvd3ModmFsdWUpIHtcbiAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICB0aHJvdyBnZXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGZha2VgIHRoYXQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcGFzc2VkIGB2YWx1ZWBcbiAqXG4gKiBAbWVtYmVyb2YgZmFrZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge1Npbm9uRnVuY3Rpb259XG4gKi9cbmZha2UucmVzb2x2ZXMgPSBmdW5jdGlvbiByZXNvbHZlcyh2YWx1ZSkge1xuICAgIGZ1bmN0aW9uIGYoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwRnVuYyhmKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBmYWtlYCB0aGF0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB0byB0aGUgcGFzc2VkIGB2YWx1ZWBcbiAqXG4gKiBAbWVtYmVyb2YgZmFrZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge1Npbm9uRnVuY3Rpb259XG4gKi9cbmZha2UucmVqZWN0cyA9IGZ1bmN0aW9uIHJlamVjdHModmFsdWUpIHtcbiAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZ2V0RXJyb3IodmFsdWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcEZ1bmMoZik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBgZmFrZWAgdGhhdCBjYWxscyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgZGVmaW5lZCBhcmd1bWVudHMuXG4gKlxuICogQG1lbWJlcm9mIGZha2VcbiAqIEByZXR1cm5zIHtTaW5vbkZ1bmN0aW9ufVxuICovXG5mYWtlLnlpZWxkcyA9IGZ1bmN0aW9uIHlpZWxkcygpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgZnVuY3Rpb24gZigpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBsYXN0IGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCB2YWx1ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwRnVuYyhmKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGBmYWtlYCB0aGF0IGNhbGxzIHRoZSBjYWxsYmFjayAqKmFzeW5jaHJvbm91c2x5Kiogd2l0aCB0aGVcbiAqIGRlZmluZWQgYXJndW1lbnRzLlxuICpcbiAqIEBtZW1iZXJvZiBmYWtlXG4gKiBAcmV0dXJucyB7U2lub25GdW5jdGlvbn1cbiAqL1xuZmFrZS55aWVsZHNBc3luYyA9IGZ1bmN0aW9uIHlpZWxkc0FzeW5jKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHNsaWNlKGFyZ3VtZW50cyk7XG5cbiAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGxhc3QgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCB2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcEZ1bmMoZik7XG59O1xuXG5sZXQgdXVpZCA9IDA7XG4vKipcbiAqIENyZWF0ZXMgYSBwcm94eSAoc2lub24gY29uY2VwdCkgZnJvbSB0aGUgcGFzc2VkIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtTaW5vbkZ1bmN0aW9ufSBmXG4gKiBAcmV0dXJucyB7U2lub25GdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gd3JhcEZ1bmMoZikge1xuICAgIGNvbnN0IGZha2VJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGZpcnN0QXJnLCBsYXN0QXJnO1xuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmlyc3RBcmcgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICBsYXN0QXJnID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID1cbiAgICAgICAgICAgIGxhc3RBcmcgJiYgdHlwZW9mIGxhc3RBcmcgPT09IFwiZnVuY3Rpb25cIiA/IGxhc3RBcmcgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbiAgICAgICAgcHJveHkkMS5maXJzdEFyZyA9IGZpcnN0QXJnO1xuICAgICAgICBwcm94eSQxLmxhc3RBcmcgPSBsYXN0QXJnO1xuICAgICAgICBwcm94eSQxLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgICAgcmV0dXJuIGYgJiYgZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgY29uc3QgcHJveHkkMSA9IHByb3h5KGZha2VJbnN0YW5jZSwgZiB8fCBmYWtlSW5zdGFuY2UpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5JDEsIFwibmFtZVwiLCB7XG4gICAgICAgIHZhbHVlOiBcImZha2VcIixcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcHJveHkkMS5kaXNwbGF5TmFtZSA9IFwiZmFrZVwiO1xuICAgIHByb3h5JDEuaWQgPSBgZmFrZSMke3V1aWQrK31gO1xuXG4gICAgcmV0dXJuIHByb3h5JDE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBFcnJvciBpbnN0YW5jZSBmcm9tIHRoZSBwYXNzZWQgdmFsdWUsIGlmIHRoZSB2YWx1ZSBpcyBub3RcbiAqIGFscmVhZHkgYW4gRXJyb3IgaW5zdGFuY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge3Vua25vd259IHZhbHVlIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm5zIHtFcnJvcn0gICAgICAgW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRFcnJvcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yID8gdmFsdWUgOiBuZXcgRXJyb3IodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZha2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBzYW1zYW0gPSByZXF1aXJlKCdAc2lub25qcy9zYW1zYW0nKTtcbnZhciBjb2xsZWN0T3duTWV0aG9kcyA9IHJlcXVpcmUoJy4vY29sbGVjdC1vd24tbWV0aG9kcy5qcycpO1xudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnLi9hc3NlcnQuanMnKTtcbnZhciBmYWtlVGltZXJzID0gcmVxdWlyZSgnLi91dGlsL2Zha2UtdGltZXJzLmpzJyk7XG52YXIgbW9jayA9IHJlcXVpcmUoJy4vbW9jay5qcycpO1xudmFyIHNweSA9IHJlcXVpcmUoJy4vc3B5LmpzJyk7XG52YXIgc3R1YiA9IHJlcXVpcmUoJy4vc3R1Yi5qcycpO1xudmFyIGNyZWF0ZVN0dWJJbnN0YW5jZSA9IHJlcXVpcmUoJy4vY3JlYXRlLXN0dWItaW5zdGFuY2UuanMnKTtcbnZhciBmYWtlID0gcmVxdWlyZSgnLi9mYWtlLmpzJyk7XG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnLi91dGlsL2NvcmUvZXh0ZW5kLmpzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xudmFyIHNhbXNhbV9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHQoc2Ftc2FtKTtcblxuY29uc3QgeyBhcnJheTogYXJyYXlQcm90byB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0LnByb3RvdHlwZXM7XG5jb25zdCB7IGRlcHJlY2F0ZWQ6IGxvZ2dlciwgdmFsdWVUb1N0cmluZyB9ID0gY29tbW9uc19fZGVmYXVsdC5kZWZhdWx0O1xuY29uc3QgeyBjcmVhdGVNYXRjaGVyOiBtYXRjaCB9ID0gc2Ftc2FtX19kZWZhdWx0LmRlZmF1bHQ7XG5cbmNvbnN0IERFRkFVTFRfTEVBS19USFJFU0hPTEQgPSAxMDAwMDtcblxuY29uc3QgZmlsdGVyID0gYXJyYXlQcm90by5maWx0ZXI7XG5cbi8qKlxuICogQGNhbGxiYWNrIFJlc3RvcmVyRnVuY3Rpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xuY29uc3QgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcbmNvbnN0IHJldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7XG5cbmZ1bmN0aW9uIGFwcGx5T25FYWNoKGZha2VzLCBtZXRob2QpIHtcbiAgICBjb25zdCBtYXRjaGluZ0Zha2VzID0gZmlsdGVyKGZha2VzLCBmdW5jdGlvbiAoZmFrZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGZha2VbbWV0aG9kXSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIH0pO1xuXG4gICAgZm9yRWFjaChtYXRjaGluZ0Zha2VzLCBmdW5jdGlvbiAoZmFrZSkge1xuICAgICAgICBmYWtlW21ldGhvZF0oKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkFjY2Vzc29ycyhkZXNjcmlwdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBzYW5kYm94LnJlcGxhY2VHZXR0ZXIgZm9yIHJlcGxhY2luZyBnZXR0ZXJzXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5zZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2Ugc2FuZGJveC5yZXBsYWNlU2V0dGVyIGZvciByZXBsYWNpbmcgc2V0dGVyc1wiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVNhbWVUeXBlKG9iamVjdCwgcHJvcGVydHksIHJlcGxhY2VtZW50KSB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBvYmplY3RbcHJvcGVydHldO1xuICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IHR5cGVvZiBvcmlnaW5hbDtcbiAgICBjb25zdCByZXBsYWNlbWVudFR5cGUgPSB0eXBlb2YgcmVwbGFjZW1lbnQ7XG5cbiAgICBpZiAob3JpZ2luYWxUeXBlICE9PSByZXBsYWNlbWVudFR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVwbGFjZSAke29yaWdpbmFsVHlwZX0gd2l0aCAke3JlcGxhY2VtZW50VHlwZX1gLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JWYWxpZEFyZ3VtZW50cyhkZXNjcmlwdG9yLCBwcm9wZXJ0eSwgcmVwbGFjZW1lbnQpIHtcbiAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVwbGFjZSBub24tZXhpc3RlbnQgcHJvcGVydHkgJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgKX0uIFBlcmhhcHMgeW91IG1lYW50IHNhbmRib3guZGVmaW5lKCk/YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlcGxhY2VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCByZXBsYWNlbWVudCBhcmd1bWVudCB0byBiZSBkZWZpbmVkXCIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2FuZGJveC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIE9wdGlvbnMgZm9yIHRoZSBzYW5kYm94XG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgc2FuZGJveCBvYmplY3RcbiAqIEBjbGFzc1xuICovXG5mdW5jdGlvbiBTYW5kYm94KG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHNhbmRib3ggPSB0aGlzO1xuICAgIGNvbnN0IGFzc2VydE9wdGlvbnMgPSBvcHRzLmFzc2VydE9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmFrZVJlc3RvcmVycyA9IFtdO1xuXG4gICAgbGV0IGNvbGxlY3Rpb24gPSBbXTtcbiAgICBsZXQgbG9nZ2VkTGVha1dhcm5pbmcgPSBmYWxzZTtcbiAgICBzYW5kYm94LmxlYWtUaHJlc2hvbGQgPSBERUZBVUxUX0xFQUtfVEhSRVNIT0xEO1xuXG4gICAgZnVuY3Rpb24gYWRkVG9Db2xsZWN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIG9iamVjdCkgPiBzYW5kYm94LmxlYWtUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICFsb2dnZWRMZWFrV2FybmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGxvZ2dlci5wcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICAgYFNpbm9uIHNhbmRib3g6IFRoZSBudW1iZXIgb2YgZmFrZXMgaW4gdGhlIHNhbmRib3ggaGFzIGV4Y2VlZGVkIHRoZSBsZWFrIHRocmVzaG9sZCBvZiAke3NhbmRib3gubGVha1RocmVzaG9sZH0uIGAgK1xuICAgICAgICAgICAgICAgICAgICBcIlRvIGF2b2lkIG1lbW9yeSBsZWFrcywgZW5zdXJlIHlvdSBhcmUgcmVzdG9yaW5nIHRoZSBzYW5kYm94IGFmdGVyIGVhY2ggdGVzdC4gXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIlRvIGRpc2FibGUgdGhpcyB3YXJuaW5nLCBtb2RpZnkgdGhlIGxlYWtUaHJlc2hvbGQgcHJvcGVydHkgb2YgeW91ciBzYW5kYm94LlwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlZExlYWtXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNhbmRib3guYXNzZXJ0ID0gYXNzZXJ0LmNyZWF0ZUFzc2VydE9iamVjdChhc3NlcnRPcHRpb25zKTtcblxuICAgIC8vIHRoaXMgaXMgZm9yIHRlc3Rpbmcgb25seVxuICAgIHNhbmRib3guZ2V0RmFrZXMgPSBmdW5jdGlvbiBnZXRGYWtlcygpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfTtcblxuICAgIHNhbmRib3guY3JlYXRlU3R1Ykluc3RhbmNlID0gZnVuY3Rpb24gY3JlYXRlU3R1Ykluc3RhbmNlJDEoKSB7XG4gICAgICAgIGNvbnN0IHN0dWJiZWQgPSBjcmVhdGVTdHViSW5zdGFuY2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3Qgb3duTWV0aG9kcyA9IGNvbGxlY3RPd25NZXRob2RzKHN0dWJiZWQpO1xuXG4gICAgICAgIGZvckVhY2gob3duTWV0aG9kcywgZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICAgICAgYWRkVG9Db2xsZWN0aW9uKG1ldGhvZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzdHViYmVkO1xuICAgIH07XG5cbiAgICBzYW5kYm94LmluamVjdCA9IGZ1bmN0aW9uIGluamVjdChvYmopIHtcbiAgICAgICAgb2JqLnNweSA9IGZ1bmN0aW9uIHNweSgpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LnNweS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5zdHViID0gZnVuY3Rpb24gc3R1YigpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LnN0dWIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmoubW9jayA9IGZ1bmN0aW9uIG1vY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5tb2NrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLmNyZWF0ZVN0dWJJbnN0YW5jZSA9IGZ1bmN0aW9uIGNyZWF0ZVN0dWJJbnN0YW5jZVdyYXBwZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5jcmVhdGVTdHViSW5zdGFuY2UuYXBwbHkoc2FuZGJveCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmouZmFrZSA9IGZ1bmN0aW9uIGZha2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5mYWtlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LmRlZmluZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LnJlcGxhY2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmoucmVwbGFjZVNldHRlciA9IGZ1bmN0aW9uIHJlcGxhY2VTZXR0ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5yZXBsYWNlU2V0dGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLnJlcGxhY2VHZXR0ZXIgPSBmdW5jdGlvbiByZXBsYWNlR2V0dGVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3gucmVwbGFjZUdldHRlci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzYW5kYm94LmNsb2NrKSB7XG4gICAgICAgICAgICBvYmouY2xvY2sgPSBzYW5kYm94LmNsb2NrO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqLm1hdGNoID0gbWF0Y2g7XG5cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY29tbW9uUG9zdEluaXRTZXR1cChcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3B5LFxuICAgICAgICBpc1N0dWIsXG4gICAgICAgIHNob3VsZEFkZFRvQ29sbGVjdGlvbiA9IHRydWUsXG4gICAgKSB7XG4gICAgICAgIGlmIChpc1N0dWIgJiYgYXJncy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcInN0dWIob2JqLCAnbWV0aCcsIGZuKSBoYXMgYmVlbiByZW1vdmVkLCBzZWUgZG9jdW1lbnRhdGlvblwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG91bGRBZGRUb0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIGFkZFRvQ29sbGVjdGlvbihzcHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNweTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRSZXR1cm5lZE1ldGhvZHNUb0NvbGxlY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc3VsdCAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGZvckVhY2goY29sbGVjdE93bk1ldGhvZHMocmVzdWx0KSwgYWRkVG9Db2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNhbmRib3guc3B5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjcmVhdGVkU3B5ID0gc3B5LmFwcGx5KHNweSwgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tbW9uUG9zdEluaXRTZXR1cChcbiAgICAgICAgICAgIGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGNyZWF0ZWRTcHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICEoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSxcbiAgICAgICAgKTtcbiAgICAgICAgYWRkUmV0dXJuZWRNZXRob2RzVG9Db2xsZWN0aW9uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2FuZGJveC5zcHksIFwibmFtZVwiLCB7XG4gICAgICAgIHZhbHVlOiBcInNweVwiLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNhbmRib3guc3B5LCBcImxlbmd0aFwiLCB7XG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgZXh0ZW5kKHNhbmRib3guc3B5LCBzcHkpO1xuXG4gICAgc2FuZGJveC5zdHViID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjcmVhdGVkU3R1YiA9IHN0dWIuYXBwbHkoc3R1YiwgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tbW9uUG9zdEluaXRTZXR1cChcbiAgICAgICAgICAgIGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGNyZWF0ZWRTdHViLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICEoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSxcbiAgICAgICAgKTtcbiAgICAgICAgYWRkUmV0dXJuZWRNZXRob2RzVG9Db2xsZWN0aW9uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2FuZGJveC5zdHViLCBcIm5hbWVcIiwge1xuICAgICAgICB2YWx1ZTogXCJzdHViXCIsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2FuZGJveC5zdHViLCBcImxlbmd0aFwiLCB7XG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgZXh0ZW5kKHNhbmRib3guc3R1Yiwgc3R1Yik7XG5cbiAgICBzYW5kYm94Lm1vY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG0gPSBtb2NrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgYWRkVG9Db2xsZWN0aW9uKG0pO1xuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNhbmRib3gubW9jaywgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IFwibW9ja1wiLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNhbmRib3gubW9jaywgXCJsZW5ndGhcIiwge1xuICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIGV4dGVuZChzYW5kYm94Lm1vY2ssIG1vY2spO1xuXG4gICAgc2FuZGJveC5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgICBhcHBseU9uRWFjaChjb2xsZWN0aW9uLCBcInJlc2V0XCIpO1xuICAgICAgICBhcHBseU9uRWFjaChjb2xsZWN0aW9uLCBcInJlc2V0SGlzdG9yeVwiKTtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5yZXNldEJlaGF2aW9yID0gZnVuY3Rpb24gcmVzZXRCZWhhdmlvcigpIHtcbiAgICAgICAgYXBwbHlPbkVhY2goY29sbGVjdGlvbiwgXCJyZXNldEJlaGF2aW9yXCIpO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlc2V0SGlzdG9yeSA9IGZ1bmN0aW9uIHJlc2V0SGlzdG9yeSgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gY29sbGVjdGlvbltpXTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IGYucmVzZXRIaXN0b3J5IHx8IGYucmVzZXQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwoZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2FuZGJveC52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gICAgICAgIGFwcGx5T25FYWNoKGNvbGxlY3Rpb24sIFwidmVyaWZ5XCIpO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnZlcmlmeUFuZFJlc3RvcmUgPSBmdW5jdGlvbiB2ZXJpZnlBbmRSZXN0b3JlKCkge1xuICAgICAgICBsZXQgZXhjZXB0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzYW5kYm94LnZlcmlmeSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleGNlcHRpb24gPSBlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FuZGJveC5yZXN0b3JlKCk7XG5cbiAgICAgICAgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJzYW5kYm94LnJlc3RvcmUoKSBkb2VzIG5vdCB0YWtlIGFueSBwYXJhbWV0ZXJzLiBQZXJoYXBzIHlvdSBtZWFudCBzdHViLnJlc3RvcmUoKVwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldmVyc2UoZmFrZVJlc3RvcmVycyk7XG4gICAgICAgIGZvckVhY2goZmFrZVJlc3RvcmVycywgZnVuY3Rpb24gKHJlc3RvcmVyKSB7XG4gICAgICAgICAgICByZXN0b3JlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZmFrZVJlc3RvcmVycy5sZW5ndGggPSAwO1xuXG4gICAgICAgIHJldmVyc2UoY29sbGVjdGlvbik7XG4gICAgICAgIGFwcGx5T25FYWNoKGNvbGxlY3Rpb24sIFwicmVzdG9yZVwiKTtcbiAgICAgICAgY29sbGVjdGlvbiA9IFtdO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlc3RvcmVDb250ZXh0ID0gZnVuY3Rpb24gcmVzdG9yZUNvbnRleHQoKSB7XG4gICAgICAgIGZvckVhY2goc2FuZGJveC5pbmplY3RlZEtleXMsIGZ1bmN0aW9uIChpbmplY3RlZEtleSkge1xuICAgICAgICAgICAgZGVsZXRlIHNhbmRib3guaW5qZWN0SW50b1tpbmplY3RlZEtleV07XG4gICAgICAgIH0pO1xuICAgICAgICBzYW5kYm94LmluamVjdGVkS2V5cy5sZW5ndGggPSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVzdG9yZXIgZnVuY3Rpb24gZm9yIHRoZSBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZUFzc2lnbm1lbnRdIGlmIHRydWUsIHVzZXMgYXNzaWdubWVudCBpbnN0ZWFkIG9mIERlZmluZVByb3BlcnR5XG4gICAgICogQHJldHVybnMge1Jlc3RvcmVyRnVuY3Rpb259IHJlc3RvcmVyIGZ1bmN0aW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0RmFrZVJlc3RvcmVyKG9iamVjdCwgcHJvcGVydHksIGZvcmNlQXNzaWdubWVudCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9yY2VBc3NpZ25tZW50ICYmIG9iamVjdFtwcm9wZXJ0eV07XG5cbiAgICAgICAgZnVuY3Rpb24gcmVzdG9yZXIoKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2VBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yPy5pc093bikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN0b3Jlci5zaW5vbiA9IHRydWU7XG4gICAgICAgIHJlc3RvcmVyLm9iamVjdCA9IG9iamVjdDtcbiAgICAgICAgcmVzdG9yZXIucHJvcGVydHkgPSBwcm9wZXJ0eTtcblxuICAgICAgICByZXR1cm4gcmVzdG9yZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmVyaWZ5Tm90UmVwbGFjZWQob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgICAgICBmb3JFYWNoKGZha2VSZXN0b3JlcnMsIGZ1bmN0aW9uIChmYWtlUmVzdG9yZXIpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmYWtlUmVzdG9yZXIub2JqZWN0ID09PSBvYmplY3QgJiZcbiAgICAgICAgICAgICAgICBmYWtlUmVzdG9yZXIucHJvcGVydHkgPT09IHByb3BlcnR5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQXR0ZW1wdGVkIHRvIHJlcGxhY2UgJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICl9IHdoaWNoIGlzIGFscmVhZHkgcmVwbGFjZWRgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNhbmRib3gucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2Uob2JqZWN0LCBwcm9wZXJ0eSwgcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBjaGVja0ZvclZhbGlkQXJndW1lbnRzKGRlc2NyaXB0b3IsIHByb3BlcnR5LCByZXBsYWNlbWVudCk7XG4gICAgICAgIHZlcmlmeU5vdFJlcGxhY2VkKG9iamVjdCwgcHJvcGVydHkpO1xuICAgICAgICB0aHJvd09uQWNjZXNzb3JzKGRlc2NyaXB0b3IpO1xuXG4gICAgICAgIHZlcmlmeVNhbWVUeXBlKG9iamVjdCwgcHJvcGVydHksIHJlcGxhY2VtZW50KTtcblxuICAgICAgICAvLyBzdG9yZSBhIGZ1bmN0aW9uIGZvciByZXN0b3JpbmcgdGhlIHJlcGxhY2VkIHByb3BlcnR5XG4gICAgICAgIHB1c2goZmFrZVJlc3RvcmVycywgZ2V0RmFrZVJlc3RvcmVyKG9iamVjdCwgcHJvcGVydHkpKTtcblxuICAgICAgICBvYmplY3RbcHJvcGVydHldID0gcmVwbGFjZW1lbnQ7XG5cbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlcGxhY2UudXNpbmdBY2Nlc3NvciA9IGZ1bmN0aW9uIHJlcGxhY2VVc2luZ0FjY2Vzc29yKFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICByZXBsYWNlbWVudCxcbiAgICApIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBjaGVja0ZvclZhbGlkQXJndW1lbnRzKGRlc2NyaXB0b3IsIHByb3BlcnR5LCByZXBsYWNlbWVudCk7XG4gICAgICAgIHZlcmlmeU5vdFJlcGxhY2VkKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIHZlcmlmeVNhbWVUeXBlKG9iamVjdCwgcHJvcGVydHksIHJlcGxhY2VtZW50KTtcblxuICAgICAgICAvLyBzdG9yZSBhIGZ1bmN0aW9uIGZvciByZXN0b3JpbmcgdGhlIHJlcGxhY2VkIHByb3BlcnR5XG4gICAgICAgIHB1c2goZmFrZVJlc3RvcmVycywgZ2V0RmFrZVJlc3RvcmVyKG9iamVjdCwgcHJvcGVydHksIHRydWUpKTtcblxuICAgICAgICBvYmplY3RbcHJvcGVydHldID0gcmVwbGFjZW1lbnQ7XG5cbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH07XG5cbiAgICBzYW5kYm94LmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBkZWZpbmUgdGhlIGFscmVhZHkgZXhpc3RpbmcgcHJvcGVydHkgJHt2YWx1ZVRvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICApfS4gUGVyaGFwcyB5b3UgbWVhbnQgc2FuZGJveC5yZXBsYWNlKCk/YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmlzT3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgZGVmaW5lIHRoZSBhbHJlYWR5IGV4aXN0aW5nIHByb3BlcnR5ICR7dmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgKX0uIFBlcmhhcHMgeW91IG1lYW50IHNhbmRib3gucmVwbGFjZSgpP2AsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RvcmUgYSBmdW5jdGlvbiBmb3IgcmVzdG9yaW5nIHRoZSBkZWZpbmVkIHByb3BlcnR5XG4gICAgICAgIHB1c2goZmFrZVJlc3RvcmVycywgZ2V0RmFrZVJlc3RvcmVyKG9iamVjdCwgcHJvcGVydHkpKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVwbGFjZVNldHRlciA9IGZ1bmN0aW9uIHJlcGxhY2VTZXR0ZXIoXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHksXG4gICAgICAgIHJlcGxhY2VtZW50LFxuICAgICkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IHJlcGxhY2Ugbm9uLWV4aXN0ZW50IHByb3BlcnR5ICR7dmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIkV4cGVjdGVkIHJlcGxhY2VtZW50IGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb25cIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJpZnlOb3RSZXBsYWNlZChvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBvYmplY3QucHJvcGVydHlgIGlzIG5vdCBhIHNldHRlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYERlc2NyaXB0b3IgZm9yIHByb3BlcnR5ICR7dmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgKX0gaXMgbm90IGNvbmZpZ3VyYWJsZWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RvcmUgYSBmdW5jdGlvbiBmb3IgcmVzdG9yaW5nIHRoZSByZXBsYWNlZCBwcm9wZXJ0eVxuICAgICAgICBwdXNoKGZha2VSZXN0b3JlcnMsIGdldEZha2VSZXN0b3JlcihvYmplY3QsIHByb3BlcnR5KSk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFjY2Vzc29yLXBhaXJzXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG4gICAgICAgICAgICBzZXQ6IHJlcGxhY2VtZW50LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVwbGFjZUdldHRlciA9IGZ1bmN0aW9uIHJlcGxhY2VHZXR0ZXIoXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHksXG4gICAgICAgIHJlcGxhY2VtZW50LFxuICAgICkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IHJlcGxhY2Ugbm9uLWV4aXN0ZW50IHByb3BlcnR5ICR7dmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIkV4cGVjdGVkIHJlcGxhY2VtZW50IGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb25cIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJpZnlOb3RSZXBsYWNlZChvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBvYmplY3QucHJvcGVydHlgIGlzIG5vdCBhIGdldHRlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYERlc2NyaXB0b3IgZm9yIHByb3BlcnR5ICR7dmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgKX0gaXMgbm90IGNvbmZpZ3VyYWJsZWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RvcmUgYSBmdW5jdGlvbiBmb3IgcHJvcGVydHkgZm9yIHJlc3RvcmluZyB0aGUgcmVwbGFjZWQgcHJvcGVydHlcbiAgICAgICAgcHVzaChmYWtlUmVzdG9yZXJzLCBnZXRGYWtlUmVzdG9yZXIob2JqZWN0LCBwcm9wZXJ0eSkpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG4gICAgICAgICAgICBnZXQ6IHJlcGxhY2VtZW50LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIHNhbmRib3gudXNlRmFrZVRpbWVycyA9IGZ1bmN0aW9uIHVzZUZha2VUaW1lcnMoYXJncykge1xuICAgICAgICBjb25zdCBjbG9jayA9IGZha2VUaW1lcnMudXNlRmFrZVRpbWVycy5jYWxsKG51bGwsIGFyZ3MpO1xuXG4gICAgICAgIHNhbmRib3guY2xvY2sgPSBjbG9jaztcbiAgICAgICAgYWRkVG9Db2xsZWN0aW9uKGNsb2NrKTtcblxuICAgICAgICByZXR1cm4gY2xvY2s7XG4gICAgfTtcblxuICAgIHNhbmRib3guZmFrZSA9IGZ1bmN0aW9uIGZha2UkMSgpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZha2UgPSBmYWtlLmFwcGx5KGZha2UsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1vblBvc3RJbml0U2V0dXAoYXJndW1lbnRzLCBjcmVhdGVkRmFrZSwgZmFsc2UpO1xuICAgICAgICBhZGRUb0NvbGxlY3Rpb24ocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzYW5kYm94LmZha2UsIFwibmFtZVwiLCB7XG4gICAgICAgIHZhbHVlOiBcImZha2VcIixcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzYW5kYm94LmZha2UsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBleHRlbmQoc2FuZGJveC5mYWtlLCBmYWtlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2FuZGJveC5mYWtlLCBcIm5hbWVcIiwge1xuICAgICAgICB2YWx1ZTogXCJmYWtlXCIsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2FuZGJveC5mYWtlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgIHZhbHVlOiAxLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhZGRGYWtlQmVoYXZpb3JUb0NvbGxlY3Rpb24obWV0aG9kKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gc2FuZGJveC5mYWtlW21ldGhvZF07XG5cbiAgICAgICAgc2FuZGJveC5mYWtlW21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbC5hcHBseShmYWtlLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgYWRkVG9Db2xsZWN0aW9uKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZEZha2VCZWhhdmlvclRvQ29sbGVjdGlvbihcInJldHVybnNcIik7XG4gICAgYWRkRmFrZUJlaGF2aW9yVG9Db2xsZWN0aW9uKFwidGhyb3dzXCIpO1xuICAgIGFkZEZha2VCZWhhdmlvclRvQ29sbGVjdGlvbihcInJlc29sdmVzXCIpO1xuICAgIGFkZEZha2VCZWhhdmlvclRvQ29sbGVjdGlvbihcInJlamVjdHNcIik7XG4gICAgYWRkRmFrZUJlaGF2aW9yVG9Db2xsZWN0aW9uKFwieWllbGRzXCIpO1xuICAgIGFkZEZha2VCZWhhdmlvclRvQ29sbGVjdGlvbihcInlpZWxkc0FzeW5jXCIpO1xufVxuXG5TYW5kYm94LnByb3RvdHlwZS5tYXRjaCA9IG1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNhbmRib3g7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9ucyA9IHJlcXVpcmUoJ0BzaW5vbmpzL2NvbW1vbnMnKTtcbnZhciBzYW5kYm94ID0gcmVxdWlyZSgnLi9zYW5kYm94LmpzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cblxudmFyIGNvbW1vbnNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0KGNvbW1vbnMpO1xuXG5jb25zdCB7IGZvckVhY2gsIHB1c2ggfSA9IGNvbW1vbnNfX2RlZmF1bHQuZGVmYXVsdC5wcm90b3R5cGVzLmFycmF5O1xuXG5mdW5jdGlvbiBwcmVwYXJlU2FuZGJveEZyb21Db25maWcoY29uZmlnKSB7XG4gICAgY29uc3Qgc2FuZGJveCQxID0gbmV3IHNhbmRib3goeyBhc3NlcnRPcHRpb25zOiBjb25maWcuYXNzZXJ0T3B0aW9ucyB9KTtcblxuICAgIGlmIChjb25maWcudXNlRmFrZVRpbWVycykge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy51c2VGYWtlVGltZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBzYW5kYm94JDEudXNlRmFrZVRpbWVycyhjb25maWcudXNlRmFrZVRpbWVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzYW5kYm94JDEudXNlRmFrZVRpbWVycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbmRib3gkMTtcbn1cblxuZnVuY3Rpb24gZXhwb3NlVmFsdWUoc2FuZGJveCwgY29uZmlnLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5pbmplY3RJbnRvICYmICEoa2V5IGluIGNvbmZpZy5pbmplY3RJbnRvKSkge1xuICAgICAgICBjb25maWcuaW5qZWN0SW50b1trZXldID0gdmFsdWU7XG4gICAgICAgIHB1c2goc2FuZGJveC5pbmplY3RlZEtleXMsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaChzYW5kYm94LmFyZ3MsIHZhbHVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyB0byBjdXN0b21pemUgYSBzYW5kYm94XG4gKlxuICogVGhlIHNhbmRib3gncyBtZXRob2RzIGNhbiBiZSBpbmplY3RlZCBpbnRvIGFub3RoZXIgb2JqZWN0IGZvclxuICogY29udmVuaWVuY2UuIFRoZSBgaW5qZWN0SW50b2AgY29uZmlndXJhdGlvbiBvcHRpb24gY2FuIG5hbWUgYW5cbiAqIG9iamVjdCB0byBhZGQgcHJvcGVydGllcyB0by5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTYW5kYm94Q29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBBUEkgdG8gZXhwb3NlIG9uIHRoZSBzYW5kYm94LiBFeGFtcGxlczogWydzcHknLCAnZmFrZScsICdyZXN0b3JlJ11cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBpbmplY3RJbnRvIGFuIG9iamVjdCBpbiB3aGljaCB0byBpbmplY3QgcHJvcGVydGllcyBmcm9tIHRoZSBzYW5kYm94IChhIGZhY2FkZSkuIFRoaXMgaXMgbW9zdGx5IGFuIGludGVncmF0aW9uIGZlYXR1cmUgKHNpbm9uLXRlc3QgYmVpbmcgb25lKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlRmFrZVRpbWVycyAgd2hldGhlciB0aW1lcnMgYXJlIGZha2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbYXNzZXJ0T3B0aW9uc10gc2VlIENyZWF0ZUFzc2VydE9wdGlvbnMgaW4gLi9hc3NlcnRcbiAqXG4gKiBUaGlzIHR5cGUgZGVmIGlzIHJlYWxseSBzdWZmZXJpbmcgZnJvbSBKU0RvYyBub3QgaGF2aW5nIHN0YW5kYXJkaXplZFxuICogaG93IHRvIHJlZmVyZW5jZSB0eXBlcyBkZWZpbmVkIGluIG90aGVyIG1vZHVsZXMgOihcbiAqL1xuXG4vKipcbiAqIEEgY29uZmlndXJlZCBzaW5vbiBzYW5kYm94IChwcml2YXRlIHR5cGUpXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29uZmlndXJlZFNpbm9uU2FuZGJveFR5cGVcbiAqIEBwcml2YXRlXG4gKiBAYXVnbWVudHMgU2FuZGJveFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gaW5qZWN0ZWRLZXlzIHRoZSBrZXlzIHRoYXQgaGF2ZSBiZWVuIGluamVjdGVkIChmcm9tIGNvbmZpZy5pbmplY3RJbnRvKVxuICogQHByb3BlcnR5IHsqW119IGFyZ3MgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHNhbmRib3hcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIHNhbmRib3hcbiAqXG4gKiBBcyBvZiBTaW5vbiA1IHRoZSBgc2lub25gIGluc3RhbmNlIGl0c2VsZiBpcyBhIFNhbmRib3gsIHNvIHlvdVxuICogaGFyZGx5IGV2ZXIgbmVlZCB0byBjcmVhdGUgYWRkaXRpb25hbCBpbnN0YW5jZXMgZm9yIHRoZSBzYWtlIG9mIHRlc3RpbmdcbiAqXG4gKiBAcGFyYW0gY29uZmlnIHtTYW5kYm94Q29uZmlnfVxuICogQHJldHVybnMge1NhbmRib3h9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNhbmRib3goY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzYW5kYm94KCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlndXJlZFNhbmRib3ggPSBwcmVwYXJlU2FuZGJveEZyb21Db25maWcoY29uZmlnKTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5hcmdzID0gY29uZmlndXJlZFNhbmRib3guYXJncyB8fCBbXTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5pbmplY3RlZEtleXMgPSBbXTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5pbmplY3RJbnRvID0gY29uZmlnLmluamVjdEludG87XG4gICAgY29uc3QgZXhwb3NlZCA9IGNvbmZpZ3VyZWRTYW5kYm94LmluamVjdCh7fSk7XG5cbiAgICBpZiAoY29uZmlnLnByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yRWFjaChjb25maWcucHJvcGVydGllcywgZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICAgICAgICBleHBvc2VkW3Byb3BdIHx8IChwcm9wID09PSBcInNhbmRib3hcIiAmJiBjb25maWd1cmVkU2FuZGJveCk7XG4gICAgICAgICAgICBleHBvc2VWYWx1ZShjb25maWd1cmVkU2FuZGJveCwgY29uZmlnLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cG9zZVZhbHVlKGNvbmZpZ3VyZWRTYW5kYm94LCBjb25maWcsIFwic2FuZGJveFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlndXJlZFNhbmRib3g7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2FuZGJveDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyByZXN0b3JhYmxlIChpLmUuIGhhcyBhIFNpbm9uIHJlc3RvcmUgbWV0aG9kKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHJlc3RvcmFibGVcbiAqL1xuZnVuY3Rpb24gaXNSZXN0b3JhYmxlKG9iaikge1xuICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnJlc3RvcmUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICBvYmoucmVzdG9yZS5zaW5vblxuICAgICk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNSZXN0b3JhYmxlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZha2UgPSByZXF1aXJlKCcuL2Zha2UuanMnKTtcbnZhciBpc1Jlc3RvcmFibGUgPSByZXF1aXJlKCcuL3V0aWwvY29yZS9pcy1yZXN0b3JhYmxlLmpzJyk7XG5cbmNvbnN0IFNUQVRVU19QRU5ESU5HID0gXCJwZW5kaW5nXCI7XG5jb25zdCBTVEFUVVNfUkVTT0xWRUQgPSBcInJlc29sdmVkXCI7XG5jb25zdCBTVEFUVVNfUkVKRUNURUQgPSBcInJlamVjdGVkXCI7XG5cbi8qKlxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IHVua25vd24pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogdW5rbm93bikgPT4gdm9pZH0gcmVqZWN0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBmYWtlIGZvciBhIGdpdmVuIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZC4gSWYgbm8gZnVuY3Rpb24gaXMgZ2l2ZW4sIGFcbiAqIG5ldyBmYWtlIGlzIHJldHVybmVkLiBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYWxyZWFkeSBhIGZha2UsIGl0IGlzXG4gKiByZXR1cm5lZCBhcyBpcy4gT3RoZXJ3aXNlIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyB3cmFwcGVkIGluIGEgbmV3IGZha2UuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlRXhlY3V0b3J9IFtleGVjdXRvcl0gVGhlIG9wdGlvbmFsIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnMge1Byb21pc2VFeGVjdXRvcn1cbiAqL1xuZnVuY3Rpb24gZ2V0RmFrZUV4ZWN1dG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKGlzUmVzdG9yYWJsZShleGVjdXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yO1xuICAgIH1cbiAgICBpZiAoZXhlY3V0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZha2UoZXhlY3V0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gZmFrZSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgcHJvbWlzZSB0aGF0IGV4cG9zZXMgaXQncyBpbnRlcm5hbCBgc3RhdHVzYCwgYHJlc29sdmVkVmFsdWVgXG4gKiBhbmQgYHJlamVjdGVkVmFsdWVgIGFuZCBjYW4gYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgZnJvbSB0aGUgb3V0c2lkZSBieVxuICogY2FsbGluZyBgcmVzb2x2ZSh2YWx1ZSlgIG9yIGByZWplY3QocmVhc29uKWAuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlRXhlY3V0b3J9IFtleGVjdXRvcl0gVGhlIG9wdGlvbmFsIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIHByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBjb25zdCBmYWtlRXhlY3V0b3IgPSBnZXRGYWtlRXhlY3V0b3IoZXhlY3V0b3IpO1xuICAgIGNvbnN0IHNpbm9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZha2VFeGVjdXRvcik7XG5cbiAgICBzaW5vblByb21pc2Uuc3RhdHVzID0gU1RBVFVTX1BFTkRJTkc7XG4gICAgc2lub25Qcm9taXNlXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgc2lub25Qcm9taXNlLnN0YXR1cyA9IFNUQVRVU19SRVNPTFZFRDtcbiAgICAgICAgICAgIHNpbm9uUHJvbWlzZS5yZXNvbHZlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBzaW5vblByb21pc2Uuc3RhdHVzID0gU1RBVFVTX1JFSkVDVEVEO1xuICAgICAgICAgICAgc2lub25Qcm9taXNlLnJlamVjdGVkVmFsdWUgPSByZWFzb247XG4gICAgICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgb3IgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgYW5kIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1c1xuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAgICAgKiBAcGFyYW0geyh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5hbGl6ZShzdGF0dXMsIHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoc2lub25Qcm9taXNlLnN0YXR1cyAhPT0gU1RBVFVTX1BFTkRJTkcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvbWlzZSBhbHJlYWR5ICR7c2lub25Qcm9taXNlLnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNpbm9uUHJvbWlzZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGNhbGxiYWNrKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzaW5vblByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBmaW5hbGl6ZShTVEFUVVNfUkVTT0xWRUQsIHZhbHVlLCBmYWtlRXhlY3V0b3IuZmlyc3RDYWxsLmFyZ3NbMF0pO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHByb21pc2Ugc28gdGhhdCBjYWxsZXJzIGNhbiBhd2FpdCBpdDpcbiAgICAgICAgcmV0dXJuIHNpbm9uUHJvbWlzZTtcbiAgICB9O1xuICAgIHNpbm9uUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGZpbmFsaXplKFNUQVRVU19SRUpFQ1RFRCwgcmVhc29uLCBmYWtlRXhlY3V0b3IuZmlyc3RDYWxsLmFyZ3NbMV0pO1xuICAgICAgICAvLyBSZXR1cm4gYSBuZXcgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNpbm9uIHByb21pc2Ugd2FzXG4gICAgICAgIC8vIHJlamVjdGVkLCBzbyB0aGF0IGNhbGxlcnMgY2FuIGF3YWl0IGl0OlxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHNpbm9uUHJvbWlzZS5jYXRjaCgoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNpbm9uUHJvbWlzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcm9taXNlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHdhbGtPYmplY3QgPSByZXF1aXJlKCcuL3V0aWwvY29yZS93YWxrLW9iamVjdC5qcycpO1xuXG5mdW5jdGlvbiBmaWx0ZXIob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiBvYmplY3RbcHJvcGVydHldLnJlc3RvcmUgJiYgb2JqZWN0W3Byb3BlcnR5XS5yZXN0b3JlLnNpbm9uO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBvYmplY3RbcHJvcGVydHldLnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZU9iamVjdChvYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVHJ5aW5nIHRvIHJlc3RvcmUgb2JqZWN0IGJ1dCByZWNlaXZlZCAke1N0cmluZyhvYmplY3QpfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdhbGtPYmplY3QocmVzdG9yZSwgb2JqZWN0LCBmaWx0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc3RvcmVPYmplY3Q7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmVoYXZpb3IgPSByZXF1aXJlKCcuL3Npbm9uL2JlaGF2aW9yLmpzJyk7XG52YXIgY3JlYXRlU2FuZGJveCA9IHJlcXVpcmUoJy4vc2lub24vY3JlYXRlLXNhbmRib3guanMnKTtcbnZhciBjcmVhdGVTdHViSW5zdGFuY2UgPSByZXF1aXJlKCcuL3Npbm9uL2NyZWF0ZS1zdHViLWluc3RhbmNlLmpzJyk7XG52YXIgY29sbGVjdE93bk1ldGhvZHMgPSByZXF1aXJlKCcuL3Npbm9uL2NvbGxlY3Qtb3duLW1ldGhvZHMuanMnKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCcuL3Npbm9uL3V0aWwvY29yZS9leHRlbmQuanMnKTtcbnZhciBmYWtlVGltZXJzID0gcmVxdWlyZSgnLi9zaW5vbi91dGlsL2Zha2UtdGltZXJzLmpzJyk7XG52YXIgc2FuZGJveCA9IHJlcXVpcmUoJy4vc2lub24vc2FuZGJveC5qcycpO1xudmFyIHN0dWIgPSByZXF1aXJlKCcuL3Npbm9uL3N0dWIuanMnKTtcbnZhciBwcm9taXNlID0gcmVxdWlyZSgnLi9zaW5vbi9wcm9taXNlLmpzJyk7XG52YXIgc2Ftc2FtID0gcmVxdWlyZSgnQHNpbm9uanMvc2Ftc2FtJyk7XG52YXIgcmVzdG9yZU9iamVjdCA9IHJlcXVpcmUoJy4vc2lub24vcmVzdG9yZS1vYmplY3QuanMnKTtcbnZhciBtb2NrRXhwZWN0YXRpb24gPSByZXF1aXJlKCcuL3Npbm9uL21vY2stZXhwZWN0YXRpb24uanMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuXG52YXIgc2Ftc2FtX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdChzYW1zYW0pO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIFNpbm9uIEFQSS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgU2lub24gQVBJIG9iamVjdFxuICovXG5mdW5jdGlvbiBjcmVhdGVBcGkoKSB7XG4gICAgY29uc3Qgc2FuZGJveCQxID0gbmV3IHNhbmRib3goKTtcblxuICAgIGNvbnN0IGFwaU1ldGhvZHMgPSB7XG4gICAgICAgIC8vIGBjcmVhdGVTYW5kYm94YCByZXR1cm5zIGFuIGlzb2xhdGVkIHNhbmRib3g6IGl0cyBmYWtlcyBhcmUgdHJhY2tlZFxuICAgICAgICAvLyBvbiBpdHMgb3duIGNvbGxlY3Rpb24gc28gY29uc3VtZXJzIGNhbiByZWx5IG9uIGBzdWJTYW5kYm94LnJlc3RvcmUoKWBcbiAgICAgICAgLy8gKGFuZCBvbmx5IHRoYXQpIGZvciBjbGVhbnVwLiBEb24ndCBwdXNoIGl0IGludG8gdGhlIGdsb2JhbCBzYW5kYm94J3NcbiAgICAgICAgLy8gY29sbGVjdGlvbiBcdTIwMTQgZG9pbmcgc28gY2F1c2VkIGBzaW5vbi5yZXN0b3JlKClgIHRvIGNhc2NhZGUtcmVzdG9yZVxuICAgICAgICAvLyBzdWItc2FuZGJveGVzIChyZWdyZXNzaW9uIGluIDIxLjEuMCwgc2VlICMyNzAxKS5cbiAgICAgICAgY3JlYXRlU2FuZGJveDogY3JlYXRlU2FuZGJveCxcbiAgICAgICAgbWF0Y2g6IHNhbXNhbV9fZGVmYXVsdC5kZWZhdWx0LmNyZWF0ZU1hdGNoZXIsXG4gICAgICAgIHJlc3RvcmVPYmplY3Q6IHJlc3RvcmVPYmplY3QsXG4gICAgICAgIGV4cGVjdGF0aW9uOiBtb2NrRXhwZWN0YXRpb24sXG4gICAgICAgIHRpbWVyczogZmFrZVRpbWVycy50aW1lcnMsXG4gICAgICAgIGNyZWF0ZVN0dWJJbnN0YW5jZTogZnVuY3Rpb24gY3JlYXRlU3R1Ykluc3RhbmNlJDEoKSB7XG4gICAgICAgICAgICBjb25zdCBzdHViYmVkID0gY3JlYXRlU3R1Ykluc3RhbmNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGNvbGxlY3RPd25NZXRob2RzKHN0dWJiZWQpKSB7XG4gICAgICAgICAgICAgICAgc2FuZGJveCQxLmdldEZha2VzKCkucHVzaChtZXRob2QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc3R1YmJlZDtcbiAgICAgICAgfSxcblxuICAgICAgICBhZGRCZWhhdmlvcjogZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgICAgICAgICBiZWhhdmlvci5hZGRCZWhhdmlvcihzdHViLCBuYW1lLCBmbik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcHJvbWlzZTogcHJvbWlzZSxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwaU1ldGhvZHMuY3JlYXRlU2FuZGJveCwgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IFwiY3JlYXRlU2FuZGJveFwiLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwaU1ldGhvZHMuY3JlYXRlU2FuZGJveCwgXCJsZW5ndGhcIiwge1xuICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwaU1ldGhvZHMuY3JlYXRlU3R1Ykluc3RhbmNlLCBcIm5hbWVcIiwge1xuICAgICAgICB2YWx1ZTogXCJjcmVhdGVTdHViSW5zdGFuY2VcIixcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcGlNZXRob2RzLmNyZWF0ZVN0dWJJbnN0YW5jZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV4dGVuZChzYW5kYm94JDEsIGFwaU1ldGhvZHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFwaTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVTaW5vbkFwaSA9IHJlcXVpcmUoJy4vY3JlYXRlLXNpbm9uLWFwaS5qcycpO1xuXG5jb25zdCBzaW5vbiA9IGNyZWF0ZVNpbm9uQXBpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2lub247XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQUFBO0FBQUEsZ0RBQUFBLFVBQUFDLFNBQUE7QUFBQTtBQU1BLFFBQUk7QUFHSixRQUFJLE9BQU8sV0FBVyxhQUFhO0FBRS9CLHFCQUFlO0FBQUEsSUFDbkIsV0FBVyxPQUFPLFdBQVcsYUFBYTtBQUV0QyxxQkFBZTtBQUFBLElBQ25CLE9BQU87QUFFSCxxQkFBZTtBQUFBLElBQ25CO0FBRUEsSUFBQUEsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDcEJqQjtBQUFBLG9FQUFBQyxVQUFBQyxTQUFBO0FBQUE7QUFVQSxRQUFJO0FBQ0osUUFBSTtBQUNBLFlBQU0sU0FBUyxDQUFDO0FBRWhCLGFBQU87QUFDUCxzQkFBZ0I7QUFBQSxJQUNwQixTQUFTLEdBQUc7QUFJUixzQkFBZ0I7QUFBQSxJQUNwQjtBQUVBLElBQUFBLFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ3ZCakI7QUFBQSwyRUFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBRUEsUUFBSSxPQUFPLFNBQVM7QUFDcEIsUUFBSSxnQkFBZ0I7QUFFcEIsUUFBSSx1QkFBdUI7QUFBQTtBQUFBLE1BRXZCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUtBLFFBQUksZUFBZTtBQUNmLDJCQUFxQixLQUFLLFdBQVc7QUFBQSxJQUN6QztBQUVBLElBQUFBLFFBQU8sVUFBVSxTQUFTLHFCQUFxQixXQUFXO0FBRXRELGFBQU8sT0FBTyxvQkFBb0IsU0FBUyxFQUFFO0FBQUEsUUFBTyxTQUNoRCxRQUNBLE1BQ0Y7QUFDRSxjQUFJLHFCQUFxQixTQUFTLElBQUksR0FBRztBQUNyQyxtQkFBTztBQUFBLFVBQ1g7QUFFQSxjQUFJLE9BQU8s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LFFBQVE7QUFBQSxRQUMvQjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFFBQ2IsUUFBUSxXQUFXO0FBQUEsUUFDbkIsb0JBQW9CLFNBQVMsdUJBQXVCO0FBQ2hELGdCQUFNLFVBQVUsbUJBQW1CLE1BQU0sTUFBTSxTQUFTO0FBRXhELHFCQUFXLFVBQVUsa0JBQWtCLE9BQU8sR0FBRztBQUM3QyxzQkFBVSxTQUFTLEVBQUUsS0FBSyxNQUFNO0FBQUEsVUFDcEM7QUFFQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUVBLGFBQWEsU0FBVSxNQUFNLElBQUk7QUFDN0IsbUJBQVMsWUFBWSxNQUFNLE1BQU0sRUFBRTtBQUFBLFFBQ3ZDO0FBQUEsUUFFQTtBQUFBLE1BQ0o7QUFFQSxhQUFPLGVBQWUsV0FBVyxlQUFlLFFBQVE7QUFBQSxRQUNwRCxPQUFPO0FBQUEsUUFDUCxjQUFjO0FBQUEsTUFDbEIsQ0FBQztBQUNELGFBQU8sZUFBZSxXQUFXLGVBQWUsVUFBVTtBQUFBLFFBQ3RELE9BQU87QUFBQSxRQUNQLGNBQWM7QUFBQSxNQUNsQixDQUFDO0FBRUQsYUFBTyxlQUFlLFdBQVcsb0JBQW9CLFFBQVE7QUFBQSxRQUN6RCxPQUFPO0FBQUEsUUFDUCxjQUFjO0FBQUEsTUFDbEIsQ0FBQztBQUNELGFBQU8sZUFBZSxXQUFXLG9CQUFvQixVQUFVO0FBQUEsUUFDM0QsT0FBTztBQUFBLFFBQ1AsY0FBYztBQUFBLE1BQ2xCLENBQUM7QUFFRCxhQUFPLE9BQU8sV0FBVyxVQUFVO0FBQUEsSUFDdkM7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUMxRWpCLElBQUksaUJBQWlCO0FBRXJCLElBQU0sUUFBUSxlQUFlO0FBRTdCLE9BQU8sVUFBVTsiLAogICJuYW1lcyI6IFsiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAicHJvY2VzcyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJiZWhhdmlvciIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJpc05hTiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJpc05hTiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX3R5cGVfZGV0ZWN0IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImdsb2JhbCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJpc05hTiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX2lzX2l0ZXJhYmxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlcXVpcmVfc2hhbXMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiaXNOYU4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiY29uY2F0dHkiLCAic2xpY3kiLCAiRW1wdHkiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAidW5kZWZpbmVkIiwgImRvRXZhbCIsICJzdHJpbmdUb1BhdGgiLCAiZ2V0QmFzZUludHJpbnNpYyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJyZXF1aXJlX2lzX2FyZ3VtZW50cyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJmb3JFYWNoQXJyYXkiLCAiZm9yRWFjaFN0cmluZyIsICJmb3JFYWNoT2JqZWN0IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImhhc1Byb3BlcnR5RGVzY3JpcHRvcnMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZGVmaW5lIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwgIngiLCAic2VsZiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJhc3NlcnQiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAidGltZXJzIiwgInNldFRpbWVvdXQiLCAiY2xlYXJUaW1lb3V0IiwgInNldEludGVydmFsIiwgImNsZWFySW50ZXJ2YWwiLCAiZXhwb3J0cyIsICJjbG9jayIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInNlbGYiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJ2YWx1ZSIsICJleHBvcnRzIiwgInJlcXVpcmVfc3RyaW5nIiwgImV4cG9ydHMiLCAic2VnbWVudCIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJrZXkiLCAicmVxdWlyZV9hcnJheSIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAiaSIsICJlcnIiLCAiZXhwb3J0cyIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAiZXhwb3J0cyIsICJleHBvcnRzIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIndyYXBwZWRNZXRob2QiLCAiZXJyb3IiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZmFrZSIsICJzcHkiLCAic3R1YiIsICJtb2NrIiwgImRlZmluZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJzYW5kYm94IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIl0KfQo=