dbctx 1.4.6 → 2.0.1

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 (164) hide show
  1. package/dist/app/assemble.d.mts +2 -2
  2. package/dist/app/assemble.d.mts.map +1 -1
  3. package/dist/app/assemble.mjs +37 -16
  4. package/dist/app/db.d.mts.map +1 -1
  5. package/dist/app/db.mjs +3 -2
  6. package/dist/app/detect.d.mts +1 -0
  7. package/dist/app/detect.d.mts.map +1 -1
  8. package/dist/app/detect.mjs +3 -2
  9. package/dist/app/list.d.mts +4 -0
  10. package/dist/app/list.d.mts.map +1 -0
  11. package/dist/app/list.mjs +93 -0
  12. package/dist/app/load-introspection.d.mts +26 -0
  13. package/dist/app/load-introspection.d.mts.map +1 -0
  14. package/dist/app/load-introspection.mjs +89 -0
  15. package/dist/app/login.d.mts +2 -0
  16. package/dist/app/login.d.mts.map +1 -0
  17. package/dist/app/login.mjs +69 -0
  18. package/dist/app/open-url.d.mts +2 -0
  19. package/dist/app/open-url.d.mts.map +1 -1
  20. package/dist/app/open-url.mjs +8 -3
  21. package/dist/app/sample.d.mts +24 -0
  22. package/dist/app/sample.d.mts.map +1 -0
  23. package/dist/app/sample.mjs +257 -0
  24. package/dist/app/session.d.mts +3 -2
  25. package/dist/app/session.d.mts.map +1 -1
  26. package/dist/app/session.mjs +46 -6
  27. package/dist/app/ssh.d.mts.map +1 -1
  28. package/dist/app/ssh.mjs +12 -1
  29. package/dist/app/tail.d.mts +13 -0
  30. package/dist/app/tail.d.mts.map +1 -0
  31. package/dist/app/tail.mjs +168 -0
  32. package/dist/db/check-constraints.d.mts +9 -0
  33. package/dist/db/check-constraints.d.mts.map +1 -0
  34. package/dist/db/check-constraints.mjs +17 -0
  35. package/dist/db/custom-types.d.mts +26 -0
  36. package/dist/db/custom-types.d.mts.map +1 -0
  37. package/dist/db/custom-types.mjs +61 -0
  38. package/dist/db/extensions.d.mts +8 -0
  39. package/dist/db/extensions.d.mts.map +1 -0
  40. package/dist/db/extensions.mjs +14 -0
  41. package/dist/db/foreign-keys.mjs +3 -3
  42. package/dist/db/functions.d.mts +11 -0
  43. package/dist/db/functions.d.mts.map +1 -0
  44. package/dist/db/functions.mjs +23 -0
  45. package/dist/db/index.d.mts +10 -1
  46. package/dist/db/index.d.mts.map +1 -1
  47. package/dist/db/index.mjs +11 -2
  48. package/dist/db/planner-stats.d.mts +33 -0
  49. package/dist/db/planner-stats.d.mts.map +1 -0
  50. package/dist/db/planner-stats.mjs +103 -0
  51. package/dist/db/relations.d.mts +1 -0
  52. package/dist/db/relations.d.mts.map +1 -1
  53. package/dist/db/relations.mjs +10 -1
  54. package/dist/db/rls.d.mts +21 -0
  55. package/dist/db/rls.d.mts.map +1 -0
  56. package/dist/db/rls.mjs +48 -0
  57. package/dist/db/sample.d.mts +16 -0
  58. package/dist/db/sample.d.mts.map +1 -0
  59. package/dist/db/sample.mjs +73 -0
  60. package/dist/db/sequences.d.mts +15 -0
  61. package/dist/db/sequences.d.mts.map +1 -0
  62. package/dist/db/sequences.mjs +31 -0
  63. package/dist/db/stats.mjs +3 -3
  64. package/dist/db/triggers.d.mts +11 -0
  65. package/dist/db/triggers.d.mts.map +1 -0
  66. package/dist/db/triggers.mjs +21 -0
  67. package/dist/flow/events.d.mts +115 -0
  68. package/dist/flow/events.d.mts.map +1 -0
  69. package/dist/flow/events.mjs +2 -0
  70. package/dist/flow/interpreter.d.mts +21 -0
  71. package/dist/flow/interpreter.d.mts.map +1 -0
  72. package/dist/flow/interpreter.mjs +605 -0
  73. package/dist/flow/projection.d.mts +17 -0
  74. package/dist/flow/projection.d.mts.map +1 -0
  75. package/dist/flow/projection.mjs +83 -0
  76. package/dist/flow/projection.test.d.mts +2 -0
  77. package/dist/flow/projection.test.d.mts.map +1 -0
  78. package/dist/flow/projection.test.mjs +162 -0
  79. package/dist/flow/reducer.d.mts +5 -0
  80. package/dist/flow/reducer.d.mts.map +1 -0
  81. package/dist/flow/reducer.mjs +306 -0
  82. package/dist/flow/reducer.test.d.mts +2 -0
  83. package/dist/flow/reducer.test.d.mts.map +1 -0
  84. package/dist/flow/reducer.test.mjs +479 -0
  85. package/dist/flow/run.d.mts +3 -0
  86. package/dist/flow/run.d.mts.map +1 -0
  87. package/dist/flow/run.mjs +89 -0
  88. package/dist/flow/states.d.mts +54 -0
  89. package/dist/flow/states.d.mts.map +1 -0
  90. package/dist/flow/states.mjs +39 -0
  91. package/dist/index.d.mts +11 -0
  92. package/dist/index.d.mts.map +1 -1
  93. package/dist/index.mjs +135 -12
  94. package/dist/lib/atomic-write.d.mts +4 -0
  95. package/dist/lib/atomic-write.d.mts.map +1 -0
  96. package/dist/lib/atomic-write.mjs +75 -0
  97. package/dist/lib/stream-job.d.mts +19 -0
  98. package/dist/lib/stream-job.d.mts.map +1 -0
  99. package/dist/lib/stream-job.mjs +55 -0
  100. package/dist/lib/trpc-url.mjs +2 -2
  101. package/dist/lib/trpc.mjs +2 -2
  102. package/dist/logger.d.mts.map +1 -1
  103. package/dist/logger.mjs +6 -3
  104. package/dist/providers/TrpcProvider.js +3 -3
  105. package/dist/store.d.mts +113 -1
  106. package/dist/store.d.mts.map +1 -1
  107. package/dist/store.mjs +81 -2
  108. package/dist/ui/App.d.ts +1 -1
  109. package/dist/ui/App.d.ts.map +1 -1
  110. package/dist/ui/App.js +32 -4
  111. package/dist/ui/components/Analyze.d.ts +10 -0
  112. package/dist/ui/components/Analyze.d.ts.map +1 -0
  113. package/dist/ui/components/Analyze.js +54 -0
  114. package/dist/ui/components/Billing.d.ts +10 -0
  115. package/dist/ui/components/Billing.d.ts.map +1 -0
  116. package/dist/ui/components/Billing.js +40 -0
  117. package/dist/ui/components/DB.d.ts.map +1 -1
  118. package/dist/ui/components/DB.js +2 -2
  119. package/dist/ui/components/DatabasePicker.d.ts +13 -0
  120. package/dist/ui/components/DatabasePicker.d.ts.map +1 -0
  121. package/dist/ui/components/DatabasePicker.js +79 -0
  122. package/dist/ui/components/Enrich.d.ts +10 -0
  123. package/dist/ui/components/Enrich.d.ts.map +1 -0
  124. package/dist/ui/components/Enrich.js +41 -0
  125. package/dist/ui/components/Gate.js +2 -2
  126. package/dist/ui/components/Introspect.d.ts.map +1 -1
  127. package/dist/ui/components/Introspect.js +2 -2
  128. package/dist/ui/components/IntrospectionUpload.d.ts +10 -0
  129. package/dist/ui/components/IntrospectionUpload.d.ts.map +1 -0
  130. package/dist/ui/components/IntrospectionUpload.js +30 -0
  131. package/dist/ui/components/Login.d.ts +19 -0
  132. package/dist/ui/components/Login.d.ts.map +1 -0
  133. package/dist/ui/components/Login.js +38 -0
  134. package/dist/ui/components/OutputJson.d.ts +10 -0
  135. package/dist/ui/components/OutputJson.d.ts.map +1 -0
  136. package/dist/ui/components/OutputJson.js +18 -0
  137. package/dist/ui/components/SSH.d.ts.map +1 -1
  138. package/dist/ui/components/SSH.js +2 -2
  139. package/dist/ui/components/SamplesUpload.d.ts +10 -0
  140. package/dist/ui/components/SamplesUpload.d.ts.map +1 -0
  141. package/dist/ui/components/SamplesUpload.js +24 -0
  142. package/dist/ui/components/Sampling.d.ts +10 -0
  143. package/dist/ui/components/Sampling.d.ts.map +1 -0
  144. package/dist/ui/components/Sampling.js +58 -0
  145. package/dist/ui/components/Session.d.ts.map +1 -1
  146. package/dist/ui/components/Session.js +4 -4
  147. package/dist/ui/components/Spinner.d.ts.map +1 -1
  148. package/dist/ui/components/Spinner.js +17 -5
  149. package/dist/ui/components/TextInput.d.ts +11 -0
  150. package/dist/ui/components/TextInput.d.ts.map +1 -0
  151. package/dist/ui/components/TextInput.js +286 -0
  152. package/dist/ui/components/UserExplanation.d.ts +10 -0
  153. package/dist/ui/components/UserExplanation.d.ts.map +1 -0
  154. package/dist/ui/components/UserExplanation.js +34 -0
  155. package/dist/validatePaths.d.mts +2 -1
  156. package/dist/validatePaths.d.mts.map +1 -1
  157. package/dist/validatePaths.mjs +6 -2
  158. package/package.json +7 -7
  159. package/dist/app/index.d.mts +0 -3
  160. package/dist/app/index.d.mts.map +0 -1
  161. package/dist/app/index.mjs +0 -82
  162. package/dist/schemas/index.d.mts +0 -107
  163. package/dist/schemas/index.d.mts.map +0 -1
  164. package/dist/schemas/index.mjs +0 -116
