ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
240 lines • 21.2 kB
JavaScript
import * as sl from 'prosemirror-schema-list';
import { toStyleString } from 'ngx-editor/utils';
const doc = {
content: 'block+',
};
// :: NodeSpec The text node.
const text = {
group: 'inline',
};
// :: NodeSpec A plain paragraph textblock. Represented in the DOM
// as a `<p>` element.
const paragraph = {
content: 'inline*',
group: 'block',
attrs: {
align: {
default: null,
},
},
parseDOM: [
{
tag: 'p',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
align,
};
},
},
],
toDOM(node) {
const { align } = node.attrs;
const styles = {
textAlign: align !== 'left' ? align : null,
};
const style = toStyleString(styles) || null;
return ['p', { style }, 0];
},
};
// :: NodeSpec A blockquote (`<blockquote>`) wrapping one or more blocks.
const blockquote = {
content: 'block+',
group: 'block',
defining: true,
parseDOM: [{ tag: 'blockquote' }],
toDOM() {
return ['blockquote', 0];
},
};
// :: NodeSpec A horizontal rule (`<hr>`).
const horizontalRule = {
group: 'block',
parseDOM: [{ tag: 'hr' }],
toDOM() {
return ['hr'];
},
};
// :: NodeSpec A heading textblock, with a `level` attribute that
// should hold the number 1 to 6. Parsed and serialized as `<h1>` to
// `<h6>` elements.
const heading = {
attrs: {
level: {
default: 1,
},
align: {
default: null,
},
},
content: 'inline*',
group: 'block',
defining: true,
parseDOM: [
{
tag: 'h1',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 1,
align,
};
},
},
{
tag: 'h2',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 2,
align,
};
},
},
{
tag: 'h3',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 3,
align,
};
},
},
{
tag: 'h4',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 4,
align,
};
},
},
{
tag: 'h5',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 5,
align,
};
},
},
{
tag: 'h6',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 6,
align,
};
},
},
],
toDOM(node) {
const { level, align } = node.attrs;
const styles = {
textAlign: align !== 'left' ? align : null,
};
const style = toStyleString(styles) || null;
return [`h${level}`, { style }, 0];
},
};
// :: NodeSpec A code listing. Disallows marks or non-text inline
// nodes by default. Represented as a `<pre>` element with a
// `<code>` element inside of it.
const codeBlock = {
content: 'text*',
marks: '',
group: 'block',
code: true,
defining: true,
parseDOM: [
{
tag: 'pre',
preserveWhitespace: 'full',
},
],
toDOM() {
return ['pre', ['code', 0]];
},
};
// :: NodeSpec A hard line break, represented in the DOM as `<br>`.
const hardBreak = {
inline: true,
group: 'inline',
selectable: false,
parseDOM: [{ tag: 'br' }],
toDOM() {
return ['br'];
},
};
// :: NodeSpec An inline image (`<img>`) node. Supports `src`,
// `alt`, and `href` attributes. The latter two default to the empty
// string.
export const image = {
inline: true,
attrs: {
src: {},
alt: { default: null },
title: { default: null },
width: { default: null },
},
group: 'inline',
draggable: true,
parseDOM: [
{
tag: 'img[src]',
getAttrs(dom) {
return {
src: dom.getAttribute('src'),
title: dom.getAttribute('title'),
alt: dom.getAttribute('alt'),
width: dom.getAttribute('width'),
};
},
},
],
toDOM(node) {
const { src, alt, title, width } = node.attrs;
return ['img', { src, alt, title, width }];
},
};
const listItem = {
...sl.listItem,
content: 'paragraph block*',
};
const orderedList = {
...sl.orderedList,
content: 'list_item+',
group: 'block',
};
const bulletList = {
...sl.bulletList,
content: 'list_item+',
group: 'block',
};
const nodes = {
doc,
text,
paragraph,
blockquote,
horizontal_rule: horizontalRule,
heading,
hard_break: hardBreak,
code_block: codeBlock,
image,
list_item: listItem,
ordered_list: orderedList,
bullet_list: bulletList,
};
export default nodes;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NjaGVtYS9ub2Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxNQUFNLEdBQUcsR0FBYTtJQUNwQixPQUFPLEVBQUUsUUFBUTtDQUNsQixDQUFDO0FBRUYsNkJBQTZCO0FBQzdCLE1BQU0sSUFBSSxHQUFhO0lBQ3JCLEtBQUssRUFBRSxRQUFRO0NBQ2hCLENBQUM7QUFFRixrRUFBa0U7QUFDbEUsc0JBQXNCO0FBQ3RCLE1BQU0sU0FBUyxHQUFhO0lBQzFCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFO1FBQ0wsS0FBSyxFQUFFO1lBQ0wsT0FBTyxFQUFFLElBQUk7U0FDZDtLQUNGO0lBQ0QsUUFBUSxFQUFFO1FBQ1I7WUFDRSxHQUFHLEVBQUUsR0FBRztZQUNSLFFBQVEsQ0FBQyxHQUFnQjtnQkFDdkIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQztnQkFFN0QsT0FBTztvQkFDTCxLQUFLO2lCQUNOLENBQUM7WUFDSixDQUFDO1NBQ0Y7S0FDRjtJQUNELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQWlDO1lBQzNDLFNBQVMsRUFBRSxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDM0MsQ0FBQztRQUNG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S0FBSyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztTQUNGO0tBQ0Y7SUFDRCxLQUFLLENBQUMsSUFBcUI7UUFDekIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRztJQUNmLEdBQUcsRUFBRSxDQUFDLFFBQVE7SUFDZCxPQUFPLEVBQUUsa0JBQWtCO0NBQzVCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixHQUFHLEVBQUUsQ0FBQyxXQUFXO0lBQ2pCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLEtBQUssRUFBRSxPQUFPO0NBQ2YsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLEdBQUcsRUFBRSxDQUFDLFVBQVU7SUFDaEIsT0FBTyxFQUFFLFlBQVk7SUFDckIsS0FBSyxFQUFFLE9BQU87Q0FDZixDQUFDO0FBRUYsTUFBTSxLQUFLLEdBQUc7SUFDWixHQUFHO0lBQ0gsSUFBSTtJQUNKLFNBQVM7SUFDVCxVQUFVO0lBQ1YsZUFBZSxFQUFFLGNBQWM7SUFDL0IsT0FBTztJQUNQLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLEtBQUs7SUFDTCxTQUFTLEVBQUUsUUFBUTtJQUNuQixZQUFZLEVBQUUsV0FBVztJQUN6QixXQUFXLEVBQUUsVUFBVTtDQUN4QixDQUFDO0FBRUYsZUFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET01PdXRwdXRTcGVjLCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgTm9kZVNwZWMgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgKiBhcyBzbCBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5cbmltcG9ydCB7IHRvU3R5bGVTdHJpbmcgfSBmcm9tICduZ3gtZWRpdG9yL3V0aWxzJztcblxuY29uc3QgZG9jOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2Jsb2NrKycsXG59O1xuXG4vLyA6OiBOb2RlU3BlYyBUaGUgdGV4dCBub2RlLlxuY29uc3QgdGV4dDogTm9kZVNwZWMgPSB7XG4gIGdyb3VwOiAnaW5saW5lJyxcbn07XG5cbi8vIDo6IE5vZGVTcGVjIEEgcGxhaW4gcGFyYWdyYXBoIHRleHRibG9jay4gUmVwcmVzZW50ZWQgaW4gdGhlIERPTVxuLy8gYXMgYSBgPHA+YCBlbGVtZW50LlxuY29uc3QgcGFyYWdyYXBoOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2lubGluZSonLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgYXR0cnM6IHtcbiAgICBhbGlnbjoge1xuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICB9LFxuICB9LFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIHRhZzogJ3AnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbGlnbixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgdG9ET00obm9kZSk6IERPTU91dHB1dFNwZWMge1xuICAgIGNvbnN0IHsgYWxpZ24gfSA9IG5vZGUuYXR0cnM7XG5cbiAgICBjb25zdCBzdHlsZXM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gPSB7XG4gICAgICB0ZXh0QWxpZ246IGFsaWduICE9PSAnbGVmdCcgPyBhbGlnbiA6IG51bGwsXG4gICAgfTtcbiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGVTdHJpbmcoc3R5bGVzKSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIFsncCcsIHsgc3R5bGUgfSwgMF07XG4gIH0sXG59O1xuXG4vLyA6OiBOb2RlU3BlYyBBIGJsb2NrcXVvdGUgKGA8YmxvY2txdW90ZT5gKSB3cmFwcGluZyBvbmUgb3IgbW9yZSBibG9ja3MuXG5jb25zdCBibG9ja3F1b3RlOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2Jsb2NrKycsXG4gIGdyb3VwOiAnYmxvY2snLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgcGFyc2VET006IFt7IHRhZzogJ2Jsb2NrcXVvdGUnIH1dLFxuICB0b0RPTSgpOiBET01PdXRwdXRTcGVjIHtcbiAgICByZXR1cm4gWydibG9ja3F1b3RlJywgMF07XG4gIH0sXG59O1xuXG4vLyA6OiBOb2RlU3BlYyBBIGhvcml6b250YWwgcnVsZSAoYDxocj5gKS5cbmNvbnN0IGhvcml6b250YWxSdWxlOiBOb2RlU3BlYyA9IHtcbiAgZ3JvdXA6ICdibG9jaycsXG4gIHBhcnNlRE9NOiBbeyB0YWc6ICdocicgfV0sXG4gIHRvRE9NKCk6IERPTU91dHB1dFNwZWMge1xuICAgIHJldHVybiBbJ2hyJ107XG4gIH0sXG59O1xuXG4vLyA6OiBOb2RlU3BlYyBBIGhlYWRpbmcgdGV4dGJsb2NrLCB3aXRoIGEgYGxldmVsYCBhdHRyaWJ1dGUgdGhhdFxuLy8gc2hvdWxkIGhvbGQgdGhlIG51bWJlciAxIHRvIDYuIFBhcnNlZCBhbmQgc2VyaWFsaXplZCBhcyBgPGgxPmAgdG9cbi8vIGA8aDY+YCBlbGVtZW50cy5cbmNvbnN0IGhlYWRpbmc6IE5vZGVTcGVjID0ge1xuICBhdHRyczoge1xuICAgIGxldmVsOiB7XG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH0sXG4gICAgYWxpZ246IHtcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgfSxcbiAgfSxcbiAgY29udGVudDogJ2lubGluZSonLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAnaDEnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogMSxcbiAgICAgICAgICBhbGlnbixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0YWc6ICdoMicsXG4gICAgICBnZXRBdHRycyhkb206IEhUTUxFbGVtZW50KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHsgdGV4dEFsaWduIH0gPSBkb20uc3R5bGU7XG4gICAgICAgIGNvbnN0IGFsaWduID0gZG9tLmdldEF0dHJpYnV0ZSgnYWxpZ24nKSB8fCB0ZXh0QWxpZ24gfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxldmVsOiAyLFxuICAgICAgICAgIGFsaWduLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRhZzogJ2gzJyxcbiAgICAgIGdldEF0dHJzKGRvbTogSFRNTEVsZW1lbnQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgeyB0ZXh0QWxpZ24gfSA9IGRvbS5zdHlsZTtcbiAgICAgICAgY29uc3QgYWxpZ24gPSBkb20uZ2V0QXR0cmlidXRlKCdhbGlnbicpIHx8IHRleHRBbGlnbiB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGV2ZWw6IDMsXG4gICAgICAgICAgYWxpZ24sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdGFnOiAnaDQnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogNCxcbiAgICAgICAgICBhbGlnbixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0YWc6ICdoNScsXG4gICAgICBnZXRBdHRycyhkb206IEhUTUxFbGVtZW50KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHsgdGV4dEFsaWduIH0gPSBkb20uc3R5bGU7XG4gICAgICAgIGNvbnN0IGFsaWduID0gZG9tLmdldEF0dHJpYnV0ZSgnYWxpZ24nKSB8fCB0ZXh0QWxpZ24gfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxldmVsOiA1LFxuICAgICAgICAgIGFsaWduLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRhZzogJ2g2JyxcbiAgICAgIGdldEF0dHJzKGRvbTogSFRNTEVsZW1lbnQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgeyB0ZXh0QWxpZ24gfSA9IGRvbS5zdHlsZTtcbiAgICAgICAgY29uc3QgYWxpZ24gPSBkb20uZ2V0QXR0cmlidXRlKCdhbGlnbicpIHx8IHRleHRBbGlnbiB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGV2ZWw6IDYsXG4gICAgICAgICAgYWxpZ24sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIHRvRE9NKG5vZGUpOiBET01PdXRwdXRTcGVjIHtcbiAgICBjb25zdCB7IGxldmVsLCBhbGlnbiB9ID0gbm9kZS5hdHRycztcblxuICAgIGNvbnN0IHN0eWxlczogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPiA9IHtcbiAgICAgIHRleHRBbGlnbjogYWxpZ24gIT09ICdsZWZ0JyA/IGFsaWduIDogbnVsbCxcbiAgICB9O1xuICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZVN0cmluZyhzdHlsZXMpIHx8IG51bGw7XG5cbiAgICByZXR1cm4gW2BoJHtsZXZlbH1gLCB7IHN0eWxlIH0sIDBdO1xuICB9LFxufTtcblxuLy8gOjogTm9kZVNwZWMgQSBjb2RlIGxpc3RpbmcuIERpc2FsbG93cyBtYXJrcyBvciBub24tdGV4dCBpbmxpbmVcbi8vIG5vZGVzIGJ5IGRlZmF1bHQuIFJlcHJlc2VudGVkIGFzIGEgYDxwcmU+YCBlbGVtZW50IHdpdGggYVxuLy8gYDxjb2RlPmAgZWxlbWVudCBpbnNpZGUgb2YgaXQuXG5jb25zdCBjb2RlQmxvY2s6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAndGV4dConLFxuICBtYXJrczogJycsXG4gIGdyb3VwOiAnYmxvY2snLFxuICBjb2RlOiB0cnVlLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgcGFyc2VET006IFtcbiAgICB7XG4gICAgICB0YWc6ICdwcmUnLFxuICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiAnZnVsbCcsXG4gICAgfSxcbiAgXSxcbiAgdG9ET00oKTogRE9NT3V0cHV0U3BlYyB7XG4gICAgcmV0dXJuIFsncHJlJywgWydjb2RlJywgMF1dO1xuICB9LFxufTtcblxuLy8gOjogTm9kZVNwZWMgQSBoYXJkIGxpbmUgYnJlYWssIHJlcHJlc2VudGVkIGluIHRoZSBET00gYXMgYDxicj5gLlxuY29uc3QgaGFyZEJyZWFrOiBOb2RlU3BlYyA9IHtcbiAgaW5saW5lOiB0cnVlLFxuICBncm91cDogJ2lubGluZScsXG4gIHNlbGVjdGFibGU6IGZhbHNlLFxuICBwYXJzZURPTTogW3sgdGFnOiAnYnInIH1dLFxuICB0b0RPTSgpOiBET01PdXRwdXRTcGVjIHtcbiAgICByZXR1cm4gWydiciddO1xuICB9LFxufTtcblxuLy8gOjogTm9kZVNwZWMgQW4gaW5saW5lIGltYWdlIChgPGltZz5gKSBub2RlLiBTdXBwb3J0cyBgc3JjYCxcbi8vIGBhbHRgLCBhbmQgYGhyZWZgIGF0dHJpYnV0ZXMuIFRoZSBsYXR0ZXIgdHdvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4vLyBzdHJpbmcuXG5leHBvcnQgY29uc3QgaW1hZ2U6IE5vZGVTcGVjID0ge1xuICBpbmxpbmU6IHRydWUsXG4gIGF0dHJzOiB7XG4gICAgc3JjOiB7fSxcbiAgICBhbHQ6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICB3aWR0aDogeyBkZWZhdWx0OiBudWxsIH0sXG4gIH0sXG4gIGdyb3VwOiAnaW5saW5lJyxcbiAgZHJhZ2dhYmxlOiB0cnVlLFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIHRhZzogJ2ltZ1tzcmNdJyxcbiAgICAgIGdldEF0dHJzKGRvbTogSFRNTEVsZW1lbnQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcmM6IGRvbS5nZXRBdHRyaWJ1dGUoJ3NyYycpLFxuICAgICAgICAgIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKCd0aXRsZScpLFxuICAgICAgICAgIGFsdDogZG9tLmdldEF0dHJpYnV0ZSgnYWx0JyksXG4gICAgICAgICAgd2lkdGg6IGRvbS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIHRvRE9NKG5vZGU6IFByb3NlTWlycm9yTm9kZSk6IERPTU91dHB1dFNwZWMge1xuICAgIGNvbnN0IHsgc3JjLCBhbHQsIHRpdGxlLCB3aWR0aCB9ID0gbm9kZS5hdHRycztcbiAgICByZXR1cm4gWydpbWcnLCB7IHNyYywgYWx0LCB0aXRsZSwgd2lkdGggfV07XG4gIH0sXG59O1xuXG5jb25zdCBsaXN0SXRlbSA9IHtcbiAgLi4uc2wubGlzdEl0ZW0sXG4gIGNvbnRlbnQ6ICdwYXJhZ3JhcGggYmxvY2sqJyxcbn07XG5cbmNvbnN0IG9yZGVyZWRMaXN0ID0ge1xuICAuLi5zbC5vcmRlcmVkTGlzdCxcbiAgY29udGVudDogJ2xpc3RfaXRlbSsnLFxuICBncm91cDogJ2Jsb2NrJyxcbn07XG5cbmNvbnN0IGJ1bGxldExpc3QgPSB7XG4gIC4uLnNsLmJ1bGxldExpc3QsXG4gIGNvbnRlbnQ6ICdsaXN0X2l0ZW0rJyxcbiAgZ3JvdXA6ICdibG9jaycsXG59O1xuXG5jb25zdCBub2RlcyA9IHtcbiAgZG9jLFxuICB0ZXh0LFxuICBwYXJhZ3JhcGgsXG4gIGJsb2NrcXVvdGUsXG4gIGhvcml6b250YWxfcnVsZTogaG9yaXpvbnRhbFJ1bGUsXG4gIGhlYWRpbmcsXG4gIGhhcmRfYnJlYWs6IGhhcmRCcmVhayxcbiAgY29kZV9ibG9jazogY29kZUJsb2NrLFxuICBpbWFnZSxcbiAgbGlzdF9pdGVtOiBsaXN0SXRlbSxcbiAgb3JkZXJlZF9saXN0OiBvcmRlcmVkTGlzdCxcbiAgYnVsbGV0X2xpc3Q6IGJ1bGxldExpc3QsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBub2RlcztcbiJdfQ==