@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
109 lines • 17.2 kB
JavaScript
import { textblockTypeInputRule, wrappingInputRule, inputRules, } from 'prosemirror-inputrules';
import { safeInsert } from 'prosemirror-utils';
import { createInputRule, defaultInputRuleHandler, leafNodeReplacementCharacter, } from "../../lib/utils/input-rules";
import { isConvertableToCodeBlock, transformToCodeBlockAction } from "./block-type.command";
import { insertBlock } from "./insert-block";
const MAX_HEADING_LEVEL = 6;
function getHeadingLevel(match) {
return {
level: match[1].length,
};
}
export function headingRule(nodeType, maxLevel) {
return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\s$'), nodeType, getHeadingLevel);
}
export function blockQuoteRule(nodeType) {
return wrappingInputRule(/^\s*>\s$/, nodeType);
}
export function codeBlockRule(nodeType) {
return textblockTypeInputRule(/^```$/, nodeType);
}
/**
* Get heading rules
*
* @param {Schema} schema
* @returns {InputRuleWithHandler[]}
*/
function getHeadingRules(schema) {
// '# ' for h1, '## ' for h2 and etc
const hashRule = defaultInputRuleHandler(headingRule(schema.nodes.heading, MAX_HEADING_LEVEL), true);
const leftNodeReplacementHashRule = createInputRule(new RegExp(`${leafNodeReplacementCharacter}(#{1,6})\\s$`), (state, match, start, end) => {
const level = match[1].length;
return insertBlock(state, schema.nodes.heading, `heading${level}`, start, end, { level });
}, true);
// Old analytics stuff
const currentHandler = hashRule.handler;
hashRule.handler = (state, match, start, end) => {
return currentHandler(state, match, start, end);
};
return [
hashRule,
leftNodeReplacementHashRule,
];
}
/**
* Get all block quote input rules
*
* @param {Schema} schema
* @returns {InputRuleWithHandler[]}
*/
function getBlockQuoteRules(schema) {
// '> ' for blockquote
const greatherThanRule = defaultInputRuleHandler(blockQuoteRule(schema.nodes.blockquote), true);
const leftNodeReplacementGreatherRule = createInputRule(new RegExp(`${leafNodeReplacementCharacter}\\s*>\\s$`), (state, match, start, end) => {
return insertBlock(state, schema.nodes.blockquote, 'blockquote', start, end);
}, true);
return [
greatherThanRule,
leftNodeReplacementGreatherRule,
];
}
/**
* Get all code block input rules
*
* @param {Schema} schema
* @returns {InputRuleWithHandler[]}
*/
function getCodeBlockRules(schema) {
const threeTildeRule = createInputRule(/((^`{3,})|(\s`{3,}))(\S*)$/, (state, match, start, end) => {
const attributes = {};
if (match[4]) {
attributes.language = match[4];
}
const newStart = match[0][0] === ' ' ? start + 1 : start;
if (isConvertableToCodeBlock(state)) {
return transformToCodeBlockAction(state, attributes)
// remove markdown decorator ```
.delete(newStart, end)
.scrollIntoView();
}
let { tr } = state;
tr = tr.delete(newStart, end);
const codeBlock = state.schema.nodes.codeBlock.createChecked();
return safeInsert(codeBlock)(tr);
}, true);
const leftNodeReplacementThreeTildeRule = createInputRule(new RegExp(`((${leafNodeReplacementCharacter}\`{3,})|(\\s\`{3,}))(\\S*)$`), (state, match, start, end) => {
const attributes = {};
if (match[4]) {
attributes.language = match[4];
}
return insertBlock(state, schema.nodes.codeBlock, 'codeblock', start, end, attributes);
}, true);
return [threeTildeRule, leftNodeReplacementThreeTildeRule];
}
export function inputRulePlugin(schema) {
const rules = [];
if (schema.nodes.heading) {
rules.push(...getHeadingRules(schema));
}
if (schema.nodes.blockquote) {
rules.push(...getBlockQuoteRules(schema));
}
if (schema.nodes.codeBlock) {
rules.push(...getCodeBlockRules(schema));
}
if (rules.length !== 0) {
return inputRules({ rules });
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stdHlwZS5pbnB1dHJ1bGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbInBsdWdpbnMvYmxvY2stdHlwZS9ibG9jay10eXBlLmlucHV0cnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixVQUFVLEdBR2IsTUFBTSx3QkFBd0IsQ0FBQztBQUdoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsT0FBTyxFQUNILGVBQWUsRUFDZix1QkFBdUIsRUFFdkIsNEJBQTRCLEdBQy9CLE1BQU0sNkJBQTZCLENBQUE7QUFDcEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTVDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRTVCLFNBQVMsZUFBZSxDQUFDLEtBQWU7SUFDcEMsT0FBTztRQUNILEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBdUI7S0FDMUMsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWtCLEVBQUUsUUFBZ0I7SUFDNUQsT0FBTyxzQkFBc0IsQ0FDekIsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFDMUMsUUFBUSxFQUNSLGVBQWUsQ0FDTSxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWtCO0lBQzdDLE9BQU8saUJBQWlCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBeUIsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFrQjtJQUM1QyxPQUFPLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMs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QUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM3QztJQUVELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7UUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDNUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNoQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSxcclxuICAgIHdyYXBwaW5nSW5wdXRSdWxlLFxyXG4gICAgaW5wdXRSdWxlcyxcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIElucHV0UnVsZSxcclxufSBmcm9tICdwcm9zZW1pcnJvci1pbnB1dHJ1bGVzJztcclxuaW1wb3J0IHsgU2NoZW1hLCBOb2RlVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcclxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xyXG5pbXBvcnQgeyBzYWZlSW5zZXJ0IH0gZnJvbSAncHJvc2VtaXJyb3ItdXRpbHMnO1xyXG5pbXBvcnQgeyBIZWFkaW5nTGV2ZWxzIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiXHJcbmltcG9ydCB7XHJcbiAgICBjcmVhdGVJbnB1dFJ1bGUsXHJcbiAgICBkZWZhdWx0SW5wdXRSdWxlSGFuZGxlcixcclxuICAgIElucHV0UnVsZVdpdGhIYW5kbGVyLFxyXG4gICAgbGVhZk5vZGVSZXBsYWNlbWVudENoYXJhY3RlcixcclxufSBmcm9tIFwiLi4vLi4vbGliL3V0aWxzL2lucHV0LXJ1bGVzXCJcclxuaW1wb3J0IHsgaXNDb252ZXJ0YWJsZVRvQ29kZUJsb2NrLCB0cmFuc2Zvcm1Ub0NvZGVCbG9ja0FjdGlvbiB9IGZyb20gXCIuL2Jsb2NrLXR5cGUuY29tbWFuZFwiXHJcbmltcG9ydCB7IGluc2VydEJsb2NrIH0gZnJvbSBcIi4vaW5zZXJ0LWJsb2NrXCJcclxuXHJcbmNvbnN0IE1BWF9IRUFESU5HX0xFVkVMID0gNjtcclxuXHJcbmZ1bmN0aW9uIGdldEhlYWRpbmdMZXZlbChtYXRjaDogc3RyaW5nW10pOiB7IGxldmVsOiBIZWFkaW5nTGV2ZWxzIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBsZXZlbDogbWF0Y2hbMV0ubGVuZ3RoIGFzIEhlYWRpbmdMZXZlbHMsXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGVhZGluZ1J1bGUobm9kZVR5cGU6IE5vZGVUeXBlLCBtYXhMZXZlbDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGV4dGJsb2NrVHlwZUlucHV0UnVsZShcclxuICAgICAgICBuZXcgUmVnRXhwKCdeKCN7MSwnICsgbWF4TGV2ZWwgKyAnfSlcXFxccyQnKSxcclxuICAgICAgICBub2RlVHlwZSxcclxuICAgICAgICBnZXRIZWFkaW5nTGV2ZWwsXHJcbiAgICApIGFzIElucHV0UnVsZVdpdGhIYW5kbGVyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tRdW90ZVJ1bGUobm9kZVR5cGU6IE5vZGVUeXBlKSB7XHJcbiAgICByZXR1cm4gd3JhcHBpbmdJbnB1dFJ1bGUoL15cXHMqPlxccyQvLCBub2RlVHlwZSkgYXMgSW5wdXRSdWxlV2l0aEhhbmRsZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb2RlQmxvY2tSdWxlKG5vZGVUeXBlOiBOb2RlVHlwZSkge1xyXG4gICAgcmV0dXJuIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL15gYGAkLywgbm9kZVR5cGUpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGhlYWRpbmcgcnVsZXNcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlV2l0aEhhbmRsZXJbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldEhlYWRpbmdSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVdpdGhIYW5kbGVyW10ge1xyXG4gICAgLy8gJyMgJyBmb3IgaDEsICcjIyAnIGZvciBoMiBhbmQgZXRjXHJcbiAgICBjb25zdCBoYXNoUnVsZSA9IGRlZmF1bHRJbnB1dFJ1bGVIYW5kbGVyKFxyXG4gICAgICAgIGhlYWRpbmdSdWxlKHNjaGVtYS5ub2Rlcy5oZWFkaW5nLCBNQVhfSEVBRElOR19MRVZFTCksXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbGVmdE5vZGVSZXBsYWNlbWVudEhhc2hSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7bGVhZk5vZGVSZXBsYWNlbWVudENoYXJhY3Rlcn0oI3sxLDZ9KVxcXFxzJGApLFxyXG4gICAgICAgIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGV2ZWwgPSBtYXRjaFsxXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnRCbG9jayhcclxuICAgICAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmhlYWRpbmcsXHJcbiAgICAgICAgICAgICAgICBgaGVhZGluZyR7bGV2ZWx9YCxcclxuICAgICAgICAgICAgICAgIHN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgZW5kLFxyXG4gICAgICAgICAgICAgICAgeyBsZXZlbCB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gT2xkIGFuYWx5dGljcyBzdHVmZlxyXG4gICAgY29uc3QgY3VycmVudEhhbmRsZXIgPSBoYXNoUnVsZS5oYW5kbGVyO1xyXG4gICAgaGFzaFJ1bGUuaGFuZGxlciA9IChzdGF0ZSwgbWF0Y2g6IHN0cmluZ1tdLCBzdGFydCwgZW5kKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRIYW5kbGVyKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgaGFzaFJ1bGUsXHJcbiAgICAgICAgbGVmdE5vZGVSZXBsYWNlbWVudEhhc2hSdWxlLFxyXG4gICAgXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBhbGwgYmxvY2sgcXVvdGUgaW5wdXQgcnVsZXNcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlV2l0aEhhbmRsZXJbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldEJsb2NrUXVvdGVSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVdpdGhIYW5kbGVyW10ge1xyXG4gICAgLy8gJz4gJyBmb3IgYmxvY2txdW90ZVxyXG4gICAgY29uc3QgZ3JlYXRoZXJUaGFuUnVsZSA9IGRlZmF1bHRJbnB1dFJ1bGVIYW5kbGVyKFxyXG4gICAgICAgIGJsb2NrUXVvdGVSdWxlKHNjaGVtYS5ub2Rlcy5ibG9ja3F1b3RlKSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsZWZ0Tm9kZVJlcGxhY2VtZW50R3JlYXRoZXJSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7bGVhZk5vZGVSZXBsYWNlbWVudENoYXJhY3Rlcn1cXFxccyo+XFxcXHMkYCksXHJcbiAgICAgICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0QmxvY2soXHJcbiAgICAgICAgICAgICAgICBzdGF0ZSxcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy5ibG9ja3F1b3RlLFxyXG4gICAgICAgICAgICAgICAgJ2Jsb2NrcXVvdGUnLFxyXG4gICAgICAgICAgICAgICAgc3RhcnQsXHJcbiAgICAgICAgICAgICAgICBlbmQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgIGdyZWF0aGVyVGhhblJ1bGUsXHJcbiAgICAgICAgbGVmdE5vZGVSZXBsYWNlbWVudEdyZWF0aGVyUnVsZSxcclxuICAgIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYWxsIGNvZGUgYmxvY2sgaW5wdXQgcnVsZXNcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlV2l0aEhhbmRsZXJbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldENvZGVCbG9ja1J1bGVzKHNjaGVtYTogU2NoZW1hKTogSW5wdXRSdWxlV2l0aEhhbmRsZXJbXSB7XHJcbiAgICBjb25zdCB0aHJlZVRpbGRlUnVsZSA9IGNyZWF0ZUlucHV0UnVsZShcclxuICAgICAgICAvKCheYHszLH0pfChcXHNgezMsfSkpKFxcUyopJC8sXHJcbiAgICAgICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxhbmd1YWdlID0gbWF0Y2hbNF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBtYXRjaFswXVswXSA9PT0gJyAnID8gc3RhcnQgKyAxIDogc3RhcnQ7XHJcbiAgICAgICAgICAgIGlmIChpc0NvbnZlcnRhYmxlVG9Db2RlQmxvY2soc3RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtVG9Db2RlQmxvY2tBY3Rpb24oc3RhdGUsIGF0dHJpYnV0ZXMpXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2Rvd24gZGVjb3JhdG9yIGBgYFxyXG4gICAgICAgICAgICAgICAgICAgIC5kZWxldGUobmV3U3RhcnQsIGVuZClcclxuICAgICAgICAgICAgICAgICAgICAuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgeyB0ciB9ID0gc3RhdGU7XHJcbiAgICAgICAgICAgIHRyID0gdHIuZGVsZXRlKG5ld1N0YXJ0LCBlbmQpO1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBzdGF0ZS5zY2hlbWEubm9kZXMuY29kZUJsb2NrLmNyZWF0ZUNoZWNrZWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNhZmVJbnNlcnQoY29kZUJsb2NrKSh0cik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsZWZ0Tm9kZVJlcGxhY2VtZW50VGhyZWVUaWxkZVJ1bGUgPSBjcmVhdGVJbnB1dFJ1bGUoXHJcbiAgICAgICAgbmV3IFJlZ0V4cChgKCgke2xlYWZOb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJ9XFxgezMsfSl8KFxcXFxzXFxgezMsfSkpKFxcXFxTKikkYCksXHJcbiAgICAgICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxhbmd1YWdlID0gbWF0Y2hbNF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGluc2VydEJsb2NrKFxyXG4gICAgICAgICAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBzY2hlbWEubm9kZXMuY29kZUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgJ2NvZGVibG9jaycsXHJcbiAgICAgICAgICAgICAgICBzdGFydCxcclxuICAgICAgICAgICAgICAgIGVuZCxcclxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gW3RocmVlVGlsZGVSdWxlLCBsZWZ0Tm9kZVJlcGxhY2VtZW50VGhyZWVUaWxkZVJ1bGVdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5wdXRSdWxlUGx1Z2luKHNjaGVtYTogU2NoZW1hKTogUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxJbnB1dFJ1bGVXaXRoSGFuZGxlcj4gPSBbXTtcclxuXHJcbiAgICBpZiAoc2NoZW1hLm5vZGVzLmhlYWRpbmcpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldEhlYWRpbmdSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm5vZGVzLmJsb2NrcXVvdGUpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldEJsb2NrUXVvdGVSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm5vZGVzLmNvZGVCbG9jaykge1xyXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uZ2V0Q29kZUJsb2NrUnVsZXMoc2NoZW1hKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBpbnB1dFJ1bGVzKHsgcnVsZXMgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19