@@ -0,0 +1,89 @@
1
+ import { runInAction } from 'mobx';
2
+ import { DBCTX_DEV } from '../lib/env.mjs';
3
+ import { logger } from '../logger.mjs';
4
+ import { reduce } from './reducer.mjs';
5
+ import { projectStoreFromFlow } from './projection.mjs';
6
+ import { initialFlowState, isTerminal } from './states.mjs';
7
+ import { cleanup, driveSide, initialContext } from './interpreter.mjs';
8
+ // Apply the projection's delta onto the mobx store. Field names match
9
+ // store.steps shape so the Ink UI continues to read what it always did.
10
+ const applyProjection = (store, delta) => {
11
+ runInAction(() => {
12
+ store.steps.ingestion.introspection.state =
13
+ delta.ingestion.introspection.state;
14
+ store.steps.ingestion.introspection.error =
15
+ delta.ingestion.introspection.error;
16
+ // postIntrospection is owned by kickPostIntrospectionPoll +
17
+ // streamPostIntrospection (direct store writes). Projection must not
18
+ // mirror it — flow state never advances past 'queued', so any mirror
19
+ // here would clobber the stream's 'running'/'done' writes on every
20
+ // subsequent dispatch.
21
+ store.steps.sampling.state = delta.sampling.state;
22
+ store.steps.sampling.reused = delta.sampling.reused;
23
+ store.steps.sampling.error = delta.sampling.error;
24
+ Object.assign(store.steps.userExplanation, delta.userExplanation);
25
+ if (delta.account) {
26
+ store.steps.account.state = delta.account.state;
27
+ store.steps.account.error = delta.account.error;
28
+ }
29
+ });
30
+ };
31
+ export const runFlow = async (store) => {
32
+ let state = initialFlowState({
33
+ stopAfter: store.outputOptions.stopAfter,
34
+ sshEnabled: store.steps.sshConnection.enabled,
35
+ fileMaskPath: store.outputOptions.sensitiveMaskPath,
36
+ fromIntrospectionFile: store.outputOptions.useIntrospectionJsonPath !== null,
37
+ outputJSONPath: store.outputOptions.outputIntrospectionJson,
38
+ outputSamplesDir: store.outputOptions.outputSamplesDir,
39
+ explanation: store.outputOptions.explanation,
40
+ });
41
+ const ctx = initialContext();
42
+ let resolveTerminal = () => { };
43
+ const terminalPromise = new Promise((res) => {
44
+ resolveTerminal = res;
45
+ });
46
+ const dispatch = (event) => {
47
+ const prev = state;
48
+ const next = reduce(state, event);
49
+ state = next;
50
+ applyProjection(store, projectStoreFromFlow(next));
51
+ if (isTerminal(next) && !isTerminal(prev)) {
52
+ cleanup(ctx);
53
+ runInAction(() => {
54
+ store.exitRequested = true;
55
+ });
56
+ resolveTerminal();
57
+ return;
58
+ }
59
+ // Fire side effects for new phases asynchronously. The interpreter
60
+ // dispatches more events back as work resolves.
61
+ if (prev.phase !== next.phase) {
62
+ void driveSide(prev, next, store, ctx, dispatch).catch((err) => {
63
+ logger.error(`flow interpreter error: ${String(err)}`);
64
+ });
65
+ }
66
+ };
67
+ try {
68
+ // Kick off the flow.
69
+ dispatch({ kind: 'start' });
70
+ await terminalPromise;
71
+ }
72
+ catch (err) {
73
+ if (DBCTX_DEV) {
74
+ logger.error(`runFlow: ${String(err)}`, { error: err });
75
+ }
76
+ cleanup(ctx);
77
+ }
78
+ // Process exit signal: legacy run() also marked exitRequested at the
79
+ // end. Stop-after paths additionally process.exit(0); preserve that
80
+ // behavior here.
81
+ if (state.phase === 'done' &&
82
+ state.stopAfter !== null &&
83
+ state.stopAfter !== 'sampling') {
84
+ // Match legacy: stop-after ssh-connect / db-connect / introspection
85
+ // hard-exit so the Ink app teardown doesn't linger.
86
+ process.exit(0);
87
+ }
88
+ };
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImZsb3cvcnVuLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBa0IsTUFBTSxjQUFjLENBQUM7QUFDM0UsT0FBTyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFckUsc0VBQXNFO0FBQ3RFLHdFQUF3RTtBQUN4RSxNQUFNLGVBQWUsR0FBRyxDQUNwQixLQUFhLEVBQ2IsS0FBOEMsRUFDMUMsRUFBRTtJQUNOLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSztZQUNyQyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUs7WUFDckMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ3hDLDREQUE0RDtRQUM1RCxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSx1QkFBdUI7UUFDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxD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RCxxQkFBcUI7UUFDckIsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxlQUFlLENBQUM7SUFDMUIsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDWCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ1osTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLG9FQUFvRTtJQUNwRSxpQkFBaUI7SUFDakIsSUFDSSxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU07UUFDdEIsS0FBSyxDQUFDLFNBQVMsS0FBSyxJQUFJO1FBQ3hCLEtBQUssQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUNoQyxDQUFDO1FBQ0Msb0VBQW9FO1FBQ3BFLG9EQUFvRDtRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3J1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcbmltcG9ydCB7REJDVFhfREVWfSBmcm9tICcuLi9saWIvZW52Lm1qcyc7XG5pbXBvcnQge2xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2VyLm1qcyc7XG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1RGbG93RXZlbnR9IGZyb20gJy4vZXZlbnRzLm1qcyc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi9yZWR1Y2VyLm1qcyc7XG5pbXBvcnQge3Byb2plY3RTdG9yZUZyb21GbG93fSBmcm9tICcuL3Byb2plY3Rpb24ubWpzJztcbmltcG9ydCB7aW5pdGlhbEZsb3dTdGF0ZSwgaXNUZXJtaW5hbCwgdHlwZSBURmxvd1N0YXRlfSBmcm9tICcuL3N0YXRlcy5tanMnO1xuaW1wb3J0IHtjbGVhbnVwLCBkcml2ZVNpZGUsIGluaXRpYWxDb250ZXh0fSBmcm9tICcuL2ludGVycHJldGVyLm1qcyc7XG5cbi8vIEFwcGx5IHRoZSBwcm9qZWN0aW9uJ3MgZGVsdGEgb250byB0aGUgbW9ieCBzdG9yZS4gRmllbGQgbmFtZXMgbWF0Y2hcbi8vIHN0b3JlLnN0ZXBzIHNoYXBlIHNvIHRoZSBJbmsgVUkgY29udGludWVzIHRvIHJlYWQgd2hhdCBpdCBhbHdheXMgZGlkLlxuY29uc3QgYXBwbHlQcm9qZWN0aW9uID0gKFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgZGVsdGE6IFJldHVyblR5cGU8dHlwZW9mIHByb2plY3RTdG9yZUZyb21GbG93Pixcbik6IHZvaWQgPT4ge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLmludHJvc3BlY3Rpb24uc3RhdGUgPVxuICAgICAgICAgICAgZGVsdGEuaW5nZXN0aW9uLmludHJvc3BlY3Rpb24uc3RhdGU7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5pbnRyb3NwZWN0aW9uLmVycm9yID1cbiAgICAgICAgICAgIGRlbHRhLmluZ2VzdGlvbi5pbnRyb3NwZWN0aW9uLmVycm9yO1xuICAgICAgICAvLyBwb3N0SW50cm9zcGVjdGlvbiBpcyBvd25lZCBieSBraWNrUG9zdEludHJvc3BlY3Rpb25Qb2xsICtcbiAgICAgICAgLy8gc3RyZWFtUG9zdEludHJvc3BlY3Rpb24gKGRpcmVjdCBzdG9yZSB3cml0ZXMpLiBQcm9qZWN0aW9uIG11c3Qgbm90XG4gICAgICAgIC8vIG1pcnJvciBpdCDigJQgZmxvdyBzdGF0ZSBuZXZlciBhZHZhbmNlcyBwYXN0ICdxdWV1ZWQnLCBzbyBhbnkgbWlycm9yXG4gICAgICAgIC8vIGhlcmUgd291bGQgY2xvYmJlciB0aGUgc3RyZWFtJ3MgJ3J1bm5pbmcnLydkb25lJyB3cml0ZXMgb24gZXZlcnlcbiAgICAgICAgLy8gc3Vic2VxdWVudCBkaXNwYXRjaC5cbiAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuc3RhdGUgPSBkZWx0YS5zYW1wbGluZy5zdGF0ZTtcbiAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcucmV1c2VkID0gZGVsdGEuc2FtcGxpbmcucmV1c2VkO1xuICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5lcnJvciA9IGRlbHRhLnNhbXBsaW5nLmVycm9yO1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0b3JlLnN0ZXBzLnVzZXJFeHBsYW5hdGlvbiwgZGVsdGEudXNlckV4cGxhbmF0aW9uKTtcbiAgICAgICAgaWYgKGRlbHRhLmFjY291bnQpIHtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSBkZWx0YS5hY2NvdW50LnN0YXRlO1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5lcnJvciA9IGRlbHRhLmFjY291bnQuZXJyb3I7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBydW5GbG93ID0gYXN5bmMgKHN0b3JlOiBUU3RvcmUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsZXQgc3RhdGU6IFRGbG93U3RhdGUgPSBpbml0aWFsRmxvd1N0YXRlKHtcbiAgICAgICAgc3RvcEFmdGVyOiBzdG9yZS5vdXRwdXRPcHRpb25zLnN0b3BBZnRlcixcbiAgICAgICAgc3NoRW5hYmxlZDogc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lbmFibGVkLFxuICAgICAgICBmaWxlTWFza1BhdGg6IHN0b3JlLm91dHB1dE9wdGlvbnMuc2Vuc2l0aXZlTWFza1BhdGgsXG4gICAgICAgIGZyb21JbnRyb3NwZWN0aW9uRmlsZTpcbiAgICAgICAgICAgIHN0b3JlLm91dHB1dE9wdGlvbnMudXNlSW50cm9zcGVjdGlvbkpzb25QYXRoICE9PSBudWxsLFxuICAgICAgICBvdXRwdXRKU09OUGF0aDogc3RvcmUub3V0cHV0T3B0aW9ucy5vdXRwdXRJbnRyb3NwZWN0aW9uSnNvbixcbiAgICAgICAgb3V0cHV0U2FtcGxlc0Rpcjogc3RvcmUub3V0cHV0T3B0aW9ucy5vdXRwdXRTYW1wbGVzRGlyLFxuICAgICAgICBleHBsYW5hdGlvbjogc3RvcmUub3V0cHV0T3B0aW9ucy5leHBsYW5hdGlvbixcbiAgICB9KTtcbiAgICBjb25zdCBjdHggPSBpbml0aWFsQ29udGV4dCgpO1xuXG4gICAgbGV0IHJlc29sdmVUZXJtaW5hbDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIGNvbnN0IHRlcm1pbmFsUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXMpID0+IHtcbiAgICAgICAgcmVzb2x2ZVRlcm1pbmFsID0gcmVzO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSAoZXZlbnQ6IFRGbG93RXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHN0YXRlO1xuICAgICAgICBjb25zdCBuZXh0ID0gcmVkdWNlKHN0YXRlLCBldmVudCk7XG4gICAgICAgIHN0YXRlID0gbmV4dDtcbiAgICAgICAgYXBwbHlQcm9qZWN0aW9uKHN0b3JlLCBwcm9qZWN0U3RvcmVGcm9tRmxvdyhuZXh0KSk7XG5cbiAgICAgICAgaWYgKGlzVGVybWluYWwobmV4dCkgJiYgIWlzVGVybWluYWwocHJldikpIHtcbiAgICAgICAgICAgIGNsZWFudXAoY3R4KTtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5leGl0UmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZVRlcm1pbmFsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlyZSBzaWRlIGVmZmVjdHMgZm9yIG5ldyBwaGFzZXMgYXN5bmNocm9ub3VzbHkuIFRoZSBpbnRlcnByZXRlclxuICAgICAgICAvLyBkaXNwYXRjaGVzIG1vcmUgZXZlbnRzIGJhY2sgYXMgd29yayByZXNvbHZlcy5cbiAgICAgICAgaWYgKHByZXYucGhhc2UgIT09IG5leHQucGhhc2UpIHtcbiAgICAgICAgICAgIHZvaWQgZHJpdmVTaWRlKHByZXYsIG5leHQsIHN0b3JlLCBjdHgsIGRpc3BhdGNoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBmbG93IGludGVycHJldGVyIGVycm9yOiAke1N0cmluZyhlcnIpfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gS2ljayBvZmYgdGhlIGZsb3cuXG4gICAgICAgIGRpc3BhdGNoKHtraW5kOiAnc3RhcnQnfSk7XG4gICAgICAgIGF3YWl0IHRlcm1pbmFsUHJvbWlzZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKERCQ1RYX0RFVikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBydW5GbG93OiAke1N0cmluZyhlcnIpfWAsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYW51cChjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZXhpdCBzaWduYWw6IGxlZ2FjeSBydW4oKSBhbHNvIG1hcmtlZCBleGl0UmVxdWVzdGVkIGF0IHRoZVxuICAgIC8vIGVuZC4gU3RvcC1hZnRlciBwYXRocyBhZGRpdGlvbmFsbHkgcHJvY2Vzcy5leGl0KDApOyBwcmVzZXJ2ZSB0aGF0XG4gICAgLy8gYmVoYXZpb3IgaGVyZS5cbiAgICBpZiAoXG4gICAgICAgIHN0YXRlLnBoYXNlID09PSAnZG9uZScgJiZcbiAgICAgICAgc3RhdGUuc3RvcEFmdGVyICE9PSBudWxsICYmXG4gICAgICAgIHN0YXRlLnN0b3BBZnRlciAhPT0gJ3NhbXBsaW5nJ1xuICAgICkge1xuICAgICAgICAvLyBNYXRjaCBsZWdhY3k6IHN0b3AtYWZ0ZXIgc3NoLWNvbm5lY3QgLyBkYi1jb25uZWN0IC8gaW50cm9zcGVjdGlvblxuICAgICAgICAvLyBoYXJkLWV4aXQgc28gdGhlIEluayBhcHAgdGVhcmRvd24gZG9lc24ndCBsaW5nZXIuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG59O1xuIl19
@@ -0,0 +1,54 @@
1
+ import type { TStopAfterStage } from '../store.mjs';
2
+ import type { TPostIntrospectionStage } from '@dbctx/common';
3
+ import type { TSensitiveMask, TTableSampleEvent } from '../app/sample.mjs';
4
+ export type TFlowPhase = 'idle' | 'connecting-ssh' | 'connecting-db' | 'introspecting' | 'output-json' | 'creating-session' | 'awaiting-authorization' | 'awaiting-explanation' | 'preflight-checking' | 'ingesting-introspection' | 'sampling-mask-resolving' | 'sampling' | 'uploading-samples' | 'awaiting-post-sampling' | 'done' | 'error';
5
+ export type TPostIntrospectionSubStatus = {
6
+ readonly state: 'idle' | 'queued' | 'running' | 'done' | 'error';
7
+ readonly jobId: string | null;
8
+ readonly reused: boolean;
9
+ readonly stage: TPostIntrospectionStage | null;
10
+ readonly tokensIn: number | null;
11
+ readonly tokensOut: number | null;
12
+ readonly columnsDone: number | null;
13
+ readonly columnsTotal: number | null;
14
+ readonly error: string | null;
15
+ };
16
+ export type TSamplingSubStatus = {
17
+ readonly mask: TSensitiveMask | null;
18
+ readonly collected: readonly TTableSampleEvent[];
19
+ readonly uploadedTables: number;
20
+ readonly totalTables: number;
21
+ };
22
+ export type TFlowState = {
23
+ readonly phase: TFlowPhase;
24
+ readonly stopAfter: TStopAfterStage | null;
25
+ readonly sshEnabled: boolean;
26
+ readonly fileMaskPath: string | null;
27
+ readonly fromIntrospectionFile: boolean;
28
+ readonly outputJSONPath: string | null;
29
+ readonly outputSamplesDir: string | null;
30
+ readonly explanation: string | null;
31
+ readonly sessionId: string | null;
32
+ readonly revisionId: string | null;
33
+ readonly authToken: string | null;
34
+ readonly samplesAlreadyIngested: boolean;
35
+ readonly tablesNeedingSamples: readonly string[] | null;
36
+ readonly preflightHit: boolean;
37
+ readonly postIntrospection: TPostIntrospectionSubStatus;
38
+ readonly sampling: TSamplingSubStatus;
39
+ readonly errorPhase: TFlowPhase | null;
40
+ readonly errorMessage: string | null;
41
+ };
42
+ export declare const initialPostIntrospection: TPostIntrospectionSubStatus;
43
+ export declare const initialSampling: TSamplingSubStatus;
44
+ export declare const initialFlowState: (args: {
45
+ readonly stopAfter: TStopAfterStage | null;
46
+ readonly sshEnabled: boolean;
47
+ readonly fileMaskPath: string | null;
48
+ readonly fromIntrospectionFile: boolean;
49
+ readonly outputJSONPath: string | null;
50
+ readonly outputSamplesDir: string | null;
51
+ readonly explanation: string | null;
52
+ }) => TFlowState;
53
+ export declare const isTerminal: (state: TFlowState) => boolean;
54
+ //# sourceMappingURL=states.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.d.mts","sourceRoot":"./src/","sources":["flow/states.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export const initialPostIntrospection = Object.freeze({
2
+ state: 'idle',
3
+ jobId: null,
4
+ reused: false,
5
+ stage: null,
6
+ tokensIn: null,
7
+ tokensOut: null,
8
+ columnsDone: null,
9
+ columnsTotal: null,
10
+ error: null,
11
+ });
12
+ export const initialSampling = Object.freeze({
13
+ mask: null,
14
+ collected: Object.freeze([]),
15
+ uploadedTables: 0,
16
+ totalTables: 0,
17
+ });
18
+ export const initialFlowState = (args) => Object.freeze({
19
+ phase: 'idle',
20
+ stopAfter: args.stopAfter,
21
+ sshEnabled: args.sshEnabled,
22
+ fileMaskPath: args.fileMaskPath,
23
+ fromIntrospectionFile: args.fromIntrospectionFile,
24
+ outputJSONPath: args.outputJSONPath,
25
+ outputSamplesDir: args.outputSamplesDir,
26
+ explanation: args.explanation,
27
+ sessionId: null,
28
+ revisionId: null,
29
+ authToken: null,
30
+ samplesAlreadyIngested: false,
31
+ tablesNeedingSamples: null,
32
+ preflightHit: false,
33
+ postIntrospection: initialPostIntrospection,
34
+ sampling: initialSampling,
35
+ errorPhase: null,
36
+ errorMessage: null,
37
+ });
38
+ export const isTerminal = (state) => state.phase === 'done' || state.phase === 'error';
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVzLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImZsb3cvc3RhdGVzLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF3RUEsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDVixLQUFLLEVBQUUsTUFBZTtJQUN0QixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxLQUFLO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsWUFBWSxFQUFFLElBQUk7SUFDbEIsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDLENBQUM7QUFFUCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQXVCLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDN0QsSUFBSSxFQUFFLElBQUk7SUFDVixTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFrQyxDQUFDO0lBQzVELGNBQWMsRUFBRSxDQUFDO0lBQ2pCLFdBQVcsRUFBRSxDQUFDO0NBQ2pCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsSUFRaEMsRUFBYyxFQUFFLENBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNWLEtBQUssRUFBRSxNQUFNO0lBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0lBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtJQUMzQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7SUFDL0IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtJQUNqRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7SUFDbkMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtJQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7SUFDN0IsU0FBUyxFQUFFLElBQUk7SUFDZixVQUFVLEVBQUUsSUFBSTtJQUNoQixTQUFTLEVBQUUsSUFBSTtJQUNmLHNCQUFzQixFQUFFLEtBQUs7SUFDN0Isb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixZQUFZLEVBQUUsS0FBSztJQUNuQixpQkFBaUIsRUFBRSx3QkFBd0I7SUFDM0MsUUFBUSxFQUFFLGVBQWU7SUFDekIsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLElBQUk7Q0FDckIsQ0FBQyxDQUFDO0FBRVAsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBaUIsRUFBVyxFQUFFLENBQ3JELEtBQUssQ0FBQyxLQUFLLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1RTdG9wQWZ0ZXJTdGFnZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB0eXBlIHtUUG9zdEludHJvc3BlY3Rpb25TdGFnZX0gZnJvbSAnQGRiY3R4L2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7VFNlbnNpdGl2ZU1hc2ssIFRUYWJsZVNhbXBsZUV2ZW50fSBmcm9tICcuLi9hcHAvc2FtcGxlLm1qcyc7XG5cbi8vIFNpbmdsZSByZWNvcmQgc3RhdGUg4oCUIHBhcmFsbGVsIGNvbmNlcm5zIGV4cHJlc3NlZCBhcyBzdWItc3RhdHVzIGZpZWxkcyxcbi8vIG5vdCBhcyBuZXN0ZWQgc3RhdGUgbWFjaGluZXMuIEtlZXBzIHRoZSByZWR1Y2VyIG9uZSBiaWcgc3dpdGNoIGluc3RlYWRcbi8vIG9mIE4gY29vcmRpbmF0aW5nIG1pbmktbWFjaGluZXMuXG5cbmV4cG9ydCB0eXBlIFRGbG93UGhhc2UgPVxuICAgIHwgJ2lkbGUnXG4gICAgfCAnY29ubmVjdGluZy1zc2gnXG4gICAgfCAnY29ubmVjdGluZy1kYidcbiAgICB8ICdpbnRyb3NwZWN0aW5nJ1xuICAgIHwgJ291dHB1dC1qc29uJ1xuICAgIHwgJ2NyZWF0aW5nLXNlc3Npb24nXG4gICAgfCAnYXdhaXRpbmctYXV0aG9yaXphdGlvbidcbiAgICB8ICdhd2FpdGluZy1leHBsYW5hdGlvbidcbiAgICB8ICdwcmVmbGlnaHQtY2hlY2tpbmcnXG4gICAgfCAnaW5nZXN0aW5nLWludHJvc3BlY3Rpb24nXG4gICAgfCAnc2FtcGxpbmctbWFzay1yZXNvbHZpbmcnXG4gICAgfCAnc2FtcGxpbmcnXG4gICAgfCAndXBsb2FkaW5nLXNhbXBsZXMnXG4gICAgfCAnYXdhaXRpbmctcG9zdC1zYW1wbGluZydcbiAgICB8ICdkb25lJ1xuICAgIHwgJ2Vycm9yJztcblxuLy8gU3ViLXN0YXR1cyBvZiB0aGUgYmFja2dyb3VuZCBwb3N0LWludHJvc3BlY3Rpb24gam9iLiBUcmFja2VkIGFzIGEgZmllbGRcbi8vIHNvIGl0IGNhbiBhZHZhbmNlIGluZGVwZW5kZW50bHkgb2YgdGhlIHByaW1hcnkgcGhhc2UgKGUuZy4gY29tcGxldGVcbi8vIHdoaWxlIHdlJ3JlIHN0aWxsIGluIGBzYW1wbGluZ2AgYmVjYXVzZSBhIGZpbGUgbWFzayBsZXQgdXMgcHJvY2VlZCkuXG5leHBvcnQgdHlwZSBUUG9zdEludHJvc3BlY3Rpb25TdWJTdGF0dXMgPSB7XG4gICAgcmVhZG9ubHkgc3RhdGU6ICdpZGxlJyB8ICdxdWV1ZWQnIHwgJ3J1bm5pbmcnIHwgJ2RvbmUnIHwgJ2Vycm9yJztcbiAgICByZWFkb25seSBqb2JJZDogc3RyaW5nIHwgbnVsbDtcbiAgICByZWFkb25seSByZXVzZWQ6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc3RhZ2U6IFRQb3N0SW50cm9zcGVjdGlvblN0YWdlIHwgbnVsbDtcbiAgICByZWFkb25seSB0b2tlbnNJbjogbnVtYmVyIHwgbnVsbDtcbiAgICByZWFkb25seSB0b2tlbnNPdXQ6IG51bWJlciB8IG51bGw7XG4gICAgcmVhZG9ubHkgY29sdW1uc0RvbmU6IG51bWJlciB8IG51bGw7XG4gICAgcmVhZG9ubHkgY29sdW1uc1RvdGFsOiBudW1iZXIgfCBudWxsO1xuICAgIHJlYWRvbmx5IGVycm9yOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgVFNhbXBsaW5nU3ViU3RhdHVzID0ge1xuICAgIHJlYWRvbmx5IG1hc2s6IFRTZW5zaXRpdmVNYXNrIHwgbnVsbDtcbiAgICByZWFkb25seSBjb2xsZWN0ZWQ6IHJlYWRvbmx5IFRUYWJsZVNhbXBsZUV2ZW50W107XG4gICAgcmVhZG9ubHkgdXBsb2FkZWRUYWJsZXM6IG51bWJlcjtcbiAgICByZWFkb25seSB0b3RhbFRhYmxlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVEZsb3dTdGF0ZSA9IHtcbiAgICByZWFkb25seSBwaGFzZTogVEZsb3dQaGFzZTtcbiAgICByZWFkb25seSBzdG9wQWZ0ZXI6IFRTdG9wQWZ0ZXJTdGFnZSB8IG51bGw7XG4gICAgcmVhZG9ubHkgc3NoRW5hYmxlZDogYm9vbGVhbjtcbiAgICByZWFkb25seSBmaWxlTWFza1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgcmVhZG9ubHkgZnJvbUludHJvc3BlY3Rpb25GaWxlOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IG91dHB1dEpTT05QYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlYWRvbmx5IG91dHB1dFNhbXBsZXNEaXI6IHN0cmluZyB8IG51bGw7XG4gICAgcmVhZG9ubHkgZXhwbGFuYXRpb246IHN0cmluZyB8IG51bGw7XG4gICAgcmVhZG9ubHkgc2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlYWRvbmx5IHJldmlzaW9uSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcmVhZG9ubHkgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlYWRvbmx5IHNhbXBsZXNBbHJlYWR5SW5nZXN0ZWQ6IGJvb2xlYW47XG4gICAgLy8gU2VydmVyLXN1cHBsaWVkIGxpc3Qgb2YgdGFibGVzIHRoYXQgbmVlZCBmcmVzaCBzYW1wbGVzIG9uIHRoaXMgcnVuLlxuICAgIC8vIE51bGwgPSBub3QgeWV0IGtub3duIChwcmUtaGFuZHNoYWtlKS4gRW1wdHkgPSBub3RoaW5nIHRvIHNhbXBsZS4gTm9uLVxuICAgIC8vIGVtcHR5ID0gZmlsdGVyIHRoZSBsb2NhbCBzYW1wbGluZyBsb29wIHRvIGp1c3QgdGhlc2UgdGFibGVzLlxuICAgIHJlYWRvbmx5IHRhYmxlc05lZWRpbmdTYW1wbGVzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgcmVhZG9ubHkgcHJlZmxpZ2h0SGl0OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHBvc3RJbnRyb3NwZWN0aW9uOiBUUG9zdEludHJvc3BlY3Rpb25TdWJTdGF0dXM7XG4gICAgcmVhZG9ubHkgc2FtcGxpbmc6IFRTYW1wbGluZ1N1YlN0YXR1cztcbiAgICByZWFkb25seSBlcnJvclBoYXNlOiBURmxvd1BoYXNlIHwgbnVsbDtcbiAgICByZWFkb25seSBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbFBvc3RJbnRyb3NwZWN0aW9uOiBUUG9zdEludHJvc3BlY3Rpb25TdWJTdGF0dXMgPVxuICAgIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzdGF0ZTogJ2lkbGUnIGFzIGNvbnN0LFxuICAgICAgICBqb2JJZDogbnVsbCxcbiAgICAgICAgcmV1c2VkOiBmYWxzZSxcbiAgICAgICAgc3RhZ2U6IG51bGwsXG4gICAgICAgIHRva2Vuc0luOiBudWxsLFxuICAgICAgICB0b2tlbnNPdXQ6IG51bGwsXG4gICAgICAgIGNvbHVtbnNEb25lOiBudWxsLFxuICAgICAgICBjb2x1bW5zVG90YWw6IG51bGwsXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgIH0pO1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbFNhbXBsaW5nOiBUU2FtcGxpbmdTdWJTdGF0dXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtYXNrOiBudWxsLFxuICAgIGNvbGxlY3RlZDogT2JqZWN0LmZyZWV6ZShbXSBhcyByZWFkb25seSBUVGFibGVTYW1wbGVFdmVudFtdKSxcbiAgICB1cGxvYWRlZFRhYmxlczogMCxcbiAgICB0b3RhbFRhYmxlczogMCxcbn0pO1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbEZsb3dTdGF0ZSA9IChhcmdzOiB7XG4gICAgcmVhZG9ubHkgc3RvcEFmdGVyOiBUU3RvcEFmdGVyU3RhZ2UgfCBudWxsO1xuICAgIHJlYWRvbmx5IHNzaEVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZmlsZU1hc2tQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlYWRvbmx5IGZyb21JbnRyb3NwZWN0aW9uRmlsZTogYm9vbGVhbjtcbiAgICByZWFkb25seSBvdXRwdXRKU09OUGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICByZWFkb25seSBvdXRwdXRTYW1wbGVzRGlyOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlYWRvbmx5IGV4cGxhbmF0aW9uOiBzdHJpbmcgfCBudWxsO1xufSk6IFRGbG93U3RhdGUgPT5cbiAgICBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgcGhhc2U6ICdpZGxlJyxcbiAgICAgICAgc3RvcEFmdGVyOiBhcmdzLnN0b3BBZnRlcixcbiAgICAgICAgc3NoRW5hYmxlZDogYXJncy5zc2hFbmFibGVkLFxuICAgICAgICBmaWxlTWFza1BhdGg6IGFyZ3MuZmlsZU1hc2tQYXRoLFxuICAgICAgICBmcm9tSW50cm9zcGVjdGlvbkZpbGU6IGFyZ3MuZnJvbUludHJvc3BlY3Rpb25GaWxlLFxuICAgICAgICBvdXRwdXRKU09OUGF0aDogYXJncy5vdXRwdXRKU09OUGF0aCxcbiAgICAgICAgb3V0cHV0U2FtcGxlc0RpcjogYXJncy5vdXRwdXRTYW1wbGVzRGlyLFxuICAgICAgICBleHBsYW5hdGlvbjogYXJncy5leHBsYW5hdGlvbixcbiAgICAgICAgc2Vzc2lvbklkOiBudWxsLFxuICAgICAgICByZXZpc2lvbklkOiBudWxsLFxuICAgICAgICBhdXRoVG9rZW46IG51bGwsXG4gICAgICAgIHNhbXBsZXNBbHJlYWR5SW5nZXN0ZWQ6IGZhbHNlLFxuICAgICAgICB0YWJsZXNOZWVkaW5nU2FtcGxlczogbnVsbCxcbiAgICAgICAgcHJlZmxpZ2h0SGl0OiBmYWxzZSxcbiAgICAgICAgcG9zdEludHJvc3BlY3Rpb246IGluaXRpYWxQb3N0SW50cm9zcGVjdGlvbixcbiAgICAgICAgc2FtcGxpbmc6IGluaXRpYWxTYW1wbGluZyxcbiAgICAgICAgZXJyb3JQaGFzZTogbnVsbCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBudWxsLFxuICAgIH0pO1xuXG5leHBvcnQgY29uc3QgaXNUZXJtaW5hbCA9IChzdGF0ZTogVEZsb3dTdGF0ZSk6IGJvb2xlYW4gPT5cbiAgICBzdGF0ZS5waGFzZSA9PT0gJ2RvbmUnIHx8IHN0YXRlLnBoYXNlID09PSAnZXJyb3InO1xuIl19
package/dist/index.d.mts CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { type TStopAfterStage } from './store.mjs';
2
3
  export type TSSLMode = 'disable' | 'allow' | 'prefer' | 'require' | 'verify-ca' | 'verify-full';
