UNPKG

angular-xml-editor

Version:
206 lines (205 loc) 26.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XMLCursorPositions } from './xmlCursorPos.class'; import { XmlToolbox } from '../xmlToolbox.class'; import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class'; import { Xml2html } from '../xml-html-converter/xml2html.class'; var XmlCursorPosMover = /** @class */ (function () { function XmlCursorPosMover() { } /** * @param {?} pos * @param {?} rootNode * @param {?} xmlRules * @return {?} */ XmlCursorPosMover.moveLeft = /** * @param {?} pos * @param {?} rootNode * @param {?} xmlRules * @return {?} */ function (pos, rootNode, xmlRules) { if (pos === undefined) { return false; } switch (pos.PosAtNode) { case XMLCursorPositions.CursorOnCompleteNode: // Put in front of the node pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInFrontOfNode); break; case XMLCursorPositions.CursorInFrontOfNode: if (pos.ActualNode === rootNode) { return false; } else { /** @type {?} */ var previousSibling = DomDummyNodeManager.getPreviousSibling(pos.ActualNode); if (previousSibling) { // Previous sibling node exists pos.setCursorpBehindNodeForLeftMovement(previousSibling); } else { // no previous sibling node available -> set before parent node pos.SetCursor(pos.ActualNode.parentNode, XMLCursorPositions.CursorInFrontOfNode); } } break; case XMLCursorPositions.CursorBehindNode: pos.setCursorpBehindNodeForLeftMovement(pos.ActualNode); break; case XMLCursorPositions.CursorInEmptyNode: // Put in front of the node pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInFrontOfNode); break; case XMLCursorPositions.CursorInsideTextNode: if (XmlToolbox.IsTextOrCommentNode(pos.ActualNode)) { // Node is Textnode if (pos.PosInTextnode > 1) { // Cursor one character to the left pos.SetCursor(pos.ActualNode, pos.PosAtNode, pos.PosInTextnode - 1); } else { // Put in front of the node pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInFrontOfNode); } } else { /** @type {?} */ var elemt = /** @type {?} */ (pos.ActualNode); throw new Error("XMLCursorPos.MoveLeft: CursorPos is XMLCursorPositionen.CursorInnerhalbDesTextNodes,\n but no text node has been chosen, but the node " + (elemt ? elemt.outerHTML : '')); } break; default: throw new Error("XMLCursorPos.MoveLeft: unknown CursorPos " + pos.PosAtNode); } return true; }; /** * @param {?} pos * @param {?} rootNode * @param {?} xmlRules * @return {?} */ XmlCursorPosMover.moveRight = /** * @param {?} pos * @param {?} rootNode * @param {?} xmlRules * @return {?} */ function (pos, rootNode, xmlRules) { if (pos === undefined) { return false; } switch (pos.PosAtNode) { case XMLCursorPositions.CursorOnCompleteNode: /** @type {?} */ var tagName = Xml2html.getTagNameFromNode(pos.ActualNode); /** @type {?} */ var rule = xmlRules.ruleElements.get(tagName); if (rule && rule.empty === true) { pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode); } else { /** @type {?} */ var firstChild = DomDummyNodeManager.getFirstChild(pos.ActualNode); if (firstChild) { pos.SetCursor(firstChild, XMLCursorPositions.CursorInFrontOfNode); } else { pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInEmptyNode); } } break; case XMLCursorPositions.CursorBehindNode: /** @type {?} */ var nextSibling = DomDummyNodeManager.getNextSibling(pos.ActualNode); if (nextSibling) { /** @type {?} */ var elemt = /** @type {?} */ (pos.ActualNode); throw new Error("XMLCursorPos.MoveRight: cursor behind node should only be set, when no other siblings are following " + (elemt ? elemt.outerHTML : '')); } else { /** @type {?} */ var parentNextSibling = DomDummyNodeManager.getNextSibling(pos.ActualNode.parentElement); if (parentNextSibling) { pos.SetCursor(parentNextSibling, XMLCursorPositions.CursorInFrontOfNode); } else { pos.SetCursor(pos.ActualNode.parentElement, XMLCursorPositions.CursorBehindNode); } } break; case XMLCursorPositions.CursorInEmptyNode: // Place behind the node pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode); break; case XMLCursorPositions.CursorInFrontOfNode: if (XmlToolbox.IsTextOrCommentNode(pos.ActualNode)) { // Node is Textnode if ((/** @type {?} */ (pos.ActualNode)).textContent.length > 1) { // Textnode is not empty pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInsideTextNode, 1); // one character forward, behind the first character } else { // Textnode is empty // put behind the node pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorBehindNode); // Because "CursorBehindNode" is not attractive, one more step this.moveRight(pos, rootNode, xmlRules); } } else { /** @type {?} */ var childNodeCount = DomDummyNodeManager.getChildNodeCount(pos.ActualNode); if (childNodeCount === 0) { // no Children existing if (Xml2html.isNoClosingElement(pos.ActualNode)) { // If no closed tag is displayed for this node, then directly behind the node // Place behind the node pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode); } else { // Node has closing tag, so put in between // Place in empty node pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInEmptyNode); } } else { /** @type {?} */ var firstChild = DomDummyNodeManager.getFirstChild(pos.ActualNode); pos.SetCursor(firstChild, XMLCursorPositions.CursorInFrontOfNode); } } break; case XMLCursorPositions.CursorInsideTextNode: if (XmlToolbox.IsTextOrCommentNode(pos.ActualNode)) { // Node is Textnode if ((/** @type {?} */ (pos.ActualNode)).textContent.length > pos.PosInTextnode + 1) { // there is still text in the right of the textnode // step one character forwards: behind the first char pos.SetCursor(pos.ActualNode, pos.PosAtNode, pos.PosInTextnode + 1); } else { // no text after the textnode // place cursor behind the node pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode); } } else { /** @type {?} */ var elemt = /** @type {?} */ (pos.ActualNode); throw new Error("XMLCursorPos.MoveRight: CursorPos is XMLCursorPositionen.CursorInnerhalbDesTextNodes, \n but no text node has been chosen, but the node " + (elemt ? elemt.outerHTML : '')); } break; default: throw new Error("String.Format(\"XMLCursorPos.MoveRight: unknown CursorPos " + pos.PosAtNode); } return true; }; return XmlCursorPosMover; }()); export { XmlCursorPosMover }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sQ3Vyc29yUG9zTW92ZXIuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS9jdXJzb3IveG1sQ3Vyc29yUG9zTW92ZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLElBQUE7Ozs7Ozs7OztJQUNnQiwwQkFBUTs7Ozs7O2NBQUMsR0FBaUIsRUFBRSxRQUFpQixFQUFFLFFBQWtCO1FBQzdFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUNyQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQ3JCLEtBQUssa0JBQWtCLENBQUMsb0JBQW9COztnQkFFMUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3RFLE1BQU07WUFFUixLQUFLLGtCQUFrQixDQUFDLG1CQUFtQjtnQkFDekMsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRTtvQkFDL0IsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7cUJBQU07O29CQUNMLElBQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxlQUFlLEVBQUU7O3dCQUVuQixHQUFHLENBQUMsbUNBQW1DLENBQUMsZUFBZSxDQUFDLENBQUM7cUJBQzFEO3lCQUFNOzt3QkFFTCxHQUFHLENBQUMsU0FB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QUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLHFLQUMrQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFDLENBQUM7aUJBQ2hHO2dCQUNELE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUE0RCxHQUFHLENBQUMsU0FBVyxDQUFDLENBQUM7U0FDaEc7UUFFRCxPQUFPLElBQUksQ0FBQzs7NEJBeEtoQjtJQTBLQyxDQUFBO0FBcEtELDZCQW9LQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFhtbEN1cnNvclBvcywgWE1MQ3Vyc29yUG9zaXRpb25zIH0gZnJvbSAnLi94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxSdWxlcyB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxSdWxlcy5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbFRvb2xib3ggfSBmcm9tICcuLi94bWxUb29sYm94LmNsYXNzJztcclxuaW1wb3J0IHsgRG9tRHVtbXlOb2RlTWFuYWdlciB9IGZyb20gJy4uL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi4veG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxDdXJzb3JQb3NNb3ZlciB7XHJcbiAgcHVibGljIHN0YXRpYyBtb3ZlTGVmdChwb3M6IFhtbEN1cnNvclBvcywgcm9vdE5vZGU6IEVsZW1lbnQsIHhtbFJ1bGVzOiBYbWxSdWxlcyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHBvcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHBvcy5Qb3NBdE5vZGUpIHtcclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yT25Db21wbGV0ZU5vZGU6XHJcbiAgICAgICAgLy8gUHV0IGluIGZyb250IG9mIHRoZSBub2RlXHJcbiAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZTpcclxuICAgICAgICBpZiAocG9zLkFjdHVhbE5vZGUgPT09IHJvb3ROb2RlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzU2libGluZyA9IERvbUR1bW15Tm9kZU1hbmFnZXIuZ2V0UHJldmlvdXNTaWJsaW5nKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHtcclxuICAgICAgICAgICAgLy8gUHJldmlvdXMgc2libGluZyBub2RlIGV4aXN0c1xyXG4gICAgICAgICAgICBwb3Muc2V0Q3Vyc29ycEJlaGluZE5vZGVGb3JMZWZ0TW92ZW1lbnQocHJldmlvdXNTaWJsaW5nKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG5vIHByZXZpb3VzIHNpYmxpbmcgbm9kZSBhdmFpbGFibGUgLT4gc2V0IGJlZm9yZSBwYXJlbnQgbm9kZVxyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLnBhcmVudE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgIHBvcy5zZXRDdXJzb3JwQmVoaW5kTm9kZUZvckxlZnRNb3ZlbWVudChwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZTpcclxuICAgICAgICAvLyBQdXQgaW4gZnJvbnQgb2YgdGhlIG5vZGVcclxuICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbnNpZGVUZXh0Tm9kZTpcclxuICAgICAgICBpZiAoWG1sVG9vbGJveC5Jc1RleHRPckNvbW1lbnROb2RlKHBvcy5BY3R1YWxOb2RlKSkge1xyXG4gICAgICAgICAgLy8gTm9kZSBpcyBUZXh0bm9kZVxyXG4gICAgICAgICAgaWYgKHBvcy5Qb3NJblRleHRub2RlID4gMSkge1xyXG4gICAgICAgICAgICAvLyBDdXJzb3Igb25lIGNoYXJhY3RlciB0byB0aGUgbGVmdFxyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBwb3MuUG9zQXROb2RlLCBwb3MuUG9zSW5UZXh0bm9kZSAtIDEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUHV0IGluIGZyb250IG9mIHRoZSBub2RlXHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3IocG9zLkFjdHVhbE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gbm8gVGV4dG5vZGVcclxuICAgICAgICAgIGNvbnN0IGVsZW10ID0gcG9zLkFjdHVhbE5vZGUgYXMgRWxlbWVudDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWE1MQ3Vyc29yUG9zLk1vdmVMZWZ0OiBDdXJzb3JQb3MgaXMgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbm5lcmhhbGJEZXNUZXh0Tm9kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBubyB0ZXh0IG5vZGUgaGFzIGJlZW4gY2hvc2VuLCBidXQgdGhlIG5vZGUgJHtlbGVtdCA/IGVsZW10Lm91dGVySFRNTCA6ICcnfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYTUxDdXJzb3JQb3MuTW92ZUxlZnQ6IHVua25vd24gQ3Vyc29yUG9zICR7cG9zLlBvc0F0Tm9kZX1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBtb3ZlUmlnaHQocG9zOiBYbWxDdXJzb3JQb3MsIHJvb3ROb2RlOiBFbGVtZW50LCB4bWxSdWxlczogWG1sUnVsZXMpOiBib29sZWFuIHtcclxuICAgIGlmIChwb3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChwb3MuUG9zQXROb2RlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvck9uQ29tcGxldGVOb2RlOlxyXG4gICAgICAgIC8vIEhpbnRlciBkZW4gTm9kZSBzZXR6ZW5cclxuICAgICAgICBjb25zdCB0YWdOYW1lID0gWG1sMmh0bWwuZ2V0VGFnTmFtZUZyb21Ob2RlKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICBjb25zdCBydWxlID0geG1sUnVsZXMucnVsZUVsZW1lbnRzLmdldCh0YWdOYW1lKTtcclxuICAgICAgICBpZiAocnVsZSAmJiBydWxlLmVtcHR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICBwb3Muc2V0Q3Vyc29yQmVoaW5kTm9kZUZvckRlZmF1bHRPclJpZ2h0TW92ZW1lbnQocG9zLkFjdHVhbE5vZGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gRG9tRHVtbXlOb2RlTWFuYWdlci5nZXRGaXJzdENoaWxkKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGlmIChmaXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3IoZmlyc3RDaGlsZCwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gRG9tRHVtbXlOb2RlTWFuYWdlci5nZXROZXh0U2libGluZyhwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgICAgICAvLyBjdXJzb3IgYmVoaW5kIG5vZGUgc2hvdWxkIG9ubHkgYmUgc2V0LCB3aGVuIG5vIG90aGVyIHNpYmxpbmdzIGFyZSBmb2xsb3dpbmdcclxuICAgICAgICAgIGNvbnN0IGVsZW10ID0gcG9zLkFjdHVhbE5vZGUgYXMgRWxlbWVudDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWE1MQ3Vyc29yUG9zLk1vdmVSaWdodDogY3Vyc29yIGJlaGluZCBub2RlIHNob3VsZCBvbmx5IGJlIHNldCwgd2hlbiBubyBvdGhlciBzaWJsaW5ncyBhcmUgZm9sbG93aW5nICR7ZWxlbXQgPyBlbGVtdC5vdXRlckhUTUwgOiAnJ31gKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm8gZm9sbG93aW5nIHNpYmxpbmdzIHByZXNlbnQsIHRoZW4gc2V0IGFmdGVyIHBhcmVudCBub2RlXHJcbiAgICAgICAgICBjb25zdCBwYXJlbnROZXh0U2libGluZyA9IERvbUR1bW15Tm9kZU1hbmFnZXIuZ2V0TmV4dFNpYmxpbmcocG9zLkFjdHVhbE5vZGUucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICBpZiAocGFyZW50TmV4dFNpYmxpbmcpIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwYXJlbnROZXh0U2libGluZywgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50LCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgLy8gUGxhY2UgYmVoaW5kIHRoZSBub2RlXHJcbiAgICAgICAgcG9zLnNldEN1cnNvckJlaGluZE5vZGVGb3JEZWZhdWx0T3JSaWdodE1vdmVtZW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGU6XHJcbiAgICAgICAgaWYgKFhtbFRvb2xib3guSXNUZXh0T3JDb21tZW50Tm9kZShwb3MuQWN0dWFsTm9kZSkpIHtcclxuICAgICAgICAgIC8vIE5vZGUgaXMgVGV4dG5vZGVcclxuICAgICAgICAgIGlmICgocG9zLkFjdHVhbE5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAvLyBUZXh0bm9kZSBpcyBub3QgZW1wdHlcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlLCAxKTsgLy8gb25lIGNoYXJhY3RlciBmb3J3YXJkLCBiZWhpbmQgdGhlIGZpcnN0IGNoYXJhY3RlclxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVGV4dG5vZGUgaXMgZW1wdHlcclxuICAgICAgICAgICAgLy8gcHV0IGJlaGluZCB0aGUgbm9kZVxyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZSk7XHJcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgXCJDdXJzb3JCZWhpbmROb2RlXCIgaXMgbm90IGF0dHJhY3RpdmUsIG9uZSBtb3JlIHN0ZXBcclxuICAgICAgICAgICAgdGhpcy5tb3ZlUmlnaHQocG9zLCByb290Tm9kZSwgeG1sUnVsZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBOb2RlIGlzIG5vdCBUZXh0bm9kZVxyXG4gICAgICAgICAgY29uc3QgY2hpbGROb2RlQ291bnQgPSBEb21EdW1teU5vZGVNYW5hZ2VyLmdldENoaWxkTm9kZUNvdW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGlmIChjaGlsZE5vZGVDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBubyBDaGlsZHJlbiBleGlzdGluZ1xyXG4gICAgICAgICAgICBpZiAoWG1sMmh0bWwuaXNOb0Nsb3NpbmdFbGVtZW50KHBvcy5BY3R1YWxOb2RlKSkge1xyXG4gICAgICAgICAgICAgIC8vIElmIG5vIGNsb3NlZCB0YWcgaXMgZGlzcGxheWVkIGZvciB0aGlzIG5vZGUsIHRoZW4gZGlyZWN0bHkgYmVoaW5kIHRoZSBub2RlXHJcbiAgICAgICAgICAgICAgLy8gUGxhY2UgYmVoaW5kIHRoZSBub2RlXHJcbiAgICAgICAgICAgICAgcG9zLnNldEN1cnNvckJlaGluZE5vZGVGb3JEZWZhdWx0T3JSaWdodE1vdmVtZW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBOb2RlIGhhcyBjbG9zaW5nIHRhZywgc28gcHV0IGluIGJldHdlZW5cclxuICAgICAgICAgICAgICAvLyBQbGFjZSBpbiBlbXB0eSBub2RlXHJcbiAgICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ2hpbGRyZW4gZXhpc3RpbmdcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IERvbUR1bW15Tm9kZU1hbmFnZXIuZ2V0Rmlyc3RDaGlsZChwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3IoZmlyc3RDaGlsZCwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgIGlmIChYbWxUb29sYm94LklzVGV4dE9yQ29tbWVudE5vZGUocG9zLkFjdHVhbE5vZGUpKSB7XHJcbiAgICAgICAgICAvLyBOb2RlIGlzIFRleHRub2RlXHJcbiAgICAgICAgICBpZiAoKHBvcy5BY3R1YWxOb2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50Lmxlbmd0aCA+IHBvcy5Qb3NJblRleHRub2RlICsgMSkge1xyXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBzdGlsbCB0ZXh0IGluIHRoZSByaWdodCBvZiB0aGUgdGV4dG5vZGVcclxuICAgICAgICAgICAgLy8gc3RlcCBvbmUgY2hhcmFjdGVyIGZvcndhcmRzOiBiZWhpbmQgdGhlIGZpcnN0IGNoYXJcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgcG9zLlBvc0F0Tm9kZSwgcG9zLlBvc0luVGV4dG5vZGUgKyAxKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG5vIHRleHQgYWZ0ZXIgdGhlIHRleHRub2RlXHJcbiAgICAgICAgICAgIC8vIHBsYWNlIGN1cnNvciBiZWhpbmQgdGhlIG5vZGVcclxuICAgICAgICAgICAgcG9zLnNldEN1cnNvckJlaGluZE5vZGVGb3JEZWZhdWx0T3JSaWdodE1vdmVtZW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm9kZSBpcyBubyBUZXh0bm9kZVxyXG4gICAgICAgICAgY29uc3QgZWxlbXQgPSBwb3MuQWN0dWFsTm9kZSBhcyBFbGVtZW50O1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYTUxDdXJzb3JQb3MuTW92ZVJpZ2h0OiBDdXJzb3JQb3MgaXMgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbm5lcmhhbGJEZXNUZXh0Tm9kZXMsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXQgbm8gdGV4dCBub2RlIGhhcyBiZWVuIGNob3NlbiwgYnV0IHRoZSBub2RlICR7ZWxlbXQgPyBlbGVtdC5vdXRlckhUTUwgOiAnJ31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcuRm9ybWF0KFwiWE1MQ3Vyc29yUG9zLk1vdmVSaWdodDogdW5rbm93biBDdXJzb3JQb3MgJHtwb3MuUG9zQXROb2RlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxufVxyXG4iXX0=