parser-builders.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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 _legacyInterop = require("./legacy-interop");
  8. const DEFAULT_STRIP = {
  9. close: false,
  10. open: false
  11. };
  12. /**
  13. * The Parser Builder differentiates from the public builder API by:
  14. *
  15. * 1. Offering fewer different ways to instantiate nodes
  16. * 2. Mandating source locations
  17. */
  18. class Builders {
  19. pos(line, column) {
  20. return {
  21. line,
  22. column
  23. };
  24. }
  25. blockItself({
  26. body,
  27. blockParams,
  28. chained = false,
  29. loc
  30. }) {
  31. return {
  32. type: 'Block',
  33. body: body || [],
  34. blockParams: blockParams || [],
  35. chained,
  36. loc
  37. };
  38. }
  39. template({
  40. body,
  41. blockParams,
  42. loc
  43. }) {
  44. return {
  45. type: 'Template',
  46. body: body || [],
  47. blockParams: blockParams || [],
  48. loc
  49. };
  50. }
  51. mustache({
  52. path,
  53. params,
  54. hash,
  55. trusting,
  56. loc,
  57. strip = DEFAULT_STRIP
  58. }) {
  59. return {
  60. type: 'MustacheStatement',
  61. path,
  62. params,
  63. hash,
  64. escaped: !trusting,
  65. trusting,
  66. loc,
  67. strip: strip || {
  68. open: false,
  69. close: false
  70. }
  71. };
  72. }
  73. block({
  74. path,
  75. params,
  76. hash,
  77. defaultBlock,
  78. elseBlock = null,
  79. loc,
  80. openStrip = DEFAULT_STRIP,
  81. inverseStrip = DEFAULT_STRIP,
  82. closeStrip = DEFAULT_STRIP
  83. }) {
  84. return {
  85. type: 'BlockStatement',
  86. path: path,
  87. params,
  88. hash,
  89. program: defaultBlock,
  90. inverse: elseBlock,
  91. loc: loc,
  92. openStrip: openStrip,
  93. inverseStrip: inverseStrip,
  94. closeStrip: closeStrip
  95. };
  96. }
  97. comment(value, loc) {
  98. return {
  99. type: 'CommentStatement',
  100. value: value,
  101. loc
  102. };
  103. }
  104. mustacheComment(value, loc) {
  105. return {
  106. type: 'MustacheCommentStatement',
  107. value: value,
  108. loc
  109. };
  110. }
  111. concat(parts, loc) {
  112. return {
  113. type: 'ConcatStatement',
  114. parts,
  115. loc
  116. };
  117. }
  118. element({
  119. tag,
  120. selfClosing,
  121. attrs,
  122. blockParams,
  123. modifiers,
  124. comments,
  125. children,
  126. loc
  127. }) {
  128. return {
  129. type: 'ElementNode',
  130. tag,
  131. selfClosing: selfClosing,
  132. attributes: attrs || [],
  133. blockParams: blockParams || [],
  134. modifiers: modifiers || [],
  135. comments: comments || [],
  136. children: children || [],
  137. loc
  138. };
  139. }
  140. elementModifier({
  141. path,
  142. params,
  143. hash,
  144. loc
  145. }) {
  146. return {
  147. type: 'ElementModifierStatement',
  148. path,
  149. params,
  150. hash,
  151. loc
  152. };
  153. }
  154. attr({
  155. name,
  156. value,
  157. loc
  158. }) {
  159. return {
  160. type: 'AttrNode',
  161. name: name,
  162. value: value,
  163. loc
  164. };
  165. }
  166. text({
  167. chars,
  168. loc
  169. }) {
  170. return {
  171. type: 'TextNode',
  172. chars,
  173. loc
  174. };
  175. }
  176. sexpr({
  177. path,
  178. params,
  179. hash,
  180. loc
  181. }) {
  182. return {
  183. type: 'SubExpression',
  184. path,
  185. params,
  186. hash,
  187. loc
  188. };
  189. }
  190. path({
  191. head,
  192. tail,
  193. loc
  194. }) {
  195. let {
  196. original: originalHead
  197. } = headToString(head);
  198. let original = [...originalHead, ...tail].join('.');
  199. return new _legacyInterop.PathExpressionImplV1(original, head, tail, loc);
  200. }
  201. head(head, loc) {
  202. if (head[0] === '@') {
  203. return this.atName(head, loc);
  204. } else if (head === 'this') {
  205. return this.this(loc);
  206. } else {
  207. return this.var(head, loc);
  208. }
  209. }
  210. this(loc) {
  211. return {
  212. type: 'ThisHead',
  213. loc
  214. };
  215. }
  216. atName(name, loc) {
  217. // the `@` should be included so we have a complete source range
  218. false && (0, _util.assert)(name[0] === '@', `call builders.at() with a string that starts with '@'`);
  219. return {
  220. type: 'AtHead',
  221. name,
  222. loc
  223. };
  224. }
  225. var(name, loc) {
  226. false && (0, _util.assert)(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`);
  227. false && (0, _util.assert)(name[0] !== '@', `You called builders.var() with '${name}'. Call builders.at('${name}') instead`);
  228. return {
  229. type: 'VarHead',
  230. name,
  231. loc
  232. };
  233. }
  234. hash(pairs, loc) {
  235. return {
  236. type: 'Hash',
  237. pairs: pairs || [],
  238. loc
  239. };
  240. }
  241. pair({
  242. key,
  243. value,
  244. loc
  245. }) {
  246. return {
  247. type: 'HashPair',
  248. key: key,
  249. value,
  250. loc
  251. };
  252. }
  253. literal({
  254. type,
  255. value,
  256. loc
  257. }) {
  258. return {
  259. type,
  260. value,
  261. original: value,
  262. loc
  263. };
  264. }
  265. undefined() {
  266. return this.literal({
  267. type: 'UndefinedLiteral',
  268. value: undefined
  269. });
  270. }
  271. null() {
  272. return this.literal({
  273. type: 'NullLiteral',
  274. value: null
  275. });
  276. }
  277. string(value, loc) {
  278. return this.literal({
  279. type: 'StringLiteral',
  280. value,
  281. loc
  282. });
  283. }
  284. boolean(value, loc) {
  285. return this.literal({
  286. type: 'BooleanLiteral',
  287. value,
  288. loc
  289. });
  290. }
  291. number(value, loc) {
  292. return this.literal({
  293. type: 'NumberLiteral',
  294. value,
  295. loc
  296. });
  297. }
  298. } // Expressions
  299. function headToString(head) {
  300. switch (head.type) {
  301. case 'AtHead':
  302. return {
  303. original: head.name,
  304. parts: [head.name]
  305. };
  306. case 'ThisHead':
  307. return {
  308. original: `this`,
  309. parts: []
  310. };
  311. case 'VarHead':
  312. return {
  313. original: head.name,
  314. parts: [head.name]
  315. };
  316. }
  317. }
  318. var _default = new Builders();
  319. exports.default = _default;
  320. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcGFyc2VyLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFNQTs7QUFFQSxNQUFNLGFBQWEsR0FBRztBQUNwQixFQUFBLEtBQUssRUFEZSxLQUFBO0FBRXBCLEVBQUEsSUFBSSxFQUFFO0FBRmMsQ0FBdEI7QUFLQTs7Ozs7OztBQU1BLE1BQUEsUUFBQSxDQUFjO0FBQ1osRUFBQSxHQUFHLENBQUEsSUFBQSxFQUFBLE1BQUEsRUFBNkI7QUFDOUIsV0FBTztBQUFBLE1BQUEsSUFBQTtBQUVMLE1BQUE7QUFGSyxLQUFQO0FBSUQ7O0FBRUQsRUFBQSxXQUFXLENBQUM7QUFBQSxJQUFBLElBQUE7QUFBQSxJQUFBLFdBQUE7QUFHVixJQUFBLE9BQU8sR0FIRyxLQUFBO0FBSVYsSUFBQTtBQUpVLEdBQUQsRUFVVjtBQUNDLFdBQU87QUFDTCxNQUFBLElBQUksRUFEQyxPQUFBO0FBRUwsTUFBQSxJQUFJLEVBQUUsSUFBSSxJQUZMLEVBQUE7QUFHTCxNQUFBLFdBQVcsRUFBRSxXQUFXLElBSG5CLEVBQUE7QUFBQSxNQUFBLE9BQUE7QUFLTCxNQUFBO0FBTEssS0FBUDtBQU9EOztBQUVELEVBQUEsUUFBUSxDQUFDO0FBQUEsSUFBQSxJQUFBO0FBQUEsSUFBQSxXQUFBO0FBR1AsSUFBQTtBQUhPLEdBQUQsRUFRUDtBQUNDLFdBQU87QUFDTCxNQUFBLElBQUksRUFEQyxVQUFBO0FBRUwsTUFBQSxJQUFJLEVBQUUsSUFBSSxJQUZMLEVBQUE7QUFHTCxNQUFBLFdBQVcsRUFBRSxXQUFXLElBSG5CLEVBQUE7QUFJTCxNQUFBO0FBSkssS0FBUDtBQU1EOztBQUVELEVBQUEsUUFBUSxDQUFDO0FBQUEsSUFBQSxJQUFBO0FBQUEsSUFBQSxNQUFBO0FBQUEsSUFBQSxJQUFBO0FBQUEsSUFBQSxRQUFBO0FBQUEsSUFBQSxHQUFBO0FBTVAsSUFBQSxLQUFLLEdBQUc7QUFORCxHQUFELEVBY1A7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsbUJBQUE7QUFBQSxNQUFBLElBQUE7QUFBQSxNQUFBLE1BQUE7QUFBQSxNQUFBLElBQUE7QUFLTCxNQUFBLE9BQU8sRUFBRSxDQUxKLFFBQUE7QUFBQSxNQUFBLFFBQUE7QUFBQSxNQUFBLEdBQUE7QUFRTCxNQUFBLEtBQUssRUFBRSxLQUFLLElBQUk7QUFBRSxRQUFBLElBQUksRUFBTixLQUFBO0FBQWUsUUFBQSxLQUFLLEVBQUU7QUFBdEI7QUFSWCxLQUFQO0FBVUQ7O0FBRUQsRUFBQSxLQUFLLENBQUM7QUFBQSxJQUFBLElBQUE7QUFBQSxJQUFBLE1BQUE7QUFBQSxJQUFBLElBQUE7QUFBQSxJQUFBLFlBQUE7QUFLSixJQUFBLFNBQVMsR0FMTCxJQUFBO0FBQUEsSUFBQSxHQUFBO0FBT0osSUFBQSxTQUFTLEdBUEwsYUFBQTtBQVFKLElBQUEsWUFBWSxHQVJSLGFBQUE7QUFTSixJQUFBLFVBQVUsR0FBRztBQVRULEdBQUQsRUFvQko7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsZ0JBQUE7QUFFTCxNQUFBLElBQUksRUFGQyxJQUFBO0FBQUEsTUFBQSxNQUFBO0FBQUEsTUFBQSxJQUFBO0FBS0wsTUFBQSxPQUFPLEVBTEYsWUFBQTtBQU1MLE1BQUEsT0FBTyxFQU5GLFNBQUE7QUFPTCxNQUFBLEdBQUcsRUFQRSxHQUFBO0FBUUwsTUFBQSxTQUFTLEVBUkosU0FBQTtBQVNMLE1BQUEsWUFBWSxFQVRQLFlBQUE7QUFVTCxNQUFBLFVBQVUsRUFBRTtBQVZQLEtBQVA7QUFZRDs7QUFFRCxFQUFBLE9BQU8sQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUFpQztBQUN0QyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsa0JBQUE7QUFFTCxNQUFBLEtBQUssRUFGQSxLQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLGVBQWUsQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUErQjtBQUM1QyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsMEJBQUE7QUFFTCxNQUFBLEtBQUssRUFGQSxLQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLE1BQU0sQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUVXO0FBRWYsV0FBTztBQUNMLE1BQUEsSUFBSSxFQURDLGlCQUFBO0FBQUEsTUFBQSxLQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLE9BQU8sQ0FBQztBQUFBLElBQUEsR0FBQTtBQUFBLElBQUEsV0FBQTtBQUFBLElBQUEsS0FBQTtBQUFBLElBQUEsV0FBQTtBQUFBLElBQUEsU0FBQTtBQUFBLElBQUEsUUFBQTtBQUFBLElBQUEsUUFBQTtBQVFOLElBQUE7QUFSTSxHQUFELEVBU2U7QUFDcEIsV0FBTztBQUNMLE1BQUEsSUFBSSxFQURDLGFBQUE7QUFBQSxNQUFBLEdBQUE7QUFHTCxNQUFBLFdBQVcsRUFITixXQUFBO0FBSUwsTUFBQSxVQUFVLEVBQUUsS0FBSyxJQUpaLEVBQUE7QUFLTCxNQUFBLFdBQVcsRUFBRSxXQUFXLElBTG5CLEVBQUE7QUFNTCxNQUFBLFNBQVMsRUFBRSxTQUFTLElBTmYsRUFBQTtBQU9MLE1BQUEsUUFBUSxFQUFHLFFBQTZDLElBUG5ELEVBQUE7QUFRTCxNQUFBLFFBQVEsRUFBRSxRQUFRLElBUmIsRUFBQTtBQVNMLE1BQUE7QUFUSyxLQUFQO0FBV0Q7O0FBRUQsRUFBQSxlQUFlLENBQUM7QUFBQSxJQUFBLElBQUE7QUFBQSxJQUFBLE1BQUE7QUFBQSxJQUFBLElBQUE7QUFJZCxJQUFBO0FBSmMsR0FBRCxFQVVkO0FBQ0MsV0FBTztBQUNMLE1BQUEsSUFBSSxFQURDLDBCQUFBO0FBQUEsTUFBQSxJQUFBO0FBQUEsTUFBQSxNQUFBO0FBQUEsTUFBQSxJQUFBO0FBS0wsTUFBQTtBQUxLLEtBQVA7QUFPRDs7QUFFRCxFQUFBLElBQUksQ0FBQztBQUFBLElBQUEsSUFBQTtBQUFBLElBQUEsS0FBQTtBQUdILElBQUE7QUFIRyxHQUFELEVBUUg7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLE1BQUEsSUFBSSxFQUZDLElBQUE7QUFHTCxNQUFBLEtBQUssRUFIQSxLQUFBO0FBSUwsTUFBQTtBQUpLLEtBQVA7QUFNRDs7QUFFRCxFQUFBLElBQUksQ0FBQztBQUFBLElBQUEsS0FBQTtBQUFTLElBQUE7QUFBVCxHQUFELEVBQW1EO0FBQ3JELFdBQU87QUFDTCxNQUFBLElBQUksRUFEQyxVQUFBO0FBQUEsTUFBQSxLQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLEtBQUssQ0FBQztBQUFBLElBQUEsSUFBQTtBQUFBLElBQUEsTUFBQTtBQUFBLElBQUEsSUFBQTtBQUlKLElBQUE7QUFKSSxHQUFELEVBVUo7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsZUFBQTtBQUFBLE1BQUEsSUFBQTtBQUFBLE1BQUEsTUFBQTtBQUFBLE1BQUEsSUFBQTtBQUtMLE1BQUE7QUFMSyxLQUFQO0FBT0Q7O0FBRUQsRUFBQSxJQUFJLENBQUM7QUFBQSxJQUFBLElBQUE7QUFBQSxJQUFBLElBQUE7QUFHSCxJQUFBO0FBSEcsR0FBRCxFQVFIO0FBQ0MsUUFBSTtBQUFFLE1BQUEsUUFBUSxFQUFFO0FBQVosUUFBNkIsWUFBWSxDQUE3QyxJQUE2QyxDQUE3QztBQUNBLFFBQUksUUFBUSxHQUFHLENBQUMsR0FBRCxZQUFBLEVBQWtCLEdBQWxCLElBQUEsRUFBQSxJQUFBLENBQWYsR0FBZSxDQUFmO0FBRUEsV0FBTyxJQUFBLG1DQUFBLENBQUEsUUFBQSxFQUFBLElBQUEsRUFBQSxJQUFBLEVBQVAsR0FBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxJQUFJLENBQUEsSUFBQSxFQUFBLEdBQUEsRUFBOEI7QUFDaEMsUUFBSSxJQUFJLENBQUosQ0FBSSxDQUFKLEtBQUosR0FBQSxFQUFxQjtBQUNuQixhQUFPLEtBQUEsTUFBQSxDQUFBLElBQUEsRUFBUCxHQUFPLENBQVA7QUFERixLQUFBLE1BRU8sSUFBSSxJQUFJLEtBQVIsTUFBQSxFQUFxQjtBQUMxQixhQUFPLEtBQUEsSUFBQSxDQUFQLEdBQU8sQ0FBUDtBQURLLEtBQUEsTUFFQTtBQUNMLGFBQU8sS0FBQSxHQUFBLENBQUEsSUFBQSxFQUFQLEdBQU8sQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQsRUFBQSxJQUFJLENBQUEsR0FBQSxFQUFnQjtBQUNsQixXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLE1BQUE7QUFGSyxLQUFQO0FBSUQ7O0FBRUQsRUFBQSxNQUFNLENBQUEsSUFBQSxFQUFBLEdBQUEsRUFBOEI7QUFDbEM7QUFEa0MsYUFFbEMsa0JBQU8sSUFBSSxDQUFKLENBQUksQ0FBSixLQUFELEdBQU4sRUFGa0MsdURBRWxDLENBRmtDO0FBSWxDLFdBQU87QUFDTCxNQUFBLElBQUksRUFEQyxRQUFBO0FBQUEsTUFBQSxJQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLEdBQUcsQ0FBQSxJQUFBLEVBQUEsR0FBQSxFQUE4QjtBQUFBLGFBQy9CLGtCQUFPLElBQUksS0FBTCxNQUFOLEVBRCtCLG1FQUMvQixDQUQrQjtBQUFBLGFBRS9CLGtCQUNFLElBQUksQ0FBSixDQUFJLENBQUosS0FESSxHQUFOLEVBRUUsbUNBQW1DLElBQUksd0JBQXdCLElBSmxDLFlBRS9CLENBRitCO0FBTy9CLFdBQU87QUFDTCxNQUFBLElBQUksRUFEQyxTQUFBO0FBQUEsTUFBQSxJQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLElBQUksQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUF5QztBQUMzQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsTUFBQTtBQUVMLE1BQUEsS0FBSyxFQUFFLEtBQUssSUFGUCxFQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDs7QUFFRCxFQUFBLElBQUksQ0FBQztBQUFBLElBQUEsR0FBQTtBQUFBLElBQUEsS0FBQTtBQUdILElBQUE7QUFIRyxHQUFELEVBUUg7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLE1BQUEsR0FBRyxFQUZFLEdBQUE7QUFBQSxNQUFBLEtBQUE7QUFJTCxNQUFBO0FBSkssS0FBUDtBQU1EOztBQUVELEVBQUEsT0FBTyxDQUEwQjtBQUFBLElBQUEsSUFBQTtBQUFBLElBQUEsS0FBQTtBQUcvQixJQUFBO0FBSCtCLEdBQTFCLEVBUU47QUFDQyxXQUFPO0FBQUEsTUFBQSxJQUFBO0FBQUEsTUFBQSxLQUFBO0FBR0wsTUFBQSxRQUFRLEVBSEgsS0FBQTtBQUlMLE1BQUE7QUFKSyxLQUFQO0FBTUQ7O0FBRUQsRUFBQSxTQUFTLEdBQUE7QUFDUCxXQUFPLEtBQUEsT0FBQSxDQUFhO0FBQUUsTUFBQSxJQUFJLEVBQU4sa0JBQUE7QUFBNEIsTUFBQSxLQUFLLEVBQUU7QUFBbkMsS0FBYixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxJQUFJLEdBQUE7QUFDRixXQUFPLEtBQUEsT0FBQSxDQUFhO0FBQUUsTUFBQSxJQUFJLEVBQU4sYUFBQTtBQUF1QixNQUFBLEtBQUssRUFBRTtBQUE5QixLQUFiLENBQVA7QUFDRDs7QUFFRCxFQUFBLE1BQU0sQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUErQjtBQUNuQyxXQUFPLEtBQUEsT0FBQSxDQUFhO0FBQUUsTUFBQSxJQUFJLEVBQU4sZUFBQTtBQUFBLE1BQUEsS0FBQTtBQUFnQyxNQUFBO0FBQWhDLEtBQWIsQ0FBUDtBQUNEOztBQUVELEVBQUEsT0FBTyxDQUFBLEtBQUEsRUFBQSxHQUFBLEVBQWdDO0FBQ3JDLFdBQU8sS0FBQSxPQUFBLENBQWE7QUFBRSxNQUFBLElBQUksRUFBTixnQkFBQTtBQUFBLE1BQUEsS0FBQTtBQUFpQyxNQUFBO0FBQWpDLEtBQWIsQ0FBUDtBQUNEOztBQUVELEVBQUEsTUFBTSxDQUFBLEtBQUEsRUFBQSxHQUFBLEVBQStCO0FBQ25DLFdBQU8sS0FBQSxPQUFBLENBQWE7QUFBRSxNQUFBLElBQUksRUFBTixlQUFBO0FBQUEsTUFBQSxLQUFBO0FBQWdDLE1BQUE7QUFBaEMsS0FBYixDQUFQO0FBQ0Q7O0FBblZXLEMsQ0FpWWQ7OztBQUVBLFNBQUEsWUFBQSxDQUFBLElBQUEsRUFBMEM7QUFDeEMsVUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFNBQUEsUUFBQTtBQUNFLGFBQU87QUFBRSxRQUFBLFFBQVEsRUFBRSxJQUFJLENBQWhCLElBQUE7QUFBdUIsUUFBQSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUwsSUFBQTtBQUE5QixPQUFQOztBQUNGLFNBQUEsVUFBQTtBQUNFLGFBQU87QUFBRSxRQUFBLFFBQVEsRUFBVixNQUFBO0FBQW9CLFFBQUEsS0FBSyxFQUFFO0FBQTNCLE9BQVA7O0FBQ0YsU0FBQSxTQUFBO0FBQ0UsYUFBTztBQUFFLFFBQUEsUUFBUSxFQUFFLElBQUksQ0FBaEIsSUFBQTtBQUF1QixRQUFBLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBTCxJQUFBO0FBQTlCLE9BQVA7QUFOSjtBQVFEOztlQUVjLElBQWYsUUFBZSxFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uLCBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBQYXJzZXJOb2RlQnVpbGRlciB9IGZyb20gJy4uL3BhcnNlcic7XG5pbXBvcnQgeyBTb3VyY2VMb2NhdGlvbiB9IGZyb20gJy4uL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2VPZmZzZXQsIFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBQYXRoRXhwcmVzc2lvbkltcGxWMSB9IGZyb20gJy4vbGVnYWN5LWludGVyb3AnO1xuXG5jb25zdCBERUZBVUxUX1NUUklQID0ge1xuICBjbG9zZTogZmFsc2UsXG4gIG9wZW46IGZhbHNlLFxufTtcblxuLyoqXG4gKiBUaGUgUGFyc2VyIEJ1aWxkZXIgZGlmZmVyZW50aWF0ZXMgZnJvbSB0aGUgcHVibGljIGJ1aWxkZXIgQVBJIGJ5OlxuICpcbiAqIDEuIE9mZmVyaW5nIGZld2VyIGRpZmZlcmVudCB3YXlzIHRvIGluc3RhbnRpYXRlIG5vZGVzXG4gKiAyLiBNYW5kYXRpbmcgc291cmNlIGxvY2F0aW9uc1xuICovXG5jbGFzcyBCdWlsZGVycyB7XG4gIHBvcyhsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmUsXG4gICAgICBjb2x1bW4sXG4gICAgfTtcbiAgfVxuXG4gIGJsb2NrSXRzZWxmKHtcbiAgICBib2R5LFxuICAgIGJsb2NrUGFyYW1zLFxuICAgIGNoYWluZWQgPSBmYWxzZSxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBib2R5PzogQVNUdjEuU3RhdGVtZW50W107XG4gICAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXTtcbiAgICBjaGFpbmVkPzogYm9vbGVhbjtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5CbG9jayB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCbG9jaycsXG4gICAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgICAgY2hhaW5lZCxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgdGVtcGxhdGUoe1xuICAgIGJvZHksXG4gICAgYmxvY2tQYXJhbXMsXG4gICAgbG9jLFxuICB9OiB7XG4gICAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdO1xuICAgIGJsb2NrUGFyYW1zPzogc3RyaW5nW107XG4gICAgbG9jOiBTb3VyY2VTcGFuO1xuICB9KTogQVNUdjEuVGVtcGxhdGUge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgICAgYm9keTogYm9keSB8fCBbXSxcbiAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgbXVzdGFjaGUoe1xuICAgIHBhdGgsXG4gICAgcGFyYW1zLFxuICAgIGhhc2gsXG4gICAgdHJ1c3RpbmcsXG4gICAgbG9jLFxuICAgIHN0cmlwID0gREVGQVVMVF9TVFJJUCxcbiAgfToge1xuICAgIHBhdGg6IEFTVHYxLkV4cHJlc3Npb247XG4gICAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gICAgaGFzaDogQVNUdjEuSGFzaDtcbiAgICB0cnVzdGluZzogYm9vbGVhbjtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gICAgc3RyaXA6IEFTVHYxLlN0cmlwRmxhZ3M7XG4gIH0pOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdNdXN0YWNoZVN0YXRlbWVudCcsXG4gICAgICBwYXRoLFxuICAgICAgcGFyYW1zLFxuICAgICAgaGFzaCxcbiAgICAgIGVzY2FwZWQ6ICF0cnVzdGluZyxcbiAgICAgIHRydXN0aW5nLFxuICAgICAgbG9jLFxuICAgICAgc3RyaXA6IHN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIH07XG4gIH1cblxuICBibG9jayh7XG4gICAgcGF0aCxcbiAgICBwYXJhbXMsXG4gICAgaGFzaCxcbiAgICBkZWZhdWx0QmxvY2ssXG4gICAgZWxzZUJsb2NrID0gbnVsbCxcbiAgICBsb2MsXG4gICAgb3BlblN0cmlwID0gREVGQVVMVF9TVFJJUCxcbiAgICBpbnZlcnNlU3RyaXAgPSBERUZBVUxUX1NUUklQLFxuICAgIGNsb3NlU3RyaXAgPSBERUZBVUxUX1NUUklQLFxuICB9OiB7XG4gICAgcGF0aDogQVNUdjEuUGF0aEV4cHJlc3Npb24gfCBBU1R2MS5TdWJFeHByZXNzaW9uO1xuICAgIHBhcmFtczogQVNUdjEuRXhwcmVzc2lvbltdO1xuICAgIGhhc2g6IEFTVHYxLkhhc2g7XG4gICAgZGVmYXVsdEJsb2NrOiBBU1R2MS5CbG9jaztcbiAgICBlbHNlQmxvY2s/OiBPcHRpb248QVNUdjEuQmxvY2s+O1xuICAgIGxvYzogU291cmNlU3BhbjtcbiAgICBvcGVuU3RyaXA6IEFTVHYxLlN0cmlwRmxhZ3M7XG4gICAgaW52ZXJzZVN0cmlwOiBBU1R2MS5TdHJpcEZsYWdzO1xuICAgIGNsb3NlU3RyaXA6IEFTVHYxLlN0cmlwRmxhZ3M7XG4gIH0pOiBBU1R2MS5CbG9ja1N0YXRlbWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCbG9ja1N0YXRlbWVudCcsXG4gICAgICBwYXRoOiBwYXRoLFxuICAgICAgcGFyYW1zLFxuICAgICAgaGFzaCxcbiAgICAgIHByb2dyYW06IGRlZmF1bHRCbG9jayxcbiAgICAgIGludmVyc2U6IGVsc2VCbG9jayxcbiAgICAgIGxvYzogbG9jLFxuICAgICAgb3BlblN0cmlwOiBvcGVuU3RyaXAsXG4gICAgICBpbnZlcnNlU3RyaXA6IGludmVyc2VTdHJpcCxcbiAgICAgIGNsb3NlU3RyaXA6IGNsb3NlU3RyaXAsXG4gICAgfTtcbiAgfVxuXG4gIGNvbW1lbnQodmFsdWU6IHN0cmluZywgbG9jOiBTb3VyY2VPZmZzZXQpOiBQYXJzZXJOb2RlQnVpbGRlcjxBU1R2MS5Db21tZW50U3RhdGVtZW50PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JyxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgbXVzdGFjaGVDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYzogU291cmNlU3Bhbik6IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBjb25jYXQoXG4gICAgcGFydHM6IFByZXNlbnRBcnJheTxBU1R2MS5UZXh0Tm9kZSB8IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50PixcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjEuQ29uY2F0U3RhdGVtZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0NvbmNhdFN0YXRlbWVudCcsXG4gICAgICBwYXJ0cyxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgZWxlbWVudCh7XG4gICAgdGFnLFxuICAgIHNlbGZDbG9zaW5nLFxuICAgIGF0dHJzLFxuICAgIGJsb2NrUGFyYW1zLFxuICAgIG1vZGlmaWVycyxcbiAgICBjb21tZW50cyxcbiAgICBjaGlsZHJlbixcbiAgICBsb2MsXG4gIH06IEJ1aWxkRWxlbWVudE9wdGlvbnMpOiBBU1R2MS5FbGVtZW50Tm9kZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdFbGVtZW50Tm9kZScsXG4gICAgICB0YWcsXG4gICAgICBzZWxmQ2xvc2luZzogc2VsZkNsb3NpbmcsXG4gICAgICBhdHRyaWJ1dGVzOiBhdHRycyB8fCBbXSxcbiAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzIHx8IFtdLFxuICAgICAgY29tbWVudHM6IChjb21tZW50cyBhcyBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnRbXSkgfHwgW10sXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgW10sXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIGVsZW1lbnRNb2RpZmllcih7XG4gICAgcGF0aCxcbiAgICBwYXJhbXMsXG4gICAgaGFzaCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IEFTVHYxLlN1YkV4cHJlc3Npb247XG4gICAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gICAgaGFzaDogQVNUdjEuSGFzaDtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50JyxcbiAgICAgIHBhdGgsXG4gICAgICBwYXJhbXMsXG4gICAgICBoYXNoLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBhdHRyKHtcbiAgICBuYW1lLFxuICAgIHZhbHVlLFxuICAgIGxvYyxcbiAgfToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ107XG4gICAgbG9jOiBTb3VyY2VTcGFuO1xuICB9KTogQVNUdjEuQXR0ck5vZGUge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnQXR0ck5vZGUnLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgdGV4dCh7IGNoYXJzLCBsb2MgfTogeyBjaGFyczogc3RyaW5nOyBsb2M6IFNvdXJjZVNwYW4gfSk6IEFTVHYxLlRleHROb2RlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1RleHROb2RlJyxcbiAgICAgIGNoYXJzLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBzZXhwcih7XG4gICAgcGF0aCxcbiAgICBwYXJhbXMsXG4gICAgaGFzaCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IEFTVHYxLlN1YkV4cHJlc3Npb247XG4gICAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gICAgaGFzaDogQVNUdjEuSGFzaDtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5TdWJFeHByZXNzaW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1N1YkV4cHJlc3Npb24nLFxuICAgICAgcGF0aCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIGhhc2gsXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIHBhdGgoe1xuICAgIGhlYWQsXG4gICAgdGFpbCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBoZWFkOiBBU1R2MS5QYXRoSGVhZDtcbiAgICB0YWlsOiBzdHJpbmdbXTtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB7XG4gICAgbGV0IHsgb3JpZ2luYWw6IG9yaWdpbmFsSGVhZCB9ID0gaGVhZFRvU3RyaW5nKGhlYWQpO1xuICAgIGxldCBvcmlnaW5hbCA9IFsuLi5vcmlnaW5hbEhlYWQsIC4uLnRhaWxdLmpvaW4oJy4nKTtcblxuICAgIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEob3JpZ2luYWwsIGhlYWQsIHRhaWwsIGxvYyk7XG4gIH1cblxuICBoZWFkKGhlYWQ6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuUGF0aEhlYWQge1xuICAgIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0TmFtZShoZWFkLCBsb2MpO1xuICAgIH0gZWxzZSBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGlzKGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcihoZWFkLCBsb2MpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMobG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuUGF0aEhlYWQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBhdE5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2MS5QYXRoSGVhZCB7XG4gICAgLy8gdGhlIGBAYCBzaG91bGQgYmUgaW5jbHVkZWQgc28gd2UgaGF2ZSBhIGNvbXBsZXRlIHNvdXJjZSByYW5nZVxuICAgIGFzc2VydChuYW1lWzBdID09PSAnQCcsIGBjYWxsIGJ1aWxkZXJzLmF0KCkgd2l0aCBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdAJ2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgICAgbmFtZSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgdmFyKG5hbWU6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuUGF0aEhlYWQge1xuICAgIGFzc2VydChuYW1lICE9PSAndGhpcycsIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGApO1xuICAgIGFzc2VydChcbiAgICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJyR7bmFtZX0nLiBDYWxsIGJ1aWxkZXJzLmF0KCcke25hbWV9JykgaW5zdGVhZGBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICAgIG5hbWUsXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIGhhc2gocGFpcnM6IEFTVHYxLkhhc2hQYWlyW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYxLkhhc2gge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnSGFzaCcsXG4gICAgICBwYWlyczogcGFpcnMgfHwgW10sXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIHBhaXIoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogQVNUdjEuRXhwcmVzc2lvbjtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5IYXNoUGFpciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdIYXNoUGFpcicsXG4gICAgICBrZXk6IGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBsaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPih7XG4gICAgdHlwZSxcbiAgICB2YWx1ZSxcbiAgICBsb2MsXG4gIH06IHtcbiAgICB0eXBlOiBUWyd0eXBlJ107XG4gICAgdmFsdWU6IFRbJ3ZhbHVlJ107XG4gICAgbG9jPzogU291cmNlTG9jYXRpb247XG4gIH0pOiBUIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb3JpZ2luYWw6IHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH0gYXMgVDtcbiAgfVxuXG4gIHVuZGVmaW5lZCgpOiBBU1R2MS5VbmRlZmluZWRMaXRlcmFsIHtcbiAgICByZXR1cm4gdGhpcy5saXRlcmFsKHsgdHlwZTogJ1VuZGVmaW5lZExpdGVyYWwnLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9XG5cbiAgbnVsbCgpOiBBU1R2MS5OdWxsTGl0ZXJhbCB7XG4gICAgcmV0dXJuIHRoaXMubGl0ZXJhbCh7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIHZhbHVlOiBudWxsIH0pO1xuICB9XG5cbiAgc3RyaW5nKHZhbHVlOiBzdHJpbmcsIGxvYzogU291cmNlU3Bhbik6IEFTVHYxLlN0cmluZ0xpdGVyYWwge1xuICAgIHJldHVybiB0aGlzLmxpdGVyYWwoeyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlLCBsb2MgfSk7XG4gIH1cblxuICBib29sZWFuKHZhbHVlOiBib29sZWFuLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2MS5Cb29sZWFuTGl0ZXJhbCB7XG4gICAgcmV0dXJuIHRoaXMubGl0ZXJhbCh7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlLCBsb2MgfSk7XG4gIH1cblxuICBudW1iZXIodmFsdWU6IG51bWJlciwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuTnVtYmVyTGl0ZXJhbCB7XG4gICAgcmV0dXJuIHRoaXMubGl0ZXJhbCh7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWUsIGxvYyB9KTtcbiAgfVxufVxuXG4vLyBOb2Rlc1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UGFydHMgPVxuICB8IFsnYXR0cnMnLCAuLi5BdHRyU2V4cFtdXVxuICB8IFsnbW9kaWZpZXJzJywgLi4uTW9kaWZpZXJTZXhwW11dXG4gIHwgWydib2R5JywgLi4uQVNUdjEuU3RhdGVtZW50W11dXG4gIHwgWydjb21tZW50cycsIC4uLkVsZW1lbnRDb21tZW50W11dXG4gIHwgWydhcycsIC4uLnN0cmluZ1tdXVxuICB8IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBQYXRoU2V4cCA9IHN0cmluZyB8IFsncGF0aCcsIHN0cmluZywgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclNleHAgPVxuICB8IHN0cmluZ1xuICB8IFtQYXRoU2V4cCwgTG9jU2V4cD9dXG4gIHwgW1BhdGhTZXhwLCBBU1R2MS5FeHByZXNzaW9uW10sIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+LCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIEF0dHJTZXhwID0gW3N0cmluZywgQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10gfCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTG9jU2V4cCA9IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50Q29tbWVudCA9IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB8IFNvdXJjZUxvY2F0aW9uIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBTZXhwVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IEFTVHYxLkV4cHJlc3Npb25bXVxuICB8IERpY3Q8QVNUdjEuRXhwcmVzc2lvbj5cbiAgfCBMb2NTZXhwXG4gIHwgUGF0aFNleHBcbiAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbGVtZW50T3B0aW9ucyB7XG4gIHRhZzogc3RyaW5nO1xuICBzZWxmQ2xvc2luZzogYm9vbGVhbjtcbiAgYXR0cnM6IEFTVHYxLkF0dHJOb2RlW107XG4gIG1vZGlmaWVyczogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50W107XG4gIGNoaWxkcmVuOiBBU1R2MS5TdGF0ZW1lbnRbXTtcbiAgY29tbWVudHM6IEVsZW1lbnRDb21tZW50W107XG4gIGJsb2NrUGFyYW1zOiBzdHJpbmdbXTtcbiAgbG9jOiBTb3VyY2VTcGFuO1xufVxuXG4vLyBFeHByZXNzaW9uc1xuXG5mdW5jdGlvbiBoZWFkVG9TdHJpbmcoaGVhZDogQVNUdjEuUGF0aEhlYWQpOiB7IG9yaWdpbmFsOiBzdHJpbmc7IHBhcnRzOiBzdHJpbmdbXSB9IHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBdEhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gICAgY2FzZSAnVGhpc0hlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGB0aGlzYCwgcGFydHM6IFtdIH07XG4gICAgY2FzZSAnVmFySGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQnVpbGRlcnMoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=