Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_000042
T

7253 lines
703 KiB
Plaintext

import { noop, makeDestructurable, camelize, toValue, isClient, isObject, tryOnScopeDispose, isIOS, tryOnMounted, objectOmit, promiseTimeout, until, increaseWithUnit, objectEntries, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, notNullish, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, createFilterWrapper, bypassFilter, toRefs, useIntervalFn, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, clamp, syncRef, objectPick, tryOnUnmounted, watchWithFilter, tryOnBeforeUnmount, identity, isDef, isWorker } from "/_nuxt/node_modules/@vueuse/shared/index.mjs?v=e4f18c29";
export * from "/_nuxt/node_modules/@vueuse/shared/index.mjs?v=e4f18c29";
import { isRef, ref, shallowRef, watchEffect, computed, inject, isVue3, version, defineComponent, h, TransitionGroup, shallowReactive, Fragment, watch, getCurrentInstance, customRef, onUpdated, onMounted, isVue2, readonly, nextTick, reactive, markRaw, unref, getCurrentScope, set, del, isReadonly, onBeforeUpdate } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function computedAsync(evaluationCallback, initialState, optionsOrRef) {
let options;
if (isRef(optionsOrRef)) {
options = {
evaluating: optionsOrRef
};
} else {
options = optionsOrRef || {};
}
const {
lazy = false,
evaluating = void 0,
shallow = true,
onError = noop
} = options;
const started = ref(!lazy);
const current = shallow ? shallowRef(initialState) : ref(initialState);
let counter = 0;
watchEffect(async (onInvalidate) => {
if (!started.value)
return;
counter++;
const counterAtBeginning = counter;
let hasFinished = false;
if (evaluating) {
Promise.resolve().then(() => {
evaluating.value = true;
});
}
try {
const result = await evaluationCallback((cancelCallback) => {
onInvalidate(() => {
if (evaluating)
evaluating.value = false;
if (!hasFinished)
cancelCallback();
});
});
if (counterAtBeginning === counter)
current.value = result;
} catch (e) {
onError(e);
} finally {
if (evaluating && counterAtBeginning === counter)
evaluating.value = false;
hasFinished = true;
}
});
if (lazy) {
return computed(() => {
started.value = true;
return current.value;
});
} else {
return current;
}
}
function computedInject(key, options, defaultSource, treatDefaultAsFactory) {
let source = inject(key);
if (defaultSource)
source = inject(key, defaultSource);
if (treatDefaultAsFactory)
source = inject(key, defaultSource, treatDefaultAsFactory);
if (typeof options === "function") {
return computed((ctx) => options(source, ctx));
} else {
return computed({
get: (ctx) => options.get(source, ctx),
set: options.set
});
}
}
function createReusableTemplate(options = {}) {
if (!isVue3 && !version.startsWith("2.7.")) {
if (true)
throw new Error("[VueUse] createReusableTemplate only works in Vue 2.7 or above.");
return;
}
const {
inheritAttrs = true
} = options;
const render = shallowRef();
const define = /* @__PURE__ */ defineComponent({
setup(_, { slots }) {
return () => {
render.value = slots.default;
};
}
});
const reuse = /* @__PURE__ */ defineComponent({
inheritAttrs,
setup(_, { attrs, slots }) {
return () => {
var _a;
if (!render.value && true)
throw new Error("[VueUse] Failed to find the definition of reusable template");
const vnode = (_a = render.value) == null ? void 0 : _a.call(render, { ...keysToCamelKebabCase(attrs), $slots: slots });
return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;
};
}
});
return makeDestructurable(
{ define, reuse },
[define, reuse]
);
}
function keysToCamelKebabCase(obj) {
const newObj = {};
for (const key in obj)
newObj[camelize(key)] = obj[key];
return newObj;
}
function createTemplatePromise(options = {}) {
if (!isVue3) {
if (true)
throw new Error("[VueUse] createTemplatePromise only works in Vue 3 or above.");
return;
}
let index = 0;
const instances = ref([]);
function create(...args) {
const props = shallowReactive({
key: index++,
args,
promise: void 0,
resolve: () => {
},
reject: () => {
},
isResolving: false,
options
});
instances.value.push(props);
props.promise = new Promise((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true;
return _resolve(v);
};
props.reject = _reject;
}).finally(() => {
props.promise = void 0;
const index2 = instances.value.indexOf(props);
if (index2 !== -1)
instances.value.splice(index2, 1);
});
return props.promise;
}
function start(...args) {
if (options.singleton && instances.value.length > 0)
return instances.value[0].promise;
return create(...args);
}
const component = /* @__PURE__ */ defineComponent((_, { slots }) => {
const renderList = () => instances.value.map((props) => {
var _a;
return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));
});
if (options.transition)
return () => h(TransitionGroup, options.transition, renderList);
return renderList;
});
component.start = start;
return component;
}
function createUnrefFn(fn) {
return function(...args) {
return fn.apply(this, args.map((i) => toValue(i)));
};
}
function unrefElement(elRef) {
var _a;
const plain = toValue(elRef);
return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
}
const defaultWindow = isClient ? window : void 0;
const defaultDocument = isClient ? window.document : void 0;
const defaultNavigator = isClient ? window.navigator : void 0;
const defaultLocation = isClient ? window.location : void 0;
function useEventListener(...args) {
let target;
let events2;
let listeners;
let options;
if (typeof args[0] === "string" || Array.isArray(args[0])) {
[events2, listeners, options] = args;
target = defaultWindow;
} else {
[target, events2, listeners, options] = args;
}
if (!target)
return noop;
if (!Array.isArray(events2))
events2 = [events2];
if (!Array.isArray(listeners))
listeners = [listeners];
const cleanups = [];
const cleanup = () => {
cleanups.forEach((fn) => fn());
cleanups.length = 0;
};
const register = (el, event, listener, options2) => {
el.addEventListener(event, listener, options2);
return () => el.removeEventListener(event, listener, options2);
};
const stopWatch = watch(
() => [unrefElement(target), toValue(options)],
([el, options2]) => {
cleanup();
if (!el)
return;
const optionsClone = isObject(options2) ? { ...options2 } : options2;
cleanups.push(
...events2.flatMap((event) => {
return listeners.map((listener) => register(el, event, listener, optionsClone));
})
);
},
{ immediate: true, flush: "post" }
);
const stop = () => {
stopWatch();
cleanup();
};
tryOnScopeDispose(stop);
return stop;
}
let _iOSWorkaround = false;
function onClickOutside(target, handler, options = {}) {
const { window: window2 = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;
if (!window2)
return noop;
if (isIOS && !_iOSWorkaround) {
_iOSWorkaround = true;
Array.from(window2.document.body.children).forEach((el) => el.addEventListener("click", noop));
window2.document.documentElement.addEventListener("click", noop);
}
let shouldListen = true;
const shouldIgnore = (event) => {
return ignore.some((target2) => {
if (typeof target2 === "string") {
return Array.from(window2.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));
} else {
const el = unrefElement(target2);
return el && (event.target === el || event.composedPath().includes(el));
}
});
};
const listener = (event) => {
const el = unrefElement(target);
if (!el || el === event.target || event.composedPath().includes(el))
return;
if (event.detail === 0)
shouldListen = !shouldIgnore(event);
if (!shouldListen) {
shouldListen = true;
return;
}
handler(event);
};
const cleanup = [
useEventListener(window2, "click", listener, { passive: true, capture }),
useEventListener(window2, "pointerdown", (e) => {
const el = unrefElement(target);
shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));
}, { passive: true }),
detectIframe && useEventListener(window2, "blur", (event) => {
setTimeout(() => {
var _a;
const el = unrefElement(target);
if (((_a = window2.document.activeElement) == null ? void 0 : _a.tagName) === "IFRAME" && !(el == null ? void 0 : el.contains(window2.document.activeElement)))
handler(event);
}, 0);
})
].filter(Boolean);
const stop = () => cleanup.forEach((fn) => fn());
return stop;
}
function createKeyPredicate(keyFilter) {
if (typeof keyFilter === "function")
return keyFilter;
else if (typeof keyFilter === "string")
return (event) => event.key === keyFilter;
else if (Array.isArray(keyFilter))
return (event) => keyFilter.includes(event.key);
return () => true;
}
function onKeyStroke(...args) {
let key;
let handler;
let options = {};
if (args.length === 3) {
key = args[0];
handler = args[1];
options = args[2];
} else if (args.length === 2) {
if (typeof args[1] === "object") {
key = true;
handler = args[0];
options = args[1];
} else {
key = args[0];
handler = args[1];
}
} else {
key = true;
handler = args[0];
}
const {
target = defaultWindow,
eventName = "keydown",
passive = false,
dedupe = false
} = options;
const predicate = createKeyPredicate(key);
const listener = (e) => {
if (e.repeat && toValue(dedupe))
return;
if (predicate(e))
handler(e);
};
return useEventListener(target, eventName, listener, passive);
}
function onKeyDown(key, handler, options = {}) {
return onKeyStroke(key, handler, { ...options, eventName: "keydown" });
}
function onKeyPressed(key, handler, options = {}) {
return onKeyStroke(key, handler, { ...options, eventName: "keypress" });
}
function onKeyUp(key, handler, options = {}) {
return onKeyStroke(key, handler, { ...options, eventName: "keyup" });
}
const DEFAULT_DELAY = 500;
const DEFAULT_THRESHOLD = 10;
function onLongPress(target, handler, options) {
var _a, _b;
const elementRef = computed(() => unrefElement(target));
let timeout;
let posStart;
function clear() {
if (timeout) {
clearTimeout(timeout);
timeout = void 0;
}
posStart = void 0;
}
function onDown(ev) {
var _a2, _b2, _c, _d;
if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)
return;
clear();
if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)
ev.preventDefault();
if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)
ev.stopPropagation();
posStart = {
x: ev.x,
y: ev.y
};
timeout = setTimeout(
() => handler(ev),
(_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY
);
}
function onMove(ev) {
var _a2, _b2, _c, _d;
if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)
return;
if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)
return;
if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)
ev.preventDefault();
if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)
ev.stopPropagation();
const dx = ev.x - posStart.x;
const dy = ev.y - posStart.y;
const distance = Math.sqrt(dx * dx + dy * dy);
if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))
clear();
}
const listenerOptions = {
capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,
once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once
};
const cleanup = [
useEventListener(elementRef, "pointerdown", onDown, listenerOptions),
useEventListener(elementRef, "pointermove", onMove, listenerOptions),
useEventListener(elementRef, ["pointerup", "pointerleave"], clear, listenerOptions)
];
const stop = () => cleanup.forEach((fn) => fn());
return stop;
}
function isFocusedElementEditable() {
const { activeElement, body } = document;
if (!activeElement)
return false;
if (activeElement === body)
return false;
switch (activeElement.tagName) {
case "INPUT":
case "TEXTAREA":
return true;
}
return activeElement.hasAttribute("contenteditable");
}
function isTypedCharValid({
keyCode,
metaKey,
ctrlKey,
altKey
}) {
if (metaKey || ctrlKey || altKey)
return false;
if (keyCode >= 48 && keyCode <= 57)
return true;
if (keyCode >= 65 && keyCode <= 90)
return true;
if (keyCode >= 97 && keyCode <= 122)
return true;
return false;
}
function onStartTyping(callback, options = {}) {
const { document: document2 = defaultDocument } = options;
const keydown = (event) => {
!isFocusedElementEditable() && isTypedCharValid(event) && callback(event);
};
if (document2)
useEventListener(document2, "keydown", keydown, { passive: true });
}
function templateRef(key, initialValue = null) {
const instance = getCurrentInstance();
let _trigger = () => {
};
const element = customRef((track, trigger) => {
_trigger = trigger;
return {
get() {
var _a, _b;
track();
return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;
},
set() {
}
};
});
tryOnMounted(_trigger);
onUpdated(_trigger);
return element;
}
function useActiveElement(options = {}) {
var _a;
const {
window: window2 = defaultWindow,
deep = true
} = options;
const document2 = (_a = options.document) != null ? _a : window2 == null ? void 0 : window2.document;
const getDeepActiveElement = () => {
var _a2;
let element = document2 == null ? void 0 : document2.activeElement;
if (deep) {
while (element == null ? void 0 : element.shadowRoot)
element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;
}
return element;
};
const activeElement = ref();
const trigger = () => {
activeElement.value = getDeepActiveElement();
};
if (window2) {
useEventListener(window2, "blur", (event) => {
if (event.relatedTarget !== null)
return;
trigger();
}, true);
useEventListener(window2, "focus", trigger, true);
}
trigger();
return activeElement;
}
function useMounted() {
const isMounted = ref(false);
const instance = getCurrentInstance();
if (instance) {
onMounted(() => {
isMounted.value = true;
}, isVue2 ? null : instance);
}
return isMounted;
}
function useSupported(callback) {
const isMounted = useMounted();
return computed(() => {
isMounted.value;
return Boolean(callback());
});
}
function useRafFn(fn, options = {}) {
const {
immediate = true,
fpsLimit = void 0,
window: window2 = defaultWindow
} = options;
const isActive = ref(false);
const intervalLimit = fpsLimit ? 1e3 / fpsLimit : null;
let previousFrameTimestamp = 0;
let rafId = null;
function loop(timestamp2) {
if (!isActive.value || !window2)
return;
if (!previousFrameTimestamp)
previousFrameTimestamp = timestamp2;
const delta = timestamp2 - previousFrameTimestamp;
if (intervalLimit && delta < intervalLimit) {
rafId = window2.requestAnimationFrame(loop);
return;
}
previousFrameTimestamp = timestamp2;
fn({ delta, timestamp: timestamp2 });
rafId = window2.requestAnimationFrame(loop);
}
function resume() {
if (!isActive.value && window2) {
isActive.value = true;
previousFrameTimestamp = 0;
rafId = window2.requestAnimationFrame(loop);
}
}
function pause() {
isActive.value = false;
if (rafId != null && window2) {
window2.cancelAnimationFrame(rafId);
rafId = null;
}
}
if (immediate)
resume();
tryOnScopeDispose(pause);
return {
isActive: readonly(isActive),
pause,
resume
};
}
function useAnimate(target, keyframes, options) {
let config;
let animateOptions;
if (isObject(options)) {
config = options;
animateOptions = objectOmit(options, ["window", "immediate", "commitStyles", "persist", "onReady", "onError"]);
} else {
config = { duration: options };
animateOptions = options;
}
const {
window: window2 = defaultWindow,
immediate = true,
commitStyles,
persist,
playbackRate: _playbackRate = 1,
onReady,
onError = (e) => {
console.error(e);
}
} = config;
const isSupported = useSupported(() => window2 && HTMLElement && "animate" in HTMLElement.prototype);
const animate = shallowRef(void 0);
const store = shallowReactive({
startTime: null,
currentTime: null,
timeline: null,
playbackRate: _playbackRate,
pending: false,
playState: immediate ? "idle" : "paused",
replaceState: "active"
});
const pending = computed(() => store.pending);
const playState = computed(() => store.playState);
const replaceState = computed(() => store.replaceState);
const startTime = computed({
get() {
return store.startTime;
},
set(value) {
store.startTime = value;
if (animate.value)
animate.value.startTime = value;
}
});
const currentTime = computed({
get() {
return store.currentTime;
},
set(value) {
store.currentTime = value;
if (animate.value) {
animate.value.currentTime = value;
syncResume();
}
}
});
const timeline = computed({
get() {
return store.timeline;
},
set(value) {
store.timeline = value;
if (animate.value)
animate.value.timeline = value;
}
});
const playbackRate = computed({
get() {
return store.playbackRate;
},
set(value) {
store.playbackRate = value;
if (animate.value)
animate.value.playbackRate = value;
}
});
const play = () => {
if (animate.value) {
try {
animate.value.play();
syncResume();
} catch (e) {
syncPause();
onError(e);
}
} else {
update();
}
};
const pause = () => {
var _a;
try {
(_a = animate.value) == null ? void 0 : _a.pause();
syncPause();
} catch (e) {
onError(e);
}
};
const reverse = () => {
var _a;
!animate.value && update();
try {
(_a = animate.value) == null ? void 0 : _a.reverse();
syncResume();
} catch (e) {
syncPause();
onError(e);
}
};
const finish = () => {
var _a;
try {
(_a = animate.value) == null ? void 0 : _a.finish();
syncPause();
} catch (e) {
onError(e);
}
};
const cancel = () => {
var _a;
try {
(_a = animate.value) == null ? void 0 : _a.cancel();
syncPause();
} catch (e) {
onError(e);
}
};
watch(() => unrefElement(target), (el) => {
el && update();
});
watch(() => keyframes, (value) => {
!animate.value && update();
if (!unrefElement(target) && animate.value) {
animate.value.effect = new KeyframeEffect(
unrefElement(target),
toValue(value),
animateOptions
);
}
}, { deep: true });
tryOnMounted(() => {
nextTick(() => update(true));
});
tryOnScopeDispose(cancel);
function update(init) {
const el = unrefElement(target);
if (!isSupported.value || !el)
return;
if (!animate.value)
animate.value = el.animate(toValue(keyframes), animateOptions);
if (commitStyles)
animate.value.commitStyles();
if (persist)
animate.value.persist();
if (_playbackRate !== 1)
animate.value.playbackRate = _playbackRate;
if (init && !immediate)
animate.value.pause();
else
syncResume();
onReady == null ? void 0 : onReady(animate.value);
}
useEventListener(animate, ["cancel", "finish", "remove"], syncPause);
const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {
if (!animate.value)
return;
store.pending = animate.value.pending;
store.playState = animate.value.playState;
store.replaceState = animate.value.replaceState;
store.startTime = animate.value.startTime;
store.currentTime = animate.value.currentTime;
store.timeline = animate.value.timeline;
store.playbackRate = animate.value.playbackRate;
}, { immediate: false });
function syncResume() {
if (isSupported.value)
resumeRef();
}
function syncPause() {
if (isSupported.value && window2)
window2.requestAnimationFrame(pauseRef);
}
return {
isSupported,
animate,
// actions
play,
pause,
reverse,
finish,
cancel,
// state
pending,
playState,
replaceState,
startTime,
currentTime,
timeline,
playbackRate
};
}
function useAsyncQueue(tasks, options) {
const {
interrupt = true,
onError = noop,
onFinished = noop,
signal
} = options || {};
const promiseState = {
aborted: "aborted",
fulfilled: "fulfilled",
pending: "pending",
rejected: "rejected"
};
const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));
const result = reactive(initialResult);
const activeIndex = ref(-1);
if (!tasks || tasks.length === 0) {
onFinished();
return {
activeIndex,
result
};
}
function updateResult(state, res) {
activeIndex.value++;
result[activeIndex.value].data = res;
result[activeIndex.value].state = state;
}
tasks.reduce((prev, curr) => {
return prev.then((prevRes) => {
var _a;
if (signal == null ? void 0 : signal.aborted) {
updateResult(promiseState.aborted, new Error("aborted"));
return;
}
if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {
onFinished();
return;
}
const done = curr(prevRes).then((currentRes) => {
updateResult(promiseState.fulfilled, currentRes);
activeIndex.value === tasks.length - 1 && onFinished();
return currentRes;
});
if (!signal)
return done;
return Promise.race([done, whenAborted(signal)]);
}).catch((e) => {
if (signal == null ? void 0 : signal.aborted) {
updateResult(promiseState.aborted, e);
return e;
}
updateResult(promiseState.rejected, e);
onError();
return e;
});
}, Promise.resolve());
return {
activeIndex,
result
};
}
function whenAborted(signal) {
return new Promise((resolve, reject) => {
const error = new Error("aborted");
if (signal.aborted)
reject(error);
else
signal.addEventListener("abort", () => reject(error), { once: true });
});
}
function useAsyncState(promise, initialState, options) {
const {
immediate = true,
delay = 0,
onError = noop,
onSuccess = noop,
resetOnExecute = true,
shallow = true,
throwError
} = options != null ? options : {};
const state = shallow ? shallowRef(initialState) : ref(initialState);
const isReady = ref(false);
const isLoading = ref(false);
const error = shallowRef(void 0);
async function execute(delay2 = 0, ...args) {
if (resetOnExecute)
state.value = initialState;
error.value = void 0;
isReady.value = false;
isLoading.value = true;
if (delay2 > 0)
await promiseTimeout(delay2);
const _promise = typeof promise === "function" ? promise(...args) : promise;
try {
const data = await _promise;
state.value = data;
isReady.value = true;
onSuccess(data);
} catch (e) {
error.value = e;
onError(e);
if (throwError)
throw e;
} finally {
isLoading.value = false;
}
return state.value;
}
if (immediate)
execute(delay);
const shell = {
state,
isReady,
isLoading,
error,
execute
};
function waitUntilIsLoaded() {
return new Promise((resolve, reject) => {
until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);
});
}
return {
...shell,
then(onFulfilled, onRejected) {
return waitUntilIsLoaded().then(onFulfilled, onRejected);
}
};
}
const defaults = {
array: (v) => JSON.stringify(v),
object: (v) => JSON.stringify(v),
set: (v) => JSON.stringify(Array.from(v)),
map: (v) => JSON.stringify(Object.fromEntries(v)),
null: () => ""
};
function getDefaultSerialization(target) {
if (!target)
return defaults.null;
if (target instanceof Map)
return defaults.map;
else if (target instanceof Set)
return defaults.set;
else if (Array.isArray(target))
return defaults.array;
else
return defaults.object;
}
function useBase64(target, options) {
const base64 = ref("");
const promise = ref();
function execute() {
if (!isClient)
return;
promise.value = new Promise((resolve, reject) => {
try {
const _target = toValue(target);
if (_target == null) {
resolve("");
} else if (typeof _target === "string") {
resolve(blobToBase64(new Blob([_target], { type: "text/plain" })));
} else if (_target instanceof Blob) {
resolve(blobToBase64(_target));
} else if (_target instanceof ArrayBuffer) {
resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));
} else if (_target instanceof HTMLCanvasElement) {
resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));
} else if (_target instanceof HTMLImageElement) {
const img = _target.cloneNode(false);
img.crossOrigin = "Anonymous";
imgLoaded(img).then(() => {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));
}).catch(reject);
} else if (typeof _target === "object") {
const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);
const serialized = _serializeFn(_target);
return resolve(blobToBase64(new Blob([serialized], { type: "application/json" })));
} else {
reject(new Error("target is unsupported types"));
}
} catch (error) {
reject(error);
}
});
promise.value.then((res) => base64.value = res);
return promise.value;
}
if (isRef(target) || typeof target === "function")
watch(target, execute, { immediate: true });
else
execute();
return {
base64,
promise,
execute
};
}
function imgLoaded(img) {
return new Promise((resolve, reject) => {
if (!img.complete) {
img.onload = () => {
resolve();
};
img.onerror = reject;
} else {
resolve();
}
});
}
function blobToBase64(blob) {
return new Promise((resolve, reject) => {
const fr = new FileReader();
fr.onload = (e) => {
resolve(e.target.result);
};
fr.onerror = reject;
fr.readAsDataURL(blob);
});
}
function useBattery(options = {}) {
const { navigator = defaultNavigator } = options;
const events2 = ["chargingchange", "chargingtimechange", "dischargingtimechange", "levelchange"];
const isSupported = useSupported(() => navigator && "getBattery" in navigator && typeof navigator.getBattery === "function");
const charging = ref(false);
const chargingTime = ref(0);
const dischargingTime = ref(0);
const level = ref(1);
let battery;
function updateBatteryInfo() {
charging.value = this.charging;
chargingTime.value = this.chargingTime || 0;
dischargingTime.value = this.dischargingTime || 0;
level.value = this.level;
}
if (isSupported.value) {
navigator.getBattery().then((_battery) => {
battery = _battery;
updateBatteryInfo.call(battery);
useEventListener(battery, events2, updateBatteryInfo, { passive: true });
});
}
return {
isSupported,
charging,
chargingTime,
dischargingTime,
level
};
}
function useBluetooth(options) {
let {
acceptAllDevices = false
} = options || {};
const {
filters = void 0,
optionalServices = void 0,
navigator = defaultNavigator
} = options || {};
const isSupported = useSupported(() => navigator && "bluetooth" in navigator);
const device = shallowRef(void 0);
const error = shallowRef(null);
watch(device, () => {
connectToBluetoothGATTServer();
});
async function requestDevice() {
if (!isSupported.value)
return;
error.value = null;
if (filters && filters.length > 0)
acceptAllDevices = false;
try {
device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({
acceptAllDevices,
filters,
optionalServices
}));
} catch (err) {
error.value = err;
}
}
const server = ref();
const isConnected = computed(() => {
var _a;
return ((_a = server.value) == null ? void 0 : _a.connected) || false;
});
async function connectToBluetoothGATTServer() {
error.value = null;
if (device.value && device.value.gatt) {
device.value.addEventListener("gattserverdisconnected", () => {
});
try {
server.value = await device.value.gatt.connect();
} catch (err) {
error.value = err;
}
}
}
tryOnMounted(() => {
var _a;
if (device.value)
(_a = device.value.gatt) == null ? void 0 : _a.connect();
});
tryOnScopeDispose(() => {
var _a;
if (device.value)
(_a = device.value.gatt) == null ? void 0 : _a.disconnect();
});
return {
isSupported,
isConnected,
// Device:
device,
requestDevice,
// Server:
server,
// Errors:
error
};
}
function useMediaQuery(query, options = {}) {
const { window: window2 = defaultWindow } = options;
const isSupported = useSupported(() => window2 && "matchMedia" in window2 && typeof window2.matchMedia === "function");
let mediaQuery;
const matches = ref(false);
const handler = (event) => {
matches.value = event.matches;
};
const cleanup = () => {
if (!mediaQuery)
return;
if ("removeEventListener" in mediaQuery)
mediaQuery.removeEventListener("change", handler);
else
mediaQuery.removeListener(handler);
};
const stopWatch = watchEffect(() => {
if (!isSupported.value)
return;
cleanup();
mediaQuery = window2.matchMedia(toValue(query));
if ("addEventListener" in mediaQuery)
mediaQuery.addEventListener("change", handler);
else
mediaQuery.addListener(handler);
matches.value = mediaQuery.matches;
});
tryOnScopeDispose(() => {
stopWatch();
cleanup();
mediaQuery = void 0;
});
return matches;
}
const breakpointsTailwind = {
"sm": 640,
"md": 768,
"lg": 1024,
"xl": 1280,
"2xl": 1536
};
const breakpointsBootstrapV5 = {
xs: 0,
sm: 576,
md: 768,
lg: 992,
xl: 1200,
xxl: 1400
};
const breakpointsVuetifyV2 = {
xs: 0,
sm: 600,
md: 960,
lg: 1264,
xl: 1904
};
const breakpointsVuetifyV3 = {
xs: 0,
sm: 600,
md: 960,
lg: 1280,
xl: 1920,
xxl: 2560
};
const breakpointsVuetify = breakpointsVuetifyV2;
const breakpointsAntDesign = {
xs: 480,
sm: 576,
md: 768,
lg: 992,
xl: 1200,
xxl: 1600
};
const breakpointsQuasar = {
xs: 0,
sm: 600,
md: 1024,
lg: 1440,
xl: 1920
};
const breakpointsSematic = {
mobileS: 320,
mobileM: 375,
mobileL: 425,
tablet: 768,
laptop: 1024,
laptopL: 1440,
desktop4K: 2560
};
const breakpointsMasterCss = {
"3xs": 360,
"2xs": 480,
"xs": 600,
"sm": 768,
"md": 1024,
"lg": 1280,
"xl": 1440,
"2xl": 1600,
"3xl": 1920,
"4xl": 2560
};
const breakpointsPrimeFlex = {
sm: 576,
md: 768,
lg: 992,
xl: 1200
};
function useBreakpoints(breakpoints, options = {}) {
function getValue2(k, delta) {
let v = toValue(breakpoints[toValue(k)]);
if (delta != null)
v = increaseWithUnit(v, delta);
if (typeof v === "number")
v = `${v}px`;
return v;
}
const { window: window2 = defaultWindow, strategy = "min-width" } = options;
function match(query) {
if (!window2)
return false;
return window2.matchMedia(query).matches;
}
const greaterOrEqual = (k) => {
return useMediaQuery(() => `(min-width: ${getValue2(k)})`, options);
};
const smallerOrEqual = (k) => {
return useMediaQuery(() => `(max-width: ${getValue2(k)})`, options);
};
const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {
Object.defineProperty(shortcuts, k, {
get: () => strategy === "min-width" ? greaterOrEqual(k) : smallerOrEqual(k),
enumerable: true,
configurable: true
});
return shortcuts;
}, {});
function current() {
const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]);
return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));
}
return Object.assign(shortcutMethods, {
greaterOrEqual,
smallerOrEqual,
greater(k) {
return useMediaQuery(() => `(min-width: ${getValue2(k, 0.1)})`, options);
},
smaller(k) {
return useMediaQuery(() => `(max-width: ${getValue2(k, -0.1)})`, options);
},
between(a, b) {
return useMediaQuery(() => `(min-width: ${getValue2(a)}) and (max-width: ${getValue2(b, -0.1)})`, options);
},
isGreater(k) {
return match(`(min-width: ${getValue2(k, 0.1)})`);
},
isGreaterOrEqual(k) {
return match(`(min-width: ${getValue2(k)})`);
},
isSmaller(k) {
return match(`(max-width: ${getValue2(k, -0.1)})`);
},
isSmallerOrEqual(k) {
return match(`(max-width: ${getValue2(k)})`);
},
isInBetween(a, b) {
return match(`(min-width: ${getValue2(a)}) and (max-width: ${getValue2(b, -0.1)})`);
},
current,
active() {
const bps = current();
return computed(() => bps.value.length === 0 ? "" : bps.value.at(-1));
}
});
}
function useBroadcastChannel(options) {
const {
name,
window: window2 = defaultWindow
} = options;
const isSupported = useSupported(() => window2 && "BroadcastChannel" in window2);
const isClosed = ref(false);
const channel = ref();
const data = ref();
const error = shallowRef(null);
const post = (data2) => {
if (channel.value)
channel.value.postMessage(data2);
};
const close = () => {
if (channel.value)
channel.value.close();
isClosed.value = true;
};
if (isSupported.value) {
tryOnMounted(() => {
error.value = null;
channel.value = new BroadcastChannel(name);
channel.value.addEventListener("message", (e) => {
data.value = e.data;
}, { passive: true });
channel.value.addEventListener("messageerror", (e) => {
error.value = e;
}, { passive: true });
channel.value.addEventListener("close", () => {
isClosed.value = true;
});
});
}
tryOnScopeDispose(() => {
close();
});
return {
isSupported,
channel,
data,
post,
close,
error,
isClosed
};
}
const WRITABLE_PROPERTIES = [
"hash",
"host",
"hostname",
"href",
"pathname",
"port",
"protocol",
"search"
];
function useBrowserLocation(options = {}) {
const { window: window2 = defaultWindow } = options;
const refs = Object.fromEntries(
WRITABLE_PROPERTIES.map((key) => [key, ref()])
);
for (const [key, ref2] of objectEntries(refs)) {
watch(ref2, (value) => {
if (!(window2 == null ? void 0 : window2.location) || window2.location[key] === value)
return;
window2.location[key] = value;
});
}
const buildState = (trigger) => {
var _a;
const { state: state2, length } = (window2 == null ? void 0 : window2.history) || {};
const { origin } = (window2 == null ? void 0 : window2.location) || {};
for (const key of WRITABLE_PROPERTIES)
refs[key].value = (_a = window2 == null ? void 0 : window2.location) == null ? void 0 : _a[key];
return reactive({
trigger,
state: state2,
length,
origin,
...refs
});
};
const state = ref(buildState("load"));
if (window2) {
useEventListener(window2, "popstate", () => state.value = buildState("popstate"), { passive: true });
useEventListener(window2, "hashchange", () => state.value = buildState("hashchange"), { passive: true });
}
return state;
}
function useCached(refValue, comparator = (a, b) => a === b, watchOptions) {
const cachedValue = ref(refValue.value);
watch(() => refValue.value, (value) => {
if (!comparator(value, cachedValue.value))
cachedValue.value = value;
}, watchOptions);
return cachedValue;
}
function usePermission(permissionDesc, options = {}) {
const {
controls = false,
navigator = defaultNavigator
} = options;
const isSupported = useSupported(() => navigator && "permissions" in navigator);
let permissionStatus;
const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
const state = ref();
const onChange = () => {
if (permissionStatus)
state.value = permissionStatus.state;
};
const query = createSingletonPromise(async () => {
if (!isSupported.value)
return;
if (!permissionStatus) {
try {
permissionStatus = await navigator.permissions.query(desc);
useEventListener(permissionStatus, "change", onChange);
onChange();
} catch (e) {
state.value = "prompt";
}
}
return permissionStatus;
});
query();
if (controls) {
return {
state,
isSupported,
query
};
} else {
return state;
}
}
function useClipboard(options = {}) {
const {
navigator = defaultNavigator,
read = false,
source,
copiedDuring = 1500,
legacy = false
} = options;
const isClipboardApiSupported = useSupported(() => navigator && "clipboard" in navigator);
const permissionRead = usePermission("clipboard-read");
const permissionWrite = usePermission("clipboard-write");
const isSupported = computed(() => isClipboardApiSupported.value || legacy);
const text = ref("");
const copied = ref(false);
const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);
function updateText() {
if (isClipboardApiSupported.value && isAllowed(permissionRead.value)) {
navigator.clipboard.readText().then((value) => {
text.value = value;
});
} else {
text.value = legacyRead();
}
}
if (isSupported.value && read)
useEventListener(["copy", "cut"], updateText);
async function copy(value = toValue(source)) {
if (isSupported.value && value != null) {
if (isClipboardApiSupported.value && isAllowed(permissionWrite.value))
await navigator.clipboard.writeText(value);
else
legacyCopy(value);
text.value = value;
copied.value = true;
timeout.start();
}
}
function legacyCopy(value) {
const ta = document.createElement("textarea");
ta.value = value != null ? value : "";
ta.style.position = "absolute";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.select();
document.execCommand("copy");
ta.remove();
}
function legacyRead() {
var _a, _b, _c;
return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : "";
}
function isAllowed(status) {
return status === "granted" || status === "prompt";
}
return {
isSupported,
text,
copied,
copy
};
}
function useClipboardItems(options = {}) {
const {
navigator = defaultNavigator,
read = false,
source,
copiedDuring = 1500
} = options;
const isSupported = useSupported(() => navigator && "clipboard" in navigator);
const content = ref([]);
const copied = ref(false);
const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);
function updateContent() {
if (isSupported.value) {
navigator.clipboard.read().then((items) => {
content.value = items;
});
}
}
if (isSupported.value && read)
useEventListener(["copy", "cut"], updateContent);
async function copy(value = toValue(source)) {
if (isSupported.value && value != null) {
await navigator.clipboard.write(value);
content.value = value;
copied.value = true;
timeout.start();
}
}
return {
isSupported,
content,
copied,
copy
};
}
function cloneFnJSON(source) {
return JSON.parse(JSON.stringify(source));
}
function useCloned(source, options = {}) {
const cloned = ref({});
const {
manual,
clone = cloneFnJSON,
// watch options
deep = true,
immediate = true
} = options;
function sync() {
cloned.value = clone(toValue(source));
}
if (!manual && (isRef(source) || typeof source === "function")) {
watch(source, sync, {
...options,
deep,
immediate
});
} else {
sync();
}
return { cloned, sync };
}
const _global = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
const globalKey = "__vueuse_ssr_handlers__";
const handlers = /* @__PURE__ */ getHandlers();
function getHandlers() {
if (!(globalKey in _global))
_global[globalKey] = _global[globalKey] || {};
return _global[globalKey];
}
function getSSRHandler(key, fallback) {
return handlers[key] || fallback;
}
function setSSRHandler(key, fn) {
handlers[key] = fn;
}
function guessSerializerType(rawInit) {
return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any";
}
const StorageSerializers = {
boolean: {
read: (v) => v === "true",
write: (v) => String(v)
},
object: {
read: (v) => JSON.parse(v),
write: (v) => JSON.stringify(v)
},
number: {
read: (v) => Number.parseFloat(v),
write: (v) => String(v)
},
any: {
read: (v) => v,
write: (v) => String(v)
},
string: {
read: (v) => v,
write: (v) => String(v)
},
map: {
read: (v) => new Map(JSON.parse(v)),
write: (v) => JSON.stringify(Array.from(v.entries()))
},
set: {
read: (v) => new Set(JSON.parse(v)),
write: (v) => JSON.stringify(Array.from(v))
},
date: {
read: (v) => new Date(v),
write: (v) => v.toISOString()
}
};
const customStorageEventName = "vueuse-storage";
function useStorage(key, defaults2, storage, options = {}) {
var _a;
const {
flush = "pre",
deep = true,
listenToStorageChanges = true,
writeDefaults = true,
mergeDefaults = false,
shallow,
window: window2 = defaultWindow,
eventFilter,
onError = (e) => {
console.error(e);
},
initOnMounted
} = options;
const data = (shallow ? shallowRef : ref)(typeof defaults2 === "function" ? defaults2() : defaults2);
if (!storage) {
try {
storage = getSSRHandler("getDefaultStorage", () => {
var _a2;
return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
})();
} catch (e) {
onError(e);
}
}
if (!storage)
return data;
const rawInit = toValue(defaults2);
const type = guessSerializerType(rawInit);
const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(
data,
() => write(data.value),
{ flush, deep, eventFilter }
);
if (window2 && listenToStorageChanges) {
tryOnMounted(() => {
useEventListener(window2, "storage", update);
useEventListener(window2, customStorageEventName, updateFromCustomEvent);
if (initOnMounted)
update();
});
}
if (!initOnMounted)
update();
function dispatchWriteEvent(oldValue, newValue) {
if (window2) {
window2.dispatchEvent(new CustomEvent(customStorageEventName, {
detail: {
key,
oldValue,
newValue,
storageArea: storage
}
}));
}
}
function write(v) {
try {
const oldValue = storage.getItem(key);
if (v == null) {
dispatchWriteEvent(oldValue, null);
storage.removeItem(key);
} else {
const serialized = serializer.write(v);
if (oldValue !== serialized) {
storage.setItem(key, serialized);
dispatchWriteEvent(oldValue, serialized);
}
}
} catch (e) {
onError(e);
}
}
function read(event) {
const rawValue = event ? event.newValue : storage.getItem(key);
if (rawValue == null) {
if (writeDefaults && rawInit != null)
storage.setItem(key, serializer.write(rawInit));
return rawInit;
} else if (!event && mergeDefaults) {
const value = serializer.read(rawValue);
if (typeof mergeDefaults === "function")
return mergeDefaults(value, rawInit);
else if (type === "object" && !Array.isArray(value))
return { ...rawInit, ...value };
return value;
} else if (typeof rawValue !== "string") {
return rawValue;
} else {
return serializer.read(rawValue);
}
}
function update(event) {
if (event && event.storageArea !== storage)
return;
if (event && event.key == null) {
data.value = rawInit;
return;
}
if (event && event.key !== key)
return;
pauseWatch();
try {
if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))
data.value = read(event);
} catch (e) {
onError(e);
} finally {
if (event)
nextTick(resumeWatch);
else
resumeWatch();
}
}
function updateFromCustomEvent(event) {
update(event.detail);
}
return data;
}
function usePreferredDark(options) {
return useMediaQuery("(prefers-color-scheme: dark)", options);
}
function useColorMode(options = {}) {
const {
selector = "html",
attribute = "class",
initialValue = "auto",
window: window2 = defaultWindow,
storage,
storageKey = "vueuse-color-scheme",
listenToStorageChanges = true,
storageRef,
emitAuto,
disableTransition = true
} = options;
const modes = {
auto: "",
light: "light",
dark: "dark",
...options.modes || {}
};
const preferredDark = usePreferredDark({ window: window2 });
const system = computed(() => preferredDark.value ? "dark" : "light");
const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window: window2, listenToStorageChanges }));
const state = computed(() => store.value === "auto" ? system.value : store.value);
const updateHTMLAttrs = getSSRHandler(
"updateHTMLAttrs",
(selector2, attribute2, value) => {
const el = typeof selector2 === "string" ? window2 == null ? void 0 : window2.document.querySelector(selector2) : unrefElement(selector2);
if (!el)
return;
let style;
if (disableTransition) {
style = window2.document.createElement("style");
const styleString = "*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";
style.appendChild(document.createTextNode(styleString));
window2.document.head.appendChild(style);
}
if (attribute2 === "class") {
const current = value.split(/\s/g);
Object.values(modes).flatMap((i) => (i || "").split(/\s/g)).filter(Boolean).forEach((v) => {
if (current.includes(v))
el.classList.add(v);
else
el.classList.remove(v);
});
} else {
el.setAttribute(attribute2, value);
}
if (disableTransition) {
window2.getComputedStyle(style).opacity;
document.head.removeChild(style);
}
}
);
function defaultOnChanged(mode) {
var _a;
updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);
}
function onChanged(mode) {
if (options.onChanged)
options.onChanged(mode, defaultOnChanged);
else
defaultOnChanged(mode);
}
watch(state, onChanged, { flush: "post", immediate: true });
tryOnMounted(() => onChanged(state.value));
const auto = computed({
get() {
return emitAuto ? store.value : state.value;
},
set(v) {
store.value = v;
}
});
try {
return Object.assign(auto, { store, system, state });
} catch (e) {
return auto;
}
}
function useConfirmDialog(revealed = ref(false)) {
const confirmHook = createEventHook();
const cancelHook = createEventHook();
const revealHook = createEventHook();
let _resolve = noop;
const reveal = (data) => {
revealHook.trigger(data);
revealed.value = true;
return new Promise((resolve) => {
_resolve = resolve;
});
};
const confirm = (data) => {
revealed.value = false;
confirmHook.trigger(data);
_resolve({ data, isCanceled: false });
};
const cancel = (data) => {
revealed.value = false;
cancelHook.trigger(data);
_resolve({ data, isCanceled: true });
};
return {
isRevealed: computed(() => revealed.value),
reveal,
confirm,
cancel,
onReveal: revealHook.on,
onConfirm: confirmHook.on,
onCancel: cancelHook.on
};
}
function useMutationObserver(target, callback, options = {}) {
const { window: window2 = defaultWindow, ...mutationOptions } = options;
let observer;
const isSupported = useSupported(() => window2 && "MutationObserver" in window2);
const cleanup = () => {
if (observer) {
observer.disconnect();
observer = void 0;
}
};
const targets = computed(() => {
const value = toValue(target);
const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish);
return new Set(items);
});
const stopWatch = watch(
() => targets.value,
(targets2) => {
cleanup();
if (isSupported.value && window2 && targets2.size) {
observer = new MutationObserver(callback);
targets2.forEach((el) => observer.observe(el, mutationOptions));
}
},
{ immediate: true, flush: "post" }
);
const takeRecords = () => {
return observer == null ? void 0 : observer.takeRecords();
};
const stop = () => {
cleanup();
stopWatch();
};
tryOnScopeDispose(stop);
return {
isSupported,
stop,
takeRecords
};
}
function useCssVar(prop, target, options = {}) {
const { window: window2 = defaultWindow, initialValue = "", observe = false } = options;
const variable = ref(initialValue);
const elRef = computed(() => {
var _a;
return unrefElement(target) || ((_a = window2 == null ? void 0 : window2.document) == null ? void 0 : _a.documentElement);
});
function updateCssVar() {
var _a;
const key = toValue(prop);
const el = toValue(elRef);
if (el && window2) {
const value = (_a = window2.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();
variable.value = value || initialValue;
}
}
if (observe) {
useMutationObserver(elRef, updateCssVar, {
attributeFilter: ["style", "class"],
window: window2
});
}
watch(
[elRef, () => toValue(prop)],
updateCssVar,
{ immediate: true }
);
watch(
variable,
(val) => {
var _a;
if ((_a = elRef.value) == null ? void 0 : _a.style)
elRef.value.style.setProperty(toValue(prop), val);
}
);
return variable;
}
function useCurrentElement(rootComponent) {
const vm = getCurrentInstance();
const currentElement = computedWithControl(
() => null,
() => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el
);
onUpdated(currentElement.trigger);
onMounted(currentElement.trigger);
return currentElement;
}
function useCycleList(list, options) {
const state = shallowRef(getInitialValue());
const listRef = toRef(list);
const index = computed({
get() {
var _a;
const targetList = listRef.value;
let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);
if (index2 < 0)
index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;
return index2;
},
set(v) {
set2(v);
}
});
function set2(i) {
const targetList = listRef.value;
const length = targetList.length;
const index2 = (i % length + length) % length;
const value = targetList[index2];
state.value = value;
return value;
}
function shift(delta = 1) {
return set2(index.value + delta);
}
function next(n = 1) {
return shift(n);
}
function prev(n = 1) {
return shift(-n);
}
function getInitialValue() {
var _a, _b;
return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;
}
watch(listRef, () => set2(index.value));
return {
state,
index,
next,
prev,
go: set2
};
}
function useDark(options = {}) {
const {
valueDark = "dark",
valueLight = "",
window: window2 = defaultWindow
} = options;
const mode = useColorMode({
...options,
onChanged: (mode2, defaultHandler) => {
var _a;
if (options.onChanged)
(_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === "dark", defaultHandler, mode2);
else
defaultHandler(mode2);
},
modes: {
dark: valueDark,
light: valueLight
}
});
const system = computed(() => {
if (mode.system) {
return mode.system.value;
} else {
const preferredDark = usePreferredDark({ window: window2 });
return preferredDark.value ? "dark" : "light";
}
});
const isDark = computed({
get() {
return mode.value === "dark";
},
set(v) {
const modeVal = v ? "dark" : "light";
if (system.value === modeVal)
mode.value = "auto";
else
mode.value = modeVal;
}
});
return isDark;
}
function fnBypass(v) {
return v;
}
function fnSetSource(source, value) {
return source.value = value;
}
function defaultDump(clone) {
return clone ? typeof clone === "function" ? clone : cloneFnJSON : fnBypass;
}
function defaultParse(clone) {
return clone ? typeof clone === "function" ? clone : cloneFnJSON : fnBypass;
}
function useManualRefHistory(source, options = {}) {
const {
clone = false,
dump = defaultDump(clone),
parse = defaultParse(clone),
setSource = fnSetSource
} = options;
function _createHistoryRecord() {
return markRaw({
snapshot: dump(source.value),
timestamp: timestamp()
});
}
const last = ref(_createHistoryRecord());
const undoStack = ref([]);
const redoStack = ref([]);
const _setSource = (record) => {
setSource(source, parse(record.snapshot));
last.value = record;
};
const commit = () => {
undoStack.value.unshift(last.value);
last.value = _createHistoryRecord();
if (options.capacity && undoStack.value.length > options.capacity)
undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);
if (redoStack.value.length)
redoStack.value.splice(0, redoStack.value.length);
};
const clear = () => {
undoStack.value.splice(0, undoStack.value.length);
redoStack.value.splice(0, redoStack.value.length);
};
const undo = () => {
const state = undoStack.value.shift();
if (state) {
redoStack.value.unshift(last.value);
_setSource(state);
}
};
const redo = () => {
const state = redoStack.value.shift();
if (state) {
undoStack.value.unshift(last.value);
_setSource(state);
}
};
const reset = () => {
_setSource(last.value);
};
const history = computed(() => [last.value, ...undoStack.value]);
const canUndo = computed(() => undoStack.value.length > 0);
const canRedo = computed(() => redoStack.value.length > 0);
return {
source,
undoStack,
redoStack,
last,
history,
canUndo,
canRedo,
clear,
commit,
reset,
undo,
redo
};
}
function useRefHistory(source, options = {}) {
const {
deep = false,
flush = "pre",
eventFilter
} = options;
const {
eventFilter: composedFilter,
pause,
resume: resumeTracking,
isActive: isTracking
} = pausableFilter(eventFilter);
const {
ignoreUpdates,
ignorePrevAsyncUpdates,
stop
} = watchIgnorable(
source,
commit,
{ deep, flush, eventFilter: composedFilter }
);
function setSource(source2, value) {
ignorePrevAsyncUpdates();
ignoreUpdates(() => {
source2.value = value;
});
}
const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });
const { clear, commit: manualCommit } = manualHistory;
function commit() {
ignorePrevAsyncUpdates();
manualCommit();
}
function resume(commitNow) {
resumeTracking();
if (commitNow)
commit();
}
function batch(fn) {
let canceled = false;
const cancel = () => canceled = true;
ignoreUpdates(() => {
fn(cancel);
});
if (!canceled)
commit();
}
function dispose() {
stop();
clear();
}
return {
...manualHistory,
isTracking,
pause,
resume,
commit,
batch,
dispose
};
}
function useDebouncedRefHistory(source, options = {}) {
const filter = options.debounce ? debounceFilter(options.debounce) : void 0;
const history = useRefHistory(source, { ...options, eventFilter: filter });
return {
...history
};
}
function useDeviceMotion(options = {}) {
const {
window: window2 = defaultWindow,
eventFilter = bypassFilter
} = options;
const acceleration = ref({ x: null, y: null, z: null });
const rotationRate = ref({ alpha: null, beta: null, gamma: null });
const interval = ref(0);
const accelerationIncludingGravity = ref({
x: null,
y: null,
z: null
});
if (window2) {
const onDeviceMotion = createFilterWrapper(
eventFilter,
(event) => {
acceleration.value = event.acceleration;
accelerationIncludingGravity.value = event.accelerationIncludingGravity;
rotationRate.value = event.rotationRate;
interval.value = event.interval;
}
);
useEventListener(window2, "devicemotion", onDeviceMotion);
}
return {
acceleration,
accelerationIncludingGravity,
rotationRate,
interval
};
}
function useDeviceOrientation(options = {}) {
const { window: window2 = defaultWindow } = options;
const isSupported = useSupported(() => window2 && "DeviceOrientationEvent" in window2);
const isAbsolute = ref(false);
const alpha = ref(null);
const beta = ref(null);
const gamma = ref(null);
if (window2 && isSupported.value) {
useEventListener(window2, "deviceorientation", (event) => {
isAbsolute.value = event.absolute;
alpha.value = event.alpha;
beta.value = event.beta;
gamma.value = event.gamma;
});
}
return {
isSupported,
isAbsolute,
alpha,
beta,
gamma
};
}
function useDevicePixelRatio(options = {}) {
const {
window: window2 = defaultWindow
} = options;
const pixelRatio = ref(1);
if (window2) {
let observe2 = function() {
pixelRatio.value = window2.devicePixelRatio;
cleanup2();
media = window2.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);
media.addEventListener("change", observe2, { once: true });
}, cleanup2 = function() {
media == null ? void 0 : media.removeEventListener("change", observe2);
};
let media;
observe2();
tryOnScopeDispose(cleanup2);
}
return { pixelRatio };
}
function useDevicesList(options = {}) {
const {
navigator = defaultNavigator,
requestPermissions = false,
constraints = { audio: true, video: true },
onUpdated: onUpdated2
} = options;
const devices = ref([]);
const videoInputs = computed(() => devices.value.filter((i) => i.kind === "videoinput"));
const audioInputs = computed(() => devices.value.filter((i) => i.kind === "audioinput"));
const audioOutputs = computed(() => devices.value.filter((i) => i.kind === "audiooutput"));
const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);
const permissionGranted = ref(false);
let stream;
async function update() {
if (!isSupported.value)
return;
devices.value = await navigator.mediaDevices.enumerateDevices();
onUpdated2 == null ? void 0 : onUpdated2(devices.value);
if (stream) {
stream.getTracks().forEach((t) => t.stop());
stream = null;
}
}
async function ensurePermissions() {
if (!isSupported.value)
return false;
if (permissionGranted.value)
return true;
const { state, query } = usePermission("camera", { controls: true });
await query();
if (state.value !== "granted") {
stream = await navigator.mediaDevices.getUserMedia(constraints);
update();
permissionGranted.value = true;
} else {
permissionGranted.value = true;
}
return permissionGranted.value;
}
if (isSupported.value) {
if (requestPermissions)
ensurePermissions();
useEventListener(navigator.mediaDevices, "devicechange", update);
update();
}
return {
devices,
ensurePermissions,
permissionGranted,
videoInputs,
audioInputs,
audioOutputs,
isSupported
};
}
function useDisplayMedia(options = {}) {
var _a;
const enabled = ref((_a = options.enabled) != null ? _a : false);
const video = options.video;
const audio = options.audio;
const { navigator = defaultNavigator } = options;
const isSupported = useSupported(() => {
var _a2;
return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;
});
const constraint = { audio, video };
const stream = shallowRef();
async function _start() {
if (!isSupported.value || stream.value)
return;
stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);
return stream.value;
}
async function _stop() {
var _a2;
(_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());
stream.value = void 0;
}
function stop() {
_stop();
enabled.value = false;
}
async function start() {
await _start();
if (stream.value)
enabled.value = true;
return stream.value;
}
watch(
enabled,
(v) => {
if (v)
_start();
else
_stop();
},
{ immediate: true }
);
return {
isSupported,
stream,
start,
stop,
enabled
};
}
function useDocumentVisibility(options = {}) {
const { document: document2 = defaultDocument } = options;
if (!document2)
return ref("visible");
const visibility = ref(document2.visibilityState);
useEventListener(document2, "visibilitychange", () => {
visibility.value = document2.visibilityState;
});
return visibility;
}
function useDraggable(target, options = {}) {
var _a, _b;
const {
pointerTypes,
preventDefault: preventDefault2,
stopPropagation,
exact,
onMove,
onEnd,
onStart,
initialValue,
axis = "both",
draggingElement = defaultWindow,
containerElement,
handle: draggingHandle = target
} = options;
const position = ref(
(_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }
);
const pressedDelta = ref();
const filterEvent = (e) => {
if (pointerTypes)
return pointerTypes.includes(e.pointerType);
return true;
};
const handleEvent = (e) => {
if (toValue(preventDefault2))
e.preventDefault();
if (toValue(stopPropagation))
e.stopPropagation();
};
const start = (e) => {
var _a2;
if (toValue(options.disabled) || !filterEvent(e))
return;
if (toValue(exact) && e.target !== toValue(target))
return;
const container = toValue(containerElement);
const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);
const targetRect = toValue(target).getBoundingClientRect();
const pos = {
x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),
y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)
};
if ((onStart == null ? void 0 : onStart(pos, e)) === false)
return;
pressedDelta.value = pos;
handleEvent(e);
};
const move = (e) => {
if (toValue(options.disabled) || !filterEvent(e))
return;
if (!pressedDelta.value)
return;
const container = toValue(containerElement);
const targetRect = toValue(target).getBoundingClientRect();
let { x, y } = position.value;
if (axis === "x" || axis === "both") {
x = e.clientX - pressedDelta.value.x;
if (container)
x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);
}
if (axis === "y" || axis === "both") {
y = e.clientY - pressedDelta.value.y;
if (container)
y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);
}
position.value = {
x,
y
};
onMove == null ? void 0 : onMove(position.value, e);
handleEvent(e);
};
const end = (e) => {
if (toValue(options.disabled) || !filterEvent(e))
return;
if (!pressedDelta.value)
return;
pressedDelta.value = void 0;
onEnd == null ? void 0 : onEnd(position.value, e);
handleEvent(e);
};
if (isClient) {
const config = { capture: (_b = options.capture) != null ? _b : true };
useEventListener(draggingHandle, "pointerdown", start, config);
useEventListener(draggingElement, "pointermove", move, config);
useEventListener(draggingElement, "pointerup", end, config);
}
return {
...toRefs(position),
position,
isDragging: computed(() => !!pressedDelta.value),
style: computed(
() => `left:${position.value.x}px;top:${position.value.y}px;`
)
};
}
function useDropZone(target, options = {}) {
const isOverDropZone = ref(false);
const files = shallowRef(null);
let counter = 0;
let isDataTypeIncluded = true;
if (isClient) {
const _options = typeof options === "function" ? { onDrop: options } : options;
const getFiles = (event) => {
var _a, _b;
const list = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []);
return files.value = list.length === 0 ? null : list;
};
useEventListener(target, "dragenter", (event) => {
var _a, _b;
const types = Array.from(((_a = event == null ? void 0 : event.dataTransfer) == null ? void 0 : _a.items) || []).map((i) => i.kind === "file" ? i.type : null).filter(notNullish);
if (_options.dataTypes && event.dataTransfer) {
const dataTypes = unref(_options.dataTypes);
isDataTypeIncluded = typeof dataTypes === "function" ? dataTypes(types) : dataTypes ? dataTypes.some((item) => types.includes(item)) : true;
if (!isDataTypeIncluded)
return;
}
event.preventDefault();
counter += 1;
isOverDropZone.value = true;
(_b = _options.onEnter) == null ? void 0 : _b.call(_options, getFiles(event), event);
});
useEventListener(target, "dragover", (event) => {
var _a;
if (!isDataTypeIncluded)
return;
event.preventDefault();
(_a = _options.onOver) == null ? void 0 : _a.call(_options, getFiles(event), event);
});
useEventListener(target, "dragleave", (event) => {
var _a;
if (!isDataTypeIncluded)
return;
event.preventDefault();
counter -= 1;
if (counter === 0)
isOverDropZone.value = false;
(_a = _options.onLeave) == null ? void 0 : _a.call(_options, getFiles(event), event);
});
useEventListener(target, "drop", (event) => {
var _a;
event.preventDefault();
counter = 0;
isOverDropZone.value = false;
(_a = _options.onDrop) == null ? void 0 : _a.call(_options, getFiles(event), event);
});
}
return {
files,
isOverDropZone
};
}
function useResizeObserver(target, callback, options = {}) {
const { window: window2 = defaultWindow, ...observerOptions } = options;
let observer;
const isSupported = useSupported(() => window2 && "ResizeObserver" in window2);
const cleanup = () => {
if (observer) {
observer.disconnect();
observer = void 0;
}
};
const targets = computed(() => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]);
const stopWatch = watch(
targets,
(els) => {
cleanup();
if (isSupported.value && window2) {
observer = new ResizeObserver(callback);
for (const _el of els)
_el && observer.observe(_el, observerOptions);
}
},
{ immediate: true, flush: "post" }
);
const stop = () => {
cleanup();
stopWatch();
};
tryOnScopeDispose(stop);
return {
isSupported,
stop
};
}
function useElementBounding(target, options = {}) {
const {
reset = true,
windowResize = true,
windowScroll = true,
immediate = true
} = options;
const height = ref(0);
const bottom = ref(0);
const left = ref(0);
const right = ref(0);
const top = ref(0);
const width = ref(0);
const x = ref(0);
const y = ref(0);
function update() {
const el = unrefElement(target);
if (!el) {
if (reset) {
height.value = 0;
bottom.value = 0;
left.value = 0;
right.value = 0;
top.value = 0;
width.value = 0;
x.value = 0;
y.value = 0;
}
return;
}
const rect = el.getBoundingClientRect();
height.value = rect.height;
bottom.value = rect.bottom;
left.value = rect.left;
right.value = rect.right;
top.value = rect.top;
width.value = rect.width;
x.value = rect.x;
y.value = rect.y;
}
useResizeObserver(target, update);
watch(() => unrefElement(target), (ele) => !ele && update());
useMutationObserver(target, update, {
attributeFilter: ["style", "class"]
});
if (windowScroll)
useEventListener("scroll", update, { capture: true, passive: true });
if (windowResize)
useEventListener("resize", update, { passive: true });
tryOnMounted(() => {
if (immediate)
update();
});
return {
height,
bottom,
left,
right,
top,
width,
x,
y,
update
};
}
function useElementByPoint(options) {
const {
x,
y,
document: document2 = defaultDocument,
multiple,
interval = "requestAnimationFrame",
immediate = true
} = options;
const isSupported = useSupported(() => {
if (toValue(multiple))
return document2 && "elementsFromPoint" in document2;
return document2 && "elementFromPoint" in document2;
});
const element = ref(null);
const cb = () => {
var _a, _b;
element.value = toValue(multiple) ? (_a = document2 == null ? void 0 : document2.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document2 == null ? void 0 : document2.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;
};
const controls = interval === "requestAnimationFrame" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });
return {
isSupported,
element,
...controls
};
}
function useElementHover(el, options = {}) {
const {
delayEnter = 0,
delayLeave = 0,
window: window2 = defaultWindow
} = options;
const isHovered = ref(false);
let timer;
const toggle = (entering) => {
const delay = entering ? delayEnter : delayLeave;
if (timer) {
clearTimeout(timer);
timer = void 0;
}
if (delay)
timer = setTimeout(() => isHovered.value = entering, delay);
else
isHovered.value = entering;
};
if (!window2)
return isHovered;
useEventListener(el, "mouseenter", () => toggle(true), { passive: true });
useEventListener(el, "mouseleave", () => toggle(false), { passive: true });
return isHovered;
}
function useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {
const { window: window2 = defaultWindow, box = "content-box" } = options;
const isSVG = computed(() => {
var _a, _b;
return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes("svg");
});
const width = ref(initialSize.width);
const height = ref(initialSize.height);
const { stop: stop1 } = useResizeObserver(
target,
([entry]) => {
const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;
if (window2 && isSVG.value) {
const $elem = unrefElement(target);
if ($elem) {
const styles = window2.getComputedStyle($elem);
width.value = Number.parseFloat(styles.width);
height.value = Number.parseFloat(styles.height);
}
} else {
if (boxSize) {
const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];
width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);
height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);
} else {
width.value = entry.contentRect.width;
height.value = entry.contentRect.height;
}
}
},
options
);
tryOnMounted(() => {
const ele = unrefElement(target);
if (ele) {
width.value = "offsetWidth" in ele ? ele.offsetWidth : initialSize.width;
height.value = "offsetHeight" in ele ? ele.offsetHeight : initialSize.height;
}
});
const stop2 = watch(
() => unrefElement(target),
(ele) => {
width.value = ele ? initialSize.width : 0;
height.value = ele ? initialSize.height : 0;
}
);
function stop() {
stop1();
stop2();
}
return {
width,
height,
stop
};
}
function useIntersectionObserver(target, callback, options = {}) {
const {
root,
rootMargin = "0px",
threshold = 0.1,
window: window2 = defaultWindow,
immediate = true
} = options;
const isSupported = useSupported(() => window2 && "IntersectionObserver" in window2);
const targets = computed(() => {
const _target = toValue(target);
return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish);
});
let cleanup = noop;
const isActive = ref(immediate);
const stopWatch = isSupported.value ? watch(
() => [targets.value, unrefElement(root), isActive.value],
([targets2, root2]) => {
cleanup();
if (!isActive.value)
return;
if (!targets2.length)
return;
const observer = new IntersectionObserver(
callback,
{
root: unrefElement(root2),
rootMargin,
threshold
}
);
targets2.forEach((el) => el && observer.observe(el));
cleanup = () => {
observer.disconnect();
cleanup = noop;
};
},
{ immediate, flush: "post" }
) : noop;
const stop = () => {
cleanup();
stopWatch();
isActive.value = false;
};
tryOnScopeDispose(stop);
return {
isSupported,
isActive,
pause() {
cleanup();
isActive.value = false;
},
resume() {
isActive.value = true;
},
stop
};
}
function useElementVisibility(element, options = {}) {
const { window: window2 = defaultWindow, scrollTarget, threshold = 0 } = options;
const elementIsVisible = ref(false);
useIntersectionObserver(
element,
(intersectionObserverEntries) => {
let isIntersecting = elementIsVisible.value;
let latestTime = 0;
for (const entry of intersectionObserverEntries) {
if (entry.time >= latestTime) {
latestTime = entry.time;
isIntersecting = entry.isIntersecting;
}
}
elementIsVisible.value = isIntersecting;
},
{
root: scrollTarget,
window: window2,
threshold
}
);
return elementIsVisible;
}
const events = /* @__PURE__ */ new Map();
function useEventBus(key) {
const scope = getCurrentScope();
function on(listener) {
var _a;
const listeners = events.get(key) || /* @__PURE__ */ new Set();
listeners.add(listener);
events.set(key, listeners);
const _off = () => off(listener);
(_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);
return _off;
}
function once(listener) {
function _listener(...args) {
off(_listener);
listener(...args);
}
return on(_listener);
}
function off(listener) {
const listeners = events.get(key);
if (!listeners)
return;
listeners.delete(listener);
if (!listeners.size)
reset();
}
function reset() {
events.delete(key);
}
function emit(event, payload) {
var _a;
(_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));
}
return { on, once, off, emit, reset };
}
function resolveNestedOptions$1(options) {
if (options === true)
return {};
return options;
}
function useEventSource(url, events2 = [], options = {}) {
const event = ref(null);
const data = ref(null);
const status = ref("CONNECTING");
const eventSource = ref(null);
const error = shallowRef(null);
const urlRef = toRef(url);
let explicitlyClosed = false;
let retried = 0;
const {
withCredentials = false,
immediate = true
} = options;
const close = () => {
if (isClient && eventSource.value) {
eventSource.value.close();
eventSource.value = null;
status.value = "CLOSED";
explicitlyClosed = true;
}
};
const _init = () => {
if (explicitlyClosed || typeof urlRef.value === "undefined")
return;
const es = new EventSource(urlRef.value, { withCredentials });
status.value = "CONNECTING";
eventSource.value = es;
es.onopen = () => {
status.value = "OPEN";
error.value = null;
};
es.onerror = (e) => {
status.value = "CLOSED";
error.value = e;
if (es.readyState === 2 && !explicitlyClosed && options.autoReconnect) {
es.close();
const {
retries = -1,
delay = 1e3,
onFailed
} = resolveNestedOptions$1(options.autoReconnect);
retried += 1;
if (typeof retries === "number" && (retries < 0 || retried < retries))
setTimeout(_init, delay);
else if (typeof retries === "function" && retries())
setTimeout(_init, delay);
else
onFailed == null ? void 0 : onFailed();
}
};
es.onmessage = (e) => {
event.value = null;
data.value = e.data;
};
for (const event_name of events2) {
useEventListener(es, event_name, (e) => {
event.value = event_name;
data.value = e.data || null;
});
}
};
const open = () => {
if (!isClient)
return;
close();
explicitlyClosed = false;
retried = 0;
_init();
};
if (immediate)
watch(urlRef, open, { immediate: true });
tryOnScopeDispose(close);
return {
eventSource,
event,
data,
status,
error,
open,
close
};
}
function useEyeDropper(options = {}) {
const { initialValue = "" } = options;
const isSupported = useSupported(() => typeof window !== "undefined" && "EyeDropper" in window);
const sRGBHex = ref(initialValue);
async function open(openOptions) {
if (!isSupported.value)
return;
const eyeDropper = new window.EyeDropper();
const result = await eyeDropper.open(openOptions);
sRGBHex.value = result.sRGBHex;
return result;
}
return { isSupported, sRGBHex, open };
}
function useFavicon(newIcon = null, options = {}) {
const {
baseUrl = "",
rel = "icon",
document: document2 = defaultDocument
} = options;
const favicon = toRef(newIcon);
const applyIcon = (icon) => {
const elements = document2 == null ? void 0 : document2.head.querySelectorAll(`link[rel*="${rel}"]`);
if (!elements || elements.length === 0) {
const link = document2 == null ? void 0 : document2.createElement("link");
if (link) {
link.rel = rel;
link.href = `${baseUrl}${icon}`;
link.type = `image/${icon.split(".").pop()}`;
document2 == null ? void 0 : document2.head.append(link);
}
return;
}
elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);
};
watch(
favicon,
(i, o) => {
if (typeof i === "string" && i !== o)
applyIcon(i);
},
{ immediate: true }
);
return favicon;
}
const payloadMapping = {
json: "application/json",
text: "text/plain"
};
function isFetchOptions(obj) {
return obj && containsProp(obj, "immediate", "refetch", "initialData", "timeout", "beforeFetch", "afterFetch", "onFetchError", "fetch", "updateDataOnError");
}
function isAbsoluteURL(url) {
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
}
function headersToObject(headers) {
if (typeof Headers !== "undefined" && headers instanceof Headers)
return Object.fromEntries(headers.entries());
return headers;
}
function combineCallbacks(combination, ...callbacks) {
if (combination === "overwrite") {
return async (ctx) => {
const callback = callbacks[callbacks.length - 1];
if (callback)
return { ...ctx, ...await callback(ctx) };
return ctx;
};
} else {
return async (ctx) => {
for (const callback of callbacks) {
if (callback)
ctx = { ...ctx, ...await callback(ctx) };
}
return ctx;
};
}
}
function createFetch(config = {}) {
const _combination = config.combination || "chain";
const _options = config.options || {};
const _fetchOptions = config.fetchOptions || {};
function useFactoryFetch(url, ...args) {
const computedUrl = computed(() => {
const baseUrl = toValue(config.baseUrl);
const targetUrl = toValue(url);
return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;
});
let options = _options;
let fetchOptions = _fetchOptions;
if (args.length > 0) {
if (isFetchOptions(args[0])) {
options = {
...options,
...args[0],
beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),
afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),
onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)
};
} else {
fetchOptions = {
...fetchOptions,
...args[0],
headers: {
...headersToObject(fetchOptions.headers) || {},
...headersToObject(args[0].headers) || {}
}
};
}
}
if (args.length > 1 && isFetchOptions(args[1])) {
options = {
...options,
...args[1],
beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),
afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),
onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)
};
}
return useFetch(computedUrl, fetchOptions, options);
}
return useFactoryFetch;
}
function useFetch(url, ...args) {
var _a;
const supportsAbort = typeof AbortController === "function";
let fetchOptions = {};
let options = {
immediate: true,
refetch: false,
timeout: 0,
updateDataOnError: false
};
const config = {
method: "GET",
type: "text",
payload: void 0
};
if (args.length > 0) {
if (isFetchOptions(args[0]))
options = { ...options, ...args[0] };
else
fetchOptions = args[0];
}
if (args.length > 1) {
if (isFetchOptions(args[1]))
options = { ...options, ...args[1] };
}
const {
fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,
initialData,
timeout
} = options;
const responseEvent = createEventHook();
const errorEvent = createEventHook();
const finallyEvent = createEventHook();
const isFinished = ref(false);
const isFetching = ref(false);
const aborted = ref(false);
const statusCode = ref(null);
const response = shallowRef(null);
const error = shallowRef(null);
const data = shallowRef(initialData || null);
const canAbort = computed(() => supportsAbort && isFetching.value);
let controller;
let timer;
const abort = () => {
if (supportsAbort) {
controller == null ? void 0 : controller.abort();
controller = new AbortController();
controller.signal.onabort = () => aborted.value = true;
fetchOptions = {
...fetchOptions,
signal: controller.signal
};
}
};
const loading = (isLoading) => {
isFetching.value = isLoading;
isFinished.value = !isLoading;
};
if (timeout)
timer = useTimeoutFn(abort, timeout, { immediate: false });
let executeCounter = 0;
const execute = async (throwOnFailed = false) => {
var _a2, _b;
abort();
loading(true);
error.value = null;
statusCode.value = null;
aborted.value = false;
executeCounter += 1;
const currentExecuteCounter = executeCounter;
const defaultFetchOptions = {
method: config.method,
headers: {}
};
if (config.payload) {
const headers = headersToObject(defaultFetchOptions.headers);
const payload = toValue(config.payload);
if (!config.payloadType && payload && Object.getPrototypeOf(payload) === Object.prototype && !(payload instanceof FormData))
config.payloadType = "json";
if (config.payloadType)
headers["Content-Type"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;
defaultFetchOptions.body = config.payloadType === "json" ? JSON.stringify(payload) : payload;
}
let isCanceled = false;
const context = {
url: toValue(url),
options: {
...defaultFetchOptions,
...fetchOptions
},
cancel: () => {
isCanceled = true;
}
};
if (options.beforeFetch)
Object.assign(context, await options.beforeFetch(context));
if (isCanceled || !fetch) {
loading(false);
return Promise.resolve(null);
}
let responseData = null;
if (timer)
timer.start();
return fetch(
context.url,
{
...defaultFetchOptions,
...context.options,
headers: {
...headersToObject(defaultFetchOptions.headers),
...headersToObject((_b = context.options) == null ? void 0 : _b.headers)
}
}
).then(async (fetchResponse) => {
response.value = fetchResponse;
statusCode.value = fetchResponse.status;
responseData = await fetchResponse.clone()[config.type]();
if (!fetchResponse.ok) {
data.value = initialData || null;
throw new Error(fetchResponse.statusText);
}
if (options.afterFetch) {
({ data: responseData } = await options.afterFetch({
data: responseData,
response: fetchResponse
}));
}
data.value = responseData;
responseEvent.trigger(fetchResponse);
return fetchResponse;
}).catch(async (fetchError) => {
let errorData = fetchError.message || fetchError.name;
if (options.onFetchError) {
({ error: errorData, data: responseData } = await options.onFetchError({
data: responseData,
error: fetchError,
response: response.value
}));
}
error.value = errorData;
if (options.updateDataOnError)
data.value = responseData;
errorEvent.trigger(fetchError);
if (throwOnFailed)
throw fetchError;
return null;
}).finally(() => {
if (currentExecuteCounter === executeCounter)
loading(false);
if (timer)
timer.stop();
finallyEvent.trigger(null);
});
};
const refetch = toRef(options.refetch);
watch(
[
refetch,
toRef(url)
],
([refetch2]) => refetch2 && execute(),
{ deep: true }
);
const shell = {
isFinished: readonly(isFinished),
isFetching: readonly(isFetching),
statusCode,
response,
error,
data,
canAbort,
aborted,
abort,
execute,
onFetchResponse: responseEvent.on,
onFetchError: errorEvent.on,
onFetchFinally: finallyEvent.on,
// method
get: setMethod("GET"),
put: setMethod("PUT"),
post: setMethod("POST"),
delete: setMethod("DELETE"),
patch: setMethod("PATCH"),
head: setMethod("HEAD"),
options: setMethod("OPTIONS"),
// type
json: setType("json"),
text: setType("text"),
blob: setType("blob"),
arrayBuffer: setType("arrayBuffer"),
formData: setType("formData")
};
function setMethod(method) {
return (payload, payloadType) => {
if (!isFetching.value) {
config.method = method;
config.payload = payload;
config.payloadType = payloadType;
if (isRef(config.payload)) {
watch(
[
refetch,
toRef(config.payload)
],
([refetch2]) => refetch2 && execute(),
{ deep: true }
);
}
return {
...shell,
then(onFulfilled, onRejected) {
return waitUntilFinished().then(onFulfilled, onRejected);
}
};
}
return void 0;
};
}
function waitUntilFinished() {
return new Promise((resolve, reject) => {
until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));
});
}
function setType(type) {
return () => {
if (!isFetching.value) {
config.type = type;
return {
...shell,
then(onFulfilled, onRejected) {
return waitUntilFinished().then(onFulfilled, onRejected);
}
};
}
return void 0;
};
}
if (options.immediate)
Promise.resolve().then(() => execute());
return {
...shell,
then(onFulfilled, onRejected) {
return waitUntilFinished().then(onFulfilled, onRejected);
}
};
}
function joinPaths(start, end) {
if (!start.endsWith("/") && !end.startsWith("/"))
return `${start}/${end}`;
return `${start}${end}`;
}
const DEFAULT_OPTIONS = {
multiple: true,
accept: "*",
reset: false,
directory: false
};
function useFileDialog(options = {}) {
const {
document: document2 = defaultDocument
} = options;
const files = ref(null);
const { on: onChange, trigger } = createEventHook();
let input;
if (document2) {
input = document2.createElement("input");
input.type = "file";
input.onchange = (event) => {
const result = event.target;
files.value = result.files;
trigger(files.value);
};
}
const reset = () => {
files.value = null;
if (input) {
input.value = "";
trigger(null);
}
};
const open = (localOptions) => {
if (!input)
return;
const _options = {
...DEFAULT_OPTIONS,
...options,
...localOptions
};
input.multiple = _options.multiple;
input.accept = _options.accept;
input.webkitdirectory = _options.directory;
if (hasOwn(_options, "capture"))
input.capture = _options.capture;
if (_options.reset)
reset();
input.click();
};
return {
files: readonly(files),
open,
reset,
onChange
};
}
function useFileSystemAccess(options = {}) {
const {
window: _window = defaultWindow,
dataType = "Text"
} = options;
const window2 = _window;
const isSupported = useSupported(() => window2 && "showSaveFilePicker" in window2 && "showOpenFilePicker" in window2);
const fileHandle = ref();
const data = ref();
const file = ref();
const fileName = computed(() => {
var _a, _b;
return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : "";
});
const fileMIME = computed(() => {
var _a, _b;
return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : "";
});
const fileSize = computed(() => {
var _a, _b;
return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;
});
const fileLastModified = computed(() => {
var _a, _b;
return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;
});
async function open(_options = {}) {
if (!isSupported.value)
return;
const [handle] = await window2.showOpenFilePicker({ ...toValue(options), ..._options });
fileHandle.value = handle;
await updateData();
}
async function create(_options = {}) {
if (!isSupported.value)
return;
fileHandle.value = await window2.showSaveFilePicker({ ...options, ..._options });
data.value = void 0;
await updateData();
}
async function save(_options = {}) {
if (!isSupported.value)
return;
if (!fileHandle.value)
return saveAs(_options);
if (data.value) {
const writableStream = await fileHandle.value.createWritable();
await writableStream.write(data.value);
await writableStream.close();
}
await updateFile();
}
async function saveAs(_options = {}) {
if (!isSupported.value)
return;
fileHandle.value = await window2.showSaveFilePicker({ ...options, ..._options });
if (data.value) {
const writableStream = await fileHandle.value.createWritable();
await writableStream.write(data.value);
await writableStream.close();
}
await updateFile();
}
async function updateFile() {
var _a;
file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());
}
async function updateData() {
var _a, _b;
await updateFile();
const type = toValue(dataType);
if (type === "Text")
data.value = await ((_a = file.value) == null ? void 0 : _a.text());
else if (type === "ArrayBuffer")
data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());
else if (type === "Blob")
data.value = file.value;
}
watch(() => toValue(dataType), updateData);
return {
isSupported,
data,
file,
fileName,
fileMIME,
fileSize,
fileLastModified,
open,
create,
save,
saveAs,
updateData
};
}
function useFocus(target, options = {}) {
const { initialValue = false, focusVisible = false } = options;
const innerFocused = ref(false);
const targetElement = computed(() => unrefElement(target));
useEventListener(targetElement, "focus", (event) => {
var _a, _b;
if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, ":focus-visible")))
innerFocused.value = true;
});
useEventListener(targetElement, "blur", () => innerFocused.value = false);
const focused = computed({
get: () => innerFocused.value,
set(value) {
var _a, _b;
if (!value && innerFocused.value)
(_a = targetElement.value) == null ? void 0 : _a.blur();
else if (value && !innerFocused.value)
(_b = targetElement.value) == null ? void 0 : _b.focus();
}
});
watch(
targetElement,
() => {
focused.value = initialValue;
},
{ immediate: true, flush: "post" }
);
return { focused };
}
function useFocusWithin(target, options = {}) {
const activeElement = useActiveElement(options);
const targetElement = computed(() => unrefElement(target));
const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);
return { focused };
}
function useFps(options) {
var _a;
const fps = ref(0);
if (typeof performance === "undefined")
return fps;
const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;
let last = performance.now();
let ticks = 0;
useRafFn(() => {
ticks += 1;
if (ticks >= every) {
const now = performance.now();
const diff = now - last;
fps.value = Math.round(1e3 / (diff / ticks));
last = now;
ticks = 0;
}
});
return fps;
}
const eventHandlers = [
"fullscreenchange",
"webkitfullscreenchange",
"webkitendfullscreen",
"mozfullscreenchange",
"MSFullscreenChange"
];
function useFullscreen(target, options = {}) {
const {
document: document2 = defaultDocument,
autoExit = false
} = options;
const targetRef = computed(() => {
var _a;
return (_a = unrefElement(target)) != null ? _a : document2 == null ? void 0 : document2.querySelector("html");
});
const isFullscreen = ref(false);
const requestMethod = computed(() => {
return [
"requestFullscreen",
"webkitRequestFullscreen",
"webkitEnterFullscreen",
"webkitEnterFullScreen",
"webkitRequestFullScreen",
"mozRequestFullScreen",
"msRequestFullscreen"
].find((m) => document2 && m in document2 || targetRef.value && m in targetRef.value);
});
const exitMethod = computed(() => {
return [
"exitFullscreen",
"webkitExitFullscreen",
"webkitExitFullScreen",
"webkitCancelFullScreen",
"mozCancelFullScreen",
"msExitFullscreen"
].find((m) => document2 && m in document2 || targetRef.value && m in targetRef.value);
});
const fullscreenEnabled = computed(() => {
return [
"fullScreen",
"webkitIsFullScreen",
"webkitDisplayingFullscreen",
"mozFullScreen",
"msFullscreenElement"
].find((m) => document2 && m in document2 || targetRef.value && m in targetRef.value);
});
const fullscreenElementMethod = [
"fullscreenElement",
"webkitFullscreenElement",
"mozFullScreenElement",
"msFullscreenElement"
].find((m) => document2 && m in document2);
const isSupported = useSupported(() => targetRef.value && document2 && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);
const isCurrentElementFullScreen = () => {
if (fullscreenElementMethod)
return (document2 == null ? void 0 : document2[fullscreenElementMethod]) === targetRef.value;
return false;
};
const isElementFullScreen = () => {
if (fullscreenEnabled.value) {
if (document2 && document2[fullscreenEnabled.value] != null) {
return document2[fullscreenEnabled.value];
} else {
const target2 = targetRef.value;
if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {
return Boolean(target2[fullscreenEnabled.value]);
}
}
}
return false;
};
async function exit() {
if (!isSupported.value || !isFullscreen.value)
return;
if (exitMethod.value) {
if ((document2 == null ? void 0 : document2[exitMethod.value]) != null) {
await document2[exitMethod.value]();
} else {
const target2 = targetRef.value;
if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)
await target2[exitMethod.value]();
}
}
isFullscreen.value = false;
}
async function enter() {
if (!isSupported.value || isFullscreen.value)
return;
if (isElementFullScreen())
await exit();
const target2 = targetRef.value;
if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {
await target2[requestMethod.value]();
isFullscreen.value = true;
}
}
async function toggle() {
await (isFullscreen.value ? exit() : enter());
}
const handlerCallback = () => {
const isElementFullScreenValue = isElementFullScreen();
if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())
isFullscreen.value = isElementFullScreenValue;
};
useEventListener(document2, eventHandlers, handlerCallback, false);
useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, false);
if (autoExit)
tryOnScopeDispose(exit);
return {
isSupported,
isFullscreen,
enter,
exit,
toggle
};
}
function mapGamepadToXbox360Controller(gamepad) {
return computed(() => {
if (gamepad.value) {
return {
buttons: {
a: gamepad.value.buttons[0],
b: gamepad.value.buttons[1],
x: gamepad.value.buttons[2],
y: gamepad.value.buttons[3]
},
bumper: {
left: gamepad.value.buttons[4],
right: gamepad.value.buttons[5]
},
triggers: {
left: gamepad.value.buttons[6],
right: gamepad.value.buttons[7]
},
stick: {
left: {
horizontal: gamepad.value.axes[0],
vertical: gamepad.value.axes[1],
button: gamepad.value.buttons[10]
},
right: {
horizontal: gamepad.value.axes[2],
vertical: gamepad.value.axes[3],
button: gamepad.value.buttons[11]
}
},
dpad: {
up: gamepad.value.buttons[12],
down: gamepad.value.buttons[13],
left: gamepad.value.buttons[14],
right: gamepad.value.buttons[15]
},
back: gamepad.value.buttons[8],
start: gamepad.value.buttons[9]
};
}
return null;
});
}
function useGamepad(options = {}) {
const {
navigator = defaultNavigator
} = options;
const isSupported = useSupported(() => navigator && "getGamepads" in navigator);
const gamepads = ref([]);
const onConnectedHook = createEventHook();
const onDisconnectedHook = createEventHook();
const stateFromGamepad = (gamepad) => {
const hapticActuators = [];
const vibrationActuator = "vibrationActuator" in gamepad ? gamepad.vibrationActuator : null;
if (vibrationActuator)
hapticActuators.push(vibrationActuator);
if (gamepad.hapticActuators)
hapticActuators.push(...gamepad.hapticActuators);
return {
...gamepad,
id: gamepad.id,
hapticActuators,
axes: gamepad.axes.map((axes) => axes),
buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value })),
index: gamepad.index
};
};
const updateGamepadState = () => {
const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];
for (const gamepad of _gamepads) {
if (gamepad && gamepads.value[gamepad.index])
gamepads.value[gamepad.index] = stateFromGamepad(gamepad);
}
};
const { isActive, pause, resume } = useRafFn(updateGamepadState);
const onGamepadConnected = (gamepad) => {
if (!gamepads.value.some(({ index }) => index === gamepad.index)) {
gamepads.value.push(stateFromGamepad(gamepad));
onConnectedHook.trigger(gamepad.index);
}
resume();
};
const onGamepadDisconnected = (gamepad) => {
gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);
onDisconnectedHook.trigger(gamepad.index);
};
useEventListener("gamepadconnected", (e) => onGamepadConnected(e.gamepad));
useEventListener("gamepaddisconnected", (e) => onGamepadDisconnected(e.gamepad));
tryOnMounted(() => {
const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];
for (const gamepad of _gamepads) {
if (gamepad && gamepads.value[gamepad.index])
onGamepadConnected(gamepad);
}
});
pause();
return {
isSupported,
onConnected: onConnectedHook.on,
onDisconnected: onDisconnectedHook.on,
gamepads,
pause,
resume,
isActive
};
}
function useGeolocation(options = {}) {
const {
enableHighAccuracy = true,
maximumAge = 3e4,
timeout = 27e3,
navigator = defaultNavigator,
immediate = true
} = options;
const isSupported = useSupported(() => navigator && "geolocation" in navigator);
const locatedAt = ref(null);
const error = shallowRef(null);
const coords = ref({
accuracy: 0,
latitude: Number.POSITIVE_INFINITY,
longitude: Number.POSITIVE_INFINITY,
altitude: null,
altitudeAccuracy: null,
heading: null,
speed: null
});
function updatePosition(position) {
locatedAt.value = position.timestamp;
coords.value = position.coords;
error.value = null;
}
let watcher;
function resume() {
if (isSupported.value) {
watcher = navigator.geolocation.watchPosition(
updatePosition,
(err) => error.value = err,
{
enableHighAccuracy,
maximumAge,
timeout
}
);
}
}
if (immediate)
resume();
function pause() {
if (watcher && navigator)
navigator.geolocation.clearWatch(watcher);
}
tryOnScopeDispose(() => {
pause();
});
return {
isSupported,
coords,
locatedAt,
error,
resume,
pause
};
}
const defaultEvents$1 = ["mousemove", "mousedown", "resize", "keydown", "touchstart", "wheel"];
const oneMinute = 6e4;
function useIdle(timeout = oneMinute, options = {}) {
const {
initialState = false,
listenForVisibilityChange = true,
events: events2 = defaultEvents$1,
window: window2 = defaultWindow,
eventFilter = throttleFilter(50)
} = options;
const idle = ref(initialState);
const lastActive = ref(timestamp());
let timer;
const reset = () => {
idle.value = false;
clearTimeout(timer);
timer = setTimeout(() => idle.value = true, timeout);
};
const onEvent = createFilterWrapper(
eventFilter,
() => {
lastActive.value = timestamp();
reset();
}
);
if (window2) {
const document2 = window2.document;
for (const event of events2)
useEventListener(window2, event, onEvent, { passive: true });
if (listenForVisibilityChange) {
useEventListener(document2, "visibilitychange", () => {
if (!document2.hidden)
onEvent();
});
}
reset();
}
return {
idle,
lastActive,
reset
};
}
async function loadImage(options) {
return new Promise((resolve, reject) => {
const img = new Image();
const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy } = options;
img.src = src;
if (srcset)
img.srcset = srcset;
if (sizes)
img.sizes = sizes;
if (clazz)
img.className = clazz;
if (loading)
img.loading = loading;
if (crossorigin)
img.crossOrigin = crossorigin;
if (referrerPolicy)
img.referrerPolicy = referrerPolicy;
img.onload = () => resolve(img);
img.onerror = reject;
});
}
function useImage(options, asyncStateOptions = {}) {
const state = useAsyncState(
() => loadImage(toValue(options)),
void 0,
{
resetOnExecute: true,
...asyncStateOptions
}
);
watch(
() => toValue(options),
() => state.execute(asyncStateOptions.delay),
{ deep: true }
);
return state;
}
const ARRIVED_STATE_THRESHOLD_PIXELS = 1;
function useScroll(element, options = {}) {
const {
throttle = 0,
idle = 200,
onStop = noop,
onScroll = noop,
offset = {
left: 0,
right: 0,
top: 0,
bottom: 0
},
eventListenerOptions = {
capture: false,
passive: true
},
behavior = "auto",
window: window2 = defaultWindow,
onError = (e) => {
console.error(e);
}
} = options;
const internalX = ref(0);
const internalY = ref(0);
const x = computed({
get() {
return internalX.value;
},
set(x2) {
scrollTo2(x2, void 0);
}
});
const y = computed({
get() {
return internalY.value;
},
set(y2) {
scrollTo2(void 0, y2);
}
});
function scrollTo2(_x, _y) {
var _a, _b, _c;
if (!window2)
return;
const _element = toValue(element);
if (!_element)
return;
(_c = _element instanceof Document ? window2.document.body : _element) == null ? void 0 : _c.scrollTo({
top: (_a = toValue(_y)) != null ? _a : y.value,
left: (_b = toValue(_x)) != null ? _b : x.value,
behavior: toValue(behavior)
});
}
const isScrolling = ref(false);
const arrivedState = reactive({
left: true,
right: false,
top: true,
bottom: false
});
const directions = reactive({
left: false,
right: false,
top: false,
bottom: false
});
const onScrollEnd = (e) => {
if (!isScrolling.value)
return;
isScrolling.value = false;
directions.left = false;
directions.right = false;
directions.top = false;
directions.bottom = false;
onStop(e);
};
const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);
const setArrivedState = (target) => {
var _a;
if (!window2)
return;
const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);
const { display, flexDirection } = getComputedStyle(el);
const scrollLeft = el.scrollLeft;
directions.left = scrollLeft < internalX.value;
directions.right = scrollLeft > internalX.value;
const left = Math.abs(scrollLeft) <= (offset.left || 0);
const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
if (display === "flex" && flexDirection === "row-reverse") {
arrivedState.left = right;
arrivedState.right = left;
} else {
arrivedState.left = left;
arrivedState.right = right;
}
internalX.value = scrollLeft;
let scrollTop = el.scrollTop;
if (target === window2.document && !scrollTop)
scrollTop = window2.document.body.scrollTop;
directions.top = scrollTop < internalY.value;
directions.bottom = scrollTop > internalY.value;
const top = Math.abs(scrollTop) <= (offset.top || 0);
const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
if (display === "flex" && flexDirection === "column-reverse") {
arrivedState.top = bottom;
arrivedState.bottom = top;
} else {
arrivedState.top = top;
arrivedState.bottom = bottom;
}
internalY.value = scrollTop;
};
const onScrollHandler = (e) => {
var _a;
if (!window2)
return;
const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;
setArrivedState(eventTarget);
isScrolling.value = true;
onScrollEndDebounced(e);
onScroll(e);
};
useEventListener(
element,
"scroll",
throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,
eventListenerOptions
);
tryOnMounted(() => {
try {
const _element = toValue(element);
if (!_element)
return;
setArrivedState(_element);
} catch (e) {
onError(e);
}
});
useEventListener(
element,
"scrollend",
onScrollEnd,
eventListenerOptions
);
return {
x,
y,
isScrolling,
arrivedState,
directions,
measure() {
const _element = toValue(element);
if (window2 && _element)
setArrivedState(_element);
}
};
}
function resolveElement(el) {
if (typeof Window !== "undefined" && el instanceof Window)
return el.document.documentElement;
if (typeof Document !== "undefined" && el instanceof Document)
return el.documentElement;
return el;
}
function useInfiniteScroll(element, onLoadMore, options = {}) {
var _a;
const {
direction = "bottom",
interval = 100,
canLoadMore = () => true
} = options;
const state = reactive(useScroll(
element,
{
...options,
offset: {
[direction]: (_a = options.distance) != null ? _a : 0,
...options.offset
}
}
));
const promise = ref();
const isLoading = computed(() => !!promise.value);
const observedElement = computed(() => {
return resolveElement(toValue(element));
});
const isElementVisible = useElementVisibility(observedElement);
function checkAndLoad() {
state.measure();
if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))
return;
const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;
const isNarrower = direction === "bottom" || direction === "top" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;
if (state.arrivedState[direction] || isNarrower) {
if (!promise.value) {
promise.value = Promise.all([
onLoadMore(state),
new Promise((resolve) => setTimeout(resolve, interval))
]).finally(() => {
promise.value = null;
nextTick(() => checkAndLoad());
});
}
}
}
watch(
() => [state.arrivedState[direction], isElementVisible.value],
checkAndLoad,
{ immediate: true }
);
return {
isLoading
};
}
const defaultEvents = ["mousedown", "mouseup", "keydown", "keyup"];
function useKeyModifier(modifier, options = {}) {
const {
events: events2 = defaultEvents,
document: document2 = defaultDocument,
initial = null
} = options;
const state = ref(initial);
if (document2) {
events2.forEach((listenerEvent) => {
useEventListener(document2, listenerEvent, (evt) => {
if (typeof evt.getModifierState === "function")
state.value = evt.getModifierState(modifier);
});
});
}
return state;
}
function useLocalStorage(key, initialValue, options = {}) {
const { window: window2 = defaultWindow } = options;
return useStorage(key, initialValue, window2 == null ? void 0 : window2.localStorage, options);
}
const DefaultMagicKeysAliasMap = {
ctrl: "control",
command: "meta",
cmd: "meta",
option: "alt",
up: "arrowup",
down: "arrowdown",
left: "arrowleft",
right: "arrowright"
};
function useMagicKeys(options = {}) {
const {
reactive: useReactive = false,
target = defaultWindow,
aliasMap = DefaultMagicKeysAliasMap,
passive = true,
onEventFired = noop
} = options;
const current = reactive(/* @__PURE__ */ new Set());
const obj = {
toJSON() {
return {};
},
current
};
const refs = useReactive ? reactive(obj) : obj;
const metaDeps = /* @__PURE__ */ new Set();
const usedKeys = /* @__PURE__ */ new Set();
function setRefs(key, value) {
if (key in refs) {
if (useReactive)
refs[key] = value;
else
refs[key].value = value;
}
}
function reset() {
current.clear();
for (const key of usedKeys)
setRefs(key, false);
}
function updateRefs(e, value) {
var _a, _b;
const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();
const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();
const values = [code, key].filter(Boolean);
if (key) {
if (value)
current.add(key);
else
current.delete(key);
}
for (const key2 of values) {
usedKeys.add(key2);
setRefs(key2, value);
}
if (key === "meta" && !value) {
metaDeps.forEach((key2) => {
current.delete(key2);
setRefs(key2, false);
});
metaDeps.clear();
} else if (typeof e.getModifierState === "function" && e.getModifierState("Meta") && value) {
[...current, ...values].forEach((key2) => metaDeps.add(key2));
}
}
useEventListener(target, "keydown", (e) => {
updateRefs(e, true);
return onEventFired(e);
}, { passive });
useEventListener(target, "keyup", (e) => {
updateRefs(e, false);
return onEventFired(e);
}, { passive });
useEventListener("blur", reset, { passive: true });
useEventListener("focus", reset, { passive: true });
const proxy = new Proxy(
refs,
{
get(target2, prop, rec) {
if (typeof prop !== "string")
return Reflect.get(target2, prop, rec);
prop = prop.toLowerCase();
if (prop in aliasMap)
prop = aliasMap[prop];
if (!(prop in refs)) {
if (/[+_-]/.test(prop)) {
const keys2 = prop.split(/[+_-]/g).map((i) => i.trim());
refs[prop] = computed(() => keys2.every((key) => toValue(proxy[key])));
} else {
refs[prop] = ref(false);
}
}
const r = Reflect.get(target2, prop, rec);
return useReactive ? toValue(r) : r;
}
}
);
return proxy;
}
function usingElRef(source, cb) {
if (toValue(source))
cb(toValue(source));
}
function timeRangeToArray(timeRanges) {
let ranges = [];
for (let i = 0; i < timeRanges.length; ++i)
ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];
return ranges;
}
function tracksToArray(tracks) {
return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));
}
const defaultOptions = {
src: "",
tracks: []
};
function useMediaControls(target, options = {}) {
options = {
...defaultOptions,
...options
};
const {
document: document2 = defaultDocument
} = options;
const currentTime = ref(0);
const duration = ref(0);
const seeking = ref(false);
const volume = ref(1);
const waiting = ref(false);
const ended = ref(false);
const playing = ref(false);
const rate = ref(1);
const stalled = ref(false);
const buffered = ref([]);
const tracks = ref([]);
const selectedTrack = ref(-1);
const isPictureInPicture = ref(false);
const muted = ref(false);
const supportsPictureInPicture = document2 && "pictureInPictureEnabled" in document2;
const sourceErrorEvent = createEventHook();
const disableTrack = (track) => {
usingElRef(target, (el) => {
if (track) {
const id = typeof track === "number" ? track : track.id;
el.textTracks[id].mode = "disabled";
} else {
for (let i = 0; i < el.textTracks.length; ++i)
el.textTracks[i].mode = "disabled";
}
selectedTrack.value = -1;
});
};
const enableTrack = (track, disableTracks = true) => {
usingElRef(target, (el) => {
const id = typeof track === "number" ? track : track.id;
if (disableTracks)
disableTrack();
el.textTracks[id].mode = "showing";
selectedTrack.value = id;
});
};
const togglePictureInPicture = () => {
return new Promise((resolve, reject) => {
usingElRef(target, async (el) => {
if (supportsPictureInPicture) {
if (!isPictureInPicture.value) {
el.requestPictureInPicture().then(resolve).catch(reject);
} else {
document2.exitPictureInPicture().then(resolve).catch(reject);
}
}
});
});
};
watchEffect(() => {
if (!document2)
return;
const el = toValue(target);
if (!el)
return;
const src = toValue(options.src);
let sources = [];
if (!src)
return;
if (typeof src === "string")
sources = [{ src }];
else if (Array.isArray(src))
sources = src;
else if (isObject(src))
sources = [src];
el.querySelectorAll("source").forEach((e) => {
e.removeEventListener("error", sourceErrorEvent.trigger);
e.remove();
});
sources.forEach(({ src: src2, type }) => {
const source = document2.createElement("source");
source.setAttribute("src", src2);
source.setAttribute("type", type || "");
source.addEventListener("error", sourceErrorEvent.trigger);
el.appendChild(source);
});
el.load();
});
tryOnScopeDispose(() => {
const el = toValue(target);
if (!el)
return;
el.querySelectorAll("source").forEach((e) => e.removeEventListener("error", sourceErrorEvent.trigger));
});
watch([target, volume], () => {
const el = toValue(target);
if (!el)
return;
el.volume = volume.value;
});
watch([target, muted], () => {
const el = toValue(target);
if (!el)
return;
el.muted = muted.value;
});
watch([target, rate], () => {
const el = toValue(target);
if (!el)
return;
el.playbackRate = rate.value;
});
watchEffect(() => {
if (!document2)
return;
const textTracks = toValue(options.tracks);
const el = toValue(target);
if (!textTracks || !textTracks.length || !el)
return;
el.querySelectorAll("track").forEach((e) => e.remove());
textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {
const track = document2.createElement("track");
track.default = isDefault || false;
track.kind = kind;
track.label = label;
track.src = src;
track.srclang = srcLang;
if (track.default)
selectedTrack.value = i;
el.appendChild(track);
});
});
const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {
const el = toValue(target);
if (!el)
return;
el.currentTime = time;
});
const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {
const el = toValue(target);
if (!el)
return;
isPlaying ? el.play() : el.pause();
});
useEventListener(target, "timeupdate", () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime));
useEventListener(target, "durationchange", () => duration.value = toValue(target).duration);
useEventListener(target, "progress", () => buffered.value = timeRangeToArray(toValue(target).buffered));
useEventListener(target, "seeking", () => seeking.value = true);
useEventListener(target, "seeked", () => seeking.value = false);
useEventListener(target, ["waiting", "loadstart"], () => {
waiting.value = true;
ignorePlayingUpdates(() => playing.value = false);
});
useEventListener(target, "loadeddata", () => waiting.value = false);
useEventListener(target, "playing", () => {
waiting.value = false;
ended.value = false;
ignorePlayingUpdates(() => playing.value = true);
});
useEventListener(target, "ratechange", () => rate.value = toValue(target).playbackRate);
useEventListener(target, "stalled", () => stalled.value = true);
useEventListener(target, "ended", () => ended.value = true);
useEventListener(target, "pause", () => ignorePlayingUpdates(() => playing.value = false));
useEventListener(target, "play", () => ignorePlayingUpdates(() => playing.value = true));
useEventListener(target, "enterpictureinpicture", () => isPictureInPicture.value = true);
useEventListener(target, "leavepictureinpicture", () => isPictureInPicture.value = false);
useEventListener(target, "volumechange", () => {
const el = toValue(target);
if (!el)
return;
volume.value = el.volume;
muted.value = el.muted;
});
const listeners = [];
const stop = watch([target], () => {
const el = toValue(target);
if (!el)
return;
stop();
listeners[0] = useEventListener(el.textTracks, "addtrack", () => tracks.value = tracksToArray(el.textTracks));
listeners[1] = useEventListener(el.textTracks, "removetrack", () => tracks.value = tracksToArray(el.textTracks));
listeners[2] = useEventListener(el.textTracks, "change", () => tracks.value = tracksToArray(el.textTracks));
});
tryOnScopeDispose(() => listeners.forEach((listener) => listener()));
return {
currentTime,
duration,
waiting,
seeking,
ended,
stalled,
buffered,
playing,
rate,
// Volume
volume,
muted,
// Tracks
tracks,
selectedTrack,
enableTrack,
disableTrack,
// Picture in Picture
supportsPictureInPicture,
togglePictureInPicture,
isPictureInPicture,
// Events
onSourceError: sourceErrorEvent.on
};
}
function getMapVue2Compat() {
const data = shallowReactive({});
return {
get: (key) => data[key],
set: (key, value) => set(data, key, value),
has: (key) => hasOwn(data, key),
delete: (key) => del(data, key),
clear: () => {
Object.keys(data).forEach((key) => {
del(data, key);
});
}
};
}
function useMemoize(resolver, options) {
const initCache = () => {
if (options == null ? void 0 : options.cache)
return shallowReactive(options.cache);
if (isVue2)
return getMapVue2Compat();
return shallowReactive(/* @__PURE__ */ new Map());
};
const cache = initCache();
const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);
const _loadData = (key, ...args) => {
cache.set(key, resolver(...args));
return cache.get(key);
};
const loadData = (...args) => _loadData(generateKey(...args), ...args);
const deleteData = (...args) => {
cache.delete(generateKey(...args));
};
const clearData = () => {
cache.clear();
};
const memoized = (...args) => {
const key = generateKey(...args);
if (cache.has(key))
return cache.get(key);
return _loadData(key, ...args);
};
memoized.load = loadData;
memoized.delete = deleteData;
memoized.clear = clearData;
memoized.generateKey = generateKey;
memoized.cache = cache;
return memoized;
}
function useMemory(options = {}) {
const memory = ref();
const isSupported = useSupported(() => typeof performance !== "undefined" && "memory" in performance);
if (isSupported.value) {
const { interval = 1e3 } = options;
useIntervalFn(() => {
memory.value = performance.memory;
}, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });
}
return { isSupported, memory };
}
const UseMouseBuiltinExtractors = {
page: (event) => [event.pageX, event.pageY],
client: (event) => [event.clientX, event.clientY],
screen: (event) => [event.screenX, event.screenY],
movement: (event) => event instanceof Touch ? null : [event.movementX, event.movementY]
};
function useMouse(options = {}) {
const {
type = "page",
touch = true,
resetOnTouchEnds = false,
initialValue = { x: 0, y: 0 },
window: window2 = defaultWindow,
target = window2,
scroll = true,
eventFilter
} = options;
let _prevMouseEvent = null;
const x = ref(initialValue.x);
const y = ref(initialValue.y);
const sourceType = ref(null);
const extractor = typeof type === "function" ? type : UseMouseBuiltinExtractors[type];
const mouseHandler = (event) => {
const result = extractor(event);
_prevMouseEvent = event;
if (result) {
[x.value, y.value] = result;
sourceType.value = "mouse";
}
};
const touchHandler = (event) => {
if (event.touches.length > 0) {
const result = extractor(event.touches[0]);
if (result) {
[x.value, y.value] = result;
sourceType.value = "touch";
}
}
};
const scrollHandler = () => {
if (!_prevMouseEvent || !window2)
return;
const pos = extractor(_prevMouseEvent);
if (_prevMouseEvent instanceof MouseEvent && pos) {
x.value = pos[0] + window2.scrollX;
y.value = pos[1] + window2.scrollY;
}
};
const reset = () => {
x.value = initialValue.x;
y.value = initialValue.y;
};
const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);
const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);
const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();
if (target) {
const listenerOptions = { passive: true };
useEventListener(target, ["mousemove", "dragover"], mouseHandlerWrapper, listenerOptions);
if (touch && type !== "movement") {
useEventListener(target, ["touchstart", "touchmove"], touchHandlerWrapper, listenerOptions);
if (resetOnTouchEnds)
useEventListener(target, "touchend", reset, listenerOptions);
}
if (scroll && type === "page")
useEventListener(window2, "scroll", scrollHandlerWrapper, { passive: true });
}
return {
x,
y,
sourceType
};
}
function useMouseInElement(target, options = {}) {
const {
handleOutside = true,
window: window2 = defaultWindow
} = options;
const type = options.type || "page";
const { x, y, sourceType } = useMouse(options);
const targetRef = ref(target != null ? target : window2 == null ? void 0 : window2.document.body);
const elementX = ref(0);
const elementY = ref(0);
const elementPositionX = ref(0);
const elementPositionY = ref(0);
const elementHeight = ref(0);
const elementWidth = ref(0);
const isOutside = ref(true);
let stop = () => {
};
if (window2) {
stop = watch(
[targetRef, x, y],
() => {
const el = unrefElement(targetRef);
if (!el)
return;
const {
left,
top,
width,
height
} = el.getBoundingClientRect();
elementPositionX.value = left + (type === "page" ? window2.pageXOffset : 0);
elementPositionY.value = top + (type === "page" ? window2.pageYOffset : 0);
elementHeight.value = height;
elementWidth.value = width;
const elX = x.value - elementPositionX.value;
const elY = y.value - elementPositionY.value;
isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;
if (handleOutside || !isOutside.value) {
elementX.value = elX;
elementY.value = elY;
}
},
{ immediate: true }
);
useEventListener(document, "mouseleave", () => {
isOutside.value = true;
});
}
return {
x,
y,
sourceType,
elementX,
elementY,
elementPositionX,
elementPositionY,
elementHeight,
elementWidth,
isOutside,
stop
};
}
function useMousePressed(options = {}) {
const {
touch = true,
drag = true,
capture = false,
initialValue = false,
window: window2 = defaultWindow
} = options;
const pressed = ref(initialValue);
const sourceType = ref(null);
if (!window2) {
return {
pressed,
sourceType
};
}
const onPressed = (srcType) => () => {
pressed.value = true;
sourceType.value = srcType;
};
const onReleased = () => {
pressed.value = false;
sourceType.value = null;
};
const target = computed(() => unrefElement(options.target) || window2);
useEventListener(target, "mousedown", onPressed("mouse"), { passive: true, capture });
useEventListener(window2, "mouseleave", onReleased, { passive: true, capture });
useEventListener(window2, "mouseup", onReleased, { passive: true, capture });
if (drag) {
useEventListener(target, "dragstart", onPressed("mouse"), { passive: true, capture });
useEventListener(window2, "drop", onReleased, { passive: true, capture });
useEventListener(window2, "dragend", onReleased, { passive: true, capture });
}
if (touch) {
useEventListener(target, "touchstart", onPressed("touch"), { passive: true, capture });
useEventListener(window2, "touchend", onReleased, { passive: true, capture });
useEventListener(window2, "touchcancel", onReleased, { passive: true, capture });
}
return {
pressed,
sourceType
};
}
function useNavigatorLanguage(options = {}) {
const { window: window2 = defaultWindow } = options;
const navigator = window2 == null ? void 0 : window2.navigator;
const isSupported = useSupported(() => navigator && "language" in navigator);
const language = ref(navigator == null ? void 0 : navigator.language);
useEventListener(window2, "languagechange", () => {
if (navigator)
language.value = navigator.language;
});
return {
isSupported,
language
};
}
function useNetwork(options = {}) {
const { window: window2 = defaultWindow } = options;
const navigator = window2 == null ? void 0 : window2.navigator;
const isSupported = useSupported(() => navigator && "connection" in navigator);
const isOnline = ref(true);
const saveData = ref(false);
const offlineAt = ref(void 0);
const onlineAt = ref(void 0);
const downlink = ref(void 0);
const downlinkMax = ref(void 0);
const rtt = ref(void 0);
const effectiveType = ref(void 0);
const type = ref("unknown");
const connection = isSupported.value && navigator.connection;
function updateNetworkInformation() {
if (!navigator)
return;
isOnline.value = navigator.onLine;
offlineAt.value = isOnline.value ? void 0 : Date.now();
onlineAt.value = isOnline.value ? Date.now() : void 0;
if (connection) {
downlink.value = connection.downlink;
downlinkMax.value = connection.downlinkMax;
effectiveType.value = connection.effectiveType;
rtt.value = connection.rtt;
saveData.value = connection.saveData;
type.value = connection.type;
}
}
if (window2) {
useEventListener(window2, "offline", () => {
isOnline.value = false;
offlineAt.value = Date.now();
});
useEventListener(window2, "online", () => {
isOnline.value = true;
onlineAt.value = Date.now();
});
}
if (connection)
useEventListener(connection, "change", updateNetworkInformation, false);
updateNetworkInformation();
return {
isSupported,
isOnline,
saveData,
offlineAt,
onlineAt,
downlink,
downlinkMax,
effectiveType,
rtt,
type
};
}
function useNow(options = {}) {
const {
controls: exposeControls = false,
interval = "requestAnimationFrame"
} = options;
const now = ref(/* @__PURE__ */ new Date());
const update = () => now.value = /* @__PURE__ */ new Date();
const controls = interval === "requestAnimationFrame" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });
if (exposeControls) {
return {
now,
...controls
};
} else {
return now;
}
}
function useObjectUrl(object) {
const url = ref();
const release = () => {
if (url.value)
URL.revokeObjectURL(url.value);
url.value = void 0;
};
watch(
() => toValue(object),
(newObject) => {
release();
if (newObject)
url.value = URL.createObjectURL(newObject);
},
{ immediate: true }
);
tryOnScopeDispose(release);
return readonly(url);
}
function useClamp(value, min, max) {
if (typeof value === "function" || isReadonly(value))
return computed(() => clamp(toValue(value), toValue(min), toValue(max)));
const _value = ref(value);
return computed({
get() {
return _value.value = clamp(_value.value, toValue(min), toValue(max));
},
set(value2) {
_value.value = clamp(value2, toValue(min), toValue(max));
}
});
}
function useOffsetPagination(options) {
const {
total = Number.POSITIVE_INFINITY,
pageSize = 10,
page = 1,
onPageChange = noop,
onPageSizeChange = noop,
onPageCountChange = noop
} = options;
const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);
const pageCount = computed(() => Math.max(
1,
Math.ceil(toValue(total) / toValue(currentPageSize))
));
const currentPage = useClamp(page, 1, pageCount);
const isFirstPage = computed(() => currentPage.value === 1);
const isLastPage = computed(() => currentPage.value === pageCount.value);
if (isRef(page)) {
syncRef(page, currentPage, {
direction: isReadonly(page) ? "ltr" : "both"
});
}
if (isRef(pageSize)) {
syncRef(pageSize, currentPageSize, {
direction: isReadonly(pageSize) ? "ltr" : "both"
});
}
function prev() {
currentPage.value--;
}
function next() {
currentPage.value++;
}
const returnValue = {
currentPage,
currentPageSize,
pageCount,
isFirstPage,
isLastPage,
prev,
next
};
watch(currentPage, () => {
onPageChange(reactive(returnValue));
});
watch(currentPageSize, () => {
onPageSizeChange(reactive(returnValue));
});
watch(pageCount, () => {
onPageCountChange(reactive(returnValue));
});
return returnValue;
}
function useOnline(options = {}) {
const { isOnline } = useNetwork(options);
return isOnline;
}
function usePageLeave(options = {}) {
const { window: window2 = defaultWindow } = options;
const isLeft = ref(false);
const handler = (event) => {
if (!window2)
return;
event = event || window2.event;
const from = event.relatedTarget || event.toElement;
isLeft.value = !from;
};
if (window2) {
useEventListener(window2, "mouseout", handler, { passive: true });
useEventListener(window2.document, "mouseleave", handler, { passive: true });
useEventListener(window2.document, "mouseenter", handler, { passive: true });
}
return isLeft;
}
function useScreenOrientation(options = {}) {
const {
window: window2 = defaultWindow
} = options;
const isSupported = useSupported(() => window2 && "screen" in window2 && "orientation" in window2.screen);
const screenOrientation = isSupported.value ? window2.screen.orientation : {};
const orientation = ref(screenOrientation.type);
const angle = ref(screenOrientation.angle || 0);
if (isSupported.value) {
useEventListener(window2, "orientationchange", () => {
orientation.value = screenOrientation.type;
angle.value = screenOrientation.angle;
});
}
const lockOrientation = (type) => {
if (isSupported.value && typeof screenOrientation.lock === "function")
return screenOrientation.lock(type);
return Promise.reject(new Error("Not supported"));
};
const unlockOrientation = () => {
if (isSupported.value && typeof screenOrientation.unlock === "function")
screenOrientation.unlock();
};
return {
isSupported,
orientation,
angle,
lockOrientation,
unlockOrientation
};
}
function useParallax(target, options = {}) {
const {
deviceOrientationTiltAdjust = (i) => i,
deviceOrientationRollAdjust = (i) => i,
mouseTiltAdjust = (i) => i,
mouseRollAdjust = (i) => i,
window: window2 = defaultWindow
} = options;
const orientation = reactive(useDeviceOrientation({ window: window2 }));
const screenOrientation = reactive(useScreenOrientation({ window: window2 }));
const {
elementX: x,
elementY: y,
elementWidth: width,
elementHeight: height
} = useMouseInElement(target, { handleOutside: false, window: window2 });
const source = computed(() => {
if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0))
return "deviceOrientation";
return "mouse";
});
const roll = computed(() => {
if (source.value === "deviceOrientation") {
let value;
switch (screenOrientation.orientation) {
case "landscape-primary":
value = orientation.gamma / 90;
break;
case "landscape-secondary":
value = -orientation.gamma / 90;
break;
case "portrait-primary":
value = -orientation.beta / 90;
break;
case "portrait-secondary":
value = orientation.beta / 90;
break;
default:
value = -orientation.beta / 90;
}
return deviceOrientationRollAdjust(value);
} else {
const value = -(y.value - height.value / 2) / height.value;
return mouseRollAdjust(value);
}
});
const tilt = computed(() => {
if (source.value === "deviceOrientation") {
let value;
switch (screenOrientation.orientation) {
case "landscape-primary":
value = orientation.beta / 90;
break;
case "landscape-secondary":
value = -orientation.beta / 90;
break;
case "portrait-primary":
value = orientation.gamma / 90;
break;
case "portrait-secondary":
value = -orientation.gamma / 90;
break;
default:
value = orientation.gamma / 90;
}
return deviceOrientationTiltAdjust(value);
} else {
const value = (x.value - width.value / 2) / width.value;
return mouseTiltAdjust(value);
}
});
return { roll, tilt, source };
}
function useParentElement(element = useCurrentElement()) {
const parentElement = shallowRef();
const update = () => {
const el = unrefElement(element);
if (el)
parentElement.value = el.parentElement;
};
tryOnMounted(update);
watch(() => toValue(element), update);
return parentElement;
}
function usePerformanceObserver(options, callback) {
const {
window: window2 = defaultWindow,
immediate = true,
...performanceOptions
} = options;
const isSupported = useSupported(() => window2 && "PerformanceObserver" in window2);
let observer;
const stop = () => {
observer == null ? void 0 : observer.disconnect();
};
const start = () => {
if (isSupported.value) {
stop();
observer = new PerformanceObserver(callback);
observer.observe(performanceOptions);
}
};
tryOnScopeDispose(stop);
if (immediate)
start();
return {
isSupported,
start,
stop
};
}
const defaultState = {
x: 0,
y: 0,
pointerId: 0,
pressure: 0,
tiltX: 0,
tiltY: 0,
width: 0,
height: 0,
twist: 0,
pointerType: null
};
const keys = /* @__PURE__ */ Object.keys(defaultState);
function usePointer(options = {}) {
const {
target = defaultWindow
} = options;
const isInside = ref(false);
const state = ref(options.initialValue || {});
Object.assign(state.value, defaultState, state.value);
const handler = (event) => {
isInside.value = true;
if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))
return;
state.value = objectPick(event, keys, false);
};
if (target) {
const listenerOptions = { passive: true };
useEventListener(target, ["pointerdown", "pointermove", "pointerup"], handler, listenerOptions);
useEventListener(target, "pointerleave", () => isInside.value = false, listenerOptions);
}
return {
...toRefs(state),
isInside
};
}
function usePointerLock(target, options = {}) {
const { document: document2 = defaultDocument } = options;
const isSupported = useSupported(() => document2 && "pointerLockElement" in document2);
const element = ref();
const triggerElement = ref();
let targetElement;
if (isSupported.value) {
useEventListener(document2, "pointerlockchange", () => {
var _a;
const currentElement = (_a = document2.pointerLockElement) != null ? _a : element.value;
if (targetElement && currentElement === targetElement) {
element.value = document2.pointerLockElement;
if (!element.value)
targetElement = triggerElement.value = null;
}
});
useEventListener(document2, "pointerlockerror", () => {
var _a;
const currentElement = (_a = document2.pointerLockElement) != null ? _a : element.value;
if (targetElement && currentElement === targetElement) {
const action = document2.pointerLockElement ? "release" : "acquire";
throw new Error(`Failed to ${action} pointer lock.`);
}
});
}
async function lock(e) {
var _a;
if (!isSupported.value)
throw new Error("Pointer Lock API is not supported by your browser.");
triggerElement.value = e instanceof Event ? e.currentTarget : null;
targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);
if (!targetElement)
throw new Error("Target element undefined.");
targetElement.requestPointerLock();
return await until(element).toBe(targetElement);
}
async function unlock() {
if (!element.value)
return false;
document2.exitPointerLock();
await until(element).toBeNull();
return true;
}
return {
isSupported,
element,
triggerElement,
lock,
unlock
};
}
function usePointerSwipe(target, options = {}) {
const targetRef = toRef(target);
const {
threshold = 50,
onSwipe,
onSwipeEnd,
onSwipeStart,
disableTextSelect = false
} = options;
const posStart = reactive({ x: 0, y: 0 });
const updatePosStart = (x, y) => {
posStart.x = x;
posStart.y = y;
};
const posEnd = reactive({ x: 0, y: 0 });
const updatePosEnd = (x, y) => {
posEnd.x = x;
posEnd.y = y;
};
const distanceX = computed(() => posStart.x - posEnd.x);
const distanceY = computed(() => posStart.y - posEnd.y);
const { max, abs } = Math;
const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);
const isSwiping = ref(false);
const isPointerDown = ref(false);
const direction = computed(() => {
if (!isThresholdExceeded.value)
return "none";
if (abs(distanceX.value) > abs(distanceY.value)) {
return distanceX.value > 0 ? "left" : "right";
} else {
return distanceY.value > 0 ? "up" : "down";
}
});
const eventIsAllowed = (e) => {
var _a, _b, _c;
const isReleasingButton = e.buttons === 0;
const isPrimaryButton = e.buttons === 1;
return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;
};
const stops = [
useEventListener(target, "pointerdown", (e) => {
if (!eventIsAllowed(e))
return;
isPointerDown.value = true;
const eventTarget = e.target;
eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);
const { clientX: x, clientY: y } = e;
updatePosStart(x, y);
updatePosEnd(x, y);
onSwipeStart == null ? void 0 : onSwipeStart(e);
}),
useEventListener(target, "pointermove", (e) => {
if (!eventIsAllowed(e))
return;
if (!isPointerDown.value)
return;
const { clientX: x, clientY: y } = e;
updatePosEnd(x, y);
if (!isSwiping.value && isThresholdExceeded.value)
isSwiping.value = true;
if (isSwiping.value)
onSwipe == null ? void 0 : onSwipe(e);
}),
useEventListener(target, "pointerup", (e) => {
if (!eventIsAllowed(e))
return;
if (isSwiping.value)
onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);
isPointerDown.value = false;
isSwiping.value = false;
})
];
tryOnMounted(() => {
var _a, _b, _c, _d, _e, _f, _g, _h;
(_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty("touch-action", "none");
if (disableTextSelect) {
(_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty("-webkit-user-select", "none");
(_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty("-ms-user-select", "none");
(_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty("user-select", "none");
}
});
const stop = () => stops.forEach((s) => s());
return {
isSwiping: readonly(isSwiping),
direction: readonly(direction),
posStart: readonly(posStart),
posEnd: readonly(posEnd),
distanceX,
distanceY,
stop
};
}
function usePreferredColorScheme(options) {
const isLight = useMediaQuery("(prefers-color-scheme: light)", options);
const isDark = useMediaQuery("(prefers-color-scheme: dark)", options);
return computed(() => {
if (isDark.value)
return "dark";
if (isLight.value)
return "light";
return "no-preference";
});
}
function usePreferredContrast(options) {
const isMore = useMediaQuery("(prefers-contrast: more)", options);
const isLess = useMediaQuery("(prefers-contrast: less)", options);
const isCustom = useMediaQuery("(prefers-contrast: custom)", options);
return computed(() => {
if (isMore.value)
return "more";
if (isLess.value)
return "less";
if (isCustom.value)
return "custom";
return "no-preference";
});
}
function usePreferredLanguages(options = {}) {
const { window: window2 = defaultWindow } = options;
if (!window2)
return ref(["en"]);
const navigator = window2.navigator;
const value = ref(navigator.languages);
useEventListener(window2, "languagechange", () => {
value.value = navigator.languages;
});
return value;
}
function usePreferredReducedMotion(options) {
const isReduced = useMediaQuery("(prefers-reduced-motion: reduce)", options);
return computed(() => {
if (isReduced.value)
return "reduce";
return "no-preference";
});
}
function usePrevious(value, initialValue) {
const previous = shallowRef(initialValue);
watch(
toRef(value),
(_, oldValue) => {
previous.value = oldValue;
},
{ flush: "sync" }
);
return readonly(previous);
}
const topVarName = "--vueuse-safe-area-top";
const rightVarName = "--vueuse-safe-area-right";
const bottomVarName = "--vueuse-safe-area-bottom";
const leftVarName = "--vueuse-safe-area-left";
function useScreenSafeArea() {
const top = ref("");
const right = ref("");
const bottom = ref("");
const left = ref("");
if (isClient) {
const topCssVar = useCssVar(topVarName);
const rightCssVar = useCssVar(rightVarName);
const bottomCssVar = useCssVar(bottomVarName);
const leftCssVar = useCssVar(leftVarName);
topCssVar.value = "env(safe-area-inset-top, 0px)";
rightCssVar.value = "env(safe-area-inset-right, 0px)";
bottomCssVar.value = "env(safe-area-inset-bottom, 0px)";
leftCssVar.value = "env(safe-area-inset-left, 0px)";
update();
useEventListener("resize", useDebounceFn(update));
}
function update() {
top.value = getValue(topVarName);
right.value = getValue(rightVarName);
bottom.value = getValue(bottomVarName);
left.value = getValue(leftVarName);
}
return {
top,
right,
bottom,
left,
update
};
}
function getValue(position) {
return getComputedStyle(document.documentElement).getPropertyValue(position);
}
function useScriptTag(src, onLoaded = noop, options = {}) {
const {
immediate = true,
manual = false,
type = "text/javascript",
async = true,
crossOrigin,
referrerPolicy,
noModule,
defer,
document: document2 = defaultDocument,
attrs = {}
} = options;
const scriptTag = ref(null);
let _promise = null;
const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {
const resolveWithElement = (el2) => {
scriptTag.value = el2;
resolve(el2);
return el2;
};
if (!document2) {
resolve(false);
return;
}
let shouldAppend = false;
let el = document2.querySelector(`script[src="${toValue(src)}"]`);
if (!el) {
el = document2.createElement("script");
el.type = type;
el.async = async;
el.src = toValue(src);
if (defer)
el.defer = defer;
if (crossOrigin)
el.crossOrigin = crossOrigin;
if (noModule)
el.noModule = noModule;
if (referrerPolicy)
el.referrerPolicy = referrerPolicy;
Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));
shouldAppend = true;
} else if (el.hasAttribute("data-loaded")) {
resolveWithElement(el);
}
el.addEventListener("error", (event) => reject(event));
el.addEventListener("abort", (event) => reject(event));
el.addEventListener("load", () => {
el.setAttribute("data-loaded", "true");
onLoaded(el);
resolveWithElement(el);
});
if (shouldAppend)
el = document2.head.appendChild(el);
if (!waitForScriptLoad)
resolveWithElement(el);
});
const load = (waitForScriptLoad = true) => {
if (!_promise)
_promise = loadScript(waitForScriptLoad);
return _promise;
};
const unload = () => {
if (!document2)
return;
_promise = null;
if (scriptTag.value)
scriptTag.value = null;
const el = document2.querySelector(`script[src="${toValue(src)}"]`);
if (el)
document2.head.removeChild(el);
};
if (immediate && !manual)
tryOnMounted(load);
if (!manual)
tryOnUnmounted(unload);
return { scriptTag, load, unload };
}
function checkOverflowScroll(ele) {
const style = window.getComputedStyle(ele);
if (style.overflowX === "scroll" || style.overflowY === "scroll" || style.overflowX === "auto" && ele.clientWidth < ele.scrollWidth || style.overflowY === "auto" && ele.clientHeight < ele.scrollHeight) {
return true;
} else {
const parent = ele.parentNode;
if (!parent || parent.tagName === "BODY")
return false;
return checkOverflowScroll(parent);
}
}
function preventDefault(rawEvent) {
const e = rawEvent || window.event;
const _target = e.target;
if (checkOverflowScroll(_target))
return false;
if (e.touches.length > 1)
return true;
if (e.preventDefault)
e.preventDefault();
return false;
}
const elInitialOverflow = /* @__PURE__ */ new WeakMap();
function useScrollLock(element, initialState = false) {
const isLocked = ref(initialState);
let stopTouchMoveListener = null;
watch(toRef(element), (el) => {
const target = resolveElement(toValue(el));
if (target) {
const ele = target;
if (!elInitialOverflow.get(ele))
elInitialOverflow.set(ele, ele.style.overflow);
if (isLocked.value)
ele.style.overflow = "hidden";
}
}, {
immediate: true
});
const lock = () => {
const el = resolveElement(toValue(element));
if (!el || isLocked.value)
return;
if (isIOS) {
stopTouchMoveListener = useEventListener(
el,
"touchmove",
(e) => {
preventDefault(e);
},
{ passive: false }
);
}
el.style.overflow = "hidden";
isLocked.value = true;
};
const unlock = () => {
var _a;
const el = resolveElement(toValue(element));
if (!el || !isLocked.value)
return;
isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());
el.style.overflow = (_a = elInitialOverflow.get(el)) != null ? _a : "";
elInitialOverflow.delete(el);
isLocked.value = false;
};
tryOnScopeDispose(unlock);
return computed({
get() {
return isLocked.value;
},
set(v) {
if (v)
lock();
else
unlock();
}
});
}
function useSessionStorage(key, initialValue, options = {}) {
const { window: window2 = defaultWindow } = options;
return useStorage(key, initialValue, window2 == null ? void 0 : window2.sessionStorage, options);
}
function useShare(shareOptions = {}, options = {}) {
const { navigator = defaultNavigator } = options;
const _navigator = navigator;
const isSupported = useSupported(() => _navigator && "canShare" in _navigator);
const share = async (overrideOptions = {}) => {
if (isSupported.value) {
const data = {
...toValue(shareOptions),
...toValue(overrideOptions)
};
let granted = true;
if (data.files && _navigator.canShare)
granted = _navigator.canShare({ files: data.files });
if (granted)
return _navigator.share(data);
}
};
return {
isSupported,
share
};
}
const defaultSortFn = (source, compareFn) => source.sort(compareFn);
const defaultCompare = (a, b) => a - b;
function useSorted(...args) {
var _a, _b, _c, _d;
const [source] = args;
let compareFn = defaultCompare;
let options = {};
if (args.length === 2) {
if (typeof args[1] === "object") {
options = args[1];
compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;
} else {
compareFn = (_b = args[1]) != null ? _b : defaultCompare;
}
} else if (args.length > 2) {
compareFn = (_c = args[1]) != null ? _c : defaultCompare;
options = (_d = args[2]) != null ? _d : {};
}
const {
dirty = false,
sortFn = defaultSortFn
} = options;
if (!dirty)
return computed(() => sortFn([...toValue(source)], compareFn));
watchEffect(() => {
const result = sortFn(toValue(source), compareFn);
if (isRef(source))
source.value = result;
else
source.splice(0, source.length, ...result);
});
return source;
}
function useSpeechRecognition(options = {}) {
const {
interimResults = true,
continuous = true,
window: window2 = defaultWindow
} = options;
const lang = toRef(options.lang || "en-US");
const isListening = ref(false);
const isFinal = ref(false);
const result = ref("");
const error = shallowRef(void 0);
const toggle = (value = !isListening.value) => {
isListening.value = value;
};
const start = () => {
isListening.value = true;
};
const stop = () => {
isListening.value = false;
};
const SpeechRecognition = window2 && (window2.SpeechRecognition || window2.webkitSpeechRecognition);
const isSupported = useSupported(() => SpeechRecognition);
let recognition;
if (isSupported.value) {
recognition = new SpeechRecognition();
recognition.continuous = continuous;
recognition.interimResults = interimResults;
recognition.lang = toValue(lang);
recognition.onstart = () => {
isFinal.value = false;
};
watch(lang, (lang2) => {
if (recognition && !isListening.value)
recognition.lang = lang2;
});
recognition.onresult = (event) => {
const transcript = Array.from(event.results).map((result2) => {
isFinal.value = result2.isFinal;
return result2[0];
}).map((result2) => result2.transcript).join("");
result.value = transcript;
error.value = void 0;
};
recognition.onerror = (event) => {
error.value = event;
};
recognition.onend = () => {
isListening.value = false;
recognition.lang = toValue(lang);
};
watch(isListening, () => {
if (isListening.value)
recognition.start();
else
recognition.stop();
});
}
tryOnScopeDispose(() => {
isListening.value = false;
});
return {
isSupported,
isListening,
isFinal,
recognition,
result,
error,
toggle,
start,
stop
};
}
function useSpeechSynthesis(text, options = {}) {
const {
pitch = 1,
rate = 1,
volume = 1,
window: window2 = defaultWindow
} = options;
const synth = window2 && window2.speechSynthesis;
const isSupported = useSupported(() => synth);
const isPlaying = ref(false);
const status = ref("init");
const spokenText = toRef(text || "");
const lang = toRef(options.lang || "en-US");
const error = shallowRef(void 0);
const toggle = (value = !isPlaying.value) => {
isPlaying.value = value;
};
const bindEventsForUtterance = (utterance2) => {
utterance2.lang = toValue(lang);
utterance2.voice = toValue(options.voice) || null;
utterance2.pitch = toValue(pitch);
utterance2.rate = toValue(rate);
utterance2.volume = volume;
utterance2.onstart = () => {
isPlaying.value = true;
status.value = "play";
};
utterance2.onpause = () => {
isPlaying.value = false;
status.value = "pause";
};
utterance2.onresume = () => {
isPlaying.value = true;
status.value = "play";
};
utterance2.onend = () => {
isPlaying.value = false;
status.value = "end";
};
utterance2.onerror = (event) => {
error.value = event;
};
};
const utterance = computed(() => {
isPlaying.value = false;
status.value = "init";
const newUtterance = new SpeechSynthesisUtterance(spokenText.value);
bindEventsForUtterance(newUtterance);
return newUtterance;
});
const speak = () => {
synth.cancel();
utterance && synth.speak(utterance.value);
};
const stop = () => {
synth.cancel();
isPlaying.value = false;
};
if (isSupported.value) {
bindEventsForUtterance(utterance.value);
watch(lang, (lang2) => {
if (utterance.value && !isPlaying.value)
utterance.value.lang = lang2;
});
if (options.voice) {
watch(options.voice, () => {
synth.cancel();
});
}
watch(isPlaying, () => {
if (isPlaying.value)
synth.resume();
else
synth.pause();
});
}
tryOnScopeDispose(() => {
isPlaying.value = false;
});
return {
isSupported,
isPlaying,
status,
utterance,
error,
stop,
toggle,
speak
};
}
function useStepper(steps, initialStep) {
const stepsRef = ref(steps);
const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));
const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));
const current = computed(() => at(index.value));
const isFirst = computed(() => index.value === 0);
const isLast = computed(() => index.value === stepNames.value.length - 1);
const next = computed(() => stepNames.value[index.value + 1]);
const previous = computed(() => stepNames.value[index.value - 1]);
function at(index2) {
if (Array.isArray(stepsRef.value))
return stepsRef.value[index2];
return stepsRef.value[stepNames.value[index2]];
}
function get(step) {
if (!stepNames.value.includes(step))
return;
return at(stepNames.value.indexOf(step));
}
function goTo(step) {
if (stepNames.value.includes(step))
index.value = stepNames.value.indexOf(step);
}
function goToNext() {
if (isLast.value)
return;
index.value++;
}
function goToPrevious() {
if (isFirst.value)
return;
index.value--;
}
function goBackTo(step) {
if (isAfter(step))
goTo(step);
}
function isNext(step) {
return stepNames.value.indexOf(step) === index.value + 1;
}
function isPrevious(step) {
return stepNames.value.indexOf(step) === index.value - 1;
}
function isCurrent(step) {
return stepNames.value.indexOf(step) === index.value;
}
function isBefore(step) {
return index.value < stepNames.value.indexOf(step);
}
function isAfter(step) {
return index.value > stepNames.value.indexOf(step);
}
return {
steps: stepsRef,
stepNames,
index,
current,
next,
previous,
isFirst,
isLast,
at,
get,
goTo,
goToNext,
goToPrevious,
goBackTo,
isNext,
isPrevious,
isCurrent,
isBefore,
isAfter
};
}
function useStorageAsync(key, initialValue, storage, options = {}) {
var _a;
const {
flush = "pre",
deep = true,
listenToStorageChanges = true,
writeDefaults = true,
mergeDefaults = false,
shallow,
window: window2 = defaultWindow,
eventFilter,
onError = (e) => {
console.error(e);
}
} = options;
const rawInit = toValue(initialValue);
const type = guessSerializerType(rawInit);
const data = (shallow ? shallowRef : ref)(initialValue);
const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
if (!storage) {
try {
storage = getSSRHandler("getDefaultStorageAsync", () => {
var _a2;
return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
})();
} catch (e) {
onError(e);
}
}
async function read(event) {
if (!storage || event && event.key !== key)
return;
try {
const rawValue = event ? event.newValue : await storage.getItem(key);
if (rawValue == null) {
data.value = rawInit;
if (writeDefaults && rawInit !== null)
await storage.setItem(key, await serializer.write(rawInit));
} else if (mergeDefaults) {
const value = await serializer.read(rawValue);
if (typeof mergeDefaults === "function")
data.value = mergeDefaults(value, rawInit);
else if (type === "object" && !Array.isArray(value))
data.value = { ...rawInit, ...value };
else
data.value = value;
} else {
data.value = await serializer.read(rawValue);
}
} catch (e) {
onError(e);
}
}
read();
if (window2 && listenToStorageChanges)
useEventListener(window2, "storage", (e) => Promise.resolve().then(() => read(e)));
if (storage) {
watchWithFilter(
data,
async () => {
try {
if (data.value == null)
await storage.removeItem(key);
else
await storage.setItem(key, await serializer.write(data.value));
} catch (e) {
onError(e);
}
},
{
flush,
deep,
eventFilter
}
);
}
return data;
}
let _id = 0;
function useStyleTag(css, options = {}) {
const isLoaded = ref(false);
const {
document: document2 = defaultDocument,
immediate = true,
manual = false,
id = `vueuse_styletag_${++_id}`
} = options;
const cssRef = ref(css);
let stop = () => {
};
const load = () => {
if (!document2)
return;
const el = document2.getElementById(id) || document2.createElement("style");
if (!el.isConnected) {
el.id = id;
if (options.media)
el.media = options.media;
document2.head.appendChild(el);
}
if (isLoaded.value)
return;
stop = watch(
cssRef,
(value) => {
el.textContent = value;
},
{ immediate: true }
);
isLoaded.value = true;
};
const unload = () => {
if (!document2 || !isLoaded.value)
return;
stop();
document2.head.removeChild(document2.getElementById(id));
isLoaded.value = false;
};
if (immediate && !manual)
tryOnMounted(load);
if (!manual)
tryOnScopeDispose(unload);
return {
id,
css: cssRef,
unload,
load,
isLoaded: readonly(isLoaded)
};
}
function useSwipe(target, options = {}) {
const {
threshold = 50,
onSwipe,
onSwipeEnd,
onSwipeStart,
passive = true,
window: window2 = defaultWindow
} = options;
const coordsStart = reactive({ x: 0, y: 0 });
const coordsEnd = reactive({ x: 0, y: 0 });
const diffX = computed(() => coordsStart.x - coordsEnd.x);
const diffY = computed(() => coordsStart.y - coordsEnd.y);
const { max, abs } = Math;
const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);
const isSwiping = ref(false);
const direction = computed(() => {
if (!isThresholdExceeded.value)
return "none";
if (abs(diffX.value) > abs(diffY.value)) {
return diffX.value > 0 ? "left" : "right";
} else {
return diffY.value > 0 ? "up" : "down";
}
});
const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];
const updateCoordsStart = (x, y) => {
coordsStart.x = x;
coordsStart.y = y;
};
const updateCoordsEnd = (x, y) => {
coordsEnd.x = x;
coordsEnd.y = y;
};
let listenerOptions;
const isPassiveEventSupported = checkPassiveEventSupport(window2 == null ? void 0 : window2.document);
if (!passive)
listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };
else
listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };
const onTouchEnd = (e) => {
if (isSwiping.value)
onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);
isSwiping.value = false;
};
const stops = [
useEventListener(target, "touchstart", (e) => {
if (e.touches.length !== 1)
return;
if (listenerOptions.capture && !listenerOptions.passive)
e.preventDefault();
const [x, y] = getTouchEventCoords(e);
updateCoordsStart(x, y);
updateCoordsEnd(x, y);
onSwipeStart == null ? void 0 : onSwipeStart(e);
}, listenerOptions),
useEventListener(target, "touchmove", (e) => {
if (e.touches.length !== 1)
return;
const [x, y] = getTouchEventCoords(e);
updateCoordsEnd(x, y);
if (!isSwiping.value && isThresholdExceeded.value)
isSwiping.value = true;
if (isSwiping.value)
onSwipe == null ? void 0 : onSwipe(e);
}, listenerOptions),
useEventListener(target, ["touchend", "touchcancel"], onTouchEnd, listenerOptions)
];
const stop = () => stops.forEach((s) => s());
return {
isPassiveEventSupported,
isSwiping,
direction,
coordsStart,
coordsEnd,
lengthX: diffX,
lengthY: diffY,
stop
};
}
function checkPassiveEventSupport(document2) {
if (!document2)
return false;
let supportsPassive = false;
const optionsBlock = {
get passive() {
supportsPassive = true;
return false;
}
};
document2.addEventListener("x", noop, optionsBlock);
document2.removeEventListener("x", noop);
return supportsPassive;
}
function useTemplateRefsList() {
const refs = ref([]);
refs.value.set = (el) => {
if (el)
refs.value.push(el);
};
onBeforeUpdate(() => {
refs.value.length = 0;
});
return refs;
}
function useTextDirection(options = {}) {
const {
document: document2 = defaultDocument,
selector = "html",
observe = false,
initialValue = "ltr"
} = options;
function getValue2() {
var _a, _b;
return (_b = (_a = document2 == null ? void 0 : document2.querySelector(selector)) == null ? void 0 : _a.getAttribute("dir")) != null ? _b : initialValue;
}
const dir = ref(getValue2());
tryOnMounted(() => dir.value = getValue2());
if (observe && document2) {
useMutationObserver(
document2.querySelector(selector),
() => dir.value = getValue2(),
{ attributes: true }
);
}
return computed({
get() {
return dir.value;
},
set(v) {
var _a, _b;
dir.value = v;
if (!document2)
return;
if (dir.value)
(_a = document2.querySelector(selector)) == null ? void 0 : _a.setAttribute("dir", dir.value);
else
(_b = document2.querySelector(selector)) == null ? void 0 : _b.removeAttribute("dir");
}
});
}
function getRangesFromSelection(selection) {
var _a;
const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;
return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));
}
function useTextSelection(options = {}) {
const {
window: window2 = defaultWindow
} = options;
const selection = ref(null);
const text = computed(() => {
var _a, _b;
return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : "";
});
const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);
const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));
function onSelectionChange() {
selection.value = null;
if (window2)
selection.value = window2.getSelection();
}
if (window2)
useEventListener(window2.document, "selectionchange", onSelectionChange);
return {
text,
rects,
ranges,
selection
};
}
function useTextareaAutosize(options) {
var _a;
const textarea = ref(options == null ? void 0 : options.element);
const input = ref(options == null ? void 0 : options.input);
const styleProp = (_a = options == null ? void 0 : options.styleProp) != null ? _a : "height";
const textareaScrollHeight = ref(1);
function triggerResize() {
var _a2, _b;
if (!textarea.value)
return;
let height = "";
textarea.value.style[styleProp] = "1px";
textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;
if (options == null ? void 0 : options.styleTarget)
toValue(options.styleTarget).style[styleProp] = `${textareaScrollHeight.value}px`;
else
height = `${textareaScrollHeight.value}px`;
textarea.value.style[styleProp] = height;
(_b = options == null ? void 0 : options.onResize) == null ? void 0 : _b.call(options);
}
watch([input, textarea], () => nextTick(triggerResize), { immediate: true });
useResizeObserver(textarea, () => triggerResize());
if (options == null ? void 0 : options.watch)
watch(options.watch, triggerResize, { immediate: true, deep: true });
return {
textarea,
input,
triggerResize
};
}
function useThrottledRefHistory(source, options = {}) {
const { throttle = 200, trailing = true } = options;
const filter = throttleFilter(throttle, trailing);
const history = useRefHistory(source, { ...options, eventFilter: filter });
return {
...history
};
}
const DEFAULT_UNITS = [
{ max: 6e4, value: 1e3, name: "second" },
{ max: 276e4, value: 6e4, name: "minute" },
{ max: 72e6, value: 36e5, name: "hour" },
{ max: 5184e5, value: 864e5, name: "day" },
{ max: 24192e5, value: 6048e5, name: "week" },
{ max: 28512e6, value: 2592e6, name: "month" },
{ max: Number.POSITIVE_INFINITY, value: 31536e6, name: "year" }
];
const DEFAULT_MESSAGES = {
justNow: "just now",
past: (n) => n.match(/\d/) ? `${n} ago` : n,
future: (n) => n.match(/\d/) ? `in ${n}` : n,
month: (n, past) => n === 1 ? past ? "last month" : "next month" : `${n} month${n > 1 ? "s" : ""}`,
year: (n, past) => n === 1 ? past ? "last year" : "next year" : `${n} year${n > 1 ? "s" : ""}`,
day: (n, past) => n === 1 ? past ? "yesterday" : "tomorrow" : `${n} day${n > 1 ? "s" : ""}`,
week: (n, past) => n === 1 ? past ? "last week" : "next week" : `${n} week${n > 1 ? "s" : ""}`,
hour: (n) => `${n} hour${n > 1 ? "s" : ""}`,
minute: (n) => `${n} minute${n > 1 ? "s" : ""}`,
second: (n) => `${n} second${n > 1 ? "s" : ""}`,
invalid: ""
};
function DEFAULT_FORMATTER(date) {
return date.toISOString().slice(0, 10);
}
function useTimeAgo(time, options = {}) {
const {
controls: exposeControls = false,
updateInterval = 3e4
} = options;
const { now, ...controls } = useNow({ interval: updateInterval, controls: true });
const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));
if (exposeControls) {
return {
timeAgo,
...controls
};
} else {
return timeAgo;
}
}
function formatTimeAgo(from, options = {}, now = Date.now()) {
var _a;
const {
max,
messages = DEFAULT_MESSAGES,
fullDateFormatter = DEFAULT_FORMATTER,
units = DEFAULT_UNITS,
showSecond = false,
rounding = "round"
} = options;
const roundFn = typeof rounding === "number" ? (n) => +n.toFixed(rounding) : Math[rounding];
const diff = +now - +from;
const absDiff = Math.abs(diff);
function getValue2(diff2, unit) {
return roundFn(Math.abs(diff2) / unit.value);
}
function format(diff2, unit) {
const val = getValue2(diff2, unit);
const past = diff2 > 0;
const str = applyFormat(unit.name, val, past);
return applyFormat(past ? "past" : "future", str, past);
}
function applyFormat(name, val, isPast) {
const formatter = messages[name];
if (typeof formatter === "function")
return formatter(val, isPast);
return formatter.replace("{0}", val.toString());
}
if (absDiff < 6e4 && !showSecond)
return messages.justNow;
if (typeof max === "number" && absDiff > max)
return fullDateFormatter(new Date(from));
if (typeof max === "string") {
const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;
if (unitMax && absDiff > unitMax)
return fullDateFormatter(new Date(from));
}
for (const [idx, unit] of units.entries()) {
const val = getValue2(diff, unit);
if (val <= 0 && units[idx - 1])
return format(diff, units[idx - 1]);
if (absDiff < unit.max)
return format(diff, unit);
}
return messages.invalid;
}
function useTimeoutPoll(fn, interval, timeoutPollOptions) {
const { start } = useTimeoutFn(loop, interval, { immediate: false });
const isActive = ref(false);
async function loop() {
if (!isActive.value)
return;
await fn();
start();
}
function resume() {
if (!isActive.value) {
isActive.value = true;
loop();
}
}
function pause() {
isActive.value = false;
}
if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)
resume();
tryOnScopeDispose(pause);
return {
isActive,
pause,
resume
};
}
function useTimestamp(options = {}) {
const {
controls: exposeControls = false,
offset = 0,
immediate = true,
interval = "requestAnimationFrame",
callback
} = options;
const ts = ref(timestamp() + offset);
const update = () => ts.value = timestamp() + offset;
const cb = callback ? () => {
update();
callback(ts.value);
} : update;
const controls = interval === "requestAnimationFrame" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });
if (exposeControls) {
return {
timestamp: ts,
...controls
};
} else {
return ts;
}
}
function useTitle(newTitle = null, options = {}) {
var _a, _b, _c;
const {
document: document2 = defaultDocument,
restoreOnUnmount = (t) => t
} = options;
const originalTitle = (_a = document2 == null ? void 0 : document2.title) != null ? _a : "";
const title = toRef((_b = newTitle != null ? newTitle : document2 == null ? void 0 : document2.title) != null ? _b : null);
const isReadonly2 = newTitle && typeof newTitle === "function";
function format(t) {
if (!("titleTemplate" in options))
return t;
const template = options.titleTemplate || "%s";
return typeof template === "function" ? template(t) : toValue(template).replace(/%s/g, t);
}
watch(
title,
(t, o) => {
if (t !== o && document2)
document2.title = format(typeof t === "string" ? t : "");
},
{ immediate: true }
);
if (options.observe && !options.titleTemplate && document2 && !isReadonly2) {
useMutationObserver(
(_c = document2.head) == null ? void 0 : _c.querySelector("title"),
() => {
if (document2 && document2.title !== title.value)
title.value = format(document2.title);
},
{ childList: true }
);
}
tryOnBeforeUnmount(() => {
if (restoreOnUnmount) {
const restoredTitle = restoreOnUnmount(originalTitle, title.value || "");
if (restoredTitle != null && document2)
document2.title = restoredTitle;
}
});
return title;
}
const _TransitionPresets = {
easeInSine: [0.12, 0, 0.39, 0],
easeOutSine: [0.61, 1, 0.88, 1],
easeInOutSine: [0.37, 0, 0.63, 1],
easeInQuad: [0.11, 0, 0.5, 0],
easeOutQuad: [0.5, 1, 0.89, 1],
easeInOutQuad: [0.45, 0, 0.55, 1],
easeInCubic: [0.32, 0, 0.67, 0],
easeOutCubic: [0.33, 1, 0.68, 1],
easeInOutCubic: [0.65, 0, 0.35, 1],
easeInQuart: [0.5, 0, 0.75, 0],
easeOutQuart: [0.25, 1, 0.5, 1],
easeInOutQuart: [0.76, 0, 0.24, 1],
easeInQuint: [0.64, 0, 0.78, 0],
easeOutQuint: [0.22, 1, 0.36, 1],
easeInOutQuint: [0.83, 0, 0.17, 1],
easeInExpo: [0.7, 0, 0.84, 0],
easeOutExpo: [0.16, 1, 0.3, 1],
easeInOutExpo: [0.87, 0, 0.13, 1],
easeInCirc: [0.55, 0, 1, 0.45],
easeOutCirc: [0, 0.55, 0.45, 1],
easeInOutCirc: [0.85, 0, 0.15, 1],
easeInBack: [0.36, 0, 0.66, -0.56],
easeOutBack: [0.34, 1.56, 0.64, 1],
easeInOutBack: [0.68, -0.6, 0.32, 1.6]
};
const TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);
function createEasingFunction([p0, p1, p2, p3]) {
const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;
const b = (a1, a2) => 3 * a2 - 6 * a1;
const c = (a1) => 3 * a1;
const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;
const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);
const getTforX = (x) => {
let aGuessT = x;
for (let i = 0; i < 4; ++i) {
const currentSlope = getSlope(aGuessT, p0, p2);
if (currentSlope === 0)
return aGuessT;
const currentX = calcBezier(aGuessT, p0, p2) - x;
aGuessT -= currentX / currentSlope;
}
return aGuessT;
};
return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);
}
function lerp(a, b, alpha) {
return a + alpha * (b - a);
}
function toVec(t) {
return (typeof t === "number" ? [t] : t) || [];
}
function executeTransition(source, from, to, options = {}) {
var _a, _b;
const fromVal = toValue(from);
const toVal = toValue(to);
const v1 = toVec(fromVal);
const v2 = toVec(toVal);
const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;
const startedAt = Date.now();
const endAt = Date.now() + duration;
const trans = typeof options.transition === "function" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;
const ease = typeof trans === "function" ? trans : createEasingFunction(trans);
return new Promise((resolve) => {
source.value = fromVal;
const tick = () => {
var _a2;
if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {
resolve();
return;
}
const now = Date.now();
const alpha = ease((now - startedAt) / duration);
const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));
if (Array.isArray(source.value))
source.value = arr.map((n, i) => {
var _a3, _b2;
return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);
});
else if (typeof source.value === "number")
source.value = arr[0];
if (now < endAt) {
requestAnimationFrame(tick);
} else {
source.value = toVal;
resolve();
}
};
tick();
});
}
function useTransition(source, options = {}) {
let currentId = 0;
const sourceVal = () => {
const v = toValue(source);
return typeof v === "number" ? v : v.map(toValue);
};
const outputRef = ref(sourceVal());
watch(sourceVal, async (to) => {
var _a, _b;
if (toValue(options.disabled))
return;
const id = ++currentId;
if (options.delay)
await promiseTimeout(toValue(options.delay));
if (id !== currentId)
return;
const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);
(_a = options.onStarted) == null ? void 0 : _a.call(options);
await executeTransition(outputRef, outputRef.value, toVal, {
...options,
abort: () => {
var _a2;
return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));
}
});
(_b = options.onFinished) == null ? void 0 : _b.call(options);
}, { deep: true });
watch(() => toValue(options.disabled), (disabled) => {
if (disabled) {
currentId++;
outputRef.value = sourceVal();
}
});
tryOnScopeDispose(() => {
currentId++;
});
return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);
}
function useUrlSearchParams(mode = "history", options = {}) {
const {
initialValue = {},
removeNullishValues = true,
removeFalsyValues = false,
write: enableWrite = true,
window: window2 = defaultWindow
} = options;
if (!window2)
return reactive(initialValue);
const state = reactive({});
function getRawParams() {
if (mode === "history") {
return window2.location.search || "";
} else if (mode === "hash") {
const hash = window2.location.hash || "";
const index = hash.indexOf("?");
return index > 0 ? hash.slice(index) : "";
} else {
return (window2.location.hash || "").replace(/^#/, "");
}
}
function constructQuery(params) {
const stringified = params.toString();
if (mode === "history")
return `${stringified ? `?${stringified}` : ""}${window2.location.hash || ""}`;
if (mode === "hash-params")
return `${window2.location.search || ""}${stringified ? `#${stringified}` : ""}`;
const hash = window2.location.hash || "#";
const index = hash.indexOf("?");
if (index > 0)
return `${hash.slice(0, index)}${stringified ? `?${stringified}` : ""}`;
return `${hash}${stringified ? `?${stringified}` : ""}`;
}
function read() {
return new URLSearchParams(getRawParams());
}
function updateState(params) {
const unusedKeys = new Set(Object.keys(state));
for (const key of params.keys()) {
const paramsForKey = params.getAll(key);
state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || "";
unusedKeys.delete(key);
}
Array.from(unusedKeys).forEach((key) => delete state[key]);
}
const { pause, resume } = pausableWatch(
state,
() => {
const params = new URLSearchParams("");
Object.keys(state).forEach((key) => {
const mapEntry = state[key];
if (Array.isArray(mapEntry))
mapEntry.forEach((value) => params.append(key, value));
else if (removeNullishValues && mapEntry == null)
params.delete(key);
else if (removeFalsyValues && !mapEntry)
params.delete(key);
else
params.set(key, mapEntry);
});
write(params);
},
{ deep: true }
);
function write(params, shouldUpdate) {
pause();
if (shouldUpdate)
updateState(params);
window2.history.replaceState(
window2.history.state,
window2.document.title,
window2.location.pathname + constructQuery(params)
);
resume();
}
function onChanged() {
if (!enableWrite)
return;
write(read(), true);
}
useEventListener(window2, "popstate", onChanged, false);
if (mode !== "history")
useEventListener(window2, "hashchange", onChanged, false);
const initial = read();
if (initial.keys().next().value)
updateState(initial);
else
Object.assign(state, initialValue);
return state;
}
function useUserMedia(options = {}) {
var _a, _b;
const enabled = ref((_a = options.enabled) != null ? _a : false);
const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);
const constraints = ref(options.constraints);
const { navigator = defaultNavigator } = options;
const isSupported = useSupported(() => {
var _a2;
return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;
});
const stream = shallowRef();
function getDeviceOptions(type) {
switch (type) {
case "video": {
if (constraints.value)
return constraints.value.video || false;
break;
}
case "audio": {
if (constraints.value)
return constraints.value.audio || false;
break;
}
}
}
async function _start() {
if (!isSupported.value || stream.value)
return;
stream.value = await navigator.mediaDevices.getUserMedia({
video: getDeviceOptions("video"),
audio: getDeviceOptions("audio")
});
return stream.value;
}
function _stop() {
var _a2;
(_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());
stream.value = void 0;
}
function stop() {
_stop();
enabled.value = false;
}
async function start() {
await _start();
if (stream.value)
enabled.value = true;
return stream.value;
}
async function restart() {
_stop();
return await start();
}
watch(
enabled,
(v) => {
if (v)
_start();
else
_stop();
},
{ immediate: true }
);
watch(
constraints,
() => {
if (autoSwitch.value && stream.value)
restart();
},
{ immediate: true }
);
tryOnScopeDispose(() => {
stop();
});
return {
isSupported,
stream,
start,
stop,
restart,
constraints,
enabled,
autoSwitch
};
}
function useVModel(props, key, emit, options = {}) {
var _a, _b, _c, _d, _e;
const {
clone = false,
passive = false,
eventName,
deep = false,
defaultValue,
shouldEmit
} = options;
const vm = getCurrentInstance();
const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));
let event = eventName;
if (!key) {
if (isVue2) {
const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model;
key = (modelOptions == null ? void 0 : modelOptions.value) || "value";
if (!eventName)
event = (modelOptions == null ? void 0 : modelOptions.event) || "input";
} else {
key = "modelValue";
}
}
event = event || `update:${key.toString()}`;
const cloneFn = (val) => !clone ? val : typeof clone === "function" ? clone(val) : cloneFnJSON(val);
const getValue2 = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;
const triggerEmit = (value) => {
if (shouldEmit) {
if (shouldEmit(value))
_emit(event, value);
} else {
_emit(event, value);
}
};
if (passive) {
const initialValue = getValue2();
const proxy = ref(initialValue);
let isUpdating = false;
watch(
() => props[key],
(v) => {
if (!isUpdating) {
isUpdating = true;
proxy.value = cloneFn(v);
nextTick(() => isUpdating = false);
}
}
);
watch(
proxy,
(v) => {
if (!isUpdating && (v !== props[key] || deep))
triggerEmit(v);
},
{ deep }
);
return proxy;
} else {
return computed({
get() {
return getValue2();
},
set(value) {
triggerEmit(value);
}
});
}
}
function useVModels(props, emit, options = {}) {
const ret = {};
for (const key in props) {
ret[key] = useVModel(
props,
key,
emit,
options
);
}
return ret;
}
function useVibrate(options) {
const {
pattern = [],
interval = 0,
navigator = defaultNavigator
} = options || {};
const isSupported = useSupported(() => typeof navigator !== "undefined" && "vibrate" in navigator);
const patternRef = toRef(pattern);
let intervalControls;
const vibrate = (pattern2 = patternRef.value) => {
if (isSupported.value)
navigator.vibrate(pattern2);
};
const stop = () => {
if (isSupported.value)
navigator.vibrate(0);
intervalControls == null ? void 0 : intervalControls.pause();
};
if (interval > 0) {
intervalControls = useIntervalFn(
vibrate,
interval,
{
immediate: false,
immediateCallback: false
}
);
}
return {
isSupported,
pattern,
intervalControls,
vibrate,
stop
};
}
function useVirtualList(list, options) {
const { containerStyle, wrapperProps, scrollTo: scrollTo2, calculateRange, currentList, containerRef } = "itemHeight" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);
return {
list: currentList,
scrollTo: scrollTo2,
containerProps: {
ref: containerRef,
onScroll: () => {
calculateRange();
},
style: containerStyle
},
wrapperProps
};
}
function useVirtualListResources(list) {
const containerRef = ref(null);
const size = useElementSize(containerRef);
const currentList = ref([]);
const source = shallowRef(list);
const state = ref({ start: 0, end: 10 });
return { state, source, currentList, size, containerRef };
}
function createGetViewCapacity(state, source, itemSize) {
return (containerSize) => {
if (typeof itemSize === "number")
return Math.ceil(containerSize / itemSize);
const { start = 0 } = state.value;
let sum = 0;
let capacity = 0;
for (let i = start; i < source.value.length; i++) {
const size = itemSize(i);
sum += size;
capacity = i;
if (sum > containerSize)
break;
}
return capacity - start;
};
}
function createGetOffset(source, itemSize) {
return (scrollDirection) => {
if (typeof itemSize === "number")
return Math.floor(scrollDirection / itemSize) + 1;
let sum = 0;
let offset = 0;
for (let i = 0; i < source.value.length; i++) {
const size = itemSize(i);
sum += size;
if (sum >= scrollDirection) {
offset = i;
break;
}
}
return offset + 1;
};
}
function createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {
return () => {
const element = containerRef.value;
if (element) {
const offset = getOffset(type === "vertical" ? element.scrollTop : element.scrollLeft);
const viewCapacity = getViewCapacity(type === "vertical" ? element.clientHeight : element.clientWidth);
const from = offset - overscan;
const to = offset + viewCapacity + overscan;
state.value = {
start: from < 0 ? 0 : from,
end: to > source.value.length ? source.value.length : to
};
currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({
data: ele,
index: index + state.value.start
}));
}
};
}
function createGetDistance(itemSize, source) {
return (index) => {
if (typeof itemSize === "number") {
const size2 = index * itemSize;
return size2;
}
const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);
return size;
};
}
function useWatchForSizes(size, list, calculateRange) {
watch([size.width, size.height, list], () => {
calculateRange();
});
}
function createComputedTotalSize(itemSize, source) {
return computed(() => {
if (typeof itemSize === "number")
return source.value.length * itemSize;
return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);
});
}
const scrollToDictionaryForElementScrollKey = {
horizontal: "scrollLeft",
vertical: "scrollTop"
};
function createScrollTo(type, calculateRange, getDistance, containerRef) {
return (index) => {
if (containerRef.value) {
containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);
calculateRange();
}
};
}
function useHorizontalVirtualList(options, list) {
const resources = useVirtualListResources(list);
const { state, source, currentList, size, containerRef } = resources;
const containerStyle = { overflowX: "auto" };
const { itemWidth, overscan = 5 } = options;
const getViewCapacity = createGetViewCapacity(state, source, itemWidth);
const getOffset = createGetOffset(source, itemWidth);
const calculateRange = createCalculateRange("horizontal", overscan, getOffset, getViewCapacity, resources);
const getDistanceLeft = createGetDistance(itemWidth, source);
const offsetLeft = computed(() => getDistanceLeft(state.value.start));
const totalWidth = createComputedTotalSize(itemWidth, source);
useWatchForSizes(size, list, calculateRange);
const scrollTo2 = createScrollTo("horizontal", calculateRange, getDistanceLeft, containerRef);
const wrapperProps = computed(() => {
return {
style: {
height: "100%",
width: `${totalWidth.value - offsetLeft.value}px`,
marginLeft: `${offsetLeft.value}px`,
display: "flex"
}
};
});
return {
scrollTo: scrollTo2,
calculateRange,
wrapperProps,
containerStyle,
currentList,
containerRef
};
}
function useVerticalVirtualList(options, list) {
const resources = useVirtualListResources(list);
const { state, source, currentList, size, containerRef } = resources;
const containerStyle = { overflowY: "auto" };
const { itemHeight, overscan = 5 } = options;
const getViewCapacity = createGetViewCapacity(state, source, itemHeight);
const getOffset = createGetOffset(source, itemHeight);
const calculateRange = createCalculateRange("vertical", overscan, getOffset, getViewCapacity, resources);
const getDistanceTop = createGetDistance(itemHeight, source);
const offsetTop = computed(() => getDistanceTop(state.value.start));
const totalHeight = createComputedTotalSize(itemHeight, source);
useWatchForSizes(size, list, calculateRange);
const scrollTo2 = createScrollTo("vertical", calculateRange, getDistanceTop, containerRef);
const wrapperProps = computed(() => {
return {
style: {
width: "100%",
height: `${totalHeight.value - offsetTop.value}px`,
marginTop: `${offsetTop.value}px`
}
};
});
return {
calculateRange,
scrollTo: scrollTo2,
containerStyle,
wrapperProps,
currentList,
containerRef
};
}
function useWakeLock(options = {}) {
const {
navigator = defaultNavigator,
document: document2 = defaultDocument
} = options;
let wakeLock;
const isSupported = useSupported(() => navigator && "wakeLock" in navigator);
const isActive = ref(false);
async function onVisibilityChange() {
if (!isSupported.value || !wakeLock)
return;
if (document2 && document2.visibilityState === "visible")
wakeLock = await navigator.wakeLock.request("screen");
isActive.value = !wakeLock.released;
}
if (document2)
useEventListener(document2, "visibilitychange", onVisibilityChange, { passive: true });
async function request(type) {
if (!isSupported.value)
return;
wakeLock = await navigator.wakeLock.request(type);
isActive.value = !wakeLock.released;
}
async function release() {
if (!isSupported.value || !wakeLock)
return;
await wakeLock.release();
isActive.value = !wakeLock.released;
wakeLock = null;
}
return {
isSupported,
isActive,
request,
release
};
}
function useWebNotification(options = {}) {
const {
window: window2 = defaultWindow,
requestPermissions: _requestForPermissions = true
} = options;
const defaultWebNotificationOptions = options;
const isSupported = useSupported(() => !!window2 && "Notification" in window2);
const permissionGranted = ref(isSupported.value && "permission" in Notification && Notification.permission === "granted");
const notification = ref(null);
const ensurePermissions = async () => {
if (!isSupported.value)
return;
if (!permissionGranted.value && Notification.permission !== "denied") {
const result = await Notification.requestPermission();
if (result === "granted")
permissionGranted.value = true;
}
return permissionGranted.value;
};
const { on: onClick, trigger: clickTrigger } = createEventHook();
const { on: onShow, trigger: showTrigger } = createEventHook();
const { on: onError, trigger: errorTrigger } = createEventHook();
const { on: onClose, trigger: closeTrigger } = createEventHook();
const show = async (overrides) => {
if (!isSupported.value || !permissionGranted.value)
return;
const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);
notification.value = new Notification(options2.title || "", options2);
notification.value.onclick = clickTrigger;
notification.value.onshow = showTrigger;
notification.value.onerror = errorTrigger;
notification.value.onclose = closeTrigger;
return notification.value;
};
const close = () => {
if (notification.value)
notification.value.close();
notification.value = null;
};
if (_requestForPermissions)
tryOnMounted(ensurePermissions);
tryOnScopeDispose(close);
if (isSupported.value && window2) {
const document2 = window2.document;
useEventListener(document2, "visibilitychange", (e) => {
e.preventDefault();
if (document2.visibilityState === "visible") {
close();
}
});
}
return {
isSupported,
notification,
ensurePermissions,
permissionGranted,
show,
close,
onClick,
onShow,
onError,
onClose
};
}
const DEFAULT_PING_MESSAGE = "ping";
function resolveNestedOptions(options) {
if (options === true)
return {};
return options;
}
function useWebSocket(url, options = {}) {
const {
onConnected,
onDisconnected,
onError,
onMessage,
immediate = true,
autoClose = true,
protocols = []
} = options;
const data = ref(null);
const status = ref("CLOSED");
const wsRef = ref();
const urlRef = toRef(url);
let heartbeatPause;
let heartbeatResume;
let explicitlyClosed = false;
let retried = 0;
let bufferedData = [];
let pongTimeoutWait;
const _sendBuffer = () => {
if (bufferedData.length && wsRef.value && status.value === "OPEN") {
for (const buffer of bufferedData)
wsRef.value.send(buffer);
bufferedData = [];
}
};
const resetHeartbeat = () => {
clearTimeout(pongTimeoutWait);
pongTimeoutWait = void 0;
};
const close = (code = 1e3, reason) => {
if (!isClient || !wsRef.value)
return;
explicitlyClosed = true;
resetHeartbeat();
heartbeatPause == null ? void 0 : heartbeatPause();
wsRef.value.close(code, reason);
wsRef.value = void 0;
};
const send = (data2, useBuffer = true) => {
if (!wsRef.value || status.value !== "OPEN") {
if (useBuffer)
bufferedData.push(data2);
return false;
}
_sendBuffer();
wsRef.value.send(data2);
return true;
};
const _init = () => {
if (explicitlyClosed || typeof urlRef.value === "undefined")
return;
const ws = new WebSocket(urlRef.value, protocols);
wsRef.value = ws;
status.value = "CONNECTING";
ws.onopen = () => {
status.value = "OPEN";
onConnected == null ? void 0 : onConnected(ws);
heartbeatResume == null ? void 0 : heartbeatResume();
_sendBuffer();
};
ws.onclose = (ev) => {
status.value = "CLOSED";
onDisconnected == null ? void 0 : onDisconnected(ws, ev);
if (!explicitlyClosed && options.autoReconnect) {
const {
retries = -1,
delay = 1e3,
onFailed
} = resolveNestedOptions(options.autoReconnect);
retried += 1;
if (typeof retries === "number" && (retries < 0 || retried < retries))
setTimeout(_init, delay);
else if (typeof retries === "function" && retries())
setTimeout(_init, delay);
else
onFailed == null ? void 0 : onFailed();
}
};
ws.onerror = (e) => {
onError == null ? void 0 : onError(ws, e);
};
ws.onmessage = (e) => {
if (options.heartbeat) {
resetHeartbeat();
const {
message = DEFAULT_PING_MESSAGE
} = resolveNestedOptions(options.heartbeat);
if (e.data === message)
return;
}
data.value = e.data;
onMessage == null ? void 0 : onMessage(ws, e);
};
};
if (options.heartbeat) {
const {
message = DEFAULT_PING_MESSAGE,
interval = 1e3,
pongTimeout = 1e3
} = resolveNestedOptions(options.heartbeat);
const { pause, resume } = useIntervalFn(
() => {
send(message, false);
if (pongTimeoutWait != null)
return;
pongTimeoutWait = setTimeout(() => {
close();
explicitlyClosed = false;
}, pongTimeout);
},
interval,
{ immediate: false }
);
heartbeatPause = pause;
heartbeatResume = resume;
}
if (autoClose) {
if (isClient)
useEventListener("beforeunload", () => close());
tryOnScopeDispose(close);
}
const open = () => {
if (!isClient && !isWorker)
return;
close();
explicitlyClosed = false;
retried = 0;
_init();
};
if (immediate)
open();
return {
data,
status,
close,
send,
open,
ws: wsRef
};
}
function useWebWorker(arg0, workerOptions, options) {
const {
window: window2 = defaultWindow
} = options != null ? options : {};
const data = ref(null);
const worker = shallowRef();
const post = (...args) => {
if (!worker.value)
return;
worker.value.postMessage(...args);
};
const terminate = function terminate2() {
if (!worker.value)
return;
worker.value.terminate();
};
if (window2) {
if (typeof arg0 === "string")
worker.value = new Worker(arg0, workerOptions);
else if (typeof arg0 === "function")
worker.value = arg0();
else
worker.value = arg0;
worker.value.onmessage = (e) => {
data.value = e.data;
};
tryOnScopeDispose(() => {
if (worker.value)
worker.value.terminate();
});
}
return {
data,
post,
terminate,
worker
};
}
function jobRunner(userFunc) {
return (e) => {
const userFuncArgs = e.data[0];
return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {
postMessage(["SUCCESS", result]);
}).catch((error) => {
postMessage(["ERROR", error]);
});
};
}
function depsParser(deps) {
if (deps.length === 0)
return "";
const depsString = deps.map((dep) => `'${dep}'`).toString();
return `importScripts(${depsString})`;
}
function createWorkerBlobUrl(fn, deps) {
const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;
const blob = new Blob([blobCode], { type: "text/javascript" });
const url = URL.createObjectURL(blob);
return url;
}
function useWebWorkerFn(fn, options = {}) {
const {
dependencies = [],
timeout,
window: window2 = defaultWindow
} = options;
const worker = ref();
const workerStatus = ref("PENDING");
const promise = ref({});
const timeoutId = ref();
const workerTerminate = (status = "PENDING") => {
if (worker.value && worker.value._url && window2) {
worker.value.terminate();
URL.revokeObjectURL(worker.value._url);
promise.value = {};
worker.value = void 0;
window2.clearTimeout(timeoutId.value);
workerStatus.value = status;
}
};
workerTerminate();
tryOnScopeDispose(workerTerminate);
const generateWorker = () => {
const blobUrl = createWorkerBlobUrl(fn, dependencies);
const newWorker = new Worker(blobUrl);
newWorker._url = blobUrl;
newWorker.onmessage = (e) => {
const { resolve = () => {
}, reject = () => {
} } = promise.value;
const [status, result] = e.data;
switch (status) {
case "SUCCESS":
resolve(result);
workerTerminate(status);
break;
default:
reject(result);
workerTerminate("ERROR");
break;
}
};
newWorker.onerror = (e) => {
const { reject = () => {
} } = promise.value;
e.preventDefault();
reject(e);
workerTerminate("ERROR");
};
if (timeout) {
timeoutId.value = setTimeout(
() => workerTerminate("TIMEOUT_EXPIRED"),
timeout
);
}
return newWorker;
};
const callWorker = (...fnArgs) => new Promise((resolve, reject) => {
promise.value = {
resolve,
reject
};
worker.value && worker.value.postMessage([[...fnArgs]]);
workerStatus.value = "RUNNING";
});
const workerFn = (...fnArgs) => {
if (workerStatus.value === "RUNNING") {
console.error(
"[useWebWorkerFn] You can only run one instance of the worker at a time."
);
return Promise.reject();
}
worker.value = generateWorker();
return callWorker(...fnArgs);
};
return {
workerFn,
workerStatus,
workerTerminate
};
}
function useWindowFocus(options = {}) {
const { window: window2 = defaultWindow } = options;
if (!window2)
return ref(false);
const focused = ref(window2.document.hasFocus());
useEventListener(window2, "blur", () => {
focused.value = false;
});
useEventListener(window2, "focus", () => {
focused.value = true;
});
return focused;
}
function useWindowScroll(options = {}) {
const { window: window2 = defaultWindow, behavior = "auto" } = options;
if (!window2) {
return {
x: ref(0),
y: ref(0)
};
}
const internalX = ref(window2.scrollX);
const internalY = ref(window2.scrollY);
const x = computed({
get() {
return internalX.value;
},
set(x2) {
scrollTo({ left: x2, behavior });
}
});
const y = computed({
get() {
return internalY.value;
},
set(y2) {
scrollTo({ top: y2, behavior });
}
});
useEventListener(
window2,
"scroll",
() => {
internalX.value = window2.scrollX;
internalY.value = window2.scrollY;
},
{
capture: false,
passive: true
}
);
return { x, y };
}
function useWindowSize(options = {}) {
const {
window: window2 = defaultWindow,
initialWidth = Number.POSITIVE_INFINITY,
initialHeight = Number.POSITIVE_INFINITY,
listenOrientation = true,
includeScrollbar = true
} = options;
const width = ref(initialWidth);
const height = ref(initialHeight);
const update = () => {
if (window2) {
if (includeScrollbar) {
width.value = window2.innerWidth;
height.value = window2.innerHeight;
} else {
width.value = window2.document.documentElement.clientWidth;
height.value = window2.document.documentElement.clientHeight;
}
}
};
update();
tryOnMounted(update);
useEventListener("resize", update, { passive: true });
if (listenOrientation) {
const matches = useMediaQuery("(orientation: portrait)");
watch(matches, () => update());
}
return { width, height };
}
export { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePrevious, useRafFn, useRefHistory, useResizeObserver, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4Lm1qcz92PWU0ZjE4YzI5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vb3AsIG1ha2VEZXN0cnVjdHVyYWJsZSwgY2FtZWxpemUsIHRvVmFsdWUsIGlzQ2xpZW50LCBpc09iamVjdCwgdHJ5T25TY29wZURpc3Bvc2UsIGlzSU9TLCB0cnlPbk1vdW50ZWQsIG9iamVjdE9taXQsIHByb21pc2VUaW1lb3V0LCB1bnRpbCwgaW5jcmVhc2VXaXRoVW5pdCwgb2JqZWN0RW50cmllcywgY3JlYXRlU2luZ2xldG9uUHJvbWlzZSwgdXNlVGltZW91dEZuLCBwYXVzYWJsZVdhdGNoLCB0b1JlZiwgY3JlYXRlRXZlbnRIb29rLCBub3ROdWxsaXNoLCBjb21wdXRlZFdpdGhDb250cm9sLCB0aW1lc3RhbXAsIHBhdXNhYmxlRmlsdGVyLCB3YXRjaElnbm9yYWJsZSwgZGVib3VuY2VGaWx0ZXIsIGNyZWF0ZUZpbHRlcldyYXBwZXIsIGJ5cGFzc0ZpbHRlciwgdG9SZWZzLCB1c2VJbnRlcnZhbEZuLCBjb250YWluc1Byb3AsIGhhc093biwgdGhyb3R0bGVGaWx0ZXIsIHVzZURlYm91bmNlRm4sIHVzZVRocm90dGxlRm4sIGNsYW1wLCBzeW5jUmVmLCBvYmplY3RQaWNrLCB0cnlPblVubW91bnRlZCwgd2F0Y2hXaXRoRmlsdGVyLCB0cnlPbkJlZm9yZVVubW91bnQsIGlkZW50aXR5LCBpc0RlZiwgaXNXb3JrZXIgfSBmcm9tICdAdnVldXNlL3NoYXJlZCc7XG5leHBvcnQgKiBmcm9tICdAdnVldXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBpc1JlZiwgcmVmLCBzaGFsbG93UmVmLCB3YXRjaEVmZmVjdCwgY29tcHV0ZWQsIGluamVjdCwgaXNWdWUzLCB2ZXJzaW9uLCBkZWZpbmVDb21wb25lbnQsIGgsIFRyYW5zaXRpb25Hcm91cCwgc2hhbGxvd1JlYWN0aXZlLCBGcmFnbWVudCwgd2F0Y2gsIGdldEN1cnJlbnRJbnN0YW5jZSwgY3VzdG9tUmVmLCBvblVwZGF0ZWQsIG9uTW91bnRlZCwgaXNWdWUyLCByZWFkb25seSwgbmV4dFRpY2ssIHJlYWN0aXZlLCBtYXJrUmF3LCB1bnJlZiwgZ2V0Q3VycmVudFNjb3BlLCBzZXQsIGRlbCwgaXNSZWFkb25seSwgb25CZWZvcmVVcGRhdGUgfSBmcm9tICd2dWUtZGVtaSc7XG5cbmZ1bmN0aW9uIGNvbXB1dGVkQXN5bmMoZXZhbHVhdGlvbkNhbGxiYWNrLCBpbml0aWFsU3RhdGUsIG9wdGlvbnNPclJlZikge1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKGlzUmVmKG9wdGlvbnNPclJlZikpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgZXZhbHVhdGluZzogb3B0aW9uc09yUmVmXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gb3B0aW9uc09yUmVmIHx8IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBsYXp5ID0gZmFsc2UsXG4gICAgZXZhbHVhdGluZyA9IHZvaWQgMCxcbiAgICBzaGFsbG93ID0gdHJ1ZSxcbiAgICBvbkVycm9yID0gbm9vcFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RhcnRlZCA9IHJlZighbGF6eSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBzaGFsbG93ID8gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpIDogcmVmKGluaXRpYWxTdGF0ZSk7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgd2F0Y2hFZmZlY3QoYXN5bmMgKG9uSW52YWxpZGF0ZSkgPT4ge1xuICAgIGlmICghc3RhcnRlZC52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBjb3VudGVyKys7XG4gICAgY29uc3QgY291bnRlckF0QmVnaW5uaW5nID0gY291bnRlcjtcbiAgICBsZXQgaGFzRmluaXNoZWQgPSBmYWxzZTtcbiAgICBpZiAoZXZhbHVhdGluZykge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV2YWx1YXRpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBldmFsdWF0aW9uQ2FsbGJhY2soKGNhbmNlbENhbGxiYWNrKSA9PiB7XG4gICAgICAgIG9uSW52YWxpZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2YWx1YXRpbmcpXG4gICAgICAgICAgICBldmFsdWF0aW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCFoYXNGaW5pc2hlZClcbiAgICAgICAgICAgIGNhbmNlbENhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoY291bnRlckF0QmVnaW5uaW5nID09PSBjb3VudGVyKVxuICAgICAgICBjdXJyZW50LnZhbHVlID0gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9uRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChldmFsdWF0aW5nICYmIGNvdW50ZXJBdEJlZ2lubmluZyA9PT0gY291bnRlcilcbiAgICAgICAgZXZhbHVhdGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgaGFzRmluaXNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIGlmIChsYXp5KSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHN0YXJ0ZWQudmFsdWUgPSB0cnVlO1xuICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZWRJbmplY3Qoa2V5LCBvcHRpb25zLCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHtcbiAgbGV0IHNvdXJjZSA9IGluamVjdChrZXkpO1xuICBpZiAoZGVmYXVsdFNvdXJjZSlcbiAgICBzb3VyY2UgPSBpbmplY3Qoa2V5LCBkZWZhdWx0U291cmNlKTtcbiAgaWYgKHRyZWF0RGVmYXVsdEFzRmFjdG9yeSlcbiAgICBzb3VyY2UgPSBpbmplY3Qoa2V5LCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpO1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjb21wdXRlZCgoY3R4KSA9PiBvcHRpb25zKHNvdXJjZSwgY3R4KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkKHtcbiAgICAgIGdldDogKGN0eCkgPT4gb3B0aW9ucy5nZXQoc291cmNlLCBjdHgpLFxuICAgICAgc2V0OiBvcHRpb25zLnNldFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJldXNhYmxlVGVtcGxhdGUob3B0aW9ucyA9IHt9KSB7XG4gIGlmICghaXNWdWUzICYmICF2ZXJzaW9uLnN0YXJ0c1dpdGgoXCIyLjcuXCIpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltWdWVVc2VdIGNyZWF0ZVJldXNhYmxlVGVtcGxhdGUgb25seSB3b3JrcyBpbiBWdWUgMi43IG9yIGFib3ZlLlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qge1xuICAgIGluaGVyaXRBdHRycyA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlbmRlciA9IHNoYWxsb3dSZWYoKTtcbiAgY29uc3QgZGVmaW5lID0gLyogI19fUFVSRV9fICovIGRlZmluZUNvbXBvbmVudCh7XG4gICAgc2V0dXAoXywgeyBzbG90cyB9KSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZW5kZXIudmFsdWUgPSBzbG90cy5kZWZhdWx0O1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCByZXVzZSA9IC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICAgIGluaGVyaXRBdHRycyxcbiAgICBzZXR1cChfLCB7IGF0dHJzLCBzbG90cyB9KSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghcmVuZGVyLnZhbHVlICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbVnVlVXNlXSBGYWlsZWQgdG8gZmluZCB0aGUgZGVmaW5pdGlvbiBvZiByZXVzYWJsZSB0ZW1wbGF0ZVwiKTtcbiAgICAgICAgY29uc3Qgdm5vZGUgPSAoX2EgPSByZW5kZXIudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKHJlbmRlciwgeyAuLi5rZXlzVG9DYW1lbEtlYmFiQ2FzZShhdHRycyksICRzbG90czogc2xvdHMgfSk7XG4gICAgICAgIHJldHVybiBpbmhlcml0QXR0cnMgJiYgKHZub2RlID09IG51bGwgPyB2b2lkIDAgOiB2bm9kZS5sZW5ndGgpID09PSAxID8gdm5vZGVbMF0gOiB2bm9kZTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG1ha2VEZXN0cnVjdHVyYWJsZShcbiAgICB7IGRlZmluZSwgcmV1c2UgfSxcbiAgICBbZGVmaW5lLCByZXVzZV1cbiAgKTtcbn1cbmZ1bmN0aW9uIGtleXNUb0NhbWVsS2ViYWJDYXNlKG9iaikge1xuICBjb25zdCBuZXdPYmogPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKVxuICAgIG5ld09ialtjYW1lbGl6ZShrZXkpXSA9IG9ialtrZXldO1xuICByZXR1cm4gbmV3T2JqO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZVByb21pc2Uob3B0aW9ucyA9IHt9KSB7XG4gIGlmICghaXNWdWUzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltWdWVVc2VdIGNyZWF0ZVRlbXBsYXRlUHJvbWlzZSBvbmx5IHdvcmtzIGluIFZ1ZSAzIG9yIGFib3ZlLlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGluZGV4ID0gMDtcbiAgY29uc3QgaW5zdGFuY2VzID0gcmVmKFtdKTtcbiAgZnVuY3Rpb24gY3JlYXRlKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBwcm9wcyA9IHNoYWxsb3dSZWFjdGl2ZSh7XG4gICAgICBrZXk6IGluZGV4KyssXG4gICAgICBhcmdzLFxuICAgICAgcHJvbWlzZTogdm9pZCAwLFxuICAgICAgcmVzb2x2ZTogKCkgPT4ge1xuICAgICAgfSxcbiAgICAgIHJlamVjdDogKCkgPT4ge1xuICAgICAgfSxcbiAgICAgIGlzUmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpbnN0YW5jZXMudmFsdWUucHVzaChwcm9wcyk7XG4gICAgcHJvcHMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgICAgcHJvcHMucmVzb2x2ZSA9ICh2KSA9PiB7XG4gICAgICAgIHByb3BzLmlzUmVzb2x2aW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF9yZXNvbHZlKHYpO1xuICAgICAgfTtcbiAgICAgIHByb3BzLnJlamVjdCA9IF9yZWplY3Q7XG4gICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICBwcm9wcy5wcm9taXNlID0gdm9pZCAwO1xuICAgICAgY29uc3QgaW5kZXgyID0gaW5zdGFuY2VzLnZhbHVlLmluZGV4T2YocHJvcHMpO1xuICAgICAgaWYgKGluZGV4MiAhPT0gLTEpXG4gICAgICAgIGluc3RhbmNlcy52YWx1ZS5zcGxpY2UoaW5kZXgyLCAxKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvcHMucHJvbWlzZTtcbiAgfVxuICBmdW5jdGlvbiBzdGFydCguLi5hcmdzKSB7XG4gICAgaWYgKG9wdGlvbnMuc2luZ2xldG9uICYmIGluc3RhbmNlcy52YWx1ZS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIGluc3RhbmNlcy52YWx1ZVswXS5wcm9taXNlO1xuICAgIHJldHVybiBjcmVhdGUoLi4uYXJncyk7XG4gIH1cbiAgY29uc3QgY29tcG9uZW50ID0gLyogI19fUFVSRV9fICovIGRlZmluZUNvbXBvbmVudCgoXywgeyBzbG90cyB9KSA9PiB7XG4gICAgY29uc3QgcmVuZGVyTGlzdCA9ICgpID0+IGluc3RhbmNlcy52YWx1ZS5tYXAoKHByb3BzKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gaChGcmFnbWVudCwgeyBrZXk6IHByb3BzLmtleSB9LCAoX2EgPSBzbG90cy5kZWZhdWx0KSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChzbG90cywgcHJvcHMpKTtcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uKVxuICAgICAgcmV0dXJuICgpID0+IGgoVHJhbnNpdGlvbkdyb3VwLCBvcHRpb25zLnRyYW5zaXRpb24sIHJlbmRlckxpc3QpO1xuICAgIHJldHVybiByZW5kZXJMaXN0O1xuICB9KTtcbiAgY29tcG9uZW50LnN0YXJ0ID0gc3RhcnQ7XG4gIHJldHVybiBjb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVucmVmRm4oZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHRvVmFsdWUoaSkpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5yZWZFbGVtZW50KGVsUmVmKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgcGxhaW4gPSB0b1ZhbHVlKGVsUmVmKTtcbiAgcmV0dXJuIChfYSA9IHBsYWluID09IG51bGwgPyB2b2lkIDAgOiBwbGFpbi4kZWwpICE9IG51bGwgPyBfYSA6IHBsYWluO1xufVxuXG5jb25zdCBkZWZhdWx0V2luZG93ID0gaXNDbGllbnQgPyB3aW5kb3cgOiB2b2lkIDA7XG5jb25zdCBkZWZhdWx0RG9jdW1lbnQgPSBpc0NsaWVudCA/IHdpbmRvdy5kb2N1bWVudCA6IHZvaWQgMDtcbmNvbnN0IGRlZmF1bHROYXZpZ2F0b3IgPSBpc0NsaWVudCA/IHdpbmRvdy5uYXZpZ2F0b3IgOiB2b2lkIDA7XG5jb25zdCBkZWZhdWx0TG9jYXRpb24gPSBpc0NsaWVudCA/IHdpbmRvdy5sb2NhdGlvbiA6IHZvaWQgMDtcblxuZnVuY3Rpb24gdXNlRXZlbnRMaXN0ZW5lciguLi5hcmdzKSB7XG4gIGxldCB0YXJnZXQ7XG4gIGxldCBldmVudHM7XG4gIGxldCBsaXN0ZW5lcnM7XG4gIGxldCBvcHRpb25zO1xuICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgIFtldmVudHMsIGxpc3RlbmVycywgb3B0aW9uc10gPSBhcmdzO1xuICAgIHRhcmdldCA9IGRlZmF1bHRXaW5kb3c7XG4gIH0gZWxzZSB7XG4gICAgW3RhcmdldCwgZXZlbnRzLCBsaXN0ZW5lcnMsIG9wdGlvbnNdID0gYXJncztcbiAgfVxuICBpZiAoIXRhcmdldClcbiAgICByZXR1cm4gbm9vcDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykpXG4gICAgZXZlbnRzID0gW2V2ZW50c107XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0ZW5lcnMpKVxuICAgIGxpc3RlbmVycyA9IFtsaXN0ZW5lcnNdO1xuICBjb25zdCBjbGVhbnVwcyA9IFtdO1xuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGNsZWFudXBzLmZvckVhY2goKGZuKSA9PiBmbigpKTtcbiAgICBjbGVhbnVwcy5sZW5ndGggPSAwO1xuICB9O1xuICBjb25zdCByZWdpc3RlciA9IChlbCwgZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zMikgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zMik7XG4gICAgcmV0dXJuICgpID0+IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zMik7XG4gIH07XG4gIGNvbnN0IHN0b3BXYXRjaCA9IHdhdGNoKFxuICAgICgpID0+IFt1bnJlZkVsZW1lbnQodGFyZ2V0KSwgdG9WYWx1ZShvcHRpb25zKV0sXG4gICAgKFtlbCwgb3B0aW9uczJdKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBpZiAoIWVsKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvcHRpb25zQ2xvbmUgPSBpc09iamVjdChvcHRpb25zMikgPyB7IC4uLm9wdGlvbnMyIH0gOiBvcHRpb25zMjtcbiAgICAgIGNsZWFudXBzLnB1c2goXG4gICAgICAgIC4uLmV2ZW50cy5mbGF0TWFwKChldmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMubWFwKChsaXN0ZW5lcikgPT4gcmVnaXN0ZXIoZWwsIGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9uc0Nsb25lKSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gICAgeyBpbW1lZGlhdGU6IHRydWUsIGZsdXNoOiBcInBvc3RcIiB9XG4gICk7XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgc3RvcFdhdGNoKCk7XG4gICAgY2xlYW51cCgpO1xuICB9O1xuICB0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcbiAgcmV0dXJuIHN0b3A7XG59XG5cbmxldCBfaU9TV29ya2Fyb3VuZCA9IGZhbHNlO1xuZnVuY3Rpb24gb25DbGlja091dHNpZGUodGFyZ2V0LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93LCBpZ25vcmUgPSBbXSwgY2FwdHVyZSA9IHRydWUsIGRldGVjdElmcmFtZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICBpZiAoIXdpbmRvdylcbiAgICByZXR1cm4gbm9vcDtcbiAgaWYgKGlzSU9TICYmICFfaU9TV29ya2Fyb3VuZCkge1xuICAgIF9pT1NXb3JrYXJvdW5kID0gdHJ1ZTtcbiAgICBBcnJheS5mcm9tKHdpbmRvdy5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKChlbCkgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG5vb3ApKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBub29wKTtcbiAgfVxuICBsZXQgc2hvdWxkTGlzdGVuID0gdHJ1ZTtcbiAgY29uc3Qgc2hvdWxkSWdub3JlID0gKGV2ZW50KSA9PiB7XG4gICAgcmV0dXJuIGlnbm9yZS5zb21lKCh0YXJnZXQyKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRhcmdldDIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20od2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0MikpLnNvbWUoKGVsKSA9PiBlbCA9PT0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQyKTtcbiAgICAgICAgcmV0dXJuIGVsICYmIChldmVudC50YXJnZXQgPT09IGVsIHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcbiAgICBpZiAoIWVsIHx8IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChldmVudC5kZXRhaWwgPT09IDApXG4gICAgICBzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGV2ZW50KTtcbiAgICBpZiAoIXNob3VsZExpc3Rlbikge1xuICAgICAgc2hvdWxkTGlzdGVuID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFuZGxlcihldmVudCk7XG4gIH07XG4gIGNvbnN0IGNsZWFudXAgPSBbXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiY2xpY2tcIiwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZSB9KSxcbiAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJwb2ludGVyZG93blwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcbiAgICAgIHNob3VsZExpc3RlbiA9ICFzaG91bGRJZ25vcmUoZSkgJiYgISEoZWwgJiYgIWUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKTtcbiAgICB9LCB7IHBhc3NpdmU6IHRydWUgfSksXG4gICAgZGV0ZWN0SWZyYW1lICYmIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuICAgICAgICBpZiAoKChfYSA9IHdpbmRvdy5kb2N1bWVudC5hY3RpdmVFbGVtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2EudGFnTmFtZSkgPT09IFwiSUZSQU1FXCIgJiYgIShlbCA9PSBudWxsID8gdm9pZCAwIDogZWwuY29udGFpbnMod2luZG93LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSlcbiAgICAgICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICAgIH0sIDApO1xuICAgIH0pXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzdG9wID0gKCkgPT4gY2xlYW51cC5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG4gIHJldHVybiBzdG9wO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlQcmVkaWNhdGUoa2V5RmlsdGVyKSB7XG4gIGlmICh0eXBlb2Yga2V5RmlsdGVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIGtleUZpbHRlcjtcbiAgZWxzZSBpZiAodHlwZW9mIGtleUZpbHRlciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gKGV2ZW50KSA9PiBldmVudC5rZXkgPT09IGtleUZpbHRlcjtcbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShrZXlGaWx0ZXIpKVxuICAgIHJldHVybiAoZXZlbnQpID0+IGtleUZpbHRlci5pbmNsdWRlcyhldmVudC5rZXkpO1xuICByZXR1cm4gKCkgPT4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG9uS2V5U3Ryb2tlKC4uLmFyZ3MpIHtcbiAgbGV0IGtleTtcbiAgbGV0IGhhbmRsZXI7XG4gIGxldCBvcHRpb25zID0ge307XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgIGtleSA9IGFyZ3NbMF07XG4gICAgaGFuZGxlciA9IGFyZ3NbMV07XG4gICAgb3B0aW9ucyA9IGFyZ3NbMl07XG4gIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGtleSA9IHRydWU7XG4gICAgICBoYW5kbGVyID0gYXJnc1swXTtcbiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXkgPSBhcmdzWzBdO1xuICAgICAgaGFuZGxlciA9IGFyZ3NbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGtleSA9IHRydWU7XG4gICAgaGFuZGxlciA9IGFyZ3NbMF07XG4gIH1cbiAgY29uc3Qge1xuICAgIHRhcmdldCA9IGRlZmF1bHRXaW5kb3csXG4gICAgZXZlbnROYW1lID0gXCJrZXlkb3duXCIsXG4gICAgcGFzc2l2ZSA9IGZhbHNlLFxuICAgIGRlZHVwZSA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcmVkaWNhdGUgPSBjcmVhdGVLZXlQcmVkaWNhdGUoa2V5KTtcbiAgY29uc3QgbGlzdGVuZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLnJlcGVhdCAmJiB0b1ZhbHVlKGRlZHVwZSkpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHByZWRpY2F0ZShlKSlcbiAgICAgIGhhbmRsZXIoZSk7XG4gIH07XG4gIHJldHVybiB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lciwgcGFzc2l2ZSk7XG59XG5mdW5jdGlvbiBvbktleURvd24oa2V5LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIG9uS2V5U3Ryb2tlKGtleSwgaGFuZGxlciwgeyAuLi5vcHRpb25zLCBldmVudE5hbWU6IFwia2V5ZG93blwiIH0pO1xufVxuZnVuY3Rpb24gb25LZXlQcmVzc2VkKGtleSwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBvbktleVN0cm9rZShrZXksIGhhbmRsZXIsIHsgLi4ub3B0aW9ucywgZXZlbnROYW1lOiBcImtleXByZXNzXCIgfSk7XG59XG5mdW5jdGlvbiBvbktleVVwKGtleSwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBvbktleVN0cm9rZShrZXksIGhhbmRsZXIsIHsgLi4ub3B0aW9ucywgZXZlbnROYW1lOiBcImtleXVwXCIgfSk7XG59XG5cbmNvbnN0IERFRkFVTFRfREVMQVkgPSA1MDA7XG5jb25zdCBERUZBVUxUX1RIUkVTSE9MRCA9IDEwO1xuZnVuY3Rpb24gb25Mb25nUHJlc3ModGFyZ2V0LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IGVsZW1lbnRSZWYgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSk7XG4gIGxldCB0aW1lb3V0O1xuICBsZXQgcG9zU3RhcnQ7XG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gdm9pZCAwO1xuICAgIH1cbiAgICBwb3NTdGFydCA9IHZvaWQgMDtcbiAgfVxuICBmdW5jdGlvbiBvbkRvd24oZXYpIHtcbiAgICB2YXIgX2EyLCBfYjIsIF9jLCBfZDtcbiAgICBpZiAoKChfYTIgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm1vZGlmaWVycykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgY2xlYXIoKTtcbiAgICBpZiAoKF9iMiA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMubW9kaWZpZXJzKSA9PSBudWxsID8gdm9pZCAwIDogX2IyLnByZXZlbnQpXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICgoX2MgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm1vZGlmaWVycykgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLnN0b3ApXG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBwb3NTdGFydCA9IHtcbiAgICAgIHg6IGV2LngsXG4gICAgICB5OiBldi55XG4gICAgfTtcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICgpID0+IGhhbmRsZXIoZXYpLFxuICAgICAgKF9kID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5kZWxheSkgIT0gbnVsbCA/IF9kIDogREVGQVVMVF9ERUxBWVxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gb25Nb3ZlKGV2KSB7XG4gICAgdmFyIF9hMiwgX2IyLCBfYywgX2Q7XG4gICAgaWYgKCgoX2EyID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5tb2RpZmllcnMpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuc2VsZikgJiYgZXYudGFyZ2V0ICE9PSBlbGVtZW50UmVmLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghcG9zU3RhcnQgfHwgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzdGFuY2VUaHJlc2hvbGQpID09PSBmYWxzZSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAoKF9iMiA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMubW9kaWZpZXJzKSA9PSBudWxsID8gdm9pZCAwIDogX2IyLnByZXZlbnQpXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICgoX2MgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm1vZGlmaWVycykgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLnN0b3ApXG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBkeCA9IGV2LnggLSBwb3NTdGFydC54O1xuICAgIGNvbnN0IGR5ID0gZXYueSAtIHBvc1N0YXJ0Lnk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIGlmIChkaXN0YW5jZSA+PSAoKF9kID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5kaXN0YW5jZVRocmVzaG9sZCkgIT0gbnVsbCA/IF9kIDogREVGQVVMVF9USFJFU0hPTEQpKVxuICAgICAgY2xlYXIoKTtcbiAgfVxuICBjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7XG4gICAgY2FwdHVyZTogKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5tb2RpZmllcnMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYXB0dXJlLFxuICAgIG9uY2U6IChfYiA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMubW9kaWZpZXJzKSA9PSBudWxsID8gdm9pZCAwIDogX2Iub25jZVxuICB9O1xuICBjb25zdCBjbGVhbnVwID0gW1xuICAgIHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudFJlZiwgXCJwb2ludGVyZG93blwiLCBvbkRvd24sIGxpc3RlbmVyT3B0aW9ucyksXG4gICAgdXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50UmVmLCBcInBvaW50ZXJtb3ZlXCIsIG9uTW92ZSwgbGlzdGVuZXJPcHRpb25zKSxcbiAgICB1c2VFdmVudExpc3RlbmVyKGVsZW1lbnRSZWYsIFtcInBvaW50ZXJ1cFwiLCBcInBvaW50ZXJsZWF2ZVwiXSwgY2xlYXIsIGxpc3RlbmVyT3B0aW9ucylcbiAgXTtcbiAgY29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICByZXR1cm4gc3RvcDtcbn1cblxuZnVuY3Rpb24gaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkge1xuICBjb25zdCB7IGFjdGl2ZUVsZW1lbnQsIGJvZHkgfSA9IGRvY3VtZW50O1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYWN0aXZlRWxlbWVudCA9PT0gYm9keSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoYWN0aXZlRWxlbWVudC50YWdOYW1lKSB7XG4gICAgY2FzZSBcIklOUFVUXCI6XG4gICAgY2FzZSBcIlRFWFRBUkVBXCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gYWN0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIik7XG59XG5mdW5jdGlvbiBpc1R5cGVkQ2hhclZhbGlkKHtcbiAga2V5Q29kZSxcbiAgbWV0YUtleSxcbiAgY3RybEtleSxcbiAgYWx0S2V5XG59KSB7XG4gIGlmIChtZXRhS2V5IHx8IGN0cmxLZXkgfHwgYWx0S2V5KVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGtleUNvZGUgPj0gNDggJiYga2V5Q29kZSA8PSA1NylcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGtleUNvZGUgPj0gNjUgJiYga2V5Q29kZSA8PSA5MClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGtleUNvZGUgPj0gOTcgJiYga2V5Q29kZSA8PSAxMjIpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uU3RhcnRUeXBpbmcoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudDIgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAhaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkgJiYgaXNUeXBlZENoYXJWYWxpZChldmVudCkgJiYgY2FsbGJhY2soZXZlbnQpO1xuICB9O1xuICBpZiAoZG9jdW1lbnQyKVxuICAgIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQyLCBcImtleWRvd25cIiwga2V5ZG93biwgeyBwYXNzaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZVJlZihrZXksIGluaXRpYWxWYWx1ZSA9IG51bGwpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgbGV0IF90cmlnZ2VyID0gKCkgPT4ge1xuICB9O1xuICBjb25zdCBlbGVtZW50ID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuICAgIF90cmlnZ2VyID0gdHJpZ2dlcjtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0cmFjaygpO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gaW5zdGFuY2UgPT0gbnVsbCA/IHZvaWQgMCA6IGluc3RhbmNlLnByb3h5KSA9PSBudWxsID8gdm9pZCAwIDogX2EuJHJlZnNba2V5XSkgIT0gbnVsbCA/IF9iIDogaW5pdGlhbFZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgdHJ5T25Nb3VudGVkKF90cmlnZ2VyKTtcbiAgb25VcGRhdGVkKF90cmlnZ2VyKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHVzZUFjdGl2ZUVsZW1lbnQob3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgZGVlcCA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGRvY3VtZW50ID0gKF9hID0gb3B0aW9ucy5kb2N1bWVudCkgIT0gbnVsbCA/IF9hIDogd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuZG9jdW1lbnQ7XG4gIGNvbnN0IGdldERlZXBBY3RpdmVFbGVtZW50ID0gKCkgPT4ge1xuICAgIHZhciBfYTI7XG4gICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgd2hpbGUgKGVsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGVsZW1lbnQuc2hhZG93Um9vdClcbiAgICAgICAgZWxlbWVudCA9IChfYTIgPSBlbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBlbGVtZW50LnNoYWRvd1Jvb3QpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuYWN0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSByZWYoKTtcbiAgY29uc3QgdHJpZ2dlciA9ICgpID0+IHtcbiAgICBhY3RpdmVFbGVtZW50LnZhbHVlID0gZ2V0RGVlcEFjdGl2ZUVsZW1lbnQoKTtcbiAgfTtcbiAgaWYgKHdpbmRvdykge1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdHJpZ2dlcigpO1xuICAgIH0sIHRydWUpO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcImZvY3VzXCIsIHRyaWdnZXIsIHRydWUpO1xuICB9XG4gIHRyaWdnZXIoKTtcbiAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHVzZU1vdW50ZWQoKSB7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpbnN0YW5jZSkge1xuICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICBpc01vdW50ZWQudmFsdWUgPSB0cnVlO1xuICAgIH0sIGlzVnVlMiA/IG51bGwgOiBpbnN0YW5jZSk7XG4gIH1cbiAgcmV0dXJuIGlzTW91bnRlZDtcbn1cblxuZnVuY3Rpb24gdXNlU3VwcG9ydGVkKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKTtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICBpc01vdW50ZWQudmFsdWU7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2FsbGJhY2soKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1c2VSYWZGbihmbiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpbW1lZGlhdGUgPSB0cnVlLFxuICAgIGZwc0xpbWl0ID0gdm9pZCAwLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzQWN0aXZlID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgaW50ZXJ2YWxMaW1pdCA9IGZwc0xpbWl0ID8gMWUzIC8gZnBzTGltaXQgOiBudWxsO1xuICBsZXQgcHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IDA7XG4gIGxldCByYWZJZCA9IG51bGw7XG4gIGZ1bmN0aW9uIGxvb3AodGltZXN0YW1wKSB7XG4gICAgaWYgKCFpc0FjdGl2ZS52YWx1ZSB8fCAhd2luZG93KVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghcHJldmlvdXNGcmFtZVRpbWVzdGFtcClcbiAgICAgIHByZXZpb3VzRnJhbWVUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgY29uc3QgZGVsdGEgPSB0aW1lc3RhbXAgLSBwcmV2aW91c0ZyYW1lVGltZXN0YW1wO1xuICAgIGlmIChpbnRlcnZhbExpbWl0ICYmIGRlbHRhIDwgaW50ZXJ2YWxMaW1pdCkge1xuICAgICAgcmFmSWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgIGZuKHsgZGVsdGEsIHRpbWVzdGFtcCB9KTtcbiAgICByYWZJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gIH1cbiAgZnVuY3Rpb24gcmVzdW1lKCkge1xuICAgIGlmICghaXNBY3RpdmUudmFsdWUgJiYgd2luZG93KSB7XG4gICAgICBpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG4gICAgICBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gMDtcbiAgICAgIHJhZklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgaXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcbiAgICBpZiAocmFmSWQgIT0gbnVsbCAmJiB3aW5kb3cpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICByYWZJZCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmIChpbW1lZGlhdGUpXG4gICAgcmVzdW1lKCk7XG4gIHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcbiAgcmV0dXJuIHtcbiAgICBpc0FjdGl2ZTogcmVhZG9ubHkoaXNBY3RpdmUpLFxuICAgIHBhdXNlLFxuICAgIHJlc3VtZVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VBbmltYXRlKHRhcmdldCwga2V5ZnJhbWVzLCBvcHRpb25zKSB7XG4gIGxldCBjb25maWc7XG4gIGxldCBhbmltYXRlT3B0aW9ucztcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgY29uZmlnID0gb3B0aW9ucztcbiAgICBhbmltYXRlT3B0aW9ucyA9IG9iamVjdE9taXQob3B0aW9ucywgW1wid2luZG93XCIsIFwiaW1tZWRpYXRlXCIsIFwiY29tbWl0U3R5bGVzXCIsIFwicGVyc2lzdFwiLCBcIm9uUmVhZHlcIiwgXCJvbkVycm9yXCJdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG4gICAgYW5pbWF0ZU9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIGNvbnN0IHtcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93LFxuICAgIGltbWVkaWF0ZSA9IHRydWUsXG4gICAgY29tbWl0U3R5bGVzLFxuICAgIHBlcnNpc3QsXG4gICAgcGxheWJhY2tSYXRlOiBfcGxheWJhY2tSYXRlID0gMSxcbiAgICBvblJlYWR5LFxuICAgIG9uRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyAmJiBIVE1MRWxlbWVudCAmJiBcImFuaW1hdGVcIiBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGUpO1xuICBjb25zdCBhbmltYXRlID0gc2hhbGxvd1JlZih2b2lkIDApO1xuICBjb25zdCBzdG9yZSA9IHNoYWxsb3dSZWFjdGl2ZSh7XG4gICAgc3RhcnRUaW1lOiBudWxsLFxuICAgIGN1cnJlbnRUaW1lOiBudWxsLFxuICAgIHRpbWVsaW5lOiBudWxsLFxuICAgIHBsYXliYWNrUmF0ZTogX3BsYXliYWNrUmF0ZSxcbiAgICBwZW5kaW5nOiBmYWxzZSxcbiAgICBwbGF5U3RhdGU6IGltbWVkaWF0ZSA/IFwiaWRsZVwiIDogXCJwYXVzZWRcIixcbiAgICByZXBsYWNlU3RhdGU6IFwiYWN0aXZlXCJcbiAgfSk7XG4gIGNvbnN0IHBlbmRpbmcgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5wZW5kaW5nKTtcbiAgY29uc3QgcGxheVN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUucGxheVN0YXRlKTtcbiAgY29uc3QgcmVwbGFjZVN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUucmVwbGFjZVN0YXRlKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gY29tcHV0ZWQoe1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBzdG9yZS5zdGFydFRpbWU7XG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIHN0b3JlLnN0YXJ0VGltZSA9IHZhbHVlO1xuICAgICAgaWYgKGFuaW1hdGUudmFsdWUpXG4gICAgICAgIGFuaW1hdGUudmFsdWUuc3RhcnRUaW1lID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgY3VycmVudFRpbWUgPSBjb21wdXRlZCh7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHN0b3JlLmN1cnJlbnRUaW1lO1xuICAgIH0sXG4gICAgc2V0KHZhbHVlKSB7XG4gICAgICBzdG9yZS5jdXJyZW50VGltZSA9IHZhbHVlO1xuICAgICAgaWYgKGFuaW1hdGUudmFsdWUpIHtcbiAgICAgICAgYW5pbWF0ZS52YWx1ZS5jdXJyZW50VGltZSA9IHZhbHVlO1xuICAgICAgICBzeW5jUmVzdW1lKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgdGltZWxpbmUgPSBjb21wdXRlZCh7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHN0b3JlLnRpbWVsaW5lO1xuICAgIH0sXG4gICAgc2V0KHZhbHVlKSB7XG4gICAgICBzdG9yZS50aW1lbGluZSA9IHZhbHVlO1xuICAgICAgaWYgKGFuaW1hdGUudmFsdWUpXG4gICAgICAgIGFuaW1hdGUudmFsdWUudGltZWxpbmUgPSB2YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBwbGF5YmFja1JhdGUgPSBjb21wdXRlZCh7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHN0b3JlLnBsYXliYWNrUmF0ZTtcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgc3RvcmUucGxheWJhY2tSYXRlID0gdmFsdWU7XG4gICAgICBpZiAoYW5pbWF0ZS52YWx1ZSlcbiAgICAgICAgYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBwbGF5ID0gKCkgPT4ge1xuICAgIGlmIChhbmltYXRlLnZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhbmltYXRlLnZhbHVlLnBsYXkoKTtcbiAgICAgICAgc3luY1Jlc3VtZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzeW5jUGF1c2UoKTtcbiAgICAgICAgb25FcnJvcihlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXVzZSA9ICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgdHJ5IHtcbiAgICAgIChfYSA9IGFuaW1hdGUudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYS5wYXVzZSgpO1xuICAgICAgc3luY1BhdXNlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25FcnJvcihlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJldmVyc2UgPSAoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgICFhbmltYXRlLnZhbHVlICYmIHVwZGF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICAoX2EgPSBhbmltYXRlLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EucmV2ZXJzZSgpO1xuICAgICAgc3luY1Jlc3VtZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN5bmNQYXVzZSgpO1xuICAgICAgb25FcnJvcihlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgdHJ5IHtcbiAgICAgIChfYSA9IGFuaW1hdGUudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYS5maW5pc2goKTtcbiAgICAgIHN5bmNQYXVzZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9uRXJyb3IoZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHRyeSB7XG4gICAgICAoX2EgPSBhbmltYXRlLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FuY2VsKCk7XG4gICAgICBzeW5jUGF1c2UoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvbkVycm9yKGUpO1xuICAgIH1cbiAgfTtcbiAgd2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbCkgPT4ge1xuICAgIGVsICYmIHVwZGF0ZSgpO1xuICB9KTtcbiAgd2F0Y2goKCkgPT4ga2V5ZnJhbWVzLCAodmFsdWUpID0+IHtcbiAgICAhYW5pbWF0ZS52YWx1ZSAmJiB1cGRhdGUoKTtcbiAgICBpZiAoIXVucmVmRWxlbWVudCh0YXJnZXQpICYmIGFuaW1hdGUudmFsdWUpIHtcbiAgICAgIGFuaW1hdGUudmFsdWUuZWZmZWN0ID0gbmV3IEtleWZyYW1lRWZmZWN0KFxuICAgICAgICB1bnJlZkVsZW1lbnQodGFyZ2V0KSxcbiAgICAgICAgdG9WYWx1ZSh2YWx1ZSksXG4gICAgICAgIGFuaW1hdGVPcHRpb25zXG4gICAgICApO1xuICAgIH1cbiAgfSwgeyBkZWVwOiB0cnVlIH0pO1xuICB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuICAgIG5leHRUaWNrKCgpID0+IHVwZGF0ZSh0cnVlKSk7XG4gIH0pO1xuICB0cnlPblNjb3BlRGlzcG9zZShjYW5jZWwpO1xuICBmdW5jdGlvbiB1cGRhdGUoaW5pdCkge1xuICAgIGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG4gICAgaWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhZWwpXG4gICAgICByZXR1cm47XG4gICAgaWYgKCFhbmltYXRlLnZhbHVlKVxuICAgICAgYW5pbWF0ZS52YWx1ZSA9IGVsLmFuaW1hdGUodG9WYWx1ZShrZXlmcmFtZXMpLCBhbmltYXRlT3B0aW9ucyk7XG4gICAgaWYgKGNvbW1pdFN0eWxlcylcbiAgICAgIGFuaW1hdGUudmFsdWUuY29tbWl0U3R5bGVzKCk7XG4gICAgaWYgKHBlcnNpc3QpXG4gICAgICBhbmltYXRlLnZhbHVlLnBlcnNpc3QoKTtcbiAgICBpZiAoX3BsYXliYWNrUmF0ZSAhPT0gMSlcbiAgICAgIGFuaW1hdGUudmFsdWUucGxheWJhY2tSYXRlID0gX3BsYXliYWNrUmF0ZTtcbiAgICBpZiAoaW5pdCAmJiAhaW1tZWRpYXRlKVxuICAgICAgYW5pbWF0ZS52YWx1ZS5wYXVzZSgpO1xuICAgIGVsc2VcbiAgICAgIHN5bmNSZXN1bWUoKTtcbiAgICBvblJlYWR5ID09IG51bGwgPyB2b2lkIDAgOiBvblJlYWR5KGFuaW1hdGUudmFsdWUpO1xuICB9XG4gIHVzZUV2ZW50TGlzdGVuZXIoYW5pbWF0ZSwgW1wiY2FuY2VsXCIsIFwiZmluaXNoXCIsIFwicmVtb3ZlXCJdLCBzeW5jUGF1c2UpO1xuICBjb25zdCB7IHJlc3VtZTogcmVzdW1lUmVmLCBwYXVzZTogcGF1c2VSZWYgfSA9IHVzZVJhZkZuKCgpID0+IHtcbiAgICBpZiAoIWFuaW1hdGUudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgc3RvcmUucGVuZGluZyA9IGFuaW1hdGUudmFsdWUucGVuZGluZztcbiAgICBzdG9yZS5wbGF5U3RhdGUgPSBhbmltYXRlLnZhbHVlLnBsYXlTdGF0ZTtcbiAgICBzdG9yZS5yZXBsYWNlU3RhdGUgPSBhbmltYXRlLnZhbHVlLnJlcGxhY2VTdGF0ZTtcbiAgICBzdG9yZS5zdGFydFRpbWUgPSBhbmltYXRlLnZhbHVlLnN0YXJ0VGltZTtcbiAgICBzdG9yZS5jdXJyZW50VGltZSA9IGFuaW1hdGUudmFsdWUuY3VycmVudFRpbWU7XG4gICAgc3RvcmUudGltZWxpbmUgPSBhbmltYXRlLnZhbHVlLnRpbWVsaW5lO1xuICAgIHN0b3JlLnBsYXliYWNrUmF0ZSA9IGFuaW1hdGUudmFsdWUucGxheWJhY2tSYXRlO1xuICB9LCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG4gIGZ1bmN0aW9uIHN5bmNSZXN1bWUoKSB7XG4gICAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmVzdW1lUmVmKCk7XG4gIH1cbiAgZnVuY3Rpb24gc3luY1BhdXNlKCkge1xuICAgIGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB3aW5kb3cpXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHBhdXNlUmVmKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGFuaW1hdGUsXG4gICAgLy8gYWN0aW9uc1xuICAgIHBsYXksXG4gICAgcGF1c2UsXG4gICAgcmV2ZXJzZSxcbiAgICBmaW5pc2gsXG4gICAgY2FuY2VsLFxuICAgIC8vIHN0YXRlXG4gICAgcGVuZGluZyxcbiAgICBwbGF5U3RhdGUsXG4gICAgcmVwbGFjZVN0YXRlLFxuICAgIHN0YXJ0VGltZSxcbiAgICBjdXJyZW50VGltZSxcbiAgICB0aW1lbGluZSxcbiAgICBwbGF5YmFja1JhdGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlQXN5bmNRdWV1ZSh0YXNrcywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgaW50ZXJydXB0ID0gdHJ1ZSxcbiAgICBvbkVycm9yID0gbm9vcCxcbiAgICBvbkZpbmlzaGVkID0gbm9vcCxcbiAgICBzaWduYWxcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHByb21pc2VTdGF0ZSA9IHtcbiAgICBhYm9ydGVkOiBcImFib3J0ZWRcIixcbiAgICBmdWxmaWxsZWQ6IFwiZnVsZmlsbGVkXCIsXG4gICAgcGVuZGluZzogXCJwZW5kaW5nXCIsXG4gICAgcmVqZWN0ZWQ6IFwicmVqZWN0ZWRcIlxuICB9O1xuICBjb25zdCBpbml0aWFsUmVzdWx0ID0gQXJyYXkuZnJvbShBcnJheS5mcm9tKHsgbGVuZ3RoOiB0YXNrcy5sZW5ndGggfSksICgpID0+ICh7IHN0YXRlOiBwcm9taXNlU3RhdGUucGVuZGluZywgZGF0YTogbnVsbCB9KSk7XG4gIGNvbnN0IHJlc3VsdCA9IHJlYWN0aXZlKGluaXRpYWxSZXN1bHQpO1xuICBjb25zdCBhY3RpdmVJbmRleCA9IHJlZigtMSk7XG4gIGlmICghdGFza3MgfHwgdGFza3MubGVuZ3RoID09PSAwKSB7XG4gICAgb25GaW5pc2hlZCgpO1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVJbmRleCxcbiAgICAgIHJlc3VsdFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlUmVzdWx0KHN0YXRlLCByZXMpIHtcbiAgICBhY3RpdmVJbmRleC52YWx1ZSsrO1xuICAgIHJlc3VsdFthY3RpdmVJbmRleC52YWx1ZV0uZGF0YSA9IHJlcztcbiAgICByZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdLnN0YXRlID0gc3RhdGU7XG4gIH1cbiAgdGFza3MucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgcmV0dXJuIHByZXYudGhlbigocHJldlJlcykgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgaWYgKHNpZ25hbCA9PSBudWxsID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgdXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCBuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCgoX2EgPSByZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdKSA9PSBudWxsID8gdm9pZCAwIDogX2Euc3RhdGUpID09PSBwcm9taXNlU3RhdGUucmVqZWN0ZWQgJiYgaW50ZXJydXB0KSB7XG4gICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZG9uZSA9IGN1cnIocHJldlJlcykudGhlbigoY3VycmVudFJlcykgPT4ge1xuICAgICAgICB1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmZ1bGZpbGxlZCwgY3VycmVudFJlcyk7XG4gICAgICAgIGFjdGl2ZUluZGV4LnZhbHVlID09PSB0YXNrcy5sZW5ndGggLSAxICYmIG9uRmluaXNoZWQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXM7XG4gICAgICB9KTtcbiAgICAgIGlmICghc2lnbmFsKVxuICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW2RvbmUsIHdoZW5BYm9ydGVkKHNpZ25hbCldKTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgaWYgKHNpZ25hbCA9PSBudWxsID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgdXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCBlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICB1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLnJlamVjdGVkLCBlKTtcbiAgICAgIG9uRXJyb3IoKTtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuICB9LCBQcm9taXNlLnJlc29sdmUoKSk7XG4gIHJldHVybiB7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgcmVzdWx0XG4gIH07XG59XG5mdW5jdGlvbiB3aGVuQWJvcnRlZChzaWduYWwpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcImFib3J0ZWRcIik7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKVxuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICBlbHNlXG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlamVjdChlcnJvciksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZUFzeW5jU3RhdGUocHJvbWlzZSwgaW5pdGlhbFN0YXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBpbW1lZGlhdGUgPSB0cnVlLFxuICAgIGRlbGF5ID0gMCxcbiAgICBvbkVycm9yID0gbm9vcCxcbiAgICBvblN1Y2Nlc3MgPSBub29wLFxuICAgIHJlc2V0T25FeGVjdXRlID0gdHJ1ZSxcbiAgICBzaGFsbG93ID0gdHJ1ZSxcbiAgICB0aHJvd0Vycm9yXG4gIH0gPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gIGNvbnN0IHN0YXRlID0gc2hhbGxvdyA/IHNoYWxsb3dSZWYoaW5pdGlhbFN0YXRlKSA6IHJlZihpbml0aWFsU3RhdGUpO1xuICBjb25zdCBpc1JlYWR5ID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgaXNMb2FkaW5nID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG4gIGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUoZGVsYXkyID0gMCwgLi4uYXJncykge1xuICAgIGlmIChyZXNldE9uRXhlY3V0ZSlcbiAgICAgIHN0YXRlLnZhbHVlID0gaW5pdGlhbFN0YXRlO1xuICAgIGVycm9yLnZhbHVlID0gdm9pZCAwO1xuICAgIGlzUmVhZHkudmFsdWUgPSBmYWxzZTtcbiAgICBpc0xvYWRpbmcudmFsdWUgPSB0cnVlO1xuICAgIGlmIChkZWxheTIgPiAwKVxuICAgICAgYXdhaXQgcHJvbWlzZVRpbWVvdXQoZGVsYXkyKTtcbiAgICBjb25zdCBfcHJvbWlzZSA9IHR5cGVvZiBwcm9taXNlID09PSBcImZ1bmN0aW9uXCIgPyBwcm9taXNlKC4uLmFyZ3MpIDogcHJvbWlzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wcm9taXNlO1xuICAgICAgc3RhdGUudmFsdWUgPSBkYXRhO1xuICAgICAgaXNSZWFkeS52YWx1ZSA9IHRydWU7XG4gICAgICBvblN1Y2Nlc3MoZGF0YSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IudmFsdWUgPSBlO1xuICAgICAgb25FcnJvcihlKTtcbiAgICAgIGlmICh0aHJvd0Vycm9yKVxuICAgICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0xvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLnZhbHVlO1xuICB9XG4gIGlmIChpbW1lZGlhdGUpXG4gICAgZXhlY3V0ZShkZWxheSk7XG4gIGNvbnN0IHNoZWxsID0ge1xuICAgIHN0YXRlLFxuICAgIGlzUmVhZHksXG4gICAgaXNMb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIGV4ZWN1dGVcbiAgfTtcbiAgZnVuY3Rpb24gd2FpdFVudGlsSXNMb2FkZWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVudGlsKGlzTG9hZGluZykudG9CZShmYWxzZSkudGhlbigoKSA9PiByZXNvbHZlKHNoZWxsKSkuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnNoZWxsLFxuICAgIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB3YWl0VW50aWxJc0xvYWRlZCgpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFycmF5OiAodikgPT4gSlNPTi5zdHJpbmdpZnkodiksXG4gIG9iamVjdDogKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpLFxuICBzZXQ6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHYpKSxcbiAgbWFwOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmZyb21FbnRyaWVzKHYpKSxcbiAgbnVsbDogKCkgPT4gXCJcIlxufTtcbmZ1bmN0aW9uIGdldERlZmF1bHRTZXJpYWxpemF0aW9uKHRhcmdldCkge1xuICBpZiAoIXRhcmdldClcbiAgICByZXR1cm4gZGVmYXVsdHMubnVsbDtcbiAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1hcClcbiAgICByZXR1cm4gZGVmYXVsdHMubWFwO1xuICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBTZXQpXG4gICAgcmV0dXJuIGRlZmF1bHRzLnNldDtcbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKVxuICAgIHJldHVybiBkZWZhdWx0cy5hcnJheTtcbiAgZWxzZVxuICAgIHJldHVybiBkZWZhdWx0cy5vYmplY3Q7XG59XG5cbmZ1bmN0aW9uIHVzZUJhc2U2NCh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgY29uc3QgYmFzZTY0ID0gcmVmKFwiXCIpO1xuICBjb25zdCBwcm9taXNlID0gcmVmKCk7XG4gIGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG4gICAgaWYgKCFpc0NsaWVudClcbiAgICAgIHJldHVybjtcbiAgICBwcm9taXNlLnZhbHVlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgX3RhcmdldCA9IHRvVmFsdWUodGFyZ2V0KTtcbiAgICAgICAgaWYgKF90YXJnZXQgPT0gbnVsbCkge1xuICAgICAgICAgIHJlc29sdmUoXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIF90YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXNvbHZlKGJsb2JUb0Jhc2U2NChuZXcgQmxvYihbX3RhcmdldF0sIHsgdHlwZTogXCJ0ZXh0L3BsYWluXCIgfSkpKTtcbiAgICAgICAgfSBlbHNlIGlmIChfdGFyZ2V0IGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgIHJlc29sdmUoYmxvYlRvQmFzZTY0KF90YXJnZXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChfdGFyZ2V0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICByZXNvbHZlKHdpbmRvdy5idG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubmV3IFVpbnQ4QXJyYXkoX3RhcmdldCkpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgICAgcmVzb2x2ZShfdGFyZ2V0LnRvRGF0YVVSTChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLnR5cGUsIG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMucXVhbGl0eSkpO1xuICAgICAgICB9IGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgaW1nID0gX3RhcmdldC5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICAgIGltZy5jcm9zc09yaWdpbiA9IFwiQW5vbnltb3VzXCI7XG4gICAgICAgICAgaW1nTG9hZGVkKGltZykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICByZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy50eXBlLCBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcbiAgICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgX3NlcmlhbGl6ZUZuID0gKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuc2VyaWFsaXplcikgfHwgZ2V0RGVmYXVsdFNlcmlhbGl6YXRpb24oX3RhcmdldCk7XG4gICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IF9zZXJpYWxpemVGbihfdGFyZ2V0KTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShibG9iVG9CYXNlNjQobmV3IEJsb2IoW3NlcmlhbGl6ZWRdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcInRhcmdldCBpcyB1bnN1cHBvcnRlZCB0eXBlc1wiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvbWlzZS52YWx1ZS50aGVuKChyZXMpID0+IGJhc2U2NC52YWx1ZSA9IHJlcyk7XG4gICAgcmV0dXJuIHByb21pc2UudmFsdWU7XG4gIH1cbiAgaWYgKGlzUmVmKHRhcmdldCkgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHdhdGNoKHRhcmdldCwgZXhlY3V0ZSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG4gIGVsc2VcbiAgICBleGVjdXRlKCk7XG4gIHJldHVybiB7XG4gICAgYmFzZTY0LFxuICAgIHByb21pc2UsXG4gICAgZXhlY3V0ZVxuICB9O1xufVxuZnVuY3Rpb24gaW1nTG9hZGVkKGltZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICghaW1nLmNvbXBsZXRlKSB7XG4gICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2IpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZnIub25sb2FkID0gKGUpID0+IHtcbiAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICB9O1xuICAgIGZyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgZnIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZUJhdHRlcnkob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgbmF2aWdhdG9yID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcbiAgY29uc3QgZXZlbnRzID0gW1wiY2hhcmdpbmdjaGFuZ2VcIiwgXCJjaGFyZ2luZ3RpbWVjaGFuZ2VcIiwgXCJkaXNjaGFyZ2luZ3RpbWVjaGFuZ2VcIiwgXCJsZXZlbGNoYW5nZVwiXTtcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yICYmIFwiZ2V0QmF0dGVyeVwiIGluIG5hdmlnYXRvciAmJiB0eXBlb2YgbmF2aWdhdG9yLmdldEJhdHRlcnkgPT09IFwiZnVuY3Rpb25cIik7XG4gIGNvbnN0IGNoYXJnaW5nID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgY2hhcmdpbmdUaW1lID0gcmVmKDApO1xuICBjb25zdCBkaXNjaGFyZ2luZ1RpbWUgPSByZWYoMCk7XG4gIGNvbnN0IGxldmVsID0gcmVmKDEpO1xuICBsZXQgYmF0dGVyeTtcbiAgZnVuY3Rpb24gdXBkYXRlQmF0dGVyeUluZm8oKSB7XG4gICAgY2hhcmdpbmcudmFsdWUgPSB0aGlzLmNoYXJnaW5nO1xuICAgIGNoYXJnaW5nVGltZS52YWx1ZSA9IHRoaXMuY2hhcmdpbmdUaW1lIHx8IDA7XG4gICAgZGlzY2hhcmdpbmdUaW1lLnZhbHVlID0gdGhpcy5kaXNjaGFyZ2luZ1RpbWUgfHwgMDtcbiAgICBsZXZlbC52YWx1ZSA9IHRoaXMubGV2ZWw7XG4gIH1cbiAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG4gICAgbmF2aWdhdG9yLmdldEJhdHRlcnkoKS50aGVuKChfYmF0dGVyeSkgPT4ge1xuICAgICAgYmF0dGVyeSA9IF9iYXR0ZXJ5O1xuICAgICAgdXBkYXRlQmF0dGVyeUluZm8uY2FsbChiYXR0ZXJ5KTtcbiAgICAgIHVzZUV2ZW50TGlzdGVuZXIoYmF0dGVyeSwgZXZlbnRzLCB1cGRhdGVCYXR0ZXJ5SW5mbywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgY2hhcmdpbmcsXG4gICAgY2hhcmdpbmdUaW1lLFxuICAgIGRpc2NoYXJnaW5nVGltZSxcbiAgICBsZXZlbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VCbHVldG9vdGgob3B0aW9ucykge1xuICBsZXQge1xuICAgIGFjY2VwdEFsbERldmljZXMgPSBmYWxzZVxuICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qge1xuICAgIGZpbHRlcnMgPSB2b2lkIDAsXG4gICAgb3B0aW9uYWxTZXJ2aWNlcyA9IHZvaWQgMCxcbiAgICBuYXZpZ2F0b3IgPSBkZWZhdWx0TmF2aWdhdG9yXG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IgJiYgXCJibHVldG9vdGhcIiBpbiBuYXZpZ2F0b3IpO1xuICBjb25zdCBkZXZpY2UgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG4gIGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcbiAgd2F0Y2goZGV2aWNlLCAoKSA9PiB7XG4gICAgY29ubmVjdFRvQmx1ZXRvb3RoR0FUVFNlcnZlcigpO1xuICB9KTtcbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdERldmljZSgpIHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGVycm9yLnZhbHVlID0gbnVsbDtcbiAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmxlbmd0aCA+IDApXG4gICAgICBhY2NlcHRBbGxEZXZpY2VzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGRldmljZS52YWx1ZSA9IGF3YWl0IChuYXZpZ2F0b3IgPT0gbnVsbCA/IHZvaWQgMCA6IG5hdmlnYXRvci5ibHVldG9vdGgucmVxdWVzdERldmljZSh7XG4gICAgICAgIGFjY2VwdEFsbERldmljZXMsXG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIG9wdGlvbmFsU2VydmljZXNcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgIH1cbiAgfVxuICBjb25zdCBzZXJ2ZXIgPSByZWYoKTtcbiAgY29uc3QgaXNDb25uZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gc2VydmVyLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY29ubmVjdGVkKSB8fCBmYWxzZTtcbiAgfSk7XG4gIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb0JsdWV0b290aEdBVFRTZXJ2ZXIoKSB7XG4gICAgZXJyb3IudmFsdWUgPSBudWxsO1xuICAgIGlmIChkZXZpY2UudmFsdWUgJiYgZGV2aWNlLnZhbHVlLmdhdHQpIHtcbiAgICAgIGRldmljZS52YWx1ZS5hZGRFdmVudExpc3RlbmVyKFwiZ2F0dHNlcnZlcmRpc2Nvbm5lY3RlZFwiLCAoKSA9PiB7XG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlcnZlci52YWx1ZSA9IGF3YWl0IGRldmljZS52YWx1ZS5nYXR0LmNvbm5lY3QoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdHJ5T25Nb3VudGVkKCgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKGRldmljZS52YWx1ZSlcbiAgICAgIChfYSA9IGRldmljZS52YWx1ZS5nYXR0KSA9PSBudWxsID8gdm9pZCAwIDogX2EuY29ubmVjdCgpO1xuICB9KTtcbiAgdHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBpZiAoZGV2aWNlLnZhbHVlKVxuICAgICAgKF9hID0gZGV2aWNlLnZhbHVlLmdhdHQpID09IG51bGwgPyB2b2lkIDAgOiBfYS5kaXNjb25uZWN0KCk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGlzQ29ubmVjdGVkLFxuICAgIC8vIERldmljZTpcbiAgICBkZXZpY2UsXG4gICAgcmVxdWVzdERldmljZSxcbiAgICAvLyBTZXJ2ZXI6XG4gICAgc2VydmVyLFxuICAgIC8vIEVycm9yczpcbiAgICBlcnJvclxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VNZWRpYVF1ZXJ5KHF1ZXJ5LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3cgJiYgXCJtYXRjaE1lZGlhXCIgaW4gd2luZG93ICYmIHR5cGVvZiB3aW5kb3cubWF0Y2hNZWRpYSA9PT0gXCJmdW5jdGlvblwiKTtcbiAgbGV0IG1lZGlhUXVlcnk7XG4gIGNvbnN0IG1hdGNoZXMgPSByZWYoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgbWF0Y2hlcy52YWx1ZSA9IGV2ZW50Lm1hdGNoZXM7XG4gIH07XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKCFtZWRpYVF1ZXJ5KVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChcInJlbW92ZUV2ZW50TGlzdGVuZXJcIiBpbiBtZWRpYVF1ZXJ5KVxuICAgICAgbWVkaWFRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGhhbmRsZXIpO1xuICAgIGVsc2VcbiAgICAgIG1lZGlhUXVlcnkucmVtb3ZlTGlzdGVuZXIoaGFuZGxlcik7XG4gIH07XG4gIGNvbnN0IHN0b3BXYXRjaCA9IHdhdGNoRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGNsZWFudXAoKTtcbiAgICBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEodG9WYWx1ZShxdWVyeSkpO1xuICAgIGlmIChcImFkZEV2ZW50TGlzdGVuZXJcIiBpbiBtZWRpYVF1ZXJ5KVxuICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGhhbmRsZXIpO1xuICAgIGVsc2VcbiAgICAgIG1lZGlhUXVlcnkuYWRkTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgbWF0Y2hlcy52YWx1ZSA9IG1lZGlhUXVlcnkubWF0Y2hlcztcbiAgfSk7XG4gIHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICBzdG9wV2F0Y2goKTtcbiAgICBjbGVhbnVwKCk7XG4gICAgbWVkaWFRdWVyeSA9IHZvaWQgMDtcbiAgfSk7XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG5jb25zdCBicmVha3BvaW50c1RhaWx3aW5kID0ge1xuICBcInNtXCI6IDY0MCxcbiAgXCJtZFwiOiA3NjgsXG4gIFwibGdcIjogMTAyNCxcbiAgXCJ4bFwiOiAxMjgwLFxuICBcIjJ4bFwiOiAxNTM2XG59O1xuY29uc3QgYnJlYWtwb2ludHNCb290c3RyYXBWNSA9IHtcbiAgeHM6IDAsXG4gIHNtOiA1NzYsXG4gIG1kOiA3NjgsXG4gIGxnOiA5OTIsXG4gIHhsOiAxMjAwLFxuICB4eGw6IDE0MDBcbn07XG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnlWMiA9IHtcbiAgeHM6IDAsXG4gIHNtOiA2MDAsXG4gIG1kOiA5NjAsXG4gIGxnOiAxMjY0LFxuICB4bDogMTkwNFxufTtcbmNvbnN0IGJyZWFrcG9pbnRzVnVldGlmeVYzID0ge1xuICB4czogMCxcbiAgc206IDYwMCxcbiAgbWQ6IDk2MCxcbiAgbGc6IDEyODAsXG4gIHhsOiAxOTIwLFxuICB4eGw6IDI1NjBcbn07XG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnkgPSBicmVha3BvaW50c1Z1ZXRpZnlWMjtcbmNvbnN0IGJyZWFrcG9pbnRzQW50RGVzaWduID0ge1xuICB4czogNDgwLFxuICBzbTogNTc2LFxuICBtZDogNzY4LFxuICBsZzogOTkyLFxuICB4bDogMTIwMCxcbiAgeHhsOiAxNjAwXG59O1xuY29uc3QgYnJlYWtwb2ludHNRdWFzYXIgPSB7XG4gIHhzOiAwLFxuICBzbTogNjAwLFxuICBtZDogMTAyNCxcbiAgbGc6IDE0NDAsXG4gIHhsOiAxOTIwXG59O1xuY29uc3QgYnJlYWtwb2ludHNTZW1hdGljID0ge1xuICBtb2JpbGVTOiAzMjAsXG4gIG1vYmlsZU06IDM3NSxcbiAgbW9iaWxlTDogNDI1LFxuICB0YWJsZXQ6IDc2OCxcbiAgbGFwdG9wOiAxMDI0LFxuICBsYXB0b3BMOiAxNDQwLFxuICBkZXNrdG9wNEs6IDI1NjBcbn07XG5jb25zdCBicmVha3BvaW50c01hc3RlckNzcyA9IHtcbiAgXCIzeHNcIjogMzYwLFxuICBcIjJ4c1wiOiA0ODAsXG4gIFwieHNcIjogNjAwLFxuICBcInNtXCI6IDc2OCxcbiAgXCJtZFwiOiAxMDI0LFxuICBcImxnXCI6IDEyODAsXG4gIFwieGxcIjogMTQ0MCxcbiAgXCIyeGxcIjogMTYwMCxcbiAgXCIzeGxcIjogMTkyMCxcbiAgXCI0eGxcIjogMjU2MFxufTtcbmNvbnN0IGJyZWFrcG9pbnRzUHJpbWVGbGV4ID0ge1xuICBzbTogNTc2LFxuICBtZDogNzY4LFxuICBsZzogOTkyLFxuICB4bDogMTIwMFxufTtcblxuZnVuY3Rpb24gdXNlQnJlYWtwb2ludHMoYnJlYWtwb2ludHMsIG9wdGlvbnMgPSB7fSkge1xuICBmdW5jdGlvbiBnZXRWYWx1ZShrLCBkZWx0YSkge1xuICAgIGxldCB2ID0gdG9WYWx1ZShicmVha3BvaW50c1t0b1ZhbHVlKGspXSk7XG4gICAgaWYgKGRlbHRhICE9IG51bGwpXG4gICAgICB2ID0gaW5jcmVhc2VXaXRoVW5pdCh2LCBkZWx0YSk7XG4gICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKVxuICAgICAgdiA9IGAke3Z9cHhgO1xuICAgIHJldHVybiB2O1xuICB9XG4gIGNvbnN0IHsgd2luZG93ID0gZGVmYXVsdFdpbmRvdywgc3RyYXRlZ3kgPSBcIm1pbi13aWR0aFwiIH0gPSBvcHRpb25zO1xuICBmdW5jdGlvbiBtYXRjaChxdWVyeSkge1xuICAgIGlmICghd2luZG93KVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYShxdWVyeSkubWF0Y2hlcztcbiAgfVxuICBjb25zdCBncmVhdGVyT3JFcXVhbCA9IChrKSA9PiB7XG4gICAgcmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUoayl9KWAsIG9wdGlvbnMpO1xuICB9O1xuICBjb25zdCBzbWFsbGVyT3JFcXVhbCA9IChrKSA9PiB7XG4gICAgcmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtYXgtd2lkdGg6ICR7Z2V0VmFsdWUoayl9KWAsIG9wdGlvbnMpO1xuICB9O1xuICBjb25zdCBzaG9ydGN1dE1ldGhvZHMgPSBPYmplY3Qua2V5cyhicmVha3BvaW50cykucmVkdWNlKChzaG9ydGN1dHMsIGspID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hvcnRjdXRzLCBrLCB7XG4gICAgICBnZXQ6ICgpID0+IHN0cmF0ZWd5ID09PSBcIm1pbi13aWR0aFwiID8gZ3JlYXRlck9yRXF1YWwoaykgOiBzbWFsbGVyT3JFcXVhbChrKSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gc2hvcnRjdXRzO1xuICB9LCB7fSk7XG4gIGZ1bmN0aW9uIGN1cnJlbnQoKSB7XG4gICAgY29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLm1hcCgoaSkgPT4gW2ksIGdyZWF0ZXJPckVxdWFsKGkpXSk7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHBvaW50cy5maWx0ZXIoKFssIHZdKSA9PiB2LnZhbHVlKS5tYXAoKFtrXSkgPT4gaykpO1xuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHNob3J0Y3V0TWV0aG9kcywge1xuICAgIGdyZWF0ZXJPckVxdWFsLFxuICAgIHNtYWxsZXJPckVxdWFsLFxuICAgIGdyZWF0ZXIoaykge1xuICAgICAgcmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUoaywgMC4xKX0pYCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgICBzbWFsbGVyKGspIHtcbiAgICAgIHJldHVybiB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAobWF4LXdpZHRoOiAke2dldFZhbHVlKGssIC0wLjEpfSlgLCBvcHRpb25zKTtcbiAgICB9LFxuICAgIGJldHdlZW4oYSwgYikge1xuICAgICAgcmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUoYSl9KSBhbmQgKG1heC13aWR0aDogJHtnZXRWYWx1ZShiLCAtMC4xKX0pYCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgICBpc0dyZWF0ZXIoaykge1xuICAgICAgcmV0dXJuIG1hdGNoKGAobWluLXdpZHRoOiAke2dldFZhbHVlKGssIDAuMSl9KWApO1xuICAgIH0sXG4gICAgaXNHcmVhdGVyT3JFcXVhbChrKSB7XG4gICAgICByZXR1cm4gbWF0Y2goYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUoayl9KWApO1xuICAgIH0sXG4gICAgaXNTbWFsbGVyKGspIHtcbiAgICAgIHJldHVybiBtYXRjaChgKG1heC13aWR0aDogJHtnZXRWYWx1ZShrLCAtMC4xKX0pYCk7XG4gICAgfSxcbiAgICBpc1NtYWxsZXJPckVxdWFsKGspIHtcbiAgICAgIHJldHVybiBtYXRjaChgKG1heC13aWR0aDogJHtnZXRWYWx1ZShrKX0pYCk7XG4gICAgfSxcbiAgICBpc0luQmV0d2VlbihhLCBiKSB7XG4gICAgICByZXR1cm4gbWF0Y2goYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUoYSl9KSBhbmQgKG1heC13aWR0aDogJHtnZXRWYWx1ZShiLCAtMC4xKX0pYCk7XG4gICAgfSxcbiAgICBjdXJyZW50LFxuICAgIGFjdGl2ZSgpIHtcbiAgICAgIGNvbnN0IGJwcyA9IGN1cnJlbnQoKTtcbiAgICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBicHMudmFsdWUubGVuZ3RoID09PSAwID8gXCJcIiA6IGJwcy52YWx1ZS5hdCgtMSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZUJyb2FkY2FzdENoYW5uZWwob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3cgJiYgXCJCcm9hZGNhc3RDaGFubmVsXCIgaW4gd2luZG93KTtcbiAgY29uc3QgaXNDbG9zZWQgPSByZWYoZmFsc2UpO1xuICBjb25zdCBjaGFubmVsID0gcmVmKCk7XG4gIGNvbnN0IGRhdGEgPSByZWYoKTtcbiAgY29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuICBjb25zdCBwb3N0ID0gKGRhdGEyKSA9PiB7XG4gICAgaWYgKGNoYW5uZWwudmFsdWUpXG4gICAgICBjaGFubmVsLnZhbHVlLnBvc3RNZXNzYWdlKGRhdGEyKTtcbiAgfTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgaWYgKGNoYW5uZWwudmFsdWUpXG4gICAgICBjaGFubmVsLnZhbHVlLmNsb3NlKCk7XG4gICAgaXNDbG9zZWQudmFsdWUgPSB0cnVlO1xuICB9O1xuICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcbiAgICB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgZXJyb3IudmFsdWUgPSBudWxsO1xuICAgICAgY2hhbm5lbC52YWx1ZSA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKG5hbWUpO1xuICAgICAgY2hhbm5lbC52YWx1ZS5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZSkgPT4ge1xuICAgICAgICBkYXRhLnZhbHVlID0gZS5kYXRhO1xuICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgY2hhbm5lbC52YWx1ZS5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZWVycm9yXCIsIChlKSA9PiB7XG4gICAgICAgIGVycm9yLnZhbHVlID0gZTtcbiAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNoYW5uZWwudmFsdWUuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgaXNDbG9zZWQudmFsdWUgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgdHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgIGNsb3NlKCk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGNoYW5uZWwsXG4gICAgZGF0YSxcbiAgICBwb3N0LFxuICAgIGNsb3NlLFxuICAgIGVycm9yLFxuICAgIGlzQ2xvc2VkXG4gIH07XG59XG5cbmNvbnN0IFdSSVRBQkxFX1BST1BFUlRJRVMgPSBbXG4gIFwiaGFzaFwiLFxuICBcImhvc3RcIixcbiAgXCJob3N0bmFtZVwiLFxuICBcImhyZWZcIixcbiAgXCJwYXRobmFtZVwiLFxuICBcInBvcnRcIixcbiAgXCJwcm90b2NvbFwiLFxuICBcInNlYXJjaFwiXG5dO1xuZnVuY3Rpb24gdXNlQnJvd3NlckxvY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IHdpbmRvdyA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlZnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgV1JJVEFCTEVfUFJPUEVSVElFUy5tYXAoKGtleSkgPT4gW2tleSwgcmVmKCldKVxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHJlZjJdIG9mIG9iamVjdEVudHJpZXMocmVmcykpIHtcbiAgICB3YXRjaChyZWYyLCAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LmxvY2F0aW9uKSB8fCB3aW5kb3cubG9jYXRpb25ba2V5XSA9PT0gdmFsdWUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbltrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYnVpbGRTdGF0ZSA9ICh0cmlnZ2VyKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHsgc3RhdGU6IHN0YXRlMiwgbGVuZ3RoIH0gPSAod2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuaGlzdG9yeSkgfHwge307XG4gICAgY29uc3QgeyBvcmlnaW4gfSA9ICh3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5sb2NhdGlvbikgfHwge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgV1JJVEFCTEVfUFJPUEVSVElFUylcbiAgICAgIHJlZnNba2V5XS52YWx1ZSA9IChfYSA9IHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LmxvY2F0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogX2Fba2V5XTtcbiAgICByZXR1cm4gcmVhY3RpdmUoe1xuICAgICAgdHJpZ2dlcixcbiAgICAgIHN0YXRlOiBzdGF0ZTIsXG4gICAgICBsZW5ndGgsXG4gICAgICBvcmlnaW4sXG4gICAgICAuLi5yZWZzXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHN0YXRlID0gcmVmKGJ1aWxkU3RhdGUoXCJsb2FkXCIpKTtcbiAgaWYgKHdpbmRvdykge1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcInBvcHN0YXRlXCIsICgpID0+IHN0YXRlLnZhbHVlID0gYnVpbGRTdGF0ZShcInBvcHN0YXRlXCIpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiaGFzaGNoYW5nZVwiLCAoKSA9PiBzdGF0ZS52YWx1ZSA9IGJ1aWxkU3RhdGUoXCJoYXNoY2hhbmdlXCIpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiB1c2VDYWNoZWQocmVmVmFsdWUsIGNvbXBhcmF0b3IgPSAoYSwgYikgPT4gYSA9PT0gYiwgd2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IGNhY2hlZFZhbHVlID0gcmVmKHJlZlZhbHVlLnZhbHVlKTtcbiAgd2F0Y2goKCkgPT4gcmVmVmFsdWUudmFsdWUsICh2YWx1ZSkgPT4ge1xuICAgIGlmICghY29tcGFyYXRvcih2YWx1ZSwgY2FjaGVkVmFsdWUudmFsdWUpKVxuICAgICAgY2FjaGVkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgfSwgd2F0Y2hPcHRpb25zKTtcbiAgcmV0dXJuIGNhY2hlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1c2VQZXJtaXNzaW9uKHBlcm1pc3Npb25EZXNjLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGNvbnRyb2xzID0gZmFsc2UsXG4gICAgbmF2aWdhdG9yID0gZGVmYXVsdE5hdmlnYXRvclxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yICYmIFwicGVybWlzc2lvbnNcIiBpbiBuYXZpZ2F0b3IpO1xuICBsZXQgcGVybWlzc2lvblN0YXR1cztcbiAgY29uc3QgZGVzYyA9IHR5cGVvZiBwZXJtaXNzaW9uRGVzYyA9PT0gXCJzdHJpbmdcIiA/IHsgbmFtZTogcGVybWlzc2lvbkRlc2MgfSA6IHBlcm1pc3Npb25EZXNjO1xuICBjb25zdCBzdGF0ZSA9IHJlZigpO1xuICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICBpZiAocGVybWlzc2lvblN0YXR1cylcbiAgICAgIHN0YXRlLnZhbHVlID0gcGVybWlzc2lvblN0YXR1cy5zdGF0ZTtcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBjcmVhdGVTaW5nbGV0b25Qcm9taXNlKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghcGVybWlzc2lvblN0YXR1cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGVybWlzc2lvblN0YXR1cyA9IGF3YWl0IG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeShkZXNjKTtcbiAgICAgICAgdXNlRXZlbnRMaXN0ZW5lcihwZXJtaXNzaW9uU3RhdHVzLCBcImNoYW5nZVwiLCBvbkNoYW5nZSk7XG4gICAgICAgIG9uQ2hhbmdlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXRlLnZhbHVlID0gXCJwcm9tcHRcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25TdGF0dXM7XG4gIH0pO1xuICBxdWVyeSgpO1xuICBpZiAoY29udHJvbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGUsXG4gICAgICBpc1N1cHBvcnRlZCxcbiAgICAgIHF1ZXJ5XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlQ2xpcGJvYXJkKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgbmF2aWdhdG9yID0gZGVmYXVsdE5hdmlnYXRvcixcbiAgICByZWFkID0gZmFsc2UsXG4gICAgc291cmNlLFxuICAgIGNvcGllZER1cmluZyA9IDE1MDAsXG4gICAgbGVnYWN5ID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciAmJiBcImNsaXBib2FyZFwiIGluIG5hdmlnYXRvcik7XG4gIGNvbnN0IHBlcm1pc3Npb25SZWFkID0gdXNlUGVybWlzc2lvbihcImNsaXBib2FyZC1yZWFkXCIpO1xuICBjb25zdCBwZXJtaXNzaW9uV3JpdGUgPSB1c2VQZXJtaXNzaW9uKFwiY2xpcGJvYXJkLXdyaXRlXCIpO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IGNvbXB1dGVkKCgpID0+IGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlIHx8IGxlZ2FjeSk7XG4gIGNvbnN0IHRleHQgPSByZWYoXCJcIik7XG4gIGNvbnN0IGNvcGllZCA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IHRpbWVvdXQgPSB1c2VUaW1lb3V0Rm4oKCkgPT4gY29waWVkLnZhbHVlID0gZmFsc2UsIGNvcGllZER1cmluZyk7XG4gIGZ1bmN0aW9uIHVwZGF0ZVRleHQoKSB7XG4gICAgaWYgKGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlICYmIGlzQWxsb3dlZChwZXJtaXNzaW9uUmVhZC52YWx1ZSkpIHtcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0ZXh0LnZhbHVlID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dC52YWx1ZSA9IGxlZ2FjeVJlYWQoKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHJlYWQpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVUZXh0KTtcbiAgYXN5bmMgZnVuY3Rpb24gY29weSh2YWx1ZSA9IHRvVmFsdWUoc291cmNlKSkge1xuICAgIGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25Xcml0ZS52YWx1ZSkpXG4gICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbHVlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgbGVnYWN5Q29weSh2YWx1ZSk7XG4gICAgICB0ZXh0LnZhbHVlID0gdmFsdWU7XG4gICAgICBjb3BpZWQudmFsdWUgPSB0cnVlO1xuICAgICAgdGltZW91dC5zdGFydCgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBsZWdhY3lDb3B5KHZhbHVlKSB7XG4gICAgY29uc3QgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgdGEudmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBcIlwiO1xuICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIHRhLnN0eWxlLm9wYWNpdHkgPSBcIjBcIjtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTtcbiAgICB0YS5zZWxlY3QoKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG4gICAgdGEucmVtb3ZlKCk7XG4gIH1cbiAgZnVuY3Rpb24gbGVnYWN5UmVhZCgpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gKF9jID0gKF9iID0gKF9hID0gZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LmdldFNlbGVjdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwoZG9jdW1lbnQpKSA9PSBudWxsID8gdm9pZCAwIDogX2IudG9TdHJpbmcoKSkgIT0gbnVsbCA/IF9jIDogXCJcIjtcbiAgfVxuICBmdW5jdGlvbiBpc0FsbG93ZWQoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gXCJncmFudGVkXCIgfHwgc3RhdHVzID09PSBcInByb21wdFwiO1xuICB9XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgdGV4dCxcbiAgICBjb3BpZWQsXG4gICAgY29weVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VDbGlwYm9hcmRJdGVtcyhvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIG5hdmlnYXRvciA9IGRlZmF1bHROYXZpZ2F0b3IsXG4gICAgcmVhZCA9IGZhbHNlLFxuICAgIHNvdXJjZSxcbiAgICBjb3BpZWREdXJpbmcgPSAxNTAwXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IgJiYgXCJjbGlwYm9hcmRcIiBpbiBuYXZpZ2F0b3IpO1xuICBjb25zdCBjb250ZW50ID0gcmVmKFtdKTtcbiAgY29uc3QgY29waWVkID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXRGbigoKSA9PiBjb3BpZWQudmFsdWUgPSBmYWxzZSwgY29waWVkRHVyaW5nKTtcbiAgZnVuY3Rpb24gdXBkYXRlQ29udGVudCgpIHtcbiAgICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnRlbnQudmFsdWUgPSBpdGVtcztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZClcbiAgICB1c2VFdmVudExpc3RlbmVyKFtcImNvcHlcIiwgXCJjdXRcIl0sIHVwZGF0ZUNvbnRlbnQpO1xuICBhc3luYyBmdW5jdGlvbiBjb3B5KHZhbHVlID0gdG9WYWx1ZShzb3VyY2UpKSB7XG4gICAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUodmFsdWUpO1xuICAgICAgY29udGVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgY29waWVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXQuc3RhcnQoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBjb250ZW50LFxuICAgIGNvcGllZCxcbiAgICBjb3B5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsb25lRm5KU09OKHNvdXJjZSkge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzb3VyY2UpKTtcbn1cbmZ1bmN0aW9uIHVzZUNsb25lZChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbG9uZWQgPSByZWYoe30pO1xuICBjb25zdCB7XG4gICAgbWFudWFsLFxuICAgIGNsb25lID0gY2xvbmVGbkpTT04sXG4gICAgLy8gd2F0Y2ggb3B0aW9uc1xuICAgIGRlZXAgPSB0cnVlLFxuICAgIGltbWVkaWF0ZSA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGZ1bmN0aW9uIHN5bmMoKSB7XG4gICAgY2xvbmVkLnZhbHVlID0gY2xvbmUodG9WYWx1ZShzb3VyY2UpKTtcbiAgfVxuICBpZiAoIW1hbnVhbCAmJiAoaXNSZWYoc291cmNlKSB8fCB0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgd2F0Y2goc291cmNlLCBzeW5jLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZGVlcCxcbiAgICAgIGltbWVkaWF0ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHN5bmMoKTtcbiAgfVxuICByZXR1cm4geyBjbG9uZWQsIHN5bmMgfTtcbn1cblxuY29uc3QgX2dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDoge307XG5jb25zdCBnbG9iYWxLZXkgPSBcIl9fdnVldXNlX3Nzcl9oYW5kbGVyc19fXCI7XG5jb25zdCBoYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRIYW5kbGVycygpO1xuZnVuY3Rpb24gZ2V0SGFuZGxlcnMoKSB7XG4gIGlmICghKGdsb2JhbEtleSBpbiBfZ2xvYmFsKSlcbiAgICBfZ2xvYmFsW2dsb2JhbEtleV0gPSBfZ2xvYmFsW2dsb2JhbEtleV0gfHwge307XG4gIHJldHVybiBfZ2xvYmFsW2dsb2JhbEtleV07XG59XG5mdW5jdGlvbiBnZXRTU1JIYW5kbGVyKGtleSwgZmFsbGJhY2spIHtcbiAgcmV0dXJuIGhhbmRsZXJzW2tleV0gfHwgZmFsbGJhY2s7XG59XG5mdW5jdGlvbiBzZXRTU1JIYW5kbGVyKGtleSwgZm4pIHtcbiAgaGFuZGxlcnNba2V5XSA9IGZuO1xufVxuXG5mdW5jdGlvbiBndWVzc1NlcmlhbGl6ZXJUeXBlKHJhd0luaXQpIHtcbiAgcmV0dXJuIHJhd0luaXQgPT0gbnVsbCA/IFwiYW55XCIgOiByYXdJbml0IGluc3RhbmNlb2YgU2V0ID8gXCJzZXRcIiA6IHJhd0luaXQgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogcmF3SW5pdCBpbnN0YW5jZW9mIERhdGUgPyBcImRhdGVcIiA6IHR5cGVvZiByYXdJbml0ID09PSBcImJvb2xlYW5cIiA/IFwiYm9vbGVhblwiIDogdHlwZW9mIHJhd0luaXQgPT09IFwic3RyaW5nXCIgPyBcInN0cmluZ1wiIDogdHlwZW9mIHJhd0luaXQgPT09IFwib2JqZWN0XCIgPyBcIm9iamVjdFwiIDogIU51bWJlci5pc05hTihyYXdJbml0KSA/IFwibnVtYmVyXCIgOiBcImFueVwiO1xufVxuXG5jb25zdCBTdG9yYWdlU2VyaWFsaXplcnMgPSB7XG4gIGJvb2xlYW46IHtcbiAgICByZWFkOiAodikgPT4gdiA9PT0gXCJ0cnVlXCIsXG4gICAgd3JpdGU6ICh2KSA9PiBTdHJpbmcodilcbiAgfSxcbiAgb2JqZWN0OiB7XG4gICAgcmVhZDogKHYpID0+IEpTT04ucGFyc2UodiksXG4gICAgd3JpdGU6ICh2KSA9PiBKU09OLnN0cmluZ2lmeSh2KVxuICB9LFxuICBudW1iZXI6IHtcbiAgICByZWFkOiAodikgPT4gTnVtYmVyLnBhcnNlRmxvYXQodiksXG4gICAgd3JpdGU6ICh2KSA9PiBTdHJpbmcodilcbiAgfSxcbiAgYW55OiB7XG4gICAgcmVhZDogKHYpID0+IHYsXG4gICAgd3JpdGU6ICh2KSA9PiBTdHJpbmcodilcbiAgfSxcbiAgc3RyaW5nOiB7XG4gICAgcmVhZDogKHYpID0+IHYsXG4gICAgd3JpdGU6ICh2KSA9PiBTdHJpbmcodilcbiAgfSxcbiAgbWFwOiB7XG4gICAgcmVhZDogKHYpID0+IG5ldyBNYXAoSlNPTi5wYXJzZSh2KSksXG4gICAgd3JpdGU6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHYuZW50cmllcygpKSlcbiAgfSxcbiAgc2V0OiB7XG4gICAgcmVhZDogKHYpID0+IG5ldyBTZXQoSlNPTi5wYXJzZSh2KSksXG4gICAgd3JpdGU6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHYpKVxuICB9LFxuICBkYXRlOiB7XG4gICAgcmVhZDogKHYpID0+IG5ldyBEYXRlKHYpLFxuICAgIHdyaXRlOiAodikgPT4gdi50b0lTT1N0cmluZygpXG4gIH1cbn07XG5jb25zdCBjdXN0b21TdG9yYWdlRXZlbnROYW1lID0gXCJ2dWV1c2Utc3RvcmFnZVwiO1xuZnVuY3Rpb24gdXNlU3RvcmFnZShrZXksIGRlZmF1bHRzLCBzdG9yYWdlLCBvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hO1xuICBjb25zdCB7XG4gICAgZmx1c2ggPSBcInByZVwiLFxuICAgIGRlZXAgPSB0cnVlLFxuICAgIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLFxuICAgIHdyaXRlRGVmYXVsdHMgPSB0cnVlLFxuICAgIG1lcmdlRGVmYXVsdHMgPSBmYWxzZSxcbiAgICBzaGFsbG93LFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgZXZlbnRGaWx0ZXIsXG4gICAgb25FcnJvciA9IChlKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH0sXG4gICAgaW5pdE9uTW91bnRlZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZGF0YSA9IChzaGFsbG93ID8gc2hhbGxvd1JlZiA6IHJlZikodHlwZW9mIGRlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0cygpIDogZGVmYXVsdHMpO1xuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgc3RvcmFnZSA9IGdldFNTUkhhbmRsZXIoXCJnZXREZWZhdWx0U3RvcmFnZVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBfYTI7XG4gICAgICAgIHJldHVybiAoX2EyID0gZGVmYXVsdFdpbmRvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5sb2NhbFN0b3JhZ2U7XG4gICAgICB9KSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9uRXJyb3IoZSk7XG4gICAgfVxuICB9XG4gIGlmICghc3RvcmFnZSlcbiAgICByZXR1cm4gZGF0YTtcbiAgY29uc3QgcmF3SW5pdCA9IHRvVmFsdWUoZGVmYXVsdHMpO1xuICBjb25zdCB0eXBlID0gZ3Vlc3NTZXJpYWxpemVyVHlwZShyYXdJbml0KTtcbiAgY29uc3Qgc2VyaWFsaXplciA9IChfYSA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT0gbnVsbCA/IF9hIDogU3RvcmFnZVNlcmlhbGl6ZXJzW3R5cGVdO1xuICBjb25zdCB7IHBhdXNlOiBwYXVzZVdhdGNoLCByZXN1bWU6IHJlc3VtZVdhdGNoIH0gPSBwYXVzYWJsZVdhdGNoKFxuICAgIGRhdGEsXG4gICAgKCkgPT4gd3JpdGUoZGF0YS52YWx1ZSksXG4gICAgeyBmbHVzaCwgZGVlcCwgZXZlbnRGaWx0ZXIgfVxuICApO1xuICBpZiAod2luZG93ICYmIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMpIHtcbiAgICB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwic3RvcmFnZVwiLCB1cGRhdGUpO1xuICAgICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIHVwZGF0ZUZyb21DdXN0b21FdmVudCk7XG4gICAgICBpZiAoaW5pdE9uTW91bnRlZClcbiAgICAgICAgdXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFpbml0T25Nb3VudGVkKVxuICAgIHVwZGF0ZSgpO1xuICBmdW5jdGlvbiBkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKHdpbmRvdykge1xuICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIHtcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG9sZFZhbHVlLFxuICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgIHN0b3JhZ2VBcmVhOiBzdG9yYWdlXG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd3JpdGUodikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICBkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG51bGwpO1xuICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVyLndyaXRlKHYpO1xuICAgICAgICBpZiAob2xkVmFsdWUgIT09IHNlcmlhbGl6ZWQpIHtcbiAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBzZXJpYWxpemVkKTtcbiAgICAgICAgICBkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIHNlcmlhbGl6ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25FcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVhZChldmVudCkge1xuICAgIGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIGlmIChyYXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAod3JpdGVEZWZhdWx0cyAmJiByYXdJbml0ICE9IG51bGwpXG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShrZXksIHNlcmlhbGl6ZXIud3JpdGUocmF3SW5pdCkpO1xuICAgICAgcmV0dXJuIHJhd0luaXQ7XG4gICAgfSBlbHNlIGlmICghZXZlbnQgJiYgbWVyZ2VEZWZhdWx0cykge1xuICAgICAgY29uc3QgdmFsdWUgPSBzZXJpYWxpemVyLnJlYWQocmF3VmFsdWUpO1xuICAgICAgaWYgKHR5cGVvZiBtZXJnZURlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBtZXJnZURlZmF1bHRzKHZhbHVlLCByYXdJbml0KTtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICByZXR1cm4geyAuLi5yYXdJbml0LCAuLi52YWx1ZSB9O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhd1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVyLnJlYWQocmF3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuc3RvcmFnZUFyZWEgIT09IHN0b3JhZ2UpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleSA9PSBudWxsKSB7XG4gICAgICBkYXRhLnZhbHVlID0gcmF3SW5pdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleSAhPT0ga2V5KVxuICAgICAgcmV0dXJuO1xuICAgIHBhdXNlV2F0Y2goKTtcbiAgICB0cnkge1xuICAgICAgaWYgKChldmVudCA9PSBudWxsID8gdm9pZCAwIDogZXZlbnQubmV3VmFsdWUpICE9PSBzZXJpYWxpemVyLndyaXRlKGRhdGEudmFsdWUpKVxuICAgICAgICBkYXRhLnZhbHVlID0gcmVhZChldmVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25FcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGV2ZW50KVxuICAgICAgICBuZXh0VGljayhyZXN1bWVXYXRjaCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc3VtZVdhdGNoKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZUZyb21DdXN0b21FdmVudChldmVudCkge1xuICAgIHVwZGF0ZShldmVudC5kZXRhaWwpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWREYXJrKG9wdGlvbnMpIHtcbiAgcmV0dXJuIHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiB1c2VDb2xvck1vZGUob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBzZWxlY3RvciA9IFwiaHRtbFwiLFxuICAgIGF0dHJpYnV0ZSA9IFwiY2xhc3NcIixcbiAgICBpbml0aWFsVmFsdWUgPSBcImF1dG9cIixcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93LFxuICAgIHN0b3JhZ2UsXG4gICAgc3RvcmFnZUtleSA9IFwidnVldXNlLWNvbG9yLXNjaGVtZVwiLFxuICAgIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLFxuICAgIHN0b3JhZ2VSZWYsXG4gICAgZW1pdEF1dG8sXG4gICAgZGlzYWJsZVRyYW5zaXRpb24gPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBtb2RlcyA9IHtcbiAgICBhdXRvOiBcIlwiLFxuICAgIGxpZ2h0OiBcImxpZ2h0XCIsXG4gICAgZGFyazogXCJkYXJrXCIsXG4gICAgLi4ub3B0aW9ucy5tb2RlcyB8fCB7fVxuICB9O1xuICBjb25zdCBwcmVmZXJyZWREYXJrID0gdXNlUHJlZmVycmVkRGFyayh7IHdpbmRvdyB9KTtcbiAgY29uc3Qgc3lzdGVtID0gY29tcHV0ZWQoKCkgPT4gcHJlZmVycmVkRGFyay52YWx1ZSA/IFwiZGFya1wiIDogXCJsaWdodFwiKTtcbiAgY29uc3Qgc3RvcmUgPSBzdG9yYWdlUmVmIHx8IChzdG9yYWdlS2V5ID09IG51bGwgPyB0b1JlZihpbml0aWFsVmFsdWUpIDogdXNlU3RvcmFnZShzdG9yYWdlS2V5LCBpbml0aWFsVmFsdWUsIHN0b3JhZ2UsIHsgd2luZG93LCBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzIH0pKTtcbiAgY29uc3Qgc3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS52YWx1ZSA9PT0gXCJhdXRvXCIgPyBzeXN0ZW0udmFsdWUgOiBzdG9yZS52YWx1ZSk7XG4gIGNvbnN0IHVwZGF0ZUhUTUxBdHRycyA9IGdldFNTUkhhbmRsZXIoXG4gICAgXCJ1cGRhdGVIVE1MQXR0cnNcIixcbiAgICAoc2VsZWN0b3IyLCBhdHRyaWJ1dGUyLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZWwgPSB0eXBlb2Ygc2VsZWN0b3IyID09PSBcInN0cmluZ1wiID8gd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcjIpIDogdW5yZWZFbGVtZW50KHNlbGVjdG9yMik7XG4gICAgICBpZiAoIWVsKVxuICAgICAgICByZXR1cm47XG4gICAgICBsZXQgc3R5bGU7XG4gICAgICBpZiAoZGlzYWJsZVRyYW5zaXRpb24pIHtcbiAgICAgICAgc3R5bGUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgICBjb25zdCBzdHlsZVN0cmluZyA9IFwiKiwqOjpiZWZvcmUsKjo6YWZ0ZXJ7LXdlYmtpdC10cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50Oy1tb3otdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstby10cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50Oy1tcy10cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50O3RyYW5zaXRpb246bm9uZSFpbXBvcnRhbnR9XCI7XG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0eWxlU3RyaW5nKSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGUyID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHZhbHVlLnNwbGl0KC9cXHMvZyk7XG4gICAgICAgIE9iamVjdC52YWx1ZXMobW9kZXMpLmZsYXRNYXAoKGkpID0+IChpIHx8IFwiXCIpLnNwbGl0KC9cXHMvZykpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQuaW5jbHVkZXModikpXG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKHYpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUodik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZTIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlVHJhbnNpdGlvbikge1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSkub3BhY2l0eTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzdHlsZSk7XG4gICAgICB9XG4gICAgfVxuICApO1xuICBmdW5jdGlvbiBkZWZhdWx0T25DaGFuZ2VkKG1vZGUpIHtcbiAgICB2YXIgX2E7XG4gICAgdXBkYXRlSFRNTEF0dHJzKHNlbGVjdG9yLCBhdHRyaWJ1dGUsIChfYSA9IG1vZGVzW21vZGVdKSAhPSBudWxsID8gX2EgOiBtb2RlKTtcbiAgfVxuICBmdW5jdGlvbiBvbkNoYW5nZWQobW9kZSkge1xuICAgIGlmIChvcHRpb25zLm9uQ2hhbmdlZClcbiAgICAgIG9wdGlvbnMub25DaGFuZ2VkKG1vZGUsIGRlZmF1bHRPbkNoYW5nZWQpO1xuICAgIGVsc2VcbiAgICAgIGRlZmF1bHRPbkNoYW5nZWQobW9kZSk7XG4gIH1cbiAgd2F0Y2goc3RhdGUsIG9uQ2hhbmdlZCwgeyBmbHVzaDogXCJwb3N0XCIsIGltbWVkaWF0ZTogdHJ1ZSB9KTtcbiAgdHJ5T25Nb3VudGVkKCgpID0+IG9uQ2hhbmdlZChzdGF0ZS52YWx1ZSkpO1xuICBjb25zdCBhdXRvID0gY29tcHV0ZWQoe1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBlbWl0QXV0byA/IHN0b3JlLnZhbHVlIDogc3RhdGUudmFsdWU7XG4gICAgfSxcbiAgICBzZXQodikge1xuICAgICAgc3RvcmUudmFsdWUgPSB2O1xuICAgIH1cbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXV0bywgeyBzdG9yZSwgc3lzdGVtLCBzdGF0ZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBhdXRvO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNvbmZpcm1EaWFsb2cocmV2ZWFsZWQgPSByZWYoZmFsc2UpKSB7XG4gIGNvbnN0IGNvbmZpcm1Ib29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG4gIGNvbnN0IGNhbmNlbEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcbiAgY29uc3QgcmV2ZWFsSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuICBsZXQgX3Jlc29sdmUgPSBub29wO1xuICBjb25zdCByZXZlYWwgPSAoZGF0YSkgPT4ge1xuICAgIHJldmVhbEhvb2sudHJpZ2dlcihkYXRhKTtcbiAgICByZXZlYWxlZC52YWx1ZSA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGNvbmZpcm0gPSAoZGF0YSkgPT4ge1xuICAgIHJldmVhbGVkLnZhbHVlID0gZmFsc2U7XG4gICAgY29uZmlybUhvb2sudHJpZ2dlcihkYXRhKTtcbiAgICBfcmVzb2x2ZSh7IGRhdGEsIGlzQ2FuY2VsZWQ6IGZhbHNlIH0pO1xuICB9O1xuICBjb25zdCBjYW5jZWwgPSAoZGF0YSkgPT4ge1xuICAgIHJldmVhbGVkLnZhbHVlID0gZmFsc2U7XG4gICAgY2FuY2VsSG9vay50cmlnZ2VyKGRhdGEpO1xuICAgIF9yZXNvbHZlKHsgZGF0YSwgaXNDYW5jZWxlZDogdHJ1ZSB9KTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpc1JldmVhbGVkOiBjb21wdXRlZCgoKSA9PiByZXZlYWxlZC52YWx1ZSksXG4gICAgcmV2ZWFsLFxuICAgIGNvbmZpcm0sXG4gICAgY2FuY2VsLFxuICAgIG9uUmV2ZWFsOiByZXZlYWxIb29rLm9uLFxuICAgIG9uQ29uZmlybTogY29uZmlybUhvb2sub24sXG4gICAgb25DYW5jZWw6IGNhbmNlbEhvb2sub25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93LCAuLi5tdXRhdGlvbk9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIGxldCBvYnNlcnZlcjtcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93ICYmIFwiTXV0YXRpb25PYnNlcnZlclwiIGluIHdpbmRvdyk7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICBvYnNlcnZlciA9IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRhcmdldHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0b1ZhbHVlKHRhcmdldCk7XG4gICAgY29uc3QgaXRlbXMgPSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcbiAgICByZXR1cm4gbmV3IFNldChpdGVtcyk7XG4gIH0pO1xuICBjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChcbiAgICAoKSA9PiB0YXJnZXRzLnZhbHVlLFxuICAgICh0YXJnZXRzMikgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyAmJiB0YXJnZXRzMi5zaXplKSB7XG4gICAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgICB0YXJnZXRzMi5mb3JFYWNoKChlbCkgPT4gb2JzZXJ2ZXIub2JzZXJ2ZShlbCwgbXV0YXRpb25PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGltbWVkaWF0ZTogdHJ1ZSwgZmx1c2g6IFwicG9zdFwiIH1cbiAgKTtcbiAgY29uc3QgdGFrZVJlY29yZHMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIG9ic2VydmVyID09IG51bGwgPyB2b2lkIDAgOiBvYnNlcnZlci50YWtlUmVjb3JkcygpO1xuICB9O1xuICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBzdG9wV2F0Y2goKTtcbiAgfTtcbiAgdHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgc3RvcCxcbiAgICB0YWtlUmVjb3Jkc1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VDc3NWYXIocHJvcCwgdGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93LCBpbml0aWFsVmFsdWUgPSBcIlwiLCBvYnNlcnZlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHZhcmlhYmxlID0gcmVmKGluaXRpYWxWYWx1ZSk7XG4gIGNvbnN0IGVsUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gdW5yZWZFbGVtZW50KHRhcmdldCkgfHwgKChfYSA9IHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LmRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2EuZG9jdW1lbnRFbGVtZW50KTtcbiAgfSk7XG4gIGZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcigpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qga2V5ID0gdG9WYWx1ZShwcm9wKTtcbiAgICBjb25zdCBlbCA9IHRvVmFsdWUoZWxSZWYpO1xuICAgIGlmIChlbCAmJiB3aW5kb3cpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKF9hID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLmdldFByb3BlcnR5VmFsdWUoa2V5KSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnRyaW0oKTtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWUgfHwgaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAob2JzZXJ2ZSkge1xuICAgIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxSZWYsIHVwZGF0ZUNzc1Zhciwge1xuICAgICAgYXR0cmlidXRlRmlsdGVyOiBbXCJzdHlsZVwiLCBcImNsYXNzXCJdLFxuICAgICAgd2luZG93XG4gICAgfSk7XG4gIH1cbiAgd2F0Y2goXG4gICAgW2VsUmVmLCAoKSA9PiB0b1ZhbHVlKHByb3ApXSxcbiAgICB1cGRhdGVDc3NWYXIsXG4gICAgeyBpbW1lZGlhdGU6IHRydWUgfVxuICApO1xuICB3YXRjaChcbiAgICB2YXJpYWJsZSxcbiAgICAodmFsKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAoKF9hID0gZWxSZWYudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYS5zdHlsZSlcbiAgICAgICAgZWxSZWYudmFsdWUuc3R5bGUuc2V0UHJvcGVydHkodG9WYWx1ZShwcm9wKSwgdmFsKTtcbiAgICB9XG4gICk7XG4gIHJldHVybiB2YXJpYWJsZTtcbn1cblxuZnVuY3Rpb24gdXNlQ3VycmVudEVsZW1lbnQocm9vdENvbXBvbmVudCkge1xuICBjb25zdCB2bSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBjb25zdCBjdXJyZW50RWxlbWVudCA9IGNvbXB1dGVkV2l0aENvbnRyb2woXG4gICAgKCkgPT4gbnVsbCxcbiAgICAoKSA9PiByb290Q29tcG9uZW50ID8gdW5yZWZFbGVtZW50KHJvb3RDb21wb25lbnQpIDogdm0ucHJveHkuJGVsXG4gICk7XG4gIG9uVXBkYXRlZChjdXJyZW50RWxlbWVudC50cmlnZ2VyKTtcbiAgb25Nb3VudGVkKGN1cnJlbnRFbGVtZW50LnRyaWdnZXIpO1xuICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHVzZUN5Y2xlTGlzdChsaXN0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihnZXRJbml0aWFsVmFsdWUoKSk7XG4gIGNvbnN0IGxpc3RSZWYgPSB0b1JlZihsaXN0KTtcbiAgY29uc3QgaW5kZXggPSBjb21wdXRlZCh7XG4gICAgZ2V0KCkge1xuICAgICAgdmFyIF9hO1xuICAgICAgY29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG4gICAgICBsZXQgaW5kZXgyID0gKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0SW5kZXhPZikgPyBvcHRpb25zLmdldEluZGV4T2Yoc3RhdGUudmFsdWUsIHRhcmdldExpc3QpIDogdGFyZ2V0TGlzdC5pbmRleE9mKHN0YXRlLnZhbHVlKTtcbiAgICAgIGlmIChpbmRleDIgPCAwKVxuICAgICAgICBpbmRleDIgPSAoX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrSW5kZXgpICE9IG51bGwgPyBfYSA6IDA7XG4gICAgICByZXR1cm4gaW5kZXgyO1xuICAgIH0sXG4gICAgc2V0KHYpIHtcbiAgICAgIHNldCh2KTtcbiAgICB9XG4gIH0pO1xuICBmdW5jdGlvbiBzZXQoaSkge1xuICAgIGNvbnN0IHRhcmdldExpc3QgPSBsaXN0UmVmLnZhbHVlO1xuICAgIGNvbnN0IGxlbmd0aCA9IHRhcmdldExpc3QubGVuZ3RoO1xuICAgIGNvbnN0IGluZGV4MiA9IChpICUgbGVuZ3RoICsgbGVuZ3RoKSAlIGxlbmd0aDtcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldExpc3RbaW5kZXgyXTtcbiAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBzaGlmdChkZWx0YSA9IDEpIHtcbiAgICByZXR1cm4gc2V0KGluZGV4LnZhbHVlICsgZGVsdGEpO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQobiA9IDEpIHtcbiAgICByZXR1cm4gc2hpZnQobik7XG4gIH1cbiAgZnVuY3Rpb24gcHJldihuID0gMSkge1xuICAgIHJldHVybiBzaGlmdCgtbik7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0SW5pdGlhbFZhbHVlKCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIChfYiA9IHRvVmFsdWUoKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5pbml0aWFsVmFsdWUpICE9IG51bGwgPyBfYSA6IHRvVmFsdWUobGlzdClbMF0pKSAhPSBudWxsID8gX2IgOiB2b2lkIDA7XG4gIH1cbiAgd2F0Y2gobGlzdFJlZiwgKCkgPT4gc2V0KGluZGV4LnZhbHVlKSk7XG4gIHJldHVybiB7XG4gICAgc3RhdGUsXG4gICAgaW5kZXgsXG4gICAgbmV4dCxcbiAgICBwcmV2LFxuICAgIGdvOiBzZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRGFyayhvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHZhbHVlRGFyayA9IFwiZGFya1wiLFxuICAgIHZhbHVlTGlnaHQgPSBcIlwiLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IG1vZGUgPSB1c2VDb2xvck1vZGUoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb25DaGFuZ2VkOiAobW9kZTIsIGRlZmF1bHRIYW5kbGVyKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAob3B0aW9ucy5vbkNoYW5nZWQpXG4gICAgICAgIChfYSA9IG9wdGlvbnMub25DaGFuZ2VkKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChvcHRpb25zLCBtb2RlMiA9PT0gXCJkYXJrXCIsIGRlZmF1bHRIYW5kbGVyLCBtb2RlMik7XG4gICAgICBlbHNlXG4gICAgICAgIGRlZmF1bHRIYW5kbGVyKG1vZGUyKTtcbiAgICB9LFxuICAgIG1vZGVzOiB7XG4gICAgICBkYXJrOiB2YWx1ZURhcmssXG4gICAgICBsaWdodDogdmFsdWVMaWdodFxuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHN5c3RlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAobW9kZS5zeXN0ZW0pIHtcbiAgICAgIHJldHVybiBtb2RlLnN5c3RlbS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZmVycmVkRGFyayA9IHVzZVByZWZlcnJlZERhcmsoeyB3aW5kb3cgfSk7XG4gICAgICByZXR1cm4gcHJlZmVycmVkRGFyay52YWx1ZSA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGlzRGFyayA9IGNvbXB1dGVkKHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gbW9kZS52YWx1ZSA9PT0gXCJkYXJrXCI7XG4gICAgfSxcbiAgICBzZXQodikge1xuICAgICAgY29uc3QgbW9kZVZhbCA9IHYgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbiAgICAgIGlmIChzeXN0ZW0udmFsdWUgPT09IG1vZGVWYWwpXG4gICAgICAgIG1vZGUudmFsdWUgPSBcImF1dG9cIjtcbiAgICAgIGVsc2VcbiAgICAgICAgbW9kZS52YWx1ZSA9IG1vZGVWYWw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGlzRGFyaztcbn1cblxuZnVuY3Rpb24gZm5CeXBhc3Modikge1xuICByZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIGZuU2V0U291cmNlKHNvdXJjZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZGVmYXVsdER1bXAoY2xvbmUpIHtcbiAgcmV0dXJuIGNsb25lID8gdHlwZW9mIGNsb25lID09PSBcImZ1bmN0aW9uXCIgPyBjbG9uZSA6IGNsb25lRm5KU09OIDogZm5CeXBhc3M7XG59XG5mdW5jdGlvbiBkZWZhdWx0UGFyc2UoY2xvbmUpIHtcbiAgcmV0dXJuIGNsb25lID8gdHlwZW9mIGNsb25lID09PSBcImZ1bmN0aW9uXCIgPyBjbG9uZSA6IGNsb25lRm5KU09OIDogZm5CeXBhc3M7XG59XG5mdW5jdGlvbiB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjbG9uZSA9IGZhbHNlLFxuICAgIGR1bXAgPSBkZWZhdWx0RHVtcChjbG9uZSksXG4gICAgcGFyc2UgPSBkZWZhdWx0UGFyc2UoY2xvbmUpLFxuICAgIHNldFNvdXJjZSA9IGZuU2V0U291cmNlXG4gIH0gPSBvcHRpb25zO1xuICBmdW5jdGlvbiBfY3JlYXRlSGlzdG9yeVJlY29yZCgpIHtcbiAgICByZXR1cm4gbWFya1Jhdyh7XG4gICAgICBzbmFwc2hvdDogZHVtcChzb3VyY2UudmFsdWUpLFxuICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAoKVxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGxhc3QgPSByZWYoX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKSk7XG4gIGNvbnN0IHVuZG9TdGFjayA9IHJlZihbXSk7XG4gIGNvbnN0IHJlZG9TdGFjayA9IHJlZihbXSk7XG4gIGNvbnN0IF9zZXRTb3VyY2UgPSAocmVjb3JkKSA9PiB7XG4gICAgc2V0U291cmNlKHNvdXJjZSwgcGFyc2UocmVjb3JkLnNuYXBzaG90KSk7XG4gICAgbGFzdC52YWx1ZSA9IHJlY29yZDtcbiAgfTtcbiAgY29uc3QgY29tbWl0ID0gKCkgPT4ge1xuICAgIHVuZG9TdGFjay52YWx1ZS51bnNoaWZ0KGxhc3QudmFsdWUpO1xuICAgIGxhc3QudmFsdWUgPSBfY3JlYXRlSGlzdG9yeVJlY29yZCgpO1xuICAgIGlmIChvcHRpb25zLmNhcGFjaXR5ICYmIHVuZG9TdGFjay52YWx1ZS5sZW5ndGggPiBvcHRpb25zLmNhcGFjaXR5KVxuICAgICAgdW5kb1N0YWNrLnZhbHVlLnNwbGljZShvcHRpb25zLmNhcGFjaXR5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGlmIChyZWRvU3RhY2sudmFsdWUubGVuZ3RoKVxuICAgICAgcmVkb1N0YWNrLnZhbHVlLnNwbGljZSgwLCByZWRvU3RhY2sudmFsdWUubGVuZ3RoKTtcbiAgfTtcbiAgY29uc3QgY2xlYXIgPSAoKSA9PiB7XG4gICAgdW5kb1N0YWNrLnZhbHVlLnNwbGljZSgwLCB1bmRvU3RhY2sudmFsdWUubGVuZ3RoKTtcbiAgICByZWRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHJlZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuICB9O1xuICBjb25zdCB1bmRvID0gKCkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gdW5kb1N0YWNrLnZhbHVlLnNoaWZ0KCk7XG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICByZWRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcbiAgICAgIF9zZXRTb3VyY2Uoc3RhdGUpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVkbyA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZG9TdGFjay52YWx1ZS5zaGlmdCgpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdW5kb1N0YWNrLnZhbHVlLnVuc2hpZnQobGFzdC52YWx1ZSk7XG4gICAgICBfc2V0U291cmNlKHN0YXRlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgIF9zZXRTb3VyY2UobGFzdC52YWx1ZSk7XG4gIH07XG4gIGNvbnN0IGhpc3RvcnkgPSBjb21wdXRlZCgoKSA9PiBbbGFzdC52YWx1ZSwgLi4udW5kb1N0YWNrLnZhbHVlXSk7XG4gIGNvbnN0IGNhblVuZG8gPSBjb21wdXRlZCgoKSA9PiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gMCk7XG4gIGNvbnN0IGNhblJlZG8gPSBjb21wdXRlZCgoKSA9PiByZWRvU3RhY2sudmFsdWUubGVuZ3RoID4gMCk7XG4gIHJldHVybiB7XG4gICAgc291cmNlLFxuICAgIHVuZG9TdGFjayxcbiAgICByZWRvU3RhY2ssXG4gICAgbGFzdCxcbiAgICBoaXN0b3J5LFxuICAgIGNhblVuZG8sXG4gICAgY2FuUmVkbyxcbiAgICBjbGVhcixcbiAgICBjb21taXQsXG4gICAgcmVzZXQsXG4gICAgdW5kbyxcbiAgICByZWRvXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGRlZXAgPSBmYWxzZSxcbiAgICBmbHVzaCA9IFwicHJlXCIsXG4gICAgZXZlbnRGaWx0ZXJcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtcbiAgICBldmVudEZpbHRlcjogY29tcG9zZWRGaWx0ZXIsXG4gICAgcGF1c2UsXG4gICAgcmVzdW1lOiByZXN1bWVUcmFja2luZyxcbiAgICBpc0FjdGl2ZTogaXNUcmFja2luZ1xuICB9ID0gcGF1c2FibGVGaWx0ZXIoZXZlbnRGaWx0ZXIpO1xuICBjb25zdCB7XG4gICAgaWdub3JlVXBkYXRlcyxcbiAgICBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzLFxuICAgIHN0b3BcbiAgfSA9IHdhdGNoSWdub3JhYmxlKFxuICAgIHNvdXJjZSxcbiAgICBjb21taXQsXG4gICAgeyBkZWVwLCBmbHVzaCwgZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyIH1cbiAgKTtcbiAgZnVuY3Rpb24gc2V0U291cmNlKHNvdXJjZTIsIHZhbHVlKSB7XG4gICAgaWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuICAgIGlnbm9yZVVwZGF0ZXMoKCkgPT4ge1xuICAgICAgc291cmNlMi52YWx1ZSA9IHZhbHVlO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IG1hbnVhbEhpc3RvcnkgPSB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwgeyAuLi5vcHRpb25zLCBjbG9uZTogb3B0aW9ucy5jbG9uZSB8fCBkZWVwLCBzZXRTb3VyY2UgfSk7XG4gIGNvbnN0IHsgY2xlYXIsIGNvbW1pdDogbWFudWFsQ29tbWl0IH0gPSBtYW51YWxIaXN0b3J5O1xuICBmdW5jdGlvbiBjb21taXQoKSB7XG4gICAgaWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuICAgIG1hbnVhbENvbW1pdCgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlc3VtZShjb21taXROb3cpIHtcbiAgICByZXN1bWVUcmFja2luZygpO1xuICAgIGlmIChjb21taXROb3cpXG4gICAgICBjb21taXQoKTtcbiAgfVxuICBmdW5jdGlvbiBiYXRjaChmbikge1xuICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IGNhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZ25vcmVVcGRhdGVzKCgpID0+IHtcbiAgICAgIGZuKGNhbmNlbCk7XG4gICAgfSk7XG4gICAgaWYgKCFjYW5jZWxlZClcbiAgICAgIGNvbW1pdCgpO1xuICB9XG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgc3RvcCgpO1xuICAgIGNsZWFyKCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5tYW51YWxIaXN0b3J5LFxuICAgIGlzVHJhY2tpbmcsXG4gICAgcGF1c2UsXG4gICAgcmVzdW1lLFxuICAgIGNvbW1pdCxcbiAgICBiYXRjaCxcbiAgICBkaXNwb3NlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZURlYm91bmNlZFJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgZmlsdGVyID0gb3B0aW9ucy5kZWJvdW5jZSA/IGRlYm91bmNlRmlsdGVyKG9wdGlvbnMuZGVib3VuY2UpIDogdm9pZCAwO1xuICBjb25zdCBoaXN0b3J5ID0gdXNlUmVmSGlzdG9yeShzb3VyY2UsIHsgLi4ub3B0aW9ucywgZXZlbnRGaWx0ZXI6IGZpbHRlciB9KTtcbiAgcmV0dXJuIHtcbiAgICAuLi5oaXN0b3J5XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZURldmljZU1vdGlvbihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgZXZlbnRGaWx0ZXIgPSBieXBhc3NGaWx0ZXJcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFjY2VsZXJhdGlvbiA9IHJlZih7IHg6IG51bGwsIHk6IG51bGwsIHo6IG51bGwgfSk7XG4gIGNvbnN0IHJvdGF0aW9uUmF0ZSA9IHJlZih7IGFscGhhOiBudWxsLCBiZXRhOiBudWxsLCBnYW1tYTogbnVsbCB9KTtcbiAgY29uc3QgaW50ZXJ2YWwgPSByZWYoMCk7XG4gIGNvbnN0IGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkgPSByZWYoe1xuICAgIHg6IG51bGwsXG4gICAgeTogbnVsbCxcbiAgICB6OiBudWxsXG4gIH0pO1xuICBpZiAod2luZG93KSB7XG4gICAgY29uc3Qgb25EZXZpY2VNb3Rpb24gPSBjcmVhdGVGaWx0ZXJXcmFwcGVyKFxuICAgICAgZXZlbnRGaWx0ZXIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgYWNjZWxlcmF0aW9uLnZhbHVlID0gZXZlbnQuYWNjZWxlcmF0aW9uO1xuICAgICAgICBhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LnZhbHVlID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eTtcbiAgICAgICAgcm90YXRpb25SYXRlLnZhbHVlID0gZXZlbnQucm90YXRpb25SYXRlO1xuICAgICAgICBpbnRlcnZhbC52YWx1ZSA9IGV2ZW50LmludGVydmFsO1xuICAgICAgfVxuICAgICk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiZGV2aWNlbW90aW9uXCIsIG9uRGV2aWNlTW90aW9uKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFjY2VsZXJhdGlvbixcbiAgICBhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LFxuICAgIHJvdGF0aW9uUmF0ZSxcbiAgICBpbnRlcnZhbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VEZXZpY2VPcmllbnRhdGlvbihvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3cgJiYgXCJEZXZpY2VPcmllbnRhdGlvbkV2ZW50XCIgaW4gd2luZG93KTtcbiAgY29uc3QgaXNBYnNvbHV0ZSA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGFscGhhID0gcmVmKG51bGwpO1xuICBjb25zdCBiZXRhID0gcmVmKG51bGwpO1xuICBjb25zdCBnYW1tYSA9IHJlZihudWxsKTtcbiAgaWYgKHdpbmRvdyAmJiBpc1N1cHBvcnRlZC52YWx1ZSkge1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcImRldmljZW9yaWVudGF0aW9uXCIsIChldmVudCkgPT4ge1xuICAgICAgaXNBYnNvbHV0ZS52YWx1ZSA9IGV2ZW50LmFic29sdXRlO1xuICAgICAgYWxwaGEudmFsdWUgPSBldmVudC5hbHBoYTtcbiAgICAgIGJldGEudmFsdWUgPSBldmVudC5iZXRhO1xuICAgICAgZ2FtbWEudmFsdWUgPSBldmVudC5nYW1tYTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGlzQWJzb2x1dGUsXG4gICAgYWxwaGEsXG4gICAgYmV0YSxcbiAgICBnYW1tYVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VEZXZpY2VQaXhlbFJhdGlvKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2luZG93ID0gZGVmYXVsdFdpbmRvd1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcGl4ZWxSYXRpbyA9IHJlZigxKTtcbiAgaWYgKHdpbmRvdykge1xuICAgIGxldCBvYnNlcnZlMiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcGl4ZWxSYXRpby52YWx1ZSA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgY2xlYW51cDIoKTtcbiAgICAgIG1lZGlhID0gd2luZG93Lm1hdGNoTWVkaWEoYChyZXNvbHV0aW9uOiAke3BpeGVsUmF0aW8udmFsdWV9ZHBweClgKTtcbiAgICAgIG1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgb2JzZXJ2ZTIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9LCBjbGVhbnVwMiA9IGZ1bmN0aW9uKCkge1xuICAgICAgbWVkaWEgPT0gbnVsbCA/IHZvaWQgMCA6IG1lZGlhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgb2JzZXJ2ZTIpO1xuICAgIH07XG4gICAgbGV0IG1lZGlhO1xuICAgIG9ic2VydmUyKCk7XG4gICAgdHJ5T25TY29wZURpc3Bvc2UoY2xlYW51cDIpO1xuICB9XG4gIHJldHVybiB7IHBpeGVsUmF0aW8gfTtcbn1cblxuZnVuY3Rpb24gdXNlRGV2aWNlc0xpc3Qob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBuYXZpZ2F0b3IgPSBkZWZhdWx0TmF2aWdhdG9yLFxuICAgIHJlcXVlc3RQZXJtaXNzaW9ucyA9IGZhbHNlLFxuICAgIGNvbnN0cmFpbnRzID0geyBhdWRpbzogdHJ1ZSwgdmlkZW86IHRydWUgfSxcbiAgICBvblVwZGF0ZWRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGRldmljZXMgPSByZWYoW10pO1xuICBjb25zdCB2aWRlb0lucHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKSk7XG4gIGNvbnN0IGF1ZGlvSW5wdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb2lucHV0XCIpKTtcbiAgY29uc3QgYXVkaW9PdXRwdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKSk7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcyk7XG4gIGNvbnN0IHBlcm1pc3Npb25HcmFudGVkID0gcmVmKGZhbHNlKTtcbiAgbGV0IHN0cmVhbTtcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgZGV2aWNlcy52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIG9uVXBkYXRlZCA9PSBudWxsID8gdm9pZCAwIDogb25VcGRhdGVkKGRldmljZXMudmFsdWUpO1xuICAgIGlmIChzdHJlYW0pIHtcbiAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG4gICAgICBzdHJlYW0gPSBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBlbnN1cmVQZXJtaXNzaW9ucygpIHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHsgc3RhdGUsIHF1ZXJ5IH0gPSB1c2VQZXJtaXNzaW9uKFwiY2FtZXJhXCIsIHsgY29udHJvbHM6IHRydWUgfSk7XG4gICAgYXdhaXQgcXVlcnkoKTtcbiAgICBpZiAoc3RhdGUudmFsdWUgIT09IFwiZ3JhbnRlZFwiKSB7XG4gICAgICBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7XG4gICAgICB1cGRhdGUoKTtcbiAgICAgIHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG4gIH1cbiAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG4gICAgaWYgKHJlcXVlc3RQZXJtaXNzaW9ucylcbiAgICAgIGVuc3VyZVBlcm1pc3Npb25zKCk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcihuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLCBcImRldmljZWNoYW5nZVwiLCB1cGRhdGUpO1xuICAgIHVwZGF0ZSgpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGV2aWNlcyxcbiAgICBlbnN1cmVQZXJtaXNzaW9ucyxcbiAgICBwZXJtaXNzaW9uR3JhbnRlZCxcbiAgICB2aWRlb0lucHV0cyxcbiAgICBhdWRpb0lucHV0cyxcbiAgICBhdWRpb091dHB1dHMsXG4gICAgaXNTdXBwb3J0ZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRGlzcGxheU1lZGlhKG9wdGlvbnMgPSB7fSkge1xuICB2YXIgX2E7XG4gIGNvbnN0IGVuYWJsZWQgPSByZWYoKF9hID0gb3B0aW9ucy5lbmFibGVkKSAhPSBudWxsID8gX2EgOiBmYWxzZSk7XG4gIGNvbnN0IHZpZGVvID0gb3B0aW9ucy52aWRlbztcbiAgY29uc3QgYXVkaW8gPSBvcHRpb25zLmF1ZGlvO1xuICBjb25zdCB7IG5hdmlnYXRvciA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IHtcbiAgICB2YXIgX2EyO1xuICAgIHJldHVybiAoX2EyID0gbmF2aWdhdG9yID09IG51bGwgPyB2b2lkIDAgOiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLmdldERpc3BsYXlNZWRpYTtcbiAgfSk7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSB7IGF1ZGlvLCB2aWRlbyB9O1xuICBjb25zdCBzdHJlYW0gPSBzaGFsbG93UmVmKCk7XG4gIGFzeW5jIGZ1bmN0aW9uIF9zdGFydCgpIHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8IHN0cmVhbS52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBzdHJlYW0udmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYShjb25zdHJhaW50KTtcbiAgICByZXR1cm4gc3RyZWFtLnZhbHVlO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIF9zdG9wKCkge1xuICAgIHZhciBfYTI7XG4gICAgKF9hMiA9IHN0cmVhbS52YWx1ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG4gICAgc3RyZWFtLnZhbHVlID0gdm9pZCAwO1xuICB9XG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgX3N0b3AoKTtcbiAgICBlbmFibGVkLnZhbHVlID0gZmFsc2U7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgYXdhaXQgX3N0YXJ0KCk7XG4gICAgaWYgKHN0cmVhbS52YWx1ZSlcbiAgICAgIGVuYWJsZWQudmFsdWUgPSB0cnVlO1xuICAgIHJldHVybiBzdHJlYW0udmFsdWU7XG4gIH1cbiAgd2F0Y2goXG4gICAgZW5hYmxlZCxcbiAgICAodikgPT4ge1xuICAgICAgaWYgKHYpXG4gICAgICAgIF9zdGFydCgpO1xuICAgICAgZWxzZVxuICAgICAgICBfc3RvcCgpO1xuICAgIH0sXG4gICAgeyBpbW1lZGlhdGU6IHRydWUgfVxuICApO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIHN0cmVhbSxcbiAgICBzdGFydCxcbiAgICBzdG9wLFxuICAgIGVuYWJsZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRG9jdW1lbnRWaXNpYmlsaXR5KG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IGRvY3VtZW50ID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuICBpZiAoIWRvY3VtZW50KVxuICAgIHJldHVybiByZWYoXCJ2aXNpYmxlXCIpO1xuICBjb25zdCB2aXNpYmlsaXR5ID0gcmVmKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG4gICAgdmlzaWJpbGl0eS52YWx1ZSA9IGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZTtcbiAgfSk7XG4gIHJldHVybiB2aXNpYmlsaXR5O1xufVxuXG5mdW5jdGlvbiB1c2VEcmFnZ2FibGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3Qge1xuICAgIHBvaW50ZXJUeXBlcyxcbiAgICBwcmV2ZW50RGVmYXVsdCxcbiAgICBzdG9wUHJvcGFnYXRpb24sXG4gICAgZXhhY3QsXG4gICAgb25Nb3ZlLFxuICAgIG9uRW5kLFxuICAgIG9uU3RhcnQsXG4gICAgaW5pdGlhbFZhbHVlLFxuICAgIGF4aXMgPSBcImJvdGhcIixcbiAgICBkcmFnZ2luZ0VsZW1lbnQgPSBkZWZhdWx0V2luZG93LFxuICAgIGNvbnRhaW5lckVsZW1lbnQsXG4gICAgaGFuZGxlOiBkcmFnZ2luZ0hhbmRsZSA9IHRhcmdldFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcG9zaXRpb24gPSByZWYoXG4gICAgKF9hID0gdG9WYWx1ZShpbml0aWFsVmFsdWUpKSAhPSBudWxsID8gX2EgOiB7IHg6IDAsIHk6IDAgfVxuICApO1xuICBjb25zdCBwcmVzc2VkRGVsdGEgPSByZWYoKTtcbiAgY29uc3QgZmlsdGVyRXZlbnQgPSAoZSkgPT4ge1xuICAgIGlmIChwb2ludGVyVHlwZXMpXG4gICAgICByZXR1cm4gcG9pbnRlclR5cGVzLmluY2x1ZGVzKGUucG9pbnRlclR5cGUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBjb25zdCBoYW5kbGVFdmVudCA9IChlKSA9PiB7XG4gICAgaWYgKHRvVmFsdWUocHJldmVudERlZmF1bHQpKVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0b1ZhbHVlKHN0b3BQcm9wYWdhdGlvbikpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuICBjb25zdCBzdGFydCA9IChlKSA9PiB7XG4gICAgdmFyIF9hMjtcbiAgICBpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSB8fCAhZmlsdGVyRXZlbnQoZSkpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHRvVmFsdWUoZXhhY3QpICYmIGUudGFyZ2V0ICE9PSB0b1ZhbHVlKHRhcmdldCkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gKF9hMiA9IGNvbnRhaW5lciA9PSBudWxsID8gdm9pZCAwIDogY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5jYWxsKGNvbnRhaW5lcik7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb3MgPSB7XG4gICAgICB4OiBlLmNsaWVudFggLSAoY29udGFpbmVyID8gdGFyZ2V0UmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0ICsgY29udGFpbmVyLnNjcm9sbExlZnQgOiB0YXJnZXRSZWN0LmxlZnQpLFxuICAgICAgeTogZS5jbGllbnRZIC0gKGNvbnRhaW5lciA/IHRhcmdldFJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wIDogdGFyZ2V0UmVjdC50b3ApXG4gICAgfTtcbiAgICBpZiAoKG9uU3RhcnQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uU3RhcnQocG9zLCBlKSkgPT09IGZhbHNlKVxuICAgICAgcmV0dXJuO1xuICAgIHByZXNzZWREZWx0YS52YWx1ZSA9IHBvcztcbiAgICBoYW5kbGVFdmVudChlKTtcbiAgfTtcbiAgY29uc3QgbW92ZSA9IChlKSA9PiB7XG4gICAgaWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghcHJlc3NlZERlbHRhLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRvVmFsdWUoY29udGFpbmVyRWxlbWVudCk7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgeyB4LCB5IH0gPSBwb3NpdGlvbi52YWx1ZTtcbiAgICBpZiAoYXhpcyA9PT0gXCJ4XCIgfHwgYXhpcyA9PT0gXCJib3RoXCIpIHtcbiAgICAgIHggPSBlLmNsaWVudFggLSBwcmVzc2VkRGVsdGEudmFsdWUueDtcbiAgICAgIGlmIChjb250YWluZXIpXG4gICAgICAgIHggPSBNYXRoLm1pbihNYXRoLm1heCgwLCB4KSwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gdGFyZ2V0UmVjdC53aWR0aCk7XG4gICAgfVxuICAgIGlmIChheGlzID09PSBcInlcIiB8fCBheGlzID09PSBcImJvdGhcIikge1xuICAgICAgeSA9IGUuY2xpZW50WSAtIHByZXNzZWREZWx0YS52YWx1ZS55O1xuICAgICAgaWYgKGNvbnRhaW5lcilcbiAgICAgICAgeSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHkpLCBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQpO1xuICAgIH1cbiAgICBwb3NpdGlvbi52YWx1ZSA9IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgICBvbk1vdmUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uTW92ZShwb3NpdGlvbi52YWx1ZSwgZSk7XG4gICAgaGFuZGxlRXZlbnQoZSk7XG4gIH07XG4gIGNvbnN0IGVuZCA9IChlKSA9PiB7XG4gICAgaWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghcHJlc3NlZERlbHRhLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIHByZXNzZWREZWx0YS52YWx1ZSA9IHZvaWQgMDtcbiAgICBvbkVuZCA9PSBudWxsID8gdm9pZCAwIDogb25FbmQocG9zaXRpb24udmFsdWUsIGUpO1xuICAgIGhhbmRsZUV2ZW50KGUpO1xuICB9O1xuICBpZiAoaXNDbGllbnQpIHtcbiAgICBjb25zdCBjb25maWcgPSB7IGNhcHR1cmU6IChfYiA9IG9wdGlvbnMuY2FwdHVyZSkgIT0gbnVsbCA/IF9iIDogdHJ1ZSB9O1xuICAgIHVzZUV2ZW50TGlzdGVuZXIoZHJhZ2dpbmdIYW5kbGUsIFwicG9pbnRlcmRvd25cIiwgc3RhcnQsIGNvbmZpZyk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcihkcmFnZ2luZ0VsZW1lbnQsIFwicG9pbnRlcm1vdmVcIiwgbW92ZSwgY29uZmlnKTtcbiAgICB1c2VFdmVudExpc3RlbmVyKGRyYWdnaW5nRWxlbWVudCwgXCJwb2ludGVydXBcIiwgZW5kLCBjb25maWcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4udG9SZWZzKHBvc2l0aW9uKSxcbiAgICBwb3NpdGlvbixcbiAgICBpc0RyYWdnaW5nOiBjb21wdXRlZCgoKSA9PiAhIXByZXNzZWREZWx0YS52YWx1ZSksXG4gICAgc3R5bGU6IGNvbXB1dGVkKFxuICAgICAgKCkgPT4gYGxlZnQ6JHtwb3NpdGlvbi52YWx1ZS54fXB4O3RvcDoke3Bvc2l0aW9uLnZhbHVlLnl9cHg7YFxuICAgIClcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRHJvcFpvbmUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgaXNPdmVyRHJvcFpvbmUgPSByZWYoZmFsc2UpO1xuICBjb25zdCBmaWxlcyA9IHNoYWxsb3dSZWYobnVsbCk7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgbGV0IGlzRGF0YVR5cGVJbmNsdWRlZCA9IHRydWU7XG4gIGlmIChpc0NsaWVudCkge1xuICAgIGNvbnN0IF9vcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHsgb25Ecm9wOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuICAgIGNvbnN0IGdldEZpbGVzID0gKGV2ZW50KSA9PiB7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgY29uc3QgbGlzdCA9IEFycmF5LmZyb20oKF9iID0gKF9hID0gZXZlbnQuZGF0YVRyYW5zZmVyKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZmlsZXMpICE9IG51bGwgPyBfYiA6IFtdKTtcbiAgICAgIHJldHVybiBmaWxlcy52YWx1ZSA9IGxpc3QubGVuZ3RoID09PSAwID8gbnVsbCA6IGxpc3Q7XG4gICAgfTtcbiAgICB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcmFnZW50ZXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5mcm9tKCgoX2EgPSBldmVudCA9PSBudWxsID8gdm9pZCAwIDogZXZlbnQuZGF0YVRyYW5zZmVyKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaXRlbXMpIHx8IFtdKS5tYXAoKGkpID0+IGkua2luZCA9PT0gXCJmaWxlXCIgPyBpLnR5cGUgOiBudWxsKS5maWx0ZXIobm90TnVsbGlzaCk7XG4gICAgICBpZiAoX29wdGlvbnMuZGF0YVR5cGVzICYmIGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICBjb25zdCBkYXRhVHlwZXMgPSB1bnJlZihfb3B0aW9ucy5kYXRhVHlwZXMpO1xuICAgICAgICBpc0RhdGFUeXBlSW5jbHVkZWQgPSB0eXBlb2YgZGF0YVR5cGVzID09PSBcImZ1bmN0aW9uXCIgPyBkYXRhVHlwZXModHlwZXMpIDogZGF0YVR5cGVzID8gZGF0YVR5cGVzLnNvbWUoKGl0ZW0pID0+IHR5cGVzLmluY2x1ZGVzKGl0ZW0pKSA6IHRydWU7XG4gICAgICAgIGlmICghaXNEYXRhVHlwZUluY2x1ZGVkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb3VudGVyICs9IDE7XG4gICAgICBpc092ZXJEcm9wWm9uZS52YWx1ZSA9IHRydWU7XG4gICAgICAoX2IgPSBfb3B0aW9ucy5vbkVudGVyKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChfb3B0aW9ucywgZ2V0RmlsZXMoZXZlbnQpLCBldmVudCk7XG4gICAgfSk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ292ZXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAoIWlzRGF0YVR5cGVJbmNsdWRlZClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIChfYSA9IF9vcHRpb25zLm9uT3ZlcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwoX29wdGlvbnMsIGdldEZpbGVzKGV2ZW50KSwgZXZlbnQpO1xuICAgIH0pO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdsZWF2ZVwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGlmICghaXNEYXRhVHlwZUluY2x1ZGVkKVxuICAgICAgICByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY291bnRlciAtPSAxO1xuICAgICAgaWYgKGNvdW50ZXIgPT09IDApXG4gICAgICAgIGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG4gICAgICAoX2EgPSBfb3B0aW9ucy5vbkxlYXZlKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChfb3B0aW9ucywgZ2V0RmlsZXMoZXZlbnQpLCBldmVudCk7XG4gICAgfSk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJvcFwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb3VudGVyID0gMDtcbiAgICAgIGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG4gICAgICAoX2EgPSBfb3B0aW9ucy5vbkRyb3ApID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKF9vcHRpb25zLCBnZXRGaWxlcyhldmVudCksIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVzLFxuICAgIGlzT3ZlckRyb3Bab25lXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csIC4uLm9ic2VydmVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgbGV0IG9ic2VydmVyO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3cgJiYgXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyk7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICBvYnNlcnZlciA9IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRhcmdldHMgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubWFwKChlbCkgPT4gdW5yZWZFbGVtZW50KGVsKSkgOiBbdW5yZWZFbGVtZW50KHRhcmdldCldKTtcbiAgY29uc3Qgc3RvcFdhdGNoID0gd2F0Y2goXG4gICAgdGFyZ2V0cyxcbiAgICAoZWxzKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93KSB7XG4gICAgICAgIG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgICAgZm9yIChjb25zdCBfZWwgb2YgZWxzKVxuICAgICAgICAgIF9lbCAmJiBvYnNlcnZlci5vYnNlcnZlKF9lbCwgb2JzZXJ2ZXJPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgaW1tZWRpYXRlOiB0cnVlLCBmbHVzaDogXCJwb3N0XCIgfVxuICApO1xuICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBzdG9wV2F0Y2goKTtcbiAgfTtcbiAgdHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgc3RvcFxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VFbGVtZW50Qm91bmRpbmcodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHJlc2V0ID0gdHJ1ZSxcbiAgICB3aW5kb3dSZXNpemUgPSB0cnVlLFxuICAgIHdpbmRvd1Njcm9sbCA9IHRydWUsXG4gICAgaW1tZWRpYXRlID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaGVpZ2h0ID0gcmVmKDApO1xuICBjb25zdCBib3R0b20gPSByZWYoMCk7XG4gIGNvbnN0IGxlZnQgPSByZWYoMCk7XG4gIGNvbnN0IHJpZ2h0ID0gcmVmKDApO1xuICBjb25zdCB0b3AgPSByZWYoMCk7XG4gIGNvbnN0IHdpZHRoID0gcmVmKDApO1xuICBjb25zdCB4ID0gcmVmKDApO1xuICBjb25zdCB5ID0gcmVmKDApO1xuICBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgY29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcbiAgICBpZiAoIWVsKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgaGVpZ2h0LnZhbHVlID0gMDtcbiAgICAgICAgYm90dG9tLnZhbHVlID0gMDtcbiAgICAgICAgbGVmdC52YWx1ZSA9IDA7XG4gICAgICAgIHJpZ2h0LnZhbHVlID0gMDtcbiAgICAgICAgdG9wLnZhbHVlID0gMDtcbiAgICAgICAgd2lkdGgudmFsdWUgPSAwO1xuICAgICAgICB4LnZhbHVlID0gMDtcbiAgICAgICAgeS52YWx1ZSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBoZWlnaHQudmFsdWUgPSByZWN0LmhlaWdodDtcbiAgICBib3R0b20udmFsdWUgPSByZWN0LmJvdHRvbTtcbiAgICBsZWZ0LnZhbHVlID0gcmVjdC5sZWZ0O1xuICAgIHJpZ2h0LnZhbHVlID0gcmVjdC5yaWdodDtcbiAgICB0b3AudmFsdWUgPSByZWN0LnRvcDtcbiAgICB3aWR0aC52YWx1ZSA9IHJlY3Qud2lkdGg7XG4gICAgeC52YWx1ZSA9IHJlY3QueDtcbiAgICB5LnZhbHVlID0gcmVjdC55O1xuICB9XG4gIHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldCwgdXBkYXRlKTtcbiAgd2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbGUpID0+ICFlbGUgJiYgdXBkYXRlKCkpO1xuICB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgdXBkYXRlLCB7XG4gICAgYXR0cmlidXRlRmlsdGVyOiBbXCJzdHlsZVwiLCBcImNsYXNzXCJdXG4gIH0pO1xuICBpZiAod2luZG93U2Nyb2xsKVxuICAgIHVzZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7XG4gIGlmICh3aW5kb3dSZXNpemUpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgdHJ5T25Nb3VudGVkKCgpID0+IHtcbiAgICBpZiAoaW1tZWRpYXRlKVxuICAgICAgdXBkYXRlKCk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGhlaWdodCxcbiAgICBib3R0b20sXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICB0b3AsXG4gICAgd2lkdGgsXG4gICAgeCxcbiAgICB5LFxuICAgIHVwZGF0ZVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VFbGVtZW50QnlQb2ludChvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgZG9jdW1lbnQgPSBkZWZhdWx0RG9jdW1lbnQsXG4gICAgbXVsdGlwbGUsXG4gICAgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLFxuICAgIGltbWVkaWF0ZSA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IHtcbiAgICBpZiAodG9WYWx1ZShtdWx0aXBsZSkpXG4gICAgICByZXR1cm4gZG9jdW1lbnQgJiYgXCJlbGVtZW50c0Zyb21Qb2ludFwiIGluIGRvY3VtZW50O1xuICAgIHJldHVybiBkb2N1bWVudCAmJiBcImVsZW1lbnRGcm9tUG9pbnRcIiBpbiBkb2N1bWVudDtcbiAgfSk7XG4gIGNvbnN0IGVsZW1lbnQgPSByZWYobnVsbCk7XG4gIGNvbnN0IGNiID0gKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgZWxlbWVudC52YWx1ZSA9IHRvVmFsdWUobXVsdGlwbGUpID8gKF9hID0gZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KHRvVmFsdWUoeCksIHRvVmFsdWUoeSkpKSAhPSBudWxsID8gX2EgOiBbXSA6IChfYiA9IGRvY3VtZW50ID09IG51bGwgPyB2b2lkIDAgOiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvVmFsdWUoeCksIHRvVmFsdWUoeSkpKSAhPSBudWxsID8gX2IgOiBudWxsO1xuICB9O1xuICBjb25zdCBjb250cm9scyA9IGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGVsZW1lbnQsXG4gICAgLi4uY29udHJvbHNcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRWxlbWVudEhvdmVyKGVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGRlbGF5RW50ZXIgPSAwLFxuICAgIGRlbGF5TGVhdmUgPSAwLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzSG92ZXJlZCA9IHJlZihmYWxzZSk7XG4gIGxldCB0aW1lcjtcbiAgY29uc3QgdG9nZ2xlID0gKGVudGVyaW5nKSA9PiB7XG4gICAgY29uc3QgZGVsYXkgPSBlbnRlcmluZyA/IGRlbGF5RW50ZXIgOiBkZWxheUxlYXZlO1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoZGVsYXkpXG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gaXNIb3ZlcmVkLnZhbHVlID0gZW50ZXJpbmcsIGRlbGF5KTtcbiAgICBlbHNlXG4gICAgICBpc0hvdmVyZWQudmFsdWUgPSBlbnRlcmluZztcbiAgfTtcbiAgaWYgKCF3aW5kb3cpXG4gICAgcmV0dXJuIGlzSG92ZXJlZDtcbiAgdXNlRXZlbnRMaXN0ZW5lcihlbCwgXCJtb3VzZWVudGVyXCIsICgpID0+IHRvZ2dsZSh0cnVlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICB1c2VFdmVudExpc3RlbmVyKGVsLCBcIm1vdXNlbGVhdmVcIiwgKCkgPT4gdG9nZ2xlKGZhbHNlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICByZXR1cm4gaXNIb3ZlcmVkO1xufVxuXG5mdW5jdGlvbiB1c2VFbGVtZW50U2l6ZSh0YXJnZXQsIGluaXRpYWxTaXplID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csIGJveCA9IFwiY29udGVudC1ib3hcIiB9ID0gb3B0aW9ucztcbiAgY29uc3QgaXNTVkcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gdW5yZWZFbGVtZW50KHRhcmdldCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5uYW1lc3BhY2VVUkkpID09IG51bGwgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhcInN2Z1wiKTtcbiAgfSk7XG4gIGNvbnN0IHdpZHRoID0gcmVmKGluaXRpYWxTaXplLndpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gcmVmKGluaXRpYWxTaXplLmhlaWdodCk7XG4gIGNvbnN0IHsgc3RvcDogc3RvcDEgfSA9IHVzZVJlc2l6ZU9ic2VydmVyKFxuICAgIHRhcmdldCxcbiAgICAoW2VudHJ5XSkgPT4ge1xuICAgICAgY29uc3QgYm94U2l6ZSA9IGJveCA9PT0gXCJib3JkZXItYm94XCIgPyBlbnRyeS5ib3JkZXJCb3hTaXplIDogYm94ID09PSBcImNvbnRlbnQtYm94XCIgPyBlbnRyeS5jb250ZW50Qm94U2l6ZSA6IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemU7XG4gICAgICBpZiAod2luZG93ICYmIGlzU1ZHLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0ICRlbGVtID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG4gICAgICAgIGlmICgkZWxlbSkge1xuICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCRlbGVtKTtcbiAgICAgICAgICB3aWR0aC52YWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy53aWR0aCk7XG4gICAgICAgICAgaGVpZ2h0LnZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLmhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChib3hTaXplKSB7XG4gICAgICAgICAgY29uc3QgZm9ybWF0Qm94U2l6ZSA9IEFycmF5LmlzQXJyYXkoYm94U2l6ZSkgPyBib3hTaXplIDogW2JveFNpemVdO1xuICAgICAgICAgIHdpZHRoLnZhbHVlID0gZm9ybWF0Qm94U2l6ZS5yZWR1Y2UoKGFjYywgeyBpbmxpbmVTaXplIH0pID0+IGFjYyArIGlubGluZVNpemUsIDApO1xuICAgICAgICAgIGhlaWdodC52YWx1ZSA9IGZvcm1hdEJveFNpemUucmVkdWNlKChhY2MsIHsgYmxvY2tTaXplIH0pID0+IGFjYyArIGJsb2NrU2l6ZSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2lkdGgudmFsdWUgPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcbiAgICAgICAgICBoZWlnaHQudmFsdWUgPSBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKTtcbiAgdHJ5T25Nb3VudGVkKCgpID0+IHtcbiAgICBjb25zdCBlbGUgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB3aWR0aC52YWx1ZSA9IFwib2Zmc2V0V2lkdGhcIiBpbiBlbGUgPyBlbGUub2Zmc2V0V2lkdGggOiBpbml0aWFsU2l6ZS53aWR0aDtcbiAgICAgIGhlaWdodC52YWx1ZSA9IFwib2Zmc2V0SGVpZ2h0XCIgaW4gZWxlID8gZWxlLm9mZnNldEhlaWdodCA6IGluaXRpYWxTaXplLmhlaWdodDtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBzdG9wMiA9IHdhdGNoKFxuICAgICgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLFxuICAgIChlbGUpID0+IHtcbiAgICAgIHdpZHRoLnZhbHVlID0gZWxlID8gaW5pdGlhbFNpemUud2lkdGggOiAwO1xuICAgICAgaGVpZ2h0LnZhbHVlID0gZWxlID8gaW5pdGlhbFNpemUuaGVpZ2h0IDogMDtcbiAgICB9XG4gICk7XG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc3RvcDEoKTtcbiAgICBzdG9wMigpO1xuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHN0b3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGFyZ2V0LCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICByb290LFxuICAgIHJvb3RNYXJnaW4gPSBcIjBweFwiLFxuICAgIHRocmVzaG9sZCA9IDAuMSxcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93LFxuICAgIGltbWVkaWF0ZSA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyAmJiBcIkludGVyc2VjdGlvbk9ic2VydmVyXCIgaW4gd2luZG93KTtcbiAgY29uc3QgdGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBfdGFyZ2V0ID0gdG9WYWx1ZSh0YXJnZXQpO1xuICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShfdGFyZ2V0KSA/IF90YXJnZXQgOiBbX3RhcmdldF0pLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcbiAgfSk7XG4gIGxldCBjbGVhbnVwID0gbm9vcDtcbiAgY29uc3QgaXNBY3RpdmUgPSByZWYoaW1tZWRpYXRlKTtcbiAgY29uc3Qgc3RvcFdhdGNoID0gaXNTdXBwb3J0ZWQudmFsdWUgPyB3YXRjaChcbiAgICAoKSA9PiBbdGFyZ2V0cy52YWx1ZSwgdW5yZWZFbGVtZW50KHJvb3QpLCBpc0FjdGl2ZS52YWx1ZV0sXG4gICAgKFt0YXJnZXRzMiwgcm9vdDJdKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBpZiAoIWlzQWN0aXZlLnZhbHVlKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIXRhcmdldHMyLmxlbmd0aClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICB7XG4gICAgICAgICAgcm9vdDogdW5yZWZFbGVtZW50KHJvb3QyKSxcbiAgICAgICAgICByb290TWFyZ2luLFxuICAgICAgICAgIHRocmVzaG9sZFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGFyZ2V0czIuZm9yRWFjaCgoZWwpID0+IGVsICYmIG9ic2VydmVyLm9ic2VydmUoZWwpKTtcbiAgICAgIGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2xlYW51cCA9IG5vb3A7XG4gICAgICB9O1xuICAgIH0sXG4gICAgeyBpbW1lZGlhdGUsIGZsdXNoOiBcInBvc3RcIiB9XG4gICkgOiBub29wO1xuICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBzdG9wV2F0Y2goKTtcbiAgICBpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuICB9O1xuICB0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBpc0FjdGl2ZSxcbiAgICBwYXVzZSgpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG4gICAgfSxcbiAgICByZXN1bWUoKSB7XG4gICAgICBpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG4gICAgfSxcbiAgICBzdG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZUVsZW1lbnRWaXNpYmlsaXR5KGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csIHNjcm9sbFRhcmdldCwgdGhyZXNob2xkID0gMCB9ID0gb3B0aW9ucztcbiAgY29uc3QgZWxlbWVudElzVmlzaWJsZSA9IHJlZihmYWxzZSk7XG4gIHVzZUludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgIGVsZW1lbnQsXG4gICAgKGludGVyc2VjdGlvbk9ic2VydmVyRW50cmllcykgPT4ge1xuICAgICAgbGV0IGlzSW50ZXJzZWN0aW5nID0gZWxlbWVudElzVmlzaWJsZS52YWx1ZTtcbiAgICAgIGxldCBsYXRlc3RUaW1lID0gMDtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50aW1lID49IGxhdGVzdFRpbWUpIHtcbiAgICAgICAgICBsYXRlc3RUaW1lID0gZW50cnkudGltZTtcbiAgICAgICAgICBpc0ludGVyc2VjdGluZyA9IGVudHJ5LmlzSW50ZXJzZWN0aW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtZW50SXNWaXNpYmxlLnZhbHVlID0gaXNJbnRlcnNlY3Rpbmc7XG4gICAgfSxcbiAgICB7XG4gICAgICByb290OiBzY3JvbGxUYXJnZXQsXG4gICAgICB3aW5kb3csXG4gICAgICB0aHJlc2hvbGRcbiAgICB9XG4gICk7XG4gIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xufVxuXG5jb25zdCBldmVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXG5mdW5jdGlvbiB1c2VFdmVudEJ1cyhrZXkpIHtcbiAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50U2NvcGUoKTtcbiAgZnVuY3Rpb24gb24obGlzdGVuZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gZXZlbnRzLmdldChrZXkpIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgZXZlbnRzLnNldChrZXksIGxpc3RlbmVycyk7XG4gICAgY29uc3QgX29mZiA9ICgpID0+IG9mZihsaXN0ZW5lcik7XG4gICAgKF9hID0gc2NvcGUgPT0gbnVsbCA/IHZvaWQgMCA6IHNjb3BlLmNsZWFudXBzKSA9PSBudWxsID8gdm9pZCAwIDogX2EucHVzaChfb2ZmKTtcbiAgICByZXR1cm4gX29mZjtcbiAgfVxuICBmdW5jdGlvbiBvbmNlKGxpc3RlbmVyKSB7XG4gICAgZnVuY3Rpb24gX2xpc3RlbmVyKC4uLmFyZ3MpIHtcbiAgICAgIG9mZihfbGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBvbihfbGlzdGVuZXIpO1xuICB9XG4gIGZ1bmN0aW9uIG9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxpc3RlbmVycylcbiAgICAgIHJldHVybjtcbiAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICBpZiAoIWxpc3RlbmVycy5zaXplKVxuICAgICAgcmVzZXQoKTtcbiAgfVxuICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBldmVudHMuZGVsZXRlKGtleSk7XG4gIH1cbiAgZnVuY3Rpb24gZW1pdChldmVudCwgcGF5bG9hZCkge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSBldmVudHMuZ2V0KGtleSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5mb3JFYWNoKCh2KSA9PiB2KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cbiAgcmV0dXJuIHsgb24sIG9uY2UsIG9mZiwgZW1pdCwgcmVzZXQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5lc3RlZE9wdGlvbnMkMShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB0cnVlKVxuICAgIHJldHVybiB7fTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiB1c2VFdmVudFNvdXJjZSh1cmwsIGV2ZW50cyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgZXZlbnQgPSByZWYobnVsbCk7XG4gIGNvbnN0IGRhdGEgPSByZWYobnVsbCk7XG4gIGNvbnN0IHN0YXR1cyA9IHJlZihcIkNPTk5FQ1RJTkdcIik7XG4gIGNvbnN0IGV2ZW50U291cmNlID0gcmVmKG51bGwpO1xuICBjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG4gIGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG4gIGxldCBleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG4gIGxldCByZXRyaWVkID0gMDtcbiAgY29uc3Qge1xuICAgIHdpdGhDcmVkZW50aWFscyA9IGZhbHNlLFxuICAgIGltbWVkaWF0ZSA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuICAgIGlmIChpc0NsaWVudCAmJiBldmVudFNvdXJjZS52YWx1ZSkge1xuICAgICAgZXZlbnRTb3VyY2UudmFsdWUuY2xvc2UoKTtcbiAgICAgIGV2ZW50U291cmNlLnZhbHVlID0gbnVsbDtcbiAgICAgIHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG4gICAgICBleHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IF9pbml0ID0gKCkgPT4ge1xuICAgIGlmIChleHBsaWNpdGx5Q2xvc2VkIHx8IHR5cGVvZiB1cmxSZWYudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZXMgPSBuZXcgRXZlbnRTb3VyY2UodXJsUmVmLnZhbHVlLCB7IHdpdGhDcmVkZW50aWFscyB9KTtcbiAgICBzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcbiAgICBldmVudFNvdXJjZS52YWx1ZSA9IGVzO1xuICAgIGVzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHN0YXR1cy52YWx1ZSA9IFwiT1BFTlwiO1xuICAgICAgZXJyb3IudmFsdWUgPSBudWxsO1xuICAgIH07XG4gICAgZXMub25lcnJvciA9IChlKSA9PiB7XG4gICAgICBzdGF0dXMudmFsdWUgPSBcIkNMT1NFRFwiO1xuICAgICAgZXJyb3IudmFsdWUgPSBlO1xuICAgICAgaWYgKGVzLnJlYWR5U3RhdGUgPT09IDIgJiYgIWV4cGxpY2l0bHlDbG9zZWQgJiYgb3B0aW9ucy5hdXRvUmVjb25uZWN0KSB7XG4gICAgICAgIGVzLmNsb3NlKCk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByZXRyaWVzID0gLTEsXG4gICAgICAgICAgZGVsYXkgPSAxZTMsXG4gICAgICAgICAgb25GYWlsZWRcbiAgICAgICAgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zJDEob3B0aW9ucy5hdXRvUmVjb25uZWN0KTtcbiAgICAgICAgcmV0cmllZCArPSAxO1xuICAgICAgICBpZiAodHlwZW9mIHJldHJpZXMgPT09IFwibnVtYmVyXCIgJiYgKHJldHJpZXMgPCAwIHx8IHJldHJpZWQgPCByZXRyaWVzKSlcbiAgICAgICAgICBzZXRUaW1lb3V0KF9pbml0LCBkZWxheSk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiByZXRyaWVzID09PSBcImZ1bmN0aW9uXCIgJiYgcmV0cmllcygpKVxuICAgICAgICAgIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG9uRmFpbGVkID09IG51bGwgPyB2b2lkIDAgOiBvbkZhaWxlZCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgZXMub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgIGV2ZW50LnZhbHVlID0gbnVsbDtcbiAgICAgIGRhdGEudmFsdWUgPSBlLmRhdGE7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50X25hbWUgb2YgZXZlbnRzKSB7XG4gICAgICB1c2VFdmVudExpc3RlbmVyKGVzLCBldmVudF9uYW1lLCAoZSkgPT4ge1xuICAgICAgICBldmVudC52YWx1ZSA9IGV2ZW50X25hbWU7XG4gICAgICAgIGRhdGEudmFsdWUgPSBlLmRhdGEgfHwgbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgb3BlbiA9ICgpID0+IHtcbiAgICBpZiAoIWlzQ2xpZW50KVxuICAgICAgcmV0dXJuO1xuICAgIGNsb3NlKCk7XG4gICAgZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuICAgIHJldHJpZWQgPSAwO1xuICAgIF9pbml0KCk7XG4gIH07XG4gIGlmIChpbW1lZGlhdGUpXG4gICAgd2F0Y2godXJsUmVmLCBvcGVuLCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcbiAgdHJ5T25TY29wZURpc3Bvc2UoY2xvc2UpO1xuICByZXR1cm4ge1xuICAgIGV2ZW50U291cmNlLFxuICAgIGV2ZW50LFxuICAgIGRhdGEsXG4gICAgc3RhdHVzLFxuICAgIGVycm9yLFxuICAgIG9wZW4sXG4gICAgY2xvc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRXllRHJvcHBlcihvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBpbml0aWFsVmFsdWUgPSBcIlwiIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIFwiRXllRHJvcHBlclwiIGluIHdpbmRvdyk7XG4gIGNvbnN0IHNSR0JIZXggPSByZWYoaW5pdGlhbFZhbHVlKTtcbiAgYXN5bmMgZnVuY3Rpb24gb3BlbihvcGVuT3B0aW9ucykge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZXllRHJvcHBlciA9IG5ldyB3aW5kb3cuRXllRHJvcHBlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV5ZURyb3BwZXIub3BlbihvcGVuT3B0aW9ucyk7XG4gICAgc1JHQkhleC52YWx1ZSA9IHJlc3VsdC5zUkdCSGV4O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHsgaXNTdXBwb3J0ZWQsIHNSR0JIZXgsIG9wZW4gfTtcbn1cblxuZnVuY3Rpb24gdXNlRmF2aWNvbihuZXdJY29uID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBiYXNlVXJsID0gXCJcIixcbiAgICByZWwgPSBcImljb25cIixcbiAgICBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmF2aWNvbiA9IHRvUmVmKG5ld0ljb24pO1xuICBjb25zdCBhcHBseUljb24gPSAoaWNvbikgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvckFsbChgbGlua1tyZWwqPVwiJHtyZWx9XCJdYCk7XG4gICAgaWYgKCFlbGVtZW50cyB8fCBlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICBpZiAobGluaykge1xuICAgICAgICBsaW5rLnJlbCA9IHJlbDtcbiAgICAgICAgbGluay5ocmVmID0gYCR7YmFzZVVybH0ke2ljb259YDtcbiAgICAgICAgbGluay50eXBlID0gYGltYWdlLyR7aWNvbi5zcGxpdChcIi5cIikucG9wKCl9YDtcbiAgICAgICAgZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LmhlYWQuYXBwZW5kKGxpbmspO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50cyA9PSBudWxsID8gdm9pZCAwIDogZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IGVsLmhyZWYgPSBgJHtiYXNlVXJsfSR7aWNvbn1gKTtcbiAgfTtcbiAgd2F0Y2goXG4gICAgZmF2aWNvbixcbiAgICAoaSwgbykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpID09PSBcInN0cmluZ1wiICYmIGkgIT09IG8pXG4gICAgICAgIGFwcGx5SWNvbihpKTtcbiAgICB9LFxuICAgIHsgaW1tZWRpYXRlOiB0cnVlIH1cbiAgKTtcbiAgcmV0dXJuIGZhdmljb247XG59XG5cbmNvbnN0IHBheWxvYWRNYXBwaW5nID0ge1xuICBqc29uOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgdGV4dDogXCJ0ZXh0L3BsYWluXCJcbn07XG5mdW5jdGlvbiBpc0ZldGNoT3B0aW9ucyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBjb250YWluc1Byb3Aob2JqLCBcImltbWVkaWF0ZVwiLCBcInJlZmV0Y2hcIiwgXCJpbml0aWFsRGF0YVwiLCBcInRpbWVvdXRcIiwgXCJiZWZvcmVGZXRjaFwiLCBcImFmdGVyRmV0Y2hcIiwgXCJvbkZldGNoRXJyb3JcIiwgXCJmZXRjaFwiLCBcInVwZGF0ZURhdGFPbkVycm9yXCIpO1xufVxuZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG5mdW5jdGlvbiBoZWFkZXJzVG9PYmplY3QoaGVhZGVycykge1xuICBpZiAodHlwZW9mIEhlYWRlcnMgIT09IFwidW5kZWZpbmVkXCIgJiYgaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhoZWFkZXJzLmVudHJpZXMoKSk7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuZnVuY3Rpb24gY29tYmluZUNhbGxiYWNrcyhjb21iaW5hdGlvbiwgLi4uY2FsbGJhY2tzKSB7XG4gIGlmIChjb21iaW5hdGlvbiA9PT0gXCJvdmVyd3JpdGVcIikge1xuICAgIHJldHVybiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tjYWxsYmFja3MubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIHJldHVybiB7IC4uLmN0eCwgLi4uYXdhaXQgY2FsbGJhY2soY3R4KSB9O1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgICAgY3R4ID0geyAuLi5jdHgsIC4uLmF3YWl0IGNhbGxiYWNrKGN0eCkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdHg7XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRmV0Y2goY29uZmlnID0ge30pIHtcbiAgY29uc3QgX2NvbWJpbmF0aW9uID0gY29uZmlnLmNvbWJpbmF0aW9uIHx8IFwiY2hhaW5cIjtcbiAgY29uc3QgX29wdGlvbnMgPSBjb25maWcub3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgX2ZldGNoT3B0aW9ucyA9IGNvbmZpZy5mZXRjaE9wdGlvbnMgfHwge307XG4gIGZ1bmN0aW9uIHVzZUZhY3RvcnlGZXRjaCh1cmwsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBjb21wdXRlZFVybCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSB0b1ZhbHVlKGNvbmZpZy5iYXNlVXJsKTtcbiAgICAgIGNvbnN0IHRhcmdldFVybCA9IHRvVmFsdWUodXJsKTtcbiAgICAgIHJldHVybiBiYXNlVXJsICYmICFpc0Fic29sdXRlVVJMKHRhcmdldFVybCkgPyBqb2luUGF0aHMoYmFzZVVybCwgdGFyZ2V0VXJsKSA6IHRhcmdldFVybDtcbiAgICB9KTtcbiAgICBsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIGxldCBmZXRjaE9wdGlvbnMgPSBfZmV0Y2hPcHRpb25zO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkge1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgLi4uYXJnc1swXSxcbiAgICAgICAgICBiZWZvcmVGZXRjaDogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLmJlZm9yZUZldGNoLCBhcmdzWzBdLmJlZm9yZUZldGNoKSxcbiAgICAgICAgICBhZnRlckZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYWZ0ZXJGZXRjaCwgYXJnc1swXS5hZnRlckZldGNoKSxcbiAgICAgICAgICBvbkZldGNoRXJyb3I6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5vbkZldGNoRXJyb3IsIGFyZ3NbMF0ub25GZXRjaEVycm9yKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hPcHRpb25zID0ge1xuICAgICAgICAgIC4uLmZldGNoT3B0aW9ucyxcbiAgICAgICAgICAuLi5hcmdzWzBdLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIC4uLmhlYWRlcnNUb09iamVjdChmZXRjaE9wdGlvbnMuaGVhZGVycykgfHwge30sXG4gICAgICAgICAgICAuLi5oZWFkZXJzVG9PYmplY3QoYXJnc1swXS5oZWFkZXJzKSB8fCB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSAmJiBpc0ZldGNoT3B0aW9ucyhhcmdzWzFdKSkge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLi4uYXJnc1sxXSxcbiAgICAgICAgYmVmb3JlRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5iZWZvcmVGZXRjaCwgYXJnc1sxXS5iZWZvcmVGZXRjaCksXG4gICAgICAgIGFmdGVyRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5hZnRlckZldGNoLCBhcmdzWzFdLmFmdGVyRmV0Y2gpLFxuICAgICAgICBvbkZldGNoRXJyb3I6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5vbkZldGNoRXJyb3IsIGFyZ3NbMV0ub25GZXRjaEVycm9yKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZUZldGNoKGNvbXB1dGVkVXJsLCBmZXRjaE9wdGlvbnMsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB1c2VGYWN0b3J5RmV0Y2g7XG59XG5mdW5jdGlvbiB1c2VGZXRjaCh1cmwsIC4uLmFyZ3MpIHtcbiAgdmFyIF9hO1xuICBjb25zdCBzdXBwb3J0c0Fib3J0ID0gdHlwZW9mIEFib3J0Q29udHJvbGxlciA9PT0gXCJmdW5jdGlvblwiO1xuICBsZXQgZmV0Y2hPcHRpb25zID0ge307XG4gIGxldCBvcHRpb25zID0ge1xuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICByZWZldGNoOiBmYWxzZSxcbiAgICB0aW1lb3V0OiAwLFxuICAgIHVwZGF0ZURhdGFPbkVycm9yOiBmYWxzZVxuICB9O1xuICBjb25zdCBjb25maWcgPSB7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHR5cGU6IFwidGV4dFwiLFxuICAgIHBheWxvYWQ6IHZvaWQgMFxuICB9O1xuICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGlzRmV0Y2hPcHRpb25zKGFyZ3NbMF0pKVxuICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uYXJnc1swXSB9O1xuICAgIGVsc2VcbiAgICAgIGZldGNoT3B0aW9ucyA9IGFyZ3NbMF07XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzFdKSlcbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmFyZ3NbMV0gfTtcbiAgfVxuICBjb25zdCB7XG4gICAgZmV0Y2ggPSAoX2EgPSBkZWZhdWx0V2luZG93KSA9PSBudWxsID8gdm9pZCAwIDogX2EuZmV0Y2gsXG4gICAgaW5pdGlhbERhdGEsXG4gICAgdGltZW91dFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVzcG9uc2VFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuICBjb25zdCBlcnJvckV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG4gIGNvbnN0IGZpbmFsbHlFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuICBjb25zdCBpc0ZpbmlzaGVkID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgaXNGZXRjaGluZyA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGFib3J0ZWQgPSByZWYoZmFsc2UpO1xuICBjb25zdCBzdGF0dXNDb2RlID0gcmVmKG51bGwpO1xuICBjb25zdCByZXNwb25zZSA9IHNoYWxsb3dSZWYobnVsbCk7XG4gIGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcbiAgY29uc3QgZGF0YSA9IHNoYWxsb3dSZWYoaW5pdGlhbERhdGEgfHwgbnVsbCk7XG4gIGNvbnN0IGNhbkFib3J0ID0gY29tcHV0ZWQoKCkgPT4gc3VwcG9ydHNBYm9ydCAmJiBpc0ZldGNoaW5nLnZhbHVlKTtcbiAgbGV0IGNvbnRyb2xsZXI7XG4gIGxldCB0aW1lcjtcbiAgY29uc3QgYWJvcnQgPSAoKSA9PiB7XG4gICAgaWYgKHN1cHBvcnRzQWJvcnQpIHtcbiAgICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb250cm9sbGVyLnNpZ25hbC5vbmFib3J0ID0gKCkgPT4gYWJvcnRlZC52YWx1ZSA9IHRydWU7XG4gICAgICBmZXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmZldGNoT3B0aW9ucyxcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGxvYWRpbmcgPSAoaXNMb2FkaW5nKSA9PiB7XG4gICAgaXNGZXRjaGluZy52YWx1ZSA9IGlzTG9hZGluZztcbiAgICBpc0ZpbmlzaGVkLnZhbHVlID0gIWlzTG9hZGluZztcbiAgfTtcbiAgaWYgKHRpbWVvdXQpXG4gICAgdGltZXIgPSB1c2VUaW1lb3V0Rm4oYWJvcnQsIHRpbWVvdXQsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcbiAgbGV0IGV4ZWN1dGVDb3VudGVyID0gMDtcbiAgY29uc3QgZXhlY3V0ZSA9IGFzeW5jICh0aHJvd09uRmFpbGVkID0gZmFsc2UpID0+IHtcbiAgICB2YXIgX2EyLCBfYjtcbiAgICBhYm9ydCgpO1xuICAgIGxvYWRpbmcodHJ1ZSk7XG4gICAgZXJyb3IudmFsdWUgPSBudWxsO1xuICAgIHN0YXR1c0NvZGUudmFsdWUgPSBudWxsO1xuICAgIGFib3J0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICBleGVjdXRlQ291bnRlciArPSAxO1xuICAgIGNvbnN0IGN1cnJlbnRFeGVjdXRlQ291bnRlciA9IGV4ZWN1dGVDb3VudGVyO1xuICAgIGNvbnN0IGRlZmF1bHRGZXRjaE9wdGlvbnMgPSB7XG4gICAgICBtZXRob2Q6IGNvbmZpZy5tZXRob2QsXG4gICAgICBoZWFkZXJzOiB7fVxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5wYXlsb2FkKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gaGVhZGVyc1RvT2JqZWN0KGRlZmF1bHRGZXRjaE9wdGlvbnMuaGVhZGVycyk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdG9WYWx1ZShjb25maWcucGF5bG9hZCk7XG4gICAgICBpZiAoIWNvbmZpZy5wYXlsb2FkVHlwZSAmJiBwYXlsb2FkICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXlsb2FkKSA9PT0gT2JqZWN0LnByb3RvdHlwZSAmJiAhKHBheWxvYWQgaW5zdGFuY2VvZiBGb3JtRGF0YSkpXG4gICAgICAgIGNvbmZpZy5wYXlsb2FkVHlwZSA9IFwianNvblwiO1xuICAgICAgaWYgKGNvbmZpZy5wYXlsb2FkVHlwZSlcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IChfYTIgPSBwYXlsb2FkTWFwcGluZ1tjb25maWcucGF5bG9hZFR5cGVdKSAhPSBudWxsID8gX2EyIDogY29uZmlnLnBheWxvYWRUeXBlO1xuICAgICAgZGVmYXVsdEZldGNoT3B0aW9ucy5ib2R5ID0gY29uZmlnLnBheWxvYWRUeXBlID09PSBcImpzb25cIiA/IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpIDogcGF5bG9hZDtcbiAgICB9XG4gICAgbGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgdXJsOiB0b1ZhbHVlKHVybCksXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIC4uLmRlZmF1bHRGZXRjaE9wdGlvbnMsXG4gICAgICAgIC4uLmZldGNoT3B0aW9uc1xuICAgICAgfSxcbiAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICBpc0NhbmNlbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmJlZm9yZUZldGNoKVxuICAgICAgT2JqZWN0LmFzc2lnbihjb250ZXh0LCBhd2FpdCBvcHRpb25zLmJlZm9yZUZldGNoKGNvbnRleHQpKTtcbiAgICBpZiAoaXNDYW5jZWxlZCB8fCAhZmV0Y2gpIHtcbiAgICAgIGxvYWRpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgbGV0IHJlc3BvbnNlRGF0YSA9IG51bGw7XG4gICAgaWYgKHRpbWVyKVxuICAgICAgdGltZXIuc3RhcnQoKTtcbiAgICByZXR1cm4gZmV0Y2goXG4gICAgICBjb250ZXh0LnVybCxcbiAgICAgIHtcbiAgICAgICAgLi4uZGVmYXVsdEZldGNoT3B0aW9ucyxcbiAgICAgICAgLi4uY29udGV4dC5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uaGVhZGVyc1RvT2JqZWN0KGRlZmF1bHRGZXRjaE9wdGlvbnMuaGVhZGVycyksXG4gICAgICAgICAgLi4uaGVhZGVyc1RvT2JqZWN0KChfYiA9IGNvbnRleHQub3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmhlYWRlcnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApLnRoZW4oYXN5bmMgKGZldGNoUmVzcG9uc2UpID0+IHtcbiAgICAgIHJlc3BvbnNlLnZhbHVlID0gZmV0Y2hSZXNwb25zZTtcbiAgICAgIHN0YXR1c0NvZGUudmFsdWUgPSBmZXRjaFJlc3BvbnNlLnN0YXR1cztcbiAgICAgIHJlc3BvbnNlRGF0YSA9IGF3YWl0IGZldGNoUmVzcG9uc2UuY2xvbmUoKVtjb25maWcudHlwZV0oKTtcbiAgICAgIGlmICghZmV0Y2hSZXNwb25zZS5vaykge1xuICAgICAgICBkYXRhLnZhbHVlID0gaW5pdGlhbERhdGEgfHwgbnVsbDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZldGNoUmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5hZnRlckZldGNoKSB7XG4gICAgICAgICh7IGRhdGE6IHJlc3BvbnNlRGF0YSB9ID0gYXdhaXQgb3B0aW9ucy5hZnRlckZldGNoKHtcbiAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgcmVzcG9uc2U6IGZldGNoUmVzcG9uc2VcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgZGF0YS52YWx1ZSA9IHJlc3BvbnNlRGF0YTtcbiAgICAgIHJlc3BvbnNlRXZlbnQudHJpZ2dlcihmZXRjaFJlc3BvbnNlKTtcbiAgICAgIHJldHVybiBmZXRjaFJlc3BvbnNlO1xuICAgIH0pLmNhdGNoKGFzeW5jIChmZXRjaEVycm9yKSA9PiB7XG4gICAgICBsZXQgZXJyb3JEYXRhID0gZmV0Y2hFcnJvci5tZXNzYWdlIHx8IGZldGNoRXJyb3IubmFtZTtcbiAgICAgIGlmIChvcHRpb25zLm9uRmV0Y2hFcnJvcikge1xuICAgICAgICAoeyBlcnJvcjogZXJyb3JEYXRhLCBkYXRhOiByZXNwb25zZURhdGEgfSA9IGF3YWl0IG9wdGlvbnMub25GZXRjaEVycm9yKHtcbiAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgZXJyb3I6IGZldGNoRXJyb3IsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnZhbHVlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGVycm9yLnZhbHVlID0gZXJyb3JEYXRhO1xuICAgICAgaWYgKG9wdGlvbnMudXBkYXRlRGF0YU9uRXJyb3IpXG4gICAgICAgIGRhdGEudmFsdWUgPSByZXNwb25zZURhdGE7XG4gICAgICBlcnJvckV2ZW50LnRyaWdnZXIoZmV0Y2hFcnJvcik7XG4gICAgICBpZiAodGhyb3dPbkZhaWxlZClcbiAgICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRFeGVjdXRlQ291bnRlciA9PT0gZXhlY3V0ZUNvdW50ZXIpXG4gICAgICAgIGxvYWRpbmcoZmFsc2UpO1xuICAgICAgaWYgKHRpbWVyKVxuICAgICAgICB0aW1lci5zdG9wKCk7XG4gICAgICBmaW5hbGx5RXZlbnQudHJpZ2dlcihudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcmVmZXRjaCA9IHRvUmVmKG9wdGlvbnMucmVmZXRjaCk7XG4gIHdhdGNoKFxuICAgIFtcbiAgICAgIHJlZmV0Y2gsXG4gICAgICB0b1JlZih1cmwpXG4gICAgXSxcbiAgICAoW3JlZmV0Y2gyXSkgPT4gcmVmZXRjaDIgJiYgZXhlY3V0ZSgpLFxuICAgIHsgZGVlcDogdHJ1ZSB9XG4gICk7XG4gIGNvbnN0IHNoZWxsID0ge1xuICAgIGlzRmluaXNoZWQ6IHJlYWRvbmx5KGlzRmluaXNoZWQpLFxuICAgIGlzRmV0Y2hpbmc6IHJlYWRvbmx5KGlzRmV0Y2hpbmcpLFxuICAgIHN0YXR1c0NvZGUsXG4gICAgcmVzcG9uc2UsXG4gICAgZXJyb3IsXG4gICAgZGF0YSxcbiAgICBjYW5BYm9ydCxcbiAgICBhYm9ydGVkLFxuICAgIGFib3J0LFxuICAgIGV4ZWN1dGUsXG4gICAgb25GZXRjaFJlc3BvbnNlOiByZXNwb25zZUV2ZW50Lm9uLFxuICAgIG9uRmV0Y2hFcnJvcjogZXJyb3JFdmVudC5vbixcbiAgICBvbkZldGNoRmluYWxseTogZmluYWxseUV2ZW50Lm9uLFxuICAgIC8vIG1ldGhvZFxuICAgIGdldDogc2V0TWV0aG9kKFwiR0VUXCIpLFxuICAgIHB1dDogc2V0TWV0aG9kKFwiUFVUXCIpLFxuICAgIHBvc3Q6IHNldE1ldGhvZChcIlBPU1RcIiksXG4gICAgZGVsZXRlOiBzZXRNZXRob2QoXCJERUxFVEVcIiksXG4gICAgcGF0Y2g6IHNldE1ldGhvZChcIlBBVENIXCIpLFxuICAgIGhlYWQ6IHNldE1ldGhvZChcIkhFQURcIiksXG4gICAgb3B0aW9uczogc2V0TWV0aG9kKFwiT1BUSU9OU1wiKSxcbiAgICAvLyB0eXBlXG4gICAganNvbjogc2V0VHlwZShcImpzb25cIiksXG4gICAgdGV4dDogc2V0VHlwZShcInRleHRcIiksXG4gICAgYmxvYjogc2V0VHlwZShcImJsb2JcIiksXG4gICAgYXJyYXlCdWZmZXI6IHNldFR5cGUoXCJhcnJheUJ1ZmZlclwiKSxcbiAgICBmb3JtRGF0YTogc2V0VHlwZShcImZvcm1EYXRhXCIpXG4gIH07XG4gIGZ1bmN0aW9uIHNldE1ldGhvZChtZXRob2QpIHtcbiAgICByZXR1cm4gKHBheWxvYWQsIHBheWxvYWRUeXBlKSA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hpbmcudmFsdWUpIHtcbiAgICAgICAgY29uZmlnLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgY29uZmlnLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICBjb25maWcucGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTtcbiAgICAgICAgaWYgKGlzUmVmKGNvbmZpZy5wYXlsb2FkKSkge1xuICAgICAgICAgIHdhdGNoKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICByZWZldGNoLFxuICAgICAgICAgICAgICB0b1JlZihjb25maWcucGF5bG9hZClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAoW3JlZmV0Y2gyXSkgPT4gcmVmZXRjaDIgJiYgZXhlY3V0ZSgpLFxuICAgICAgICAgICAgeyBkZWVwOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc2hlbGwsXG4gICAgICAgICAgdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHdhaXRVbnRpbEZpbmlzaGVkKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1bnRpbChpc0ZpbmlzaGVkKS50b0JlKHRydWUpLnRoZW4oKCkgPT4gcmVzb2x2ZShzaGVsbCkpLmNhdGNoKChlcnJvcjIpID0+IHJlamVjdChlcnJvcjIpKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBzZXRUeXBlKHR5cGUpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKCFpc0ZldGNoaW5nLnZhbHVlKSB7XG4gICAgICAgIGNvbmZpZy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zaGVsbCxcbiAgICAgICAgICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH07XG4gIH1cbiAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKVxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZXhlY3V0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zaGVsbCxcbiAgICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBqb2luUGF0aHMoc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0LmVuZHNXaXRoKFwiL1wiKSAmJiAhZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKVxuICAgIHJldHVybiBgJHtzdGFydH0vJHtlbmR9YDtcbiAgcmV0dXJuIGAke3N0YXJ0fSR7ZW5kfWA7XG59XG5cbmNvbnN0IERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgbXVsdGlwbGU6IHRydWUsXG4gIGFjY2VwdDogXCIqXCIsXG4gIHJlc2V0OiBmYWxzZSxcbiAgZGlyZWN0b3J5OiBmYWxzZVxufTtcbmZ1bmN0aW9uIHVzZUZpbGVEaWFsb2cob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmlsZXMgPSByZWYobnVsbCk7XG4gIGNvbnN0IHsgb246IG9uQ2hhbmdlLCB0cmlnZ2VyIH0gPSBjcmVhdGVFdmVudEhvb2soKTtcbiAgbGV0IGlucHV0O1xuICBpZiAoZG9jdW1lbnQpIHtcbiAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJmaWxlXCI7XG4gICAgaW5wdXQub25jaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGZpbGVzLnZhbHVlID0gcmVzdWx0LmZpbGVzO1xuICAgICAgdHJpZ2dlcihmaWxlcy52YWx1ZSk7XG4gICAgfTtcbiAgfVxuICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICBmaWxlcy52YWx1ZSA9IG51bGw7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBpbnB1dC52YWx1ZSA9IFwiXCI7XG4gICAgICB0cmlnZ2VyKG51bGwpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgb3BlbiA9IChsb2NhbE9wdGlvbnMpID0+IHtcbiAgICBpZiAoIWlucHV0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IF9vcHRpb25zID0ge1xuICAgICAgLi4uREVGQVVMVF9PUFRJT05TLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC4uLmxvY2FsT3B0aW9uc1xuICAgIH07XG4gICAgaW5wdXQubXVsdGlwbGUgPSBfb3B0aW9ucy5tdWx0aXBsZTtcbiAgICBpbnB1dC5hY2NlcHQgPSBfb3B0aW9ucy5hY2NlcHQ7XG4gICAgaW5wdXQud2Via2l0ZGlyZWN0b3J5ID0gX29wdGlvbnMuZGlyZWN0b3J5O1xuICAgIGlmIChoYXNPd24oX29wdGlvbnMsIFwiY2FwdHVyZVwiKSlcbiAgICAgIGlucHV0LmNhcHR1cmUgPSBfb3B0aW9ucy5jYXB0dXJlO1xuICAgIGlmIChfb3B0aW9ucy5yZXNldClcbiAgICAgIHJlc2V0KCk7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlczogcmVhZG9ubHkoZmlsZXMpLFxuICAgIG9wZW4sXG4gICAgcmVzZXQsXG4gICAgb25DaGFuZ2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlRmlsZVN5c3RlbUFjY2VzcyhvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpbmRvdzogX3dpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgZGF0YVR5cGUgPSBcIlRleHRcIlxuICB9ID0gb3B0aW9ucztcbiAgY29uc3Qgd2luZG93ID0gX3dpbmRvdztcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93ICYmIFwic2hvd1NhdmVGaWxlUGlja2VyXCIgaW4gd2luZG93ICYmIFwic2hvd09wZW5GaWxlUGlja2VyXCIgaW4gd2luZG93KTtcbiAgY29uc3QgZmlsZUhhbmRsZSA9IHJlZigpO1xuICBjb25zdCBkYXRhID0gcmVmKCk7XG4gIGNvbnN0IGZpbGUgPSByZWYoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gZmlsZS52YWx1ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLm5hbWUpICE9IG51bGwgPyBfYiA6IFwiXCI7XG4gIH0pO1xuICBjb25zdCBmaWxlTUlNRSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiAoX2IgPSAoX2EgPSBmaWxlLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EudHlwZSkgIT0gbnVsbCA/IF9iIDogXCJcIjtcbiAgfSk7XG4gIGNvbnN0IGZpbGVTaXplID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIChfYiA9IChfYSA9IGZpbGUudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYS5zaXplKSAhPSBudWxsID8gX2IgOiAwO1xuICB9KTtcbiAgY29uc3QgZmlsZUxhc3RNb2RpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiAoX2IgPSAoX2EgPSBmaWxlLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EubGFzdE1vZGlmaWVkKSAhPSBudWxsID8gX2IgOiAwO1xuICB9KTtcbiAgYXN5bmMgZnVuY3Rpb24gb3Blbihfb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFpc1N1cHBvcnRlZC52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBbaGFuZGxlXSA9IGF3YWl0IHdpbmRvdy5zaG93T3BlbkZpbGVQaWNrZXIoeyAuLi50b1ZhbHVlKG9wdGlvbnMpLCAuLi5fb3B0aW9ucyB9KTtcbiAgICBmaWxlSGFuZGxlLnZhbHVlID0gaGFuZGxlO1xuICAgIGF3YWl0IHVwZGF0ZURhdGEoKTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGUoX29wdGlvbnMgPSB7fSkge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgZmlsZUhhbmRsZS52YWx1ZSA9IGF3YWl0IHdpbmRvdy5zaG93U2F2ZUZpbGVQaWNrZXIoeyAuLi5vcHRpb25zLCAuLi5fb3B0aW9ucyB9KTtcbiAgICBkYXRhLnZhbHVlID0gdm9pZCAwO1xuICAgIGF3YWl0IHVwZGF0ZURhdGEoKTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBzYXZlKF9vcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghZmlsZUhhbmRsZS52YWx1ZSlcbiAgICAgIHJldHVybiBzYXZlQXMoX29wdGlvbnMpO1xuICAgIGlmIChkYXRhLnZhbHVlKSB7XG4gICAgICBjb25zdCB3cml0YWJsZVN0cmVhbSA9IGF3YWl0IGZpbGVIYW5kbGUudmFsdWUuY3JlYXRlV3JpdGFibGUoKTtcbiAgICAgIGF3YWl0IHdyaXRhYmxlU3RyZWFtLndyaXRlKGRhdGEudmFsdWUpO1xuICAgICAgYXdhaXQgd3JpdGFibGVTdHJlYW0uY2xvc2UoKTtcbiAgICB9XG4gICAgYXdhaXQgdXBkYXRlRmlsZSgpO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVBcyhfb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFpc1N1cHBvcnRlZC52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBmaWxlSGFuZGxlLnZhbHVlID0gYXdhaXQgd2luZG93LnNob3dTYXZlRmlsZVBpY2tlcih7IC4uLm9wdGlvbnMsIC4uLl9vcHRpb25zIH0pO1xuICAgIGlmIChkYXRhLnZhbHVlKSB7XG4gICAgICBjb25zdCB3cml0YWJsZVN0cmVhbSA9IGF3YWl0IGZpbGVIYW5kbGUudmFsdWUuY3JlYXRlV3JpdGFibGUoKTtcbiAgICAgIGF3YWl0IHdyaXRhYmxlU3RyZWFtLndyaXRlKGRhdGEudmFsdWUpO1xuICAgICAgYXdhaXQgd3JpdGFibGVTdHJlYW0uY2xvc2UoKTtcbiAgICB9XG4gICAgYXdhaXQgdXBkYXRlRmlsZSgpO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGUoKSB7XG4gICAgdmFyIF9hO1xuICAgIGZpbGUudmFsdWUgPSBhd2FpdCAoKF9hID0gZmlsZUhhbmRsZS52YWx1ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmdldEZpbGUoKSk7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGF3YWl0IHVwZGF0ZUZpbGUoKTtcbiAgICBjb25zdCB0eXBlID0gdG9WYWx1ZShkYXRhVHlwZSk7XG4gICAgaWYgKHR5cGUgPT09IFwiVGV4dFwiKVxuICAgICAgZGF0YS52YWx1ZSA9IGF3YWl0ICgoX2EgPSBmaWxlLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EudGV4dCgpKTtcbiAgICBlbHNlIGlmICh0eXBlID09PSBcIkFycmF5QnVmZmVyXCIpXG4gICAgICBkYXRhLnZhbHVlID0gYXdhaXQgKChfYiA9IGZpbGUudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYi5hcnJheUJ1ZmZlcigpKTtcbiAgICBlbHNlIGlmICh0eXBlID09PSBcIkJsb2JcIilcbiAgICAgIGRhdGEudmFsdWUgPSBmaWxlLnZhbHVlO1xuICB9XG4gIHdhdGNoKCgpID0+IHRvVmFsdWUoZGF0YVR5cGUpLCB1cGRhdGVEYXRhKTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBkYXRhLFxuICAgIGZpbGUsXG4gICAgZmlsZU5hbWUsXG4gICAgZmlsZU1JTUUsXG4gICAgZmlsZVNpemUsXG4gICAgZmlsZUxhc3RNb2RpZmllZCxcbiAgICBvcGVuLFxuICAgIGNyZWF0ZSxcbiAgICBzYXZlLFxuICAgIHNhdmVBcyxcbiAgICB1cGRhdGVEYXRhXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZUZvY3VzKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gZmFsc2UsIGZvY3VzVmlzaWJsZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICBjb25zdCBpbm5lckZvY3VzZWQgPSByZWYoZmFsc2UpO1xuICBjb25zdCB0YXJnZXRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCkpO1xuICB1c2VFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIFwiZm9jdXNcIiwgKGV2ZW50KSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoIWZvY3VzVmlzaWJsZSB8fCAoKF9iID0gKF9hID0gZXZlbnQudGFyZ2V0KS5tYXRjaGVzKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChfYSwgXCI6Zm9jdXMtdmlzaWJsZVwiKSkpXG4gICAgICBpbm5lckZvY3VzZWQudmFsdWUgPSB0cnVlO1xuICB9KTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBcImJsdXJcIiwgKCkgPT4gaW5uZXJGb2N1c2VkLnZhbHVlID0gZmFsc2UpO1xuICBjb25zdCBmb2N1c2VkID0gY29tcHV0ZWQoe1xuICAgIGdldDogKCkgPT4gaW5uZXJGb2N1c2VkLnZhbHVlLFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIGlmICghdmFsdWUgJiYgaW5uZXJGb2N1c2VkLnZhbHVlKVxuICAgICAgICAoX2EgPSB0YXJnZXRFbGVtZW50LnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EuYmx1cigpO1xuICAgICAgZWxzZSBpZiAodmFsdWUgJiYgIWlubmVyRm9jdXNlZC52YWx1ZSlcbiAgICAgICAgKF9iID0gdGFyZ2V0RWxlbWVudC52YWx1ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcbiAgd2F0Y2goXG4gICAgdGFyZ2V0RWxlbWVudCxcbiAgICAoKSA9PiB7XG4gICAgICBmb2N1c2VkLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIH0sXG4gICAgeyBpbW1lZGlhdGU6IHRydWUsIGZsdXNoOiBcInBvc3RcIiB9XG4gICk7XG4gIHJldHVybiB7IGZvY3VzZWQgfTtcbn1cblxuZnVuY3Rpb24gdXNlRm9jdXNXaXRoaW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHVzZUFjdGl2ZUVsZW1lbnQob3B0aW9ucyk7XG4gIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSk7XG4gIGNvbnN0IGZvY3VzZWQgPSBjb21wdXRlZCgoKSA9PiB0YXJnZXRFbGVtZW50LnZhbHVlICYmIGFjdGl2ZUVsZW1lbnQudmFsdWUgPyB0YXJnZXRFbGVtZW50LnZhbHVlLmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQudmFsdWUpIDogZmFsc2UpO1xuICByZXR1cm4geyBmb2N1c2VkIH07XG59XG5cbmZ1bmN0aW9uIHVzZUZwcyhvcHRpb25zKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgZnBzID0gcmVmKDApO1xuICBpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSBcInVuZGVmaW5lZFwiKVxuICAgIHJldHVybiBmcHM7XG4gIGNvbnN0IGV2ZXJ5ID0gKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5ldmVyeSkgIT0gbnVsbCA/IF9hIDogMTA7XG4gIGxldCBsYXN0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGxldCB0aWNrcyA9IDA7XG4gIHVzZVJhZkZuKCgpID0+IHtcbiAgICB0aWNrcyArPSAxO1xuICAgIGlmICh0aWNrcyA+PSBldmVyeSkge1xuICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBkaWZmID0gbm93IC0gbGFzdDtcbiAgICAgIGZwcy52YWx1ZSA9IE1hdGgucm91bmQoMWUzIC8gKGRpZmYgLyB0aWNrcykpO1xuICAgICAgbGFzdCA9IG5vdztcbiAgICAgIHRpY2tzID0gMDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZnBzO1xufVxuXG5jb25zdCBldmVudEhhbmRsZXJzID0gW1xuICBcImZ1bGxzY3JlZW5jaGFuZ2VcIixcbiAgXCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG4gIFwid2Via2l0ZW5kZnVsbHNjcmVlblwiLFxuICBcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIixcbiAgXCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIlxuXTtcbmZ1bmN0aW9uIHVzZUZ1bGxzY3JlZW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGRvY3VtZW50ID0gZGVmYXVsdERvY3VtZW50LFxuICAgIGF1dG9FeGl0ID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRhcmdldFJlZiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHVucmVmRWxlbWVudCh0YXJnZXQpKSAhPSBudWxsID8gX2EgOiBkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImh0bWxcIik7XG4gIH0pO1xuICBjb25zdCBpc0Z1bGxzY3JlZW4gPSByZWYoZmFsc2UpO1xuICBjb25zdCByZXF1ZXN0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBcInJlcXVlc3RGdWxsc2NyZWVuXCIsXG4gICAgICBcIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuXCIsXG4gICAgICBcIndlYmtpdEVudGVyRnVsbHNjcmVlblwiLFxuICAgICAgXCJ3ZWJraXRFbnRlckZ1bGxTY3JlZW5cIixcbiAgICAgIFwid2Via2l0UmVxdWVzdEZ1bGxTY3JlZW5cIixcbiAgICAgIFwibW96UmVxdWVzdEZ1bGxTY3JlZW5cIixcbiAgICAgIFwibXNSZXF1ZXN0RnVsbHNjcmVlblwiXG4gICAgXS5maW5kKChtKSA9PiBkb2N1bWVudCAmJiBtIGluIGRvY3VtZW50IHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG4gIH0pO1xuICBjb25zdCBleGl0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBcImV4aXRGdWxsc2NyZWVuXCIsXG4gICAgICBcIndlYmtpdEV4aXRGdWxsc2NyZWVuXCIsXG4gICAgICBcIndlYmtpdEV4aXRGdWxsU2NyZWVuXCIsXG4gICAgICBcIndlYmtpdENhbmNlbEZ1bGxTY3JlZW5cIixcbiAgICAgIFwibW96Q2FuY2VsRnVsbFNjcmVlblwiLFxuICAgICAgXCJtc0V4aXRGdWxsc2NyZWVuXCJcbiAgICBdLmZpbmQoKG0pID0+IGRvY3VtZW50ICYmIG0gaW4gZG9jdW1lbnQgfHwgdGFyZ2V0UmVmLnZhbHVlICYmIG0gaW4gdGFyZ2V0UmVmLnZhbHVlKTtcbiAgfSk7XG4gIGNvbnN0IGZ1bGxzY3JlZW5FbmFibGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBcImZ1bGxTY3JlZW5cIixcbiAgICAgIFwid2Via2l0SXNGdWxsU2NyZWVuXCIsXG4gICAgICBcIndlYmtpdERpc3BsYXlpbmdGdWxsc2NyZWVuXCIsXG4gICAgICBcIm1vekZ1bGxTY3JlZW5cIixcbiAgICAgIFwibXNGdWxsc2NyZWVuRWxlbWVudFwiXG4gICAgXS5maW5kKChtKSA9PiBkb2N1bWVudCAmJiBtIGluIGRvY3VtZW50IHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG4gIH0pO1xuICBjb25zdCBmdWxsc2NyZWVuRWxlbWVudE1ldGhvZCA9IFtcbiAgICBcImZ1bGxzY3JlZW5FbGVtZW50XCIsXG4gICAgXCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudFwiLFxuICAgIFwibW96RnVsbFNjcmVlbkVsZW1lbnRcIixcbiAgICBcIm1zRnVsbHNjcmVlbkVsZW1lbnRcIlxuICBdLmZpbmQoKG0pID0+IGRvY3VtZW50ICYmIG0gaW4gZG9jdW1lbnQpO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB0YXJnZXRSZWYudmFsdWUgJiYgZG9jdW1lbnQgJiYgcmVxdWVzdE1ldGhvZC52YWx1ZSAhPT0gdm9pZCAwICYmIGV4aXRNZXRob2QudmFsdWUgIT09IHZvaWQgMCAmJiBmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSAhPT0gdm9pZCAwKTtcbiAgY29uc3QgaXNDdXJyZW50RWxlbWVudEZ1bGxTY3JlZW4gPSAoKSA9PiB7XG4gICAgaWYgKGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kKVxuICAgICAgcmV0dXJuIChkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnRbZnVsbHNjcmVlbkVsZW1lbnRNZXRob2RdKSA9PT0gdGFyZ2V0UmVmLnZhbHVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgY29uc3QgaXNFbGVtZW50RnVsbFNjcmVlbiA9ICgpID0+IHtcbiAgICBpZiAoZnVsbHNjcmVlbkVuYWJsZWQudmFsdWUpIHtcbiAgICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudFtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0MiA9IHRhcmdldFJlZi52YWx1ZTtcbiAgICAgICAgaWYgKCh0YXJnZXQyID09IG51bGwgPyB2b2lkIDAgOiB0YXJnZXQyW2Z1bGxzY3JlZW5FbmFibGVkLnZhbHVlXSkgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBCb29sZWFuKHRhcmdldDJbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGFzeW5jIGZ1bmN0aW9uIGV4aXQoKSB7XG4gICAgaWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhaXNGdWxsc2NyZWVuLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChleGl0TWV0aG9kLnZhbHVlKSB7XG4gICAgICBpZiAoKGRvY3VtZW50ID09IG51bGwgPyB2b2lkIDAgOiBkb2N1bWVudFtleGl0TWV0aG9kLnZhbHVlXSkgIT0gbnVsbCkge1xuICAgICAgICBhd2FpdCBkb2N1bWVudFtleGl0TWV0aG9kLnZhbHVlXSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0MiA9IHRhcmdldFJlZi52YWx1ZTtcbiAgICAgICAgaWYgKCh0YXJnZXQyID09IG51bGwgPyB2b2lkIDAgOiB0YXJnZXQyW2V4aXRNZXRob2QudmFsdWVdKSAhPSBudWxsKVxuICAgICAgICAgIGF3YWl0IHRhcmdldDJbZXhpdE1ldGhvZC52YWx1ZV0oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXNGdWxsc2NyZWVuLnZhbHVlID0gZmFsc2U7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZW50ZXIoKSB7XG4gICAgaWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCBpc0Z1bGxzY3JlZW4udmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGlzRWxlbWVudEZ1bGxTY3JlZW4oKSlcbiAgICAgIGF3YWl0IGV4aXQoKTtcbiAgICBjb25zdCB0YXJnZXQyID0gdGFyZ2V0UmVmLnZhbHVlO1xuICAgIGlmIChyZXF1ZXN0TWV0aG9kLnZhbHVlICYmICh0YXJnZXQyID09IG51bGwgPyB2b2lkIDAgOiB0YXJnZXQyW3JlcXVlc3RNZXRob2QudmFsdWVdKSAhPSBudWxsKSB7XG4gICAgICBhd2FpdCB0YXJnZXQyW3JlcXVlc3RNZXRob2QudmFsdWVdKCk7XG4gICAgICBpc0Z1bGxzY3JlZW4udmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgYXdhaXQgKGlzRnVsbHNjcmVlbi52YWx1ZSA/IGV4aXQoKSA6IGVudGVyKCkpO1xuICB9XG4gIGNvbnN0IGhhbmRsZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICBjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuKCk7XG4gICAgaWYgKCFpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgfHwgaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlICYmIGlzQ3VycmVudEVsZW1lbnRGdWxsU2NyZWVuKCkpXG4gICAgICBpc0Z1bGxzY3JlZW4udmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWU7XG4gIH07XG4gIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIGV2ZW50SGFuZGxlcnMsIGhhbmRsZXJDYWxsYmFjaywgZmFsc2UpO1xuICB1c2VFdmVudExpc3RlbmVyKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXRSZWYpLCBldmVudEhhbmRsZXJzLCBoYW5kbGVyQ2FsbGJhY2ssIGZhbHNlKTtcbiAgaWYgKGF1dG9FeGl0KVxuICAgIHRyeU9uU2NvcGVEaXNwb3NlKGV4aXQpO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGlzRnVsbHNjcmVlbixcbiAgICBlbnRlcixcbiAgICBleGl0LFxuICAgIHRvZ2dsZVxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXBHYW1lcGFkVG9YYm94MzYwQ29udHJvbGxlcihnYW1lcGFkKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKGdhbWVwYWQudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBhOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMF0sXG4gICAgICAgICAgYjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzFdLFxuICAgICAgICAgIHg6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1syXSxcbiAgICAgICAgICB5OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbM11cbiAgICAgICAgfSxcbiAgICAgICAgYnVtcGVyOiB7XG4gICAgICAgICAgbGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzRdLFxuICAgICAgICAgIHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNV1cbiAgICAgICAgfSxcbiAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICBsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNl0sXG4gICAgICAgICAgcmlnaHQ6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1s3XVxuICAgICAgICB9LFxuICAgICAgICBzdGljazoge1xuICAgICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIGhvcml6b250YWw6IGdhbWVwYWQudmFsdWUuYXhlc1swXSxcbiAgICAgICAgICAgIHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbMV0sXG4gICAgICAgICAgICBidXR0b246IGdhbWVwYWQudmFsdWUuYnV0dG9uc1sxMF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBob3Jpem9udGFsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbMl0sXG4gICAgICAgICAgICB2ZXJ0aWNhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzNdLFxuICAgICAgICAgICAgYnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTFdXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkcGFkOiB7XG4gICAgICAgICAgdXA6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1sxMl0sXG4gICAgICAgICAgZG93bjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEzXSxcbiAgICAgICAgICBsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTRdLFxuICAgICAgICAgIHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTVdXG4gICAgICAgIH0sXG4gICAgICAgIGJhY2s6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1s4XSxcbiAgICAgICAgc3RhcnQ6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1s5XVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuZnVuY3Rpb24gdXNlR2FtZXBhZChvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIG5hdmlnYXRvciA9IGRlZmF1bHROYXZpZ2F0b3JcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciAmJiBcImdldEdhbWVwYWRzXCIgaW4gbmF2aWdhdG9yKTtcbiAgY29uc3QgZ2FtZXBhZHMgPSByZWYoW10pO1xuICBjb25zdCBvbkNvbm5lY3RlZEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcbiAgY29uc3Qgb25EaXNjb25uZWN0ZWRIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG4gIGNvbnN0IHN0YXRlRnJvbUdhbWVwYWQgPSAoZ2FtZXBhZCkgPT4ge1xuICAgIGNvbnN0IGhhcHRpY0FjdHVhdG9ycyA9IFtdO1xuICAgIGNvbnN0IHZpYnJhdGlvbkFjdHVhdG9yID0gXCJ2aWJyYXRpb25BY3R1YXRvclwiIGluIGdhbWVwYWQgPyBnYW1lcGFkLnZpYnJhdGlvbkFjdHVhdG9yIDogbnVsbDtcbiAgICBpZiAodmlicmF0aW9uQWN0dWF0b3IpXG4gICAgICBoYXB0aWNBY3R1YXRvcnMucHVzaCh2aWJyYXRpb25BY3R1YXRvcik7XG4gICAgaWYgKGdhbWVwYWQuaGFwdGljQWN0dWF0b3JzKVxuICAgICAgaGFwdGljQWN0dWF0b3JzLnB1c2goLi4uZ2FtZXBhZC5oYXB0aWNBY3R1YXRvcnMpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5nYW1lcGFkLFxuICAgICAgaWQ6IGdhbWVwYWQuaWQsXG4gICAgICBoYXB0aWNBY3R1YXRvcnMsXG4gICAgICBheGVzOiBnYW1lcGFkLmF4ZXMubWFwKChheGVzKSA9PiBheGVzKSxcbiAgICAgIGJ1dHRvbnM6IGdhbWVwYWQuYnV0dG9ucy5tYXAoKGJ1dHRvbikgPT4gKHsgcHJlc3NlZDogYnV0dG9uLnByZXNzZWQsIHRvdWNoZWQ6IGJ1dHRvbi50b3VjaGVkLCB2YWx1ZTogYnV0dG9uLnZhbHVlIH0pKSxcbiAgICAgIGluZGV4OiBnYW1lcGFkLmluZGV4XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlR2FtZXBhZFN0YXRlID0gKCkgPT4ge1xuICAgIGNvbnN0IF9nYW1lcGFkcyA9IChuYXZpZ2F0b3IgPT0gbnVsbCA/IHZvaWQgMCA6IG5hdmlnYXRvci5nZXRHYW1lcGFkcygpKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSB7XG4gICAgICBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSlcbiAgICAgICAgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0gPSBzdGF0ZUZyb21HYW1lcGFkKGdhbWVwYWQpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgeyBpc0FjdGl2ZSwgcGF1c2UsIHJlc3VtZSB9ID0gdXNlUmFmRm4odXBkYXRlR2FtZXBhZFN0YXRlKTtcbiAgY29uc3Qgb25HYW1lcGFkQ29ubmVjdGVkID0gKGdhbWVwYWQpID0+IHtcbiAgICBpZiAoIWdhbWVwYWRzLnZhbHVlLnNvbWUoKHsgaW5kZXggfSkgPT4gaW5kZXggPT09IGdhbWVwYWQuaW5kZXgpKSB7XG4gICAgICBnYW1lcGFkcy52YWx1ZS5wdXNoKHN0YXRlRnJvbUdhbWVwYWQoZ2FtZXBhZCkpO1xuICAgICAgb25Db25uZWN0ZWRIb29rLnRyaWdnZXIoZ2FtZXBhZC5pbmRleCk7XG4gICAgfVxuICAgIHJlc3VtZSgpO1xuICB9O1xuICBjb25zdCBvbkdhbWVwYWREaXNjb25uZWN0ZWQgPSAoZ2FtZXBhZCkgPT4ge1xuICAgIGdhbWVwYWRzLnZhbHVlID0gZ2FtZXBhZHMudmFsdWUuZmlsdGVyKCh4KSA9PiB4LmluZGV4ICE9PSBnYW1lcGFkLmluZGV4KTtcbiAgICBvbkRpc2Nvbm5lY3RlZEhvb2sudHJpZ2dlcihnYW1lcGFkLmluZGV4KTtcbiAgfTtcbiAgdXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZENvbm5lY3RlZChlLmdhbWVwYWQpKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRkaXNjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZERpc2Nvbm5lY3RlZChlLmdhbWVwYWQpKTtcbiAgdHJ5T25Nb3VudGVkKCgpID0+IHtcbiAgICBjb25zdCBfZ2FtZXBhZHMgPSAobmF2aWdhdG9yID09IG51bGwgPyB2b2lkIDAgOiBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSkgfHwgW107XG4gICAgZm9yIChjb25zdCBnYW1lcGFkIG9mIF9nYW1lcGFkcykge1xuICAgICAgaWYgKGdhbWVwYWQgJiYgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0pXG4gICAgICAgIG9uR2FtZXBhZENvbm5lY3RlZChnYW1lcGFkKTtcbiAgICB9XG4gIH0pO1xuICBwYXVzZSgpO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIG9uQ29ubmVjdGVkOiBvbkNvbm5lY3RlZEhvb2sub24sXG4gICAgb25EaXNjb25uZWN0ZWQ6IG9uRGlzY29ubmVjdGVkSG9vay5vbixcbiAgICBnYW1lcGFkcyxcbiAgICBwYXVzZSxcbiAgICByZXN1bWUsXG4gICAgaXNBY3RpdmVcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlR2VvbG9jYXRpb24ob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVIaWdoQWNjdXJhY3kgPSB0cnVlLFxuICAgIG1heGltdW1BZ2UgPSAzZTQsXG4gICAgdGltZW91dCA9IDI3ZTMsXG4gICAgbmF2aWdhdG9yID0gZGVmYXVsdE5hdmlnYXRvcixcbiAgICBpbW1lZGlhdGUgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IgJiYgXCJnZW9sb2NhdGlvblwiIGluIG5hdmlnYXRvcik7XG4gIGNvbnN0IGxvY2F0ZWRBdCA9IHJlZihudWxsKTtcbiAgY29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuICBjb25zdCBjb29yZHMgPSByZWYoe1xuICAgIGFjY3VyYWN5OiAwLFxuICAgIGxhdGl0dWRlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgbG9uZ2l0dWRlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgYWx0aXR1ZGU6IG51bGwsXG4gICAgYWx0aXR1ZGVBY2N1cmFjeTogbnVsbCxcbiAgICBoZWFkaW5nOiBudWxsLFxuICAgIHNwZWVkOiBudWxsXG4gIH0pO1xuICBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbihwb3NpdGlvbikge1xuICAgIGxvY2F0ZWRBdC52YWx1ZSA9IHBvc2l0aW9uLnRpbWVzdGFtcDtcbiAgICBjb29yZHMudmFsdWUgPSBwb3NpdGlvbi5jb29yZHM7XG4gICAgZXJyb3IudmFsdWUgPSBudWxsO1xuICB9XG4gIGxldCB3YXRjaGVyO1xuICBmdW5jdGlvbiByZXN1bWUoKSB7XG4gICAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG4gICAgICB3YXRjaGVyID0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oXG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uLFxuICAgICAgICAoZXJyKSA9PiBlcnJvci52YWx1ZSA9IGVycixcbiAgICAgICAge1xuICAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeSxcbiAgICAgICAgICBtYXhpbXVtQWdlLFxuICAgICAgICAgIHRpbWVvdXRcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKGltbWVkaWF0ZSlcbiAgICByZXN1bWUoKTtcbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgaWYgKHdhdGNoZXIgJiYgbmF2aWdhdG9yKVxuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2god2F0Y2hlcik7XG4gIH1cbiAgdHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgIHBhdXNlKCk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGlzU3VwcG9ydGVkLFxuICAgIGNvb3JkcyxcbiAgICBsb2NhdGVkQXQsXG4gICAgZXJyb3IsXG4gICAgcmVzdW1lLFxuICAgIHBhdXNlXG4gIH07XG59XG5cbmNvbnN0IGRlZmF1bHRFdmVudHMkMSA9IFtcIm1vdXNlbW92ZVwiLCBcIm1vdXNlZG93blwiLCBcInJlc2l6ZVwiLCBcImtleWRvd25cIiwgXCJ0b3VjaHN0YXJ0XCIsIFwid2hlZWxcIl07XG5jb25zdCBvbmVNaW51dGUgPSA2ZTQ7XG5mdW5jdGlvbiB1c2VJZGxlKHRpbWVvdXQgPSBvbmVNaW51dGUsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgaW5pdGlhbFN0YXRlID0gZmFsc2UsXG4gICAgbGlzdGVuRm9yVmlzaWJpbGl0eUNoYW5nZSA9IHRydWUsXG4gICAgZXZlbnRzID0gZGVmYXVsdEV2ZW50cyQxLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgZXZlbnRGaWx0ZXIgPSB0aHJvdHRsZUZpbHRlcig1MClcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlkbGUgPSByZWYoaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgbGFzdEFjdGl2ZSA9IHJlZih0aW1lc3RhbXAoKSk7XG4gIGxldCB0aW1lcjtcbiAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgaWRsZS52YWx1ZSA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGlkbGUudmFsdWUgPSB0cnVlLCB0aW1lb3V0KTtcbiAgfTtcbiAgY29uc3Qgb25FdmVudCA9IGNyZWF0ZUZpbHRlcldyYXBwZXIoXG4gICAgZXZlbnRGaWx0ZXIsXG4gICAgKCkgPT4ge1xuICAgICAgbGFzdEFjdGl2ZS52YWx1ZSA9IHRpbWVzdGFtcCgpO1xuICAgICAgcmVzZXQoKTtcbiAgICB9XG4gICk7XG4gIGlmICh3aW5kb3cpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cylcbiAgICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBldmVudCwgb25FdmVudCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGlmIChsaXN0ZW5Gb3JWaXNpYmlsaXR5Q2hhbmdlKSB7XG4gICAgICB1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbilcbiAgICAgICAgICBvbkV2ZW50KCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVzZXQoKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkbGUsXG4gICAgbGFzdEFjdGl2ZSxcbiAgICByZXNldFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkSW1hZ2Uob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGNvbnN0IHsgc3JjLCBzcmNzZXQsIHNpemVzLCBjbGFzczogY2xhenosIGxvYWRpbmcsIGNyb3Nzb3JpZ2luLCByZWZlcnJlclBvbGljeSB9ID0gb3B0aW9ucztcbiAgICBpbWcuc3JjID0gc3JjO1xuICAgIGlmIChzcmNzZXQpXG4gICAgICBpbWcuc3Jjc2V0ID0gc3Jjc2V0O1xuICAgIGlmIChzaXplcylcbiAgICAgIGltZy5zaXplcyA9IHNpemVzO1xuICAgIGlmIChjbGF6eilcbiAgICAgIGltZy5jbGFzc05hbWUgPSBjbGF6ejtcbiAgICBpZiAobG9hZGluZylcbiAgICAgIGltZy5sb2FkaW5nID0gbG9hZGluZztcbiAgICBpZiAoY3Jvc3NvcmlnaW4pXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSBjcm9zc29yaWdpbjtcbiAgICBpZiAocmVmZXJyZXJQb2xpY3kpXG4gICAgICBpbWcucmVmZXJyZXJQb2xpY3kgPSByZWZlcnJlclBvbGljeTtcbiAgICBpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuICAgIGltZy5vbmVycm9yID0gcmVqZWN0O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVzZUltYWdlKG9wdGlvbnMsIGFzeW5jU3RhdGVPcHRpb25zID0ge30pIHtcbiAgY29uc3Qgc3RhdGUgPSB1c2VBc3luY1N0YXRlKFxuICAgICgpID0+IGxvYWRJbWFnZSh0b1ZhbHVlKG9wdGlvbnMpKSxcbiAgICB2b2lkIDAsXG4gICAge1xuICAgICAgcmVzZXRPbkV4ZWN1dGU6IHRydWUsXG4gICAgICAuLi5hc3luY1N0YXRlT3B0aW9uc1xuICAgIH1cbiAgKTtcbiAgd2F0Y2goXG4gICAgKCkgPT4gdG9WYWx1ZShvcHRpb25zKSxcbiAgICAoKSA9PiBzdGF0ZS5leGVjdXRlKGFzeW5jU3RhdGVPcHRpb25zLmRlbGF5KSxcbiAgICB7IGRlZXA6IHRydWUgfVxuICApO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmNvbnN0IEFSUklWRURfU1RBVEVfVEhSRVNIT0xEX1BJWEVMUyA9IDE7XG5mdW5jdGlvbiB1c2VTY3JvbGwoZWxlbWVudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aHJvdHRsZSA9IDAsXG4gICAgaWRsZSA9IDIwMCxcbiAgICBvblN0b3AgPSBub29wLFxuICAgIG9uU2Nyb2xsID0gbm9vcCxcbiAgICBvZmZzZXQgPSB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICBib3R0b206IDBcbiAgICB9LFxuICAgIGV2ZW50TGlzdGVuZXJPcHRpb25zID0ge1xuICAgICAgY2FwdHVyZTogZmFsc2UsXG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSxcbiAgICBiZWhhdmlvciA9IFwiYXV0b1wiLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgb25FcnJvciA9IChlKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGludGVybmFsWCA9IHJlZigwKTtcbiAgY29uc3QgaW50ZXJuYWxZID0gcmVmKDApO1xuICBjb25zdCB4ID0gY29tcHV0ZWQoe1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpbnRlcm5hbFgudmFsdWU7XG4gICAgfSxcbiAgICBzZXQoeDIpIHtcbiAgICAgIHNjcm9sbFRvKHgyLCB2b2lkIDApO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHkgPSBjb21wdXRlZCh7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGludGVybmFsWS52YWx1ZTtcbiAgICB9LFxuICAgIHNldCh5Mikge1xuICAgICAgc2Nyb2xsVG8odm9pZCAwLCB5Mik7XG4gICAgfVxuICB9KTtcbiAgZnVuY3Rpb24gc2Nyb2xsVG8oX3gsIF95KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgaWYgKCF3aW5kb3cpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuICAgIGlmICghX2VsZW1lbnQpXG4gICAgICByZXR1cm47XG4gICAgKF9jID0gX2VsZW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudCA/IHdpbmRvdy5kb2N1bWVudC5ib2R5IDogX2VsZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfYy5zY3JvbGxUbyh7XG4gICAgICB0b3A6IChfYSA9IHRvVmFsdWUoX3kpKSAhPSBudWxsID8gX2EgOiB5LnZhbHVlLFxuICAgICAgbGVmdDogKF9iID0gdG9WYWx1ZShfeCkpICE9IG51bGwgPyBfYiA6IHgudmFsdWUsXG4gICAgICBiZWhhdmlvcjogdG9WYWx1ZShiZWhhdmlvcilcbiAgICB9KTtcbiAgfVxuICBjb25zdCBpc1Njcm9sbGluZyA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGFycml2ZWRTdGF0ZSA9IHJlYWN0aXZlKHtcbiAgICBsZWZ0OiB0cnVlLFxuICAgIHJpZ2h0OiBmYWxzZSxcbiAgICB0b3A6IHRydWUsXG4gICAgYm90dG9tOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgZGlyZWN0aW9ucyA9IHJlYWN0aXZlKHtcbiAgICBsZWZ0OiBmYWxzZSxcbiAgICByaWdodDogZmFsc2UsXG4gICAgdG9wOiBmYWxzZSxcbiAgICBib3R0b206IGZhbHNlXG4gIH0pO1xuICBjb25zdCBvblNjcm9sbEVuZCA9IChlKSA9PiB7XG4gICAgaWYgKCFpc1Njcm9sbGluZy52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBpc1Njcm9sbGluZy52YWx1ZSA9IGZhbHNlO1xuICAgIGRpcmVjdGlvbnMubGVmdCA9IGZhbHNlO1xuICAgIGRpcmVjdGlvbnMucmlnaHQgPSBmYWxzZTtcbiAgICBkaXJlY3Rpb25zLnRvcCA9IGZhbHNlO1xuICAgIGRpcmVjdGlvbnMuYm90dG9tID0gZmFsc2U7XG4gICAgb25TdG9wKGUpO1xuICB9O1xuICBjb25zdCBvblNjcm9sbEVuZERlYm91bmNlZCA9IHVzZURlYm91bmNlRm4ob25TY3JvbGxFbmQsIHRocm90dGxlICsgaWRsZSk7XG4gIGNvbnN0IHNldEFycml2ZWRTdGF0ZSA9ICh0YXJnZXQpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCF3aW5kb3cpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZWwgPSAoKF9hID0gdGFyZ2V0ID09IG51bGwgPyB2b2lkIDAgOiB0YXJnZXQuZG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfYS5kb2N1bWVudEVsZW1lbnQpIHx8ICh0YXJnZXQgPT0gbnVsbCA/IHZvaWQgMCA6IHRhcmdldC5kb2N1bWVudEVsZW1lbnQpIHx8IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuICAgIGNvbnN0IHsgZGlzcGxheSwgZmxleERpcmVjdGlvbiB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGVsLnNjcm9sbExlZnQ7XG4gICAgZGlyZWN0aW9ucy5sZWZ0ID0gc2Nyb2xsTGVmdCA8IGludGVybmFsWC52YWx1ZTtcbiAgICBkaXJlY3Rpb25zLnJpZ2h0ID0gc2Nyb2xsTGVmdCA+IGludGVybmFsWC52YWx1ZTtcbiAgICBjb25zdCBsZWZ0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCkgPD0gKG9mZnNldC5sZWZ0IHx8IDApO1xuICAgIGNvbnN0IHJpZ2h0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCkgKyBlbC5jbGllbnRXaWR0aCA+PSBlbC5zY3JvbGxXaWR0aCAtIChvZmZzZXQucmlnaHQgfHwgMCkgLSBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFM7XG4gICAgaWYgKGRpc3BsYXkgPT09IFwiZmxleFwiICYmIGZsZXhEaXJlY3Rpb24gPT09IFwicm93LXJldmVyc2VcIikge1xuICAgICAgYXJyaXZlZFN0YXRlLmxlZnQgPSByaWdodDtcbiAgICAgIGFycml2ZWRTdGF0ZS5yaWdodCA9IGxlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFycml2ZWRTdGF0ZS5sZWZ0ID0gbGVmdDtcbiAgICAgIGFycml2ZWRTdGF0ZS5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICBpbnRlcm5hbFgudmFsdWUgPSBzY3JvbGxMZWZ0O1xuICAgIGxldCBzY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7XG4gICAgaWYgKHRhcmdldCA9PT0gd2luZG93LmRvY3VtZW50ICYmICFzY3JvbGxUb3ApXG4gICAgICBzY3JvbGxUb3AgPSB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gICAgZGlyZWN0aW9ucy50b3AgPSBzY3JvbGxUb3AgPCBpbnRlcm5hbFkudmFsdWU7XG4gICAgZGlyZWN0aW9ucy5ib3R0b20gPSBzY3JvbGxUb3AgPiBpbnRlcm5hbFkudmFsdWU7XG4gICAgY29uc3QgdG9wID0gTWF0aC5hYnMoc2Nyb2xsVG9wKSA8PSAob2Zmc2V0LnRvcCB8fCAwKTtcbiAgICBjb25zdCBib3R0b20gPSBNYXRoLmFicyhzY3JvbGxUb3ApICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIChvZmZzZXQuYm90dG9tIHx8IDApIC0gQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTO1xuICAgIGlmIChkaXNwbGF5ID09PSBcImZsZXhcIiAmJiBmbGV4RGlyZWN0aW9uID09PSBcImNvbHVtbi1yZXZlcnNlXCIpIHtcbiAgICAgIGFycml2ZWRTdGF0ZS50b3AgPSBib3R0b207XG4gICAgICBhcnJpdmVkU3RhdGUuYm90dG9tID0gdG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnJpdmVkU3RhdGUudG9wID0gdG9wO1xuICAgICAgYXJyaXZlZFN0YXRlLmJvdHRvbSA9IGJvdHRvbTtcbiAgICB9XG4gICAgaW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsVG9wO1xuICB9O1xuICBjb25zdCBvblNjcm9sbEhhbmRsZXIgPSAoZSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBpZiAoIXdpbmRvdylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBldmVudFRhcmdldCA9IChfYSA9IGUudGFyZ2V0LmRvY3VtZW50RWxlbWVudCkgIT0gbnVsbCA/IF9hIDogZS50YXJnZXQ7XG4gICAgc2V0QXJyaXZlZFN0YXRlKGV2ZW50VGFyZ2V0KTtcbiAgICBpc1Njcm9sbGluZy52YWx1ZSA9IHRydWU7XG4gICAgb25TY3JvbGxFbmREZWJvdW5jZWQoZSk7XG4gICAgb25TY3JvbGwoZSk7XG4gIH07XG4gIHVzZUV2ZW50TGlzdGVuZXIoXG4gICAgZWxlbWVudCxcbiAgICBcInNjcm9sbFwiLFxuICAgIHRocm90dGxlID8gdXNlVGhyb3R0bGVGbihvblNjcm9sbEhhbmRsZXIsIHRocm90dGxlLCB0cnVlLCBmYWxzZSkgOiBvblNjcm9sbEhhbmRsZXIsXG4gICAgZXZlbnRMaXN0ZW5lck9wdGlvbnNcbiAgKTtcbiAgdHJ5T25Nb3VudGVkKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuICAgICAgaWYgKCFfZWxlbWVudClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgc2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvbkVycm9yKGUpO1xuICAgIH1cbiAgfSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIoXG4gICAgZWxlbWVudCxcbiAgICBcInNjcm9sbGVuZFwiLFxuICAgIG9uU2Nyb2xsRW5kLFxuICAgIGV2ZW50TGlzdGVuZXJPcHRpb25zXG4gICk7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIGlzU2Nyb2xsaW5nLFxuICAgIGFycml2ZWRTdGF0ZSxcbiAgICBkaXJlY3Rpb25zLFxuICAgIG1lYXN1cmUoKSB7XG4gICAgICBjb25zdCBfZWxlbWVudCA9IHRvVmFsdWUoZWxlbWVudCk7XG4gICAgICBpZiAod2luZG93ICYmIF9lbGVtZW50KVxuICAgICAgICBzZXRBcnJpdmVkU3RhdGUoX2VsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnQoZWwpIHtcbiAgaWYgKHR5cGVvZiBXaW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBXaW5kb3cpXG4gICAgcmV0dXJuIGVsLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgaWYgKHR5cGVvZiBEb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbCBpbnN0YW5jZW9mIERvY3VtZW50KVxuICAgIHJldHVybiBlbC5kb2N1bWVudEVsZW1lbnQ7XG4gIHJldHVybiBlbDtcbn1cblxuZnVuY3Rpb24gdXNlSW5maW5pdGVTY3JvbGwoZWxlbWVudCwgb25Mb2FkTW9yZSwgb3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgIGRpcmVjdGlvbiA9IFwiYm90dG9tXCIsXG4gICAgaW50ZXJ2YWwgPSAxMDAsXG4gICAgY2FuTG9hZE1vcmUgPSAoKSA9PiB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGF0ZSA9IHJlYWN0aXZlKHVzZVNjcm9sbChcbiAgICBlbGVtZW50LFxuICAgIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgW2RpcmVjdGlvbl06IChfYSA9IG9wdGlvbnMuZGlzdGFuY2UpICE9IG51bGwgPyBfYSA6IDAsXG4gICAgICAgIC4uLm9wdGlvbnMub2Zmc2V0XG4gICAgICB9XG4gICAgfVxuICApKTtcbiAgY29uc3QgcHJvbWlzZSA9IHJlZigpO1xuICBjb25zdCBpc0xvYWRpbmcgPSBjb21wdXRlZCgoKSA9PiAhIXByb21pc2UudmFsdWUpO1xuICBjb25zdCBvYnNlcnZlZEVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuICB9KTtcbiAgY29uc3QgaXNFbGVtZW50VmlzaWJsZSA9IHVzZUVsZW1lbnRWaXNpYmlsaXR5KG9ic2VydmVkRWxlbWVudCk7XG4gIGZ1bmN0aW9uIGNoZWNrQW5kTG9hZCgpIHtcbiAgICBzdGF0ZS5tZWFzdXJlKCk7XG4gICAgaWYgKCFvYnNlcnZlZEVsZW1lbnQudmFsdWUgfHwgIWlzRWxlbWVudFZpc2libGUudmFsdWUgfHwgIWNhbkxvYWRNb3JlKG9ic2VydmVkRWxlbWVudC52YWx1ZSkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCwgc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoIH0gPSBvYnNlcnZlZEVsZW1lbnQudmFsdWU7XG4gICAgY29uc3QgaXNOYXJyb3dlciA9IGRpcmVjdGlvbiA9PT0gXCJib3R0b21cIiB8fCBkaXJlY3Rpb24gPT09IFwidG9wXCIgPyBzY3JvbGxIZWlnaHQgPD0gY2xpZW50SGVpZ2h0IDogc2Nyb2xsV2lkdGggPD0gY2xpZW50V2lkdGg7XG4gICAgaWYgKHN0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dIHx8IGlzTmFycm93ZXIpIHtcbiAgICAgIGlmICghcHJvbWlzZS52YWx1ZSkge1xuICAgICAgICBwcm9taXNlLnZhbHVlID0gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIG9uTG9hZE1vcmUoc3RhdGUpLFxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGludGVydmFsKSlcbiAgICAgICAgXSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgcHJvbWlzZS52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgbmV4dFRpY2soKCkgPT4gY2hlY2tBbmRMb2FkKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd2F0Y2goXG4gICAgKCkgPT4gW3N0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dLCBpc0VsZW1lbnRWaXNpYmxlLnZhbHVlXSxcbiAgICBjaGVja0FuZExvYWQsXG4gICAgeyBpbW1lZGlhdGU6IHRydWUgfVxuICApO1xuICByZXR1cm4ge1xuICAgIGlzTG9hZGluZ1xuICB9O1xufVxuXG5jb25zdCBkZWZhdWx0RXZlbnRzID0gW1wibW91c2Vkb3duXCIsIFwibW91c2V1cFwiLCBcImtleWRvd25cIiwgXCJrZXl1cFwiXTtcbmZ1bmN0aW9uIHVzZUtleU1vZGlmaWVyKG1vZGlmaWVyLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGV2ZW50cyA9IGRlZmF1bHRFdmVudHMsXG4gICAgZG9jdW1lbnQgPSBkZWZhdWx0RG9jdW1lbnQsXG4gICAgaW5pdGlhbCA9IG51bGxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHN0YXRlID0gcmVmKGluaXRpYWwpO1xuICBpZiAoZG9jdW1lbnQpIHtcbiAgICBldmVudHMuZm9yRWFjaCgobGlzdGVuZXJFdmVudCkgPT4ge1xuICAgICAgdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgbGlzdGVuZXJFdmVudCwgKGV2dCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGV2dC5nZXRNb2RpZmllclN0YXRlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgc3RhdGUudmFsdWUgPSBldnQuZ2V0TW9kaWZpZXJTdGF0ZShtb2RpZmllcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIHVzZUxvY2FsU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgd2luZG93ID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIHVzZVN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LmxvY2FsU3RvcmFnZSwgb3B0aW9ucyk7XG59XG5cbmNvbnN0IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCA9IHtcbiAgY3RybDogXCJjb250cm9sXCIsXG4gIGNvbW1hbmQ6IFwibWV0YVwiLFxuICBjbWQ6IFwibWV0YVwiLFxuICBvcHRpb246IFwiYWx0XCIsXG4gIHVwOiBcImFycm93dXBcIixcbiAgZG93bjogXCJhcnJvd2Rvd25cIixcbiAgbGVmdDogXCJhcnJvd2xlZnRcIixcbiAgcmlnaHQ6IFwiYXJyb3dyaWdodFwiXG59O1xuXG5mdW5jdGlvbiB1c2VNYWdpY0tleXMob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICByZWFjdGl2ZTogdXNlUmVhY3RpdmUgPSBmYWxzZSxcbiAgICB0YXJnZXQgPSBkZWZhdWx0V2luZG93LFxuICAgIGFsaWFzTWFwID0gRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwLFxuICAgIHBhc3NpdmUgPSB0cnVlLFxuICAgIG9uRXZlbnRGaXJlZCA9IG5vb3BcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGN1cnJlbnQgPSByZWFjdGl2ZSgvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKTtcbiAgY29uc3Qgb2JqID0ge1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIGN1cnJlbnRcbiAgfTtcbiAgY29uc3QgcmVmcyA9IHVzZVJlYWN0aXZlID8gcmVhY3RpdmUob2JqKSA6IG9iajtcbiAgY29uc3QgbWV0YURlcHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCB1c2VkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZ1bmN0aW9uIHNldFJlZnMoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gcmVmcykge1xuICAgICAgaWYgKHVzZVJlYWN0aXZlKVxuICAgICAgICByZWZzW2tleV0gPSB2YWx1ZTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVmc1trZXldLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGN1cnJlbnQuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB1c2VkS2V5cylcbiAgICAgIHNldFJlZnMoa2V5LCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlUmVmcyhlLCB2YWx1ZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3Qga2V5ID0gKF9hID0gZS5rZXkpID09IG51bGwgPyB2b2lkIDAgOiBfYS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGNvZGUgPSAoX2IgPSBlLmNvZGUpID09IG51bGwgPyB2b2lkIDAgOiBfYi50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtjb2RlLCBrZXldLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAodmFsdWUpXG4gICAgICAgIGN1cnJlbnQuYWRkKGtleSk7XG4gICAgICBlbHNlXG4gICAgICAgIGN1cnJlbnQuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5MiBvZiB2YWx1ZXMpIHtcbiAgICAgIHVzZWRLZXlzLmFkZChrZXkyKTtcbiAgICAgIHNldFJlZnMoa2V5MiwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSBcIm1ldGFcIiAmJiAhdmFsdWUpIHtcbiAgICAgIG1ldGFEZXBzLmZvckVhY2goKGtleTIpID0+IHtcbiAgICAgICAgY3VycmVudC5kZWxldGUoa2V5Mik7XG4gICAgICAgIHNldFJlZnMoa2V5MiwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBtZXRhRGVwcy5jbGVhcigpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGUuZ2V0TW9kaWZpZXJTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIGUuZ2V0TW9kaWZpZXJTdGF0ZShcIk1ldGFcIikgJiYgdmFsdWUpIHtcbiAgICAgIFsuLi5jdXJyZW50LCAuLi52YWx1ZXNdLmZvckVhY2goKGtleTIpID0+IG1ldGFEZXBzLmFkZChrZXkyKSk7XG4gICAgfVxuICB9XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImtleWRvd25cIiwgKGUpID0+IHtcbiAgICB1cGRhdGVSZWZzKGUsIHRydWUpO1xuICAgIHJldHVybiBvbkV2ZW50RmlyZWQoZSk7XG4gIH0sIHsgcGFzc2l2ZSB9KTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwia2V5dXBcIiwgKGUpID0+IHtcbiAgICB1cGRhdGVSZWZzKGUsIGZhbHNlKTtcbiAgICByZXR1cm4gb25FdmVudEZpcmVkKGUpO1xuICB9LCB7IHBhc3NpdmUgfSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHJlc2V0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCByZXNldCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShcbiAgICByZWZzLFxuICAgIHtcbiAgICAgIGdldCh0YXJnZXQyLCBwcm9wLCByZWMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQyLCBwcm9wLCByZWMpO1xuICAgICAgICBwcm9wID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocHJvcCBpbiBhbGlhc01hcClcbiAgICAgICAgICBwcm9wID0gYWxpYXNNYXBbcHJvcF07XG4gICAgICAgIGlmICghKHByb3AgaW4gcmVmcykpIHtcbiAgICAgICAgICBpZiAoL1srXy1dLy50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gcHJvcC5zcGxpdCgvWytfLV0vZykubWFwKChpKSA9PiBpLnRyaW0oKSk7XG4gICAgICAgICAgICByZWZzW3Byb3BdID0gY29tcHV0ZWQoKCkgPT4ga2V5cy5ldmVyeSgoa2V5KSA9PiB0b1ZhbHVlKHByb3h5W2tleV0pKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZnNbcHJvcF0gPSByZWYoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gUmVmbGVjdC5nZXQodGFyZ2V0MiwgcHJvcCwgcmVjKTtcbiAgICAgICAgcmV0dXJuIHVzZVJlYWN0aXZlID8gdG9WYWx1ZShyKSA6IHI7XG4gICAgICB9XG4gICAgfVxuICApO1xuICByZXR1cm4gcHJveHk7XG59XG5cbmZ1bmN0aW9uIHVzaW5nRWxSZWYoc291cmNlLCBjYikge1xuICBpZiAodG9WYWx1ZShzb3VyY2UpKVxuICAgIGNiKHRvVmFsdWUoc291cmNlKSk7XG59XG5mdW5jdGlvbiB0aW1lUmFuZ2VUb0FycmF5KHRpbWVSYW5nZXMpIHtcbiAgbGV0IHJhbmdlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVSYW5nZXMubGVuZ3RoOyArK2kpXG4gICAgcmFuZ2VzID0gWy4uLnJhbmdlcywgW3RpbWVSYW5nZXMuc3RhcnQoaSksIHRpbWVSYW5nZXMuZW5kKGkpXV07XG4gIHJldHVybiByYW5nZXM7XG59XG5mdW5jdGlvbiB0cmFja3NUb0FycmF5KHRyYWNrcykge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0cmFja3MpLm1hcCgoeyBsYWJlbCwga2luZCwgbGFuZ3VhZ2UsIG1vZGUsIGFjdGl2ZUN1ZXMsIGN1ZXMsIGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGUgfSwgaWQpID0+ICh7IGlkLCBsYWJlbCwga2luZCwgbGFuZ3VhZ2UsIG1vZGUsIGFjdGl2ZUN1ZXMsIGN1ZXMsIGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGUgfSkpO1xufVxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIHNyYzogXCJcIixcbiAgdHJhY2tzOiBbXVxufTtcbmZ1bmN0aW9uIHVzZU1lZGlhQ29udHJvbHModGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIGNvbnN0IHtcbiAgICBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY3VycmVudFRpbWUgPSByZWYoMCk7XG4gIGNvbnN0IGR1cmF0aW9uID0gcmVmKDApO1xuICBjb25zdCBzZWVraW5nID0gcmVmKGZhbHNlKTtcbiAgY29uc3Qgdm9sdW1lID0gcmVmKDEpO1xuICBjb25zdCB3YWl0aW5nID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgZW5kZWQgPSByZWYoZmFsc2UpO1xuICBjb25zdCBwbGF5aW5nID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgcmF0ZSA9IHJlZigxKTtcbiAgY29uc3Qgc3RhbGxlZCA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGJ1ZmZlcmVkID0gcmVmKFtdKTtcbiAgY29uc3QgdHJhY2tzID0gcmVmKFtdKTtcbiAgY29uc3Qgc2VsZWN0ZWRUcmFjayA9IHJlZigtMSk7XG4gIGNvbnN0IGlzUGljdHVyZUluUGljdHVyZSA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IG11dGVkID0gcmVmKGZhbHNlKTtcbiAgY29uc3Qgc3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlID0gZG9jdW1lbnQgJiYgXCJwaWN0dXJlSW5QaWN0dXJlRW5hYmxlZFwiIGluIGRvY3VtZW50O1xuICBjb25zdCBzb3VyY2VFcnJvckV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG4gIGNvbnN0IGRpc2FibGVUcmFjayA9ICh0cmFjaykgPT4ge1xuICAgIHVzaW5nRWxSZWYodGFyZ2V0LCAoZWwpID0+IHtcbiAgICAgIGlmICh0cmFjaykge1xuICAgICAgICBjb25zdCBpZCA9IHR5cGVvZiB0cmFjayA9PT0gXCJudW1iZXJcIiA/IHRyYWNrIDogdHJhY2suaWQ7XG4gICAgICAgIGVsLnRleHRUcmFja3NbaWRdLm1vZGUgPSBcImRpc2FibGVkXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsLnRleHRUcmFja3MubGVuZ3RoOyArK2kpXG4gICAgICAgICAgZWwudGV4dFRyYWNrc1tpXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuICAgICAgfVxuICAgICAgc2VsZWN0ZWRUcmFjay52YWx1ZSA9IC0xO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBlbmFibGVUcmFjayA9ICh0cmFjaywgZGlzYWJsZVRyYWNrcyA9IHRydWUpID0+IHtcbiAgICB1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHR5cGVvZiB0cmFjayA9PT0gXCJudW1iZXJcIiA/IHRyYWNrIDogdHJhY2suaWQ7XG4gICAgICBpZiAoZGlzYWJsZVRyYWNrcylcbiAgICAgICAgZGlzYWJsZVRyYWNrKCk7XG4gICAgICBlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJzaG93aW5nXCI7XG4gICAgICBzZWxlY3RlZFRyYWNrLnZhbHVlID0gaWQ7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHRvZ2dsZVBpY3R1cmVJblBpY3R1cmUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVzaW5nRWxSZWYodGFyZ2V0LCBhc3luYyAoZWwpID0+IHtcbiAgICAgICAgaWYgKHN1cHBvcnRzUGljdHVyZUluUGljdHVyZSkge1xuICAgICAgICAgIGlmICghaXNQaWN0dXJlSW5QaWN0dXJlLnZhbHVlKSB7XG4gICAgICAgICAgICBlbC5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgd2F0Y2hFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZG9jdW1lbnQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG4gICAgaWYgKCFlbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBzcmMgPSB0b1ZhbHVlKG9wdGlvbnMuc3JjKTtcbiAgICBsZXQgc291cmNlcyA9IFtdO1xuICAgIGlmICghc3JjKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiKVxuICAgICAgc291cmNlcyA9IFt7IHNyYyB9XTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNyYykpXG4gICAgICBzb3VyY2VzID0gc3JjO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KHNyYykpXG4gICAgICBzb3VyY2VzID0gW3NyY107XG4gICAgZWwucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBzb3VyY2VFcnJvckV2ZW50LnRyaWdnZXIpO1xuICAgICAgZS5yZW1vdmUoKTtcbiAgICB9KTtcbiAgICBzb3VyY2VzLmZvckVhY2goKHsgc3JjOiBzcmMyLCB0eXBlIH0pID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIik7XG4gICAgICBzb3VyY2Uuc2V0QXR0cmlidXRlKFwic3JjXCIsIHNyYzIpO1xuICAgICAgc291cmNlLnNldEF0dHJpYnV0ZShcInR5cGVcIiwgdHlwZSB8fCBcIlwiKTtcbiAgICAgIHNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgc291cmNlRXJyb3JFdmVudC50cmlnZ2VyKTtcbiAgICAgIGVsLmFwcGVuZENoaWxkKHNvdXJjZSk7XG4gICAgfSk7XG4gICAgZWwubG9hZCgpO1xuICB9KTtcbiAgdHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuICAgIGlmICghZWwpXG4gICAgICByZXR1cm47XG4gICAgZWwucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKS5mb3JFYWNoKChlKSA9PiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBzb3VyY2VFcnJvckV2ZW50LnRyaWdnZXIpKTtcbiAgfSk7XG4gIHdhdGNoKFt0YXJnZXQsIHZvbHVtZV0sICgpID0+IHtcbiAgICBjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcbiAgICBpZiAoIWVsKVxuICAgICAgcmV0dXJuO1xuICAgIGVsLnZvbHVtZSA9IHZvbHVtZS52YWx1ZTtcbiAgfSk7XG4gIHdhdGNoKFt0YXJnZXQsIG11dGVkXSwgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuICAgIGlmICghZWwpXG4gICAgICByZXR1cm47XG4gICAgZWwubXV0ZWQgPSBtdXRlZC52YWx1ZTtcbiAgfSk7XG4gIHdhdGNoKFt0YXJnZXQsIHJhdGVdLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG4gICAgaWYgKCFlbClcbiAgICAgIHJldHVybjtcbiAgICBlbC5wbGF5YmFja1JhdGUgPSByYXRlLnZhbHVlO1xuICB9KTtcbiAgd2F0Y2hFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZG9jdW1lbnQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdGV4dFRyYWNrcyA9IHRvVmFsdWUob3B0aW9ucy50cmFja3MpO1xuICAgIGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuICAgIGlmICghdGV4dFRyYWNrcyB8fCAhdGV4dFRyYWNrcy5sZW5ndGggfHwgIWVsKVxuICAgICAgcmV0dXJuO1xuICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0cmFja1wiKS5mb3JFYWNoKChlKSA9PiBlLnJlbW92ZSgpKTtcbiAgICB0ZXh0VHJhY2tzLmZvckVhY2goKHsgZGVmYXVsdDogaXNEZWZhdWx0LCBraW5kLCBsYWJlbCwgc3JjLCBzcmNMYW5nIH0sIGkpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyYWNrXCIpO1xuICAgICAgdHJhY2suZGVmYXVsdCA9IGlzRGVmYXVsdCB8fCBmYWxzZTtcbiAgICAgIHRyYWNrLmtpbmQgPSBraW5kO1xuICAgICAgdHJhY2subGFiZWwgPSBsYWJlbDtcbiAgICAgIHRyYWNrLnNyYyA9IHNyYztcbiAgICAgIHRyYWNrLnNyY2xhbmcgPSBzcmNMYW5nO1xuICAgICAgaWYgKHRyYWNrLmRlZmF1bHQpXG4gICAgICAgIHNlbGVjdGVkVHJhY2sudmFsdWUgPSBpO1xuICAgICAgZWwuYXBwZW5kQ2hpbGQodHJhY2spO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgeyBpZ25vcmVVcGRhdGVzOiBpZ25vcmVDdXJyZW50VGltZVVwZGF0ZXMgfSA9IHdhdGNoSWdub3JhYmxlKGN1cnJlbnRUaW1lLCAodGltZSkgPT4ge1xuICAgIGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuICAgIGlmICghZWwpXG4gICAgICByZXR1cm47XG4gICAgZWwuY3VycmVudFRpbWUgPSB0aW1lO1xuICB9KTtcbiAgY29uc3QgeyBpZ25vcmVVcGRhdGVzOiBpZ25vcmVQbGF5aW5nVXBkYXRlcyB9ID0gd2F0Y2hJZ25vcmFibGUocGxheWluZywgKGlzUGxheWluZykgPT4ge1xuICAgIGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuICAgIGlmICghZWwpXG4gICAgICByZXR1cm47XG4gICAgaXNQbGF5aW5nID8gZWwucGxheSgpIDogZWwucGF1c2UoKTtcbiAgfSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRpbWV1cGRhdGVcIiwgKCkgPT4gaWdub3JlQ3VycmVudFRpbWVVcGRhdGVzKCgpID0+IGN1cnJlbnRUaW1lLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLmN1cnJlbnRUaW1lKSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImR1cmF0aW9uY2hhbmdlXCIsICgpID0+IGR1cmF0aW9uLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLmR1cmF0aW9uKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicHJvZ3Jlc3NcIiwgKCkgPT4gYnVmZmVyZWQudmFsdWUgPSB0aW1lUmFuZ2VUb0FycmF5KHRvVmFsdWUodGFyZ2V0KS5idWZmZXJlZCkpO1xuICB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJzZWVraW5nXCIsICgpID0+IHNlZWtpbmcudmFsdWUgPSB0cnVlKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwic2Vla2VkXCIsICgpID0+IHNlZWtpbmcudmFsdWUgPSBmYWxzZSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ3YWl0aW5nXCIsIFwibG9hZHN0YXJ0XCJdLCAoKSA9PiB7XG4gICAgd2FpdGluZy52YWx1ZSA9IHRydWU7XG4gICAgaWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IGZhbHNlKTtcbiAgfSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxvYWRlZGRhdGFcIiwgKCkgPT4gd2FpdGluZy52YWx1ZSA9IGZhbHNlKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicGxheWluZ1wiLCAoKSA9PiB7XG4gICAgd2FpdGluZy52YWx1ZSA9IGZhbHNlO1xuICAgIGVuZGVkLnZhbHVlID0gZmFsc2U7XG4gICAgaWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IHRydWUpO1xuICB9KTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicmF0ZWNoYW5nZVwiLCAoKSA9PiByYXRlLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLnBsYXliYWNrUmF0ZSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInN0YWxsZWRcIiwgKCkgPT4gc3RhbGxlZC52YWx1ZSA9IHRydWUpO1xuICB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJlbmRlZFwiLCAoKSA9PiBlbmRlZC52YWx1ZSA9IHRydWUpO1xuICB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwYXVzZVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gZmFsc2UpKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicGxheVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gdHJ1ZSkpO1xuICB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJlbnRlcnBpY3R1cmVpbnBpY3R1cmVcIiwgKCkgPT4gaXNQaWN0dXJlSW5QaWN0dXJlLnZhbHVlID0gdHJ1ZSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxlYXZlcGljdHVyZWlucGljdHVyZVwiLCAoKSA9PiBpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUgPSBmYWxzZSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInZvbHVtZWNoYW5nZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG4gICAgaWYgKCFlbClcbiAgICAgIHJldHVybjtcbiAgICB2b2x1bWUudmFsdWUgPSBlbC52b2x1bWU7XG4gICAgbXV0ZWQudmFsdWUgPSBlbC5tdXRlZDtcbiAgfSk7XG4gIGNvbnN0IGxpc3RlbmVycyA9IFtdO1xuICBjb25zdCBzdG9wID0gd2F0Y2goW3RhcmdldF0sICgpID0+IHtcbiAgICBjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcbiAgICBpZiAoIWVsKVxuICAgICAgcmV0dXJuO1xuICAgIHN0b3AoKTtcbiAgICBsaXN0ZW5lcnNbMF0gPSB1c2VFdmVudExpc3RlbmVyKGVsLnRleHRUcmFja3MsIFwiYWRkdHJhY2tcIiwgKCkgPT4gdHJhY2tzLnZhbHVlID0gdHJhY2tzVG9BcnJheShlbC50ZXh0VHJhY2tzKSk7XG4gICAgbGlzdGVuZXJzWzFdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcInJlbW92ZXRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcykpO1xuICAgIGxpc3RlbmVyc1syXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJjaGFuZ2VcIiwgKCkgPT4gdHJhY2tzLnZhbHVlID0gdHJhY2tzVG9BcnJheShlbC50ZXh0VHJhY2tzKSk7XG4gIH0pO1xuICB0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50VGltZSxcbiAgICBkdXJhdGlvbixcbiAgICB3YWl0aW5nLFxuICAgIHNlZWtpbmcsXG4gICAgZW5kZWQsXG4gICAgc3RhbGxlZCxcbiAgICBidWZmZXJlZCxcbiAgICBwbGF5aW5nLFxuICAgIHJhdGUsXG4gICAgLy8gVm9sdW1lXG4gICAgdm9sdW1lLFxuICAgIG11dGVkLFxuICAgIC8vIFRyYWNrc1xuICAgIHRyYWNrcyxcbiAgICBzZWxlY3RlZFRyYWNrLFxuICAgIGVuYWJsZVRyYWNrLFxuICAgIGRpc2FibGVUcmFjayxcbiAgICAvLyBQaWN0dXJlIGluIFBpY3R1cmVcbiAgICBzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmUsXG4gICAgdG9nZ2xlUGljdHVyZUluUGljdHVyZSxcbiAgICBpc1BpY3R1cmVJblBpY3R1cmUsXG4gICAgLy8gRXZlbnRzXG4gICAgb25Tb3VyY2VFcnJvcjogc291cmNlRXJyb3JFdmVudC5vblxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRNYXBWdWUyQ29tcGF0KCkge1xuICBjb25zdCBkYXRhID0gc2hhbGxvd1JlYWN0aXZlKHt9KTtcbiAgcmV0dXJuIHtcbiAgICBnZXQ6IChrZXkpID0+IGRhdGFba2V5XSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiBzZXQoZGF0YSwga2V5LCB2YWx1ZSksXG4gICAgaGFzOiAoa2V5KSA9PiBoYXNPd24oZGF0YSwga2V5KSxcbiAgICBkZWxldGU6IChrZXkpID0+IGRlbChkYXRhLCBrZXkpLFxuICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgZGVsKGRhdGEsIGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB1c2VNZW1vaXplKHJlc29sdmVyLCBvcHRpb25zKSB7XG4gIGNvbnN0IGluaXRDYWNoZSA9ICgpID0+IHtcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jYWNoZSlcbiAgICAgIHJldHVybiBzaGFsbG93UmVhY3RpdmUob3B0aW9ucy5jYWNoZSk7XG4gICAgaWYgKGlzVnVlMilcbiAgICAgIHJldHVybiBnZXRNYXBWdWUyQ29tcGF0KCk7XG4gICAgcmV0dXJuIHNoYWxsb3dSZWFjdGl2ZSgvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgfTtcbiAgY29uc3QgY2FjaGUgPSBpbml0Q2FjaGUoKTtcbiAgY29uc3QgZ2VuZXJhdGVLZXkgPSAoLi4uYXJncykgPT4gKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0S2V5KSA/IG9wdGlvbnMuZ2V0S2V5KC4uLmFyZ3MpIDogSlNPTi5zdHJpbmdpZnkoYXJncyk7XG4gIGNvbnN0IF9sb2FkRGF0YSA9IChrZXksIC4uLmFyZ3MpID0+IHtcbiAgICBjYWNoZS5zZXQoa2V5LCByZXNvbHZlciguLi5hcmdzKSk7XG4gICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICB9O1xuICBjb25zdCBsb2FkRGF0YSA9ICguLi5hcmdzKSA9PiBfbG9hZERhdGEoZ2VuZXJhdGVLZXkoLi4uYXJncyksIC4uLmFyZ3MpO1xuICBjb25zdCBkZWxldGVEYXRhID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjYWNoZS5kZWxldGUoZ2VuZXJhdGVLZXkoLi4uYXJncykpO1xuICB9O1xuICBjb25zdCBjbGVhckRhdGEgPSAoKSA9PiB7XG4gICAgY2FjaGUuY2xlYXIoKTtcbiAgfTtcbiAgY29uc3QgbWVtb2l6ZWQgPSAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGdlbmVyYXRlS2V5KC4uLmFyZ3MpO1xuICAgIGlmIChjYWNoZS5oYXMoa2V5KSlcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICByZXR1cm4gX2xvYWREYXRhKGtleSwgLi4uYXJncyk7XG4gIH07XG4gIG1lbW9pemVkLmxvYWQgPSBsb2FkRGF0YTtcbiAgbWVtb2l6ZWQuZGVsZXRlID0gZGVsZXRlRGF0YTtcbiAgbWVtb2l6ZWQuY2xlYXIgPSBjbGVhckRhdGE7XG4gIG1lbW9pemVkLmdlbmVyYXRlS2V5ID0gZ2VuZXJhdGVLZXk7XG4gIG1lbW9pemVkLmNhY2hlID0gY2FjaGU7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuZnVuY3Rpb24gdXNlTWVtb3J5KG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtZW1vcnkgPSByZWYoKTtcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gdHlwZW9mIHBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmIFwibWVtb3J5XCIgaW4gcGVyZm9ybWFuY2UpO1xuICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcbiAgICBjb25zdCB7IGludGVydmFsID0gMWUzIH0gPSBvcHRpb25zO1xuICAgIHVzZUludGVydmFsRm4oKCkgPT4ge1xuICAgICAgbWVtb3J5LnZhbHVlID0gcGVyZm9ybWFuY2UubWVtb3J5O1xuICAgIH0sIGludGVydmFsLCB7IGltbWVkaWF0ZTogb3B0aW9ucy5pbW1lZGlhdGUsIGltbWVkaWF0ZUNhbGxiYWNrOiBvcHRpb25zLmltbWVkaWF0ZUNhbGxiYWNrIH0pO1xuICB9XG4gIHJldHVybiB7IGlzU3VwcG9ydGVkLCBtZW1vcnkgfTtcbn1cblxuY29uc3QgVXNlTW91c2VCdWlsdGluRXh0cmFjdG9ycyA9IHtcbiAgcGFnZTogKGV2ZW50KSA9PiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXSxcbiAgY2xpZW50OiAoZXZlbnQpID0+IFtldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZXSxcbiAgc2NyZWVuOiAoZXZlbnQpID0+IFtldmVudC5zY3JlZW5YLCBldmVudC5zY3JlZW5ZXSxcbiAgbW92ZW1lbnQ6IChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBUb3VjaCA/IG51bGwgOiBbZXZlbnQubW92ZW1lbnRYLCBldmVudC5tb3ZlbWVudFldXG59O1xuZnVuY3Rpb24gdXNlTW91c2Uob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gXCJwYWdlXCIsXG4gICAgdG91Y2ggPSB0cnVlLFxuICAgIHJlc2V0T25Ub3VjaEVuZHMgPSBmYWxzZSxcbiAgICBpbml0aWFsVmFsdWUgPSB7IHg6IDAsIHk6IDAgfSxcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93LFxuICAgIHRhcmdldCA9IHdpbmRvdyxcbiAgICBzY3JvbGwgPSB0cnVlLFxuICAgIGV2ZW50RmlsdGVyXG4gIH0gPSBvcHRpb25zO1xuICBsZXQgX3ByZXZNb3VzZUV2ZW50ID0gbnVsbDtcbiAgY29uc3QgeCA9IHJlZihpbml0aWFsVmFsdWUueCk7XG4gIGNvbnN0IHkgPSByZWYoaW5pdGlhbFZhbHVlLnkpO1xuICBjb25zdCBzb3VyY2VUeXBlID0gcmVmKG51bGwpO1xuICBjb25zdCBleHRyYWN0b3IgPSB0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiID8gdHlwZSA6IFVzZU1vdXNlQnVpbHRpbkV4dHJhY3RvcnNbdHlwZV07XG4gIGNvbnN0IG1vdXNlSGFuZGxlciA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RvcihldmVudCk7XG4gICAgX3ByZXZNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgW3gudmFsdWUsIHkudmFsdWVdID0gcmVzdWx0O1xuICAgICAgc291cmNlVHlwZS52YWx1ZSA9IFwibW91c2VcIjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRvdWNoSGFuZGxlciA9IChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RvcihldmVudC50b3VjaGVzWzBdKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgW3gudmFsdWUsIHkudmFsdWVdID0gcmVzdWx0O1xuICAgICAgICBzb3VyY2VUeXBlLnZhbHVlID0gXCJ0b3VjaFwiO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcbiAgICBpZiAoIV9wcmV2TW91c2VFdmVudCB8fCAhd2luZG93KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHBvcyA9IGV4dHJhY3RvcihfcHJldk1vdXNlRXZlbnQpO1xuICAgIGlmIChfcHJldk1vdXNlRXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIHBvcykge1xuICAgICAgeC52YWx1ZSA9IHBvc1swXSArIHdpbmRvdy5zY3JvbGxYO1xuICAgICAgeS52YWx1ZSA9IHBvc1sxXSArIHdpbmRvdy5zY3JvbGxZO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgeC52YWx1ZSA9IGluaXRpYWxWYWx1ZS54O1xuICAgIHkudmFsdWUgPSBpbml0aWFsVmFsdWUueTtcbiAgfTtcbiAgY29uc3QgbW91c2VIYW5kbGVyV3JhcHBlciA9IGV2ZW50RmlsdGVyID8gKGV2ZW50KSA9PiBldmVudEZpbHRlcigoKSA9PiBtb3VzZUhhbmRsZXIoZXZlbnQpLCB7fSkgOiAoZXZlbnQpID0+IG1vdXNlSGFuZGxlcihldmVudCk7XG4gIGNvbnN0IHRvdWNoSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/IChldmVudCkgPT4gZXZlbnRGaWx0ZXIoKCkgPT4gdG91Y2hIYW5kbGVyKGV2ZW50KSwge30pIDogKGV2ZW50KSA9PiB0b3VjaEhhbmRsZXIoZXZlbnQpO1xuICBjb25zdCBzY3JvbGxIYW5kbGVyV3JhcHBlciA9IGV2ZW50RmlsdGVyID8gKCkgPT4gZXZlbnRGaWx0ZXIoKCkgPT4gc2Nyb2xsSGFuZGxlcigpLCB7fSkgOiAoKSA9PiBzY3JvbGxIYW5kbGVyKCk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcbiAgICB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1wibW91c2Vtb3ZlXCIsIFwiZHJhZ292ZXJcIl0sIG1vdXNlSGFuZGxlcldyYXBwZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgaWYgKHRvdWNoICYmIHR5cGUgIT09IFwibW92ZW1lbnRcIikge1xuICAgICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcInRvdWNoc3RhcnRcIiwgXCJ0b3VjaG1vdmVcIl0sIHRvdWNoSGFuZGxlcldyYXBwZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgICBpZiAocmVzZXRPblRvdWNoRW5kcylcbiAgICAgICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hlbmRcIiwgcmVzZXQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChzY3JvbGwgJiYgdHlwZSA9PT0gXCJwYWdlXCIpXG4gICAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJzY3JvbGxcIiwgc2Nyb2xsSGFuZGxlcldyYXBwZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICBzb3VyY2VUeXBlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZU1vdXNlSW5FbGVtZW50KHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBoYW5kbGVPdXRzaWRlID0gdHJ1ZSxcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlIHx8IFwicGFnZVwiO1xuICBjb25zdCB7IHgsIHksIHNvdXJjZVR5cGUgfSA9IHVzZU1vdXNlKG9wdGlvbnMpO1xuICBjb25zdCB0YXJnZXRSZWYgPSByZWYodGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQgOiB3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5kb2N1bWVudC5ib2R5KTtcbiAgY29uc3QgZWxlbWVudFggPSByZWYoMCk7XG4gIGNvbnN0IGVsZW1lbnRZID0gcmVmKDApO1xuICBjb25zdCBlbGVtZW50UG9zaXRpb25YID0gcmVmKDApO1xuICBjb25zdCBlbGVtZW50UG9zaXRpb25ZID0gcmVmKDApO1xuICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gcmVmKDApO1xuICBjb25zdCBlbGVtZW50V2lkdGggPSByZWYoMCk7XG4gIGNvbnN0IGlzT3V0c2lkZSA9IHJlZih0cnVlKTtcbiAgbGV0IHN0b3AgPSAoKSA9PiB7XG4gIH07XG4gIGlmICh3aW5kb3cpIHtcbiAgICBzdG9wID0gd2F0Y2goXG4gICAgICBbdGFyZ2V0UmVmLCB4LCB5XSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0UmVmKTtcbiAgICAgICAgaWYgKCFlbClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBlbGVtZW50UG9zaXRpb25YLnZhbHVlID0gbGVmdCArICh0eXBlID09PSBcInBhZ2VcIiA/IHdpbmRvdy5wYWdlWE9mZnNldCA6IDApO1xuICAgICAgICBlbGVtZW50UG9zaXRpb25ZLnZhbHVlID0gdG9wICsgKHR5cGUgPT09IFwicGFnZVwiID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogMCk7XG4gICAgICAgIGVsZW1lbnRIZWlnaHQudmFsdWUgPSBoZWlnaHQ7XG4gICAgICAgIGVsZW1lbnRXaWR0aC52YWx1ZSA9IHdpZHRoO1xuICAgICAgICBjb25zdCBlbFggPSB4LnZhbHVlIC0gZWxlbWVudFBvc2l0aW9uWC52YWx1ZTtcbiAgICAgICAgY29uc3QgZWxZID0geS52YWx1ZSAtIGVsZW1lbnRQb3NpdGlvblkudmFsdWU7XG4gICAgICAgIGlzT3V0c2lkZS52YWx1ZSA9IHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCB8fCBlbFggPCAwIHx8IGVsWSA8IDAgfHwgZWxYID4gd2lkdGggfHwgZWxZID4gaGVpZ2h0O1xuICAgICAgICBpZiAoaGFuZGxlT3V0c2lkZSB8fCAhaXNPdXRzaWRlLnZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudFgudmFsdWUgPSBlbFg7XG4gICAgICAgICAgZWxlbWVudFkudmFsdWUgPSBlbFk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGltbWVkaWF0ZTogdHJ1ZSB9XG4gICAgKTtcbiAgICB1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuICAgICAgaXNPdXRzaWRlLnZhbHVlID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICBzb3VyY2VUeXBlLFxuICAgIGVsZW1lbnRYLFxuICAgIGVsZW1lbnRZLFxuICAgIGVsZW1lbnRQb3NpdGlvblgsXG4gICAgZWxlbWVudFBvc2l0aW9uWSxcbiAgICBlbGVtZW50SGVpZ2h0LFxuICAgIGVsZW1lbnRXaWR0aCxcbiAgICBpc091dHNpZGUsXG4gICAgc3RvcFxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VNb3VzZVByZXNzZWQob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0b3VjaCA9IHRydWUsXG4gICAgZHJhZyA9IHRydWUsXG4gICAgY2FwdHVyZSA9IGZhbHNlLFxuICAgIGluaXRpYWxWYWx1ZSA9IGZhbHNlLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByZXNzZWQgPSByZWYoaW5pdGlhbFZhbHVlKTtcbiAgY29uc3Qgc291cmNlVHlwZSA9IHJlZihudWxsKTtcbiAgaWYgKCF3aW5kb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlc3NlZCxcbiAgICAgIHNvdXJjZVR5cGVcbiAgICB9O1xuICB9XG4gIGNvbnN0IG9uUHJlc3NlZCA9IChzcmNUeXBlKSA9PiAoKSA9PiB7XG4gICAgcHJlc3NlZC52YWx1ZSA9IHRydWU7XG4gICAgc291cmNlVHlwZS52YWx1ZSA9IHNyY1R5cGU7XG4gIH07XG4gIGNvbnN0IG9uUmVsZWFzZWQgPSAoKSA9PiB7XG4gICAgcHJlc3NlZC52YWx1ZSA9IGZhbHNlO1xuICAgIHNvdXJjZVR5cGUudmFsdWUgPSBudWxsO1xuICB9O1xuICBjb25zdCB0YXJnZXQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQob3B0aW9ucy50YXJnZXQpIHx8IHdpbmRvdyk7XG4gIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcIm1vdXNlZG93blwiLCBvblByZXNzZWQoXCJtb3VzZVwiKSwgeyBwYXNzaXZlOiB0cnVlLCBjYXB0dXJlIH0pO1xuICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJtb3VzZWxlYXZlXCIsIG9uUmVsZWFzZWQsIHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZSB9KTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwibW91c2V1cFwiLCBvblJlbGVhc2VkLCB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmUgfSk7XG4gIGlmIChkcmFnKSB7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ3N0YXJ0XCIsIG9uUHJlc3NlZChcIm1vdXNlXCIpLCB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmUgfSk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiZHJvcFwiLCBvblJlbGVhc2VkLCB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmUgfSk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiZHJhZ2VuZFwiLCBvblJlbGVhc2VkLCB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmUgfSk7XG4gIH1cbiAgaWYgKHRvdWNoKSB7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCBvblByZXNzZWQoXCJ0b3VjaFwiKSwgeyBwYXNzaXZlOiB0cnVlLCBjYXB0dXJlIH0pO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcInRvdWNoZW5kXCIsIG9uUmVsZWFzZWQsIHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZSB9KTtcbiAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJ0b3VjaGNhbmNlbFwiLCBvblJlbGVhc2VkLCB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmUgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcmVzc2VkLFxuICAgIHNvdXJjZVR5cGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlTmF2aWdhdG9yTGFuZ3VhZ2Uob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgd2luZG93ID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcbiAgY29uc3QgbmF2aWdhdG9yID0gd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cubmF2aWdhdG9yO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IgJiYgXCJsYW5ndWFnZVwiIGluIG5hdmlnYXRvcik7XG4gIGNvbnN0IGxhbmd1YWdlID0gcmVmKG5hdmlnYXRvciA9PSBudWxsID8gdm9pZCAwIDogbmF2aWdhdG9yLmxhbmd1YWdlKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIGlmIChuYXZpZ2F0b3IpXG4gICAgICBsYW5ndWFnZS52YWx1ZSA9IG5hdmlnYXRvci5sYW5ndWFnZTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgbGFuZ3VhZ2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlTmV0d29yayhvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuICBjb25zdCBuYXZpZ2F0b3IgPSB3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5uYXZpZ2F0b3I7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciAmJiBcImNvbm5lY3Rpb25cIiBpbiBuYXZpZ2F0b3IpO1xuICBjb25zdCBpc09ubGluZSA9IHJlZih0cnVlKTtcbiAgY29uc3Qgc2F2ZURhdGEgPSByZWYoZmFsc2UpO1xuICBjb25zdCBvZmZsaW5lQXQgPSByZWYodm9pZCAwKTtcbiAgY29uc3Qgb25saW5lQXQgPSByZWYodm9pZCAwKTtcbiAgY29uc3QgZG93bmxpbmsgPSByZWYodm9pZCAwKTtcbiAgY29uc3QgZG93bmxpbmtNYXggPSByZWYodm9pZCAwKTtcbiAgY29uc3QgcnR0ID0gcmVmKHZvaWQgMCk7XG4gIGNvbnN0IGVmZmVjdGl2ZVR5cGUgPSByZWYodm9pZCAwKTtcbiAgY29uc3QgdHlwZSA9IHJlZihcInVua25vd25cIik7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBpc1N1cHBvcnRlZC52YWx1ZSAmJiBuYXZpZ2F0b3IuY29ubmVjdGlvbjtcbiAgZnVuY3Rpb24gdXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCkge1xuICAgIGlmICghbmF2aWdhdG9yKVxuICAgICAgcmV0dXJuO1xuICAgIGlzT25saW5lLnZhbHVlID0gbmF2aWdhdG9yLm9uTGluZTtcbiAgICBvZmZsaW5lQXQudmFsdWUgPSBpc09ubGluZS52YWx1ZSA/IHZvaWQgMCA6IERhdGUubm93KCk7XG4gICAgb25saW5lQXQudmFsdWUgPSBpc09ubGluZS52YWx1ZSA/IERhdGUubm93KCkgOiB2b2lkIDA7XG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgIGRvd25saW5rLnZhbHVlID0gY29ubmVjdGlvbi5kb3dubGluaztcbiAgICAgIGRvd25saW5rTWF4LnZhbHVlID0gY29ubmVjdGlvbi5kb3dubGlua01heDtcbiAgICAgIGVmZmVjdGl2ZVR5cGUudmFsdWUgPSBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGU7XG4gICAgICBydHQudmFsdWUgPSBjb25uZWN0aW9uLnJ0dDtcbiAgICAgIHNhdmVEYXRhLnZhbHVlID0gY29ubmVjdGlvbi5zYXZlRGF0YTtcbiAgICAgIHR5cGUudmFsdWUgPSBjb25uZWN0aW9uLnR5cGU7XG4gICAgfVxuICB9XG4gIGlmICh3aW5kb3cpIHtcbiAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJvZmZsaW5lXCIsICgpID0+IHtcbiAgICAgIGlzT25saW5lLnZhbHVlID0gZmFsc2U7XG4gICAgICBvZmZsaW5lQXQudmFsdWUgPSBEYXRlLm5vdygpO1xuICAgIH0pO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcIm9ubGluZVwiLCAoKSA9PiB7XG4gICAgICBpc09ubGluZS52YWx1ZSA9IHRydWU7XG4gICAgICBvbmxpbmVBdC52YWx1ZSA9IERhdGUubm93KCk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGNvbm5lY3Rpb24pXG4gICAgdXNlRXZlbnRMaXN0ZW5lcihjb25uZWN0aW9uLCBcImNoYW5nZVwiLCB1cGRhdGVOZXR3b3JrSW5mb3JtYXRpb24sIGZhbHNlKTtcbiAgdXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCk7XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgaXNPbmxpbmUsXG4gICAgc2F2ZURhdGEsXG4gICAgb2ZmbGluZUF0LFxuICAgIG9ubGluZUF0LFxuICAgIGRvd25saW5rLFxuICAgIGRvd25saW5rTWF4LFxuICAgIGVmZmVjdGl2ZVR5cGUsXG4gICAgcnR0LFxuICAgIHR5cGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlTm93KG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsXG4gICAgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBub3cgPSByZWYoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpO1xuICBjb25zdCB1cGRhdGUgPSAoKSA9PiBub3cudmFsdWUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcbiAgY29uc3QgY29udHJvbHMgPSBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IHVzZVJhZkZuKHVwZGF0ZSwgeyBpbW1lZGlhdGU6IHRydWUgfSkgOiB1c2VJbnRlcnZhbEZuKHVwZGF0ZSwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuICBpZiAoZXhwb3NlQ29udHJvbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbm93LFxuICAgICAgLi4uY29udHJvbHNcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBub3c7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlT2JqZWN0VXJsKG9iamVjdCkge1xuICBjb25zdCB1cmwgPSByZWYoKTtcbiAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICBpZiAodXJsLnZhbHVlKVxuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwudmFsdWUpO1xuICAgIHVybC52YWx1ZSA9IHZvaWQgMDtcbiAgfTtcbiAgd2F0Y2goXG4gICAgKCkgPT4gdG9WYWx1ZShvYmplY3QpLFxuICAgIChuZXdPYmplY3QpID0+IHtcbiAgICAgIHJlbGVhc2UoKTtcbiAgICAgIGlmIChuZXdPYmplY3QpXG4gICAgICAgIHVybC52YWx1ZSA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3T2JqZWN0KTtcbiAgICB9LFxuICAgIHsgaW1tZWRpYXRlOiB0cnVlIH1cbiAgKTtcbiAgdHJ5T25TY29wZURpc3Bvc2UocmVsZWFzZSk7XG4gIHJldHVybiByZWFkb25seSh1cmwpO1xufVxuXG5mdW5jdGlvbiB1c2VDbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IGlzUmVhZG9ubHkodmFsdWUpKVxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBjbGFtcCh0b1ZhbHVlKHZhbHVlKSwgdG9WYWx1ZShtaW4pLCB0b1ZhbHVlKG1heCkpKTtcbiAgY29uc3QgX3ZhbHVlID0gcmVmKHZhbHVlKTtcbiAgcmV0dXJuIGNvbXB1dGVkKHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gX3ZhbHVlLnZhbHVlID0gY2xhbXAoX3ZhbHVlLnZhbHVlLCB0b1ZhbHVlKG1pbiksIHRvVmFsdWUobWF4KSk7XG4gICAgfSxcbiAgICBzZXQodmFsdWUyKSB7XG4gICAgICBfdmFsdWUudmFsdWUgPSBjbGFtcCh2YWx1ZTIsIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1c2VPZmZzZXRQYWdpbmF0aW9uKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIHRvdGFsID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHBhZ2VTaXplID0gMTAsXG4gICAgcGFnZSA9IDEsXG4gICAgb25QYWdlQ2hhbmdlID0gbm9vcCxcbiAgICBvblBhZ2VTaXplQ2hhbmdlID0gbm9vcCxcbiAgICBvblBhZ2VDb3VudENoYW5nZSA9IG5vb3BcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGN1cnJlbnRQYWdlU2l6ZSA9IHVzZUNsYW1wKHBhZ2VTaXplLCAxLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICBjb25zdCBwYWdlQ291bnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLm1heChcbiAgICAxLFxuICAgIE1hdGguY2VpbCh0b1ZhbHVlKHRvdGFsKSAvIHRvVmFsdWUoY3VycmVudFBhZ2VTaXplKSlcbiAgKSk7XG4gIGNvbnN0IGN1cnJlbnRQYWdlID0gdXNlQ2xhbXAocGFnZSwgMSwgcGFnZUNvdW50KTtcbiAgY29uc3QgaXNGaXJzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gMSk7XG4gIGNvbnN0IGlzTGFzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gcGFnZUNvdW50LnZhbHVlKTtcbiAgaWYgKGlzUmVmKHBhZ2UpKSB7XG4gICAgc3luY1JlZihwYWdlLCBjdXJyZW50UGFnZSwge1xuICAgICAgZGlyZWN0aW9uOiBpc1JlYWRvbmx5KHBhZ2UpID8gXCJsdHJcIiA6IFwiYm90aFwiXG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzUmVmKHBhZ2VTaXplKSkge1xuICAgIHN5bmNSZWYocGFnZVNpemUsIGN1cnJlbnRQYWdlU2l6ZSwge1xuICAgICAgZGlyZWN0aW9uOiBpc1JlYWRvbmx5KHBhZ2VTaXplKSA/IFwibHRyXCIgOiBcImJvdGhcIlxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgY3VycmVudFBhZ2UudmFsdWUtLTtcbiAgfVxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIGN1cnJlbnRQYWdlLnZhbHVlKys7XG4gIH1cbiAgY29uc3QgcmV0dXJuVmFsdWUgPSB7XG4gICAgY3VycmVudFBhZ2UsXG4gICAgY3VycmVudFBhZ2VTaXplLFxuICAgIHBhZ2VDb3VudCxcbiAgICBpc0ZpcnN0UGFnZSxcbiAgICBpc0xhc3RQYWdlLFxuICAgIHByZXYsXG4gICAgbmV4dFxuICB9O1xuICB3YXRjaChjdXJyZW50UGFnZSwgKCkgPT4ge1xuICAgIG9uUGFnZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuICB9KTtcbiAgd2F0Y2goY3VycmVudFBhZ2VTaXplLCAoKSA9PiB7XG4gICAgb25QYWdlU2l6ZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuICB9KTtcbiAgd2F0Y2gocGFnZUNvdW50LCAoKSA9PiB7XG4gICAgb25QYWdlQ291bnRDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcbiAgfSk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXNlT25saW5lKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IGlzT25saW5lIH0gPSB1c2VOZXR3b3JrKG9wdGlvbnMpO1xuICByZXR1cm4gaXNPbmxpbmU7XG59XG5cbmZ1bmN0aW9uIHVzZVBhZ2VMZWF2ZShvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuICBjb25zdCBpc0xlZnQgPSByZWYoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCF3aW5kb3cpXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7XG4gICAgY29uc3QgZnJvbSA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQudG9FbGVtZW50O1xuICAgIGlzTGVmdC52YWx1ZSA9ICFmcm9tO1xuICB9O1xuICBpZiAod2luZG93KSB7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwibW91c2VvdXRcIiwgaGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCBcIm1vdXNlbGVhdmVcIiwgaGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCBcIm1vdXNlZW50ZXJcIiwgaGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBpc0xlZnQ7XG59XG5cbmZ1bmN0aW9uIHVzZVNjcmVlbk9yaWVudGF0aW9uKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2luZG93ID0gZGVmYXVsdFdpbmRvd1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93ICYmIFwic2NyZWVuXCIgaW4gd2luZG93ICYmIFwib3JpZW50YXRpb25cIiBpbiB3aW5kb3cuc2NyZWVuKTtcbiAgY29uc3Qgc2NyZWVuT3JpZW50YXRpb24gPSBpc1N1cHBvcnRlZC52YWx1ZSA/IHdpbmRvdy5zY3JlZW4ub3JpZW50YXRpb24gOiB7fTtcbiAgY29uc3Qgb3JpZW50YXRpb24gPSByZWYoc2NyZWVuT3JpZW50YXRpb24udHlwZSk7XG4gIGNvbnN0IGFuZ2xlID0gcmVmKHNjcmVlbk9yaWVudGF0aW9uLmFuZ2xlIHx8IDApO1xuICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcbiAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJvcmllbnRhdGlvbmNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBvcmllbnRhdGlvbi52YWx1ZSA9IHNjcmVlbk9yaWVudGF0aW9uLnR5cGU7XG4gICAgICBhbmdsZS52YWx1ZSA9IHNjcmVlbk9yaWVudGF0aW9uLmFuZ2xlO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IGxvY2tPcmllbnRhdGlvbiA9ICh0eXBlKSA9PiB7XG4gICAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHR5cGVvZiBzY3JlZW5PcmllbnRhdGlvbi5sb2NrID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gc2NyZWVuT3JpZW50YXRpb24ubG9jayh0eXBlKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm90IHN1cHBvcnRlZFwiKSk7XG4gIH07XG4gIGNvbnN0IHVubG9ja09yaWVudGF0aW9uID0gKCkgPT4ge1xuICAgIGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB0eXBlb2Ygc2NyZWVuT3JpZW50YXRpb24udW5sb2NrID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBzY3JlZW5PcmllbnRhdGlvbi51bmxvY2soKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBvcmllbnRhdGlvbixcbiAgICBhbmdsZSxcbiAgICBsb2NrT3JpZW50YXRpb24sXG4gICAgdW5sb2NrT3JpZW50YXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlUGFyYWxsYXgodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCA9IChpKSA9PiBpLFxuICAgIGRldmljZU9yaWVudGF0aW9uUm9sbEFkanVzdCA9IChpKSA9PiBpLFxuICAgIG1vdXNlVGlsdEFkanVzdCA9IChpKSA9PiBpLFxuICAgIG1vdXNlUm9sbEFkanVzdCA9IChpKSA9PiBpLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IG9yaWVudGF0aW9uID0gcmVhY3RpdmUodXNlRGV2aWNlT3JpZW50YXRpb24oeyB3aW5kb3cgfSkpO1xuICBjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHJlYWN0aXZlKHVzZVNjcmVlbk9yaWVudGF0aW9uKHsgd2luZG93IH0pKTtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRYOiB4LFxuICAgIGVsZW1lbnRZOiB5LFxuICAgIGVsZW1lbnRXaWR0aDogd2lkdGgsXG4gICAgZWxlbWVudEhlaWdodDogaGVpZ2h0XG4gIH0gPSB1c2VNb3VzZUluRWxlbWVudCh0YXJnZXQsIHsgaGFuZGxlT3V0c2lkZTogZmFsc2UsIHdpbmRvdyB9KTtcbiAgY29uc3Qgc291cmNlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmIChvcmllbnRhdGlvbi5pc1N1cHBvcnRlZCAmJiAob3JpZW50YXRpb24uYWxwaGEgIT0gbnVsbCAmJiBvcmllbnRhdGlvbi5hbHBoYSAhPT0gMCB8fCBvcmllbnRhdGlvbi5nYW1tYSAhPSBudWxsICYmIG9yaWVudGF0aW9uLmdhbW1hICE9PSAwKSlcbiAgICAgIHJldHVybiBcImRldmljZU9yaWVudGF0aW9uXCI7XG4gICAgcmV0dXJuIFwibW91c2VcIjtcbiAgfSk7XG4gIGNvbnN0IHJvbGwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG4gICAgICBsZXQgdmFsdWU7XG4gICAgICBzd2l0Y2ggKHNjcmVlbk9yaWVudGF0aW9uLm9yaWVudGF0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuICAgICAgICAgIHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxhbmRzY2FwZS1zZWNvbmRhcnlcIjpcbiAgICAgICAgICB2YWx1ZSA9IC1vcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicG9ydHJhaXQtcHJpbWFyeVwiOlxuICAgICAgICAgIHZhbHVlID0gLW9yaWVudGF0aW9uLmJldGEgLyA5MDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBvcnRyYWl0LXNlY29uZGFyeVwiOlxuICAgICAgICAgIHZhbHVlID0gb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHZhbHVlID0gLW9yaWVudGF0aW9uLmJldGEgLyA5MDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXZpY2VPcmllbnRhdGlvblJvbGxBZGp1c3QodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IC0oeS52YWx1ZSAtIGhlaWdodC52YWx1ZSAvIDIpIC8gaGVpZ2h0LnZhbHVlO1xuICAgICAgcmV0dXJuIG1vdXNlUm9sbEFkanVzdCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgdGlsdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoc291cmNlLnZhbHVlID09PSBcImRldmljZU9yaWVudGF0aW9uXCIpIHtcbiAgICAgIGxldCB2YWx1ZTtcbiAgICAgIHN3aXRjaCAoc2NyZWVuT3JpZW50YXRpb24ub3JpZW50YXRpb24pIHtcbiAgICAgICAgY2FzZSBcImxhbmRzY2FwZS1wcmltYXJ5XCI6XG4gICAgICAgICAgdmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJsYW5kc2NhcGUtc2Vjb25kYXJ5XCI6XG4gICAgICAgICAgdmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicG9ydHJhaXQtcHJpbWFyeVwiOlxuICAgICAgICAgIHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBvcnRyYWl0LXNlY29uZGFyeVwiOlxuICAgICAgICAgIHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFsdWUgPSBvcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKHgudmFsdWUgLSB3aWR0aC52YWx1ZSAvIDIpIC8gd2lkdGgudmFsdWU7XG4gICAgICByZXR1cm4gbW91c2VUaWx0QWRqdXN0KHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4geyByb2xsLCB0aWx0LCBzb3VyY2UgfTtcbn1cblxuZnVuY3Rpb24gdXNlUGFyZW50RWxlbWVudChlbGVtZW50ID0gdXNlQ3VycmVudEVsZW1lbnQoKSkge1xuICBjb25zdCBwYXJlbnRFbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSB1bnJlZkVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKGVsKVxuICAgICAgcGFyZW50RWxlbWVudC52YWx1ZSA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gIH07XG4gIHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuICB3YXRjaCgoKSA9PiB0b1ZhbHVlKGVsZW1lbnQpLCB1cGRhdGUpO1xuICByZXR1cm4gcGFyZW50RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gdXNlUGVyZm9ybWFuY2VPYnNlcnZlcihvcHRpb25zLCBjYWxsYmFjaykge1xuICBjb25zdCB7XG4gICAgd2luZG93ID0gZGVmYXVsdFdpbmRvdyxcbiAgICBpbW1lZGlhdGUgPSB0cnVlLFxuICAgIC4uLnBlcmZvcm1hbmNlT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93ICYmIFwiUGVyZm9ybWFuY2VPYnNlcnZlclwiIGluIHdpbmRvdyk7XG4gIGxldCBvYnNlcnZlcjtcbiAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICBvYnNlcnZlciA9PSBudWxsID8gdm9pZCAwIDogb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9O1xuICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcbiAgICAgIHN0b3AoKTtcbiAgICAgIG9ic2VydmVyID0gbmV3IFBlcmZvcm1hbmNlT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShwZXJmb3JtYW5jZU9wdGlvbnMpO1xuICAgIH1cbiAgfTtcbiAgdHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG4gIGlmIChpbW1lZGlhdGUpXG4gICAgc3RhcnQoKTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBzdGFydCxcbiAgICBzdG9wXG4gIH07XG59XG5cbmNvbnN0IGRlZmF1bHRTdGF0ZSA9IHtcbiAgeDogMCxcbiAgeTogMCxcbiAgcG9pbnRlcklkOiAwLFxuICBwcmVzc3VyZTogMCxcbiAgdGlsdFg6IDAsXG4gIHRpbHRZOiAwLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICB0d2lzdDogMCxcbiAgcG9pbnRlclR5cGU6IG51bGxcbn07XG5jb25zdCBrZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5rZXlzKGRlZmF1bHRTdGF0ZSk7XG5mdW5jdGlvbiB1c2VQb2ludGVyKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvd1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaXNJbnNpZGUgPSByZWYoZmFsc2UpO1xuICBjb25zdCBzdGF0ZSA9IHJlZihvcHRpb25zLmluaXRpYWxWYWx1ZSB8fCB7fSk7XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUudmFsdWUsIGRlZmF1bHRTdGF0ZSwgc3RhdGUudmFsdWUpO1xuICBjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgaXNJbnNpZGUudmFsdWUgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zLnBvaW50ZXJUeXBlcyAmJiAhb3B0aW9ucy5wb2ludGVyVHlwZXMuaW5jbHVkZXMoZXZlbnQucG9pbnRlclR5cGUpKVxuICAgICAgcmV0dXJuO1xuICAgIHN0YXRlLnZhbHVlID0gb2JqZWN0UGljayhldmVudCwga2V5cywgZmFsc2UpO1xuICB9O1xuICBpZiAodGFyZ2V0KSB7XG4gICAgY29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcInBvaW50ZXJkb3duXCIsIFwicG9pbnRlcm1vdmVcIiwgXCJwb2ludGVydXBcIl0sIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicG9pbnRlcmxlYXZlXCIsICgpID0+IGlzSW5zaWRlLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi50b1JlZnMoc3RhdGUpLFxuICAgIGlzSW5zaWRlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVBvaW50ZXJMb2NrKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgZG9jdW1lbnQgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IGRvY3VtZW50ICYmIFwicG9pbnRlckxvY2tFbGVtZW50XCIgaW4gZG9jdW1lbnQpO1xuICBjb25zdCBlbGVtZW50ID0gcmVmKCk7XG4gIGNvbnN0IHRyaWdnZXJFbGVtZW50ID0gcmVmKCk7XG4gIGxldCB0YXJnZXRFbGVtZW50O1xuICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcbiAgICB1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcInBvaW50ZXJsb2NrY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gKF9hID0gZG9jdW1lbnQucG9pbnRlckxvY2tFbGVtZW50KSAhPSBudWxsID8gX2EgOiBlbGVtZW50LnZhbHVlO1xuICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgPT09IHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudDtcbiAgICAgICAgaWYgKCFlbGVtZW50LnZhbHVlKVxuICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSB0cmlnZ2VyRWxlbWVudC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJwb2ludGVybG9ja2Vycm9yXCIsICgpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gKF9hID0gZG9jdW1lbnQucG9pbnRlckxvY2tFbGVtZW50KSAhPSBudWxsID8gX2EgOiBlbGVtZW50LnZhbHVlO1xuICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgPT09IHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gZG9jdW1lbnQucG9pbnRlckxvY2tFbGVtZW50ID8gXCJyZWxlYXNlXCIgOiBcImFjcXVpcmVcIjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gJHthY3Rpb259IHBvaW50ZXIgbG9jay5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBsb2NrKGUpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFpc1N1cHBvcnRlZC52YWx1ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvaW50ZXIgTG9jayBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuXCIpO1xuICAgIHRyaWdnZXJFbGVtZW50LnZhbHVlID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gZS5jdXJyZW50VGFyZ2V0IDogbnVsbDtcbiAgICB0YXJnZXRFbGVtZW50ID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gKF9hID0gdW5yZWZFbGVtZW50KHRhcmdldCkpICE9IG51bGwgPyBfYSA6IHRyaWdnZXJFbGVtZW50LnZhbHVlIDogdW5yZWZFbGVtZW50KGUpO1xuICAgIGlmICghdGFyZ2V0RWxlbWVudClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhcmdldCBlbGVtZW50IHVuZGVmaW5lZC5cIik7XG4gICAgdGFyZ2V0RWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcbiAgICByZXR1cm4gYXdhaXQgdW50aWwoZWxlbWVudCkudG9CZSh0YXJnZXRFbGVtZW50KTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiB1bmxvY2soKSB7XG4gICAgaWYgKCFlbGVtZW50LnZhbHVlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGRvY3VtZW50LmV4aXRQb2ludGVyTG9jaygpO1xuICAgIGF3YWl0IHVudGlsKGVsZW1lbnQpLnRvQmVOdWxsKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBlbGVtZW50LFxuICAgIHRyaWdnZXJFbGVtZW50LFxuICAgIGxvY2ssXG4gICAgdW5sb2NrXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVBvaW50ZXJTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB0YXJnZXRSZWYgPSB0b1JlZih0YXJnZXQpO1xuICBjb25zdCB7XG4gICAgdGhyZXNob2xkID0gNTAsXG4gICAgb25Td2lwZSxcbiAgICBvblN3aXBlRW5kLFxuICAgIG9uU3dpcGVTdGFydCxcbiAgICBkaXNhYmxlVGV4dFNlbGVjdCA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwb3NTdGFydCA9IHJlYWN0aXZlKHsgeDogMCwgeTogMCB9KTtcbiAgY29uc3QgdXBkYXRlUG9zU3RhcnQgPSAoeCwgeSkgPT4ge1xuICAgIHBvc1N0YXJ0LnggPSB4O1xuICAgIHBvc1N0YXJ0LnkgPSB5O1xuICB9O1xuICBjb25zdCBwb3NFbmQgPSByZWFjdGl2ZSh7IHg6IDAsIHk6IDAgfSk7XG4gIGNvbnN0IHVwZGF0ZVBvc0VuZCA9ICh4LCB5KSA9PiB7XG4gICAgcG9zRW5kLnggPSB4O1xuICAgIHBvc0VuZC55ID0geTtcbiAgfTtcbiAgY29uc3QgZGlzdGFuY2VYID0gY29tcHV0ZWQoKCkgPT4gcG9zU3RhcnQueCAtIHBvc0VuZC54KTtcbiAgY29uc3QgZGlzdGFuY2VZID0gY29tcHV0ZWQoKCkgPT4gcG9zU3RhcnQueSAtIHBvc0VuZC55KTtcbiAgY29uc3QgeyBtYXgsIGFicyB9ID0gTWF0aDtcbiAgY29uc3QgaXNUaHJlc2hvbGRFeGNlZWRlZCA9IGNvbXB1dGVkKCgpID0+IG1heChhYnMoZGlzdGFuY2VYLnZhbHVlKSwgYWJzKGRpc3RhbmNlWS52YWx1ZSkpID49IHRocmVzaG9sZCk7XG4gIGNvbnN0IGlzU3dpcGluZyA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGlzUG9pbnRlckRvd24gPSByZWYoZmFsc2UpO1xuICBjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKVxuICAgICAgcmV0dXJuIFwibm9uZVwiO1xuICAgIGlmIChhYnMoZGlzdGFuY2VYLnZhbHVlKSA+IGFicyhkaXN0YW5jZVkudmFsdWUpKSB7XG4gICAgICByZXR1cm4gZGlzdGFuY2VYLnZhbHVlID4gMCA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGlzdGFuY2VZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV2ZW50SXNBbGxvd2VkID0gKGUpID0+IHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICBjb25zdCBpc1JlbGVhc2luZ0J1dHRvbiA9IGUuYnV0dG9ucyA9PT0gMDtcbiAgICBjb25zdCBpc1ByaW1hcnlCdXR0b24gPSBlLmJ1dHRvbnMgPT09IDE7XG4gICAgcmV0dXJuIChfYyA9IChfYiA9IChfYSA9IG9wdGlvbnMucG9pbnRlclR5cGVzKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoZS5wb2ludGVyVHlwZSkpICE9IG51bGwgPyBfYiA6IGlzUmVsZWFzaW5nQnV0dG9uIHx8IGlzUHJpbWFyeUJ1dHRvbikgIT0gbnVsbCA/IF9jIDogdHJ1ZTtcbiAgfTtcbiAgY29uc3Qgc3RvcHMgPSBbXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicG9pbnRlcmRvd25cIiwgKGUpID0+IHtcbiAgICAgIGlmICghZXZlbnRJc0FsbG93ZWQoZSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlzUG9pbnRlckRvd24udmFsdWUgPSB0cnVlO1xuICAgICAgY29uc3QgZXZlbnRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgIGV2ZW50VGFyZ2V0ID09IG51bGwgPyB2b2lkIDAgOiBldmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICBjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG4gICAgICB1cGRhdGVQb3NTdGFydCh4LCB5KTtcbiAgICAgIHVwZGF0ZVBvc0VuZCh4LCB5KTtcbiAgICAgIG9uU3dpcGVTdGFydCA9PSBudWxsID8gdm9pZCAwIDogb25Td2lwZVN0YXJ0KGUpO1xuICAgIH0pLFxuICAgIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJtb3ZlXCIsIChlKSA9PiB7XG4gICAgICBpZiAoIWV2ZW50SXNBbGxvd2VkKGUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIWlzUG9pbnRlckRvd24udmFsdWUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9ID0gZTtcbiAgICAgIHVwZGF0ZVBvc0VuZCh4LCB5KTtcbiAgICAgIGlmICghaXNTd2lwaW5nLnZhbHVlICYmIGlzVGhyZXNob2xkRXhjZWVkZWQudmFsdWUpXG4gICAgICAgIGlzU3dpcGluZy52YWx1ZSA9IHRydWU7XG4gICAgICBpZiAoaXNTd2lwaW5nLnZhbHVlKVxuICAgICAgICBvblN3aXBlID09IG51bGwgPyB2b2lkIDAgOiBvblN3aXBlKGUpO1xuICAgIH0pLFxuICAgIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJ1cFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKCFldmVudElzQWxsb3dlZChlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGlzU3dpcGluZy52YWx1ZSlcbiAgICAgICAgb25Td2lwZUVuZCA9PSBudWxsID8gdm9pZCAwIDogb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuICAgICAgaXNQb2ludGVyRG93bi52YWx1ZSA9IGZhbHNlO1xuICAgICAgaXNTd2lwaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgfSlcbiAgXTtcbiAgdHJ5T25Nb3VudGVkKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgIChfYiA9IChfYSA9IHRhcmdldFJlZi52YWx1ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnN0eWxlKSA9PSBudWxsID8gdm9pZCAwIDogX2Iuc2V0UHJvcGVydHkoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpO1xuICAgIGlmIChkaXNhYmxlVGV4dFNlbGVjdCkge1xuICAgICAgKF9kID0gKF9jID0gdGFyZ2V0UmVmLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2Muc3R5bGUpID09IG51bGwgPyB2b2lkIDAgOiBfZC5zZXRQcm9wZXJ0eShcIi13ZWJraXQtdXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuICAgICAgKF9mID0gKF9lID0gdGFyZ2V0UmVmLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2Uuc3R5bGUpID09IG51bGwgPyB2b2lkIDAgOiBfZi5zZXRQcm9wZXJ0eShcIi1tcy11c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG4gICAgICAoX2ggPSAoX2cgPSB0YXJnZXRSZWYudmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfZy5zdHlsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9oLnNldFByb3BlcnR5KFwidXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiBzdG9wcy5mb3JFYWNoKChzKSA9PiBzKCkpO1xuICByZXR1cm4ge1xuICAgIGlzU3dpcGluZzogcmVhZG9ubHkoaXNTd2lwaW5nKSxcbiAgICBkaXJlY3Rpb246IHJlYWRvbmx5KGRpcmVjdGlvbiksXG4gICAgcG9zU3RhcnQ6IHJlYWRvbmx5KHBvc1N0YXJ0KSxcbiAgICBwb3NFbmQ6IHJlYWRvbmx5KHBvc0VuZCksXG4gICAgZGlzdGFuY2VYLFxuICAgIGRpc3RhbmNlWSxcbiAgICBzdG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lKG9wdGlvbnMpIHtcbiAgY29uc3QgaXNMaWdodCA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KVwiLCBvcHRpb25zKTtcbiAgY29uc3QgaXNEYXJrID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiwgb3B0aW9ucyk7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKGlzRGFyay52YWx1ZSlcbiAgICAgIHJldHVybiBcImRhcmtcIjtcbiAgICBpZiAoaXNMaWdodC52YWx1ZSlcbiAgICAgIHJldHVybiBcImxpZ2h0XCI7XG4gICAgcmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlUHJlZmVycmVkQ29udHJhc3Qob3B0aW9ucykge1xuICBjb25zdCBpc01vcmUgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29udHJhc3Q6IG1vcmUpXCIsIG9wdGlvbnMpO1xuICBjb25zdCBpc0xlc3MgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29udHJhc3Q6IGxlc3MpXCIsIG9wdGlvbnMpO1xuICBjb25zdCBpc0N1c3RvbSA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb250cmFzdDogY3VzdG9tKVwiLCBvcHRpb25zKTtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoaXNNb3JlLnZhbHVlKVxuICAgICAgcmV0dXJuIFwibW9yZVwiO1xuICAgIGlmIChpc0xlc3MudmFsdWUpXG4gICAgICByZXR1cm4gXCJsZXNzXCI7XG4gICAgaWYgKGlzQ3VzdG9tLnZhbHVlKVxuICAgICAgcmV0dXJuIFwiY3VzdG9tXCI7XG4gICAgcmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlUHJlZmVycmVkTGFuZ3VhZ2VzKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IHdpbmRvdyA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG4gIGlmICghd2luZG93KVxuICAgIHJldHVybiByZWYoW1wiZW5cIl0pO1xuICBjb25zdCBuYXZpZ2F0b3IgPSB3aW5kb3cubmF2aWdhdG9yO1xuICBjb25zdCB2YWx1ZSA9IHJlZihuYXZpZ2F0b3IubGFuZ3VhZ2VzKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIHZhbHVlLnZhbHVlID0gbmF2aWdhdG9yLmxhbmd1YWdlcztcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXNlUHJlZmVycmVkUmVkdWNlZE1vdGlvbihvcHRpb25zKSB7XG4gIGNvbnN0IGlzUmVkdWNlZCA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKVwiLCBvcHRpb25zKTtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoaXNSZWR1Y2VkLnZhbHVlKVxuICAgICAgcmV0dXJuIFwicmVkdWNlXCI7XG4gICAgcmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlUHJldmlvdXModmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICBjb25zdCBwcmV2aW91cyA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcbiAgd2F0Y2goXG4gICAgdG9SZWYodmFsdWUpLFxuICAgIChfLCBvbGRWYWx1ZSkgPT4ge1xuICAgICAgcHJldmlvdXMudmFsdWUgPSBvbGRWYWx1ZTtcbiAgICB9LFxuICAgIHsgZmx1c2g6IFwic3luY1wiIH1cbiAgKTtcbiAgcmV0dXJuIHJlYWRvbmx5KHByZXZpb3VzKTtcbn1cblxuY29uc3QgdG9wVmFyTmFtZSA9IFwiLS12dWV1c2Utc2FmZS1hcmVhLXRvcFwiO1xuY29uc3QgcmlnaHRWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtcmlnaHRcIjtcbmNvbnN0IGJvdHRvbVZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1ib3R0b21cIjtcbmNvbnN0IGxlZnRWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtbGVmdFwiO1xuZnVuY3Rpb24gdXNlU2NyZWVuU2FmZUFyZWEoKSB7XG4gIGNvbnN0IHRvcCA9IHJlZihcIlwiKTtcbiAgY29uc3QgcmlnaHQgPSByZWYoXCJcIik7XG4gIGNvbnN0IGJvdHRvbSA9IHJlZihcIlwiKTtcbiAgY29uc3QgbGVmdCA9IHJlZihcIlwiKTtcbiAgaWYgKGlzQ2xpZW50KSB7XG4gICAgY29uc3QgdG9wQ3NzVmFyID0gdXNlQ3NzVmFyKHRvcFZhck5hbWUpO1xuICAgIGNvbnN0IHJpZ2h0Q3NzVmFyID0gdXNlQ3NzVmFyKHJpZ2h0VmFyTmFtZSk7XG4gICAgY29uc3QgYm90dG9tQ3NzVmFyID0gdXNlQ3NzVmFyKGJvdHRvbVZhck5hbWUpO1xuICAgIGNvbnN0IGxlZnRDc3NWYXIgPSB1c2VDc3NWYXIobGVmdFZhck5hbWUpO1xuICAgIHRvcENzc1Zhci52YWx1ZSA9IFwiZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweClcIjtcbiAgICByaWdodENzc1Zhci52YWx1ZSA9IFwiZW52KHNhZmUtYXJlYS1pbnNldC1yaWdodCwgMHB4KVwiO1xuICAgIGJvdHRvbUNzc1Zhci52YWx1ZSA9IFwiZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sIDBweClcIjtcbiAgICBsZWZ0Q3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LWxlZnQsIDBweClcIjtcbiAgICB1cGRhdGUoKTtcbiAgICB1c2VFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVzZURlYm91bmNlRm4odXBkYXRlKSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHRvcC52YWx1ZSA9IGdldFZhbHVlKHRvcFZhck5hbWUpO1xuICAgIHJpZ2h0LnZhbHVlID0gZ2V0VmFsdWUocmlnaHRWYXJOYW1lKTtcbiAgICBib3R0b20udmFsdWUgPSBnZXRWYWx1ZShib3R0b21WYXJOYW1lKTtcbiAgICBsZWZ0LnZhbHVlID0gZ2V0VmFsdWUobGVmdFZhck5hbWUpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9wLFxuICAgIHJpZ2h0LFxuICAgIGJvdHRvbSxcbiAgICBsZWZ0LFxuICAgIHVwZGF0ZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUocG9zaXRpb24pIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHBvc2l0aW9uKTtcbn1cblxuZnVuY3Rpb24gdXNlU2NyaXB0VGFnKHNyYywgb25Mb2FkZWQgPSBub29wLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGltbWVkaWF0ZSA9IHRydWUsXG4gICAgbWFudWFsID0gZmFsc2UsXG4gICAgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIsXG4gICAgYXN5bmMgPSB0cnVlLFxuICAgIGNyb3NzT3JpZ2luLFxuICAgIHJlZmVycmVyUG9saWN5LFxuICAgIG5vTW9kdWxlLFxuICAgIGRlZmVyLFxuICAgIGRvY3VtZW50ID0gZGVmYXVsdERvY3VtZW50LFxuICAgIGF0dHJzID0ge31cbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNjcmlwdFRhZyA9IHJlZihudWxsKTtcbiAgbGV0IF9wcm9taXNlID0gbnVsbDtcbiAgY29uc3QgbG9hZFNjcmlwdCA9ICh3YWl0Rm9yU2NyaXB0TG9hZCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVXaXRoRWxlbWVudCA9IChlbDIpID0+IHtcbiAgICAgIHNjcmlwdFRhZy52YWx1ZSA9IGVsMjtcbiAgICAgIHJlc29sdmUoZWwyKTtcbiAgICAgIHJldHVybiBlbDI7XG4gICAgfTtcbiAgICBpZiAoIWRvY3VtZW50KSB7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNob3VsZEFwcGVuZCA9IGZhbHNlO1xuICAgIGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke3RvVmFsdWUoc3JjKX1cIl1gKTtcbiAgICBpZiAoIWVsKSB7XG4gICAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICBlbC50eXBlID0gdHlwZTtcbiAgICAgIGVsLmFzeW5jID0gYXN5bmM7XG4gICAgICBlbC5zcmMgPSB0b1ZhbHVlKHNyYyk7XG4gICAgICBpZiAoZGVmZXIpXG4gICAgICAgIGVsLmRlZmVyID0gZGVmZXI7XG4gICAgICBpZiAoY3Jvc3NPcmlnaW4pXG4gICAgICAgIGVsLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG4gICAgICBpZiAobm9Nb2R1bGUpXG4gICAgICAgIGVsLm5vTW9kdWxlID0gbm9Nb2R1bGU7XG4gICAgICBpZiAocmVmZXJyZXJQb2xpY3kpXG4gICAgICAgIGVsLnJlZmVycmVyUG9saWN5ID0gcmVmZXJyZXJQb2xpY3k7XG4gICAgICBPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4gZWwgPT0gbnVsbCA/IHZvaWQgMCA6IGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpO1xuICAgICAgc2hvdWxkQXBwZW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGVsLmhhc0F0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIpKSB7XG4gICAgICByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuICAgIH1cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiLCBcInRydWVcIik7XG4gICAgICBvbkxvYWRlZChlbCk7XG4gICAgICByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuICAgIH0pO1xuICAgIGlmIChzaG91bGRBcHBlbmQpXG4gICAgICBlbCA9IGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIGlmICghd2FpdEZvclNjcmlwdExvYWQpXG4gICAgICByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuICB9KTtcbiAgY29uc3QgbG9hZCA9ICh3YWl0Rm9yU2NyaXB0TG9hZCA9IHRydWUpID0+IHtcbiAgICBpZiAoIV9wcm9taXNlKVxuICAgICAgX3Byb21pc2UgPSBsb2FkU2NyaXB0KHdhaXRGb3JTY3JpcHRMb2FkKTtcbiAgICByZXR1cm4gX3Byb21pc2U7XG4gIH07XG4gIGNvbnN0IHVubG9hZCA9ICgpID0+IHtcbiAgICBpZiAoIWRvY3VtZW50KVxuICAgICAgcmV0dXJuO1xuICAgIF9wcm9taXNlID0gbnVsbDtcbiAgICBpZiAoc2NyaXB0VGFnLnZhbHVlKVxuICAgICAgc2NyaXB0VGFnLnZhbHVlID0gbnVsbDtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke3RvVmFsdWUoc3JjKX1cIl1gKTtcbiAgICBpZiAoZWwpXG4gICAgICBkb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKGVsKTtcbiAgfTtcbiAgaWYgKGltbWVkaWF0ZSAmJiAhbWFudWFsKVxuICAgIHRyeU9uTW91bnRlZChsb2FkKTtcbiAgaWYgKCFtYW51YWwpXG4gICAgdHJ5T25Vbm1vdW50ZWQodW5sb2FkKTtcbiAgcmV0dXJuIHsgc2NyaXB0VGFnLCBsb2FkLCB1bmxvYWQgfTtcbn1cblxuZnVuY3Rpb24gY2hlY2tPdmVyZmxvd1Njcm9sbChlbGUpIHtcbiAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGUpO1xuICBpZiAoc3R5bGUub3ZlcmZsb3dYID09PSBcInNjcm9sbFwiIHx8IHN0eWxlLm92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fCBzdHlsZS5vdmVyZmxvd1ggPT09IFwiYXV0b1wiICYmIGVsZS5jbGllbnRXaWR0aCA8IGVsZS5zY3JvbGxXaWR0aCB8fCBzdHlsZS5vdmVyZmxvd1kgPT09IFwiYXV0b1wiICYmIGVsZS5jbGllbnRIZWlnaHQgPCBlbGUuc2Nyb2xsSGVpZ2h0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWxlLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50LnRhZ05hbWUgPT09IFwiQk9EWVwiKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBjaGVja092ZXJmbG93U2Nyb2xsKHBhcmVudCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KHJhd0V2ZW50KSB7XG4gIGNvbnN0IGUgPSByYXdFdmVudCB8fCB3aW5kb3cuZXZlbnQ7XG4gIGNvbnN0IF90YXJnZXQgPSBlLnRhcmdldDtcbiAgaWYgKGNoZWNrT3ZlcmZsb3dTY3JvbGwoX3RhcmdldCkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChlLnByZXZlbnREZWZhdWx0KVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgZWxJbml0aWFsT3ZlcmZsb3cgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHVzZVNjcm9sbExvY2soZWxlbWVudCwgaW5pdGlhbFN0YXRlID0gZmFsc2UpIHtcbiAgY29uc3QgaXNMb2NrZWQgPSByZWYoaW5pdGlhbFN0YXRlKTtcbiAgbGV0IHN0b3BUb3VjaE1vdmVMaXN0ZW5lciA9IG51bGw7XG4gIHdhdGNoKHRvUmVmKGVsZW1lbnQpLCAoZWwpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsKSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgY29uc3QgZWxlID0gdGFyZ2V0O1xuICAgICAgaWYgKCFlbEluaXRpYWxPdmVyZmxvdy5nZXQoZWxlKSlcbiAgICAgICAgZWxJbml0aWFsT3ZlcmZsb3cuc2V0KGVsZSwgZWxlLnN0eWxlLm92ZXJmbG93KTtcbiAgICAgIGlmIChpc0xvY2tlZC52YWx1ZSlcbiAgICAgICAgZWxlLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICB9XG4gIH0sIHtcbiAgICBpbW1lZGlhdGU6IHRydWVcbiAgfSk7XG4gIGNvbnN0IGxvY2sgPSAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcbiAgICBpZiAoIWVsIHx8IGlzTG9ja2VkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChpc0lPUykge1xuICAgICAgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID0gdXNlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgZWwsXG4gICAgICAgIFwidG91Y2htb3ZlXCIsXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgcGFzc2l2ZTogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9XG4gICAgZWwuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICAgIGlzTG9ja2VkLnZhbHVlID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgdW5sb2NrID0gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuICAgIGlmICghZWwgfHwgIWlzTG9ja2VkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlzSU9TICYmIChzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHN0b3BUb3VjaE1vdmVMaXN0ZW5lcigpKTtcbiAgICBlbC5zdHlsZS5vdmVyZmxvdyA9IChfYSA9IGVsSW5pdGlhbE92ZXJmbG93LmdldChlbCkpICE9IG51bGwgPyBfYSA6IFwiXCI7XG4gICAgZWxJbml0aWFsT3ZlcmZsb3cuZGVsZXRlKGVsKTtcbiAgICBpc0xvY2tlZC52YWx1ZSA9IGZhbHNlO1xuICB9O1xuICB0cnlPblNjb3BlRGlzcG9zZSh1bmxvY2spO1xuICByZXR1cm4gY29tcHV0ZWQoe1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpc0xvY2tlZC52YWx1ZTtcbiAgICB9LFxuICAgIHNldCh2KSB7XG4gICAgICBpZiAodilcbiAgICAgICAgbG9jaygpO1xuICAgICAgZWxzZVxuICAgICAgICB1bmxvY2soKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1c2VTZXNzaW9uU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgd2luZG93ID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIHVzZVN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LnNlc3Npb25TdG9yYWdlLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gdXNlU2hhcmUoc2hhcmVPcHRpb25zID0ge30sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IG5hdmlnYXRvciA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IF9uYXZpZ2F0b3IgPSBuYXZpZ2F0b3I7XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IF9uYXZpZ2F0b3IgJiYgXCJjYW5TaGFyZVwiIGluIF9uYXZpZ2F0b3IpO1xuICBjb25zdCBzaGFyZSA9IGFzeW5jIChvdmVycmlkZU9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgLi4udG9WYWx1ZShzaGFyZU9wdGlvbnMpLFxuICAgICAgICAuLi50b1ZhbHVlKG92ZXJyaWRlT3B0aW9ucylcbiAgICAgIH07XG4gICAgICBsZXQgZ3JhbnRlZCA9IHRydWU7XG4gICAgICBpZiAoZGF0YS5maWxlcyAmJiBfbmF2aWdhdG9yLmNhblNoYXJlKVxuICAgICAgICBncmFudGVkID0gX25hdmlnYXRvci5jYW5TaGFyZSh7IGZpbGVzOiBkYXRhLmZpbGVzIH0pO1xuICAgICAgaWYgKGdyYW50ZWQpXG4gICAgICAgIHJldHVybiBfbmF2aWdhdG9yLnNoYXJlKGRhdGEpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBzaGFyZVxuICB9O1xufVxuXG5jb25zdCBkZWZhdWx0U29ydEZuID0gKHNvdXJjZSwgY29tcGFyZUZuKSA9PiBzb3VyY2Uuc29ydChjb21wYXJlRm4pO1xuY29uc3QgZGVmYXVsdENvbXBhcmUgPSAoYSwgYikgPT4gYSAtIGI7XG5mdW5jdGlvbiB1c2VTb3J0ZWQoLi4uYXJncykge1xuICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gIGNvbnN0IFtzb3VyY2VdID0gYXJncztcbiAgbGV0IGNvbXBhcmVGbiA9IGRlZmF1bHRDb21wYXJlO1xuICBsZXQgb3B0aW9ucyA9IHt9O1xuICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdO1xuICAgICAgY29tcGFyZUZuID0gKF9hID0gb3B0aW9ucy5jb21wYXJlRm4pICE9IG51bGwgPyBfYSA6IGRlZmF1bHRDb21wYXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wYXJlRm4gPSAoX2IgPSBhcmdzWzFdKSAhPSBudWxsID8gX2IgOiBkZWZhdWx0Q29tcGFyZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgY29tcGFyZUZuID0gKF9jID0gYXJnc1sxXSkgIT0gbnVsbCA/IF9jIDogZGVmYXVsdENvbXBhcmU7XG4gICAgb3B0aW9ucyA9IChfZCA9IGFyZ3NbMl0pICE9IG51bGwgPyBfZCA6IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBkaXJ0eSA9IGZhbHNlLFxuICAgIHNvcnRGbiA9IGRlZmF1bHRTb3J0Rm5cbiAgfSA9IG9wdGlvbnM7XG4gIGlmICghZGlydHkpXG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHNvcnRGbihbLi4udG9WYWx1ZShzb3VyY2UpXSwgY29tcGFyZUZuKSk7XG4gIHdhdGNoRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBzb3J0Rm4odG9WYWx1ZShzb3VyY2UpLCBjb21wYXJlRm4pO1xuICAgIGlmIChpc1JlZihzb3VyY2UpKVxuICAgICAgc291cmNlLnZhbHVlID0gcmVzdWx0O1xuICAgIGVsc2VcbiAgICAgIHNvdXJjZS5zcGxpY2UoMCwgc291cmNlLmxlbmd0aCwgLi4ucmVzdWx0KTtcbiAgfSk7XG4gIHJldHVybiBzb3VyY2U7XG59XG5cbmZ1bmN0aW9uIHVzZVNwZWVjaFJlY29nbml0aW9uKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgaW50ZXJpbVJlc3VsdHMgPSB0cnVlLFxuICAgIGNvbnRpbnVvdXMgPSB0cnVlLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxhbmcgPSB0b1JlZihvcHRpb25zLmxhbmcgfHwgXCJlbi1VU1wiKTtcbiAgY29uc3QgaXNMaXN0ZW5pbmcgPSByZWYoZmFsc2UpO1xuICBjb25zdCBpc0ZpbmFsID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgcmVzdWx0ID0gcmVmKFwiXCIpO1xuICBjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYodm9pZCAwKTtcbiAgY29uc3QgdG9nZ2xlID0gKHZhbHVlID0gIWlzTGlzdGVuaW5nLnZhbHVlKSA9PiB7XG4gICAgaXNMaXN0ZW5pbmcudmFsdWUgPSB2YWx1ZTtcbiAgfTtcbiAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgaXNMaXN0ZW5pbmcudmFsdWUgPSB0cnVlO1xuICB9O1xuICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgIGlzTGlzdGVuaW5nLnZhbHVlID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID0gd2luZG93ICYmICh3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uKTtcbiAgY29uc3QgaXNTdXBwb3J0ZWQgPSB1c2VTdXBwb3J0ZWQoKCkgPT4gU3BlZWNoUmVjb2duaXRpb24pO1xuICBsZXQgcmVjb2duaXRpb247XG4gIGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuICAgIHJlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKCk7XG4gICAgcmVjb2duaXRpb24uY29udGludW91cyA9IGNvbnRpbnVvdXM7XG4gICAgcmVjb2duaXRpb24uaW50ZXJpbVJlc3VsdHMgPSBpbnRlcmltUmVzdWx0cztcbiAgICByZWNvZ25pdGlvbi5sYW5nID0gdG9WYWx1ZShsYW5nKTtcbiAgICByZWNvZ25pdGlvbi5vbnN0YXJ0ID0gKCkgPT4ge1xuICAgICAgaXNGaW5hbC52YWx1ZSA9IGZhbHNlO1xuICAgIH07XG4gICAgd2F0Y2gobGFuZywgKGxhbmcyKSA9PiB7XG4gICAgICBpZiAocmVjb2duaXRpb24gJiYgIWlzTGlzdGVuaW5nLnZhbHVlKVxuICAgICAgICByZWNvZ25pdGlvbi5sYW5nID0gbGFuZzI7XG4gICAgfSk7XG4gICAgcmVjb2duaXRpb24ub25yZXN1bHQgPSAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zY3JpcHQgPSBBcnJheS5mcm9tKGV2ZW50LnJlc3VsdHMpLm1hcCgocmVzdWx0MikgPT4ge1xuICAgICAgICBpc0ZpbmFsLnZhbHVlID0gcmVzdWx0Mi5pc0ZpbmFsO1xuICAgICAgICByZXR1cm4gcmVzdWx0MlswXTtcbiAgICAgIH0pLm1hcCgocmVzdWx0MikgPT4gcmVzdWx0Mi50cmFuc2NyaXB0KS5qb2luKFwiXCIpO1xuICAgICAgcmVzdWx0LnZhbHVlID0gdHJhbnNjcmlwdDtcbiAgICAgIGVycm9yLnZhbHVlID0gdm9pZCAwO1xuICAgIH07XG4gICAgcmVjb2duaXRpb24ub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgZXJyb3IudmFsdWUgPSBldmVudDtcbiAgICB9O1xuICAgIHJlY29nbml0aW9uLm9uZW5kID0gKCkgPT4ge1xuICAgICAgaXNMaXN0ZW5pbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgIHJlY29nbml0aW9uLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuICAgIH07XG4gICAgd2F0Y2goaXNMaXN0ZW5pbmcsICgpID0+IHtcbiAgICAgIGlmIChpc0xpc3RlbmluZy52YWx1ZSlcbiAgICAgICAgcmVjb2duaXRpb24uc3RhcnQoKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVjb2duaXRpb24uc3RvcCgpO1xuICAgIH0pO1xuICB9XG4gIHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICBpc0xpc3RlbmluZy52YWx1ZSA9IGZhbHNlO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBpc0xpc3RlbmluZyxcbiAgICBpc0ZpbmFsLFxuICAgIHJlY29nbml0aW9uLFxuICAgIHJlc3VsdCxcbiAgICBlcnJvcixcbiAgICB0b2dnbGUsXG4gICAgc3RhcnQsXG4gICAgc3RvcFxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VTcGVlY2hTeW50aGVzaXModGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwaXRjaCA9IDEsXG4gICAgcmF0ZSA9IDEsXG4gICAgdm9sdW1lID0gMSxcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzeW50aCA9IHdpbmRvdyAmJiB3aW5kb3cuc3BlZWNoU3ludGhlc2lzO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiBzeW50aCk7XG4gIGNvbnN0IGlzUGxheWluZyA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IHN0YXR1cyA9IHJlZihcImluaXRcIik7XG4gIGNvbnN0IHNwb2tlblRleHQgPSB0b1JlZih0ZXh0IHx8IFwiXCIpO1xuICBjb25zdCBsYW5nID0gdG9SZWYob3B0aW9ucy5sYW5nIHx8IFwiZW4tVVNcIik7XG4gIGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuICBjb25zdCB0b2dnbGUgPSAodmFsdWUgPSAhaXNQbGF5aW5nLnZhbHVlKSA9PiB7XG4gICAgaXNQbGF5aW5nLnZhbHVlID0gdmFsdWU7XG4gIH07XG4gIGNvbnN0IGJpbmRFdmVudHNGb3JVdHRlcmFuY2UgPSAodXR0ZXJhbmNlMikgPT4ge1xuICAgIHV0dGVyYW5jZTIubGFuZyA9IHRvVmFsdWUobGFuZyk7XG4gICAgdXR0ZXJhbmNlMi52b2ljZSA9IHRvVmFsdWUob3B0aW9ucy52b2ljZSkgfHwgbnVsbDtcbiAgICB1dHRlcmFuY2UyLnBpdGNoID0gdG9WYWx1ZShwaXRjaCk7XG4gICAgdXR0ZXJhbmNlMi5yYXRlID0gdG9WYWx1ZShyYXRlKTtcbiAgICB1dHRlcmFuY2UyLnZvbHVtZSA9IHZvbHVtZTtcbiAgICB1dHRlcmFuY2UyLm9uc3RhcnQgPSAoKSA9PiB7XG4gICAgICBpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgc3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG4gICAgfTtcbiAgICB1dHRlcmFuY2UyLm9ucGF1c2UgPSAoKSA9PiB7XG4gICAgICBpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgIHN0YXR1cy52YWx1ZSA9IFwicGF1c2VcIjtcbiAgICB9O1xuICAgIHV0dGVyYW5jZTIub25yZXN1bWUgPSAoKSA9PiB7XG4gICAgICBpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgc3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG4gICAgfTtcbiAgICB1dHRlcmFuY2UyLm9uZW5kID0gKCkgPT4ge1xuICAgICAgaXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICBzdGF0dXMudmFsdWUgPSBcImVuZFwiO1xuICAgIH07XG4gICAgdXR0ZXJhbmNlMi5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG4gICAgICBlcnJvci52YWx1ZSA9IGV2ZW50O1xuICAgIH07XG4gIH07XG4gIGNvbnN0IHV0dGVyYW5jZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcbiAgICBzdGF0dXMudmFsdWUgPSBcImluaXRcIjtcbiAgICBjb25zdCBuZXdVdHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHNwb2tlblRleHQudmFsdWUpO1xuICAgIGJpbmRFdmVudHNGb3JVdHRlcmFuY2UobmV3VXR0ZXJhbmNlKTtcbiAgICByZXR1cm4gbmV3VXR0ZXJhbmNlO1xuICB9KTtcbiAgY29uc3Qgc3BlYWsgPSAoKSA9PiB7XG4gICAgc3ludGguY2FuY2VsKCk7XG4gICAgdXR0ZXJhbmNlICYmIHN5bnRoLnNwZWFrKHV0dGVyYW5jZS52YWx1ZSk7XG4gIH07XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgc3ludGguY2FuY2VsKCk7XG4gICAgaXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG4gIH07XG4gIGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuICAgIGJpbmRFdmVudHNGb3JVdHRlcmFuY2UodXR0ZXJhbmNlLnZhbHVlKTtcbiAgICB3YXRjaChsYW5nLCAobGFuZzIpID0+IHtcbiAgICAgIGlmICh1dHRlcmFuY2UudmFsdWUgJiYgIWlzUGxheWluZy52YWx1ZSlcbiAgICAgICAgdXR0ZXJhbmNlLnZhbHVlLmxhbmcgPSBsYW5nMjtcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy52b2ljZSkge1xuICAgICAgd2F0Y2gob3B0aW9ucy52b2ljZSwgKCkgPT4ge1xuICAgICAgICBzeW50aC5jYW5jZWwoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3YXRjaChpc1BsYXlpbmcsICgpID0+IHtcbiAgICAgIGlmIChpc1BsYXlpbmcudmFsdWUpXG4gICAgICAgIHN5bnRoLnJlc3VtZSgpO1xuICAgICAgZWxzZVxuICAgICAgICBzeW50aC5wYXVzZSgpO1xuICAgIH0pO1xuICB9XG4gIHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICBpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgaXNQbGF5aW5nLFxuICAgIHN0YXR1cyxcbiAgICB1dHRlcmFuY2UsXG4gICAgZXJyb3IsXG4gICAgc3RvcCxcbiAgICB0b2dnbGUsXG4gICAgc3BlYWtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlU3RlcHBlcihzdGVwcywgaW5pdGlhbFN0ZXApIHtcbiAgY29uc3Qgc3RlcHNSZWYgPSByZWYoc3RlcHMpO1xuICBjb25zdCBzdGVwTmFtZXMgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSA/IHN0ZXBzUmVmLnZhbHVlIDogT2JqZWN0LmtleXMoc3RlcHNSZWYudmFsdWUpKTtcbiAgY29uc3QgaW5kZXggPSByZWYoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2YoaW5pdGlhbFN0ZXAgIT0gbnVsbCA/IGluaXRpYWxTdGVwIDogc3RlcE5hbWVzLnZhbHVlWzBdKSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBjb21wdXRlZCgoKSA9PiBhdChpbmRleC52YWx1ZSkpO1xuICBjb25zdCBpc0ZpcnN0ID0gY29tcHV0ZWQoKCkgPT4gaW5kZXgudmFsdWUgPT09IDApO1xuICBjb25zdCBpc0xhc3QgPSBjb21wdXRlZCgoKSA9PiBpbmRleC52YWx1ZSA9PT0gc3RlcE5hbWVzLnZhbHVlLmxlbmd0aCAtIDEpO1xuICBjb25zdCBuZXh0ID0gY29tcHV0ZWQoKCkgPT4gc3RlcE5hbWVzLnZhbHVlW2luZGV4LnZhbHVlICsgMV0pO1xuICBjb25zdCBwcmV2aW91cyA9IGNvbXB1dGVkKCgpID0+IHN0ZXBOYW1lcy52YWx1ZVtpbmRleC52YWx1ZSAtIDFdKTtcbiAgZnVuY3Rpb24gYXQoaW5kZXgyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RlcHNSZWYudmFsdWUpKVxuICAgICAgcmV0dXJuIHN0ZXBzUmVmLnZhbHVlW2luZGV4Ml07XG4gICAgcmV0dXJuIHN0ZXBzUmVmLnZhbHVlW3N0ZXBOYW1lcy52YWx1ZVtpbmRleDJdXTtcbiAgfVxuICBmdW5jdGlvbiBnZXQoc3RlcCkge1xuICAgIGlmICghc3RlcE5hbWVzLnZhbHVlLmluY2x1ZGVzKHN0ZXApKVxuICAgICAgcmV0dXJuO1xuICAgIHJldHVybiBhdChzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKSk7XG4gIH1cbiAgZnVuY3Rpb24gZ29UbyhzdGVwKSB7XG4gICAgaWYgKHN0ZXBOYW1lcy52YWx1ZS5pbmNsdWRlcyhzdGVwKSlcbiAgICAgIGluZGV4LnZhbHVlID0gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCk7XG4gIH1cbiAgZnVuY3Rpb24gZ29Ub05leHQoKSB7XG4gICAgaWYgKGlzTGFzdC52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBpbmRleC52YWx1ZSsrO1xuICB9XG4gIGZ1bmN0aW9uIGdvVG9QcmV2aW91cygpIHtcbiAgICBpZiAoaXNGaXJzdC52YWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBpbmRleC52YWx1ZS0tO1xuICB9XG4gIGZ1bmN0aW9uIGdvQmFja1RvKHN0ZXApIHtcbiAgICBpZiAoaXNBZnRlcihzdGVwKSlcbiAgICAgIGdvVG8oc3RlcCk7XG4gIH1cbiAgZnVuY3Rpb24gaXNOZXh0KHN0ZXApIHtcbiAgICByZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlICsgMTtcbiAgfVxuICBmdW5jdGlvbiBpc1ByZXZpb3VzKHN0ZXApIHtcbiAgICByZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlIC0gMTtcbiAgfVxuICBmdW5jdGlvbiBpc0N1cnJlbnQoc3RlcCkge1xuICAgIHJldHVybiBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKSA9PT0gaW5kZXgudmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gaXNCZWZvcmUoc3RlcCkge1xuICAgIHJldHVybiBpbmRleC52YWx1ZSA8IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuICB9XG4gIGZ1bmN0aW9uIGlzQWZ0ZXIoc3RlcCkge1xuICAgIHJldHVybiBpbmRleC52YWx1ZSA+IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RlcHM6IHN0ZXBzUmVmLFxuICAgIHN0ZXBOYW1lcyxcbiAgICBpbmRleCxcbiAgICBjdXJyZW50LFxuICAgIG5leHQsXG4gICAgcHJldmlvdXMsXG4gICAgaXNGaXJzdCxcbiAgICBpc0xhc3QsXG4gICAgYXQsXG4gICAgZ2V0LFxuICAgIGdvVG8sXG4gICAgZ29Ub05leHQsXG4gICAgZ29Ub1ByZXZpb3VzLFxuICAgIGdvQmFja1RvLFxuICAgIGlzTmV4dCxcbiAgICBpc1ByZXZpb3VzLFxuICAgIGlzQ3VycmVudCxcbiAgICBpc0JlZm9yZSxcbiAgICBpc0FmdGVyXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVN0b3JhZ2VBc3luYyhrZXksIGluaXRpYWxWYWx1ZSwgc3RvcmFnZSwgb3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgIGZsdXNoID0gXCJwcmVcIixcbiAgICBkZWVwID0gdHJ1ZSxcbiAgICBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzID0gdHJ1ZSxcbiAgICB3cml0ZURlZmF1bHRzID0gdHJ1ZSxcbiAgICBtZXJnZURlZmF1bHRzID0gZmFsc2UsXG4gICAgc2hhbGxvdyxcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93LFxuICAgIGV2ZW50RmlsdGVyLFxuICAgIG9uRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCByYXdJbml0ID0gdG9WYWx1ZShpbml0aWFsVmFsdWUpO1xuICBjb25zdCB0eXBlID0gZ3Vlc3NTZXJpYWxpemVyVHlwZShyYXdJbml0KTtcbiAgY29uc3QgZGF0YSA9IChzaGFsbG93ID8gc2hhbGxvd1JlZiA6IHJlZikoaW5pdGlhbFZhbHVlKTtcbiAgY29uc3Qgc2VyaWFsaXplciA9IChfYSA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT0gbnVsbCA/IF9hIDogU3RvcmFnZVNlcmlhbGl6ZXJzW3R5cGVdO1xuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgc3RvcmFnZSA9IGdldFNTUkhhbmRsZXIoXCJnZXREZWZhdWx0U3RvcmFnZUFzeW5jXCIsICgpID0+IHtcbiAgICAgICAgdmFyIF9hMjtcbiAgICAgICAgcmV0dXJuIChfYTIgPSBkZWZhdWx0V2luZG93KSA9PSBudWxsID8gdm9pZCAwIDogX2EyLmxvY2FsU3RvcmFnZTtcbiAgICAgIH0pKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25FcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZChldmVudCkge1xuICAgIGlmICghc3RvcmFnZSB8fCBldmVudCAmJiBldmVudC5rZXkgIT09IGtleSlcbiAgICAgIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3VmFsdWUgPSBldmVudCA/IGV2ZW50Lm5ld1ZhbHVlIDogYXdhaXQgc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBpZiAocmF3VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBkYXRhLnZhbHVlID0gcmF3SW5pdDtcbiAgICAgICAgaWYgKHdyaXRlRGVmYXVsdHMgJiYgcmF3SW5pdCAhPT0gbnVsbClcbiAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhd2FpdCBzZXJpYWxpemVyLndyaXRlKHJhd0luaXQpKTtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VEZWZhdWx0cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgbWVyZ2VEZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIGRhdGEudmFsdWUgPSBtZXJnZURlZmF1bHRzKHZhbHVlLCByYXdJbml0KTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgZGF0YS52YWx1ZSA9IHsgLi4ucmF3SW5pdCwgLi4udmFsdWUgfTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGRhdGEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEudmFsdWUgPSBhd2FpdCBzZXJpYWxpemVyLnJlYWQocmF3VmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9uRXJyb3IoZSk7XG4gICAgfVxuICB9XG4gIHJlYWQoKTtcbiAgaWYgKHdpbmRvdyAmJiBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzKVxuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcInN0b3JhZ2VcIiwgKGUpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcmVhZChlKSkpO1xuICBpZiAoc3RvcmFnZSkge1xuICAgIHdhdGNoV2l0aEZpbHRlcihcbiAgICAgIGRhdGEsXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGRhdGEudmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0SXRlbShrZXksIGF3YWl0IHNlcmlhbGl6ZXIud3JpdGUoZGF0YS52YWx1ZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgb25FcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmx1c2gsXG4gICAgICAgIGRlZXAsXG4gICAgICAgIGV2ZW50RmlsdGVyXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxubGV0IF9pZCA9IDA7XG5mdW5jdGlvbiB1c2VTdHlsZVRhZyhjc3MsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBpc0xvYWRlZCA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IHtcbiAgICBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudCxcbiAgICBpbW1lZGlhdGUgPSB0cnVlLFxuICAgIG1hbnVhbCA9IGZhbHNlLFxuICAgIGlkID0gYHZ1ZXVzZV9zdHlsZXRhZ18keysrX2lkfWBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNzc1JlZiA9IHJlZihjc3MpO1xuICBsZXQgc3RvcCA9ICgpID0+IHtcbiAgfTtcbiAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICBpZiAoIWRvY3VtZW50KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICBpZiAoIWVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICBlbC5pZCA9IGlkO1xuICAgICAgaWYgKG9wdGlvbnMubWVkaWEpXG4gICAgICAgIGVsLm1lZGlhID0gb3B0aW9ucy5tZWRpYTtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIH1cbiAgICBpZiAoaXNMb2FkZWQudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgc3RvcCA9IHdhdGNoKFxuICAgICAgY3NzUmVmLFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIGVsLnRleHRDb250ZW50ID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgeyBpbW1lZGlhdGU6IHRydWUgfVxuICAgICk7XG4gICAgaXNMb2FkZWQudmFsdWUgPSB0cnVlO1xuICB9O1xuICBjb25zdCB1bmxvYWQgPSAoKSA9PiB7XG4gICAgaWYgKCFkb2N1bWVudCB8fCAhaXNMb2FkZWQudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgc3RvcCgpO1xuICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKTtcbiAgICBpc0xvYWRlZC52YWx1ZSA9IGZhbHNlO1xuICB9O1xuICBpZiAoaW1tZWRpYXRlICYmICFtYW51YWwpXG4gICAgdHJ5T25Nb3VudGVkKGxvYWQpO1xuICBpZiAoIW1hbnVhbClcbiAgICB0cnlPblNjb3BlRGlzcG9zZSh1bmxvYWQpO1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIGNzczogY3NzUmVmLFxuICAgIHVubG9hZCxcbiAgICBsb2FkLFxuICAgIGlzTG9hZGVkOiByZWFkb25seShpc0xvYWRlZClcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlU3dpcGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRocmVzaG9sZCA9IDUwLFxuICAgIG9uU3dpcGUsXG4gICAgb25Td2lwZUVuZCxcbiAgICBvblN3aXBlU3RhcnQsXG4gICAgcGFzc2l2ZSA9IHRydWUsXG4gICAgd2luZG93ID0gZGVmYXVsdFdpbmRvd1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29vcmRzU3RhcnQgPSByZWFjdGl2ZSh7IHg6IDAsIHk6IDAgfSk7XG4gIGNvbnN0IGNvb3Jkc0VuZCA9IHJlYWN0aXZlKHsgeDogMCwgeTogMCB9KTtcbiAgY29uc3QgZGlmZlggPSBjb21wdXRlZCgoKSA9PiBjb29yZHNTdGFydC54IC0gY29vcmRzRW5kLngpO1xuICBjb25zdCBkaWZmWSA9IGNvbXB1dGVkKCgpID0+IGNvb3Jkc1N0YXJ0LnkgLSBjb29yZHNFbmQueSk7XG4gIGNvbnN0IHsgbWF4LCBhYnMgfSA9IE1hdGg7XG4gIGNvbnN0IGlzVGhyZXNob2xkRXhjZWVkZWQgPSBjb21wdXRlZCgoKSA9PiBtYXgoYWJzKGRpZmZYLnZhbHVlKSwgYWJzKGRpZmZZLnZhbHVlKSkgPj0gdGhyZXNob2xkKTtcbiAgY29uc3QgaXNTd2lwaW5nID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSlcbiAgICAgIHJldHVybiBcIm5vbmVcIjtcbiAgICBpZiAoYWJzKGRpZmZYLnZhbHVlKSA+IGFicyhkaWZmWS52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBkaWZmWC52YWx1ZSA+IDAgPyBcImxlZnRcIiA6IFwicmlnaHRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpZmZZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGdldFRvdWNoRXZlbnRDb29yZHMgPSAoZSkgPT4gW2UudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WV07XG4gIGNvbnN0IHVwZGF0ZUNvb3Jkc1N0YXJ0ID0gKHgsIHkpID0+IHtcbiAgICBjb29yZHNTdGFydC54ID0geDtcbiAgICBjb29yZHNTdGFydC55ID0geTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29vcmRzRW5kID0gKHgsIHkpID0+IHtcbiAgICBjb29yZHNFbmQueCA9IHg7XG4gICAgY29vcmRzRW5kLnkgPSB5O1xuICB9O1xuICBsZXQgbGlzdGVuZXJPcHRpb25zO1xuICBjb25zdCBpc1Bhc3NpdmVFdmVudFN1cHBvcnRlZCA9IGNoZWNrUGFzc2l2ZUV2ZW50U3VwcG9ydCh3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5kb2N1bWVudCk7XG4gIGlmICghcGFzc2l2ZSlcbiAgICBsaXN0ZW5lck9wdGlvbnMgPSBpc1Bhc3NpdmVFdmVudFN1cHBvcnRlZCA/IHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IHRydWUgfSA6IHsgY2FwdHVyZTogdHJ1ZSB9O1xuICBlbHNlXG4gICAgbGlzdGVuZXJPcHRpb25zID0gaXNQYXNzaXZlRXZlbnRTdXBwb3J0ZWQgPyB7IHBhc3NpdmU6IHRydWUgfSA6IHsgY2FwdHVyZTogZmFsc2UgfTtcbiAgY29uc3Qgb25Ub3VjaEVuZCA9IChlKSA9PiB7XG4gICAgaWYgKGlzU3dpcGluZy52YWx1ZSlcbiAgICAgIG9uU3dpcGVFbmQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uU3dpcGVFbmQoZSwgZGlyZWN0aW9uLnZhbHVlKTtcbiAgICBpc1N3aXBpbmcudmFsdWUgPSBmYWxzZTtcbiAgfTtcbiAgY29uc3Qgc3RvcHMgPSBbXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmIChsaXN0ZW5lck9wdGlvbnMuY2FwdHVyZSAmJiAhbGlzdGVuZXJPcHRpb25zLnBhc3NpdmUpXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IFt4LCB5XSA9IGdldFRvdWNoRXZlbnRDb29yZHMoZSk7XG4gICAgICB1cGRhdGVDb29yZHNTdGFydCh4LCB5KTtcbiAgICAgIHVwZGF0ZUNvb3Jkc0VuZCh4LCB5KTtcbiAgICAgIG9uU3dpcGVTdGFydCA9PSBudWxsID8gdm9pZCAwIDogb25Td2lwZVN0YXJ0KGUpO1xuICAgIH0sIGxpc3RlbmVyT3B0aW9ucyksXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2htb3ZlXCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgW3gsIHldID0gZ2V0VG91Y2hFdmVudENvb3JkcyhlKTtcbiAgICAgIHVwZGF0ZUNvb3Jkc0VuZCh4LCB5KTtcbiAgICAgIGlmICghaXNTd2lwaW5nLnZhbHVlICYmIGlzVGhyZXNob2xkRXhjZWVkZWQudmFsdWUpXG4gICAgICAgIGlzU3dpcGluZy52YWx1ZSA9IHRydWU7XG4gICAgICBpZiAoaXNTd2lwaW5nLnZhbHVlKVxuICAgICAgICBvblN3aXBlID09IG51bGwgPyB2b2lkIDAgOiBvblN3aXBlKGUpO1xuICAgIH0sIGxpc3RlbmVyT3B0aW9ucyksXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcInRvdWNoZW5kXCIsIFwidG91Y2hjYW5jZWxcIl0sIG9uVG91Y2hFbmQsIGxpc3RlbmVyT3B0aW9ucylcbiAgXTtcbiAgY29uc3Qgc3RvcCA9ICgpID0+IHN0b3BzLmZvckVhY2goKHMpID0+IHMoKSk7XG4gIHJldHVybiB7XG4gICAgaXNQYXNzaXZlRXZlbnRTdXBwb3J0ZWQsXG4gICAgaXNTd2lwaW5nLFxuICAgIGRpcmVjdGlvbixcbiAgICBjb29yZHNTdGFydCxcbiAgICBjb29yZHNFbmQsXG4gICAgbGVuZ3RoWDogZGlmZlgsXG4gICAgbGVuZ3RoWTogZGlmZlksXG4gICAgc3RvcFxuICB9O1xufVxuZnVuY3Rpb24gY2hlY2tQYXNzaXZlRXZlbnRTdXBwb3J0KGRvY3VtZW50KSB7XG4gIGlmICghZG9jdW1lbnQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG4gIGNvbnN0IG9wdGlvbnNCbG9jayA9IHtcbiAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwieFwiLCBub29wLCBvcHRpb25zQmxvY2spO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwieFwiLCBub29wKTtcbiAgcmV0dXJuIHN1cHBvcnRzUGFzc2l2ZTtcbn1cblxuZnVuY3Rpb24gdXNlVGVtcGxhdGVSZWZzTGlzdCgpIHtcbiAgY29uc3QgcmVmcyA9IHJlZihbXSk7XG4gIHJlZnMudmFsdWUuc2V0ID0gKGVsKSA9PiB7XG4gICAgaWYgKGVsKVxuICAgICAgcmVmcy52YWx1ZS5wdXNoKGVsKTtcbiAgfTtcbiAgb25CZWZvcmVVcGRhdGUoKCkgPT4ge1xuICAgIHJlZnMudmFsdWUubGVuZ3RoID0gMDtcbiAgfSk7XG4gIHJldHVybiByZWZzO1xufVxuXG5mdW5jdGlvbiB1c2VUZXh0RGlyZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZG9jdW1lbnQgPSBkZWZhdWx0RG9jdW1lbnQsXG4gICAgc2VsZWN0b3IgPSBcImh0bWxcIixcbiAgICBvYnNlcnZlID0gZmFsc2UsXG4gICAgaW5pdGlhbFZhbHVlID0gXCJsdHJcIlxuICB9ID0gb3B0aW9ucztcbiAgZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiZGlyXCIpKSAhPSBudWxsID8gX2IgOiBpbml0aWFsVmFsdWU7XG4gIH1cbiAgY29uc3QgZGlyID0gcmVmKGdldFZhbHVlKCkpO1xuICB0cnlPbk1vdW50ZWQoKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUoKSk7XG4gIGlmIChvYnNlcnZlICYmIGRvY3VtZW50KSB7XG4gICAgdXNlTXV0YXRpb25PYnNlcnZlcihcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICAgICAgKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUoKSxcbiAgICAgIHsgYXR0cmlidXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuICByZXR1cm4gY29tcHV0ZWQoe1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBkaXIudmFsdWU7XG4gICAgfSxcbiAgICBzZXQodikge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIGRpci52YWx1ZSA9IHY7XG4gICAgICBpZiAoIWRvY3VtZW50KVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoZGlyLnZhbHVlKVxuICAgICAgICAoX2EgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnNldEF0dHJpYnV0ZShcImRpclwiLCBkaXIudmFsdWUpO1xuICAgICAgZWxzZVxuICAgICAgICAoX2IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLnJlbW92ZUF0dHJpYnV0ZShcImRpclwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSYW5nZXNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICB2YXIgX2E7XG4gIGNvbnN0IHJhbmdlQ291bnQgPSAoX2EgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudCkgIT0gbnVsbCA/IF9hIDogMDtcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHJhbmdlQ291bnQgfSwgKF8sIGkpID0+IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpKTtcbn1cbmZ1bmN0aW9uIHVzZVRleHRTZWxlY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzZWxlY3Rpb24gPSByZWYobnVsbCk7XG4gIGNvbnN0IHRleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gc2VsZWN0aW9uLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgIT0gbnVsbCA/IF9iIDogXCJcIjtcbiAgfSk7XG4gIGNvbnN0IHJhbmdlcyA9IGNvbXB1dGVkKCgpID0+IHNlbGVjdGlvbi52YWx1ZSA/IGdldFJhbmdlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uLnZhbHVlKSA6IFtdKTtcbiAgY29uc3QgcmVjdHMgPSBjb21wdXRlZCgoKSA9PiByYW5nZXMudmFsdWUubWFwKChyYW5nZSkgPT4gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKTtcbiAgZnVuY3Rpb24gb25TZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgc2VsZWN0aW9uLnZhbHVlID0gbnVsbDtcbiAgICBpZiAod2luZG93KVxuICAgICAgc2VsZWN0aW9uLnZhbHVlID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICB9XG4gIGlmICh3aW5kb3cpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3cuZG9jdW1lbnQsIFwic2VsZWN0aW9uY2hhbmdlXCIsIG9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0LFxuICAgIHJlY3RzLFxuICAgIHJhbmdlcyxcbiAgICBzZWxlY3Rpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGV4dGFyZWFBdXRvc2l6ZShvcHRpb25zKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgdGV4dGFyZWEgPSByZWYob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5lbGVtZW50KTtcbiAgY29uc3QgaW5wdXQgPSByZWYob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5pbnB1dCk7XG4gIGNvbnN0IHN0eWxlUHJvcCA9IChfYSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuc3R5bGVQcm9wKSAhPSBudWxsID8gX2EgOiBcImhlaWdodFwiO1xuICBjb25zdCB0ZXh0YXJlYVNjcm9sbEhlaWdodCA9IHJlZigxKTtcbiAgZnVuY3Rpb24gdHJpZ2dlclJlc2l6ZSgpIHtcbiAgICB2YXIgX2EyLCBfYjtcbiAgICBpZiAoIXRleHRhcmVhLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBoZWlnaHQgPSBcIlwiO1xuICAgIHRleHRhcmVhLnZhbHVlLnN0eWxlW3N0eWxlUHJvcF0gPSBcIjFweFwiO1xuICAgIHRleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlID0gKF9hMiA9IHRleHRhcmVhLnZhbHVlKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLnNjcm9sbEhlaWdodDtcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5zdHlsZVRhcmdldClcbiAgICAgIHRvVmFsdWUob3B0aW9ucy5zdHlsZVRhcmdldCkuc3R5bGVbc3R5bGVQcm9wXSA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcbiAgICBlbHNlXG4gICAgICBoZWlnaHQgPSBgJHt0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZX1weGA7XG4gICAgdGV4dGFyZWEudmFsdWUuc3R5bGVbc3R5bGVQcm9wXSA9IGhlaWdodDtcbiAgICAoX2IgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm9uUmVzaXplKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zKTtcbiAgfVxuICB3YXRjaChbaW5wdXQsIHRleHRhcmVhXSwgKCkgPT4gbmV4dFRpY2sodHJpZ2dlclJlc2l6ZSksIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuICB1c2VSZXNpemVPYnNlcnZlcih0ZXh0YXJlYSwgKCkgPT4gdHJpZ2dlclJlc2l6ZSgpKTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMud2F0Y2gpXG4gICAgd2F0Y2gob3B0aW9ucy53YXRjaCwgdHJpZ2dlclJlc2l6ZSwgeyBpbW1lZGlhdGU6IHRydWUsIGRlZXA6IHRydWUgfSk7XG4gIHJldHVybiB7XG4gICAgdGV4dGFyZWEsXG4gICAgaW5wdXQsXG4gICAgdHJpZ2dlclJlc2l6ZVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgdGhyb3R0bGUgPSAyMDAsIHRyYWlsaW5nID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmlsdGVyID0gdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nKTtcbiAgY29uc3QgaGlzdG9yeSA9IHVzZVJlZkhpc3Rvcnkoc291cmNlLCB7IC4uLm9wdGlvbnMsIGV2ZW50RmlsdGVyOiBmaWx0ZXIgfSk7XG4gIHJldHVybiB7XG4gICAgLi4uaGlzdG9yeVxuICB9O1xufVxuXG5jb25zdCBERUZBVUxUX1VOSVRTID0gW1xuICB7IG1heDogNmU0LCB2YWx1ZTogMWUzLCBuYW1lOiBcInNlY29uZFwiIH0sXG4gIHsgbWF4OiAyNzZlNCwgdmFsdWU6IDZlNCwgbmFtZTogXCJtaW51dGVcIiB9LFxuICB7IG1heDogNzJlNiwgdmFsdWU6IDM2ZTUsIG5hbWU6IFwiaG91clwiIH0sXG4gIHsgbWF4OiA1MTg0ZTUsIHZhbHVlOiA4NjRlNSwgbmFtZTogXCJkYXlcIiB9LFxuICB7IG1heDogMjQxOTJlNSwgdmFsdWU6IDYwNDhlNSwgbmFtZTogXCJ3ZWVrXCIgfSxcbiAgeyBtYXg6IDI4NTEyZTYsIHZhbHVlOiAyNTkyZTYsIG5hbWU6IFwibW9udGhcIiB9LFxuICB7IG1heDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCB2YWx1ZTogMzE1MzZlNiwgbmFtZTogXCJ5ZWFyXCIgfVxuXTtcbmNvbnN0IERFRkFVTFRfTUVTU0FHRVMgPSB7XG4gIGp1c3ROb3c6IFwianVzdCBub3dcIixcbiAgcGFzdDogKG4pID0+IG4ubWF0Y2goL1xcZC8pID8gYCR7bn0gYWdvYCA6IG4sXG4gIGZ1dHVyZTogKG4pID0+IG4ubWF0Y2goL1xcZC8pID8gYGluICR7bn1gIDogbixcbiAgbW9udGg6IChuLCBwYXN0KSA9PiBuID09PSAxID8gcGFzdCA/IFwibGFzdCBtb250aFwiIDogXCJuZXh0IG1vbnRoXCIgOiBgJHtufSBtb250aCR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcbiAgeWVhcjogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJsYXN0IHllYXJcIiA6IFwibmV4dCB5ZWFyXCIgOiBgJHtufSB5ZWFyJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuICBkYXk6IChuLCBwYXN0KSA9PiBuID09PSAxID8gcGFzdCA/IFwieWVzdGVyZGF5XCIgOiBcInRvbW9ycm93XCIgOiBgJHtufSBkYXkke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG4gIHdlZWs6IChuLCBwYXN0KSA9PiBuID09PSAxID8gcGFzdCA/IFwibGFzdCB3ZWVrXCIgOiBcIm5leHQgd2Vla1wiIDogYCR7bn0gd2VlayR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcbiAgaG91cjogKG4pID0+IGAke259IGhvdXIke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG4gIG1pbnV0ZTogKG4pID0+IGAke259IG1pbnV0ZSR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcbiAgc2Vjb25kOiAobikgPT4gYCR7bn0gc2Vjb25kJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuICBpbnZhbGlkOiBcIlwiXG59O1xuZnVuY3Rpb24gREVGQVVMVF9GT1JNQVRURVIoZGF0ZSkge1xuICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbn1cbmZ1bmN0aW9uIHVzZVRpbWVBZ28odGltZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sczogZXhwb3NlQ29udHJvbHMgPSBmYWxzZSxcbiAgICB1cGRhdGVJbnRlcnZhbCA9IDNlNFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyBub3csIC4uLmNvbnRyb2xzIH0gPSB1c2VOb3coeyBpbnRlcnZhbDogdXBkYXRlSW50ZXJ2YWwsIGNvbnRyb2xzOiB0cnVlIH0pO1xuICBjb25zdCB0aW1lQWdvID0gY29tcHV0ZWQoKCkgPT4gZm9ybWF0VGltZUFnbyhuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG4gIGlmIChleHBvc2VDb250cm9scykge1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lQWdvLFxuICAgICAgLi4uY29udHJvbHNcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aW1lQWdvO1xuICB9XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvKGZyb20sIG9wdGlvbnMgPSB7fSwgbm93ID0gRGF0ZS5ub3coKSkge1xuICB2YXIgX2E7XG4gIGNvbnN0IHtcbiAgICBtYXgsXG4gICAgbWVzc2FnZXMgPSBERUZBVUxUX01FU1NBR0VTLFxuICAgIGZ1bGxEYXRlRm9ybWF0dGVyID0gREVGQVVMVF9GT1JNQVRURVIsXG4gICAgdW5pdHMgPSBERUZBVUxUX1VOSVRTLFxuICAgIHNob3dTZWNvbmQgPSBmYWxzZSxcbiAgICByb3VuZGluZyA9IFwicm91bmRcIlxuICB9ID0gb3B0aW9ucztcbiAgY29uc3Qgcm91bmRGbiA9IHR5cGVvZiByb3VuZGluZyA9PT0gXCJudW1iZXJcIiA/IChuKSA9PiArbi50b0ZpeGVkKHJvdW5kaW5nKSA6IE1hdGhbcm91bmRpbmddO1xuICBjb25zdCBkaWZmID0gK25vdyAtICtmcm9tO1xuICBjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMoZGlmZik7XG4gIGZ1bmN0aW9uIGdldFZhbHVlKGRpZmYyLCB1bml0KSB7XG4gICAgcmV0dXJuIHJvdW5kRm4oTWF0aC5hYnMoZGlmZjIpIC8gdW5pdC52YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gZm9ybWF0KGRpZmYyLCB1bml0KSB7XG4gICAgY29uc3QgdmFsID0gZ2V0VmFsdWUoZGlmZjIsIHVuaXQpO1xuICAgIGNvbnN0IHBhc3QgPSBkaWZmMiA+IDA7XG4gICAgY29uc3Qgc3RyID0gYXBwbHlGb3JtYXQodW5pdC5uYW1lLCB2YWwsIHBhc3QpO1xuICAgIHJldHVybiBhcHBseUZvcm1hdChwYXN0ID8gXCJwYXN0XCIgOiBcImZ1dHVyZVwiLCBzdHIsIHBhc3QpO1xuICB9XG4gIGZ1bmN0aW9uIGFwcGx5Rm9ybWF0KG5hbWUsIHZhbCwgaXNQYXN0KSB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbWVzc2FnZXNbbmFtZV07XG4gICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIodmFsLCBpc1Bhc3QpO1xuICAgIHJldHVybiBmb3JtYXR0ZXIucmVwbGFjZShcInswfVwiLCB2YWwudG9TdHJpbmcoKSk7XG4gIH1cbiAgaWYgKGFic0RpZmYgPCA2ZTQgJiYgIXNob3dTZWNvbmQpXG4gICAgcmV0dXJuIG1lc3NhZ2VzLmp1c3ROb3c7XG4gIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiICYmIGFic0RpZmYgPiBtYXgpXG4gICAgcmV0dXJuIGZ1bGxEYXRlRm9ybWF0dGVyKG5ldyBEYXRlKGZyb20pKTtcbiAgaWYgKHR5cGVvZiBtYXggPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB1bml0TWF4ID0gKF9hID0gdW5pdHMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBtYXgpKSA9PSBudWxsID8gdm9pZCAwIDogX2EubWF4O1xuICAgIGlmICh1bml0TWF4ICYmIGFic0RpZmYgPiB1bml0TWF4KVxuICAgICAgcmV0dXJuIGZ1bGxEYXRlRm9ybWF0dGVyKG5ldyBEYXRlKGZyb20pKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtpZHgsIHVuaXRdIG9mIHVuaXRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHZhbCA9IGdldFZhbHVlKGRpZmYsIHVuaXQpO1xuICAgIGlmICh2YWwgPD0gMCAmJiB1bml0c1tpZHggLSAxXSlcbiAgICAgIHJldHVybiBmb3JtYXQoZGlmZiwgdW5pdHNbaWR4IC0gMV0pO1xuICAgIGlmIChhYnNEaWZmIDwgdW5pdC5tYXgpXG4gICAgICByZXR1cm4gZm9ybWF0KGRpZmYsIHVuaXQpO1xuICB9XG4gIHJldHVybiBtZXNzYWdlcy5pbnZhbGlkO1xufVxuXG5mdW5jdGlvbiB1c2VUaW1lb3V0UG9sbChmbiwgaW50ZXJ2YWwsIHRpbWVvdXRQb2xsT3B0aW9ucykge1xuICBjb25zdCB7IHN0YXJ0IH0gPSB1c2VUaW1lb3V0Rm4obG9vcCwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcbiAgY29uc3QgaXNBY3RpdmUgPSByZWYoZmFsc2UpO1xuICBhc3luYyBmdW5jdGlvbiBsb29wKCkge1xuICAgIGlmICghaXNBY3RpdmUudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgYXdhaXQgZm4oKTtcbiAgICBzdGFydCgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlc3VtZSgpIHtcbiAgICBpZiAoIWlzQWN0aXZlLnZhbHVlKSB7XG4gICAgICBpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG4gICAgICBsb29wKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG4gIH1cbiAgaWYgKHRpbWVvdXRQb2xsT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdGltZW91dFBvbGxPcHRpb25zLmltbWVkaWF0ZSlcbiAgICByZXN1bWUoKTtcbiAgdHJ5T25TY29wZURpc3Bvc2UocGF1c2UpO1xuICByZXR1cm4ge1xuICAgIGlzQWN0aXZlLFxuICAgIHBhdXNlLFxuICAgIHJlc3VtZVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VUaW1lc3RhbXAob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sczogZXhwb3NlQ29udHJvbHMgPSBmYWxzZSxcbiAgICBvZmZzZXQgPSAwLFxuICAgIGltbWVkaWF0ZSA9IHRydWUsXG4gICAgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLFxuICAgIGNhbGxiYWNrXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB0cyA9IHJlZih0aW1lc3RhbXAoKSArIG9mZnNldCk7XG4gIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHRzLnZhbHVlID0gdGltZXN0YW1wKCkgKyBvZmZzZXQ7XG4gIGNvbnN0IGNiID0gY2FsbGJhY2sgPyAoKSA9PiB7XG4gICAgdXBkYXRlKCk7XG4gICAgY2FsbGJhY2sodHMudmFsdWUpO1xuICB9IDogdXBkYXRlO1xuICBjb25zdCBjb250cm9scyA9IGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuICBpZiAoZXhwb3NlQ29udHJvbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZXN0YW1wOiB0cyxcbiAgICAgIC4uLmNvbnRyb2xzXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlVGl0bGUobmV3VGl0bGUgPSBudWxsLCBvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hLCBfYiwgX2M7XG4gIGNvbnN0IHtcbiAgICBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudCxcbiAgICByZXN0b3JlT25Vbm1vdW50ID0gKHQpID0+IHRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IG9yaWdpbmFsVGl0bGUgPSAoX2EgPSBkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnQudGl0bGUpICE9IG51bGwgPyBfYSA6IFwiXCI7XG4gIGNvbnN0IHRpdGxlID0gdG9SZWYoKF9iID0gbmV3VGl0bGUgIT0gbnVsbCA/IG5ld1RpdGxlIDogZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LnRpdGxlKSAhPSBudWxsID8gX2IgOiBudWxsKTtcbiAgY29uc3QgaXNSZWFkb25seSA9IG5ld1RpdGxlICYmIHR5cGVvZiBuZXdUaXRsZSA9PT0gXCJmdW5jdGlvblwiO1xuICBmdW5jdGlvbiBmb3JtYXQodCkge1xuICAgIGlmICghKFwidGl0bGVUZW1wbGF0ZVwiIGluIG9wdGlvbnMpKVxuICAgICAgcmV0dXJuIHQ7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBvcHRpb25zLnRpdGxlVGVtcGxhdGUgfHwgXCIlc1wiO1xuICAgIHJldHVybiB0eXBlb2YgdGVtcGxhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHRlbXBsYXRlKHQpIDogdG9WYWx1ZSh0ZW1wbGF0ZSkucmVwbGFjZSgvJXMvZywgdCk7XG4gIH1cbiAgd2F0Y2goXG4gICAgdGl0bGUsXG4gICAgKHQsIG8pID0+IHtcbiAgICAgIGlmICh0ICE9PSBvICYmIGRvY3VtZW50KVxuICAgICAgICBkb2N1bWVudC50aXRsZSA9IGZvcm1hdCh0eXBlb2YgdCA9PT0gXCJzdHJpbmdcIiA/IHQgOiBcIlwiKTtcbiAgICB9LFxuICAgIHsgaW1tZWRpYXRlOiB0cnVlIH1cbiAgKTtcbiAgaWYgKG9wdGlvbnMub2JzZXJ2ZSAmJiAhb3B0aW9ucy50aXRsZVRlbXBsYXRlICYmIGRvY3VtZW50ICYmICFpc1JlYWRvbmx5KSB7XG4gICAgdXNlTXV0YXRpb25PYnNlcnZlcihcbiAgICAgIChfYyA9IGRvY3VtZW50LmhlYWQpID09IG51bGwgPyB2b2lkIDAgOiBfYy5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIiksXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC50aXRsZSAhPT0gdGl0bGUudmFsdWUpXG4gICAgICAgICAgdGl0bGUudmFsdWUgPSBmb3JtYXQoZG9jdW1lbnQudGl0bGUpO1xuICAgICAgfSxcbiAgICAgIHsgY2hpbGRMaXN0OiB0cnVlIH1cbiAgICApO1xuICB9XG4gIHRyeU9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgaWYgKHJlc3RvcmVPblVubW91bnQpIHtcbiAgICAgIGNvbnN0IHJlc3RvcmVkVGl0bGUgPSByZXN0b3JlT25Vbm1vdW50KG9yaWdpbmFsVGl0bGUsIHRpdGxlLnZhbHVlIHx8IFwiXCIpO1xuICAgICAgaWYgKHJlc3RvcmVkVGl0bGUgIT0gbnVsbCAmJiBkb2N1bWVudClcbiAgICAgICAgZG9jdW1lbnQudGl0bGUgPSByZXN0b3JlZFRpdGxlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aXRsZTtcbn1cblxuY29uc3QgX1RyYW5zaXRpb25QcmVzZXRzID0ge1xuICBlYXNlSW5TaW5lOiBbMC4xMiwgMCwgMC4zOSwgMF0sXG4gIGVhc2VPdXRTaW5lOiBbMC42MSwgMSwgMC44OCwgMV0sXG4gIGVhc2VJbk91dFNpbmU6IFswLjM3LCAwLCAwLjYzLCAxXSxcbiAgZWFzZUluUXVhZDogWzAuMTEsIDAsIDAuNSwgMF0sXG4gIGVhc2VPdXRRdWFkOiBbMC41LCAxLCAwLjg5LCAxXSxcbiAgZWFzZUluT3V0UXVhZDogWzAuNDUsIDAsIDAuNTUsIDFdLFxuICBlYXNlSW5DdWJpYzogWzAuMzIsIDAsIDAuNjcsIDBdLFxuICBlYXNlT3V0Q3ViaWM6IFswLjMzLCAxLCAwLjY4LCAxXSxcbiAgZWFzZUluT3V0Q3ViaWM6IFswLjY1LCAwLCAwLjM1LCAxXSxcbiAgZWFzZUluUXVhcnQ6IFswLjUsIDAsIDAuNzUsIDBdLFxuICBlYXNlT3V0UXVhcnQ6IFswLjI1LCAxLCAwLjUsIDFdLFxuICBlYXNlSW5PdXRRdWFydDogWzAuNzYsIDAsIDAuMjQsIDFdLFxuICBlYXNlSW5RdWludDogWzAuNjQsIDAsIDAuNzgsIDBdLFxuICBlYXNlT3V0UXVpbnQ6IFswLjIyLCAxLCAwLjM2LCAxXSxcbiAgZWFzZUluT3V0UXVpbnQ6IFswLjgzLCAwLCAwLjE3LCAxXSxcbiAgZWFzZUluRXhwbzogWzAuNywgMCwgMC44NCwgMF0sXG4gIGVhc2VPdXRFeHBvOiBbMC4xNiwgMSwgMC4zLCAxXSxcbiAgZWFzZUluT3V0RXhwbzogWzAuODcsIDAsIDAuMTMsIDFdLFxuICBlYXNlSW5DaXJjOiBbMC41NSwgMCwgMSwgMC40NV0sXG4gIGVhc2VPdXRDaXJjOiBbMCwgMC41NSwgMC40NSwgMV0sXG4gIGVhc2VJbk91dENpcmM6IFswLjg1LCAwLCAwLjE1LCAxXSxcbiAgZWFzZUluQmFjazogWzAuMzYsIDAsIDAuNjYsIC0wLjU2XSxcbiAgZWFzZU91dEJhY2s6IFswLjM0LCAxLjU2LCAwLjY0LCAxXSxcbiAgZWFzZUluT3V0QmFjazogWzAuNjgsIC0wLjYsIDAuMzIsIDEuNl1cbn07XG5jb25zdCBUcmFuc2l0aW9uUHJlc2V0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuYXNzaWduKHt9LCB7IGxpbmVhcjogaWRlbnRpdHkgfSwgX1RyYW5zaXRpb25QcmVzZXRzKTtcbmZ1bmN0aW9uIGNyZWF0ZUVhc2luZ0Z1bmN0aW9uKFtwMCwgcDEsIHAyLCBwM10pIHtcbiAgY29uc3QgYSA9IChhMSwgYTIpID0+IDEgLSAzICogYTIgKyAzICogYTE7XG4gIGNvbnN0IGIgPSAoYTEsIGEyKSA9PiAzICogYTIgLSA2ICogYTE7XG4gIGNvbnN0IGMgPSAoYTEpID0+IDMgKiBhMTtcbiAgY29uc3QgY2FsY0JlemllciA9ICh0LCBhMSwgYTIpID0+ICgoYShhMSwgYTIpICogdCArIGIoYTEsIGEyKSkgKiB0ICsgYyhhMSkpICogdDtcbiAgY29uc3QgZ2V0U2xvcGUgPSAodCwgYTEsIGEyKSA9PiAzICogYShhMSwgYTIpICogdCAqIHQgKyAyICogYihhMSwgYTIpICogdCArIGMoYTEpO1xuICBjb25zdCBnZXRUZm9yWCA9ICh4KSA9PiB7XG4gICAgbGV0IGFHdWVzc1QgPSB4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBwMCwgcDIpO1xuICAgICAgaWYgKGN1cnJlbnRTbG9wZSA9PT0gMClcbiAgICAgICAgcmV0dXJuIGFHdWVzc1Q7XG4gICAgICBjb25zdCBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgcDAsIHAyKSAtIHg7XG4gICAgICBhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xuICAgIH1cbiAgICByZXR1cm4gYUd1ZXNzVDtcbiAgfTtcbiAgcmV0dXJuICh4KSA9PiBwMCA9PT0gcDEgJiYgcDIgPT09IHAzID8geCA6IGNhbGNCZXppZXIoZ2V0VGZvclgoeCksIHAxLCBwMyk7XG59XG5mdW5jdGlvbiBsZXJwKGEsIGIsIGFscGhhKSB7XG4gIHJldHVybiBhICsgYWxwaGEgKiAoYiAtIGEpO1xufVxuZnVuY3Rpb24gdG9WZWModCkge1xuICByZXR1cm4gKHR5cGVvZiB0ID09PSBcIm51bWJlclwiID8gW3RdIDogdCkgfHwgW107XG59XG5mdW5jdGlvbiBleGVjdXRlVHJhbnNpdGlvbihzb3VyY2UsIGZyb20sIHRvLCBvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3QgZnJvbVZhbCA9IHRvVmFsdWUoZnJvbSk7XG4gIGNvbnN0IHRvVmFsID0gdG9WYWx1ZSh0byk7XG4gIGNvbnN0IHYxID0gdG9WZWMoZnJvbVZhbCk7XG4gIGNvbnN0IHYyID0gdG9WZWModG9WYWwpO1xuICBjb25zdCBkdXJhdGlvbiA9IChfYSA9IHRvVmFsdWUob3B0aW9ucy5kdXJhdGlvbikpICE9IG51bGwgPyBfYSA6IDFlMztcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZW5kQXQgPSBEYXRlLm5vdygpICsgZHVyYXRpb247XG4gIGNvbnN0IHRyYW5zID0gdHlwZW9mIG9wdGlvbnMudHJhbnNpdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50cmFuc2l0aW9uIDogKF9iID0gdG9WYWx1ZShvcHRpb25zLnRyYW5zaXRpb24pKSAhPSBudWxsID8gX2IgOiBpZGVudGl0eTtcbiAgY29uc3QgZWFzZSA9IHR5cGVvZiB0cmFucyA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnMgOiBjcmVhdGVFYXNpbmdGdW5jdGlvbih0cmFucyk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNvdXJjZS52YWx1ZSA9IGZyb21WYWw7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBpZiAoKF9hMiA9IG9wdGlvbnMuYWJvcnQpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuY2FsbChvcHRpb25zKSkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBhbHBoYSA9IGVhc2UoKG5vdyAtIHN0YXJ0ZWRBdCkgLyBkdXJhdGlvbik7XG4gICAgICBjb25zdCBhcnIgPSB0b1ZlYyhzb3VyY2UudmFsdWUpLm1hcCgobiwgaSkgPT4gbGVycCh2MVtpXSwgdjJbaV0sIGFscGhhKSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UudmFsdWUpKVxuICAgICAgICBzb3VyY2UudmFsdWUgPSBhcnIubWFwKChuLCBpKSA9PiB7XG4gICAgICAgICAgdmFyIF9hMywgX2IyO1xuICAgICAgICAgIHJldHVybiBsZXJwKChfYTMgPSB2MVtpXSkgIT0gbnVsbCA/IF9hMyA6IDAsIChfYjIgPSB2MltpXSkgIT0gbnVsbCA/IF9iMiA6IDAsIGFscGhhKTtcbiAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlLnZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgICBzb3VyY2UudmFsdWUgPSBhcnJbMF07XG4gICAgICBpZiAobm93IDwgZW5kQXQpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291cmNlLnZhbHVlID0gdG9WYWw7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRpY2soKTtcbiAgfSk7XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBjdXJyZW50SWQgPSAwO1xuICBjb25zdCBzb3VyY2VWYWwgPSAoKSA9PiB7XG4gICAgY29uc3QgdiA9IHRvVmFsdWUoc291cmNlKTtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwibnVtYmVyXCIgPyB2IDogdi5tYXAodG9WYWx1ZSk7XG4gIH07XG4gIGNvbnN0IG91dHB1dFJlZiA9IHJlZihzb3VyY2VWYWwoKSk7XG4gIHdhdGNoKHNvdXJjZVZhbCwgYXN5bmMgKHRvKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpZCA9ICsrY3VycmVudElkO1xuICAgIGlmIChvcHRpb25zLmRlbGF5KVxuICAgICAgYXdhaXQgcHJvbWlzZVRpbWVvdXQodG9WYWx1ZShvcHRpb25zLmRlbGF5KSk7XG4gICAgaWYgKGlkICE9PSBjdXJyZW50SWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdG9WYWwgPSBBcnJheS5pc0FycmF5KHRvKSA/IHRvLm1hcCh0b1ZhbHVlKSA6IHRvVmFsdWUodG8pO1xuICAgIChfYSA9IG9wdGlvbnMub25TdGFydGVkKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChvcHRpb25zKTtcbiAgICBhd2FpdCBleGVjdXRlVHJhbnNpdGlvbihvdXRwdXRSZWYsIG91dHB1dFJlZi52YWx1ZSwgdG9WYWwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhYm9ydDogKCkgPT4ge1xuICAgICAgICB2YXIgX2EyO1xuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRJZCB8fCAoKF9hMiA9IG9wdGlvbnMuYWJvcnQpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuY2FsbChvcHRpb25zKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgKF9iID0gb3B0aW9ucy5vbkZpbmlzaGVkKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zKTtcbiAgfSwgeyBkZWVwOiB0cnVlIH0pO1xuICB3YXRjaCgoKSA9PiB0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpLCAoZGlzYWJsZWQpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIGN1cnJlbnRJZCsrO1xuICAgICAgb3V0cHV0UmVmLnZhbHVlID0gc291cmNlVmFsKCk7XG4gICAgfVxuICB9KTtcbiAgdHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgIGN1cnJlbnRJZCsrO1xuICB9KTtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgPyBzb3VyY2VWYWwoKSA6IG91dHB1dFJlZi52YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHVzZVVybFNlYXJjaFBhcmFtcyhtb2RlID0gXCJoaXN0b3J5XCIsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgaW5pdGlhbFZhbHVlID0ge30sXG4gICAgcmVtb3ZlTnVsbGlzaFZhbHVlcyA9IHRydWUsXG4gICAgcmVtb3ZlRmFsc3lWYWx1ZXMgPSBmYWxzZSxcbiAgICB3cml0ZTogZW5hYmxlV3JpdGUgPSB0cnVlLFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICghd2luZG93KVxuICAgIHJldHVybiByZWFjdGl2ZShpbml0aWFsVmFsdWUpO1xuICBjb25zdCBzdGF0ZSA9IHJlYWN0aXZlKHt9KTtcbiAgZnVuY3Rpb24gZ2V0UmF3UGFyYW1zKCkge1xuICAgIGlmIChtb2RlID09PSBcImhpc3RvcnlcIikge1xuICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggfHwgXCJcIjtcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiaGFzaFwiKSB7XG4gICAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2ggfHwgXCJcIjtcbiAgICAgIGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcbiAgICAgIHJldHVybiBpbmRleCA+IDAgPyBoYXNoLnNsaWNlKGluZGV4KSA6IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAod2luZG93LmxvY2F0aW9uLmhhc2ggfHwgXCJcIikucmVwbGFjZSgvXiMvLCBcIlwiKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY29uc3RydWN0UXVlcnkocGFyYW1zKSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICBpZiAobW9kZSA9PT0gXCJoaXN0b3J5XCIpXG4gICAgICByZXR1cm4gYCR7c3RyaW5naWZpZWQgPyBgPyR7c3RyaW5naWZpZWR9YCA6IFwiXCJ9JHt3aW5kb3cubG9jYXRpb24uaGFzaCB8fCBcIlwifWA7XG4gICAgaWYgKG1vZGUgPT09IFwiaGFzaC1wYXJhbXNcIilcbiAgICAgIHJldHVybiBgJHt3aW5kb3cubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtzdHJpbmdpZmllZCA/IGAjJHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuICAgIGNvbnN0IGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCBcIiNcIjtcbiAgICBjb25zdCBpbmRleCA9IGhhc2guaW5kZXhPZihcIj9cIik7XG4gICAgaWYgKGluZGV4ID4gMClcbiAgICAgIHJldHVybiBgJHtoYXNoLnNsaWNlKDAsIGluZGV4KX0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG4gICAgcmV0dXJuIGAke2hhc2h9JHtzdHJpbmdpZmllZCA/IGA/JHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuICB9XG4gIGZ1bmN0aW9uIHJlYWQoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoZ2V0UmF3UGFyYW1zKCkpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKHBhcmFtcykge1xuICAgIGNvbnN0IHVudXNlZEtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHN0YXRlKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGFyYW1zLmtleXMoKSkge1xuICAgICAgY29uc3QgcGFyYW1zRm9yS2V5ID0gcGFyYW1zLmdldEFsbChrZXkpO1xuICAgICAgc3RhdGVba2V5XSA9IHBhcmFtc0ZvcktleS5sZW5ndGggPiAxID8gcGFyYW1zRm9yS2V5IDogcGFyYW1zLmdldChrZXkpIHx8IFwiXCI7XG4gICAgICB1bnVzZWRLZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBBcnJheS5mcm9tKHVudXNlZEtleXMpLmZvckVhY2goKGtleSkgPT4gZGVsZXRlIHN0YXRlW2tleV0pO1xuICB9XG4gIGNvbnN0IHsgcGF1c2UsIHJlc3VtZSB9ID0gcGF1c2FibGVXYXRjaChcbiAgICBzdGF0ZSxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKFwiXCIpO1xuICAgICAgT2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBtYXBFbnRyeSA9IHN0YXRlW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hcEVudHJ5KSlcbiAgICAgICAgICBtYXBFbnRyeS5mb3JFYWNoKCh2YWx1ZSkgPT4gcGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKSk7XG4gICAgICAgIGVsc2UgaWYgKHJlbW92ZU51bGxpc2hWYWx1ZXMgJiYgbWFwRW50cnkgPT0gbnVsbClcbiAgICAgICAgICBwYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgaWYgKHJlbW92ZUZhbHN5VmFsdWVzICYmICFtYXBFbnRyeSlcbiAgICAgICAgICBwYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBwYXJhbXMuc2V0KGtleSwgbWFwRW50cnkpO1xuICAgICAgfSk7XG4gICAgICB3cml0ZShwYXJhbXMpO1xuICAgIH0sXG4gICAgeyBkZWVwOiB0cnVlIH1cbiAgKTtcbiAgZnVuY3Rpb24gd3JpdGUocGFyYW1zLCBzaG91bGRVcGRhdGUpIHtcbiAgICBwYXVzZSgpO1xuICAgIGlmIChzaG91bGRVcGRhdGUpXG4gICAgICB1cGRhdGVTdGF0ZShwYXJhbXMpO1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnN0YXRlLFxuICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgY29uc3RydWN0UXVlcnkocGFyYW1zKVxuICAgICk7XG4gICAgcmVzdW1lKCk7XG4gIH1cbiAgZnVuY3Rpb24gb25DaGFuZ2VkKCkge1xuICAgIGlmICghZW5hYmxlV3JpdGUpXG4gICAgICByZXR1cm47XG4gICAgd3JpdGUocmVhZCgpLCB0cnVlKTtcbiAgfVxuICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgXCJwb3BzdGF0ZVwiLCBvbkNoYW5nZWQsIGZhbHNlKTtcbiAgaWYgKG1vZGUgIT09IFwiaGlzdG9yeVwiKVxuICAgIHVzZUV2ZW50TGlzdGVuZXIod2luZG93LCBcImhhc2hjaGFuZ2VcIiwgb25DaGFuZ2VkLCBmYWxzZSk7XG4gIGNvbnN0IGluaXRpYWwgPSByZWFkKCk7XG4gIGlmIChpbml0aWFsLmtleXMoKS5uZXh0KCkudmFsdWUpXG4gICAgdXBkYXRlU3RhdGUoaW5pdGlhbCk7XG4gIGVsc2VcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLCBpbml0aWFsVmFsdWUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIHVzZVVzZXJNZWRpYShvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3QgZW5hYmxlZCA9IHJlZigoX2EgPSBvcHRpb25zLmVuYWJsZWQpICE9IG51bGwgPyBfYSA6IGZhbHNlKTtcbiAgY29uc3QgYXV0b1N3aXRjaCA9IHJlZigoX2IgPSBvcHRpb25zLmF1dG9Td2l0Y2gpICE9IG51bGwgPyBfYiA6IHRydWUpO1xuICBjb25zdCBjb25zdHJhaW50cyA9IHJlZihvcHRpb25zLmNvbnN0cmFpbnRzKTtcbiAgY29uc3QgeyBuYXZpZ2F0b3IgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiB7XG4gICAgdmFyIF9hMjtcbiAgICByZXR1cm4gKF9hMiA9IG5hdmlnYXRvciA9PSBudWxsID8gdm9pZCAwIDogbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5nZXRVc2VyTWVkaWE7XG4gIH0pO1xuICBjb25zdCBzdHJlYW0gPSBzaGFsbG93UmVmKCk7XG4gIGZ1bmN0aW9uIGdldERldmljZU9wdGlvbnModHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcInZpZGVvXCI6IHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLnZhbHVlKVxuICAgICAgICAgIHJldHVybiBjb25zdHJhaW50cy52YWx1ZS52aWRlbyB8fCBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXVkaW9cIjoge1xuICAgICAgICBpZiAoY29uc3RyYWludHMudmFsdWUpXG4gICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzLnZhbHVlLmF1ZGlvIHx8IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gX3N0YXJ0KCkge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgc3RyZWFtLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIHN0cmVhbS52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgIHZpZGVvOiBnZXREZXZpY2VPcHRpb25zKFwidmlkZW9cIiksXG4gICAgICBhdWRpbzogZ2V0RGV2aWNlT3B0aW9ucyhcImF1ZGlvXCIpXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cmVhbS52YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBfc3RvcCgpIHtcbiAgICB2YXIgX2EyO1xuICAgIChfYTIgPSBzdHJlYW0udmFsdWUpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgIHN0cmVhbS52YWx1ZSA9IHZvaWQgMDtcbiAgfVxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIF9zdG9wKCk7XG4gICAgZW5hYmxlZC52YWx1ZSA9IGZhbHNlO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIGF3YWl0IF9zdGFydCgpO1xuICAgIGlmIChzdHJlYW0udmFsdWUpXG4gICAgICBlbmFibGVkLnZhbHVlID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RyZWFtLnZhbHVlO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQoKSB7XG4gICAgX3N0b3AoKTtcbiAgICByZXR1cm4gYXdhaXQgc3RhcnQoKTtcbiAgfVxuICB3YXRjaChcbiAgICBlbmFibGVkLFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodilcbiAgICAgICAgX3N0YXJ0KCk7XG4gICAgICBlbHNlXG4gICAgICAgIF9zdG9wKCk7XG4gICAgfSxcbiAgICB7IGltbWVkaWF0ZTogdHJ1ZSB9XG4gICk7XG4gIHdhdGNoKFxuICAgIGNvbnN0cmFpbnRzLFxuICAgICgpID0+IHtcbiAgICAgIGlmIChhdXRvU3dpdGNoLnZhbHVlICYmIHN0cmVhbS52YWx1ZSlcbiAgICAgICAgcmVzdGFydCgpO1xuICAgIH0sXG4gICAgeyBpbW1lZGlhdGU6IHRydWUgfVxuICApO1xuICB0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG4gICAgc3RvcCgpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBzdHJlYW0sXG4gICAgc3RhcnQsXG4gICAgc3RvcCxcbiAgICByZXN0YXJ0LFxuICAgIGNvbnN0cmFpbnRzLFxuICAgIGVuYWJsZWQsXG4gICAgYXV0b1N3aXRjaFxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VWTW9kZWwocHJvcHMsIGtleSwgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gIGNvbnN0IHtcbiAgICBjbG9uZSA9IGZhbHNlLFxuICAgIHBhc3NpdmUgPSBmYWxzZSxcbiAgICBldmVudE5hbWUsXG4gICAgZGVlcCA9IGZhbHNlLFxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBzaG91bGRFbWl0XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB2bSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBjb25zdCBfZW1pdCA9IGVtaXQgfHwgKHZtID09IG51bGwgPyB2b2lkIDAgOiB2bS5lbWl0KSB8fCAoKF9hID0gdm0gPT0gbnVsbCA/IHZvaWQgMCA6IHZtLiRlbWl0KSA9PSBudWxsID8gdm9pZCAwIDogX2EuYmluZCh2bSkpIHx8ICgoX2MgPSAoX2IgPSB2bSA9PSBudWxsID8gdm9pZCAwIDogdm0ucHJveHkpID09IG51bGwgPyB2b2lkIDAgOiBfYi4kZW1pdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLmJpbmQodm0gPT0gbnVsbCA/IHZvaWQgMCA6IHZtLnByb3h5KSk7XG4gIGxldCBldmVudCA9IGV2ZW50TmFtZTtcbiAgaWYgKCFrZXkpIHtcbiAgICBpZiAoaXNWdWUyKSB7XG4gICAgICBjb25zdCBtb2RlbE9wdGlvbnMgPSAoX2UgPSAoX2QgPSB2bSA9PSBudWxsID8gdm9pZCAwIDogdm0ucHJveHkpID09IG51bGwgPyB2b2lkIDAgOiBfZC4kb3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLm1vZGVsO1xuICAgICAga2V5ID0gKG1vZGVsT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogbW9kZWxPcHRpb25zLnZhbHVlKSB8fCBcInZhbHVlXCI7XG4gICAgICBpZiAoIWV2ZW50TmFtZSlcbiAgICAgICAgZXZlbnQgPSAobW9kZWxPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBtb2RlbE9wdGlvbnMuZXZlbnQpIHx8IFwiaW5wdXRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gXCJtb2RlbFZhbHVlXCI7XG4gICAgfVxuICB9XG4gIGV2ZW50ID0gZXZlbnQgfHwgYHVwZGF0ZToke2tleS50b1N0cmluZygpfWA7XG4gIGNvbnN0IGNsb25lRm4gPSAodmFsKSA9PiAhY2xvbmUgPyB2YWwgOiB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lKHZhbCkgOiBjbG9uZUZuSlNPTih2YWwpO1xuICBjb25zdCBnZXRWYWx1ZSA9ICgpID0+IGlzRGVmKHByb3BzW2tleV0pID8gY2xvbmVGbihwcm9wc1trZXldKSA6IGRlZmF1bHRWYWx1ZTtcbiAgY29uc3QgdHJpZ2dlckVtaXQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoc2hvdWxkRW1pdCkge1xuICAgICAgaWYgKHNob3VsZEVtaXQodmFsdWUpKVxuICAgICAgICBfZW1pdChldmVudCwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZW1pdChldmVudCwgdmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgaWYgKHBhc3NpdmUpIHtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHByb3h5ID0gcmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgbGV0IGlzVXBkYXRpbmcgPSBmYWxzZTtcbiAgICB3YXRjaChcbiAgICAgICgpID0+IHByb3BzW2tleV0sXG4gICAgICAodikgPT4ge1xuICAgICAgICBpZiAoIWlzVXBkYXRpbmcpIHtcbiAgICAgICAgICBpc1VwZGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBwcm94eS52YWx1ZSA9IGNsb25lRm4odik7XG4gICAgICAgICAgbmV4dFRpY2soKCkgPT4gaXNVcGRhdGluZyA9IGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgd2F0Y2goXG4gICAgICBwcm94eSxcbiAgICAgICh2KSA9PiB7XG4gICAgICAgIGlmICghaXNVcGRhdGluZyAmJiAodiAhPT0gcHJvcHNba2V5XSB8fCBkZWVwKSlcbiAgICAgICAgICB0cmlnZ2VyRW1pdCh2KTtcbiAgICAgIH0sXG4gICAgICB7IGRlZXAgfVxuICAgICk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wdXRlZCh7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBnZXRWYWx1ZSgpO1xuICAgICAgfSxcbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICB0cmlnZ2VyRW1pdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlVk1vZGVscyhwcm9wcywgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIHJldFtrZXldID0gdXNlVk1vZGVsKFxuICAgICAgcHJvcHMsXG4gICAgICBrZXksXG4gICAgICBlbWl0LFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gdXNlVmlicmF0ZShvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBwYXR0ZXJuID0gW10sXG4gICAgaW50ZXJ2YWwgPSAwLFxuICAgIG5hdmlnYXRvciA9IGRlZmF1bHROYXZpZ2F0b3JcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGlzU3VwcG9ydGVkID0gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJ2aWJyYXRlXCIgaW4gbmF2aWdhdG9yKTtcbiAgY29uc3QgcGF0dGVyblJlZiA9IHRvUmVmKHBhdHRlcm4pO1xuICBsZXQgaW50ZXJ2YWxDb250cm9scztcbiAgY29uc3QgdmlicmF0ZSA9IChwYXR0ZXJuMiA9IHBhdHRlcm5SZWYudmFsdWUpID0+IHtcbiAgICBpZiAoaXNTdXBwb3J0ZWQudmFsdWUpXG4gICAgICBuYXZpZ2F0b3IudmlicmF0ZShwYXR0ZXJuMik7XG4gIH07XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgaWYgKGlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgbmF2aWdhdG9yLnZpYnJhdGUoMCk7XG4gICAgaW50ZXJ2YWxDb250cm9scyA9PSBudWxsID8gdm9pZCAwIDogaW50ZXJ2YWxDb250cm9scy5wYXVzZSgpO1xuICB9O1xuICBpZiAoaW50ZXJ2YWwgPiAwKSB7XG4gICAgaW50ZXJ2YWxDb250cm9scyA9IHVzZUludGVydmFsRm4oXG4gICAgICB2aWJyYXRlLFxuICAgICAgaW50ZXJ2YWwsXG4gICAgICB7XG4gICAgICAgIGltbWVkaWF0ZTogZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZUNhbGxiYWNrOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBwYXR0ZXJuLFxuICAgIGludGVydmFsQ29udHJvbHMsXG4gICAgdmlicmF0ZSxcbiAgICBzdG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVZpcnR1YWxMaXN0KGxpc3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgeyBjb250YWluZXJTdHlsZSwgd3JhcHBlclByb3BzLCBzY3JvbGxUbywgY2FsY3VsYXRlUmFuZ2UsIGN1cnJlbnRMaXN0LCBjb250YWluZXJSZWYgfSA9IFwiaXRlbUhlaWdodFwiIGluIG9wdGlvbnMgPyB1c2VWZXJ0aWNhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpIDogdXNlSG9yaXpvbnRhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpO1xuICByZXR1cm4ge1xuICAgIGxpc3Q6IGN1cnJlbnRMaXN0LFxuICAgIHNjcm9sbFRvLFxuICAgIGNvbnRhaW5lclByb3BzOiB7XG4gICAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICAgIG9uU2Nyb2xsOiAoKSA9PiB7XG4gICAgICAgIGNhbGN1bGF0ZVJhbmdlKCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IGNvbnRhaW5lclN0eWxlXG4gICAgfSxcbiAgICB3cmFwcGVyUHJvcHNcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZVZpcnR1YWxMaXN0UmVzb3VyY2VzKGxpc3QpIHtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gcmVmKG51bGwpO1xuICBjb25zdCBzaXplID0gdXNlRWxlbWVudFNpemUoY29udGFpbmVyUmVmKTtcbiAgY29uc3QgY3VycmVudExpc3QgPSByZWYoW10pO1xuICBjb25zdCBzb3VyY2UgPSBzaGFsbG93UmVmKGxpc3QpO1xuICBjb25zdCBzdGF0ZSA9IHJlZih7IHN0YXJ0OiAwLCBlbmQ6IDEwIH0pO1xuICByZXR1cm4geyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH07XG59XG5mdW5jdGlvbiBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbVNpemUpIHtcbiAgcmV0dXJuIChjb250YWluZXJTaXplKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBNYXRoLmNlaWwoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICBjb25zdCB7IHN0YXJ0ID0gMCB9ID0gc3RhdGUudmFsdWU7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgbGV0IGNhcGFjaXR5ID0gMDtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzb3VyY2UudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNpemUgPSBpdGVtU2l6ZShpKTtcbiAgICAgIHN1bSArPSBzaXplO1xuICAgICAgY2FwYWNpdHkgPSBpO1xuICAgICAgaWYgKHN1bSA+IGNvbnRhaW5lclNpemUpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY2FwYWNpdHkgLSBzdGFydDtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldE9mZnNldChzb3VyY2UsIGl0ZW1TaXplKSB7XG4gIHJldHVybiAoc2Nyb2xsRGlyZWN0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHNjcm9sbERpcmVjdGlvbiAvIGl0ZW1TaXplKSArIDE7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNpemUgPSBpdGVtU2l6ZShpKTtcbiAgICAgIHN1bSArPSBzaXplO1xuICAgICAgaWYgKHN1bSA+PSBzY3JvbGxEaXJlY3Rpb24pIHtcbiAgICAgICAgb2Zmc2V0ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQgKyAxO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UodHlwZSwgb3ZlcnNjYW4sIGdldE9mZnNldCwgZ2V0Vmlld0NhcGFjaXR5LCB7IGNvbnRhaW5lclJlZiwgc3RhdGUsIGN1cnJlbnRMaXN0LCBzb3VyY2UgfSkge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXJSZWYudmFsdWU7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGdldE9mZnNldCh0eXBlID09PSBcInZlcnRpY2FsXCIgPyBlbGVtZW50LnNjcm9sbFRvcCA6IGVsZW1lbnQuc2Nyb2xsTGVmdCk7XG4gICAgICBjb25zdCB2aWV3Q2FwYWNpdHkgPSBnZXRWaWV3Q2FwYWNpdHkodHlwZSA9PT0gXCJ2ZXJ0aWNhbFwiID8gZWxlbWVudC5jbGllbnRIZWlnaHQgOiBlbGVtZW50LmNsaWVudFdpZHRoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBvZmZzZXQgLSBvdmVyc2NhbjtcbiAgICAgIGNvbnN0IHRvID0gb2Zmc2V0ICsgdmlld0NhcGFjaXR5ICsgb3ZlcnNjYW47XG4gICAgICBzdGF0ZS52YWx1ZSA9IHtcbiAgICAgICAgc3RhcnQ6IGZyb20gPCAwID8gMCA6IGZyb20sXG4gICAgICAgIGVuZDogdG8gPiBzb3VyY2UudmFsdWUubGVuZ3RoID8gc291cmNlLnZhbHVlLmxlbmd0aCA6IHRvXG4gICAgICB9O1xuICAgICAgY3VycmVudExpc3QudmFsdWUgPSBzb3VyY2UudmFsdWUuc2xpY2Uoc3RhdGUudmFsdWUuc3RhcnQsIHN0YXRlLnZhbHVlLmVuZCkubWFwKChlbGUsIGluZGV4KSA9PiAoe1xuICAgICAgICBkYXRhOiBlbGUsXG4gICAgICAgIGluZGV4OiBpbmRleCArIHN0YXRlLnZhbHVlLnN0YXJ0XG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbVNpemUsIHNvdXJjZSkge1xuICByZXR1cm4gKGluZGV4KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3Qgc2l6ZTIgPSBpbmRleCAqIGl0ZW1TaXplO1xuICAgICAgcmV0dXJuIHNpemUyO1xuICAgIH1cbiAgICBjb25zdCBzaXplID0gc291cmNlLnZhbHVlLnNsaWNlKDAsIGluZGV4KS5yZWR1Y2UoKHN1bSwgXywgaSkgPT4gc3VtICsgaXRlbVNpemUoaSksIDApO1xuICAgIHJldHVybiBzaXplO1xuICB9O1xufVxuZnVuY3Rpb24gdXNlV2F0Y2hGb3JTaXplcyhzaXplLCBsaXN0LCBjYWxjdWxhdGVSYW5nZSkge1xuICB3YXRjaChbc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIGxpc3RdLCAoKSA9PiB7XG4gICAgY2FsY3VsYXRlUmFuZ2UoKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtU2l6ZSwgc291cmNlKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBzb3VyY2UudmFsdWUubGVuZ3RoICogaXRlbVNpemU7XG4gICAgcmV0dXJuIHNvdXJjZS52YWx1ZS5yZWR1Y2UoKHN1bSwgXywgaW5kZXgpID0+IHN1bSArIGl0ZW1TaXplKGluZGV4KSwgMCk7XG4gIH0pO1xufVxuY29uc3Qgc2Nyb2xsVG9EaWN0aW9uYXJ5Rm9yRWxlbWVudFNjcm9sbEtleSA9IHtcbiAgaG9yaXpvbnRhbDogXCJzY3JvbGxMZWZ0XCIsXG4gIHZlcnRpY2FsOiBcInNjcm9sbFRvcFwiXG59O1xuZnVuY3Rpb24gY3JlYXRlU2Nyb2xsVG8odHlwZSwgY2FsY3VsYXRlUmFuZ2UsIGdldERpc3RhbmNlLCBjb250YWluZXJSZWYpIHtcbiAgcmV0dXJuIChpbmRleCkgPT4ge1xuICAgIGlmIChjb250YWluZXJSZWYudmFsdWUpIHtcbiAgICAgIGNvbnRhaW5lclJlZi52YWx1ZVtzY3JvbGxUb0RpY3Rpb25hcnlGb3JFbGVtZW50U2Nyb2xsS2V5W3R5cGVdXSA9IGdldERpc3RhbmNlKGluZGV4KTtcbiAgICAgIGNhbGN1bGF0ZVJhbmdlKCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdXNlSG9yaXpvbnRhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpIHtcbiAgY29uc3QgcmVzb3VyY2VzID0gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCk7XG4gIGNvbnN0IHsgc3RhdGUsIHNvdXJjZSwgY3VycmVudExpc3QsIHNpemUsIGNvbnRhaW5lclJlZiB9ID0gcmVzb3VyY2VzO1xuICBjb25zdCBjb250YWluZXJTdHlsZSA9IHsgb3ZlcmZsb3dYOiBcImF1dG9cIiB9O1xuICBjb25zdCB7IGl0ZW1XaWR0aCwgb3ZlcnNjYW4gPSA1IH0gPSBvcHRpb25zO1xuICBjb25zdCBnZXRWaWV3Q2FwYWNpdHkgPSBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbVdpZHRoKTtcbiAgY29uc3QgZ2V0T2Zmc2V0ID0gY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbVdpZHRoKTtcbiAgY29uc3QgY2FsY3VsYXRlUmFuZ2UgPSBjcmVhdGVDYWxjdWxhdGVSYW5nZShcImhvcml6b250YWxcIiwgb3ZlcnNjYW4sIGdldE9mZnNldCwgZ2V0Vmlld0NhcGFjaXR5LCByZXNvdXJjZXMpO1xuICBjb25zdCBnZXREaXN0YW5jZUxlZnQgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtV2lkdGgsIHNvdXJjZSk7XG4gIGNvbnN0IG9mZnNldExlZnQgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZUxlZnQoc3RhdGUudmFsdWUuc3RhcnQpKTtcbiAgY29uc3QgdG90YWxXaWR0aCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1XaWR0aCwgc291cmNlKTtcbiAgdXNlV2F0Y2hGb3JTaXplcyhzaXplLCBsaXN0LCBjYWxjdWxhdGVSYW5nZSk7XG4gIGNvbnN0IHNjcm9sbFRvID0gY3JlYXRlU2Nyb2xsVG8oXCJob3Jpem9udGFsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZUxlZnQsIGNvbnRhaW5lclJlZik7XG4gIGNvbnN0IHdyYXBwZXJQcm9wcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgd2lkdGg6IGAke3RvdGFsV2lkdGgudmFsdWUgLSBvZmZzZXRMZWZ0LnZhbHVlfXB4YCxcbiAgICAgICAgbWFyZ2luTGVmdDogYCR7b2Zmc2V0TGVmdC52YWx1ZX1weGAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsVG8sXG4gICAgY2FsY3VsYXRlUmFuZ2UsXG4gICAgd3JhcHBlclByb3BzLFxuICAgIGNvbnRhaW5lclN0eWxlLFxuICAgIGN1cnJlbnRMaXN0LFxuICAgIGNvbnRhaW5lclJlZlxuICB9O1xufVxuZnVuY3Rpb24gdXNlVmVydGljYWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KSB7XG4gIGNvbnN0IHJlc291cmNlcyA9IHVzZVZpcnR1YWxMaXN0UmVzb3VyY2VzKGxpc3QpO1xuICBjb25zdCB7IHN0YXRlLCBzb3VyY2UsIGN1cnJlbnRMaXN0LCBzaXplLCBjb250YWluZXJSZWYgfSA9IHJlc291cmNlcztcbiAgY29uc3QgY29udGFpbmVyU3R5bGUgPSB7IG92ZXJmbG93WTogXCJhdXRvXCIgfTtcbiAgY29uc3QgeyBpdGVtSGVpZ2h0LCBvdmVyc2NhbiA9IDUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGdldFZpZXdDYXBhY2l0eSA9IGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtSGVpZ2h0KTtcbiAgY29uc3QgZ2V0T2Zmc2V0ID0gY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbUhlaWdodCk7XG4gIGNvbnN0IGNhbGN1bGF0ZVJhbmdlID0gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UoXCJ2ZXJ0aWNhbFwiLCBvdmVyc2NhbiwgZ2V0T2Zmc2V0LCBnZXRWaWV3Q2FwYWNpdHksIHJlc291cmNlcyk7XG4gIGNvbnN0IGdldERpc3RhbmNlVG9wID0gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbUhlaWdodCwgc291cmNlKTtcbiAgY29uc3Qgb2Zmc2V0VG9wID0gY29tcHV0ZWQoKCkgPT4gZ2V0RGlzdGFuY2VUb3Aoc3RhdGUudmFsdWUuc3RhcnQpKTtcbiAgY29uc3QgdG90YWxIZWlnaHQgPSBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtSGVpZ2h0LCBzb3VyY2UpO1xuICB1c2VXYXRjaEZvclNpemVzKHNpemUsIGxpc3QsIGNhbGN1bGF0ZVJhbmdlKTtcbiAgY29uc3Qgc2Nyb2xsVG8gPSBjcmVhdGVTY3JvbGxUbyhcInZlcnRpY2FsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZVRvcCwgY29udGFpbmVyUmVmKTtcbiAgY29uc3Qgd3JhcHBlclByb3BzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGhlaWdodDogYCR7dG90YWxIZWlnaHQudmFsdWUgLSBvZmZzZXRUb3AudmFsdWV9cHhgLFxuICAgICAgICBtYXJnaW5Ub3A6IGAke29mZnNldFRvcC52YWx1ZX1weGBcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGVSYW5nZSxcbiAgICBzY3JvbGxUbyxcbiAgICBjb250YWluZXJTdHlsZSxcbiAgICB3cmFwcGVyUHJvcHMsXG4gICAgY3VycmVudExpc3QsXG4gICAgY29udGFpbmVyUmVmXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVdha2VMb2NrKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgbmF2aWdhdG9yID0gZGVmYXVsdE5hdmlnYXRvcixcbiAgICBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudFxuICB9ID0gb3B0aW9ucztcbiAgbGV0IHdha2VMb2NrO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IgJiYgXCJ3YWtlTG9ja1wiIGluIG5hdmlnYXRvcik7XG4gIGNvbnN0IGlzQWN0aXZlID0gcmVmKGZhbHNlKTtcbiAgYXN5bmMgZnVuY3Rpb24gb25WaXNpYmlsaXR5Q2hhbmdlKCkge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgIXdha2VMb2NrKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKVxuICAgICAgd2FrZUxvY2sgPSBhd2FpdCBuYXZpZ2F0b3Iud2FrZUxvY2sucmVxdWVzdChcInNjcmVlblwiKTtcbiAgICBpc0FjdGl2ZS52YWx1ZSA9ICF3YWtlTG9jay5yZWxlYXNlZDtcbiAgfVxuICBpZiAoZG9jdW1lbnQpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIG9uVmlzaWJpbGl0eUNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0KHR5cGUpIHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIHdha2VMb2NrID0gYXdhaXQgbmF2aWdhdG9yLndha2VMb2NrLnJlcXVlc3QodHlwZSk7XG4gICAgaXNBY3RpdmUudmFsdWUgPSAhd2FrZUxvY2sucmVsZWFzZWQ7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZSgpIHtcbiAgICBpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICF3YWtlTG9jaylcbiAgICAgIHJldHVybjtcbiAgICBhd2FpdCB3YWtlTG9jay5yZWxlYXNlKCk7XG4gICAgaXNBY3RpdmUudmFsdWUgPSAhd2FrZUxvY2sucmVsZWFzZWQ7XG4gICAgd2FrZUxvY2sgPSBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgaXNTdXBwb3J0ZWQsXG4gICAgaXNBY3RpdmUsXG4gICAgcmVxdWVzdCxcbiAgICByZWxlYXNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVdlYk5vdGlmaWNhdGlvbihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3csXG4gICAgcmVxdWVzdFBlcm1pc3Npb25zOiBfcmVxdWVzdEZvclBlcm1pc3Npb25zID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZGVmYXVsdFdlYk5vdGlmaWNhdGlvbk9wdGlvbnMgPSBvcHRpb25zO1xuICBjb25zdCBpc1N1cHBvcnRlZCA9IHVzZVN1cHBvcnRlZCgoKSA9PiAhIXdpbmRvdyAmJiBcIk5vdGlmaWNhdGlvblwiIGluIHdpbmRvdyk7XG4gIGNvbnN0IHBlcm1pc3Npb25HcmFudGVkID0gcmVmKGlzU3VwcG9ydGVkLnZhbHVlICYmIFwicGVybWlzc2lvblwiIGluIE5vdGlmaWNhdGlvbiAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA9PT0gXCJncmFudGVkXCIpO1xuICBjb25zdCBub3RpZmljYXRpb24gPSByZWYobnVsbCk7XG4gIGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgaWYgKCFwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiAhPT0gXCJkZW5pZWRcIikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImdyYW50ZWRcIilcbiAgICAgICAgcGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG4gIH07XG4gIGNvbnN0IHsgb246IG9uQ2xpY2ssIHRyaWdnZXI6IGNsaWNrVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG4gIGNvbnN0IHsgb246IG9uU2hvdywgdHJpZ2dlcjogc2hvd1RyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuICBjb25zdCB7IG9uOiBvbkVycm9yLCB0cmlnZ2VyOiBlcnJvclRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuICBjb25zdCB7IG9uOiBvbkNsb3NlLCB0cmlnZ2VyOiBjbG9zZVRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuICBjb25zdCBzaG93ID0gYXN5bmMgKG92ZXJyaWRlcykgPT4ge1xuICAgIGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgIXBlcm1pc3Npb25HcmFudGVkLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG9wdGlvbnMyID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFdlYk5vdGlmaWNhdGlvbk9wdGlvbnMsIG92ZXJyaWRlcyk7XG4gICAgbm90aWZpY2F0aW9uLnZhbHVlID0gbmV3IE5vdGlmaWNhdGlvbihvcHRpb25zMi50aXRsZSB8fCBcIlwiLCBvcHRpb25zMik7XG4gICAgbm90aWZpY2F0aW9uLnZhbHVlLm9uY2xpY2sgPSBjbGlja1RyaWdnZXI7XG4gICAgbm90aWZpY2F0aW9uLnZhbHVlLm9uc2hvdyA9IHNob3dUcmlnZ2VyO1xuICAgIG5vdGlmaWNhdGlvbi52YWx1ZS5vbmVycm9yID0gZXJyb3JUcmlnZ2VyO1xuICAgIG5vdGlmaWNhdGlvbi52YWx1ZS5vbmNsb3NlID0gY2xvc2VUcmlnZ2VyO1xuICAgIHJldHVybiBub3RpZmljYXRpb24udmFsdWU7XG4gIH07XG4gIGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuICAgIGlmIChub3RpZmljYXRpb24udmFsdWUpXG4gICAgICBub3RpZmljYXRpb24udmFsdWUuY2xvc2UoKTtcbiAgICBub3RpZmljYXRpb24udmFsdWUgPSBudWxsO1xuICB9O1xuICBpZiAoX3JlcXVlc3RGb3JQZXJtaXNzaW9ucylcbiAgICB0cnlPbk1vdW50ZWQoZW5zdXJlUGVybWlzc2lvbnMpO1xuICB0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG4gIGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB3aW5kb3cpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICB1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSB7XG4gICAgICAgIGNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpc1N1cHBvcnRlZCxcbiAgICBub3RpZmljYXRpb24sXG4gICAgZW5zdXJlUGVybWlzc2lvbnMsXG4gICAgcGVybWlzc2lvbkdyYW50ZWQsXG4gICAgc2hvdyxcbiAgICBjbG9zZSxcbiAgICBvbkNsaWNrLFxuICAgIG9uU2hvdyxcbiAgICBvbkVycm9yLFxuICAgIG9uQ2xvc2VcbiAgfTtcbn1cblxuY29uc3QgREVGQVVMVF9QSU5HX01FU1NBR0UgPSBcInBpbmdcIjtcbmZ1bmN0aW9uIHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHRydWUpXG4gICAgcmV0dXJuIHt9O1xuICByZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIHVzZVdlYlNvY2tldCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgb25Db25uZWN0ZWQsXG4gICAgb25EaXNjb25uZWN0ZWQsXG4gICAgb25FcnJvcixcbiAgICBvbk1lc3NhZ2UsXG4gICAgaW1tZWRpYXRlID0gdHJ1ZSxcbiAgICBhdXRvQ2xvc2UgPSB0cnVlLFxuICAgIHByb3RvY29scyA9IFtdXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBkYXRhID0gcmVmKG51bGwpO1xuICBjb25zdCBzdGF0dXMgPSByZWYoXCJDTE9TRURcIik7XG4gIGNvbnN0IHdzUmVmID0gcmVmKCk7XG4gIGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG4gIGxldCBoZWFydGJlYXRQYXVzZTtcbiAgbGV0IGhlYXJ0YmVhdFJlc3VtZTtcbiAgbGV0IGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcbiAgbGV0IHJldHJpZWQgPSAwO1xuICBsZXQgYnVmZmVyZWREYXRhID0gW107XG4gIGxldCBwb25nVGltZW91dFdhaXQ7XG4gIGNvbnN0IF9zZW5kQnVmZmVyID0gKCkgPT4ge1xuICAgIGlmIChidWZmZXJlZERhdGEubGVuZ3RoICYmIHdzUmVmLnZhbHVlICYmIHN0YXR1cy52YWx1ZSA9PT0gXCJPUEVOXCIpIHtcbiAgICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcmVkRGF0YSlcbiAgICAgICAgd3NSZWYudmFsdWUuc2VuZChidWZmZXIpO1xuICAgICAgYnVmZmVyZWREYXRhID0gW107XG4gICAgfVxuICB9O1xuICBjb25zdCByZXNldEhlYXJ0YmVhdCA9ICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQocG9uZ1RpbWVvdXRXYWl0KTtcbiAgICBwb25nVGltZW91dFdhaXQgPSB2b2lkIDA7XG4gIH07XG4gIGNvbnN0IGNsb3NlID0gKGNvZGUgPSAxZTMsIHJlYXNvbikgPT4ge1xuICAgIGlmICghaXNDbGllbnQgfHwgIXdzUmVmLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGV4cGxpY2l0bHlDbG9zZWQgPSB0cnVlO1xuICAgIHJlc2V0SGVhcnRiZWF0KCk7XG4gICAgaGVhcnRiZWF0UGF1c2UgPT0gbnVsbCA/IHZvaWQgMCA6IGhlYXJ0YmVhdFBhdXNlKCk7XG4gICAgd3NSZWYudmFsdWUuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICB3c1JlZi52YWx1ZSA9IHZvaWQgMDtcbiAgfTtcbiAgY29uc3Qgc2VuZCA9IChkYXRhMiwgdXNlQnVmZmVyID0gdHJ1ZSkgPT4ge1xuICAgIGlmICghd3NSZWYudmFsdWUgfHwgc3RhdHVzLnZhbHVlICE9PSBcIk9QRU5cIikge1xuICAgICAgaWYgKHVzZUJ1ZmZlcilcbiAgICAgICAgYnVmZmVyZWREYXRhLnB1c2goZGF0YTIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBfc2VuZEJ1ZmZlcigpO1xuICAgIHdzUmVmLnZhbHVlLnNlbmQoZGF0YTIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBjb25zdCBfaW5pdCA9ICgpID0+IHtcbiAgICBpZiAoZXhwbGljaXRseUNsb3NlZCB8fCB0eXBlb2YgdXJsUmVmLnZhbHVlID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmxSZWYudmFsdWUsIHByb3RvY29scyk7XG4gICAgd3NSZWYudmFsdWUgPSB3cztcbiAgICBzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcbiAgICB3cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICBzdGF0dXMudmFsdWUgPSBcIk9QRU5cIjtcbiAgICAgIG9uQ29ubmVjdGVkID09IG51bGwgPyB2b2lkIDAgOiBvbkNvbm5lY3RlZCh3cyk7XG4gICAgICBoZWFydGJlYXRSZXN1bWUgPT0gbnVsbCA/IHZvaWQgMCA6IGhlYXJ0YmVhdFJlc3VtZSgpO1xuICAgICAgX3NlbmRCdWZmZXIoKTtcbiAgICB9O1xuICAgIHdzLm9uY2xvc2UgPSAoZXYpID0+IHtcbiAgICAgIHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG4gICAgICBvbkRpc2Nvbm5lY3RlZCA9PSBudWxsID8gdm9pZCAwIDogb25EaXNjb25uZWN0ZWQod3MsIGV2KTtcbiAgICAgIGlmICghZXhwbGljaXRseUNsb3NlZCAmJiBvcHRpb25zLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJldHJpZXMgPSAtMSxcbiAgICAgICAgICBkZWxheSA9IDFlMyxcbiAgICAgICAgICBvbkZhaWxlZFxuICAgICAgICB9ID0gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5hdXRvUmVjb25uZWN0KTtcbiAgICAgICAgcmV0cmllZCArPSAxO1xuICAgICAgICBpZiAodHlwZW9mIHJldHJpZXMgPT09IFwibnVtYmVyXCIgJiYgKHJldHJpZXMgPCAwIHx8IHJldHJpZWQgPCByZXRyaWVzKSlcbiAgICAgICAgICBzZXRUaW1lb3V0KF9pbml0LCBkZWxheSk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiByZXRyaWVzID09PSBcImZ1bmN0aW9uXCIgJiYgcmV0cmllcygpKVxuICAgICAgICAgIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG9uRmFpbGVkID09IG51bGwgPyB2b2lkIDAgOiBvbkZhaWxlZCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgd3Mub25lcnJvciA9IChlKSA9PiB7XG4gICAgICBvbkVycm9yID09IG51bGwgPyB2b2lkIDAgOiBvbkVycm9yKHdzLCBlKTtcbiAgICB9O1xuICAgIHdzLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5oZWFydGJlYXQpIHtcbiAgICAgICAgcmVzZXRIZWFydGJlYXQoKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1lc3NhZ2UgPSBERUZBVUxUX1BJTkdfTUVTU0FHRVxuICAgICAgICB9ID0gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5oZWFydGJlYXQpO1xuICAgICAgICBpZiAoZS5kYXRhID09PSBtZXNzYWdlKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRhdGEudmFsdWUgPSBlLmRhdGE7XG4gICAgICBvbk1lc3NhZ2UgPT0gbnVsbCA/IHZvaWQgMCA6IG9uTWVzc2FnZSh3cywgZSk7XG4gICAgfTtcbiAgfTtcbiAgaWYgKG9wdGlvbnMuaGVhcnRiZWF0KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVzc2FnZSA9IERFRkFVTFRfUElOR19NRVNTQUdFLFxuICAgICAgaW50ZXJ2YWwgPSAxZTMsXG4gICAgICBwb25nVGltZW91dCA9IDFlM1xuICAgIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyhvcHRpb25zLmhlYXJ0YmVhdCk7XG4gICAgY29uc3QgeyBwYXVzZSwgcmVzdW1lIH0gPSB1c2VJbnRlcnZhbEZuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBzZW5kKG1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKHBvbmdUaW1lb3V0V2FpdCAhPSBudWxsKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcG9uZ1RpbWVvdXRXYWl0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgICBleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG4gICAgICAgIH0sIHBvbmdUaW1lb3V0KTtcbiAgICAgIH0sXG4gICAgICBpbnRlcnZhbCxcbiAgICAgIHsgaW1tZWRpYXRlOiBmYWxzZSB9XG4gICAgKTtcbiAgICBoZWFydGJlYXRQYXVzZSA9IHBhdXNlO1xuICAgIGhlYXJ0YmVhdFJlc3VtZSA9IHJlc3VtZTtcbiAgfVxuICBpZiAoYXV0b0Nsb3NlKSB7XG4gICAgaWYgKGlzQ2xpZW50KVxuICAgICAgdXNlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCAoKSA9PiBjbG9zZSgpKTtcbiAgICB0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG4gIH1cbiAgY29uc3Qgb3BlbiA9ICgpID0+IHtcbiAgICBpZiAoIWlzQ2xpZW50ICYmICFpc1dvcmtlcilcbiAgICAgIHJldHVybjtcbiAgICBjbG9zZSgpO1xuICAgIGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcbiAgICByZXRyaWVkID0gMDtcbiAgICBfaW5pdCgpO1xuICB9O1xuICBpZiAoaW1tZWRpYXRlKVxuICAgIG9wZW4oKTtcbiAgcmV0dXJuIHtcbiAgICBkYXRhLFxuICAgIHN0YXR1cyxcbiAgICBjbG9zZSxcbiAgICBzZW5kLFxuICAgIG9wZW4sXG4gICAgd3M6IHdzUmVmXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVdlYldvcmtlcihhcmcwLCB3b3JrZXJPcHRpb25zLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICB3aW5kb3cgPSBkZWZhdWx0V2luZG93XG4gIH0gPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gIGNvbnN0IGRhdGEgPSByZWYobnVsbCk7XG4gIGNvbnN0IHdvcmtlciA9IHNoYWxsb3dSZWYoKTtcbiAgY29uc3QgcG9zdCA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCF3b3JrZXIudmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgd29ya2VyLnZhbHVlLnBvc3RNZXNzYWdlKC4uLmFyZ3MpO1xuICB9O1xuICBjb25zdCB0ZXJtaW5hdGUgPSBmdW5jdGlvbiB0ZXJtaW5hdGUyKCkge1xuICAgIGlmICghd29ya2VyLnZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcbiAgfTtcbiAgaWYgKHdpbmRvdykge1xuICAgIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHdvcmtlci52YWx1ZSA9IG5ldyBXb3JrZXIoYXJnMCwgd29ya2VyT3B0aW9ucyk7XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZzAgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHdvcmtlci52YWx1ZSA9IGFyZzAoKTtcbiAgICBlbHNlXG4gICAgICB3b3JrZXIudmFsdWUgPSBhcmcwO1xuICAgIHdvcmtlci52YWx1ZS5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuICAgICAgZGF0YS52YWx1ZSA9IGUuZGF0YTtcbiAgICB9O1xuICAgIHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICAgIGlmICh3b3JrZXIudmFsdWUpXG4gICAgICAgIHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRhdGEsXG4gICAgcG9zdCxcbiAgICB0ZXJtaW5hdGUsXG4gICAgd29ya2VyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGpvYlJ1bm5lcih1c2VyRnVuYykge1xuICByZXR1cm4gKGUpID0+IHtcbiAgICBjb25zdCB1c2VyRnVuY0FyZ3MgPSBlLmRhdGFbMF07XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1c2VyRnVuYy5hcHBseSh2b2lkIDAsIHVzZXJGdW5jQXJncykpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgcG9zdE1lc3NhZ2UoW1wiU1VDQ0VTU1wiLCByZXN1bHRdKTtcbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHBvc3RNZXNzYWdlKFtcIkVSUk9SXCIsIGVycm9yXSk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlcHNQYXJzZXIoZGVwcykge1xuICBpZiAoZGVwcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IGRlcHNTdHJpbmcgPSBkZXBzLm1hcCgoZGVwKSA9PiBgJyR7ZGVwfSdgKS50b1N0cmluZygpO1xuICByZXR1cm4gYGltcG9ydFNjcmlwdHMoJHtkZXBzU3RyaW5nfSlgO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrZXJCbG9iVXJsKGZuLCBkZXBzKSB7XG4gIGNvbnN0IGJsb2JDb2RlID0gYCR7ZGVwc1BhcnNlcihkZXBzKX07IG9ubWVzc2FnZT0oJHtqb2JSdW5uZXJ9KSgke2ZufSlgO1xuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Jsb2JDb2RlXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiIH0pO1xuICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICByZXR1cm4gdXJsO1xufVxuXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXJGbihmbiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBkZXBlbmRlbmNpZXMgPSBbXSxcbiAgICB0aW1lb3V0LFxuICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHdvcmtlciA9IHJlZigpO1xuICBjb25zdCB3b3JrZXJTdGF0dXMgPSByZWYoXCJQRU5ESU5HXCIpO1xuICBjb25zdCBwcm9taXNlID0gcmVmKHt9KTtcbiAgY29uc3QgdGltZW91dElkID0gcmVmKCk7XG4gIGNvbnN0IHdvcmtlclRlcm1pbmF0ZSA9IChzdGF0dXMgPSBcIlBFTkRJTkdcIikgPT4ge1xuICAgIGlmICh3b3JrZXIudmFsdWUgJiYgd29ya2VyLnZhbHVlLl91cmwgJiYgd2luZG93KSB7XG4gICAgICB3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlci52YWx1ZS5fdXJsKTtcbiAgICAgIHByb21pc2UudmFsdWUgPSB7fTtcbiAgICAgIHdvcmtlci52YWx1ZSA9IHZvaWQgMDtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkLnZhbHVlKTtcbiAgICAgIHdvcmtlclN0YXR1cy52YWx1ZSA9IHN0YXR1cztcbiAgICB9XG4gIH07XG4gIHdvcmtlclRlcm1pbmF0ZSgpO1xuICB0cnlPblNjb3BlRGlzcG9zZSh3b3JrZXJUZXJtaW5hdGUpO1xuICBjb25zdCBnZW5lcmF0ZVdvcmtlciA9ICgpID0+IHtcbiAgICBjb25zdCBibG9iVXJsID0gY3JlYXRlV29ya2VyQmxvYlVybChmbiwgZGVwZW5kZW5jaWVzKTtcbiAgICBjb25zdCBuZXdXb3JrZXIgPSBuZXcgV29ya2VyKGJsb2JVcmwpO1xuICAgIG5ld1dvcmtlci5fdXJsID0gYmxvYlVybDtcbiAgICBuZXdXb3JrZXIub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzb2x2ZSA9ICgpID0+IHtcbiAgICAgIH0sIHJlamVjdCA9ICgpID0+IHtcbiAgICAgIH0gfSA9IHByb21pc2UudmFsdWU7XG4gICAgICBjb25zdCBbc3RhdHVzLCByZXN1bHRdID0gZS5kYXRhO1xuICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBcIlNVQ0NFU1NcIjpcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgd29ya2VyVGVybWluYXRlKHN0YXR1cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdCk7XG4gICAgICAgICAgd29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcbiAgICBuZXdXb3JrZXIub25lcnJvciA9IChlKSA9PiB7XG4gICAgICBjb25zdCB7IHJlamVjdCA9ICgpID0+IHtcbiAgICAgIH0gfSA9IHByb21pc2UudmFsdWU7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgICB3b3JrZXJUZXJtaW5hdGUoXCJFUlJPUlwiKTtcbiAgICB9O1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICB0aW1lb3V0SWQudmFsdWUgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiB3b3JrZXJUZXJtaW5hdGUoXCJUSU1FT1VUX0VYUElSRURcIiksXG4gICAgICAgIHRpbWVvdXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXdXb3JrZXI7XG4gIH07XG4gIGNvbnN0IGNhbGxXb3JrZXIgPSAoLi4uZm5BcmdzKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcHJvbWlzZS52YWx1ZSA9IHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3RcbiAgICB9O1xuICAgIHdvcmtlci52YWx1ZSAmJiB3b3JrZXIudmFsdWUucG9zdE1lc3NhZ2UoW1suLi5mbkFyZ3NdXSk7XG4gICAgd29ya2VyU3RhdHVzLnZhbHVlID0gXCJSVU5OSU5HXCI7XG4gIH0pO1xuICBjb25zdCB3b3JrZXJGbiA9ICguLi5mbkFyZ3MpID0+IHtcbiAgICBpZiAod29ya2VyU3RhdHVzLnZhbHVlID09PSBcIlJVTk5JTkdcIikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJbdXNlV2ViV29ya2VyRm5dIFlvdSBjYW4gb25seSBydW4gb25lIGluc3RhbmNlIG9mIHRoZSB3b3JrZXIgYXQgYSB0aW1lLlwiXG4gICAgICApO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgfVxuICAgIHdvcmtlci52YWx1ZSA9IGdlbmVyYXRlV29ya2VyKCk7XG4gICAgcmV0dXJuIGNhbGxXb3JrZXIoLi4uZm5BcmdzKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICB3b3JrZXJGbixcbiAgICB3b3JrZXJTdGF0dXMsXG4gICAgd29ya2VyVGVybWluYXRlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVdpbmRvd0ZvY3VzKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IHdpbmRvdyA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG4gIGlmICghd2luZG93KVxuICAgIHJldHVybiByZWYoZmFsc2UpO1xuICBjb25zdCBmb2N1c2VkID0gcmVmKHdpbmRvdy5kb2N1bWVudC5oYXNGb2N1cygpKTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiYmx1clwiLCAoKSA9PiB7XG4gICAgZm9jdXNlZC52YWx1ZSA9IGZhbHNlO1xuICB9KTtcbiAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwiZm9jdXNcIiwgKCkgPT4ge1xuICAgIGZvY3VzZWQudmFsdWUgPSB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIGZvY3VzZWQ7XG59XG5cbmZ1bmN0aW9uIHVzZVdpbmRvd1Njcm9sbChvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB3aW5kb3cgPSBkZWZhdWx0V2luZG93LCBiZWhhdmlvciA9IFwiYXV0b1wiIH0gPSBvcHRpb25zO1xuICBpZiAoIXdpbmRvdykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiByZWYoMCksXG4gICAgICB5OiByZWYoMClcbiAgICB9O1xuICB9XG4gIGNvbnN0IGludGVybmFsWCA9IHJlZih3aW5kb3cuc2Nyb2xsWCk7XG4gIGNvbnN0IGludGVybmFsWSA9IHJlZih3aW5kb3cuc2Nyb2xsWSk7XG4gIGNvbnN0IHggPSBjb21wdXRlZCh7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGludGVybmFsWC52YWx1ZTtcbiAgICB9LFxuICAgIHNldCh4Mikge1xuICAgICAgc2Nyb2xsVG8oeyBsZWZ0OiB4MiwgYmVoYXZpb3IgfSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgeSA9IGNvbXB1dGVkKHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxZLnZhbHVlO1xuICAgIH0sXG4gICAgc2V0KHkyKSB7XG4gICAgICBzY3JvbGxUbyh7IHRvcDogeTIsIGJlaGF2aW9yIH0pO1xuICAgIH1cbiAgfSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIoXG4gICAgd2luZG93LFxuICAgIFwic2Nyb2xsXCIsXG4gICAgKCkgPT4ge1xuICAgICAgaW50ZXJuYWxYLnZhbHVlID0gd2luZG93LnNjcm9sbFg7XG4gICAgICBpbnRlcm5hbFkudmFsdWUgPSB3aW5kb3cuc2Nyb2xsWTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufVxuXG5mdW5jdGlvbiB1c2VXaW5kb3dTaXplKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2luZG93ID0gZGVmYXVsdFdpbmRvdyxcbiAgICBpbml0aWFsV2lkdGggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgaW5pdGlhbEhlaWdodCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBsaXN0ZW5PcmllbnRhdGlvbiA9IHRydWUsXG4gICAgaW5jbHVkZVNjcm9sbGJhciA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHdpZHRoID0gcmVmKGluaXRpYWxXaWR0aCk7XG4gIGNvbnN0IGhlaWdodCA9IHJlZihpbml0aWFsSGVpZ2h0KTtcbiAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgIGlmICh3aW5kb3cpIHtcbiAgICAgIGlmIChpbmNsdWRlU2Nyb2xsYmFyKSB7XG4gICAgICAgIHdpZHRoLnZhbHVlID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIGhlaWdodC52YWx1ZSA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZHRoLnZhbHVlID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgaGVpZ2h0LnZhbHVlID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB1cGRhdGUoKTtcbiAgdHJ5T25Nb3VudGVkKHVwZGF0ZSk7XG4gIHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gIGlmIChsaXN0ZW5PcmllbnRhdGlvbikge1xuICAgIGNvbnN0IG1hdGNoZXMgPSB1c2VNZWRpYVF1ZXJ5KFwiKG9yaWVudGF0aW9uOiBwb3J0cmFpdClcIik7XG4gICAgd2F0Y2gobWF0Y2hlcywgKCkgPT4gdXBkYXRlKCkpO1xuICB9XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbn1cblxuZXhwb3J0IHsgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwLCBTdG9yYWdlU2VyaWFsaXplcnMsIFRyYW5zaXRpb25QcmVzZXRzLCBjb21wdXRlZEFzeW5jIGFzIGFzeW5jQ29tcHV0ZWQsIGJyZWFrcG9pbnRzQW50RGVzaWduLCBicmVha3BvaW50c0Jvb3RzdHJhcFY1LCBicmVha3BvaW50c01hc3RlckNzcywgYnJlYWtwb2ludHNQcmltZUZsZXgsIGJyZWFrcG9pbnRzUXVhc2FyLCBicmVha3BvaW50c1NlbWF0aWMsIGJyZWFrcG9pbnRzVGFpbHdpbmQsIGJyZWFrcG9pbnRzVnVldGlmeSwgYnJlYWtwb2ludHNWdWV0aWZ5VjIsIGJyZWFrcG9pbnRzVnVldGlmeVYzLCBjbG9uZUZuSlNPTiwgY29tcHV0ZWRBc3luYywgY29tcHV0ZWRJbmplY3QsIGNyZWF0ZUZldGNoLCBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlLCBjcmVhdGVUZW1wbGF0ZVByb21pc2UsIGNyZWF0ZVVucmVmRm4sIGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIGRlZmF1bHREb2N1bWVudCwgZGVmYXVsdExvY2F0aW9uLCBkZWZhdWx0TmF2aWdhdG9yLCBkZWZhdWx0V2luZG93LCBleGVjdXRlVHJhbnNpdGlvbiwgZm9ybWF0VGltZUFnbywgZ2V0U1NSSGFuZGxlciwgbWFwR2FtZXBhZFRvWGJveDM2MENvbnRyb2xsZXIsIG9uQ2xpY2tPdXRzaWRlLCBvbktleURvd24sIG9uS2V5UHJlc3NlZCwgb25LZXlTdHJva2UsIG9uS2V5VXAsIG9uTG9uZ1ByZXNzLCBvblN0YXJ0VHlwaW5nLCBzZXRTU1JIYW5kbGVyLCB0ZW1wbGF0ZVJlZiwgdW5yZWZFbGVtZW50LCB1c2VBY3RpdmVFbGVtZW50LCB1c2VBbmltYXRlLCB1c2VBc3luY1F1ZXVlLCB1c2VBc3luY1N0YXRlLCB1c2VCYXNlNjQsIHVzZUJhdHRlcnksIHVzZUJsdWV0b290aCwgdXNlQnJlYWtwb2ludHMsIHVzZUJyb2FkY2FzdENoYW5uZWwsIHVzZUJyb3dzZXJMb2NhdGlvbiwgdXNlQ2FjaGVkLCB1c2VDbGlwYm9hcmQsIHVzZUNsaXBib2FyZEl0ZW1zLCB1c2VDbG9uZWQsIHVzZUNvbG9yTW9kZSwgdXNlQ29uZmlybURpYWxvZywgdXNlQ3NzVmFyLCB1c2VDdXJyZW50RWxlbWVudCwgdXNlQ3ljbGVMaXN0LCB1c2VEYXJrLCB1c2VEZWJvdW5jZWRSZWZIaXN0b3J5LCB1c2VEZXZpY2VNb3Rpb24sIHVzZURldmljZU9yaWVudGF0aW9uLCB1c2VEZXZpY2VQaXhlbFJhdGlvLCB1c2VEZXZpY2VzTGlzdCwgdXNlRGlzcGxheU1lZGlhLCB1c2VEb2N1bWVudFZpc2liaWxpdHksIHVzZURyYWdnYWJsZSwgdXNlRHJvcFpvbmUsIHVzZUVsZW1lbnRCb3VuZGluZywgdXNlRWxlbWVudEJ5UG9pbnQsIHVzZUVsZW1lbnRIb3ZlciwgdXNlRWxlbWVudFNpemUsIHVzZUVsZW1lbnRWaXNpYmlsaXR5LCB1c2VFdmVudEJ1cywgdXNlRXZlbnRMaXN0ZW5lciwgdXNlRXZlbnRTb3VyY2UsIHVzZUV5ZURyb3BwZXIsIHVzZUZhdmljb24sIHVzZUZldGNoLCB1c2VGaWxlRGlhbG9nLCB1c2VGaWxlU3lzdGVtQWNjZXNzLCB1c2VGb2N1cywgdXNlRm9jdXNXaXRoaW4sIHVzZUZwcywgdXNlRnVsbHNjcmVlbiwgdXNlR2FtZXBhZCwgdXNlR2VvbG9jYXRpb24sIHVzZUlkbGUsIHVzZUltYWdlLCB1c2VJbmZpbml0ZVNjcm9sbCwgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIsIHVzZUtleU1vZGlmaWVyLCB1c2VMb2NhbFN0b3JhZ2UsIHVzZU1hZ2ljS2V5cywgdXNlTWFudWFsUmVmSGlzdG9yeSwgdXNlTWVkaWFDb250cm9scywgdXNlTWVkaWFRdWVyeSwgdXNlTWVtb2l6ZSwgdXNlTWVtb3J5LCB1c2VNb3VudGVkLCB1c2VNb3VzZSwgdXNlTW91c2VJbkVsZW1lbnQsIHVzZU1vdXNlUHJlc3NlZCwgdXNlTXV0YXRpb25PYnNlcnZlciwgdXNlTmF2aWdhdG9yTGFuZ3VhZ2UsIHVzZU5ldHdvcmssIHVzZU5vdywgdXNlT2JqZWN0VXJsLCB1c2VPZmZzZXRQYWdpbmF0aW9uLCB1c2VPbmxpbmUsIHVzZVBhZ2VMZWF2ZSwgdXNlUGFyYWxsYXgsIHVzZVBhcmVudEVsZW1lbnQsIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIsIHVzZVBlcm1pc3Npb24sIHVzZVBvaW50ZXIsIHVzZVBvaW50ZXJMb2NrLCB1c2VQb2ludGVyU3dpcGUsIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lLCB1c2VQcmVmZXJyZWRDb250cmFzdCwgdXNlUHJlZmVycmVkRGFyaywgdXNlUHJlZmVycmVkTGFuZ3VhZ2VzLCB1c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uLCB1c2VQcmV2aW91cywgdXNlUmFmRm4sIHVzZVJlZkhpc3RvcnksIHVzZVJlc2l6ZU9ic2VydmVyLCB1c2VTY3JlZW5PcmllbnRhdGlvbiwgdXNlU2NyZWVuU2FmZUFyZWEsIHVzZVNjcmlwdFRhZywgdXNlU2Nyb2xsLCB1c2VTY3JvbGxMb2NrLCB1c2VTZXNzaW9uU3RvcmFnZSwgdXNlU2hhcmUsIHVzZVNvcnRlZCwgdXNlU3BlZWNoUmVjb2duaXRpb24sIHVzZVNwZWVjaFN5bnRoZXNpcywgdXNlU3RlcHBlciwgdXNlU3RvcmFnZSwgdXNlU3RvcmFnZUFzeW5jLCB1c2VTdHlsZVRhZywgdXNlU3VwcG9ydGVkLCB1c2VTd2lwZSwgdXNlVGVtcGxhdGVSZWZzTGlzdCwgdXNlVGV4dERpcmVjdGlvbiwgdXNlVGV4dFNlbGVjdGlvbiwgdXNlVGV4dGFyZWFBdXRvc2l6ZSwgdXNlVGhyb3R0bGVkUmVmSGlzdG9yeSwgdXNlVGltZUFnbywgdXNlVGltZW91dFBvbGwsIHVzZVRpbWVzdGFtcCwgdXNlVGl0bGUsIHVzZVRyYW5zaXRpb24sIHVzZVVybFNlYXJjaFBhcmFtcywgdXNlVXNlck1lZGlhLCB1c2VWTW9kZWwsIHVzZVZNb2RlbHMsIHVzZVZpYnJhdGUsIHVzZVZpcnR1YWxMaXN0LCB1c2VXYWtlTG9jaywgdXNlV2ViTm90aWZpY2F0aW9uLCB1c2VXZWJTb2NrZXQsIHVzZVdlYldvcmtlciwgdXNlV2ViV29ya2VyRm4sIHVzZVdpbmRvd0ZvY3VzLCB1c2VXaW5kb3dTY3JvbGwsIHVzZVdpbmRvd1NpemUgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxNQUFNLG9CQUFvQixVQUFVLFNBQVMsVUFBVSxVQUFVLG1CQUFtQixPQUFPLGNBQWMsWUFBWSxnQkFBZ0IsT0FBTyxrQkFBa0IsZUFBZSx3QkFBd0IsY0FBYyxlQUFlLE9BQU8saUJBQWlCLFlBQVkscUJBQXFCLFdBQVcsZ0JBQWdCLGdCQUFnQixnQkFBZ0IscUJBQXFCLGNBQWMsUUFBUSxlQUFlLGNBQWMsUUFBUSxnQkFBZ0IsZUFBZSxlQUFlLE9BQU8sU0FBUyxZQUFZLGdCQUFnQixpQkFBaUIsb0JBQW9CLFVBQVUsT0FBTyxnQkFBZ0I7QUFDL2tCLGNBQWM7QUFDZCxTQUFTLE9BQU8sS0FBSyxZQUFZLGFBQWEsVUFBVSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsR0FBRyxpQkFBaUIsaUJBQWlCLFVBQVUsT0FBTyxvQkFB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QixVQUFVLGdCQUFnQixRQUFRLGVBQWUsWUFBWSxnQkFBZ0IsU0FBUyxVQUFVLG1CQUFtQix5QkFBeUIsZ0JBQWdCLGlCQUFpQixjQUFjLHFCQUFxQixrQkFBa0IsZUFBZSxZQUFZLFdBQVcsWUFBWSxVQUFVLG1CQUFtQixpQkFBaUIscUJBQXFCLHNCQUFzQixZQUFZLFFBQVEsY0FBYyxxQkFBcUIsV0FBVyxjQUFjLGFBQWEsa0JBQWtCLHdCQUF3QixlQUFlLFlBQVksZ0JBQWdCLGlCQUFpQix5QkFBeUIsc0JBQXNCLGtCQUFrQix1QkFBdUIsMkJBQTJCLGFBQWEsVUFBVSxlQUFlLG1CQUFtQixzQkFBc0IsbUJBQW1CLGNBQWMsV0FBVyxlQUFlLG1CQUFtQixVQUFVLFdBQVcsc0JBQXNCLG9CQUFvQixZQUFZLFlBQVksaUJBQWlCLGFBQWEsY0FBYyxVQUFVLHFCQUFxQixrQkFBa0Isa0JBQWtCLHFCQUFxQix3QkFBd0IsWUFBWSxnQkFBZ0IsY0FBYyxVQUFVLGVBQWUsb0JBQW9CLGNBQWMsV0FBVyxZQUFZLFlBQVksZ0JBQWdCLGFBQWEsb0JBQW9CLGNBQWMsY0FBYyxnQkFBZ0IsZ0JBQWdCLGlCQUFpQjsiLCJuYW1lcyI6WyJldmVudHMiLCJ3aW5kb3ciLCJkb2N1bWVudCIsInRpbWVzdGFtcCIsImdldFZhbHVlIiwiZGVmYXVsdHMiLCJzZXQiLCJvblVwZGF0ZWQiLCJwcmV2ZW50RGVmYXVsdCIsInNjcm9sbFRvIiwia2V5cyIsImlzUmVhZG9ubHkiXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdfQ==