@nlabs/lex 1.48.6 → 1.49.0

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.
Files changed (107) hide show
  1. package/.storybook/main.ts +9 -2
  2. package/.vscode/settings.json +1 -6
  3. package/README.md +276 -4
  4. package/eslint.config.mjs +24 -0
  5. package/examples/lex.config.js +18 -8
  6. package/examples/serverless-example/README.md +109 -0
  7. package/examples/serverless-example/dist/handlers/echo.js +15 -0
  8. package/examples/serverless-example/dist/handlers/graphql.js +137 -0
  9. package/examples/serverless-example/dist/handlers/hello.js +15 -0
  10. package/examples/serverless-example/dist/handlers/test.js +17 -0
  11. package/examples/serverless-example/dist/handlers/websocket.js +14 -0
  12. package/examples/serverless-example/lex.config.mjs +74 -0
  13. package/jest.config.mjs +13 -12
  14. package/{dist → lib}/LexConfig.d.ts +14 -6
  15. package/lib/LexConfig.js +268 -0
  16. package/lib/commands/ai/ai.js +303 -0
  17. package/{dist → lib}/commands/build/build.d.ts +3 -0
  18. package/lib/commands/build/build.js +494 -0
  19. package/{dist → lib}/commands/clean/clean.js +1 -1
  20. package/lib/commands/compile/compile.js +241 -0
  21. package/lib/commands/copy/copy.js +38 -0
  22. package/{dist → lib}/commands/create/create.js +1 -1
  23. package/{dist → lib}/commands/dev/dev.d.ts +2 -0
  24. package/lib/commands/dev/dev.js +286 -0
  25. package/{dist → lib}/commands/init/init.js +1 -1
  26. package/{dist → lib}/commands/lint/lint.d.ts +4 -1
  27. package/lib/commands/lint/lint.js +993 -0
  28. package/{dist → lib}/commands/migrate/migrate.js +1 -1
  29. package/lib/commands/publish/publish.js +104 -0
  30. package/lib/commands/serverless/serverless.d.ts +17 -0
  31. package/lib/commands/serverless/serverless.js +662 -0
  32. package/lib/commands/storybook/storybook.js +249 -0
  33. package/lib/commands/test/test.js +428 -0
  34. package/lib/commands/update/update.js +128 -0
  35. package/lib/commands/versions/versions.js +41 -0
  36. package/{dist → lib}/create/changelog.js +1 -1
  37. package/{dist → lib}/index.d.ts +2 -0
  38. package/{dist → lib}/index.js +3 -1
  39. package/lib/lex.js +73 -0
  40. package/lib/storybook/index.d.ts +5 -0
  41. package/lib/types.js +1 -0
  42. package/lib/utils/aiService.d.ts +9 -0
  43. package/lib/utils/aiService.js +299 -0
  44. package/{dist → lib}/utils/app.d.ts +3 -0
  45. package/lib/utils/app.js +296 -0
  46. package/lib/utils/deepMerge.js +26 -0
  47. package/{dist → lib}/utils/file.d.ts +7 -3
  48. package/lib/utils/file.js +229 -0
  49. package/lib/utils/translations.d.ts +1 -0
  50. package/lib/utils/translations.js +74 -0
  51. package/package.json +62 -50
  52. package/postcss.config.js +5 -3
  53. package/tsconfig.build.json +2 -2
  54. package/webpack.config.js +229 -39
  55. package/dist/LexConfig.js +0 -286
  56. package/dist/commands/ai/ai.js +0 -303
  57. package/dist/commands/build/build.js +0 -404
  58. package/dist/commands/compile/compile.js +0 -234
  59. package/dist/commands/copy/copy.js +0 -38
  60. package/dist/commands/dev/dev.js +0 -74
  61. package/dist/commands/lint/lint.js +0 -811
  62. package/dist/commands/publish/publish.js +0 -104
  63. package/dist/commands/storybook/storybook.js +0 -249
  64. package/dist/commands/test/test.js +0 -429
  65. package/dist/commands/update/update.js +0 -132
  66. package/dist/commands/versions/versions.js +0 -41
  67. package/dist/lex.js +0 -70
  68. package/dist/utils/aiService.d.ts +0 -9
  69. package/dist/utils/aiService.js +0 -299
  70. package/dist/utils/app.js +0 -267
  71. package/dist/utils/deepMerge.js +0 -24
  72. package/dist/utils/file.js +0 -185
  73. package/emptyModule.js +0 -0
  74. package/eslint.config.js +0 -7
  75. /package/{dist → lib}/Button.stories.d.ts +0 -0
  76. /package/{dist → lib}/commands/ai/ai.d.ts +0 -0
  77. /package/{dist → lib}/commands/ai/index.d.ts +0 -0
  78. /package/{dist → lib}/commands/ai/index.js +0 -0
  79. /package/{dist → lib}/commands/clean/clean.d.ts +0 -0
  80. /package/{dist → lib}/commands/compile/compile.d.ts +0 -0
  81. /package/{dist → lib}/commands/config/config.d.ts +0 -0
  82. /package/{dist → lib}/commands/config/config.js +0 -0
  83. /package/{dist → lib}/commands/copy/copy.d.ts +0 -0
  84. /package/{dist → lib}/commands/create/create.d.ts +0 -0
  85. /package/{dist → lib}/commands/init/init.d.ts +0 -0
  86. /package/{dist → lib}/commands/link/link.d.ts +0 -0
  87. /package/{dist → lib}/commands/link/link.js +0 -0
  88. /package/{dist → lib}/commands/lint/autofix.d.ts +0 -0
  89. /package/{dist → lib}/commands/migrate/migrate.d.ts +0 -0
  90. /package/{dist → lib}/commands/publish/publish.d.ts +0 -0
  91. /package/{dist → lib}/commands/storybook/storybook.d.ts +0 -0
  92. /package/{dist → lib}/commands/test/test.d.ts +0 -0
  93. /package/{dist → lib}/commands/update/update.d.ts +0 -0
  94. /package/{dist → lib}/commands/upgrade/upgrade.d.ts +0 -0
  95. /package/{dist → lib}/commands/upgrade/upgrade.js +0 -0
  96. /package/{dist → lib}/commands/versions/versions.d.ts +0 -0
  97. /package/{dist → lib}/create/changelog.d.ts +0 -0
  98. /package/{dist → lib}/lex.d.ts +0 -0
  99. /package/{dist/types.js → lib/storybook/index.js} +0 -0
  100. /package/{dist → lib}/test-react/index.d.ts +0 -0
  101. /package/{dist → lib}/test-react/index.js +0 -0
  102. /package/{dist → lib}/types.d.ts +0 -0
  103. /package/{dist → lib}/utils/deepMerge.d.ts +0 -0
  104. /package/{dist → lib}/utils/log.d.ts +0 -0
  105. /package/{dist → lib}/utils/log.js +0 -0
  106. /package/{dist → lib}/utils/reactShim.d.ts +0 -0
  107. /package/{dist → lib}/utils/reactShim.js +0 -0
