stringifier.js 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = void 0;
  4. var DEFAULT_RAW = {
  5. colon: ': ',
  6. indent: ' ',
  7. beforeDecl: '\n',
  8. beforeRule: '\n',
  9. beforeOpen: ' ',
  10. beforeClose: '\n',
  11. beforeComment: '\n',
  12. after: '\n',
  13. emptyBody: '',
  14. commentLeft: ' ',
  15. commentRight: ' '
  16. };
  17. function capitalize(str) {
  18. return str[0].toUpperCase() + str.slice(1);
  19. }
  20. var Stringifier =
  21. /*#__PURE__*/
  22. function () {
  23. function Stringifier(builder) {
  24. this.builder = builder;
  25. }
  26. var _proto = Stringifier.prototype;
  27. _proto.stringify = function stringify(node, semicolon) {
  28. this[node.type](node, semicolon);
  29. };
  30. _proto.root = function root(node) {
  31. this.body(node);
  32. if (node.raws.after) this.builder(node.raws.after);
  33. };
  34. _proto.comment = function comment(node) {
  35. var left = this.raw(node, 'left', 'commentLeft');
  36. var right = this.raw(node, 'right', 'commentRight');
  37. this.builder('/*' + left + node.text + right + '*/', node);
  38. };
  39. _proto.decl = function decl(node, semicolon) {
  40. var between = this.raw(node, 'between', 'colon');
  41. var string = node.prop + between + this.rawValue(node, 'value');
  42. if (node.important) {
  43. string += node.raws.important || ' !important';
  44. }
  45. if (semicolon) string += ';';
  46. this.builder(string, node);
  47. };
  48. _proto.rule = function rule(node) {
  49. this.block(node, this.rawValue(node, 'selector'));
  50. if (node.raws.ownSemicolon) {
  51. this.builder(node.raws.ownSemicolon, node, 'end');
  52. }
  53. };
  54. _proto.atrule = function atrule(node, semicolon) {
  55. var name = '@' + node.name;
  56. var params = node.params ? this.rawValue(node, 'params') : '';
  57. if (typeof node.raws.afterName !== 'undefined') {
  58. name += node.raws.afterName;
  59. } else if (params) {
  60. name += ' ';
  61. }
  62. if (node.nodes) {
  63. this.block(node, name + params);
  64. } else {
  65. var end = (node.raws.between || '') + (semicolon ? ';' : '');
  66. this.builder(name + params + end, node);
  67. }
  68. };
  69. _proto.body = function body(node) {
  70. var last = node.nodes.length - 1;
  71. while (last > 0) {
  72. if (node.nodes[last].type !== 'comment') break;
  73. last -= 1;
  74. }
  75. var semicolon = this.raw(node, 'semicolon');
  76. for (var i = 0; i < node.nodes.length; i++) {
  77. var child = node.nodes[i];
  78. var before = this.raw(child, 'before');
  79. if (before) this.builder(before);
  80. this.stringify(child, last !== i || semicolon);
  81. }
  82. };
  83. _proto.block = function block(node, start) {
  84. var between = this.raw(node, 'between', 'beforeOpen');
  85. this.builder(start + between + '{', node, 'start');
  86. var after;
  87. if (node.nodes && node.nodes.length) {
  88. this.body(node);
  89. after = this.raw(node, 'after');
  90. } else {
  91. after = this.raw(node, 'after', 'emptyBody');
  92. }
  93. if (after) this.builder(after);
  94. this.builder('}', node, 'end');
  95. };
  96. _proto.raw = function raw(node, own, detect) {
  97. var value;
  98. if (!detect) detect = own; // Already had
  99. if (own) {
  100. value = node.raws[own];
  101. if (typeof value !== 'undefined') return value;
  102. }
  103. var parent = node.parent; // Hack for first rule in CSS
  104. if (detect === 'before') {
  105. if (!parent || parent.type === 'root' && parent.first === node) {
  106. return '';
  107. }
  108. } // Floating child without parent
  109. if (!parent) return DEFAULT_RAW[detect]; // Detect style by other nodes
  110. var root = node.root();
  111. if (!root.rawCache) root.rawCache = {};
  112. if (typeof root.rawCache[detect] !== 'undefined') {
  113. return root.rawCache[detect];
  114. }
  115. if (detect === 'before' || detect === 'after') {
  116. return this.beforeAfter(node, detect);
  117. } else {
  118. var method = 'raw' + capitalize(detect);
  119. if (this[method]) {
  120. value = this[method](root, node);
  121. } else {
  122. root.walk(function (i) {
  123. value = i.raws[own];
  124. if (typeof value !== 'undefined') return false;
  125. });
  126. }
  127. }
  128. if (typeof value === 'undefined') value = DEFAULT_RAW[detect];
  129. root.rawCache[detect] = value;
  130. return value;
  131. };
  132. _proto.rawSemicolon = function rawSemicolon(root) {
  133. var value;
  134. root.walk(function (i) {
  135. if (i.nodes && i.nodes.length && i.last.type === 'decl') {
  136. value = i.raws.semicolon;
  137. if (typeof value !== 'undefined') return false;
  138. }
  139. });
  140. return value;
  141. };
  142. _proto.rawEmptyBody = function rawEmptyBody(root) {
  143. var value;
  144. root.walk(function (i) {
  145. if (i.nodes && i.nodes.length === 0) {
  146. value = i.raws.after;
  147. if (typeof value !== 'undefined') return false;
  148. }
  149. });
  150. return value;
  151. };
  152. _proto.rawIndent = function rawIndent(root) {
  153. if (root.raws.indent) return root.raws.indent;
  154. var value;
  155. root.walk(function (i) {
  156. var p = i.parent;
  157. if (p && p !== root && p.parent && p.parent === root) {
  158. if (typeof i.raws.before !== 'undefined') {
  159. var parts = i.raws.before.split('\n');
  160. value = parts[parts.length - 1];
  161. value = value.replace(/[^\s]/g, '');
  162. return false;
  163. }
  164. }
  165. });
  166. return value;
  167. };
  168. _proto.rawBeforeComment = function rawBeforeComment(root, node) {
  169. var value;
  170. root.walkComments(function (i) {
  171. if (typeof i.raws.before !== 'undefined') {
  172. value = i.raws.before;
  173. if (value.indexOf('\n') !== -1) {
  174. value = value.replace(/[^\n]+$/, '');
  175. }
  176. return false;
  177. }
  178. });
  179. if (typeof value === 'undefined') {
  180. value = this.raw(node, null, 'beforeDecl');
  181. } else if (value) {
  182. value = value.replace(/[^\s]/g, '');
  183. }
  184. return value;
  185. };
  186. _proto.rawBeforeDecl = function rawBeforeDecl(root, node) {
  187. var value;
  188. root.walkDecls(function (i) {
  189. if (typeof i.raws.before !== 'undefined') {
  190. value = i.raws.before;
  191. if (value.indexOf('\n') !== -1) {
  192. value = value.replace(/[^\n]+$/, '');
  193. }
  194. return false;
  195. }
  196. });
  197. if (typeof value === 'undefined') {
  198. value = this.raw(node, null, 'beforeRule');
  199. } else if (value) {
  200. value = value.replace(/[^\s]/g, '');
  201. }
  202. return value;
  203. };
  204. _proto.rawBeforeRule = function rawBeforeRule(root) {
  205. var value;
  206. root.walk(function (i) {
  207. if (i.nodes && (i.parent !== root || root.first !== i)) {
  208. if (typeof i.raws.before !== 'undefined') {
  209. value = i.raws.before;
  210. if (value.indexOf('\n') !== -1) {
  211. value = value.replace(/[^\n]+$/, '');
  212. }
  213. return false;
  214. }
  215. }
  216. });
  217. if (value) value = value.replace(/[^\s]/g, '');
  218. return value;
  219. };
  220. _proto.rawBeforeClose = function rawBeforeClose(root) {
  221. var value;
  222. root.walk(function (i) {
  223. if (i.nodes && i.nodes.length > 0) {
  224. if (typeof i.raws.after !== 'undefined') {
  225. value = i.raws.after;
  226. if (value.indexOf('\n') !== -1) {
  227. value = value.replace(/[^\n]+$/, '');
  228. }
  229. return false;
  230. }
  231. }
  232. });
  233. if (value) value = value.replace(/[^\s]/g, '');
  234. return value;
  235. };
  236. _proto.rawBeforeOpen = function rawBeforeOpen(root) {
  237. var value;
  238. root.walk(function (i) {
  239. if (i.type !== 'decl') {
  240. value = i.raws.between;
  241. if (typeof value !== 'undefined') return false;
  242. }
  243. });
  244. return value;
  245. };
  246. _proto.rawColon = function rawColon(root) {
  247. var value;
  248. root.walkDecls(function (i) {
  249. if (typeof i.raws.between !== 'undefined') {
  250. value = i.raws.between.replace(/[^\s:]/g, '');
  251. return false;
  252. }
  253. });
  254. return value;
  255. };
  256. _proto.beforeAfter = function beforeAfter(node, detect) {
  257. var value;
  258. if (node.type === 'decl') {
  259. value = this.raw(node, null, 'beforeDecl');
  260. } else if (node.type === 'comment') {
  261. value = this.raw(node, null, 'beforeComment');
  262. } else if (detect === 'before') {
  263. value = this.raw(node, null, 'beforeRule');
  264. } else {
  265. value = this.raw(node, null, 'beforeClose');
  266. }
  267. var buf = node.parent;
  268. var depth = 0;
  269. while (buf && buf.type !== 'root') {
  270. depth += 1;
  271. buf = buf.parent;
  272. }
  273. if (value.indexOf('\n') !== -1) {
  274. var indent = this.raw(node, null, 'indent');
  275. if (indent.length) {
  276. for (var step = 0; step < depth; step++) {
  277. value += indent;
  278. }
  279. }
  280. }
  281. return value;
  282. };
  283. _proto.rawValue = function rawValue(node, prop) {
  284. var value = node[prop];
  285. var raw = node.raws[prop];
  286. if (raw && raw.value === value) {
  287. return raw.raw;
  288. }
  289. return value;
  290. };
  291. return Stringifier;
  292. }();
  293. var _default = Stringifier;
  294. exports.default = _default;
  295. module.exports = exports.default;
  296. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0cmluZ2lmaWVyLmVzNiJdLCJuYW1lcyI6WyJERUZBVUxUX1JBVyIsImNvbG9uIiwiaW5kZW50IiwiYmVmb3JlRGVjbCIsImJlZm9yZVJ1bGUiLCJiZWZvcmVPcGVuIiwiYmVmb3JlQ2xvc2UiLCJiZWZvcmVDb21tZW50IiwiYWZ0ZXIiLCJlbXB0eUJvZHkiLCJjb21tZW50TGVmdCIsImNvbW1lbnRSaWdodCIsImNhcGl0YWxpemUiLCJzdHIiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiU3RyaW5naWZpZXIiLCJidWlsZGVyIiwic3RyaW5naWZ5Iiwibm9kZSIsInNlbWljb2xvbiIsInR5cGUiLCJyb290IiwiYm9keSIsInJhd3MiLCJjb21tZW50IiwibGVmdCIsInJhdyIsInJpZ2h0IiwidGV4dCIsImRlY2wiLCJiZXR3ZWVuIiwic3RyaW5nIiwicHJvcCIsInJhd1ZhbHVlIiwiaW1wb3J0YW50IiwicnVsZSIsImJsb2NrIiwib3duU2VtaWNvbG9uIiwiYXRydWxlIiwibmFtZSIsInBhcmFtcyIsImFmdGVyTmFtZSIsIm5vZGVzIiwiZW5kIiwibGFzdCIsImxlbmd0aCIsImkiLCJjaGlsZCIsImJlZm9yZSIsInN0YXJ0Iiwib3duIiwiZGV0ZWN0IiwidmFsdWUiLCJwYXJlbnQiLCJmaXJzdCIsInJhd0NhY2hlIiwiYmVmb3JlQWZ0ZXIiLCJtZXRob2QiLCJ3YWxrIiwicmF3U2VtaWNvbG9uIiwicmF3RW1wdHlCb2R5IiwicmF3SW5kZW50IiwicCIsInBhcnRzIiwic3BsaXQiLCJyZXBsYWNlIiwicmF3QmVmb3JlQ29tbWVudCIsIndhbGtDb21tZW50cyIsImluZGV4T2YiLCJyYXdCZWZvcmVEZWNsIiwid2Fsa0RlY2xzIiwicmF3QmVmb3JlUnVsZSIsInJhd0JlZm9yZUNsb3NlIiwicmF3QmVmb3JlT3BlbiIsInJhd0NvbG9uIiwiYnVmIiwiZGVwdGgiLCJzdGVwIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBTUEsV0FBVyxHQUFHO0FBQ2xCQyxFQUFB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LElBQUksQ0FBQ21DLE1BQWY7QUFDQSxRQUFJdUIsS0FBSyxHQUFHLENBQVo7O0FBQ0EsV0FBT0QsR0FBRyxJQUFJQSxHQUFHLENBQUN2RCxJQUFKLEtBQWEsTUFBM0IsRUFBbUM7QUFDakN3RCxNQUFBQSxLQUFLLElBQUksQ0FBVDtBQUNBRCxNQUFBQSxHQUFHLEdBQUdBLEdBQUcsQ0FBQ3RCLE1BQVY7QUFDRDs7QUFFRCxRQUFJRCxLQUFLLENBQUNnQixPQUFOLENBQWMsSUFBZCxNQUF3QixDQUFDLENBQTdCLEVBQWdDO0FBQzlCLFVBQUluRSxNQUFNLEdBQUcsS0FBS3lCLEdBQUwsQ0FBU1IsSUFBVCxFQUFlLElBQWYsRUFBcUIsUUFBckIsQ0FBYjs7QUFDQSxVQUFJakIsTUFBTSxDQUFDNEMsTUFBWCxFQUFtQjtBQUNqQixhQUFLLElBQUlnQyxJQUFJLEdBQUcsQ0FBaEIsRUFBbUJBLElBQUksR0FBR0QsS0FBMUIsRUFBaUNDLElBQUksRUFBckM7QUFBeUN6QixVQUFBQSxLQUFLLElBQUluRCxNQUFUO0FBQXpDO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPbUQsS0FBUDtBQUNELEc7O1NBRURuQixRLEdBQUEsa0JBQVVmLElBQVYsRUFBZ0JjLElBQWhCLEVBQXNCO0FBQ3BCLFFBQUlvQixLQUFLLEdBQUdsQyxJQUFJLENBQUNjLElBQUQsQ0FBaEI7QUFDQSxRQUFJTixHQUFHLEdBQUdSLElBQUksQ0FBQ0ssSUFBTCxDQUFVUyxJQUFWLENBQVY7O0FBQ0EsUUFBSU4sR0FBRyxJQUFJQSxHQUFHLENBQUMwQixLQUFKLEtBQWNBLEtBQXpCLEVBQWdDO0FBQzlCLGFBQU8xQixHQUFHLENBQUNBLEdBQVg7QUFDRDs7QUFFRCxXQUFPMEIsS0FBUDtBQUNELEc7Ozs7O2VBR1lyQyxXIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgREVGQVVMVF9SQVcgPSB7XG4gIGNvbG9uOiAnOiAnLFxuICBpbmRlbnQ6ICcgICAgJyxcbiAgYmVmb3JlRGVjbDogJ1xcbicsXG4gIGJlZm9yZVJ1bGU6ICdcXG4nLFxuICBiZWZvcmVPcGVuOiAnICcsXG4gIGJlZm9yZUNsb3NlOiAnXFxuJyxcbiAgYmVmb3JlQ29tbWVudDogJ1xcbicsXG4gIGFmdGVyOiAnXFxuJyxcbiAgZW1wdHlCb2R5OiAnJyxcbiAgY29tbWVudExlZnQ6ICcgJyxcbiAgY29tbWVudFJpZ2h0OiAnICdcbn1cblxuZnVuY3Rpb24gY2FwaXRhbGl6ZSAoc3RyKSB7XG4gIHJldHVybiBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKVxufVxuXG5jbGFzcyBTdHJpbmdpZmllciB7XG4gIGNvbnN0cnVjdG9yIChidWlsZGVyKSB7XG4gICAgdGhpcy5idWlsZGVyID0gYnVpbGRlclxuICB9XG5cbiAgc3RyaW5naWZ5IChub2RlLCBzZW1pY29sb24pIHtcbiAgICB0aGlzW25vZGUudHlwZV0obm9kZSwgc2VtaWNvbG9uKVxuICB9XG5cbiAgcm9vdCAobm9kZSkge1xuICAgIHRoaXMuYm9keShub2RlKVxuICAgIGlmIChub2RlLnJhd3MuYWZ0ZXIpIHRoaXMuYnVpbGRlcihub2RlLnJhd3MuYWZ0ZXIpXG4gIH1cblxuICBjb21tZW50IChub2RlKSB7XG4gICAgbGV0IGxlZnQgPSB0aGlzLnJhdyhub2RlLCAnbGVmdCcsICdjb21tZW50TGVmdCcpXG4gICAgbGV0IHJpZ2h0ID0gdGhpcy5yYXcobm9kZSwgJ3JpZ2h0JywgJ2NvbW1lbnRSaWdodCcpXG4gICAgdGhpcy5idWlsZGVyKCcvKicgKyBsZWZ0ICsgbm9kZS50ZXh0ICsgcmlnaHQgKyAnKi8nLCBub2RlKVxuICB9XG5cbiAgZGVjbCAobm9kZSwgc2VtaWNvbG9uKSB7XG4gICAgbGV0IGJldHdlZW4gPSB0aGlzLnJhdyhub2RlLCAnYmV0d2VlbicsICdjb2xvbicpXG4gICAgbGV0IHN0cmluZyA9IG5vZGUucHJvcCArIGJldHdlZW4gKyB0aGlzLnJhd1ZhbHVlKG5vZGUsICd2YWx1ZScpXG5cbiAgICBpZiAobm9kZS5pbXBvcnRhbnQpIHtcbiAgICAgIHN0cmluZyArPSBub2RlLnJhd3MuaW1wb3J0YW50IHx8ICcgIWltcG9ydGFudCdcbiAgICB9XG5cbiAgICBpZiAoc2VtaWNvbG9uKSBzdHJpbmcgKz0gJzsnXG4gICAgdGhpcy5idWlsZGVyKHN0cmluZywgbm9kZSlcbiAgfVxuXG4gIHJ1bGUgKG5vZGUpIHtcbiAgICB0aGlzLmJsb2NrKG5vZGUsIHRoaXMucmF3VmFsdWUobm9kZSwgJ3NlbGVjdG9yJykpXG4gICAgaWYgKG5vZGUucmF3cy5vd25TZW1pY29sb24pIHtcbiAgICAgIHRoaXMuYnVpbGRlcihub2RlLnJhd3Mub3duU2VtaWNvbG9uLCBub2RlLCAnZW5kJylcbiAgICB9XG4gIH1cblxuICBhdHJ1bGUgKG5vZGUsIHNlbWljb2xvbikge1xuICAgIGxldCBuYW1lID0gJ0AnICsgbm9kZS5uYW1lXG4gICAgbGV0IHBhcmFtcyA9IG5vZGUucGFyYW1zID8gdGhpcy5yYXdWYWx1ZShub2RlLCAncGFyYW1zJykgOiAnJ1xuXG4gICAgaWYgKHR5cGVvZiBub2RlLnJhd3MuYWZ0ZXJOYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbmFtZSArPSBub2RlLnJhd3MuYWZ0ZXJOYW1lXG4gICAgfSBlbHNlIGlmIChwYXJhbXMpIHtcbiAgICAgIG5hbWUgKz0gJyAnXG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMpIHtcbiAgICAgIHRoaXMuYmxvY2sobm9kZSwgbmFtZSArIHBhcmFtcylcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVuZCA9IChub2RlLnJhd3MuYmV0d2VlbiB8fCAnJykgKyAoc2VtaWNvbG9uID8gJzsnIDogJycpXG4gICAgICB0aGlzLmJ1aWxkZXIobmFtZSArIHBhcmFtcyArIGVuZCwgbm9kZSlcbiAgICB9XG4gIH1cblxuICBib2R5IChub2RlKSB7XG4gICAgbGV0IGxhc3QgPSBub2RlLm5vZGVzLmxlbmd0aCAtIDFcbiAgICB3aGlsZSAobGFzdCA+IDApIHtcbiAgICAgIGlmIChub2RlLm5vZGVzW2xhc3RdLnR5cGUgIT09ICdjb21tZW50JykgYnJlYWtcbiAgICAgIGxhc3QgLT0gMVxuICAgIH1cblxuICAgIGxldCBzZW1pY29sb24gPSB0aGlzLnJhdyhub2RlLCAnc2VtaWNvbG9uJylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV1cbiAgICAgIGxldCBiZWZvcmUgPSB0aGlzLnJhdyhjaGlsZCwgJ2JlZm9yZScpXG4gICAgICBpZiAoYmVmb3JlKSB0aGlzLmJ1aWxkZXIoYmVmb3JlKVxuICAgICAgdGhpcy5zdHJpbmdpZnkoY2hpbGQsIGxhc3QgIT09IGkgfHwgc2VtaWNvbG9uKVxuICAgIH1cbiAgfVxuXG4gIGJsb2NrIChub2RlLCBzdGFydCkge1xuICAgIGxldCBiZXR3ZWVuID0gdGhpcy5yYXcobm9kZSwgJ2JldHdlZW4nLCAnYmVmb3JlT3BlbicpXG4gICAgdGhpcy5idWlsZGVyKHN0YXJ0ICsgYmV0d2VlbiArICd7Jywgbm9kZSwgJ3N0YXJ0JylcblxuICAgIGxldCBhZnRlclxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUubm9kZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmJvZHkobm9kZSlcbiAgICAgIGFmdGVyID0gdGhpcy5yYXcobm9kZSwgJ2FmdGVyJylcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXIgPSB0aGlzLnJhdyhub2RlLCAnYWZ0ZXInLCAnZW1wdHlCb2R5JylcbiAgICB9XG5cbiAgICBpZiAoYWZ0ZXIpIHRoaXMuYnVpbGRlcihhZnRlcilcbiAgICB0aGlzLmJ1aWxkZXIoJ30nLCBub2RlLCAnZW5kJylcbiAgfVxuXG4gIHJhdyAobm9kZSwgb3duLCBkZXRlY3QpIHtcbiAgICBsZXQgdmFsdWVcbiAgICBpZiAoIWRldGVjdCkgZGV0ZWN0ID0gb3duXG5cbiAgICAvLyBBbHJlYWR5IGhhZFxuICAgIGlmIChvd24pIHtcbiAgICAgIHZhbHVlID0gbm9kZS5yYXdzW293bl1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnRcblxuICAgIC8vIEhhY2sgZm9yIGZpcnN0IHJ1bGUgaW4gQ1NTXG4gICAgaWYgKGRldGVjdCA9PT0gJ2JlZm9yZScpIHtcbiAgICAgIGlmICghcGFyZW50IHx8IChwYXJlbnQudHlwZSA9PT0gJ3Jvb3QnICYmIHBhcmVudC5maXJzdCA9PT0gbm9kZSkpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmxvYXRpbmcgY2hpbGQgd2l0aG91dCBwYXJlbnRcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIERFRkFVTFRfUkFXW2RldGVjdF1cblxuICAgIC8vIERldGVjdCBzdHlsZSBieSBvdGhlciBub2Rlc1xuICAgIGxldCByb290ID0gbm9kZS5yb290KClcbiAgICBpZiAoIXJvb3QucmF3Q2FjaGUpIHJvb3QucmF3Q2FjaGUgPSB7IH1cbiAgICBpZiAodHlwZW9mIHJvb3QucmF3Q2FjaGVbZGV0ZWN0XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiByb290LnJhd0NhY2hlW2RldGVjdF1cbiAgICB9XG5cbiAgICBpZiAoZGV0ZWN0ID09PSAnYmVmb3JlJyB8fCBkZXRlY3QgPT09ICdhZnRlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmJlZm9yZUFmdGVyKG5vZGUsIGRldGVjdClcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1ldGhvZCA9ICdyYXcnICsgY2FwaXRhbGl6ZShkZXRlY3QpXG4gICAgICBpZiAodGhpc1ttZXRob2RdKSB7XG4gICAgICAgIHZhbHVlID0gdGhpc1ttZXRob2RdKHJvb3QsIG5vZGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290LndhbGsoaSA9PiB7XG4gICAgICAgICAgdmFsdWUgPSBpLnJhd3Nbb3duXVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykgdmFsdWUgPSBERUZBVUxUX1JBV1tkZXRlY3RdXG5cbiAgICByb290LnJhd0NhY2hlW2RldGVjdF0gPSB2YWx1ZVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmF3U2VtaWNvbG9uIChyb290KSB7XG4gICAgbGV0IHZhbHVlXG4gICAgcm9vdC53YWxrKGkgPT4ge1xuICAgICAgaWYgKGkubm9kZXMgJiYgaS5ub2Rlcy5sZW5ndGggJiYgaS5sYXN0LnR5cGUgPT09ICdkZWNsJykge1xuICAgICAgICB2YWx1ZSA9IGkucmF3cy5zZW1pY29sb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICByYXdFbXB0eUJvZHkgKHJvb3QpIHtcbiAgICBsZXQgdmFsdWVcbiAgICByb290LndhbGsoaSA9PiB7XG4gICAgICBpZiAoaS5ub2RlcyAmJiBpLm5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IGkucmF3cy5hZnRlclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHJhd0luZGVudCAocm9vdCkge1xuICAgIGlmIChyb290LnJhd3MuaW5kZW50KSByZXR1cm4gcm9vdC5yYXdzLmluZGVudFxuICAgIGxldCB2YWx1ZVxuICAgIHJvb3Qud2FsayhpID0+IHtcbiAgICAgIGxldCBwID0gaS5wYXJlbnRcbiAgICAgIGlmIChwICYmIHAgIT09IHJvb3QgJiYgcC5wYXJlbnQgJiYgcC5wYXJlbnQgPT09IHJvb3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpLnJhd3MuYmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxldCBwYXJ0cyA9IGkucmF3cy5iZWZvcmUuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgdmFsdWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXHNdL2csICcnKVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHJhd0JlZm9yZUNvbW1lbnQgKHJvb3QsIG5vZGUpIHtcbiAgICBsZXQgdmFsdWVcbiAgICByb290LndhbGtDb21tZW50cyhpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaS5yYXdzLmJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFsdWUgPSBpLnJhd3MuYmVmb3JlXG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdcXG4nKSAhPT0gLTEpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxuXSskLywgJycpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSB0aGlzLnJhdyhub2RlLCBudWxsLCAnYmVmb3JlRGVjbCcpXG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcc10vZywgJycpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmF3QmVmb3JlRGVjbCAocm9vdCwgbm9kZSkge1xuICAgIGxldCB2YWx1ZVxuICAgIHJvb3Qud2Fsa0RlY2xzKGkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpLnJhd3MuYmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZSA9IGkucmF3cy5iZWZvcmVcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ1xcbicpICE9PSAtMSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXG5dKyQvLCAnJylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMucmF3KG5vZGUsIG51bGwsICdiZWZvcmVSdWxlJylcbiAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxzXS9nLCAnJylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICByYXdCZWZvcmVSdWxlIChyb290KSB7XG4gICAgbGV0IHZhbHVlXG4gICAgcm9vdC53YWxrKGkgPT4ge1xuICAgICAgaWYgKGkubm9kZXMgJiYgKGkucGFyZW50ICE9PSByb290IHx8IHJvb3QuZmlyc3QgIT09IGkpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaS5yYXdzLmJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB2YWx1ZSA9IGkucmF3cy5iZWZvcmVcbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXFxuJykgIT09IC0xKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxuXSskLywgJycpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodmFsdWUpIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXHNdL2csICcnKVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmF3QmVmb3JlQ2xvc2UgKHJvb3QpIHtcbiAgICBsZXQgdmFsdWVcbiAgICByb290LndhbGsoaSA9PiB7XG4gICAgICBpZiAoaS5ub2RlcyAmJiBpLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpLnJhd3MuYWZ0ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdmFsdWUgPSBpLnJhd3MuYWZ0ZXJcbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXFxuJykgIT09IC0xKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxuXSskLywgJycpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodmFsdWUpIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXHNdL2csICcnKVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmF3QmVmb3JlT3BlbiAocm9vdCkge1xuICAgIGxldCB2YWx1ZVxuICAgIHJvb3Qud2FsayhpID0+IHtcbiAgICAgIGlmIChpLnR5cGUgIT09ICdkZWNsJykge1xuICAgICAgICB2YWx1ZSA9IGkucmF3cy5iZXR3ZWVuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmF3Q29sb24gKHJvb3QpIHtcbiAgICBsZXQgdmFsdWVcbiAgICByb290LndhbGtEZWNscyhpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaS5yYXdzLmJldHdlZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhbHVlID0gaS5yYXdzLmJldHdlZW4ucmVwbGFjZSgvW15cXHM6XS9nLCAnJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGJlZm9yZUFmdGVyIChub2RlLCBkZXRlY3QpIHtcbiAgICBsZXQgdmFsdWVcbiAgICBpZiAobm9kZS50eXBlID09PSAnZGVjbCcpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5yYXcobm9kZSwgbnVsbCwgJ2JlZm9yZURlY2wnKVxuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnY29tbWVudCcpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5yYXcobm9kZSwgbnVsbCwgJ2JlZm9yZUNvbW1lbnQnKVxuICAgIH0gZWxzZSBpZiAoZGV0ZWN0ID09PSAnYmVmb3JlJykge1xuICAgICAgdmFsdWUgPSB0aGlzLnJhdyhub2RlLCBudWxsLCAnYmVmb3JlUnVsZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5yYXcobm9kZSwgbnVsbCwgJ2JlZm9yZUNsb3NlJylcbiAgICB9XG5cbiAgICBsZXQgYnVmID0gbm9kZS5wYXJlbnRcbiAgICBsZXQgZGVwdGggPSAwXG4gICAgd2hpbGUgKGJ1ZiAmJiBidWYudHlwZSAhPT0gJ3Jvb3QnKSB7XG4gICAgICBkZXB0aCArPSAxXG4gICAgICBidWYgPSBidWYucGFyZW50XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ1xcbicpICE9PSAtMSkge1xuICAgICAgbGV0IGluZGVudCA9IHRoaXMucmF3KG5vZGUsIG51bGwsICdpbmRlbnQnKVxuICAgICAgaWYgKGluZGVudC5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgc3RlcCA9IDA7IHN0ZXAgPCBkZXB0aDsgc3RlcCsrKSB2YWx1ZSArPSBpbmRlbnRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHJhd1ZhbHVlIChub2RlLCBwcm9wKSB7XG4gICAgbGV0IHZhbHVlID0gbm9kZVtwcm9wXVxuICAgIGxldCByYXcgPSBub2RlLnJhd3NbcHJvcF1cbiAgICBpZiAocmF3ICYmIHJhdy52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiByYXcucmF3XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3RyaW5naWZpZXJcbiJdLCJmaWxlIjoic3RyaW5naWZpZXIuanMifQ==