public-builders.js 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _util = require("@glimmer/util");
  7. var _location = require("../source/location");
  8. var _source2 = require("../source/source");
  9. var _span = require("../source/span");
  10. var _legacyInterop = require("./legacy-interop");
  11. let _SOURCE;
  12. function SOURCE() {
  13. if (!_SOURCE) {
  14. _SOURCE = new _source2.Source('', '(synthetic)');
  15. }
  16. return _SOURCE;
  17. }
  18. function buildMustache(path, params, hash, raw, loc, strip) {
  19. if (typeof path === 'string') {
  20. path = buildPath(path);
  21. }
  22. return {
  23. type: 'MustacheStatement',
  24. path,
  25. params: params || [],
  26. hash: hash || buildHash([]),
  27. escaped: !raw,
  28. trusting: !!raw,
  29. loc: buildLoc(loc || null),
  30. strip: strip || {
  31. open: false,
  32. close: false
  33. }
  34. };
  35. }
  36. function buildBlock(path, params, hash, _defaultBlock, _elseBlock, loc, openStrip, inverseStrip, closeStrip) {
  37. let defaultBlock;
  38. let elseBlock;
  39. if (_defaultBlock.type === 'Template') {
  40. if (false
  41. /* LOCAL_DEBUG */
  42. ) {
  43. false && !false && (0, _util.deprecate)(`b.program is deprecated. Use b.blockItself instead.`);
  44. }
  45. defaultBlock = (0, _util.assign)({}, _defaultBlock, {
  46. type: 'Block'
  47. });
  48. } else {
  49. defaultBlock = _defaultBlock;
  50. }
  51. if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') {
  52. if (false
  53. /* LOCAL_DEBUG */
  54. ) {
  55. false && !false && (0, _util.deprecate)(`b.program is deprecated. Use b.blockItself instead.`);
  56. }
  57. elseBlock = (0, _util.assign)({}, _elseBlock, {
  58. type: 'Block'
  59. });
  60. } else {
  61. elseBlock = _elseBlock;
  62. }
  63. return {
  64. type: 'BlockStatement',
  65. path: buildPath(path),
  66. params: params || [],
  67. hash: hash || buildHash([]),
  68. program: defaultBlock || null,
  69. inverse: elseBlock || null,
  70. loc: buildLoc(loc || null),
  71. openStrip: openStrip || {
  72. open: false,
  73. close: false
  74. },
  75. inverseStrip: inverseStrip || {
  76. open: false,
  77. close: false
  78. },
  79. closeStrip: closeStrip || {
  80. open: false,
  81. close: false
  82. }
  83. };
  84. }
  85. function buildElementModifier(path, params, hash, loc) {
  86. return {
  87. type: 'ElementModifierStatement',
  88. path: buildPath(path),
  89. params: params || [],
  90. hash: hash || buildHash([]),
  91. loc: buildLoc(loc || null)
  92. };
  93. }
  94. function buildPartial(name, params, hash, indent, loc) {
  95. return {
  96. type: 'PartialStatement',
  97. name: name,
  98. params: params || [],
  99. hash: hash || buildHash([]),
  100. indent: indent || '',
  101. strip: {
  102. open: false,
  103. close: false
  104. },
  105. loc: buildLoc(loc || null)
  106. };
  107. }
  108. function buildComment(value, loc) {
  109. return {
  110. type: 'CommentStatement',
  111. value: value,
  112. loc: buildLoc(loc || null)
  113. };
  114. }
  115. function buildMustacheComment(value, loc) {
  116. return {
  117. type: 'MustacheCommentStatement',
  118. value: value,
  119. loc: buildLoc(loc || null)
  120. };
  121. }
  122. function buildConcat(parts, loc) {
  123. if (!(0, _util.isPresent)(parts)) {
  124. throw new Error(`b.concat requires at least one part`);
  125. }
  126. return {
  127. type: 'ConcatStatement',
  128. parts: parts || [],
  129. loc: buildLoc(loc || null)
  130. };
  131. }
  132. function buildElement(tag, options) {
  133. let {
  134. attrs,
  135. blockParams,
  136. modifiers,
  137. comments,
  138. children,
  139. loc
  140. } = options;
  141. let tagName; // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST
  142. let selfClosing = false;
  143. if (typeof tag === 'object') {
  144. selfClosing = tag.selfClosing;
  145. tagName = tag.name;
  146. } else if (tag.slice(-1) === '/') {
  147. tagName = tag.slice(0, -1);
  148. selfClosing = true;
  149. } else {
  150. tagName = tag;
  151. }
  152. return {
  153. type: 'ElementNode',
  154. tag: tagName,
  155. selfClosing: selfClosing,
  156. attributes: attrs || [],
  157. blockParams: blockParams || [],
  158. modifiers: modifiers || [],
  159. comments: comments || [],
  160. children: children || [],
  161. loc: buildLoc(loc || null)
  162. };
  163. }
  164. function buildAttr(name, value, loc) {
  165. return {
  166. type: 'AttrNode',
  167. name: name,
  168. value: value,
  169. loc: buildLoc(loc || null)
  170. };
  171. }
  172. function buildText(chars, loc) {
  173. return {
  174. type: 'TextNode',
  175. chars: chars || '',
  176. loc: buildLoc(loc || null)
  177. };
  178. } // Expressions
  179. function buildSexpr(path, params, hash, loc) {
  180. return {
  181. type: 'SubExpression',
  182. path: buildPath(path),
  183. params: params || [],
  184. hash: hash || buildHash([]),
  185. loc: buildLoc(loc || null)
  186. };
  187. }
  188. function headToString(head) {
  189. switch (head.type) {
  190. case 'AtHead':
  191. return {
  192. original: head.name,
  193. parts: [head.name]
  194. };
  195. case 'ThisHead':
  196. return {
  197. original: `this`,
  198. parts: []
  199. };
  200. case 'VarHead':
  201. return {
  202. original: head.name,
  203. parts: [head.name]
  204. };
  205. }
  206. }
  207. function buildHead(original, loc) {
  208. let [head, ...tail] = original.split('.');
  209. let headNode;
  210. if (head === 'this') {
  211. headNode = {
  212. type: 'ThisHead',
  213. loc: buildLoc(loc || null)
  214. };
  215. } else if (head[0] === '@') {
  216. headNode = {
  217. type: 'AtHead',
  218. name: head,
  219. loc: buildLoc(loc || null)
  220. };
  221. } else {
  222. headNode = {
  223. type: 'VarHead',
  224. name: head,
  225. loc: buildLoc(loc || null)
  226. };
  227. }
  228. return {
  229. head: headNode,
  230. tail
  231. };
  232. }
  233. function buildThis(loc) {
  234. return {
  235. type: 'ThisHead',
  236. loc: buildLoc(loc || null)
  237. };
  238. }
  239. function buildAtName(name, loc) {
  240. // the `@` should be included so we have a complete source range
  241. false && (0, _util.assert)(name[0] === '@', `call builders.at() with a string that starts with '@'`);
  242. return {
  243. type: 'AtHead',
  244. name,
  245. loc: buildLoc(loc || null)
  246. };
  247. }
  248. function buildVar(name, loc) {
  249. false && (0, _util.assert)(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`);
  250. false && (0, _util.assert)(name[0] !== '@', `You called builders.var() with '${name}'. Call builders.at('${name}') instead`);
  251. return {
  252. type: 'VarHead',
  253. name,
  254. loc: buildLoc(loc || null)
  255. };
  256. }
  257. function buildHeadFromString(head, loc) {
  258. if (head[0] === '@') {
  259. return buildAtName(head, loc);
  260. } else if (head === 'this') {
  261. return buildThis(loc);
  262. } else {
  263. return buildVar(head, loc);
  264. }
  265. }
  266. function buildNamedBlockName(name, loc) {
  267. return {
  268. type: 'NamedBlockName',
  269. name,
  270. loc: buildLoc(loc || null)
  271. };
  272. }
  273. function buildCleanPath(head, tail, loc) {
  274. let {
  275. original: originalHead,
  276. parts: headParts
  277. } = headToString(head);
  278. let parts = [...headParts, ...tail];
  279. let original = [...originalHead, ...parts].join('.');
  280. return new _legacyInterop.PathExpressionImplV1(original, head, tail, buildLoc(loc || null));
  281. }
  282. function buildPath(path, loc) {
  283. if (typeof path !== 'string') {
  284. if ('type' in path) {
  285. return path;
  286. } else {
  287. let {
  288. head,
  289. tail
  290. } = buildHead(path.head, _span.SourceSpan.broken());
  291. false && (0, _util.assert)(tail.length === 0, `builder.path({ head, tail }) should not be called with a head with dots in it`);
  292. let {
  293. original: originalHead
  294. } = headToString(head);
  295. return new _legacyInterop.PathExpressionImplV1([originalHead, ...tail].join('.'), head, tail, buildLoc(loc || null));
  296. }
  297. }
  298. let {
  299. head,
  300. tail
  301. } = buildHead(path, _span.SourceSpan.broken());
  302. return new _legacyInterop.PathExpressionImplV1(path, head, tail, buildLoc(loc || null));
  303. }
  304. function buildLiteral(type, value, loc) {
  305. return {
  306. type,
  307. value,
  308. original: value,
  309. loc: buildLoc(loc || null)
  310. };
  311. } // Miscellaneous
  312. function buildHash(pairs, loc) {
  313. return {
  314. type: 'Hash',
  315. pairs: pairs || [],
  316. loc: buildLoc(loc || null)
  317. };
  318. }
  319. function buildPair(key, value, loc) {
  320. return {
  321. type: 'HashPair',
  322. key: key,
  323. value,
  324. loc: buildLoc(loc || null)
  325. };
  326. }
  327. function buildProgram(body, blockParams, loc) {
  328. return {
  329. type: 'Template',
  330. body: body || [],
  331. blockParams: blockParams || [],
  332. loc: buildLoc(loc || null)
  333. };
  334. }
  335. function buildBlockItself(body, blockParams, chained = false, loc) {
  336. return {
  337. type: 'Block',
  338. body: body || [],
  339. blockParams: blockParams || [],
  340. chained,
  341. loc: buildLoc(loc || null)
  342. };
  343. }
  344. function buildTemplate(body, blockParams, loc) {
  345. return {
  346. type: 'Template',
  347. body: body || [],
  348. blockParams: blockParams || [],
  349. loc: buildLoc(loc || null)
  350. };
  351. }
  352. function buildPosition(line, column) {
  353. return {
  354. line,
  355. column
  356. };
  357. }
  358. function buildLoc(...args) {
  359. if (args.length === 1) {
  360. let loc = args[0];
  361. if (loc && typeof loc === 'object') {
  362. return _span.SourceSpan.forHbsLoc(SOURCE(), loc);
  363. } else {
  364. return _span.SourceSpan.forHbsLoc(SOURCE(), _location.SYNTHETIC_LOCATION);
  365. }
  366. } else {
  367. let [startLine, startColumn, endLine, endColumn, _source] = args;
  368. let source = _source ? new _source2.Source('', _source) : SOURCE();
  369. return _span.SourceSpan.forHbsLoc(source, {
  370. start: {
  371. line: startLine,
  372. column: startColumn
  373. },
  374. end: {
  375. line: endLine,
  376. column: endColumn
  377. }
  378. });
  379. }
  380. }
  381. var _default = {
  382. mustache: buildMustache,
  383. block: buildBlock,
  384. partial: buildPartial,
  385. comment: buildComment,
  386. mustacheComment: buildMustacheComment,
  387. element: buildElement,
  388. elementModifier: buildElementModifier,
  389. attr: buildAttr,
  390. text: buildText,
  391. sexpr: buildSexpr,
  392. concat: buildConcat,
  393. hash: buildHash,
  394. pair: buildPair,
  395. literal: buildLiteral,
  396. program: buildProgram,
  397. blockItself: buildBlockItself,
  398. template: buildTemplate,
  399. loc: buildLoc,
  400. pos: buildPosition,
  401. path: buildPath,
  402. fullPath: buildCleanPath,
  403. head: buildHeadFromString,
  404. at: buildAtName,
  405. var: buildVar,
  406. this: buildThis,
  407. blockName: buildNamedBlockName,
  408. string: literal('StringLiteral'),
  409. boolean: literal('BooleanLiteral'),
  410. number: literal('NumberLiteral'),
  411. undefined() {
  412. return buildLiteral('UndefinedLiteral', undefined);
  413. },
  414. null() {
  415. return buildLiteral('NullLiteral', null);
  416. }
  417. };
  418. exports.default = _default;
  419. function literal(type) {
  420. return function (value, loc) {
  421. return buildLiteral(type, value, loc);
  422. };
  423. }
  424. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQSxJQUFBLE9BQUE7O0FBRUEsU0FBQSxNQUFBLEdBQWU7QUFDYixNQUFJLENBQUosT0FBQSxFQUFjO0FBQ1osSUFBQSxPQUFPLEdBQUcsSUFBQSxlQUFBLENBQUEsRUFBQSxFQUFWLGFBQVUsQ0FBVjtBQUNEOztBQUVELFNBQUEsT0FBQTtBQUNEOztBQVNELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsS0FBQSxFQU0wQjtBQUV4QixNQUFJLE9BQUEsSUFBQSxLQUFKLFFBQUEsRUFBOEI7QUFDNUIsSUFBQSxJQUFJLEdBQUcsU0FBUyxDQUFoQixJQUFnQixDQUFoQjtBQUNEOztBQUVELFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxtQkFBQTtBQUFBLElBQUEsSUFBQTtBQUdMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFIVCxFQUFBO0FBSUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FKbEIsRUFJa0IsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxDQUxKLEdBQUE7QUFNTCxJQUFBLFFBQVEsRUFBRSxDQUFDLENBTk4sR0FBQTtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBUFosSUFPUSxDQVBSO0FBUUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUUsTUFBQSxJQUFJLEVBQU4sS0FBQTtBQUFlLE1BQUEsS0FBSyxFQUFFO0FBQXRCO0FBUlgsR0FBUDtBQVVEOztBQUVELFNBQUEsVUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxFQUFBLGFBQUEsRUFBQSxVQUFBLEVBQUEsR0FBQSxFQUFBLFNBQUEs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QU8sQ0FqQ0YsZUFpQ0UsQ0FqQ0Y7O0FBa0NiLEVBQUEsU0FBUyxHQUFBO0FBQ1AsV0FBTyxZQUFZLENBQUEsa0JBQUEsRUFBbkIsU0FBbUIsQ0FBbkI7QUFuQ1csR0FBQTs7QUFxQ2IsRUFBQSxJQUFJLEdBQUE7QUFDRixXQUFPLFlBQVksQ0FBQSxhQUFBLEVBQW5CLElBQW1CLENBQW5CO0FBQ0Q7O0FBdkNZLEM7OztBQTRDZixTQUFBLE9BQUEsQ0FBQSxJQUFBLEVBQXlEO0FBQ3ZELFNBQU8sVUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFpRDtBQUN0RCxXQUFPLFlBQVksQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFuQixHQUFtQixDQUFuQjtBQURGLEdBQUE7QUFHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfREVCVUcgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2lnbiwgZGVwcmVjYXRlLCBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgU291cmNlTG9jYXRpb24sIFNvdXJjZVBvc2l0aW9uLCBTWU5USEVUSUNfTE9DQVRJT04gfSBmcm9tICcuLi9zb3VyY2UvbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vc291cmNlL3NvdXJjZSc7XG5pbXBvcnQgeyBTb3VyY2VTcGFuIH0gZnJvbSAnLi4vc291cmNlL3NwYW4nO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgUGF0aEV4cHJlc3Npb25JbXBsVjEgfSBmcm9tICcuL2xlZ2FjeS1pbnRlcm9wJztcblxubGV0IF9TT1VSQ0U6IFNvdXJjZSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gU09VUkNFKCk6IFNvdXJjZSB7XG4gIGlmICghX1NPVVJDRSkge1xuICAgIF9TT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHN5bnRoZXRpYyknKTtcbiAgfVxuXG4gIHJldHVybiBfU09VUkNFO1xufVxuXG4vLyBjb25zdCBTT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHRlc3RzKScpO1xuXG4vLyBTdGF0ZW1lbnRzXG5cbmV4cG9ydCB0eXBlIEJ1aWxkZXJIZWFkID0gc3RyaW5nIHwgQVNUdjEuRXhwcmVzc2lvbjtcbmV4cG9ydCB0eXBlIFRhZ0Rlc2NyaXB0b3IgPSBzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgc2VsZkNsb3Npbmc6IGJvb2xlYW4gfTtcblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZShcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5MaXRlcmFsLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICByYXc/OiBib29sZWFuLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgc3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzXG4pOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gYnVpbGRQYXRoKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVTdGF0ZW1lbnQnLFxuICAgIHBhdGgsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGVzY2FwZWQ6ICFyYXcsXG4gICAgdHJ1c3Rpbmc6ICEhcmF3LFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIHN0cmlwOiBzdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9jayhcbiAgcGF0aDogQnVpbGRlckhlYWQsXG4gIHBhcmFtczogT3B0aW9uPEFTVHYxLkV4cHJlc3Npb25bXT4sXG4gIGhhc2g6IE9wdGlvbjxBU1R2MS5IYXNoPixcbiAgX2RlZmF1bHRCbG9jazogQVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2ssXG4gIF9lbHNlQmxvY2s/OiBPcHRpb248QVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2s+LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgb3BlblN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgaW52ZXJzZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgY2xvc2VTdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLkJsb2NrU3RhdGVtZW50IHtcbiAgbGV0IGRlZmF1bHRCbG9jazogQVNUdjEuQmxvY2s7XG4gIGxldCBlbHNlQmxvY2s6IE9wdGlvbjxBU1R2MS5CbG9jaz4gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKF9kZWZhdWx0QmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0QmxvY2sgPSAoYXNzaWduKHt9LCBfZGVmYXVsdEJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdEJsb2NrID0gX2RlZmF1bHRCbG9jaztcbiAgfVxuXG4gIGlmIChfZWxzZUJsb2NrICE9PSB1bmRlZmluZWQgJiYgX2Vsc2VCbG9jayAhPT0gbnVsbCAmJiBfZWxzZUJsb2NrLnR5cGUgPT09ICdUZW1wbGF0ZScpIHtcbiAgICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICAgIGRlcHJlY2F0ZShgYi5wcm9ncmFtIGlzIGRlcHJlY2F0ZWQuIFVzZSBiLmJsb2NrSXRzZWxmIGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgZWxzZUJsb2NrID0gKGFzc2lnbih7fSwgX2Vsc2VCbG9jaywgeyB0eXBlOiAnQmxvY2snIH0pIGFzIHVua25vd24pIGFzIEFTVHYxLkJsb2NrO1xuICB9IGVsc2Uge1xuICAgIGVsc2VCbG9jayA9IF9lbHNlQmxvY2s7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCbG9ja1N0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBwcm9ncmFtOiBkZWZhdWx0QmxvY2sgfHwgbnVsbCxcbiAgICBpbnZlcnNlOiBlbHNlQmxvY2sgfHwgbnVsbCxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICBvcGVuU3RyaXA6IG9wZW5TdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBpbnZlcnNlU3RyaXA6IGludmVyc2VTdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBjbG9zZVN0cmlwOiBjbG9zZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnRNb2RpZmllcihcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBPcHRpb248U291cmNlTG9jYXRpb24+XG4pOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFydGlhbChcbiAgbmFtZTogQVNUdjEuUGF0aEV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGluZGVudD86IHN0cmluZyxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhcnRpYWxTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBpbmRlbnQ6IGluZGVudCB8fCAnJyxcbiAgICBzdHJpcDogeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29tbWVudCh2YWx1ZTogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTXVzdGFjaGVDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29uY2F0KFxuICBwYXJ0czogKEFTVHYxLlRleHROb2RlIHwgQVNUdjEuTXVzdGFjaGVTdGF0ZW1lbnQpW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5Db25jYXRTdGF0ZW1lbnQge1xuICBpZiAoIWlzUHJlc2VudChwYXJ0cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGIuY29uY2F0IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBwYXJ0YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb25jYXRTdGF0ZW1lbnQnLFxuICAgIHBhcnRzOiBwYXJ0cyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuLy8gTm9kZXNcblxuZXhwb3J0IHR5cGUgRWxlbWVudFBhcnRzID1cbiAgfCBbJ2F0dHJzJywgLi4uQXR0clNleHBbXV1cbiAgfCBbJ21vZGlmaWVycycsIC4uLk1vZGlmaWVyU2V4cFtdXVxuICB8IFsnYm9keScsIC4uLkFTVHYxLlN0YXRlbWVudFtdXVxuICB8IFsnY29tbWVudHMnLCAuLi5FbGVtZW50Q29tbWVudFtdXVxuICB8IFsnYXMnLCAuLi5zdHJpbmdbXV1cbiAgfCBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgUGF0aFNleHAgPSBzdHJpbmcgfCBbJ3BhdGgnLCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTW9kaWZpZXJTZXhwID1cbiAgfCBzdHJpbmdcbiAgfCBbUGF0aFNleHAsIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBMb2NTZXhwP11cbiAgfCBbUGF0aFNleHAsIEFTVHYxLkV4cHJlc3Npb25bXSwgRGljdDxBU1R2MS5FeHByZXNzaW9uPiwgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBBdHRyU2V4cCA9IFtzdHJpbmcsIEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddIHwgc3RyaW5nLCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIExvY1NleHAgPSBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgRWxlbWVudENvbW1lbnQgPSBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQgfCBTb3VyY2VMb2NhdGlvbiB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2V4cFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBBU1R2MS5FeHByZXNzaW9uW11cbiAgfCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+XG4gIHwgTG9jU2V4cFxuICB8IFBhdGhTZXhwXG4gIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRWxlbWVudE9wdGlvbnMge1xuICBhdHRycz86IEFTVHYxLkF0dHJOb2RlW107XG4gIG1vZGlmaWVycz86IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudFtdO1xuICBjaGlsZHJlbj86IEFTVHYxLlN0YXRlbWVudFtdO1xuICBjb21tZW50cz86IEVsZW1lbnRDb21tZW50W107XG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW107XG4gIGxvYz86IFNvdXJjZVNwYW47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudCh0YWc6IFRhZ0Rlc2NyaXB0b3IsIG9wdGlvbnM6IEJ1aWxkRWxlbWVudE9wdGlvbnMpOiBBU1R2MS5FbGVtZW50Tm9kZSB7XG4gIGxldCB7IGF0dHJzLCBibG9ja1BhcmFtcywgbW9kaWZpZXJzLCBjb21tZW50cywgY2hpbGRyZW4sIGxvYyB9ID0gb3B0aW9ucztcblxuICBsZXQgdGFnTmFtZTogc3RyaW5nO1xuXG4gIC8vIHRoaXMgaXMgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdCwgcHJpb3IgdG8gYHNlbGZDbG9zaW5nYCBiZWluZyBwYXJ0IG9mIHRoZSBFbGVtZW50Tm9kZSBBU1RcbiAgbGV0IHNlbGZDbG9zaW5nID0gZmFsc2U7XG4gIGlmICh0eXBlb2YgdGFnID09PSAnb2JqZWN0Jykge1xuICAgIHNlbGZDbG9zaW5nID0gdGFnLnNlbGZDbG9zaW5nO1xuICAgIHRhZ05hbWUgPSB0YWcubmFtZTtcbiAgfSBlbHNlIGlmICh0YWcuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICB0YWdOYW1lID0gdGFnLnNsaWNlKDAsIC0xKTtcbiAgICBzZWxmQ2xvc2luZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGFnTmFtZSA9IHRhZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0VsZW1lbnROb2RlJyxcbiAgICB0YWc6IHRhZ05hbWUsXG4gICAgc2VsZkNsb3Npbmc6IHNlbGZDbG9zaW5nLFxuICAgIGF0dHJpYnV0ZXM6IGF0dHJzIHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBtb2RpZmllcnM6IG1vZGlmaWVycyB8fCBbXSxcbiAgICBjb21tZW50czogKGNvbW1lbnRzIGFzIEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudFtdKSB8fCBbXSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXR0cihcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5BdHRyTm9kZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0F0dHJOb2RlJyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXh0KGNoYXJzPzogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlRleHROb2RlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGV4dE5vZGUnLFxuICAgIGNoYXJzOiBjaGFycyB8fCAnJyxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuLy8gRXhwcmVzc2lvbnNcblxuZnVuY3Rpb24gYnVpbGRTZXhwcihcbiAgcGF0aDogQnVpbGRlckhlYWQsXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5TdWJFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnU3ViRXhwcmVzc2lvbicsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGVhZFRvU3RyaW5nKGhlYWQ6IEFTVHYxLlBhdGhIZWFkKTogeyBvcmlnaW5hbDogc3RyaW5nOyBwYXJ0czogc3RyaW5nW10gfSB7XG4gIHN3aXRjaCAoaGVhZC50eXBlKSB7XG4gICAgY2FzZSAnQXRIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBoZWFkLm5hbWUsIHBhcnRzOiBbaGVhZC5uYW1lXSB9O1xuICAgIGNhc2UgJ1RoaXNIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBgdGhpc2AsIHBhcnRzOiBbXSB9O1xuICAgIGNhc2UgJ1ZhckhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRIZWFkKFxuICBvcmlnaW5hbDogc3RyaW5nLFxuICBsb2M6IFNvdXJjZUxvY2F0aW9uXG4pOiB7IGhlYWQ6IEFTVHYxLlBhdGhIZWFkOyB0YWlsOiBzdHJpbmdbXSB9IHtcbiAgbGV0IFtoZWFkLCAuLi50YWlsXSA9IG9yaWdpbmFsLnNwbGl0KCcuJyk7XG4gIGxldCBoZWFkTm9kZTogQVNUdjEuUGF0aEhlYWQ7XG5cbiAgaWYgKGhlYWQgPT09ICd0aGlzJykge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ1RoaXNIZWFkJyxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaGVhZFswXSA9PT0gJ0AnKSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnQXRIZWFkJyxcbiAgICAgIG5hbWU6IGhlYWQsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ1ZhckhlYWQnLFxuICAgICAgbmFtZTogaGVhZCxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGhlYWQ6IGhlYWROb2RlLFxuICAgIHRhaWwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGhpcyhsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUaGlzSGVhZCcsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXROYW1lKG5hbWU6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgLy8gdGhlIGBAYCBzaG91bGQgYmUgaW5jbHVkZWQgc28gd2UgaGF2ZSBhIGNvbXBsZXRlIHNvdXJjZSByYW5nZVxuICBhc3NlcnQobmFtZVswXSA9PT0gJ0AnLCBgY2FsbCBidWlsZGVycy5hdCgpIHdpdGggYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCAnQCdgKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgIG5hbWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmFyKG5hbWU6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgYXNzZXJ0KG5hbWUgIT09ICd0aGlzJywgYFlvdSBjYWxsZWQgYnVpbGRlcnMudmFyKCkgd2l0aCAndGhpcycuIENhbGwgYnVpbGRlcnMudGhpcyBpbnN0ZWFkYCk7XG4gIGFzc2VydChcbiAgICBuYW1lWzBdICE9PSAnQCcsXG4gICAgYFlvdSBjYWxsZWQgYnVpbGRlcnMudmFyKCkgd2l0aCAnJHtuYW1lfScuIENhbGwgYnVpbGRlcnMuYXQoJyR7bmFtZX0nKSBpbnN0ZWFkYFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1ZhckhlYWQnLFxuICAgIG5hbWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGVhZEZyb21TdHJpbmcoaGVhZDogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICBpZiAoaGVhZFswXSA9PT0gJ0AnKSB7XG4gICAgcmV0dXJuIGJ1aWxkQXROYW1lKGhlYWQsIGxvYyk7XG4gIH0gZWxzZSBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgcmV0dXJuIGJ1aWxkVGhpcyhsb2MpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWlsZFZhcihoZWFkLCBsb2MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTmFtZWRCbG9ja05hbWUobmFtZTogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLk5hbWVkQmxvY2tOYW1lIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTmFtZWRCbG9ja05hbWUnLFxuICAgIG5hbWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xlYW5QYXRoKFxuICBoZWFkOiBBU1R2MS5QYXRoSGVhZCxcbiAgdGFpbDogc3RyaW5nW10sXG4gIGxvYzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhdGhFeHByZXNzaW9uIHtcbiAgbGV0IHsgb3JpZ2luYWw6IG9yaWdpbmFsSGVhZCwgcGFydHM6IGhlYWRQYXJ0cyB9ID0gaGVhZFRvU3RyaW5nKGhlYWQpO1xuICBsZXQgcGFydHMgPSBbLi4uaGVhZFBhcnRzLCAuLi50YWlsXTtcbiAgbGV0IG9yaWdpbmFsID0gWy4uLm9yaWdpbmFsSGVhZCwgLi4ucGFydHNdLmpvaW4oJy4nKTtcblxuICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKG9yaWdpbmFsLCBoZWFkLCB0YWlsLCBidWlsZExvYyhsb2MgfHwgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBidWlsZFBhdGgoXG4gIHBhdGg6IEFTVHYxLlBhdGhFeHByZXNzaW9uIHwgc3RyaW5nIHwgeyBoZWFkOiBzdHJpbmc7IHRhaWw6IHN0cmluZ1tdIH0sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoOiBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgocGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgoXG4gIHBhdGg6IEJ1aWxkZXJIZWFkIHwgQVNUdjEuRXhwcmVzc2lvbiB8IHsgaGVhZDogc3RyaW5nOyB0YWlsOiBzdHJpbmdbXSB9LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuRXhwcmVzc2lvbiB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICBpZiAoJ3R5cGUnIGluIHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgeyBoZWFkLCB0YWlsIH0gPSBidWlsZEhlYWQocGF0aC5oZWFkLCBTb3VyY2VTcGFuLmJyb2tlbigpKTtcblxuICAgICAgYXNzZXJ0KFxuICAgICAgICB0YWlsLmxlbmd0aCA9PT0gMCxcbiAgICAgICAgYGJ1aWxkZXIucGF0aCh7IGhlYWQsIHRhaWwgfSkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCBhIGhlYWQgd2l0aCBkb3RzIGluIGl0YFxuICAgICAgKTtcblxuICAgICAgbGV0IHsgb3JpZ2luYWw6IG9yaWdpbmFsSGVhZCB9ID0gaGVhZFRvU3RyaW5nKGhlYWQpO1xuXG4gICAgICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKFxuICAgICAgICBbb3JpZ2luYWxIZWFkLCAuLi50YWlsXS5qb2luKCcuJyksXG4gICAgICAgIGhlYWQsXG4gICAgICAgIHRhaWwsXG4gICAgICAgIGJ1aWxkTG9jKGxvYyB8fCBudWxsKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgeyBoZWFkLCB0YWlsIH0gPSBidWlsZEhlYWQocGF0aCwgU291cmNlU3Bhbi5icm9rZW4oKSk7XG5cbiAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShwYXRoLCBoZWFkLCB0YWlsLCBidWlsZExvYyhsb2MgfHwgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBidWlsZExpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+KFxuICB0eXBlOiBUWyd0eXBlJ10sXG4gIHZhbHVlOiBUWyd2YWx1ZSddLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogVCB7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB2YWx1ZSxcbiAgICBvcmlnaW5hbDogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH0gYXMgVDtcbn1cblxuLy8gTWlzY2VsbGFuZW91c1xuXG5mdW5jdGlvbiBidWlsZEhhc2gocGFpcnM/OiBBU1R2MS5IYXNoUGFpcltdLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkhhc2gge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdIYXNoJyxcbiAgICBwYWlyczogcGFpcnMgfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFpcihrZXk6IHN0cmluZywgdmFsdWU6IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuSGFzaFBhaXIge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdIYXNoUGFpcicsXG4gICAga2V5OiBrZXksXG4gICAgdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvZ3JhbShcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuVGVtcGxhdGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZW1wbGF0ZScsXG4gICAgYm9keTogYm9keSB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQmxvY2tJdHNlbGYoXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgY2hhaW5lZCA9IGZhbHNlLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuQmxvY2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCbG9jaycsXG4gICAgYm9keTogYm9keSB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgY2hhaW5lZCxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZShcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuVGVtcGxhdGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZW1wbGF0ZScsXG4gICAgYm9keTogYm9keSB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUG9zaXRpb24obGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFNvdXJjZVBvc2l0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBsaW5lLFxuICAgIGNvbHVtbixcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMb2MobG9jOiBPcHRpb248U291cmNlTG9jYXRpb24+KTogU291cmNlU3BhbjtcbmZ1bmN0aW9uIGJ1aWxkTG9jKFxuICBzdGFydExpbmU6IG51bWJlcixcbiAgc3RhcnRDb2x1bW46IG51bWJlcixcbiAgZW5kTGluZT86IG51bWJlcixcbiAgZW5kQ29sdW1uPzogbnVtYmVyLFxuICBzb3VyY2U/OiBzdHJpbmdcbik6IFNvdXJjZVNwYW47XG5cbmZ1bmN0aW9uIGJ1aWxkTG9jKC4uLmFyZ3M6IGFueVtdKTogU291cmNlU3BhbiB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIGxldCBsb2MgPSBhcmdzWzBdO1xuXG4gICAgaWYgKGxvYyAmJiB0eXBlb2YgbG9jID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKFNPVVJDRSgpLCBsb2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2MoU09VUkNFKCksIFNZTlRIRVRJQ19MT0NBVElPTik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBbc3RhcnRMaW5lLCBzdGFydENvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBfc291cmNlXSA9IGFyZ3M7XG4gICAgbGV0IHNvdXJjZSA9IF9zb3VyY2UgPyBuZXcgU291cmNlKCcnLCBfc291cmNlKSA6IFNPVVJDRSgpO1xuXG4gICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKHNvdXJjZSwge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uLFxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICBsaW5lOiBlbmRMaW5lLFxuICAgICAgICBjb2x1bW46IGVuZENvbHVtbixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBtdXN0YWNoZTogYnVpbGRNdXN0YWNoZSxcbiAgYmxvY2s6IGJ1aWxkQmxvY2ssXG4gIHBhcnRpYWw6IGJ1aWxkUGFydGlhbCxcbiAgY29tbWVudDogYnVpbGRDb21tZW50LFxuICBtdXN0YWNoZUNvbW1lbnQ6IGJ1aWxkTXVzdGFjaGVDb21tZW50LFxuICBlbGVtZW50OiBidWlsZEVsZW1lbnQsXG4gIGVsZW1lbnRNb2RpZmllcjogYnVpbGRFbGVtZW50TW9kaWZpZXIsXG4gIGF0dHI6IGJ1aWxkQXR0cixcbiAgdGV4dDogYnVpbGRUZXh0LFxuICBzZXhwcjogYnVpbGRTZXhwcixcblxuICBjb25jYXQ6IGJ1aWxkQ29uY2F0LFxuICBoYXNoOiBidWlsZEhhc2gsXG4gIHBhaXI6IGJ1aWxkUGFpcixcbiAgbGl0ZXJhbDogYnVpbGRMaXRlcmFsLFxuICBwcm9ncmFtOiBidWlsZFByb2dyYW0sXG4gIGJsb2NrSXRzZWxmOiBidWlsZEJsb2NrSXRzZWxmLFxuICB0ZW1wbGF0ZTogYnVpbGRUZW1wbGF0ZSxcbiAgbG9jOiBidWlsZExvYyxcbiAgcG9zOiBidWlsZFBvc2l0aW9uLFxuXG4gIHBhdGg6IGJ1aWxkUGF0aCxcblxuICBmdWxsUGF0aDogYnVpbGRDbGVhblBhdGgsXG4gIGhlYWQ6IGJ1aWxkSGVhZEZyb21TdHJpbmcsXG4gIGF0OiBidWlsZEF0TmFtZSxcbiAgdmFyOiBidWlsZFZhcixcbiAgdGhpczogYnVpbGRUaGlzLFxuICBibG9ja05hbWU6IGJ1aWxkTmFtZWRCbG9ja05hbWUsXG5cbiAgc3RyaW5nOiBsaXRlcmFsKCdTdHJpbmdMaXRlcmFsJykgYXMgKHZhbHVlOiBzdHJpbmcpID0+IEFTVHYxLlN0cmluZ0xpdGVyYWwsXG4gIGJvb2xlYW46IGxpdGVyYWwoJ0Jvb2xlYW5MaXRlcmFsJykgYXMgKHZhbHVlOiBib29sZWFuKSA9PiBBU1R2MS5Cb29sZWFuTGl0ZXJhbCxcbiAgbnVtYmVyOiBsaXRlcmFsKCdOdW1iZXJMaXRlcmFsJykgYXMgKHZhbHVlOiBudW1iZXIpID0+IEFTVHYxLk51bWJlckxpdGVyYWwsXG4gIHVuZGVmaW5lZCgpOiBBU1R2MS5VbmRlZmluZWRMaXRlcmFsIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKCdVbmRlZmluZWRMaXRlcmFsJywgdW5kZWZpbmVkKTtcbiAgfSxcbiAgbnVsbCgpOiBBU1R2MS5OdWxsTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCgnTnVsbExpdGVyYWwnLCBudWxsKTtcbiAgfSxcbn07XG5cbnR5cGUgQnVpbGRMaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPiA9ICh2YWx1ZTogVFsndmFsdWUnXSkgPT4gVDtcblxuZnVuY3Rpb24gbGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4odHlwZTogVFsndHlwZSddKTogQnVpbGRMaXRlcmFsPFQ+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZTogVFsndmFsdWUnXSwgbG9jPzogU291cmNlTG9jYXRpb24pOiBUIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKHR5cGUsIHZhbHVlLCBsb2MpO1xuICB9O1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==