3
4
  export interface TOptions {
4
5
  hostname?: string;
@@ -14,5 +15,15 @@ export interface TOptions {
14
15
  sshPort?: number;
15
16
  sshUsername?: string;
16
17
  sshKey?: string;
18
+ outputIntrospectionJson?: string;
19
+ useIntrospectionJson?: string;
20
+ stopAfter?: TStopAfterStage;
21
+ allowOverwrite?: boolean;
22
+ allowIntrospectionJsonOverwrite?: boolean;
23
+ explanation?: string;
24
+ sensitiveMask?: string;
25
+ outputSamples?: string;
26
+ allowSampleOverwrite?: boolean;
27
+ skipAnalyze?: boolean;
17
28
  }
18
29
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"./src/","sources":["index.mts"],"names":[],"mappings":";AA+BA,MAAM,MAAM,QAAQ,GACd,SAAS,GACT,OAAO,GACP,QAAQ,GACR,SAAS,GACT,WAAW,GACX,aAAa,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"./src/","sources":["index.mts"],"names":[],"mappings":";AAOA,OAAO,EAGH,KAAK,eAAe,EACvB,MAAM,aAAa,CAAC;AA2BrB,MAAM,MAAM,QAAQ,GACd,SAAS,GACT,OAAO,GACP,QAAQ,GACR,SAAS,GACT,WAAW,GACX,aAAa,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB"}
package/dist/index.mjs CHANGED
@@ -5,15 +5,17 @@ import { createElement } from 'react';
5
5
  import { Error } from './ui/components/Error.js';
6
6
  import { App } from './ui/App.js';
7
7
  import { Splash } from './ui/components/Splash.js';
8
- import { createAppStore } from './store.mjs';
8
+ import { createAppStore, STOP_AFTER_STAGES, } from './store.mjs';
9
9
  import { runInAction } from 'mobx';
10
- import { validatePathOptions, } from './validatePaths.mjs';
11
- import { run } from './app/index.mjs';
10
+ import { validatePathOptions, normalizePath, } from './validatePaths.mjs';
11
+ import { runFlow } from './flow/run.mjs';
12
+ import { runList } from './app/list.mjs';
13
+ import { runLogin } from './app/login.mjs';
12
14
  import { CLIENT_VERSION } from './lib/version.mjs';
13
- import { DBCTX_DEV } from '#client/lib/env.mjs';
15
+ import { DBCTX_DEV } from './lib/env.mjs';
14
16
  import { scope } from 'scope-utilities';
15
- import { trpc } from '#client/lib/trpc.mjs';
16
- import { readConfig } from './app/config.mjs';
17
+ import { trpc } from './lib/trpc.mjs';
18
+ import { readConfig, flushConfig } from './app/config.mjs';
17
19
  import { detectDocker, detectOS, detectShell, detectWSL, detectSystemMemory, detectPackageManager, detectSSHSession, } from './app/detect.mjs';
18
20
  import { logger } from './logger.mjs';
19
21
  const parseSSHTarget = (target) => {
@@ -55,7 +57,17 @@ const generate = program
55
57
  .option('--ssh-port <port>', 'SSH tunnel port (default: 22)', parseInt)
56
58
  .option('--ssh-username <user>', 'SSH tunnel username (default: $USER)')
57
59
  .option('-i, --ssh-key <path>', 'path to SSH private key (default: ~/.ssh/id_rsa)')
58
- .action((connectionString, options) => {
60
+ .option('--output-introspection-json <path>', 'write introspection JSON to file')
61
+ .option('--use-introspection-json <path>', 'load introspection from a previously-saved JSON file (skips live introspection; still connects to DB to verify identity)')
62
+ .option('--stop-after <stage>', 'exit after stage completes (ssh-connect, db-connect, introspection, sampling)')
63
+ .option('--allow-overwrite', 'skip overwrite confirmation for all output files (umbrella for --allow-introspection-json-overwrite and --allow-sample-overwrite)')
64
+ .option('--allow-introspection-json-overwrite', 'skip overwrite confirmation for the introspection JSON file')
65
+ .option('--explanation <text>', 'provide database explanation (skips interactive prompt)')
66
+ .option('--sensitive-mask <path>', 'path to sensitive-mask.json for column exclusion')
67
+ .option('--output-samples <dir>', 'directory for sample output files (activates sampling stage)')
68
+ .option('--allow-sample-overwrite', 'skip overwrite confirmation for sample output directory')
69
+ .option('--skip-analyze', 'skip running ANALYZE on tables during introspection (uses existing planner statistics)')
70
+ .action(async (connectionString, options) => {
59
71
  // Show help if no connection config is provided
60
72
  const hasCLIConfig = connectionString !== undefined ||
61
73
  options.hostname !== undefined ||
@@ -107,6 +119,26 @@ const generate = program
107
119
  ...options,
108
120
  ...expandedPaths,
109
121
  };
122
+ if (validatedOptions.useIntrospectionJson &&
123
+ validatedOptions.outputIntrospectionJson) {
124
+ render(Error({
125
+ message: '--use-introspection-json cannot be combined with --output-introspection-json (cyclic).',
126
+ }));
127
+ process.exit(1);
128
+ }
129
+ if (validatedOptions.useIntrospectionJson) {
130
+ if (validatedOptions.skipAnalyze) {
131
+ logger.warn('--skip-analyze is a no-op when --use-introspection-json is set');
132
+ }
133
+ }
134
+ // Resolve output introspection path
135
+ const resolvedOutputPath = validatedOptions.outputIntrospectionJson
136
+ ? normalizePath(validatedOptions.outputIntrospectionJson)
137
+ : null;
138
+ const resolvedUseIntrospectionPath = validatedOptions.useIntrospectionJson &&
139
+ expandedPaths.useIntrospectionJson
140
+ ? expandedPaths.useIntrospectionJson
141
+ : null;
110
142
  // Build config and render the app
111
143
  const sshDefaults = validatedOptions.ssh
112
144
  ? parseSSHTarget(validatedOptions.ssh)
@@ -118,8 +150,40 @@ const generate = program
118
150
  sshPort: validatedOptions.sshPort ?? sshDefaults?.port,
119
151
  sshUsername: validatedOptions.sshUsername ?? sshDefaults?.username,
120
152
  };
121
- const store = createAppStore(config);
122
- render(createElement(App, { store }));
153
+ const stopAfter = validatedOptions.stopAfter ?? null;
154
+ if (stopAfter !== null && !STOP_AFTER_STAGES.includes(stopAfter)) {
155
+ render(Error({
156
+ message: `Invalid --stop-after stage "${stopAfter}". Valid stages: ${STOP_AFTER_STAGES.join(', ')}`,
157
+ }));
158
+ process.exit(1);
159
+ }
160
+ const resolvedOutputSamples = validatedOptions.outputSamples
161
+ ? normalizePath(validatedOptions.outputSamples)
162
+ : null;
163
+ const resolvedSensitiveMask = validatedOptions.sensitiveMask && expandedPaths.sensitiveMask
164
+ ? expandedPaths.sensitiveMask
165
+ : null;
166
+ if (stopAfter === 'sampling' && resolvedOutputSamples === null) {
167
+ render(Error({
168
+ message: '--stop-after=sampling requires --output-samples to be set',
169
+ }));
170
+ process.exit(1);
171
+ }
172
+ const allowOverwriteUmbrella = validatedOptions.allowOverwrite ?? false;
173
+ const store = createAppStore(config, {
174
+ outputIntrospectionJson: resolvedOutputPath,
175
+ useIntrospectionJsonPath: resolvedUseIntrospectionPath,
176
+ stopAfter,
177
+ allowIntrospectionJsonOverwrite: (validatedOptions.allowIntrospectionJsonOverwrite ?? false) ||
178
+ allowOverwriteUmbrella,
179
+ explanation: validatedOptions.explanation ?? null,
180
+ sensitiveMaskPath: resolvedSensitiveMask,
181
+ outputSamplesDir: resolvedOutputSamples,
182
+ allowSampleOverwrite: (validatedOptions.allowSampleOverwrite ?? false) ||
183
+ allowOverwriteUmbrella,
184
+ skipAnalyze: validatedOptions.skipAnalyze ?? false,
185
+ });
186
+ const inkApp = render(createElement(App, { store }));
123
187
  if (connectionStringError) {
124
188
  runInAction(() => {
125
189
  store.steps.databaseConnection.state = 'error';
@@ -127,7 +191,45 @@ const generate = program
127
191
  });
128
192
  return;
129
193
  }
130
- run(store);
194
+ runFlow(store);
195
+ await inkApp.waitUntilExit();
196
+ process.exit(0);
197
+ });
198
+ program
199
+ .command('list')
200
+ .description('List databases in your account and pick one to monitor or resume')
201
+ .helpOption('--help', 'display help for command')
202
+ .action(async () => {
203
+ const store = createAppStore({}, {
204
+ outputIntrospectionJson: null,
205
+ useIntrospectionJsonPath: null,
206
+ stopAfter: null,
207
+ allowIntrospectionJsonOverwrite: false,
208
+ explanation: null,
209
+ sensitiveMaskPath: null,
210
+ outputSamplesDir: null,
211
+ allowSampleOverwrite: false,
212
+ skipAnalyze: false,
213
+ });
214
+ const inkApp = render(createElement(App, { store }));
215
+ runList(store, inkApp);
216
+ await inkApp.waitUntilExit();
217
+ process.exit(0);
218
+ });
219
+ program
220
+ .command('login')
221
+ .description('Authenticate the CLI with your dbctx.io account')
222
+ .helpOption('--help', 'display help for command')
223
+ .action(async () => {
224
+ await runLogin();
225
+ });
226
+ program
227
+ .command('logout')
228
+ .description('Clear the stored authentication token')
229
+ .helpOption('--help', 'display help for command')
230
+ .action(async () => {
231
+ await flushConfig();
232
+ console.log('Logged out — auth token cleared.');
131
233
  });
132
234
  const fireRunTelemetry = async () => {
133
235
  const doNotTrack = `${process.env['DO_NOT_TRACK']}`.toLowerCase();
@@ -136,7 +238,18 @@ const fireRunTelemetry = async () => {
136
238
  }
137
239
  const args = process.argv.slice(2);
138
240
  const isHelp = args.includes('--help') || args[0] === 'help';
139
- const subcommand = isHelp ? 'help' : 'generate';
241
+ const isLogout = args[0] === 'logout';
242
+ const isLogin = args[0] === 'login';
243
+ const isList = args[0] === 'list';
244
+ const subcommand = isHelp
245
+ ? 'help'
246
+ : isLogout
247
+ ? 'logout'
248
+ : isLogin
249
+ ? 'login'
250
+ : isList
251
+ ? 'list'
252
+ : 'generate';
140
253
  const config = await readConfig();
141
254
  return trpc.telemetry.create.mutate({
142
255
  type: 'cli.run',
@@ -150,6 +263,16 @@ const fireRunTelemetry = async () => {
150
263
  username: args.includes('-U') || args.includes('--username'),
151
264
  ssl: ['--sslmode', '--sslcert', '--sslkey', '--sslrootcert'].some((f) => args.includes(f)),
152
265
  ssh: args.includes('--ssh') || args.includes('--ssh-host'),
266
+ output_introspection_json: args.includes('--output-introspection-json'),
267
+ use_introspection_json: args.includes('--use-introspection-json'),
268
+ stop_after: args.includes('--stop-after'),
269
+ allow_overwrite: args.includes('--allow-overwrite'),
270
+ allow_introspection_json_overwrite: args.includes('--allow-introspection-json-overwrite'),
271
+ explanation: args.includes('--explanation'),
272
+ sensitive_mask: args.includes('--sensitive-mask'),
273
+ output_samples: args.includes('--output-samples'),
274
+ allow_sample_overwrite: args.includes('--allow-sample-overwrite'),
275
+ skip_analyze: args.includes('--skip-analyze'),
153
276
  },
154
277
  is_docker: detectDocker(),
155
278
  is_ssh_session: detectSSHSession(),
@@ -170,4 +293,4 @@ catch (err) {
170
293
  }
171
294
  }
172
295
  program.parse();
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiaW5kZXgubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNwQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFDSCxtQkFBbUIsR0FFdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQ0gsWUFBWSxFQUNaLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQTBCcEMsTUFB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QUFFO1FBQ2QsTUFBTSxFQUFFLFNBQVMsRUFBRTtRQUNuQixhQUFhLEVBQUUsa0JBQWtCLEVBQUU7UUFDbkMsZUFBZSxFQUFFLG9CQUFvQixFQUFFO1FBQ3ZDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztLQUM5QixDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixJQUFJLENBQUM7SUFDRCxNQUFNLGdCQUFnQixFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDWCxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ1osTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztBQUNMLENBQUM7QUFFRCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQge0NvbW1hbmR9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQge3JlbmRlcn0gZnJvbSAnaW5rJztcbmltcG9ydCB7Y3JlYXRlRWxlbWVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtFcnJvcn0gZnJvbSAnLi91aS9jb21wb25lbnRzL0Vycm9yLmpzJztcbmltcG9ydCB7QXBwfSBmcm9tICcuL3VpL0FwcC5qcyc7XG5pbXBvcnQge1NwbGFzaH0gZnJvbSAnLi91aS9jb21wb25lbnRzL1NwbGFzaC5qcyc7XG5pbXBvcnQge2NyZWF0ZUFwcFN0b3JlfSBmcm9tICcuL3N0b3JlLm1qcyc7XG5pbXBvcnQge3J1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVQYXRoT3B0aW9ucyxcbiAgICB0eXBlIFRQYXRoVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICcuL3ZhbGlkYXRlUGF0aHMubWpzJztcbmltcG9ydCB7VENvbm5lY3Rpb25Db25maWd9IGZyb20gJy4vdHlwZXMvY29ubmVjdGlvbi5tanMnO1xuaW1wb3J0IHtydW59IGZyb20gJy4vYXBwL2luZGV4Lm1qcyc7XG5pbXBvcnQge0NMSUVOVF9WRVJTSU9OfSBmcm9tICcuL2xpYi92ZXJzaW9uLm1qcyc7XG5pbXBvcnQge0RCQ1RYX0RFVn0gZnJvbSAnI2NsaWVudC9saWIvZW52Lm1qcyc7XG5pbXBvcnQge3Njb3BlfSBmcm9tICdzY29wZS11dGlsaXRpZXMnO1xuaW1wb3J0IHt0cnBjfSBmcm9tICcjY2xpZW50L2xpYi90cnBjLm1qcyc7XG5pbXBvcnQge3JlYWRDb25maWd9IGZyb20gJy4vYXBwL2NvbmZpZy5tanMnO1xuaW1wb3J0IHtcbiAgICBkZXRlY3REb2NrZXIsXG4gICAgZGV0ZWN0T1MsXG4gICAgZGV0ZWN0U2hlbGwsXG4gICAgZGV0ZWN0V1NMLFxuICAgIGRldGVjdFN5c3RlbU1lbW9yeSxcbiAgICBkZXRlY3RQYWNrYWdlTWFuYWdlcixcbiAgICBkZXRlY3RTU0hTZXNzaW9uLFxufSBmcm9tICcuL2FwcC9kZXRlY3QubWpzJztcbmltcG9ydCB7bG9nZ2VyfSBmcm9tICcuL2xvZ2dlci5tanMnO1xuXG5leHBvcnQgdHlwZSBUU1NMTW9kZSA9XG4gICAgfCAnZGlzYWJsZSdcbiAgICB8ICdhbGxvdydcbiAgICB8ICdwcmVmZXInXG4gICAgfCAncmVxdWlyZSdcbiAgICB8ICd2ZXJpZnktY2EnXG4gICAgfCAndmVyaWZ5LWZ1bGwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRPcHRpb25zIHtcbiAgICBob3N0bmFtZT86IHN0cmluZztcbiAgICBwb3J0PzogbnVtYmVyO1xuICAgIGRhdGFiYXNlPzogc3RyaW5nO1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIHNzbG1vZGU/OiBUU1NMTW9kZTtcbiAgICBzc2xjZXJ0Pzogc3RyaW5nO1xuICAgIHNzbGtleT86IHN0cmluZztcbiAgICBzc2xyb290Y2VydD86IHN0cmluZztcbiAgICBzc2g/OiBzdHJpbmc7XG4gICAgc3NoSG9zdD86IHN0cmluZztcbiAgICBzc2hQb3J0PzogbnVtYmVyO1xuICAgIHNzaFVzZXJuYW1lPzogc3RyaW5nO1xuICAgIHNzaEtleT86IHN0cmluZztcbn1cblxuY29uc3QgcGFyc2VTU0hUYXJnZXQgPSAoXG4gICAgdGFyZ2V0OiBzdHJpbmcsXG4pOiB7XG4gICAgdXNlcm5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBob3N0OiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IHRhcmdldC5pbmRleE9mKCdAJyk7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBhdEluZGV4ID49IDAgPyB0YXJnZXQuc2xpY2UoMCwgYXRJbmRleCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaG9zdFBvcnQgPSBhdEluZGV4ID49IDAgPyB0YXJnZXQuc2xpY2UoYXRJbmRleCArIDEpIDogdGFyZ2V0O1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBob3N0UG9ydC5sYXN0SW5kZXhPZignOicpO1xuICAgIGNvbnN0IGhvc3QgPSBjb2xvbkluZGV4ID49IDAgPyBob3N0UG9ydC5zbGljZSgwLCBjb2xvbkluZGV4KSA6IGhvc3RQb3J0O1xuICAgIGNvbnN0IHBvcnQgPVxuICAgICAgICBjb2xvbkluZGV4ID49IDBcbiAgICAgICAgICAgID8gcGFyc2VJbnQoaG9zdFBvcnQuc2xpY2UoY29sb25JbmRleCArIDEpLCAxMClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHt1c2VybmFtZSwgaG9zdCwgcG9ydH07XG59O1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuICAgIC5uYW1lKCdkYmN0eCcpXG4gICAgLnZlcnNpb24oQ0xJRU5UX1ZFUlNJT04pXG4gICAgLmhlbHBPcHRpb24oJy0taGVscCcsICdkaXNwbGF5IGhlbHAgZm9yIGNvbW1hbmQnKVxuICAgIC5hZGRIZWxwVGV4dCgnYmVmb3JlQWxsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7dW5tb3VudH0gPSByZW5kZXIoY3JlYXRlRWxlbWVudChTcGxhc2gpKTtcbiAgICAgICAgdW5tb3VudCgpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG5cbmNvbnN0IGdlbmVyYXRlID0gcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdnZW5lcmF0ZScsIHtpc0RlZmF1bHQ6IHRydWV9KVxuICAgIC5kZXNjcmlwdGlvbignQ29ubmVjdCB0byBhIFBvc3RncmVTUUwgZGF0YWJhc2UgYW5kIGdlbmVyYXRlIGNvbnRleHQnKVxuICAgIC5oZWxwT3B0aW9uKCctLWhlbHAnLCAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJylcbiAgICAuYXJndW1lbnQoXG4gICAgICAgICdbY29ubmVjdGlvbi1zdHJpbmddJyxcbiAgICAgICAgJ1Bvc3RncmVTUUwgY29ubmVjdGlvbiBzdHJpbmcgKGVudjogREFUQUJBU0VfVVJMKScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctaCwgLS1ob3N0bmFtZSA8aG9zdD4nLFxuICAgICAgICAnZGF0YWJhc2UgaG9zdG5hbWUgKGVudjogUEdIT1NULCBkZWZhdWx0OiBsb2NhbGhvc3QpJyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy1wLCAtLXBvcnQgPHBvcnQ+JyxcbiAgICAgICAgJ2RhdGFiYXNlIHBvcnQgKGVudjogUEdQT1JULCBkZWZhdWx0OiA1NDMyKScsXG4gICAgICAgIHBhcnNlSW50LFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgICAnLWQsIC0tZGF0YWJhc2UgPG5hbWU+JyxcbiAgICAgICAgJ2RhdGFiYXNlIG5hbWUgKGVudjogUEdEQVRBQkFTRSwgZGVmYXVsdDogcG9zdGdyZXMpJyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy1VLCAtLXVzZXJuYW1lIDx1c2VyPicsXG4gICAgICAgICdkYXRhYmFzZSB1c2VybmFtZSAoZW52OiBQR1VTRVIsIGRlZmF1bHQ6IHBvc3RncmVzKScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctLXNzbG1vZGUgPG1vZGU+JyxcbiAgICAgICAgJ1NTTCBtb2RlOiBkaXNhYmxlfGFsbG93fHByZWZlcnxyZXF1aXJlfHZlcmlmeS1jYXx2ZXJpZnktZnVsbCAoZW52OiBQR1NTTE1PREUsIGRlZmF1bHQ6IHByZWZlciknLFxuICAgIClcbiAgICAub3B0aW9uKCctLXNzbGNlcnQgPHBhdGg+JywgJ3BhdGggdG8gY2xpZW50IGNlcnRpZmljYXRlIChlbnY6IFBHU1NMQ0VSVCknKVxuICAgIC5vcHRpb24oJy0tc3Nsa2V5IDxwYXRoPicsICdwYXRoIHRvIGNsaWVudCBwcml2YXRlIGtleSAoZW52OiBQR1NTTEtFWSknKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctLXNzbHJvb3RjZXJ0IDxwYXRoPicsXG4gICAgICAgICdwYXRoIHRvIHJvb3QgQ0EgY2VydGlmaWNhdGUgKGVudjogUEdTU0xST09UQ0VSVCknLFxuICAgIClcbiAgICAub3B0aW9uKCctLXNzaCA8dGFyZ2V0PicsICdTU0ggdHVubmVsIHRhcmdldCAodXNlckBob3N0Wzpwb3J0XSknKVxuICAgIC5vcHRpb24oJy0tc3NoLWhvc3QgPGhvc3Q+JywgJ1NTSCB0dW5uZWwgaG9zdCAoYmFzdGlvbi9qdW1wIHNlcnZlciknKVxuICAgIC5vcHRpb24oJy0tc3NoLXBvcnQgPHBvcnQ+JywgJ1NTSCB0dW5uZWwgcG9ydCAoZGVmYXVsdDogMjIpJywgcGFyc2VJbnQpXG4gICAgLm9wdGlvbignLS1zc2gtdXNlcm5hbWUgPHVzZXI+JywgJ1NTSCB0dW5uZWwgdXNlcm5hbWUgKGRlZmF1bHQ6ICRVU0VSKScpXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy1pLCAtLXNzaC1rZXkgPHBhdGg+JyxcbiAgICAgICAgJ3BhdGggdG8gU1NIIHByaXZhdGUga2V5IChkZWZhdWx0OiB+Ly5zc2gvaWRfcnNhKScsXG4gICAgKVxuICAgIC5hY3Rpb24oKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9uczogVE9wdGlvbnMpID0+IHtcbiAgICAgICAgLy8gU2hvdyBoZWxwIGlmIG5vIGNvbm5lY3Rpb24gY29uZmlnIGlzIHByb3ZpZGVkXG4gICAgICAgIGNvbnN0IGhhc0NMSUNvbmZpZyA9XG4gICAgICAgICAgICBjb25uZWN0aW9uU3RyaW5nICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG9wdGlvbnMuaG9zdG5hbWUgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG9wdGlvbnMuZGF0YWJhc2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgb3B0aW9ucy51c2VybmFtZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGhhc0VudkNvbmZpZyA9IFtcbiAgICAgICAgICAgICdQR0hPU1QnLFxuICAgICAgICAgICAgJ1BHUE9SVCcsXG4gICAgICAgICAgICAnUEdEQVRBQkFTRScsXG4gICAgICAgICAgICAnUEdVU0VSJyxcbiAgICAgICAgICAgICdQR1BBU1NXT1JEJyxcbiAgICAgICAgICAgICdEQVRBQkFTRV9VUkwnLFxuICAgICAgICBdLnNvbWUoKGtleSkgPT4gcHJvY2Vzcy5lbnZba2V5XSAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBpZiAoIWhhc0NMSUNvbmZpZyAmJiAhaGFzRW52Q29uZmlnKSB7XG4gICAgICAgICAgICBnZW5lcmF0ZS5oZWxwKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBjb25uZWN0aW9uIHN0cmluZ3MgYXJlIFBvc3RncmVTUUwgVVJMc1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVDb25uZWN0aW9uU3RyaW5nID1cbiAgICAgICAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPz8gcHJvY2Vzcy5lbnZbJ0RBVEFCQVNFX1VSTCddO1xuXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdHJpbmdFcnJvciA9IHNjb3BlKGVmZmVjdGl2ZUNvbm5lY3Rpb25TdHJpbmcpXG4gICAgICAgICAgICAubGV0KChzdHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFVUkwuY2FuUGFyc2Uoc3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYE1hbGZvcm1lZCBjb25uZWN0aW9uIHN0cmluZyBcIiR7c3RyfVwiOiBub3QgYSB2YWxpZCBVUkxgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHtwcm90b2NvbH0gPSBuZXcgVVJMKHN0cik7XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sICE9PSAncG9zdGdyZXM6JyAmJiBwcm90b2NvbCAhPT0gJ3Bvc3RncmVzcWw6Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYEludmFsaWQgY29ubmVjdGlvbiBzdHJpbmcgXCIke3N0cn1cIjogZXhwZWN0ZWQgcG9zdGdyZXM6Ly8gb3IgcG9zdGdyZXNxbDovL2A7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnZhbHVlKCk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcGF0aCBvcHRpb25zIGV4aXN0IG9uIGZpbGVzeXN0ZW1cbiAgICAgICAgY29uc3Qge2Vycm9yczogcGF0aEVycm9ycywgZXhwYW5kZWRQYXRoc30gPVxuICAgICAgICAgICAgdmFsaWRhdGVQYXRoT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBpZiAocGF0aEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gcGF0aEVycm9yc1xuICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICh7b3B0aW9uLCBwYXRofTogVFBhdGhWYWxpZGF0aW9uRXJyb3IpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke29wdGlvbn06ICR7cGF0aH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgICAgIHJlbmRlcihcbiAgICAgICAgICAgICAgICBFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgZm9sbG93aW5nIHBhdGhzIGRvIG5vdCBleGlzdDpcXG4ke2Vycm9yTWVzc2FnZXN9YCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2Ugb3JpZ2luYWwgcGF0aHMgd2l0aCBleHBhbmRlZCBwYXRoc1xuICAgICAgICAvLyAofiByZXNvbHZlZCB0byBob21lIGRpcmVjdG9yeSlcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkT3B0aW9uczogVE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgLi4uZXhwYW5kZWRQYXRocyxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBCdWlsZCBjb25maWcgYW5kIHJlbmRlciB0aGUgYXBwXG4gICAgICAgIGNvbnN0IHNzaERlZmF1bHRzID0gdmFsaWRhdGVkT3B0aW9ucy5zc2hcbiAgICAgICAgICAgID8gcGFyc2VTU0hUYXJnZXQodmFsaWRhdGVkT3B0aW9ucy5zc2gpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBjb25maWc6IFRDb25uZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgICAgY29ubmVjdGlvblN0cmluZzogZWZmZWN0aXZlQ29ubmVjdGlvblN0cmluZyxcbiAgICAgICAgICAgIC4uLnZhbGlkYXRlZE9wdGlvbnMsXG4gICAgICAgICAgICBzc2hIb3N0OiB2YWxpZGF0ZWRPcHRpb25zLnNzaEhvc3QgPz8gc3NoRGVmYXVsdHM/Lmhvc3QsXG4gICAgICAgICAgICBzc2hQb3J0OiB2YWxpZGF0ZWRPcHRpb25zLnNzaFBvcnQgPz8gc3NoRGVmYXVsdHM/LnBvcnQsXG4gICAgICAgICAgICBzc2hVc2VybmFtZTogdmFsaWRhdGVkT3B0aW9ucy5zc2hVc2VybmFtZSA/PyBzc2hEZWZhdWx0cz8udXNlcm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVBcHBTdG9yZShjb25maWcpO1xuXG4gICAgICAgIHJlbmRlcihjcmVhdGVFbGVtZW50KEFwcCwge3N0b3JlfSkpO1xuXG4gICAgICAgIGlmIChjb25uZWN0aW9uU3RyaW5nRXJyb3IpIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5lcnJvciA9IGNvbm5lY3Rpb25TdHJpbmdFcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVuKHN0b3JlKTtcbiAgICB9KTtcblxuY29uc3QgZmlyZVJ1blRlbGVtZXRyeSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkb05vdFRyYWNrID0gYCR7cHJvY2Vzcy5lbnZbJ0RPX05PVF9UUkFDSyddfWAudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChkb05vdFRyYWNrID09PSAnMScgfHwgZG9Ob3RUcmFjayA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICAgIGNvbnN0IGlzSGVscCA9IGFyZ3MuaW5jbHVkZXMoJy0taGVscCcpIHx8IGFyZ3NbMF0gPT09ICdoZWxwJztcbiAgICBjb25zdCBzdWJjb21tYW5kID0gaXNIZWxwID8gJ2hlbHAnIDogJ2dlbmVyYXRlJztcblxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWRDb25maWcoKTtcblxuICAgIHJldHVybiB0cnBjLnRlbGVtZXRyeS5jcmVhdGUubXV0YXRlKHtcbiAgICAgICAgdHlwZTogJ2NsaS5ydW4nLFxuICAgICAgICBzdWJjb21tYW5kLFxuICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgaGVscDogaXNIZWxwLFxuICAgICAgICAgICAgY29ubmVjdGlvbl9zdHJpbmc6IGFyZ3Muc29tZShcbiAgICAgICAgICAgICAgICAoYSkgPT4gIWEuc3RhcnRzV2l0aCgnLScpICYmIGEgIT09ICdnZW5lcmF0ZScgJiYgYSAhPT0gJ2hlbHAnLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGhvc3RuYW1lOiBhcmdzLmluY2x1ZGVzKCctaCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy0taG9zdG5hbWUnKSxcbiAgICAgICAgICAgIHBvcnQ6IGFyZ3MuaW5jbHVkZXMoJy1wJykgfHwgYXJncy5pbmNsdWRlcygnLS1wb3J0JyksXG4gICAgICAgICAgICBkYXRhYmFzZTogYXJncy5pbmNsdWRlcygnLWQnKSB8fCBhcmdzLmluY2x1ZGVzKCctLWRhdGFiYXNlJyksXG4gICAgICAgICAgICB1c2VybmFtZTogYXJncy5pbmNsdWRlcygnLVUnKSB8fCBhcmdzLmluY2x1ZGVzKCctLXVzZXJuYW1lJyksXG4gICAgICAgICAgICBzc2w6IFsnLS1zc2xtb2RlJywgJy0tc3NsY2VydCcsICctLXNzbGtleScsICctLXNzbHJvb3RjZXJ0J10uc29tZShcbiAgICAgICAgICAgICAgICAoZikgPT4gYXJncy5pbmNsdWRlcyhmKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzc2g6IGFyZ3MuaW5jbHVkZXMoJy0tc3NoJykgfHwgYXJncy5pbmNsdWRlcygnLS1zc2gtaG9zdCcpLFxuICAgICAgICB9LFxuICAgICAgICBpc19kb2NrZXI6IGRldGVjdERvY2tlcigpLFxuICAgICAgICBpc19zc2hfc2Vzc2lvbjogZGV0ZWN0U1NIU2Vzc2lvbigpLFxuICAgICAgICBzaGVsbDogZGV0ZWN0U2hlbGwoKSxcbiAgICAgICAgb3M6IGRldGVjdE9TKCksXG4gICAgICAgIGlzX3dzbDogZGV0ZWN0V1NMKCksXG4gICAgICAgIHN5c3RlbV9tZW1vcnk6IGRldGVjdFN5c3RlbU1lbW9yeSgpLFxuICAgICAgICBwYWNrYWdlX21hbmFnZXI6IGRldGVjdFBhY2thZ2VNYW5hZ2VyKCksXG4gICAgICAgIGRldmljZV9pZDogY29uZmlnLmRldmljZV9pZCxcbiAgICB9KTtcbn07XG5cbnRyeSB7XG4gICAgYXdhaXQgZmlyZVJ1blRlbGVtZXRyeSgpO1xufSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKERCQ1RYX0RFVikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYCR7ZXJyfWAsIHtlcnJvcjogZXJyfSk7XG4gICAgfVxufVxuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiaW5kZXgubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNwQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUNILGNBQWMsRUFDZCxpQkFBaUIsR0FFcEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGFBQWEsR0FFaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUNILFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNY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L3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7Q29tbWFuZH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7cmVuZGVyfSBmcm9tICdpbmsnO1xuaW1wb3J0IHtjcmVhdGVFbGVtZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0Vycm9yfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvRXJyb3IuanMnO1xuaW1wb3J0IHtBcHB9IGZyb20gJy4vdWkvQXBwLmpzJztcbmltcG9ydCB7U3BsYXNofSBmcm9tICcuL3VpL2NvbXBvbmVudHMvU3BsYXNoLmpzJztcbmltcG9ydCB7XG4gICAgY3JlYXRlQXBwU3RvcmUsXG4gICAgU1RPUF9BRlRFUl9TVEFHRVMsXG4gICAgdHlwZSBUU3RvcEFmdGVyU3RhZ2UsXG59IGZyb20gJy4vc3RvcmUubWpzJztcbmltcG9ydCB7cnVuSW5BY3Rpb259IGZyb20gJ21vYngnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVBhdGhPcHRpb25zLFxuICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgdHlwZSBUUGF0aFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSAnLi92YWxpZGF0ZVBhdGhzLm1qcyc7XG5pbXBvcnQge1RDb25uZWN0aW9uQ29uZmlnfSBmcm9tICcuL3R5cGVzL2Nvbm5lY3Rpb24ubWpzJztcbmltcG9ydCB7cnVuRmxvd30gZnJvbSAnLi9mbG93L3J1bi5tanMnO1xuaW1wb3J0IHtydW5MaXN0fSBmcm9tICcuL2FwcC9saXN0Lm1qcyc7XG5pbXBvcnQge3J1bkxvZ2lufSBmcm9tICcuL2FwcC9sb2dpbi5tanMnO1xuaW1wb3J0IHtDTElFTlRfVkVSU0lPTn0gZnJvbSAnLi9saWIvdmVyc2lvbi5tanMnO1xuaW1wb3J0IHtEQkNUWF9ERVZ9IGZyb20gJy4vbGliL2Vudi5tanMnO1xuaW1wb3J0IHtzY29wZX0gZnJvbSAnc2NvcGUtdXRpbGl0aWVzJztcbmltcG9ydCB7dHJwY30gZnJvbSAnLi9saWIvdHJwYy5tanMnO1xuaW1wb3J0IHtyZWFkQ29uZmlnLCBmbHVzaENvbmZpZ30gZnJvbSAnLi9hcHAvY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICAgIGRldGVjdERvY2tlcixcbiAgICBkZXRlY3RPUyxcbiAgICBkZXRlY3RTaGVsbCxcbiAgICBkZXRlY3RXU0wsXG4gICAgZGV0ZWN0U3lzdGVtTWVtb3J5LFxuICAgIGRldGVjdFBhY2thZ2VNYW5hZ2VyLFxuICAgIGRldGVjdFNTSFNlc3Npb24sXG59IGZyb20gJy4vYXBwL2RldGVjdC5tanMnO1xuaW1wb3J0IHtsb2dnZXJ9IGZyb20gJy4vbG9nZ2VyLm1qcyc7XG5cbmV4cG9ydCB0eXBlIFRTU0xNb2RlID1cbiAgICB8ICdkaXNhYmxlJ1xuICAgIHwgJ2FsbG93J1xuICAgIHwgJ3ByZWZlcidcbiAgICB8ICdyZXF1aXJlJ1xuICAgIHwgJ3ZlcmlmeS1jYSdcbiAgICB8ICd2ZXJpZnktZnVsbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVE9wdGlvbnMge1xuICAgIGhvc3RuYW1lPzogc3RyaW5nO1xuICAgIHBvcnQ/OiBudW1iZXI7XG4gICAgZGF0YWJhc2U/OiBzdHJpbmc7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgc3NsbW9kZT86IFRTU0xNb2RlO1xuICAgIHNzbGNlcnQ/OiBzdHJpbmc7XG4gICAgc3Nsa2V5Pzogc3RyaW5nO1xuICAgIHNzbHJvb3RjZXJ0Pzogc3RyaW5nO1xuICAgIHNzaD86IHN0cmluZztcbiAgICBzc2hIb3N0Pzogc3RyaW5nO1xuICAgIHNzaFBvcnQ/OiBudW1iZXI7XG4gICAgc3NoVXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgc3NoS2V5Pzogc3RyaW5nO1xuICAgIG91dHB1dEludHJvc3BlY3Rpb25Kc29uPzogc3RyaW5nO1xuICAgIHVzZUludHJvc3BlY3Rpb25Kc29uPzogc3RyaW5nO1xuICAgIHN0b3BBZnRlcj86IFRTdG9wQWZ0ZXJTdGFnZTtcbiAgICBhbGxvd092ZXJ3cml0ZT86IGJvb2xlYW47XG4gICAgYWxsb3dJbnRyb3NwZWN0aW9uSnNvbk92ZXJ3cml0ZT86IGJvb2xlYW47XG4gICAgZXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gICAgc2Vuc2l0aXZlTWFzaz86IHN0cmluZztcbiAgICBvdXRwdXRTYW1wbGVzPzogc3RyaW5nO1xuICAgIGFsbG93U2FtcGxlT3ZlcndyaXRlPzogYm9vbGVhbjtcbiAgICBza2lwQW5hbHl6ZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IHBhcnNlU1NIVGFyZ2V0ID0gKFxuICAgIHRhcmdldDogc3RyaW5nLFxuKToge1xuICAgIHVzZXJuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbn0gPT4ge1xuICAgIGNvbnN0IGF0SW5kZXggPSB0YXJnZXQuaW5kZXhPZignQCcpO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gYXRJbmRleCA+PSAwID8gdGFyZ2V0LnNsaWNlKDAsIGF0SW5kZXgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhvc3RQb3J0ID0gYXRJbmRleCA+PSAwID8gdGFyZ2V0LnNsaWNlKGF0SW5kZXggKyAxKSA6IHRhcmdldDtcbiAgICBjb25zdCBjb2xvbkluZGV4ID0gaG9zdFBvcnQubGFzdEluZGV4T2YoJzonKTtcbiAgICBjb25zdCBob3N0ID0gY29sb25JbmRleCA+PSAwID8gaG9zdFBvcnQuc2xpY2UoMCwgY29sb25JbmRleCkgOiBob3N0UG9ydDtcbiAgICBjb25zdCBwb3J0ID1cbiAgICAgICAgY29sb25JbmRleCA+PSAwXG4gICAgICAgICAgICA/IHBhcnNlSW50KGhvc3RQb3J0LnNsaWNlKGNvbG9uSW5kZXggKyAxKSwgMTApXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7dXNlcm5hbWUsIGhvc3QsIHBvcnR9O1xufTtcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgICAubmFtZSgnZGJjdHgnKVxuICAgIC52ZXJzaW9uKENMSUVOVF9WRVJTSU9OKVxuICAgIC5oZWxwT3B0aW9uKCctLWhlbHAnLCAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJylcbiAgICAuYWRkSGVscFRleHQoJ2JlZm9yZUFsbCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qge3VubW91bnR9ID0gcmVuZGVyKGNyZWF0ZUVsZW1lbnQoU3BsYXNoKSk7XG4gICAgICAgIHVubW91bnQoKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG5jb25zdCBnZW5lcmF0ZSA9IHByb2dyYW1cbiAgICAuY29tbWFuZCgnZ2VuZXJhdGUnLCB7aXNEZWZhdWx0OiB0cnVlfSlcbiAgICAuZGVzY3JpcHRpb24oJ0Nvbm5lY3QgdG8gYSBQb3N0Z3JlU1FMIGRhdGFiYXNlIGFuZCBnZW5lcmF0ZSBjb250ZXh0JylcbiAgICAuaGVscE9wdGlvbignLS1oZWxwJywgJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCcpXG4gICAgLmFyZ3VtZW50KFxuICAgICAgICAnW2Nvbm5lY3Rpb24tc3RyaW5nXScsXG4gICAgICAgICdQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gc3RyaW5nIChlbnY6IERBVEFCQVNFX1VSTCknLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgICAnLWgsIC0taG9zdG5hbWUgPGhvc3Q+JyxcbiAgICAgICAgJ2RhdGFiYXNlIGhvc3RuYW1lIChlbnY6IFBHSE9TVCwgZGVmYXVsdDogbG9jYWxob3N0KScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctcCwgLS1wb3J0IDxwb3J0PicsXG4gICAgICAgICdkYXRhYmFzZSBwb3J0IChlbnY6IFBHUE9SVCwgZGVmYXVsdDogNTQzMiknLFxuICAgICAgICBwYXJzZUludCxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy1kLCAtLWRhdGFiYXNlIDxuYW1lPicsXG4gICAgICAgICdkYXRhYmFzZSBuYW1lIChlbnY6IFBHREFUQUJBU0UsIGRlZmF1bHQ6IHBvc3RncmVzKScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctVSwgLS11c2VybmFtZSA8dXNlcj4nLFxuICAgICAgICAnZGF0YWJhc2UgdXNlcm5hbWUgKGVudjogUEdVU0VSLCBkZWZhdWx0OiBwb3N0Z3JlcyknLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgICAnLS1zc2xtb2RlIDxtb2RlPicsXG4gICAgICAgICdTU0wgbW9kZTogZGlzYWJsZXxhbGxvd3xwcmVmZXJ8cmVxdWlyZXx2ZXJpZnktY2F8dmVyaWZ5LWZ1bGwgKGVudjogUEdTU0xNT0RFLCBkZWZhdWx0OiBwcmVmZXIpJyxcbiAgICApXG4gICAgLm9wdGlvbignLS1zc2xjZXJ0IDxwYXRoPicsICdwYXRoIHRvIGNsaWVudCBjZXJ0aWZpY2F0ZSAoZW52OiBQR1NTTENFUlQpJylcbiAgICAub3B0aW9uKCctLXNzbGtleSA8cGF0aD4nLCAncGF0aCB0byBjbGllbnQgcHJpdmF0ZSBrZXkgKGVudjogUEdTU0xLRVkpJylcbiAgICAub3B0aW9uKFxuICAgICAgICAnLS1zc2xyb290Y2VydCA8cGF0aD4nLFxuICAgICAgICAncGF0aCB0byByb290IENBIGNlcnRpZmljYXRlIChlbnY6IFBHU1NMUk9PVENFUlQpJyxcbiAgICApXG4gICAgLm9wdGlvbignLS1zc2ggPHRhcmdldD4nLCAnU1NIIHR1bm5lbCB0YXJnZXQgKHVzZXJAaG9zdFs6cG9ydF0pJylcbiAgICAub3B0aW9uKCctLXNzaC1ob3N0IDxob3N0PicsICdTU0ggdHVubmVsIGhvc3QgKGJhc3Rpb24vanVtcCBzZXJ2ZXIpJylcbiAgICAub3B0aW9uKCctLXNzaC1wb3J0IDxwb3J0PicsICdTU0ggdHVubmVsIHBvcnQgKGRlZmF1bHQ6IDIyKScsIHBhcnNlSW50KVxuICAgIC5vcHRpb24oJy0tc3NoLXVzZXJuYW1lIDx1c2VyPicsICdTU0ggdHVubmVsIHVzZXJuYW1lIChkZWZhdWx0OiAkVVNFUiknKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctaSwgLS1zc2gta2V5IDxwYXRoPicsXG4gICAgICAgICdwYXRoIHRvIFNTSCBwcml2YXRlIGtleSAoZGVmYXVsdDogfi8uc3NoL2lkX3JzYSknLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgICAnLS1vdXRwdXQtaW50cm9zcGVjdGlvbi1qc29uIDxwYXRoPicsXG4gICAgICAgICd3cml0ZSBpbnRyb3NwZWN0aW9uIEpTT04gdG8gZmlsZScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctLXVzZS1pbnRyb3NwZWN0aW9uLWpzb24gPHBhdGg+JyxcbiAgICAgICAgJ2xvYWQgaW50cm9zcGVjdGlvbiBmcm9tIGEgcHJldmlvdXNseS1zYXZlZCBKU09OIGZpbGUgKHNraXBzIGxpdmUgaW50cm9zcGVjdGlvbjsgc3RpbGwgY29ubmVjdHMgdG8gREIgdG8gdmVyaWZ5IGlkZW50aXR5KScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctLXN0b3AtYWZ0ZXIgPHN0YWdlPicsXG4gICAgICAgICdleGl0IGFmdGVyIHN0YWdlIGNvbXBsZXRlcyAoc3NoLWNvbm5lY3QsIGRiLWNvbm5lY3QsIGludHJvc3BlY3Rpb24sIHNhbXBsaW5nKScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAgICctLWFsbG93LW92ZXJ3cml0ZScsXG4gICAgICAgICdza2lwIG92ZXJ3cml0ZSBjb25maXJtYXRpb24gZm9yIGFsbCBvdXRwdXQgZmlsZXMgKHVtYnJlbGxhIGZvciAtLWFsbG93LWludHJvc3BlY3Rpb24tanNvbi1vdmVyd3JpdGUgYW5kIC0tYWxsb3ctc2FtcGxlLW92ZXJ3cml0ZSknLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgICAnLS1hbGxvdy1pbnRyb3NwZWN0aW9uLWpzb24tb3ZlcndyaXRlJyxcbiAgICAgICAgJ3NraXAgb3ZlcndyaXRlIGNvbmZpcm1hdGlvbiBmb3IgdGhlIGludHJvc3BlY3Rpb24gSlNPTiBmaWxlJyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy0tZXhwbGFuYXRpb24gPHRleHQ+JyxcbiAgICAgICAgJ3Byb3ZpZGUgZGF0YWJhc2UgZXhwbGFuYXRpb24gKHNraXBzIGludGVyYWN0aXZlIHByb21wdCknLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgICAnLS1zZW5zaXRpdmUtbWFzayA8cGF0aD4nLFxuICAgICAgICAncGF0aCB0byBzZW5zaXRpdmUtbWFzay5qc29uIGZvciBjb2x1bW4gZXhjbHVzaW9uJyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy0tb3V0cHV0LXNhbXBsZXMgPGRpcj4nLFxuICAgICAgICAnZGlyZWN0b3J5IGZvciBzYW1wbGUgb3V0cHV0IGZpbGVzIChhY3RpdmF0ZXMgc2FtcGxpbmcgc3RhZ2UpJyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy0tYWxsb3ctc2FtcGxlLW92ZXJ3cml0ZScsXG4gICAgICAgICdza2lwIG92ZXJ3cml0ZSBjb25maXJtYXRpb24gZm9yIHNhbXBsZSBvdXRwdXQgZGlyZWN0b3J5JyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICAgJy0tc2tpcC1hbmFseXplJyxcbiAgICAgICAgJ3NraXAgcnVubmluZyBBTkFMWVpFIG9uIHRhYmxlcyBkdXJpbmcgaW50cm9zcGVjdGlvbiAodXNlcyBleGlzdGluZyBwbGFubmVyIHN0YXRpc3RpY3MpJyxcbiAgICApXG4gICAgLmFjdGlvbihhc3luYyAoY29ubmVjdGlvblN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zOiBUT3B0aW9ucykgPT4ge1xuICAgICAgICAvLyBTaG93IGhlbHAgaWYgbm8gY29ubmVjdGlvbiBjb25maWcgaXMgcHJvdmlkZWRcbiAgICAgICAgY29uc3QgaGFzQ0xJQ29uZmlnID1cbiAgICAgICAgICAgIGNvbm5lY3Rpb25TdHJpbmcgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5ob3N0bmFtZSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5kYXRhYmFzZSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBvcHRpb25zLnVzZXJuYW1lICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgaGFzRW52Q29uZmlnID0gW1xuICAgICAgICAgICAgJ1BHSE9TVCcsXG4gICAgICAgICAgICAnUEdQT1JUJyxcbiAgICAgICAgICAgICdQR0RBVEFCQVNFJyxcbiAgICAgICAgICAgICdQR1VTRVInLFxuICAgICAgICAgICAgJ1BHUEFTU1dPUkQnLFxuICAgICAgICAgICAgJ0RBVEFCQVNFX1VSTCcsXG4gICAgICAgIF0uc29tZSgoa2V5KSA9PiBwcm9jZXNzLmVudltrZXldICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGlmICghaGFzQ0xJQ29uZmlnICYmICFoYXNFbnZDb25maWcpIHtcbiAgICAgICAgICAgIGdlbmVyYXRlLmhlbHAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbm5lY3Rpb24gc3RyaW5ncyBhcmUgUG9zdGdyZVNRTCBVUkxzXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUNvbm5lY3Rpb25TdHJpbmcgPVxuICAgICAgICAgICAgY29ubmVjdGlvblN0cmluZyA/PyBwcm9jZXNzLmVudlsnREFUQUJBU0VfVVJMJ107XG5cbiAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZ0Vycm9yID0gc2NvcGUoZWZmZWN0aXZlQ29ubmVjdGlvblN0cmluZylcbiAgICAgICAgICAgIC5sZXQoKHN0cikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIVVSTC5jYW5QYXJzZShzdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgTWFsZm9ybWVkIGNvbm5lY3Rpb24gc3RyaW5nIFwiJHtzdHJ9XCI6IG5vdCBhIHZhbGlkIFVSTGA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qge3Byb3RvY29sfSA9IG5ldyBVUkwoc3RyKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgIT09ICdwb3N0Z3JlczonICYmIHByb3RvY29sICE9PSAncG9zdGdyZXNxbDonKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgSW52YWxpZCBjb25uZWN0aW9uIHN0cmluZyBcIiR7c3RyfVwiOiBleHBlY3RlZCBwb3N0Z3JlczovLyBvciBwb3N0Z3Jlc3FsOi8vYDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudmFsdWUoKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBwYXRoIG9wdGlvbnMgZXhpc3Qgb24gZmlsZXN5c3RlbVxuICAgICAgICBjb25zdCB7ZXJyb3JzOiBwYXRoRXJyb3JzLCBleHBhbmRlZFBhdGhzfSA9XG4gICAgICAgICAgICB2YWxpZGF0ZVBhdGhPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChwYXRoRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBwYXRoRXJyb3JzXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHtvcHRpb24sIHBhdGh9OiBUUGF0aFZhbGlkYXRpb25FcnJvcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7b3B0aW9ufTogJHtwYXRofWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgICAgIEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFRoZSBmb2xsb3dpbmcgcGF0aHMgZG8gbm90IGV4aXN0OlxcbiR7ZXJyb3JNZXNzYWdlc31gLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVwbGFjZSBvcmlnaW5hbCBwYXRocyB3aXRoIGV4cGFuZGVkIHBhdGhzXG4gICAgICAgIC8vICh+IHJlc29sdmVkIHRvIGhvbWUgZGlyZWN0b3J5KVxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRPcHRpb25zOiBUT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAuLi5leHBhbmRlZFBhdGhzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHZhbGlkYXRlZE9wdGlvbnMudXNlSW50cm9zcGVjdGlvbkpzb24gJiZcbiAgICAgICAgICAgIHZhbGlkYXRlZE9wdGlvbnMub3V0cHV0SW50cm9zcGVjdGlvbkpzb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgJy0tdXNlLWludHJvc3BlY3Rpb24tanNvbiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtLW91dHB1dC1pbnRyb3NwZWN0aW9uLWpzb24gKGN5Y2xpYykuJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsaWRhdGVkT3B0aW9ucy51c2VJbnRyb3NwZWN0aW9uSnNvbikge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlZE9wdGlvbnMuc2tpcEFuYWx5emUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgJy0tc2tpcC1hbmFseXplIGlzIGEgbm8tb3Agd2hlbiAtLXVzZS1pbnRyb3NwZWN0aW9uLWpzb24gaXMgc2V0JyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBvdXRwdXQgaW50cm9zcGVjdGlvbiBwYXRoXG4gICAgICAgIGNvbnN0IHJlc29sdmVkT3V0cHV0UGF0aCA9IHZhbGlkYXRlZE9wdGlvbnMub3V0cHV0SW50cm9zcGVjdGlvbkpzb25cbiAgICAgICAgICAgID8gbm9ybWFsaXplUGF0aCh2YWxpZGF0ZWRPcHRpb25zLm91dHB1dEludHJvc3BlY3Rpb25Kc29uKVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkVXNlSW50cm9zcGVjdGlvblBhdGggPVxuICAgICAgICAgICAgdmFsaWRhdGVkT3B0aW9ucy51c2VJbnRyb3NwZWN0aW9uSnNvbiAmJlxuICAgICAgICAgICAgZXhwYW5kZWRQYXRocy51c2VJbnRyb3NwZWN0aW9uSnNvblxuICAgICAgICAgICAgICAgID8gZXhwYW5kZWRQYXRocy51c2VJbnRyb3NwZWN0aW9uSnNvblxuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAvLyBCdWlsZCBjb25maWcgYW5kIHJlbmRlciB0aGUgYXBwXG4gICAgICAgIGNvbnN0IHNzaERlZmF1bHRzID0gdmFsaWRhdGVkT3B0aW9ucy5zc2hcbiAgICAgICAgICAgID8gcGFyc2VTU0hUYXJnZXQodmFsaWRhdGVkT3B0aW9ucy5zc2gpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBjb25maWc6IFRDb25uZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgICAgY29ubmVjdGlvblN0cmluZzogZWZmZWN0aXZlQ29ubmVjdGlvblN0cmluZyxcbiAgICAgICAgICAgIC4uLnZhbGlkYXRlZE9wdGlvbnMsXG4gICAgICAgICAgICBzc2hIb3N0OiB2YWxpZGF0ZWRPcHRpb25zLnNzaEhvc3QgPz8gc3NoRGVmYXVsdHM/Lmhvc3QsXG4gICAgICAgICAgICBzc2hQb3J0OiB2YWxpZGF0ZWRPcHRpb25zLnNzaFBvcnQgPz8gc3NoRGVmYXVsdHM/LnBvcnQsXG4gICAgICAgICAgICBzc2hVc2VybmFtZTogdmFsaWRhdGVkT3B0aW9ucy5zc2hVc2VybmFtZSA/PyBzc2hEZWZhdWx0cz8udXNlcm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RvcEFmdGVyID0gdmFsaWRhdGVkT3B0aW9ucy5zdG9wQWZ0ZXIgPz8gbnVsbDtcblxuICAgICAgICBpZiAoc3RvcEFmdGVyICE9PSBudWxsICYmICFTVE9QX0FGVEVSX1NUQUdFUy5pbmNsdWRlcyhzdG9wQWZ0ZXIpKSB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCAtLXN0b3AtYWZ0ZXIgc3RhZ2UgXCIke3N0b3BBZnRlcn1cIi4gVmFsaWQgc3RhZ2VzOiAke1NUT1BfQUZURVJfU1RBR0VTLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZE91dHB1dFNhbXBsZXMgPSB2YWxpZGF0ZWRPcHRpb25zLm91dHB1dFNhbXBsZXNcbiAgICAgICAgICAgID8gbm9ybWFsaXplUGF0aCh2YWxpZGF0ZWRPcHRpb25zLm91dHB1dFNhbXBsZXMpXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRTZW5zaXRpdmVNYXNrID1cbiAgICAgICAgICAgIHZhbGlkYXRlZE9wdGlvbnMuc2Vuc2l0aXZlTWFzayAmJiBleHBhbmRlZFBhdGhzLnNlbnNpdGl2ZU1hc2tcbiAgICAgICAgICAgICAgICA/IGV4cGFuZGVkUGF0aHMuc2Vuc2l0aXZlTWFza1xuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBpZiAoc3RvcEFmdGVyID09PSAnc2FtcGxpbmcnICYmIHJlc29sdmVkT3V0cHV0U2FtcGxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgICAgIEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICctLXN0b3AtYWZ0ZXI9c2FtcGxpbmcgcmVxdWlyZXMgLS1vdXRwdXQtc2FtcGxlcyB0byBiZSBzZXQnLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsbG93T3ZlcndyaXRlVW1icmVsbGEgPSB2YWxpZGF0ZWRPcHRpb25zLmFsbG93T3ZlcndyaXRlID8/IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlQXBwU3RvcmUoY29uZmlnLCB7XG4gICAgICAgICAgICBvdXRwdXRJbnRyb3NwZWN0aW9uSnNvbjogcmVzb2x2ZWRPdXRwdXRQYXRoLFxuICAgICAgICAgICAgdXNlSW50cm9zcGVjdGlvbkpzb25QYXRoOiByZXNvbHZlZFVzZUludHJvc3BlY3Rpb25QYXRoLFxuICAgICAgICAgICAgc3RvcEFmdGVyLFxuICAgICAgICAgICAgYWxsb3dJbnRyb3NwZWN0aW9uSnNvbk92ZXJ3cml0ZTpcbiAgICAgICAgICAgICAgICAodmFsaWRhdGVkT3B0aW9ucy5hbGxvd0ludHJvc3BlY3Rpb25Kc29uT3ZlcndyaXRlID8/IGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgIGFsbG93T3ZlcndyaXRlVW1icmVsbGEsXG4gICAgICAgICAgICBleHBsYW5hdGlvbjogdmFsaWRhdGVkT3B0aW9ucy5leHBsYW5hdGlvbiA/PyBudWxsLFxuICAgICAgICAgICAgc2Vuc2l0aXZlTWFza1BhdGg6IHJlc29sdmVkU2Vuc2l0aXZlTWFzayxcbiAgICAgICAgICAgIG91dHB1dFNhbXBsZXNEaXI6IHJlc29sdmVkT3V0cHV0U2FtcGxlcyxcbiAgICAgICAgICAgIGFsbG93U2FtcGxlT3ZlcndyaXRlOlxuICAgICAgICAgICAgICAgICh2YWxpZGF0ZWRPcHRpb25zLmFsbG93U2FtcGxlT3ZlcndyaXRlID8/IGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgIGFsbG93T3ZlcndyaXRlVW1icmVsbGEsXG4gICAgICAgICAgICBza2lwQW5hbHl6ZTogdmFsaWRhdGVkT3B0aW9ucy5za2lwQW5hbHl6ZSA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5rQXBwID0gcmVuZGVyKGNyZWF0ZUVsZW1lbnQoQXBwLCB7c3RvcmV9KSk7XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb25TdHJpbmdFcnJvcikge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLmVycm9yID0gY29ubmVjdGlvblN0cmluZ0Vycm9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBydW5GbG93KHN0b3JlKTtcbiAgICAgICAgYXdhaXQgaW5rQXBwLndhaXRVbnRpbEV4aXQoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2xpc3QnKVxuICAgIC5kZXNjcmlwdGlvbihcbiAgICAgICAgJ0xpc3QgZGF0YWJhc2VzIGluIHlvdXIgYWNjb3VudCBhbmQgcGljayBvbmUgdG8gbW9uaXRvciBvciByZXN1bWUnLFxuICAgIClcbiAgICAuaGVscE9wdGlvbignLS1oZWxwJywgJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCcpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlQXBwU3RvcmUoXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbnRyb3NwZWN0aW9uSnNvbjogbnVsbCxcbiAgICAgICAgICAgICAgICB1c2VJbnRyb3NwZWN0aW9uSnNvblBhdGg6IG51bGwsXG4gICAgICAgICAgICAgICAgc3RvcEFmdGVyOiBudWxsLFxuICAgICAgICAgICAgICAgIGFsbG93SW50cm9zcGVjdGlvbkpzb25PdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIHNlbnNpdGl2ZU1hc2tQYXRoOiBudWxsLFxuICAgICAgICAgICAgICAgIG91dHB1dFNhbXBsZXNEaXI6IG51bGwsXG4gICAgICAgICAgICAgICAgYWxsb3dTYW1wbGVPdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNraXBBbmFseXplOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5rQXBwID0gcmVuZGVyKGNyZWF0ZUVsZW1lbnQoQXBwLCB7c3RvcmV9KSk7XG4gICAgICAgIHJ1bkxpc3Qoc3RvcmUsIGlua0FwcCk7XG4gICAgICAgIGF3YWl0IGlua0FwcC53YWl0VW50aWxFeGl0KCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcblxucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdsb2dpbicpXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRoZW50aWNhdGUgdGhlIENMSSB3aXRoIHlvdXIgZGJjdHguaW8gYWNjb3VudCcpXG4gICAgLmhlbHBPcHRpb24oJy0taGVscCcsICdkaXNwbGF5IGhlbHAgZm9yIGNvbW1hbmQnKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBydW5Mb2dpbigpO1xuICAgIH0pO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2xvZ291dCcpXG4gICAgLmRlc2NyaXB0aW9uKCdDbGVhciB0aGUgc3RvcmVkIGF1dGhlbnRpY2F0aW9uIHRva2VuJylcbiAgICAuaGVscE9wdGlvbignLS1oZWxwJywgJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCcpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGZsdXNoQ29uZmlnKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMb2dnZWQgb3V0IOKAlCBhdXRoIHRva2VuIGNsZWFyZWQuJyk7XG4gICAgfSk7XG5cbmNvbnN0IGZpcmVSdW5UZWxlbWV0cnkgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZG9Ob3RUcmFjayA9IGAke3Byb2Nlc3MuZW52WydET19OT1RfVFJBQ0snXX1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoZG9Ob3RUcmFjayA9PT0gJzEnIHx8IGRvTm90VHJhY2sgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBjb25zdCBpc0hlbHAgPSBhcmdzLmluY2x1ZGVzKCctLWhlbHAnKSB8fCBhcmdzWzBdID09PSAnaGVscCc7XG4gICAgY29uc3QgaXNMb2dvdXQgPSBhcmdzWzBdID09PSAnbG9nb3V0JztcbiAgICBjb25zdCBpc0xvZ2luID0gYXJnc1swXSA9PT0gJ2xvZ2luJztcbiAgICBjb25zdCBpc0xpc3QgPSBhcmdzWzBdID09PSAnbGlzdCc7XG4gICAgY29uc3Qgc3ViY29tbWFuZCA9IGlzSGVscFxuICAgICAgICA/ICdoZWxwJ1xuICAgICAgICA6IGlzTG9nb3V0XG4gICAgICAgICAgPyAnbG9nb3V0J1xuICAgICAgICAgIDogaXNMb2dpblxuICAgICAgICAgICAgPyAnbG9naW4nXG4gICAgICAgICAgICA6IGlzTGlzdFxuICAgICAgICAgICAgICA/ICdsaXN0J1xuICAgICAgICAgICAgICA6ICdnZW5lcmF0ZSc7XG5cbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkQ29uZmlnKCk7XG5cbiAgICByZXR1cm4gdHJwYy50ZWxlbWV0cnkuY3JlYXRlLm11dGF0ZSh7XG4gICAgICAgIHR5cGU6ICdjbGkucnVuJyxcbiAgICAgICAgc3ViY29tbWFuZCxcbiAgICAgICAgZmxhZ3M6IHtcbiAgICAgICAgICAgIGhlbHA6IGlzSGVscCxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25fc3RyaW5nOiBhcmdzLnNvbWUoXG4gICAgICAgICAgICAgICAgKGEpID0+ICFhLnN0YXJ0c1dpdGgoJy0nKSAmJiBhICE9PSAnZ2VuZXJhdGUnICYmIGEgIT09ICdoZWxwJyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBob3N0bmFtZTogYXJncy5pbmNsdWRlcygnLWgnKSB8fCBhcmdzLmluY2x1ZGVzKCctLWhvc3RuYW1lJyksXG4gICAgICAgICAgICBwb3J0OiBhcmdzLmluY2x1ZGVzKCctcCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy0tcG9ydCcpLFxuICAgICAgICAgICAgZGF0YWJhc2U6IGFyZ3MuaW5jbHVkZXMoJy1kJykgfHwgYXJncy5pbmNsdWRlcygnLS1kYXRhYmFzZScpLFxuICAgICAgICAgICAgdXNlcm5hbWU6IGFyZ3MuaW5jbHVkZXMoJy1VJykgfHwgYXJncy5pbmNsdWRlcygnLS11c2VybmFtZScpLFxuICAgICAgICAgICAgc3NsOiBbJy0tc3NsbW9kZScsICctLXNzbGNlcnQnLCAnLS1zc2xrZXknLCAnLS1zc2xyb290Y2VydCddLnNvbWUoXG4gICAgICAgICAgICAgICAgKGYpID0+IGFyZ3MuaW5jbHVkZXMoZiksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3NoOiBhcmdzLmluY2x1ZGVzKCctLXNzaCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy0tc3NoLWhvc3QnKSxcbiAgICAgICAgICAgIG91dHB1dF9pbnRyb3NwZWN0aW9uX2pzb246IGFyZ3MuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgJy0tb3V0cHV0LWludHJvc3BlY3Rpb24tanNvbicsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdXNlX2ludHJvc3BlY3Rpb25fanNvbjogYXJncy5pbmNsdWRlcygnLS11c2UtaW50cm9zcGVjdGlvbi1qc29uJyksXG4gICAgICAgICAgICBzdG9wX2FmdGVyOiBhcmdzLmluY2x1ZGVzKCctLXN0b3AtYWZ0ZXInKSxcbiAgICAgICAgICAgIGFsbG93X292ZXJ3cml0ZTogYXJncy5pbmNsdWRlcygnLS1hbGxvdy1vdmVyd3JpdGUnKSxcbiAgICAgICAgICAgIGFsbG93X2ludHJvc3BlY3Rpb25fanNvbl9vdmVyd3JpdGU6IGFyZ3MuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgJy0tYWxsb3ctaW50cm9zcGVjdGlvbi1qc29uLW92ZXJ3cml0ZScsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXhwbGFuYXRpb246IGFyZ3MuaW5jbHVkZXMoJy0tZXhwbGFuYXRpb24nKSxcbiAgICAgICAgICAgIHNlbnNpdGl2ZV9tYXNrOiBhcmdzLmluY2x1ZGVzKCctLXNlbnNpdGl2ZS1tYXNrJyksXG4gICAgICAgICAgICBvdXRwdXRfc2FtcGxlczogYXJncy5pbmNsdWRlcygnLS1vdXRwdXQtc2FtcGxlcycpLFxuICAgICAgICAgICAgYWxsb3dfc2FtcGxlX292ZXJ3cml0ZTogYXJncy5pbmNsdWRlcygnLS1hbGxvdy1zYW1wbGUtb3ZlcndyaXRlJyksXG4gICAgICAgICAgICBza2lwX2FuYWx5emU6IGFyZ3MuaW5jbHVkZXMoJy0tc2tpcC1hbmFseXplJyksXG4gICAgICAgIH0sXG4gICAgICAgIGlzX2RvY2tlcjogZGV0ZWN0RG9ja2VyKCksXG4gICAgICAgIGlzX3NzaF9zZXNzaW9uOiBkZXRlY3RTU0hTZXNzaW9uKCksXG4gICAgICAgIHNoZWxsOiBkZXRlY3RTaGVsbCgpLFxuICAgICAgICBvczogZGV0ZWN0T1MoKSxcbiAgICAgICAgaXNfd3NsOiBkZXRlY3RXU0woKSxcbiAgICAgICAgc3lzdGVtX21lbW9yeTogZGV0ZWN0U3lzdGVtTWVtb3J5KCksXG4gICAgICAgIHBhY2thZ2VfbWFuYWdlcjogZGV0ZWN0UGFja2FnZU1hbmFnZXIoKSxcbiAgICAgICAgZGV2aWNlX2lkOiBjb25maWcuZGV2aWNlX2lkLFxuICAgIH0pO1xufTtcblxudHJ5IHtcbiAgICBhd2FpdCBmaXJlUnVuVGVsZW1ldHJ5KCk7XG59IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoREJDVFhfREVWKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgJHtlcnJ9YCwge2Vycm9yOiBlcnJ9KTtcbiAgICB9XG59XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export declare const atomicWriteFile: (path: string, data: string, encoding?: BufferEncoding) => Promise<void>;
2
+ export declare const recoverAtomicWrite: (targetPath: string) => Promise<void>;
3
+ export declare const recoverAtomicWritesInDir: (dirPath: string) => Promise<void>;
4
+ //# sourceMappingURL=atomic-write.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-write.d.mts","sourceRoot":"./src/","sources":["lib/atomic-write.mts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,eAAe,GACxB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,WAAU,cAAwB,KACnC,OAAO,CAAC,IAAI,CAmBd,CAAC;AA0BF,eAAO,MAAM,kBAAkB,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAQzE,CAAC;AAKF,eAAO,MAAM,wBAAwB,GACjC,SAAS,MAAM,KAChB,OAAO,CAAC,IAAI,CA+Bd,CAAC"}