@tricoteuses/arbre-de-la-loi
Version:
Generate ASTs from the French bills & laws; manipulate & export them to Markdown, etc.
227 lines (170 loc) • 19.7 kB
JavaScript
;
require("core-js/modules/es.array.is-array.js");
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.symbol.description.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.symbol.iterator.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/web.dom-collections.iterator.js");
require("core-js/modules/es.array.from.js");
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.object.define-property.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mergeSpanElementsWithSameAttributes = mergeSpanElementsWithSameAttributes;
exports.mergeTexts = mergeTexts;
exports.removeLetterSpacingStyleAttributes = removeLetterSpacingStyleAttributes;
exports.removeEmptyStyleAttributes = removeEmptyStyleAttributes;
exports.removeStyleElements = removeStyleElements;
exports.replaceSpanElementsContainingOnlySpacesWithTexts = replaceSpanElementsContainingOnlySpacesWithTexts;
exports.replaceSpanElementsWithoutPropertiesWithTexts = replaceSpanElementsWithoutPropertiesWithTexts;
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.array.splice.js");
require("core-js/modules/es.string.replace.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.array.filter.js");
require("core-js/modules/es.array.map.js");
require("core-js/modules/es.string.match.js");
require("core-js/modules/es.object.keys.js");
var _deepEqual = _interopRequireDefault(require("deep-equal"));
var _hast = require("./hast");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function mergeSpanElementsWithSameAttributes(node) {
var children = node.children;
if (children !== undefined) {
var previous = children[0];
var index = 1;
for (var _i = 0, _arr = _toConsumableArray(children.slice(1)); _i < _arr.length; _i++) {
var child = _arr[_i];
if (previous.type === _hast.HastType.Element && previous.tagName === "span" && previous.children.length === 1 && previous.children[0].type === _hast.HastType.Text && child.type === _hast.HastType.Element && child.tagName === "span" && child.children.length === 1 && child.children[0].type === _hast.HastType.Text && (0, _deepEqual["default"])(previous.properties, child.properties)) {
previous.children[0].value += child.children[0].value;
children.splice(index, 1);
} else {
previous = child;
index += 1;
}
}
var _iterator = _createForOfIteratorHelper(children),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _child = _step.value;
mergeSpanElementsWithSameAttributes(_child);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
}
function mergeTexts(node) {
var children = node.children;
if (children !== undefined) {
var previous = children[0];
var index = 1;
for (var _i2 = 0, _arr2 = _toConsumableArray(children.slice(1)); _i2 < _arr2.length; _i2++) {
var child = _arr2[_i2];
if (previous.type === _hast.HastType.Text && child.type === _hast.HastType.Text) {
previous.value += child.value;
children.splice(index, 1);
} else {
previous = child;
index += 1;
}
}
var _iterator2 = _createForOfIteratorHelper(children),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var _child2 = _step2.value;
mergeTexts(_child2);
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
} /// Useful for documents generated from PDF.
/// Example: https://www.assemblee-nationale.fr/dyn/opendata/PRJLANR5L15B0235.html
/// where each character is a span with a letter-spacing style.
function removeLetterSpacingStyleAttributes(html) {
return html.replace(/;?\s*letter-spacing:\s*(-?\d+(\.\d*)?\s*pt|normal)/gm, "");
}
function removeEmptyStyleAttributes(html) {
return html.replace(/\s*style=""/g, "");
}
function removeStyleElements(node) {
var children = node.children;
if (children !== undefined) {
;
node.children = children = children.filter(function (child) {
return child.type !== _hast.HastType.Element || child.tagName !== "style";
});
var _iterator3 = _createForOfIteratorHelper(children),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var child = _step3.value;
removeStyleElements(child);
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
}
}
function replaceSpanElementsContainingOnlySpacesWithTexts(node) {
var children = node.children;
if (children !== undefined) {
;
node.children = children = children.map(function (child) {
return child.type === _hast.HastType.Element && child.tagName === "span" && child.children.length === 1 && child.children[0].type === _hast.HastType.Text && child.children[0].value.match(/^[ \t\n\f\r\xa0]*$/) ? child.children[0] : child;
});
var _iterator4 = _createForOfIteratorHelper(children),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var child = _step4.value;
replaceSpanElementsContainingOnlySpacesWithTexts(child);
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
}
}
function replaceSpanElementsWithoutPropertiesWithTexts(node) {
var children = node.children;
if (children !== undefined) {
;
node.children = children = children.map(function (child) {
return child.type === _hast.HastType.Element && child.tagName === "span" && (child.properties === undefined || Object.keys(child.properties).length === 0) && child.children.length === 1 && child.children[0].type === _hast.HastType.Text ? child.children[0] : child;
});
var _iterator5 = _createForOfIteratorHelper(children),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var child = _step5.value;
replaceSpanElementsWithoutPropertiesWithTexts(child);
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGVhbmVycy50cyJdLCJuYW1lcyI6WyJtZXJnZVNwYW5FbGVtZW50c1dpdGhTYW1lQXR0cmlidXRlcyIsIm5vZGUiLCJjaGlsZHJlbiIsInVuZGVmaW5lZCIsInByZXZpb3VzIiwiaW5kZXgiLCJzbGljZSIsImNoaWxkIiwidHlwZSIsIkhhc3RUeXBlIiwiRWxlbWVudCIsInRhZ05hbWUiLCJsZW5ndGgiLCJUZXh0IiwicHJvcGVydGllcyIsInZhbHVlIiwic3BsaWNlIiwibWVyZ2VUZXh0cyIsInJlbW92ZUxldHRlclNwYWNpbmdTdHlsZUF0dHJpYnV0ZXMiLCJodG1sIiwicmVwbGFjZSIsInJlbW92ZUVtcHR5U3R5bGVBdHRyaWJ1dGVzIiwicmVtb3ZlU3R5bGVFbGVtZW50cyIsImZpbHRlciIsInJlcGxhY2VTcGFuRWxlbWVudHNDb250YWluaW5nT25seVNwYWNlc1dpdGhUZXh0cyIsIm1hcCIsIm1hdGNoIiwicmVwbGFjZVNwYW5FbGVtZW50c1dpdGhvdXRQcm9wZXJ0aWVzV2l0aFRleHRzIiwiT2JqZWN0Iiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVPLFNBQVNBLG1DQUFULENBQTZDQyxJQUE3QyxFQUE2RDtBQUNsRSxNQUFJQyxRQUFRLEdBQUlELElBQUQsQ0FBcUJDLFFBQXBDOztBQUNBLE1BQUlBLFFBQVEsS0FBS0MsU0FBakIsRUFBNEI7QUFDMUIsUUFBSUMsUUFBUSxHQUFHRixRQUFRLENBQUMsQ0FBRCxDQUF2QjtBQUNBLFFBQUlHLEtBQUssR0FBRyxDQUFaOztBQUNBLCtDQUF3QkgsUUFBUSxDQUFDSSxLQUFULENBQWUsQ0FBZixDQUF4QiwyQkFBNEM7QUFBdkMsVUFBTUMsS0FBSyxXQUFYOztBQUNILFVBQ0VILFFBQVEsQ0FBQ0ksSUFBVCxLQUFrQkMsZUFBU0MsT0FBM0IsSUFDQU4s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UUFBQUEsZ0RBQWdELENBQUNqQixLQUFELENBQWhEO0FBQ0Q7QUFaeUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWEzQjtBQUNGOztBQUVNLFNBQVNvQiw2Q0FBVCxDQUF1RDFCLElBQXZELEVBQXVFO0FBQzVFLE1BQUlDLFFBQVEsR0FBSUQsSUFBRCxDQUFxQkMsUUFBcEM7O0FBQ0EsTUFBSUEsUUFBUSxLQUFLQyxTQUFqQixFQUE0QjtBQUMxQjtBQUFFRixJQUFBQSxJQUFELENBQXFCQyxRQUFyQixHQUFnQ0EsUUFBUSxHQUFHQSxRQUFRLENBQUN1QixHQUFULENBQzFDLFVBQUNsQixLQUFEO0FBQUEsYUFDRUEsS0FBSyxDQUFDQyxJQUFOLEtBQWVDLGVBQVNDLE9BQXhCLElBQ0NILEtBQUQsQ0FBdUJJLE9BQXZCLEtBQW1DLE1BRG5DLEtBRUNKLEtBQUssQ0FBQ08sVUFBTixLQUFxQlgsU0FBckIsSUFBa0N5QixNQUFNLENBQUNDLElBQVAsQ0FBWXRCLEtBQUssQ0FBQ08sVUFBbEIsRUFBOEJGLE1BQTlCLEtBQXlDLENBRjVFLEtBR0FMLEtBQUssQ0FBQ0wsUUFBTixDQUFlVSxNQUFmLEtBQTBCLENBSDFCLElBSUFMLEtBQUssQ0FBQ0wsUUFBTixDQUFlLENBQWYsRUFBa0JNLElBQWxCLEtBQTJCQyxlQUFTSSxJQUpwQyxHQUtHTixLQUFLLENBQUNMLFFBQU4sQ0FBZSxDQUFmLENBTEgsR0FLc0JLLEtBTnhCO0FBQUEsS0FEMEMsQ0FBM0M7O0FBRHlCLGdEQVVOTCxRQVZNO0FBQUE7O0FBQUE7QUFVMUIsNkRBQThCO0FBQUEsWUFBbkJLLEtBQW1CO0FBQzVCb0IsUUFBQUEsNkNBQTZDLENBQUNwQixLQUFELENBQTdDO0FBQ0Q7QUFaeUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWEzQjtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwiZGVlcC1lcXVhbFwiXG5cbmltcG9ydCB7IEhhc3RFbGVtZW50LCBIYXN0Tm9kZSwgSGFzdFBhcmVudCwgSGFzdFR5cGUgfSBmcm9tIFwiLi9oYXN0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BhbkVsZW1lbnRzV2l0aFNhbWVBdHRyaWJ1dGVzKG5vZGU6IEhhc3ROb2RlKSB7XG4gIGxldCBjaGlsZHJlbiA9IChub2RlIGFzIEhhc3RQYXJlbnQpLmNoaWxkcmVuXG4gIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHByZXZpb3VzID0gY2hpbGRyZW5bMF1cbiAgICBsZXQgaW5kZXggPSAxXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBbLi4uY2hpbGRyZW4uc2xpY2UoMSldKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzLnR5cGUgPT09IEhhc3RUeXBlLkVsZW1lbnQgJiZcbiAgICAgICAgcHJldmlvdXMudGFnTmFtZSA9PT0gXCJzcGFuXCIgJiZcbiAgICAgICAgcHJldmlvdXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHByZXZpb3VzLmNoaWxkcmVuWzBdLnR5cGUgPT09IEhhc3RUeXBlLlRleHQgJiZcbiAgICAgICAgY2hpbGQudHlwZSA9PT0gSGFzdFR5cGUuRWxlbWVudCAmJlxuICAgICAgICBjaGlsZC50YWdOYW1lID09PSBcInNwYW5cIiAmJlxuICAgICAgICBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgY2hpbGQuY2hpbGRyZW5bMF0udHlwZSA9PT0gSGFzdFR5cGUuVGV4dCAmJlxuICAgICAgICBkZWVwRXF1YWwocHJldmlvdXMucHJvcGVydGllcywgY2hpbGQucHJvcGVydGllcylcbiAgICAgICkge1xuICAgICAgICBwcmV2aW91cy5jaGlsZHJlblswXS52YWx1ZSArPSBjaGlsZC5jaGlsZHJlblswXS52YWx1ZVxuICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2aW91cyA9IGNoaWxkXG4gICAgICAgIGluZGV4ICs9IDFcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgbWVyZ2VTcGFuRWxlbWVudHNXaXRoU2FtZUF0dHJpYnV0ZXMoY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRleHRzKG5vZGU6IEhhc3ROb2RlKSB7XG4gIGxldCBjaGlsZHJlbiA9IChub2RlIGFzIEhhc3RQYXJlbnQpLmNoaWxkcmVuXG4gIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHByZXZpb3VzID0gY2hpbGRyZW5bMF1cbiAgICBsZXQgaW5kZXggPSAxXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBbLi4uY2hpbGRyZW4uc2xpY2UoMSldKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzLnR5cGUgPT09IEhhc3RUeXBlLlRleHQgJiZcbiAgICAgICAgY2hpbGQudHlwZSA9PT0gSGFzdFR5cGUuVGV4dFxuICAgICAgKSB7XG4gICAgICAgIHByZXZpb3VzLnZhbHVlICs9IGNoaWxkLnZhbHVlXG4gICAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZpb3VzID0gY2hpbGRcbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBtZXJnZVRleHRzKGNoaWxkKVxuICAgIH1cbiAgfVxufVxuXG4vLy8gVXNlZnVsIGZvciBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gUERGLlxuLy8vIEV4YW1wbGU6IGh0dHBzOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvZHluL29wZW5kYXRhL1BSSkxBTlI1TDE1QjAyMzUuaHRtbFxuLy8vIHdoZXJlIGVhY2ggY2hhcmFjdGVyIGlzIGEgc3BhbiB3aXRoIGEgbGV0dGVyLXNwYWNpbmcgc3R5bGUuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGV0dGVyU3BhY2luZ1N0eWxlQXR0cmlidXRlcyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaHRtbC5yZXBsYWNlKC87P1xccypsZXR0ZXItc3BhY2luZzpcXHMqKC0/XFxkKyhcXC5cXGQqKT9cXHMqcHR8bm9ybWFsKS9nbSwgXCJcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVtcHR5U3R5bGVBdHRyaWJ1dGVzKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBodG1sLnJlcGxhY2UoL1xccypzdHlsZT1cIlwiL2csIFwiXCIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnRzKG5vZGU6IEhhc3ROb2RlKSB7XG4gIGxldCBjaGlsZHJlbiA9IChub2RlIGFzIEhhc3RQYXJlbnQpLmNoaWxkcmVuXG4gIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgOyhub2RlIGFzIEhhc3RQYXJlbnQpLmNoaWxkcmVuID0gY2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoXG4gICAgICAoY2hpbGQpID0+XG4gICAgICAgIGNoaWxkLnR5cGUgIT09IEhhc3RUeXBlLkVsZW1lbnQgfHxcbiAgICAgICAgKGNoaWxkIGFzIEhhc3RFbGVtZW50KS50YWdOYW1lICE9PSBcInN0eWxlXCIsXG4gICAgKVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudHMoY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlU3BhbkVsZW1lbnRzQ29udGFpbmluZ09ubHlTcGFjZXNXaXRoVGV4dHMobm9kZTogSGFzdE5vZGUpIHtcbiAgbGV0IGNoaWxkcmVuID0gKG5vZGUgYXMgSGFzdFBhcmVudCkuY2hpbGRyZW5cbiAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICA7KG5vZGUgYXMgSGFzdFBhcmVudCkuY2hpbGRyZW4gPSBjaGlsZHJlbiA9IGNoaWxkcmVuLm1hcChcbiAgICAgIChjaGlsZCkgPT5cbiAgICAgICAgY2hpbGQudHlwZSA9PT0gSGFzdFR5cGUuRWxlbWVudCAmJlxuICAgICAgICAoY2hpbGQgYXMgSGFzdEVsZW1lbnQpLnRhZ05hbWUgPT09IFwic3BhblwiICYmXG4gICAgICAgIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBjaGlsZC5jaGlsZHJlblswXS50eXBlID09PSBIYXN0VHlwZS5UZXh0ICYmXG4gICAgICAgIGNoaWxkLmNoaWxkcmVuWzBdLnZhbHVlLm1hdGNoKC9eWyBcXHRcXG5cXGZcXHJcXHhhMF0qJC8pXG4gICAgICAgICA/IGNoaWxkLmNoaWxkcmVuWzBdOiBjaGlsZCxcbiAgICApXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgcmVwbGFjZVNwYW5FbGVtZW50c0NvbnRhaW5pbmdPbmx5U3BhY2VzV2l0aFRleHRzKGNoaWxkKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVNwYW5FbGVtZW50c1dpdGhvdXRQcm9wZXJ0aWVzV2l0aFRleHRzKG5vZGU6IEhhc3ROb2RlKSB7XG4gIGxldCBjaGlsZHJlbiA9IChub2RlIGFzIEhhc3RQYXJlbnQpLmNoaWxkcmVuXG4gIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgOyhub2RlIGFzIEhhc3RQYXJlbnQpLmNoaWxkcmVuID0gY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoXG4gICAgICAoY2hpbGQpID0+XG4gICAgICAgIGNoaWxkLnR5cGUgPT09IEhhc3RUeXBlLkVsZW1lbnQgJiZcbiAgICAgICAgKGNoaWxkIGFzIEhhc3RFbGVtZW50KS50YWdOYW1lID09PSBcInNwYW5cIiAmJlxuICAgICAgICAoY2hpbGQucHJvcGVydGllcyA9PT0gdW5kZWZpbmVkIHx8IE9iamVjdC5rZXlzKGNoaWxkLnByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICAgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGNoaWxkLmNoaWxkcmVuWzBdLnR5cGUgPT09IEhhc3RUeXBlLlRleHRcbiAgICAgICAgID8gY2hpbGQuY2hpbGRyZW5bMF06IGNoaWxkLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICByZXBsYWNlU3BhbkVsZW1lbnRzV2l0aG91dFByb3BlcnRpZXNXaXRoVGV4dHMoY2hpbGQpXG4gICAgfVxuICB9XG59XG4iXX0=