obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
653 lines (651 loc) • 95.8 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")})();
"use strict";
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 Link_exports = {};
__export(Link_exports, {
LinkStyle: () => LinkStyle,
convertLink: () => convertLink,
editBacklinks: () => editBacklinks,
editLinks: () => editLinks,
editLinksInContent: () => editLinksInContent,
encodeUrl: () => encodeUrl,
extractLinkFile: () => extractLinkFile,
fixFrontmatterMarkdownLinks: () => fixFrontmatterMarkdownLinks,
generateMarkdownLink: () => generateMarkdownLink,
parseLink: () => parseLink,
parseLinks: () => parseLinks,
shouldResetAlias: () => shouldResetAlias,
splitSubpath: () => splitSubpath,
testAngleBrackets: () => testAngleBrackets,
testEmbed: () => testEmbed,
testLeadingDot: () => testLeadingDot,
testWikilink: () => testWikilink,
updateLink: () => updateLink,
updateLinksInContent: () => updateLinksInContent,
updateLinksInFile: () => updateLinksInFile
});
module.exports = __toCommonJS(Link_exports);
var import_obsidian = require('obsidian');
var import_implementations = require('obsidian-typings/implementations');
var import_remark = require('remark');
var import_remark_parse = __toESM(__extractDefault(require('remark-parse')), 1);
var import_remark_wiki_link = require('remark-wiki-link');
var import_unist_util_visit = require('unist-util-visit');
var import_AbortController = require('../AbortController.cjs');
var import_ObjectUtils = require('../ObjectUtils.cjs');
var import_Path = require('../Path.cjs');
var import_String = require('../String.cjs');
var import_url = require('../url.cjs');
var import_FileChange = require('./FileChange.cjs');
var import_FileSystem = require('./FileSystem.cjs');
var import_MetadataCache = require('./MetadataCache.cjs');
var import_ObsidianSettings = require('./ObsidianSettings.cjs');
var import_Reference = require('./Reference.cjs');
const ESCAPED_WIKILINK_DIVIDER = "\\|";
const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g;
const WIKILINK_DIVIDER = "|";
var LinkStyle = /* @__PURE__ */ ((LinkStyle2) => {
LinkStyle2["Markdown"] = "Markdown";
LinkStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
LinkStyle2["PreserveExisting"] = "PreserveExisting";
LinkStyle2["Wikilink"] = "Wikilink";
return LinkStyle2;
})(LinkStyle || {});
function convertLink(options) {
const targetFile = extractLinkFile(options.app, options.link, options.oldSourcePathOrFile ?? options.newSourcePathOrFile);
if (!targetFile) {
return options.link.original;
}
return updateLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app: options.app,
link: options.link,
linkStyle: options.linkStyle,
newSourcePathOrFile: options.newSourcePathOrFile,
newTargetPathOrFile: targetFile,
oldSourcePathOrFile: options.oldSourcePathOrFile,
shouldUpdateFileNameAlias: options.shouldUpdateFileNameAlias
}));
}
async function editBacklinks(app, pathOrFile, linkConverter, processOptions = {}) {
const backlinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(app, pathOrFile, processOptions);
for (const backlinkNotePath of backlinks.keys()) {
const currentLinks = backlinks.get(backlinkNotePath) ?? [];
const linkJsons = new Set(currentLinks.map((link) => (0, import_ObjectUtils.toJson)(link)));
await editLinks(app, backlinkNotePath, (link) => {
const linkJson = (0, import_ObjectUtils.toJson)(link);
if (!linkJsons.has(linkJson)) {
return;
}
return linkConverter(link);
}, processOptions);
}
}
async function editLinks(app, pathOrFile, linkConverter, processOptions = {}) {
await (0, import_FileChange.applyFileChanges)(app, pathOrFile, async (abortSignal, content) => {
const cache = await (0, import_MetadataCache.getCacheSafe)(app, pathOrFile);
abortSignal.throwIfAborted();
const file = (0, import_FileSystem.getFile)(app, pathOrFile);
const cachedContent = await app.vault.cachedRead(file);
abortSignal.throwIfAborted();
if (content !== cachedContent) {
return null;
}
return await getFileChanges(cache, (0, import_FileSystem.isCanvasFile)(app, pathOrFile), linkConverter, abortSignal);
}, processOptions);
}
async function editLinksInContent(app, content, linkConverter, abortSignal) {
abortSignal ??= (0, import_AbortController.abortSignalNever)();
abortSignal.throwIfAborted();
const newContent = await (0, import_FileChange.applyContentChanges)(abortSignal, content, "", async () => {
const cache = await (0, import_MetadataCache.parseMetadata)(app, content);
abortSignal.throwIfAborted();
const changes = await getFileChanges(cache, false, linkConverter, abortSignal);
abortSignal.throwIfAborted();
return changes;
});
abortSignal.throwIfAborted();
if (newContent === null) {
throw new Error("Failed to update links in content");
}
return newContent;
}
function encodeUrl(url) {
return (0, import_String.replaceAll)(url, SPECIAL_LINK_SYMBOLS_REGEXP, ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol));
}
function extractLinkFile(app, link, sourcePathOrFile, shouldAllowNonExistingFile = false) {
const { linkPath } = splitSubpath(link.link);
const sourcePath = (0, import_FileSystem.getPath)(app, sourcePathOrFile);
const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
if (file) {
return file;
}
if (!shouldAllowNonExistingFile) {
return null;
}
if (linkPath.startsWith("/")) {
return (0, import_FileSystem.getFile)(app, linkPath, true);
}
const fullLinkPath = (0, import_Path.join)((0, import_Path.dirname)(sourcePath), `./${linkPath}`);
if (fullLinkPath.startsWith("../")) {
return null;
}
return (0, import_FileSystem.getFile)(app, fullLinkPath, true);
}
function fixFrontmatterMarkdownLinks(cache) {
return _fixFrontmatterMarkdownLinks(cache.frontmatter, "", cache);
}
function generateMarkdownLink(options) {
const { app } = options;
const configurableDefaultOptionsFn = app.fileManager.generateMarkdownLink.defaultOptionsFn ?? (() => ({}));
const configurableDefaultOptions = configurableDefaultOptionsFn();
const DEFAULT_OPTIONS = {
isEmptyEmbedAliasAllowed: true
};
options = { ...DEFAULT_OPTIONS, ...configurableDefaultOptions, ...options };
const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed);
return (0, import_MetadataCache.tempRegisterFilesAndRun)(app, [targetFile], () => generateMarkdownLinkImpl(options));
}
function parseLink(str) {
const links = parseLinks(str);
return links[0]?.raw === str ? links[0] : null;
}
function parseLinks(str) {
const embedSymbolOffsets = /* @__PURE__ */ new Set();
const EMBED_LINK_PREFIX = "![";
const NO_EMBED_LINK_PREFIX = " [";
const noEmbedStr = (0, import_String.replaceAll)(str, EMBED_LINK_PREFIX, (args) => {
embedSymbolOffsets.add(args.offset);
return NO_EMBED_LINK_PREFIX;
});
const processor = (0, import_remark.remark)().use(import_remark_parse.default).use(import_remark_wiki_link.wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
const root = processor.parse(noEmbedStr);
const links = [];
const textLinks = [];
(0, import_unist_util_visit.visit)(root, (node) => {
let link;
switch (node.type) {
case "link":
link = parseLinkNode(node, str);
break;
case "wikiLink":
link = parseWikilinkNode(node, str);
break;
default:
return;
}
if (embedSymbolOffsets.has(link.startOffset - 1)) {
link.isEmbed = true;
link.startOffset--;
link.raw = `!${link.raw}`;
}
links.push(link);
});
links.sort((a, b) => a.startOffset - b.startOffset);
let textStartOffset = 0;
for (const link of links) {
extractTextLinks(str, textStartOffset, link.startOffset - 1, textLinks);
textStartOffset = link.endOffset + 1;
}
extractTextLinks(str, textStartOffset, str.length - 1, textLinks);
links.push(...textLinks);
links.sort((a, b) => a.startOffset - b.startOffset);
return links;
}
function shouldResetAlias(options) {
const {
app,
displayText,
isWikilink,
newSourcePathOrFile,
oldSourcePathOrFile,
oldTargetPath,
targetPathOrFile
} = options;
if (isWikilink === false) {
return false;
}
if (!displayText) {
return true;
}
const targetFile = (0, import_FileSystem.getFile)(app, targetPathOrFile, true);
const newSourcePath = (0, import_FileSystem.getPath)(app, newSourcePathOrFile);
const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
const newSourceFolder = (0, import_Path.dirname)(newSourcePath);
const oldSourceFolder = (0, import_Path.dirname)(oldSourcePath);
const aliasesToReset = /* @__PURE__ */ new Set();
for (const pathOrFile of [targetFile.path, oldTargetPath]) {
if (!pathOrFile) {
continue;
}
const path = (0, import_FileSystem.getPath)(app, pathOrFile);
aliasesToReset.add(path);
aliasesToReset.add((0, import_Path.basename)(path));
aliasesToReset.add((0, import_Path.relative)(newSourceFolder, path));
aliasesToReset.add((0, import_Path.relative)(oldSourceFolder, path));
}
for (const sourcePath of [oldSourcePath, newSourcePath]) {
aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
}
const cleanDisplayText = (0, import_String.replaceAll)((0, import_obsidian.normalizePath)(displayText.split(" > ")[0] ?? ""), /^\.\//g, "").toLowerCase();
for (const alias of aliasesToReset) {
if (alias.toLowerCase() === cleanDisplayText) {
return true;
}
const folder = (0, import_Path.dirname)(alias);
const base = (0, import_Path.basename)(alias, (0, import_Path.extname)(alias));
if ((0, import_Path.join)(folder, base).toLowerCase() === cleanDisplayText) {
return true;
}
}
return false;
}
function splitSubpath(link) {
const parsed = (0, import_obsidian.parseLinktext)((0, import_String.normalize)(link));
return {
linkPath: parsed.path,
subpath: parsed.subpath
};
}
function testAngleBrackets(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.hasAngleBrackets ?? false;
}
function testEmbed(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.isEmbed ?? false;
}
function testLeadingDot(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.url.startsWith("./") ?? false;
}
function testWikilink(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.isWikilink ?? false;
}
function updateLink(options) {
const {
app,
link,
linkStyle,
newSourcePathOrFile,
newTargetPathOrFile,
oldSourcePathOrFile,
oldTargetPathOrFile,
shouldUpdateFileNameAlias
} = options;
if (!newTargetPathOrFile) {
return link.original;
}
const newTargetFile = (0, import_FileSystem.getFile)(app, newTargetPathOrFile, true);
const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
const oldTargetPath = (0, import_FileSystem.getPath)(app, oldTargetPathOrFile ?? newTargetPathOrFile);
const isWikilink = shouldUseWikilinkStyle(app, link.original, linkStyle);
const { subpath } = splitSubpath(link.link);
let shouldKeepAlias = !shouldUpdateFileNameAlias;
if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile)) {
if ((0, import_Reference.isCanvasFileNodeReference)(link)) {
return newTargetFile.path + subpath;
}
}
const parseLinkResult = parseLink(link.original);
let alias;
if (isWikilink && parseLinkResult?.alias) {
alias = parseLinkResult.alias;
shouldKeepAlias = true;
}
alias ??= shouldResetAlias((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
displayText: link.displayText,
isWikilink,
newSourcePathOrFile,
oldSourcePathOrFile,
oldTargetPath,
targetPathOrFile: newTargetFile
})) ? void 0 : parseLinkResult?.alias;
if (!shouldKeepAlias) {
if (alias === (0, import_Path.basename)(oldTargetPath, (0, import_Path.extname)(oldTargetPath))) {
alias = newTargetFile.basename;
} else if (alias === (0, import_Path.basename)(oldTargetPath)) {
alias = newTargetFile.name;
}
}
const newLink = generateMarkdownLink((0, import_ObjectUtils.normalizeOptionalProperties)({
alias,
app,
isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias,
linkStyle,
originalLink: link.original,
sourcePathOrFile: newSourcePathOrFile,
subpath,
targetPathOrFile: newTargetFile
}));
return newLink;
}
async function updateLinksInContent(options) {
const {
app,
content,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateEmbedOnlyLinks,
shouldUpdateFileNameAlias
} = options;
return await editLinksInContent(app, content, (link) => {
const isEmbedLink = testEmbed(link.original);
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
return;
}
return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
link,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateFileNameAlias
}));
});
}
async function updateLinksInFile(options) {
const {
app,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateEmbedOnlyLinks,
shouldUpdateFileNameAlias
} = options;
if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(import_implementations.InternalPluginName.Canvas)) {
return;
}
await editLinks(app, newSourcePathOrFile, (link) => {
const isEmbedLink = testEmbed(link.original);
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
return;
}
return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
link,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateFileNameAlias
}));
}, options);
}
function _fixFrontmatterMarkdownLinks(value, key, cache) {
if (typeof value === "string") {
const parseLinkResult = parseLink(value);
if (!parseLinkResult || parseLinkResult.isWikilink || parseLinkResult.isExternal) {
return false;
}
cache.frontmatterLinks ??= [];
let link = cache.frontmatterLinks.find((frontmatterLink) => frontmatterLink.key === key);
if (!link) {
link = {
key,
link: "",
original: ""
};
cache.frontmatterLinks.push(link);
}
link.link = parseLinkResult.url;
link.original = value;
if (parseLinkResult.alias !== void 0) {
link.displayText = parseLinkResult.alias;
}
return true;
}
if (typeof value !== "object" || value === null) {
return false;
}
let hasFrontmatterLinks = false;
for (const [childKey, childValue] of Object.entries(value)) {
const hasChildFrontmatterLinks = _fixFrontmatterMarkdownLinks(childValue, key ? `${key}.${childKey}` : childKey, cache);
hasFrontmatterLinks ||= hasChildFrontmatterLinks;
}
return hasFrontmatterLinks;
}
function extractTextLinks(str, startOffset, endOffset, textLinks) {
if (startOffset > endOffset) {
return;
}
const textPart = str.slice(startOffset, endOffset + 1);
(0, import_String.replaceAll)(textPart, /(?<Url>\S+)/g, (args, url) => {
if (!(0, import_url.isUrl)(url)) {
return;
}
textLinks.push({
encodedUrl: encodeUrl(url),
endOffset: startOffset + args.offset + url.length,
hasAngleBrackets: false,
isEmbed: false,
isExternal: true,
isWikilink: false,
raw: url,
startOffset: startOffset + args.offset,
url
});
});
}
function generateLinkText(app, targetFile, sourcePath, subpath, config) {
if (sourcePath === "/") {
sourcePath = "";
}
let linkText;
if (targetFile.path === sourcePath && subpath && config.isSingleSubpathAllowed) {
linkText = subpath;
} else if (config.shouldForceRelativePath) {
linkText = (0, import_Path.relative)((0, import_Path.dirname)(sourcePath), config.isWikilink ? (0, import_FileSystem.trimMarkdownExtension)(app, targetFile) : targetFile.path) + subpath;
} else {
linkText = app.metadataCache.fileToLinktext(targetFile, sourcePath, config.isWikilink) + subpath;
}
if (config.shouldForceRelativePath && config.shouldUseLeadingDot && !linkText.startsWith(".") && !linkText.startsWith("#")) {
linkText = `./${linkText}`;
}
return linkText;
}
function generateMarkdownLinkImpl(options) {
const { app } = options;
const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed);
const sourcePath = (0, import_FileSystem.getPath)(app, options.sourcePathOrFile);
const subpath = options.subpath ?? "";
const linkConfig = getLinkConfig(options, targetFile);
const linkText = generateLinkText(app, targetFile, sourcePath, subpath, linkConfig);
return linkConfig.isWikilink ? generateWikiLink(linkText, options.alias, linkConfig.isEmbed) : generateMarkdownStyleLink(linkText, targetFile, options, linkConfig);
}
function generateMarkdownStyleLink(linkText, targetFile, options, config) {
const { app } = options;
const embedPrefix = config.isEmbed ? "!" : "";
const processedLinkText = config.shouldUseAngleBrackets ? `<${linkText}>` : encodeUrl(linkText);
let alias = options.alias ?? "";
if (!alias && (!config.isEmbed || !options.isEmptyEmbedAliasAllowed)) {
alias = !options.shouldIncludeAttachmentExtensionToEmbedAlias || (0, import_FileSystem.isMarkdownFile)(app, targetFile) ? targetFile.basename : targetFile.name;
}
const escapedAlias = options.shouldEscapeAlias ? (0, import_String.replaceAll)(alias, SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX, "\\$&") : alias;
return `${embedPrefix}[${escapedAlias}](${processedLinkText})`;
}
function generateWikiLink(linkText, alias, isEmbed) {
const embedPrefix = isEmbed ? "!" : "";
const normalizedAlias = alias ?? "";
if (normalizedAlias && normalizedAlias.toLowerCase() === linkText.toLowerCase()) {
return `${embedPrefix}[[${normalizedAlias}]]`;
}
const aliasPart = normalizedAlias ? `|${normalizedAlias}` : "";
return `${embedPrefix}[[${linkText}${aliasPart}]]`;
}
async function getFileChanges(cache, isCanvasFileCache, linkConverter, abortSignal) {
abortSignal ??= (0, import_AbortController.abortSignalNever)();
abortSignal.throwIfAborted();
if (!cache) {
return [];
}
const changes = [];
const tablePositions = (cache.sections ?? []).filter((section) => section.type === "table").map((section) => ({
end: section.position.end.offset,
start: section.position.start.offset
}));
for (const link of (0, import_MetadataCache.getAllLinks)(cache)) {
abortSignal.throwIfAborted();
const newContent = await linkConverter(link, abortSignal);
abortSignal.throwIfAborted();
if (newContent === void 0) {
continue;
}
const fileChange = (0, import_Reference.referenceToFileChange)(link, newContent);
if (isCanvasFileCache) {
if ((0, import_FileChange.isCanvasChange)(fileChange)) {
changes.push(fileChange);
} else {
const message = "Unsupported file change";
console.error(message, fileChange);
throw new Error(message);
}
} else {
if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) {
fileChange.newContent = fileChange.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, ESCAPED_WIKILINK_DIVIDER);
}
changes.push(fileChange);
}
}
return changes;
}
function getLinkConfig(options, targetFile) {
const { app } = options;
return {
isEmbed: options.isEmbed ?? (options.originalLink ? testEmbed(options.originalLink) : void 0) ?? !(0, import_FileSystem.isMarkdownFile)(app, targetFile),
isSingleSubpathAllowed: options.isSingleSubpathAllowed ?? true,
isWikilink: shouldUseWikilinkStyle(app, options.originalLink, options.linkStyle),
shouldForceRelativePath: options.shouldForceRelativePath ?? (0, import_ObsidianSettings.shouldUseRelativeLinks)(app),
shouldUseAngleBrackets: options.shouldUseAngleBrackets ?? (options.originalLink ? testAngleBrackets(options.originalLink) : void 0) ?? false,
shouldUseLeadingDot: options.shouldUseLeadingDot ?? (options.originalLink ? testLeadingDot(options.originalLink) : void 0) ?? false
};
}
function getRawLink(node, str) {
return str.slice(node.position?.start.offset ?? 0, node.position?.end.offset ?? 0);
}
function parseLinkNode(node, str) {
const OPEN_ANGLE_BRACKET = "<";
const LINK_ALIAS_SUFFIX = "](";
const LINK_SUFFIX = ")";
const raw = getRawLink(node, str);
const aliasNodeStartOffset = node.children[0]?.position?.start.offset ?? 1;
const aliasNodeEndOffset = node.children.at(-1)?.position?.end.offset ?? 1;
const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, (node.position?.end.offset ?? 0) - LINK_SUFFIX.length);
const hasAngleBrackets = raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
const isExternal = (0, import_url.isUrl)(node.url);
let url = node.url;
if (!isExternal && !hasAngleBrackets) {
try {
url = decodeURIComponent(url);
} catch (error) {
console.error(`Failed to decode URL ${url}`, error);
}
}
return (0, import_ObjectUtils.normalizeOptionalProperties)({
alias: aliasNodeStartOffset < aliasNodeEndOffset ? str.slice(aliasNodeStartOffset, aliasNodeEndOffset) : void 0,
encodedUrl: isExternal ? encodeUrl(url) : void 0,
endOffset: node.position?.end.offset ?? 0,
hasAngleBrackets,
isEmbed: false,
isExternal,
isWikilink: false,
raw,
startOffset: node.position?.start.offset ?? 0,
title: node.title ?? void 0,
url
});
}
function parseWikilinkNode(node, str) {
return (0, import_ObjectUtils.normalizeOptionalProperties)({
alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0,
endOffset: node.position?.end.offset ?? 0,
isEmbed: false,
isExternal: false,
isWikilink: true,
raw: getRawLink(node, str),
startOffset: node.position?.start.offset ?? 0,
url: node.value
});
}
function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
if (!(0, import_FileChange.isContentChange)(fileChange)) {
return false;
}
if (!UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent)) {
return false;
}
return tablePositions.some(
(tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end
);
}
function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
switch (linkStyle ?? "PreserveExisting" /* PreserveExisting */) {
case "Markdown" /* Markdown */:
return false;
case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */:
return (0, import_ObsidianSettings.shouldUseWikilinks)(app);
case "PreserveExisting" /* PreserveExisting */:
return originalLink === void 0 ? (0, import_ObsidianSettings.shouldUseWikilinks)(app) : testWikilink(originalLink);
case "Wikilink" /* Wikilink */:
return true;
default:
throw new Error(`Invalid link style: ${linkStyle}.`);
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
LinkStyle,
convertLink,
editBacklinks,
editLinks,
editLinksInContent,
encodeUrl,
extractLinkFile,
fixFrontmatterMarkdownLinks,
generateMarkdownLink,
parseLink,
parseLinks,
shouldResetAlias,
splitSubpath,
testAngleBrackets,
testEmbed,
testLeadingDot,
testWikilink,
updateLink,
updateLinksInContent,
updateLinksInFile
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBhbmQgdXBkYXRpbmcgbGlua3Mgd2l0aGluIE9ic2lkaWFuIHZhdWx0cy4gSXQgaW5jbHVkZXNcbiAqIGZ1bmN0aW9ucyB0byBzcGxpdCBwYXRocywgdXBkYXRlIGxpbmtzIGluIGZpbGVzLCBhbmQgZ2VuZXJhdGUgbWFya2Rvd24gbGlua3Mgd2l0aCB2YXJpb3VzIG9wdGlvbnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMaW5rIH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tICd1bmlzdCc7XG5cbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi9UeXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vQWJvcnRDb250cm9sbGVyLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyxcbiAgdG9Kc29uXG59IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICcuLi91cmwudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgdHJpbU1hcmtkb3duRXh0ZW5zaW9uXG59IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5cbn0gZnJvbSAnLi9NZXRhZGF0YUNhY2hlLnRzJztcbmltcG9ydCB7XG4gIHNob3VsZFVzZVJlbGF0aXZlTGlua3MsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL09ic2lkaWFuU2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vUmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gJ1xcXFx8JztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQID0gL1tcXFxcXFx4MDBcXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRiBdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIG1hcmtkb3duIGxpbmsgc3ltYm9scy5cbiAqL1xuY29uc3QgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVggPSAvW1xcXFxbXFxdPD5fKn49YCRdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciB1bmVzY2FwZWQgcGlwZXMuXG4gKi9cbmNvbnN0IFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC8oPzwhXFxcXClcXHwvZztcblxuY29uc3QgV0lLSUxJTktfRElWSURFUiA9ICd8JztcblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBjb252ZXJ0TGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydExpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3IgZGVmYXVsdCBvcHRpb25zIGZvciB7QGxpbmsgR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zV3JhcHBlciB7XG4gIC8qKlxuICAgKiBBIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBkZWZhdWx0IG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBkZWZhdWx0T3B0aW9uc0ZuKCk6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1tsaW5rXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tsaW5rXV1gLlxuICAgKi9cbiAgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICovXG4gIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKi9cbiAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mXG4gICAqXG4gICAqIC0ge0BsaW5rIGlzRW1iZWR9XG4gICAqIC0ge0BsaW5rIGxpbmtTdHlsZX1cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlQW5nbGVCcmFja2V0c31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ0RvdH1cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICovXG4gIHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSByZWxhdGl2ZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3NcbiAgICovXG4gIHNob3VsZEZvcmNlUmVsYXRpdmVQYXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKi9cbiAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKi9cbiAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufSBhbmQge0BsaW5rIHNob3VsZEZvcmNlUmVsYXRpdmVQYXRofSBpcyBgdHJ1ZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldC5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldC5tZClgLlxuICAgKi9cbiAgc2hvdWxkVXNlTGVhZGluZ0RvdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRob3V0LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqL1xuICBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIEEgcmVzdWx0IG9mIHBhcnNpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIGVuY29kZWRVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGhhcyBhbmdsZSBicmFja2V0cy5cbiAgICovXG4gIGhhc0FuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICovXG4gIGlzRXh0ZXJuYWw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKi9cbiAgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgc2hvdWxkUmVzZXRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgaXNFbWJlZDogYm9vbGVhbjtcbiAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogYm9vbGVhbjtcbiAgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg6IGJvb2xlYW47XG4gIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHNob3VsZFVzZUxlYWRpbmdEb3Q6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5Db250ZW50fS5cbiAqL1xuaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5Db250ZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICBkYXRhOiB7XG4gICAgYWxpYXM6IHN0cmluZztcbiAgfTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsob3B0aW9uczogQ29udmVydExpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShvcHRpb25zLmFwcCwgb3B0aW9ucy5saW5rLCBvcHRpb25zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gb3B0aW9ucy5uZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubGluay5vcmlnaW5hbDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rT3B0aW9ucz4oe1xuICAgIGFwcDogb3B0aW9ucy5hcHAsXG4gICAgbGluazogb3B0aW9ucy5saW5rLFxuICAgIGxpbmtTdHlsZTogb3B0aW9ucy5saW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IG9wdGlvbnMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkgPz8gW107XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IHRvSnNvbihsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IHRvSnNvbihsaW5rKTtcbiAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICB9LCBwcm9jZXNzT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gbGlua0NvbnZlcnRlciAtIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAqIEBwYXJhbSBwcm9jZXNzT3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgZm9yIHJldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PixcbiAgcHJvY2Vzc09wdGlvbnM6IFByb2Nlc3NPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKGFib3J0U2lnbmFsLCBjb250ZW50KSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgaXNDYW52YXNGaWxlKGFwcCwgcGF0aE9yRmlsZSksIGxpbmtDb252ZXJ0ZXIsIGFib3J0U2lnbmFsKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG5ld0NvbnRlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuICB9XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBlbmNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh1cmwsIFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCwgKHsgc3Vic3RyaW5nOiBzcGVjaWFsTGlua1N5bWJvbCB9KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc3BlY2lhbExpbmtTeW1ib2wpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShhcHA6IEFwcCwgbGluazogUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoYXBwLCBsaW5rUGF0aCwgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgaWYgKGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldEZpbGUoYXBwLCBmdWxsTGlua1BhdGgsIHRydWUpO1xufVxuXG4vKipcbiAqIEZpeGVzIHRoZSBmcm9udG1hdHRlciBtYX