@@ -1,104 +0,0 @@
1
- import { execa } from "execa";
2
- import semver from "semver";
3
- import { LexConfig } from "../../LexConfig.js";
4
- import { createSpinner, getPackageJson, setPackageJson } from "../../utils/app.js";
5
- import { log } from "../../utils/log.js";
6
- const publish = async (cmd, callback = process.exit) => {
7
- const { bump, cliName = "Lex", newVersion, otp, packageManager: cmdPackageManager, private: accessPrivate, tag, quiet } = cmd;
8
- log(`${cliName} publishing npm module...`, "info", quiet);
9
- const spinner = createSpinner(quiet);
10
- await LexConfig.parseConfig(cmd);
11
- const { packageManager: configPackageManager } = LexConfig.config;
12
- const packageManager = cmdPackageManager || configPackageManager;
13
- const publishOptions = ["publish"];
14
- if (accessPrivate) {
15
- publishOptions.push("--access", "restricted");
16
- }
17
- if (otp) {
18
- publishOptions.push("--otp", otp);
19
- }
20
- if (tag) {
21
- publishOptions.push("--tag", tag);
22
- }
23
- let nextVersion;
24
- const packagePath = `${process.cwd()}/package.json`;
25
- let packageJson;
26
- let packageName;
27
- let prevVersion;
28
- try {
29
- packageJson = getPackageJson(packagePath);
30
- packageName = packageJson.name;
31
- prevVersion = packageJson.version;
32
- } catch (error) {
33
- log(`
34
- ${cliName} Error: The file, ${packagePath}, was not found or is malformed.
35
- `, "error", quiet);
36
- log(error.message, "error");
37
- callback(1);
38
- return 1;
39
- }
40
- if (newVersion) {
41
- nextVersion = newVersion;
42
- } else if (bump) {
43
- const formatBump = bump.toString().trim().toLowerCase();
44
- if (formatBump) {
45
- const validReleases = ["major", "minor", "patch"];
46
- const validPreReleases = ["alpha", "beta", "rc"];
47
- const packageVersion = semver.coerce(prevVersion);
48
- if (!semver.valid(packageVersion)) {
49
- log(`
50
- ${cliName} Error: Version is invalid in package.json`, "error", quiet);
51
- callback(1);
52
- return 1;
53
- }
54
- if (validReleases.includes(formatBump)) {
55
- nextVersion = semver.inc(packageVersion, formatBump);
56
- } else if (validPreReleases.includes(formatBump)) {
57
- nextVersion = semver.inc(packageVersion, "prerelease", formatBump);
58
- } else {
59
- log(`
60
- ${cliName} Error: Bump type is invalid. please make sure it is one of the following: ${validReleases.join(", ")}, ${validPreReleases.join(", ")}`, "error", quiet);
61
- callback(1);
62
- return 1;
63
- }
64
- } else {
65
- log(`
66
- ${cliName} Error: Bump type is missing.`, "error", quiet);
67
- callback(1);
68
- return 1;
69
- }
70
- }
71
- if (nextVersion && packageManager === "yarn") {
72
- publishOptions.push("--new-version", nextVersion);
73
- } else if (nextVersion && packageJson) {
74
- try {
75
- setPackageJson({ ...packageJson, version: nextVersion }, packagePath);
76
- } catch (error) {
77
- log(`
78
- ${cliName} Error: The file, ${packagePath}, was not found or is malformed. ${error.message}`, "error", quiet);
79
- callback(1);
80
- return 1;
81
- }
82
- } else {
83
- nextVersion = prevVersion;
84
- }
85
- try {
86
- await execa(packageManager, publishOptions, {
87
- encoding: "utf8",
88
- stdio: "inherit"
89
- });
90
- spinner.succeed(`Successfully published npm package: ${packageName}!`);
91
- callback(0);
92
- return 0;
93
- } catch (error) {
94
- log(`
95
- ${cliName} Error: ${error.message}`, "error", quiet);
96
- spinner.fail("Publishing to npm has failed.");
97
- callback(1);
98
- return 1;
99
- }
100
- };
101
- export {
102
- publish
103
- };
104
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3B1Ymxpc2gvcHVibGlzaC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCBzZW12ZXIsIHtSZWxlYXNlVHlwZX0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIGdldFBhY2thZ2VKc29uLCBzZXRQYWNrYWdlSnNvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1Ymxpc2hPcHRpb25zIHtcbiAgcmVhZG9ubHkgYnVtcD86IHN0cmluZztcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbmV3VmVyc2lvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgb3RwPzogc3RyaW5nO1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpdmF0ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQdWJsaXNoQ2FsbGJhY2sgPSB0eXBlb2YgcHJvY2Vzcy5leGl0O1xuXG5leHBvcnQgY29uc3QgcHVibGlzaCA9IGFzeW5jIChjbWQ6IFB1Ymxpc2hPcHRpb25zLCBjYWxsYmFjazogUHVibGlzaENhbGxiYWNrID0gcHJvY2Vzcy5leGl0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge2J1bXAsIGNsaU5hbWUgPSAnTGV4JywgbmV3VmVyc2lvbiwgb3RwLCBwYWNrYWdlTWFuYWdlcjogY21kUGFja2FnZU1hbmFnZXIsIHByaXZhdGU6IGFjY2Vzc1ByaXZhdGUsIHRhZywgcXVpZXR9ID0gY21kO1xuICBsb2coYCR7Y2xpTmFtZX0gcHVibGlzaGluZyBucG0gbW9kdWxlLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgLy8gU3Bpbm5lclxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgLy8gR2V0IGN1c3RvbSBjb25maWd1cmF0aW9uXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtwYWNrYWdlTWFuYWdlcjogY29uZmlnUGFja2FnZU1hbmFnZXJ9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3QgcGFja2FnZU1hbmFnZXI6IHN0cmluZyA9IGNtZFBhY2thZ2VNYW5hZ2VyIHx8IGNvbmZpZ1BhY2thZ2VNYW5hZ2VyO1xuICBjb25zdCBwdWJsaXNoT3B0aW9uczogc3RyaW5nW10gPSBbJ3B1Ymxpc2gnXTtcblxuICBpZihhY2Nlc3NQcml2YXRlKSB7XG4gICAgcHVibGlzaE9wdGlvbnMucHVzaCgnLS1hY2Nlc3MnLCAncmVzdHJpY3RlZCcpO1xuICB9XG5cbiAgaWYob3RwKSB7XG4gICAgcHVibGlzaE9wdGlvbnMucHVzaCgnLS1vdHAnLCBvdHApO1xuICB9XG5cbiAgaWYodGFnKSB7XG4gICAgcHVibGlzaE9wdGlvbnMucHVzaCgnLS10YWcnLCB0YWcpO1xuICB9XG5cbiAgLy8gR2V0IG5leHQgdmVyc2lvbiBudW1iZXJcbiAgbGV0IG5leHRWZXJzaW9uOiBzdHJpbmc7XG4gIGNvbnN0IHBhY2thZ2VQYXRoOiBzdHJpbmcgPSBgJHtwcm9jZXNzLmN3ZCgpfS9wYWNrYWdlLmpzb25gO1xuICBsZXQgcGFja2FnZUpzb247XG4gIGxldCBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBsZXQgcHJldlZlcnNpb246IHN0cmluZztcblxuICAvLyBJZiBub3QgdXNpbmcgeWFybiwgd2UnbGwgdXNlIG5wbSBhbmQgbWFudWFsbHkgdXBkYXRlIHRoZSB2ZXJzaW9uIG51bWJlclxuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gZ2V0UGFja2FnZUpzb24ocGFja2FnZVBhdGgpO1xuICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZUpzb24ubmFtZTtcbiAgICBwcmV2VmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb247XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFRoZSBmaWxlLCAke3BhY2thZ2VQYXRofSwgd2FzIG5vdCBmb3VuZCBvciBpcyBtYWxmb3JtZWQuXFxuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZyhlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwYWNrYWdlLmpzb24gd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgaWYobmV3VmVyc2lvbikge1xuICAgIC8vIElmIHVzaW5nIGEgc3BlY2lmaWMgdmVyc2lvbiwgd2UgZG9uJ3QgbmVlZCB0byBkZXRlcm1pbmUgdGhlIG5leHQgYnVtcFxuICAgIG5leHRWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSBlbHNlIGlmKGJ1bXApIHtcbiAgICAvLyBEZXRlcm1pbmUgbmV4dCB2ZXJzaW9uXG4gICAgY29uc3QgZm9ybWF0QnVtcCA9IGJ1bXAudG9TdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZihmb3JtYXRCdW1wKSB7XG4gICAgICBjb25zdCB2YWxpZFJlbGVhc2VzOiBzdHJpbmdbXSA9IFsnbWFqb3InLCAnbWlub3InLCAncGF0Y2gnXTtcbiAgICAgIGNvbnN0IHZhbGlkUHJlUmVsZWFzZXM6IHN0cmluZ1tdID0gWydhbHBoYScsICdiZXRhJywgJ3JjJ107XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24gaXMgdmFsaWRcbiAgICAgIGNvbnN0IHBhY2thZ2VWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShwcmV2VmVyc2lvbik7XG5cbiAgICAgIGlmKCFzZW12ZXIudmFsaWQocGFja2FnZVZlcnNpb24pKSB7XG4gICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogVmVyc2lvbiBpcyBpbnZhbGlkIGluIHBhY2thZ2UuanNvbmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZih2YWxpZFJlbGVhc2VzLmluY2x1ZGVzKGZvcm1hdEJ1bXApKSB7XG4gICAgICAgIG5leHRWZXJzaW9uID0gc2VtdmVyLmluYyhwYWNrYWdlVmVyc2lvbiwgZm9ybWF0QnVtcCBhcyBSZWxlYXNlVHlwZSk7XG4gICAgICB9IGVsc2UgaWYodmFsaWRQcmVSZWxlYXNlcy5pbmNsdWRlcyhmb3JtYXRCdW1wKSkge1xuICAgICAgICBuZXh0VmVyc2lvbiA9IHNlbXZlci5pbmMocGFja2FnZVZlcnNpb24sICdwcmVyZWxlYXNlJywgZm9ybWF0QnVtcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEJ1bXAgdHlwZSBpcyBpbnZhbGlkLiBwbGVhc2UgbWFrZSBzdXJlIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3ZhbGlkUmVsZWFzZXMuam9pbignLCAnKX0sICR7dmFsaWRQcmVSZWxlYXNlcy5qb2luKCcsICcpfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEJ1bXAgdHlwZSBpcyBtaXNzaW5nLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYobmV4dFZlcnNpb24gJiYgcGFja2FnZU1hbmFnZXIgPT09ICd5YXJuJykge1xuICAgIHB1Ymxpc2hPcHRpb25zLnB1c2goJy0tbmV3LXZlcnNpb24nLCBuZXh0VmVyc2lvbik7XG4gIH0gZWxzZSBpZihuZXh0VmVyc2lvbiAmJiBwYWNrYWdlSnNvbikge1xuICAgIHRyeSB7XG4gICAgICAvLyBTYXZlIHVwZGF0ZWQgdmVyc2lvblxuICAgICAgc2V0UGFja2FnZUpzb24oey4uLnBhY2thZ2VKc29uLCB2ZXJzaW9uOiBuZXh0VmVyc2lvbn0sIHBhY2thZ2VQYXRoKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFRoZSBmaWxlLCAke3BhY2thZ2VQYXRofSwgd2FzIG5vdCBmb3VuZCBvciBpcyBtYWxmb3JtZWQuICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0VmVyc2lvbiA9IHByZXZWZXJzaW9uO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjYShwYWNrYWdlTWFuYWdlciwgcHVibGlzaE9wdGlvbnMsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnXG4gICAgfSk7XG5cbiAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQgbnBtIHBhY2thZ2U6ICR7cGFja2FnZU5hbWV9IWApO1xuXG4gICAgLy8gS2lsbCBwcm9jZXNzXG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAvLyBEaXNwbGF5IGVycm9yIG1lc3NhZ2VcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAvLyBTdG9wIHNwaW5uZXJcbiAgICBzcGlubmVyLmZhaWwoJ1B1Ymxpc2hpbmcgdG8gbnBtIGhhcyBmYWlsZWQuJyk7XG5cbiAgICAvLyBLaWxsIHByb2Nlc3NcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxTQUFRLGFBQVk7QUFDcEIsT0FBTyxZQUEyQjtBQUVsQyxTQUFRLGlCQUFnQjtBQUN4QixTQUFRLGVBQWUsZ0JBQWdCLHNCQUFxQjtBQUM1RCxTQUFRLFdBQVU7QUFlWCxNQUFNLFVBQVUsT0FBTyxLQUFxQixXQUE0QixRQUFRLFNBQTBCO0FBQy9HLFFBQU0sRUFBQyxNQUFNLFVBQVUsT0FBTyxZQUFZLEtBQUssZ0JBQWdCLG1CQUFtQixTQUFTLGVBQWUsS0FBSyxNQUFLLElBQUk7QUFDeEgsTUFBSSxHQUFHLE9BQU8sNkJBQTZCLFFBQVEsS0FBSztBQUd4RCxRQUFNLFVBQVUsY0FBYyxLQUFLO0FBR25DLFFBQU0sVUFBVSxZQUFZLEdBQUc7QUFFL0IsUUFBTSxFQUFDLGdCQUFnQixxQkFBb0IsSUFBSSxVQUFVO0FBQ3pELFFBQU0saUJBQXlCLHFCQUFxQjtBQUNwRCxRQUFNLGlCQUEyQixDQUFDLFNBQVM7QUFFM0MsTUFBRyxlQUFlO0FBQ2hCLG1CQUFlLEtBQUssWUFBWSxZQUFZO0FBQUEsRUFDOUM7QUFFQSxNQUFHLEtBQUs7QUFDTixtQkFBZSxLQUFLLFNBQVMsR0FBRztBQUFBLEVBQ2xDO0FBRUEsTUFBRyxLQUFLO0FBQ04sbUJBQWUsS0FBSyxTQUFTLEdBQUc7QUFBQSxFQUNsQztBQUdBLE1BQUk7QUFDSixRQUFNLGNBQXNCLEdBQUcsUUFBUSxJQUFJLENBQUM7QUFDNUMsTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBR0osTUFBSTtBQUNGLGtCQUFjLGVB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
@@ -1,249 +0,0 @@
1
- import chalk from "chalk";
2
- import { execa } from "execa";
3
- import { existsSync } from "fs";
4
- import { sync as globSync } from "glob";
5
- import { resolve as pathResolve } from "path";
6
- import { LexConfig } from "../../LexConfig.js";
7
- import { createSpinner } from "../../utils/app.js";
8
- import { findTailwindCssPath, resolveBinaryPath } from "../../utils/file.js";
9
- import { log } from "../../utils/log.js";
10
- const findStoryFiles = () => {
11
- const storyPatterns = [
12
- "**/*.stories.{ts,tsx,js,jsx}",
13
- "**/*.story.{ts,tsx,js,jsx}",
14
- "**/stories/**/*.{ts,tsx,js,jsx}"
15
- ];
16
- const storyFiles = [];
17
- storyPatterns.forEach((pattern) => {
18
- const files = globSync(pattern, {
19
- cwd: process.cwd(),
20
- ignore: ["**/node_modules/**", "**/dist/**", "**/build/**"]
21
- });
22
- storyFiles.push(...files);
23
- });
24
- return storyFiles;
25
- };
26
- const checkStorybookInitialization = () => {
27
- const projectConfigDir = pathResolve(process.cwd(), ".storybook");
28
- const lexConfigDir = pathResolve(LexConfig.getLexDir(), ".storybook");
29
- return existsSync(projectConfigDir) || existsSync(lexConfigDir);
30
- };
31
- const extractProgressPercentage = (output) => {
32
- const lines = output.split("\n");
33
- for (const line of lines) {
34
- if (line.includes("[webpack.Progress]") && line.includes("%")) {
35
- const percentageMatch = line.match(/(\d+)%/);
36
- if (percentageMatch) {
37
- return parseInt(percentageMatch[1]);
38
- }
39
- }
40
- }
41
- return null;
42
- };
43
- const filterAndBeautifyOutput = (output, isVerbose) => {
44
- if (isVerbose) {
45
- return output;
46
- }
47
- const lines = output.split("\n");
48
- const filteredLines = lines.filter((line) => {
49
- if (line.includes("[webpack.Progress]")) {
50
- return false;
51
- }
52
- if (line.includes("Storybook") || line.includes("Local:") || line.includes("http://localhost") || line.includes("info =>") || line.includes("Starting") || line.includes("ready") || line.includes("error") || line.includes("warning")) {
53
- return true;
54
- }
55
- return true;
56
- });
57
- return filteredLines.join("\n");
58
- };
59
- const beautifyOutput = (output) => output.replace(/Storybook v[\d.]+/g, chalk.cyan("$&")).replace(/info =>/g, chalk.blue("info =>")).replace(/Local:/g, chalk.green("Local:")).replace(/On your network:/g, chalk.green("On your network:")).replace(/Storybook.*started/g, chalk.green("$&")).replace(/Storybook.*ready/g, chalk.green("$&")).replace(/error/g, chalk.red("$&")).replace(/warning/g, chalk.yellow("$&")).replace(/(\d+)%/g, chalk.magenta("$1%"));
60
- const storybook = async (cmd, callback = () => ({})) => {
61
- const { cliName = "Lex", config, open = false, port = 6007, quiet, static: staticBuild = false, useLexConfig = false, variables, verbose = false } = cmd;
62
- const spinner = createSpinner(quiet);
63
- log(chalk.cyan(`${cliName} starting Storybook...`), "info", quiet);
64
- await LexConfig.parseConfig(cmd);
65
- let variablesObj = { NODE_ENV: "development" };
66
- if (variables) {
67
- try {
68
- variablesObj = JSON.parse(variables);
69
- } catch (_error) {
70
- log(`
71
- ${cliName} Error: Environment variables option is not a valid JSON object.`, "error", quiet);
72
- callback(1);
73
- return 1;
74
- }
75
- }
76
- process.env = { ...process.env, ...variablesObj };
77
- spinner.start("Finding story files...");
78
- const storyFiles = findStoryFiles();
79
- if (storyFiles.length === 0) {
80
- spinner.fail("No story files found in the project.");
81
- log("Please create story files with .stories.ts/.stories.js extensions or in a stories/ directory.", "info", quiet);
82
- callback(1);
83
- return 1;
84
- }
85
- spinner.succeed(`Found ${storyFiles.length} story file(s)`);
86
- const tailwindCssPath = findTailwindCssPath();
87
- console.log({ tailwindCssPath });
88
- if (tailwindCssPath) {
89
- if (!quiet) {
90
- log(chalk.green(`\u2713 Tailwind CSS integration detected: ${tailwindCssPath}`), "info", quiet);
91
- }
92
- } else {
93
- if (!quiet) {
94
- log(chalk.yellow("\u26A0 No Tailwind CSS file found in project"), "info", quiet);
95
- log(chalk.gray("Create a tailwind.css file with @tailwind directives for full Tailwind support"), "info", quiet);
96
- }
97
- }
98
- if (!checkStorybookInitialization()) {
99
- spinner.fail("Storybook is not initialized in this project or in Lex.");
100
- log('Please run "npx storybook@latest init" to set up Storybook in your project, or ensure Lex has a valid .storybook configuration.', "info", quiet);
101
- callback(1);
102
- return 1;
103
- }
104
- const projectConfigDir = pathResolve(process.cwd(), ".storybook");
105
- const lexConfigDir = pathResolve(LexConfig.getLexDir(), ".storybook");
106
- let configDir = config;
107
- if (!configDir) {
108
- configDir = lexConfigDir;
109
- if (!useLexConfig && existsSync(projectConfigDir)) {
110
- configDir = projectConfigDir;
111
- }
112
- }
113
- if (!quiet) {
114
- log(chalk.gray(`Project config dir: ${projectConfigDir} (exists: ${existsSync(projectConfigDir)})`), "info", quiet);
115
- log(chalk.gray(`Lex config dir: ${lexConfigDir} (exists: ${existsSync(lexConfigDir)})`), "info", quiet);
116
- if (useLexConfig) {
117
- log(chalk.blue("Using Lex Storybook configuration (--use-lex-config flag)"), "info", quiet);
118
- }
119
- log(chalk.gray(`Initial config dir: ${configDir}`), "info", quiet);
120
- }
121
- if (configDir === lexConfigDir) {
122
- if (!quiet) {
123
- log(chalk.blue("Using Lex config, will create temporary config in project .storybook directory"), "info", quiet);
124
- }
125
- const projectStorybookDir = pathResolve(process.cwd(), ".storybook");
126
- const fs = await import("fs/promises");
127
- await fs.mkdir(projectStorybookDir, { recursive: true });
128
- const lexMainPath = pathResolve(lexConfigDir, "main.ts");
129
- const projectMainPath = pathResolve(projectStorybookDir, "main.ts");
130
- let mainContent = await fs.readFile(lexMainPath, "utf8");
131
- mainContent = mainContent.replace(
132
- /stories:\s*\[.*?\]/,
133
- `stories: ['${pathResolve(process.cwd(), "src/**/*.stories.@(ts|tsx)")}', '${pathResolve(process.cwd(), "src/**/*.mdx")}']`
134
- );
135
- const lexNodeModules = pathResolve(LexConfig.getLexDir(), "node_modules");
136
- mainContent = mainContent.replace(
137
- /const lexModule = \(modulePath: string\) => resolve\(getLexNodeModulesPath\(\), modulePath\);/,
138
- `const lexModule = (modulePath: string) => resolve('${lexNodeModules}', modulePath);`
139
- );
140
- await fs.writeFile(projectMainPath, mainContent);
141
- const lexPreviewPath = pathResolve(lexConfigDir, "preview.tsx");
142
- if (existsSync(lexPreviewPath)) {
143
- const previewContent = await fs.readFile(lexPreviewPath, "utf8");
144
- await fs.writeFile(pathResolve(projectStorybookDir, "preview.tsx"), previewContent);
145
- }
146
- configDir = projectStorybookDir;
147
- }
148
- if (!existsSync(configDir)) {
149
- spinner.fail("Storybook configuration not found.");
150
- log(`Project config: ${projectConfigDir}`, "info", quiet);
151
- log(`Lex config: ${lexConfigDir}`, "info", quiet);
152
- log('Please run "npx storybook@latest init" to set up Storybook in your project, or ensure Lex has a valid .storybook configuration.', "info", quiet);
153
- callback(1);
154
- return 1;
155
- }
156
- const storybookPath = resolveBinaryPath("storybook");
157
- if (!storybookPath) {
158
- log(`
159
- ${cliName} Error: storybook binary not found in Lex's node_modules or monorepo root`, "error", quiet);
160
- log("Please reinstall Lex or check your Storybook installation.", "info", quiet);
161
- callback(1);
162
- return 1;
163
- }
164
- const storybookArgs = [staticBuild ? "build" : "dev"];
165
- storybookArgs.push("--config-dir", configDir);
166
- if (port) {
167
- storybookArgs.push("--port", port.toString());
168
- }
169
- if (open) {
170
- storybookArgs.push("--open");
171
- }
172
- if (staticBuild) {
173
- const outputDir = pathResolve(process.cwd(), "storybook-static");
174
- storybookArgs.push("--output-dir", outputDir);
175
- }
176
- if (!quiet) {
177
- log(chalk.gray(`Config directory: ${configDir}`), "info", quiet);
178
- }
179
- process.env.TAILWIND_CSS_PATH = tailwindCssPath;
180
- try {
181
- spinner.start(staticBuild ? "Building static Storybook..." : "Starting Storybook development server...");
182
- const storybookProcess = execa(storybookPath, storybookArgs, {
183
- encoding: "utf8",
184
- env: {
185
- ...process.env,
186
- LEX_QUIET: quiet,
187
- LEX_VERBOSE: verbose,
188
- STORYBOOK_OPEN: open,
189
- ...tailwindCssPath && { TAILWIND_CSS_PATH: tailwindCssPath }
190
- },
191
- stdio: "pipe"
192
- });
193
- let urlFound = false;
194
- let lastProgressPercentage = 0;
195
- storybookProcess.stdout?.on("data", (data) => {
196
- const output = data.toString();
197
- const progressPercentage = extractProgressPercentage(output);
198
- if (progressPercentage !== null && progressPercentage !== lastProgressPercentage) {
199
- lastProgressPercentage = progressPercentage;
200
- const action = staticBuild ? "Building" : "Starting";
201
- spinner.text = `${action} Storybook... ${progressPercentage}%`;
202
- process.stdout.write(`
203
- Webpack Progress: ${chalk.magenta(`${progressPercentage}%`)}
204
- `);
205
- }
206
- const filteredOutput = filterAndBeautifyOutput(output, verbose);
207
- const beautifiedOutput = beautifyOutput(filteredOutput);
208
- if (!urlFound && (output.includes("Local:") || output.includes("http://localhost") || output.includes("Storybook"))) {
209
- spinner.succeed(chalk.green("Storybook development server is ready!"));
210
- urlFound = true;
211
- }
212
- if (filteredOutput.trim()) {
213
- process.stdout.write(beautifiedOutput);
214
- }
215
- });
216
- storybookProcess.stderr?.on("data", (data) => {
217
- const output = data.toString();
218
- const filteredOutput = filterAndBeautifyOutput(output, verbose);
219
- const beautifiedOutput = beautifyOutput(filteredOutput);
220
- if (filteredOutput.trim()) {
221
- process.stderr.write(beautifiedOutput);
222
- }
223
- });
224
- try {
225
- await storybookProcess;
226
- if (!urlFound) {
227
- spinner.succeed(chalk.green("Storybook development server started."));
228
- }
229
- callback(0);
230
- return 0;
231
- } catch (error) {
232
- spinner.fail(chalk.red("There was an error while running storybook."));
233
- log(`
234
- ${cliName} Error: ${error.message}`, "error", quiet);
235
- callback(1);
236
- return 1;
237
- }
238
- } catch (error) {
239
- log(`
240
- ${cliName} Error: ${error.message}`, "error", quiet);
241
- spinner.fail("There was an error while running storybook.");
242
- callback(1);
243
- return 1;
244
- }
245
- };
246
- export {
247
- storybook
248
- };
249
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3N0b3J5Ym9vay9zdG9yeWJvb2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7ZmluZFRhaWx3aW5kQ3NzUGF0aCwgcmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Rvcnlib29rT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgb3Blbj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RhdGljPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNlTGV4Q29uZmlnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgU3Rvcnlib29rQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmNvbnN0IGZpbmRTdG9yeUZpbGVzID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc3RvcnlQYXR0ZXJucyA9IFtcbiAgICAnKiovKi5zdG9yaWVzLnt0cyx0c3gsanMsanN4fScsXG4gICAgJyoqLyouc3Rvcnkue3RzLHRzeCxqcyxqc3h9JyxcbiAgICAnKiovc3Rvcmllcy8qKi8qLnt0cyx0c3gsanMsanN4fSdcbiAgXTtcblxuICBjb25zdCBzdG9yeUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHN0b3J5UGF0dGVybnMuZm9yRWFjaCgocGF0dGVybikgPT4ge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2J1aWxkLyoqJ11cbiAgICB9KTtcbiAgICBzdG9yeUZpbGVzLnB1c2goLi4uZmlsZXMpO1xuICB9KTtcblxuICByZXR1cm4gc3RvcnlGaWxlcztcbn07XG5cbmNvbnN0IGNoZWNrU3Rvcnlib29rSW5pdGlhbGl6YXRpb24gPSAoKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHByb2plY3RDb25maWdEaXIgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLnN0b3J5Ym9vaycpO1xuICBjb25zdCBsZXhDb25maWdEaXIgPSBwYXRoUmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICcuc3Rvcnlib29rJyk7XG5cbiAgcmV0dXJuIGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ0RpcikgfHwgZXhpc3RzU3luYyhsZXhDb25maWdEaXIpO1xufTtcblxuY29uc3QgZXh0cmFjdFByb2dyZXNzUGVyY2VudGFnZSA9IChvdXRwdXQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwgPT4ge1xuICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJyk7XG4gIGZvcihjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYobGluZS5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykgJiYgbGluZS5pbmNsdWRlcygnJScpKSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlTWF0Y2ggPSBsaW5lLm1hdGNoKC8oXFxkKyklLyk7XG4gICAgICBpZihwZXJjZW50YWdlTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBlcmNlbnRhZ2VNYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmlsdGVyQW5kQmVhdXRpZnlPdXRwdXQgPSAob3V0cHV0OiBzdHJpbmcsIGlzVmVyYm9zZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmKGlzVmVyYm9zZSkge1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGZpbHRlcmVkTGluZXMgPSBsaW5lcy5maWx0ZXIoKGxpbmUpID0+IHtcbiAgICBpZihsaW5lLmluY2x1ZGVzKCdbd2VicGFjay5Qcm9ncmVzc10nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKGxpbmUuaW5jbHVkZXMoJ1N0b3J5Ym9vaycpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdMb2NhbDonKSB8fFxuICAgICAgbGluZS5pbmNsdWRlcygnaHR0cDovL2xvY2FsaG9zdCcpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdpbmZvID0+JykgfHxcbiAgICAgIGxpbmUuaW5jbHVkZXMoJ1N0YXJ0aW5nJykgfHxcbiAgICAgIGxpbmUuaW5jbHVkZXMoJ3JlYWR5JykgfHxcbiAgICAgIGxpbmUuaW5jbHVkZXMoJ2Vycm9yJykgfHxcbiAgICAgIGxpbmUuaW5jbHVkZXMoJ3dhcm5pbmcnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBmaWx0ZXJlZExpbmVzLmpvaW4oJ1xcbicpO1xufTtcblxuY29uc3QgYmVhdXRpZnlPdXRwdXQgPSAob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcgPT4gb3V0cHV0XG4gIC5yZXBsYWNlKC9TdG9yeWJvb2sgdltcXGQuXSsvZywgY2hhbGsuY3lhbignJCYnKSlcbiAgLnJlcGxhY2UoL2luZm8gPT4vZywgY2hhbGsuYmx1ZSgnaW5mbyA9PicpKVxuICAucmVwbGFjZSgvTG9jYWw6L2csIGNoYWxrLmdyZWVuKCdMb2NhbDonKSlcbiAgLnJlcGxhY2UoL09uIHlvdXIgbmV0d29yazovZywgY2hhbGsuZ3JlZW4oJ09uIHlvdXIgbmV0d29yazonKSlcbiAgLnJlcGxhY2UoL1N0b3J5Ym9vay4qc3RhcnRlZC9nLCBjaGFsay5ncmVlbignJCYnKSlcbiAgLnJlcGxhY2UoL1N0b3J5Ym9vay4qcmVhZHkvZywgY2hhbGsuZ3JlZW4oJyQmJykpXG4gIC5yZXBsYWNlKC9lcnJvci9nLCBjaGFsay5yZWQoJyQmJykpXG4gIC5yZXBsYWNlKC93YXJuaW5nL2csIGNoYWxrLnllbGxvdygnJCYnKSlcbiAgLnJlcGxhY2UoLyhcXGQrKSUvZywgY2hhbGsubWFnZW50YSgnJDElJykpO1xuXG5leHBvcnQgY29uc3Qgc3Rvcnlib29rID0gYXN5bmMgKGNtZDogU3Rvcnlib29rT3B0aW9ucywgY2FsbGJhY2s6IFN0b3J5Ym9va0NhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIGNvbmZpZywgb3BlbiA9IGZhbHNlLCBwb3J0ID0gNjAwNywgcXVpZXQsIHN0YXRpYzogc3RhdGljQnVpbGQgPSBmYWxzZSwgdXNlTGV4Q29uZmlnID0gZmFsc2UsIHZhcmlhYmxlcywgdmVyYm9zZSA9IGZhbHNlfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGNoYWxrLmN5YW4oYCR7Y2xpTmFtZX0gc3RhcnRpbmcgU3Rvcnlib29rLi4uYCksICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGxldCB2YXJpYWJsZXNPYmo6IG9iamVjdCA9IHtOT0RFX0VOVjogJ2RldmVsb3BtZW50J307XG5cbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhcmlhYmxlc09iaiA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgc3Bpbm5lci5zdGFydCgnRmluZGluZyBzdG9yeSBmaWxlcy4uLicpO1xuICBjb25zdCBzdG9yeUZpbGVzID0gZmluZFN0b3J5RmlsZXMoKTtcblxuICBpZihzdG9yeUZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHNwaW5uZXIuZmFpbCgnTm8gc3RvcnkgZmlsZXMgZm91bmQgaW4gdGhlIHByb2plY3QuJyk7XG4gICAgbG9nKCdQbGVhc2UgY3JlYXRlIHN0b3J5IGZpbGVzIHdpdGggLnN0b3JpZXMudHMvLnN0b3JpZXMuanMgZXh0ZW5zaW9ucyBvciBpbiBhIHN0b3JpZXMvIGRpcmVjdG9yeS4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHNwaW5uZXIuc3VjY2VlZChgRm91bmQgJHtzdG9yeUZpbGVzLmxlbmd0aH0gc3RvcnkgZmlsZShzKWApO1xuXG4gIGNvbnN0IHRhaWx3aW5kQ3NzUGF0aCA9IGZpbmRUYWlsd2luZENzc1BhdGgoKTtcblxuICBjb25zb2xlLmxvZyh7dGFpbHdpbmRDc3NQYXRofSk7XG4gIGlmKHRhaWx3aW5kQ3NzUGF0aCkge1xuICAgIGlmKCFxdWlldCkge1xuICAgICAgbG9nKGNoYWxrLmdyZWVuKGBcdTI3MTMgVGFpbHdpbmQgQ1NTIGludGVncmF0aW9uIGRldGVjdGVkOiAke3RhaWx3aW5kQ3NzUGF0aH1gKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmKCFxdWlldCkge1xuICAgICAgbG9nKGNoYWxrLnllbGxvdygnXHUyNkEwIE5vIFRhaWx3aW5kIENTUyBmaWxlIGZvdW5kIGluIHByb2plY3QnKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coY2hhbGsuZ3JheSgnQ3JlYXRlIGEgdGFpbHdpbmQuY3NzIGZpbGUgd2l0aCBAdGFpbHdpbmQgZGlyZWN0aXZlcyBmb3IgZnVsbCBUYWlsd2luZCBzdXBwb3J0JyksICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfVxuXG4gIGlmKCFjaGVja1N0b3J5Ym9va0luaXRpYWxpemF0aW9uKCkpIHtcbiAgICBzcGlubmVyLmZhaWwoJ1N0b3J5Ym9vayBpcyBub3QgaW5pdGlhbGl6ZWQgaW4gdGhpcyBwcm9qZWN0IG9yIGluIExleC4nKTtcbiAgICBsb2coJ1BsZWFzZSBydW4gXCJucHggc3Rvcnlib29rQGxhdGVzdCBpbml0XCIgdG8gc2V0IHVwIFN0b3J5Ym9vayBpbiB5b3VyIHByb2plY3QsIG9yIGVuc3VyZSBMZXggaGFzIGEgdmFsaWQgLnN0b3J5Ym9vayBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdENvbmZpZ0RpciA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuc3Rvcnlib29rJyk7XG4gIGNvbnN0IGxleENvbmZpZ0RpciA9IHBhdGhSZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJy5zdG9yeWJvb2snKTtcblxuICBsZXQgY29uZmlnRGlyID0gY29uZmlnO1xuICBpZighY29uZmlnRGlyKSB7XG4gICAgY29uZmlnRGlyID0gbGV4Q29uZmlnRGlyO1xuICAgIGlmKCF1c2VMZXhDb25maWcgJiYgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnRGlyKSkge1xuICAgICAgY29uZmlnRGlyID0gcHJvamVjdENvbmZpZ0RpcjtcbiAgICB9XG4gIH1cblxuICBpZighcXVpZXQpIHtcbiAgICBsb2coY2hhbGsuZ3JheShgUHJvamVjdCBjb25maWcgZGlyOiAke3Byb2plY3RDb25maWdEaXJ9IChleGlzdHM6ICR7ZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnRGlyKX0pYCksICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhjaGFsay5ncmF5KGBMZXggY29uZmlnIGRpcjogJHtsZXhDb25maWdEaXJ9IChleGlzdHM6ICR7ZXhpc3RzU3luYyhsZXhDb25maWdEaXIpfSlgKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgaWYodXNlTGV4Q29uZmlnKSB7XG4gICAgICBsb2coY2hhbGsuYmx1ZSgnVXNpbmcgTGV4IFN0b3J5Ym9vayBjb25maWd1cmF0aW9uICgtLXVzZS1sZXgtY29uZmlnIGZsYWcpJyksICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgICBsb2coY2hhbGsuZ3JheShgSW5pdGlhbCBjb25maWcgZGlyOiAke2NvbmZpZ0Rpcn1gKSwgJ2luZm8nLCBxdWlldCk7XG4gIH1cblxuICBpZihjb25maWdEaXIgPT09IGxleENvbmZpZ0Rpcikge1xuICAgIGlmKCFxdWlldCkge1xuICAgICAgbG9nKGNoYWxrLmJsdWUoJ1VzaW5nIExleCBjb25maWcsIHdpbGwgY3JlYXRlIHRlbXBvcmFyeSBjb25maWcgaW4gcHJvamVjdCAuc3Rvcnlib29rIGRpcmVjdG9yeScpLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgY29uc3QgcHJvamVjdFN0b3J5Ym9va0RpciA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuc3Rvcnlib29rJyk7XG5cbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydCgnZnMvcHJvbWlzZXMnKTtcbiAgICBhd2FpdCBmcy5ta2Rpcihwcm9qZWN0U3Rvcnlib29rRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG5cbiAgICBjb25zdCBsZXhNYWluUGF0aCA9IHBhdGhSZXNvbHZlKGxleENvbmZpZ0RpciwgJ21haW4udHMnKTtcbiAgICBjb25zdCBwcm9qZWN0TWFpblBhdGggPSBwYXRoUmVzb2x2ZShwcm9qZWN0U3Rvcnlib29rRGlyLCAnbWFpbi50cycpO1xuICAgIGxldCBtYWluQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGxleE1haW5QYXRoLCAndXRmOCcpO1xuXG4gICAgbWFpbkNvbnRlbnQgPSBtYWluQ29udGVudC5yZXBsYWNlKFxuICAgICAgL3N0b3JpZXM6XFxzKlxcWy4qP1xcXS8sXG4gICAgICBgc3RvcmllczogWycke3BhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdzcmMvKiovKi5zdG9yaWVzLkAodHN8dHN4KScpfScsICcke3BhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdzcmMvKiovKi5tZHgnKX0nXWBcbiAgICApO1xuXG4gICAgY29uc3QgbGV4Tm9kZU1vZHVsZXMgPSBwYXRoUmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMnKTtcbiAgICBtYWluQ29udGVudCA9IG1haW5Db250ZW50LnJlcGxhY2UoXG4gICAgICAvY29uc3QgbGV4TW9kdWxlID0gXFwobW9kdWxlUGF0aDogc3RyaW5nXFwpID0+IHJlc29sdmVcXChnZXRMZXhOb2RlTW9kdWxlc1BhdGhcXChcXCksIG1vZHVsZVBhdGhcXCk7LyxcbiAgICAgIGBjb25zdCBsZXhNb2R1bGUgPSAobW9kdWxlUGF0aDogc3RyaW5nKSA9PiByZXNvbHZlKCcke2xleE5vZGVNb2R1bGVzfScsIG1vZHVsZVBhdGgpO2BcbiAgICApO1xuXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHByb2plY3RNYWluUGF0aCwgbWFpbkNvbnRlbnQpO1xuXG4gICAgY29uc3QgbGV4UHJldmlld1BhdGggPSBwYXRoUmVzb2x2ZShsZXhDb25maWdEaXIsICdwcmV2aWV3LnRzeCcpO1xuICAgIGlmKGV4aXN0c1N5bmMobGV4UHJldmlld1BhdGgpKSB7XG4gICAgICBjb25zdCBwcmV2aWV3Q29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGxleFByZXZpZXdQYXRoLCAndXRmOCcpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGhSZXNvbHZlKHByb2plY3RTdG9yeWJvb2tEaXIsICdwcmV2aWV3LnRzeCcpLCBwcmV2aWV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uZmlnRGlyID0gcHJvamVjdFN0b3J5Ym9va0RpcjtcbiAgfVxuICBpZighZXhpc3RzU3luYyhjb25maWdEaXIpKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdTdG9yeWJvb2sgY29uZmlndXJhdGlvbiBub3QgZm91bmQuJyk7XG4gICAgbG9nKGBQcm9qZWN0IGNvbmZpZzogJHtwcm9qZWN0Q29uZmlnRGlyfWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgTGV4IGNvbmZpZzogJHtsZXhDb25maWdEaXJ9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgbG9nKCdQbGVhc2UgcnVuIFwibnB4IHN0b3J5Ym9va0BsYXRlc3QgaW5pdFwiIHRvIHNldCB1cCBTdG9yeWJvb2sgaW4geW91ciBwcm9qZWN0LCBvciBlbnN1cmUgTGV4IGhhcyBhIHZhbGlkIC5zdG9yeWJvb2sgY29uZmlndXJhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHN0b3J5Ym9va1BhdGggPSByZXNvbHZlQmluYXJ5UGF0aCgnc3Rvcnlib29rJyk7XG5cbiAgaWYoIXN0b3J5Ym9va1BhdGgpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IHN0b3J5Ym9vayBiaW5hcnkgbm90IGZvdW5kIGluIExleCdzIG5vZGVfbW9kdWxlcyBvciBtb25vcmVwbyByb290YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBTdG9yeWJvb2sgaW5zdGFsbGF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3Qgc3Rvcnlib29rQXJncyA9IFtzdGF0aWNCdWlsZCA/ICdidWlsZCcgOiAnZGV2J107XG4gIHN0b3J5Ym9va0FyZ3MucHVzaCgnLS1jb25maWctZGlyJywgY29uZmlnRGlyKTtcblxuICBpZihwb3J0KSB7XG4gICAgc3Rvcnlib29rQXJncy5wdXNoKCctLXBvcnQnLCBwb3J0LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgaWYob3Blbikge1xuICAgIHN0b3J5Ym9va0FyZ3MucHVzaCgnLS1vcGVuJyk7XG4gIH1cblxuICBpZihzdGF0aWNCdWlsZCkge1xuICAgIGNvbnN0IG91dHB1dERpciA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdzdG9yeWJvb2stc3RhdGljJyk7XG4gICAgc3Rvcnlib29rQXJncy5wdXNoKCctLW91dHB1dC1kaXInLCBvdXRwdXREaXIpO1xuICB9XG5cbiAgaWYoIXF1aWV0KSB7XG4gICAgbG9nKGNoYWxrLmdyYXkoYENvbmZpZyBkaXJlY3Rvcnk6ICR7Y29uZmlnRGlyfWApLCAnaW5mbycsIHF1aWV0KTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LlRBSUxXSU5EX0NTU19QQVRIID0gdGFpbHdpbmRDc3NQYXRoO1xuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydChzdGF0aWNCdWlsZCA/ICdCdWlsZGluZyBzdGF0aWMgU3Rvcnlib29rLi4uJyA6ICdTdGFydGluZyBTdG9yeWJvb2sgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBzdG9yeWJvb2tQcm9jZXNzID0gZXhlY2Eoc3Rvcnlib29rUGF0aCBhcyBhbnksIHN0b3J5Ym9va0FyZ3MsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIExFWF9RVUlFVDogcXVpZXQsXG4gICAgICAgIExFWF9WRVJCT1NFOiB2ZXJib3NlLFxuICAgICAgICBTVE9SWUJPT0tfT1BFTjogb3BlbixcbiAgICAgICAgLi4uKHRhaWx3aW5kQ3NzUGF0aCAmJiB7VEFJTFdJTkRfQ1NTX1BBVEg6IHRhaWx3aW5kQ3NzUGF0aH0pXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHN0ZGlvOiAncGlwZSdcbiAgICB9KTtcblxuICAgIGxldCB1cmxGb3VuZCA9IGZhbHNlO1xuICAgIGxldCBsYXN0UHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcblxuICAgIHN0b3J5Ym9va1Byb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwcm9ncmVzc1BlcmNlbnRhZ2UgPSBleHRyYWN0UHJvZ3Jlc3NQZXJjZW50YWdlKG91dHB1dCk7XG5cbiAgICAgIGlmKHByb2dyZXNzUGVyY2VudGFnZSAhPT0gbnVsbCAmJiBwcm9ncmVzc1BlcmNlbnRhZ2UgIT09IGxhc3RQcm9ncmVzc1BlcmNlbnRhZ2UpIHtcbiAgICAgICAgbGFzdFByb2dyZXNzUGVyY2VudGFnZSA9IHByb2dyZXNzUGVyY2VudGFnZTtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gc3RhdGljQnVpbGQgPyAnQnVpbGRpbmcnIDogJ1N0YXJ0aW5nJztcbiAgICAgICAgKHNwaW5uZXIgYXMgYW55KS50ZXh0ID0gYCR7YWN0aW9ufSBTdG9yeWJvb2suLi4gJHtwcm9ncmVzc1BlcmNlbnRhZ2V9JWA7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBcXG5XZWJwYWNrIFByb2dyZXNzOiAke2NoYWxrLm1hZ2VudGEoYCR7cHJvZ3Jlc3NQZXJjZW50YWdlfSVgKX1cXG5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXQgPSBmaWx0ZXJBbmRCZWF1dGlmeU91dHB1dChvdXRwdXQsIHZlcmJvc2UpO1xuICAgICAgY29uc3QgYmVhdXRpZmllZE91dHB1dCA9IGJlYXV0aWZ5T3V0cHV0KGZpbHRlcmVkT3V0cHV0KTtcblxuICAgICAgaWYoIXVybEZvdW5kICYmIChvdXRwdXQuaW5jbHVkZXMoJ0xvY2FsOicpIHx8IG91dHB1dC5pbmNsdWRlcygnaHR0cDovL2xvY2FsaG9zdCcpIHx8IG91dHB1dC5pbmNsdWRlcygnU3Rvcnlib29rJykpKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChjaGFsay5ncmVlbignU3Rvcnlib29rIGRldmVsb3BtZW50IHNlcnZlciBpcyByZWFkeSEnKSk7XG4gICAgICAgIHVybEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYoZmlsdGVyZWRPdXRwdXQudHJpbSgpKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGJlYXV0aWZpZWRPdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3Rvcnlib29rUHJvY2Vzcy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0ID0gZmlsdGVyQW5kQmVhdXRpZnlPdXRwdXQob3V0cHV0LCB2ZXJib3NlKTtcbiAgICAgIGNvbnN0IGJlYXV0aWZpZWRPdXRwdXQgPSBiZWF1dGlmeU91dHB1dChmaWx0ZXJlZE91dHB1dCk7XG5cbiAgICAgIGlmKGZpbHRlcmVkT3V0cHV0LnRyaW0oKSkge1xuICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShiZWF1dGlmaWVkT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdG9yeWJvb2tQcm9jZXNzO1xuICAgICAgaWYoIXVybEZvdW5kKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChjaGFsay5ncmVlbignU3Rvcnlib29rIGRldmVsb3BtZW50IHNlcnZlciBzdGFydGVkLicpKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKDApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKGNoYWxrLnJlZCgnVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJ1bm5pbmcgc3Rvcnlib29rLicpKTtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHNwaW5uZXIuZmFpbCgnVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJ1bm5pbmcgc3Rvcnlib29rLicpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLE9BQU8sV0FBVztBQUNsQixTQUFRLGFBQVk7QUFDcEIsU0FBUSxrQkFBaUI7QUFDekIsU0FBUSxRQUFRLGdCQUFlO0FBQy9CLFNBQVEsV0FBVyxtQkFBa0I7QUFFckMsU0FBUSxpQkFBZ0I7QUFDeEIsU0FBUSxxQkFBb0I7QUFDNUIsU0FBUSxxQkFBcUIseUJBQXdCO0FBQ3JELFNBQVEsV0FBVTtBQWdCbEIsTUFBTSxpQkFBaUIsTUFBZ0I7QUFDckMsUUFBTSxnQkFBZ0I7QUFBQSxJQUNwQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBdUIsQ0FBQztBQUU5QixnQkFBYyxRQUFRLENBQUMsWUFBWTtBQUNqQyxVQUFNLFFBQVEsU0FBUyxTQUFTO0FBQUEsTUFDOUIsS0FBSyxRQUFRLElBQUk7QUFBQSxNQUNqQixRQUFRLENBQUMsc0JBQXNCLGNBQWMs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