UNPKG

angular-xml-editor

Version:
261 lines (260 loc) 25.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Xml2html } from '../xml-html-converter/xml2html.class'; export class DomDummyNodeManager { constructor() { } /** * @param {?} node * @return {?} */ static IsDummyNode(node) { /** @type {?} */ const asElem = /** @type {?} */ (node); if (asElem && node.nodeType === Node.ELEMENT_NODE) { return asElem.classList.contains(DomDummyNodeManager.DummyNodeClassName); } return false; } /** * @param {?} node * @return {?} */ static IsBeforeFirstTagDummyNode(node) { if (DomDummyNodeManager.IsDummyNode(node)) { /** @type {?} */ const asElem = /** @type {?} */ (node); if (asElem && node.nodeType === Node.ELEMENT_NODE) { return asElem.classList.contains(DomDummyNodeManager.DummyNodeBeforeFirstTagClassName); } return false; } else { return false; } } /** * @param {?} node * @return {?} */ static getPreviousSibling(node) { if (!node) { return undefined; } while (node) { node = node.previousSibling; if (node) { if (DomDummyNodeManager.IsDummyNode(node)) { } else { return node; } } } return undefined; } /** * @param {?} node * @return {?} */ static getNextSibling(node) { if (!node) { return undefined; } while (node) { node = node.nextSibling; if (node) { if (DomDummyNodeManager.IsDummyNode(node)) { } else { return node; } } } return undefined; } /** * @param {?} node * @return {?} */ static getChildNodeCount(node) { if (!node) { return 0; } /** @type {?} */ let count = 0; for (let i = 0; i < node.childNodes.length; i++) { if (!DomDummyNodeManager.IsDummyNode(node.childNodes[i])) { count++; } } return count; } /** * @param {?} node * @return {?} */ static getFirstChild(node) { if (!node) { return undefined; } /** @type {?} */ let first = /** @type {?} */ (node.firstChild); while (DomDummyNodeManager.IsDummyNode(first)) { first = first.nextSibling; } return first; } /** * @param {?} node * @return {?} */ static getLastChild(node) { if (!node) { return undefined; } /** @type {?} */ let last = /** @type {?} */ (node.lastChild); while (DomDummyNodeManager.IsDummyNode(last)) { last = last.previousSibling; } return last; } /** * @param {?} node * @param {?=} nodeDepth * @return {?} */ RemoveAllDummyNodes(node, nodeDepth = 0) { /** @type {?} */ let children = []; for (let i = 0; i < node.childNodes.length; ++i) { children.push(node.childNodes[i]); } // delete all dummy node children children.forEach(child => { if (DomDummyNodeManager.IsDummyNode(child)) { node.removeChild(child); } }); children = []; for (let i = 0; i < node.childNodes.length; ++i) { children.push(node.childNodes[i]); } // update child nodes children.forEach(child => { this.RemoveAllDummyNodes(child, nodeDepth + 1); }); } /** * @param {?} node * @param {?=} nodeDepth * @return {?} */ UpdateDummyNodes(node, nodeDepth = 0) { /** @type {?} */ const document = node.ownerDocument; /** @type {?} */ const asElement = /** @type {?} */ (node); /** @type {?} */ const children = []; for (let i = 0; i < node.childNodes.length; ++i) { children.push(node.childNodes[i]); } if (asElement && !DomDummyNodeManager.IsDummyNode(asElement) && !DomDummyNodeManager.IsDummyNode(asElement.parentElement)) { if (asElement.nodeType === Node.TEXT_NODE) { /** @type {?} */ const before = asElement.previousSibling; if (before.nodeType === Node.TEXT_NODE) { // textnode after text node: dont insert dummy node! } else { if (!DomDummyNodeManager.IsDummyNode(before)) { asElement.parentNode.insertBefore(this.createDummyNode(document), asElement); } } } if (asElement.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ let firstChild = node.firstChild; if (!firstChild) { // create dummy node in empty tag node.appendChild(this.createDummyNode(document)); firstChild = node.firstChild; } if (Xml2html.isNoClosingElement(node)) { } else { firstChild = node.firstChild; if (!firstChild) { // create dummy node in empty tag node.appendChild(this.createDummyNode(document)); firstChild = node.firstChild; } // Insert a dummy node before the first child if (!DomDummyNodeManager.IsDummyNode(firstChild)) { if (firstChild) { node.insertBefore(this.createDummyNode(document), firstChild); firstChild = node.firstChild; } else { node.appendChild(this.createDummyNode(document)); } } /** @type {?} */ let lastChild = node.lastChild; if (!DomDummyNodeManager.IsDummyNode(lastChild)) { node.appendChild(this.createDummyNode(document)); lastChild = node.lastChild; } // Insert a dummy node before the first (dummy child) but optical in front of the node (to show the cursor in front of the node) if (nodeDepth > 0) { if (DomDummyNodeManager.IsDummyNode(firstChild) && !DomDummyNodeManager.IsBeforeFirstTagDummyNode(firstChild)) { /** @type {?} */ const dummyNode = this.createDummyNode(document); dummyNode.classList.add(DomDummyNodeManager.DummyNodeBeforeFirstTagClassName); asElement.insertBefore(dummyNode, firstChild); } } } } } // update child nodes children.forEach(child => { this.UpdateDummyNodes(child, nodeDepth + 1); }); } /** * @param {?} targetDocument * @param {?=} content * @return {?} */ createDummyNode(targetDocument, content) { /** @type {?} */ const dummyNode = targetDocument.createElement('span'); /** @type {?} */ let dummy2TextNode; if (content === undefined) { dummy2TextNode = targetDocument.createTextNode(DomDummyNodeManager.DummyNodeContent); } else { dummy2TextNode = targetDocument.createTextNode(content); } dummyNode.classList.add(DomDummyNodeManager.DummyNodeClassName); dummyNode.appendChild(dummy2TextNode); return dummyNode; } } DomDummyNodeManager.DummyNodeClassName = 'dummyNode'; DomDummyNodeManager.DummyNodeBeforeFirstTagClassName = 'beforefirstTag'; DomDummyNodeManager.DummyNodeContent = String.fromCharCode(160); if (false) { /** @type {?} */ DomDummyNodeManager.DummyNodeClassName; /** @type {?} */ DomDummyNodeManager.DummyNodeBeforeFirstTagClassName; /** @type {?} */ DomDummyNodeManager.DummyNodeContent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLE1BQU07SUFLSixpQkFBZ0I7Ozs7O0lBRVQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFVOztRQUNsQyxNQUFNLE1BQU0scUJBQUcsSUFBZSxFQUFDO1FBQy9CLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDMUU7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7O0lBR1IsTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQVU7UUFDaEQsSUFBSSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7O1lBQ3pDLE1BQU0sTUFBTSxxQkFBRyxJQUFlLEVBQUM7WUFDL0IsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNqRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxDQUFDLENBQUM7YUFDeEY7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkOzs7Ozs7SUFJSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBVTtRQUN6QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksRUFBRTtZQUNYLElBQUks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QWMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sU0FBUyxDQUFDOzs7eUNBOU1nQixXQUFXO3VEQUNHLGdCQUFnQjt1Q0FDaEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRG9tRHVtbXlOb2RlTWFuYWdlciB7XHJcbiAgcHVibGljIHN0YXRpYyBEdW1teU5vZGVDbGFzc05hbWUgPSAnZHVtbXlOb2RlJztcclxuICBwdWJsaWMgc3RhdGljIER1bW15Tm9kZUJlZm9yZUZpcnN0VGFnQ2xhc3NOYW1lID0gJ2JlZm9yZWZpcnN0VGFnJztcclxuICBwdWJsaWMgc3RhdGljIER1bW15Tm9kZUNvbnRlbnQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgcHVibGljIHN0YXRpYyBJc0R1bW15Tm9kZShub2RlOiBOb2RlKSB7XHJcbiAgICBjb25zdCBhc0VsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XHJcbiAgICBpZiAoYXNFbGVtICYmIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgIHJldHVybiBhc0VsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKERvbUR1bW15Tm9kZU1hbmFnZXIuRHVtbXlOb2RlQ2xhc3NOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgSXNCZWZvcmVGaXJzdFRhZ0R1bW15Tm9kZShub2RlOiBOb2RlKSB7XHJcbiAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlKSkge1xyXG4gICAgICBjb25zdCBhc0VsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgIGlmIChhc0VsZW0gJiYgbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICByZXR1cm4gYXNFbGVtLmNsYXNzTGlzdC5jb250YWlucyhEb21EdW1teU5vZGVNYW5hZ2VyLkR1bW15Tm9kZUJlZm9yZUZpcnN0VGFnQ2xhc3NOYW1lKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgcHJldmlvcyBzaWJsaW5nIC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRQcmV2aW91c1NpYmxpbmcobm9kZTogTm9kZSk6IE5vZGUge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobm9kZSkpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IG5leHQgc2libGluZyAtIGV4Y2VwdCBkdW1teSBub2Rlc1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV4dFNpYmxpbmcobm9kZTogTm9kZSk6IE5vZGUge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcclxuICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlKSkge1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgY2hpbGRyZW4gY291bnQgLSBleGNlcHQgZHVtbXkgbm9kZXNcclxuICBwdWJsaWMgc3RhdGljIGdldENoaWxkTm9kZUNvdW50KG5vZGU6IE5vZGUpOiBudW1iZXIge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlLmNoaWxkTm9kZXNbaV0pKSB7XHJcbiAgICAgICAgY291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGZpcnN0IGNoaWxkIC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRGaXJzdENoaWxkKG5vZGU6IE5vZGUpOiBOb2RlIHtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgbGV0IGZpcnN0ID0gbm9kZS5maXJzdENoaWxkIGFzIE5vZGU7XHJcbiAgICB3aGlsZSAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdCkpIHtcclxuICAgICAgZmlyc3QgPSBmaXJzdC5uZXh0U2libGluZztcclxuICAgIH1cclxuICAgIHJldHVybiBmaXJzdDtcclxuICB9XHJcblxyXG4gIC8vIGdldCBsYXN0IGNoaWxkIC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRMYXN0Q2hpbGQobm9kZTogTm9kZSk6IE5vZGUge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBsZXQgbGFzdCA9IG5vZGUubGFzdENoaWxkIGFzIE5vZGU7XHJcbiAgICB3aGlsZSAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShsYXN0KSkge1xyXG4gICAgICBsYXN0ID0gbGFzdC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGFzdDtcclxuICB9XHJcblxyXG4gIFJlbW92ZUFsbER1bW15Tm9kZXMobm9kZTogTm9kZSwgbm9kZURlcHRoID0gMCk6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBOb2RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWxldGUgYWxsIGR1bW15IG5vZGUgY2hpbGRyZW5cclxuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShjaGlsZCkpIHtcclxuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hpbGRyZW4gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgY2hpbGQgbm9kZXNcclxuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICB0aGlzLlJlbW92ZUFsbER1bW15Tm9kZXMoY2hpbGQsIG5vZGVEZXB0aCArIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVEdW1teU5vZGVzKG5vZGU6IE5vZGUsIG5vZGVEZXB0aCA9IDApIHtcclxuICAgIGNvbnN0IGRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xyXG4gICAgY29uc3QgYXNFbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0IGNoaWxkcmVuOiBOb2RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXNFbGVtZW50ICYmICFEb21EdW1teU5vZGVNYW5hZ2VyLklzRHVtbXlOb2RlKGFzRWxlbWVudCkgJiYgIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoYXNFbGVtZW50LnBhcmVudEVsZW1lbnQpKSB7XHJcbiAgICAgIGlmIChhc0VsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgY29uc3QgYmVmb3JlID0gYXNFbGVtZW50LnByZXZpb3VzU2libGluZztcclxuICAgICAgICBpZiAoYmVmb3JlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgLy8gdGV4dG5vZGUgYWZ0ZXIgdGV4dCBub2RlOiBkb250IGluc2VydCBkdW1teSBub2RlIVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoYmVmb3JlKSkge1xyXG4gICAgICAgICAgICBhc0VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpLCBhc0VsZW1lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGFzRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBsZXQgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgIC8vIGNyZWF0ZSBkdW1teSBub2RlIGluIGVtcHR5IHRhZ1xyXG4gICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUR1bW15Tm9kZShkb2N1bWVudCkpO1xyXG4gICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChYbWwyaHRtbC5pc05vQ2xvc2luZ0VsZW1lbnQobm9kZSkpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIGR1bW15IG5vZGUgaW4gZW1wdHkgdGFnXHJcbiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpKTtcclxuICAgICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJbnNlcnQgYSBkdW1teSBub2RlIGJlZm9yZSB0aGUgZmlyc3QgY2hpbGRcclxuICAgICAgICAgIGlmICghRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSwgZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJbnNlcnQgYSBkdW1teSBub2RlIGFmdGVyIHRoZSBsYXN0IGNoaWxkXHJcbiAgICAgICAgICBsZXQgbGFzdENoaWxkID0gbm9kZS5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICBpZiAoIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobGFzdENoaWxkKSkge1xyXG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSk7XHJcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IG5vZGUubGFzdENoaWxkO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEluc2VydCBhIGR1bW15IG5vZGUgYmVmb3JlIHRoZSBmaXJzdCAoZHVtbXkgY2hpbGQpIGJ1dCBvcHRpY2FsIGluIGZyb250IG9mIHRoZSBub2RlICh0byBzaG93IHRoZSBjdXJzb3IgaW4gZnJvbnQgb2YgdGhlIG5vZGUpXHJcbiAgICAgICAgICBpZiAobm9kZURlcHRoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdENoaWxkKSAmJiAhRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0JlZm9yZUZpcnN0VGFnRHVtbXlOb2RlKGZpcnN0Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHVtbXlOb2RlID0gdGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICAgIGR1bW15Tm9kZS5jbGFzc0xpc3QuYWRkKERvbUR1bW15Tm9kZU1hbmFnZXIuRHVtbXlOb2RlQmVmb3JlRmlyc3RUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgIGFzRWxlbWVudC5pbnNlcnRCZWZvcmUoZHVtbXlOb2RlLCBmaXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVwZGF0ZSBjaGlsZCBub2Rlc1xyXG4gICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgIHRoaXMuVXBkYXRlRHVtbXlOb2RlcyhjaGlsZCwgbm9kZURlcHRoICsgMSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVEdW1teU5vZGUodGFyZ2V0RG9jdW1lbnQ6IERvY3VtZW50LCBjb250ZW50Pzogc3RyaW5nKTogRWxlbWVudCB7XHJcbiAgICBjb25zdCBkdW1teU5vZGUgPSB0YXJnZXREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBsZXQgZHVtbXkyVGV4dE5vZGU7XHJcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGR1bW15MlRleHROb2RlID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoRG9tRHVtbXlOb2RlTWFuYWdlci5EdW1teU5vZGVDb250ZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGR1bW15MlRleHROb2RlID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCk7XHJcbiAgICB9XHJcbiAgICBkdW1teU5vZGUuY2xhc3NMaXN0LmFkZChEb21EdW1teU5vZGVNYW5hZ2VyLkR1bW15Tm9kZUNsYXNzTmFtZSk7XHJcbiAgICBkdW1teU5vZGUuYXBwZW5kQ2hpbGQoZHVtbXkyVGV4dE5vZGUpO1xyXG4gICAgcmV0dXJuIGR1bW15Tm9kZTtcclxuICB9XHJcbn1cclxuIl19