obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
83 lines (80 loc) • 12.7 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 initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
import { parentFolderPath } from "obsidian-typings/implementations";
import {
basename,
dirname,
extname,
join
} from "../Path.mjs";
import {
normalize,
replaceAll,
trimStart
} from "../String.mjs";
import {
getFile,
getFolder,
getFolderOrNull,
getPath
} from "./FileSystem.mjs";
async function getAttachmentFilePath(app, attachmentPathOrFile, notePathOrFile) {
const attachmentPath = getPath(app, attachmentPathOrFile);
const notePath = getPath(app, notePathOrFile);
const note = getFile(app, notePath, true);
const ext = extname(attachmentPath);
const fileName = basename(attachmentPath, ext);
const internalFn = app.vault.getAvailablePathForAttachments;
if (internalFn.isExtended) {
return internalFn(fileName, ext.slice(1), note, true);
}
return await getAvailablePathForAttachments(app, fileName, ext.slice(1), note, true);
}
async function getAttachmentFolderPath(app, notePathOrFile) {
return parentFolderPath(await getAttachmentFilePath(app, "DUMMY_FILE.pdf", notePathOrFile));
}
async function getAvailablePathForAttachments(app, attachmentFileName, attachmentExtension, noteFile, shouldSkipMissingAttachmentFolderCreation) {
let attachmentFolderPath = app.vault.getConfig("attachmentFolderPath");
const isCurrentFolder = attachmentFolderPath === "." || attachmentFolderPath === "./";
let relativePath = null;
if (attachmentFolderPath.startsWith("./")) {
relativePath = trimStart(attachmentFolderPath, "./");
}
if (isCurrentFolder) {
attachmentFolderPath = noteFile ? noteFile.parent?.path ?? "" : "";
} else if (relativePath) {
attachmentFolderPath = (noteFile ? noteFile.parent?.getParentPrefix() ?? "" : "") + relativePath;
}
attachmentFolderPath = normalize(normalizeSlashes(attachmentFolderPath));
attachmentFileName = normalize(normalizeSlashes(attachmentFileName));
let folder = getFolderOrNull(app, attachmentFolderPath, true);
if (!folder && relativePath) {
if (shouldSkipMissingAttachmentFolderCreation) {
folder = getFolder(app, attachmentFolderPath, true);
} else {
folder = await app.vault.createFolder(attachmentFolderPath);
}
}
const prefix = folder?.getParentPrefix() ?? "";
return app.vault.getAvailablePath(prefix + attachmentFileName, attachmentExtension);
}
async function hasOwnAttachmentFolder(app, path) {
const attachmentFolderPath = await getAttachmentFolderPath(app, path);
const dummyAttachmentFolderPath = await getAttachmentFolderPath(app, join(dirname(path), "DUMMY_FILE.md"));
return attachmentFolderPath !== dummyAttachmentFolderPath;
}
function normalizeSlashes(path) {
path = replaceAll(path, /(?:[\\/])+/g, "/");
path = replaceAll(path, /^\/+|\/+$/g, "");
return path || "/";
}
export {
getAttachmentFilePath,
getAttachmentFolderPath,
getAvailablePathForAttachments,
hasOwnAttachmentFolder
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0F0dGFjaG1lbnRQYXRoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJy4uL1N0cmluZy50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aFxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG4vKipcbiAqIElzIG92ZXJyaWRkZW4gd3JhcHBlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFdyYXBwZXIge1xuICAvKipcbiAgICogSXMgZXh0ZW5kZWQuXG4gICAqL1xuICBpc0V4dGVuZGVkOiB0cnVlO1xufVxuXG4vKipcbiAqIEdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRm4gPSAoXG4gIGF0dGFjaG1lbnRGaWxlTmFtZTogc3RyaW5nLFxuICBhdHRhY2htZW50RXh0ZW5zaW9uOiBzdHJpbmcsXG4gIG5vdGVGaWxlOiBudWxsIHwgVEZpbGUsXG4gIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uPzogYm9vbGVhblxuKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmaWxlIHBhdGggZm9yIGFuIGF0dGFjaG1lbnQgd2l0aGluIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGF0dGFjaG1lbnRQYXRoT3JGaWxlIC0gVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gKiBAcGFyYW0gbm90ZVBhdGhPckZpbGUgLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGaWxlUGF0aChhcHA6IEFwcCwgYXR0YWNobWVudFBhdGhPckZpbGU6IFBhdGhPckZpbGUsIG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYXR0YWNobWVudFBhdGggPSBnZXRQYXRoKGFwcCwgYXR0YWNobWVudFBhdGhPckZpbGUpO1xuICBjb25zdCBub3RlUGF0aCA9IGdldFBhdGgoYXBwLCBub3RlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5vdGUgPSBnZXRGaWxlKGFwcCwgbm90ZVBhdGgsIHRydWUpO1xuICBjb25zdCBleHQgPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSBiYXNlbmFtZShhdHRhY2htZW50UGF0aCwgZXh0KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGNvbnN0IGludGVybmFsRm4gPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzO1xuICBpZiAoKGludGVybmFsRm4gYXMgUGFydGlhbDxFeHRlbmRlZFdyYXBwZXI+KS5pc0V4dGVuZGVkKSB7XG4gICAgcmV0dXJuIChpbnRlcm5hbEZuIGFzIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRm4pKGZpbGVOYW1lLCBleHQuc2xpY2UoMSksIG5vdGUsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhhcHAsIGZpbGVOYW1lLCBleHQuc2xpY2UoMSksIG5vdGUsIHRydWUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmb3IgYSBnaXZlbiBub3RlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbm90ZVBhdGhPckZpbGUgLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHA6IEFwcCwgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gcGFyZW50Rm9sZGVyUGF0aChhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoYXBwLCAnRFVNTVlfRklMRS5wZGYnLCBub3RlUGF0aE9yRmlsZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXR0YWNobWVudEZpbGVOYW1lIC0gRmlsZSBuYW1lIG9mIHRoZSBhdHRhY2htZW50LlxuICogQHBhcmFtIGF0dGFjaG1lbnRFeHRlbnNpb24gLSBFeHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gKiBAcGFyYW0gbm90ZUZpbGUgLSBUaGUgZmlsZSB0byBhdHRhY2ggdG8uXG4gKiBAcGFyYW0gc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24gLSBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkP1xuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKFxuICBhcHA6IEFwcCxcbiAgYXR0YWNobWVudEZpbGVOYW1lOiBzdHJpbmcsXG4gIGF0dGFjaG1lbnRFeHRlbnNpb246IHN0cmluZyxcbiAgbm90ZUZpbGU6IG51bGwgfCBURmlsZSxcbiAgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IGJvb2xlYW5cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGFwcC52YXVsdC5nZXRDb25maWcoJ2F0dGFjaG1lbnRGb2xkZXJQYXRoJykgYXMgc3RyaW5nO1xuICBjb25zdCBpc0N1cnJlbnRGb2xkZXIgPSBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4nIHx8IGF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLi8nO1xuICBsZXQgcmVsYXRpdmVQYXRoID0gbnVsbDtcblxuICBpZiAoYXR0YWNobWVudEZvbGRlclBhdGguc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IHRyaW1TdGFydChhdHRhY2htZW50Rm9sZGVyUGF0aCwgJy4vJyk7XG4gIH1cblxuICBpZiAoaXNDdXJyZW50Rm9sZGVyKSB7XG4gICAgYXR0YWNobWVudEZvbGRlclBhdGggPSBub3RlRmlsZSA/IG5vdGVGaWxlLnBhcmVudD8ucGF0aCA/PyAnJyA6ICcnO1xuICB9IGVsc2UgaWYgKHJlbGF0aXZlUGF0aCkge1xuICAgIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gKG5vdGVGaWxlID8gbm90ZUZpbGUucGFyZW50Py5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJyA6ICcnKSArIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gbm9ybWFsaXplKG5vcm1hbGl6ZVNsYXNoZXMoYXR0YWNobWVudEZvbGRlclBhdGgpKTtcbiAgYXR0YWNobWVudEZpbGVOYW1lID0gbm9ybWFsaXplKG5vcm1hbGl6ZVNsYXNoZXMoYXR0YWNobWVudEZpbGVOYW1lKSk7XG5cbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoLCB0cnVlKTtcblxuICBpZiAoIWZvbGRlciAmJiByZWxhdGl2ZVBhdGgpIHtcbiAgICBpZiAoc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24pIHtcbiAgICAgIGZvbGRlciA9IGdldEZvbGRlcihhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9sZGVyID0gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gZm9sZGVyPy5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJztcbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKHByZWZpeCArIGF0dGFjaG1lbnRGaWxlTmFtZSwgYXR0YWNobWVudEV4dGVuc2lvbik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc093bkF0dGFjaG1lbnRGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgcGF0aCk7XG4gIGNvbnN0IGR1bW15QXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIGpvaW4oZGlybmFtZShwYXRoKSwgJ0RVTU1ZX0ZJTEUubWQnKSk7XG4gIHJldHVybiBhdHRhY2htZW50Rm9sZGVyUGF0aCAhPT0gZHVtbXlBdHRhY2htZW50Rm9sZGVyUGF0aDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCBieSBjb21iaW5pbmcgbXVsdGlwbGUgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIHNsYXNoIGFuZCByZW1vdmluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTbGFzaGVzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHBhdGggPSByZXBsYWNlQWxsKHBhdGgsIC8oPzpbXFxcXC9dKSsvZywgJy8nKTtcbiAgcGF0aCA9IHJlcGxhY2VBbGwocGF0aCwgL15cXC8rfFxcLyskL2csICcnKTtcbiAgcmV0dXJuIHBhdGggfHwgJy8nO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVdBLFNBQVMsd0JBQXdCO0FBSWpDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBOEJQLGVBQXNCLHNCQUFzQixLQUFVLHNCQUFrQyxnQkFBNkM7QUFDbkksUUFBTSxpQkFBaUIsUUFBUSxLQUFLLG9CQUFvQjtBQUN4RCxRQUFNLFdBQVcsUUFBUSxLQUFLLGNBQWM7QUFDNUMsUUFBTSxPQUFPLFFBQVEsS0FBSyxVQUFVLElBQUk7QUFDeEMsUUFBTSxNQUFNLFFBQVEsY0FBYztBQUNsQyxRQUFNLFdBQVcsU0FBUyxnQkFBZ0IsR0FBRztBQUc3QyxRQUFNLGFBQWEsSUFBSSxNQUFNO0FBQzdCLE1BQUssV0FBd0MsWUFBWTtBQUN2RCxXQUFRLFdBQXdELFVBQVUsSUFBSSxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUk7QUFBQSxFQUNwRztBQUVBLFNBQU8sTUFBTSwrQkFBK0IsS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJO0FBQ3JGO0FBU0EsZUFBc0Isd0JBQXdCLEtBQVUsZ0JBQTZDO0FBQ25HLFNBQU8saUJBQWlCLE1BQU0sc0JBQXNCLEtBQUssa0JBQWtCLGNBQWMsQ0FBQztBQUM1RjtBQVlBLGVBQXNCLCtCQUNwQixLQUNBLG9CQUNBLHFCQUNBLFVBQ0EsMkNBQ2lCO0FBQ2pCLE1BQUksdUJBQXVCLElBQUksTUFBTSxVQUFVLHNCQUFzQjtBQUNyRSxRQUFNLGtCQUFrQix5QkFBeUIsT0FBTyx5QkFBeUI7QUFDakYsTUFBSSxlQUFlO0FBRW5CLE1BQUkscUJBQXFCLFdBQVcsSUFBSSxHQUFHO0FBQ3pDLG1CQUFlLFVBQVUsc0JBQXNCLElBQUk7QUFBQSxFQUNyRDtBQUVBLE1BQUksaUJBQWlCO0FBQ25CLDJCQUF1QixXQUFXLFNBQVMsUUFBUSxRQUFRLEtBQUs7QUFBQSxFQUNsRSxXQUFXLGNBQWM7QUFDdkIsNEJBQXdCLFdBQVcsU0FBUyxRQUFRLGdCQUFnQixLQUFLLEtBQUssTUFBTTtBQUFBLEVBQ3RGO0FBRUEseUJBQXVCLFVBQVUsaUJBQWlCLG9CQUFvQixDQUFDO0FBQ3ZFLHVCQUFxQixVQUFVLGlCQUFpQixrQkFBa0IsQ0FBQztBQUVuRSxNQUFJLFNBQVMsZ0JBQWdCLEtBQUssc0JBQXNCLElBQUk7QUFFNUQsTUFBSSxDQUFDLFVBQVUsY0FBYztBQUMzQixRQUFJLDJDQUEyQztBQUM3QyxlQUFTLFVBQVUsS0FBSyxzQkFBc0IsSUFBSTtBQUFBLElBQ3BELE9BQU87QUFDTCxlQUFTLE1BQU0sSUFBSSxNQUFNLGFBQWEsb0JBQW9CO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBRUEsUUFBTSxTQUFTLFFBQVEsZ0JBQWdCLEtBQUs7QUFDNUMsU0FBTyxJQUFJLE1BQU0saUJBQWlCLFNBQVMsb0JBQW9CLG1CQUFtQjtBQUNwRjtBQVNBLGVBQXNCLHVCQUF1QixLQUFVLE1BQWdDO0FBQ3JGLFFBQU0sdUJBQXVCLE1BQU0sd0JBQXdCLEtBQUssSUFBSTtBQUNwRSxRQUFNLDRCQUE0QixNQUFNLHdCQUF3QixLQUFLLEtBQUssUUFBUSxJQUFJLEdBQUcsZUFBZSxDQUFDO0FBQ3pHLFNBQU8seUJBQXlCO0FBQ2xDO0FBUUEsU0FBUyxpQkFBaUIsTUFBc0I7QUFDOUMsU0FBTyxXQUFXLE1BQU0sZUFBZSxHQUFHO0FBQzFDLFNBQU8sV0FBVyxNQUFNLGNBQWMsRUFBRTtBQUN4QyxTQUFPLFFBQVE7QUFDakI7IiwKICAibmFtZXMiOiBbXQp9Cg==