@pipeline-builder/pipeline-manager 4.1.28 → 4.1.30

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.
@@ -0,0 +1,315 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * `pipeline-manager report …` — the stakeholder-report add-on from a terminal.
5
+ *
6
+ * Seven verbs, matching the API surface a lead actually drives: `create`, `list`,
7
+ * `run --period`, `publish`, `link`, `pdf` and `transfer`.
8
+ *
9
+ * WHY A CLI FOR THIS AT ALL. Two jobs the dashboard is the wrong shape for. The first is
10
+ * BACKFILL: `report run --period 2026-W34` for each of five weeks is a loop in a shell and
11
+ * five careful clicks in a browser. The second is UNATTENDED OPERATION — a team that wants
12
+ * its report produced by its own scheduler rather than ours, or wants publishing gated on a
13
+ * release finishing, needs a command with an exit code.
14
+ *
15
+ * EVERY GATE IS THE SERVER'S. The CLI checks nothing: `reports:author` for create and run,
16
+ * `reports:share` for publish and link, `reports:read` for pdf, the `stakeholder_reports`
17
+ * feature for all of them,
18
+ * and the org's admin-owned policy for whether a link may be minted at all. The caller's
19
+ * token decides, and a 403 is printed as the server worded it — a CLI that pre-judged
20
+ * would be a second copy of the rules, wrong the first time either changed.
21
+ */
22
+ import { writeFileSync } from 'node:fs';
23
+ import { Command } from 'commander';
24
+ import pico from 'picocolors';
25
+ import { createAuthenticatedClient, printCommandHeader, printExecutionSummary, printSslWarning, withSslOptions } from '../utils/command-utils.js';
26
+ import { ERROR_CODES, handleError } from '../utils/error-handler.js';
27
+ import { printInfo, printKeyValue, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
28
+ const { bold, dim, green, yellow } = pico;
29
+ const BASE = '/api/reports/stakeholder';
30
+ /** Unwrap an envelope, or fail with the server's own words. */
31
+ function unwrap(response, what) {
32
+ const env = response;
33
+ if (!env || env.success === false || !env.data) {
34
+ throw new Error(env?.message ?? `The server returned no ${what}`);
35
+ }
36
+ return env.data;
37
+ }
38
+ export function report(program) {
39
+ const group = program.command('report').description('Create, run, publish and share stakeholder reports');
40
+ // ── list ──────────────────────────────────────────────────────────────────
41
+ withSslOptions(group
42
+ .command('list')
43
+ .description('List this organization\'s saved reports, their schedule and pause state.'))
44
+ .action(async (options) => {
45
+ const executionId = printCommandHeader('Report List');
46
+ try {
47
+ printSslWarning(options.verifySsl);
48
+ const client = createAuthenticatedClient(options);
49
+ const start = Date.now();
50
+ const data = unwrap(await client.get(`${client.getConfig().api.baseUrl}${BASE}/definitions`), 'reports');
51
+ printSection('Saved Reports');
52
+ if (data.definitions.length === 0) {
53
+ printInfo('No saved reports yet. Create one with `pipeline-manager report create`.');
54
+ }
55
+ for (const d of data.definitions) {
56
+ // The pause REASON, not just the state: "paused" on its own is a support ticket.
57
+ const state = d.isActive
58
+ ? green('active')
59
+ : yellow(`paused${d.pausedReason ? ` (${d.pausedReason})` : ''}`);
60
+ printKeyValue({
61
+ [bold(d.name)]: `${state} ${dim(`· ${d.cadence} · ${d.timezone} · ${d.recipients.length} recipient(s)${d.autoSend ? ' · auto-send' : ''}`)}`,
62
+ ' id': d.id,
63
+ ' next run': d.nextRunAt ?? '(not scheduled)',
64
+ ' last run': d.lastRunAt ?? '(never)',
65
+ });
66
+ }
67
+ printExecutionSummary(executionId, Date.now() - start);
68
+ }
69
+ catch (error) {
70
+ handleError(error, ERROR_CODES.API_REQUEST, {
71
+ debug: program.opts().debug,
72
+ exit: true,
73
+ context: { command: 'report-list', executionId },
74
+ });
75
+ }
76
+ });
77
+ // ── create ────────────────────────────────────────────────────────────────
78
+ withSslOptions(group
79
+ .command('create')
80
+ .description('Save a new scheduled report. The creator owns it; a scheduled run is authorized as the owner.')
81
+ .requiredOption('-n, --name <name>', 'Report name, as its recipients will see it')
82
+ .option('-t, --template <template>', 'weekly_delivery | monthly_health | quarterly_review', 'weekly_delivery')
83
+ .option('-z, --timezone <tz>', 'IANA timezone the period is cut in (defaults to the server\'s report default)')
84
+ .option('--week-start <day>', 'monday | sunday')
85
+ .option('--scope <kind>', 'org | projects | rollup', 'org')
86
+ .option('--projects <names>', 'Comma-separated project names (with --scope projects)')
87
+ .option('--recipients <ids>', 'Comma-separated recipient IDs from the org\'s distribution list')
88
+ .option('--auto-send', 'Publish without review. Off by default — the review step is where the context goes.'))
89
+ .action(async (options) => {
90
+ const executionId = printCommandHeader('Report Create');
91
+ try {
92
+ printSslWarning(options.verifySsl);
93
+ const client = createAuthenticatedClient(options);
94
+ const projects = splitList(options.projects);
95
+ if (options.scope === 'projects' && projects.length === 0) {
96
+ throw new Error('--scope projects needs --projects with at least one project name');
97
+ }
98
+ const body = {
99
+ name: options.name,
100
+ template: options.template,
101
+ scope: options.scope === 'projects' ? { kind: 'projects', projects } : { kind: options.scope },
102
+ recipients: splitList(options.recipients),
103
+ autoSend: options.autoSend === true,
104
+ ...(options.timezone ? { timezone: options.timezone } : {}),
105
+ ...(options.weekStart ? { weekStart: options.weekStart } : {}),
106
+ };
107
+ const start = Date.now();
108
+ const data = unwrap(await client.post(`${client.getConfig().api.baseUrl}${BASE}/definitions`, body), 'report');
109
+ printSection('Report Saved');
110
+ printKeyValue({
111
+ 'Name': green(bold(data.definition.name)),
112
+ 'ID': data.definition.id,
113
+ 'Cadence': `${data.definition.cadence} · ${data.definition.timezone}`,
114
+ 'Next run': data.definition.nextRunAt ?? '(not scheduled)',
115
+ });
116
+ if (data.definition.recipients.length === 0) {
117
+ // Said here because it is the most common way a new report reaches nobody: the
118
+ // distribution list is per ORG and an address confirms by email before delivery.
119
+ printWarning('No recipients yet — add them in the dashboard; an external address confirms by email before anything is delivered.');
120
+ }
121
+ printSuccess('Report created');
122
+ printExecutionSummary(executionId, Date.now() - start);
123
+ }
124
+ catch (error) {
125
+ handleError(error, ERROR_CODES.API_REQUEST, {
126
+ debug: program.opts().debug,
127
+ exit: true,
128
+ context: { command: 'report-create', executionId },
129
+ });
130
+ }
131
+ });
132
+ // ── run ───────────────────────────────────────────────────────────────────
133
+ withSslOptions(group
134
+ .command('run')
135
+ .description('Compose one period into a frozen snapshot. Without --period, the last complete period.')
136
+ .requiredOption('-i, --id <id>', 'Report definition ID')
137
+ .option('-p, --period <label>', 'Period label: 2026-W38 (weekly), 2026-08 (monthly), 2026-Q3 (quarterly)')
138
+ .option('--regenerate', 'Produce version N+1 instead of reusing an existing snapshot'))
139
+ .action(async (options) => {
140
+ const executionId = printCommandHeader('Report Run');
141
+ try {
142
+ printSslWarning(options.verifySsl);
143
+ const client = createAuthenticatedClient(options);
144
+ const start = Date.now();
145
+ const data = unwrap(await client.post(`${client.getConfig().api.baseUrl}${BASE}/definitions/${encodeURIComponent(options.id)}/runs`, {
146
+ ...(options.period ? { period: options.period } : {}),
147
+ ...(options.regenerate ? { regenerate: true } : {}),
148
+ }), 'run');
149
+ printSection(data.reused ? 'Existing Snapshot' : 'Snapshot Composed');
150
+ printKeyValue({
151
+ 'Period': green(bold(data.run.periodLabel)),
152
+ 'Run ID': data.run.id,
153
+ 'Version': String(data.run.version),
154
+ 'Status': data.run.status,
155
+ });
156
+ if (data.reused) {
157
+ // Not a no-op to hide: a frozen snapshot's numbers do not change, so re-running
158
+ // returns what exists. `--regenerate` is how you ask for a new version.
159
+ printInfo('This period already had a snapshot, so it was returned unchanged. Use --regenerate for a new version.');
160
+ }
161
+ printExecutionSummary(executionId, Date.now() - start);
162
+ }
163
+ catch (error) {
164
+ handleError(error, ERROR_CODES.API_REQUEST, {
165
+ debug: program.opts().debug,
166
+ exit: true,
167
+ context: { command: 'report-run', executionId },
168
+ });
169
+ }
170
+ });
171
+ // ── publish ───────────────────────────────────────────────────────────────
172
+ withSslOptions(group
173
+ .command('publish')
174
+ .description('Publish a composed run. Needs reports:share — publishing is when numbers leave the platform.')
175
+ .requiredOption('-r, --run <id>', 'Run ID to publish'))
176
+ .action(async (options) => {
177
+ const executionId = printCommandHeader('Report Publish');
178
+ try {
179
+ printSslWarning(options.verifySsl);
180
+ const client = createAuthenticatedClient(options);
181
+ const start = Date.now();
182
+ const data = unwrap(await client.post(`${client.getConfig().api.baseUrl}${BASE}/runs/${encodeURIComponent(options.run)}/publish`, {}), 'run');
183
+ printSection('Published');
184
+ printKeyValue({
185
+ 'Period': green(bold(data.run.periodLabel)),
186
+ 'Published at': data.run.publishedAt ?? '(unknown)',
187
+ });
188
+ if (data.alreadyPublished) {
189
+ // Idempotent by design: two publishes send one report, so a retried script is
190
+ // safe. Reported rather than silent, so a wrapper can tell the difference.
191
+ printInfo('This run was already published; nothing was sent again.');
192
+ }
193
+ else {
194
+ printSuccess('Published — delivery is under way');
195
+ }
196
+ printExecutionSummary(executionId, Date.now() - start);
197
+ }
198
+ catch (error) {
199
+ handleError(error, ERROR_CODES.API_REQUEST, {
200
+ debug: program.opts().debug,
201
+ exit: true,
202
+ context: { command: 'report-publish', executionId },
203
+ });
204
+ }
205
+ });
206
+ // ── link ──────────────────────────────────────────────────────────────────
207
+ withSslOptions(group
208
+ .command('link')
209
+ .description('Mint an expiring read-only link to a published run. The token is shown ONCE.')
210
+ .requiredOption('-r, --run <id>', 'Published run ID')
211
+ .option('--days <n>', 'Days until it expires (server default 30, maximum 180)')
212
+ .option('--redact-names', 'Replace project and pipeline names in the shared view'))
213
+ .action(async (options) => {
214
+ const executionId = printCommandHeader('Report Link');
215
+ try {
216
+ printSslWarning(options.verifySsl);
217
+ const client = createAuthenticatedClient(options);
218
+ const days = options.days === undefined ? undefined : Number(options.days);
219
+ if (days !== undefined && (!Number.isInteger(days) || days < 1)) {
220
+ throw new Error('--days must be a positive whole number of days');
221
+ }
222
+ const start = Date.now();
223
+ const data = unwrap(await client.post(`${client.getConfig().api.baseUrl}${BASE}/runs/${encodeURIComponent(options.run)}/links`, {
224
+ ...(days !== undefined ? { expiresInDays: days } : {}),
225
+ ...(options.redactNames ? { redactNames: true } : {}),
226
+ }), 'link');
227
+ printSection('Share Link');
228
+ printKeyValue({
229
+ Link: green(bold(data.url ?? data.token ?? '(not returned)')),
230
+ Expires: data.expiresAt,
231
+ });
232
+ // Said every time, because it is true every time and the consequence is permanent:
233
+ // the server stores only a hash, so a lost token cannot be recovered, only replaced.
234
+ printWarning('Copy this now — only a hash is stored, so it cannot be shown again. Revoke it in the dashboard if it leaks.');
235
+ printExecutionSummary(executionId, Date.now() - start);
236
+ }
237
+ catch (error) {
238
+ handleError(error, ERROR_CODES.API_REQUEST, {
239
+ debug: program.opts().debug,
240
+ exit: true,
241
+ context: { command: 'report-link', executionId },
242
+ });
243
+ }
244
+ });
245
+ // ── pdf ───────────────────────────────────────────────────────────────────
246
+ withSslOptions(group
247
+ .command('pdf')
248
+ .description('Download a run as a PDF. Needs reports:read — the same permission as reading the run.')
249
+ .requiredOption('-r, --run <id>', 'Run ID to download')
250
+ .option('-o, --out <file>', 'Where to write it (default: the file name the server chose, in the working directory)'))
251
+ .action(async (options) => {
252
+ const executionId = printCommandHeader('Report PDF');
253
+ try {
254
+ printSslWarning(options.verifySsl);
255
+ const client = createAuthenticatedClient(options);
256
+ const start = Date.now();
257
+ const { data, filename } = await client.getBinary(`${client.getConfig().api.baseUrl}${BASE}/runs/${encodeURIComponent(options.run)}/pdf`);
258
+ // The server's name unless the caller asked for one: it knows the report's title and
259
+ // whether this run is a revision, and a scripted board pack wants that name.
260
+ const target = typeof options.out === 'string' && options.out.length > 0
261
+ ? options.out
262
+ : (filename ?? `report-${options.run}.pdf`);
263
+ writeFileSync(target, data);
264
+ printSection('Downloaded');
265
+ printKeyValue({ File: green(bold(target)), Size: `${(data.length / 1024).toFixed(1)} KiB` });
266
+ printSuccess('Saved');
267
+ printExecutionSummary(executionId, Date.now() - start);
268
+ }
269
+ catch (error) {
270
+ // A 503 here is not a failure of the report: this instance has no Chromium, and the
271
+ // server says so in words. It still exits non-zero, because a script that asked for a
272
+ // file and got none must not carry on as though it has one.
273
+ handleError(error, ERROR_CODES.API_REQUEST, {
274
+ debug: program.opts().debug,
275
+ exit: true,
276
+ context: { command: 'report-pdf', executionId },
277
+ });
278
+ }
279
+ });
280
+ // ── transfer ──────────────────────────────────────────────────────────────
281
+ withSslOptions(group
282
+ .command('transfer')
283
+ .description('Hand a report to a new owner. A scheduled run is authorized AS the owner, so this is a privilege move.')
284
+ .requiredOption('-i, --id <id>', 'Report definition ID')
285
+ .requiredOption('-o, --owner <userId>', 'New owner\'s user ID — must be a live member of this org'))
286
+ .action(async (options) => {
287
+ const executionId = printCommandHeader('Report Transfer');
288
+ try {
289
+ printSslWarning(options.verifySsl);
290
+ const client = createAuthenticatedClient(options);
291
+ const start = Date.now();
292
+ const data = unwrap(await client.post(`${client.getConfig().api.baseUrl}${BASE}/definitions/${encodeURIComponent(options.id)}/transfer`, { ownerId: options.owner }), 'report');
293
+ printSection('Ownership Transferred');
294
+ printKeyValue({ 'Report': green(bold(data.definition.name)), 'New owner': options.owner });
295
+ // The consequence, in one line: from now on the report computes with a different
296
+ // person's access, which can change what it contains.
297
+ printInfo('Future runs are authorized as the new owner, so the report now computes with their access.');
298
+ printExecutionSummary(executionId, Date.now() - start);
299
+ }
300
+ catch (error) {
301
+ handleError(error, ERROR_CODES.API_REQUEST, {
302
+ debug: program.opts().debug,
303
+ exit: true,
304
+ context: { command: 'report-transfer', executionId },
305
+ });
306
+ }
307
+ });
308
+ }
309
+ /** `"a, b ,c"` → `['a','b','c']`; empty or absent → `[]`. */
310
+ function splitList(value) {
311
+ if (typeof value !== 'string')
312
+ return [];
313
+ return value.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
314
+ }
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3JlcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEosT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlHLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUEwQjFDLE1BQU0sSUFBSSxHQUFHLDBCQUEwQixDQUFDO0FBS3hDLCtEQUErRDtBQUMvRCxTQUFTLE1BQU0sQ0FBSSxRQUFpQixFQUFFLElBQVk7SUFDaEQsTUFBTSxHQUFHLEdBQUcsUUFBbUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ2xCLENB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cUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFO2FBQ3JELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsU0FBUyxTQUFTLENBQUMsS0FBYztJQUMvQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN6QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIGBwaXBlbGluZS1tYW5hZ2VyIHJlcG9ydCDigKZgIOKAlCB0aGUgc3Rha2Vob2xkZXItcmVwb3J0IGFkZC1vbiBmcm9tIGEgdGVybWluYWwuXG4gKlxuICogU2V2ZW4gdmVyYnMsIG1hdGNoaW5nIHRoZSBBUEkgc3VyZmFjZSBhIGxlYWQgYWN0dWFsbHkgZHJpdmVzOiBgY3JlYXRlYCwgYGxpc3RgLFxuICogYHJ1biAtLXBlcmlvZGAsIGBwdWJsaXNoYCwgYGxpbmtgLCBgcGRmYCBhbmQgYHRyYW5zZmVyYC5cbiAqXG4gKiBXSFkgQSBDTEkgRk9SIFRISVMgQVQgQUxMLiBUd28gam9icyB0aGUgZGFzaGJvYXJkIGlzIHRoZSB3cm9uZyBzaGFwZSBmb3IuIFRoZSBmaXJzdCBpc1xuICogQkFDS0ZJTEw6IGByZXBvcnQgcnVuIC0tcGVyaW9kIDIwMjYtVzM0YCBmb3IgZWFjaCBvZiBmaXZlIHdlZWtzIGlzIGEgbG9vcCBpbiBhIHNoZWxsIGFuZFxuICogZml2ZSBjYXJlZnVsIGNsaWNrcyBpbiBhIGJyb3dzZXIuIFRoZSBzZWNvbmQgaXMgVU5BVFRFTkRFRCBPUEVSQVRJT04g4oCUIGEgdGVhbSB0aGF0IHdhbnRzXG4gKiBpdHMgcmVwb3J0IHByb2R1Y2VkIGJ5IGl0cyBvd24gc2NoZWR1bGVyIHJhdGhlciB0aGFuIG91cnMsIG9yIHdhbnRzIHB1Ymxpc2hpbmcgZ2F0ZWQgb24gYVxuICogcmVsZWFzZSBmaW5pc2hpbmcsIG5lZWRzIGEgY29tbWFuZCB3aXRoIGFuIGV4aXQgY29kZS5cbiAqXG4gKiBFVkVSWSBHQVRFIElTIFRIRSBTRVJWRVInUy4gVGhlIENMSSBjaGVja3Mgbm90aGluZzogYHJlcG9ydHM6YXV0aG9yYCBmb3IgY3JlYXRlIGFuZCBydW4sXG4gKiBgcmVwb3J0czpzaGFyZWAgZm9yIHB1Ymxpc2ggYW5kIGxpbmssIGByZXBvcnRzOnJlYWRgIGZvciBwZGYsIHRoZSBgc3Rha2Vob2xkZXJfcmVwb3J0c2BcbiAqIGZlYXR1cmUgZm9yIGFsbCBvZiB0aGVtLFxuICogYW5kIHRoZSBvcmcncyBhZG1pbi1vd25lZCBwb2xpY3kgZm9yIHdoZXRoZXIgYSBsaW5rIG1heSBiZSBtaW50ZWQgYXQgYWxsLiBUaGUgY2FsbGVyJ3NcbiAqIHRva2VuIGRlY2lkZXMsIGFuZCBhIDQwMyBpcyBwcmludGVkIGFzIHRoZSBzZXJ2ZXIgd29yZGVkIGl0IOKAlCBhIENMSSB0aGF0IHByZS1qdWRnZWRcbiAqIHdvdWxkIGJlIGEgc2Vjb25kIGNvcHkgb2YgdGhlIHJ1bGVzLCB3cm9uZyB0aGUgZmlyc3QgdGltZSBlaXRoZXIgY2hhbmdlZC5cbiAqL1xuXG5pbXBvcnQgeyB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudCwgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludEV4ZWN1dGlvblN1bW1hcnksIHByaW50U3NsV2FybmluZywgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcblxuY29uc3QgeyBib2xkLCBkaW0sIGdyZWVuLCB5ZWxsb3cgfSA9IHBpY287XG5cbi8qKiBUaGUgQVBJIHNoYXBlIHRoZSBDTEkgcmVhZHMuIE5hcnJvd2VkIHRvIHdoYXQgaXQgcHJpbnRzLiAqL1xuaW50ZXJmYWNlIFJlcG9ydERlZmluaXRpb24ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHRlbXBsYXRlOiBzdHJpbmc7XG4gIGNhZGVuY2U6IHN0cmluZztcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgd2Vla1N0YXJ0OiBzdHJpbmc7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICBwYXVzZWRSZWFzb24/OiBzdHJpbmcgfCBudWxsO1xuICBuZXh0UnVuQXQ/OiBzdHJpbmcgfCBudWxsO1xuICBsYXN0UnVuQXQ/OiBzdHJpbmcgfCBudWxsO1xuICByZWNpcGllbnRzOiBzdHJpbmdbXTtcbiAgYXV0b1NlbmQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZXBvcnRSdW4ge1xuICBpZDogc3RyaW5nO1xuICBwZXJpb2RMYWJlbDogc3RyaW5nO1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwdWJsaXNoZWRBdD86IHN0cmluZyB8IG51bGw7XG59XG5cbmNvbnN0IEJBU0UgPSAnL2FwaS9yZXBvcnRzL3N0YWtlaG9sZGVyJztcblxuLyoqIFRoZSByZXNwb25zZSBlbnZlbG9wZSBldmVyeSByb3V0ZSBoZXJlIHJldHVybnMuICovXG5pbnRlcmZhY2UgRW52ZWxvcGU8VD4geyBzdWNjZXNzPzogYm9vbGVhbjsgZGF0YT86IFQ7IG1lc3NhZ2U/OiBzdHJpbmcgfVxuXG4vKiogVW53cmFwIGFuIGVudmVsb3BlLCBvciBmYWlsIHdpdGggdGhlIHNlcnZlcidzIG93biB3b3Jkcy4gKi9cbmZ1bmN0aW9uIHVud3JhcDxUPihyZXNwb25zZTogdW5rbm93biwgd2hhdDogc3RyaW5nKTogVCB7XG4gIGNvbnN0IGVudiA9IHJlc3BvbnNlIGFzIEVudmVsb3BlPFQ+IHwgdW5kZWZpbmVkO1xuICBpZiAoIWVudiB8fCBlbnYuc3VjY2VzcyA9PT0gZmFsc2UgfHwgIWVudi5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVudj8ubWVzc2FnZSA/PyBgVGhlIHNlcnZlciByZXR1cm5lZCBubyAke3doYXR9YCk7XG4gIH1cbiAgcmV0dXJuIGVudi5kYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0KHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgY29uc3QgZ3JvdXAgPSBwcm9ncmFtLmNvbW1hbmQoJ3JlcG9ydCcpLmRlc2NyaXB0aW9uKCdDcmVhdGUsIHJ1biwgcHVibGlzaCBhbmQgc2hhcmUgc3Rha2Vob2xkZXIgcmVwb3J0cycpO1xuXG4gIC8vIOKUgOKUgCBsaXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB3aXRoU3NsT3B0aW9ucyhncm91cFxuICAgIC5jb21tYW5kKCdsaXN0JylcbiAgICAuZGVzY3JpcHRpb24oJ0xpc3QgdGhpcyBvcmdhbml6YXRpb25cXCdzIHNhdmVkIHJlcG9ydHMsIHRoZWlyIHNjaGVkdWxlIGFuZCBwYXVzZSBzdGF0ZS4nKSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignUmVwb3J0IExpc3QnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDx7IGRlZmluaXRpb25zOiBSZXBvcnREZWZpbml0aW9uW10gfT4oXG4gICAgICAgICAgYXdhaXQgY2xpZW50LmdldChgJHtjbGllbnQuZ2V0Q29uZmlnKCkuYXBpLmJhc2VVcmx9JHtCQVNFfS9kZWZpbml0aW9uc2ApLCAncmVwb3J0cycsXG4gICAgICAgICk7XG4gICAgICAgIHByaW50U2VjdGlvbignU2F2ZWQgUmVwb3J0cycpO1xuICAgICAgICBpZiAoZGF0YS5kZWZpbml0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBwcmludEluZm8oJ05vIHNhdmVkIHJlcG9ydHMgeWV0LiBDcmVhdGUgb25lIHdpdGggYHBpcGVsaW5lLW1hbmFnZXIgcmVwb3J0IGNyZWF0ZWAuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBkIG9mIGRhdGEuZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAvLyBUaGUgcGF1c2UgUkVBU09OLCBub3QganVzdCB0aGUgc3RhdGU6IFwicGF1c2VkXCIgb24gaXRzIG93biBpcyBhIHN1cHBvcnQgdGlja2V0LlxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gZC5pc0FjdGl2ZVxuICAgICAgICAgICAgPyBncmVlbignYWN0aXZlJylcbiAgICAgICAgICAgIDogeWVsbG93KGBwYXVzZWQke2QucGF1c2VkUmVhc29uID8gYCAoJHtkLnBhdXNlZFJlYXNvbn0pYCA6ICcnfWApO1xuICAgICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICAgW2JvbGQoZC5uYW1lKV06IGAke3N0YXRlfSAke2RpbShgwrcgJHtkLmNhZGVuY2V9IMK3ICR7ZC50aW1lem9uZX0gwrcgJHtkLnJlY2lwaWVudHMubGVuZ3RofSByZWNpcGllbnQocykke2QuYXV0b1NlbmQgPyAnIMK3IGF1dG8tc2VuZCcgOiAnJ31gKX1gLFxuICAgICAgICAgICAgJyAgaWQnOiBkLmlkLFxuICAgICAgICAgICAgJyAgbmV4dCBydW4nOiBkLm5leHRSdW5BdCA/PyAnKG5vdCBzY2hlZHVsZWQpJyxcbiAgICAgICAgICAgICcgIGxhc3QgcnVuJzogZC5sYXN0UnVuQXQgPz8gJyhuZXZlciknLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaW50RXhlY3V0aW9uU3VtbWFyeShleGVjdXRpb25JZCwgRGF0ZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3JlcG9ydC1saXN0JywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgLy8g4pSA4pSAIGNyZWF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgd2l0aFNzbE9wdGlvbnMoZ3JvdXBcbiAgICAuY29tbWFuZCgnY3JlYXRlJylcbiAgICAuZGVzY3JpcHRpb24oJ1NhdmUgYSBuZXcgc2NoZWR1bGVkIHJlcG9ydC4gVGhlIGNyZWF0b3Igb3ducyBpdDsgYSBzY2hlZHVsZWQgcnVuIGlzIGF1dGhvcml6ZWQgYXMgdGhlIG93bmVyLicpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uYW1lIDxuYW1lPicsICdSZXBvcnQgbmFtZSwgYXMgaXRzIHJlY2lwaWVudHMgd2lsbCBzZWUgaXQnKVxuICAgIC5vcHRpb24oJy10LCAtLXRlbXBsYXRlIDx0ZW1wbGF0ZT4nLCAnd2Vla2x5X2RlbGl2ZXJ5IHwgbW9udGhseV9oZWFsdGggfCBxdWFydGVybHlfcmV2aWV3JywgJ3dlZWtseV9kZWxpdmVyeScpXG4gICAgLm9wdGlvbignLXosIC0tdGltZXpvbmUgPHR6PicsICdJQU5BIHRpbWV6b25lIHRoZSBwZXJpb2QgaXMgY3V0IGluIChkZWZhdWx0cyB0byB0aGUgc2VydmVyXFwncyByZXBvcnQgZGVmYXVsdCknKVxuICAgIC5vcHRpb24oJy0td2Vlay1zdGFydCA8ZGF5PicsICdtb25kYXkgfCBzdW5kYXknKVxuICAgIC5vcHRpb24oJy0tc2NvcGUgPGtpbmQ+JywgJ29yZyB8IHByb2plY3RzIHwgcm9sbHVwJywgJ29yZycpXG4gICAgLm9wdGlvbignLS1wcm9qZWN0cyA8bmFtZXM+JywgJ0NvbW1hLXNlcGFyYXRlZCBwcm9qZWN0IG5hbWVzICh3aXRoIC0tc2NvcGUgcHJvamVjdHMpJylcbiAgICAub3B0aW9uKCctLXJlY2lwaWVudHMgPGlkcz4nLCAnQ29tbWEtc2VwYXJhdGVkIHJlY2lwaWVudCBJRHMgZnJvbSB0aGUgb3JnXFwncyBkaXN0cmlidXRpb24gbGlzdCcpXG4gICAgLm9wdGlvbignLS1hdXRvLXNlbmQnLCAnUHVibGlzaCB3aXRob3V0IHJldmlldy4gT2ZmIGJ5IGRlZmF1bHQg4oCUIHRoZSByZXZpZXcgc3RlcCBpcyB3aGVyZSB0aGUgY29udGV4dCBnb2VzLicpKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdSZXBvcnQgQ3JlYXRlJyk7XG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwcm9qZWN0cyA9IHNwbGl0TGlzdChvcHRpb25zLnByb2plY3RzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NvcGUgPT09ICdwcm9qZWN0cycgJiYgcHJvamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCctLXNjb3BlIHByb2plY3RzIG5lZWRzIC0tcHJvamVjdHMgd2l0aCBhdCBsZWFzdCBvbmUgcHJvamVjdCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgIHRlbXBsYXRlOiBvcHRpb25zLnRlbXBsYXRlLFxuICAgICAgICAgIHNjb3BlOiBvcHRpb25zLnNjb3BlID09PSAncHJvamVjdHMnID8geyBraW5kOiAncHJvamVjdHMnLCBwcm9qZWN0cyB9IDogeyBraW5kOiBvcHRpb25zLnNjb3BlIH0sXG4gICAgICAgICAgcmVjaXBpZW50czogc3BsaXRMaXN0KG9wdGlvbnMucmVjaXBpZW50cyksXG4gICAgICAgICAgYXV0b1NlbmQ6IG9wdGlvbnMuYXV0b1NlbmQgPT09IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZXpvbmUgPyB7IHRpbWV6b25lOiBvcHRpb25zLnRpbWV6b25lIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMud2Vla1N0YXJ0ID8geyB3ZWVrU3RhcnQ6IG9wdGlvbnMud2Vla1N0YXJ0IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDx7IGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24gfT4oXG4gICAgICAgICAgYXdhaXQgY2xpZW50LnBvc3QoYCR7Y2xpZW50LmdldENvbmZpZygpLmFwaS5iYXNlVXJsfSR7QkFTRX0vZGVmaW5pdGlvbnNgLCBib2R5KSwgJ3JlcG9ydCcsXG4gICAgICAgICk7XG4gICAgICAgIHByaW50U2VjdGlvbignUmVwb3J0IFNhdmVkJyk7XG4gICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICdOYW1lJzogZ3JlZW4oYm9sZChkYXRhLmRlZmluaXRpb24ubmFtZSkpLFxuICAgICAgICAgICdJRCc6IGRhdGEuZGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAnQ2FkZW5jZSc6IGAke2RhdGEuZGVmaW5pdGlvbi5jYWRlbmNlfSDCtyAke2RhdGEuZGVmaW5pdGlvbi50aW1lem9uZX1gLFxuICAgICAgICAgICdOZXh0IHJ1bic6IGRhdGEuZGVmaW5pdGlvbi5uZXh0UnVuQXQgPz8gJyhub3Qgc2NoZWR1bGVkKScsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YS5kZWZpbml0aW9uLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gU2FpZCBoZXJlIGJlY2F1c2UgaXQgaXMgdGhlIG1vc3QgY29tbW9uIHdheSBhIG5ldyByZXBvcnQgcmVhY2hlcyBub2JvZHk6IHRoZVxuICAgICAgICAgIC8vIGRpc3RyaWJ1dGlvbiBsaXN0IGlzIHBlciBPUkcgYW5kIGFuIGFkZHJlc3MgY29uZmlybXMgYnkgZW1haWwgYmVmb3JlIGRlbGl2ZXJ5LlxuICAgICAgICAgIHByaW50V2FybmluZygnTm8gcmVjaXBpZW50cyB5ZXQg4oCUIGFkZCB0aGVtIGluIHRoZSBkYXNoYm9hcmQ7IGFuIGV4dGVybmFsIGFkZHJlc3MgY29uZmlybXMgYnkgZW1haWwgYmVmb3JlIGFueXRoaW5nIGlzIGRlbGl2ZXJlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBwcmludFN1Y2Nlc3MoJ1JlcG9ydCBjcmVhdGVkJyk7XG4gICAgICAgIHByaW50RXhlY3V0aW9uU3VtbWFyeShleGVjdXRpb25JZCwgRGF0ZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3JlcG9ydC1jcmVhdGUnLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAvLyDilIDilIAgcnVuIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB3aXRoU3NsT3B0aW9ucyhncm91cFxuICAgIC5jb21tYW5kKCdydW4nKVxuICAgIC5kZXNjcmlwdGlvbignQ29tcG9zZSBvbmUgcGVyaW9kIGludG8gYSBmcm96ZW4gc25hcHNob3QuIFdpdGhvdXQgLS1wZXJpb2QsIHRoZSBsYXN0IGNvbXBsZXRlIHBlcmlvZC4nKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWksIC0taWQgPGlkPicsICdSZXBvcnQgZGVmaW5pdGlvbiBJRCcpXG4gICAgLm9wdGlvbignLXAsIC0tcGVyaW9kIDxsYWJlbD4nLCAnUGVyaW9kIGxhYmVsOiAyMDI2LVczOCAod2Vla2x5KSwgMjAyNi0wOCAobW9udGhseSksIDIwMjYtUTMgKHF1YXJ0ZXJseSknKVxuICAgIC5vcHRpb24oJy0tcmVnZW5lcmF0ZScsICdQcm9kdWNlIHZlcnNpb24gTisxIGluc3RlYWQgb2YgcmV1c2luZyBhbiBleGlzdGluZyBzbmFwc2hvdCcpKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdSZXBvcnQgUnVuJyk7XG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8eyBydW46IFJlcG9ydFJ1bjsgcmV1c2VkPzogYm9vbGVhbiB9PihcbiAgICAgICAgICBhd2FpdCBjbGllbnQucG9zdChcbiAgICAgICAgICAgIGAke2NsaWVudC5nZXRDb25maWcoKS5hcGkuYmFzZVVybH0ke0JBU0V9L2RlZmluaXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMuaWQpfS9ydW5zYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uKG9wdGlvbnMucGVyaW9kID8geyBwZXJpb2Q6IG9wdGlvbnMucGVyaW9kIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihvcHRpb25zLnJlZ2VuZXJhdGUgPyB7IHJlZ2VuZXJhdGU6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKSwgJ3J1bicsXG4gICAgICAgICk7XG4gICAgICAgIHByaW50U2VjdGlvbihkYXRhLnJldXNlZCA/ICdFeGlzdGluZyBTbmFwc2hvdCcgOiAnU25hcHNob3QgQ29tcG9zZWQnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1BlcmlvZCc6IGdyZWVuKGJvbGQoZGF0YS5ydW4ucGVyaW9kTGFiZWwpKSxcbiAgICAgICAgICAnUnVuIElEJzogZGF0YS5ydW4uaWQsXG4gICAgICAgICAgJ1ZlcnNpb24nOiBTdHJpbmcoZGF0YS5ydW4udmVyc2lvbiksXG4gICAgICAgICAgJ1N0YXR1cyc6IGRhdGEucnVuLnN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkYXRhLnJldXNlZCkge1xuICAgICAgICAgIC8vIE5vdCBhIG5vLW9wIHRvIGhpZGU6IGEgZnJvemVuIHNuYXBzaG90J3MgbnVtYmVycyBkbyBub3QgY2hhbmdlLCBzbyByZS1ydW5uaW5nXG4gICAgICAgICAgLy8gcmV0dXJucyB3aGF0IGV4aXN0cy4gYC0tcmVnZW5lcmF0ZWAgaXMgaG93IHlvdSBhc2sgZm9yIGEgbmV3IHZlcnNpb24uXG4gICAgICAgICAgcHJpbnRJbmZvKCdUaGlzIHBlcmlvZCBhbHJlYWR5IGhhZCBhIHNuYXBzaG90LCBzbyBpdCB3YXMgcmV0dXJuZWQgdW5jaGFuZ2VkLiBVc2UgLS1yZWdlbmVyYXRlIGZvciBhIG5ldyB2ZXJzaW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHByaW50RXhlY3V0aW9uU3VtbWFyeShleGVjdXRpb25JZCwgRGF0ZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3JlcG9ydC1ydW4nLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAvLyDilIDilIAgcHVibGlzaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgd2l0aFNzbE9wdGlvbnMoZ3JvdXBcbiAgICAuY29tbWFuZCgncHVibGlzaCcpXG4gICAgLmRlc2NyaXB0aW9uKCdQdWJsaXNoIGEgY29tcG9zZWQgcnVuLiBOZWVkcyByZXBvcnRzOnNoYXJlIOKAlCBwdWJsaXNoaW5nIGlzIHdoZW4gbnVtYmVycyBsZWF2ZSB0aGUgcGxhdGZvcm0uJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1yLCAtLXJ1biA8aWQ+JywgJ1J1biBJRCB0byBwdWJsaXNoJykpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1JlcG9ydCBQdWJsaXNoJyk7XG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8eyBydW46IFJlcG9ydFJ1bjsgYWxyZWFkeVB1Ymxpc2hlZD86IGJvb2xlYW4gfT4oXG4gICAgICAgICAgYXdhaXQgY2xpZW50LnBvc3QoXG4gICAgICAgICAgICBgJHtjbGllbnQuZ2V0Q29uZmlnKCkuYXBpLmJhc2VVcmx9JHtCQVNFfS9ydW5zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMucnVuKX0vcHVibGlzaGAsIHt9LFxuICAgICAgICAgICksICdydW4nLFxuICAgICAgICApO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1B1Ymxpc2hlZCcpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnUGVyaW9kJzogZ3JlZW4oYm9sZChkYXRhLnJ1bi5wZXJpb2RMYWJlbCkpLFxuICAgICAgICAgICdQdWJsaXNoZWQgYXQnOiBkYXRhLnJ1bi5wdWJsaXNoZWRBdCA/PyAnKHVua25vd24pJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkYXRhLmFscmVhZHlQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBJZGVtcG90ZW50IGJ5IGRlc2lnbjogdHdvIHB1Ymxpc2hlcyBzZW5kIG9uZSByZXBvcnQsIHNvIGEgcmV0cmllZCBzY3JpcHQgaXNcbiAgICAgICAgICAvLyBzYWZlLiBSZXBvcnRlZCByYXRoZXIgdGhhbiBzaWxlbnQsIHNvIGEgd3JhcHBlciBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZS5cbiAgICAgICAgICBwcmludEluZm8oJ1RoaXMgcnVuIHdhcyBhbHJlYWR5IHB1Ymxpc2hlZDsgbm90aGluZyB3YXMgc2VudCBhZ2Fpbi4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFN1Y2Nlc3MoJ1B1Ymxpc2hlZCDigJQgZGVsaXZlcnkgaXMgdW5kZXIgd2F5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcHJpbnRFeGVjdXRpb25TdW1tYXJ5KGV4ZWN1dGlvbklkLCBEYXRlLm5vdygpIC0gc3RhcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAncmVwb3J0LXB1Ymxpc2gnLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAvLyDilIDilIAgbGluayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgd2l0aFNzbE9wdGlvbnMoZ3JvdXBcbiAgICAuY29tbWFuZCgnbGluaycpXG4gICAgLmRlc2NyaXB0aW9uKCdNaW50IGFuIGV4cGlyaW5nIHJlYWQtb25seSBsaW5rIHRvIGEgcHVibGlzaGVkIHJ1bi4gVGhlIHRva2VuIGlzIHNob3duIE9OQ0UuJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1yLCAtLXJ1biA8aWQ+JywgJ1B1Ymxpc2hlZCBydW4gSUQnKVxuICAgIC5vcHRpb24oJy0tZGF5cyA8bj4nLCAnRGF5cyB1bnRpbCBpdCBleHBpcmVzIChzZXJ2ZXIgZGVmYXVsdCAzMCwgbWF4aW11bSAxODApJylcbiAgICAub3B0aW9uKCctLXJlZGFjdC1uYW1lcycsICdSZXBsYWNlIHByb2plY3QgYW5kIHBpcGVsaW5lIG5hbWVzIGluIHRoZSBzaGFyZWQgdmlldycpKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdSZXBvcnQgTGluaycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJpbnRTc2xXYXJuaW5nKG9wdGlvbnMudmVyaWZ5U3NsKTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gY3JlYXRlQXV0aGVudGljYXRlZENsaWVudChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGF5cyA9IG9wdGlvbnMuZGF5cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTnVtYmVyKG9wdGlvbnMuZGF5cyk7XG4gICAgICAgIGlmIChkYXlzICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRheXMpIHx8IGRheXMgPCAxKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLS1kYXlzIG11c3QgYmUgYSBwb3NpdGl2ZSB3aG9sZSBudW1iZXIgb2YgZGF5cycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDx7IHVybD86IHN0cmluZzsgdG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNBdDogc3RyaW5nIH0+KFxuICAgICAgICAgIGF3YWl0IGNsaWVudC5wb3N0KFxuICAgICAgICAgICAgYCR7Y2xpZW50LmdldENvbmZpZygpLmFwaS5iYXNlVXJsfSR7QkFTRX0vcnVucy8ke2VuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLnJ1bil9L2xpbmtzYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uKGRheXMgIT09IHVuZGVmaW5lZCA/IHsgZXhwaXJlc0luRGF5czogZGF5cyB9IDoge30pLFxuICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5yZWRhY3ROYW1lcyA/IHsgcmVkYWN0TmFtZXM6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKSwgJ2xpbmsnLFxuICAgICAgICApO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1NoYXJlIExpbmsnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgTGluazogZ3JlZW4oYm9sZChkYXRhLnVybCA/PyBkYXRhLnRva2VuID8/ICcobm90IHJldHVybmVkKScpKSxcbiAgICAgICAgICBFeHBpcmVzOiBkYXRhLmV4cGlyZXNBdCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNhaWQgZXZlcnkgdGltZSwgYmVjYXVzZSBpdCBpcyB0cnVlIGV2ZXJ5IHRpbWUgYW5kIHRoZSBjb25zZXF1ZW5jZSBpcyBwZXJtYW5lbnQ6XG4gICAgICAgIC8vIHRoZSBzZXJ2ZXIgc3RvcmVzIG9ubHkgYSBoYXNoLCBzbyBhIGxvc3QgdG9rZW4gY2Fubm90IGJlIHJlY292ZXJlZCwgb25seSByZXBsYWNlZC5cbiAgICAgICAgcHJpbnRXYXJuaW5nKCdDb3B5IHRoaXMgbm93IOKAlCBvbmx5IGEgaGFzaCBpcyBzdG9yZWQsIHNvIGl0IGNhbm5vdCBiZSBzaG93biBhZ2Fpbi4gUmV2b2tlIGl0IGluIHRoZSBkYXNoYm9hcmQgaWYgaXQgbGVha3MuJyk7XG4gICAgICAgIHByaW50RXhlY3V0aW9uU3VtbWFyeShleGVjdXRpb25JZCwgRGF0ZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3JlcG9ydC1saW5rJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgLy8g4pSA4pSAIHBkZiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgd2l0aFNzbE9wdGlvbnMoZ3JvdXBcbiAgICAuY29tbWFuZCgncGRmJylcbiAgICAuZGVzY3JpcHRpb24oJ0Rvd25sb2FkIGEgcnVuIGFzIGEgUERGLiBOZWVkcyByZXBvcnRzOnJlYWQg4oCUIHRoZSBzYW1lIHBlcm1pc3Npb24gYXMgcmVhZGluZyB0aGUgcnVuLicpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctciwgLS1ydW4gPGlkPicsICdSdW4gSUQgdG8gZG93bmxvYWQnKVxuICAgIC5vcHRpb24oJy1vLCAtLW91dCA8ZmlsZT4nLCAnV2hlcmUgdG8gd3JpdGUgaXQgKGRlZmF1bHQ6IHRoZSBmaWxlIG5hbWUgdGhlIHNlcnZlciBjaG9zZSwgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5KScpKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdSZXBvcnQgUERGJyk7XG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgZmlsZW5hbWUgfSA9IGF3YWl0IGNsaWVudC5nZXRCaW5hcnkoXG4gICAgICAgICAgYCR7Y2xpZW50LmdldENvbmZpZygpLmFwaS5iYXNlVXJsfSR7QkFTRX0vcnVucy8ke2VuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLnJ1bil9L3BkZmAsXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZSBzZXJ2ZXIncyBuYW1lIHVubGVzcyB0aGUgY2FsbGVyIGFza2VkIGZvciBvbmU6IGl0IGtub3dzIHRoZSByZXBvcnQncyB0aXRsZSBhbmRcbiAgICAgICAgLy8gd2hldGhlciB0aGlzIHJ1biBpcyBhIHJldmlzaW9uLCBhbmQgYSBzY3JpcHRlZCBib2FyZCBwYWNrIHdhbnRzIHRoYXQgbmFtZS5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdHlwZW9mIG9wdGlvbnMub3V0ID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLm91dC5sZW5ndGggPiAwXG4gICAgICAgICAgPyBvcHRpb25zLm91dFxuICAgICAgICAgIDogKGZpbGVuYW1lID8/IGByZXBvcnQtJHtvcHRpb25zLnJ1bn0ucGRmYCk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCBkYXRhKTtcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdEb3dubG9hZGVkJyk7XG4gICAgICAgIHByaW50S2V5VmFsdWUoeyBGaWxlOiBncmVlbihib2xkKHRhcmdldCkpLCBTaXplOiBgJHsoZGF0YS5sZW5ndGggLyAxMDI0KS50b0ZpeGVkKDEpfSBLaUJgIH0pO1xuICAgICAgICBwcmludFN1Y2Nlc3MoJ1NhdmVkJyk7XG4gICAgICAgIHByaW50RXhlY3V0aW9uU3VtbWFyeShleGVjdXRpb25JZCwgRGF0ZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEEgNTAzIGhlcmUgaXMgbm90IGEgZmFpbHVyZSBvZiB0aGUgcmVwb3J0OiB0aGlzIGluc3RhbmNlIGhhcyBubyBDaHJvbWl1bSwgYW5kIHRoZVxuICAgICAgICAvLyBzZXJ2ZXIgc2F5cyBzbyBpbiB3b3Jkcy4gSXQgc3RpbGwgZXhpdHMgbm9uLXplcm8sIGJlY2F1c2UgYSBzY3JpcHQgdGhhdCBhc2tlZCBmb3IgYVxuICAgICAgICAvLyBmaWxlIGFuZCBnb3Qgbm9uZSBtdXN0IG5vdCBjYXJyeSBvbiBhcyB0aG91Z2ggaXQgaGFzIG9uZS5cbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAncmVwb3J0LXBkZicsIGV4ZWN1dGlvbklkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIC8vIOKUgOKUgCB0cmFuc2ZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgd2l0aFNzbE9wdGlvbnMoZ3JvdXBcbiAgICAuY29tbWFuZCgndHJhbnNmZXInKVxuICAgIC5kZXNjcmlwdGlvbignSGFuZCBhIHJlcG9ydCB0byBhIG5ldyBvd25lci4gQSBzY2hlZHVsZWQgcnVuIGlzIGF1dGhvcml6ZWQgQVMgdGhlIG93bmVyLCBzbyB0aGlzIGlzIGEgcHJpdmlsZWdlIG1vdmUuJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1pLCAtLWlkIDxpZD4nLCAnUmVwb3J0IGRlZmluaXRpb24gSUQnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW8sIC0tb3duZXIgPHVzZXJJZD4nLCAnTmV3IG93bmVyXFwncyB1c2VyIElEIOKAlCBtdXN0IGJlIGEgbGl2ZSBtZW1iZXIgb2YgdGhpcyBvcmcnKSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignUmVwb3J0IFRyYW5zZmVyJyk7XG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8eyBkZWZpbml0aW9uOiBSZXBvcnREZWZpbml0aW9uIH0+KFxuICAgICAgICAgIGF3YWl0IGNsaWVudC5wb3N0KFxuICAgICAgICAgICAgYCR7Y2xpZW50LmdldENvbmZpZygpLmFwaS5iYXNlVXJsfSR7QkFTRX0vZGVmaW5pdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5pZCl9L3RyYW5zZmVyYCxcbiAgICAgICAgICAgIHsgb3duZXJJZDogb3B0aW9ucy5vd25lciB9LFxuICAgICAgICAgICksICdyZXBvcnQnLFxuICAgICAgICApO1xuICAgICAgICBwcmludFNlY3Rpb24oJ093bmVyc2hpcCBUcmFuc2ZlcnJlZCcpO1xuICAgICAgICBwcmludEtleVZhbHVlKHsgJ1JlcG9ydCc6IGdyZWVuKGJvbGQoZGF0YS5kZWZpbml0aW9uLm5hbWUpKSwgJ05ldyBvd25lcic6IG9wdGlvbnMub3duZXIgfSk7XG4gICAgICAgIC8vIFRoZSBjb25zZXF1ZW5jZSwgaW4gb25lIGxpbmU6IGZyb20gbm93IG9uIHRoZSByZXBvcnQgY29tcHV0ZXMgd2l0aCBhIGRpZmZlcmVudFxuICAgICAgICAvLyBwZXJzb24ncyBhY2Nlc3MsIHdoaWNoIGNhbiBjaGFuZ2Ugd2hhdCBpdCBjb250YWlucy5cbiAgICAgICAgcHJpbnRJbmZvKCdGdXR1cmUgcnVucyBhcmUgYXV0aG9yaXplZCBhcyB0aGUgbmV3IG93bmVyLCBzbyB0aGUgcmVwb3J0IG5vdyBjb21wdXRlcyB3aXRoIHRoZWlyIGFjY2Vzcy4nKTtcbiAgICAgICAgcHJpbnRFeGVjdXRpb25TdW1tYXJ5KGV4ZWN1dGlvbklkLCBEYXRlLm5vdygpIC0gc3RhcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAncmVwb3J0LXRyYW5zZmVyJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbi8qKiBgXCJhLCBiICxjXCJgIOKGkiBgWydhJywnYicsJ2MnXWA7IGVtcHR5IG9yIGFic2VudCDihpIgYFtdYC4gKi9cbmZ1bmN0aW9uIHNwbGl0TGlzdCh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKChzKSA9PiBzLnRyaW0oKSkuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApO1xufVxuIl19
@@ -160,7 +160,8 @@
160
160
  "FunctionName": { "Ref": "EventHandler" },
161
161
  "BatchSize": 10,
162
162
  "MaximumBatchingWindowInSeconds": 5,
163
- "Enabled": true
163
+ "Enabled": true,
164
+ "FunctionResponseTypes": ["ReportBatchItemFailures"]
164
165
  }
