UNPKG

obsidian-dev-utils

Version:

This is the collection of useful functions that you can use for your Obsidian plugin development

123 lines (120 loc) 14.7 kB
/* 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:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>{const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};return browserProcess},"process")};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")})(); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; 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 __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Dependency_exports = {}; __export(Dependency_exports, { getDependenciesToBundle: () => getDependenciesToBundle, getDependenciesToSkip: () => getDependenciesToSkip }); module.exports = __toCommonJS(Dependency_exports); var import_esbuild = require('esbuild'); var import_Error = require('../../Error.cjs'); var import_Path = require('../../Path.cjs'); var import_String = require('../../String.cjs'); var import_NodeModules = require('../NodeModules.cjs'); var import_Npm = require('../Npm.cjs'); var import_ObsidianDevUtilsRepoPaths = require('../ObsidianDevUtilsRepoPaths.cjs'); var import_ObsidianPluginBuilder = require('./ObsidianPluginBuilder.cjs'); var import_preprocessPlugin = require('./preprocessPlugin.cjs'); var __import_meta_url = globalThis["import.meta.url"] ?? (() => { if (typeof __filename === "string") { const localRequire = require; const url = localRequire("node:url"); return url.pathToFileURL(__filename).href; } if (typeof window !== "undefined") { return window.location.href; } return ""; })(); const esmRequire = (0, import_NodeModules.createRequire)(__import_meta_url); async function getDependenciesToBundle() { const dependenciesToSkip = await getDependenciesToSkip(); const dependenciesToBundle = /* @__PURE__ */ new Set(); const buildOptions = { banner: { js: import_ObsidianPluginBuilder.banner }, bundle: true, entryPoints: [(0, import_Path.join)(import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.Src, import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.AnyPath, import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.AnyTs)], format: "cjs", logLevel: "info", outdir: "nothing-will-be-written-on-disk-so-this-does-not-matter", platform: "node", plugins: [ (0, import_preprocessPlugin.preprocessPlugin)(), extractDependenciesToBundlePlugin(dependenciesToSkip, dependenciesToBundle) ], sourcemap: "inline", target: "ESNext", treeShaking: true, write: false }; const buildContext = await (0, import_esbuild.context)(buildOptions); await (0, import_ObsidianPluginBuilder.invokeEsbuild)(buildContext, true); return Array.from(dependenciesToBundle).sort(); } async function getDependenciesToSkip() { const packageJson = await (0, import_Npm.readPackageJson)((0, import_Path.getFolderName)(__import_meta_url)); const dependenciesToSkip = /* @__PURE__ */ new Set([...import_NodeModules.builtinModules, ...Object.keys(packageJson.dependencies ?? {}).filter(canSkipFromBundling)]); return dependenciesToSkip; } function canSkipFromBundling(moduleName) { if (moduleName.startsWith("@types/")) { return true; } if (moduleName.startsWith("obsidian")) { return true; } if (moduleName === "esbuild") { return true; } try { const module2 = esmRequire(moduleName); return !module2.default; } catch { return false; } } function extractDependenciesToBundlePlugin(dependenciesToSkip, dependenciesToBundle) { return { name: "test", setup(build) { build.onResolve({ filter: /^[^./]/ }, (args) => { if (!args.importer.endsWith(import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.DtsExtension)) { const moduleName = (0, import_String.trimStart)(args.path.split("/")[0] ?? (0, import_Error.throwExpression)(new Error("Wrong path")), "node:"); if (!dependenciesToSkip.has(args.path) && !dependenciesToSkip.has(moduleName)) { dependenciesToBundle.add(args.path); } } return { external: true, path: args.path }; }); } }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getDependenciesToBundle, getDependenciesToSkip }); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL1NjcmlwdFV0aWxzL2VzYnVpbGQvRGVwZW5kZW5jeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKCgpPT57aWYodHlwZW9mIF9fZmlsZW5hbWU9PT1cInN0cmluZ1wiKXtjb25zdCBsb2NhbFJlcXVpcmU9cmVxdWlyZTtjb25zdCB1cmw9bG9jYWxSZXF1aXJlKFwibm9kZTp1cmxcIik7cmV0dXJuIHVybC5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWZ9aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe3JldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZn1yZXR1cm5cIlwifSkoKTtcbi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBtYW5hZ2luZyBkZXBlbmRlbmNpZXMgZHVyaW5nIHRoZSBlc2J1aWxkIHByb2Nlc3MuXG4gKiBJdCBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgc2tpcHBlZCBhbmQgd2hpY2hcbiAqIHNob3VsZCBiZSBidW5kbGVkLCBhcyB3ZWxsIGFzIGFuIGVzYnVpbGQgcGx1Z2luIGZvciBleHRyYWN0aW5nIGRlcGVuZGVuY2llcyB0byBidW5kbGUuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcblxuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuXG5pbXBvcnQgeyB0aHJvd0V4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9FcnJvci50cyc7XG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luXG59IGZyb20gJy4uLy4uL1BhdGgudHMnO1xuaW1wb3J0IHsgdHJpbVN0YXJ0IH0gZnJvbSAnLi4vLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGJ1aWx0aW5Nb2R1bGVzLFxuICBjcmVhdGVSZXF1aXJlXG59IGZyb20gJy4uL05vZGVNb2R1bGVzLnRzJztcbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uL05wbS50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi4vT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy50cyc7XG5pbXBvcnQge1xuICBiYW5uZXIsXG4gIGludm9rZUVzYnVpbGRcbn0gZnJvbSAnLi9PYnNpZGlhblBsdWdpbkJ1aWxkZXIudHMnO1xuaW1wb3J0IHsgcHJlcHJvY2Vzc1BsdWdpbiB9IGZyb20gJy4vcHJlcHJvY2Vzc1BsdWdpbi50cyc7XG5cbmNvbnN0IGVzbVJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmludGVyZmFjZSBNb2R1bGVXaXRoRGVmYXVsdEV4cG9ydCB7XG4gIGRlZmF1bHQ6IHVua25vd247XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIGJ1bmRsZWQgYnkgZXNidWlsZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlcGVuZGVuY3kgbmFtZXMgdG8gYnVuZGxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzVG9CdW5kbGUoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb1NraXAgPSBhd2FpdCBnZXREZXBlbmRlbmNpZXNUb1NraXAoKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9CdW5kbGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHtcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBiYW5uZXJcbiAgICB9LFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBlbnRyeVBvaW50czogW2pvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5TcmMsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuQW55UGF0aCwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5BbnlUcyldLFxuICAgIGZvcm1hdDogJ2NqcycsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6ICdub3RoaW5nLXdpbGwtYmUtd3JpdHRlbi1vbi1kaXNrLXNvLXRoaXMtZG9lcy1ub3QtbWF0dGVyJyxcbiAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIHByZXByb2Nlc3NQbHVnaW4oKSxcbiAgICAgIGV4dHJhY3REZXBlbmRlbmNpZXNUb0J1bmRsZVBsdWdpbihkZXBlbmRlbmNpZXNUb1NraXAsIGRlcGVuZGVuY2llc1RvQnVuZGxlKVxuICAgIF0sXG4gICAgc291cmNlbWFwOiAnaW5saW5lJyxcbiAgICB0YXJnZXQ6ICdFU05leHQnLFxuICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgIHdyaXRlOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGNvbnRleHQoYnVpbGRPcHRpb25zKTtcbiAgYXdhaXQgaW52b2tlRXNidWlsZChidWlsZENvbnRleHQsIHRydWUpO1xuICByZXR1cm4gQXJyYXkuZnJvbShkZXBlbmRlbmNpZXNUb0J1bmRsZSkuc29ydCgpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIGJ1bmRsaW5nIHByb2Nlc3MuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBTZXR9IG9mIGRlcGVuZGVuY3kgbmFtZXMgdG8gc2tpcC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlcGVuZGVuY2llc1RvU2tpcCgpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvU2tpcCA9IG5ldyBTZXQ8c3RyaW5nPihbLi4uYnVpbHRpbk1vZHVsZXMsIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSkuZmlsdGVyKGNhblNraXBGcm9tQnVuZGxpbmcpXSk7XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb1NraXA7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbW9kdWxlIGNhbiBiZSBza2lwcGVkIGZyb20gYnVuZGxpbmcuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbW9kdWxlIGNhbiBiZSBza2lwcGVkIGZyb20gYnVuZGxpbmcuXG4gKi9cbmZ1bmN0aW9uIGNhblNraXBGcm9tQnVuZGxpbmcobW9kdWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJ0B0eXBlcy8nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnb2JzaWRpYW4nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKG1vZHVsZU5hbWUgPT09ICdlc2J1aWxkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtb2R1bGUgPSBlc21SZXF1aXJlKG1vZHVsZU5hbWUpIGFzIE1vZHVsZVdpdGhEZWZhdWx0RXhwb3J0O1xuICAgIHJldHVybiAhbW9kdWxlLmRlZmF1bHQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBpZGVudGlmaWVzIHdoaWNoIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgYnVuZGxlZC5cbiAqXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzVG9Ta2lwIC0gQSBzZXQgb2YgZGVwZW5kZW5jeSBuYW1lcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGR1cmluZyBidW5kbGluZy5cbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXNUb0J1bmRsZSAtIEEgc2V0IHdoZXJlIHRoZSBuYW1lcyBvZiBkZXBlbmRlbmNpZXMgdG8gYmUgYnVuZGxlZCB3aWxsIGJlIGFkZGVkLlxuICogQHJldHVybnMgQW4gZXNidWlsZCBgUGx1Z2luYCBvYmplY3QgdGhhdCBleHRyYWN0cyBkZXBlbmRlbmNpZXMgdG8gYnVuZGxlLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RGVwZW5kZW5jaWVzVG9CdW5kbGVQbHVnaW4oZGVwZW5kZW5jaWVzVG9Ta2lwOiBTZXQ8c3RyaW5nPiwgZGVwZW5kZW5jaWVzVG9CdW5kbGU6IFNldDxzdHJpbmc+KTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndGVzdCcsXG4gICAgc2V0dXAoYnVpbGQpOiB2b2lkIHtcbiAgICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogL15bXi4vXS8gfSwgKGFyZ3MpID0+IHtcbiAgICAgICAgaWYgKCFhcmdzLmltcG9ydGVyLmVuZHNXaXRoKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSB0cmltU3RhcnQoYXJncy5wYXRoLnNwbGl0KCcvJylbMF0gPz8gdGhyb3dFeHByZXNzaW9uKG5ldyBFcnJvcignV3JvbmcgcGF0aCcpKSwgJ25vZGU6Jyk7XG4gICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXNUb1NraXAuaGFzKGFyZ3MucGF0aCkgJiYgIWRlcGVuZGVuY2llc1RvU2tpcC5oYXMobW9kdWxlTmFtZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1RvQnVuZGxlLmFkZChhcmdzLnBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogdHJ1ZSwgcGF0aDogYXJncy5wYXRoIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBY0EscUJBQXdCO0FBRXhCLG1CQUFnQztBQUNoQyxrQkFHTztBQUNQLG9CQUEwQjtBQUMxQix5QkFHTztBQUNQLGlCQUFnQztBQUNoQyx1Q0FBMEM7QUFDMUMsbUNBR087QUFDUCw4QkFBaUM7QUFoQ2pDLElBQUksb0JBQW9CLFdBQVcsaUJBQWlCLE1BQU0sTUFBSTtBQUFDLE1BQUcsT0FBTyxlQUFhLFVBQVM7QUFBQyxVQUFNLGVBQWE7QUFBUSxVQUFNLE1BQUksYUFBYSxVQUFVO0FBQUUsV0FBTyxJQUFJLGNBQWMsVUFBVSxFQUFFO0FBQUEsRUFBSTtBQUFDLE1BQUcsT0FBTyxXQUFTLGFBQVk7QUFBQyxXQUFPLE9BQU8sU0FBUztBQUFBLEVBQUk7QUFBQyxTQUFNO0FBQUUsR0FBRztBQWtDL1EsTUFBTSxpQkFBYSxrQ0FBYyxpQkFBZTtBQVdoRCxlQUFzQiwwQkFBNkM7QUFDakUsUUFBTSxxQkFBcUIsTUFBTSxzQkFBc0I7QUFDdkQsUUFBTSx1QkFBdUIsb0JBQUksSUFBWTtBQUU3QyxRQUFNLGVBQTZCO0FBQUEsSUFDakMsUUFBUTtBQUFBLE1BQ04sSUFBSTtBQUFBLElBQ047QUFBQSxJQUNBLFFBQVE7QUFBQSxJQUNSLGFBQWEsS0FBQyxrQkFBSywyREFBMEIsS0FBSywyREFBMEIsU0FBUywyREFBMEIsS0FBSyxDQUFDO0FBQUEsSUFDckgsUUFBUTtBQUFBLElBQ1IsVUFBVTtBQUFBLElBQ1YsUUFBUTtBQUFBLElBQ1IsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLFVBQ1AsMENBQWlCO0FBQUEsTUFDakIsa0NBQWtDLG9CQUFvQixvQkFBb0I7QUFBQSxJQUM1RTtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLElBQ1IsYUFBYTtBQUFBLElBQ2IsT0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGVBQWUsVUFBTSx3QkFBUSxZQUFZO0FBQy9DLFlBQU0sNENBQWMsY0FBYyxJQUFJO0FBQ3RDLFNBQU8sTUFBTSxLQUFLLG9CQUFvQixFQUFFLEtBQUs7QUFDL0M7QUFPQSxlQUFzQix3QkFBOEM7QUFDbEUsUUFBTSxjQUFjLFVBQU0sZ0NBQWdCLDJCQUFjLGlCQUFlLENBQUM7QUFDeEUsUUFBTSxxQkFBcUIsb0JBQUksSUFBWSxDQUFDLEdBQUcsbUNBQWdCLEdBQUcsT0FBTyxLQUFLLFlBQVksZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sbUJBQW1CLENBQUMsQ0FBQztBQUMxSSxTQUFPO0FBQ1Q7QUFRQSxTQUFTLG9CQUFvQixZQUE2QjtBQUN4RCxNQUFJLFdBQVcsV0FBVyxTQUFTLEdBQUc7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFdBQVcsV0FBVyxVQUFVLEdBQUc7QUFDckMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGVBQWUsV0FBVztBQUM1QixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDRixVQUFNQSxVQUFTLFdBQVcsVUFBVTtBQUNwQyxXQUFPLENBQUNBLFFBQU87QUFBQSxFQUNqQixRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVNBLFNBQVMsa0NBQWtDLG9CQUFpQyxzQkFBMkM7QUFDckgsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTSxPQUFhO0FBQ2pCLFlBQU0sVUFBVSxFQUFFLFFBQVEsU0FBUyxHQUFHLENBQUMsU0FBUztBQUM5QyxZQUFJLENBQUMsS0FBSyxTQUFTLFNBQVMsMkRBQTBCLFlBQVksR0FBRztBQUNuRSxnQkFBTSxpQkFBYSx5QkFBVSxLQUFLLEtBQUssTUFBTSxHQUFHLEVBQUUsQ0FBQyxTQUFLLDhCQUFnQixJQUFJLE1BQU0sWUFBWSxDQUFDLEdBQUcsT0FBTztBQUN6RyxjQUFJLENBQUMsbUJBQW1CLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxVQUFVLEdBQUc7QUFDN0UsaUNBQXFCLElBQUksS0FBSyxJQUFJO0FBQUEsVUFDcEM7QUFBQSxRQUNGO0FBQ0EsZUFBTyxFQUFFLFVBQVUsTUFBTSxNQUFNLEtBQUssS0FBSztBQUFBLE1BQzNDLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiXQp9Cg==