UNPKG

@zodiac-ui/editor

Version:

A rich text editor for Angular based on `@atlaskit/editor-core`.

178 lines 25.7 kB
import { inputRules } from 'prosemirror-inputrules'; import { createInputRule } from "../../lib/utils/input-rules"; import { transformToCodeAction } from "./utils"; const validCombos = { '**': ['_', '~~'], '*': ['__', '~~'], __: ['*', '~~'], _: ['**', '~~'], '~~': ['__', '_', '**', '*'], }; const validRegex = (char, str) => { for (let i = 0; i < validCombos[char].length; i++) { const ch = validCombos[char][i]; if (ch === str) { return true; } const matchLength = str.length - ch.length; if (str.substr(matchLength, str.length) === ch) { return validRegex(ch, str.substr(0, matchLength)); } } return false; }; const ɵ0 = validRegex; function addMark(markType, schema, charSize, char) { return (state, match, start, end) => { const [, prefix, textWithCombo] = match; const to = end; // in case of *string* pattern it matches the text from beginning of the paragraph, // because we want ** to work for strong text // that's why "start" argument is wrong and we need to calculate it ourselves const from = textWithCombo ? start + prefix.length : start; const nodeBefore = state.doc.resolve(start + prefix.length).nodeBefore; if (prefix && prefix.length > 0 && !validRegex(char, prefix) && !(nodeBefore && nodeBefore.type === state.schema.nodes.hardBreak)) { return null; } // fixes the following case: my `*name` is * // expected result: should ignore special characters inside "code" if (state.schema.marks.code && state.schema.marks.code.isInSet(state.doc.resolve(from + 1).marks())) { return null; } // Prevent autoformatting across hardbreaks let containsHardBreak; state.doc.nodesBetween(from, to, node => { if (node.type === schema.nodes.hardBreak) { containsHardBreak = true; return false; } return !containsHardBreak; }); if (containsHardBreak) { return null; } // fixes autoformatting in heading nodes: # Heading *bold* // expected result: should not autoformat *bold*; <h1>Heading *bold*</h1> if (state.doc.resolve(from).sameParent(state.doc.resolve(to))) { if (!state.doc.resolve(from).parent.type.allowsMarkType(markType)) { return null; } } // apply mark to the range (from, to) let tr = state.tr.addMark(from, to, markType.create()); if (charSize > 1) { // delete special characters after the text // Prosemirror removes the last symbol by itself, so we need to remove "charSize - 1" symbols tr = tr.delete(to - (charSize - 1), to); } return (tr // delete special characters before the text .delete(from, from + charSize) .removeStoredMark(markType)); }; } function addCodeMark(markType, schema, specialChar) { return (state, match, start, end) => { if (match[1] && match[1].length > 0) { const nodeBefore = state.doc.resolve(start + match[1].length).nodeBefore; if (!(nodeBefore && nodeBefore.type === state.schema.nodes.hardBreak)) { return null; } } // fixes autoformatting in heading nodes: # Heading `bold` // expected result: should not autoformat *bold*; <h1>Heading `bold`</h1> if (state.doc.resolve(start).sameParent(state.doc.resolve(end))) { if (!state.doc.resolve(start).parent.type.allowsMarkType(markType)) { return null; } } const regexStart = end - match[2].length + 1; const tr = transformToCodeAction(regexStart, end, state.tr) .delete(regexStart, regexStart + specialChar.length) .removeStoredMark(markType); return tr; }; } export const strongRegex1 = /(\S*)(\_\_([^\_\s](\_(?!\_)|[^\_])*[^\_\s]|[^\_\s])\_\_)$/; export const strongRegex2 = /(\S*)(\*\*([^\*\s](\*(?!\*)|[^\*])*[^\*\s]|[^\*\s])\*\*)$/; export const italicRegex1 = /(\S*[^\s\_]*)(\_([^\s\_][^\_]*[^\s\_]|[^\s\_])\_)$/; export const italicRegex2 = /(\S*[^\s\*]*)(\*([^\s\*][^\*]*[^\s\*]|[^\s\*])\*)$/; export const strikeRegex = /(\S*)(\~\~([^\s\~](\~(?!\~)|[^\~])*[^\s\~]|[^\s\~])\~\~)$/; export const codeRegex = /(\S*)(`[^\s][^`]*`)$/; /** * Create input rules for strong mark * * @param {Schema} schema * @returns {InputRule[]} */ function getStrongInputRules(schema) { // **string** or __strong__ should bold the text const markLength = 2; const doubleUnderscoreRule = createInputRule(strongRegex1, addMark(schema.marks.strong, schema, markLength, '__')); const doubleAsterixRule = createInputRule(strongRegex2, addMark(schema.marks.strong, schema, markLength, '**')); return [ doubleUnderscoreRule, doubleAsterixRule, ]; } /** * Create input rules for em mark * * @param {Schema} schema * @returns {InputRule[]} */ function getItalicInputRules(schema) { // *string* or _string_ should italic the text const markLength = 1; const underscoreRule = createInputRule(italicRegex1, addMark(schema.marks.em, schema, markLength, '_')); const asterixRule = createInputRule(italicRegex2, addMark(schema.marks.em, schema, markLength, '*')); return [ underscoreRule, asterixRule, ]; } /** * Create input rules for strike mark * * @param {Schema} schema * @returns {InputRule[]} */ function getStrikeInputRules(schema) { const markLength = 2; const doubleTildeRule = createInputRule(strikeRegex, addMark(schema.marks.strike, schema, markLength, '~~')); return [doubleTildeRule]; } /** * Create input rules for code mark * * @param {Schema} schema * @returns {InputRule[]} */ function getCodeInputRules(schema) { const backTickRule = createInputRule(codeRegex, addCodeMark(schema.marks.code, schema, '`')); return [backTickRule]; } export function inputRulePlugin(schema) { const rules = []; if (schema.marks.strong) { rules.push(...getStrongInputRules(schema)); } if (schema.marks.em) { rules.push(...getItalicInputRules(schema)); } if (schema.marks.strike) { rules.push(...getStrikeInputRules(schema)); } if (schema.marks.code) { rules.push(...getCodeInputRules(schema)); } if (rules.length !== 0) { return inputRules({ rules }); } } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5mb3JtYXR0aW5nLmlucHV0cnVsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B6b2RpYWMtdWkvZWRpdG9yLyIsInNvdXJjZXMiOlsicGx1Z2lucy90ZXh0LWZvcm1hdHRpbmcvdGV4dC5mb3JtYXR0aW5nLmlucHV0cnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHL0QsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQTtBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFL0MsTUFBTSxXQUFXLEdBQUc7SUFDaEIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNqQixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ2pCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDZixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ2YsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO0NBQy9CLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxHQUFXLEVBQVcsRUFBRTtJQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUMzQyxJQUFJLEdB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QztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzFDLE1BQU0sS0FBSyxHQUFxQixFQUFFLENBQUM7SUFFbkMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUVELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7UUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDOUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ3JCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM1QztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0UnVsZSwgaW5wdXRSdWxlcyB9IGZyb20gJ3Byb3NlbWlycm9yLWlucHV0cnVsZXMnO1xyXG5pbXBvcnQgeyBTY2hlbWEsIE1hcmtUeXBlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xyXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUlucHV0UnVsZSwgSW5wdXRSdWxlSGFuZGxlciB9IGZyb20gXCIuLi8uLi9saWIvdXRpbHMvaW5wdXQtcnVsZXNcIlxyXG5pbXBvcnQgeyB0cmFuc2Zvcm1Ub0NvZGVBY3Rpb24gfSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCB2YWxpZENvbWJvcyA9IHtcclxuICAgICcqKic6IFsnXycsICd+fiddLFxyXG4gICAgJyonOiBbJ19fJywgJ35+J10sXHJcbiAgICBfXzogWycqJywgJ35+J10sXHJcbiAgICBfOiBbJyoqJywgJ35+J10sXHJcbiAgICAnfn4nOiBbJ19fJywgJ18nLCAnKionLCAnKiddLFxyXG59O1xyXG5cclxuY29uc3QgdmFsaWRSZWdleCA9IChjaGFyOiBzdHJpbmcsIHN0cjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkQ29tYm9zW2NoYXJdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2ggPSB2YWxpZENvbWJvc1tjaGFyXVtpXTtcclxuICAgICAgICBpZiAoY2ggPT09IHN0cikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWF0Y2hMZW5ndGggPSBzdHIubGVuZ3RoIC0gY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzdHIuc3Vic3RyKG1hdGNoTGVuZ3RoLCBzdHIubGVuZ3RoKSA9PT0gY2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkUmVnZXgoY2gsIHN0ci5zdWJzdHIoMCwgbWF0Y2hMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBhZGRNYXJrKFxyXG4gICAgbWFya1R5cGU6IE1hcmtUeXBlLFxyXG4gICAgc2NoZW1hOiBTY2hlbWEsXHJcbiAgICBjaGFyU2l6ZTogbnVtYmVyLFxyXG4gICAgY2hhcjogc3RyaW5nLFxyXG4pOiBJbnB1dFJ1bGVIYW5kbGVyIHtcclxuICAgIHJldHVybiAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgcHJlZml4LCB0ZXh0V2l0aENvbWJvXSA9IG1hdGNoO1xyXG4gICAgICAgIGNvbnN0IHRvID0gZW5kO1xyXG4gICAgICAgIC8vIGluIGNhc2Ugb2YgKnN0cmluZyogcGF0dGVybiBpdCBtYXRjaGVzIHRoZSB0ZXh0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSBwYXJhZ3JhcGgsXHJcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50ICoqIHRvIHdvcmsgZm9yIHN0cm9uZyB0ZXh0XHJcbiAgICAgICAgLy8gdGhhdCdzIHdoeSBcInN0YXJ0XCIgYXJndW1lbnQgaXMgd3JvbmcgYW5kIHdlIG5lZWQgdG8gY2FsY3VsYXRlIGl0IG91cnNlbHZlc1xyXG4gICAgICAgIGNvbnN0IGZyb20gPSB0ZXh0V2l0aENvbWJvID8gc3RhcnQgKyBwcmVmaXgubGVuZ3RoIDogc3RhcnQ7XHJcbiAgICAgICAgY29uc3Qgbm9kZUJlZm9yZSA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0ICsgcHJlZml4Lmxlbmd0aCkubm9kZUJlZm9yZTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBwcmVmaXggJiZcclxuICAgICAgICAgICAgcHJlZml4Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgIXZhbGlkUmVnZXgoY2hhciwgcHJlZml4KSAmJlxyXG4gICAgICAgICAgICAhKG5vZGVCZWZvcmUgJiYgbm9kZUJlZm9yZS50eXBlID09PSBzdGF0ZS5zY2hlbWEubm9kZXMuaGFyZEJyZWFrKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZml4ZXMgdGhlIGZvbGxvd2luZyBjYXNlOiBteSBgKm5hbWVgIGlzICpcclxuICAgICAgICAvLyBleHBlY3RlZCByZXN1bHQ6IHNob3VsZCBpZ25vcmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluc2lkZSBcImNvZGVcIlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgc3RhdGUuc2NoZW1hLm1hcmtzLmNvZGUgJiZcclxuICAgICAgICAgICAgc3RhdGUuc2NoZW1hLm1hcmtzLmNvZGUuaXNJblNldChzdGF0ZS5kb2MucmVzb2x2ZShmcm9tICsgMSkubWFya3MoKSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGF1dG9mb3JtYXR0aW5nIGFjcm9zcyBoYXJkYnJlYWtzXHJcbiAgICAgICAgbGV0IGNvbnRhaW5zSGFyZEJyZWFrO1xyXG4gICAgICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIG5vZGUgPT4ge1xyXG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBzY2hlbWEubm9kZXMuaGFyZEJyZWFrKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluc0hhcmRCcmVhayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICFjb250YWluc0hhcmRCcmVhaztcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udGFpbnNIYXJkQnJlYWspIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmaXhlcyBhdXRvZm9ybWF0dGluZyBpbiBoZWFkaW5nIG5vZGVzOiAjIEhlYWRpbmcgKmJvbGQqXHJcbiAgICAgICAgLy8gZXhwZWN0ZWQgcmVzdWx0OiBzaG91bGQgbm90IGF1dG9mb3JtYXQgKmJvbGQqOyA8aDE+SGVhZGluZyAqYm9sZCo8L2gxPlxyXG4gICAgICAgIGlmIChzdGF0ZS5kb2MucmVzb2x2ZShmcm9tKS5zYW1lUGFyZW50KHN0YXRlLmRvYy5yZXNvbHZlKHRvKSkpIHtcclxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5kb2MucmVzb2x2ZShmcm9tKS5wYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhcHBseSBtYXJrIHRvIHRoZSByYW5nZSAoZnJvbSwgdG8pXHJcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuYWRkTWFyayhmcm9tLCB0bywgbWFya1R5cGUuY3JlYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAoY2hhclNpemUgPiAxKSB7XHJcbiAgICAgICAgICAgIC8vIGRlbGV0ZSBzcGVjaWFsIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIHRleHRcclxuICAgICAgICAgICAgLy8gUHJvc2VtaXJyb3IgcmVtb3ZlcyB0aGUgbGFzdCBzeW1ib2wgYnkgaXRzZWxmLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSBcImNoYXJTaXplIC0gMVwiIHN5bWJvbHNcclxuICAgICAgICAgICAgdHIgPSB0ci5kZWxldGUodG8gLSAoY2hhclNpemUgLSAxKSwgdG8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdHJcclxuICAgICAgICAgICAgLy8gZGVsZXRlIHNwZWNpYWwgY2hhcmFjdGVycyBiZWZvcmUgdGhlIHRleHRcclxuICAgICAgICAgICAgICAgIC5kZWxldGUoZnJvbSwgZnJvbSArIGNoYXJTaXplKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZVN0b3JlZE1hcmsobWFya1R5cGUpXHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZENvZGVNYXJrKFxyXG4gICAgbWFya1R5cGU6IE1hcmtUeXBlLFxyXG4gICAgc2NoZW1hOiBTY2hlbWEsXHJcbiAgICBzcGVjaWFsQ2hhcjogc3RyaW5nLFxyXG4pOiBJbnB1dFJ1bGVIYW5kbGVyIHtcclxuICAgIHJldHVybiAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoWzFdICYmIG1hdGNoWzFdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZUJlZm9yZSA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0ICsgbWF0Y2hbMV0ubGVuZ3RoKS5ub2RlQmVmb3JlO1xyXG4gICAgICAgICAgICBpZiAoIShub2RlQmVmb3JlICYmIG5vZGVCZWZvcmUudHlwZSA9PT0gc3RhdGUuc2NoZW1hLm5vZGVzLmhhcmRCcmVhaykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZpeGVzIGF1dG9mb3JtYXR0aW5nIGluIGhlYWRpbmcgbm9kZXM6ICMgSGVhZGluZyBgYm9sZGBcclxuICAgICAgICAvLyBleHBlY3RlZCByZXN1bHQ6IHNob3VsZCBub3QgYXV0b2Zvcm1hdCAqYm9sZCo7IDxoMT5IZWFkaW5nIGBib2xkYDwvaDE+XHJcbiAgICAgICAgaWYgKHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0KS5zYW1lUGFyZW50KHN0YXRlLmRvYy5yZXNvbHZlKGVuZCkpKSB7XHJcbiAgICAgICAgICAgIGlmICghc3RhdGUuZG9jLnJlc29sdmUoc3RhcnQpLnBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVnZXhTdGFydCA9IGVuZCAtIG1hdGNoWzJdLmxlbmd0aCArIDE7XHJcbiAgICAgICAgY29uc3QgdHIgPSB0cmFuc2Zvcm1Ub0NvZGVBY3Rpb24ocmVnZXhTdGFydCwgZW5kLCBzdGF0ZS50cilcclxuICAgICAgICAgICAgLmRlbGV0ZShyZWdleFN0YXJ0LCByZWdleFN0YXJ0ICsgc3BlY2lhbENoYXIubGVuZ3RoKVxyXG4gICAgICAgICAgICAucmVtb3ZlU3RvcmVkTWFyayhtYXJrVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRyO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHN0cm9uZ1JlZ2V4MSA9IC8oXFxTKikoXFxfXFxfKFteXFxfXFxzXShcXF8oPyFcXF8pfFteXFxfXSkqW15cXF9cXHNdfFteXFxfXFxzXSlcXF9cXF8pJC87XHJcbmV4cG9ydCBjb25zdCBzdHJvbmdSZWdleDIgPSAvKFxcUyopKFxcKlxcKihbXlxcKlxcc10oXFwqKD8hXFwqKXxbXlxcKl0pKlteXFwqXFxzXXxbXlxcKlxcc10pXFwqXFwqKSQvO1xyXG5leHBvcnQgY29uc3QgaXRhbGljUmVnZXgxID0gLyhcXFMqW15cXHNcXF9dKikoXFxfKFteXFxzXFxfXVteXFxfXSpbXlxcc1xcX118W15cXHNcXF9dKVxcXykkLztcclxuZXhwb3J0IGNvbnN0IGl0YWxpY1JlZ2V4MiA9IC8oXFxTKlteXFxzXFwqXSopKFxcKihbXlxcc1xcKl1bXlxcKl0qW15cXHNcXCpdfFteXFxzXFwqXSlcXCopJC87XHJcbmV4cG9ydCBjb25zdCBzdHJpa2VSZWdleCA9IC8oXFxTKikoXFx+XFx+KFteXFxzXFx+XShcXH4oPyFcXH4pfFteXFx+XSkqW15cXHNcXH5dfFteXFxzXFx+XSlcXH5cXH4pJC87XHJcbmV4cG9ydCBjb25zdCBjb2RlUmVnZXggPSAvKFxcUyopKGBbXlxcc11bXmBdKmApJC87XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGlucHV0IHJ1bGVzIGZvciBzdHJvbmcgbWFya1xyXG4gKlxyXG4gKiBAcGFyYW0ge1NjaGVtYX0gc2NoZW1hXHJcbiAqIEByZXR1cm5zIHtJbnB1dFJ1bGVbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldFN0cm9uZ0lucHV0UnVsZXMoc2NoZW1hOiBTY2hlbWEpOiBJbnB1dFJ1bGVbXSB7XHJcbiAgICAvLyAqKnN0cmluZyoqIG9yIF9fc3Ryb25nX18gc2hvdWxkIGJvbGQgdGhlIHRleHRcclxuXHJcbiAgICBjb25zdCBtYXJrTGVuZ3RoID0gMjtcclxuICAgIGNvbnN0IGRvdWJsZVVuZGVyc2NvcmVSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIHN0cm9uZ1JlZ2V4MSxcclxuICAgICAgICBhZGRNYXJrKHNjaGVtYS5tYXJrcy5zdHJvbmcsIHNjaGVtYSwgbWFya0xlbmd0aCwgJ19fJyksXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGRvdWJsZUFzdGVyaXhSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIHN0cm9uZ1JlZ2V4MixcclxuICAgICAgICBhZGRNYXJrKHNjaGVtYS5tYXJrcy5zdHJvbmcsIHNjaGVtYSwgbWFya0xlbmd0aCwgJyoqJyksXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgZG91YmxlVW5kZXJzY29yZVJ1bGUsXHJcbiAgICAgICAgZG91YmxlQXN0ZXJpeFJ1bGUsXHJcbiAgICBdO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGlucHV0IHJ1bGVzIGZvciBlbSBtYXJrXHJcbiAqXHJcbiAqIEBwYXJhbSB7U2NoZW1hfSBzY2hlbWFcclxuICogQHJldHVybnMge0lucHV0UnVsZVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0SXRhbGljSW5wdXRSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVtdIHtcclxuICAgIC8vICpzdHJpbmcqIG9yIF9zdHJpbmdfIHNob3VsZCBpdGFsaWMgdGhlIHRleHRcclxuICAgIGNvbnN0IG1hcmtMZW5ndGggPSAxO1xyXG5cclxuICAgIGNvbnN0IHVuZGVyc2NvcmVSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIGl0YWxpY1JlZ2V4MSxcclxuICAgICAgICBhZGRNYXJrKHNjaGVtYS5tYXJrcy5lbSwgc2NoZW1hLCBtYXJrTGVuZ3RoLCAnXycpLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBhc3Rlcml4UnVsZSA9IGNyZWF0ZUlucHV0UnVsZShcclxuICAgICAgICBpdGFsaWNSZWdleDIsXHJcbiAgICAgICAgYWRkTWFyayhzY2hlbWEubWFya3MuZW0sIHNjaGVtYSwgbWFya0xlbmd0aCwgJyonKSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICB1bmRlcnNjb3JlUnVsZSxcclxuICAgICAgICBhc3Rlcml4UnVsZSxcclxuICAgIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgaW5wdXQgcnVsZXMgZm9yIHN0cmlrZSBtYXJrXHJcbiAqXHJcbiAqIEBwYXJhbSB7U2NoZW1hfSBzY2hlbWFcclxuICogQHJldHVybnMge0lucHV0UnVsZVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U3RyaWtlSW5wdXRSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVtdIHtcclxuICAgIGNvbnN0IG1hcmtMZW5ndGggPSAyO1xyXG4gICAgY29uc3QgZG91YmxlVGlsZGVSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIHN0cmlrZVJlZ2V4LFxyXG4gICAgICAgIGFkZE1hcmsoc2NoZW1hLm1hcmtzLnN0cmlrZSwgc2NoZW1hLCBtYXJrTGVuZ3RoLCAnfn4nKSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIFtkb3VibGVUaWxkZVJ1bGVdO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGlucHV0IHJ1bGVzIGZvciBjb2RlIG1hcmtcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlW119XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2RlSW5wdXRSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVtdIHtcclxuICAgIGNvbnN0IGJhY2tUaWNrUnVsZSA9IGNyZWF0ZUlucHV0UnVsZShcclxuICAgICAgICBjb2RlUmVnZXgsXHJcbiAgICAgICAgYWRkQ29kZU1hcmsoc2NoZW1hLm1hcmtzLmNvZGUsIHNjaGVtYSwgJ2AnKSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIFtiYWNrVGlja1J1bGVdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5wdXRSdWxlUGx1Z2luKHNjaGVtYTogU2NoZW1hKTogUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxJbnB1dFJ1bGU+ID0gW107XHJcblxyXG4gICAgaWYgKHNjaGVtYS5tYXJrcy5zdHJvbmcpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldFN0cm9uZ0lucHV0UnVsZXMoc2NoZW1hKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNjaGVtYS5tYXJrcy5lbSkge1xyXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uZ2V0SXRhbGljSW5wdXRSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm1hcmtzLnN0cmlrZSkge1xyXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uZ2V0U3RyaWtlSW5wdXRSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm1hcmtzLmNvZGUpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldENvZGVJbnB1dFJ1bGVzKHNjaGVtYSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChydWxlcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRSdWxlcyh7IHJ1bGVzIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==