@workflow/cli 5.0.0-beta.39 → 5.0.0-beta.40

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.
@@ -1 +1 @@
1
- {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUzC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,MAAM,CAAC,WAAW,SAC4C;IAE9D,MAAM,CAAC,OAAO,WAAS;IAEvB,MAAM,CAAC,QAAQ,WAKb;IAEI,KAAK,CAAC,KAAK,EAAE,GAAG;IAUtB,MAAM,CAAC,IAAI;;MAKA;IAEX,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;MAgCV;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwIlC"}
1
+ {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,MAAM,CAAC,WAAW,SAC4C;IAE9D,MAAM,CAAC,OAAO,WAAS;IAEvB,MAAM,CAAC,QAAQ,WAKb;IAEI,KAAK,CAAC,KAAK,EAAE,GAAG;IAUtB,MAAM,CAAC,IAAI;;MAKA;IAEX,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;MAmCV;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwDlC"}
@@ -1,16 +1,14 @@
1
1
  import readline from 'node:readline';
2
2
  import { Args, Flags } from '@oclif/core';
3
3
  import { cancelRun } from '@workflow/core/runtime';
4
- import { parseWorkflowName } from '@workflow/utils/parse-name';
5
4
  import { WorkflowRunStatusSchema } from '@workflow/world';
6
5
  import chalk from 'chalk';
7
- import Table from 'easy-table';
8
6
  import { BaseCommand } from '../base.js';
7
+ import { CANCELLABLE_STATUSES, CLI_CANCEL_REASON, performBulkCancel, validateBulkCancelLimit, } from '../lib/bulk-cancel.js';
9
8
  import { LOGGING_CONFIG, logger } from '../lib/config/log.js';
10
9
  import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from '../lib/inspect/errors.js';
11
10
  import { cliFlags } from '../lib/inspect/flags.js';
12
11
  import { setupCliWorld } from '../lib/inspect/setup.js';
13
- import { planWindowStartFromResponse } from '../lib/inspect/time-window.js';
14
12
  export default class Cancel extends BaseCommand {
15
13
  static description = 'Cancel a workflow run, or bulk-cancel runs by status/name';
16
14
  static aliases = ['c'];
@@ -39,9 +37,12 @@ export default class Cancel extends BaseCommand {
39
37
  static flags = {
40
38
  ...cliFlags,
41
39
  status: Flags.string({
42
- description: 'Filter runs by status for bulk cancel',
40
+ // Only cancellable statuses are offered: cancelling a terminal run
41
+ // (completed / failed / cancelled) is a no-op, so pinning one would list
42
+ // the same page on every rerun and never advance.
43
+ description: 'Filter runs by status for bulk cancel (pending or running)',
43
44
  required: false,
44
- options: [...WorkflowRunStatusSchema.options],
45
+ options: [...CANCELLABLE_STATUSES],
45
46
  helpGroup: 'Bulk Cancel',
46
47
  helpLabel: '--status',
47
48
  }),
@@ -53,7 +54,7 @@ export default class Cancel extends BaseCommand {
53
54
  helpLabel: '-n, --workflowName',
54
55
  }),
55
56
  limit: Flags.integer({
56
- description: 'Max runs to cancel in bulk mode',
57
+ description: 'Max runs to cancel in bulk mode (1-500)',
57
58
  required: false,
58
59
  default: 50,
59
60
  helpGroup: 'Bulk Cancel',
@@ -77,7 +78,9 @@ export default class Cancel extends BaseCommand {
77
78
  }
78
79
  // Single-run cancel (existing behavior)
79
80
  if (args.runId) {
80
- await cancelRun(world, args.runId);
81
+ await cancelRun(world, args.runId, {
82
+ cancelReason: CLI_CANCEL_REASON,
83
+ });
81
84
  logger.log(chalk.green(`Cancelled run ${args.runId}`));
82
85
  return;
83
86
  }
@@ -90,95 +93,27 @@ export default class Cancel extends BaseCommand {
90
93
  ' workflow cancel --status=running --workflowName=myWorkflow');
91
94
  process.exit(1);
92
95
  }
93
- // Fetch matching runs. Only metadata is needed to display and cancel, so
94
- // prefer the analytics read path when the backend provides one.
96
+ const limit = flags.limit ?? 50;
97
+ const limitError = validateBulkCancelLimit(limit);
98
+ if (limitError) {
99
+ logger.error(limitError);
100
+ process.exit(1);
101
+ }
95
102
  const status = flags.status
96
103
  ? WorkflowRunStatusSchema.parse(flags.status)
97
104
  : undefined;
98
- const limit = flags.limit || 50;
99
- const analytics = world.analytics;
100
- const fetchMatches = async () => {
101
- if (!analytics) {
102
- return world.runs.list({
103
- status,
104
- workflowName: flags.workflowName,
105
- pagination: { limit },
106
- resolveData: 'none',
107
- });
108
- }
109
- // The analytics backend defaults its listing to a recent window
110
- // (trailing 24h on the Vercel backend), but bulk cancel must match
111
- // across the plan's whole observability window — a run can sleep or
112
- // wait on a hook for days without emitting recent events. Probe for
113
- // the plan window bounds first, then match across them.
114
- const probe = await analytics.runs.list({
115
- status,
116
- workflowName: flags.workflowName,
117
- pagination: { limit: 1 },
118
- });
119
- const windowStart = planWindowStartFromResponse(probe);
120
- return analytics.runs.list({
121
- status,
122
- workflowName: flags.workflowName,
123
- ...(windowStart
124
- ? { startTime: windowStart, endTime: new Date().toISOString() }
125
- : {}),
126
- pagination: { limit },
127
- });
128
- };
129
- const runList = await fetchMatches();
130
- const runs = {
131
- data: runList.data.map((run) => ({
132
- runId: run.runId,
133
- workflowName: run.workflowName,
134
- status: run.status,
135
- startedAt: run.startedAt,
136
- })),
137
- hasMore: runList.hasMore,
138
- };
139
- if (runs.data.length === 0) {
140
- logger.warn('No matching runs found.');
141
- return;
142
- }
143
- // Display what will be cancelled
144
- const table = new Table();
145
- for (const run of runs.data) {
146
- const shortName = parseWorkflowName(run.workflowName)?.shortName || run.workflowName;
147
- table.cell('runId', run.runId);
148
- table.cell('workflow', chalk.blueBright(shortName));
149
- table.cell('status', run.status);
150
- table.cell('startedAt', run.startedAt ? new Date(run.startedAt).toISOString() : '-');
151
- table.newRow();
152
- }
153
- logger.log(`\nFound ${chalk.bold(runs.data.length)} runs to cancel:\n`);
154
- logger.log(table.toString());
155
- if (runs.hasMore) {
156
- logger.warn(`More runs match these filters. Increase --limit (currently ${flags.limit || 50}) or re-run to cancel additional runs.`);
157
- }
158
- // Confirm unless --confirm/-y
159
- if (!flags.confirm) {
160
- const confirmed = await promptConfirm(`Cancel ${runs.data.length} run${runs.data.length === 1 ? '' : 's'}?`);
161
- if (!confirmed) {
162
- logger.log('Aborted.');
163
- return;
164
- }
165
- }
166
- // Cancel each run with progress
167
- let cancelled = 0;
168
- let failed = 0;
169
- for (const run of runs.data) {
170
- try {
171
- await cancelRun(world, run.runId);
172
- cancelled++;
173
- logger.log(chalk.green(` ✓ ${run.runId}`) +
174
- chalk.gray(` (${cancelled}/${runs.data.length})`));
175
- }
176
- catch (err) {
177
- failed++;
178
- logger.warn(` ✗ ${run.runId}: ${err.message || String(err)}`);
179
- }
105
+ const { exitCode } = await performBulkCancel({
106
+ world,
107
+ status,
108
+ workflowName: flags.workflowName,
109
+ limit,
110
+ confirm: flags.confirm,
111
+ logger,
112
+ promptConfirm,
113
+ });
114
+ if (exitCode !== 0) {
115
+ process.exit(exitCode);
180
116
  }
181
- logger.log(`\nDone: ${chalk.green(`${cancelled} cancelled`)}${failed > 0 ? `, ${chalk.red(`${failed} failed`)}` : ''}`);
182
117
  }
183
118
  }
184
119
  async function promptConfirm(message) {
@@ -197,4 +132,4 @@ async function promptConfirm(message) {
197
132
  });
198
133
  });
199
134
  }
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NhbmNlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsbUNBQW1DLEdBQ3BDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxXQUFXO0lBQzdDLE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLDJEQUEyRCxDQUFDO0lBRTlELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRCQUE0QjtRQUM1QixvQ0FBb0M7UUFDcEMsOERBQThEO1FBQzlELHVDQUF1QztLQUN4QyxDQUFDO0lBRUYsS0FBSyxD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S0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFVLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDdEMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWFkbGluZSBmcm9tICdub2RlOnJlYWRsaW5lJztcbmltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSAnQG9jbGlmL2NvcmUnO1xuaW1wb3J0IHsgY2FuY2VsUnVuIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7IFdvcmtmbG93UnVuU3RhdHVzU2NoZW1hIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBCYXNlQ29tbWFuZCB9IGZyb20gJy4uL2Jhc2UuanMnO1xuaW1wb3J0IHsgTE9HR0lOR19DT05GSUcsIGxvZ2dlciB9IGZyb20gJy4uL2xpYi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB7XG4gIGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlLFxuICBpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcixcbn0gZnJvbSAnLi4vbGliL2luc3BlY3QvZXJyb3JzLmpzJztcbmltcG9ydCB7IGNsaUZsYWdzIH0gZnJvbSAnLi4vbGliL2luc3BlY3QvZmxhZ3MuanMnO1xuaW1wb3J0IHsgc2V0dXBDbGlXb3JsZCB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L3NldHVwLmpzJztcbmltcG9ydCB7IHBsYW5XaW5kb3dTdGFydEZyb21SZXNwb25zZSB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L3RpbWUtd2luZG93LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FuY2VsIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgICdDYW5jZWwgYSB3b3JrZmxvdyBydW4sIG9yIGJ1bGstY2FuY2VsIHJ1bnMgYnkgc3RhdHVzL25hbWUnO1xuXG4gIHN0YXRpYyBhbGlhc2VzID0gWydjJ107XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICckIHdvcmtmbG93IGNhbmNlbCA8cnVuLWlkPicsXG4gICAgJyQgd29ya2Zsb3cgY2FuY2VsIC0tc3RhdHVzPXJ1bm5pbmcnLFxuICAgICckIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nIC0td29ya2Zsb3dOYW1lPW15V29ya2Zsb3cnLFxuICAgICckIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nIC15JyxcbiAgXTtcblxuICBhc3luYyBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgbG9nZ2VyLmVycm9yKGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0gZWxzZSBpZiAoTE9HR0lOR19DT05GSUcuVkVSQk9TRV9NT0RFKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBydW5JZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246ICdJRCBvZiB0aGUgcnVuIHRvIGNhbmNlbCAob21pdCBmb3IgYnVsayBtb2RlIHdpdGggZmlsdGVycyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0pLFxuICB9IGFzIGNvbnN0O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5jbGlGbGFncyxcbiAgICBzdGF0dXM6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbHRlciBydW5zIGJ5IHN0YXR1cyBmb3IgYnVsayBjYW5jZWwnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgb3B0aW9uczogWy4uLldvcmtmbG93UnVuU3RhdHVzU2NoZW1hLm9wdGlvbnNdLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLS1zdGF0dXMnLFxuICAgIH0pLFxuICAgIHdvcmtmbG93TmFtZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRmlsdGVyIHJ1bnMgYnkgd29ya2Zsb3cgbmFtZSBmb3IgYnVsayBjYW5jZWwnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ24nLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLW4sIC0td29ya2Zsb3dOYW1lJyxcbiAgICB9KSxcbiAgICBsaW1pdDogRmxhZ3MuaW50ZWdlcih7XG4gICAgICBkZXNjcmlwdGlvbjogJ01heCBydW5zIHRvIGNhbmNlbCBpbiBidWxrIG1vZGUnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogNTAsXG4gICAgICBoZWxwR3JvdXA6ICdCdWxrIENhbmNlbCcsXG4gICAgICBoZWxwTGFiZWw6ICctLWxpbWl0JyxcbiAgICAgIGhlbHBWYWx1ZTogJ05VTUJFUicsXG4gICAgfSksXG4gICAgY29uZmlybTogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXAgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdCcsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBjaGFyOiAneScsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGhlbHBHcm91cDogJ0J1bGsgQ2FuY2VsJyxcbiAgICAgIGhlbHBMYWJlbDogJy15LCAtLWNvbmZpcm0nLFxuICAgIH0pLFxuICB9O1xuXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncywgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShDYW5jZWwpO1xuXG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBzZXR1cENsaVdvcmxkKGZsYWdzLCB0aGlzLmNvbmZpZy52ZXJzaW9uKTtcbiAgICBpZiAoIXdvcmxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdGYWlsZWQgdG8gY29ubmVjdCB0byBiYWNrZW5kLiBDaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUtcnVuIGNhbmNlbCAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgaWYgKGFyZ3MucnVuSWQpIHtcbiAgICAgIGF3YWl0IGNhbmNlbFJ1bih3b3JsZCwgYXJncy5ydW5JZCk7XG4gICAgICBsb2dnZXIubG9nKGNoYWxrLmdyZWVuKGBDYW5jZWxsZWQgcnVuICR7YXJncy5ydW5JZH1gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQnVsayBtb2RlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBmaWx0ZXJcbiAgICBpZiAoIWZsYWdzLnN0YXR1cyAmJiAhZmxhZ3Mud29ya2Zsb3dOYW1lKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICdQcm92aWRlIGEgcnVuIElEIG9yIHVzZSAtLXN0YXR1cy8tLXdvcmtmbG93TmFtZSB0byBidWxrIGNhbmNlbC5cXG4nICtcbiAgICAgICAgICAnRXhhbXBsZXM6XFxuJyArXG4gICAgICAgICAgJyAgd29ya2Zsb3cgY2FuY2VsIDxydW4taWQ+XFxuJyArXG4gICAgICAgICAgJyAgd29ya2Zsb3cgY2FuY2VsIC0tc3RhdHVzPXJ1bm5pbmdcXG4nICtcbiAgICAgICAgICAnICB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZyAtLXdvcmtmbG93TmFtZT1teVdvcmtmbG93J1xuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCBtYXRjaGluZyBydW5zLiBPbmx5IG1ldGFkYXRhIGlzIG5lZWRlZCB0byBkaXNwbGF5IGFuZCBjYW5jZWwsIHNvXG4gICAgLy8gcHJlZmVyIHRoZSBhbmFseXRpY3MgcmVhZCBwYXRoIHdoZW4gdGhlIGJhY2tlbmQgcHJvdmlkZXMgb25lLlxuICAgIGNvbnN0IHN0YXR1cyA9IGZsYWdzLnN0YXR1c1xuICAgICAgPyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYS5wYXJzZShmbGFncy5zdGF0dXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaW1pdCA9IGZsYWdzLmxpbWl0IHx8IDUwO1xuICAgIGNvbnN0IGFuYWx5dGljcyA9IHdvcmxkLmFuYWx5dGljcztcbiAgICBjb25zdCBmZXRjaE1hdGNoZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWFuYWx5dGljcykge1xuICAgICAgICByZXR1cm4gd29ybGQucnVucy5saXN0KHtcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiBmbGFncy53b3JrZmxvd05hbWUsXG4gICAgICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdCB9LFxuICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGFuYWx5dGljcyBiYWNrZW5kIGRlZmF1bHRzIGl0cyBsaXN0aW5nIHRvIGEgcmVjZW50IHdpbmRvd1xuICAgICAgLy8gKHRyYWlsaW5nIDI0aCBvbiB0aGUgVmVyY2VsIGJhY2tlbmQpLCBidXQgYnVsayBjYW5jZWwgbXVzdCBtYXRjaFxuICAgICAgLy8gYWNyb3NzIHRoZSBwbGFuJ3Mgd2hvbGUgb2JzZXJ2YWJpbGl0eSB3aW5kb3cg4oCUIGEgcnVuIGNhbiBzbGVlcCBvclxuICAgICAgLy8gd2FpdCBvbiBhIGhvb2sgZm9yIGRheXMgd2l0aG91dCBlbWl0dGluZyByZWNlbnQgZXZlbnRzLiBQcm9iZSBmb3JcbiAgICAgIC8vIHRoZSBwbGFuIHdpbmRvdyBib3VuZHMgZmlyc3QsIHRoZW4gbWF0Y2ggYWNyb3NzIHRoZW0uXG4gICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGFuYWx5dGljcy5ydW5zLmxpc3Qoe1xuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHdvcmtmbG93TmFtZTogZmxhZ3Mud29ya2Zsb3dOYW1lLFxuICAgICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHdpbmRvd1N0YXJ0ID0gcGxhbldpbmRvd1N0YXJ0RnJvbVJlc3BvbnNlKHByb2JlKTtcbiAgICAgIHJldHVybiBhbmFseXRpY3MucnVucy5saXN0KHtcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICB3b3JrZmxvd05hbWU6IGZsYWdzLndvcmtmbG93TmFtZSxcbiAgICAgICAgLi4uKHdpbmRvd1N0YXJ0XG4gICAgICAgICAgPyB7IHN0YXJ0VGltZTogd2luZG93U3RhcnQsIGVuZFRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIHBhZ2luYXRpb246IHsgbGltaXQgfSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcnVuTGlzdCA9IGF3YWl0IGZldGNoTWF0Y2hlcygpO1xuICAgIGNvbnN0IHJ1bnMgPSB7XG4gICAgICBkYXRhOiBydW5MaXN0LmRhdGEubWFwKChydW4pID0+ICh7XG4gICAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgc3RhdHVzOiBydW4uc3RhdHVzLFxuICAgICAgICBzdGFydGVkQXQ6IHJ1bi5zdGFydGVkQXQsXG4gICAgICB9KSksXG4gICAgICBoYXNNb3JlOiBydW5MaXN0Lmhhc01vcmUsXG4gICAgfTtcblxuICAgIGlmIChydW5zLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gbWF0Y2hpbmcgcnVucyBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHdoYXQgd2lsbCBiZSBjYW5jZWxsZWRcbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSgpO1xuICAgIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMuZGF0YSkge1xuICAgICAgY29uc3Qgc2hvcnROYW1lID1cbiAgICAgICAgcGFyc2VXb3JrZmxvd05hbWUocnVuLndvcmtmbG93TmFtZSk/LnNob3J0TmFtZSB8fCBydW4ud29ya2Zsb3dOYW1lO1xuICAgICAgdGFibGUuY2VsbCgncnVuSWQnLCBydW4ucnVuSWQpO1xuICAgICAgdGFibGUuY2VsbCgnd29ya2Zsb3cnLCBjaGFsay5ibHVlQnJpZ2h0KHNob3J0TmFtZSkpO1xuICAgICAgdGFibGUuY2VsbCgnc3RhdHVzJywgcnVuLnN0YXR1cyk7XG4gICAgICB0YWJsZS5jZWxsKFxuICAgICAgICAnc3RhcnRlZEF0JyxcbiAgICAgICAgcnVuLnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKHJ1bi5zdGFydGVkQXQpLnRvSVNPU3RyaW5nKCkgOiAnLSdcbiAgICAgICk7XG4gICAgICB0YWJsZS5uZXdSb3coKTtcbiAgICB9XG4gICAgbG9nZ2VyLmxvZyhgXFxuRm91bmQgJHtjaGFsay5ib2xkKHJ1bnMuZGF0YS5sZW5ndGgpfSBydW5zIHRvIGNhbmNlbDpcXG5gKTtcbiAgICBsb2dnZXIubG9nKHRhYmxlLnRvU3RyaW5nKCkpO1xuXG4gICAgaWYgKHJ1bnMuaGFzTW9yZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBNb3JlIHJ1bnMgbWF0Y2ggdGhlc2UgZmlsdGVycy4gSW5jcmVhc2UgLS1saW1pdCAoY3VycmVudGx5ICR7ZmxhZ3MubGltaXQgfHwgNTB9KSBvciByZS1ydW4gdG8gY2FuY2VsIGFkZGl0aW9uYWwgcnVucy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbmZpcm0gdW5sZXNzIC0tY29uZmlybS8teVxuICAgIGlmICghZmxhZ3MuY29uZmlybSkge1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcHJvbXB0Q29uZmlybShcbiAgICAgICAgYENhbmNlbCAke3J1bnMuZGF0YS5sZW5ndGh9IHJ1biR7cnVucy5kYXRhLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfT9gXG4gICAgICApO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgbG9nZ2VyLmxvZygnQWJvcnRlZC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbmNlbCBlYWNoIHJ1biB3aXRoIHByb2dyZXNzXG4gICAgbGV0IGNhbmNlbGxlZCA9IDA7XG4gICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgZm9yIChjb25zdCBydW4gb2YgcnVucy5kYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjYW5jZWxSdW4od29ybGQsIHJ1bi5ydW5JZCk7XG4gICAgICAgIGNhbmNlbGxlZCsrO1xuICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKGAgIOKckyAke3J1bi5ydW5JZH1gKSArXG4gICAgICAgICAgICBjaGFsay5ncmF5KGAgKCR7Y2FuY2VsbGVkfS8ke3J1bnMuZGF0YS5sZW5ndGh9KWApXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgbG9nZ2VyLndhcm4oYCAg4pyXICR7cnVuLnJ1bklkfTogJHtlcnIubWVzc2FnZSB8fCBTdHJpbmcoZXJyKX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKFxuICAgICAgYFxcbkRvbmU6ICR7Y2hhbGsuZ3JlZW4oYCR7Y2FuY2VsbGVkfSBjYW5jZWxsZWRgKX0ke2ZhaWxlZCA+IDAgPyBgLCAke2NoYWxrLnJlZChgJHtmYWlsZWR9IGZhaWxlZGApfWAgOiAnJ31gXG4gICAgKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRDb25maXJtKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBOb24tVFRZOiBhYm9ydCBzaW5jZSB1c2VyIGNhbm5vdCBjb25maXJtIGludGVyYWN0aXZlbHkgKHVzZSAteS8tLWNvbmZpcm0gdG8gc2tpcCBwcm9tcHQpXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihgJHttZXNzYWdlfSBbeS9OXSBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd5Jyk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NhbmNlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsbUNBQW1DLEdBQ3BDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV4RCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxXQUFXO0lBQzdDLE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLDJEQUEyRCxDQUFDO0lBRTlELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRCQUE0QjtRQUM1QixvQ0FBb0M7UUFDcEMsOERBQThEO1FBQzlELHVDQUF1QztLQUN4QyxDQUFDO0lBRUYsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFVO1FBQ3BCLElBQUksbUNBQW1D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Q0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3RDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZSc7XG5pbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gJ0BvY2xpZi9jb3JlJztcbmltcG9ydCB7IGNhbmNlbFJ1biB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHsgV29ya2Zsb3dSdW5TdGF0dXNTY2hlbWEgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IEJhc2VDb21tYW5kIH0gZnJvbSAnLi4vYmFzZS5qcyc7XG5pbXBvcnQge1xuICBDQU5DRUxMQUJMRV9TVEFUVVNFUyxcbiAgQ0xJX0NBTkNFTF9SRUFTT04sXG4gIHBlcmZvcm1CdWxrQ2FuY2VsLFxuICB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCxcbn0gZnJvbSAnLi4vbGliL2J1bGstY2FuY2VsLmpzJztcbmltcG9ydCB7IExPR0dJTkdfQ09ORklHLCBsb2dnZXIgfSBmcm9tICcuLi9saWIvY29uZmlnL2xvZy5qcyc7XG5pbXBvcnQge1xuICBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSxcbiAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IsXG59IGZyb20gJy4uL2xpYi9pbnNwZWN0L2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBjbGlGbGFncyB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L2ZsYWdzLmpzJztcbmltcG9ydCB7IHNldHVwQ2xpV29ybGQgfSBmcm9tICcuLi9saWIvaW5zcGVjdC9zZXR1cC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbmNlbCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICAnQ2FuY2VsIGEgd29ya2Zsb3cgcnVuLCBvciBidWxrLWNhbmNlbCBydW5zIGJ5IHN0YXR1cy9uYW1lJztcblxuICBzdGF0aWMgYWxpYXNlcyA9IFsnYyddO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnJCB3b3JrZmxvdyBjYW5jZWwgPHJ1bi1pZD4nLFxuICAgICckIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nJyxcbiAgICAnJCB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZyAtLXdvcmtmbG93TmFtZT1teVdvcmtmbG93JyxcbiAgICAnJCB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZyAteScsXG4gIF07XG5cbiAgYXN5bmMgY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGlmIChpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSgpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9IGVsc2UgaWYgKExPR0dJTkdfQ09ORklHLlZFUkJPU0VfTU9ERSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgcnVuSWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSUQgb2YgdGhlIHJ1biB0byBjYW5jZWwgKG9taXQgZm9yIGJ1bGsgbW9kZSB3aXRoIGZpbHRlcnMpJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICB9KSxcbiAgfSBhcyBjb25zdDtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uY2xpRmxhZ3MsXG4gICAgc3RhdHVzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgLy8gT25seSBjYW5jZWxsYWJsZSBzdGF0dXNlcyBhcmUgb2ZmZXJlZDogY2FuY2VsbGluZyBhIHRlcm1pbmFsIHJ1blxuICAgICAgLy8gKGNvbXBsZXRlZCAvIGZhaWxlZCAvIGNhbmNlbGxlZCkgaXMgYSBuby1vcCwgc28gcGlubmluZyBvbmUgd291bGQgbGlzdFxuICAgICAgLy8gdGhlIHNhbWUgcGFnZSBvbiBldmVyeSByZXJ1biBhbmQgbmV2ZXIgYWR2YW5jZS5cbiAgICAgIGRlc2NyaXB0aW9uOiAnRmlsdGVyIHJ1bnMgYnkgc3RhdHVzIGZvciBidWxrIGNhbmNlbCAocGVuZGluZyBvciBydW5uaW5nKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbLi4uQ0FOQ0VMTEFCTEVfU1RBVFVTRVNdLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLS1zdGF0dXMnLFxuICAgIH0pLFxuICAgIHdvcmtmbG93TmFtZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRmlsdGVyIHJ1bnMgYnkgd29ya2Zsb3cgbmFtZSBmb3IgYnVsayBjYW5jZWwnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ24nLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLW4sIC0td29ya2Zsb3dOYW1lJyxcbiAgICB9KSxcbiAgICBsaW1pdDogRmxhZ3MuaW50ZWdlcih7XG4gICAgICBkZXNjcmlwdGlvbjogJ01heCBydW5zIHRvIGNhbmNlbCBpbiBidWxrIG1vZGUgKDEtNTAwKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiA1MCxcbiAgICAgIGhlbHBHcm91cDogJ0J1bGsgQ2FuY2VsJyxcbiAgICAgIGhlbHBMYWJlbDogJy0tbGltaXQnLFxuICAgICAgaGVscFZhbHVlOiAnTlVNQkVSJyxcbiAgICB9KSxcbiAgICBjb25maXJtOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0JyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGNoYXI6ICd5JyxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLXksIC0tY29uZmlybScsXG4gICAgfSksXG4gIH07XG5cbiAgcHVibGljIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzLCBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKENhbmNlbCk7XG5cbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHNldHVwQ2xpV29ybGQoZmxhZ3MsIHRoaXMuY29uZmlnLnZlcnNpb24pO1xuICAgIGlmICghd29ybGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIGJhY2tlbmQuIENoZWNrIHlvdXIgY29uZmlndXJhdGlvbi4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNpbmdsZS1ydW4gY2FuY2VsIChleGlzdGluZyBiZWhhdmlvcilcbiAgICBpZiAoYXJncy5ydW5JZCkge1xuICAgICAgYXdhaXQgY2FuY2VsUnVuKHdvcmxkLCBhcmdzLnJ1bklkLCB7XG4gICAgICAgIGNhbmNlbFJlYXNvbjogQ0xJX0NBTkNFTF9SRUFTT04sXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5sb2coY2hhbGsuZ3JlZW4oYENhbmNlbGxlZCBydW4gJHthcmdzLnJ1bklkfWApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCdWxrIG1vZGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGZpbHRlclxuICAgIGlmICghZmxhZ3Muc3RhdHVzICYmICFmbGFncy53b3JrZmxvd05hbWUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgJ1Byb3ZpZGUgYSBydW4gSUQgb3IgdXNlIC0tc3RhdHVzLy0td29ya2Zsb3dOYW1lIHRvIGJ1bGsgY2FuY2VsLlxcbicgK1xuICAgICAgICAgICdFeGFtcGxlczpcXG4nICtcbiAgICAgICAgICAnICB3b3JrZmxvdyBjYW5jZWwgPHJ1bi1pZD5cXG4nICtcbiAgICAgICAgICAnICB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZ1xcbicgK1xuICAgICAgICAgICcgIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nIC0td29ya2Zsb3dOYW1lPW15V29ya2Zsb3cnXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ID0gZmxhZ3MubGltaXQgPz8gNTA7XG4gICAgY29uc3QgbGltaXRFcnJvciA9IHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KGxpbWl0KTtcbiAgICBpZiAobGltaXRFcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGxpbWl0RXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IGZsYWdzLnN0YXR1c1xuICAgICAgPyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYS5wYXJzZShmbGFncy5zdGF0dXMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzLFxuICAgICAgd29ya2Zsb3dOYW1lOiBmbGFncy53b3JrZmxvd05hbWUsXG4gICAgICBsaW1pdCxcbiAgICAgIGNvbmZpcm06IGZsYWdzLmNvbmZpcm0sXG4gICAgICBsb2dnZXIsXG4gICAgICBwcm9tcHRDb25maXJtLFxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRDb25maXJtKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBOb24tVFRZOiBhYm9ydCBzaW5jZSB1c2VyIGNhbm5vdCBjb25maXJtIGludGVyYWN0aXZlbHkgKHVzZSAteS8tLWNvbmZpcm0gdG8gc2tpcCBwcm9tcHQpXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihgJHttZXNzYWdlfSBbeS9OXSBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd5Jyk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
@@ -0,0 +1,74 @@
1
+ import type { BulkCancelWorkflowRunsResult, WorkflowRunStatus, World } from '@workflow/world';
2
+ export declare const BULK_CANCEL_MIN_LIMIT = 1;
3
+ export declare const BULK_CANCEL_MAX_LIMIT = 500;
4
+ export declare const CLI_CANCEL_REASON = "Cancelled via Workflow CLI";
5
+ /**
6
+ * Statuses a run can still be cancelled from. When the caller doesn't pin a
7
+ * `--status`, bulk cancel restricts matching to these so terminal runs
8
+ * (including the ones a prior batch just cancelled) don't crowd out reachable
9
+ * active runs. Otherwise, listing every status returns the same newest
10
+ * terminal page on each rerun and older active runs are never reached. The
11
+ * list API filters by a single status, so we fan out across these and merge.
12
+ */
13
+ export declare const CANCELLABLE_STATUSES: readonly ["pending", "running"];
14
+ /**
15
+ * Guidance printed when more runs match the filters than were fetched. Bulk
16
+ * cancel is deliberately single-batch and user-paced — no cursors or async
17
+ * jobs — so the user re-runs to cancel the next batch.
18
+ */
19
+ export declare const HAS_MORE_GUIDANCE: string;
20
+ export interface CancelLogger {
21
+ log(message: string): void;
22
+ warn(message: string): void;
23
+ error(message: string): void;
24
+ }
25
+ /**
26
+ * Validate the `--limit` flag. Returns an error message when invalid, or
27
+ * `undefined` when the value is an integer within [1, 500].
28
+ */
29
+ export declare function validateBulkCancelLimit(limit: number): string | undefined;
30
+ /**
31
+ * Build the compact multi-line "Done:" summary block. Lists every outcome
32
+ * category so the counts add up to the number of runs requested; individual
33
+ * `not_found`, `not_cancellable`, and `failed` runs are additionally surfaced
34
+ * per-run via {@link bulkCancelFailureLines}.
35
+ */
36
+ export declare function formatBulkCancelSummary(result: BulkCancelWorkflowRunsResult): string;
37
+ /**
38
+ * Per-run lines for outcomes worth calling out individually: `not_found`,
39
+ * `not_cancellable`, and `failed`. Cancelled and already-cancelled runs are
40
+ * left to the summary.
41
+ */
42
+ export declare function bulkCancelFailureLines(result: BulkCancelWorkflowRunsResult): string[];
43
+ export interface BulkCancelParams {
44
+ world: World;
45
+ status?: WorkflowRunStatus;
46
+ workflowName?: string;
47
+ /** Max runs to fetch and cancel in this batch (already validated). */
48
+ limit: number;
49
+ /** When true, skip the interactive confirmation prompt. */
50
+ confirm: boolean;
51
+ logger: CancelLogger;
52
+ /**
53
+ * Confirmation prompt. Omitted in non-interactive contexts (and tests),
54
+ * in which case an unconfirmed run aborts.
55
+ */
56
+ promptConfirm?: (message: string) => Promise<boolean>;
57
+ }
58
+ export interface BulkCancelOutcome {
59
+ /** Process exit code: 1 when any run failed, otherwise 0. */
60
+ exitCode: number;
61
+ /** The structured result, or undefined when nothing matched / aborted. */
62
+ result?: BulkCancelWorkflowRunsResult;
63
+ }
64
+ /**
65
+ * Fetch matching runs (up to `limit`), confirm, and cancel them in a single
66
+ * bulk operation. Prints a table of what will be cancelled, rerun guidance
67
+ * when more runs match than were fetched, a compact summary, and per-run
68
+ * lines for surfaced failures.
69
+ *
70
+ * Does not traverse pages: exactly one page of at most `limit` runs is
71
+ * cancelled per invocation.
72
+ */
73
+ export declare function performBulkCancel(params: BulkCancelParams): Promise<BulkCancelOutcome>;
74
+ //# sourceMappingURL=bulk-cancel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-cancel.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,EACN,MAAM,iBAAiB,CAAC;AAKzB,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,iCAGgB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAED,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,4BAA4B,GACnC,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,4BAA4B,GACnC,MAAM,EAAE,CAkBV;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,4BAA4B,CAAC;CACvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAuI5B"}
@@ -0,0 +1,197 @@
1
+ import { cancelRuns } from '@workflow/core/runtime';
2
+ import { parseWorkflowName } from '@workflow/utils/parse-name';
3
+ import chalk from 'chalk';
4
+ import Table from 'easy-table';
5
+ import { planWindowStartFromResponse } from './inspect/time-window.js';
6
+ export const BULK_CANCEL_MIN_LIMIT = 1;
7
+ export const BULK_CANCEL_MAX_LIMIT = 500;
8
+ export const CLI_CANCEL_REASON = 'Cancelled via Workflow CLI';
9
+ /**
10
+ * Statuses a run can still be cancelled from. When the caller doesn't pin a
11
+ * `--status`, bulk cancel restricts matching to these so terminal runs
12
+ * (including the ones a prior batch just cancelled) don't crowd out reachable
13
+ * active runs. Otherwise, listing every status returns the same newest
14
+ * terminal page on each rerun and older active runs are never reached. The
15
+ * list API filters by a single status, so we fan out across these and merge.
16
+ */
17
+ export const CANCELLABLE_STATUSES = [
18
+ 'pending',
19
+ 'running',
20
+ ];
21
+ /**
22
+ * Guidance printed when more runs match the filters than were fetched. Bulk
23
+ * cancel is deliberately single-batch and user-paced — no cursors or async
24
+ * jobs — so the user re-runs to cancel the next batch.
25
+ */
26
+ export const HAS_MORE_GUIDANCE = 'More runs match these filters. Re-run this command to cancel the next batch,\n' +
27
+ 'or use --limit up to 500.';
28
+ /**
29
+ * Validate the `--limit` flag. Returns an error message when invalid, or
30
+ * `undefined` when the value is an integer within [1, 500].
31
+ */
32
+ export function validateBulkCancelLimit(limit) {
33
+ if (!Number.isInteger(limit) ||
34
+ limit < BULK_CANCEL_MIN_LIMIT ||
35
+ limit > BULK_CANCEL_MAX_LIMIT) {
36
+ return `--limit must be an integer between ${BULK_CANCEL_MIN_LIMIT} and ${BULK_CANCEL_MAX_LIMIT}.`;
37
+ }
38
+ return undefined;
39
+ }
40
+ /**
41
+ * Build the compact multi-line "Done:" summary block. Lists every outcome
42
+ * category so the counts add up to the number of runs requested; individual
43
+ * `not_found`, `not_cancellable`, and `failed` runs are additionally surfaced
44
+ * per-run via {@link bulkCancelFailureLines}.
45
+ */
46
+ export function formatBulkCancelSummary(result) {
47
+ const { summary } = result;
48
+ return [
49
+ 'Done:',
50
+ ` ${summary.cancelled} cancelled`,
51
+ ` ${summary.alreadyCancelled} already cancelled`,
52
+ ` ${summary.notCancellable} not cancellable`,
53
+ ` ${summary.notFound} not found`,
54
+ ` ${summary.failed} failed`,
55
+ ].join('\n');
56
+ }
57
+ /**
58
+ * Per-run lines for outcomes worth calling out individually: `not_found`,
59
+ * `not_cancellable`, and `failed`. Cancelled and already-cancelled runs are
60
+ * left to the summary.
61
+ */
62
+ export function bulkCancelFailureLines(result) {
63
+ const lines = [];
64
+ for (const r of result.results) {
65
+ switch (r.outcome) {
66
+ case 'not_found':
67
+ lines.push(` ✗ ${r.runId}: not found`);
68
+ break;
69
+ case 'not_cancellable':
70
+ lines.push(` ✗ ${r.runId}: not cancellable (${r.status})`);
71
+ break;
72
+ case 'failed':
73
+ lines.push(` ✗ ${r.runId}: failed (${r.code}${r.retryable ? ', retryable' : ''})`);
74
+ break;
75
+ }
76
+ }
77
+ return lines;
78
+ }
79
+ /**
80
+ * Fetch matching runs (up to `limit`), confirm, and cancel them in a single
81
+ * bulk operation. Prints a table of what will be cancelled, rerun guidance
82
+ * when more runs match than were fetched, a compact summary, and per-run
83
+ * lines for surfaced failures.
84
+ *
85
+ * Does not traverse pages: exactly one page of at most `limit` runs is
86
+ * cancelled per invocation.
87
+ */
88
+ export async function performBulkCancel(params) {
89
+ const { world, status, workflowName, limit, confirm, logger, promptConfirm } = params;
90
+ // Fetch matching runs. Only metadata is needed to display and cancel, so
91
+ // prefer the analytics read path when the backend provides one.
92
+ //
93
+ // When the caller pins a status, match exactly that. Otherwise restrict to
94
+ // the cancellable statuses so rerunning makes progress instead of returning
95
+ // the same terminal page forever. The list API takes a single status, so
96
+ // fan out across the target statuses and merge the pages below.
97
+ const analytics = world.analytics;
98
+ const targetStatuses = status
99
+ ? [status]
100
+ : [...CANCELLABLE_STATUSES];
101
+ const fetchPage = async (pageStatus) => {
102
+ if (!analytics) {
103
+ return world.runs.list({
104
+ status: pageStatus,
105
+ workflowName,
106
+ pagination: { limit },
107
+ resolveData: 'none',
108
+ });
109
+ }
110
+ // The analytics backend defaults its listing to a recent window
111
+ // (trailing 24h on the Vercel backend), but bulk cancel must match
112
+ // across the plan's whole observability window — a run can sleep or
113
+ // wait on a hook for days without emitting recent events. Probe for
114
+ // the plan window bounds first, then match across them.
115
+ const probe = await analytics.runs.list({
116
+ status: pageStatus,
117
+ workflowName,
118
+ pagination: { limit: 1 },
119
+ });
120
+ const windowStart = planWindowStartFromResponse(probe);
121
+ return analytics.runs.list({
122
+ status: pageStatus,
123
+ workflowName,
124
+ ...(windowStart
125
+ ? { startTime: windowStart, endTime: new Date().toISOString() }
126
+ : {}),
127
+ pagination: { limit },
128
+ });
129
+ };
130
+ const pages = await Promise.all(targetStatuses.map(fetchPage));
131
+ // Merge the per-status pages round-robin so a full page of running runs
132
+ // cannot crowd pending runs (which do not have a startedAt timestamp) out
133
+ // of every batch. Preserve each page's backend order and dedupe by runId in
134
+ // case a run changes status while the pages are fetched.
135
+ const projectedPages = pages.map((page) => page.data.map((run) => ({
136
+ runId: run.runId,
137
+ workflowName: run.workflowName,
138
+ status: run.status,
139
+ startedAt: run.startedAt,
140
+ })));
141
+ const merged = [];
142
+ const seenRunIds = new Set();
143
+ const maxPageLength = Math.max(0, ...projectedPages.map((page) => page.length));
144
+ for (let index = 0; index < maxPageLength; index++) {
145
+ for (const page of projectedPages) {
146
+ const run = page[index];
147
+ if (run && !seenRunIds.has(run.runId)) {
148
+ seenRunIds.add(run.runId);
149
+ merged.push(run);
150
+ }
151
+ }
152
+ }
153
+ const runs = {
154
+ data: merged.slice(0, limit),
155
+ hasMore: pages.some((page) => page.hasMore) || merged.length > limit,
156
+ };
157
+ if (runs.data.length === 0) {
158
+ logger.warn('No matching runs found.');
159
+ return { exitCode: 0 };
160
+ }
161
+ // Display what will be cancelled.
162
+ const table = new Table();
163
+ for (const run of runs.data) {
164
+ const shortName = parseWorkflowName(run.workflowName)?.shortName || run.workflowName;
165
+ table.cell('runId', run.runId);
166
+ table.cell('workflow', chalk.blueBright(shortName));
167
+ table.cell('status', run.status);
168
+ table.cell('startedAt', run.startedAt ? new Date(run.startedAt).toISOString() : '-');
169
+ table.newRow();
170
+ }
171
+ logger.log(`\nFound ${chalk.bold(runs.data.length)} runs to cancel:\n`);
172
+ logger.log(table.toString());
173
+ if (runs.hasMore) {
174
+ logger.warn(HAS_MORE_GUIDANCE);
175
+ }
176
+ // Confirm unless --confirm/-y.
177
+ if (!confirm) {
178
+ const confirmed = promptConfirm
179
+ ? await promptConfirm(`Cancel ${runs.data.length} run${runs.data.length === 1 ? '' : 's'}?`)
180
+ : false;
181
+ if (!confirmed) {
182
+ logger.log('Aborted.');
183
+ return { exitCode: 0 };
184
+ }
185
+ }
186
+ // One bulk operation: a single backend request on Vercel, or bounded
187
+ // fallback concurrency on local / community worlds.
188
+ const result = await cancelRuns(world, runs.data.map((run) => run.runId), { cancelReason: CLI_CANCEL_REASON });
189
+ for (const line of bulkCancelFailureLines(result)) {
190
+ logger.warn(line);
191
+ }
192
+ logger.log(`\n${formatBulkCancelSummary(result)}`);
193
+ // Already-cancelled and terminal runs are valid partial outcomes; only a
194
+ // genuine failure is a nonzero exit.
195
+ return { exitCode: result.summary.failed > 0 ? 1 : 0, result };
196
+ }
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2J1bGstY2FuY2VsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLFNBQVM7SUFDVCxTQUFTO0NBQ3NDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUM1QixnRkFBZ0Y7SUFDaEYsMkJBQTJCLENBQUM7QUFROUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsSUFDRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEtBQUssR0FBRyxxQkFBcUI7UUFDN0IsS0FBSyxHQUFHLHFCQUFxQixFQUM3QixDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MscUJBQXFCLFFBQVEscUJBQXFCLEdBQUcsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFvQztJQUVwQyxNQUFNLEVBQUUsT0FB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SCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLG9EQUFvRDtJQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FDN0IsS0FBSyxFQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ2pDLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQ3BDLENBQUM7SUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVuRCx5RUFBeUU7SUFDekUscUNBQXFDO0lBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FuY2VsUnVucyB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmtmbG93UnVuU3RhdHVzLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UgfSBmcm9tICcuL2luc3BlY3QvdGltZS13aW5kb3cuanMnO1xuXG5leHBvcnQgY29uc3QgQlVMS19DQU5DRUxfTUlOX0xJTUlUID0gMTtcbmV4cG9ydCBjb25zdCBCVUxLX0NBTkNFTF9NQVhfTElNSVQgPSA1MDA7XG5leHBvcnQgY29uc3QgQ0xJX0NBTkNFTF9SRUFTT04gPSAnQ2FuY2VsbGVkIHZpYSBXb3JrZmxvdyBDTEknO1xuXG4vKipcbiAqIFN0YXR1c2VzIGEgcnVuIGNhbiBzdGlsbCBiZSBjYW5jZWxsZWQgZnJvbS4gV2hlbiB0aGUgY2FsbGVyIGRvZXNuJ3QgcGluIGFcbiAqIGAtLXN0YXR1c2AsIGJ1bGsgY2FuY2VsIHJlc3RyaWN0cyBtYXRjaGluZyB0byB0aGVzZSBzbyB0ZXJtaW5hbCBydW5zXG4gKiAoaW5jbHVkaW5nIHRoZSBvbmVzIGEgcHJpb3IgYmF0Y2gganVzdCBjYW5jZWxsZWQpIGRvbid0IGNyb3dkIG91dCByZWFjaGFibGVcbiAqIGFjdGl2ZSBydW5zLiBPdGhlcndpc2UsIGxpc3RpbmcgZXZlcnkgc3RhdHVzIHJldHVybnMgdGhlIHNhbWUgbmV3ZXN0XG4gKiB0ZXJtaW5hbCBwYWdlIG9uIGVhY2ggcmVydW4gYW5kIG9sZGVyIGFjdGl2ZSBydW5zIGFyZSBuZXZlciByZWFjaGVkLiBUaGVcbiAqIGxpc3QgQVBJIGZpbHRlcnMgYnkgYSBzaW5nbGUgc3RhdHVzLCBzbyB3ZSBmYW4gb3V0IGFjcm9zcyB0aGVzZSBhbmQgbWVyZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDQU5DRUxMQUJMRV9TVEFUVVNFUyA9IFtcbiAgJ3BlbmRpbmcnLFxuICAncnVubmluZycsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBXb3JrZmxvd1J1blN0YXR1c1tdO1xuXG4vKipcbiAqIEd1aWRhbmNlIHByaW50ZWQgd2hlbiBtb3JlIHJ1bnMgbWF0Y2ggdGhlIGZpbHRlcnMgdGhhbiB3ZXJlIGZldGNoZWQuIEJ1bGtcbiAqIGNhbmNlbCBpcyBkZWxpYmVyYXRlbHkgc2luZ2xlLWJhdGNoIGFuZCB1c2VyLXBhY2VkIOKAlCBubyBjdXJzb3JzIG9yIGFzeW5jXG4gKiBqb2JzIOKAlCBzbyB0aGUgdXNlciByZS1ydW5zIHRvIGNhbmNlbCB0aGUgbmV4dCBiYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBU19NT1JFX0dVSURBTkNFID1cbiAgJ01vcmUgcnVucyBtYXRjaCB0aGVzZSBmaWx0ZXJzLiBSZS1ydW4gdGhpcyBjb21tYW5kIHRvIGNhbmNlbCB0aGUgbmV4dCBiYXRjaCxcXG4nICtcbiAgJ29yIHVzZSAtLWxpbWl0IHVwIHRvIDUwMC4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbExvZ2dlciB7XG4gIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIGAtLWxpbWl0YCBmbGFnLiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpbnZhbGlkLCBvclxuICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciB3aXRoaW4gWzEsIDUwMF0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdChsaW1pdDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSB8fFxuICAgIGxpbWl0IDwgQlVMS19DQU5DRUxfTUlOX0xJTUlUIHx8XG4gICAgbGltaXQgPiBCVUxLX0NBTkNFTF9NQVhfTElNSVRcbiAgKSB7XG4gICAgcmV0dXJuIGAtLWxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuICR7QlVMS19DQU5DRUxfTUlOX0xJTUlUfSBhbmQgJHtCVUxLX0NBTkNFTF9NQVhfTElNSVR9LmA7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY29tcGFjdCBtdWx0aS1saW5lIFwiRG9uZTpcIiBzdW1tYXJ5IGJsb2NrLiBMaXN0cyBldmVyeSBvdXRjb21lXG4gKiBjYXRlZ29yeSBzbyB0aGUgY291bnRzIGFkZCB1cCB0byB0aGUgbnVtYmVyIG9mIHJ1bnMgcmVxdWVzdGVkOyBpbmRpdmlkdWFsXG4gKiBgbm90X2ZvdW5kYCwgYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYCBydW5zIGFyZSBhZGRpdGlvbmFsbHkgc3VyZmFjZWRcbiAqIHBlci1ydW4gdmlhIHtAbGluayBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5KFxuICByZXN1bHQ6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHRcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgc3VtbWFyeSB9ID0gcmVzdWx0O1xuICByZXR1cm4gW1xuICAgICdEb25lOicsXG4gICAgYCAgJHtzdW1tYXJ5LmNhbmNlbGxlZH0gY2FuY2VsbGVkYCxcbiAgICBgICAke3N1bW1hcnkuYWxyZWFkeUNhbmNlbGxlZH0gYWxyZWFkeSBjYW5jZWxsZWRgLFxuICAgIGAgICR7c3VtbWFyeS5ub3RDYW5jZWxsYWJsZX0gbm90IGNhbmNlbGxhYmxlYCxcbiAgICBgICAke3N1bW1hcnkubm90Rm91bmR9IG5vdCBmb3VuZGAsXG4gICAgYCAgJHtzdW1tYXJ5LmZhaWxlZH0gZmFpbGVkYCxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQZXItcnVuIGxpbmVzIGZvciBvdXRjb21lcyB3b3J0aCBjYWxsaW5nIG91dCBpbmRpdmlkdWFsbHk6IGBub3RfZm91bmRgLFxuICogYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYC4gQ2FuY2VsbGVkIGFuZCBhbHJlYWR5LWNhbmNlbGxlZCBydW5zIGFyZVxuICogbGVmdCB0byB0aGUgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMoXG4gIHJlc3VsdDogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgc3dpdGNoIChyLm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ25vdF9mb3VuZCc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBmb3VuZGApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vdF9jYW5jZWxsYWJsZSc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBjYW5jZWxsYWJsZSAoJHtyLnN0YXR1c30pYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICDinJcgJHtyLnJ1bklkfTogZmFpbGVkICgke3IuY29kZX0ke3IucmV0cnlhYmxlID8gJywgcmV0cnlhYmxlJyA6ICcnfSlgXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa0NhbmNlbFBhcmFtcyB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgLyoqIE1heCBydW5zIHRvIGZldGNoIGFuZCBjYW5jZWwgaW4gdGhpcyBiYXRjaCAoYWxyZWFkeSB2YWxpZGF0ZWQpLiAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCBza2lwIHRoZSBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LiAqL1xuICBjb25maXJtOiBib29sZWFuO1xuICBsb2dnZXI6IENhbmNlbExvZ2dlcjtcbiAgLyoqXG4gICAqIENvbmZpcm1hdGlvbiBwcm9tcHQuIE9taXR0ZWQgaW4gbm9uLWludGVyYWN0aXZlIGNvbnRleHRzIChhbmQgdGVzdHMpLFxuICAgKiBpbiB3aGljaCBjYXNlIGFuIHVuY29uZmlybWVkIHJ1biBhYm9ydHMuXG4gICAqL1xuICBwcm9tcHRDb25maXJtPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrQ2FuY2VsT3V0Y29tZSB7XG4gIC8qKiBQcm9jZXNzIGV4aXQgY29kZTogMSB3aGVuIGFueSBydW4gZmFpbGVkLCBvdGhlcndpc2UgMC4gKi9cbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCwgb3IgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBtYXRjaGVkIC8gYWJvcnRlZC4gKi9cbiAgcmVzdWx0PzogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBGZXRjaCBtYXRjaGluZyBydW5zICh1cCB0byBgbGltaXRgKSwgY29uZmlybSwgYW5kIGNhbmNlbCB0aGVtIGluIGEgc2luZ2xlXG4gKiBidWxrIG9wZXJhdGlvbi4gUHJpbnRzIGEgdGFibGUgb2Ygd2hhdCB3aWxsIGJlIGNhbmNlbGxlZCwgcmVydW4gZ3VpZGFuY2VcbiAqIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkLCBhIGNvbXBhY3Qgc3VtbWFyeSwgYW5kIHBlci1ydW5cbiAqIGxpbmVzIGZvciBzdXJmYWNlZCBmYWlsdXJlcy5cbiAqXG4gKiBEb2VzIG5vdCB0cmF2ZXJzZSBwYWdlczogZXhhY3RseSBvbmUgcGFnZSBvZiBhdCBtb3N0IGBsaW1pdGAgcnVucyBpc1xuICogY2FuY2VsbGVkIHBlciBpbnZvY2F0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUJ1bGtDYW5jZWwoXG4gIHBhcmFtczogQnVsa0NhbmNlbFBhcmFtc1xuKTogUHJvbWlzZTxCdWxrQ2FuY2VsT3V0Y29tZT4ge1xuICBjb25zdCB7IHdvcmxkLCBzdGF0dXMsIHdvcmtmbG93TmFtZSwgbGltaXQsIGNvbmZpcm0sIGxvZ2dlciwgcHJvbXB0Q29uZmlybSB9ID1cbiAgICBwYXJhbXM7XG5cbiAgLy8gRmV0Y2ggbWF0Y2hpbmcgcnVucy4gT25seSBtZXRhZGF0YSBpcyBuZWVkZWQgdG8gZGlzcGxheSBhbmQgY2FuY2VsLCBzb1xuICAvLyBwcmVmZXIgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggd2hlbiB0aGUgYmFja2VuZCBwcm92aWRlcyBvbmUuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIGNhbGxlciBwaW5zIGEgc3RhdHVzLCBtYXRjaCBleGFjdGx5IHRoYXQuIE90aGVyd2lzZSByZXN0cmljdCB0b1xuICAvLyB0aGUgY2FuY2VsbGFibGUgc3RhdHVzZXMgc28gcmVydW5uaW5nIG1ha2VzIHByb2dyZXNzIGluc3RlYWQgb2YgcmV0dXJuaW5nXG4gIC8vIHRoZSBzYW1lIHRlcm1pbmFsIHBhZ2UgZm9yZXZlci4gVGhlIGxpc3QgQVBJIHRha2VzIGEgc2luZ2xlIHN0YXR1cywgc29cbiAgLy8gZmFuIG91dCBhY3Jvc3MgdGhlIHRhcmdldCBzdGF0dXNlcyBhbmQgbWVyZ2UgdGhlIHBhZ2VzIGJlbG93LlxuICBjb25zdCBhbmFseXRpY3MgPSB3b3JsZC5hbmFseXRpY3M7XG4gIGNvbnN0IHRhcmdldFN0YXR1c2VzOiBXb3JrZmxvd1J1blN0YXR1c1tdID0gc3RhdHVzXG4gICAgPyBbc3RhdHVzXVxuICAgIDogWy4uLkNBTkNFTExBQkxFX1NUQVRVU0VTXTtcblxuICBjb25zdCBmZXRjaFBhZ2UgPSBhc3luYyAocGFnZVN0YXR1czogV29ya2Zsb3dSdW5TdGF0dXMpID0+IHtcbiAgICBpZiAoIWFuYWx5dGljcykge1xuICAgICAgcmV0dXJuIHdvcmxkLnJ1bnMubGlzdCh7XG4gICAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gVGhlIGFuYWx5dGljcyBiYWNrZW5kIGRlZmF1bHRzIGl0cyBsaXN0aW5nIHRvIGEgcmVjZW50IHdpbmRvd1xuICAgIC8vICh0cmFpbGluZyAyNGggb24gdGhlIFZlcmNlbCBiYWNrZW5kKSwgYnV0IGJ1bGsgY2FuY2VsIG11c3QgbWF0Y2hcbiAgICAvLyBhY3Jvc3MgdGhlIHBsYW4ncyB3aG9sZSBvYnNlcnZhYmlsaXR5IHdpbmRvdyDigJQgYSBydW4gY2FuIHNsZWVwIG9yXG4gICAgLy8gd2FpdCBvbiBhIGhvb2sgZm9yIGRheXMgd2l0aG91dCBlbWl0dGluZyByZWNlbnQgZXZlbnRzLiBQcm9iZSBmb3JcbiAgICAvLyB0aGUgcGxhbiB3aW5kb3cgYm91bmRzIGZpcnN0LCB0aGVuIG1hdGNoIGFjcm9zcyB0aGVtLlxuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgICBzdGF0dXM6IHBhZ2VTdGF0dXMsXG4gICAgICB3b3JrZmxvd05hbWUsXG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxIH0sXG4gICAgfSk7XG4gICAgY29uc3Qgd2luZG93U3RhcnQgPSBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UocHJvYmUpO1xuICAgIHJldHVybiBhbmFseXRpY3MucnVucy5saXN0KHtcbiAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgIC4uLih3aW5kb3dTdGFydFxuICAgICAgICA/IHsgc3RhcnRUaW1lOiB3aW5kb3dTdGFydCwgZW5kVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRTdGF0dXNlcy5tYXAoZmV0Y2hQYWdlKSk7XG5cbiAgLy8gTWVyZ2UgdGhlIHBlci1zdGF0dXMgcGFnZXMgcm91bmQtcm9iaW4gc28gYSBmdWxsIHBhZ2Ugb2YgcnVubmluZyBydW5zXG4gIC8vIGNhbm5vdCBjcm93ZCBwZW5kaW5nIHJ1bnMgKHdoaWNoIGRvIG5vdCBoYXZlIGEgc3RhcnRlZEF0IHRpbWVzdGFtcCkgb3V0XG4gIC8vIG9mIGV2ZXJ5IGJhdGNoLiBQcmVzZXJ2ZSBlYWNoIHBhZ2UncyBiYWNrZW5kIG9yZGVyIGFuZCBkZWR1cGUgYnkgcnVuSWQgaW5cbiAgLy8gY2FzZSBhIHJ1biBjaGFuZ2VzIHN0YXR1cyB3aGlsZSB0aGUgcGFnZXMgYXJlIGZldGNoZWQuXG4gIGNvbnN0IHByb2plY3RlZFBhZ2VzID0gcGFnZXMubWFwKChwYWdlKSA9PlxuICAgIHBhZ2UuZGF0YS5tYXAoKHJ1bikgPT4gKHtcbiAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICBzdGF0dXM6IHJ1bi5zdGF0dXMsXG4gICAgICBzdGFydGVkQXQ6IHJ1bi5zdGFydGVkQXQsXG4gICAgfSkpXG4gICk7XG4gIGNvbnN0IG1lcmdlZDogKHR5cGVvZiBwcm9qZWN0ZWRQYWdlcylbbnVtYmVyXVtudW1iZXJdW10gPSBbXTtcbiAgY29uc3Qgc2VlblJ1bklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhQYWdlTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICAuLi5wcm9qZWN0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IHBhZ2UubGVuZ3RoKVxuICApO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWF4UGFnZUxlbmd0aDsgaW5kZXgrKykge1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiBwcm9qZWN0ZWRQYWdlcykge1xuICAgICAgY29uc3QgcnVuID0gcGFnZVtpbmRleF07XG4gICAgICBpZiAocnVuICYmICFzZWVuUnVuSWRzLmhhcyhydW4ucnVuSWQpKSB7XG4gICAgICAgIHNlZW5SdW5JZHMuYWRkKHJ1bi5ydW5JZCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKHJ1bik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJ1bnMgPSB7XG4gICAgZGF0YTogbWVyZ2VkLnNsaWNlKDAsIGxpbWl0KSxcbiAgICBoYXNNb3JlOiBwYWdlcy5zb21lKChwYWdlKSA9PiBwYWdlLmhhc01vcmUpIHx8IG1lcmdlZC5sZW5ndGggPiBsaW1pdCxcbiAgfTtcblxuICBpZiAocnVucy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBtYXRjaGluZyBydW5zIGZvdW5kLicpO1xuICAgIHJldHVybiB7IGV4aXRDb2RlOiAwIH07XG4gIH1cblxuICAvLyBEaXNwbGF5IHdoYXQgd2lsbCBiZSBjYW5jZWxsZWQuXG4gIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMuZGF0YSkge1xuICAgIGNvbnN0IHNob3J0TmFtZSA9XG4gICAgICBwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lIHx8IHJ1bi53b3JrZmxvd05hbWU7XG4gICAgdGFibGUuY2VsbCgncnVuSWQnLCBydW4ucnVuSWQpO1xuICAgIHRhYmxlLmNlbGwoJ3dvcmtmbG93JywgY2hhbGsuYmx1ZUJyaWdodChzaG9ydE5hbWUpKTtcbiAgICB0YWJsZS5jZWxsKCdzdGF0dXMnLCBydW4uc3RhdHVzKTtcbiAgICB0YWJsZS5jZWxsKFxuICAgICAgJ3N0YXJ0ZWRBdCcsXG4gICAgICBydW4uc3RhcnRlZEF0ID8gbmV3IERhdGUocnVuLnN0YXJ0ZWRBdCkudG9JU09TdHJpbmcoKSA6ICctJ1xuICAgICk7XG4gICAgdGFibGUubmV3Um93KCk7XG4gIH1cbiAgbG9nZ2VyLmxvZyhgXFxuRm91bmQgJHtjaGFsay5ib2xkKHJ1bnMuZGF0YS5sZW5ndGgpfSBydW5zIHRvIGNhbmNlbDpcXG5gKTtcbiAgbG9nZ2VyLmxvZyh0YWJsZS50b1N0cmluZygpKTtcblxuICBpZiAocnVucy5oYXNNb3JlKSB7XG4gICAgbG9nZ2VyLndhcm4oSEFTX01PUkVfR1VJREFOQ0UpO1xuICB9XG5cbiAgLy8gQ29uZmlybSB1bmxlc3MgLS1jb25maXJtLy15LlxuICBpZiAoIWNvbmZpcm0pIHtcbiAgICBjb25zdCBjb25maXJtZWQgPSBwcm9tcHRDb25maXJtXG4gICAgICA/IGF3YWl0IHByb21wdENvbmZpcm0oXG4gICAgICAgICAgYENhbmNlbCAke3J1bnMuZGF0YS5sZW5ndGh9IHJ1biR7cnVucy5kYXRhLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfT9gXG4gICAgICAgIClcbiAgICAgIDogZmFsc2U7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIGxvZ2dlci5sb2coJ0Fib3J0ZWQuJyk7XG4gICAgICByZXR1cm4geyBleGl0Q29kZTogMCB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uZSBidWxrIG9wZXJhdGlvbjogYSBzaW5nbGUgYmFja2VuZCByZXF1ZXN0IG9uIFZlcmNlbCwgb3IgYm91bmRlZFxuICAvLyBmYWxsYmFjayBjb25jdXJyZW5jeSBvbiBsb2NhbCAvIGNvbW11bml0eSB3b3JsZHMuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbmNlbFJ1bnMoXG4gICAgd29ybGQsXG4gICAgcnVucy5kYXRhLm1hcCgocnVuKSA9PiBydW4ucnVuSWQpLFxuICAgIHsgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTiB9XG4gICk7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMocmVzdWx0KSkge1xuICAgIGxvZ2dlci53YXJuKGxpbmUpO1xuICB9XG4gIGxvZ2dlci5sb2coYFxcbiR7Zm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkocmVzdWx0KX1gKTtcblxuICAvLyBBbHJlYWR5LWNhbmNlbGxlZCBhbmQgdGVybWluYWwgcnVucyBhcmUgdmFsaWQgcGFydGlhbCBvdXRjb21lczsgb25seSBhXG4gIC8vIGdlbnVpbmUgZmFpbHVyZSBpcyBhIG5vbnplcm8gZXhpdC5cbiAgcmV0dXJuIHsgZXhpdENvZGU6IHJlc3VsdC5zdW1tYXJ5LmZhaWxlZCA+IDAgPyAxIDogMCwgcmVzdWx0IH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bulk-cancel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-cancel.test.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,366 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { bulkCancelFailureLines, CLI_CANCEL_REASON, formatBulkCancelSummary, HAS_MORE_GUIDANCE, performBulkCancel, validateBulkCancelLimit, } from './bulk-cancel.js';
3
+ /** Collects logger output so assertions can inspect what the user saw. */
4
+ function makeLogger() {
5
+ const logs = [];
6
+ const warns = [];
7
+ const errors = [];
8
+ return {
9
+ logger: {
10
+ log: (m) => logs.push(m),
11
+ warn: (m) => warns.push(m),
12
+ error: (m) => errors.push(m),
13
+ },
14
+ logs,
15
+ warns,
16
+ errors,
17
+ };
18
+ }
19
+ /**
20
+ * Build a minimal fake world. `cancelMany` is attached only when provided,
21
+ * which is how {@link performBulkCancel} (via `cancelRuns`) decides between
22
+ * the single-request fast path and the per-run fallback.
23
+ */
24
+ function makeWorld(opts) {
25
+ const runsById = new Map(opts.runs.map((r) => [r.runId, r]));
26
+ const world = {
27
+ analytics: undefined,
28
+ runs: {
29
+ // Status-aware so tests can seed mixed-status runs and assert that only
30
+ // the requested status is matched. performBulkCancel always passes a
31
+ // concrete status per call (the pinned one, or each cancellable status).
32
+ list: vi.fn(async (params = {}) => ({
33
+ data: params.status
34
+ ? opts.runs.filter((r) => r.status === params.status)
35
+ : opts.runs,
36
+ hasMore: opts.hasMore ?? false,
37
+ })),
38
+ get: vi.fn(async (runId) => {
39
+ const run = runsById.get(runId);
40
+ if (!run)
41
+ throw new Error(`run ${runId} not found`);
42
+ return run;
43
+ }),
44
+ },
45
+ events: {
46
+ create: vi.fn(async (runId) => opts.eventsCreate?.(runId)),
47
+ },
48
+ };
49
+ if (opts.cancelMany) {
50
+ world.runs.cancelMany = vi.fn(opts.cancelMany);
51
+ }
52
+ return world;
53
+ }
54
+ describe('validateBulkCancelLimit', () => {
55
+ it('accepts integers within [1, 500]', () => {
56
+ expect(validateBulkCancelLimit(1)).toBeUndefined();
57
+ expect(validateBulkCancelLimit(50)).toBeUndefined();
58
+ expect(validateBulkCancelLimit(500)).toBeUndefined();
59
+ });
60
+ it('rejects out-of-range and non-integer values', () => {
61
+ expect(validateBulkCancelLimit(0)).toMatch(/between 1 and 500/);
62
+ expect(validateBulkCancelLimit(501)).toMatch(/between 1 and 500/);
63
+ expect(validateBulkCancelLimit(-5)).toMatch(/between 1 and 500/);
64
+ expect(validateBulkCancelLimit(1.5)).toMatch(/between 1 and 500/);
65
+ });
66
+ });
67
+ describe('formatBulkCancelSummary', () => {
68
+ it('renders every outcome category so counts add up to requested', () => {
69
+ const summary = formatBulkCancelSummary({
70
+ summary: {
71
+ requested: 7,
72
+ cancelled: 2,
73
+ alreadyCancelled: 1,
74
+ notCancellable: 1,
75
+ notFound: 3,
76
+ failed: 0,
77
+ },
78
+ results: [],
79
+ });
80
+ expect(summary).toBe([
81
+ 'Done:',
82
+ ' 2 cancelled',
83
+ ' 1 already cancelled',
84
+ ' 1 not cancellable',
85
+ ' 3 not found',
86
+ ' 0 failed',
87
+ ].join('\n'));
88
+ });
89
+ });
90
+ describe('bulkCancelFailureLines', () => {
91
+ it('surfaces only not_found, not_cancellable, and failed runs', () => {
92
+ const lines = bulkCancelFailureLines({
93
+ summary: {
94
+ requested: 5,
95
+ cancelled: 1,
96
+ alreadyCancelled: 1,
97
+ notCancellable: 1,
98
+ notFound: 1,
99
+ failed: 1,
100
+ },
101
+ results: [
102
+ { runId: 'a', outcome: 'cancelled' },
103
+ { runId: 'b', outcome: 'already_cancelled' },
104
+ { runId: 'c', outcome: 'not_cancellable', status: 'completed' },
105
+ { runId: 'd', outcome: 'not_found' },
106
+ {
107
+ runId: 'e',
108
+ outcome: 'failed',
109
+ code: 'internal_error',
110
+ retryable: true,
111
+ },
112
+ ],
113
+ });
114
+ expect(lines).toEqual([
115
+ ' ✗ c: not cancellable (completed)',
116
+ ' ✗ d: not found',
117
+ ' ✗ e: failed (internal_error, retryable)',
118
+ ]);
119
+ });
120
+ });
121
+ describe('performBulkCancel', () => {
122
+ it('warns and exits 0 when no runs match', async () => {
123
+ const { logger, warns } = makeLogger();
124
+ const world = makeWorld({ runs: [] });
125
+ const { exitCode, result } = await performBulkCancel({
126
+ world,
127
+ limit: 50,
128
+ confirm: true,
129
+ logger,
130
+ });
131
+ expect(exitCode).toBe(0);
132
+ expect(result).toBeUndefined();
133
+ expect(warns).toContain('No matching runs found.');
134
+ });
135
+ it('restricts to cancellable statuses and excludes terminal runs when no status is pinned', async () => {
136
+ const { logger } = makeLogger();
137
+ const cancelMany = vi.fn(async (req) => ({
138
+ summary: {
139
+ requested: req.runIds.length,
140
+ cancelled: req.runIds.length,
141
+ alreadyCancelled: 0,
142
+ notCancellable: 0,
143
+ notFound: 0,
144
+ failed: 0,
145
+ },
146
+ results: req.runIds.map((runId) => ({
147
+ runId,
148
+ outcome: 'cancelled',
149
+ })),
150
+ }));
151
+ const world = makeWorld({
152
+ runs: [
153
+ { runId: 'p1', workflowName: 'wf', status: 'pending' },
154
+ { runId: 'r1', workflowName: 'wf', status: 'running' },
155
+ // Terminal — must never be fetched or cancelled.
156
+ { runId: 'done', workflowName: 'wf', status: 'completed' },
157
+ ],
158
+ cancelMany,
159
+ });
160
+ const { exitCode } = await performBulkCancel({
161
+ world,
162
+ limit: 50,
163
+ confirm: true,
164
+ logger,
165
+ });
166
+ expect(exitCode).toBe(0);
167
+ const requestedStatuses = world.runs.list.mock.calls.map((c) => c[0]?.status);
168
+ expect(requestedStatuses).toContain('pending');
169
+ expect(requestedStatuses).toContain('running');
170
+ expect(requestedStatuses).not.toContain('completed');
171
+ // Only the cancellable runs reach cancelMany; the completed run is excluded.
172
+ expect(cancelMany).toHaveBeenCalledTimes(1);
173
+ expect([...cancelMany.mock.calls[0][0].runIds].sort()).toEqual([
174
+ 'p1',
175
+ 'r1',
176
+ ]);
177
+ });
178
+ it('round-robins status pages before applying the batch limit', async () => {
179
+ const { logger } = makeLogger();
180
+ const cancelMany = vi.fn(async (req) => ({
181
+ summary: {
182
+ requested: req.runIds.length,
183
+ cancelled: req.runIds.length,
184
+ alreadyCancelled: 0,
185
+ notCancellable: 0,
186
+ notFound: 0,
187
+ failed: 0,
188
+ },
189
+ results: req.runIds.map((runId) => ({
190
+ runId,
191
+ outcome: 'cancelled',
192
+ })),
193
+ }));
194
+ const world = makeWorld({
195
+ runs: [
196
+ ...Array.from({ length: 5 }, (_, index) => ({
197
+ runId: `r${index + 1}`,
198
+ workflowName: 'wf',
199
+ status: 'running',
200
+ startedAt: new Date(2026, 0, index + 1).toISOString(),
201
+ })),
202
+ ...Array.from({ length: 3 }, (_, index) => ({
203
+ runId: `p${index + 1}`,
204
+ workflowName: 'wf',
205
+ status: 'pending',
206
+ })),
207
+ ],
208
+ cancelMany,
209
+ });
210
+ await performBulkCancel({
211
+ world,
212
+ limit: 5,
213
+ confirm: true,
214
+ logger,
215
+ });
216
+ expect(cancelMany).toHaveBeenCalledWith({
217
+ runIds: ['p1', 'r1', 'p2', 'r2', 'p3'],
218
+ cancelReason: CLI_CANCEL_REASON,
219
+ });
220
+ });
221
+ it('uses the cancelMany fast path in a single call and skips per-run events', async () => {
222
+ const { logger } = makeLogger();
223
+ const cancelMany = vi.fn(async () => ({
224
+ summary: {
225
+ requested: 2,
226
+ cancelled: 2,
227
+ alreadyCancelled: 0,
228
+ notCancellable: 0,
229
+ notFound: 0,
230
+ failed: 0,
231
+ },
232
+ results: [
233
+ { runId: 'r1', outcome: 'cancelled' },
234
+ { runId: 'r2', outcome: 'cancelled' },
235
+ ],
236
+ }));
237
+ const world = makeWorld({
238
+ runs: [
239
+ { runId: 'r1', workflowName: 'wf', status: 'running' },
240
+ { runId: 'r2', workflowName: 'wf', status: 'running' },
241
+ ],
242
+ cancelMany,
243
+ });
244
+ const { exitCode } = await performBulkCancel({
245
+ world,
246
+ status: 'running',
247
+ limit: 50,
248
+ confirm: true,
249
+ logger,
250
+ });
251
+ expect(exitCode).toBe(0);
252
+ expect(cancelMany).toHaveBeenCalledTimes(1);
253
+ expect(cancelMany).toHaveBeenCalledWith({
254
+ runIds: ['r1', 'r2'],
255
+ cancelReason: CLI_CANCEL_REASON,
256
+ });
257
+ // Fast path must not fall back to per-run event creation.
258
+ expect(world.events.create).not.toHaveBeenCalled();
259
+ });
260
+ it('falls back to per-run cancellation when cancelMany is absent', async () => {
261
+ const { logger, logs } = makeLogger();
262
+ const world = makeWorld({
263
+ runs: [
264
+ { runId: 'r1', workflowName: 'wf', status: 'running' },
265
+ { runId: 'r2', workflowName: 'wf', status: 'running' },
266
+ ],
267
+ });
268
+ const { exitCode, result } = await performBulkCancel({
269
+ world,
270
+ status: 'running',
271
+ limit: 50,
272
+ confirm: true,
273
+ logger,
274
+ });
275
+ expect(exitCode).toBe(0);
276
+ expect(world.events.create).toHaveBeenCalledTimes(2);
277
+ expect(world.events.create).toHaveBeenCalledWith('r1', expect.objectContaining({
278
+ eventData: { cancelReason: CLI_CANCEL_REASON },
279
+ }), expect.anything());
280
+ expect(result?.summary.cancelled).toBe(2);
281
+ expect(logs.join('\n')).toContain('2 cancelled');
282
+ });
283
+ it('prints rerun guidance when more runs match than were fetched', async () => {
284
+ const { logger, warns } = makeLogger();
285
+ const world = makeWorld({
286
+ runs: [{ runId: 'r1', workflowName: 'wf', status: 'running' }],
287
+ hasMore: true,
288
+ cancelMany: async () => ({
289
+ summary: {
290
+ requested: 1,
291
+ cancelled: 1,
292
+ alreadyCancelled: 0,
293
+ notCancellable: 0,
294
+ notFound: 0,
295
+ failed: 0,
296
+ },
297
+ results: [{ runId: 'r1', outcome: 'cancelled' }],
298
+ }),
299
+ });
300
+ await performBulkCancel({
301
+ world,
302
+ status: 'running',
303
+ limit: 1,
304
+ confirm: true,
305
+ logger,
306
+ });
307
+ expect(warns).toContain(HAS_MORE_GUIDANCE);
308
+ });
309
+ it('exits 1 and surfaces per-run failures when a run fails', async () => {
310
+ const { logger, warns } = makeLogger();
311
+ const world = makeWorld({
312
+ runs: [
313
+ { runId: 'r1', workflowName: 'wf', status: 'running' },
314
+ { runId: 'r2', workflowName: 'wf', status: 'running' },
315
+ ],
316
+ cancelMany: async () => ({
317
+ summary: {
318
+ requested: 2,
319
+ cancelled: 1,
320
+ alreadyCancelled: 0,
321
+ notCancellable: 0,
322
+ notFound: 0,
323
+ failed: 1,
324
+ },
325
+ results: [
326
+ { runId: 'r1', outcome: 'cancelled' },
327
+ {
328
+ runId: 'r2',
329
+ outcome: 'failed',
330
+ code: 'internal_error',
331
+ retryable: true,
332
+ },
333
+ ],
334
+ }),
335
+ });
336
+ const { exitCode } = await performBulkCancel({
337
+ world,
338
+ status: 'running',
339
+ limit: 50,
340
+ confirm: true,
341
+ logger,
342
+ });
343
+ expect(exitCode).toBe(1);
344
+ expect(warns).toContain(' ✗ r2: failed (internal_error, retryable)');
345
+ });
346
+ it('aborts without cancelling when confirmation is declined', async () => {
347
+ const { logger, logs } = makeLogger();
348
+ const cancelMany = vi.fn();
349
+ const world = makeWorld({
350
+ runs: [{ runId: 'r1', workflowName: 'wf', status: 'running' }],
351
+ cancelMany: cancelMany,
352
+ });
353
+ const { exitCode } = await performBulkCancel({
354
+ world,
355
+ status: 'running',
356
+ limit: 50,
357
+ confirm: false,
358
+ logger,
359
+ promptConfirm: async () => false,
360
+ });
361
+ expect(exitCode).toBe(0);
362
+ expect(logs).toContain('Aborted.');
363
+ expect(cancelMany).not.toHaveBeenCalled();
364
+ });
365
+ });
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYnVsay1jYW5jZWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBUzFCLDBFQUEwRTtBQUMxRSxTQUFTLFVBQVU7SUFDakIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSTtRQUNKLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFPbEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQnVsa0NhbmNlbFdvcmtmbG93UnVuc1JlcXVlc3QsXG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7XG4gIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMsXG4gIENMSV9DQU5DRUxfUkVBU09OLFxuICBmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeSxcbiAgSEFTX01PUkVfR1VJREFOQ0UsXG4gIHBlcmZvcm1CdWxrQ2FuY2VsLFxuICB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCxcbn0gZnJvbSAnLi9idWxrLWNhbmNlbC5qcyc7XG5cbmludGVyZmFjZSBGYWtlUnVuIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb2xsZWN0cyBsb2dnZXIgb3V0cHV0IHNvIGFzc2VydGlvbnMgY2FuIGluc3BlY3Qgd2hhdCB0aGUgdXNlciBzYXcuICovXG5mdW5jdGlvbiBtYWtlTG9nZ2VyKCkge1xuICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICByZXR1cm4ge1xuICAgIGxvZ2dlcjoge1xuICAgICAgbG9nOiAobTogc3RyaW5nKSA9PiBsb2dzLnB1c2gobSksXG4gICAgICB3YXJuOiAobTogc3RyaW5nKSA9PiB3YXJucy5wdXNoKG0pLFxuICAgICAgZXJyb3I6IChtOiBzdHJpbmcpID0+IGVycm9ycy5wdXNoKG0pLFxuICAgIH0sXG4gICAgbG9ncyxcbiAgICB3YXJucyxcbiAgICBlcnJvcnMsXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaW5pbWFsIGZha2Ugd29ybGQuIGBjYW5jZWxNYW55YCBpcyBhdHRhY2hlZCBvbmx5IHdoZW4gcHJvdmlkZWQsXG4gKiB3aGljaCBpcyBob3cge0BsaW5rIHBlcmZvcm1CdWxrQ2FuY2VsfSAodmlhIGBjYW5jZWxSdW5zYCkgZGVjaWRlcyBiZXR3ZWVuXG4gKiB0aGUgc2luZ2xlLXJlcXVlc3QgZmFzdCBwYXRoIGFuZCB0aGUgcGVyLXJ1biBmYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gbWFrZVdvcmxkKG9wdHM6IHtcbiAgcnVuczogRmFrZVJ1bltdO1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgY2FuY2VsTWFueT86IChcbiAgICByZXF1ZXN0OiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICApID0+IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD47XG4gIGV2ZW50c0NyZWF0ZT86IChydW5JZDogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+O1xufSk6IFdvcmxkIHtcbiAgY29uc3QgcnVuc0J5SWQgPSBuZXcgTWFwKG9wdHMucnVucy5tYXAoKHIpID0+IFtyLnJ1bklkLCByXSkpO1xuICBjb25zdCB3b3JsZDogYW55ID0ge1xuICAgIGFuYWx5dGljczogdW5kZWZpbmVkLFxuICAgIHJ1bnM6IHtcbiAgICAgIC8vIFN0YXR1cy1hd2FyZSBzbyB0ZXN0cyBjYW4gc2VlZCBtaXhlZC1zdGF0dXMgcnVucyBhbmQgYXNzZXJ0IHRoYXQgb25seVxuICAgICAgLy8gdGhlIHJlcXVlc3RlZCBzdGF0dXMgaXMgbWF0Y2hlZC4gcGVyZm9ybUJ1bGtDYW5jZWwgYWx3YXlzIHBhc3NlcyBhXG4gICAgICAvLyBjb25jcmV0ZSBzdGF0dXMgcGVyIGNhbGwgKHRoZSBwaW5uZWQgb25lLCBvciBlYWNoIGNhbmNlbGxhYmxlIHN0YXR1cykuXG4gICAgICBsaXN0OiB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBnZXQ6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IHJ1bnNCeUlkLmdldChydW5JZCk7XG4gICAgICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjcmVhdGU6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiBvcHRzLmV2ZW50c0NyZWF0ZT8uKHJ1bklkKSksXG4gICAgfSxcbiAgfTtcbiAgaWYgKG9wdHMuY2FuY2VsTWFueSkge1xuICAgIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSA9IHZpLmZuKG9wdHMuY2FuY2VsTWFueSk7XG4gIH1cbiAgcmV0dXJuIHdvcmxkIGFzIFdvcmxkO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGludGVnZXJzIHdpdGhpbiBbMSwgNTAwXScsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoMSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoNTApKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDUwMCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgb3V0LW9mLXJhbmdlIGFuZCBub24taW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDApKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCg1MDEpKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgtNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEuNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeScsICgpID0+IHtcbiAgaXQoJ3JlbmRlcnMgZXZlcnkgb3V0Y29tZSBjYXRlZ29yeSBzbyBjb3VudHMgYWRkIHVwIHRvIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkoe1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICByZXF1ZXN0ZWQ6IDcsXG4gICAgICAgIGNhbmNlbGxlZDogMixcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMSxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDEsXG4gICAgICAgIG5vdEZvdW5kOiAzLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogW10sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN1bW1hcnkpLnRvQmUoXG4gICAgICBbXG4gICAgICAgICdEb25lOicsXG4gICAgICAgICcgIDIgY2FuY2VsbGVkJyxcbiAgICAgICAgJyAgMSBhbHJlYWR5IGNhbmNlbGxlZCcsXG4gICAgICAgICcgIDEgbm90IGNhbmNlbGxhYmxlJyxcbiAgICAgICAgJyAgMyBub3QgZm91bmQnLFxuICAgICAgICAnICAwIGZhaWxlZCcsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1bGtDYW5jZWxGYWlsdXJlTGluZXMnLCAoKSA9PiB7XG4gIGl0KCdzdXJmYWNlcyBvbmx5IG5vdF9mb3VuZCwgbm90X2NhbmNlbGxhYmxlLCBhbmQgZmFpbGVkIHJ1bnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiA1LFxuICAgICAgICBjYW5jZWxsZWQ6IDEsXG4gICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDEsXG4gICAgICAgIG5vdENhbmNlbGxhYmxlOiAxLFxuICAgICAgICBub3RGb3VuZDogMSxcbiAgICAgICAgZmFpbGVkOiAxLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgeyBydW5JZDogJ2EnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnYicsIG91dGNvbWU6ICdhbHJlYWR5X2NhbmNlbGxlZCcgfSxcbiAgICAgICAgeyBydW5JZDogJ2MnLCBvdXRjb21lOiAnbm90X2NhbmNlbGxhYmxlJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnZCcsIG91dGNvbWU6ICdub3RfZm91bmQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZDogJ2UnLFxuICAgICAgICAgIG91dGNvbWU6ICdmYWlsZWQnLFxuICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgcmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3QobGluZXMpLnRvRXF1YWwoW1xuICAgICAgJyAg4pyXIGM6IG5vdCBjYW5jZWxsYWJsZSAoY29tcGxldGVkKScsXG4gICAgICAnICDinJcgZDogbm90IGZvdW5kJyxcbiAgICAgICcgIOKclyBlOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BlcmZvcm1CdWxrQ2FuY2VsJywgKCkgPT4ge1xuICBpdCgnd2FybnMgYW5kIGV4aXRzIDAgd2hlbiBubyBydW5zIG1hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHsgcnVuczogW10gfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlLCByZXN1bHQgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUwLFxuICAgICAgY29uZmlybTogdHJ1ZSxcbiAgICAgIGxvZ2dlcixcbiAgICB9KTtcblxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJ05vIG1hdGNoaW5nIHJ1bnMgZm91bmQuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXN0cmljdHMgdG8gY2FuY2VsbGFibGUgc3RhdHVzZXMgYW5kIGV4Y2x1ZGVzIHRlcm1pbmFsIHJ1bnMgd2hlbiBubyBzdGF0dXMgaXMgcGlubmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKFxuICAgICAgICByZXE6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICAgICApOiBQcm9taXNlPEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ+ID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGNhbmNlbGxlZDogcmVxLnJ1bklkcy5sZW5ndGgsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IHJlcS5ydW5JZHMubWFwKChydW5JZCkgPT4gKHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBvdXRjb21lOiAnY2FuY2VsbGVkJyBhcyBjb25zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFtcbiAgICAgICAgeyBydW5JZDogJ3AxJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIC8vIFRlcm1pbmFsIOKAlCBtdXN0IG5ldmVyIGJlIGZldGNoZWQgb3IgY2FuY2VsbGVkLlxuICAgICAgICB7IHJ1bklkOiAnZG9uZScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgXSxcbiAgICAgIGNhbmNlbE1hbnksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgcmVxdWVzdGVkU3RhdHVzZXMgPSAod29ybGQucnVucy5saXN0IGFzIGFueSkubW9jay5jYWxscy5tYXAoXG4gICAgICAoYzogW3sgc3RhdHVzPzogc3RyaW5nIH1dKSA9PiBjWzBdPy5zdGF0dXNcbiAgICApO1xuICAgIGV4cGVjdChyZXF1ZXN0ZWRTdGF0dXNlcykudG9Db250YWluKCdwZW5kaW5nJyk7XG4gICAgZXhwZWN0KHJlcXVlc3RlZFN0YXR1c2VzKS50b0NvbnRhaW4oJ3J1bm5pbmcnKTtcbiAgICBleHBlY3QocmVxdWVzdGVkU3RhdHVzZXMpLm5vdC50b0NvbnRhaW4oJ2NvbXBsZXRlZCcpO1xuICAgIC8vIE9ubHkgdGhlIGNhbmNlbGxhYmxlIHJ1bnMgcmVhY2ggY2FuY2VsTWFueTsgdGhlIGNvbXBsZXRlZCBydW4gaXMgZXhjbHVkZWQuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoWy4uLmNhbmNlbE1hbnkubW9jay5jYWxsc1swXVswXS5ydW5JZHNdLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAncDEnLFxuICAgICAgJ3IxJyxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXJvYmlucyBzdGF0dXMgcGFnZXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiYXRjaCBsaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGxvZ2dlciB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IGNhbmNlbE1hbnkgPSB2aS5mbihcbiAgICAgIGFzeW5jIChcbiAgICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICAgKTogUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PiA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgICBjYW5jZWxsZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiByZXEucnVuSWRzLm1hcCgocnVuSWQpID0+ICh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgciR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoMjAyNiwgMCwgaW5kZXggKyAxKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDMgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgcCR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgY2FuY2VsTWFueSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUsXG4gICAgICBjb25maXJtOiB0cnVlLFxuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkczogWydwMScsICdyMScsICdwMicsICdyMicsICdwMyddLFxuICAgICAgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgdGhlIGNhbmNlbE1hbnkgZmFzdCBwYXRoIGluIGEgc2luZ2xlIGNhbGwgYW5kIHNraXBzIHBlci1ydW4gZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKCk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgIHJlcXVlc3RlZDogMixcbiAgICAgICAgICBjYW5jZWxsZWQ6IDIsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgICB7IHJ1bklkOiAncjEnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICAgIHsgcnVuSWQ6ICdyMicsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoY2FuY2VsTWFueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWRzOiBbJ3IxJywgJ3IyJ10sXG4gICAgICBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OLFxuICAgIH0pO1xuICAgIC8vIEZhc3QgcGF0aCBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gcGVyLXJ1biBldmVudCBjcmVhdGlvbi5cbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmNyZWF0ZSBhcyBhbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHBlci1ydW4gY2FuY2VsbGF0aW9uIHdoZW4gY2FuY2VsTWFueSBpcyBhYnNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIGxvZ3MgfSA9IG1ha2VMb2dnZXIoKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgICAgeyBydW5JZDogJ3IyJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdydW5uaW5nJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUsIHJlc3VsdCB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdyMScsXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OIH0sXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0Py5zdW1tYXJ5LmNhbmNlbGxlZCkudG9CZSgyKTtcbiAgICBleHBlY3QobG9ncy5qb2luKCdcXG4nKSkudG9Db250YWluKCcyIGNhbmNlbGxlZCcpO1xuICB9KTtcblxuICBpdCgncHJpbnRzIHJlcnVuIGd1aWRhbmNlIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFt7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH1dLFxuICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgIGNhbmNlbE1hbnk6IGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IDEsXG4gICAgICAgICAgY2FuY2VsbGVkOiAxLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiBbeyBydW5JZDogJ3IxJywgb3V0Y29tZTogJ2NhbmNlbGxlZCcgfV0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod2FybnMpLnRvQ29udGFpbihIQVNfTU9SRV9HVUlEQU5DRSk7XG4gIH0pO1xuXG4gIGl0KCdleGl0cyAxIGFuZCBzdXJmYWNlcyBwZXItcnVuIGZhaWx1cmVzIHdoZW4gYSBydW4gZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIHdhcm5zIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55OiBhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiAyLFxuICAgICAgICAgIGNhbmNlbGxlZDogMSxcbiAgICAgICAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgICAgICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICAgIGZhaWxlZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgIHsgcnVuSWQ6ICdyMScsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQ6ICdyMicsXG4gICAgICAgICAgICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJyAg4pyXIHIyOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyk7XG4gIH0pO1xuXG4gIGl0KCdhYm9ydHMgd2l0aG91dCBjYW5jZWxsaW5nIHdoZW4gY29uZmlybWF0aW9uIGlzIGRlY2xpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCBsb2dzIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW3sgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfV0sXG4gICAgICBjYW5jZWxNYW55OiBjYW5jZWxNYW55IGFzIGFueSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogNTAsXG4gICAgICBjb25maXJtOiBmYWxzZSxcbiAgICAgIGxvZ2dlcixcbiAgICAgIHByb21wdENvbmZpcm06IGFzeW5jICgpID0+IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICAgIGV4cGVjdChsb2dzKS50b0NvbnRhaW4oJ0Fib3J0ZWQuJyk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/cli",
3
- "version": "5.0.0-beta.39",
3
+ "version": "5.0.0-beta.40",
4
4
  "description": "Command-line interface for Workflow SDK",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,15 +56,15 @@
56
56
  "tinyglobby": "0.2.17",
57
57
  "xdg-app-paths": "5.1.0",
58
58
  "zod": "~4.3.6",
59
- "@workflow/builders": "5.0.0-beta.39",
60
- "@workflow/core": "5.0.0-beta.39",
61
- "@workflow/errors": "5.0.0-beta.15",
59
+ "@workflow/builders": "5.0.0-beta.40",
60
+ "@workflow/core": "5.0.0-beta.40",
61
+ "@workflow/errors": "5.0.0-beta.16",
62
62
  "@workflow/swc-plugin": "5.0.0-beta.5",
63
63
  "@workflow/utils": "5.0.0-beta.8",
64
- "@workflow/web": "5.0.0-beta.39",
65
- "@workflow/world": "5.0.0-beta.24",
66
- "@workflow/world-local": "5.0.0-beta.33",
67
- "@workflow/world-vercel": "5.0.0-beta.35"
64
+ "@workflow/web": "5.0.0-beta.40",
65
+ "@workflow/world": "5.0.0-beta.25",
66
+ "@workflow/world-local": "5.0.0-beta.34",
67
+ "@workflow/world-vercel": "5.0.0-beta.36"
68
68
  },
69
69
  "scripts": {
70
70
  "build": "tsc && chmod +x bin/run.js",