165
166
  }
166
167
  },
@@ -97,15 +97,10 @@ export interface CreatePipelineRequest {
97
97
  */
98
98
  pipelineName?: string;
99
99
  /**
100
- * Access modifier (public or private)
101
- * @default 'private'
100
+ * Sharing rung (private|org|public)
101
+ * @default 'org'
102
102
  */
103
103
  visibility?: PipelineVisibility;
104
- /**
105
- * Whether this is the default pipeline
106
- * @default false
107
- */
108
- isDefault?: boolean;
109
104
  /**
110
105
  * Whether the pipeline is active
111
106
  * @default true
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/types/pipeline.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,YAAY,EAAE,gBAAgB;CAAG;AAEnE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAEhC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACpB"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/types/pipeline.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,YAAY,EAAE,gBAAgB;CAAG;AAEnE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACpB"}
@@ -1,4 +1,4 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export {};
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEFyYml0cmFyeSBrZXktdmFsdWUgcGlwZWxpbmUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gKiBwYXNzZWQgdGhyb3VnaCB0byB0aGUgQ0RLIGJ1aWxkZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lUHJvcHMgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBQaXBlbGluZSBzaGFyaW5nIHJ1bmcg4oCUIHRoZSBwbGF0Zm9ybS13aWRlIHRocmVlLXJ1bmcgbGFkZGVyLlxuICogYHByaXZhdGVgIGlzIGF1dGhvci1vbmx5LCBgb3JnYCBpcyB0aGUgd2hvbGUgb3duaW5nIG9yZywgYHB1YmxpY2AgcmVhY2hlcyB0aGVcbiAqIG9yZydzIHRlYW1zIChhbmQsIGZyb20gdGhlIHN5c3RlbSBvcmcsIGV2ZXJ5IG9yZykuXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lVmlzaWJpbGl0eSA9ICdwcml2YXRlJyB8ICdvcmcnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogQ29yZSBwaXBlbGluZSBmaWVsZHMgcmVxdWlyZWQgb24gZXZlcnkgcGlwZWxpbmUgcmVjb3JkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQmFzZSB7XG4gIC8qKlxuICAgKiBVbmlxdWUgcGlwZWxpbmUgaWRlbnRpZmllclxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvamVjdCBuYW1lXG4gICAqL1xuICBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBuYW1lXG4gICAqL1xuICBvcmdhbml6YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGVuYW50IGlkZW50aWZpZXIgKGZyb20gQVBJIHJlc3BvbnNlLCB1c2VkIGZvciBwZXItb3JnIHNlY3JldCByZXNvbHV0aW9uKVxuICAgKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHByb3BlcnRpZXMvY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvcHM6IFBpcGVsaW5lUHJvcHM7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGF0dGFjaGVkIHRvIGEgcGlwZWxpbmUgcmVjb3JkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lTWV0YWRhdGEge1xuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgcGlwZWxpbmUgbmFtZVxuICAgKi9cbiAgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTaGFyaW5nIHJ1bmc6ICdwcml2YXRlJyB8ICdvcmcnIHwgJ3B1YmxpYycuXG4gICAqL1xuICB2aXNpYmlsaXR5PzogUGlwZWxpbmVWaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgcGlwZWxpbmVcbiAgICovXG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSBjcmVhdGlvbiB0aW1lc3RhbXBcbiAgICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgbGFzdCB1cGRhdGUgdGltZXN0YW1wXG4gICAqL1xuICB1cGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXIgd2hvIGNyZWF0ZWQgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBjcmVhdGVkQnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXIgd2hvIGxhc3QgdXBkYXRlZCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHVwZGF0ZWRCeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wbGV0ZSBwaXBlbGluZSBlbnRpdHkgY29tYmluaW5nIGNvcmUgZmllbGRzIGFuZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZSBleHRlbmRzIFBpcGVsaW5lQmFzZSwgUGlwZWxpbmVNZXRhZGF0YSB7fVxuXG4vKipcbiAqIFJlcXVlc3QgcGF5bG9hZCBmb3IgY3JlYXRpbmcgYSBuZXcgcGlwZWxpbmUgdmlhIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFByb2plY3QgbmFtZVxuICAgKi9cbiAgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmdhbml6YXRpb24gbmFtZVxuICAgKi9cbiAgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHByb3BlcnRpZXMvY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvcHM6IFBpcGVsaW5lUHJvcHM7XG5cbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIHBpcGVsaW5lIG5hbWVcbiAgICovXG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWNjZXNzIG1vZGlmaWVyIChwdWJsaWMgb3IgcHJpdmF0ZSlcbiAgICogQGRlZmF1bHQgJ3ByaXZhdGUnXG4gICAqL1xuICB2aXNpYmlsaXR5PzogUGlwZWxpbmVWaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgcGlwZWxpbmVcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIGFjdGl2ZVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBpc0FjdGl2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzcG9uc2UgcmV0dXJuZWQgYnkgc2luZ2xlLXBpcGVsaW5lIEFQSSBlbmRwb2ludHMgKGdldCwgY3JlYXRlKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVJlc3BvbnNlIHtcbiAgcGlwZWxpbmU6IFBpcGVsaW5lO1xufVxuIl19
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEFyYml0cmFyeSBrZXktdmFsdWUgcGlwZWxpbmUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gKiBwYXNzZWQgdGhyb3VnaCB0byB0aGUgQ0RLIGJ1aWxkZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lUHJvcHMgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBQaXBlbGluZSBzaGFyaW5nIHJ1bmcg4oCUIHRoZSBwbGF0Zm9ybS13aWRlIHRocmVlLXJ1bmcgbGFkZGVyLlxuICogYHByaXZhdGVgIGlzIGF1dGhvci1vbmx5LCBgb3JnYCBpcyB0aGUgd2hvbGUgb3duaW5nIG9yZywgYHB1YmxpY2AgcmVhY2hlcyB0aGVcbiAqIG9yZydzIHRlYW1zIChhbmQsIGZyb20gdGhlIHN5c3RlbSBvcmcsIGV2ZXJ5IG9yZykuXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lVmlzaWJpbGl0eSA9ICdwcml2YXRlJyB8ICdvcmcnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogQ29yZSBwaXBlbGluZSBmaWVsZHMgcmVxdWlyZWQgb24gZXZlcnkgcGlwZWxpbmUgcmVjb3JkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQmFzZSB7XG4gIC8qKlxuICAgKiBVbmlxdWUgcGlwZWxpbmUgaWRlbnRpZmllclxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvamVjdCBuYW1lXG4gICAqL1xuICBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBuYW1lXG4gICAqL1xuICBvcmdhbml6YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGVuYW50IGlkZW50aWZpZXIgKGZyb20gQVBJIHJlc3BvbnNlLCB1c2VkIGZvciBwZXItb3JnIHNlY3JldCByZXNvbHV0aW9uKVxuICAgKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHByb3BlcnRpZXMvY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvcHM6IFBpcGVsaW5lUHJvcHM7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGF0dGFjaGVkIHRvIGEgcGlwZWxpbmUgcmVjb3JkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lTWV0YWRhdGEge1xuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgcGlwZWxpbmUgbmFtZVxuICAgKi9cbiAgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTaGFyaW5nIHJ1bmc6ICdwcml2YXRlJyB8ICdvcmcnIHwgJ3B1YmxpYycuXG4gICAqL1xuICB2aXNpYmlsaXR5PzogUGlwZWxpbmVWaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgcGlwZWxpbmVcbiAgICovXG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSBjcmVhdGlvbiB0aW1lc3RhbXBcbiAgICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgbGFzdCB1cGRhdGUgdGltZXN0YW1wXG4gICAqL1xuICB1cGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXIgd2hvIGNyZWF0ZWQgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBjcmVhdGVkQnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXIgd2hvIGxhc3QgdXBkYXRlZCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHVwZGF0ZWRCeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wbGV0ZSBwaXBlbGluZSBlbnRpdHkgY29tYmluaW5nIGNvcmUgZmllbGRzIGFuZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZSBleHRlbmRzIFBpcGVsaW5lQmFzZSwgUGlwZWxpbmVNZXRhZGF0YSB7fVxuXG4vKipcbiAqIFJlcXVlc3QgcGF5bG9hZCBmb3IgY3JlYXRpbmcgYSBuZXcgcGlwZWxpbmUgdmlhIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFByb2plY3QgbmFtZVxuICAgKi9cbiAgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmdhbml6YXRpb24gbmFtZVxuICAgKi9cbiAgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHByb3BlcnRpZXMvY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvcHM6IFBpcGVsaW5lUHJvcHM7XG5cbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIHBpcGVsaW5lIG5hbWVcbiAgICovXG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hhcmluZyBydW5nIChwcml2YXRlfG9yZ3xwdWJsaWMpXG4gICAqIEBkZWZhdWx0ICdvcmcnXG4gICAqL1xuICB2aXNpYmlsaXR5PzogUGlwZWxpbmVWaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwaXBlbGluZSBpcyBhY3RpdmVcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgaXNBY3RpdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIHJldHVybmVkIGJ5IHNpbmdsZS1waXBlbGluZSBBUEkgZW5kcG9pbnRzIChnZXQsIGNyZWF0ZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVSZXNwb25zZSB7XG4gIHBpcGVsaW5lOiBQaXBlbGluZTtcbn1cbiJdfQ==
@@ -9,6 +9,20 @@ export declare class ApiClient {
9
9
  constructor(config: Config);
10
10
  private handleError;
11
11
  get<T = unknown>(url: string, params?: Record<string, unknown>, headers?: Record<string, string>): Promise<T>;
12
+ /**
13
+ * A BINARY download (a report PDF): the bytes, plus the file name the server chose.
14
+ *
15
+ * `responseType: 'arraybuffer'` because the default would hand back a UTF-8 string and
16
+ * corrupt every byte above 0x7f — a PDF written that way opens as a damaged file, which
17
+ * looks like a server bug rather than a client one.
18
+ *
19
+ * The server's `Content-Disposition` name is preferred over anything the caller guesses:
20
+ * it knows the report's title and whether the run is a revision.
21
+ */
22
+ getBinary(url: string, headers?: Record<string, string>): Promise<{
23
+ data: Buffer;
24
+ filename?: string;
25
+ }>;
12
26
  post<T = unknown>(url: string, data?: unknown, headers?: Record<string, string>): Promise<T>;
13
27
  postForm<T = unknown>(url: string, formData: FormData, headers?: Record<string, string>): Promise<T>;
14
28
  put<T = unknown>(url: string, data?: unknown, headers?: Record<string, string>): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAMjD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,EAAE,MAAM,EAsDzB;IAED,OAAO,CAAC,WAAW;IAkDb,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGlH;IAEK,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGjG;IAEK,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASzG;IAEK,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGhG;IAEK,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGnF;IAEK,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGlG;IAED,SAAS,IAAI,MAAM,CAAwB;IAC3C,UAAU,IAAI,MAAM,CAAoC;IACxD,eAAe,IAAI,OAAO,CAAsC;IAEhE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CASzB"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAMjD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,EAAE,MAAM,EAsDzB;IAED,OAAO,CAAC,WAAW;IAkDb,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGlH;IAED;;;;;;;;;OASG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAQ3G;IAEK,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGjG;IAEK,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASzG;IAEK,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGhG;IAEK,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGnF;IAEK,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGlG;IAED,SAAS,IAAI,MAAM,CAAwB;IAC3C,UAAU,IAAI,MAAM,CAAoC;IACxD,eAAe,IAAI,OAAO,CAAsC;IAEhE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CASzB"}
