123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- import { escapeAttrValue, escapeText, sortByLoc } from './util';
- export const voidMap = Object.create(null);
- let voidTagNames = 'area base br col command embed hr img input keygen link meta param source track wbr';
- voidTagNames.split(' ').forEach(tagName => {
- voidMap[tagName] = true;
- });
- const NON_WHITESPACE = /\S/;
- export default class Printer {
- constructor(options) {
- this.buffer = '';
- this.options = options;
- }
- /*
- This is used by _all_ methods on this Printer class that add to `this.buffer`,
- it allows consumers of the printer to use alternate string representations for
- a given node.
- The primary use case for this are things like source -> source codemod utilities.
- For example, ember-template-recast attempts to always preserve the original string
- formatting in each AST node if no modifications are made to it.
- */
- handledByOverride(node, ensureLeadingWhitespace = false) {
- if (this.options.override !== undefined) {
- let result = this.options.override(node, this.options);
- if (typeof result === 'string') {
- if (ensureLeadingWhitespace && result !== '' && NON_WHITESPACE.test(result[0])) {
- result = ` ${result}`;
- }
- this.buffer += result;
- return true;
- }
- }
- return false;
- }
- Node(node) {
- switch (node.type) {
- case 'MustacheStatement':
- case 'BlockStatement':
- case 'PartialStatement':
- case 'MustacheCommentStatement':
- case 'CommentStatement':
- case 'TextNode':
- case 'ElementNode':
- case 'AttrNode':
- case 'Block':
- case 'Template':
- return this.TopLevelStatement(node);
- case 'StringLiteral':
- case 'BooleanLiteral':
- case 'NumberLiteral':
- case 'UndefinedLiteral':
- case 'NullLiteral':
- case 'PathExpression':
- case 'SubExpression':
- return this.Expression(node);
- case 'Program':
- return this.Block(node);
- case 'ConcatStatement':
- // should have an AttrNode parent
- return this.ConcatStatement(node);
- case 'Hash':
- return this.Hash(node);
- case 'HashPair':
- return this.HashPair(node);
- case 'ElementModifierStatement':
- return this.ElementModifierStatement(node);
- }
- }
- Expression(expression) {
- switch (expression.type) {
- case 'StringLiteral':
- case 'BooleanLiteral':
- case 'NumberLiteral':
- case 'UndefinedLiteral':
- case 'NullLiteral':
- return this.Literal(expression);
- case 'PathExpression':
- return this.PathExpression(expression);
- case 'SubExpression':
- return this.SubExpression(expression);
- }
- }
- Literal(literal) {
- switch (literal.type) {
- case 'StringLiteral':
- return this.StringLiteral(literal);
- case 'BooleanLiteral':
- return this.BooleanLiteral(literal);
- case 'NumberLiteral':
- return this.NumberLiteral(literal);
- case 'UndefinedLiteral':
- return this.UndefinedLiteral(literal);
- case 'NullLiteral':
- return this.NullLiteral(literal);
- }
- }
- TopLevelStatement(statement) {
- switch (statement.type) {
- case 'MustacheStatement':
- return this.MustacheStatement(statement);
- case 'BlockStatement':
- return this.BlockStatement(statement);
- case 'PartialStatement':
- return this.PartialStatement(statement);
- case 'MustacheCommentStatement':
- return this.MustacheCommentStatement(statement);
- case 'CommentStatement':
- return this.CommentStatement(statement);
- case 'TextNode':
- return this.TextNode(statement);
- case 'ElementNode':
- return this.ElementNode(statement);
- case 'Block':
- case 'Template':
- return this.Block(statement);
- case 'AttrNode':
- // should have element
- return this.AttrNode(statement);
- }
- }
- Block(block) {
- /*
- When processing a template like:
- ```hbs
- {{#if whatever}}
- whatever
- {{else if somethingElse}}
- something else
- {{else}}
- fallback
- {{/if}}
- ```
- The AST still _effectively_ looks like:
- ```hbs
- {{#if whatever}}
- whatever
- {{else}}{{#if somethingElse}}
- something else
- {{else}}
- fallback
- {{/if}}{{/if}}
- ```
- The only way we can tell if that is the case is by checking for
- `block.chained`, but unfortunately when the actual statements are
- processed the `block.body[0]` node (which will always be a
- `BlockStatement`) has no clue that its ancestor `Block` node was
- chained.
- This "forwards" the `chained` setting so that we can check
- it later when processing the `BlockStatement`.
- */
- if (block.chained) {
- let firstChild = block.body[0];
- firstChild.chained = true;
- }
- if (this.handledByOverride(block)) {
- return;
- }
- this.TopLevelStatements(block.body);
- }
- TopLevelStatements(statements) {
- statements.forEach(statement => this.TopLevelStatement(statement));
- }
- ElementNode(el) {
- if (this.handledByOverride(el)) {
- return;
- }
- this.OpenElementNode(el);
- this.TopLevelStatements(el.children);
- this.CloseElementNode(el);
- }
- OpenElementNode(el) {
- this.buffer += `<${el.tag}`;
- const parts = [...el.attributes, ...el.modifiers, ...el.comments].sort(sortByLoc);
- for (const part of parts) {
- this.buffer += ' ';
- switch (part.type) {
- case 'AttrNode':
- this.AttrNode(part);
- break;
- case 'ElementModifierStatement':
- this.ElementModifierStatement(part);
- break;
- case 'MustacheCommentStatement':
- this.MustacheCommentStatement(part);
- break;
- }
- }
- if (el.blockParams.length) {
- this.BlockParams(el.blockParams);
- }
- if (el.selfClosing) {
- this.buffer += ' /';
- }
- this.buffer += '>';
- }
- CloseElementNode(el) {
- if (el.selfClosing || voidMap[el.tag.toLowerCase()]) {
- return;
- }
- this.buffer += `</${el.tag}>`;
- }
- AttrNode(attr) {
- if (this.handledByOverride(attr)) {
- return;
- }
- let {
- name,
- value
- } = attr;
- this.buffer += name;
- if (value.type !== 'TextNode' || value.chars.length > 0) {
- this.buffer += '=';
- this.AttrNodeValue(value);
- }
- }
- AttrNodeValue(value) {
- if (value.type === 'TextNode') {
- this.buffer += '"';
- this.TextNode(value, true);
- this.buffer += '"';
- } else {
- this.Node(value);
- }
- }
- TextNode(text, isAttr) {
- if (this.handledByOverride(text)) {
- return;
- }
- if (this.options.entityEncoding === 'raw') {
- this.buffer += text.chars;
- } else if (isAttr) {
- this.buffer += escapeAttrValue(text.chars);
- } else {
- this.buffer += escapeText(text.chars);
- }
- }
- MustacheStatement(mustache) {
- if (this.handledByOverride(mustache)) {
- return;
- }
- this.buffer += mustache.escaped ? '{{' : '{{{';
- if (mustache.strip.open) {
- this.buffer += '~';
- }
- this.Expression(mustache.path);
- this.Params(mustache.params);
- this.Hash(mustache.hash);
- if (mustache.strip.close) {
- this.buffer += '~';
- }
- this.buffer += mustache.escaped ? '}}' : '}}}';
- }
- BlockStatement(block) {
- if (this.handledByOverride(block)) {
- return;
- }
- if (block.chained) {
- this.buffer += block.inverseStrip.open ? '{{~' : '{{';
- this.buffer += 'else ';
- } else {
- this.buffer += block.openStrip.open ? '{{~#' : '{{#';
- }
- this.Expression(block.path);
- this.Params(block.params);
- this.Hash(block.hash);
- if (block.program.blockParams.length) {
- this.BlockParams(block.program.blockParams);
- }
- if (block.chained) {
- this.buffer += block.inverseStrip.close ? '~}}' : '}}';
- } else {
- this.buffer += block.openStrip.close ? '~}}' : '}}';
- }
- this.Block(block.program);
- if (block.inverse) {
- if (!block.inverse.chained) {
- this.buffer += block.inverseStrip.open ? '{{~' : '{{';
- this.buffer += 'else';
- this.buffer += block.inverseStrip.close ? '~}}' : '}}';
- }
- this.Block(block.inverse);
- }
- if (!block.chained) {
- this.buffer += block.closeStrip.open ? '{{~/' : '{{/';
- this.Expression(block.path);
- this.buffer += block.closeStrip.close ? '~}}' : '}}';
- }
- }
- BlockParams(blockParams) {
- this.buffer += ` as |${blockParams.join(' ')}|`;
- }
- PartialStatement(partial) {
- if (this.handledByOverride(partial)) {
- return;
- }
- this.buffer += '{{>';
- this.Expression(partial.name);
- this.Params(partial.params);
- this.Hash(partial.hash);
- this.buffer += '}}';
- }
- ConcatStatement(concat) {
- if (this.handledByOverride(concat)) {
- return;
- }
- this.buffer += '"';
- concat.parts.forEach(part => {
- if (part.type === 'TextNode') {
- this.TextNode(part, true);
- } else {
- this.Node(part);
- }
- });
- this.buffer += '"';
- }
- MustacheCommentStatement(comment) {
- if (this.handledByOverride(comment)) {
- return;
- }
- this.buffer += `{{!--${comment.value}--}}`;
- }
- ElementModifierStatement(mod) {
- if (this.handledByOverride(mod)) {
- return;
- }
- this.buffer += '{{';
- this.Expression(mod.path);
- this.Params(mod.params);
- this.Hash(mod.hash);
- this.buffer += '}}';
- }
- CommentStatement(comment) {
- if (this.handledByOverride(comment)) {
- return;
- }
- this.buffer += `<!--${comment.value}-->`;
- }
- PathExpression(path) {
- if (this.handledByOverride(path)) {
- return;
- }
- this.buffer += path.original;
- }
- SubExpression(sexp) {
- if (this.handledByOverride(sexp)) {
- return;
- }
- this.buffer += '(';
- this.Expression(sexp.path);
- this.Params(sexp.params);
- this.Hash(sexp.hash);
- this.buffer += ')';
- }
- Params(params) {
- // TODO: implement a top level Params AST node (just like the Hash object)
- // so that this can also be overridden
- if (params.length) {
- params.forEach(param => {
- this.buffer += ' ';
- this.Expression(param);
- });
- }
- }
- Hash(hash) {
- if (this.handledByOverride(hash, true)) {
- return;
- }
- hash.pairs.forEach(pair => {
- this.buffer += ' ';
- this.HashPair(pair);
- });
- }
- HashPair(pair) {
- if (this.handledByOverride(pair)) {
- return;
- }
- this.buffer += pair.key;
- this.buffer += '=';
- this.Node(pair.value);
- }
- StringLiteral(str) {
- if (this.handledByOverride(str)) {
- return;
- }
- this.buffer += JSON.stringify(str.value);
- }
- BooleanLiteral(bool) {
- if (this.handledByOverride(bool)) {
- return;
- }
- this.buffer += bool.value;
- }
- NumberLiteral(number) {
- if (this.handledByOverride(number)) {
- return;
- }
- this.buffer += number.value;
- }
- UndefinedLiteral(node) {
- if (this.handledByOverride(node)) {
- return;
- }
- this.buffer += 'undefined';
- }
- NullLiteral(node) {
- if (this.handledByOverride(node)) {
- return;
- }
- this.buffer += 'null';
- }
- print(node) {
- let {
- options
- } = this;
- if (options.override) {
- let result = options.override(node, options);
- if (result !== undefined) {
- return result;
- }
- }
- this.buffer = '';
- this.Node(node);
- return this.buffer;
- }
- }
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvZ2VuZXJhdGlvbi9wcmludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsZUFBVCxFQUEwQixVQUExQixFQUFzQyxTQUF0QyxRQUF1RCxRQUF2RDtBQUVBLE9BQU8sTUFBTSxPQUFPLEdBRWhCLE1BQU0sQ0FBQyxNQUFQLENBQWMsSUFBZCxDQUZHO0FBSVAsSUFBSSxZQUFZLEdBQ2QscUZBREY7QUFFQSxZQUFZLENBQUMsS0FBYixDQUFtQixHQUFuQixFQUF3QixPQUF4QixDQUFpQyxPQUFELElBQVk7QUFDMUMsRUFBQSxPQUFPLENBQUMsT0FBRCxDQUFQLEdBQW1CLElBQW5CO0FBQ0QsQ0FGRDtBQUlBLE1BQU0sY0FBYyxHQUFHLElBQXZCO0FBc0JBLGVBQWMsTUFBTyxPQUFQLENBQWM7QUFJMUIsRUFBQSxXQUFBLENBQVksT0FBWixFQUFtQztBQUgzQixTQUFBLE1BQUEsR0FBUyxFQUFUO0FBSU4sU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7QUFTQSxFQUFBLGlCQUFpQixDQUFDLElBQUQsRUFBbUIsdUJBQXVCLEdBQUcsS0FBN0MsRUFBa0Q7QUFDakUsUUFBSSxLQUFLLE9BQUwsQ0FBYSxRQUFiLEtBQTBCLFNBQTlCLEVBQXlDO0FBQ3ZDLFVBQUksTUFBTSxHQUFHLEtBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsSUFBdEIsRUFBNEIsS0FBSyxPQUFqQyxDQUFiOztBQUNBLFVBQUksT0FBTyxNQUFQLEtBQWtCLFFBQXRCLEVBQWdDO0FBQzlCLFlBQUksdUJBQXVCLElBQUksTUFBTSxLQUFLLEVBQXRDLElBQTRDLGNBQWMsQ0FBQyxJQUFmLENBQW9CLE1BQU0sQ0FBQyxDQUFELENBQTFCLENBQWhELEVBQWdGO0FBQzlFLFVBQUEsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFuQjtBQUNEOztBQUVELGFBQUssTUFBTCxJQUFlLE1B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QUEwQjtBQUN4QixlQUFPLE1BQVA7QUFDRDtBQUNGOztBQUVELFNBQUssTUFBTCxHQUFjLEVBQWQ7QUFDQSxTQUFLLElBQUwsQ0FBVSxJQUFWO0FBQ0EsV0FBTyxLQUFLLE1BQVo7QUFDRDs7QUF4ZXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi4vdjEvYXBpJztcbmltcG9ydCB7IGVzY2FwZUF0dHJWYWx1ZSwgZXNjYXBlVGV4dCwgc29ydEJ5TG9jIH0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IHZvaWRNYXA6IHtcbiAgW3RhZ05hbWU6IHN0cmluZ106IGJvb2xlYW47XG59ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxubGV0IHZvaWRUYWdOYW1lcyA9XG4gICdhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdicic7XG52b2lkVGFnTmFtZXMuc3BsaXQoJyAnKS5mb3JFYWNoKCh0YWdOYW1lKSA9PiB7XG4gIHZvaWRNYXBbdGFnTmFtZV0gPSB0cnVlO1xufSk7XG5cbmNvbnN0IE5PTl9XSElURVNQQUNFID0gL1xcUy87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbnRlck9wdGlvbnMge1xuICBlbnRpdHlFbmNvZGluZzogJ3RyYW5zZm9ybWVkJyB8ICdyYXcnO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG92ZXJyaWRlIHRoZSBtZWNoYW5pc20gb2YgcHJpbnRpbmcgYSBnaXZlbiBBU1QuTm9kZS5cbiAgICpcbiAgICogVGhpcyB3aWxsIGdlbmVyYWxseSBvbmx5IGJlIHVzZWZ1bCB0byBzb3VyY2UgLT4gc291cmNlIGNvZGVtb2RzXG4gICAqIHdoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIHNwZWNpYWxpemUvb3ZlcnJpZGUgdGhlIHdheSBhIGdpdmVuIG5vZGUgaXNcbiAgICogcHJpbnRlZCAoZS5nLiB5b3Ugd291bGQgbGlrZSB0byBwcmVzZXJ2ZSBhcyBtdWNoIG9mIHRoZSBvcmlnaW5hbFxuICAgKiBmb3JtYXR0aW5nIGFzIHBvc3NpYmxlKS5cbiAgICpcbiAgICogV2hlbiB0aGUgcHJvdmlkZWQgb3ZlcnJpZGUgcmV0dXJucyB1bmRlZmluZWQsIHRoZSBkZWZhdWx0IGJ1aWx0IGluIHByaW50aW5nXG4gICAqIHdpbGwgYmUgZG9uZSBmb3IgdGhlIEFTVC5Ob2RlLlxuICAgKlxuICAgKiBAcGFyYW0gYXN0IHRoZSBhc3Qgbm9kZSB0byBiZSBwcmludGVkXG4gICAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHNwZWNpZmllZCBkdXJpbmcgdGhlIHByaW50KCkgaW52b2NhdGlvblxuICAgKi9cbiAgb3ZlcnJpZGU/KGFzdDogQVNUdjEuTm9kZSwgb3B0aW9uczogUHJpbnRlck9wdGlvbnMpOiB2b2lkIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcmludGVyIHtcbiAgcHJpdmF0ZSBidWZmZXIgPSAnJztcbiAgcHJpdmF0ZSBvcHRpb25zOiBQcmludGVyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQcmludGVyT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKlxuICAgIFRoaXMgaXMgdXNlZCBieSBfYWxsXyBtZXRob2RzIG9uIHRoaXMgUHJpbnRlciBjbGFzcyB0aGF0IGFkZCB0byBgdGhpcy5idWZmZXJgLFxuICAgIGl0IGFsbG93cyBjb25zdW1lcnMgb2YgdGhlIHByaW50ZXIgdG8gdXNlIGFsdGVybmF0ZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGZvclxuICAgIGEgZ2l2ZW4gbm9kZS5cblxuICAgIFRoZSBwcmltYXJ5IHVzZSBjYXNlIGZvciB0aGlzIGFyZSB0aGluZ3MgbGlrZSBzb3VyY2UgLT4gc291cmNlIGNvZGVtb2QgdXRpbGl0aWVzLlxuICAgIEZvciBleGFtcGxlLCBlbWJlci10ZW1wbGF0ZS1yZWNhc3QgYXR0ZW1wdHMgdG8gYWx3YXlzIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzdHJpbmdcbiAgICBmb3JtYXR0aW5nIGluIGVhY2ggQVNUIG5vZGUgaWYgbm8gbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSB0byBpdC5cbiAgKi9cbiAgaGFuZGxlZEJ5T3ZlcnJpZGUobm9kZTogQVNUdjEuTm9kZSwgZW5zdXJlTGVhZGluZ1doaXRlc3BhY2UgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHJlc3VsdCA9IHRoaXMub3B0aW9ucy5vdmVycmlkZShub2RlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChlbnN1cmVMZWFkaW5nV2hpdGVzcGFjZSAmJiByZXN1bHQgIT09ICcnICYmIE5PTl9XSElURVNQQUNFLnRlc3QocmVzdWx0WzBdKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGAgJHtyZXN1bHR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnVmZmVyICs9IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgTm9kZShub2RlOiBBU1R2MS5Ob2RlKTogdm9pZCB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ011c3RhY2hlU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ0Jsb2NrU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ1BhcnRpYWxTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnTXVzdGFjaGVDb21tZW50U3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ0NvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnVGV4dE5vZGUnOlxuICAgICAgY2FzZSAnRWxlbWVudE5vZGUnOlxuICAgICAgY2FzZSAnQXR0ck5vZGUnOlxuICAgICAgY2FzZSAnQmxvY2snOlxuICAgICAgY2FzZSAnVGVtcGxhdGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5Ub3BMZXZlbFN0YXRlbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ1N0cmluZ0xpdGVyYWwnOlxuICAgICAgY2FzZSAnQm9vbGVhbkxpdGVyYWwnOlxuICAgICAgY2FzZSAnTnVtYmVyTGl0ZXJhbCc6XG4gICAgICBjYXNlICdVbmRlZmluZWRMaXRlcmFsJzpcbiAgICAgIGNhc2UgJ051bGxMaXRlcmFsJzpcbiAgICAgIGNhc2UgJ1BhdGhFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ1N1YkV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5FeHByZXNzaW9uKG5vZGUpO1xuICAgICAgY2FzZSAnUHJvZ3JhbSc6XG4gICAgICAgIHJldHVybiB0aGlzLkJsb2NrKG5vZGUpO1xuICAgICAgY2FzZSAnQ29uY2F0U3RhdGVtZW50JzpcbiAgICAgICAgLy8gc2hvdWxkIGhhdmUgYW4gQXR0ck5vZGUgcGFyZW50XG4gICAgICAgIHJldHVybiB0aGlzLkNvbmNhdFN0YXRlbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ0hhc2gnOlxuICAgICAgICByZXR1cm4gdGhpcy5IYXNoKG5vZGUpO1xuICAgICAgY2FzZSAnSGFzaFBhaXInOlxuICAgICAgICByZXR1cm4gdGhpcy5IYXNoUGFpcihub2RlKTtcbiAgICAgIGNhc2UgJ0VsZW1lbnRNb2RpZmllclN0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudChub2RlKTtcbiAgICB9XG4gIH1cblxuICBFeHByZXNzaW9uKGV4cHJlc3Npb246IEFTVHYxLkV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV4cHJlc3Npb24udHlwZSkge1xuICAgICAgY2FzZSAnU3RyaW5nTGl0ZXJhbCc6XG4gICAgICBjYXNlICdCb29sZWFuTGl0ZXJhbCc6XG4gICAgICBjYXNlICdOdW1iZXJMaXRlcmFsJzpcbiAgICAgIGNhc2UgJ1VuZGVmaW5lZExpdGVyYWwnOlxuICAgICAgY2FzZSAnTnVsbExpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5MaXRlcmFsKGV4cHJlc3Npb24pO1xuICAgICAgY2FzZSAnUGF0aEV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5QYXRoRXhwcmVzc2lvbihleHByZXNzaW9uKTtcbiAgICAgIGNhc2UgJ1N1YkV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5TdWJFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICAgIH1cbiAgfVxuXG4gIExpdGVyYWwobGl0ZXJhbDogQVNUdjEuTGl0ZXJhbCk6IHZvaWQge1xuICAgIHN3aXRjaCAobGl0ZXJhbC50eXBlKSB7XG4gICAgICBjYXNlICdTdHJpbmdMaXRlcmFsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuU3RyaW5nTGl0ZXJhbChsaXRlcmFsKTtcbiAgICAgIGNhc2UgJ0Jvb2xlYW5MaXRlcmFsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQm9vbGVhbkxpdGVyYWwobGl0ZXJhbCk7XG4gICAgICBjYXNlICdOdW1iZXJMaXRlcmFsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyTGl0ZXJhbChsaXRlcmFsKTtcbiAgICAgIGNhc2UgJ1VuZGVmaW5lZExpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5VbmRlZmluZWRMaXRlcmFsKGxpdGVyYWwpO1xuICAgICAgY2FzZSAnTnVsbExpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5OdWxsTGl0ZXJhbChsaXRlcmFsKTtcbiAgICB9XG4gIH1cblxuICBUb3BMZXZlbFN0YXRlbWVudChzdGF0ZW1lbnQ6IEFTVHYxLlRvcExldmVsU3RhdGVtZW50IHwgQVNUdjEuVGVtcGxhdGUgfCBBU1R2MS5BdHRyTm9kZSk6IHZvaWQge1xuICAgIHN3aXRjaCAoc3RhdGVtZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ011c3RhY2hlU3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuTXVzdGFjaGVTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ0Jsb2NrU3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2tTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ1BhcnRpYWxTdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5QYXJ0aWFsU3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgICBjYXNlICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ0NvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5Db21tZW50U3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgICBjYXNlICdUZXh0Tm9kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLlRleHROb2RlKHN0YXRlbWVudCk7XG4gICAgICBjYXNlICdFbGVtZW50Tm9kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLkVsZW1lbnROb2RlKHN0YXRlbWVudCk7XG4gICAgICBjYXNlICdCbG9jayc6XG4gICAgICBjYXNlICdUZW1wbGF0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLkJsb2NrKHN0YXRlbWVudCk7XG4gICAgICBjYXNlICdBdHRyTm9kZSc6XG4gICAgICAgIC8vIHNob3VsZCBoYXZlIGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0ck5vZGUoc3RhdGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBCbG9jayhibG9jazogQVNUdjEuQmxvY2sgfCBBU1R2MS5Qcm9ncmFtIHwgQVNUdjEuVGVtcGxhdGUpOiB2b2lkIHtcbiAgICAvKlxuICAgICAgV2hlbiBwcm9jZXNzaW5nIGEgdGVtcGxhdGUgbGlrZTpcblxuICAgICAgYGBgaGJzXG4gICAgICB7eyNpZiB3aGF0ZXZlcn19XG4gICAgICAgIHdoYXRldmVyXG4gICAgICB7e2Vsc2UgaWYgc29tZXRoaW5nRWxzZX19XG4gICAgICAgIHNvbWV0aGluZyBlbHNlXG4gICAgICB7e2Vsc2V9fVxuICAgICAgICBmYWxsYmFja1xuICAgICAge3svaWZ9fVxuICAgICAgYGBgXG5cbiAgICAgIFRoZSBBU1Qgc3RpbGwgX2VmZmVjdGl2ZWx5XyBsb29rcyBsaWtlOlxuXG4gICAgICBgYGBoYnNcbiAgICAgIHt7I2lmIHdoYXRldmVyfX1cbiAgICAgICAgd2hhdGV2ZXJcbiAgICAgIHt7ZWxzZX19e3sjaWYgc29tZXRoaW5nRWxzZX19XG4gICAgICAgIHNvbWV0aGluZyBlbHNlXG4gICAgICB7e2Vsc2V9fVxuICAgICAgICBmYWxsYmFja1xuICAgICAge3svaWZ9fXt7L2lmfX1cbiAgICAgIGBgYFxuXG4gICAgICBUaGUgb25seSB3YXkgd2UgY2FuIHRlbGwgaWYgdGhhdCBpcyB0aGUgY2FzZSBpcyBieSBjaGVja2luZyBmb3JcbiAgICAgIGBibG9jay5jaGFpbmVkYCwgYnV0IHVuZm9ydHVuYXRlbHkgd2hlbiB0aGUgYWN0dWFsIHN0YXRlbWVudHMgYXJlXG4gICAgICBwcm9jZXNzZWQgdGhlIGBibG9jay5ib2R5WzBdYCBub2RlICh3aGljaCB3aWxsIGFsd2F5cyBiZSBhXG4gICAgICBgQmxvY2tTdGF0ZW1lbnRgKSBoYXMgbm8gY2x1ZSB0aGF0IGl0cyBhbmNlc3RvciBgQmxvY2tgIG5vZGUgd2FzXG4gICAgICBjaGFpbmVkLlxuXG4gICAgICBUaGlzIFwiZm9yd2FyZHNcIiB0aGUgYGNoYWluZWRgIHNldHRpbmcgc28gdGhhdCB3ZSBjYW4gY2hlY2tcbiAgICAgIGl0IGxhdGVyIHdoZW4gcHJvY2Vzc2luZyB0aGUgYEJsb2NrU3RhdGVtZW50YC5cbiAgICAqL1xuICAgIGlmIChibG9jay5jaGFpbmVkKSB7XG4gICAgICBsZXQgZmlyc3RDaGlsZCA9IGJsb2NrLmJvZHlbMF0gYXMgQVNUdjEuQmxvY2tTdGF0ZW1lbnQ7XG4gICAgICBmaXJzdENoaWxkLmNoYWluZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGJsb2NrKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuVG9wTGV2ZWxTdGF0ZW1lbnRzKGJsb2NrLmJvZHkpO1xuICB9XG5cbiAgVG9wTGV2ZWxTdGF0ZW1lbnRzKHN0YXRlbWVudHM6IEFTVHYxLlRvcExldmVsU3RhdGVtZW50W10pOiB2b2lkIHtcbiAgICBzdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4gdGhpcy5Ub3BMZXZlbFN0YXRlbWVudChzdGF0ZW1lbnQpKTtcbiAgfVxuXG4gIEVsZW1lbnROb2RlKGVsOiBBU1R2MS5FbGVtZW50Tm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGVsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuT3BlbkVsZW1lbnROb2RlKGVsKTtcbiAgICB0aGlzLlRvcExldmVsU3RhdGVtZW50cyhlbC5jaGlsZHJlbik7XG4gICAgdGhpcy5DbG9zZUVsZW1lbnROb2RlKGVsKTtcbiAgfVxuXG4gIE9wZW5FbGVtZW50Tm9kZShlbDogQVNUdjEuRWxlbWVudE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciArPSBgPCR7ZWwudGFnfWA7XG4gICAgY29uc3QgcGFydHMgPSBbLi4uZWwuYXR0cmlidXRlcywgLi4uZWwubW9kaWZpZXJzLCAuLi5lbC5jb21tZW50c10uc29ydChzb3J0QnlMb2MpO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSAnICc7XG4gICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICBjYXNlICdBdHRyTm9kZSc6XG4gICAgICAgICAgdGhpcy5BdHRyTm9kZShwYXJ0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50JzpcbiAgICAgICAgICB0aGlzLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudChwYXJ0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTXVzdGFjaGVDb21tZW50U3RhdGVtZW50JzpcbiAgICAgICAgICB0aGlzLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudChwYXJ0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLmJsb2NrUGFyYW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5CbG9ja1BhcmFtcyhlbC5ibG9ja1BhcmFtcyk7XG4gICAgfVxuICAgIGlmIChlbC5zZWxmQ2xvc2luZykge1xuICAgICAgdGhpcy5idWZmZXIgKz0gJyAvJztcbiAgICB9XG4gICAgdGhpcy5idWZmZXIgKz0gJz4nO1xuICB9XG5cbiAgQ2xvc2VFbGVtZW50Tm9kZShlbDogQVNUdjEuRWxlbWVudE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoZWwuc2VsZkNsb3NpbmcgfHwgdm9pZE1hcFtlbC50YWcudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIgKz0gYDwvJHtlbC50YWd9PmA7XG4gIH1cblxuICBBdHRyTm9kZShhdHRyOiBBU1R2MS5BdHRyTm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGF0dHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHsgbmFtZSwgdmFsdWUgfSA9IGF0dHI7XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBuYW1lO1xuICAgIGlmICh2YWx1ZS50eXBlICE9PSAnVGV4dE5vZGUnIHx8IHZhbHVlLmNoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9ICc9JztcbiAgICAgIHRoaXMuQXR0ck5vZGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQXR0ck5vZGVWYWx1ZSh2YWx1ZTogQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJykge1xuICAgICAgdGhpcy5idWZmZXIgKz0gJ1wiJztcbiAgICAgIHRoaXMuVGV4dE5vZGUodmFsdWUsIHRydWUpO1xuICAgICAgdGhpcy5idWZmZXIgKz0gJ1wiJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5Ob2RlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBUZXh0Tm9kZSh0ZXh0OiBBU1R2MS5UZXh0Tm9kZSwgaXNBdHRyPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKHRleHQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbnRpdHlFbmNvZGluZyA9PT0gJ3JhdycpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9IHRleHQuY2hhcnM7XG4gICAgfSBlbHNlIGlmIChpc0F0dHIpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9IGVzY2FwZUF0dHJWYWx1ZSh0ZXh0LmNoYXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWZmZXIgKz0gZXNjYXBlVGV4dCh0ZXh0LmNoYXJzKTtcbiAgICB9XG4gIH1cblxuICBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZTogQVNUdjEuTXVzdGFjaGVTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShtdXN0YWNoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBtdXN0YWNoZS5lc2NhcGVkID8gJ3t7JyA6ICd7e3snO1xuXG4gICAgaWYgKG11c3RhY2hlLnN0cmlwLm9wZW4pIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9ICd+JztcbiAgICB9XG5cbiAgICB0aGlzLkV4cHJlc3Npb24obXVzdGFjaGUucGF0aCk7XG4gICAgdGhpcy5QYXJhbXMobXVzdGFjaGUucGFyYW1zKTtcbiAgICB0aGlzLkhhc2gobXVzdGFjaGUuaGFzaCk7XG5cbiAgICBpZiAobXVzdGFjaGUuc3RyaXAuY2xvc2UpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9ICd+JztcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBtdXN0YWNoZS5lc2NhcGVkID8gJ319JyA6ICd9fX0nO1xuICB9XG5cbiAgQmxvY2tTdGF0ZW1lbnQoYmxvY2s6IEFTVHYxLkJsb2NrU3RhdGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoYmxvY2spKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrLmNoYWluZWQpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9IGJsb2NrLmludmVyc2VTdHJpcC5vcGVuID8gJ3t7ficgOiAne3snO1xuICAgICAgdGhpcy5idWZmZXIgKz0gJ2Vsc2UgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2sub3BlblN0cmlwLm9wZW4gPyAne3t+IycgOiAne3sjJztcbiAgICB9XG5cbiAgICB0aGlzLkV4cHJlc3Npb24oYmxvY2sucGF0aCk7XG4gICAgdGhpcy5QYXJhbXMoYmxvY2sucGFyYW1zKTtcbiAgICB0aGlzLkhhc2goYmxvY2suaGFzaCk7XG4gICAgaWYgKGJsb2NrLnByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLkJsb2NrUGFyYW1zKGJsb2NrLnByb2dyYW0uYmxvY2tQYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChibG9jay5jaGFpbmVkKSB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSBibG9jay5pbnZlcnNlU3RyaXAuY2xvc2UgPyAnfn19JyA6ICd9fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9IGJsb2NrLm9wZW5TdHJpcC5jbG9zZSA/ICd+fX0nIDogJ319JztcbiAgICB9XG5cbiAgICB0aGlzLkJsb2NrKGJsb2NrLnByb2dyYW0pO1xuXG4gICAgaWYgKGJsb2NrLmludmVyc2UpIHtcbiAgICAgIGlmICghYmxvY2suaW52ZXJzZS5jaGFpbmVkKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyICs9IGJsb2NrLmludmVyc2VTdHJpcC5vcGVuID8gJ3t7ficgOiAne3snO1xuICAgICAgICB0aGlzLmJ1ZmZlciArPSAnZWxzZSc7XG4gICAgICAgIHRoaXMuYnVmZmVyICs9IGJsb2NrLmludmVyc2VTdHJpcC5jbG9zZSA/ICd+fX0nIDogJ319JztcbiAgICAgIH1cblxuICAgICAgdGhpcy5CbG9jayhibG9jay5pbnZlcnNlKTtcbiAgICB9XG5cbiAgICBpZiAoIWJsb2NrLmNoYWluZWQpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9IGJsb2NrLmNsb3NlU3RyaXAub3BlbiA/ICd7e34vJyA6ICd7ey8nO1xuICAgICAgdGhpcy5FeHByZXNzaW9uKGJsb2NrLnBhdGgpO1xuICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2suY2xvc2VTdHJpcC5jbG9zZSA/ICd+fX0nIDogJ319JztcbiAgICB9XG4gIH1cblxuICBCbG9ja1BhcmFtcyhibG9ja1BhcmFtczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciArPSBgIGFzIHwke2Jsb2NrUGFyYW1zLmpvaW4oJyAnKX18YDtcbiAgfVxuXG4gIFBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbDogQVNUdjEuUGFydGlhbFN0YXRlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKHBhcnRpYWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gJ3t7Pic7XG4gICAgdGhpcy5FeHByZXNzaW9uKHBhcnRpYWwubmFtZSk7XG4gICAgdGhpcy5QYXJhbXMocGFydGlhbC5wYXJhbXMpO1xuICAgIHRoaXMuSGFzaChwYXJ0aWFsLmhhc2gpO1xuICAgIHRoaXMuYnVmZmVyICs9ICd9fSc7XG4gIH1cblxuICBDb25jYXRTdGF0ZW1lbnQoY29uY2F0OiBBU1R2MS5Db25jYXRTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShjb25jYXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gJ1wiJztcbiAgICBjb25jYXQucGFydHMuZm9yRWFjaCgocGFydCkgPT4ge1xuICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ1RleHROb2RlJykge1xuICAgICAgICB0aGlzLlRleHROb2RlKHBhcnQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5Ob2RlKHBhcnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYnVmZmVyICs9ICdcIic7XG4gIH1cblxuICBNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQoY29tbWVudDogQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoY29tbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBge3shLS0ke2NvbW1lbnQudmFsdWV9LS19fWA7XG4gIH1cblxuICBFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQobW9kOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShtb2QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gJ3t7JztcbiAgICB0aGlzLkV4cHJlc3Npb24obW9kLnBhdGgpO1xuICAgIHRoaXMuUGFyYW1zKG1vZC5wYXJhbXMpO1xuICAgIHRoaXMuSGFzaChtb2QuaGFzaCk7XG4gICAgdGhpcy5idWZmZXIgKz0gJ319JztcbiAgfVxuXG4gIENvbW1lbnRTdGF0ZW1lbnQoY29tbWVudDogQVNUdjEuQ29tbWVudFN0YXRlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGNvbW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gYDwhLS0ke2NvbW1lbnQudmFsdWV9LS0+YDtcbiAgfVxuXG4gIFBhdGhFeHByZXNzaW9uKHBhdGg6IEFTVHYxLlBhdGhFeHByZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUocGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBwYXRoLm9yaWdpbmFsO1xuICB9XG5cbiAgU3ViRXhwcmVzc2lvbihzZXhwOiBBU1R2MS5TdWJFeHByZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoc2V4cCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSAnKCc7XG4gICAgdGhpcy5FeHByZXNzaW9uKHNleHAucGF0aCk7XG4gICAgdGhpcy5QYXJhbXMoc2V4cC5wYXJhbXMpO1xuICAgIHRoaXMuSGFzaChzZXhwLmhhc2gpO1xuICAgIHRoaXMuYnVmZmVyICs9ICcpJztcbiAgfVxuXG4gIFBhcmFtcyhwYXJhbXM6IEFTVHYxLkV4cHJlc3Npb25bXSk6IHZvaWQge1xuICAgIC8vIFRPRE86IGltcGxlbWVudCBhIHRvcCBsZXZlbCBQYXJhbXMgQVNUIG5vZGUgKGp1c3QgbGlrZSB0aGUgSGFzaCBvYmplY3QpXG4gICAgLy8gc28gdGhhdCB0aGlzIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW5cbiAgICBpZiAocGFyYW1zLmxlbmd0aCkge1xuICAgICAgcGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgIHRoaXMuYnVmZmVyICs9ICcgJztcbiAgICAgICAgdGhpcy5FeHByZXNzaW9uKHBhcmFtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEhhc2goaGFzaDogQVNUdjEuSGFzaCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGhhc2gsIHRydWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGFzaC5wYWlycy5mb3JFYWNoKChwYWlyKSA9PiB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSAnICc7XG4gICAgICB0aGlzLkhhc2hQYWlyKHBhaXIpO1xuICAgIH0pO1xuICB9XG5cbiAgSGFzaFBhaXIocGFpcjogQVNUdjEuSGFzaFBhaXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShwYWlyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IHBhaXIua2V5O1xuICAgIHRoaXMuYnVmZmVyICs9ICc9JztcbiAgICB0aGlzLk5vZGUocGFpci52YWx1ZSk7XG4gIH1cblxuICBTdHJpbmdMaXRlcmFsKHN0cjogQVNUdjEuU3RyaW5nTGl0ZXJhbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKHN0cikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBKU09OLnN0cmluZ2lmeShzdHIudmFsdWUpO1xuICB9XG5cbiAgQm9vbGVhbkxpdGVyYWwoYm9vbDogQVNUdjEuQm9vbGVhbkxpdGVyYWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShib29sKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IGJvb2wudmFsdWU7XG4gIH1cblxuICBOdW1iZXJMaXRlcmFsKG51bWJlcjogQVNUdjEuTnVtYmVyTGl0ZXJhbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKG51bWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBudW1iZXIudmFsdWU7XG4gIH1cblxuICBVbmRlZmluZWRMaXRlcmFsKG5vZGU6IEFTVHYxLlVuZGVmaW5lZExpdGVyYWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgTnVsbExpdGVyYWwobm9kZTogQVNUdjEuTnVsbExpdGVyYWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9ICdudWxsJztcbiAgfVxuXG4gIHByaW50KG5vZGU6IEFTVHYxLk5vZGUpOiBzdHJpbmcge1xuICAgIGxldCB7IG9wdGlvbnMgfSA9IHRoaXM7XG5cbiAgICBpZiAob3B0aW9ucy5vdmVycmlkZSkge1xuICAgICAgbGV0IHJlc3VsdCA9IG9wdGlvbnMub3ZlcnJpZGUobm9kZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyID0gJyc7XG4gICAgdGhpcy5Ob2RlKG5vZGUpO1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==
|