obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
175 lines (172 loc) • 20.2 kB
JavaScript
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
(function initCjs(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;const originalRequire=require;if(originalRequire&&!originalRequire.__isPatched){require=Object.assign(id=>requirePatched(id),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault(){return extractDefault},process(){const browserProcess={browser:true,cwd(){return"/"},env:{},platform:"android"};return browserProcess}};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&"default"in module?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id){const module=originalRequire?.(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Debug_exports = {};
__export(Debug_exports, {
enableLibraryDebuggers: () => enableLibraryDebuggers,
getDebugController: () => getDebugController,
getDebugger: () => getDebugger,
getLibDebugger: () => getLibDebugger,
printWithStackTrace: () => printWithStackTrace,
showInitialDebugMessage: () => showInitialDebugMessage
});
module.exports = __toCommonJS(Debug_exports);
var import_debug = __toESM(__extractDefault(require('debug')), 1);
var import_Error = require('./Error.cjs');
var import_Library = require('./Library.cjs');
var import_App = require('./obsidian/App.cjs');
var import_PluginId = require('./obsidian/Plugin/PluginId.cjs');
const NAMESPACE_SEPARATOR = ",";
const NEGATED_NAMESPACE_PREFIX = "-";
function enableLibraryDebuggers() {
enableNamespaces([import_Library.LIBRARY_NAME, `${import_Library.LIBRARY_NAME}:*`]);
}
function getDebugController() {
return {
disable: disableNamespaces,
enable: enableNamespaces,
get: getNamespaces,
set: setNamespaces
};
}
function getDebugger(namespace, framesToSkip = 0) {
const key = `${namespace}:${String(framesToSkip)}`;
const debuggersMap = (0, import_App.getObsidianDevUtilsState)(null, "debuggers", /* @__PURE__ */ new Map()).value;
let debuggerEx = debuggersMap.get(key);
if (!debuggerEx) {
debuggerEx = getSharedDebugLibInstance()(namespace);
debuggerEx.log = (message, ...args) => {
logWithCaller(namespace, framesToSkip, message, ...args);
};
debuggersMap.set(key, debuggerEx);
}
return debuggerEx;
}
function getLibDebugger(namespace) {
const pluginId = (0, import_PluginId.getPluginId)();
const prefix = pluginId === import_PluginId.NO_PLUGIN_ID_INITIALIZED ? "" : `${pluginId}:`;
return getDebugger(`${prefix}${import_Library.LIBRARY_NAME}:${namespace}`);
}
function printWithStackTrace(debuggerInstance, stackTrace, message, ...args) {
if (!isInObsidian()) {
debuggerInstance(message, ...args);
return;
}
debuggerInstance(message, ...args, "\n\n---\nContext stack trace:\n", makeStackTraceError(stackTrace));
}
function showInitialDebugMessage(pluginId) {
const isEnabled = getSharedDebugLibInstance().enabled(pluginId);
const state = isEnabled ? "enabled" : "disabled";
const changeAction = isEnabled ? "disable" : "enable";
const namespaces = getNamespaces();
setNamespaces(pluginId);
getDebugger(pluginId)(
`Debug messages for plugin ${pluginId} are ${state}. See https://github.com/mnaoumov/obsidian-dev-utils/blob/main/docs/debugging.md how to ${changeAction} them.`
);
setNamespaces(namespaces);
}
function disableNamespaces(namespaces) {
const set = new Set(getNamespaces());
for (const namespace of toArray(namespaces)) {
if (namespace.startsWith(NEGATED_NAMESPACE_PREFIX)) {
continue;
}
const negatedNamespace = NEGATED_NAMESPACE_PREFIX + namespace;
if (set.has(namespace)) {
set.delete(namespace);
}
set.add(negatedNamespace);
}
setNamespaces(Array.from(set));
}
function enableNamespaces(namespaces) {
const set = new Set(getNamespaces());
for (const namespace of toArray(namespaces)) {
if (!namespace.startsWith(NEGATED_NAMESPACE_PREFIX)) {
const negatedNamespace = NEGATED_NAMESPACE_PREFIX + namespace;
if (set.has(negatedNamespace)) {
set.delete(negatedNamespace);
}
}
set.add(namespace);
}
setNamespaces(Array.from(set));
}
function getNamespaces() {
return toArray(getSharedDebugLibInstance().load() ?? "");
}
function getSharedDebugLibInstance() {
if (typeof window === "undefined") {
return import_debug.default;
}
return (0, import_App.getObsidianDevUtilsState)(null, "debug", import_debug.default).value;
}
function isInObsidian() {
return typeof window !== "undefined";
}
function logWithCaller(namespace, framesToSkip, message, ...args) {
if (!getSharedDebugLibInstance().enabled(namespace)) {
return;
}
if (!isInObsidian()) {
console.debug(message, ...args);
return;
}
const CALLER_LINE_INDEX = 4;
const stackLines = new Error().stack?.split("\n") ?? [];
stackLines.splice(0, CALLER_LINE_INDEX + framesToSkip);
console.debug(message, ...args, "\n\n---\nLogger stack trace:\n", makeStackTraceError(stackLines.join("\n")));
}
function makeStackTraceError(stackTrace) {
return new import_Error.CustomStackTraceError(
"Debug mode: intentional placeholder error. See https://github.com/mnaoumov/obsidian-dev-utils/blob/main/docs/debugging.md.",
stackTrace,
void 0
);
}
function setNamespaces(namespaces) {
getSharedDebugLibInstance().enable(toArray(namespaces).join(NAMESPACE_SEPARATOR));
}
function toArray(namespaces) {
return typeof namespaces === "string" ? namespaces.split(NAMESPACE_SEPARATOR).filter(Boolean) : namespaces.flatMap(toArray);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
enableLibraryDebuggers,
getDebugController,
getDebugger,
getLibDebugger,
printWithStackTrace,
showInitialDebugMessage
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0RlYnVnLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBkZWJ1Z2dpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z2dlciB9IGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z0NvbnRyb2xsZXIgfSBmcm9tICcuL0RlYnVnQ29udHJvbGxlci50cyc7XG5cbmltcG9ydCB7IEN1c3RvbVN0YWNrVHJhY2VFcnJvciB9IGZyb20gJy4vRXJyb3IudHMnO1xuaW1wb3J0IHsgTElCUkFSWV9OQU1FIH0gZnJvbSAnLi9MaWJyYXJ5LnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vb2JzaWRpYW4vQXBwLnRzJztcbmltcG9ydCB7XG4gIGdldFBsdWdpbklkLFxuICBOT19QTFVHSU5fSURfSU5JVElBTElaRURcbn0gZnJvbSAnLi9vYnNpZGlhbi9QbHVnaW4vUGx1Z2luSWQudHMnO1xuXG5jb25zdCBOQU1FU1BBQ0VfU0VQQVJBVE9SID0gJywnO1xuY29uc3QgTkVHQVRFRF9OQU1FU1BBQ0VfUFJFRklYID0gJy0nO1xuXG4vKipcbiAqIEVuYWJsZXMgdGhlIGRlYnVnZ2VycyBmb3IgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVMaWJyYXJ5RGVidWdnZXJzKCk6IHZvaWQge1xuICBlbmFibGVOYW1lc3BhY2VzKFtMSUJSQVJZX05BTUUsIGAke0xJQlJBUllfTkFNRX06KmBdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVidWcgY29udHJvbGxlci5cbiAqXG4gKiBAcmV0dXJucyBBIGRlYnVnIGNvbnRyb2xsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWJ1Z0NvbnRyb2xsZXIoKTogRGVidWdDb250cm9sbGVyIHtcbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlOiBkaXNhYmxlTmFtZXNwYWNlcyxcbiAgICBlbmFibGU6IGVuYWJsZU5hbWVzcGFjZXMsXG4gICAgZ2V0OiBnZXROYW1lc3BhY2VzLFxuICAgIHNldDogc2V0TmFtZXNwYWNlc1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZWJ1Z2dlciBpbnN0YW5jZSB3aXRoIGEgbG9nIGZ1bmN0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIGNhbGxlcidzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBkZWJ1Z2dlciBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmcmFtZXNUb1NraXAgLSBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0byBza2lwIGluIHRoZSBzdGFjayB0cmFjZS5cbiAqIEByZXR1cm5zIEEgZGVidWdnZXIgaW5zdGFuY2Ugd2l0aCBhIGxvZyBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBjYWxsZXIncyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdnZXIobmFtZXNwYWNlOiBzdHJpbmcsIGZyYW1lc1RvU2tpcCA9IDApOiBEZWJ1Z2dlciB7XG4gIGNvbnN0IGtleSA9IGAke25hbWVzcGFjZX06JHtTdHJpbmcoZnJhbWVzVG9Ta2lwKX1gO1xuICBjb25zdCBkZWJ1Z2dlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUobnVsbCwgJ2RlYnVnZ2VycycsIG5ldyBNYXA8c3RyaW5nLCBEZWJ1Z2dlcj4oKSkudmFsdWU7XG4gIGxldCBkZWJ1Z2dlckV4ID0gZGVidWdnZXJzTWFwLmdldChrZXkpO1xuICBpZiAoIWRlYnVnZ2VyRXgpIHtcbiAgICBkZWJ1Z2dlckV4ID0gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpKG5hbWVzcGFjZSk7XG4gICAgZGVidWdnZXJFeC5sb2cgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICAgIGxvZ1dpdGhDYWxsZXIobmFtZXNwYWNlLCBmcmFtZXNUb1NraXAsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBkZWJ1Z2dlcnNNYXAuc2V0KGtleSwgZGVidWdnZXJFeCk7XG4gIH1cblxuICByZXR1cm4gZGVidWdnZXJFeDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVidWdnZXIgaW5zdGFuY2UgZm9yIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgZGVidWdnZXIgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIGRlYnVnZ2VyIGluc3RhbmNlIGZvciB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2AgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpYkRlYnVnZ2VyKG5hbWVzcGFjZTogc3RyaW5nKTogRGVidWdnZXIge1xuICBjb25zdCBwbHVnaW5JZCA9IGdldFBsdWdpbklkKCk7XG4gIGNvbnN0IHByZWZpeCA9IHBsdWdpbklkID09PSBOT19QTFVHSU5fSURfSU5JVElBTElaRUQgPyAnJyA6IGAke3BsdWdpbklkfTpgO1xuICByZXR1cm4gZ2V0RGVidWdnZXIoYCR7cHJlZml4fSR7TElCUkFSWV9OQU1FfToke25hbWVzcGFjZX1gKTtcbn1cblxuLyoqXG4gKiBQcmludHMgYSBtZXNzYWdlIHdpdGggYSBzdGFjayB0cmFjZS5cbiAqXG4gKiBAcGFyYW0gZGVidWdnZXJJbnN0YW5jZSAtIFRoZSBkZWJ1Z2dlciBpbnN0YW5jZS5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIHRvIHByaW50LlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBwcmludC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwcmludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50V2l0aFN0YWNrVHJhY2UoZGVidWdnZXJJbnN0YW5jZTogRGVidWdnZXIsIHN0YWNrVHJhY2U6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgaWYgKCFpc0luT2JzaWRpYW4oKSkge1xuICAgIGRlYnVnZ2VySW5zdGFuY2UobWVzc2FnZSwgLi4uYXJncyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGVidWdnZXJJbnN0YW5jZShtZXNzYWdlLCAuLi5hcmdzLCAnXFxuXFxuLS0tXFxuQ29udGV4dCBzdGFjayB0cmFjZTpcXG4nLCBtYWtlU3RhY2tUcmFjZUVycm9yKHN0YWNrVHJhY2UpKTtcbn1cblxuLyoqXG4gKiBTaG93cyBhbiBpbml0aWFsIGRlYnVnIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dJbml0aWFsRGVidWdNZXNzYWdlKHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgaXNFbmFibGVkID0gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZWQocGx1Z2luSWQpO1xuICBjb25zdCBzdGF0ZSA9IGlzRW5hYmxlZCA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCc7XG4gIGNvbnN0IGNoYW5nZUFjdGlvbiA9IGlzRW5hYmxlZCA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xuICBjb25zdCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpO1xuICBzZXROYW1lc3BhY2VzKHBsdWdpbklkKTtcbiAgZ2V0RGVidWdnZXIocGx1Z2luSWQpKFxuICAgIGBEZWJ1ZyBtZXNzYWdlcyBmb3IgcGx1Z2luICR7cGx1Z2luSWR9IGFyZSAke3N0YXRlfS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvYmxvYi9tYWluL2RvY3MvZGVidWdnaW5nLm1kIGhvdyB0byAke2NoYW5nZUFjdGlvbn0gdGhlbS5gXG4gICk7XG4gIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmIChuYW1lc3BhY2Uuc3RhcnRzV2l0aChORUdBVEVEX05BTUVTUEFDRV9QUkVGSVgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICBpZiAoc2V0LmhhcyhuYW1lc3BhY2UpKSB7XG4gICAgICBzZXQuZGVsZXRlKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIHNldC5hZGQobmVnYXRlZE5hbWVzcGFjZSk7XG4gIH1cbiAgc2V0TmFtZXNwYWNlcyhBcnJheS5mcm9tKHNldCkpO1xufVxuXG5mdW5jdGlvbiBlbmFibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmICghbmFtZXNwYWNlLnN0YXJ0c1dpdGgoTkVHQVRFRF9OQU1FU1BBQ0VfUFJFRklYKSkge1xuICAgICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICAgIGlmIChzZXQuaGFzKG5lZ2F0ZWROYW1lc3BhY2UpKSB7XG4gICAgICAgIHNldC5kZWxldGUobmVnYXRlZE5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldC5hZGQobmFtZXNwYWNlKTtcbiAgfVxuICBzZXROYW1lc3BhY2VzKEFycmF5LmZyb20oc2V0KSk7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWVzcGFjZXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gdG9BcnJheShnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkubG9hZCgpID8/ICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpOiB0eXBlb2YgZGVidWcge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShudWxsLCAnZGVidWcnLCBkZWJ1ZykudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzSW5PYnNpZGlhbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBsb2dXaXRoQ2FsbGVyKG5hbWVzcGFjZTogc3RyaW5nLCBmcmFtZXNUb1NraXA6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgaWYgKCFnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkuZW5hYmxlZChuYW1lc3BhY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc0luT2JzaWRpYW4oKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsZXIgbGluZSBpbmRleCBpcyA0IGJlY2F1c2UgdGhlIGNhbGwgc3RhY2sgaXMgYXMgZm9sbG93czpcbiAgICpcbiAgICogMDogRXJyb3JcbiAgICogMTogICAgIGF0IGxvZ1dpdGhDYWxsZXIgKD86Pzo/KVxuICAgKiAyOiAgICAgYXQgZGVidWdJbnN0YW5jZS5sb2cgKD86Pzo/KVxuICAgKiAzOiAgICAgYXQgZGVidWcgKD86Pzo/KVxuICAgKiA0OiAgICAgYXQgZnVuY3Rpb25OYW1lIChwYXRoL3RvL2NhbGxlci5qczo/Oj8pXG4gICAqL1xuICBjb25zdCBDQUxMRVJfTElORV9JTkRFWCA9IDQ7XG5cbiAgY29uc3Qgc3RhY2tMaW5lcyA9IG5ldyBFcnJvcigpLnN0YWNrPy5zcGxpdCgnXFxuJykgPz8gW107XG4gIHN0YWNrTGluZXMuc3BsaWNlKDAsIENBTExFUl9MSU5FX0lOREVYICsgZnJhbWVzVG9Ta2lwKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UsIC4uLmFyZ3MsICdcXG5cXG4tLS1cXG5Mb2dnZXIgc3RhY2sgdHJhY2U6XFxuJywgbWFrZVN0YWNrVHJhY2VFcnJvcihzdGFja0xpbmVzLmpvaW4oJ1xcbicpKSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VTdGFja1RyYWNlRXJyb3Ioc3RhY2tUcmFjZTogc3RyaW5nKTogQ3VzdG9tU3RhY2tUcmFjZUVycm9yIHtcbiAgcmV0dXJuIG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3IoXG4gICAgJ0RlYnVnIG1vZGU6IGludGVudGlvbmFsIHBsYWNlaG9sZGVyIGVycm9yLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWRldi11dGlscy9ibG9iL21haW4vZG9jcy9kZWJ1Z2dpbmcubWQuJyxcbiAgICBzdGFja1RyYWNlLFxuICAgIHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIG5hbWVzcGFjZXMgdG8gZW5hYmxlLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gVGhlIG5hbWVzcGFjZXMgdG8gZW5hYmxlLlxuICovXG5mdW5jdGlvbiBzZXROYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGdldFNoYXJlZERlYnVnTGliSW5zdGFuY2UoKS5lbmFibGUodG9BcnJheShuYW1lc3BhY2VzKS5qb2luKE5BTUVTUEFDRV9TRVBBUkFUT1IpKTtcbn1cblxuZnVuY3Rpb24gdG9BcnJheShuYW1lc3BhY2VzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMuc3BsaXQoTkFNRVNQQUNFX1NFUEFSQVRPUikuZmlsdGVyKEJvb2xlYW4pIDogbmFtZXNwYWNlcy5mbGF0TWFwKHRvQXJyYXkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLG1CQUFrQjtBQUlsQixtQkFBc0M7QUFDdEMscUJBQTZCO0FBQzdCLGlCQUF5QztBQUN6QyxzQkFHTztBQUVQLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sMkJBQTJCO0FBSzFCLFNBQVMseUJBQStCO0FBQzdDLG1CQUFpQixDQUFDLDZCQUFjLEdBQUcsMkJBQVksSUFBSSxDQUFDO0FBQ3REO0FBT08sU0FBUyxxQkFBc0M7QUFDcEQsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQ1A7QUFDRjtBQVNPLFNBQVMsWUFBWSxXQUFtQixlQUFlLEdBQWE7QUFDekUsUUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sWUFBWSxDQUFDO0FBQ2hELFFBQU0sbUJBQWUscUNBQXlCLE1BQU0sYUFBYSxvQkFBSSxJQUFzQixDQUFDLEVBQUU7QUFDOUYsTUFBSSxhQUFhLGFBQWEsSUFBSSxHQUFHO0FBQ3JDLE1BQUksQ0FBQyxZQUFZO0FBQ2YsaUJBQWEsMEJBQTBCLEVBQUUsU0FBUztBQUNsRCxlQUFXLE1BQU0sQ0FBQyxZQUFvQixTQUEwQjtBQUM5RCxvQkFBYyxXQUFXLGNBQWMsU0FBUyxHQUFHLElBQUk7QUFBQSxJQUN6RDtBQUVBLGlCQUFhLElBQUksS0FBSyxVQUFVO0FBQUEsRUFDbEM7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLGVBQWUsV0FBNkI7QUFDMUQsUUFBTSxlQUFXLDZCQUFZO0FBQzdCLFFBQU0sU0FBUyxhQUFhLDJDQUEyQixLQUFLLEdBQUcsUUFBUTtBQUN2RSxTQUFPLFlBQVksR0FBRyxNQUFNLEdBQUcsMkJBQVksSUFBSSxTQUFTLEVBQUU7QUFDNUQ7QUFVTyxTQUFTLG9CQUFvQixrQkFBNEIsWUFBb0IsWUFBb0IsTUFBdUI7QUFDN0gsTUFBSSxDQUFDLGFBQWEsR0FBRztBQUNuQixxQkFBaUIsU0FBUyxHQUFHLElBQUk7QUFDakM7QUFBQSxFQUNGO0FBRUEsbUJBQWlCLFNBQVMsR0FBRyxNQUFNLG1DQUFtQyxvQkFBb0IsVUFBVSxDQUFDO0FBQ3ZHO0FBT08sU0FBUyx3QkFBd0IsVUFBd0I7QUFDOUQsUUFBTSxZQUFZLDBCQUEwQixFQUFFLFFBQVEsUUFBUTtBQUM5RCxRQUFNLFFBQVEsWUFBWSxZQUFZO0FBQ3RDLFFBQU0sZUFBZSxZQUFZLFlBQVk7QUFDN0MsUUFBTSxhQUFhLGNBQWM7QUFDakMsZ0JBQWMsUUFBUTtBQUN0QixjQUFZLFFBQVE7QUFBQSxJQUNsQiw2QkFBNkIsUUFBUSxRQUFRLEtBQUssMkZBQTJGLFlBQVk7QUFBQSxFQUMzSjtBQUNBLGdCQUFjLFVBQVU7QUFDMUI7QUFFQSxTQUFTLGtCQUFrQixZQUFxQztBQUM5RCxRQUFNLE1BQU0sSUFBSSxJQUFJLGNBQWMsQ0FBQztBQUNuQyxhQUFXLGFBQWEsUUFBUSxVQUFVLEdBQUc7QUFDM0MsUUFBSSxVQUFVLFdBQVcsd0JBQXdCLEdBQUc7QUFDbEQ7QUFBQSxJQUNGO0FBQ0EsVUFBTSxtQkFBbUIsMkJBQTJCO0FBQ3BELFFBQUksSUFBSSxJQUFJLFNBQVMsR0FBRztBQUN0QixVQUFJLE9BQU8sU0FBUztBQUFBLElBQ3RCO0FBQ0EsUUFBSSxJQUFJLGdCQUFnQjtBQUFBLEVBQzFCO0FBQ0EsZ0JBQWMsTUFBTSxLQUFLLEdBQUcsQ0FBQztBQUMvQjtBQUVBLFNBQVMsaUJBQWlCLFlBQXFDO0FBQzdELFFBQU0sTUFBTSxJQUFJLElBQUksY0FBYyxDQUFDO0FBQ25DLGFBQVcsYUFBYSxRQUFRLFVBQVUsR0FBRztBQUMzQyxRQUFJLENBQUMsVUFBVSxXQUFXLHdCQUF3QixHQUFHO0FBQ25ELFlBQU0sbUJBQW1CLDJCQUEyQjtBQUNwRCxVQUFJLElBQUksSUFBSSxnQkFBZ0IsR0FBRztBQUM3QixZQUFJLE9BQU8sZ0JBQWdCO0FBQUEsTUFDN0I7QUFBQSxJQUNGO0FBQ0EsUUFBSSxJQUFJLFNBQVM7QUFBQSxFQUNuQjtBQUNBLGdCQUFjLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDL0I7QUFFQSxTQUFTLGdCQUEwQjtBQUNqQyxTQUFPLFFBQVEsMEJBQTBCLEVBQUUsS0FBSyxLQUFLLEVBQUU7QUFDekQ7QUFFQSxTQUFTLDRCQUEwQztBQUNqRCxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQ2pDLFdBQU8sYUFBQUE7QUFBQSxFQUNUO0FBQ0EsYUFBTyxxQ0FBeUIsTUFBTSxTQUFTLGFBQUFBLE9BQUssRUFBRTtBQUN4RDtBQUVBLFNBQVMsZUFBd0I7QUFDL0IsU0FBTyxPQUFPLFdBQVc7QUFDM0I7QUFFQSxTQUFTLGNBQWMsV0FBbUIsY0FBc0IsWUFBb0IsTUFBdUI7QUFDekcsTUFBSSxDQUFDLDBCQUEwQixFQUFFLFFBQVEsU0FBUyxHQUFHO0FBQ25EO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxhQUFhLEdBQUc7QUFFbkIsWUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJO0FBQzlCO0FBQUEsRUFDRjtBQVdBLFFBQU0sb0JBQW9CO0FBRTFCLFFBQU0sYUFBYSxJQUFJLE1BQU0sRUFBRSxPQUFPLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFDdEQsYUFBVyxPQUFPLEdBQUcsb0JBQW9CLFlBQVk7QUFHckQsVUFBUSxNQUFNLFNBQVMsR0FBRyxNQUFNLGtDQUFrQyxvQkFBb0IsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQzlHO0FBRUEsU0FBUyxvQkFBb0IsWUFBMkM7QUFDdEUsU0FBTyxJQUFJO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBT0EsU0FBUyxjQUFjLFlBQXFDO0FBQzFELDRCQUEwQixFQUFFLE9BQU8sUUFBUSxVQUFVLEVBQUUsS0FBSyxtQkFBbUIsQ0FBQztBQUNsRjtBQUVBLFNBQVMsUUFBUSxZQUF5QztBQUN4RCxTQUFPLE9BQU8sZUFBZSxXQUFXLFdBQVcsTUFBTSxtQkFBbUIsRUFBRSxPQUFPLE9BQU8sSUFBSSxXQUFXLFFBQVEsT0FBTztBQUM1SDsiLAogICJuYW1lcyI6IFsiZGVidWciXQp9Cg==