@@ -105,6 +105,25 @@ export class ApiClient {
105
105
  const response = await this.client.get(url, { params, headers });
106
106
  return response.data;
107
107
  }
108
+ /**
109
+ * A BINARY download (a report PDF): the bytes, plus the file name the server chose.
110
+ *
111
+ * `responseType: 'arraybuffer'` because the default would hand back a UTF-8 string and
112
+ * corrupt every byte above 0x7f — a PDF written that way opens as a damaged file, which
113
+ * looks like a server bug rather than a client one.
114
+ *
115
+ * The server's `Content-Disposition` name is preferred over anything the caller guesses:
116
+ * it knows the report's title and whether the run is a revision.
117
+ */
118
+ async getBinary(url, headers) {
119
+ const response = await this.client.get(url, { headers, responseType: 'arraybuffer' });
120
+ const disposition = String(response.headers['content-disposition'] ?? '');
121
+ const match = /filename="([^"]+)"/.exec(disposition);
122
+ return {
123
+ data: Buffer.from(response.data),
124
+ ...(match?.[1] ? { filename: match[1] } : {}),
125
+ };
126
+ }
108
127
  async post(url, data, headers) {
109
128
  const response = await this.client.post(url, data, { headers });
110
129
  return response.data;
@@ -148,4 +167,4 @@ export class ApiClient {
148
167
  }
149
168
  }
