ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
347 lines (291 loc) • 39.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.syntax = exports.TokenizerEventHandlers = undefined;
exports.preprocess = preprocess;
var _builders = require("../builders");
var _builders2 = _interopRequireDefault(_builders);
var _utils = require("../utils");
var _handlebarsNodeVisitors = require("./handlebars-node-visitors");
var _syntaxError = require("../errors/syntax-error");
var _syntaxError2 = _interopRequireDefault(_syntaxError);
var _traverse = require("../traversal/traverse");
var _traverse2 = _interopRequireDefault(_traverse);
var _print = require("../generation/print");
var _print2 = _interopRequireDefault(_print);
var _walker = require("../traversal/walker");
var _walker2 = _interopRequireDefault(_walker);
var _handlebars = require("handlebars");
var handlebars = _interopRequireWildcard(_handlebars);
var _util = require("@glimmer/util");
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defaults(obj, defaults) {
var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
Object.defineProperty(obj, key, value);
}
}return obj;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && (typeof call === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var voidMap = Object.create(null);
var voidTagNames = "area base br col command embed hr img input keygen link meta param source track wbr";
voidTagNames.split(" ").forEach(function (tagName) {
voidMap[tagName] = true;
});
var TokenizerEventHandlers = exports.TokenizerEventHandlers = function (_HandlebarsNodeVisito) {
_inherits(TokenizerEventHandlers, _HandlebarsNodeVisito);
function TokenizerEventHandlers() {
_classCallCheck(this, TokenizerEventHandlers);
var _this = _possibleConstructorReturn(this, _HandlebarsNodeVisito.apply(this, arguments));
_this.tagOpenLine = 0;
_this.tagOpenColumn = 0;
return _this;
}
TokenizerEventHandlers.prototype.reset = function reset() {
this.currentNode = null;
};
// Comment
TokenizerEventHandlers.prototype.beginComment = function beginComment() {
this.currentNode = _builders2.default.comment("");
this.currentNode.loc = {
source: null,
start: _builders2.default.pos(this.tagOpenLine, this.tagOpenColumn),
end: null
};
};
TokenizerEventHandlers.prototype.appendToCommentData = function appendToCommentData(char) {
this.currentComment.value += char;
};
TokenizerEventHandlers.prototype.finishComment = function finishComment() {
this.currentComment.loc.end = _builders2.default.pos(this.tokenizer.line, this.tokenizer.column);
(0, _utils.appendChild)(this.currentElement(), this.currentComment);
};
// Data
TokenizerEventHandlers.prototype.beginData = function beginData() {
this.currentNode = _builders2.default.text();
this.currentNode.loc = {
source: null,
start: _builders2.default.pos(this.tokenizer.line, this.tokenizer.column),
end: null
};
};
TokenizerEventHandlers.prototype.appendToData = function appendToData(char) {
this.currentData.chars += char;
};
TokenizerEventHandlers.prototype.finishData = function finishData() {
this.currentData.loc.end = _builders2.default.pos(this.tokenizer.line, this.tokenizer.column);
(0, _utils.appendChild)(this.currentElement(), this.currentData);
};
// Tags - basic
TokenizerEventHandlers.prototype.tagOpen = function tagOpen() {
this.tagOpenLine = this.tokenizer.line;
this.tagOpenColumn = this.tokenizer.column;
};
TokenizerEventHandlers.prototype.beginStartTag = function beginStartTag() {
this.currentNode = {
type: 'StartTag',
name: "",
attributes: [],
modifiers: [],
comments: [],
selfClosing: false,
loc: _builders.SYNTHETIC
};
};
TokenizerEventHandlers.prototype.beginEndTag = function beginEndTag() {
this.currentNode = {
type: 'EndTag',
name: "",
attributes: [],
modifiers: [],
comments: [],
selfClosing: false,
loc: _builders.SYNTHETIC
};
};
TokenizerEventHandlers.prototype.finishTag = function finishTag() {
var _tokenizer = this.tokenizer,
line = _tokenizer.line,
column = _tokenizer.column;
var tag = this.currentTag;
tag.loc = _builders2.default.loc(this.tagOpenLine, this.tagOpenColumn, line, column);
if (tag.type === 'StartTag') {
this.finishStartTag();
if (voidMap[tag.name] || tag.selfClosing) {
this.finishEndTag(true);
}
} else if (tag.type === 'EndTag') {
this.finishEndTag(false);
}
};
TokenizerEventHandlers.prototype.finishStartTag = function finishStartTag() {
var _currentStartTag = this.currentStartTag,
name = _currentStartTag.name,
attributes = _currentStartTag.attributes,
modifiers = _currentStartTag.modifiers,
comments = _currentStartTag.comments;
var loc = _builders2.default.loc(this.tagOpenLine, this.tagOpenColumn);
var element = _builders2.default.element(name, attributes, modifiers, [], comments, loc);
this.elementStack.push(element);
};
TokenizerEventHandlers.prototype.finishEndTag = function finishEndTag(isVoid) {
var tag = this.currentTag;
var element = this.elementStack.pop();
var parent = this.currentElement();
validateEndTag(tag, element, isVoid);
element.loc.end.line = this.tokenizer.line;
element.loc.end.column = this.tokenizer.column;
(0, _utils.parseElementBlockParams)(element);
(0, _utils.appendChild)(parent, element);
};
TokenizerEventHandlers.prototype.markTagAsSelfClosing = function markTagAsSelfClosing() {
this.currentTag.selfClosing = true;
};
// Tags - name
TokenizerEventHandlers.prototype.appendToTagName = function appendToTagName(char) {
this.currentTag.name += char;
};
// Tags - attributes
TokenizerEventHandlers.prototype.beginAttribute = function beginAttribute() {
var tag = this.currentTag;
if (tag.type === 'EndTag') {
throw new _syntaxError2.default("Invalid end tag: closing tag must not have attributes, " + ("in `" + tag.name + "` (on line " + this.tokenizer.line + ")."), tag.loc);
}
this.currentAttribute = {
name: "",
parts: [],
isQuoted: false,
isDynamic: false,
start: _builders2.default.pos(this.tokenizer.line, this.tokenizer.column),
valueStartLine: 0,
valueStartColumn: 0
};
};
TokenizerEventHandlers.prototype.appendToAttributeName = function appendToAttributeName(char) {
this.currentAttr.name += char;
};
TokenizerEventHandlers.prototype.beginAttributeValue = function beginAttributeValue(isQuoted) {
this.currentAttr.isQuoted = isQuoted;
this.currentAttr.valueStartLine = this.tokenizer.line;
this.currentAttr.valueStartColumn = this.tokenizer.column;
};
TokenizerEventHandlers.prototype.appendToAttributeValue = function appendToAttributeValue(char) {
var parts = this.currentAttr.parts;
var lastPart = parts[parts.length - 1];
if (lastPart && lastPart.type === 'TextNode') {
lastPart.chars += char;
// update end location for each added char
lastPart.loc.end.line = this.tokenizer.line;
lastPart.loc.end.column = this.tokenizer.column;
} else {
// initially assume the text node is a single char
var loc = _builders2.default.loc(this.tokenizer.line, this.tokenizer.column, this.tokenizer.line, this.tokenizer.column);
// correct for `\n` as first char
if (char === '\n') {
loc.start.line -= 1;
loc.start.column = lastPart ? lastPart.loc.end.column : this.currentAttr.valueStartColumn;
}
var text = _builders2.default.text(char, loc);
parts.push(text);
}
};
TokenizerEventHandlers.prototype.finishAttributeValue = function finishAttributeValue() {
var _currentAttr = this.currentAttr,
name = _currentAttr.name,
parts = _currentAttr.parts,
isQuoted = _currentAttr.isQuoted,
isDynamic = _currentAttr.isDynamic,
valueStartLine = _currentAttr.valueStartLine,
valueStartColumn = _currentAttr.valueStartColumn;
var value = assembleAttributeValue(parts, isQuoted, isDynamic, this.tokenizer.line);
value.loc = _builders2.default.loc(valueStartLine, valueStartColumn, this.tokenizer.line, this.tokenizer.column);
var loc = _builders2.default.loc(this.currentAttr.start.line, this.currentAttr.start.column, this.tokenizer.line, this.tokenizer.column);
var attribute = _builders2.default.attr(name, value, loc);
this.currentStartTag.attributes.push(attribute);
};
TokenizerEventHandlers.prototype.reportSyntaxError = function reportSyntaxError(message) {
throw new _syntaxError2.default("Syntax error at line " + this.tokenizer.line + " col " + this.tokenizer.column + ": " + message, _builders2.default.loc(this.tokenizer.line, this.tokenizer.column));
};
return TokenizerEventHandlers;
}(_handlebarsNodeVisitors.HandlebarsNodeVisitors);
;
function assembleAttributeValue(parts, isQuoted, isDynamic, line) {
if (isDynamic) {
if (isQuoted) {
return assembleConcatenatedValue(parts);
} else {
if (parts.length === 1 || parts.length === 2 && parts[1].type === 'TextNode' && parts[1].chars === '/') {
return parts[0];
} else {
throw new _syntaxError2.default("An unquoted attribute value must be a string or a mustache, " + "preceeded by whitespace or a '=' character, and " + ("followed by whitespace, a '>' character, or '/>' (on line " + line + ")"), _builders2.default.loc(line, 0));
}
}
} else {
return parts.length > 0 ? parts[0] : _builders2.default.text("");
}
}
function assembleConcatenatedValue(parts) {
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
if (part.type !== 'MustacheStatement' && part.type !== 'TextNode') {
throw new _syntaxError2.default("Unsupported node in quoted attribute value: " + part['type'], part.loc);
}
}
return _builders2.default.concat(parts);
}
function validateEndTag(tag, element, selfClosing) {
var error = void 0;
if (voidMap[tag.name] && !selfClosing) {
// EngTag is also called by StartTag for void and self-closing tags (i.e.
// <input> or <br />, so we need to check for that here. Otherwise, we would
// throw an error for those cases.
error = "Invalid end tag " + formatEndTagInfo(tag) + " (void elements cannot have end tags).";
} else if (element.tag === undefined) {
error = "Closing tag " + formatEndTagInfo(tag) + " without an open tag.";
} else if (element.tag !== tag.name) {
error = "Closing tag " + formatEndTagInfo(tag) + " did not match last open tag `" + element.tag + "` (on line " + element.loc.start.line + ").";
}
if (error) {
throw new _syntaxError2.default(error, element.loc);
}
}
function formatEndTagInfo(tag) {
return "`" + tag.name + "` (on line " + tag.loc.end.line + ")";
}
var syntax = exports.syntax = {
parse: preprocess,
builders: _builders2.default,
print: _print2.default,
traverse: _traverse2.default,
Walker: _walker2.default
};
function preprocess(html, options) {
var ast = typeof html === 'object' ? html : handlebars.parse(html);
var program = new TokenizerEventHandlers(html, options).acceptNode(ast);
if (options && options.plugins && options.plugins.ast) {
for (var i = 0, l = options.plugins.ast.length; i < l; i++) {
var transform = options.plugins.ast[i];
var env = (0, _util.assign)({}, options, { syntax: syntax }, { plugins: undefined });
var pluginResult = transform(env);
(0, _traverse2.default)(program, pluginResult.visitors);
}
}
return program;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wYXJzZXIvdG9rZW5pemVyLWV2ZW50LWhhbmRsZXJzLmpzIl0sIm5hbWVzIjpbImIiLCJTWU5USEVUSUMiLCJhcHBlbmRDaGlsZCIsInBhcnNlRWxlbWVudEJsb2NrUGFyYW1zIiwiSGFuZGxlYmFyc05vZGVWaXNpdG9ycyIsIlN5bnRheEVycm9yIiwiYnVpbGRlcnMiLCJ0cmF2ZXJzZSIsInByaW50IiwiV2Fsa2VyIiwiaGFuZGxlYmFycyIsImFzc2lnbiIsInZvaWRNYXAiLCJPYmplY3QiLCJjcmVhdGUiLCJ2b2lkVGFnTmFtZXMiLCJzcGxpdCIsImZvckVhY2giLCJ0YWdOYW1lIiwiVG9rZW5pemVyRXZlbnRIYW5kbGVycyIsImFyZ3VtZW50cyIsInRhZ09wZW5MaW5lIiwidGFnT3BlbkNvbHVtbiIsInJlc2V0IiwiY3VycmVudE5vZGUiLCJiZWdpbkNvbW1lbnQiLCJjb21tZW50IiwibG9jIiwic291cmNlIiwic3RhcnQiLCJwb3MiLCJlbmQiLCJhcHBlbmRUb0NvbW1lbnREYXRhIiwiY2hhciIsImN1cnJlbnRDb21tZW50IiwidmFsdWUiLCJmaW5pc2hDb21tZW50IiwidG9rZW5pemVyIiwibGluZSIsImNvbHVtbiIsImN1cnJlbnRFbGVtZW50IiwiYmVnaW5EYXRhIiwidGV4dCIsImFwcGVuZFRvRGF0YSIsImN1cnJlbnREYXRhIiwiY2hhcnMiLCJmaW5pc2hEYXRhIiwidGFnT3BlbiIsImJlZ2luU3RhcnRUYWciLCJ0eXBlIiwibmFtZSIsImF0dHJpYnV0ZXMiLCJtb2RpZmllcnMiLCJjb21tZW50cyIsInNlbGZDbG9zaW5nIiwiYmVnaW5FbmRUYWciLCJmaW5pc2hUYWciLCJ0YWciLCJjdXJyZW50VGFnIiwiZmluaXNoU3RhcnRUYWciLCJmaW5pc2hFbmRUYWciLCJjdXJyZW50U3RhcnRUYWciLCJlbGVtZW50IiwiZWxlbWVudFN0YWNrIiwicHVzaCIsImlzVm9pZCIsInBvcCIsInBhcmVudCIsInZhbGlkYXRlRW5kVGFnIiwibWFya1RhZ0FzU2VsZkNsb3NpbmciLCJhcHBlbmRUb1RhZ05hbWUiLCJiZWdpbkF0dHJpYnV0ZSIsImN1cnJlbnRBdHRyaWJ1dGUiLCJwYXJ0cyIsImlzUXVvdGVkIiwiaXNEeW5hbWljIiwidmFsdWVTdGFydExpbmUiLCJ2YWx1ZVN0YXJ0Q29sdW1uIiwiYXBwZW5kVG9BdHRyaWJ1dGVOYW1lIiwiY3VycmVudEF0dHIiLCJiZWdpbkF0dHJpYnV0ZVZhbHVlIiwiYXBwZW5kVG9BdHRyaWJ1dGVWYWx1ZSIsImxhc3RQYXJ0IiwibGVuZ3RoIiwiZmluaXNoQXR0cmlidXRlVmFsdWUiLCJhc3NlbWJsZUF0dHJpYnV0ZVZhbHVlIiwiYXR0cmlidXRlIiwiYXR0ciIsInJlcG9ydFN5bnRheEVycm9yIiwibWVzc2FnZSIsImFzc2VtYmxlQ29uY2F0ZW5hdGVkVmFsdWUiLCJpIiwicGFydCIsImNvbmNhdCIsImVycm9yIiwiZm9ybWF0RW5kVGFnSW5mbyIsInVuZGVmaW5lZCIsInN5bnRheCIsInBhcnNlIiwicHJlcHJvY2VzcyIsImh0bWwiLCJvcHRpb25zIiwiYXN0IiwicHJvZ3JhbSIsImFjY2VwdE5vZGUiLCJwbHVnaW5zIiwibCIsInRyYW5zZm9ybSIsImVudiIsInBsdWdpblJlc3VsdCIsInZpc2l0b3JzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFrT08sQUFBUzs7QUFsT2hCLEFBQU8sQUFBSyxBQUFpQjs7OztBQUM3QixBQUFTLEFBQWEsQUFBK0I7O0FBQ3JELEFBQVMsQUFBOEI7O0FBQ3ZDLEFBQU8sQUFBaUIsQUFDeEIsQUFBTyxBQUFjOzs7O0FBQ3JCLEFBQU8sQUFBYzs7OztBQUNyQixBQUFPLEFBQVc7Ozs7QUFDbEIsQUFBTyxBQUFZOzs7O0FBQ25CLEFBQU87O0lBQVAsQUFBWSxBQUFnQjs7QUFDNUIsQUFBUyxBQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUN2QixJQUFNLFVBQVUsT0FBQSxBQUFPLE9BQXZCLEFBQWdCLEFBQWM7QUFDOUIsSUFBSSxlQUFKLEFBQW1CO0FBQ25CLGFB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YyxBQUFxRCxBQUNuRTtRQUFJLFdBQVcsUUFBWCxBQUFtQixXQUFXLFFBQUEsQUFBUSxRQUExQyxBQUFrRCxLQUFLLEFBQ25EO2FBQUssSUFBSSxJQUFKLEFBQVEsR0FBRyxJQUFJLFFBQUEsQUFBUSxRQUFSLEFBQWdCLElBQXBDLEFBQXdDLFFBQVEsSUFBaEQsQUFBb0QsR0FBcEQsQUFBdUQsS0FBSyxBQUN4RDtnQkFBSSxZQUFZLFFBQUEsQUFBUSxRQUFSLEFBQWdCLElBQWhDLEFBQWdCLEFBQW9CLEFBQ3BDO2dCQUFJLE1BQU0sa0JBQUEsQUFBTyxJQUFQLEFBQVcsU0FBUyxFQUFFLFFBQXRCLEFBQW9CLFVBQVksRUFBRSxTQUE1QyxBQUFVLEFBQWdDLEFBQVcsQUFDckQ7Z0JBQUksZUFBZSxVQUFuQixBQUFtQixBQUFVLEFBQzdCO29DQUFBLEFBQVMsU0FBUyxhQUFsQixBQUErQixBQUNsQztBQUNKO0FBQ0Q7V0FBQSxBQUFPLEFBQ1YiLCJmaWxlIjoibGliL3BhcnNlci90b2tlbml6ZXItZXZlbnQtaGFuZGxlcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYiwgeyBTWU5USEVUSUMgfSBmcm9tIFwiLi4vYnVpbGRlcnNcIjtcbmltcG9ydCB7IGFwcGVuZENoaWxkLCBwYXJzZUVsZW1lbnRCbG9ja1BhcmFtcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgSGFuZGxlYmFyc05vZGVWaXNpdG9ycyB9IGZyb20gJy4vaGFuZGxlYmFycy1ub2RlLXZpc2l0b3JzJztcbmltcG9ydCBTeW50YXhFcnJvciBmcm9tICcuLi9lcnJvcnMvc3ludGF4LWVycm9yJztcbmltcG9ydCBidWlsZGVycyBmcm9tIFwiLi4vYnVpbGRlcnNcIjtcbmltcG9ydCB0cmF2ZXJzZSBmcm9tIFwiLi4vdHJhdmVyc2FsL3RyYXZlcnNlXCI7XG5pbXBvcnQgcHJpbnQgZnJvbSBcIi4uL2dlbmVyYXRpb24vcHJpbnRcIjtcbmltcG9ydCBXYWxrZXIgZnJvbSBcIi4uL3RyYXZlcnNhbC93YWxrZXJcIjtcbmltcG9ydCAqIGFzIGhhbmRsZWJhcnMgZnJvbSBcImhhbmRsZWJhcnNcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuY29uc3Qgdm9pZE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5sZXQgdm9pZFRhZ05hbWVzID0gXCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiclwiO1xudm9pZFRhZ05hbWVzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKHRhZ05hbWUgPT4ge1xuICAgIHZvaWRNYXBbdGFnTmFtZV0gPSB0cnVlO1xufSk7XG5leHBvcnQgY2xhc3MgVG9rZW5pemVyRXZlbnRIYW5kbGVycyBleHRlbmRzIEhhbmRsZWJhcnNOb2RlVmlzaXRvcnMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnRhZ09wZW5MaW5lID0gMDtcbiAgICAgICAgdGhpcy50YWdPcGVuQ29sdW1uID0gMDtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xuICAgIH1cbiAgICAvLyBDb21tZW50XG4gICAgYmVnaW5Db21tZW50KCkge1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gYi5jb21tZW50KFwiXCIpO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmxvYyA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0OiBiLnBvcyh0aGlzLnRhZ09wZW5MaW5lLCB0aGlzLnRhZ09wZW5Db2x1bW4pLFxuICAgICAgICAgICAgZW5kOiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGFwcGVuZFRvQ29tbWVudERhdGEoY2hhcikge1xuICAgICAgICB0aGlzLmN1cnJlbnRDb21tZW50LnZhbHVlICs9IGNoYXI7XG4gICAgfVxuICAgIGZpbmlzaENvbW1lbnQoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudENvbW1lbnQubG9jLmVuZCA9IGIucG9zKHRoaXMudG9rZW5pemVyLmxpbmUsIHRoaXMudG9rZW5pemVyLmNvbHVtbik7XG4gICAgICAgIGFwcGVuZENoaWxkKHRoaXMuY3VycmVudEVsZW1lbnQoKSwgdGhpcy5jdXJyZW50Q29tbWVudCk7XG4gICAgfVxuICAgIC8vIERhdGFcbiAgICBiZWdpbkRhdGEoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBiLnRleHQoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5sb2MgPSB7XG4gICAgICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgICAgICBzdGFydDogYi5wb3ModGhpcy50b2tlbml6ZXIubGluZSwgdGhpcy50b2tlbml6ZXIuY29sdW1uKSxcbiAgICAgICAgICAgIGVuZDogbnVsbFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmRUb0RhdGEoY2hhcikge1xuICAgICAgICB0aGlzLmN1cnJlbnREYXRhLmNoYXJzICs9IGNoYXI7XG4gICAgfVxuICAgIGZpbmlzaERhdGEoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGEubG9jLmVuZCA9IGIucG9zKHRoaXMudG9rZW5pemVyLmxpbmUsIHRoaXMudG9rZW5pemVyLmNvbHVtbik7XG4gICAgICAgIGFwcGVuZENoaWxkKHRoaXMuY3VycmVudEVsZW1lbnQoKSwgdGhpcy5jdXJyZW50RGF0YSk7XG4gICAgfVxuICAgIC8vIFRhZ3MgLSBiYXNpY1xuICAgIHRhZ09wZW4oKSB7XG4gICAgICAgIHRoaXMudGFnT3BlbkxpbmUgPSB0aGlzLnRva2VuaXplci5saW5lO1xuICAgICAgICB0aGlzLnRhZ09wZW5Db2x1bW4gPSB0aGlzLnRva2VuaXplci5jb2x1bW47XG4gICAgfVxuICAgIGJlZ2luU3RhcnRUYWcoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB7XG4gICAgICAgICAgICB0eXBlOiAnU3RhcnRUYWcnLFxuICAgICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiBbXSxcbiAgICAgICAgICAgIGNvbW1lbnRzOiBbXSxcbiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGxvYzogU1lOVEhFVElDXG4gICAgICAgIH07XG4gICAgfVxuICAgIGJlZ2luRW5kVGFnKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0ge1xuICAgICAgICAgICAgdHlwZTogJ0VuZFRhZycsXG4gICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgICBtb2RpZmllcnM6IFtdLFxuICAgICAgICAgICAgY29tbWVudHM6IFtdLFxuICAgICAgICAgICAgc2VsZkNsb3Npbmc6IGZhbHNlLFxuICAgICAgICAgICAgbG9jOiBTWU5USEVUSUNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZmluaXNoVGFnKCkge1xuICAgICAgICBsZXQgeyBsaW5lLCBjb2x1bW4gfSA9IHRoaXMudG9rZW5pemVyO1xuICAgICAgICBsZXQgdGFnID0gdGhpcy5jdXJyZW50VGFnO1xuICAgICAgICB0YWcubG9jID0gYi5sb2ModGhpcy50YWdPcGVuTGluZSwgdGhpcy50YWdPcGVuQ29sdW1uLCBsaW5lLCBjb2x1bW4pO1xuICAgICAgICBpZiAodGFnLnR5cGUgPT09ICdTdGFydFRhZycpIHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoU3RhcnRUYWcoKTtcbiAgICAgICAgICAgIGlmICh2b2lkTWFwW3RhZy5uYW1lXSB8fCB0YWcuc2VsZkNsb3NpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0YWcudHlwZSA9PT0gJ0VuZFRhZycpIHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoRW5kVGFnKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5pc2hTdGFydFRhZygpIHtcbiAgICAgICAgbGV0IHsgbmFtZSwgYXR0cmlidXRlcywgbW9kaWZpZXJzLCBjb21tZW50cyB9ID0gdGhpcy5jdXJyZW50U3RhcnRUYWc7XG4gICAgICAgIGxldCBsb2MgPSBiLmxvYyh0aGlzLnRhZ09wZW5MaW5lLCB0aGlzLnRhZ09wZW5Db2x1bW4pO1xuICAgICAgICBsZXQgZWxlbWVudCA9IGIuZWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBtb2RpZmllcnMsIFtdLCBjb21tZW50cywgbG9jKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbGVtZW50KTtcbiAgICB9XG4gICAgZmluaXNoRW5kVGFnKGlzVm9pZCkge1xuICAgICAgICBsZXQgdGFnID0gdGhpcy5jdXJyZW50VGFnO1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZWxlbWVudFN0YWNrLnBvcCgpO1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudCgpO1xuICAgICAgICB2YWxpZGF0ZUVuZFRhZyh0YWcsIGVsZW1lbnQsIGlzVm9pZCk7XG4gICAgICAgIGVsZW1lbnQubG9jLmVuZC5saW5lID0gdGhpcy50b2tlbml6ZXIubGluZTtcbiAgICAgICAgZWxlbWVudC5sb2MuZW5kLmNvbHVtbiA9IHRoaXMudG9rZW5pemVyLmNvbHVtbjtcbiAgICAgICAgcGFyc2VFbGVtZW50QmxvY2tQYXJhbXMoZWxlbWVudCk7XG4gICAgICAgIGFwcGVuZENoaWxkKHBhcmVudCwgZWxlbWVudCk7XG4gICAgfVxuICAgIG1hcmtUYWdBc1NlbGZDbG9zaW5nKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRUYWcuc2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBUYWdzIC0gbmFtZVxuICAgIGFwcGVuZFRvVGFnTmFtZShjaGFyKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRhZy5uYW1lICs9IGNoYXI7XG4gICAgfVxuICAgIC8vIFRhZ3MgLSBhdHRyaWJ1dGVzXG4gICAgYmVnaW5BdHRyaWJ1dGUoKSB7XG4gICAgICAgIGxldCB0YWcgPSB0aGlzLmN1cnJlbnRUYWc7XG4gICAgICAgIGlmICh0YWcudHlwZSA9PT0gJ0VuZFRhZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBlbmQgdGFnOiBjbG9zaW5nIHRhZyBtdXN0IG5vdCBoYXZlIGF0dHJpYnV0ZXMsIGAgKyBgaW4gXFxgJHt0YWcubmFtZX1cXGAgKG9uIGxpbmUgJHt0aGlzLnRva2VuaXplci5saW5lfSkuYCwgdGFnLmxvYyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlID0ge1xuICAgICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICAgIHBhcnRzOiBbXSxcbiAgICAgICAgICAgIGlzUXVvdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzRHluYW1pYzogZmFsc2UsXG4gICAgICAgICAgICBzdGFydDogYi5wb3ModGhpcy50b2tlbml6ZXIubGluZSwgdGhpcy50b2tlbml6ZXIuY29sdW1uKSxcbiAgICAgICAgICAgIHZhbHVlU3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgdmFsdWVTdGFydENvbHVtbjogMFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmRUb0F0dHJpYnV0ZU5hbWUoY2hhcikge1xuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLm5hbWUgKz0gY2hhcjtcbiAgICB9XG4gICAgYmVnaW5BdHRyaWJ1dGVWYWx1ZShpc1F1b3RlZCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLmlzUXVvdGVkID0gaXNRdW90ZWQ7XG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWVTdGFydExpbmUgPSB0aGlzLnRva2VuaXplci5saW5lO1xuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlU3RhcnRDb2x1bW4gPSB0aGlzLnRva2VuaXplci5jb2x1bW47XG4gICAgfVxuICAgIGFwcGVuZFRvQXR0cmlidXRlVmFsdWUoY2hhcikge1xuICAgICAgICBsZXQgcGFydHMgPSB0aGlzLmN1cnJlbnRBdHRyLnBhcnRzO1xuICAgICAgICBsZXQgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGxhc3RQYXJ0ICYmIGxhc3RQYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScpIHtcbiAgICAgICAgICAgIGxhc3RQYXJ0LmNoYXJzICs9IGNoYXI7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZW5kIGxvY2F0aW9uIGZvciBlYWNoIGFkZGVkIGNoYXJcbiAgICAgICAgICAgIGxhc3RQYXJ0LmxvYy5lbmQubGluZSA9IHRoaXMudG9rZW5pemVyLmxpbmU7XG4gICAgICAgICAgICBsYXN0UGFydC5sb2MuZW5kLmNvbHVtbiA9IHRoaXMudG9rZW5pemVyLmNvbHVtbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluaXRpYWxseSBhc3N1bWUgdGhlIHRleHQgbm9kZSBpcyBhIHNpbmdsZSBjaGFyXG4gICAgICAgICAgICBsZXQgbG9jID0gYi5sb2ModGhpcy50b2tlbml6ZXIubGluZSwgdGhpcy50b2tlbml6ZXIuY29sdW1uLCB0aGlzLnRva2VuaXplci5saW5lLCB0aGlzLnRva2VuaXplci5jb2x1bW4pO1xuICAgICAgICAgICAgLy8gY29ycmVjdCBmb3IgYFxcbmAgYXMgZmlyc3QgY2hhclxuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgbG9jLnN0YXJ0LmxpbmUgLT0gMTtcbiAgICAgICAgICAgICAgICBsb2Muc3RhcnQuY29sdW1uID0gbGFzdFBhcnQgPyBsYXN0UGFydC5sb2MuZW5kLmNvbHVtbiA6IHRoaXMuY3VycmVudEF0dHIudmFsdWVTdGFydENvbHVtbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0ZXh0ID0gYi50ZXh0KGNoYXIsIGxvYyk7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmlzaEF0dHJpYnV0ZVZhbHVlKCkge1xuICAgICAgICBsZXQgeyBuYW1lLCBwYXJ0cywgaXNRdW90ZWQsIGlzRHluYW1pYywgdmFsdWVTdGFydExpbmUsIHZhbHVlU3RhcnRDb2x1bW4gfSA9IHRoaXMuY3VycmVudEF0dHI7XG4gICAgICAgIGxldCB2YWx1ZSA9IGFzc2VtYmxlQXR0cmlidXRlVmFsdWUocGFydHMsIGlzUXVvdGVkLCBpc0R5bmFtaWMsIHRoaXMudG9rZW5pemVyLmxpbmUpO1xuICAgICAgICB2YWx1ZS5sb2MgPSBiLmxvYyh2YWx1ZVN0YXJ0TGluZSwgdmFsdWVTdGFydENvbHVtbiwgdGhpcy50b2tlbml6ZXIubGluZSwgdGhpcy50b2tlbml6ZXIuY29sdW1uKTtcbiAgICAgICAgbGV0IGxvYyA9IGIubG9jKHRoaXMuY3VycmVudEF0dHIuc3RhcnQubGluZSwgdGhpcy5jdXJyZW50QXR0ci5zdGFydC5jb2x1bW4sIHRoaXMudG9rZW5pemVyLmxpbmUsIHRoaXMudG9rZW5pemVyLmNvbHVtbik7XG4gICAgICAgIGxldCBhdHRyaWJ1dGUgPSBiLmF0dHIobmFtZSwgdmFsdWUsIGxvYyk7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXJ0VGFnLmF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICByZXBvcnRTeW50YXhFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgU3ludGF4IGVycm9yIGF0IGxpbmUgJHt0aGlzLnRva2VuaXplci5saW5lfSBjb2wgJHt0aGlzLnRva2VuaXplci5jb2x1bW59OiAke21lc3NhZ2V9YCwgYi5sb2ModGhpcy50b2tlbml6ZXIubGluZSwgdGhpcy50b2tlbml6ZXIuY29sdW1uKSk7XG4gICAgfVxufVxuO1xuZnVuY3Rpb24gYXNzZW1ibGVBdHRyaWJ1dGVWYWx1ZShwYXJ0cywgaXNRdW90ZWQsIGlzRHluYW1pYywgbGluZSkge1xuICAgIGlmIChpc0R5bmFtaWMpIHtcbiAgICAgICAgaWYgKGlzUXVvdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXNzZW1ibGVDb25jYXRlbmF0ZWRWYWx1ZShwYXJ0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAxIHx8IHBhcnRzLmxlbmd0aCA9PT0gMiAmJiBwYXJ0c1sxXS50eXBlID09PSAnVGV4dE5vZGUnICYmIHBhcnRzWzFdLmNoYXJzID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBtdXN0YWNoZSwgYCArIGBwcmVjZWVkZWQgYnkgd2hpdGVzcGFjZSBvciBhICc9JyBjaGFyYWN0ZXIsIGFuZCBgICsgYGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UsIGEgJz4nIGNoYXJhY3Rlciwgb3IgJy8+JyAob24gbGluZSAke2xpbmV9KWAsIGIubG9jKGxpbmUsIDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiBiLnRleHQoXCJcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZW1ibGVDb25jYXRlbmF0ZWRWYWx1ZShwYXJ0cykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKHBhcnQudHlwZSAhPT0gJ011c3RhY2hlU3RhdGVtZW50JyAmJiBwYXJ0LnR5cGUgIT09ICdUZXh0Tm9kZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVuc3VwcG9ydGVkIG5vZGUgaW4gcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZTogXCIgKyBwYXJ0Wyd0eXBlJ10sIHBhcnQubG9jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYi5jb25jYXQocGFydHMpO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVFbmRUYWcodGFnLCBlbGVtZW50LCBzZWxmQ2xvc2luZykge1xuICAgIGxldCBlcnJvcjtcbiAgICBpZiAodm9pZE1hcFt0YWcubmFtZV0gJiYgIXNlbGZDbG9zaW5nKSB7XG4gICAgICAgIC8vIEVuZ1RhZyBpcyBhbHNvIGNhbGxlZCBieSBTdGFydFRhZyBmb3Igdm9pZCBhbmQgc2VsZi1jbG9zaW5nIHRhZ3MgKGkuZS5cbiAgICAgICAgLy8gPGlucHV0PiBvciA8YnIgLz4sIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoYXQgaGVyZS4gT3RoZXJ3aXNlLCB3ZSB3b3VsZFxuICAgICAgICAvLyB0aHJvdyBhbiBlcnJvciBmb3IgdGhvc2UgY2FzZXMuXG4gICAgICAgIGVycm9yID0gXCJJbnZhbGlkIGVuZCB0YWcgXCIgKyBmb3JtYXRFbmRUYWdJbmZvKHRhZykgKyBcIiAodm9pZCBlbGVtZW50cyBjYW5ub3QgaGF2ZSBlbmQgdGFncykuXCI7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LnRhZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yID0gXCJDbG9zaW5nIHRhZyBcIiArIGZvcm1hdEVuZFRhZ0luZm8odGFnKSArIFwiIHdpdGhvdXQgYW4gb3BlbiB0YWcuXCI7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LnRhZyAhPT0gdGFnLm5hbWUpIHtcbiAgICAgICAgZXJyb3IgPSBcIkNsb3NpbmcgdGFnIFwiICsgZm9ybWF0RW5kVGFnSW5mbyh0YWcpICsgXCIgZGlkIG5vdCBtYXRjaCBsYXN0IG9wZW4gdGFnIGBcIiArIGVsZW1lbnQudGFnICsgXCJgIChvbiBsaW5lIFwiICsgZWxlbWVudC5sb2Muc3RhcnQubGluZSArIFwiKS5cIjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihlcnJvciwgZWxlbWVudC5sb2MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZvcm1hdEVuZFRhZ0luZm8odGFnKSB7XG4gICAgcmV0dXJuIFwiYFwiICsgdGFnLm5hbWUgKyBcImAgKG9uIGxpbmUgXCIgKyB0YWcubG9jLmVuZC5saW5lICsgXCIpXCI7XG59XG5leHBvcnQgY29uc3Qgc3ludGF4ID0ge1xuICAgIHBhcnNlOiBwcmVwcm9jZXNzLFxuICAgIGJ1aWxkZXJzLFxuICAgIHByaW50LFxuICAgIHRyYXZlcnNlLFxuICAgIFdhbGtlclxufTtcbmV4cG9ydCBmdW5jdGlvbiBwcmVwcm9jZXNzKGh0bWwsIG9wdGlvbnMpIHtcbiAgICBsZXQgYXN0ID0gdHlwZW9mIGh0bWwgPT09ICdvYmplY3QnID8gaHRtbCA6IGhhbmRsZWJhcnMucGFyc2UoaHRtbCk7XG4gICAgbGV0IHByb2dyYW0gPSBuZXcgVG9rZW5pemVyRXZlbnRIYW5kbGVycyhodG1sLCBvcHRpb25zKS5hY2NlcHROb2RlKGFzdCk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wbHVnaW5zICYmIG9wdGlvbnMucGx1Z2lucy5hc3QpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvcHRpb25zLnBsdWdpbnMuYXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRyYW5zZm9ybSA9IG9wdGlvbnMucGx1Z2lucy5hc3RbaV07XG4gICAgICAgICAgICBsZXQgZW52ID0gYXNzaWduKHt9LCBvcHRpb25zLCB7IHN5bnRheCB9LCB7IHBsdWdpbnM6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIGxldCBwbHVnaW5SZXN1bHQgPSB0cmFuc2Zvcm0oZW52KTtcbiAgICAgICAgICAgIHRyYXZlcnNlKHByb2dyYW0sIHBsdWdpblJlc3VsdC52aXNpdG9ycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2dyYW07XG59Il19