builders.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.BuildElement = exports.Builder = void 0;
  6. var _util = require("@glimmer/util");
  7. var _slice = require("../source/slice");
  8. var _spanList = require("../source/span-list");
  9. var ASTv2 = _interopRequireWildcard(require("./api"));
  10. function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
  11. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
  12. var __rest = void 0 && (void 0).__rest || function (s, e) {
  13. var t = {};
  14. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  15. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  16. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  17. }
  18. return t;
  19. };
  20. class Builder {
  21. // TEMPLATE //
  22. template(symbols, body, loc) {
  23. return new ASTv2.Template({
  24. table: symbols,
  25. body,
  26. loc
  27. });
  28. } // INTERNAL (these nodes cannot be reached when doing general-purpose visiting) //
  29. block(symbols, body, loc) {
  30. return new ASTv2.Block({
  31. scope: symbols,
  32. body,
  33. loc
  34. });
  35. }
  36. namedBlock(name, block, loc) {
  37. return new ASTv2.NamedBlock({
  38. name,
  39. block,
  40. attrs: [],
  41. componentArgs: [],
  42. modifiers: [],
  43. loc
  44. });
  45. }
  46. simpleNamedBlock(name, block, loc) {
  47. return new BuildElement({
  48. selfClosing: false,
  49. attrs: [],
  50. componentArgs: [],
  51. modifiers: [],
  52. comments: []
  53. }).named(name, block, loc);
  54. }
  55. slice(chars, loc) {
  56. return new _slice.SourceSlice({
  57. loc,
  58. chars
  59. });
  60. }
  61. args(positional, named, loc) {
  62. return new ASTv2.Args({
  63. loc,
  64. positional,
  65. named
  66. });
  67. }
  68. positional(exprs, loc) {
  69. return new ASTv2.PositionalArguments({
  70. loc,
  71. exprs
  72. });
  73. }
  74. namedArgument(key, value) {
  75. return new ASTv2.NamedArgument({
  76. name: key,
  77. value
  78. });
  79. }
  80. named(entries, loc) {
  81. return new ASTv2.NamedArguments({
  82. loc,
  83. entries
  84. });
  85. }
  86. attr({
  87. name,
  88. value,
  89. trusting
  90. }, loc) {
  91. return new ASTv2.HtmlAttr({
  92. loc,
  93. name,
  94. value,
  95. trusting
  96. });
  97. }
  98. splatAttr(symbol, loc) {
  99. return new ASTv2.SplatAttr({
  100. symbol,
  101. loc
  102. });
  103. }
  104. arg({
  105. name,
  106. value,
  107. trusting
  108. }, loc) {
  109. return new ASTv2.ComponentArg({
  110. name,
  111. value,
  112. trusting,
  113. loc
  114. });
  115. } // EXPRESSIONS //
  116. path(head, tail, loc) {
  117. return new ASTv2.PathExpression({
  118. loc,
  119. ref: head,
  120. tail
  121. });
  122. }
  123. self(loc) {
  124. return new ASTv2.ThisReference({
  125. loc
  126. });
  127. }
  128. at(name, symbol, loc) {
  129. // the `@` should be included so we have a complete source range
  130. false && (0, _util.assert)(name[0] === '@', `call builders.at() with a string that starts with '@'`);
  131. return new ASTv2.ArgReference({
  132. loc,
  133. name: new _slice.SourceSlice({
  134. loc,
  135. chars: name
  136. }),
  137. symbol
  138. });
  139. }
  140. freeVar({
  141. name,
  142. context,
  143. symbol,
  144. loc
  145. }) {
  146. false && (0, _util.assert)(name !== 'this', `You called builders.freeVar() with 'this'. Call builders.this instead`);
  147. false && (0, _util.assert)(name[0] !== '@', `You called builders.freeVar() with '${name}'. Call builders.at('${name}') instead`);
  148. return new ASTv2.FreeVarReference({
  149. name,
  150. resolution: context,
  151. symbol,
  152. loc
  153. });
  154. }
  155. localVar(name, symbol, isTemplateLocal, loc) {
  156. false && (0, _util.assert)(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`);
  157. false && (0, _util.assert)(name[0] !== '@', `You called builders.var() with '${name}'. Call builders.at('${name}') instead`);
  158. return new ASTv2.LocalVarReference({
  159. loc,
  160. name,
  161. isTemplateLocal,
  162. symbol
  163. });
  164. }
  165. sexp(parts, loc) {
  166. return new ASTv2.CallExpression({
  167. loc,
  168. callee: parts.callee,
  169. args: parts.args
  170. });
  171. }
  172. deprecatedCall(arg, callee, loc) {
  173. return new ASTv2.DeprecatedCallExpression({
  174. loc,
  175. arg,
  176. callee
  177. });
  178. }
  179. interpolate(parts, loc) {
  180. (0, _util.assertPresent)(parts);
  181. return new ASTv2.InterpolateExpression({
  182. loc,
  183. parts
  184. });
  185. }
  186. literal(value, loc) {
  187. return new ASTv2.LiteralExpression({
  188. loc,
  189. value
  190. });
  191. } // STATEMENTS //
  192. append({
  193. table,
  194. trusting,
  195. value
  196. }, loc) {
  197. return new ASTv2.AppendContent({
  198. table,
  199. trusting,
  200. value,
  201. loc
  202. });
  203. }
  204. modifier({
  205. callee,
  206. args
  207. }, loc) {
  208. return new ASTv2.ElementModifier({
  209. loc,
  210. callee,
  211. args
  212. });
  213. }
  214. namedBlocks(blocks, loc) {
  215. return new ASTv2.NamedBlocks({
  216. loc,
  217. blocks
  218. });
  219. }
  220. blockStatement(_a, loc) {
  221. var {
  222. symbols,
  223. program,
  224. inverse = null
  225. } = _a,
  226. call = __rest(_a, ["symbols", "program", "inverse"]);
  227. let blocksLoc = program.loc;
  228. let blocks = [this.namedBlock(_slice.SourceSlice.synthetic('default'), program, program.loc)];
  229. if (inverse) {
  230. blocksLoc = blocksLoc.extend(inverse.loc);
  231. blocks.push(this.namedBlock(_slice.SourceSlice.synthetic('else'), inverse, inverse.loc));
  232. }
  233. return new ASTv2.InvokeBlock({
  234. loc,
  235. blocks: this.namedBlocks(blocks, blocksLoc),
  236. callee: call.callee,
  237. args: call.args
  238. });
  239. }
  240. element(options) {
  241. return new BuildElement(options);
  242. }
  243. }
  244. exports.Builder = Builder;
  245. class BuildElement {
  246. constructor(base) {
  247. this.base = base;
  248. this.builder = new Builder();
  249. }
  250. simple(tag, body, loc) {
  251. return new ASTv2.SimpleElement((0, _util.assign)({
  252. tag,
  253. body,
  254. componentArgs: [],
  255. loc
  256. }, this.base));
  257. }
  258. named(name, block, loc) {
  259. return new ASTv2.NamedBlock((0, _util.assign)({
  260. name,
  261. block,
  262. componentArgs: [],
  263. loc
  264. }, this.base));
  265. }
  266. selfClosingComponent(callee, loc) {
  267. return new ASTv2.InvokeComponent((0, _util.assign)({
  268. loc,
  269. callee,
  270. // point the empty named blocks at the `/` self-closing tag
  271. blocks: new ASTv2.NamedBlocks({
  272. blocks: [],
  273. loc: loc.sliceEndChars({
  274. skipEnd: 1,
  275. chars: 1
  276. })
  277. })
  278. }, this.base));
  279. }
  280. componentWithDefaultBlock(callee, children, symbols, loc) {
  281. let block = this.builder.block(symbols, children, loc);
  282. let namedBlock = this.builder.namedBlock(_slice.SourceSlice.synthetic('default'), block, loc); // BUILDER.simpleNamedBlock('default', children, symbols, loc);
  283. return new ASTv2.InvokeComponent((0, _util.assign)({
  284. loc,
  285. callee,
  286. blocks: this.builder.namedBlocks([namedBlock], namedBlock.loc)
  287. }, this.base));
  288. }
  289. componentWithNamedBlocks(callee, blocks, loc) {
  290. return new ASTv2.InvokeComponent((0, _util.assign)({
  291. loc,
  292. callee,
  293. blocks: this.builder.namedBlocks(blocks, _spanList.SpanList.range(blocks))
  294. }, this.base));
  295. }
  296. }
  297. exports.BuildElement = BuildElement;
  298. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9idWlsZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT00sTUFBQSxPQUFBLENBQWM7QUFDbEI7QUFFQSxFQUFBLFFBQVEsQ0FBQSxPQUFBLEVBQUEsSUFBQSxFQUFBLEdBQUEsRUFHUztBQUVmLFdBQU8sSUFBSSxLQUFLLENBQVQsUUFBQSxDQUFtQjtBQUN4QixNQUFBLEtBQUssRUFEbUIsT0FBQTtBQUFBLE1BQUEsSUFBQTtBQUd4QixNQUFBO0FBSHdCLEtBQW5CLENBQVA7QUFSZ0IsR0FBQSxDQWVsQjs7O0FBRUEsRUFBQSxLQUFLLENBQUEsT0FBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBQXNFO0FBQ3pFLFdBQU8sSUFBSSxLQUFLLENBQVQsS0FBQSxDQUFnQjtBQUNyQixNQUFBLEtBQUssRUFEZ0IsT0FBQTtBQUFBLE1BQUEsSUFBQTtBQUdyQixNQUFBO0FBSHFCLEtBQWhCLENBQVA7QUFLRDs7QUFFRCxFQUFBLFVBQVUsQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFBLEdBQUEsRUFBdUQ7QUFDL0QsV0FBTyxJQUFJLEtBQUssQ0FBVCxVQUFBLENBQXFCO0FBQUEsTUFBQSxJQUFBO0FBQUEsTUFBQSxLQUFBO0FBRzFCLE1BQUEsS0FBSyxFQUhxQixFQUFBO0FBSTFCLE1BQUEsYUFBYSxFQUphLEVBQUE7QUFLMUIsTUFBQSxTQUFTLEVBTGlCLEVBQUE7QUFNMUIsTUFBQTtBQU4wQixLQUFyQixDQUFQO0FBUUQ7O0FBRUQsRUFBQSxnQkFBZ0IsQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFBLEdBQUEsRUFBdUQ7QUFDckUsV0FBTyxJQUFBLFlBQUEsQ0FBaUI7QUFDdEIsTUFBQSxXQUFXLEVBRFcsS0FBQTtBQUV0QixNQUFBLEtBQUssRUFGaUIsRUFBQTtBQUd0QixNQUFBLGFB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QUEsR0FBQSxFQUlSO0FBRWYsUUFBSSxLQUFLLEdBQUcsS0FBQSxPQUFBLENBQUEsS0FBQSxDQUFBLE9BQUEsRUFBQSxRQUFBLEVBQVosR0FBWSxDQUFaO0FBQ0EsUUFBSSxVQUFVLEdBQUcsS0FBQSxPQUFBLENBQUEsVUFBQSxDQUF3QixtQkFBQSxTQUFBLENBQXhCLFNBQXdCLENBQXhCLEVBQUEsS0FBQSxFQUhGLEdBR0UsQ0FBakIsQ0FIZSxDQUd5RTs7QUFFeEYsV0FBTyxJQUFJLEtBQUssQ0FBVCxlQUFBLENBQ0wsa0JBQ0U7QUFBQSxNQUFBLEdBQUE7QUFBQSxNQUFBLE1BQUE7QUFHRSxNQUFBLE1BQU0sRUFBRSxLQUFBLE9BQUEsQ0FBQSxXQUFBLENBQXlCLENBQXpCLFVBQXlCLENBQXpCLEVBQXVDLFVBQVUsQ0FBakQsR0FBQTtBQUhWLEtBREYsRUFNRSxLQVBKLElBQ0UsQ0FESyxDQUFQO0FBVUQ7O0FBRUQsRUFBQSx3QkFBd0IsQ0FBQSxNQUFBLEVBQUEsTUFBQSxFQUFBLEdBQUEsRUFHUDtBQUVmLFdBQU8sSUFBSSxLQUFLLENBQVQsZUFBQSxDQUNMLGtCQUNFO0FBQUEsTUFBQSxHQUFBO0FBQUEsTUFBQSxNQUFBO0FBR0UsTUFBQSxNQUFNLEVBQUUsS0FBQSxPQUFBLENBQUEsV0FBQSxDQUFBLE1BQUEsRUFBaUMsbUJBQUEsS0FBQSxDQUFqQyxNQUFpQyxDQUFqQztBQUhWLEtBREYsRUFNRSxLQVBKLElBQ0UsQ0FESyxDQUFQO0FBVUQ7O0FBdkZzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJlc2VudEFycmF5IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydFByZXNlbnQsIGFzc2lnbiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBTb3VyY2VTbGljZSB9IGZyb20gJy4uL3NvdXJjZS9zbGljZSc7XG5pbXBvcnQgeyBTb3VyY2VTcGFuIH0gZnJvbSAnLi4vc291cmNlL3NwYW4nO1xuaW1wb3J0IHsgU3Bhbkxpc3QgfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbi1saXN0JztcbmltcG9ydCB7IEJsb2NrU3ltYm9sVGFibGUsIFByb2dyYW1TeW1ib2xUYWJsZSwgU3ltYm9sVGFibGUgfSBmcm9tICcuLi9zeW1ib2wtdGFibGUnO1xuaW1wb3J0ICogYXMgQVNUdjIgZnJvbSAnLi9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxQYXJ0cyB7XG4gIGNhbGxlZTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gIGFyZ3M6IEFTVHYyLkFyZ3M7XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcbiAgLy8gVEVNUExBVEUgLy9cblxuICB0ZW1wbGF0ZShcbiAgICBzeW1ib2xzOiBQcm9ncmFtU3ltYm9sVGFibGUsXG4gICAgYm9keTogQVNUdjIuQ29udGVudE5vZGVbXSxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuVGVtcGxhdGUge1xuICAgIHJldHVybiBuZXcgQVNUdjIuVGVtcGxhdGUoe1xuICAgICAgdGFibGU6IHN5bWJvbHMsXG4gICAgICBib2R5LFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gSU5URVJOQUwgKHRoZXNlIG5vZGVzIGNhbm5vdCBiZSByZWFjaGVkIHdoZW4gZG9pbmcgZ2VuZXJhbC1wdXJwb3NlIHZpc2l0aW5nKSAvL1xuXG4gIGJsb2NrKHN5bWJvbHM6IEJsb2NrU3ltYm9sVGFibGUsIGJvZHk6IEFTVHYyLkNvbnRlbnROb2RlW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkJsb2NrIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkJsb2NrKHtcbiAgICAgIHNjb3BlOiBzeW1ib2xzLFxuICAgICAgYm9keSxcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIG5hbWVkQmxvY2sobmFtZTogU291cmNlU2xpY2UsIGJsb2NrOiBBU1R2Mi5CbG9jaywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTmFtZWRCbG9jayB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5OYW1lZEJsb2NrKHtcbiAgICAgIG5hbWUsXG4gICAgICBibG9jayxcbiAgICAgIGF0dHJzOiBbXSxcbiAgICAgIGNvbXBvbmVudEFyZ3M6IFtdLFxuICAgICAgbW9kaWZpZXJzOiBbXSxcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIHNpbXBsZU5hbWVkQmxvY2sobmFtZTogU291cmNlU2xpY2UsIGJsb2NrOiBBU1R2Mi5CbG9jaywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTmFtZWRCbG9jayB7XG4gICAgcmV0dXJuIG5ldyBCdWlsZEVsZW1lbnQoe1xuICAgICAgc2VsZkNsb3Npbmc6IGZhbHNlLFxuICAgICAgYXR0cnM6IFtdLFxuICAgICAgY29tcG9uZW50QXJnczogW10sXG4gICAgICBtb2RpZmllcnM6IFtdLFxuICAgICAgY29tbWVudHM6IFtdLFxuICAgIH0pLm5hbWVkKG5hbWUsIGJsb2NrLCBsb2MpO1xuICB9XG5cbiAgc2xpY2UoY2hhcnM6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogU291cmNlU2xpY2Uge1xuICAgIHJldHVybiBuZXcgU291cmNlU2xpY2Uoe1xuICAgICAgbG9jLFxuICAgICAgY2hhcnMsXG4gICAgfSk7XG4gIH1cblxuICBhcmdzKFxuICAgIHBvc2l0aW9uYWw6IEFTVHYyLlBvc2l0aW9uYWxBcmd1bWVudHMsXG4gICAgbmFtZWQ6IEFTVHYyLk5hbWVkQXJndW1lbnRzLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5BcmdzIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkFyZ3Moe1xuICAgICAgbG9jLFxuICAgICAgcG9zaXRpb25hbCxcbiAgICAgIG5hbWVkLFxuICAgIH0pO1xuICB9XG5cbiAgcG9zaXRpb25hbChleHByczogQVNUdjIuRXhwcmVzc2lvbk5vZGVbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5Qb3NpdGlvbmFsQXJndW1lbnRzKHtcbiAgICAgIGxvYyxcbiAgICAgIGV4cHJzLFxuICAgIH0pO1xuICB9XG5cbiAgbmFtZWRBcmd1bWVudChrZXk6IFNvdXJjZVNsaWNlLCB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGUpOiBBU1R2Mi5OYW1lZEFyZ3VtZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLk5hbWVkQXJndW1lbnQoe1xuICAgICAgbmFtZToga2V5LFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICBuYW1lZChlbnRyaWVzOiBBU1R2Mi5OYW1lZEFyZ3VtZW50W10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLk5hbWVkQXJndW1lbnRzIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLk5hbWVkQXJndW1lbnRzKHtcbiAgICAgIGxvYyxcbiAgICAgIGVudHJpZXMsXG4gICAgfSk7XG4gIH1cblxuICBhdHRyKFxuICAgIHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHRydXN0aW5nLFxuICAgIH06IHsgbmFtZTogU291cmNlU2xpY2U7IHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTsgdHJ1c3Rpbmc6IGJvb2xlYW4gfSxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuSHRtbEF0dHIge1xuICAgIHJldHVybiBuZXcgQVNUdjIuSHRtbEF0dHIoe1xuICAgICAgbG9jLFxuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgfSk7XG4gIH1cblxuICBzcGxhdEF0dHIoc3ltYm9sOiBudW1iZXIsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLlNwbGF0QXR0ciB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5TcGxhdEF0dHIoe1xuICAgICAgc3ltYm9sLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgYXJnKFxuICAgIHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHRydXN0aW5nLFxuICAgIH06IHsgbmFtZTogU291cmNlU2xpY2U7IHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTsgdHJ1c3Rpbmc6IGJvb2xlYW4gfSxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuQ29tcG9uZW50QXJnIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkNvbXBvbmVudEFyZyh7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICB0cnVzdGluZyxcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEVYUFJFU1NJT05TIC8vXG5cbiAgcGF0aChoZWFkOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSwgdGFpbDogU291cmNlU2xpY2VbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuUGF0aEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQVNUdjIuUGF0aEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgcmVmOiBoZWFkLFxuICAgICAgdGFpbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGYobG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuVmFyaWFibGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQVNUdjIuVGhpc1JlZmVyZW5jZSh7XG4gICAgICBsb2MsXG4gICAgfSk7XG4gIH1cblxuICBhdChuYW1lOiBzdHJpbmcsIHN5bWJvbDogbnVtYmVyLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSB7XG4gICAgLy8gdGhlIGBAYCBzaG91bGQgYmUgaW5jbHVkZWQgc28gd2UgaGF2ZSBhIGNvbXBsZXRlIHNvdXJjZSByYW5nZVxuICAgIGFzc2VydChuYW1lWzBdID09PSAnQCcsIGBjYWxsIGJ1aWxkZXJzLmF0KCkgd2l0aCBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdAJ2ApO1xuXG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5BcmdSZWZlcmVuY2Uoe1xuICAgICAgbG9jLFxuICAgICAgbmFtZTogbmV3IFNvdXJjZVNsaWNlKHsgbG9jLCBjaGFyczogbmFtZSB9KSxcbiAgICAgIHN5bWJvbCxcbiAgICB9KTtcbiAgfVxuXG4gIGZyZWVWYXIoe1xuICAgIG5hbWUsXG4gICAgY29udGV4dCxcbiAgICBzeW1ib2wsXG4gICAgbG9jLFxuICB9OiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNvbnRleHQ6IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uO1xuICAgIHN5bWJvbDogbnVtYmVyO1xuICAgIGxvYzogU291cmNlU3BhbjtcbiAgfSk6IEFTVHYyLkZyZWVWYXJSZWZlcmVuY2Uge1xuICAgIGFzc2VydChcbiAgICAgIG5hbWUgIT09ICd0aGlzJyxcbiAgICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLmZyZWVWYXIoKSB3aXRoICd0aGlzJy4gQ2FsbCBidWlsZGVycy50aGlzIGluc3RlYWRgXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICBuYW1lWzBdICE9PSAnQCcsXG4gICAgICBgWW91IGNhbGxlZCBidWlsZGVycy5mcmVlVmFyKCkgd2l0aCAnJHtuYW1lfScuIENhbGwgYnVpbGRlcnMuYXQoJyR7bmFtZX0nKSBpbnN0ZWFkYFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkZyZWVWYXJSZWZlcmVuY2Uoe1xuICAgICAgbmFtZSxcbiAgICAgIHJlc29sdXRpb246IGNvbnRleHQsXG4gICAgICBzeW1ib2wsXG4gICAgICBsb2MsXG4gICAgfSk7XG4gIH1cblxuICBsb2NhbFZhcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3ltYm9sOiBudW1iZXIsXG4gICAgaXNUZW1wbGF0ZUxvY2FsOiBib29sZWFuLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSB7XG4gICAgYXNzZXJ0KG5hbWUgIT09ICd0aGlzJywgYFlvdSBjYWxsZWQgYnVpbGRlcnMudmFyKCkgd2l0aCAndGhpcycuIENhbGwgYnVpbGRlcnMudGhpcyBpbnN0ZWFkYCk7XG4gICAgYXNzZXJ0KFxuICAgICAgbmFtZVswXSAhPT0gJ0AnLFxuICAgICAgYFlvdSBjYWxsZWQgYnVpbGRlcnMudmFyKCkgd2l0aCAnJHtuYW1lfScuIENhbGwgYnVpbGRlcnMuYXQoJyR7bmFtZX0nKSBpbnN0ZWFkYFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkxvY2FsVmFyUmVmZXJlbmNlKHtcbiAgICAgIGxvYyxcbiAgICAgIG5hbWUsXG4gICAgICBpc1RlbXBsYXRlTG9jYWwsXG4gICAgICBzeW1ib2wsXG4gICAgfSk7XG4gIH1cblxuICBzZXhwKHBhcnRzOiBDYWxsUGFydHMsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkNhbGxFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkNhbGxFeHByZXNzaW9uKHtcbiAgICAgIGxvYyxcbiAgICAgIGNhbGxlZTogcGFydHMuY2FsbGVlLFxuICAgICAgYXJnczogcGFydHMuYXJncyxcbiAgICB9KTtcbiAgfVxuXG4gIGRlcHJlY2F0ZWRDYWxsKFxuICAgIGFyZzogU291cmNlU2xpY2UsXG4gICAgY2FsbGVlOiBBU1R2Mi5GcmVlVmFyUmVmZXJlbmNlLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQVNUdjIuRGVwcmVjYXRlZENhbGxFeHByZXNzaW9uKHtcbiAgICAgIGxvYyxcbiAgICAgIGFyZyxcbiAgICAgIGNhbGxlZSxcbiAgICB9KTtcbiAgfVxuXG4gIGludGVycG9sYXRlKHBhcnRzOiBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5JbnRlcnBvbGF0ZUV4cHJlc3Npb24ge1xuICAgIGFzc2VydFByZXNlbnQocGFydHMpO1xuXG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5JbnRlcnBvbGF0ZUV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgcGFydHMsXG4gICAgfSk7XG4gIH1cblxuICBsaXRlcmFsKHZhbHVlOiBzdHJpbmcsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uICYgeyB2YWx1ZTogc3RyaW5nIH07XG4gIGxpdGVyYWwodmFsdWU6IG51bWJlciwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiBudW1iZXIgfTtcbiAgbGl0ZXJhbCh2YWx1ZTogYm9vbGVhbiwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiBib29sZWFuIH07XG4gIGxpdGVyYWwodmFsdWU6IG51bGwsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uICYgeyB2YWx1ZTogbnVsbCB9O1xuICBsaXRlcmFsKHZhbHVlOiB1bmRlZmluZWQsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uICYgeyB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIGxpdGVyYWwoXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbjtcbiAgbGl0ZXJhbChcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uKHtcbiAgICAgIGxvYyxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gU1RBVEVNRU5UUyAvL1xuXG4gIGFwcGVuZChcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRydXN0aW5nLFxuICAgICAgdmFsdWUsXG4gICAgfTogeyB0YWJsZTogU3ltYm9sVGFibGU7IHRydXN0aW5nOiBib29sZWFuOyB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfSxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuQXBwZW5kQ29udGVudCB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5BcHBlbmRDb250ZW50KHtcbiAgICAgIHRhYmxlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgICB2YWx1ZSxcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIG1vZGlmaWVyKHsgY2FsbGVlLCBhcmdzIH06IENhbGxQYXJ0cywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuRWxlbWVudE1vZGlmaWVyIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkVsZW1lbnRNb2RpZmllcih7XG4gICAgICBsb2MsXG4gICAgICBjYWxsZWUsXG4gICAgICBhcmdzLFxuICAgIH0pO1xuICB9XG5cbiAgbmFtZWRCbG9ja3MoYmxvY2tzOiBBU1R2Mi5OYW1lZEJsb2NrW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLk5hbWVkQmxvY2tzIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLk5hbWVkQmxvY2tzKHtcbiAgICAgIGxvYyxcbiAgICAgIGJsb2NrcyxcbiAgICB9KTtcbiAgfVxuXG4gIGJsb2NrU3RhdGVtZW50KFxuICAgIHtcbiAgICAgIHN5bWJvbHMsXG4gICAgICBwcm9ncmFtLFxuICAgICAgaW52ZXJzZSA9IG51bGwsXG4gICAgICAuLi5jYWxsXG4gICAgfToge1xuICAgICAgc3ltYm9sczogU3ltYm9sVGFibGU7XG4gICAgICBwcm9ncmFtOiBBU1R2Mi5CbG9jaztcbiAgICAgIGludmVyc2U/OiBBU1R2Mi5CbG9jayB8IG51bGw7XG4gICAgfSAmIENhbGxQYXJ0cyxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuSW52b2tlQmxvY2sge1xuICAgIGxldCBibG9ja3NMb2MgPSBwcm9ncmFtLmxvYztcbiAgICBsZXQgYmxvY2tzOiBQcmVzZW50QXJyYXk8QVNUdjIuTmFtZWRCbG9jaz4gPSBbXG4gICAgICB0aGlzLm5hbWVkQmxvY2soU291cmNlU2xpY2Uuc3ludGhldGljKCdkZWZhdWx0JyksIHByb2dyYW0sIHByb2dyYW0ubG9jKSxcbiAgICBdO1xuICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICBibG9ja3NMb2MgPSBibG9ja3NMb2MuZXh0ZW5kKGludmVyc2UubG9jKTtcbiAgICAgIGJsb2Nrcy5wdXNoKHRoaXMubmFtZWRCbG9jayhTb3VyY2VTbGljZS5zeW50aGV0aWMoJ2Vsc2UnKSwgaW52ZXJzZSwgaW52ZXJzZS5sb2MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkludm9rZUJsb2NrKHtcbiAgICAgIGxvYyxcbiAgICAgIGJsb2NrczogdGhpcy5uYW1lZEJsb2NrcyhibG9ja3MsIGJsb2Nrc0xvYyksXG4gICAgICBjYWxsZWU6IGNhbGwuY2FsbGVlLFxuICAgICAgYXJnczogY2FsbC5hcmdzLFxuICAgIH0pO1xuICB9XG5cbiAgZWxlbWVudChvcHRpb25zOiBCdWlsZEJhc2VFbGVtZW50KTogQnVpbGRFbGVtZW50IHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkRWxlbWVudChvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQmFzZUVsZW1lbnQge1xuICBzZWxmQ2xvc2luZzogYm9vbGVhbjtcbiAgYXR0cnM6IEFTVHYyLkh0bWxPclNwbGF0QXR0cltdO1xuICBjb21wb25lbnRBcmdzOiBBU1R2Mi5Db21wb25lbnRBcmdbXTtcbiAgbW9kaWZpZXJzOiBBU1R2Mi5FbGVtZW50TW9kaWZpZXJbXTtcbiAgY29tbWVudHM6IEFTVHYyLkdsaW1tZXJDb21tZW50W107XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZEVsZW1lbnQge1xuICByZWFkb25seSBidWlsZGVyOiBCdWlsZGVyO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBiYXNlOiBCdWlsZEJhc2VFbGVtZW50KSB7XG4gICAgdGhpcy5idWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgfVxuXG4gIHNpbXBsZSh0YWc6IFNvdXJjZVNsaWNlLCBib2R5OiBBU1R2Mi5Db250ZW50Tm9kZVtdLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5TaW1wbGVFbGVtZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLlNpbXBsZUVsZW1lbnQoXG4gICAgICBhc3NpZ24oXG4gICAgICAgIHtcbiAgICAgICAgICB0YWcsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBjb21wb25lbnRBcmdzOiBbXSxcbiAgICAgICAgICBsb2MsXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuYmFzZVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBuYW1lZChuYW1lOiBTb3VyY2VTbGljZSwgYmxvY2s6IEFTVHYyLkJsb2NrLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5OYW1lZEJsb2NrIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLk5hbWVkQmxvY2soXG4gICAgICBhc3NpZ24oXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgIGNvbXBvbmVudEFyZ3M6IFtdLFxuICAgICAgICAgIGxvYyxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHNlbGZDbG9zaW5nQ29tcG9uZW50KGNhbGxlZTogQVNUdjIuRXhwcmVzc2lvbk5vZGUsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkludm9rZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5JbnZva2VDb21wb25lbnQoXG4gICAgICBhc3NpZ24oXG4gICAgICAgIHtcbiAgICAgICAgICBsb2MsXG4gICAgICAgICAgY2FsbGVlLFxuICAgICAgICAgIC8vIHBvaW50IHRoZSBlbXB0eSBuYW1lZCBibG9ja3MgYXQgdGhlIGAvYCBzZWxmLWNsb3NpbmcgdGFnXG4gICAgICAgICAgYmxvY2tzOiBuZXcgQVNUdjIuTmFtZWRCbG9ja3Moe1xuICAgICAgICAgICAgYmxvY2tzOiBbXSxcbiAgICAgICAgICAgIGxvYzogbG9jLnNsaWNlRW5kQ2hhcnMoeyBza2lwRW5kOiAxLCBjaGFyczogMSB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpdGhEZWZhdWx0QmxvY2soXG4gICAgY2FsbGVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSxcbiAgICBjaGlsZHJlbjogQVNUdjIuQ29udGVudE5vZGVbXSxcbiAgICBzeW1ib2xzOiBCbG9ja1N5bWJvbFRhYmxlLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5JbnZva2VDb21wb25lbnQge1xuICAgIGxldCBibG9jayA9IHRoaXMuYnVpbGRlci5ibG9jayhzeW1ib2xzLCBjaGlsZHJlbiwgbG9jKTtcbiAgICBsZXQgbmFtZWRCbG9jayA9IHRoaXMuYnVpbGRlci5uYW1lZEJsb2NrKFNvdXJjZVNsaWNlLnN5bnRoZXRpYygnZGVmYXVsdCcpLCBibG9jaywgbG9jKTsgLy8gQlVJTERFUi5zaW1wbGVOYW1lZEJsb2NrKCdkZWZhdWx0JywgY2hpbGRyZW4sIHN5bWJvbHMsIGxvYyk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkludm9rZUNvbXBvbmVudChcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIGxvYyxcbiAgICAgICAgICBjYWxsZWUsXG4gICAgICAgICAgYmxvY2tzOiB0aGlzLmJ1aWxkZXIubmFtZWRCbG9ja3MoW25hbWVkQmxvY2tdLCBuYW1lZEJsb2NrLmxvYyksXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuYmFzZVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBjb21wb25lbnRXaXRoTmFtZWRCbG9ja3MoXG4gICAgY2FsbGVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSxcbiAgICBibG9ja3M6IFByZXNlbnRBcnJheTxBU1R2Mi5OYW1lZEJsb2NrPixcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuSW52b2tlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkludm9rZUNvbXBvbmVudChcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIGxvYyxcbiAgICAgICAgICBjYWxsZWUsXG4gICAgICAgICAgYmxvY2tzOiB0aGlzLmJ1aWxkZXIubmFtZWRCbG9ja3MoYmxvY2tzLCBTcGFuTGlzdC5yYW5nZShibG9ja3MpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==