UNPKG

site-metadata-extractor

Version:
302 lines 35.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.sanitizeJsonLdString = void 0; const cheerio = __importStar(require("cheerio")); function getTagName(node) { const element = node.get(0); return (element === null || element === void 0 ? void 0 : element.tagName) || ""; } function cleanArticleTags(doc) { const articles = doc("article"); articles.each((_index, element) => { doc(element).removeAttr("id"); doc(element).removeAttr("name"); doc(element).removeAttr("class"); }); return doc; } function cleanBadTags(doc) { const removeNodesRe = "^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|partner-gravity-ad|video-full-transcript|storytopbar-bucket|utility-bar|inline-share-tools|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|cnn_html_slideshow|cnn_strylftcntnt|links|meta$|shoutbox|sponsor|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|legende|ajoutVideo|timestamp|js_replies"; const regex = new RegExp(removeNodesRe, "i"); const toRemove = doc("*").filter((_index, el) => { const idEl = doc(el).attr("id"); const classEl = doc(el).attr("class"); const nameEl = doc(el).attr("name"); if (idEl) { return idEl.match(regex) !== null; } else if (classEl) { return classEl.match(regex) !== null; } else if (nameEl) { return nameEl.match(regex) !== null; } return false; }); doc(toRemove).remove(); return doc; } function cleanCodeBlocks(doc) { const nodes = doc("[class*='highlight-'], pre code, code, pre, ul.task-list"); nodes.each((_index, element) => { doc(element).replaceWith(doc(element).text()); }); return doc; } function cleanEmTags(doc) { const ems = doc("em"); ems.each((_index, element) => { const images = ems.find("img"); if (images.length === 0) { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } } }); return doc; } function cleanErrantLineBreaks(doc) { doc("p").each((_index, element) => { const node = doc(element); const contents = node.contents(); doc(contents).each((_cindex, cElement) => { const contentsNode = doc(cElement); if (contentsNode && contentsNode[0] && contentsNode[0].type === "text") { contentsNode.replaceWith(contentsNode.text().replace(/([^\n])\n([^\n])/g, "$1 $2")); } }); }); return doc; } function cleanParaSpans(doc) { const nodes = doc("p span"); nodes.each((_index, element) => { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } }); return doc; } function cleanUnderlines(doc) { const nodes = doc("u"); nodes.each((_index, element) => { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } }); return doc; } function divToPara(doc, domType) { const divs = doc(domType); const tags = [ "a", "blockquote", "dl", "div", "img", "ol", "p", "pre", "table", "ul", ]; divs.each((_index, element) => { const div = doc(element); const items = div.find(tags.join(", ")); if (items.length === 0) { replaceWithPara(doc, element); } else { const replaceNodes = getReplacementNodes(doc, div); let html = ""; replaceNodes.forEach((node) => { if (node.text() !== "") { html += `<p>${node}</p>`; } }); div.empty(); doc(div).replaceWith(`${html}`); } }); return doc; } function getReplacementNodes(doc, div) { let replacementText = []; const nodesToReturn = []; const nodesToRemove = []; const children = div.contents(); children.each((_index, element) => { var _a; const child = doc(element); if (getTagName(child) === "p" && replacementText.length > 0) { const text = replacementText.join(""); const textNodeLoad = cheerio.load(`<p>${text}</p>`); const textNode = textNodeLoad("p"); // create a node out of text and push nodesToReturn.push(textNode); replacementText = []; const childEl = doc(element); if (childEl) { nodesToReturn.push(childEl); } } else if (((_a = child.get(0)) === null || _a === void 0 ? void 0 : _a.type) === "text") { const childTextNode = child; const childText = child.text(); const replaceText = childText .replace(/\n/g, "\n\n") .replace(/\t/g, "") .replace(/^\s+$/g, ""); if (replaceText.length > 1) { let previousSiblingNode = childTextNode.prev(); while (getTagName(previousSiblingNode) === "a" && previousSiblingNode.attr("grv-usedalready") !== "yes") { const outer = " " + doc.html(previousSiblingNode) + " "; replacementText.push(outer); nodesToRemove.push(previousSiblingNode); previousSiblingNode.attr("grv-usedalready", "yes"); previousSiblingNode = previousSiblingNode.prev(); } replacementText.push(replaceText); const nextSiblingNode = childTextNode.next(); while (getTagName(nextSiblingNode) === "a" && nextSiblingNode.attr("grv-usedalready") !== "yes") { const outer = " " + doc.html(nextSiblingNode) + " "; replacementText.push(outer); nodesToRemove.push(nextSiblingNode); nextSiblingNode.attr("grv-usedalready", "yes"); previousSiblingNode = nextSiblingNode.next(); } } // otherwise } else { const childEl = doc(child); if (childEl) { nodesToReturn.push(childEl); } } }); // flush out anything still remaining if (replacementText.length > 0) { const text = replacementText.join(""); const textNodeLoad = cheerio.load(`<p>${text}</p>`); const textNode = textNodeLoad("p"); nodesToReturn.push(textNode); replacementText = []; } nodesToRemove.forEach((node) => { doc(node).remove(); }); return nodesToReturn; } function removeBodyClasses(doc) { doc("body").removeClass(); return doc; } function removeDropCaps(doc) { const nodes = doc("span[class~=dropcap], span[class~=drop_cap]"); nodes.each((_index, element) => { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } }); return doc; } function removeNodesRegex(doc, pattern) { const toRemove = doc("div").filter((_index, element) => { const idEl = doc(element).attr("id"); const classEl = doc(element).attr("class"); if (idEl) { return idEl.match(pattern) !== null; } else if (classEl) { return classEl.match(pattern) !== null; } return false; }); doc(toRemove).remove(); return doc; } function removeScriptsStyles(doc) { doc("script").remove(); doc("style").remove(); const comments = doc("*") .contents() .filter((_index, element) => { return element.type === "comment"; }); return doc(comments).remove(); } function replaceWithPara(doc, div) { const divContent = doc(div).html(); doc(div).replaceWith(`<p>${divContent}</p>`); return doc; } const cleaner = (doc) => { removeBodyClasses(doc); cleanArticleTags(doc); cleanEmTags(doc); cleanCodeBlocks(doc); removeDropCaps(doc); removeScriptsStyles(doc); cleanBadTags(doc); removeNodesRegex(doc, /^caption$/); removeNodesRegex(doc, / google /); removeNodesRegex(doc, /^[^entry-]more.*$/); removeNodesRegex(doc, /[^-]facebook/); removeNodesRegex(doc, /facebook-broadcasting/); removeNodesRegex(doc, /[^-]twitter/); cleanParaSpans(doc); cleanUnderlines(doc); cleanErrantLineBreaks(doc); divToPara(doc, "div"); divToPara(doc, "span"); return doc; }; // Sanitization function to remove HTML/XML tags const sanitizeJsonLdString = (jsonLdString) => { // Remove anything that looks like an HTML/XML tag (this is a basic example, might need adjustments) return jsonLdString.replace(/<\/?[^>]+(>|$)/g, "").trim(); }; exports.sanitizeJsonLdString = sanitizeJsonLdString; exports.default = cleaner; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGVhbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFtQztBQUluQyxTQUFTLFVBQVUsQ0FBQyxJQUFzQjtJQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBd0IsQ0FBQztJQUNuRCxPQUFPLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sS0FBSSxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBZTtJQUN2QyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFlO0lBQ25DLE1BQU0sYUFBYSxHQUNqQixpcEJBQWlwQixDQUFDO0lBQ3BwQixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0MsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM5QyxNQUFNLElBQUksR0FBRyxHQUFHLENB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QkFBZ0IsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixnREFBZ0Q7QUFDekMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFlBQW9CLEVBQVUsRUFBRTtJQUNuRSxvR0FBb0c7SUFDcEcsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVELENBQUMsQ0FBQztBQUhXLFFBQUEsb0JBQW9CLHdCQUcvQjtBQUVGLGtCQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSBcImNoZWVyaW9cIjtcbmltcG9ydCB0eXBlIHsgQ2hlZXJpbywgQ2hlZXJpb0FQSSB9IGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUsIEVsZW1lbnQgfSBmcm9tIFwiZG9taGFuZGxlclwiO1xuXG5mdW5jdGlvbiBnZXRUYWdOYW1lKG5vZGU6IENoZWVyaW88QW55Tm9kZT4pOiBzdHJpbmcge1xuICBjb25zdCBlbGVtZW50ID0gbm9kZS5nZXQoMCkgYXMgRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGVsZW1lbnQ/LnRhZ05hbWUgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gY2xlYW5BcnRpY2xlVGFncyhkb2M6IENoZWVyaW9BUEkpIHtcbiAgY29uc3QgYXJ0aWNsZXMgPSBkb2MoXCJhcnRpY2xlXCIpO1xuICBhcnRpY2xlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGRvYyhlbGVtZW50KS5yZW1vdmVBdHRyKFwiaWRcIik7XG4gICAgZG9jKGVsZW1lbnQpLnJlbW92ZUF0dHIoXCJuYW1lXCIpO1xuICAgIGRvYyhlbGVtZW50KS5yZW1vdmVBdHRyKFwiY2xhc3NcIik7XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBjbGVhbkJhZFRhZ3MoZG9jOiBDaGVlcmlvQVBJKSB7XG4gIGNvbnN0IHJlbW92ZU5vZGVzUmUgPVxuICAgIFwiXnNpZGUkfGNvbWJ4fHJldHdlZXR8bWVkaWFhcnRpY2xlcmVsYXRlZHxtZW51Y29udGFpbmVyfG5hdmJhcnxwYXJ0bmVyLWdyYXZpdHktYWR8dmlkZW8tZnVsbC10cmFuc2NyaXB0fHN0b3J5dG9wYmFyLWJ1Y2tldHx1dGlsaXR5LWJhcnxpbmxpbmUtc2hhcmUtdG9vbHN8Y29tbWVudHxQb3B1bGFyUXVlc3Rpb25zfGNvbnRhY3R8Zm9vdHxmb290ZXJ8Rm9vdGVyfGZvb3Rub3RlfGNubl9zdHJ5Y2FwdGlvbnR4dHxjbm5faHRtbF9zbGlkZXNob3d8Y25uX3N0cnlsZnRjbnRudHxsaW5rc3xtZXRhJHxzaG91dGJveHxzcG9uc29yfHRhZ3N8c29jaWFsbmV0d29ya2luZ3xzb2NpYWxOZXR3b3JraW5nfGNublN0cnlIZ2hMZ2h0fGNubl9zdHJ5c3BjdmJ4fF5pbnNldCR8cGFnZXRvb2xzfHBvc3QtYXR0cmlidXRlc3x3ZWxjb21lX2Zvcm18Y29udGVudFRvb2xzMnx0aGVfYW5zd2Vyc3xjb21tdW5pdHlwcm9tb3xydW5hcm91bmRMZWZ0fHN1YnNjcmliZXx2Y2FyZHxhcnRpY2xlaGVhZGluZ3N8ZGF0ZXxecHJpbnQkfHBvcHVwfGF1dGhvci1kcm9wZG93bnx0b29sc3xzb2NpYWx0b29sc3xieWxpbmV8a29uYWZpbHRlcnxLb25hRmlsdGVyfGJyZWFkY3J1bWJzfF5mbiR8d3AtY2FwdGlvbi10ZXh0fGxlZ2VuZGV8YWpvdXRWaWRlb3x0aW1lc3RhbXB8anNfcmVwbGllc1wiO1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVtb3ZlTm9kZXNSZSwgXCJpXCIpO1xuXG4gIGNvbnN0IHRvUmVtb3ZlID0gZG9jKFwiKlwiKS5maWx0ZXIoKF9pbmRleCwgZWwpID0+IHtcbiAgICBjb25zdCBpZEVsID0gZG9jKGVsKS5hdHRyKFwiaWRcIik7XG4gICAgY29uc3QgY2xhc3NFbCA9IGRvYyhlbCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGRvYyhlbCkuYXR0cihcIm5hbWVcIik7XG4gICAgaWYgKGlkRWwpIHtcbiAgICAgIHJldHVybiBpZEVsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG5hbWVFbCkge1xuICAgICAgcmV0dXJuIG5hbWVFbC5tYXRjaChyZWdleCkgIT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgZG9jKHRvUmVtb3ZlKS5yZW1vdmUoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5Db2RlQmxvY2tzKGRvYzogQ2hlZXJpb0FQSSkge1xuICBjb25zdCBub2RlcyA9IGRvYyhcIltjbGFzcyo9J2hpZ2hsaWdodC0nXSwgcHJlIGNvZGUsIGNvZGUsIHByZSwgdWwudGFzay1saXN0XCIpO1xuICBub2Rlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGRvYyhlbGVtZW50KS5yZXBsYWNlV2l0aChkb2MoZWxlbWVudCkudGV4dCgpKTtcbiAgfSk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRW1UYWdzKGRvYzogQ2hlZXJpb0FQSSkge1xuICBjb25zdCBlbXMgPSBkb2MoXCJlbVwiKTtcbiAgZW1zLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBBbnlOb2RlKSA9PiB7XG4gICAgY29uc3QgaW1hZ2VzID0gZW1zLmZpbmQoXCJpbWdcIik7XG4gICAgaWYgKGltYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgICBpZiAoaHRtbEVsKSB7XG4gICAgICAgIGRvYyhlbGVtZW50KS5yZXBsYWNlV2l0aChodG1sRWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXJyYW50TGluZUJyZWFrcyhkb2M6IENoZWVyaW9BUEkpIHtcbiAgZG9jKFwicFwiKS5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBkb2MoZWxlbWVudCk7XG4gICAgY29uc3QgY29udGVudHMgPSBub2RlLmNvbnRlbnRzKCk7XG5cbiAgICBkb2MoY29udGVudHMpLmVhY2goKF9jaW5kZXg6IG51bWJlciwgY0VsZW1lbnQ6IEFueU5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzTm9kZSA9IGRvYyhjRWxlbWVudCk7XG4gICAgICBpZiAoY29udGVudHNOb2RlICYmIGNvbnRlbnRzTm9kZVswXSAmJiBjb250ZW50c05vZGVbMF0udHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29udGVudHNOb2RlLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIGNvbnRlbnRzTm9kZS50ZXh0KCkucmVwbGFjZSgvKFteXFxuXSlcXG4oW15cXG5dKS9nLCBcIiQxICQyXCIpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5QYXJhU3BhbnMoZG9jOiBDaGVlcmlvQVBJKSB7XG4gIGNvbnN0IG5vZGVzID0gZG9jKFwicCBzcGFuXCIpO1xuICBub2Rlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5VbmRlcmxpbmVzKGRvYzogQ2hlZXJpb0FQSSkge1xuICBjb25zdCBub2RlcyA9IGRvYyhcInVcIik7XG4gIG5vZGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBBbnlOb2RlKSA9PiB7XG4gICAgY29uc3QgaHRtbEVsID0gZG9jKGVsZW1lbnQpLmh0bWwoKTtcbiAgICBpZiAoaHRtbEVsKSB7XG4gICAgICBkb2MoZWxlbWVudCkucmVwbGFjZVdpdGgoaHRtbEVsKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBkaXZUb1BhcmEoZG9jOiBDaGVlcmlvQVBJLCBkb21UeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2cyA9IGRvYyhkb21UeXBlKTtcblxuICBjb25zdCB0YWdzID0gW1xuICAgIFwiYVwiLFxuICAgIFwiYmxvY2txdW90ZVwiLFxuICAgIFwiZGxcIixcbiAgICBcImRpdlwiLFxuICAgIFwiaW1nXCIsXG4gICAgXCJvbFwiLFxuICAgIFwicFwiLFxuICAgIFwicHJlXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidWxcIixcbiAgXTtcblxuICBkaXZzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBBbnlOb2RlKSA9PiB7XG4gICAgY29uc3QgZGl2ID0gZG9jKGVsZW1lbnQpO1xuICAgIGNvbnN0IGl0ZW1zID0gZGl2LmZpbmQodGFncy5qb2luKFwiLCBcIikpO1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVwbGFjZVdpdGhQYXJhKGRvYywgZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VOb2RlcyA9IGdldFJlcGxhY2VtZW50Tm9kZXMoZG9jLCBkaXYpO1xuXG4gICAgICBsZXQgaHRtbCA9IFwiXCI7XG4gICAgICByZXBsYWNlTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZS50ZXh0KCkgIT09IFwiXCIpIHtcbiAgICAgICAgICBodG1sICs9IGA8cD4ke25vZGV9PC9wPmA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBkaXYuZW1wdHkoKTtcbiAgICAgIGRvYyhkaXYpLnJlcGxhY2VXaXRoKGAke2h0bWx9YCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnROb2RlcyhcbiAgZG9jOiBDaGVlcmlvQVBJLFxuICBkaXY6IENoZWVyaW88QW55Tm9kZT4sXG4pOiBDaGVlcmlvPEFueU5vZGU+W10ge1xuICBsZXQgcmVwbGFjZW1lbnRUZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBub2Rlc1RvUmV0dXJuOiBDaGVlcmlvPEFueU5vZGU+W10gPSBbXTtcbiAgY29uc3Qgbm9kZXNUb1JlbW92ZTogQ2hlZXJpbzxBbnlOb2RlPltdID0gW107XG4gIGNvbnN0IGNoaWxkcmVuID0gZGl2LmNvbnRlbnRzKCk7XG5cbiAgY2hpbGRyZW4uZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGRvYyhlbGVtZW50KTtcblxuICAgIGlmIChcbiAgICAgIGdldFRhZ05hbWUoY2hpbGQpID09PSBcInBcIiAmJlxuICAgICAgcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IHRleHQgPSByZXBsYWNlbWVudFRleHQuam9pbihcIlwiKTtcbiAgICAgIGNvbnN0IHRleHROb2RlTG9hZCA9IGNoZWVyaW8ubG9hZChgPHA+JHt0ZXh0fTwvcD5gKTtcbiAgICAgIGNvbnN0IHRleHROb2RlID0gdGV4dE5vZGVMb2FkKFwicFwiKTtcbiAgICAgIC8vIGNyZWF0ZSBhIG5vZGUgb3V0IG9mIHRleHQgYW5kIHB1c2hcbiAgICAgIG5vZGVzVG9SZXR1cm4ucHVzaCh0ZXh0Tm9kZSk7XG4gICAgICByZXBsYWNlbWVudFRleHQgPSBbXTtcbiAgICAgIGNvbnN0IGNoaWxkRWwgPSBkb2MoZWxlbWVudCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZC5nZXQoMCk/LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBjb25zdCBjaGlsZFRleHROb2RlID0gY2hpbGQ7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBjaGlsZC50ZXh0KCk7XG4gICAgICBjb25zdCByZXBsYWNlVGV4dCA9IGNoaWxkVGV4dFxuICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxuXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL15cXHMrJC9nLCBcIlwiKTtcblxuICAgICAgaWYgKHJlcGxhY2VUZXh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IHByZXZpb3VzU2libGluZ05vZGUgPSBjaGlsZFRleHROb2RlLnByZXYoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgZ2V0VGFnTmFtZShwcmV2aW91c1NpYmxpbmdOb2RlKSA9PT0gXCJhXCIgJiZcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlLmF0dHIoXCJncnYtdXNlZGFscmVhZHlcIikgIT09IFwieWVzXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgb3V0ZXIgPSBcIiBcIiArIGRvYy5odG1sKHByZXZpb3VzU2libGluZ05vZGUpICsgXCIgXCI7XG4gICAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gob3V0ZXIpO1xuICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChwcmV2aW91c1NpYmxpbmdOb2RlKTtcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlLmF0dHIoXCJncnYtdXNlZGFscmVhZHlcIiwgXCJ5ZXNcIik7XG4gICAgICAgICAgcHJldmlvdXNTaWJsaW5nTm9kZSA9IHByZXZpb3VzU2libGluZ05vZGUucHJldigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gocmVwbGFjZVRleHQpO1xuICAgICAgICBjb25zdCBuZXh0U2libGluZ05vZGUgPSBjaGlsZFRleHROb2RlLm5leHQoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgZ2V0VGFnTmFtZShuZXh0U2libGluZ05vZGUpID09PSBcImFcIiAmJlxuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIpICE9PSBcInllc1wiXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG91dGVyID0gXCIgXCIgKyBkb2MuaHRtbChuZXh0U2libGluZ05vZGUpICsgXCIgXCI7XG4gICAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gob3V0ZXIpO1xuICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChuZXh0U2libGluZ05vZGUpO1xuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIsIFwieWVzXCIpO1xuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUgPSBuZXh0U2libGluZ05vZGUubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2VcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hpbGRFbCA9IGRvYyhjaGlsZCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBmbHVzaCBvdXQgYW55dGhpbmcgc3RpbGwgcmVtYWluaW5nXG4gIGlmIChyZXBsYWNlbWVudFRleHQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHRleHQgPSByZXBsYWNlbWVudFRleHQuam9pbihcIlwiKTtcbiAgICBjb25zdCB0ZXh0Tm9kZUxvYWQgPSBjaGVlcmlvLmxvYWQoYDxwPiR7dGV4dH08L3A+YCk7XG4gICAgY29uc3QgdGV4dE5vZGUgPSB0ZXh0Tm9kZUxvYWQoXCJwXCIpO1xuICAgIG5vZGVzVG9SZXR1cm4ucHVzaCh0ZXh0Tm9kZSk7XG4gICAgcmVwbGFjZW1lbnRUZXh0ID0gW107XG4gIH1cblxuICBub2Rlc1RvUmVtb3ZlLmZvckVhY2goKG5vZGU6IENoZWVyaW88QW55Tm9kZT4pID0+IHtcbiAgICBkb2Mobm9kZSkucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2Rlc1RvUmV0dXJuO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb2R5Q2xhc3Nlcyhkb2M6IENoZWVyaW9BUEkpOiBDaGVlcmlvQVBJIHtcbiAgZG9jKFwiYm9keVwiKS5yZW1vdmVDbGFzcygpO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEcm9wQ2Fwcyhkb2M6IENoZWVyaW9BUEkpOiBDaGVlcmlvQVBJIHtcbiAgY29uc3Qgbm9kZXMgPSBkb2MoXCJzcGFuW2NsYXNzfj1kcm9wY2FwXSwgc3BhbltjbGFzc349ZHJvcF9jYXBdXCIpO1xuICBub2Rlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZXNSZWdleChkb2M6IENoZWVyaW9BUEksIHBhdHRlcm46IFJlZ0V4cCkge1xuICBjb25zdCB0b1JlbW92ZSA9IGRvYyhcImRpdlwiKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGlkRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImlkXCIpO1xuICAgIGNvbnN0IGNsYXNzRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGlmIChpZEVsKSB7XG4gICAgICByZXR1cm4gaWRFbC5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHBhdHRlcm4pICE9PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBkb2ModG9SZW1vdmUpLnJlbW92ZSgpO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTY3JpcHRzU3R5bGVzKGRvYzogQ2hlZXJpb0FQSSk6IENoZWVyaW88QW55Tm9kZT4ge1xuICBkb2MoXCJzY3JpcHRcIikucmVtb3ZlKCk7XG4gIGRvYyhcInN0eWxlXCIpLnJlbW92ZSgpO1xuXG4gIGNvbnN0IGNvbW1lbnRzID0gZG9jKFwiKlwiKVxuICAgIC5jb250ZW50cygpXG4gICAgLmZpbHRlcigoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IEFueU5vZGUpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgPT09IFwiY29tbWVudFwiO1xuICAgIH0pO1xuXG4gIHJldHVybiBkb2MoY29tbWVudHMpLnJlbW92ZSgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aFBhcmEoXG4gIGRvYzogQ2hlZXJpb0FQSSxcbiAgZGl2OiBBbnlOb2RlLFxuKTogQ2hlZXJpb0FQSSB7XG4gIGNvbnN0IGRpdkNvbnRlbnQgPSBkb2MoZGl2KS5odG1sKCk7XG4gIGRvYyhkaXYpLnJlcGxhY2VXaXRoKGA8cD4ke2RpdkNvbnRlbnR9PC9wPmApO1xuICByZXR1cm4gZG9jO1xufVxuXG5jb25zdCBjbGVhbmVyID0gKGRvYzogQ2hlZXJpb0FQSSk6IENoZWVyaW9BUEkgPT4ge1xuICByZW1vdmVCb2R5Q2xhc3Nlcyhkb2MpO1xuICBjbGVhbkFydGljbGVUYWdzKGRvYyk7XG4gIGNsZWFuRW1UYWdzKGRvYyk7XG4gIGNsZWFuQ29kZUJsb2Nrcyhkb2MpO1xuICByZW1vdmVEcm9wQ2Fwcyhkb2MpO1xuICByZW1vdmVTY3JpcHRzU3R5bGVzKGRvYyk7XG4gIGNsZWFuQmFkVGFncyhkb2MpO1xuICByZW1vdmVOb2Rlc1JlZ2V4KGRvYywgL15jYXB0aW9uJC8pO1xuICByZW1vdmVOb2Rlc1JlZ2V4KGRvYywgLyBnb29nbGUgLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvXlteZW50cnktXW1vcmUuKiQvKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9bXi1dZmFjZWJvb2svKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9mYWNlYm9vay1icm9hZGNhc3RpbmcvKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9bXi1ddHdpdHRlci8pO1xuICBjbGVhblBhcmFTcGFucyhkb2MpO1xuICBjbGVhblVuZGVybGluZXMoZG9jKTtcbiAgY2xlYW5FcnJhbnRMaW5lQnJlYWtzKGRvYyk7XG4gIGRpdlRvUGFyYShkb2MsIFwiZGl2XCIpO1xuICBkaXZUb1BhcmEoZG9jLCBcInNwYW5cIik7XG4gIHJldHVybiBkb2M7XG59O1xuXG4vLyBTYW5pdGl6YXRpb24gZnVuY3Rpb24gdG8gcmVtb3ZlIEhUTUwvWE1MIHRhZ3NcbmV4cG9ydCBjb25zdCBzYW5pdGl6ZUpzb25MZFN0cmluZyA9IChqc29uTGRTdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIFJlbW92ZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYW4gSFRNTC9YTUwgdGFnICh0aGlzIGlzIGEgYmFzaWMgZXhhbXBsZSwgbWlnaHQgbmVlZCBhZGp1c3RtZW50cylcbiAgcmV0dXJuIGpzb25MZFN0cmluZy5yZXBsYWNlKC88XFwvP1tePl0rKD58JCkvZywgXCJcIikudHJpbSgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xlYW5lcjtcbiJdfQ==