@nlabs/lex 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,6 +23,11 @@ const browserGlobalInjectExcludes = [
23
23
  '**/node_modules/buffer/**',
24
24
  '**/node_modules/process/**'
25
25
  ];
26
+ const developmentCacheHeaders = {
27
+ 'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
28
+ Expires: '0',
29
+ Pragma: 'no-cache'
30
+ };
26
31
  const contentTypes = {
27
32
  '.css': 'text/css',
28
33
  '.gif': 'image/gif',
@@ -255,6 +260,9 @@ export const createLexViteConfig = (options)=>{
255
260
  logLevel: options.quiet ? 'silent' : 'info',
256
261
  mode: options.mode || (options.command === 'build' ? 'production' : 'development'),
257
262
  optimizeDeps: options.ssr ? undefined : {
263
+ ...options.command === 'serve' ? {
264
+ force: true
265
+ } : {},
258
266
  include: [
259
267
  'buffer/index.js',
260
268
  'process/browser.js'
@@ -301,7 +309,10 @@ export const createLexViteConfig = (options)=>{
301
309
  },
302
310
  root: sourcePath,
303
311
  server: {
312
+ allowedHosts: true,
313
+ headers: developmentCacheHeaders,
304
314
  hmr: false,
315
+ host: '0.0.0.0',
305
316
  open: options.open,
306
317
  port: options.port,
307
318
  strictPort: true
@@ -321,4 +332,4 @@ export const createLexViteConfig = (options)=>{
321
332
  return mergeConfig(viteConfig, config.vite || {});
322
333
  };
323
334
 
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGluamVjdCBmcm9tICdAcm9sbHVwL3BsdWdpbi1pbmplY3QnO1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7bWVyZ2VDb25maWd9IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Z2VuZXJhdGVMZXhGYXZpY29ucywgZ2V0RGV2QXNzZXR9IGZyb20gJy4vYXNzZXRzLmpzJztcblxuaW1wb3J0IHR5cGUge0lubGluZUNvbmZpZywgUGx1Z2lufSBmcm9tICd2aXRlJztcblxuY29uc3QgY3JlYXRlSW5qZWN0UGx1Z2luID0gaW5qZWN0IGFzIHVua25vd24gYXMgKG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQbHVnaW47XG5cbmV4cG9ydCBjb25zdCBicm93c2VyR2xvYmFsTW9kdWxlcyA9IHtcbiAgQnVmZmVyOiBbJ2J1ZmZlci9pbmRleC5qcycsICdCdWZmZXInXSxcbiAgcHJvY2VzczogWydwcm9jZXNzL2Jyb3dzZXIuanMnLCAnZGVmYXVsdCddXG59IGFzIGNvbnN0O1xuXG5jb25zdCBicm93c2VyR2xvYmFsSW5qZWN0RXhjbHVkZXMgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvYnVmZmVyLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy9wcm9jZXNzLyoqJ1xuXTtcblxuZXhwb3J0IGludGVyZmFjZSBMZXhWaXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJztcbiAgcmVhZG9ubHkgZW50cnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wZW4/OiBib29sZWFuO1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNzcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGNvbnRlbnRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qc29uJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLnR4dCc6ICd0ZXh0L3BsYWluJyxcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMidcbn07XG5cbmNvbnN0IGVtcHR5Q3J5cHRvUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBsb2FkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnXFwwbGV4LWVtcHR5LWNyeXB0bycgPyAnZXhwb3J0IGRlZmF1bHQge307IGV4cG9ydCBjb25zdCB3ZWJjcnlwdG8gPSB1bmRlZmluZWQ7JyA6IG51bGw7XG4gIH0sXG4gIG5hbWU6ICdsZXgtZW1wdHktY3J5cHRvJyxcbiAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnY3J5cHRvJyB8fCBpZCA9PT0gJ25vZGU6Y3J5cHRvJyA/ICdcXDBsZXgtZW1wdHktY3J5cHRvJyA6IG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBub2RlUG9seWZpbGxNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBhc3NlcnQ6ICdhc3NlcnQvYnVpbGQvYXNzZXJ0LmpzJyxcbiAgYnVmZmVyOiAnYnVmZmVyL2luZGV4LmpzJyxcbiAgaHR0cDogJ3N0cmVhbS1odHRwL2luZGV4LmpzJyxcbiAgaHR0cHM6ICdodHRwcy1icm93c2VyaWZ5L2luZGV4LmpzJyxcbiAgb3M6ICdvcy1icm93c2VyaWZ5L2Jyb3dzZXIuanMnLFxuICBwYXRoOiAncGF0aC1icm93c2VyaWZ5L2luZGV4LmpzJyxcbiAgcHJvY2VzczogJ3Byb2Nlc3MvYnJvd3Nlci5qcycsXG4gIHN0cmVhbTogJ3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzJyxcbiAgdXRpbDogJ3V0aWwvdXRpbC5qcycsXG4gIHZtOiAndm0tYnJvd3NlcmlmeS9pbmRleC5qcydcbn07XG5cbmNvbnN0IG5vZGVQb2x5ZmlsbHNQbHVnaW4gPSAoKTogUGx1Z2luID0+ICh7XG4gIG5hbWU6ICdsZXgtbm9kZS1wb2x5ZmlsbHMnLFxuICByZXNvbHZlSWQoaWQpIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gaWQuc3RhcnRzV2l0aCgnbm9kZTonKSA/IGlkLnNsaWNlKDUpIDogaWQ7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBub2RlUG9seWZpbGxNb2R1bGVzW21vZHVsZU5hbWVdO1xuICAgIHJldHVybiByZXBsYWNlbWVudCA/IHJlc29sdmVQcm9qZWN0UGFja2FnZShyZXBsYWNlbWVudCkgOiBudWxsO1xuICB9XG59KTtcblxuY29uc3QgZ3JhcGhxbFBsdWdpbiA9ICgpOiBQbHVnaW4gPT4gKHtcbiAgbG9hZChpZCkge1xuICAgIGlmKCEvXFwuKGdxbHxncmFwaHFsKSQvLnRlc3QoaWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gSlNPTi5zdHJpbmdpZnkocmVhZEZpbGVTeW5jKGlkLCAndXRmOCcpKTtcbiAgICByZXR1cm4gYGltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnOyBleHBvcnQgZGVmYXVsdCBncWwoJHtzb3VyY2V9KTtgO1xuICB9LFxuICBuYW1lOiAnbGV4LWdyYXBocWwnXG59KTtcblxuY29uc3Qgc3djUGx1Z2luID0gKHNvdXJjZVBhdGg6IHN0cmluZyk6IFBsdWdpbiA9PiAoe1xuICBlbmZvcmNlOiAncHJlJyxcbiAgbmFtZTogJ2xleC1zd2MnLFxuICBhc3luYyB0cmFuc2Zvcm0oc291cmNlLCBpZCkge1xuICAgIGNvbnN0IGNsZWFuSWQgPSBpZC5zcGxpdCgnPycpWzBdO1xuICAgIGlmKCFjbGVhbklkLnN0YXJ0c1dpdGgoc291cmNlUGF0aCkgfHwgIS9cXC5banRdc3g/JC8udGVzdChjbGVhbklkKSB8fCAvXFwuKHRlc3R8c3BlY3xpbnRlZ3JhdGlvbnxlMmUpXFwuW2p0XXN4PyQvLnRlc3QoY2xlYW5JZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN3Y0NvbmZpZyA9IExleENvbmZpZy5nZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybShzb3VyY2UsIHtcbiAgICAgIC4uLnN3Y0NvbmZpZyxcbiAgICAgIGZpbGVuYW1lOiBjbGVhbklkLFxuICAgICAgbW9kdWxlOiB7Li4uc3djQ29uZmlnPy5tb2R1bGUsIHR5cGU6ICdlczYnfSxcbiAgICAgIHNvdXJjZU1hcHM6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IG5lZWRzUmVhY3QgPSAvXFxiUmVhY3RcXHMqXFwuLy50ZXN0KHJlc3VsdC5jb2RlKSAmJiAhL2Zyb21cXHMrWydcIl1yZWFjdFsnXCJdLy50ZXN0KHJlc3VsdC5jb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogbmVlZHNSZWFjdCA/IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xcbiR7cmVzdWx0LmNvZGV9YCA6IHJlc3VsdC5jb2RlLFxuICAgICAgbWFwOiByZXN1bHQubWFwIHx8IG51bGxcbiAgICB9O1xuICB9XG59KTtcblxuY29uc3QgaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4gPSAoc291cmNlUGF0aDogc3RyaW5nKTogUGx1Z2luID0+ICh7XG4gIGVuZm9yY2U6ICdwb3N0JyxcbiAgbmFtZTogJ2xleC1pbXBvcnQtbWV0YS1jb21wYXRpYmlsaXR5JyxcbiAgdHJhbnNmb3JtKHNvdXJjZSwgaWQpIHtcbiAgICBjb25zdCBjbGVhbklkID0gaWQuc3BsaXQoJz8nKVswXTtcbiAgICBpZighY2xlYW5JZC5zdGFydHNXaXRoKHNvdXJjZVBhdGgpIHx8ICFzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydC5tZXRhLnVybCcpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXBsYWNlbWVudCA9ICcodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgPyBuZXcgVVJMKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikuaHJlZiA6ICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gbmV3IFVSTChcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZikuaHJlZiA6IFwiXCIpKSc7XG4gICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlQWxsKCdpbXBvcnQubWV0YS51cmwnLCByZXBsYWNlbWVudCk7XG4gIH1cbn0pO1xuXG5jb25zdCBhc3NldHNEZXZQbHVnaW4gPSAoKTogUGx1Z2luID0+IHtcbiAgbGV0IGZhdmljb25IdG1sOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgYnVpbGRTdGFydCgpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhMZXhDb25maWcuY29uZmlnKTtcbiAgICAgIGZhdmljb25IdG1sID0gZ2VuZXJhdGVkRmF2aWNvbnM/Lmh0bWwgfHwgW107XG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIubWlkZGxld2FyZXMudXNlKGFzeW5jIChyZXF1ZXN0LCByZXNwb25zZSwgbmV4dCkgPT4ge1xuICAgICAgICBpZighcmVxdWVzdC51cmwpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgZ2V0RGV2QXNzZXQoTGV4Q29uZmlnLmNvbmZpZywgcmVxdWVzdC51cmwpO1xuICAgICAgICBpZighYXNzZXQpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9IDIwMDtcbiAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZXNbZXh0bmFtZShyZXF1ZXN0LnVybC5zcGxpdCgnPycpWzBdKV0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZW5kKGFzc2V0KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmFtZTogJ2xleC1hc3NldHMtZGV2JyxcbiAgICB0cmFuc2Zvcm1JbmRleEh0bWwoaHRtbCkge1xuICAgICAgaWYoZmF2aWNvbkh0bWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZSgnPC9oZWFkPicsIGAgICAgJHtmYXZpY29uSHRtbC5qb2luKCdcXG4gICAgJyl9XFxuICA8L2hlYWQ+YCk7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgYW5hbHl6ZXJQbHVnaW4gPSAoZW5hYmxlZDogYm9vbGVhbik6IFBsdWdpbiA9PiAoe1xuICBnZW5lcmF0ZUJ1bmRsZShfb3B0aW9ucywgYnVuZGxlKSB7XG4gICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBPYmplY3QuZW50cmllcyhidW5kbGUpLm1hcCgoW2ZpbGVOYW1lLCBvdXRwdXRdKSA9PiAoe1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBzaXplOiBvdXRwdXQudHlwZSA9PT0gJ2Fzc2V0J1xuICAgICAgICA/IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiBvdXRwdXQuc291cmNlID09PSAnc3RyaW5nJyA/IG91dHB1dC5zb3VyY2UgOiBvdXRwdXQuc291cmNlKVxuICAgICAgICA6IEJ1ZmZlci5ieXRlTGVuZ3RoKG91dHB1dC5jb2RlKSxcbiAgICAgIHR5cGU6IG91dHB1dC50eXBlXG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbWl0RmlsZSh7ZmlsZU5hbWU6ICdidW5kbGUtcmVwb3J0Lmpzb24nLCBzb3VyY2U6IEpTT04uc3RyaW5naWZ5KHJlcG9ydCwgbnVsbCwgMiksIHR5cGU6ICdhc3NldCd9KTtcbiAgfSxcbiAgbmFtZTogJ2xleC1idW5kbGUtYW5hbHl6ZXInXG59KTtcblxuY29uc3QgZ2V0TGlicmFyeUZvcm1hdHMgPSAobGlicmFyeVRhcmdldD86IHN0cmluZyk6IEFycmF5PCdjanMnIHwgJ2VzJyB8ICdpaWZlJyB8ICd1bWQnPiA9PiB7XG4gIGlmKGxpYnJhcnlUYXJnZXQgPT09ICdjb21tb25qcycgfHwgbGlicmFyeVRhcmdldCA9PT0gJ2NvbW1vbmpzMicpIHtcbiAgICByZXR1cm4gWydjanMnXTtcbiAgfVxuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndmFyJyB8fCBsaWJyYXJ5VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgIHJldHVybiBbJ2lpZmUnXTtcbiAgfVxuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndW1kJykge1xuICAgIHJldHVybiBbJ3VtZCddO1xuICB9XG4gIHJldHVybiBbJ2VzJ107XG59O1xuXG5jb25zdCBmaW5kTm9kZU1vZHVsZXNQYWNrYWdlID0gKHN0YXJ0UGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgbGV0IGN1cnJlbnRQYXRoID0gcmVzb2x2ZShzdGFydFBhdGgpO1xuXG4gIHdoaWxlKHRydWUpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcmVzb2x2ZShjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbiAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gY2FuZGlkYXRlUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVQcm9qZWN0UGFja2FnZSA9IChwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IGZpbmROb2RlTW9kdWxlc1BhY2thZ2UocHJvY2Vzcy5jd2QoKSwgcGFja2FnZU5hbWUpXG4gICAgfHwgZmluZE5vZGVNb2R1bGVzUGFja2FnZShMZXhDb25maWcuZ2V0TGV4RGlyKCksIHBhY2thZ2VOYW1lKVxuICAgIHx8IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuXG5leHBvcnQgY29uc3QgZ2V0QnJvd3Nlckdsb2JhbEluamVjdE9wdGlvbnMgPSAoY29tbWFuZDogTGV4Vml0ZU9wdGlvbnNbJ2NvbW1hbmQnXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICh7XG4gIC4uLihjb21tYW5kID09PSAnc2VydmUnID8gYnJvd3Nlckdsb2JhbE1vZHVsZXMgOiB7XG4gICAgQnVmZmVyOiBbcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXIvaW5kZXguanMnKSwgJ0J1ZmZlciddLFxuICAgIHByb2Nlc3M6IFtyZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3Byb2Nlc3MvYnJvd3Nlci5qcycpLCAnZGVmYXVsdCddXG4gIH0pLFxuICBleGNsdWRlOiBicm93c2VyR2xvYmFsSW5qZWN0RXhjbHVkZXNcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTGV4Vml0ZUNvbmZpZyA9IChvcHRpb25zOiBMZXhWaXRlT3B0aW9ucyk6IElubGluZUNvbmZpZyA9PiB7XG4gIGNvbnN0IHtjb25maWd9ID0gTGV4Q29uZmlnO1xuICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShzb3VyY2VQYXRoLCBvcHRpb25zLmVudHJ5IHx8IGNvbmZpZy5lbnRyeUpzIHx8ICdpbmRleC5qcycpO1xuICBjb25zdCBodG1sUGF0aCA9IHJlc29sdmUoc291cmNlUGF0aCwgY29uZmlnLmVudHJ5SFRNTCB8fCAnaW5kZXguaHRtbCcpO1xuICBjb25zdCBoYXNIdG1sRW50cnkgPSBleGlzdHNTeW5jKGh0bWxQYXRoKSAmJiAhb3B0aW9ucy5zc3I7XG4gIGNvbnN0IG91dHB1dEhhc2ggPSBjb25maWcub3V0cHV0SGFzaCB8fCBvcHRpb25zLm1vZGUgPT09ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgZmlsZU5hbWUgPSBjb25maWcub3V0cHV0RmlsZSB8fCAob3V0cHV0SGFzaCA/ICdbbmFtZV0uW2hhc2hdLmpzJyA6ICdbbmFtZV0uanMnKTtcblxuICBjb25zdCB2aXRlQ29uZmlnOiBJbmxpbmVDb25maWcgPSB7XG4gICAgYXBwVHlwZTogaGFzSHRtbEVudHJ5ID8gJ3NwYScgOiAnY3VzdG9tJyxcbiAgICBiYXNlOiAnLycsXG4gICAgYnVpbGQ6IHtcbiAgICAgIGNzc0NvZGVTcGxpdDogdHJ1ZSxcbiAgICAgIGVtcHR5T3V0RGlyOiBmYWxzZSxcbiAgICAgIG1pbmlmeTogb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbicsXG4gICAgICBvdXREaXI6IG91dHB1dFBhdGgsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGhhc0h0bWxFbnRyeSA/IGh0bWxQYXRoIDogZW50cnlQYXRoLFxuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogb3V0cHV0SGFzaCA/ICdhc3NldHMvW25hbWVdLltoYXNoXVtleHRuYW1lXScgOiAnYXNzZXRzL1tuYW1lXVtleHRuYW1lXScsXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6IG91dHB1dEhhc2ggPyAnW25hbWVdLltoYXNoXS5jaHVuay5qcycgOiAnW25hbWVdLmNodW5rLmpzJyxcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZmlsZU5hbWUsXG4gICAgICAgICAgbWFudWFsQ2h1bmtzKGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgPyAndmVuZG9ycycgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlbWFwOiAhIWNvbmZpZy5zd2M/LnNvdXJjZU1hcHMsXG4gICAgICBzc3I6IG9wdGlvbnMuc3NyID8gZW50cnlQYXRoIDogZmFsc2UsXG4gICAgICB0YXJnZXQ6IGNvbmZpZy5zd2M/LmpzYz8udGFyZ2V0Py50b1N0cmluZygpIHx8ICdlczIwMjAnXG4gICAgfSxcbiAgICBjbGVhclNjcmVlbjogZmFsc2UsXG4gICAgY29uZmlnRmlsZTogZmFsc2UsXG4gICAgY3NzOiB7XG4gICAgICBwb3N0Y3NzOiByZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ3Bvc3Rjc3MuY29uZmlnLmpzJylcbiAgICB9LFxuICAgIGRlZmluZToge1xuICAgICAgZ2xvYmFsOiAnZ2xvYmFsVGhpcycsXG4gICAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBKU09OLnN0cmluZ2lmeShvcHRpb25zLm1vZGUgfHwgKG9wdGlvbnMuY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpKVxuICAgIH0sXG4gICAgZW52RGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGxvZ0xldmVsOiBvcHRpb25zLnF1aWV0ID8gJ3NpbGVudCcgOiAnaW5mbycsXG4gICAgbW9kZTogb3B0aW9ucy5tb2RlIHx8IChvcHRpb25zLmNvbW1hbmQgPT09ICdidWlsZCcgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnKSxcbiAgICBvcHRpbWl6ZURlcHM6IG9wdGlvbnMuc3NyID8gdW5kZWZpbmVkIDoge1xuICAgICAgaW5jbHVkZTogWydidWZmZXIvaW5kZXguanMnLCAncHJvY2Vzcy9icm93c2VyLmpzJ11cbiAgICB9LFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIC4uLihvcHRpb25zLnNzciA/IFtdIDogW1xuICAgICAgICBlbXB0eUNyeXB0b1BsdWdpbigpLFxuICAgICAgICBub2RlUG9seWZpbGxzUGx1Z2luKCksXG4gICAgICAgIGNyZWF0ZUluamVjdFBsdWdpbihnZXRCcm93c2VyR2xvYmFsSW5qZWN0T3B0aW9ucyhvcHRpb25zLmNvbW1hbmQpKVxuICAgICAgXSksXG4gICAgICBzd2NQbHVnaW4oc291cmNlUGF0aCksXG4gICAgICBncmFwaHFsUGx1Z2luKCksXG4gICAgICAuLi4ob3B0aW9ucy5zc3IgPyBbXSA6IFtcbiAgICAgICAgaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4oc291cmNlUGF0aCksXG4gICAgICAgIGFzc2V0c0RldlBsdWdpbigpLFxuICAgICAgICBhbmFseXplclBsdWdpbihCb29sZWFuKG9wdGlvbnMuYW5hbHl6ZSkpXG4gICAgICBdKVxuICAgIF0sXG4gICAgcHVibGljRGlyOiBmYWxzZSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczoge1xuICAgICAgICBCdWZmZXI6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnYnVmZmVyJyksXG4gICAgICAgICdjb3JlLWpzJzogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdjb3JlLWpzJyksXG4gICAgICAgIGdsb2JhbDogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdnbG9iYWwnKSxcbiAgICAgICAgJ2dyYXBocWwtdGFnJzogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdncmFwaHFsLXRhZycpLFxuICAgICAgICByYW5kb21ieXRlczogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyYW5kb21ieXRlcycpLFxuICAgICAgICByZWFjdDogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyZWFjdCcpLFxuICAgICAgICAncmVhY3QtZG9tJzogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyZWFjdC1kb20nKSxcbiAgICAgICAgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUnKVxuICAgICAgfSxcbiAgICAgIGV4dGVuc2lvbnM6IFsnLm1qcycsICcuanMnLCAnLnRzJywgJy50c3gnLCAnLmpzeCcsICcuanNvbicsICcuZ3FsJywgJy5ncmFwaHFsJ10sXG4gICAgICBwcmVzZXJ2ZVN5bWxpbmtzOiBmYWxzZSxcbiAgICAgIHRzY29uZmlnUGF0aHM6IHRydWVcbiAgICB9LFxuICAgIHJvb3Q6IHNvdXJjZVBhdGgsXG4gICAgc2VydmVyOiB7XG4gICAgICBobXI6IGZhbHNlLFxuICAgICAgb3Blbjogb3B0aW9ucy5vcGVuLFxuICAgICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgc3RyaWN0UG9ydDogdHJ1ZVxuICAgIH1cbiAgfTtcblxuICBpZighaGFzSHRtbEVudHJ5ICYmIGNvbmZpZy5saWJyYXJ5TmFtZSAmJiAhb3B0aW9ucy5zc3IpIHtcbiAgICB2aXRlQ29uZmlnLmJ1aWxkID0ge1xuICAgICAgLi4udml0ZUNvbmZpZy5idWlsZCxcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeTogZW50cnlQYXRoLFxuICAgICAgICBmaWxlTmFtZTogKCkgPT4gY29uZmlnLm91dHB1dEZpbGUgfHwgJ2luZGV4LmpzJyxcbiAgICAgICAgZm9ybWF0czogZ2V0TGlicmFyeUZvcm1hdHMoY29uZmlnLmxpYnJhcnlUYXJnZXQpLFxuICAgICAgICBuYW1lOiBjb25maWcubGlicmFyeU5hbWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKHZpdGVDb25maWcsIGNvbmZpZy52aXRlIHx8IHt9KSBhcyBJbmxpbmVDb25maWc7XG59O1xuIl0sIm5hbWVzIjpbImluamVjdCIsInRyYW5zZm9ybSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJkaXJuYW1lIiwiZXh0bmFtZSIsInJlc29sdmUiLCJtZXJnZUNvbmZpZyIsIkxleENvbmZpZyIsImdlbmVyYXRlTGV4RmF2aWNvbnMiLCJnZXREZXZBc3NldCIsImNyZWF0ZUluamVjdFBsdWdpbiIsImJyb3dzZXJHbG9iYWxNb2R1bGVzIiwiQnVmZmVyIiwicHJvY2VzcyIsImJyb3dzZXJHbG9iYWxJbmplY3RFeGNsdWRlcyIsImNvbnRlbnRUeXBlcyIsImVtcHR5Q3J5cHRvUGx1Z2luIiwibG9hZCIsImlkIiwibmFtZSIsInJlc29sdmVJZCIsIm5vZGVQb2x5ZmlsbE1vZHVsZXMiLCJhc3NlcnQiLCJidWZmZXIiLCJodHRwIiwiaHR0cHMiLCJvcyIsInBhdGgiLCJzdHJlYW0iLCJ1dGlsIiwidm0iLCJub2RlUG9seWZpbGxzUGx1Z2luIiwibW9kdWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJzbGljZSIsInJlcGxhY2VtZW50IiwicmVzb2x2ZVByb2plY3RQYWNrYWdlIiwiZ3JhcGhxbFBsdWdpbiIsInRlc3QiLCJzb3VyY2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3djUGx1Z2luIiwic291cmNlUGF0aCIsImVuZm9yY2UiLCJjbGVhbklkIiwic3BsaXQiLCJzd2NDb25maWciLCJnZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlciIsInJlc3VsdCIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInNvdXJjZU1hcHMiLCJuZWVkc1JlYWN0IiwiY29kZSIsIm1hcCIsImltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luIiwiaW5jbHVkZXMiLCJyZXBsYWNlQWxsIiwiYXNzZXRzRGV2UGx1Z2luIiwiZmF2aWNvbkh0bWwiLCJidWlsZFN0YXJ0IiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJjb25maWciLCJodG1sIiwiY29uZmlndXJlU2VydmVyIiwic2VydmVyIiwibWlkZGxld2FyZXMiLCJ1c2UiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJuZXh0IiwidXJsIiwiYXNzZXQiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwiZW5kIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwibGVuZ3RoIiwicmVwbGFjZSIsImpvaW4iLCJhbmFseXplclBsdWdpbiIsImVuYWJsZWQiLCJnZW5lcmF0ZUJ1bmRsZSIsIl9vcHRpb25zIiwiYnVuZGxlIiwicmVwb3J0IiwiT2JqZWN0IiwiZW50cmllcyIsImZpbGVOYW1lIiwib3V0cHV0Iiwic2l6ZSIsImJ5dGVMZW5ndGgiLCJlbWl0RmlsZSIsImdldExpYnJhcnlGb3JtYXRzIiwibGlicmFyeVRhcmdldCIsImZpbmROb2RlTW9kdWxlc1BhY2thZ2UiLCJzdGFydFBhdGgiLCJwYWNrYWdlTmFtZSIsImN1cnJlbnRQYXRoIiwiY2FuZGlkYXRlUGF0aCIsInBhcmVudFBhdGgiLCJ1bmRlZmluZWQiLCJjd2QiLCJnZXRMZXhEaXIiLCJnZXRCcm93c2VyR2xvYmFsSW5qZWN0T3B0aW9ucyIsImNvbW1hbmQiLCJleGNsdWRlIiwiY3JlYXRlTGV4Vml0ZUNvbmZpZyIsIm9wdGlvbnMiLCJzb3VyY2VGdWxsUGF0aCIsIm91dHB1dFBhdGgiLCJvdXRwdXRGdWxsUGF0aCIsImVudHJ5UGF0aCIsImVudHJ5IiwiZW50cnlKcyIsImh0bWxQYXRoIiwiZW50cnlIVE1MIiwiaGFzSHRtbEVudHJ5Iiwic3NyIiwib3V0cHV0SGFzaCIsIm1vZGUiLCJvdXRwdXRGaWxlIiwidml0ZUNvbmZpZyIsImFwcFR5cGUiLCJiYXNlIiwiYnVpbGQiLCJjc3NDb2RlU3BsaXQiLCJlbXB0eU91dERpciIsIm1pbmlmeSIsIm91dERpciIsInJvbGxkb3duT3B0aW9ucyIsImlucHV0IiwiYXNzZXRGaWxlTmFtZXMiLCJjaHVua0ZpbGVOYW1lcyIsImVudHJ5RmlsZU5hbWVzIiwibWFudWFsQ2h1bmtzIiwic291cmNlbWFwIiwic3djIiwidGFyZ2V0IiwianNjIiwidG9TdHJpbmciLCJjbGVhclNjcmVlbiIsImNvbmZpZ0ZpbGUiLCJjc3MiLCJwb3N0Y3NzIiwiZGVmaW5lIiwiZ2xvYmFsIiwiZW52RGlyIiwibG9nTGV2ZWwiLCJxdWlldCIsIm9wdGltaXplRGVwcyIsImluY2x1ZGUiLCJwbHVnaW5zIiwiQm9vbGVhbiIsImFuYWx5emUiLCJwdWJsaWNEaXIiLCJhbGlhcyIsInJhbmRvbWJ5dGVzIiwicmVhY3QiLCJleHRlbnNpb25zIiwicHJlc2VydmVTeW1saW5rcyIsInRzY29uZmlnUGF0aHMiLCJyb290IiwiaG1yIiwib3BlbiIsInBvcnQiLCJzdHJpY3RQb3J0IiwibGlicmFyeU5hbWUiLCJsaWIiLCJmb3JtYXRzIiwidml0ZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsT0FBT0EsWUFBWSx3QkFBd0I7QUFDM0MsU0FBUUMsU0FBUyxRQUFPLFlBQVk7QUFDcEMsU0FB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
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGluamVjdCBmcm9tICdAcm9sbHVwL3BsdWdpbi1pbmplY3QnO1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7bWVyZ2VDb25maWd9IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Z2VuZXJhdGVMZXhGYXZpY29ucywgZ2V0RGV2QXNzZXR9IGZyb20gJy4vYXNzZXRzLmpzJztcblxuaW1wb3J0IHR5cGUge0lubGluZUNvbmZpZywgUGx1Z2lufSBmcm9tICd2aXRlJztcblxuY29uc3QgY3JlYXRlSW5qZWN0UGx1Z2luID0gaW5qZWN0IGFzIHVua25vd24gYXMgKG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQbHVnaW47XG5cbmV4cG9ydCBjb25zdCBicm93c2VyR2xvYmFsTW9kdWxlcyA9IHtcbiAgQnVmZmVyOiBbJ2J1ZmZlci9pbmRleC5qcycsICdCdWZmZXInXSxcbiAgcHJvY2VzczogWydwcm9jZXNzL2Jyb3dzZXIuanMnLCAnZGVmYXVsdCddXG59IGFzIGNvbnN0O1xuXG5jb25zdCBicm93c2VyR2xvYmFsSW5qZWN0RXhjbHVkZXMgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvYnVmZmVyLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy9wcm9jZXNzLyoqJ1xuXTtcblxuY29uc3QgZGV2ZWxvcG1lbnRDYWNoZUhlYWRlcnMgPSB7XG4gICdDYWNoZS1Db250cm9sJzogJ25vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBtYXgtYWdlPTAnLFxuICBFeHBpcmVzOiAnMCcsXG4gIFByYWdtYTogJ25vLWNhY2hlJ1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBMZXhWaXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJztcbiAgcmVhZG9ubHkgZW50cnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wZW4/OiBib29sZWFuO1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNzcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGNvbnRlbnRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qc29uJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLnR4dCc6ICd0ZXh0L3BsYWluJyxcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMidcbn07XG5cbmNvbnN0IGVtcHR5Q3J5cHRvUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBsb2FkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnXFwwbGV4LWVtcHR5LWNyeXB0bycgPyAnZXhwb3J0IGRlZmF1bHQge307IGV4cG9ydCBjb25zdCB3ZWJjcnlwdG8gPSB1bmRlZmluZWQ7JyA6IG51bGw7XG4gIH0sXG4gIG5hbWU6ICdsZXgtZW1wdHktY3J5cHRvJyxcbiAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnY3J5cHRvJyB8fCBpZCA9PT0gJ25vZGU6Y3J5cHRvJyA/ICdcXDBsZXgtZW1wdHktY3J5cHRvJyA6IG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBub2RlUG9seWZpbGxNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBhc3NlcnQ6ICdhc3NlcnQvYnVpbGQvYXNzZXJ0LmpzJyxcbiAgYnVmZmVyOiAnYnVmZmVyL2luZGV4LmpzJyxcbiAgaHR0cDogJ3N0cmVhbS1odHRwL2luZGV4LmpzJyxcbiAgaHR0cHM6ICdodHRwcy1icm93c2VyaWZ5L2luZGV4LmpzJyxcbiAgb3M6ICdvcy1icm93c2VyaWZ5L2Jyb3dzZXIuanMnLFxuICBwYXRoOiAncGF0aC1icm93c2VyaWZ5L2luZGV4LmpzJyxcbiAgcHJvY2VzczogJ3Byb2Nlc3MvYnJvd3Nlci5qcycsXG4gIHN0cmVhbTogJ3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzJyxcbiAgdXRpbDogJ3V0aWwvdXRpbC5qcycsXG4gIHZtOiAndm0tYnJvd3NlcmlmeS9pbmRleC5qcydcbn07XG5cbmNvbnN0IG5vZGVQb2x5ZmlsbHNQbHVnaW4gPSAoKTogUGx1Z2luID0+ICh7XG4gIG5hbWU6ICdsZXgtbm9kZS1wb2x5ZmlsbHMnLFxuICByZXNvbHZlSWQoaWQpIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gaWQuc3RhcnRzV2l0aCgnbm9kZTonKSA/IGlkLnNsaWNlKDUpIDogaWQ7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBub2RlUG9seWZpbGxNb2R1bGVzW21vZHVsZU5hbWVdO1xuICAgIHJldHVybiByZXBsYWNlbWVudCA/IHJlc29sdmVQcm9qZWN0UGFja2FnZShyZXBsYWNlbWVudCkgOiBudWxsO1xuICB9XG59KTtcblxuY29uc3QgZ3JhcGhxbFBsdWdpbiA9ICgpOiBQbHVnaW4gPT4gKHtcbiAgbG9hZChpZCkge1xuICAgIGlmKCEvXFwuKGdxbHxncmFwaHFsKSQvLnRlc3QoaWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gSlNPTi5zdHJpbmdpZnkocmVhZEZpbGVTeW5jKGlkLCAndXRmOCcpKTtcbiAgICByZXR1cm4gYGltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnOyBleHBvcnQgZGVmYXVsdCBncWwoJHtzb3VyY2V9KTtgO1xuICB9LFxuICBuYW1lOiAnbGV4LWdyYXBocWwnXG59KTtcblxuY29uc3Qgc3djUGx1Z2luID0gKHNvdXJjZVBhdGg6IHN0cmluZyk6IFBsdWdpbiA9PiAoe1xuICBlbmZvcmNlOiAncHJlJyxcbiAgbmFtZTogJ2xleC1zd2MnLFxuICBhc3luYyB0cmFuc2Zvcm0oc291cmNlLCBpZCkge1xuICAgIGNvbnN0IGNsZWFuSWQgPSBpZC5zcGxpdCgnPycpWzBdO1xuICAgIGlmKCFjbGVhbklkLnN0YXJ0c1dpdGgoc291cmNlUGF0aCkgfHwgIS9cXC5banRdc3g/JC8udGVzdChjbGVhbklkKSB8fCAvXFwuKHRlc3R8c3BlY3xpbnRlZ3JhdGlvbnxlMmUpXFwuW2p0XXN4PyQvLnRlc3QoY2xlYW5JZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN3Y0NvbmZpZyA9IExleENvbmZpZy5nZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybShzb3VyY2UsIHtcbiAgICAgIC4uLnN3Y0NvbmZpZyxcbiAgICAgIGZpbGVuYW1lOiBjbGVhbklkLFxuICAgICAgbW9kdWxlOiB7Li4uc3djQ29uZmlnPy5tb2R1bGUsIHR5cGU6ICdlczYnfSxcbiAgICAgIHNvdXJjZU1hcHM6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IG5lZWRzUmVhY3QgPSAvXFxiUmVhY3RcXHMqXFwuLy50ZXN0KHJlc3VsdC5jb2RlKSAmJiAhL2Zyb21cXHMrWydcIl1yZWFjdFsnXCJdLy50ZXN0KHJlc3VsdC5jb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogbmVlZHNSZWFjdCA/IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xcbiR7cmVzdWx0LmNvZGV9YCA6IHJlc3VsdC5jb2RlLFxuICAgICAgbWFwOiByZXN1bHQubWFwIHx8IG51bGxcbiAgICB9O1xuICB9XG59KTtcblxuY29uc3QgaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4gPSAoc291cmNlUGF0aDogc3RyaW5nKTogUGx1Z2luID0+ICh7XG4gIGVuZm9yY2U6ICdwb3N0JyxcbiAgbmFtZTogJ2xleC1pbXBvcnQtbWV0YS1jb21wYXRpYmlsaXR5JyxcbiAgdHJhbnNmb3JtKHNvdXJjZSwgaWQpIHtcbiAgICBjb25zdCBjbGVhbklkID0gaWQuc3BsaXQoJz8nKVswXTtcbiAgICBpZighY2xlYW5JZC5zdGFydHNXaXRoKHNvdXJjZVBhdGgpIHx8ICFzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydC5tZXRhLnVybCcpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXBsYWNlbWVudCA9ICcodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgPyBuZXcgVVJMKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikuaHJlZiA6ICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gbmV3IFVSTChcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZikuaHJlZiA6IFwiXCIpKSc7XG4gICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlQWxsKCdpbXBvcnQubWV0YS51cmwnLCByZXBsYWNlbWVudCk7XG4gIH1cbn0pO1xuXG5jb25zdCBhc3NldHNEZXZQbHVnaW4gPSAoKTogUGx1Z2luID0+IHtcbiAgbGV0IGZhdmljb25IdG1sOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgYnVpbGRTdGFydCgpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhMZXhDb25maWcuY29uZmlnKTtcbiAgICAgIGZhdmljb25IdG1sID0gZ2VuZXJhdGVkRmF2aWNvbnM/Lmh0bWwgfHwgW107XG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIubWlkZGxld2FyZXMudXNlKGFzeW5jIChyZXF1ZXN0LCByZXNwb25zZSwgbmV4dCkgPT4ge1xuICAgICAgICBpZighcmVxdWVzdC51cmwpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgZ2V0RGV2QXNzZXQoTGV4Q29uZmlnLmNvbmZpZywgcmVxdWVzdC51cmwpO1xuICAgICAgICBpZighYXNzZXQpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9IDIwMDtcbiAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZXNbZXh0bmFtZShyZXF1ZXN0LnVybC5zcGxpdCgnPycpWzBdKV0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZW5kKGFzc2V0KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmFtZTogJ2xleC1hc3NldHMtZGV2JyxcbiAgICB0cmFuc2Zvcm1JbmRleEh0bWwoaHRtbCkge1xuICAgICAgaWYoZmF2aWNvbkh0bWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZSgnPC9oZWFkPicsIGAgICAgJHtmYXZpY29uSHRtbC5qb2luKCdcXG4gICAgJyl9XFxuICA8L2hlYWQ+YCk7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgYW5hbHl6ZXJQbHVnaW4gPSAoZW5hYmxlZDogYm9vbGVhbik6IFBsdWdpbiA9PiAoe1xuICBnZW5lcmF0ZUJ1bmRsZShfb3B0aW9ucywgYnVuZGxlKSB7XG4gICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBPYmplY3QuZW50cmllcyhidW5kbGUpLm1hcCgoW2ZpbGVOYW1lLCBvdXRwdXRdKSA9PiAoe1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBzaXplOiBvdXRwdXQudHlwZSA9PT0gJ2Fzc2V0J1xuICAgICAgICA/IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiBvdXRwdXQuc291cmNlID09PSAnc3RyaW5nJyA/IG91dHB1dC5zb3VyY2UgOiBvdXRwdXQuc291cmNlKVxuICAgICAgICA6IEJ1ZmZlci5ieXRlTGVuZ3RoKG91dHB1dC5jb2RlKSxcbiAgICAgIHR5cGU6IG91dHB1dC50eXBlXG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbWl0RmlsZSh7ZmlsZU5hbWU6ICdidW5kbGUtcmVwb3J0Lmpzb24nLCBzb3VyY2U6IEpTT04uc3RyaW5naWZ5KHJlcG9ydCwgbnVsbCwgMiksIHR5cGU6ICdhc3NldCd9KTtcbiAgfSxcbiAgbmFtZTogJ2xleC1idW5kbGUtYW5hbHl6ZXInXG59KTtcblxuY29uc3QgZ2V0TGlicmFyeUZvcm1hdHMgPSAobGlicmFyeVRhcmdldD86IHN0cmluZyk6IEFycmF5PCdjanMnIHwgJ2VzJyB8ICdpaWZlJyB8ICd1bWQnPiA9PiB7XG4gIGlmKGxpYnJhcnlUYXJnZXQgPT09ICdjb21tb25qcycgfHwgbGlicmFyeVRhcmdldCA9PT0gJ2NvbW1vbmpzMicpIHtcbiAgICByZXR1cm4gWydjanMnXTtcbiAgfVxuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndmFyJyB8fCBsaWJyYXJ5VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgIHJldHVybiBbJ2lpZmUnXTtcbiAgfVxuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndW1kJykge1xuICAgIHJldHVybiBbJ3VtZCddO1xuICB9XG4gIHJldHVybiBbJ2VzJ107XG59O1xuXG5jb25zdCBmaW5kTm9kZU1vZHVsZXNQYWNrYWdlID0gKHN0YXJ0UGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgbGV0IGN1cnJlbnRQYXRoID0gcmVzb2x2ZShzdGFydFBhdGgpO1xuXG4gIHdoaWxlKHRydWUpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcmVzb2x2ZShjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbiAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gY2FuZGlkYXRlUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVQcm9qZWN0UGFja2FnZSA9IChwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IGZpbmROb2RlTW9kdWxlc1BhY2thZ2UocHJvY2Vzcy5jd2QoKSwgcGFja2FnZU5hbWUpXG4gICAgfHwgZmluZE5vZGVNb2R1bGVzUGFja2FnZShMZXhDb25maWcuZ2V0TGV4RGlyKCksIHBhY2thZ2VOYW1lKVxuICAgIHx8IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuXG5leHBvcnQgY29uc3QgZ2V0QnJvd3Nlckdsb2JhbEluamVjdE9wdGlvbnMgPSAoY29tbWFuZDogTGV4Vml0ZU9wdGlvbnNbJ2NvbW1hbmQnXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICh7XG4gIC4uLihjb21tYW5kID09PSAnc2VydmUnID8gYnJvd3Nlckdsb2JhbE1vZHVsZXMgOiB7XG4gICAgQnVmZmVyOiBbcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXIvaW5kZXguanMnKSwgJ0J1ZmZlciddLFxuICAgIHByb2Nlc3M6IFtyZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3Byb2Nlc3MvYnJvd3Nlci5qcycpLCAnZGVmYXVsdCddXG4gIH0pLFxuICBleGNsdWRlOiBicm93c2VyR2xvYmFsSW5qZWN0RXhjbHVkZXNcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTGV4Vml0ZUNvbmZpZyA9IChvcHRpb25zOiBMZXhWaXRlT3B0aW9ucyk6IElubGluZUNvbmZpZyA9PiB7XG4gIGNvbnN0IHtjb25maWd9ID0gTGV4Q29uZmlnO1xuICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShzb3VyY2VQYXRoLCBvcHRpb25zLmVudHJ5IHx8IGNvbmZpZy5lbnRyeUpzIHx8ICdpbmRleC5qcycpO1xuICBjb25zdCBodG1sUGF0aCA9IHJlc29sdmUoc291cmNlUGF0aCwgY29uZmlnLmVudHJ5SFRNTCB8fCAnaW5kZXguaHRtbCcpO1xuICBjb25zdCBoYXNIdG1sRW50cnkgPSBleGlzdHNTeW5jKGh0bWxQYXRoKSAmJiAhb3B0aW9ucy5zc3I7XG4gIGNvbnN0IG91dHB1dEhhc2ggPSBjb25maWcub3V0cHV0SGFzaCB8fCBvcHRpb25zLm1vZGUgPT09ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgZmlsZU5hbWUgPSBjb25maWcub3V0cHV0RmlsZSB8fCAob3V0cHV0SGFzaCA/ICdbbmFtZV0uW2hhc2hdLmpzJyA6ICdbbmFtZV0uanMnKTtcblxuICBjb25zdCB2aXRlQ29uZmlnOiBJbmxpbmVDb25maWcgPSB7XG4gICAgYXBwVHlwZTogaGFzSHRtbEVudHJ5ID8gJ3NwYScgOiAnY3VzdG9tJyxcbiAgICBiYXNlOiAnLycsXG4gICAgYnVpbGQ6IHtcbiAgICAgIGNzc0NvZGVTcGxpdDogdHJ1ZSxcbiAgICAgIGVtcHR5T3V0RGlyOiBmYWxzZSxcbiAgICAgIG1pbmlmeTogb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbicsXG4gICAgICBvdXREaXI6IG91dHB1dFBhdGgsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGhhc0h0bWxFbnRyeSA/IGh0bWxQYXRoIDogZW50cnlQYXRoLFxuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogb3V0cHV0SGFzaCA/ICdhc3NldHMvW25hbWVdLltoYXNoXVtleHRuYW1lXScgOiAnYXNzZXRzL1tuYW1lXVtleHRuYW1lXScsXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6IG91dHB1dEhhc2ggPyAnW25hbWVdLltoYXNoXS5jaHVuay5qcycgOiAnW25hbWVdLmNodW5rLmpzJyxcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZmlsZU5hbWUsXG4gICAgICAgICAgbWFudWFsQ2h1bmtzKGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgPyAndmVuZG9ycycgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlbWFwOiAhIWNvbmZpZy5zd2M/LnNvdXJjZU1hcHMsXG4gICAgICBzc3I6IG9wdGlvbnMuc3NyID8gZW50cnlQYXRoIDogZmFsc2UsXG4gICAgICB0YXJnZXQ6IGNvbmZpZy5zd2M/LmpzYz8udGFyZ2V0Py50b1N0cmluZygpIHx8ICdlczIwMjAnXG4gICAgfSxcbiAgICBjbGVhclNjcmVlbjogZmFsc2UsXG4gICAgY29uZmlnRmlsZTogZmFsc2UsXG4gICAgY3NzOiB7XG4gICAgICBwb3N0Y3NzOiByZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ3Bvc3Rjc3MuY29uZmlnLmpzJylcbiAgICB9LFxuICAgIGRlZmluZToge1xuICAgICAgZ2xvYmFsOiAnZ2xvYmFsVGhpcycsXG4gICAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBKU09OLnN0cmluZ2lmeShvcHRpb25zLm1vZGUgfHwgKG9wdGlvbnMuY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpKVxuICAgIH0sXG4gICAgZW52RGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGxvZ0xldmVsOiBvcHRpb25zLnF1aWV0ID8gJ3NpbGVudCcgOiAnaW5mbycsXG4gICAgbW9kZTogb3B0aW9ucy5tb2RlIHx8IChvcHRpb25zLmNvbW1hbmQgPT09ICdidWlsZCcgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnKSxcbiAgICBvcHRpbWl6ZURlcHM6IG9wdGlvbnMuc3NyID8gdW5kZWZpbmVkIDoge1xuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZCA9PT0gJ3NlcnZlJyA/IHtmb3JjZTogdHJ1ZX0gOiB7fSksXG4gICAgICBpbmNsdWRlOiBbJ2J1ZmZlci9pbmRleC5qcycsICdwcm9jZXNzL2Jyb3dzZXIuanMnXVxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLi4uKG9wdGlvbnMuc3NyID8gW10gOiBbXG4gICAgICAgIGVtcHR5Q3J5cHRvUGx1Z2luKCksXG4gICAgICAgIG5vZGVQb2x5ZmlsbHNQbHVnaW4oKSxcbiAgICAgICAgY3JlYXRlSW5qZWN0UGx1Z2luKGdldEJyb3dzZXJHbG9iYWxJbmplY3RPcHRpb25zKG9wdGlvbnMuY29tbWFuZCkpXG4gICAgICBdKSxcbiAgICAgIHN3Y1BsdWdpbihzb3VyY2VQYXRoKSxcbiAgICAgIGdyYXBocWxQbHVnaW4oKSxcbiAgICAgIC4uLihvcHRpb25zLnNzciA/IFtdIDogW1xuICAgICAgICBpbXBvcnRNZXRhQ29tcGF0aWJpbGl0eVBsdWdpbihzb3VyY2VQYXRoKSxcbiAgICAgICAgYXNzZXRzRGV2UGx1Z2luKCksXG4gICAgICAgIGFuYWx5emVyUGx1Z2luKEJvb2xlYW4ob3B0aW9ucy5hbmFseXplKSlcbiAgICAgIF0pXG4gICAgXSxcbiAgICBwdWJsaWNEaXI6IGZhbHNlLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIEJ1ZmZlcjogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXInKSxcbiAgICAgICAgJ2NvcmUtanMnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2NvcmUtanMnKSxcbiAgICAgICAgZ2xvYmFsOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2dsb2JhbCcpLFxuICAgICAgICAnZ3JhcGhxbC10YWcnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2dyYXBocWwtdGFnJyksXG4gICAgICAgIHJhbmRvbWJ5dGVzOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JhbmRvbWJ5dGVzJyksXG4gICAgICAgIHJlYWN0OiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlYWN0JyksXG4gICAgICAgICdyZWFjdC1kb20nOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlYWN0LWRvbScpLFxuICAgICAgICAncmVnZW5lcmF0b3ItcnVudGltZSc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgncmVnZW5lcmF0b3ItcnVudGltZScpXG4gICAgICB9LFxuICAgICAgZXh0ZW5zaW9uczogWycubWpzJywgJy5qcycsICcudHMnLCAnLnRzeCcsICcuanN4JywgJy5qc29uJywgJy5ncWwnLCAnLmdyYXBocWwnXSxcbiAgICAgIHByZXNlcnZlU3ltbGlua3M6IGZhbHNlLFxuICAgICAgdHNjb25maWdQYXRoczogdHJ1ZVxuICAgIH0sXG4gICAgcm9vdDogc291cmNlUGF0aCxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIGFsbG93ZWRIb3N0czogdHJ1ZSxcbiAgICAgIGhlYWRlcnM6IGRldmVsb3BtZW50Q2FjaGVIZWFkZXJzLFxuICAgICAgaG1yOiBmYWxzZSxcbiAgICAgIGhvc3Q6ICcwLjAuMC4wJyxcbiAgICAgIG9wZW46IG9wdGlvbnMub3BlbixcbiAgICAgIHBvcnQ6IG9wdGlvbnMucG9ydCxcbiAgICAgIHN0cmljdFBvcnQ6IHRydWVcbiAgICB9XG4gIH07XG5cbiAgaWYoIWhhc0h0bWxFbnRyeSAmJiBjb25maWcubGlicmFyeU5hbWUgJiYgIW9wdGlvbnMuc3NyKSB7XG4gICAgdml0ZUNvbmZpZy5idWlsZCA9IHtcbiAgICAgIC4uLnZpdGVDb25maWcuYnVpbGQsXG4gICAgICBsaWI6IHtcbiAgICAgICAgZW50cnk6IGVudHJ5UGF0aCxcbiAgICAgICAgZmlsZU5hbWU6ICgpID0+IGNvbmZpZy5vdXRwdXRGaWxlIHx8ICdpbmRleC5qcycsXG4gICAgICAgIGZvcm1hdHM6IGdldExpYnJhcnlGb3JtYXRzKGNvbmZpZy5saWJyYXJ5VGFyZ2V0KSxcbiAgICAgICAgbmFtZTogY29uZmlnLmxpYnJhcnlOYW1lXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBtZXJnZUNvbmZpZyh2aXRlQ29uZmlnLCBjb25maWcudml0ZSB8fCB7fSkgYXMgSW5saW5lQ29uZmlnO1xufTtcbiJdLCJuYW1lcyI6WyJpbmplY3QiLCJ0cmFuc2Zvcm0iLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiZGlybmFtZSIsImV4dG5hbWUiLCJyZXNvbHZlIiwibWVyZ2VDb25maWciLCJMZXhDb25maWciLCJnZW5lcmF0ZUxleEZhdmljb25zIiwiZ2V0RGV2QXNzZXQiLCJjcmVhdGVJbmplY3RQbHVnaW4iLCJicm93c2VyR2xvYmFsTW9kdWxlcyIsIkJ1ZmZlciIsInByb2Nlc3MiLCJicm93c2VyR2xvYmFsSW5qZWN0RXhjbHVkZXMiLCJkZXZlbG9wbWVudENhY2hlSGVhZGVycyIsIkV4cGlyZXMiLCJQcmFnbWEiLCJjb250ZW50VHlwZXMiLCJlbXB0eUNyeXB0b1BsdWdpbiIsImxvYWQiLCJpZCIsIm5hbWUiLCJyZXNvbHZlSWQiLCJub2RlUG9seWZpbGxNb2R1bGVzIiwiYXNzZXJ0IiwiYnVmZmVyIiwiaHR0cCIsImh0dHBzIiwib3MiLCJwYXRoIiwic3RyZWFtIiwidXRpbCIsInZtIiwibm9kZVBvbHlmaWxsc1BsdWdpbiIsIm1vZHVsZU5hbWUiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJyZXBsYWNlbWVudCIsInJlc29sdmVQcm9qZWN0UGFja2FnZSIsImdyYXBocWxQbHVnaW4iLCJ0ZXN0Iiwic291cmNlIiwiSlNPTiIsInN0cmluZ2lmeSIsInN3Y1BsdWdpbiIsInNvdXJjZVBhdGgiLCJlbmZvcmNlIiwiY2xlYW5JZCIsInNwbGl0Iiwic3djQ29uZmlnIiwiZ2V0U1dDQ29uZmlnV2l0aFJlYWN0Q29tcGlsZXIiLCJyZXN1bHQiLCJmaWxlbmFtZSIsIm1vZHVsZSIsInR5cGUiLCJzb3VyY2VNYXBzIiwibmVlZHNSZWFjdCIsImNvZGUiLCJtYXAiLCJpbXBvcnRNZXRhQ29tcGF0aWJpbGl0eVBsdWdpbiIsImluY2x1ZGVzIiwicmVwbGFjZUFsbCIsImFzc2V0c0RldlBsdWdpbiIsImZhdmljb25IdG1sIiwiYnVpbGRTdGFydCIsImdlbmVyYXRlZEZhdmljb25zIiwiY29uZmlnIiwiaHRtbCIsImNvbmZpZ3VyZVNlcnZlciIsInNlcnZlciIsIm1pZGRsZXdhcmVzIiwidXNlIiwicmVxdWVzdCIsInJlc3BvbnNlIiwibmV4dCIsInVybCIsImFzc2V0Iiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsImVuZCIsInRyYW5zZm9ybUluZGV4SHRtbCIsImxlbmd0aCIsInJlcGxhY2UiLCJqb2luIiwiYW5hbHl6ZXJQbHVnaW4iLCJlbmFibGVkIiwiZ2VuZXJhdGVCdW5kbGUiLCJfb3B0aW9ucyIsImJ1bmRsZSIsInJlcG9ydCIsIk9iamVjdCIsImVudHJpZXMiLCJmaWxlTmFtZSIsIm91dHB1dCIsInNpemUiLCJieXRlTGVuZ3RoIiwiZW1pdEZpbGUiLCJnZXRMaWJyYXJ5Rm9ybWF0cyIsImxpYnJhcnlUYXJnZXQiLCJmaW5kTm9kZU1vZHVsZXNQYWNrYWdlIiwic3RhcnRQYXRoIiwicGFja2FnZU5hbWUiLCJjdXJyZW50UGF0aCIsImNhbmRpZGF0ZVBhdGgiLCJwYXJlbnRQYXRoIiwidW5kZWZpbmVkIiwiY3dkIiwiZ2V0TGV4RGlyIiwiZ2V0QnJvd3Nlckdsb2JhbEluamVjdE9wdGlvbnMiLCJjb21tYW5kIiwiZXhjbHVkZSIsImNyZWF0ZUxleFZpdGVDb25maWciLCJvcHRpb25zIiwic291cmNlRnVsbFBhdGgiLCJvdXRwdXRQYXRoIiwib3V0cHV0RnVsbFBhdGgiLCJlbnRyeVBhdGgiLCJlbnRyeSIsImVudHJ5SnMiLCJodG1sUGF0aCIsImVudHJ5SFRNTCIsImhhc0h0bWxFbnRyeSIsInNzciIsIm91dHB1dEhhc2giLCJtb2RlIiwib3V0cHV0RmlsZSIsInZpdGVDb25maWciLCJhcHBUeXBlIiwiYmFzZSIsImJ1aWxkIiwiY3NzQ29kZVNwbGl0IiwiZW1wdHlPdXREaXIiLCJtaW5pZnkiLCJvdXREaXIiLCJyb2xsZG93bk9wdGlvbnMiLCJpbnB1dCIsImFzc2V0RmlsZU5hbWVzIiwiY2h1bmtGaWxlTmFtZXMiLCJlbnRyeUZpbGVOYW1lcyIsIm1hbnVhbENodW5rcyIsInNvdXJjZW1hcCIsInN3YyIsInRhcmdldCIsImpzYyIsInRvU3RyaW5nIiwiY2xlYXJTY3JlZW4iLCJjb25maWdGaWxlIiwiY3NzIiwicG9zdGNzcyIsImRlZmluZSIsImdsb2JhbCIsImVudkRpciIsImxvZ0xldmVsIiwicXVpZXQiLCJvcHRpbWl6ZURlcHMiLCJmb3JjZSIsImluY2x1ZGUiLCJwbHVnaW5zIiwiQm9vbGVhbiIsImFuYWx5emUiLCJwdWJsaWNEaXIiLCJhbGlhcyIsInJhbmRvbWJ5dGVzIiwicmVhY3QiLCJleHRlbnNpb25zIiwicHJlc2VydmVTeW1saW5rcyIsInRzY29uZmlnUGF0aHMiLCJyb290IiwiYWxsb3dlZEhvc3RzIiwiaGVhZGVycyIsImhtciIsImhvc3QiLCJvcGVuIiwicG9ydCIsInN0cmljdFBvcnQiLCJsaWJyYXJ5TmFtZSIsImxpYiIsImZvcm1hdHMiLCJ2aXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxPQUFPQSxZQUFZLHdCQUF3QjtBQUMzQyxTQUFRQyxTQUFTLFFBQU8sWUFBWTtBQUNwQyxTQUFRQyxVQUFVLEVBQUVDLFlBQVksUUFBTyxLQUFLO0FBQzVDLFNBQVFDLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUMvQyxTQUFRQyxXQUFXLFFBQU8sT0FBTztBQUVqQyxTQUFRQyxTQUFTLFFBQU8scUJBQXFCO0FBQzdDLFNBQVFDLG1CQUFtQixFQUFFQyxXQUFXLFFBQU8sY0FBYztBQUk3RCxNQUFNQyxxQkFBcUJYO0FBRTNCLE9BQU8sTUFBTVksdUJBQXVCO0lBQ2xDQyxRQUFRO1FBQUM7UUFBbUI7S0FBUztJQUNyQ0MsU0FBUztRQUFDO1FBQXNCO0tBQVU7QUFDNUMsRUFBVztBQUVYLE1BQU1DLDhCQUE4QjtJQUNsQztJQUNBO0NBQ0Q7QUFFRCxNQUFNQywwQkFBMEI7SUFDOUIsaUJBQWlCO0lBQ2pCQyxTQUFTO0lBQ1RDLFFBQVE7QUFDVjtBQWFBLE1BQU1DLGVBQXVDO0lBQzNDLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1Is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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nlabs/lex",
3
- "version": "2.0.3",
4
- "description": "Lex",
3
+ "version": "2.0.5",
4
+ "description": "All-in-one CLI to create, develop, test, build, and ship React, TypeScript, library, and serverless projects.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
@@ -28,8 +28,21 @@
28
28
  "types": "./lib/index.d.ts",
29
29
  "keywords": [
30
30
  "arkhamjs",
31
+ "build-tool",
32
+ "cli",
33
+ "code-generator",
34
+ "developer-tools",
35
+ "devops",
31
36
  "lex",
32
37
  "nitrogenlabs",
38
+ "playwright",
39
+ "react",
40
+ "react-19",
41
+ "serverless",
42
+ "storybook",
43
+ "tailwindcss",
44
+ "typescript",
45
+ "vitest",
33
46
  "vite"
34
47
  ],
35
48
  "author": {
@@ -41,7 +54,7 @@
41
54
  "type": "git",
42
55
  "url": "git+https://github.com/nitrogenlabs/lex.git"
43
56
  },
44
- "homepage": "https://github.com/nitrogenlabs/lex",
57
+ "homepage": "https://lex.nitrogenx.co",
45
58
  "bugs": {
46
59
  "url": "https://github.com/nitrogenlabs/lex/issues"
47
60
  },
@@ -53,6 +66,7 @@
53
66
  "build:all": "npm run build && npm run build:ai",
54
67
  "build:ai": "NODE_ENV=production && npx swc 'src/commands/ai/**/*.{ts,tsx}' --out-dir ./lib/commands/ai --source-maps inline",
55
68
  "declarations": "tsc -p tsconfig.build.json",
69
+ "docs:check": "npm run build && node scripts/validate-docs.js",
56
70
  "clean": "rm -rf lib node_modules package-lock.json *.log coverage",
57
71
  "compile": "tsc -p tsconfig.build.json",
58
72
  "env": "LEX_CONFIG='{\"useTypescript\":true}'",
@@ -86,20 +100,20 @@
86
100
  "dependencies": {
87
101
  "@playwright/test": "^1.62.1",
88
102
  "@rollup/plugin-inject": "^5.0.5",
89
- "@storybook/addon-docs": "^10.5.8",
90
- "@storybook/addon-links": "^10.5.8",
91
- "@storybook/addon-themes": "^10.5.8",
92
- "@storybook/react": "^10.5.8",
93
- "@storybook/react-vite": "^10.5.8",
103
+ "@storybook/addon-docs": "^10.5.10",
104
+ "@storybook/addon-links": "^10.5.10",
105
+ "@storybook/addon-themes": "^10.5.10",
106
+ "@storybook/react": "^10.5.10",
107
+ "@storybook/react-vite": "^10.5.10",
94
108
  "@swc/cli": "^0.8.1",
95
- "@swc/core": "^1.16.0",
96
- "@swc/react-compiler": "^1.16.0",
109
+ "@swc/core": "^1.16.1",
110
+ "@swc/react-compiler": "^1.16.1",
97
111
  "@tailwindcss/forms": "^0.5.11",
98
112
  "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e",
99
113
  "@tailwindcss/postcss": "4.3.3",
100
114
  "@testing-library/jest-dom": "^7.0.1",
101
115
  "@testing-library/react": "^16.3.2",
102
- "@vitest/coverage-v8": "^4.1.10",
116
+ "@vitest/coverage-v8": "4.1.11",
103
117
  "assert": "^2.1.0",
104
118
  "autoprefixer": "^10.5.4",
105
119
  "boxen": "8.0.1",
@@ -109,9 +123,9 @@
109
123
  "commander": "^15.0.0",
110
124
  "compare-versions": "^6.1.1",
111
125
  "core-js": "^3.50.0",
112
- "cssnano": "^8.0.6",
126
+ "cssnano": "^8.0.8",
113
127
  "esbuild": "^0.28.2",
114
- "eslint": "^10.8.1",
128
+ "eslint": "^10.9.0",
115
129
  "eslint-config-styleguidejs": "^5.0.7",
116
130
  "execa": "10.0.1",
117
131
  "expect": "^30.4.1",
@@ -129,7 +143,7 @@
129
143
  "luxon": "^3.7.2",
130
144
  "math-expression-evaluator": "^2.0.7",
131
145
  "npm-check-updates": "^23.0.2",
132
- "openai": "^7.4.0",
146
+ "openai": "^7.5.0",
133
147
  "ora": "9.4.1",
134
148
  "os-browserify": "^0.3.0",
135
149
  "pacote": "^22.0.0",
@@ -156,7 +170,7 @@
156
170
  "rimraf": "^6.1.3",
157
171
  "semver": "^7.8.5",
158
172
  "sharp": "^0.35.3",
159
- "storybook": "^10.5.8",
173
+ "storybook": "^10.5.10",
160
174
  "stream-browserify": "^3.0.0",
161
175
  "stream-http": "^3.2.0",
162
176
  "svgo": "4.0.2",
@@ -164,14 +178,14 @@
164
178
  "ts-node": "^10.9.2",
165
179
  "typescript": "^7.0.2",
166
180
  "util": "^0.12.5",
167
- "vite": "^8.2.1",
168
- "vitest": "^4.1.10",
181
+ "vite": "^8.2.2",
182
+ "vitest": "4.1.11",
169
183
  "vm-browserify": "^1.1.2",
170
184
  "ws": "^8.21.3"
171
185
  },
172
186
  "devDependencies": {
173
187
  "@types/express": "^5.0.6",
174
- "@types/luxon": "^3.7.4",
188
+ "@types/luxon": "^3.7.5",
175
189
  "@types/node": "^26.2.0",
176
190
  "@types/react": "^19.2.18",
177
191
  "@types/semver": "^7.8.0"
@@ -0,0 +1,141 @@
1
+ import {execFileSync} from 'child_process';
2
+ import {transformSync} from 'esbuild';
3
+ import {existsSync, readFileSync, readdirSync, statSync} from 'fs';
4
+ import {dirname, extname, resolve} from 'path';
5
+
6
+ const root = process.cwd();
7
+ const docs = ['README.md', 'CHANGELOG.md', 'MIGRATION_V2.md'];
8
+
9
+ const collectMarkdown = (directory) => {
10
+ for(const entry of readdirSync(directory)) {
11
+ const path = resolve(directory, entry);
12
+ if(statSync(path).isDirectory()) {
13
+ collectMarkdown(path);
14
+ } else if(extname(path) === '.md') {
15
+ docs.push(path.slice(root.length + 1));
16
+ }
17
+ }
18
+ };
19
+
20
+ collectMarkdown(resolve(root, 'examples'));
21
+ collectMarkdown(resolve(root, 'src/commands'));
22
+
23
+ const rootHelp = execFileSync(process.execPath, ['lib/lex.js', '--help'], {encoding: 'utf8'});
24
+ const commands = new Set([...rootHelp.matchAll(/^ ([\w-]+)(?:\s|$)/gm)].map((match) => match[1]));
25
+ const commandOptions = new Map();
26
+ const errors = [];
27
+ const lexExports = await import('../lib/index.js');
28
+ const documentationCommands = {
29
+ ai: 'ai',
30
+ build: 'build',
31
+ clean: 'clean',
32
+ compile: 'compile',
33
+ config: 'config',
34
+ create: 'create',
35
+ dev: 'dev',
36
+ init: 'init',
37
+ link: 'linked',
38
+ lint: 'lint',
39
+ migrate: 'migrate',
40
+ publish: 'publish',
41
+ 'serverless-deploy': 'serverless-deploy',
42
+ 'serverless-dev': 'serverless-dev',
43
+ storybook: 'storybook',
44
+ test: 'test',
45
+ update: 'update',
46
+ upgrade: 'upgrade',
47
+ versions: 'versions'
48
+ };
49
+
50
+ for(const command of commands) {
51
+ if(command === 'help') continue;
52
+ const help = execFileSync(process.execPath, ['lib/lex.js', command, '--help'], {encoding: 'utf8'});
53
+ commandOptions.set(command, new Set([...help.matchAll(/--[A-Za-z][\w-]*/g)].map((match) => match[0])));
54
+ }
55
+
56
+ for(const relativePath of docs) {
57
+ const filePath = resolve(root, relativePath);
58
+ const content = readFileSync(filePath, 'utf8');
59
+
60
+ for(const match of content.matchAll(/!?\[[^\]]*\]\(([^)]+)\)/g)) {
61
+ const target = match[1].split('#')[0].trim();
62
+ if(!target || /^(?:https?:|mailto:)/.test(target)) continue;
63
+ const decodedTarget = decodeURIComponent(target.replace(/^<|>$/g, ''));
64
+ if(!existsSync(resolve(dirname(filePath), decodedTarget))) {
65
+ errors.push(`${relativePath}: broken local link ${match[1]}`);
66
+ }
67
+ }
68
+
69
+ for(const match of content.matchAll(/```json\s*\n([\s\S]*?)```/g)) {
70
+ try {
71
+ JSON.parse(match[1]);
72
+ } catch(error) {
73
+ errors.push(`${relativePath}: invalid JSON example (${error.message})`);
74
+ }
75
+ }
76
+
77
+ for(const match of content.matchAll(/```(javascript|js|typescript|ts)\s*\n([\s\S]*?)```/g)) {
78
+ try {
79
+ transformSync(match[2], {
80
+ format: 'esm',
81
+ loader: match[1].startsWith('t') ? 'ts' : 'js',
82
+ target: 'es2023'
83
+ });
84
+ } catch(error) {
85
+ const message = error.errors?.[0]?.text || error.message;
86
+ errors.push(`${relativePath}: invalid ${match[1]} example (${message})`);
87
+ }
88
+ }
89
+
90
+ for(const match of content.matchAll(/import\s*\{([^}]+)\}\s*from\s*['"]@nlabs\/lex['"]/g)) {
91
+ const names = match[1].split(',').map((name) => name.trim().split(/\s+as\s+/)[0]);
92
+ for(const name of names) {
93
+ if(name && !(name in lexExports)) {
94
+ errors.push(`${relativePath}: @nlabs/lex does not export ${name}`);
95
+ }
96
+ }
97
+ }
98
+
99
+ if(relativePath.endsWith('.test.md')) {
100
+ for(const match of content.matchAll(/`([\w.-]+\.test\.[jt]sx?)`/g)) {
101
+ if(!existsSync(resolve(dirname(filePath), match[1]))) {
102
+ errors.push(`${relativePath}: referenced test file does not exist: ${match[1]}`);
103
+ }
104
+ }
105
+ }
106
+
107
+ const commandDirectory = relativePath.match(/^src\/commands\/([^/]+)\/[^/]+\.docs\.md$/)?.[1];
108
+ const documentedCommand = commandDirectory ? documentationCommands[commandDirectory] : undefined;
109
+ if(documentedCommand) {
110
+ const validOptions = commandOptions.get(documentedCommand) || new Set();
111
+ for(const match of content.matchAll(/(?<![\w])(--[A-Za-z][\w-]*)/g)) {
112
+ if(!validOptions.has(match[1])) {
113
+ errors.push(`${relativePath}: unknown documented option ${match[1]} for lex ${documentedCommand}`);
114
+ }
115
+ }
116
+ }
117
+
118
+ for(const [index, line] of content.split('\n').entries()) {
119
+ for(const commandMatch of line.matchAll(/\blex\s+([\w-]+)([^`|]*)/g)) {
120
+ const [, command, remainder] = commandMatch;
121
+ if(!commands.has(command)) {
122
+ errors.push(`${relativePath}:${index + 1}: unknown command lex ${command}`);
123
+ continue;
124
+ }
125
+
126
+ const validOptions = commandOptions.get(command) || new Set();
127
+ for(const option of remainder.match(/--[A-Za-z][\w-]*/g) || []) {
128
+ if(!validOptions.has(option)) {
129
+ errors.push(`${relativePath}:${index + 1}: unknown option ${option} for lex ${command}`);
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+
136
+ if(errors.length > 0) {
137
+ console.error([...new Set(errors)].join('\n'));
138
+ process.exitCode = 1;
139
+ } else {
140
+ console.log(`Documentation validation passed for ${docs.length} Markdown files.`);
141
+ }