container.js 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4. var _declaration = require('./declaration');
  5. var _declaration2 = _interopRequireDefault(_declaration);
  6. var _warnOnce = require('./warn-once');
  7. var _warnOnce2 = _interopRequireDefault(_warnOnce);
  8. var _comment = require('./comment');
  9. var _comment2 = _interopRequireDefault(_comment);
  10. var _node = require('./node');
  11. var _node2 = _interopRequireDefault(_node);
  12. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  13. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  14. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  15. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  16. function cleanSource(nodes) {
  17. return nodes.map(function (i) {
  18. if (i.nodes) i.nodes = cleanSource(i.nodes);
  19. delete i.source;
  20. return i;
  21. });
  22. }
  23. /**
  24. * The {@link Root}, {@link AtRule}, and {@link Rule} container nodes
  25. * inherit some common methods to help work with their children.
  26. *
  27. * Note that all containers can store any content. If you write a rule inside
  28. * a rule, PostCSS will parse it.
  29. *
  30. * @extends Node
  31. * @abstract
  32. */
  33. var Container = function (_Node) {
  34. _inherits(Container, _Node);
  35. function Container() {
  36. _classCallCheck(this, Container);
  37. return _possibleConstructorReturn(this, _Node.apply(this, arguments));
  38. }
  39. Container.prototype.push = function push(child) {
  40. child.parent = this;
  41. this.nodes.push(child);
  42. return this;
  43. };
  44. /**
  45. * Iterates through the container’s immediate children,
  46. * calling `callback` for each child.
  47. *
  48. * Returning `false` in the callback will break iteration.
  49. *
  50. * This method only iterates through the container’s immediate children.
  51. * If you need to recursively iterate through all the container’s descendant
  52. * nodes, use {@link Container#walk}.
  53. *
  54. * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe
  55. * if you are mutating the array of child nodes during iteration.
  56. * PostCSS will adjust the current index to match the mutations.
  57. *
  58. * @param {childIterator} callback - iterator receives each node and index
  59. *
  60. * @return {false|undefined} returns `false` if iteration was broke
  61. *
  62. * @example
  63. * const root = postcss.parse('a { color: black; z-index: 1 }');
  64. * const rule = root.first;
  65. *
  66. * for ( let decl of rule.nodes ) {
  67. * decl.cloneBefore({ prop: '-webkit-' + decl.prop });
  68. * // Cycle will be infinite, because cloneBefore moves the current node
  69. * // to the next index
  70. * }
  71. *
  72. * rule.each(decl => {
  73. * decl.cloneBefore({ prop: '-webkit-' + decl.prop });
  74. * // Will be executed only for color and z-index
  75. * });
  76. */
  77. Container.prototype.each = function each(callback) {
  78. if (!this.lastEach) this.lastEach = 0;
  79. if (!this.indexes) this.indexes = {};
  80. this.lastEach += 1;
  81. var id = this.lastEach;
  82. this.indexes[id] = 0;
  83. if (!this.nodes) return undefined;
  84. var index = void 0,
  85. result = void 0;
  86. while (this.indexes[id] < this.nodes.length) {
  87. index = this.indexes[id];
  88. result = callback(this.nodes[index], index);
  89. if (result === false) break;
  90. this.indexes[id] += 1;
  91. }
  92. delete this.indexes[id];
  93. return result;
  94. };
  95. /**
  96. * Traverses the container’s descendant nodes, calling callback
  97. * for each node.
  98. *
  99. * Like container.each(), this method is safe to use
  100. * if you are mutating arrays during iteration.
  101. *
  102. * If you only need to iterate through the container’s immediate children,
  103. * use {@link Container#each}.
  104. *
  105. * @param {childIterator} callback - iterator receives each node and index
  106. *
  107. * @return {false|undefined} returns `false` if iteration was broke
  108. *
  109. * @example
  110. * root.walk(node => {
  111. * // Traverses all descendant nodes.
  112. * });
  113. */
  114. Container.prototype.walk = function walk(callback) {
  115. return this.each(function (child, i) {
  116. var result = callback(child, i);
  117. if (result !== false && child.walk) {
  118. result = child.walk(callback);
  119. }
  120. return result;
  121. });
  122. };
  123. /**
  124. * Traverses the container’s descendant nodes, calling callback
  125. * for each declaration node.
  126. *
  127. * If you pass a filter, iteration will only happen over declarations
  128. * with matching properties.
  129. *
  130. * Like {@link Container#each}, this method is safe
  131. * to use if you are mutating arrays during iteration.
  132. *
  133. * @param {string|RegExp} [prop] - string or regular expression
  134. * to filter declarations by property name
  135. * @param {childIterator} callback - iterator receives each node and index
  136. *
  137. * @return {false|undefined} returns `false` if iteration was broke
  138. *
  139. * @example
  140. * root.walkDecls(decl => {
  141. * checkPropertySupport(decl.prop);
  142. * });
  143. *
  144. * root.walkDecls('border-radius', decl => {
  145. * decl.remove();
  146. * });
  147. *
  148. * root.walkDecls(/^background/, decl => {
  149. * decl.value = takeFirstColorFromGradient(decl.value);
  150. * });
  151. */
  152. Container.prototype.walkDecls = function walkDecls(prop, callback) {
  153. if (!callback) {
  154. callback = prop;
  155. return this.walk(function (child, i) {
  156. if (child.type === 'decl') {
  157. return callback(child, i);
  158. }
  159. });
  160. } else if (prop instanceof RegExp) {
  161. return this.walk(function (child, i) {
  162. if (child.type === 'decl' && prop.test(child.prop)) {
  163. return callback(child, i);
  164. }
  165. });
  166. } else {
  167. return this.walk(function (child, i) {
  168. if (child.type === 'decl' && child.prop === prop) {
  169. return callback(child, i);
  170. }
  171. });
  172. }
  173. };
  174. /**
  175. * Traverses the container’s descendant nodes, calling callback
  176. * for each rule node.
  177. *
  178. * If you pass a filter, iteration will only happen over rules
  179. * with matching selectors.
  180. *
  181. * Like {@link Container#each}, this method is safe
  182. * to use if you are mutating arrays during iteration.
  183. *
  184. * @param {string|RegExp} [selector] - string or regular expression
  185. * to filter rules by selector
  186. * @param {childIterator} callback - iterator receives each node and index
  187. *
  188. * @return {false|undefined} returns `false` if iteration was broke
  189. *
  190. * @example
  191. * const selectors = [];
  192. * root.walkRules(rule => {
  193. * selectors.push(rule.selector);
  194. * });
  195. * console.log(`Your CSS uses ${selectors.length} selectors`);
  196. */
  197. Container.prototype.walkRules = function walkRules(selector, callback) {
  198. if (!callback) {
  199. callback = selector;
  200. return this.walk(function (child, i) {
  201. if (child.type === 'rule') {
  202. return callback(child, i);
  203. }
  204. });
  205. } else if (selector instanceof RegExp) {
  206. return this.walk(function (child, i) {
  207. if (child.type === 'rule' && selector.test(child.selector)) {
  208. return callback(child, i);
  209. }
  210. });
  211. } else {
  212. return this.walk(function (child, i) {
  213. if (child.type === 'rule' && child.selector === selector) {
  214. return callback(child, i);
  215. }
  216. });
  217. }
  218. };
  219. /**
  220. * Traverses the container’s descendant nodes, calling callback
  221. * for each at-rule node.
  222. *
  223. * If you pass a filter, iteration will only happen over at-rules
  224. * that have matching names.
  225. *
  226. * Like {@link Container#each}, this method is safe
  227. * to use if you are mutating arrays during iteration.
  228. *
  229. * @param {string|RegExp} [name] - string or regular expression
  230. * to filter at-rules by name
  231. * @param {childIterator} callback - iterator receives each node and index
  232. *
  233. * @return {false|undefined} returns `false` if iteration was broke
  234. *
  235. * @example
  236. * root.walkAtRules(rule => {
  237. * if ( isOld(rule.name) ) rule.remove();
  238. * });
  239. *
  240. * let first = false;
  241. * root.walkAtRules('charset', rule => {
  242. * if ( !first ) {
  243. * first = true;
  244. * } else {
  245. * rule.remove();
  246. * }
  247. * });
  248. */
  249. Container.prototype.walkAtRules = function walkAtRules(name, callback) {
  250. if (!callback) {
  251. callback = name;
  252. return this.walk(function (child, i) {
  253. if (child.type === 'atrule') {
  254. return callback(child, i);
  255. }
  256. });
  257. } else if (name instanceof RegExp) {
  258. return this.walk(function (child, i) {
  259. if (child.type === 'atrule' && name.test(child.name)) {
  260. return callback(child, i);
  261. }
  262. });
  263. } else {
  264. return this.walk(function (child, i) {
  265. if (child.type === 'atrule' && child.name === name) {
  266. return callback(child, i);
  267. }
  268. });
  269. }
  270. };
  271. /**
  272. * Traverses the container’s descendant nodes, calling callback
  273. * for each comment node.
  274. *
  275. * Like {@link Container#each}, this method is safe
  276. * to use if you are mutating arrays during iteration.
  277. *
  278. * @param {childIterator} callback - iterator receives each node and index
  279. *
  280. * @return {false|undefined} returns `false` if iteration was broke
  281. *
  282. * @example
  283. * root.walkComments(comment => {
  284. * comment.remove();
  285. * });
  286. */
  287. Container.prototype.walkComments = function walkComments(callback) {
  288. return this.walk(function (child, i) {
  289. if (child.type === 'comment') {
  290. return callback(child, i);
  291. }
  292. });
  293. };
  294. /**
  295. * Inserts new nodes to the start of the container.
  296. *
  297. * @param {...(Node|object|string|Node[])} children - new nodes
  298. *
  299. * @return {Node} this node for methods chain
  300. *
  301. * @example
  302. * const decl1 = postcss.decl({ prop: 'color', value: 'black' });
  303. * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' });
  304. * rule.append(decl1, decl2);
  305. *
  306. * root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule
  307. * root.append({ selector: 'a' }); // rule
  308. * rule.append({ prop: 'color', value: 'black' }); // declaration
  309. * rule.append({ text: 'Comment' }) // comment
  310. *
  311. * root.append('a {}');
  312. * root.first.append('color: black; z-index: 1');
  313. */
  314. Container.prototype.append = function append() {
  315. for (var _len = arguments.length, children = Array(_len), _key = 0; _key < _len; _key++) {
  316. children[_key] = arguments[_key];
  317. }
  318. for (var _iterator = children, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
  319. var _ref;
  320. if (_isArray) {
  321. if (_i >= _iterator.length) break;
  322. _ref = _iterator[_i++];
  323. } else {
  324. _i = _iterator.next();
  325. if (_i.done) break;
  326. _ref = _i.value;
  327. }
  328. var child = _ref;
  329. var nodes = this.normalize(child, this.last);
  330. for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
  331. var _ref2;
  332. if (_isArray2) {
  333. if (_i2 >= _iterator2.length) break;
  334. _ref2 = _iterator2[_i2++];
  335. } else {
  336. _i2 = _iterator2.next();
  337. if (_i2.done) break;
  338. _ref2 = _i2.value;
  339. }
  340. var node = _ref2;
  341. this.nodes.push(node);
  342. }
  343. }
  344. return this;
  345. };
  346. /**
  347. * Inserts new nodes to the end of the container.
  348. *
  349. * @param {...(Node|object|string|Node[])} children - new nodes
  350. *
  351. * @return {Node} this node for methods chain
  352. *
  353. * @example
  354. * const decl1 = postcss.decl({ prop: 'color', value: 'black' });
  355. * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' });
  356. * rule.prepend(decl1, decl2);
  357. *
  358. * root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule
  359. * root.append({ selector: 'a' }); // rule
  360. * rule.append({ prop: 'color', value: 'black' }); // declaration
  361. * rule.append({ text: 'Comment' }) // comment
  362. *
  363. * root.append('a {}');
  364. * root.first.append('color: black; z-index: 1');
  365. */
  366. Container.prototype.prepend = function prepend() {
  367. for (var _len2 = arguments.length, children = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  368. children[_key2] = arguments[_key2];
  369. }
  370. children = children.reverse();
  371. for (var _iterator3 = children, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
  372. var _ref3;
  373. if (_isArray3) {
  374. if (_i3 >= _iterator3.length) break;
  375. _ref3 = _iterator3[_i3++];
  376. } else {
  377. _i3 = _iterator3.next();
  378. if (_i3.done) break;
  379. _ref3 = _i3.value;
  380. }
  381. var child = _ref3;
  382. var nodes = this.normalize(child, this.first, 'prepend').reverse();
  383. for (var _iterator4 = nodes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
  384. var _ref4;
  385. if (_isArray4) {
  386. if (_i4 >= _iterator4.length) break;
  387. _ref4 = _iterator4[_i4++];
  388. } else {
  389. _i4 = _iterator4.next();
  390. if (_i4.done) break;
  391. _ref4 = _i4.value;
  392. }
  393. var node = _ref4;
  394. this.nodes.unshift(node);
  395. }for (var id in this.indexes) {
  396. this.indexes[id] = this.indexes[id] + nodes.length;
  397. }
  398. }
  399. return this;
  400. };
  401. Container.prototype.cleanRaws = function cleanRaws(keepBetween) {
  402. _Node.prototype.cleanRaws.call(this, keepBetween);
  403. if (this.nodes) {
  404. for (var _iterator5 = this.nodes, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
  405. var _ref5;
  406. if (_isArray5) {
  407. if (_i5 >= _iterator5.length) break;
  408. _ref5 = _iterator5[_i5++];
  409. } else {
  410. _i5 = _iterator5.next();
  411. if (_i5.done) break;
  412. _ref5 = _i5.value;
  413. }
  414. var node = _ref5;
  415. node.cleanRaws(keepBetween);
  416. }
  417. }
  418. };
  419. /**
  420. * Insert new node before old node within the container.
  421. *
  422. * @param {Node|number} exist - child or child’s index.
  423. * @param {Node|object|string|Node[]} add - new node
  424. *
  425. * @return {Node} this node for methods chain
  426. *
  427. * @example
  428. * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop }));
  429. */
  430. Container.prototype.insertBefore = function insertBefore(exist, add) {
  431. exist = this.index(exist);
  432. var type = exist === 0 ? 'prepend' : false;
  433. var nodes = this.normalize(add, this.nodes[exist], type).reverse();
  434. for (var _iterator6 = nodes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
  435. var _ref6;
  436. if (_isArray6) {
  437. if (_i6 >= _iterator6.length) break;
  438. _ref6 = _iterator6[_i6++];
  439. } else {
  440. _i6 = _iterator6.next();
  441. if (_i6.done) break;
  442. _ref6 = _i6.value;
  443. }
  444. var node = _ref6;
  445. this.nodes.splice(exist, 0, node);
  446. }var index = void 0;
  447. for (var id in this.indexes) {
  448. index = this.indexes[id];
  449. if (exist <= index) {
  450. this.indexes[id] = index + nodes.length;
  451. }
  452. }
  453. return this;
  454. };
  455. /**
  456. * Insert new node after old node within the container.
  457. *
  458. * @param {Node|number} exist - child or child’s index
  459. * @param {Node|object|string|Node[]} add - new node
  460. *
  461. * @return {Node} this node for methods chain
  462. */
  463. Container.prototype.insertAfter = function insertAfter(exist, add) {
  464. exist = this.index(exist);
  465. var nodes = this.normalize(add, this.nodes[exist]).reverse();
  466. for (var _iterator7 = nodes, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {
  467. var _ref7;
  468. if (_isArray7) {
  469. if (_i7 >= _iterator7.length) break;
  470. _ref7 = _iterator7[_i7++];
  471. } else {
  472. _i7 = _iterator7.next();
  473. if (_i7.done) break;
  474. _ref7 = _i7.value;
  475. }
  476. var node = _ref7;
  477. this.nodes.splice(exist + 1, 0, node);
  478. }var index = void 0;
  479. for (var id in this.indexes) {
  480. index = this.indexes[id];
  481. if (exist < index) {
  482. this.indexes[id] = index + nodes.length;
  483. }
  484. }
  485. return this;
  486. };
  487. Container.prototype.remove = function remove(child) {
  488. if (typeof child !== 'undefined') {
  489. (0, _warnOnce2.default)('Container#remove is deprecated. ' + 'Use Container#removeChild');
  490. this.removeChild(child);
  491. } else {
  492. _Node.prototype.remove.call(this);
  493. }
  494. return this;
  495. };
  496. /**
  497. * Removes node from the container and cleans the parent properties
  498. * from the node and its children.
  499. *
  500. * @param {Node|number} child - child or child’s index
  501. *
  502. * @return {Node} this node for methods chain
  503. *
  504. * @example
  505. * rule.nodes.length //=> 5
  506. * rule.removeChild(decl);
  507. * rule.nodes.length //=> 4
  508. * decl.parent //=> undefined
  509. */
  510. Container.prototype.removeChild = function removeChild(child) {
  511. child = this.index(child);
  512. this.nodes[child].parent = undefined;
  513. this.nodes.splice(child, 1);
  514. var index = void 0;
  515. for (var id in this.indexes) {
  516. index = this.indexes[id];
  517. if (index >= child) {
  518. this.indexes[id] = index - 1;
  519. }
  520. }
  521. return this;
  522. };
  523. /**
  524. * Removes all children from the container
  525. * and cleans their parent properties.
  526. *
  527. * @return {Node} this node for methods chain
  528. *
  529. * @example
  530. * rule.removeAll();
  531. * rule.nodes.length //=> 0
  532. */
  533. Container.prototype.removeAll = function removeAll() {
  534. for (var _iterator8 = this.nodes, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {
  535. var _ref8;
  536. if (_isArray8) {
  537. if (_i8 >= _iterator8.length) break;
  538. _ref8 = _iterator8[_i8++];
  539. } else {
  540. _i8 = _iterator8.next();
  541. if (_i8.done) break;
  542. _ref8 = _i8.value;
  543. }
  544. var node = _ref8;
  545. node.parent = undefined;
  546. }this.nodes = [];
  547. return this;
  548. };
  549. /**
  550. * Passes all declaration values within the container that match pattern
  551. * through callback, replacing those values with the returned result
  552. * of callback.
  553. *
  554. * This method is useful if you are using a custom unit or function
  555. * and need to iterate through all values.
  556. *
  557. * @param {string|RegExp} pattern - replace pattern
  558. * @param {object} opts - options to speed up the search
  559. * @param {string|string[]} opts.props - an array of property names
  560. * @param {string} opts.fast - string that’s used
  561. * to narrow down values and speed up
  562. the regexp search
  563. * @param {function|string} callback - string to replace pattern
  564. * or callback that returns a new
  565. * value.
  566. * The callback will receive
  567. * the same arguments as those
  568. * passed to a function parameter
  569. * of `String#replace`.
  570. *
  571. * @return {Node} this node for methods chain
  572. *
  573. * @example
  574. * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => {
  575. * return 15 * parseInt(string) + 'px';
  576. * });
  577. */
  578. Container.prototype.replaceValues = function replaceValues(pattern, opts, callback) {
  579. if (!callback) {
  580. callback = opts;
  581. opts = {};
  582. }
  583. this.walkDecls(function (decl) {
  584. if (opts.props && opts.props.indexOf(decl.prop) === -1) return;
  585. if (opts.fast && decl.value.indexOf(opts.fast) === -1) return;
  586. decl.value = decl.value.replace(pattern, callback);
  587. });
  588. return this;
  589. };
  590. /**
  591. * Returns `true` if callback returns `true`
  592. * for all of the container’s children.
  593. *
  594. * @param {childCondition} condition - iterator returns true or false.
  595. *
  596. * @return {boolean} is every child pass condition
  597. *
  598. * @example
  599. * const noPrefixes = rule.every(i => i.prop[0] !== '-');
  600. */
  601. Container.prototype.every = function every(condition) {
  602. return this.nodes.every(condition);
  603. };
  604. /**
  605. * Returns `true` if callback returns `true` for (at least) one
  606. * of the container’s children.
  607. *
  608. * @param {childCondition} condition - iterator returns true or false.
  609. *
  610. * @return {boolean} is some child pass condition
  611. *
  612. * @example
  613. * const hasPrefix = rule.some(i => i.prop[0] === '-');
  614. */
  615. Container.prototype.some = function some(condition) {
  616. return this.nodes.some(condition);
  617. };
  618. /**
  619. * Returns a `child`’s index within the {@link Container#nodes} array.
  620. *
  621. * @param {Node} child - child of the current container.
  622. *
  623. * @return {number} child index
  624. *
  625. * @example
  626. * rule.index( rule.nodes[2] ) //=> 2
  627. */
  628. Container.prototype.index = function index(child) {
  629. if (typeof child === 'number') {
  630. return child;
  631. } else {
  632. return this.nodes.indexOf(child);
  633. }
  634. };
  635. /**
  636. * The container’s first child.
  637. *
  638. * @type {Node}
  639. *
  640. * @example
  641. * rule.first == rules.nodes[0];
  642. */
  643. Container.prototype.normalize = function normalize(nodes, sample) {
  644. var _this2 = this;
  645. if (typeof nodes === 'string') {
  646. var parse = require('./parse');
  647. nodes = cleanSource(parse(nodes).nodes);
  648. } else if (!Array.isArray(nodes)) {
  649. if (nodes.type === 'root') {
  650. nodes = nodes.nodes;
  651. } else if (nodes.type) {
  652. nodes = [nodes];
  653. } else if (nodes.prop) {
  654. if (typeof nodes.value === 'undefined') {
  655. throw new Error('Value field is missed in node creation');
  656. } else if (typeof nodes.value !== 'string') {
  657. nodes.value = String(nodes.value);
  658. }
  659. nodes = [new _declaration2.default(nodes)];
  660. } else if (nodes.selector) {
  661. var Rule = require('./rule');
  662. nodes = [new Rule(nodes)];
  663. } else if (nodes.name) {
  664. var AtRule = require('./at-rule');
  665. nodes = [new AtRule(nodes)];
  666. } else if (nodes.text) {
  667. nodes = [new _comment2.default(nodes)];
  668. } else {
  669. throw new Error('Unknown node type in node creation');
  670. }
  671. }
  672. var processed = nodes.map(function (i) {
  673. if (typeof i.raws === 'undefined') i = _this2.rebuild(i);
  674. if (i.parent) i = i.clone();
  675. if (typeof i.raws.before === 'undefined') {
  676. if (sample && typeof sample.raws.before !== 'undefined') {
  677. i.raws.before = sample.raws.before.replace(/[^\s]/g, '');
  678. }
  679. }
  680. i.parent = _this2;
  681. return i;
  682. });
  683. return processed;
  684. };
  685. Container.prototype.rebuild = function rebuild(node, parent) {
  686. var _this3 = this;
  687. var fix = void 0;
  688. if (node.type === 'root') {
  689. var Root = require('./root');
  690. fix = new Root();
  691. } else if (node.type === 'atrule') {
  692. var AtRule = require('./at-rule');
  693. fix = new AtRule();
  694. } else if (node.type === 'rule') {
  695. var Rule = require('./rule');
  696. fix = new Rule();
  697. } else if (node.type === 'decl') {
  698. fix = new _declaration2.default();
  699. } else if (node.type === 'comment') {
  700. fix = new _comment2.default();
  701. }
  702. for (var i in node) {
  703. if (i === 'nodes') {
  704. fix.nodes = node.nodes.map(function (j) {
  705. return _this3.rebuild(j, fix);
  706. });
  707. } else if (i === 'parent' && parent) {
  708. fix.parent = parent;
  709. } else if (node.hasOwnProperty(i)) {
  710. fix[i] = node[i];
  711. }
  712. }
  713. return fix;
  714. };
  715. Container.prototype.eachInside = function eachInside(callback) {
  716. (0, _warnOnce2.default)('Container#eachInside is deprecated. ' + 'Use Container#walk instead.');
  717. return this.walk(callback);
  718. };
  719. Container.prototype.eachDecl = function eachDecl(prop, callback) {
  720. (0, _warnOnce2.default)('Container#eachDecl is deprecated. ' + 'Use Container#walkDecls instead.');
  721. return this.walkDecls(prop, callback);
  722. };
  723. Container.prototype.eachRule = function eachRule(selector, callback) {
  724. (0, _warnOnce2.default)('Container#eachRule is deprecated. ' + 'Use Container#walkRules instead.');
  725. return this.walkRules(selector, callback);
  726. };
  727. Container.prototype.eachAtRule = function eachAtRule(name, callback) {
  728. (0, _warnOnce2.default)('Container#eachAtRule is deprecated. ' + 'Use Container#walkAtRules instead.');
  729. return this.walkAtRules(name, callback);
  730. };
  731. Container.prototype.eachComment = function eachComment(callback) {
  732. (0, _warnOnce2.default)('Container#eachComment is deprecated. ' + 'Use Container#walkComments instead.');
  733. return this.walkComments(callback);
  734. };
  735. _createClass(Container, [{
  736. key: 'first',
  737. get: function get() {
  738. if (!this.nodes) return undefined;
  739. return this.nodes[0];
  740. }
  741. /**
  742. * The container’s last child.
  743. *
  744. * @type {Node}
  745. *
  746. * @example
  747. * rule.last == rule.nodes[rule.nodes.length - 1];
  748. */
  749. }, {
  750. key: 'last',
  751. get: function get() {
  752. if (!this.nodes) return undefined;
  753. return this.nodes[this.nodes.length - 1];
  754. }
  755. }, {
  756. key: 'semicolon',
  757. get: function get() {
  758. (0, _warnOnce2.default)('Node#semicolon is deprecated. Use Node#raws.semicolon');
  759. return this.raws.semicolon;
  760. },
  761. set: function set(val) {
  762. (0, _warnOnce2.default)('Node#semicolon is deprecated. Use Node#raws.semicolon');
  763. this.raws.semicolon = val;
  764. }
  765. }, {
  766. key: 'after',
  767. get: function get() {
  768. (0, _warnOnce2.default)('Node#after is deprecated. Use Node#raws.after');
  769. return this.raws.after;
  770. },
  771. set: function set(val) {
  772. (0, _warnOnce2.default)('Node#after is deprecated. Use Node#raws.after');
  773. this.raws.after = val;
  774. }
  775. /**
  776. * @memberof Container#
  777. * @member {Node[]} nodes - an array containing the container’s children
  778. *
  779. * @example
  780. * const root = postcss.parse('a { color: black }');
  781. * root.nodes.length //=> 1
  782. * root.nodes[0].selector //=> 'a'
  783. * root.nodes[0].nodes[0].prop //=> 'color'
  784. */
  785. }]);
  786. return Container;
  787. }(_node2.default);
  788. exports.default = Container;
  789. /**
  790. * @callback childCondition
  791. * @param {Node} node - container child
  792. * @param {number} index - child index
  793. * @param {Node[]} nodes - all container children
  794. * @return {boolean}
  795. */
  796. /**
  797. * @callback childIterator
  798. * @param {Node} node - container child
  799. * @param {number} index - child index
  800. * @return {false|undefined} returning `false` will break iteration
  801. */
  802. module.exports = exports['default'];
  803. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvY29udGFpbmVyLmVzNiJdLCJuYW1lcyI6WyJjbGVhblNvdXJjZSIsIm5vZGVzIiwibWFwIiwiaSIsInNvdXJjZSIsIkNvbnRhaW5lciIsInB1c2giLCJjaGlsZCIsInBhcmVudCIsImVhY2giLCJjYWxsYmFjayIsImxhc3RFYWNoIiwiaW5kZXhlcyIsImlkIiwidW5kZWZpbmVkIiwiaW5kZXgiLCJyZXN1bHQiLCJsZW5ndGgiLCJ3YWxrIiwid2Fsa0RlY2xzIiwicHJvcCIsInR5cGUiLCJSZWdFeHAiLCJ0ZXN0Iiwid2Fsa1J1bGVzIiwic2VsZWN0b3IiLCJ3YWxrQXRSdWxlcyIsIm5hbWUiLCJ3YWxrQ29tbWVudHMiLCJhcHBlbmQiLCJjaGlsZHJlbiIsIm5vcm1hbGl6ZSIsImxhc3QiLCJub2RlIiwicHJlcGVuZCIsInJldmVyc2UiLCJmaXJzdCIsInVuc2hpZnQiLCJjbGVhblJhd3MiLCJrZWVwQmV0d2VlbiIsImluc2VydEJlZm9yZSIsImV4aXN0IiwiYWRkIiwic3BsaWNlIiwiaW5zZXJ0QWZ0ZXIiLCJyZW1vdmUiLCJyZW1vdmVDaGlsZCIsInJlbW92ZUFsbCIsInJlcGxhY2VWYWx1ZXMiLCJwYXR0ZXJuIiwib3B0cyIsInByb3BzIiwiaW5kZXhPZiIsImRlY2wiLCJmYXN0IiwidmFsdWUiLCJyZXBsYWNlIiwiZXZlcnkiLCJjb25kaXRpb24iLCJzb21lIiwic2FtcGxlIiwicGFyc2UiLCJyZXF1aXJlIiwiQXJyYXkiLCJpc0FycmF5IiwiRXJyb3IiLCJTdHJpbmciLCJSdWxlIiwiQXRSdWxlIiwidGV4dCIsInByb2Nlc3NlZCIsInJhd3MiLCJyZWJ1aWxkIiwiY2xvbmUiLCJiZWZvcmUiLCJmaXgiLCJSb290IiwiaiIsImhhc093blByb3BlcnR5IiwiZWFjaEluc2lkZSIsImVhY2hEZWNsIiwiZWFjaFJ1bGUiLCJlYWNoQXRSdWxlIiwiZWFjaENvbW1lbnQiLCJzZW1pY29sb24iLCJ2YWwiLCJhZnRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7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a0JsQixRQUFsQixDQUFQO0FBQ0gsSzs7Ozs0QkF6SFc7QUFDUixnQkFBSyxDQUFDLEtBQUtULEtBQVgsRUFBbUIsT0FBT2EsU0FBUDtBQUNuQixtQkFBTyxLQUFLYixLQUFMLENBQVcsQ0FBWCxDQUFQO0FBQ0g7O0FBRUQ7Ozs7Ozs7Ozs7OzRCQVFXO0FBQ1AsZ0JBQUssQ0FBQyxLQUFLQSxLQUFYLEVBQW1CLE9BQU9hLFNBQVA7QUFDbkIsbUJBQU8sS0FBS2IsS0FBTCxDQUFXLEtBQUtBLEtBQUwsQ0FBV2dCLE1BQVgsR0FBb0IsQ0FBL0IsQ0FBUDtBQUNIOzs7NEJBMkdlO0FBQ1osb0NBQVMsdURBQVQ7QUFDQSxtQkFBTyxLQUFLc0QsSUFBTCxDQUFVYSxTQUFqQjtBQUNILFM7MEJBRWFDLEcsRUFBSztBQUNmLG9DQUFTLHVEQUFUO0FBQ0EsaUJBQUtkLElBQUwsQ0FBVWEsU0FBVixHQUFzQkMsR0FBdEI7QUFDSDs7OzRCQUVXO0FBQ1Isb0NBQVMsK0NBQVQ7QUFDQSxtQkFBTyxLQUFLZCxJQUFMLENBQVVlLEtBQWpCO0FBQ0gsUzswQkFFU0QsRyxFQUFLO0FBQ1gsb0NBQVMsK0NBQVQ7QUFDQSxpQkFBS2QsSUFBTCxDQUFVZSxLQUFWLEdBQWtCRCxHQUFsQjtBQUNIOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O2tCQWFXaEYsUzs7QUFHZjs7Ozs7Ozs7QUFRQSIsImZpbGUiOiJjb250YWluZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVjbGFyYXRpb24gZnJvbSAnLi9kZWNsYXJhdGlvbic7XG5pbXBvcnQgd2Fybk9uY2UgICAgZnJvbSAnLi93YXJuLW9uY2UnO1xuaW1wb3J0IENvbW1lbnQgICAgIGZyb20gJy4vY29tbWVudCc7XG5pbXBvcnQgTm9kZSAgICAgICAgZnJvbSAnLi9ub2RlJztcblxuZnVuY3Rpb24gY2xlYW5Tb3VyY2Uobm9kZXMpIHtcbiAgICByZXR1cm4gbm9kZXMubWFwKCBpID0+IHtcbiAgICAgICAgaWYgKCBpLm5vZGVzICkgaS5ub2RlcyA9IGNsZWFuU291cmNlKGkubm9kZXMpO1xuICAgICAgICBkZWxldGUgaS5zb3VyY2U7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgUm9vdH0sIHtAbGluayBBdFJ1bGV9LCBhbmQge0BsaW5rIFJ1bGV9IGNvbnRhaW5lciBub2Rlc1xuICogaW5oZXJpdCBzb21lIGNvbW1vbiBtZXRob2RzIHRvIGhlbHAgd29yayB3aXRoIHRoZWlyIGNoaWxkcmVuLlxuICpcbiAqIE5vdGUgdGhhdCBhbGwgY29udGFpbmVycyBjYW4gc3RvcmUgYW55IGNvbnRlbnQuIElmIHlvdSB3cml0ZSBhIHJ1bGUgaW5zaWRlXG4gKiBhIHJ1bGUsIFBvc3RDU1Mgd2lsbCBwYXJzZSBpdC5cbiAqXG4gKiBAZXh0ZW5kcyBOb2RlXG4gKiBAYWJzdHJhY3RcbiAqL1xuY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgTm9kZSB7XG5cbiAgICBwdXNoKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGNvbnRhaW5lcuKAmXMgaW1tZWRpYXRlIGNoaWxkcmVuLFxuICAgICAqIGNhbGxpbmcgYGNhbGxiYWNrYCBmb3IgZWFjaCBjaGlsZC5cbiAgICAgKlxuICAgICAqIFJldHVybmluZyBgZmFsc2VgIGluIHRoZSBjYWxsYmFjayB3aWxsIGJyZWFrIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgY29udGFpbmVy4oCZcyBpbW1lZGlhdGUgY2hpbGRyZW4uXG4gICAgICogSWYgeW91IG5lZWQgdG8gcmVjdXJzaXZlbHkgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgY29udGFpbmVy4oCZcyBkZXNjZW5kYW50XG4gICAgICogbm9kZXMsIHVzZSB7QGxpbmsgQ29udGFpbmVyI3dhbGt9LlxuICAgICAqXG4gICAgICogVW5saWtlIHRoZSBmb3IgYHt9YC1jeWNsZSBvciBgQXJyYXkjZm9yRWFjaGAgdGhpcyBpdGVyYXRvciBpcyBzYWZlXG4gICAgICogaWYgeW91IGFyZSBtdXRhdGluZyB0aGUgYXJyYXkgb2YgY2hpbGQgbm9kZXMgZHVyaW5nIGl0ZXJhdGlvbi5cbiAgICAgKiBQb3N0Q1NTIHdpbGwgYWRqdXN0IHRoZSBjdXJyZW50IGluZGV4IHRvIG1hdGNoIHRoZSBtdXRhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2NoaWxkSXRlcmF0b3J9IGNhbGxiYWNrIC0gaXRlcmF0b3IgcmVjZWl2ZXMgZWFjaCBub2RlIGFuZCBpbmRleFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5zIGBmYWxzZWAgaWYgaXRlcmF0aW9uIHdhcyBicm9rZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZSgnYSB7IGNvbG9yOiBibGFjazsgei1pbmRleDogMSB9Jyk7XG4gICAgICogY29uc3QgcnVsZSA9IHJvb3QuZmlyc3Q7XG4gICAgICpcbiAgICAgKiBmb3IgKCBsZXQgZGVjbCBvZiBydWxlLm5vZGVzICkge1xuICAgICAqICAgICBkZWNsLmNsb25lQmVmb3JlKHsgcHJvcDogJy13ZWJraXQtJyArIGRlY2wucHJvcCB9KTtcbiAgICAgKiAgICAgLy8gQ3ljbGUgd2lsbCBiZSBpbmZpbml0ZSwgYmVjYXVzZSBjbG9uZUJlZm9yZSBtb3ZlcyB0aGUgY3VycmVudCBub2RlXG4gICAgICogICAgIC8vIHRvIHRoZSBuZXh0IGluZGV4XG4gICAgICogfVxuICAgICAqXG4gICAgICogcnVsZS5lYWNoKGRlY2wgPT4ge1xuICAgICAqICAgICBkZWNsLmNsb25lQmVmb3JlKHsgcHJvcDogJy13ZWJraXQtJyArIGRlY2wucHJvcCB9KTtcbiAgICAgKiAgICAgLy8gV2lsbCBiZSBleGVjdXRlZCBvbmx5IGZvciBjb2xvciBhbmQgei1pbmRleFxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGVhY2goY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCAhdGhpcy5sYXN0RWFjaCApIHRoaXMubGFzdEVhY2ggPSAwO1xuICAgICAgICBpZiAoICF0aGlzLmluZGV4ZXMgKSB0aGlzLmluZGV4ZXMgPSB7IH07XG5cbiAgICAgICAgdGhpcy5sYXN0RWFjaCArPSAxO1xuICAgICAgICBsZXQgaWQgPSB0aGlzLmxhc3RFYWNoO1xuICAgICAgICB0aGlzLmluZGV4ZXNbaWRdID0gMDtcblxuICAgICAgICBpZiAoICF0aGlzLm5vZGVzICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgaW5kZXgsIHJlc3VsdDtcbiAgICAgICAgd2hpbGUgKCB0aGlzLmluZGV4ZXNbaWRdIDwgdGhpcy5ub2Rlcy5sZW5ndGggKSB7XG4gICAgICAgICAgICBpbmRleCAgPSB0aGlzLmluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodGhpcy5ub2Rlc1tpbmRleF0sIGluZGV4KTtcbiAgICAgICAgICAgIGlmICggcmVzdWx0ID09PSBmYWxzZSApIGJyZWFrO1xuXG4gICAgICAgICAgICB0aGlzLmluZGV4ZXNbaWRdICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy5pbmRleGVzW2lkXTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYXZlcnNlcyB0aGUgY29udGFpbmVy4oCZcyBkZXNjZW5kYW50IG5vZGVzLCBjYWxsaW5nIGNhbGxiYWNrXG4gICAgICogZm9yIGVhY2ggbm9kZS5cbiAgICAgKlxuICAgICAqIExpa2UgY29udGFpbmVyLmVhY2goKSwgdGhpcyBtZXRob2QgaXMgc2FmZSB0byB1c2VcbiAgICAgKiBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogSWYgeW91IG9ubHkgbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGNvbnRhaW5lcuKAmXMgaW1tZWRpYXRlIGNoaWxkcmVuLFxuICAgICAqIHVzZSB7QGxpbmsgQ29udGFpbmVyI2VhY2h9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtjaGlsZEl0ZXJhdG9yfSBjYWxsYmFjayAtIGl0ZXJhdG9yIHJlY2VpdmVzIGVhY2ggbm9kZSBhbmQgaW5kZXhcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2ZhbHNlfHVuZGVmaW5lZH0gcmV0dXJucyBgZmFsc2VgIGlmIGl0ZXJhdGlvbiB3YXMgYnJva2VcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcm9vdC53YWxrKG5vZGUgPT4ge1xuICAgICAqICAgLy8gVHJhdmVyc2VzIGFsbCBkZXNjZW5kYW50IG5vZGVzLlxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHdhbGsoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaCggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgaWYgKCByZXN1bHQgIT09IGZhbHNlICYmIGNoaWxkLndhbGsgKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY2hpbGQud2FsayhjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgICAqIGZvciBlYWNoIGRlY2xhcmF0aW9uIG5vZGUuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyBhIGZpbHRlciwgaXRlcmF0aW9uIHdpbGwgb25seSBoYXBwZW4gb3ZlciBkZWNsYXJhdGlvbnNcbiAgICAgKiB3aXRoIG1hdGNoaW5nIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBMaWtlIHtAbGluayBDb250YWluZXIjZWFjaH0sIHRoaXMgbWV0aG9kIGlzIHNhZmVcbiAgICAgKiB0byB1c2UgaWYgeW91IGFyZSBtdXRhdGluZyBhcnJheXMgZHVyaW5nIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gW3Byb3BdICAgLSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbHRlciBkZWNsYXJhdGlvbnMgYnkgcHJvcGVydHkgbmFtZVxuICAgICAqIEBwYXJhbSB7Y2hpbGRJdGVyYXRvcn0gY2FsbGJhY2sgLSBpdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IHJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJvb3Qud2Fsa0RlY2xzKGRlY2wgPT4ge1xuICAgICAqICAgY2hlY2tQcm9wZXJ0eVN1cHBvcnQoZGVjbC5wcm9wKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHJvb3Qud2Fsa0RlY2xzKCdib3JkZXItcmFkaXVzJywgZGVjbCA9PiB7XG4gICAgICogICBkZWNsLnJlbW92ZSgpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcm9vdC53YWxrRGVjbHMoL15iYWNrZ3JvdW5kLywgZGVjbCA9PiB7XG4gICAgICogICBkZWNsLnZhbHVlID0gdGFrZUZpcnN0Q29sb3JGcm9tR3JhZGllbnQoZGVjbC52YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgd2Fsa0RlY2xzKHByb3AsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICggIWNhbGxiYWNrICkge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9wO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAnZGVjbCcgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIHByb3AgaW5zdGFuY2VvZiBSZWdFeHAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdkZWNsJyAmJiBwcm9wLnRlc3QoY2hpbGQucHJvcCkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdkZWNsJyAmJiBjaGlsZC5wcm9wID09PSBwcm9wICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHRoZSBjb250YWluZXLigJlzIGRlc2NlbmRhbnQgbm9kZXMsIGNhbGxpbmcgY2FsbGJhY2tcbiAgICAgKiBmb3IgZWFjaCBydWxlIG5vZGUuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyBhIGZpbHRlciwgaXRlcmF0aW9uIHdpbGwgb25seSBoYXBwZW4gb3ZlciBydWxlc1xuICAgICAqIHdpdGggbWF0Y2hpbmcgc2VsZWN0b3JzLlxuICAgICAqXG4gICAgICogTGlrZSB7QGxpbmsgQ29udGFpbmVyI2VhY2h9LCB0aGlzIG1ldGhvZCBpcyBzYWZlXG4gICAgICogdG8gdXNlIGlmIHlvdSBhcmUgbXV0YXRpbmcgYXJyYXlzIGR1cmluZyBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IFtzZWxlY3Rvcl0gLSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmlsdGVyIHJ1bGVzIGJ5IHNlbGVjdG9yXG4gICAgICogQHBhcmFtIHtjaGlsZEl0ZXJhdG9yfSBjYWxsYmFjayAgIC0gaXRlcmF0b3IgcmVjZWl2ZXMgZWFjaCBub2RlIGFuZCBpbmRleFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5zIGBmYWxzZWAgaWYgaXRlcmF0aW9uIHdhcyBicm9rZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzZWxlY3RvcnMgPSBbXTtcbiAgICAgKiByb290LndhbGtSdWxlcyhydWxlID0+IHtcbiAgICAgKiAgIHNlbGVjdG9ycy5wdXNoKHJ1bGUuc2VsZWN0b3IpO1xuICAgICAqIH0pO1xuICAgICAqIGNvbnNvbGUubG9nKGBZb3VyIENTUyB1c2VzICR7c2VsZWN0b3JzLmxlbmd0aH0gc2VsZWN0b3JzYCk7XG4gICAgICovXG4gICAgd2Fsa1J1bGVzKHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoICFjYWxsYmFjayApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhbGsoIChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICggY2hpbGQudHlwZSA9PT0gJ3J1bGUnICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCBzZWxlY3RvciBpbnN0YW5jZW9mIFJlZ0V4cCApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhbGsoIChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICggY2hpbGQudHlwZSA9PT0gJ3J1bGUnICYmIHNlbGVjdG9yLnRlc3QoY2hpbGQuc2VsZWN0b3IpICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAncnVsZScgJiYgY2hpbGQuc2VsZWN0b3IgPT09IHNlbGVjdG9yICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHRoZSBjb250YWluZXLigJlzIGRlc2NlbmRhbnQgbm9kZXMsIGNhbGxpbmcgY2FsbGJhY2tcbiAgICAgKiBmb3IgZWFjaCBhdC1ydWxlIG5vZGUuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyBhIGZpbHRlciwgaXRlcmF0aW9uIHdpbGwgb25seSBoYXBwZW4gb3ZlciBhdC1ydWxlc1xuICAgICAqIHRoYXQgaGF2ZSBtYXRjaGluZyBuYW1lcy5cbiAgICAgKlxuICAgICAqIExpa2Uge0BsaW5rIENvbnRhaW5lciNlYWNofSwgdGhpcyBtZXRob2QgaXMgc2FmZVxuICAgICAqIHRvIHVzZSBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBbbmFtZV0gICAtIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmlsdGVyIGF0LXJ1bGVzIGJ5IG5hbWVcbiAgICAgKiBAcGFyYW0ge2NoaWxkSXRlcmF0b3J9IGNhbGxiYWNrIC0gaXRlcmF0b3IgcmVjZWl2ZXMgZWFjaCBub2RlIGFuZCBpbmRleFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5zIGBmYWxzZWAgaWYgaXRlcmF0aW9uIHdhcyBicm9rZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiByb290LndhbGtBdFJ1bGVzKHJ1bGUgPT4ge1xuICAgICAqICAgaWYgKCBpc09sZChydWxlLm5hbWUpICkgcnVsZS5yZW1vdmUoKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGxldCBmaXJzdCA9IGZhbHNlO1xuICAgICAqIHJvb3Qud2Fsa0F0UnVsZXMoJ2NoYXJzZXQnLCBydWxlID0+IHtcbiAgICAgKiAgIGlmICggIWZpcnN0ICkge1xuICAgICAqICAgICBmaXJzdCA9IHRydWU7XG4gICAgICogICB9IGVsc2Uge1xuICAgICAqICAgICBydWxlLnJlbW92ZSgpO1xuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHdhbGtBdFJ1bGVzKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICggIWNhbGxiYWNrICkge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAnYXRydWxlJyApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICggbmFtZSBpbnN0YW5jZW9mIFJlZ0V4cCApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhbGsoIChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICggY2hpbGQudHlwZSA9PT0gJ2F0cnVsZScgJiYgbmFtZS50ZXN0KGNoaWxkLm5hbWUpICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAnYXRydWxlJyAmJiBjaGlsZC5uYW1lID09PSBuYW1lICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHRoZSBjb250YWluZXLigJlzIGRlc2NlbmRhbnQgbm9kZXMsIGNhbGxpbmcgY2FsbGJhY2tcbiAgICAgKiBmb3IgZWFjaCBjb21tZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBMaWtlIHtAbGluayBDb250YWluZXIjZWFjaH0sIHRoaXMgbWV0aG9kIGlzIHNhZmVcbiAgICAgKiB0byB1c2UgaWYgeW91IGFyZSBtdXRhdGluZyBhcnJheXMgZHVyaW5nIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Y2hpbGRJdGVyYXRvcn0gY2FsbGJhY2sgLSBpdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IHJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJvb3Qud2Fsa0NvbW1lbnRzKGNvbW1lbnQgPT4ge1xuICAgICAqICAgY29tbWVudC5yZW1vdmUoKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB3YWxrQ29tbWVudHMoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdjb21tZW50JyApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIG5ldyBub2RlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uKE5vZGV8b2JqZWN0fHN0cmluZ3xOb2RlW10pfSBjaGlsZHJlbiAtIG5ldyBub2Rlc1xuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZX0gdGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGRlY2wxID0gcG9zdGNzcy5kZWNsKHsgcHJvcDogJ2NvbG9yJywgdmFsdWU6ICdibGFjaycgfSk7XG4gICAgICogY29uc3QgZGVjbDIgPSBwb3N0Y3NzLmRlY2woeyBwcm9wOiAnYmFja2dyb3VuZC1jb2xvcicsIHZhbHVlOiAnd2hpdGUnIH0pO1xuICAgICAqIHJ1bGUuYXBwZW5kKGRlY2wxLCBkZWNsMik7XG4gICAgICpcbiAgICAgKiByb290LmFwcGVuZCh7IG5hbWU6ICdjaGFyc2V0JywgcGFyYW1zOiAnXCJVVEYtOFwiJyB9KTsgIC8vIGF0LXJ1bGVcbiAgICAgKiByb290LmFwcGVuZCh7IHNlbGVjdG9yOiAnYScgfSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBydWxlXG4gICAgICogcnVsZS5hcHBlbmQoeyBwcm9wOiAnY29sb3InLCB2YWx1ZTogJ2JsYWNrJyB9KTsgICAgICAgLy8gZGVjbGFyYXRpb25cbiAgICAgKiBydWxlLmFwcGVuZCh7IHRleHQ6ICdDb21tZW50JyB9KSAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50XG4gICAgICpcbiAgICAgKiByb290LmFwcGVuZCgnYSB7fScpO1xuICAgICAqIHJvb3QuZmlyc3QuYXBwZW5kKCdjb2xvcjogYmxhY2s7IHotaW5kZXg6IDEnKTtcbiAgICAgKi9cbiAgICBhcHBlbmQoLi4uY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yICggbGV0IGNoaWxkIG9mIGNoaWxkcmVuICkge1xuICAgICAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoY2hpbGQsIHRoaXMubGFzdCk7XG4gICAgICAgICAgICBmb3IgKCBsZXQgbm9kZSBvZiBub2RlcyApIHRoaXMubm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIG5ldyBub2RlcyB0byB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gey4uLihOb2RlfG9iamVjdHxzdHJpbmd8Tm9kZVtdKX0gY2hpbGRyZW4gLSBuZXcgbm9kZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge05vZGV9IHRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBkZWNsMSA9IHBvc3Rjc3MuZGVjbCh7IHByb3A6ICdjb2xvcicsIHZhbHVlOiAnYmxhY2snIH0pO1xuICAgICAqIGNvbnN0IGRlY2wyID0gcG9zdGNzcy5kZWNsKHsgcHJvcDogJ2JhY2tncm91bmQtY29sb3InLCB2YWx1ZTogJ3doaXRlJyB9KTtcbiAgICAgKiBydWxlLnByZXBlbmQoZGVjbDEsIGRlY2wyKTtcbiAgICAgKlxuICAgICAqIHJvb3QuYXBwZW5kKHsgbmFtZTogJ2NoYXJzZXQnLCBwYXJhbXM6ICdcIlVURi04XCInIH0pOyAgLy8gYXQtcnVsZVxuICAgICAqIHJvb3QuYXBwZW5kKHsgc2VsZWN0b3I6ICdhJyB9KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGVcbiAgICAgKiBydWxlLmFwcGVuZCh7IHByb3A6ICdjb2xvcicsIHZhbHVlOiAnYmxhY2snIH0pOyAgICAgICAvLyBkZWNsYXJhdGlvblxuICAgICAqIHJ1bGUuYXBwZW5kKHsgdGV4dDogJ0NvbW1lbnQnIH0pICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRcbiAgICAgKlxuICAgICAqIHJvb3QuYXBwZW5kKCdhIHt9Jyk7XG4gICAgICogcm9vdC5maXJzdC5hcHBlbmQoJ2NvbG9yOiBibGFjazsgei1pbmRleDogMScpO1xuICAgICAqL1xuICAgIHByZXBlbmQoLi4uY2hpbGRyZW4pIHtcbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoIGxldCBjaGlsZCBvZiBjaGlsZHJlbiApIHtcbiAgICAgICAgICAgIGxldCBub2RlcyA9IHRoaXMubm9ybWFsaXplKGNoaWxkLCB0aGlzLmZpcnN0LCAncHJlcGVuZCcpLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoIGxldCBub2RlIG9mIG5vZGVzICkgdGhpcy5ub2Rlcy51bnNoaWZ0KG5vZGUpO1xuICAgICAgICAgICAgZm9yICggbGV0IGlkIGluIHRoaXMuaW5kZXhlcyApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbaWRdID0gdGhpcy5pbmRleGVzW2lkXSArIG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjbGVhblJhd3Moa2VlcEJldHdlZW4pIHtcbiAgICAgICAgc3VwZXIuY2xlYW5SYXdzKGtlZXBCZXR3ZWVuKTtcbiAgICAgICAgaWYgKCB0aGlzLm5vZGVzICkge1xuICAgICAgICAgICAgZm9yICggbGV0IG5vZGUgb2YgdGhpcy5ub2RlcyApIG5vZGUuY2xlYW5SYXdzKGtlZXBCZXR3ZWVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBuZXcgbm9kZSBiZWZvcmUgb2xkIG5vZGUgd2l0aGluIHRoZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05vZGV8bnVtYmVyfSBleGlzdCAgICAgICAgICAgICAtIGNoaWxkIG9yIGNoaWxk4oCZcyBpbmRleC5cbiAgICAgKiBAcGFyYW0ge05vZGV8b2JqZWN0fHN0cmluZ3xOb2RlW119IGFkZCAtIG5ldyBub2RlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOb2RlfSB0aGlzIG5vZGUgZm9yIG1ldGhvZHMgY2hhaW5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcnVsZS5pbnNlcnRCZWZvcmUoZGVjbCwgZGVjbC5jbG9uZSh7IHByb3A6ICctd2Via2l0LScgKyBkZWNsLnByb3AgfSkpO1xuICAgICAqL1xuICAgIGluc2VydEJlZm9yZShleGlzdCwgYWRkKSB7XG4gICAgICAgIGV4aXN0ID0gdGhpcy5pbmRleChleGlzdCk7XG5cbiAgICAgICAgbGV0IHR5cGUgID0gZXhpc3QgPT09IDAgPyAncHJlcGVuZCcgOiBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoYWRkLCB0aGlzLm5vZGVzW2V4aXN0XSwgdHlwZSkucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKCBsZXQgbm9kZSBvZiBub2RlcyApIHRoaXMubm9kZXMuc3BsaWNlKGV4aXN0LCAwLCBub2RlKTtcblxuICAgICAgICBsZXQgaW5kZXg7XG4gICAgICAgIGZvciAoIGxldCBpZCBpbiB0aGlzLmluZGV4ZXMgKSB7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXhlc1tpZF07XG4gICAgICAgICAgICBpZiAoIGV4aXN0IDw9IGluZGV4ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSBpbmRleCArIG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBuZXcgbm9kZSBhZnRlciBvbGQgbm9kZSB3aXRoaW4gdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZXxudW1iZXJ9IGV4aXN0ICAgICAgICAgICAgIC0gY2hpbGQgb3IgY2hpbGTigJlzIGluZGV4XG4gICAgICogQHBhcmFtIHtOb2RlfG9iamVjdHxzdHJpbmd8Tm9kZVtdfSBhZGQgLSBuZXcgbm9kZVxuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZX0gdGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluXG4gICAgICovXG4gICAgaW5zZXJ0QWZ0ZXIoZXhpc3QsIGFkZCkge1xuICAgICAgICBleGlzdCA9IHRoaXMuaW5kZXgoZXhpc3QpO1xuXG4gICAgICAgIGxldCBub2RlcyA9IHRoaXMubm9ybWFsaXplKGFkZCwgdGhpcy5ub2Rlc1tleGlzdF0pLnJldmVyc2UoKTtcbiAgICAgICAgZm9yICggbGV0IG5vZGUgb2Ygbm9kZXMgKSB0aGlzLm5vZGVzLnNwbGljZShleGlzdCArIDEsIDAsIG5vZGUpO1xuXG4gICAgICAgIGxldCBpbmRleDtcbiAgICAgICAgZm9yICggbGV0IGlkIGluIHRoaXMuaW5kZXhlcyApIHtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleGVzW2lkXTtcbiAgICAgICAgICAgIGlmICggZXhpc3QgPCBpbmRleCApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbaWRdID0gaW5kZXggKyBub2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZW1vdmUoY2hpbGQpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgY2hpbGQgIT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0NvbnRhaW5lciNyZW1vdmUgaXMgZGVwcmVjYXRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAnVXNlIENvbnRhaW5lciNyZW1vdmVDaGlsZCcpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdXBlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG5vZGUgZnJvbSB0aGUgY29udGFpbmVyIGFuZCBjbGVhbnMgdGhlIHBhcmVudCBwcm9wZXJ0aWVzXG4gICAgICogZnJvbSB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfG51bWJlcn0gY2hpbGQgLSBjaGlsZCBvciBjaGlsZOKAmXMgaW5kZXhcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge05vZGV9IHRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBydWxlLm5vZGVzLmxlbmd0aCAgLy89PiA1XG4gICAgICogcnVsZS5yZW1vdmVDaGlsZChkZWNsKTtcbiAgICAgKiBydWxlLm5vZGVzLmxlbmd0aCAgLy89PiA0XG4gICAgICogZGVjbC5wYXJlbnQgICAgICAgIC8vPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgcmVtb3ZlQ2hpbGQoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB0aGlzLmluZGV4KGNoaWxkKTtcbiAgICAgICAgdGhpcy5ub2Rlc1tjaGlsZF0ucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm5vZGVzLnNwbGljZShjaGlsZCwgMSk7XG5cbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBmb3IgKCBsZXQgaWQgaW4gdGhpcy5pbmRleGVzICkge1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgaWYgKCBpbmRleCA+PSBjaGlsZCApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbaWRdID0gaW5kZXggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSB0aGUgY29udGFpbmVyXG4gICAgICogYW5kIGNsZWFucyB0aGVpciBwYXJlbnQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge05vZGV9IHRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBydWxlLnJlbW92ZUFsbCgpO1xuICAgICAqIHJ1bGUubm9kZXMubGVuZ3RoIC8vPT4gMFxuICAgICAqL1xuICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgZm9yICggbGV0IG5vZGUgb2YgdGhpcy5ub2RlcyApIG5vZGUucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhc3NlcyBhbGwgZGVjbGFyYXRpb24gdmFsdWVzIHdpdGhpbiB0aGUgY29udGFpbmVyIHRoYXQgbWF0Y2ggcGF0dGVyblxuICAgICAqIHRocm91Z2ggY2FsbGJhY2ssIHJlcGxhY2luZyB0aG9zZSB2YWx1ZXMgd2l0aCB0aGUgcmV0dXJuZWQgcmVzdWx0XG4gICAgICogb2YgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBhIGN1c3RvbSB1bml0IG9yIGZ1bmN0aW9uXG4gICAgICogYW5kIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gICAgICAtIHJlcGxhY2UgcGF0dGVyblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICAgICAgICAgICAgICAgIC0gb3B0aW9ucyB0byBzcGVlZCB1cCB0aGUgc2VhcmNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG9wdHMucHJvcHMgLSBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZhc3QgICAgICAgICAgIC0gc3RyaW5nIHRoYXTigJlzIHVzZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG5hcnJvdyBkb3duIHZhbHVlcyBhbmQgc3BlZWQgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWdleHAgc2VhcmNoXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbnxzdHJpbmd9IGNhbGxiYWNrICAgLSBzdHJpbmcgdG8gcmVwbGFjZSBwYXR0ZXJuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsYmFjayB0aGF0IHJldHVybnMgYSBuZXdcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNhbGxiYWNrIHdpbGwgcmVjZWl2ZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXJndW1lbnRzIGFzIHRob3NlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gYSBmdW5jdGlvbiBwYXJhbWV0ZXJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGBTdHJpbmcjcmVwbGFjZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOb2RlfSB0aGlzIG5vZGUgZm9yIG1ldGhvZHMgY2hhaW5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcm9vdC5yZXBsYWNlVmFsdWVzKC9cXGQrcmVtLywgeyBmYXN0OiAncmVtJyB9LCBzdHJpbmcgPT4ge1xuICAgICAqICAgcmV0dXJuIDE1ICogcGFyc2VJbnQoc3RyaW5nKSArICdweCc7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgcmVwbGFjZVZhbHVlcyhwYXR0ZXJuLCBvcHRzLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoICFjYWxsYmFjayApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgICAgICAgIG9wdHMgPSB7IH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhbGtEZWNscyggZGVjbCA9PiB7XG4gICAgICAgICAgICBpZiAoIG9wdHMucHJvcHMgJiYgb3B0cy5wcm9wcy5pbmRleE9mKGRlY2wucHJvcCkgPT09IC0xICkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCBvcHRzLmZhc3QgICYmIGRlY2wudmFsdWUuaW5kZXhPZihvcHRzLmZhc3QpID09PSAtMSApIHJldHVybjtcblxuICAgICAgICAgICAgZGVjbC52YWx1ZSA9IGRlY2wudmFsdWUucmVwbGFjZShwYXR0ZXJuLCBjYWxsYmFjayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGNhbGxiYWNrIHJldHVybnMgYHRydWVgXG4gICAgICogZm9yIGFsbCBvZiB0aGUgY29udGFpbmVy4oCZcyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Y2hpbGRDb25kaXRpb259IGNvbmRpdGlvbiAtIGl0ZXJhdG9yIHJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGlzIGV2ZXJ5IGNoaWxkIHBhc3MgY29uZGl0aW9uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG5vUHJlZml4ZXMgPSBydWxlLmV2ZXJ5KGkgPT4gaS5wcm9wWzBdICE9PSAnLScpO1xuICAgICAqL1xuICAgIGV2ZXJ5KGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5ldmVyeShjb25kaXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciAoYXQgbGVhc3QpIG9uZVxuICAgICAqIG9mIHRoZSBjb250YWluZXLigJlzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtjaGlsZENvbmRpdGlvbn0gY29uZGl0aW9uIC0gaXRlcmF0b3IgcmV0dXJucyB0cnVlIG9yIGZhbHNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gaXMgc29tZSBjaGlsZCBwYXNzIGNvbmRpdGlvblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBoYXNQcmVmaXggPSBydWxlLnNvbWUoaSA9PiBpLnByb3BbMF0gPT09ICctJyk7XG4gICAgICovXG4gICAgc29tZShjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXMuc29tZShjb25kaXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgY2hpbGRg4oCZcyBpbmRleCB3aXRoaW4gdGhlIHtAbGluayBDb250YWluZXIjbm9kZXN9IGFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBjaGlsZCAtIGNoaWxkIG9mIHRoZSBjdXJyZW50IGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gY2hpbGQgaW5kZXhcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcnVsZS5pbmRleCggcnVsZS5ub2Rlc1syXSApIC8vPT4gMlxuICAgICAqL1xuICAgIGluZGV4KGNoaWxkKSB7XG4gICAgICAgIGlmICggdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJyApIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVzLmluZGV4T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRhaW5lcuKAmXMgZmlyc3QgY2hpbGQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Tm9kZX1cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcnVsZS5maXJzdCA9PSBydWxlcy5ub2Rlc1swXTtcbiAgICAgKi9cbiAgICBnZXQgZmlyc3QoKSB7XG4gICAgICAgIGlmICggIXRoaXMubm9kZXMgKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1swXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGFpbmVy4oCZcyBsYXN0IGNoaWxkLlxuICAgICAqXG4gICAgICogQHR5cGUge05vZGV9XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJ1bGUubGFzdCA9PSBydWxlLm5vZGVzW3J1bGUubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICovXG4gICAgZ2V0IGxhc3QoKSB7XG4gICAgICAgIGlmICggIXRoaXMubm9kZXMgKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZShub2Rlcywgc2FtcGxlKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5vZGVzID09PSAnc3RyaW5nJyApIHtcbiAgICAgICAgICAgIGxldCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbiAgICAgICAgICAgIG5vZGVzID0gY2xlYW5Tb3VyY2UocGFyc2Uobm9kZXMpLm5vZGVzKTtcbiAgICAgICAgfSBlbHNlIGlmICggIUFycmF5LmlzQXJyYXkobm9kZXMpICkge1xuICAgICAgICAgICAgaWYgKCBub2Rlcy50eXBlID09PSAncm9vdCcgKSB7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBub2Rlcy5ub2RlcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIG5vZGVzLnR5cGUgKSB7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbbm9kZXNdO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggbm9kZXMucHJvcCApIHtcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBub2Rlcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgZmllbGQgaXMgbWlzc2VkIGluIG5vZGUgY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2Ygbm9kZXMudmFsdWUgIT09ICdzdHJpbmcnICkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy52YWx1ZSA9IFN0cmluZyhub2Rlcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGVzID0gW25ldyBEZWNsYXJhdGlvbihub2RlcyldO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggbm9kZXMuc2VsZWN0b3IgKSB7XG4gICAgICAgICAgICAgICAgbGV0IFJ1bGUgPSByZXF1aXJlKCcuL3J1bGUnKTtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFtuZXcgUnVsZShub2RlcyldO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggbm9kZXMubmFtZSApIHtcbiAgICAgICAgICAgICAgICBsZXQgQXRSdWxlID0gcmVxdWlyZSgnLi9hdC1ydWxlJyk7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbbmV3IEF0UnVsZShub2RlcyldO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggbm9kZXMudGV4dCApIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFtuZXcgQ29tbWVudChub2RlcyldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlIGluIG5vZGUgY3JlYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9jZXNzZWQgPSBub2Rlcy5tYXAoIGkgPT4ge1xuICAgICAgICAgICAgaWYgKCB0eXBlb2YgaS5yYXdzID09PSAndW5kZWZpbmVkJyApIGkgPSB0aGlzLnJlYnVpbGQoaSk7XG5cbiAgICAgICAgICAgIGlmICggaS5wYXJlbnQgKSBpID0gaS5jbG9uZSgpO1xuICAgICAgICAgICAgaWYgKCB0eXBlb2YgaS5yYXdzLmJlZm9yZSA9PT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBzYW1wbGUgJiYgdHlwZW9mIHNhbXBsZS5yYXdzLmJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICAgICAgICAgIGkucmF3cy5iZWZvcmUgPSBzYW1wbGUucmF3cy5iZWZvcmUucmVwbGFjZSgvW15cXHNdL2csICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICB9XG5cbiAgICByZWJ1aWxkKG5vZGUsIHBhcmVudCkge1xuICAgICAgICBsZXQgZml4O1xuICAgICAgICBpZiAoIG5vZGUudHlwZSA9PT0gJ3Jvb3QnICkge1xuICAgICAgICAgICAgbGV0IFJvb3QgPSByZXF1aXJlKCcuL3Jvb3QnKTtcbiAgICAgICAgICAgIGZpeCA9IG5ldyBSb290KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIG5vZGUudHlwZSA9PT0gJ2F0cnVsZScgKSB7XG4gICAgICAgICAgICBsZXQgQXRSdWxlID0gcmVxdWlyZSgnLi9hdC1ydWxlJyk7XG4gICAgICAgICAgICBmaXggPSBuZXcgQXRSdWxlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIG5vZGUudHlwZSA9PT0gJ3J1bGUnICkge1xuICAgICAgICAgICAgbGV0IFJ1bGUgPSByZXF1aXJlKCcuL3J1bGUnKTtcbiAgICAgICAgICAgIGZpeCA9IG5ldyBSdWxlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIG5vZGUudHlwZSA9PT0gJ2RlY2wnICkge1xuICAgICAgICAgICAgZml4ID0gbmV3IERlY2xhcmF0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIG5vZGUudHlwZSA9PT0gJ2NvbW1lbnQnICkge1xuICAgICAgICAgICAgZml4ID0gbmV3IENvbW1lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIGxldCBpIGluIG5vZGUgKSB7XG4gICAgICAgICAgICBpZiAoIGkgPT09ICdub2RlcycgKSB7XG4gICAgICAgICAgICAgICAgZml4Lm5vZGVzID0gbm9kZS5ub2Rlcy5tYXAoIGogPT4gdGhpcy5yZWJ1aWxkKGosIGZpeCkgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIGkgPT09ICdwYXJlbnQnICYmIHBhcmVudCApIHtcbiAgICAgICAgICAgICAgICBmaXgucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgfSBlbHNlIGlmICggbm9kZS5oYXNPd25Qcm9wZXJ0eShpKSApIHtcbiAgICAgICAgICAgICAgICBmaXhbaV0gPSBub2RlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpeDtcbiAgICB9XG5cbiAgICBlYWNoSW5zaWRlKGNhbGxiYWNrKSB7XG4gICAgICAgIHdhcm5PbmNlKCdDb250YWluZXIjZWFjaEluc2lkZSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgJ1VzZSBDb250YWluZXIjd2FsayBpbnN0ZWFkLicpO1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBlYWNoRGVjbChwcm9wLCBjYWxsYmFjaykge1xuICAgICAgICB3YXJuT25jZSgnQ29udGFpbmVyI2VhY2hEZWNsIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAnVXNlIENvbnRhaW5lciN3YWxrRGVjbHMgaW5zdGVhZC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa0RlY2xzKHByb3AsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBlYWNoUnVsZShzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICAgICAgd2Fybk9uY2UoJ0NvbnRhaW5lciNlYWNoUnVsZSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgJ1VzZSBDb250YWluZXIjd2Fsa1J1bGVzIGluc3RlYWQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtSdWxlcyhzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGVhY2hBdFJ1bGUobmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgd2Fybk9uY2UoJ0NvbnRhaW5lciNlYWNoQXRSdWxlIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAnVXNlIENvbnRhaW5lciN3YWxrQXRSdWxlcyBpbnN0ZWFkLicpO1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrQXRSdWxlcyhuYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZWFjaENvbW1lbnQoY2FsbGJhY2spIHtcbiAgICAgICAgd2Fybk9uY2UoJ0NvbnRhaW5lciNlYWNoQ29tbWVudCBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgJ1VzZSBDb250YWluZXIjd2Fsa0NvbW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtDb21tZW50cyhjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0IHNlbWljb2xvbigpIHtcbiAgICAgICAgd2Fybk9uY2UoJ05vZGUjc2VtaWNvbG9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBOb2RlI3Jhd3Muc2VtaWNvbG9uJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhd3Muc2VtaWNvbG9uO1xuICAgIH1cblxuICAgIHNldCBzZW1pY29sb24odmFsKSB7XG4gICAgICAgIHdhcm5PbmNlKCdOb2RlI3NlbWljb2xvbiBpcyBkZXByZWNhdGVkLiBVc2UgTm9kZSNyYXdzLnNlbWljb2xvbicpO1xuICAgICAgICB0aGlzLnJhd3Muc2VtaWNvbG9uID0gdmFsO1xuICAgIH1cblxuICAgIGdldCBhZnRlcigpIHtcbiAgICAgICAgd2Fybk9uY2UoJ05vZGUjYWZ0ZXIgaXMgZGVwcmVjYXRlZC4gVXNlIE5vZGUjcmF3cy5hZnRlcicpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXdzLmFmdGVyO1xuICAgIH1cblxuICAgIHNldCBhZnRlcih2YWwpIHtcbiAgICAgICAgd2Fybk9uY2UoJ05vZGUjYWZ0ZXIgaXMgZGVwcmVjYXRlZC4gVXNlIE5vZGUjcmF3cy5hZnRlcicpO1xuICAgICAgICB0aGlzLnJhd3MuYWZ0ZXIgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIENvbnRhaW5lciNcbiAgICAgKiBAbWVtYmVyIHtOb2RlW119IG5vZGVzIC0gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29udGFpbmVy4oCZcyBjaGlsZHJlblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZSgnYSB7IGNvbG9yOiBibGFjayB9Jyk7XG4gICAgICogcm9vdC5ub2Rlcy5sZW5ndGggICAgICAgICAgIC8vPT4gMVxuICAgICAqIHJvb3Qubm9kZXNbMF0uc2VsZWN0b3IgICAgICAvLz0+ICdhJ1xuICAgICAqIHJvb3Qubm9kZXNbMF0ubm9kZXNbMF0ucHJvcCAvLz0+ICdjb2xvcidcbiAgICAgKi9cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250YWluZXI7XG5cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2hpbGRDb25kaXRpb25cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAgICAtIGNvbnRhaW5lciBjaGlsZFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gY2hpbGQgaW5kZXhcbiAqIEBwYXJhbSB7Tm9kZVtdfSBub2RlcyAtIGFsbCBjb250YWluZXIgY2hpbGRyZW5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2hpbGRJdGVyYXRvclxuICogQHBhcmFtIHtOb2RlfSBub2RlICAgIC0gY29udGFpbmVyIGNoaWxkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBjaGlsZCBpbmRleFxuICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5pbmcgYGZhbHNlYCB3aWxsIGJyZWFrIGl0ZXJhdGlvblxuICovXG4iXX0=