angular-xml-editor
Version:
XML editor component for Angular
218 lines (217 loc) • 20.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XmlCursorPos, XMLCursorPositions } from '../cursor/xmlCursorPos.class';
import { XmlRuleAttribut } from './xmlRuleAttribut.class';
import { Xml2html } from '../xml-html-converter/xml2html.class';
var XmlEditRuleCheckAttributes = /** @class */ (function () {
function XmlEditRuleCheckAttributes(xmlSchema) {
this.xmlSchema = xmlSchema;
}
/**
* @param {?} cursorPosToCheck
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.AttributesAllowedAtThisCursorPos = /**
* @param {?} cursorPosToCheck
* @return {?}
*/
function (cursorPosToCheck) {
if (!cursorPosToCheck) {
return [];
}
/** @type {?} */
var parentNode = this.getRelevantParentNodeForCursorPos(cursorPosToCheck);
/** @type {?} */
var parentName = Xml2html.getTagNameFromNode(parentNode);
return this.getAttributesForElementName(parentName);
};
/**
* @param {?} cursorPosToCheck
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.getRelevantParentNodeForCursorPos = /**
* @param {?} cursorPosToCheck
* @return {?}
*/
function (cursorPosToCheck) {
if (cursorPosToCheck) {
/** @type {?} */
var parentNode = cursorPosToCheck.ActualNode;
switch (parentNode.nodeType) {
case Node.COMMENT_NODE:
case Node.TEXT_NODE:
parentNode = parentNode.parentElement;
break;
case Node.ELEMENT_NODE:
switch (cursorPosToCheck.PosAtNode) {
case XMLCursorPositions.CursorInEmptyNode:
case XMLCursorPositions.CursorInsideTextNode:
case XMLCursorPositions.CursorOnCompleteNode:
break;
case XMLCursorPositions.CursorBehindNode:
case XMLCursorPositions.CursorInFrontOfNode:
parentNode = parentNode.parentElement;
break;
default:
throw new Error("unhandled cursorPosToCheck.PosAmNode \"" + cursorPosToCheck.PosAtNode + "\"/" + XmlCursorPos.getXmlCursorPositionDebugName(cursorPosToCheck.PosAtNode) + "\" ");
}
break;
default:
throw new Error("unhandled parentNode.nodeType \"" + parentNode.nodeType + "\"");
}
return parentNode;
}
};
/**
* @param {?} elementName
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.getAttributesForElementName = /**
* @param {?} elementName
* @return {?}
*/
function (elementName) {
/** @type {?} */
var xsdNode = this.xmlSchema.findXsdNodeForTagName(elementName);
return this.getAttributesForElement(xsdNode, new Set([xsdNode]));
};
/**
* @param {?} xsdNode
* @param {?} alreadyAddedElements
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.getAttributesForElement = /**
* @param {?} xsdNode
* @param {?} alreadyAddedElements
* @return {?}
*/
function (xsdNode, alreadyAddedElements) {
var _this = this;
/** @type {?} */
var attributes = [];
if (xsdNode) {
alreadyAddedElements.add(xsdNode);
/** @type {?} */
var childNodes = Array.prototype.slice.call(xsdNode.childNodes);
childNodes.forEach(function (child) {
if (xsdNode.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
var childElem = /** @type {?} */ (child);
if (childElem) {
if (child.localName === 'attribute') {
// is attribute
attributes = attributes.concat([
new XmlRuleAttribut({
attribName: childElem.attributes.getNamedItem('name').value,
required: _this.isRequiredAttribute(childElem),
xsdRawNode: childElem,
fixedValues: _this.getFixedValues(childElem),
defaultValue: _this.getDefaultValue(childElem)
})
]);
}
else {
// no attribute
if (!alreadyAddedElements.has(child)) {
/** @type {?} */
var subNodeAttributes = _this.getAttributesForElement(child, alreadyAddedElements);
attributes = attributes.concat(subNodeAttributes);
}
else {
// Element already added
}
}
}
}
});
}
return attributes;
};
/**
* the default value for this attribute
* @param {?} childElem
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.getDefaultValue = /**
* the default value for this attribute
* @param {?} childElem
* @return {?}
*/
function (childElem) {
/** @type {?} */
var attrib = childElem.attributes.getNamedItem('default');
if (attrib !== null) {
return attrib.value;
}
return undefined;
};
/**
* is this attribute required?
* @param {?} childElem
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.isRequiredAttribute = /**
* is this attribute required?
* @param {?} childElem
* @return {?}
*/
function (childElem) {
/** @type {?} */
var attrib = childElem.attributes.getNamedItem('use');
/** @type {?} */
var value = attrib !== null && attrib.value === 'required';
return value;
};
/**
* get the allowes values for this attribute
* @param {?} xsdNode
* @param {?=} alreadyChecked
* @return {?}
*/
XmlEditRuleCheckAttributes.prototype.getFixedValues = /**
* get the allowes values for this attribute
* @param {?} xsdNode
* @param {?=} alreadyChecked
* @return {?}
*/
function (xsdNode, alreadyChecked) {
var _this = this;
if (alreadyChecked === void 0) { alreadyChecked = []; }
/** @type {?} */
var values = [];
/** @type {?} */
var childNodes = Array.prototype.slice.call(xsdNode.childNodes);
childNodes.forEach(function (child) {
if (xsdNode.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
var childElem = /** @type {?} */ (child);
if (childElem) {
if (child.localName === 'enumeration') {
values = values.concat([childElem.attributes.getNamedItem('value').value]);
}
else {
// no attribute
if (alreadyChecked.indexOf(child) === -1) {
/** @type {?} */
var subNodeAttributes = _this.getFixedValues(child, alreadyChecked);
values = values.concat(subNodeAttributes);
}
else {
// Element already added
}
}
}
}
});
return values;
};
return XmlEditRuleCheckAttributes;
}());
export { XmlEditRuleCheckAttributes };
if (false) {
/** @type {?} */
XmlEditRuleCheckAttributes.prototype.xmlSchema;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja0F0dHJpYnV0ZXMuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS94bWwtcnVsZXMtY2hlY2sveG1sRWRpdFJ1bGVDaGVja0F0dHJpYnV0ZXMuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLElBQUE7SUFDRSxvQ0FBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztLQUFJOzs7OztJQUU1QyxxRUFBZ0M7Ozs7SUFBaEMsVUFBaUMsZ0JBQThCO1FBQzdELElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyQixPQUFPLEVBQUUsQ0FBQztTQUNYOztRQUNELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztRQUM1RSxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDckQ7Ozs7O0lBRUQsc0VBQWlDOzs7O0lBQWpDLFVBQWtDLGdCQUE4QjtRQUM5RCxJQUFJLGdCQUFnQixFQUFFOztZQUNwQixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7WUFFN0MsUUFBUSxVQUFVLENBQUMsUUFBUSxFQUFFO2dCQUMzQixLQUFLLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLFNBQVM7b0JBQ2pCLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO29C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QUFDLEVBQUU7OzRCQUN4QyxJQUFNLGlCQUFpQixHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDOzRCQUNyRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3lCQUMzQzs2QkFBTTs7eUJBRU47cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDOztxQ0F4SWxCO0lBMElDLENBQUE7QUFySUQsc0NBcUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuLi9jdXJzb3IveG1sQ3Vyc29yUG9zLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sUnVsZUF0dHJpYnV0IH0gZnJvbSAnLi94bWxSdWxlQXR0cmlidXQuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxTY2hlbWEgfSBmcm9tICcuL3htbFNjaGVtYS5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi4veG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxFZGl0UnVsZUNoZWNrQXR0cmlidXRlcyB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB4bWxTY2hlbWE6IFhtbFNjaGVtYSkge31cclxuXHJcbiAgQXR0cmlidXRlc0FsbG93ZWRBdFRoaXNDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogWG1sUnVsZUF0dHJpYnV0W10ge1xyXG4gICAgaWYgKCFjdXJzb3JQb3NUb0NoZWNrKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmdldFJlbGV2YW50UGFyZW50Tm9kZUZvckN1cnNvclBvcyhjdXJzb3JQb3NUb0NoZWNrKTtcclxuICAgIGNvbnN0IHBhcmVudE5hbWUgPSBYbWwyaHRtbC5nZXRUYWdOYW1lRnJvbU5vZGUocGFyZW50Tm9kZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzRm9yRWxlbWVudE5hbWUocGFyZW50TmFtZSk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogTm9kZSB7XHJcbiAgICBpZiAoY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICBsZXQgcGFyZW50Tm9kZSA9IGN1cnNvclBvc1RvQ2hlY2suQWN0dWFsTm9kZTtcclxuXHJcbiAgICAgIHN3aXRjaCAocGFyZW50Tm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6XHJcbiAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTpcclxuICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcclxuICAgICAgICAgIHN3aXRjaCAoY3Vyc29yUG9zVG9DaGVjay5Qb3NBdE5vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTpcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckJlaGluZE5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGU6XHJcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgY3Vyc29yUG9zVG9DaGVjay5Qb3NBbU5vZGUgXCIke2N1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlfVwiLyR7WG1sQ3Vyc29yUG9zLmdldFhtbEN1cnNvclBvc2l0aW9uRGVidWdOYW1lKGN1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlKX1cIiBgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgcGFyZW50Tm9kZS5ub2RlVHlwZSBcIiR7cGFyZW50Tm9kZS5ub2RlVHlwZX1cImApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJlbnROb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlc0ZvckVsZW1lbnROYW1lKGVsZW1lbnROYW1lOiBzdHJpbmcpOiBYbWxSdWxlQXR0cmlidXRbXSB7XHJcbiAgICBjb25zdCB4c2ROb2RlID0gdGhpcy54bWxTY2hlbWEuZmluZFhzZE5vZGVGb3JUYWdOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXNGb3JFbGVtZW50KHhzZE5vZGUsIG5ldyBTZXQoW3hzZE5vZGVdKSk7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVzRm9yRWxlbWVudCh4c2ROb2RlOiBOb2RlLCBhbHJlYWR5QWRkZWRFbGVtZW50czogU2V0PE5vZGU+KTogWG1sUnVsZUF0dHJpYnV0W10ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IFhtbFJ1bGVBdHRyaWJ1dFtdID0gW107XHJcblxyXG4gICAgaWYgKHhzZE5vZGUpIHtcclxuICAgICAgYWxyZWFkeUFkZGVkRWxlbWVudHMuYWRkKHhzZE5vZGUpO1xyXG5cclxuICAgICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2Rlcyk7XHJcblxyXG4gICAgICBjaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgIGlmICh4c2ROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgY29uc3QgY2hpbGRFbGVtID0gY2hpbGQgYXMgRWxlbWVudDtcclxuICAgICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2F0dHJpYnV0ZScpIHtcclxuICAgICAgICAgICAgICAvLyBpcyBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQoW1xyXG4gICAgICAgICAgICAgICAgbmV3IFhtbFJ1bGVBdHRyaWJ1dCh7XHJcbiAgICAgICAgICAgICAgICAgIGF0dHJpYk5hbWU6IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmFtZScpLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZDogdGhpcy5pc1JlcXVpcmVkQXR0cmlidXRlKGNoaWxkRWxlbSksXHJcbiAgICAgICAgICAgICAgICAgIHhzZFJhd05vZGU6IGNoaWxkRWxlbSxcclxuICAgICAgICAgICAgICAgICAgZml4ZWRWYWx1ZXM6IHRoaXMuZ2V0Rml4ZWRWYWx1ZXMoY2hpbGRFbGVtKSxcclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmdldERlZmF1bHRWYWx1ZShjaGlsZEVsZW0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIG5vIGF0dHJpYnV0ZVxyXG4gICAgICAgICAgICAgIGlmICghYWxyZWFkeUFkZGVkRWxlbWVudHMuaGFzKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTm9kZUF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNGb3JFbGVtZW50KGNoaWxkLCBhbHJlYWR5QWRkZWRFbGVtZW50cyk7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQoc3ViTm9kZUF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGFscmVhZHkgYWRkZWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSAqL1xyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlKGNoaWxkRWxlbTogRWxlbWVudCkge1xyXG4gICAgY29uc3QgYXR0cmliID0gY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkZWZhdWx0Jyk7XHJcbiAgICBpZiAoYXR0cmliICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBhdHRyaWIudmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIGlzIHRoaXMgYXR0cmlidXRlIHJlcXVpcmVkPyAqL1xyXG4gIHByaXZhdGUgaXNSZXF1aXJlZEF0dHJpYnV0ZShjaGlsZEVsZW06IEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGF0dHJpYiA9IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgndXNlJyk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYiAhPT0gbnVsbCAmJiBhdHRyaWIudmFsdWUgPT09ICdyZXF1aXJlZCc7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogZ2V0IHRoZSBhbGxvd2VzIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgKi9cclxuICBwcml2YXRlIGdldEZpeGVkVmFsdWVzKHhzZE5vZGU6IEVsZW1lbnQsIGFscmVhZHlDaGVja2VkOiBOb2RlW10gPSBbXSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2Rlcyk7XHJcbiAgICBjaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBpZiAoeHNkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdlbnVtZXJhdGlvbicpIHtcclxuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChbY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCd2YWx1ZScpLnZhbHVlXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBubyBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlDaGVja2VkLmluZGV4T2YoY2hpbGQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1Yk5vZGVBdHRyaWJ1dGVzID0gdGhpcy5nZXRGaXhlZFZhbHVlcyhjaGlsZCwgYWxyZWFkeUNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3ViTm9kZUF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgYWxyZWFkeSBhZGRlZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWVzO1xyXG4gIH1cclxufVxyXG4iXX0=