parser.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { assert, assign } from '@glimmer/util';
  2. import { EntityParser, EventedTokenizer, HTML5NamedCharRefs as namedCharRefs } from 'simple-html-tokenizer';
  3. export class Parser {
  4. constructor(source, entityParser = new EntityParser(namedCharRefs), mode = 'precompile') {
  5. this.elementStack = [];
  6. this.currentAttribute = null;
  7. this.currentNode = null;
  8. this.source = source;
  9. this.lines = source.source.split(/(?:\r\n?|\n)/g);
  10. this.tokenizer = new EventedTokenizer(this, entityParser, mode);
  11. }
  12. offset() {
  13. let {
  14. line,
  15. column
  16. } = this.tokenizer;
  17. return this.source.offsetFor(line, column);
  18. }
  19. pos({
  20. line,
  21. column
  22. }) {
  23. return this.source.offsetFor(line, column);
  24. }
  25. finish(node) {
  26. return assign({}, node, {
  27. loc: node.loc.until(this.offset())
  28. }); // node.loc = node.loc.withEnd(end);
  29. }
  30. get currentAttr() {
  31. return this.currentAttribute;
  32. }
  33. get currentTag() {
  34. let node = this.currentNode;
  35. (false && assert(node && (node.type === 'StartTag' || node.type === 'EndTag'), 'expected tag'));
  36. return node;
  37. }
  38. get currentStartTag() {
  39. let node = this.currentNode;
  40. (false && assert(node && node.type === 'StartTag', 'expected start tag'));
  41. return node;
  42. }
  43. get currentEndTag() {
  44. let node = this.currentNode;
  45. (false && assert(node && node.type === 'EndTag', 'expected end tag'));
  46. return node;
  47. }
  48. get currentComment() {
  49. let node = this.currentNode;
  50. (false && assert(node && node.type === 'CommentStatement', 'expected a comment'));
  51. return node;
  52. }
  53. get currentData() {
  54. let node = this.currentNode;
  55. (false && assert(node && node.type === 'TextNode', 'expected a text node'));
  56. return node;
  57. }
  58. acceptTemplate(node) {
  59. return this[node.type](node);
  60. }
  61. acceptNode(node) {
  62. return this[node.type](node);
  63. }
  64. currentElement() {
  65. return this.elementStack[this.elementStack.length - 1];
  66. }
  67. sourceForNode(node, endNode) {
  68. let firstLine = node.loc.start.line - 1;
  69. let currentLine = firstLine - 1;
  70. let firstColumn = node.loc.start.column;
  71. let string = [];
  72. let line;
  73. let lastLine;
  74. let lastColumn;
  75. if (endNode) {
  76. lastLine = endNode.loc.end.line - 1;
  77. lastColumn = endNode.loc.end.column;
  78. } else {
  79. lastLine = node.loc.end.line - 1;
  80. lastColumn = node.loc.end.column;
  81. }
  82. while (currentLine < lastLine) {
  83. currentLine++;
  84. line = this.lines[currentLine];
  85. if (currentLine === firstLine) {
  86. if (firstLine === lastLine) {
  87. string.push(line.slice(firstColumn, lastColumn));
  88. } else {
  89. string.push(line.slice(firstColumn));
  90. }
  91. } else if (currentLine === lastLine) {
  92. string.push(line.slice(0, lastColumn));
  93. } else {
  94. string.push(line);
  95. }
  96. }
  97. return string.join('\n');
  98. }
  99. }
  100. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsTUFBVCxFQUFpQixNQUFqQixRQUF1QyxlQUF2QztBQUNBLFNBQ0UsWUFERixFQUVFLGdCQUZGLEVBR0Usa0JBQWtCLElBQUksYUFIeEIsUUFJTyx1QkFKUDtBQXNDQSxPQUFNLE1BQWdCLE1BQWhCLENBQXNCO0FBZTFCLEVBQUEsV0FBQSxDQUNFLE1BREYsRUFFRSxZQUFZLEdBQUcsSUFBSSxZQUFKLENBQWlCLGFBQWpCLENBRmpCLEVBR0UsSUFBQSxHQUFpQyxZQUhuQyxFQUcrQztBQWpCckMsU0FBQSxZQUFBLEdBQTBCLEVBQTFCO0FBR0gsU0FBQSxnQkFBQSxHQUFzQyxJQUF0QztBQUNBLFNBQUEsV0FBQSxHQU9ILElBUEc7QUFlTCxTQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsU0FBSyxLQUFMLEdBQWEsTUFBTSxDQUFDLE1BQVAsQ0FBYyxLQUFkLENBQW9CLGVBQXBCLENBQWI7QUFDQSxTQUFLLFNBQUwsR0FBaUIsSUFBSSxnQkFBSixDQUFxQixJQUFyQixFQUEyQixZQUEzQixFQUF5QyxJQUF6QyxDQUFqQjtBQUNEOztBQUVELEVBQUEsTUFBTSxHQUFBO0FBQ0osUUFBSTtBQUFFLE1BQUEsSUFBRjtBQUFRLE1BQUE7QUFBUixRQUFtQixLQUFLLFNBQTVCO0FBQ0EsV0FBTyxLQUFLLE1BQUwsQ0FBWSxTQUFaLENBQXNCLElBQXRCLEVBQTRCLE1BQTVCLENBQVA7QUFDRDs7QUFFRCxFQUFBLEdBQUcsQ0FBQztBQUFFLElBQUEsSUFBRjtBQUFRLElBQUE7QUFBUixHQUFELEVBQWlDO0FBQ2xDLFdBQU8sS0FBSyxNQUFMLENBQVksU0FBWixDQUFzQixJQUF0QixFQUE0QixNQUE1QixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxNQUFNLENBQWdDLElBQWhDLEVBQTBEO0FBQzlELFdBQVEsTUFBTSxDQUFDLEVB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K0I7QUFDN0IsTUFBQSxXQUFXO0FBQ1gsTUFBQSxJQUFJLEdBQUcsS0FBSyxLQUFMLENBQVcsV0FBWCxDQUFQOztBQUVBLFVBQUksV0FBVyxLQUFLLFNBQXBCLEVBQStCO0FBQzdCLFlBQUksU0FBUyxLQUFLLFFBQWxCLEVBQTRCO0FBQzFCLFVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFJLENBQUMsS0FBTCxDQUFXLFdBQVgsRUFBd0IsVUFBeEIsQ0FBWjtBQUNELFNBRkQsTUFFTztBQUNMLFVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFJLENBQUMsS0FBTCxDQUFXLFdBQVgsQ0FBWjtBQUNEO0FBQ0YsT0FORCxNQU1PLElBQUksV0FBVyxLQUFLLFFBQXBCLEVBQThCO0FBQ25DLFFBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFJLENBQUMsS0FBTCxDQUFXLENBQVgsRUFBYyxVQUFkLENBQVo7QUFDRCxPQUZNLE1BRUE7QUFDTCxRQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVksSUFBWjtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxNQUFNLENBQUMsSUFBUCxDQUFZLElBQVosQ0FBUDtBQUNEOztBQXJLeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBleHBlY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7XG4gIEVudGl0eVBhcnNlcixcbiAgRXZlbnRlZFRva2VuaXplcixcbiAgSFRNTDVOYW1lZENoYXJSZWZzIGFzIG5hbWVkQ2hhclJlZnMsXG59IGZyb20gJ3NpbXBsZS1odG1sLXRva2VuaXplcic7XG5cbmltcG9ydCB7IFNvdXJjZVBvc2l0aW9uIH0gZnJvbSAnLi9zb3VyY2UvbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IFNvdXJjZU9mZnNldCwgU291cmNlU3BhbiB9IGZyb20gJy4vc291cmNlL3NwYW4nO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuaW1wb3J0ICogYXMgSEJTIGZyb20gJy4vdjEvaGFuZGxlYmFycy1hc3QnO1xuXG5leHBvcnQgdHlwZSBQYXJzZXJOb2RlQnVpbGRlcjxOIGV4dGVuZHMgeyBsb2M6IFNvdXJjZVNwYW4gfT4gPSBPbWl0PE4sICdsb2MnPiAmIHtcbiAgbG9jOiBTb3VyY2VPZmZzZXQ7XG59O1xuXG5leHBvcnQgdHlwZSBFbGVtZW50ID0gQVNUdjEuVGVtcGxhdGUgfCBBU1R2MS5CbG9jayB8IEFTVHYxLkVsZW1lbnROb2RlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhZzxUIGV4dGVuZHMgJ1N0YXJ0VGFnJyB8ICdFbmRUYWcnPiB7XG4gIHJlYWRvbmx5IHR5cGU6IFQ7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0cmlidXRlczogQVNUdjEuQXR0ck5vZGVbXTtcbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnRbXTtcbiAgcmVhZG9ubHkgY29tbWVudHM6IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudFtdO1xuICBzZWxmQ2xvc2luZzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbG9jOiBTb3VyY2VTcGFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3VycmVudFBhcnQ6IEFTVHYxLlRleHROb2RlIHwgbnVsbDtcbiAgcGFydHM6IChBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB8IEFTVHYxLlRleHROb2RlKVtdO1xuICBpc1F1b3RlZDogYm9vbGVhbjtcbiAgaXNEeW5hbWljOiBib29sZWFuO1xuICBzdGFydDogU291cmNlT2Zmc2V0O1xuICB2YWx1ZVNwYW46IFNvdXJjZVNwYW47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYXJzZXIge1xuICBwcm90ZWN0ZWQgZWxlbWVudFN0YWNrOiBFbGVtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHNvdXJjZTogU291cmNlO1xuICBwdWJsaWMgY3VycmVudEF0dHJpYnV0ZTogT3B0aW9uPEF0dHJpYnV0ZT4gPSBudWxsO1xuICBwdWJsaWMgY3VycmVudE5vZGU6IE9wdGlvbjxcbiAgICBSZWFkb25seTxcbiAgICAgIHwgUGFyc2VyTm9kZUJ1aWxkZXI8QVNUdjEuQ29tbWVudFN0YXRlbWVudD5cbiAgICAgIHwgQVNUdjEuVGV4dE5vZGVcbiAgICAgIHwgUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdTdGFydFRhZyc+PlxuICAgICAgfCBQYXJzZXJOb2RlQnVpbGRlcjxUYWc8J0VuZFRhZyc+PlxuICAgID5cbiAgPiA9IG51bGw7XG4gIHB1YmxpYyB0b2tlbml6ZXI6IEV2ZW50ZWRUb2tlbml6ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc291cmNlOiBTb3VyY2UsXG4gICAgZW50aXR5UGFyc2VyID0gbmV3IEVudGl0eVBhcnNlcihuYW1lZENoYXJSZWZzKSxcbiAgICBtb2RlOiAncHJlY29tcGlsZScgfCAnY29kZW1vZCcgPSAncHJlY29tcGlsZSdcbiAgKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5saW5lcyA9IHNvdXJjZS5zb3VyY2Uuc3BsaXQoLyg/Olxcclxcbj98XFxuKS9nKTtcbiAgICB0aGlzLnRva2VuaXplciA9IG5ldyBFdmVudGVkVG9rZW5pemVyKHRoaXMsIGVudGl0eVBhcnNlciwgbW9kZSk7XG4gIH1cblxuICBvZmZzZXQoKTogU291cmNlT2Zmc2V0IHtcbiAgICBsZXQgeyBsaW5lLCBjb2x1bW4gfSA9IHRoaXMudG9rZW5pemVyO1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5vZmZzZXRGb3IobGluZSwgY29sdW1uKTtcbiAgfVxuXG4gIHBvcyh7IGxpbmUsIGNvbHVtbiB9OiBTb3VyY2VQb3NpdGlvbik6IFNvdXJjZU9mZnNldCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm9mZnNldEZvcihsaW5lLCBjb2x1bW4pO1xuICB9XG5cbiAgZmluaXNoPFQgZXh0ZW5kcyB7IGxvYzogU291cmNlU3BhbiB9Pihub2RlOiBQYXJzZXJOb2RlQnVpbGRlcjxUPik6IFQge1xuICAgIHJldHVybiAoYXNzaWduKHt9LCBub2RlLCB7XG4gICAgICBsb2M6IG5vZGUubG9jLnVudGlsKHRoaXMub2Zmc2V0KCkpLFxuICAgIH0gYXMgY29uc3QpIGFzIHVua25vd24pIGFzIFQ7XG5cbiAgICAvLyBub2RlLmxvYyA9IG5vZGUubG9jLndpdGhFbmQoZW5kKTtcbiAgfVxuXG4gIGFic3RyYWN0IFByb2dyYW0obm9kZTogSEJTLlByb2dyYW0pOiBIQlMuT3V0cHV0PCdQcm9ncmFtJz47XG4gIGFic3RyYWN0IE11c3RhY2hlU3RhdGVtZW50KG5vZGU6IEhCUy5NdXN0YWNoZVN0YXRlbWVudCk6IEhCUy5PdXRwdXQ8J011c3RhY2hlU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IERlY29yYXRvcihub2RlOiBIQlMuRGVjb3JhdG9yKTogSEJTLk91dHB1dDwnRGVjb3JhdG9yJz47XG4gIGFic3RyYWN0IEJsb2NrU3RhdGVtZW50KG5vZGU6IEhCUy5CbG9ja1N0YXRlbWVudCk6IEhCUy5PdXRwdXQ8J0Jsb2NrU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IERlY29yYXRvckJsb2NrKG5vZGU6IEhCUy5EZWNvcmF0b3JCbG9jayk6IEhCUy5PdXRwdXQ8J0RlY29yYXRvckJsb2NrJz47XG4gIGFic3RyYWN0IFBhcnRpYWxTdGF0ZW1lbnQobm9kZTogSEJTLlBhcnRpYWxTdGF0ZW1lbnQpOiBIQlMuT3V0cHV0PCdQYXJ0aWFsU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IFBhcnRpYWxCbG9ja1N0YXRlbWVudChcbiAgICBub2RlOiBIQlMuUGFydGlhbEJsb2NrU3RhdGVtZW50XG4gICk6IEhCUy5PdXRwdXQ8J1BhcnRpYWxCbG9ja1N0YXRlbWVudCc+O1xuICBhYnN0cmFjdCBDb250ZW50U3RhdGVtZW50KG5vZGU6IEhCUy5Db250ZW50U3RhdGVtZW50KTogSEJTLk91dHB1dDwnQ29udGVudFN0YXRlbWVudCc+O1xuICBhYnN0cmFjdCBDb21tZW50U3RhdGVtZW50KG5vZGU6IEhCUy5Db21tZW50U3RhdGVtZW50KTogSEJTLk91dHB1dDwnQ29tbWVudFN0YXRlbWVudCc+O1xuICBhYnN0cmFjdCBTdWJFeHByZXNzaW9uKG5vZGU6IEhCUy5TdWJFeHByZXNzaW9uKTogSEJTLk91dHB1dDwnU3ViRXhwcmVzc2lvbic+O1xuICBhYnN0cmFjdCBQYXRoRXhwcmVzc2lvbihub2RlOiBIQlMuUGF0aEV4cHJlc3Npb24pOiBIQlMuT3V0cHV0PCdQYXRoRXhwcmVzc2lvbic+O1xuICBhYnN0cmFjdCBTdHJpbmdMaXRlcmFsKG5vZGU6IEhCUy5TdHJpbmdMaXRlcmFsKTogSEJTLk91dHB1dDwnU3RyaW5nTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBCb29sZWFuTGl0ZXJhbChub2RlOiBIQlMuQm9vbGVhbkxpdGVyYWwpOiBIQlMuT3V0cHV0PCdCb29sZWFuTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBOdW1iZXJMaXRlcmFsKG5vZGU6IEhCUy5OdW1iZXJMaXRlcmFsKTogSEJTLk91dHB1dDwnTnVtYmVyTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBVbmRlZmluZWRMaXRlcmFsKG5vZGU6IEhCUy5VbmRlZmluZWRMaXRlcmFsKTogSEJTLk91dHB1dDwnVW5kZWZpbmVkTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBOdWxsTGl0ZXJhbChub2RlOiBIQlMuTnVsbExpdGVyYWwpOiBIQlMuT3V0cHV0PCdOdWxsTGl0ZXJhbCc+O1xuXG4gIGFic3RyYWN0IHJlc2V0KCk6IHZvaWQ7XG4gIGFic3RyYWN0IGZpbmlzaERhdGEoKTogdm9pZDtcbiAgYWJzdHJhY3QgdGFnT3BlbigpOiB2b2lkO1xuICBhYnN0cmFjdCBiZWdpbkRhdGEoKTogdm9pZDtcbiAgYWJzdHJhY3QgYXBwZW5kVG9EYXRhKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luU3RhcnRUYWcoKTogdm9pZDtcbiAgYWJzdHJhY3QgYXBwZW5kVG9UYWdOYW1lKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luQXR0cmlidXRlKCk6IHZvaWQ7XG4gIGFic3RyYWN0IGFwcGVuZFRvQXR0cmlidXRlTmFtZShjaGFyOiBzdHJpbmcpOiB2b2lkO1xuICBhYnN0cmFjdCBiZWdpbkF0dHJpYnV0ZVZhbHVlKHF1b3RlZDogYm9vbGVhbik6IHZvaWQ7XG4gIGFic3RyYWN0IGFwcGVuZFRvQXR0cmlidXRlVmFsdWUoY2hhcjogc3RyaW5nKTogdm9pZDtcbiAgYWJzdHJhY3QgZmluaXNoQXR0cmlidXRlVmFsdWUoKTogdm9pZDtcbiAgYWJzdHJhY3QgbWFya1RhZ0FzU2VsZkNsb3NpbmcoKTogdm9pZDtcbiAgYWJzdHJhY3QgYmVnaW5FbmRUYWcoKTogdm9pZDtcbiAgYWJzdHJhY3QgZmluaXNoVGFnKCk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luQ29tbWVudCgpOiB2b2lkO1xuICBhYnN0cmFjdCBhcHBlbmRUb0NvbW1lbnREYXRhKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGZpbmlzaENvbW1lbnQoKTogdm9pZDtcbiAgYWJzdHJhY3QgcmVwb3J0U3ludGF4RXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQ7XG5cbiAgZ2V0IGN1cnJlbnRBdHRyKCk6IEF0dHJpYnV0ZSB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzLmN1cnJlbnRBdHRyaWJ1dGUsICdleHBlY3RlZCBhdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VGFnKCk6IFBhcnNlck5vZGVCdWlsZGVyPFRhZzwnU3RhcnRUYWcnIHwgJ0VuZFRhZyc+PiB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIChub2RlLnR5cGUgPT09ICdTdGFydFRhZycgfHwgbm9kZS50eXBlID09PSAnRW5kVGFnJyksICdleHBlY3RlZCB0YWcnKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50U3RhcnRUYWcoKTogUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdTdGFydFRhZyc+PiB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIG5vZGUudHlwZSA9PT0gJ1N0YXJ0VGFnJywgJ2V4cGVjdGVkIHN0YXJ0IHRhZycpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRFbmRUYWcoKTogUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdFbmRUYWcnPj4ge1xuICAgIGxldCBub2RlID0gdGhpcy5jdXJyZW50Tm9kZTtcbiAgICBhc3NlcnQobm9kZSAmJiBub2RlLnR5cGUgPT09ICdFbmRUYWcnLCAnZXhwZWN0ZWQgZW5kIHRhZycpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRDb21tZW50KCk6IFBhcnNlck5vZGVCdWlsZGVyPEFTVHYxLkNvbW1lbnRTdGF0ZW1lbnQ+IHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgYXNzZXJ0KG5vZGUgJiYgbm9kZS50eXBlID09PSAnQ29tbWVudFN0YXRlbWVudCcsICdleHBlY3RlZCBhIGNvbW1lbnQnKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50RGF0YSgpOiBBU1R2MS5UZXh0Tm9kZSB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIG5vZGUudHlwZSA9PT0gJ1RleHROb2RlJywgJ2V4cGVjdGVkIGEgdGV4dCBub2RlJyk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhY2NlcHRUZW1wbGF0ZShub2RlOiBIQlMuUHJvZ3JhbSk6IEFTVHYxLlRlbXBsYXRlIHtcbiAgICByZXR1cm4gdGhpc1tub2RlLnR5cGUgYXMgJ1Byb2dyYW0nXShub2RlKSBhcyBBU1R2MS5UZW1wbGF0ZTtcbiAgfVxuXG4gIGFjY2VwdE5vZGUobm9kZTogSEJTLlByb2dyYW0pOiBBU1R2MS5CbG9jayB8IEFTVHYxLlRlbXBsYXRlO1xuICBhY2NlcHROb2RlPFUgZXh0ZW5kcyBIQlMuTm9kZSB8IEFTVHYxLk5vZGU+KG5vZGU6IEhCUy5Ob2RlKTogVTtcbiAgYWNjZXB0Tm9kZTxUIGV4dGVuZHMgSEJTLk5vZGVUeXBlPihub2RlOiBIQlMuTm9kZTxUPik6IEhCUy5PdXRwdXQ8VD4ge1xuICAgIHJldHVybiAodGhpc1tub2RlLnR5cGUgYXMgVF0gYXMgKG5vZGU6IEhCUy5Ob2RlPFQ+KSA9PiBIQlMuT3V0cHV0PFQ+KShub2RlKTtcbiAgfVxuXG4gIGN1cnJlbnRFbGVtZW50KCk6IEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRTdGFja1t0aGlzLmVsZW1lbnRTdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHNvdXJjZUZvck5vZGUobm9kZTogSEJTLk5vZGUsIGVuZE5vZGU/OiB7IGxvYzogSEJTLlNvdXJjZUxvY2F0aW9uIH0pOiBzdHJpbmcge1xuICAgIGxldCBmaXJzdExpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lIC0gMTtcbiAgICBsZXQgY3VycmVudExpbmUgPSBmaXJzdExpbmUgLSAxO1xuICAgIGxldCBmaXJzdENvbHVtbiA9IG5vZGUubG9jLnN0YXJ0LmNvbHVtbjtcbiAgICBsZXQgc3RyaW5nID0gW107XG4gICAgbGV0IGxpbmU7XG5cbiAgICBsZXQgbGFzdExpbmU6IG51bWJlcjtcbiAgICBsZXQgbGFzdENvbHVtbjogbnVtYmVyO1xuXG4gICAgaWYgKGVuZE5vZGUpIHtcbiAgICAgIGxhc3RMaW5lID0gZW5kTm9kZS5sb2MuZW5kLmxpbmUgLSAxO1xuICAgICAgbGFzdENvbHVtbiA9IGVuZE5vZGUubG9jLmVuZC5jb2x1bW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RMaW5lID0gbm9kZS5sb2MuZW5kLmxpbmUgLSAxO1xuICAgICAgbGFzdENvbHVtbiA9IG5vZGUubG9jLmVuZC5jb2x1bW47XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnJlbnRMaW5lIDwgbGFzdExpbmUpIHtcbiAgICAgIGN1cnJlbnRMaW5lKys7XG4gICAgICBsaW5lID0gdGhpcy5saW5lc1tjdXJyZW50TGluZV07XG5cbiAgICAgIGlmIChjdXJyZW50TGluZSA9PT0gZmlyc3RMaW5lKSB7XG4gICAgICAgIGlmIChmaXJzdExpbmUgPT09IGxhc3RMaW5lKSB7XG4gICAgICAgICAgc3RyaW5nLnB1c2gobGluZS5zbGljZShmaXJzdENvbHVtbiwgbGFzdENvbHVtbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmluZy5wdXNoKGxpbmUuc2xpY2UoZmlyc3RDb2x1bW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50TGluZSA9PT0gbGFzdExpbmUpIHtcbiAgICAgICAgc3RyaW5nLnB1c2gobGluZS5zbGljZSgwLCBsYXN0Q29sdW1uKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJpbmcucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nLmpvaW4oJ1xcbicpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9