150
169
  }
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxFQUFFLEVBQXNCLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5RCxPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNaLE1BQU0sQ0FBZ0I7SUFDdEIsTUFBTSxDQUFTO0lBRXZCLFlBQVksTUFBYztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDakMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEdB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LGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxZQUFZLENBQUMsb0JBQW9CLFNBQVMsQ0FBQyxXQUFXLEVBQUUsaURBQWlELENBQUMsQ0FBQztZQUM3RyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IGF4aW9zLCB7IHR5cGUgQXhpb3NJbnN0YW5jZSwgQXhpb3NFcnJvciB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IHsgZGVjb2RlVG9rZW5QYXlsb2FkIH0gZnJvbSAnLi9hdXRoLWd1YXJkLmpzJztcbmltcG9ydCB7IHR5cGUgQ29uZmlnIH0gZnJvbSAnLi9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IE5ldHdvcmtFcnJvciB9IGZyb20gJy4vZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludERlYnVnLCBwcmludEVycm9yLCBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBUSU1FT1VUUyB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IEFwaUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG4vKipcbiAqIEFQSSBDbGllbnQgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybSBBUElcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgY2xpZW50OiBBeGlvc0luc3RhbmNlO1xuICBwcml2YXRlIGNvbmZpZzogQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZy5hdXRoPy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiB0b2tlbiBpcyByZXF1aXJlZC4gU2V0IFBMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgIH1cblxuICAgIC8vIFdhcm4gaWYgdG9rZW4gYXBwZWFycyBleHBpcmVkIChhZHZpc29yeSDigJQgc2VydmVyIHZhbGlkYXRlcyBhdXRob3JpdGF0aXZlbHkpXG4gICAgdGhpcy5jaGVja1Rva2VuRXhwaXJ5KGNvbmZpZy5hdXRoLnRva2VuKTtcblxuICAgIGNvbnN0IGh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoe1xuICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBjb25maWcuYXBpLnJlamVjdFVuYXV0aG9yaXplZCA/PyB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hcGkucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZSkge1xuICAgICAgcHJpbnRXYXJuaW5nKCdDZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGlzIGRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBheGlvcy5jcmVhdGUoe1xuICAgICAgYmFzZVVSTDogY29uZmlnLmFwaS5iYXNlVXJsLFxuICAgICAgdGltZW91dDogY29uZmlnLmFwaS50aW1lb3V0IHx8IFRJTUVPVVRTLkhUVFBfUkVRVUVTVCxcbiAgICAgIGh0dHBzQWdlbnQsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9KTtcblxuICAgIC8vIEF1dGggaW50ZXJjZXB0b3JcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXG4gICAgICAocmVxdWVzdENvbmZpZykgPT4ge1xuICAgICAgICByZXF1ZXN0Q29uZmlnLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgICAgICBwcmludERlYnVnKCdBUEkgUmVxdWVzdCcsIHtcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RDb25maWcubWV0aG9kPy50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgIHVybDogcmVxdWVzdENvbmZpZy51cmwsXG4gICAgICAgICAgYmFzZVVSTDogcmVxdWVzdENvbmZpZy5iYXNlVVJMLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RDb25maWc7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHByaW50RXJyb3IoJ1JlcXVlc3QgaW50ZXJjZXB0b3IgZXJyb3InLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3JcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKFxuICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHByaW50RGVidWcoJ0FQSSBSZXNwb25zZScsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIHVybDogcmVzcG9uc2UuY29uZmlnLnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IEF4aW9zRXJyb3IpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBBeGlvc0Vycm9yKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgY29uc3QgeyBzdGF0dXMsIHN0YXR1c1RleHQsIGRhdGEgfSA9IGVycm9yLnJlc3BvbnNlO1xuICAgICAgY29uc3QgdXJsID0gZXJyb3IuY29uZmlnPy51cmw7XG5cbiAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IChgZGF0YWApIGNhbiBjYXJyeSB0b2tlbnMvUElJLCBhbmQgcHJpbnRFcnJvciBhbHdheXMgd3JpdGVzXG4gICAgICAvLyAobm90IGdhdGVkIG9uIERFQlVHKSDigJQga2VlcCBpdCBvdXQgb2YgdGhlIGFsd2F5cy1vbiBsaW5lOyBzdXJmYWNlIGl0IG9ubHkgdW5kZXIgREVCVUcuXG4gICAgICBwcmludEVycm9yKCdBUEkgcmVxdWVzdCBmYWlsZWQnLCB7IHN0YXR1cywgc3RhdHVzVGV4dCwgdXJsIH0pO1xuICAgICAgcHJpbnREZWJ1ZygnQVBJIGVycm9yIHJlc3BvbnNlIGJvZHknLCB7IGRhdGEgfSk7XG5cbiAgICAgIGxldCBtZXNzYWdlID0gYEFQSSByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gO1xuICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBkYXRhICYmIHR5cGVvZiAoZGF0YSBhcyB7IG1lc3NhZ2U6IHVua25vd24gfSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWVzc2FnZSA9IChkYXRhIGFzIHsgbWVzc2FnZTogc3RyaW5nIH0pLm1lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQXBpRXJyb3IobWVzc2FnZSwgc3RhdHVzLCBlcnJvci5yZXNwb25zZSkpO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IucmVxdWVzdCkge1xuICAgICAgY29uc3QgY29kZSA9IGVycm9yLmNvZGUgfHwgJ1VOS05PV04nO1xuICAgICAgY29uc3QgdXJsID0gZXJyb3IuY29uZmlnPy51cmw7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gZXJyb3IuY29uZmlnPy50aW1lb3V0O1xuICAgICAgY29uc3QgY2F1c2UgPSBlcnJvci5jYXVzZTtcblxuICAgICAgcHJpbnRFcnJvcignTm8gcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBBUEknLCB7XG4gICAgICAgIHVybCxcbiAgICAgICAgdGltZW91dCxcbiAgICAgICAgY29kZSxcbiAgICAgICAgLi4uKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyB7IGNhdXNlOiBjYXVzZS5tZXNzYWdlIH0gOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaGludHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIEVDT05OUkVGVVNFRDogJ1NlcnZlciBpcyBub3QgcnVubmluZyBvciBwb3J0IGlzIHdyb25nJyxcbiAgICAgICAgRUNPTk5SRVNFVDogJ1NlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5JyxcbiAgICAgICAgRVRJTUVET1VUOiAnQ29ubmVjdGlvbiB0aW1lZCBvdXQg4oCUIHNlcnZlciB1bnJlYWNoYWJsZSBvciB0b28gc2xvdycsXG4gICAgICAgIEVOT1RGT1VORDogJ0ROUyBsb29rdXAgZmFpbGVkIOKAlCBjaGVjayB0aGUgaG9zdG5hbWUgaW4gYmFzZVVybCcsXG4gICAgICAgIEVSUl9CQURfUkVRVUVTVDogJ1JlcXVlc3Qgd2FzIG1hbGZvcm1lZCDigJQgY2hlY2sgdGhlIGVuZHBvaW50IGFuZCBwYXlsb2FkJyxcbiAgICAgICAgQ0VSVF9IQVNfRVhQSVJFRDogJ1NTTCBjZXJ0aWZpY2F0ZSBleHBpcmVkIOKAlCB1c2UgLS1uby12ZXJpZnktc3NsIGZvciBkZXYnLFxuICAgICAgICBERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ6ICdTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSDigJQgdXNlIC0tbm8tdmVyaWZ5LXNzbCcsXG4gICAgICAgIFVOQUJMRV9UT19WRVJJRllfTEVBRl9TSUdOQVRVUkU6ICdTU0wgY2hhaW4gaW5jb21wbGV0ZSDigJQgdXNlIC0tbm8tdmVyaWZ5LXNzbCBmb3IgZGV2JyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhpbnQgPSBoaW50c1tjb2RlXSB8fCAnQ2hlY2sgbmV0d29yayBjb25uZWN0aXZpdHkgYW5kIHNlcnZlciBzdGF0dXMnO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2NvZGV9OiAke2hpbnR9ICh1cmw6ICR7dXJsfSlgO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IE5ldHdvcmtFcnJvcihtZXNzYWdlLCB1cmwsIGVycm9yLCB0aW1lb3V0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByaW50RXJyb3IoJ0FQSSByZXF1ZXN0IGVycm9yJywgeyBlcnJvcjogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPih1cmw6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXQ8VD4odXJsLCB7IHBhcmFtcywgaGVhZGVycyB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBkYXRhPzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3Q8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwb3N0Rm9ybTxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB1cGxvYWRUaW1lb3V0ID0gdGhpcy5jb25maWcuYXBpLnVwbG9hZFRpbWVvdXQgfHwgMTUgKiA2MCAqIDEwMDA7IC8vIGRlZmF1bHQgMTUgbWludXRlc1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7XG4gICAgICBoZWFkZXJzOiB7IC4uLmZvcm1EYXRhLmdldEhlYWRlcnMoKSwgLi4uaGVhZGVycyB9LFxuICAgICAgbWF4Q29udGVudExlbmd0aDogSW5maW5pdHksXG4gICAgICBtYXhCb2R5TGVuZ3RoOiBJbmZpbml0eSxcbiAgICAgIHRpbWVvdXQ6IHVwbG9hZFRpbWVvdXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwdXQ8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBkYXRhPzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnB1dDxUPih1cmwsIGRhdGEsIHsgaGVhZGVycyB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwYXRjaDxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucGF0Y2g8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBnZXRDb25maWcoKTogQ29uZmlnIHsgcmV0dXJuIHRoaXMuY29uZmlnOyB9XG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29uZmlnLmFwaS5iYXNlVXJsOyB9XG4gIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5jb25maWcuYXV0aD8udG9rZW47IH1cblxuICAvKipcbiAgICogQWR2aXNvcnkgY2hlY2s6IGRlY29kZSBKV1QgZXhwIGNsYWltIGFuZCB3YXJuIGlmIGV4cGlyZWQuXG4gICAqIERvZXMgTk9UIHZlcmlmeSBzaWduYXR1cmUg4oCUIHNlcnZlciBoYW5kbGVzIHRoYXQuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrVG9rZW5FeHBpcnkodG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQgPSBkZWNvZGVUb2tlblBheWxvYWQodG9rZW4pO1xuICAgIGlmIChwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IG5ldyBEYXRlKHBheWxvYWQuZXhwICogMTAwMCk7XG4gICAgICBpZiAoZXhwaXJlc0F0LmdldFRpbWUoKSA8IERhdGUubm93KCkpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBUb2tlbiBleHBpcmVkIGF0ICR7ZXhwaXJlc0F0LnRvSVNPU3RyaW5nKCl9IOKAlCBydW4gXCJwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW5cIiB0byByZWZyZXNoYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxFQUFFLEVBQXNCLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5RCxPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNaLE1BQU0sQ0FBZ0I7SUFDdEIsTUFBTSxDQUFTO0lBRXZCLFlBQVksTUFBYztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDakMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEdB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dHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IGF4aW9zLCB7IHR5cGUgQXhpb3NJbnN0YW5jZSwgQXhpb3NFcnJvciB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IHsgZGVjb2RlVG9rZW5QYXlsb2FkIH0gZnJvbSAnLi9hdXRoLWd1YXJkLmpzJztcbmltcG9ydCB7IHR5cGUgQ29uZmlnIH0gZnJvbSAnLi9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IE5ldHdvcmtFcnJvciB9IGZyb20gJy4vZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludERlYnVnLCBwcmludEVycm9yLCBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBUSU1FT1VUUyB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IEFwaUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG4vKipcbiAqIEFQSSBDbGllbnQgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybSBBUElcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgY2xpZW50OiBBeGlvc0luc3RhbmNlO1xuICBwcml2YXRlIGNvbmZpZzogQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZy5hdXRoPy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiB0b2tlbiBpcyByZXF1aXJlZC4gU2V0IFBMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgIH1cblxuICAgIC8vIFdhcm4gaWYgdG9rZW4gYXBwZWFycyBleHBpcmVkIChhZHZpc29yeSDigJQgc2VydmVyIHZhbGlkYXRlcyBhdXRob3JpdGF0aXZlbHkpXG4gICAgdGhpcy5jaGVja1Rva2VuRXhwaXJ5KGNvbmZpZy5hdXRoLnRva2VuKTtcblxuICAgIGNvbnN0IGh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoe1xuICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBjb25maWcuYXBpLnJlamVjdFVuYXV0aG9yaXplZCA/PyB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hcGkucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZSkge1xuICAgICAgcHJpbnRXYXJuaW5nKCdDZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGlzIGRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBheGlvcy5jcmVhdGUoe1xuICAgICAgYmFzZVVSTDogY29uZmlnLmFwaS5iYXNlVXJsLFxuICAgICAgdGltZW91dDogY29uZmlnLmFwaS50aW1lb3V0IHx8IFRJTUVPVVRTLkhUVFBfUkVRVUVTVCxcbiAgICAgIGh0dHBzQWdlbnQsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9KTtcblxuICAgIC8vIEF1dGggaW50ZXJjZXB0b3JcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXG4gICAgICAocmVxdWVzdENvbmZpZykgPT4ge1xuICAgICAgICByZXF1ZXN0Q29uZmlnLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgICAgICBwcmludERlYnVnKCdBUEkgUmVxdWVzdCcsIHtcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RDb25maWcubWV0aG9kPy50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgIHVybDogcmVxdWVzdENvbmZpZy51cmwsXG4gICAgICAgICAgYmFzZVVSTDogcmVxdWVzdENvbmZpZy5iYXNlVVJMLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RDb25maWc7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHByaW50RXJyb3IoJ1JlcXVlc3QgaW50ZXJjZXB0b3IgZXJyb3InLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3JcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKFxuICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHByaW50RGVidWcoJ0FQSSBSZXNwb25zZScsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIHVybDogcmVzcG9uc2UuY29uZmlnLnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IEF4aW9zRXJyb3IpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBBeGlvc0Vycm9yKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgY29uc3QgeyBzdGF0dXMsIHN0YXR1c1RleHQsIGRhdGEgfSA9IGVycm9yLnJlc3BvbnNlO1xuICAgICAgY29uc3QgdXJsID0gZXJyb3IuY29uZmlnPy51cmw7XG5cbiAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IChgZGF0YWApIGNhbiBjYXJyeSB0b2tlbnMvUElJLCBhbmQgcHJpbnRFcnJvciBhbHdheXMgd3JpdGVzXG4gICAgICAvLyAobm90IGdhdGVkIG9uIERFQlVHKSDigJQga2VlcCBpdCBvdXQgb2YgdGhlIGFsd2F5cy1vbiBsaW5lOyBzdXJmYWNlIGl0IG9ubHkgdW5kZXIgREVCVUcuXG4gICAgICBwcmludEVycm9yKCdBUEkgcmVxdWVzdCBmYWlsZWQnLCB7IHN0YXR1cywgc3RhdHVzVGV4dCwgdXJsIH0pO1xuICAgICAgcHJpbnREZWJ1ZygnQVBJIGVycm9yIHJlc3BvbnNlIGJvZHknLCB7IGRhdGEgfSk7XG5cbiAgICAgIGxldCBtZXNzYWdlID0gYEFQSSByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gO1xuICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBkYXRhICYmIHR5cGVvZiAoZGF0YSBhcyB7IG1lc3NhZ2U6IHVua25vd24gfSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWVzc2FnZSA9IChkYXRhIGFzIHsgbWVzc2FnZTogc3RyaW5nIH0pLm1lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQXBpRXJyb3IobWVzc2FnZSwgc3RhdHVzLCBlcnJvci5yZXNwb25zZSkpO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IucmVxdWVzdCkge1xuICAgICAgY29uc3QgY29kZSA9IGVycm9yLmNvZGUgfHwgJ1VOS05PV04nO1xuICAgICAgY29uc3QgdXJsID0gZXJyb3IuY29uZmlnPy51cmw7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gZXJyb3IuY29uZmlnPy50aW1lb3V0O1xuICAgICAgY29uc3QgY2F1c2UgPSBlcnJvci5jYXVzZTtcblxuICAgICAgcHJpbnRFcnJvcignTm8gcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBBUEknLCB7XG4gICAgICAgIHVybCxcbiAgICAgICAgdGltZW91dCxcbiAgICAgICAgY29kZSxcbiAgICAgICAgLi4uKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyB7IGNhdXNlOiBjYXVzZS5tZXNzYWdlIH0gOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaGludHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIEVDT05OUkVGVVNFRDogJ1NlcnZlciBpcyBub3QgcnVubmluZyBvciBwb3J0IGlzIHdyb25nJyxcbiAgICAgICAgRUNPTk5SRVNFVDogJ1NlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5JyxcbiAgICAgICAgRVRJTUVET1VUOiAnQ29ubmVjdGlvbiB0aW1lZCBvdXQg4oCUIHNlcnZlciB1bnJlYWNoYWJsZSBvciB0b28gc2xvdycsXG4gICAgICAgIEVOT1RGT1VORDogJ0ROUyBsb29rdXAgZmFpbGVkIOKAlCBjaGVjayB0aGUgaG9zdG5hbWUgaW4gYmFzZVVybCcsXG4gICAgICAgIEVSUl9CQURfUkVRVUVTVDogJ1JlcXVlc3Qgd2FzIG1hbGZvcm1lZCDigJQgY2hlY2sgdGhlIGVuZHBvaW50IGFuZCBwYXlsb2FkJyxcbiAgICAgICAgQ0VSVF9IQVNfRVhQSVJFRDogJ1NTTCBjZXJ0aWZpY2F0ZSBleHBpcmVkIOKAlCB1c2UgLS1uby12ZXJpZnktc3NsIGZvciBkZXYnLFxuICAgICAgICBERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ6ICdTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSDigJQgdXNlIC0tbm8tdmVyaWZ5LXNzbCcsXG4gICAgICAgIFVOQUJMRV9UT19WRVJJRllfTEVBRl9TSUdOQVRVUkU6ICdTU0wgY2hhaW4gaW5jb21wbGV0ZSDigJQgdXNlIC0tbm8tdmVyaWZ5LXNzbCBmb3IgZGV2JyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhpbnQgPSBoaW50c1tjb2RlXSB8fCAnQ2hlY2sgbmV0d29yayBjb25uZWN0aXZpdHkgYW5kIHNlcnZlciBzdGF0dXMnO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2NvZGV9OiAke2hpbnR9ICh1cmw6ICR7dXJsfSlgO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IE5ldHdvcmtFcnJvcihtZXNzYWdlLCB1cmwsIGVycm9yLCB0aW1lb3V0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByaW50RXJyb3IoJ0FQSSByZXF1ZXN0IGVycm9yJywgeyBlcnJvcjogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPih1cmw6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXQ8VD4odXJsLCB7IHBhcmFtcywgaGVhZGVycyB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIEJJTkFSWSBkb3dubG9hZCAoYSByZXBvcnQgUERGKTogdGhlIGJ5dGVzLCBwbHVzIHRoZSBmaWxlIG5hbWUgdGhlIHNlcnZlciBjaG9zZS5cbiAgICpcbiAgICogYHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJ2AgYmVjYXVzZSB0aGUgZGVmYXVsdCB3b3VsZCBoYW5kIGJhY2sgYSBVVEYtOCBzdHJpbmcgYW5kXG4gICAqIGNvcnJ1cHQgZXZlcnkgYnl0ZSBhYm92ZSAweDdmIOKAlCBhIFBERiB3cml0dGVuIHRoYXQgd2F5IG9wZW5zIGFzIGEgZGFtYWdlZCBmaWxlLCB3aGljaFxuICAgKiBsb29rcyBsaWtlIGEgc2VydmVyIGJ1ZyByYXRoZXIgdGhhbiBhIGNsaWVudCBvbmUuXG4gICAqXG4gICAqIFRoZSBzZXJ2ZXIncyBgQ29udGVudC1EaXNwb3NpdGlvbmAgbmFtZSBpcyBwcmVmZXJyZWQgb3ZlciBhbnl0aGluZyB0aGUgY2FsbGVyIGd1ZXNzZXM6XG4gICAqIGl0IGtub3dzIHRoZSByZXBvcnQncyB0aXRsZSBhbmQgd2hldGhlciB0aGUgcnVuIGlzIGEgcmV2aXNpb24uXG4gICAqL1xuICBhc3luYyBnZXRCaW5hcnkodXJsOiBzdHJpbmcsIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgZmlsZW5hbWU/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0PEFycmF5QnVmZmVyPih1cmwsIHsgaGVhZGVycywgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2l0aW9uID0gU3RyaW5nKHJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSA/PyAnJyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvZmlsZW5hbWU9XCIoW15cIl0rKVwiLy5leGVjKGRpc3Bvc2l0aW9uKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogQnVmZmVyLmZyb20ocmVzcG9uc2UuZGF0YSksXG4gICAgICAuLi4obWF0Y2g/LlsxXSA/IHsgZmlsZW5hbWU6IG1hdGNoWzFdIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBkYXRhPzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3Q8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwb3N0Rm9ybTxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB1cGxvYWRUaW1lb3V0ID0gdGhpcy5jb25maWcuYXBpLnVwbG9hZFRpbWVvdXQgfHwgMTUgKiA2MCAqIDEwMDA7IC8vIGRlZmF1bHQgMTUgbWludXRlc1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7XG4gICAgICBoZWFkZXJzOiB7IC4uLmZvcm1EYXRhLmdldEhlYWRlcnMoKSwgLi4uaGVhZGVycyB9LFxuICAgICAgbWF4Q29udGVudExlbmd0aDogSW5maW5pdHksXG4gICAgICBtYXhCb2R5TGVuZ3RoOiBJbmZpbml0eSxcbiAgICAgIHRpbWVvdXQ6IHVwbG9hZFRpbWVvdXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwdXQ8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBkYXRhPzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnB1dDxUPih1cmwsIGRhdGEsIHsgaGVhZGVycyB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwYXRjaDxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucGF0Y2g8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBnZXRDb25maWcoKTogQ29uZmlnIHsgcmV0dXJuIHRoaXMuY29uZmlnOyB9XG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29uZmlnLmFwaS5iYXNlVXJsOyB9XG4gIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5jb25maWcuYXV0aD8udG9rZW47IH1cblxuICAvKipcbiAgICogQWR2aXNvcnkgY2hlY2s6IGRlY29kZSBKV1QgZXhwIGNsYWltIGFuZCB3YXJuIGlmIGV4cGlyZWQuXG4gICAqIERvZXMgTk9UIHZlcmlmeSBzaWduYXR1cmUg4oCUIHNlcnZlciBoYW5kbGVzIHRoYXQuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrVG9rZW5FeHBpcnkodG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQgPSBkZWNvZGVUb2tlblBheWxvYWQodG9rZW4pO1xuICAgIGlmIChwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IG5ldyBEYXRlKHBheWxvYWQuZXhwICogMTAwMCk7XG4gICAgICBpZiAoZXhwaXJlc0F0LmdldFRpbWUoKSA8IERhdGUubm93KCkpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBUb2tlbiBleHBpcmVkIGF0ICR7ZXhwaXJlc0F0LnRvSVNPU3RyaW5nKCl9IOKAlCBydW4gXCJwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW5cIiB0byByZWZyZXNoYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=