@sendly/cli 3.4.0 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,34 +1,35 @@
1
1
  import { Flags } from "@oclif/core";
2
- import { readFileSync } from "fs";
2
+ import { readFileSync, existsSync } from "fs";
3
+ import { basename } from "path";
3
4
  import { AuthenticatedCommand } from "../../lib/base-command.js";
4
5
  import { apiClient } from "../../lib/api-client.js";
5
6
  import { success, error, spinner, colors, json, isJsonMode, } from "../../lib/output.js";
6
7
  export default class SmsBatch extends AuthenticatedCommand {
7
- static description = "Send batch SMS messages";
8
+ static description = "Send batch SMS messages (uploads CSV to cloud for audit trail)";
8
9
  static examples = [
9
- "<%= config.bin %> sms batch --file recipients.json",
10
- '<%= config.bin %> sms batch --to +15551234567,+15559876543 --text "Hello everyone!"',
11
- '<%= config.bin %> sms batch --file phones.csv --text "Your order is ready!"',
12
- '<%= config.bin %> sms batch --file recipients.csv --from "Sendly"',
13
- "<%= config.bin %> sms batch --file messages.json --json",
14
- '<%= config.bin %> sms batch --file phones.csv --text "Hi" --dry-run',
15
- '<%= config.bin %> sms batch --file phones.csv --text "Your code: 123" --type transactional',
10
+ "<%= config.bin %> sms batch --file recipients.csv",
11
+ '<%= config.bin %> sms batch --file phones.csv --text "Hello everyone!"',
12
+ '<%= config.bin %> sms batch --to +15551234567,+15559876543 --text "Hello!"',
13
+ "<%= config.bin %> sms batch --file recipients.csv --dry-run",
14
+ '<%= config.bin %> sms batch --file phones.csv --text "Code: 123" --type transactional',
15
+ "<%= config.bin %> sms batch --reuse abc123-def456",
16
+ "<%= config.bin %> sms batch --history",
16
17
  ];
17
18
  static flags = {
18
19
  ...AuthenticatedCommand.baseFlags,
19
20
  file: Flags.string({
20
21
  char: "F",
21
- description: "JSON file with messages array [{to, text}, ...]",
22
- exclusive: ["to"],
22
+ description: "CSV file with phone numbers (and optional message text)",
23
+ exclusive: ["to", "reuse", "history"],
23
24
  }),
24
25
  to: Flags.string({
25
26
  char: "t",
26
27
  description: "Comma-separated recipient phone numbers (E.164 format)",
27
- exclusive: ["file"],
28
+ exclusive: ["file", "reuse", "history"],
28
29
  }),
29
30
  text: Flags.string({
30
31
  char: "m",
31
- description: "Message text (works with --to or --file for phone-only lists)",
32
+ description: "Message text (required with --to, optional with --file if CSV has text column)",
32
33
  }),
33
34
  from: Flags.string({
34
35
  char: "f",
@@ -44,44 +45,118 @@ export default class SmsBatch extends AuthenticatedCommand {
44
45
  description: "Preview batch without sending (validates access, shows cost and compliance breakdown)",
45
46
  default: false,
46
47
  }),
48
+ reuse: Flags.string({
49
+ description: "Re-use a previous batch upload by ID (see --history)",
50
+ exclusive: ["file", "to", "history"],
51
+ }),
52
+ history: Flags.boolean({
53
+ description: "Show recent batch upload history",
54
+ exclusive: ["file", "to", "reuse"],
55
+ default: false,
56
+ }),
47
57
  };
48
58
  async run() {
49
59
  const { flags } = await this.parse(SmsBatch);
50
- let messages = [];
51
- // Parse messages from file or flags
60
+ // Handle history subcommand
61
+ if (flags.history) {
62
+ return this.showHistory();
63
+ }
64
+ // Handle reuse subcommand
65
+ if (flags.reuse) {
66
+ return this.reuseBatch(flags.reuse, flags);
67
+ }
68
+ // Handle --to flag (inline recipients, no upload needed)
69
+ if (flags.to) {
70
+ return this.sendInlineRecipients(flags);
71
+ }
72
+ // Handle --file flag (upload to Supabase)
52
73
  if (flags.file) {
53
- messages = this.parseMessagesFromFile(flags.file);
74
+ return this.uploadAndSend(flags);
54
75
  }
55
- else if (flags.to) {
56
- if (!flags.text) {
57
- error("--text is required when using --to");
58
- this.exit(1);
76
+ error("Either --file, --to, --reuse, or --history is required");
77
+ this.exit(1);
78
+ }
79
+ /**
80
+ * Show batch upload history
81
+ */
82
+ async showHistory() {
83
+ const spin = spinner("Fetching batch history...").start();
84
+ try {
85
+ const response = await apiClient.get("/api/cli/batch/history", { limit: 15 });
86
+ spin.stop();
87
+ if (isJsonMode()) {
88
+ json(response);
89
+ return;
90
+ }
91
+ if (response.uploads.length === 0) {
92
+ console.log(colors.dim("\nNo batch uploads found.\n"));
93
+ console.log("Upload a CSV file with: sendly sms batch --file your.csv");
94
+ return;
59
95
  }
60
- messages = this.parseMessagesFromFlags(flags.to, flags.text);
96
+ console.log(colors.bold("\nšŸ“ Recent Batch Uploads\n"));
97
+ console.log(colors.dim("─".repeat(80)));
98
+ for (const upload of response.uploads) {
99
+ const date = new Date(upload.createdAt).toLocaleString();
100
+ const size = this.formatBytes(upload.size);
101
+ const source = upload.metadata?.source === "cli" ? "CLI" : "Web";
102
+ console.log(`${colors.info(upload.id.slice(0, 8))} ${upload.filename}`);
103
+ console.log(colors.dim(` ${date} | ${size} | ${upload.metadata?.validCount || 0} valid recipients | ${source}`));
104
+ }
105
+ console.log(colors.dim("─".repeat(80)));
106
+ console.log(colors.dim("\nRe-use a batch: sendly sms batch --reuse <id>"));
61
107
  }
62
- else {
63
- error("Either --file or --to is required");
64
- this.exit(1);
108
+ catch (err) {
109
+ spin.stop();
110
+ throw err;
65
111
  }
66
- // Apply shared text from --text flag to messages without text
67
- if (flags.text) {
68
- messages = messages.map((msg) => ({
69
- to: msg.to,
70
- text: msg.text || flags.text,
71
- }));
112
+ }
113
+ /**
114
+ * Re-use a previous batch upload
115
+ */
116
+ async reuseBatch(uploadId, flags) {
117
+ const spin = spinner("Fetching batch data...").start();
118
+ try {
119
+ const response = await apiClient.get(`/api/cli/batch/reuse/${uploadId}`);
120
+ spin.stop();
121
+ console.log(colors.success(`\nāœ“ Loaded batch: ${response.upload.filename}`));
122
+ console.log(colors.dim(` ${response.validation.validCount} valid recipients from ${response.validation.totalRows} rows`));
123
+ // Apply shared text if provided
124
+ let messages = response.recipients;
125
+ if (flags.text) {
126
+ messages = messages.map((r) => ({
127
+ to: r.to,
128
+ text: r.text || flags.text,
129
+ }));
130
+ }
131
+ // Validate all messages have text
132
+ const missingText = messages.filter((m) => !m.text?.trim());
133
+ if (missingText.length > 0) {
134
+ error(`${missingText.length} recipients missing message text. Use --text to provide a default.`);
135
+ this.exit(1);
136
+ }
137
+ // Proceed with preview or send
138
+ await this.previewOrSend(messages, flags, response.upload.id);
72
139
  }
73
- // Validate messages
74
- if (messages.length === 0) {
75
- error("No messages to send");
76
- this.exit(1);
140
+ catch (err) {
141
+ spin.stop();
142
+ throw err;
77
143
  }
78
- if (messages.length > 1000) {
79
- error("Batch size cannot exceed 1000 messages", {
80
- hint: "Split your messages into smaller batches",
81
- });
144
+ }
145
+ /**
146
+ * Send to inline recipients (--to flag)
147
+ * This path doesn't upload to Supabase since it's just a few numbers
148
+ */
149
+ async sendInlineRecipients(flags) {
150
+ if (!flags.text) {
151
+ error("--text is required when using --to");
82
152
  this.exit(1);
83
153
  }
84
- // Validate each message
154
+ const phones = flags.to.split(",").map((p) => p.trim());
155
+ const messages = phones.map((phone) => ({
156
+ to: phone.startsWith("+") ? phone : `+${phone}`,
157
+ text: flags.text,
158
+ }));
159
+ // Validate phone numbers
85
160
  for (const msg of messages) {
86
161
  if (!/^\+[1-9]\d{1,14}$/.test(msg.to)) {
87
162
  error(`Invalid phone number: ${msg.to}`, {
@@ -89,119 +164,98 @@ export default class SmsBatch extends AuthenticatedCommand {
89
164
  });
90
165
  this.exit(1);
91
166
  }
92
- if (!msg.text?.trim()) {
93
- error(`Empty message text for ${msg.to}`, {
94
- hint: "Use --text to provide a shared message for all recipients",
95
- });
96
- this.exit(1);
97
- }
98
167
  }
99
- // Handle dry-run mode
100
- if (flags["dry-run"]) {
101
- const spin = spinner("Analyzing batch...").start();
102
- try {
103
- const preview = await apiClient.post("/api/v1/messages/batch/preview", { messages, text: flags.text, messageType: flags.type });
104
- spin.stop();
105
- if (isJsonMode()) {
106
- json(preview);
107
- return;
108
- }
109
- // Show comprehensive preview
110
- console.log(colors.bold("\nšŸ“Š Batch Preview (Dry Run)\n"));
111
- // Summary table
112
- console.log(colors.dim("─".repeat(50)));
113
- console.log(`Total messages: ${preview.total}`);
114
- console.log(`Sendable: ${colors.success(String(preview.sendable))}`);
115
- console.log(`Blocked: ${preview.blocked > 0 ? colors.error(String(preview.blocked)) : "0"}`);
116
- console.log(`Duplicates removed: ${preview.duplicates}`);
117
- console.log(colors.dim("─".repeat(50)));
118
- // Credits
119
- console.log(`\nCredits needed: ${preview.creditsNeeded}`);
120
- console.log(`Your balance: ${preview.creditBalance}`);
121
- if (!preview.hasSufficientCredits) {
122
- console.log(colors.error(`āš ļø Insufficient credits! Need ${preview.creditsNeeded - preview.creditBalance} more.`));
123
- }
124
- // Access info
125
- console.log(`\nAPI Key type: ${preview.keyType.toUpperCase()}`);
126
- console.log(`Write access: ${preview.hasWriteScope ? "āœ“" : "āœ—"}`);
127
- console.log(`Domestic (US/CA): ${preview.messagingProfile.canSendDomestic ? "āœ“" : "āœ—"}`);
128
- console.log(`International: ${preview.messagingProfile.canSendInternational ? "āœ“" : "āœ—"}`);
129
- // Country breakdown
130
- const countries = Object.entries(preview.byCountry);
131
- if (countries.length > 0) {
132
- console.log(colors.bold("\nšŸ“ By Country:\n"));
133
- for (const [country, data] of countries) {
134
- const status = data.allowed
135
- ? colors.success("āœ“")
136
- : colors.error("āœ—");
137
- console.log(` ${status} ${country}: ${data.count} msgs, ${data.credits} credits (${data.tier})`);
138
- if (!data.allowed && data.blockedReason) {
139
- console.log(colors.dim(` └─ ${data.blockedReason}`));
140
- }
141
- }
142
- }
143
- // Compliance check results
144
- if (preview.compliance) {
145
- console.log(colors.bold("\nšŸ›”ļø Compliance Check:\n"));
146
- console.log(` Message Type: ${preview.compliance.messageType.toUpperCase()}`);
147
- if (preview.compliance.shaftBlocked > 0) {
148
- console.log(colors.error(` SHAFT Blocked: ${preview.compliance.shaftBlocked} messages`));
149
- for (const msg of preview.compliance.shaftBlockedMessages.slice(0, 3)) {
150
- console.log(colors.dim(` └─ ${msg.to}: ${msg.category} (${msg.matchedTerms.join(", ")})`));
151
- }
152
- if (preview.compliance.shaftBlockedMessages.length > 3) {
153
- console.log(colors.dim(` ... and ${preview.compliance.shaftBlockedMessages.length - 3} more`));
154
- }
155
- }
156
- else {
157
- console.log(colors.success(" SHAFT Check: āœ“ All messages pass content filter"));
158
- }
159
- if (preview.compliance.messageType === "marketing") {
160
- if (preview.compliance.quietHoursRescheduled > 0) {
161
- console.log(colors.warning(` Quiet Hours: ${preview.compliance.quietHoursRescheduled} messages will be rescheduled`));
162
- for (const msg of preview.compliance.quietHoursBlockedMessages.slice(0, 3)) {
163
- const nextTime = msg.nextAllowedTime
164
- ? new Date(msg.nextAllowedTime).toLocaleString()
165
- : "next available window";
166
- console.log(colors.dim(` └─ ${msg.to}: ${msg.recipientTimezone} → ${nextTime}`));
167
- }
168
- if (preview.compliance.quietHoursBlockedMessages.length > 3) {
169
- console.log(colors.dim(` ... and ${preview.compliance.quietHoursBlockedMessages.length - 3} more`));
170
- }
171
- }
172
- else {
173
- console.log(colors.success(" Quiet Hours: āœ“ All recipients within allowed hours"));
174
- }
175
- }
176
- else {
177
- console.log(colors.dim(" Quiet Hours: Bypassed (transactional message)"));
178
- }
179
- }
180
- // Warnings
181
- if (preview.warnings.length > 0) {
182
- console.log(colors.warning("\nāš ļø Warnings:"));
183
- for (const w of preview.warnings) {
184
- console.log(` • ${w}`);
185
- }
168
+ await this.previewOrSend(messages, flags);
169
+ }
170
+ /**
171
+ * Upload CSV to Supabase and send
172
+ */
173
+ async uploadAndSend(flags) {
174
+ const filePath = flags.file;
175
+ // Check file exists
176
+ if (!existsSync(filePath)) {
177
+ error(`File not found: ${filePath}`);
178
+ this.exit(1);
179
+ }
180
+ // Validate file extension
181
+ if (!filePath.endsWith(".csv")) {
182
+ error("Only CSV files are supported", {
183
+ hint: "Convert your file to CSV format with columns: phone,message",
184
+ });
185
+ this.exit(1);
186
+ }
187
+ // Read file
188
+ const buffer = readFileSync(filePath);
189
+ const filename = basename(filePath);
190
+ // Check file size (5MB limit)
191
+ if (buffer.length > 5 * 1024 * 1024) {
192
+ error("File too large (max 5MB)", {
193
+ hint: "Split your CSV into smaller files",
194
+ });
195
+ this.exit(1);
196
+ }
197
+ const spin = spinner(`Uploading ${filename}...`).start();
198
+ try {
199
+ // Upload to Supabase via CLI endpoint
200
+ const response = await apiClient.uploadFile("/api/cli/batch/upload", { buffer, filename, mimetype: "text/csv" });
201
+ spin.stop();
202
+ // Show upload summary
203
+ console.log(colors.success(`\nāœ“ Uploaded: ${response.upload.filename}`));
204
+ console.log(colors.dim(` Upload ID: ${response.upload.id}`));
205
+ console.log(colors.dim(` ${response.validation.validCount} valid / ${response.validation.invalidCount} invalid / ${response.validation.duplicatesRemoved} duplicates removed`));
206
+ // Show validation errors if any
207
+ if (response.errors.length > 0) {
208
+ console.log(colors.warning(`\nāš ļø Validation errors:`));
209
+ for (const err of response.errors.slice(0, 5)) {
210
+ console.log(colors.dim(` Row ${err.row}: ${err.phone} - ${err.error}`));
186
211
  }
187
- // Blocked messages (first 5)
188
- if (preview.blockedMessages.length > 0) {
189
- console.log(colors.error(`\nāŒ Blocked Messages (${preview.blockedMessages.length} total):`));
190
- for (const b of preview.blockedMessages.slice(0, 5)) {
191
- console.log(` ${b.to}: ${b.reason}`);
192
- }
193
- if (preview.blockedMessages.length > 5) {
194
- console.log(colors.dim(` ... and ${preview.blockedMessages.length - 5} more`));
195
- }
212
+ if (response.hasMoreErrors) {
213
+ console.log(colors.dim(` ... and ${response.validation.invalidCount - 5} more errors`));
196
214
  }
197
- console.log("\n" + colors.dim("No messages were sent. Remove --dry-run to send."));
198
- return;
199
215
  }
200
- catch (err) {
201
- spin.stop();
202
- throw err;
216
+ if (response.recipients.length === 0) {
217
+ error("No valid recipients found in CSV");
218
+ this.exit(1);
219
+ }
220
+ // Apply shared text if provided
221
+ let messages = response.recipients;
222
+ if (flags.text) {
223
+ messages = messages.map((r) => ({
224
+ to: r.to,
225
+ text: r.text || flags.text,
226
+ }));
227
+ }
228
+ // Validate all messages have text
229
+ const missingText = messages.filter((m) => !m.text?.trim());
230
+ if (missingText.length > 0) {
231
+ error(`${missingText.length} recipients missing message text. Use --text to provide a default.`);
232
+ console.log(colors.dim("\nCSV should have columns: phone,message OR use --text flag"));
233
+ this.exit(1);
203
234
  }
235
+ // Proceed with preview or send
236
+ await this.previewOrSend(messages, flags, response.upload.id);
204
237
  }
238
+ catch (err) {
239
+ spin.stop();
240
+ throw err;
241
+ }
242
+ }
243
+ /**
244
+ * Preview or send the batch
245
+ */
246
+ async previewOrSend(messages, flags, uploadId) {
247
+ // Check batch size
248
+ if (messages.length > 1000) {
249
+ error("Batch size cannot exceed 1000 messages", {
250
+ hint: "Split your messages into smaller batches",
251
+ });
252
+ this.exit(1);
253
+ }
254
+ // Handle dry-run mode
255
+ if (flags["dry-run"]) {
256
+ return this.showPreview(messages, flags);
257
+ }
258
+ // Send the batch
205
259
  const spin = spinner(`Sending ${messages.length} messages...`);
206
260
  spin.start();
207
261
  try {
@@ -209,6 +263,7 @@ export default class SmsBatch extends AuthenticatedCommand {
209
263
  messages,
210
264
  messageType: flags.type,
211
265
  ...(flags.from && { from: flags.from }),
266
+ ...(uploadId && { uploadId }), // Link to file upload for audit trail
212
267
  });
213
268
  spin.stop();
214
269
  if (isJsonMode()) {
@@ -262,84 +317,120 @@ export default class SmsBatch extends AuthenticatedCommand {
262
317
  throw err;
263
318
  }
264
319
  }
265
- parseMessagesFromFile(filePath) {
320
+ /**
321
+ * Show batch preview (dry-run mode)
322
+ */
323
+ async showPreview(messages, flags) {
324
+ const spin = spinner("Analyzing batch...").start();
266
325
  try {
267
- const content = readFileSync(filePath, "utf-8");
268
- // Try JSON first
269
- if (filePath.endsWith(".json")) {
270
- const data = JSON.parse(content);
271
- if (Array.isArray(data)) {
272
- return data.map((item) => ({
273
- to: item.to,
274
- text: item.text,
275
- }));
276
- }
277
- if (data.messages && Array.isArray(data.messages)) {
278
- return data.messages;
326
+ const preview = await apiClient.post("/api/v1/messages/batch/preview", { messages, messageType: flags.type });
327
+ spin.stop();
328
+ if (isJsonMode()) {
329
+ json(preview);
330
+ return;
331
+ }
332
+ // Show comprehensive preview
333
+ console.log(colors.bold("\nšŸ“Š Batch Preview (Dry Run)\n"));
334
+ // Summary table
335
+ console.log(colors.dim("─".repeat(50)));
336
+ console.log(`Total messages: ${preview.total}`);
337
+ console.log(`Sendable: ${colors.success(String(preview.sendable))}`);
338
+ console.log(`Blocked: ${preview.blocked > 0 ? colors.error(String(preview.blocked)) : "0"}`);
339
+ console.log(`Duplicates removed: ${preview.duplicates}`);
340
+ console.log(colors.dim("─".repeat(50)));
341
+ // Credits
342
+ console.log(`\nCredits needed: ${preview.creditsNeeded}`);
343
+ console.log(`Your balance: ${preview.creditBalance}`);
344
+ if (!preview.hasSufficientCredits) {
345
+ console.log(colors.error(`āš ļø Insufficient credits! Need ${preview.creditsNeeded - preview.creditBalance} more.`));
346
+ }
347
+ // Access info
348
+ console.log(`\nAPI Key type: ${preview.keyType.toUpperCase()}`);
349
+ console.log(`Write access: ${preview.hasWriteScope ? "āœ“" : "āœ—"}`);
350
+ console.log(`Domestic (US/CA): ${preview.messagingProfile.canSendDomestic ? "āœ“" : "āœ—"}`);
351
+ console.log(`International: ${preview.messagingProfile.canSendInternational ? "āœ“" : "āœ—"}`);
352
+ // Country breakdown
353
+ const countries = Object.entries(preview.byCountry);
354
+ if (countries.length > 0) {
355
+ console.log(colors.bold("\nšŸ“ By Country:\n"));
356
+ for (const [country, data] of countries) {
357
+ const status = data.allowed ? colors.success("āœ“") : colors.error("āœ—");
358
+ console.log(` ${status} ${country}: ${data.count} msgs, ${data.credits} credits (${data.tier})`);
359
+ if (!data.allowed && data.blockedReason) {
360
+ console.log(colors.dim(` └─ ${data.blockedReason}`));
361
+ }
279
362
  }
280
- error("Invalid JSON format", {
281
- hint: "Expected array of {to, text} objects or {messages: [...]}",
282
- });
283
- this.exit(1);
284
363
  }
285
- // Try CSV
286
- if (filePath.endsWith(".csv")) {
287
- const lines = content.trim().split("\n");
288
- const messages = [];
289
- // Improved header detection - check for common header patterns
290
- const headerPatterns = [
291
- "to",
292
- "phone",
293
- "number",
294
- "recipient",
295
- "mobile",
296
- "cell",
297
- ];
298
- const firstLine = lines[0].toLowerCase();
299
- const hasHeader = headerPatterns.some((p) => firstLine.includes(p));
300
- const startIndex = hasHeader ? 1 : 0;
301
- for (let i = startIndex; i < lines.length; i++) {
302
- const line = lines[i].trim();
303
- if (!line)
304
- continue; // Skip empty lines
305
- const parts = line.split(",");
306
- if (parts.length >= 1) {
307
- const phone = parts[0].trim().replace(/"/g, "");
308
- // Only add if phone looks valid (starts with + or digit)
309
- if (phone && (phone.startsWith("+") || /^\d/.test(phone))) {
310
- messages.push({
311
- to: phone.startsWith("+") ? phone : `+${phone}`,
312
- text: parts.length >= 2
313
- ? parts.slice(1).join(",").trim().replace(/"/g, "") ||
314
- undefined
315
- : undefined,
316
- });
364
+ // Compliance check results
365
+ if (preview.compliance) {
366
+ console.log(colors.bold("\nšŸ›”ļø Compliance Check:\n"));
367
+ console.log(` Message Type: ${preview.compliance.messageType.toUpperCase()}`);
368
+ if (preview.compliance.shaftBlocked > 0) {
369
+ console.log(colors.error(` SHAFT Blocked: ${preview.compliance.shaftBlocked} messages`));
370
+ for (const msg of preview.compliance.shaftBlockedMessages.slice(0, 3)) {
371
+ console.log(colors.dim(` └─ ${msg.to}: ${msg.category} (${msg.matchedTerms.join(", ")})`));
372
+ }
373
+ if (preview.compliance.shaftBlockedMessages.length > 3) {
374
+ console.log(colors.dim(` ... and ${preview.compliance.shaftBlockedMessages.length - 3} more`));
375
+ }
376
+ }
377
+ else {
378
+ console.log(colors.success(" SHAFT Check: āœ“ All messages pass content filter"));
379
+ }
380
+ if (preview.compliance.messageType === "marketing") {
381
+ if (preview.compliance.quietHoursRescheduled > 0) {
382
+ console.log(colors.warning(` Quiet Hours: ${preview.compliance.quietHoursRescheduled} messages will be rescheduled`));
383
+ for (const msg of preview.compliance.quietHoursBlockedMessages.slice(0, 3)) {
384
+ const nextTime = msg.nextAllowedTime
385
+ ? new Date(msg.nextAllowedTime).toLocaleString()
386
+ : "next available window";
387
+ console.log(colors.dim(` └─ ${msg.to}: ${msg.recipientTimezone} → ${nextTime}`));
317
388
  }
389
+ if (preview.compliance.quietHoursBlockedMessages.length > 3) {
390
+ console.log(colors.dim(` ... and ${preview.compliance.quietHoursBlockedMessages.length - 3} more`));
391
+ }
392
+ }
393
+ else {
394
+ console.log(colors.success(" Quiet Hours: āœ“ All recipients within allowed hours"));
318
395
  }
319
396
  }
320
- return messages;
321
- }
322
- error("Unsupported file format", {
323
- hint: "Use .json or .csv file",
324
- });
325
- this.exit(1);
326
- }
327
- catch (err) {
328
- if (err.code === "ENOENT") {
329
- error(`File not found: ${filePath}`);
397
+ else {
398
+ console.log(colors.dim(" Quiet Hours: Bypassed (transactional message)"));
399
+ }
330
400
  }
331
- else if (err instanceof SyntaxError) {
332
- error("Invalid JSON in file", { hint: err.message });
401
+ // Warnings
402
+ if (preview.warnings.length > 0) {
403
+ console.log(colors.warning("\nāš ļø Warnings:"));
404
+ for (const w of preview.warnings) {
405
+ console.log(` • ${w}`);
406
+ }
333
407
  }
334
- else {
335
- throw err;
408
+ // Blocked messages (first 5)
409
+ if (preview.blockedMessages.length > 0) {
410
+ console.log(colors.error(`\nāŒ Blocked Messages (${preview.blockedMessages.length} total):`));
411
+ for (const b of preview.blockedMessages.slice(0, 5)) {
412
+ console.log(` ${b.to}: ${b.reason}`);
413
+ }
414
+ if (preview.blockedMessages.length > 5) {
415
+ console.log(colors.dim(` ... and ${preview.blockedMessages.length - 5} more`));
416
+ }
336
417
  }
337
- this.exit(1);
418
+ console.log("\n" + colors.dim("No messages were sent. Remove --dry-run to send."));
419
+ }
420
+ catch (err) {
421
+ spin.stop();
422
+ throw err;
338
423
  }
339
424
  }
340
- parseMessagesFromFlags(to, text) {
341
- const phones = to.split(",").map((p) => p.trim());
342
- return phones.map((phone) => ({ to: phone, text }));
425
+ /**
426
+ * Format bytes to human readable string
427
+ */
428
+ formatBytes(bytes) {
429
+ if (bytes < 1024)
430
+ return `${bytes} B`;
431
+ if (bytes < 1024 * 1024)
432
+ return `${(bytes / 1024).toFixed(1)} KB`;
433
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
343
434
  }
344
435
  }
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFnRjdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBRS9DLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsb0RBQW9EO1FBQ3BELHFGQUFxRjtRQUNyRiw2RUFBNkU7UUFDN0UsbUVBQW1FO1FBQ25FLHlEQUF5RDtRQUN6RCxxRUFBcUU7UUFDckUsNEZBQTRGO0tBQzdGLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGlEQUFpRDtZQUM5RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbEIsQ0FBQztRQUNGLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNwQixDQUFDO1FBQ0YsSUFBSSxFQUFFLEtB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QUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJhdGNoTWVzc2FnZSB7XG4gIHRvOiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIC0gY2FuIGJlIHByb3ZpZGVkIHZpYSAtLXRleHQgZmxhZ1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hSZXNwb25zZSB7XG4gIGJhdGNoSWQ6IHN0cmluZztcbiAgdG90YWw6IG51bWJlcjtcbiAgc2VudDogbnVtYmVyO1xuICBxdWV1ZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNyZWRpdHNVc2VkOiBudW1iZXI7XG4gIGNyZWRpdHNSZWZ1bmRlZDogbnVtYmVyO1xuICBzdGF0dXM6IHN0cmluZztcbiAgbWVzc2FnZXM/OiBBcnJheTx7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hQcmV2aWV3UmVzcG9uc2Uge1xuICB0b3RhbDogbnVtYmVyO1xuICBzZW5kYWJsZTogbnVtYmVyO1xuICBibG9ja2VkOiBudW1iZXI7XG4gIGR1cGxpY2F0ZXM6IG51bWJlcjtcbiAgY3JlZGl0c05lZWRlZDogbnVtYmVyO1xuICBjcmVkaXRCYWxhbmNlOiBudW1iZXI7XG4gIGhhc1N1ZmZpY2llbnRDcmVkaXRzOiBib29sZWFuO1xuICBrZXlUeXBlOiBcInRlc3RcIiB8IFwibGl2ZVwiO1xuICBrZXlTY29wZXM6IHN0cmluZ1tdO1xuICBoYXNXcml0ZVNjb3BlOiBib29sZWFuO1xuICBtZXNzYWdpbmdQcm9maWxlOiB7XG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgY2FuU2VuZERvbWVzdGljOiBib29sZWFuO1xuICAgIGNhblNlbmRJbnRlcm5hdGlvbmFsOiBib29sZWFuO1xuICAgIHZlcmlmaWNhdGlvblN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICB2ZXJpZmljYXRpb25UeXBlOiBzdHJpbmcgfCBudWxsO1xuICB9O1xuICBieUNvdW50cnk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgY291bnQ6IG51bWJlcjtcbiAgICAgIGNyZWRpdHM6IG51bWJlcjtcbiAgICAgIHRpZXI6IHN0cmluZztcbiAgICAgIGFsbG93ZWQ6IGJvb2xlYW47XG4gICAgICBibG9ja2VkUmVhc29uPzogc3RyaW5nO1xuICAgIH1cbiAgPjtcbiAgYmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB0bzogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICB9PjtcbiAgY29tcGxpYW5jZToge1xuICAgIG1lc3NhZ2VUeXBlOiBcIm1hcmtldGluZ1wiIHwgXCJ0cmFuc2FjdGlvbmFsXCI7XG4gICAgc2hhZnRCbG9ja2VkOiBudW1iZXI7XG4gICAgcXVpZXRIb3Vyc0Jsb2NrZWQ6IG51bWJlcjtcbiAgICBxdWlldEhvdXJzUmVzY2hlZHVsZWQ6IG51bWJlcjtcbiAgICBzaGFmdEJsb2NrZWRNZXNzYWdlczogQXJyYXk8e1xuICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgIHRvOiBzdHJpbmc7XG4gICAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgICAgbWF0Y2hlZFRlcm1zOiBzdHJpbmdbXTtcbiAgICB9PjtcbiAgICBxdWlldEhvdXJzQmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgdG86IHN0cmluZztcbiAgICAgIHJlY2lwaWVudFRpbWV6b25lOiBzdHJpbmc7XG4gICAgICByZWNpcGllbnRMb2NhbFRpbWU6IHN0cmluZztcbiAgICAgIG5leHRBbGxvd2VkVGltZT86IHN0cmluZztcbiAgICB9PjtcbiAgfTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbXNCYXRjaCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJTZW5kIGJhdGNoIFNNUyBtZXNzYWdlc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5qc29uXCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXRvICsxNTU1MTIzNDU2NywrMTU1NTk4NzY1NDMgLS10ZXh0IFwiSGVsbG8gZXZlcnlvbmUhXCInLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiWW91ciBvcmRlciBpcyByZWFkeSFcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5jc3YgLS1mcm9tIFwiU2VuZGx5XCInLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSBtZXNzYWdlcy5qc29uIC0tanNvblwiLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiSGlcIiAtLWRyeS1ydW4nLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiWW91ciBjb2RlOiAxMjNcIiAtLXR5cGUgdHJhbnNhY3Rpb25hbCcsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBmaWxlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJGXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJKU09OIGZpbGUgd2l0aCBtZXNzYWdlcyBhcnJheSBbe3RvLCB0ZXh0fSwgLi4uXVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJ0b1wiXSxcbiAgICB9KSxcbiAgICB0bzogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwidFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQ29tbWEtc2VwYXJhdGVkIHJlY2lwaWVudCBwaG9uZSBudW1iZXJzIChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICBleGNsdXNpdmU6IFtcImZpbGVcIl0sXG4gICAgfSksXG4gICAgdGV4dDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwibVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTWVzc2FnZSB0ZXh0ICh3b3JrcyB3aXRoIC0tdG8gb3IgLS1maWxlIGZvciBwaG9uZS1vbmx5IGxpc3RzKVwiLFxuICAgIH0pLFxuICAgIGZyb206IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlbmRlciBJRCBvciBwaG9uZSBudW1iZXIgZm9yIGFsbCBtZXNzYWdlc1wiLFxuICAgIH0pLFxuICAgIHR5cGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNZXNzYWdlIHR5cGU6IG1hcmtldGluZyAoZGVmYXVsdCkgb3IgdHJhbnNhY3Rpb25hbC4gVHJhbnNhY3Rpb25hbCBieXBhc3NlcyBxdWlldCBob3Vycy5cIixcbiAgICAgIG9wdGlvbnM6IFtcIm1hcmtldGluZ1wiLCBcInRyYW5zYWN0aW9uYWxcIl0sXG4gICAgICBkZWZhdWx0OiBcIm1hcmtldGluZ1wiLFxuICAgIH0pLFxuICAgIFwiZHJ5LXJ1blwiOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiZFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJldmlldyBiYXRjaCB3aXRob3V0IHNlbmRpbmcgKHZhbGlkYXRlcyBhY2Nlc3MsIHNob3dzIGNvc3QgYW5kIGNvbXBsaWFuY2UgYnJlYWtkb3duKVwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoU21zQmF0Y2gpO1xuXG4gICAgbGV0IG1lc3NhZ2VzOiBCYXRjaE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgLy8gUGFyc2UgbWVzc2FnZXMgZnJvbSBmaWxlIG9yIGZsYWdzXG4gICAgaWYgKGZsYWdzLmZpbGUpIHtcbiAgICAgIG1lc3NhZ2VzID0gdGhpcy5wYXJzZU1lc3NhZ2VzRnJvbUZpbGUoZmxhZ3MuZmlsZSk7XG4gICAgfSBlbHNlIGlmIChmbGFncy50bykge1xuICAgICAgaWYgKCFmbGFncy50ZXh0KSB7XG4gICAgICAgIGVycm9yKFwiLS10ZXh0IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgLS10b1wiKTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgbWVzc2FnZXMgPSB0aGlzLnBhcnNlTWVzc2FnZXNGcm9tRmxhZ3MoZmxhZ3MudG8sIGZsYWdzLnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcihcIkVpdGhlciAtLWZpbGUgb3IgLS10byBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBzaGFyZWQgdGV4dCBmcm9tIC0tdGV4dCBmbGFnIHRvIG1lc3NhZ2VzIHdpdGhvdXQgdGV4dFxuICAgIGlmIChmbGFncy50ZXh0KSB7XG4gICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobXNnKSA9PiAoe1xuICAgICAgICB0bzogbXNnLnRvLFxuICAgICAgICB0ZXh0OiBtc2cudGV4dCB8fCBmbGFncy50ZXh0LFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lc3NhZ2VzXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3IoXCJObyBtZXNzYWdlcyB0byBzZW5kXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICBlcnJvcihcIkJhdGNoIHNpemUgY2Fubm90IGV4Y2VlZCAxMDAwIG1lc3NhZ2VzXCIsIHtcbiAgICAgICAgaGludDogXCJTcGxpdCB5b3VyIG1lc3NhZ2VzIGludG8gc21hbGxlciBiYXRjaGVzXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIG1lc3NhZ2VcbiAgICBmb3IgKGNvbnN0IG1zZyBvZiBtZXNzYWdlcykge1xuICAgICAgaWYgKCEvXlxcK1sxLTldXFxkezEsMTR9JC8udGVzdChtc2cudG8pKSB7XG4gICAgICAgIGVycm9yKGBJbnZhbGlkIHBob25lIG51bWJlcjogJHttc2cudG99YCwge1xuICAgICAgICAgIGhpbnQ6IFwiVXNlIEUuMTY0IGZvcm1hdDogKzE1NTUxMjM0NTY3XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBpZiAoIW1zZy50ZXh0Py50cmltKCkpIHtcbiAgICAgICAgZXJyb3IoYEVtcHR5IG1lc3NhZ2UgdGV4dCBmb3IgJHttc2cudG99YCwge1xuICAgICAgICAgIGhpbnQ6IFwiVXNlIC0tdGV4dCB0byBwcm92aWRlIGEgc2hhcmVkIG1lc3NhZ2UgZm9yIGFsbCByZWNpcGllbnRzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRyeS1ydW4gbW9kZVxuICAgIGlmIChmbGFnc1tcImRyeS1ydW5cIl0pIHtcbiAgICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiQW5hbHl6aW5nIGJhdGNoLi4uXCIpLnN0YXJ0KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXcgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxCYXRjaFByZXZpZXdSZXNwb25zZT4oXG4gICAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL2JhdGNoL3ByZXZpZXdcIixcbiAgICAgICAgICB7IG1lc3NhZ2VzLCB0ZXh0OiBmbGFncy50ZXh0LCBtZXNzYWdlVHlwZTogZmxhZ3MudHlwZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAgICBqc29uKHByZXZpZXcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgY29tcHJlaGVuc2l2ZSBwcmV2aWV3XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TiiBCYXRjaCBQcmV2aWV3IChEcnkgUnVuKVxcblwiKSk7XG5cbiAgICAgICAgLy8gU3VtbWFyeSB0YWJsZVxuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDUwKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgVG90YWwgbWVzc2FnZXM6ICAgICAke3ByZXZpZXcudG90YWx9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBTZW5kYWJsZTogICAgICAgICAgICR7Y29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHByZXZpZXcuc2VuZGFibGUpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgQmxvY2tlZDogICAgICAgICAgICAke3ByZXZpZXcuYmxvY2tlZCA+IDAgPyBjb2xvcnMuZXJyb3IoU3RyaW5nKHByZXZpZXcuYmxvY2tlZCkpIDogXCIwXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coYER1cGxpY2F0ZXMgcmVtb3ZlZDogJHtwcmV2aWV3LmR1cGxpY2F0ZXN9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCLilIBcIi5yZXBlYXQoNTApKSk7XG5cbiAgICAgICAgLy8gQ3JlZGl0c1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuQ3JlZGl0cyBuZWVkZWQ6ICAgICAke3ByZXZpZXcuY3JlZGl0c05lZWRlZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYFlvdXIgYmFsYW5jZTogICAgICAgJHtwcmV2aWV3LmNyZWRpdEJhbGFuY2V9YCk7XG4gICAgICAgIGlmICghcHJldmlldy5oYXNTdWZmaWNpZW50Q3JlZGl0cykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgICBg4pqg77iPICBJbnN1ZmZpY2llbnQgY3JlZGl0cyEgTmVlZCAke3ByZXZpZXcuY3JlZGl0c05lZWRlZCAtIHByZXZpZXcuY3JlZGl0QmFsYW5jZX0gbW9yZS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWNjZXNzIGluZm9cbiAgICAgICAgY29uc29sZS5sb2coYFxcbkFQSSBLZXkgdHlwZTogICAgICAgJHtwcmV2aWV3LmtleVR5cGUudG9VcHBlckNhc2UoKX1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIGFjY2VzczogICAgICAgJHtwcmV2aWV3Lmhhc1dyaXRlU2NvcGUgPyBcIuKck1wiIDogXCLinJdcIn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYERvbWVzdGljIChVUy9DQSk6ICAgJHtwcmV2aWV3Lm1lc3NhZ2luZ1Byb2ZpbGUuY2FuU2VuZERvbWVzdGljID8gXCLinJNcIiA6IFwi4pyXXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYEludGVybmF0aW9uYWw6ICAgICAgJHtwcmV2aWV3Lm1lc3NhZ2luZ1Byb2ZpbGUuY2FuU2VuZEludGVybmF0aW9uYWwgPyBcIuKck1wiIDogXCLinJdcIn1gLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENvdW50cnkgYnJlYWtkb3duXG4gICAgICAgIGNvbnN0IGNvdW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHByZXZpZXcuYnlDb3VudHJ5KTtcbiAgICAgICAgaWYgKGNvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJcXG7wn5ONIEJ5IENvdW50cnk6XFxuXCIpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtjb3VudHJ5LCBkYXRhXSBvZiBjb3VudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGRhdGEuYWxsb3dlZFxuICAgICAgICAgICAgICA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpXG4gICAgICAgICAgICAgIDogY29sb3JzLmVycm9yKFwi4pyXXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGAgICR7c3RhdHVzfSAke2NvdW50cnl9OiAke2RhdGEuY291bnR9IG1zZ3MsICR7ZGF0YS5jcmVkaXRzfSBjcmVkaXRzICgke2RhdGEudGllcn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWRhdGEuYWxsb3dlZCAmJiBkYXRhLmJsb2NrZWRSZWFzb24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICAgICDilJTilIAgJHtkYXRhLmJsb2NrZWRSZWFzb259YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBsaWFuY2UgY2hlY2sgcmVzdWx0c1xuICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJcXG7wn5uh77iPICBDb21wbGlhbmNlIENoZWNrOlxcblwiKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgICBNZXNzYWdlIFR5cGU6ICAgICAgJHtwcmV2aWV3LmNvbXBsaWFuY2UubWVzc2FnZVR5cGUudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZXJyb3IoXG4gICAgICAgICAgICAgICAgYCAgU0hBRlQgQmxvY2tlZDogICAgICR7cHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZH0gbWVzc2FnZXNgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5zbGljZShcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICAgIGAgICAgIOKUlOKUgCAke21zZy50b306ICR7bXNnLmNhdGVnb3J5fSAoJHttc2cubWF0Y2hlZFRlcm1zLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgICBgICAgICAuLi4gYW5kICR7cHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCAtIDN9IG1vcmVgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICBcIiAgU0hBRlQgQ2hlY2s6ICAgICAgIOKckyBBbGwgbWVzc2FnZXMgcGFzcyBjb250ZW50IGZpbHRlclwiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLm1lc3NhZ2VUeXBlID09PSBcIm1hcmtldGluZ1wiKSB7XG4gICAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNSZXNjaGVkdWxlZCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLndhcm5pbmcoXG4gICAgICAgICAgICAgICAgICBgICBRdWlldCBIb3VyczogICAgICAgJHtwcmV2aWV3LmNvbXBsaWFuY2UucXVpZXRIb3Vyc1Jlc2NoZWR1bGVkfSBtZXNzYWdlcyB3aWxsIGJlIHJlc2NoZWR1bGVkYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiBwcmV2aWV3LmNvbXBsaWFuY2UucXVpZXRIb3Vyc0Jsb2NrZWRNZXNzYWdlcy5zbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGltZSA9IG1zZy5uZXh0QWxsb3dlZFRpbWVcbiAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUobXNnLm5leHRBbGxvd2VkVGltZSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgOiBcIm5leHQgYXZhaWxhYmxlIHdpbmRvd1wiO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICAgICAgYCAgICAg4pSU4pSAICR7bXNnLnRvfTogJHttc2cucmVjaXBpZW50VGltZXpvbmV9IOKGkiAke25leHRUaW1lfWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZS5xdWlldEhvdXJzQmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgICAgIGAgICAgIC4uLiBhbmQgJHtwcmV2aWV3LmNvbXBsaWFuY2UucXVpZXRIb3Vyc0Jsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSAzfSBtb3JlYCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICBcIiAgUXVpZXQgSG91cnM6ICAgICAgIOKckyBBbGwgcmVjaXBpZW50cyB3aXRoaW4gYWxsb3dlZCBob3Vyc1wiLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgIFwiICBRdWlldCBIb3VyczogICAgICAgQnlwYXNzZWQgKHRyYW5zYWN0aW9uYWwgbWVzc2FnZSlcIixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FybmluZ3NcbiAgICAgICAgaWYgKHByZXZpZXcud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKFwiXFxu4pqg77iPICBXYXJuaW5nczpcIikpO1xuICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBwcmV2aWV3Lndhcm5pbmdzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAg4oCiICR7d31gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCbG9ja2VkIG1lc3NhZ2VzIChmaXJzdCA1KVxuICAgICAgICBpZiAocHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgICBgXFxu4p2MIEJsb2NrZWQgTWVzc2FnZXMgKCR7cHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RofSB0b3RhbCk6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGIgb2YgcHJldmlldy5ibG9ja2VkTWVzc2FnZXMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAke2IudG99OiAke2IucmVhc29ufWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgYCAgIC4uLiBhbmQgJHtwcmV2aWV3LmJsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSA1fSBtb3JlYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgXCJcXG5cIiArIGNvbG9ycy5kaW0oXCJObyBtZXNzYWdlcyB3ZXJlIHNlbnQuIFJlbW92ZSAtLWRyeS1ydW4gdG8gc2VuZC5cIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzcGluLnN0b3AoKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKGBTZW5kaW5nICR7bWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlcy4uLmApO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEJhdGNoUmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvdjEvbWVzc2FnZXMvYmF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgIG1lc3NhZ2VUeXBlOiBmbGFncy50eXBlLFxuICAgICAgICAgIC4uLihmbGFncy5mcm9tICYmIHsgZnJvbTogZmxhZ3MuZnJvbSB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBzdWNjZXNzIGxldmVsXG4gICAgICBjb25zdCBhbGxTdWNjZWVkZWQgPSByZXNwb25zZS5mYWlsZWQgPT09IDA7XG4gICAgICBjb25zdCBhbGxGYWlsZWQgPSByZXNwb25zZS5zZW50ID09PSAwICYmIHJlc3BvbnNlLmZhaWxlZCA+IDA7XG4gICAgICBjb25zdCBwYXJ0aWFsU3VjY2VzcyA9IHJlc3BvbnNlLnNlbnQgPiAwICYmIHJlc3BvbnNlLmZhaWxlZCA+IDA7XG5cbiAgICAgIGlmIChhbGxTdWNjZWVkZWQpIHtcbiAgICAgICAgc3VjY2VzcyhcIkJhdGNoIHNlbnQgc3VjY2Vzc2Z1bGx5XCIsIHtcbiAgICAgICAgICBcIkJhdGNoIElEXCI6IHJlc3BvbnNlLmJhdGNoSWQsXG4gICAgICAgICAgVG90YWw6IHJlc3BvbnNlLnRvdGFsLFxuICAgICAgICAgIFNlbnQ6IGNvbG9ycy5zdWNjZXNzKFN0cmluZyhyZXNwb25zZS5zZW50KSksXG4gICAgICAgICAgXCJDcmVkaXRzIFVzZWRcIjogcmVzcG9uc2UuY3JlZGl0c1VzZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhbGxGYWlsZWQpIHtcbiAgICAgICAgZXJyb3IoXCJCYXRjaCBmYWlsZWRcIiwge1xuICAgICAgICAgIGhpbnQ6IGBBbGwgJHtyZXNwb25zZS5mYWlsZWR9IG1lc3NhZ2VzIGZhaWxlZCB0byBzZW5kYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYCAgQmF0Y2ggSUQ6ICR7cmVzcG9uc2UuYmF0Y2hJZH1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNvbG9ycy5kaW0oYCAgQ3JlZGl0cyBSZWZ1bmRlZDogJHtyZXNwb25zZS5jcmVkaXRzUmVmdW5kZWR9YCksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpYWxTdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKFwiXFxu4pqg77iPICBCYXRjaCBjb21wbGV0ZWQgd2l0aCBlcnJvcnNcXG5cIikpO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBCYXRjaCBJRDogICAgICAgICAke3Jlc3BvbnNlLmJhdGNoSWR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIFRvdGFsOiAgICAgICAgICAgICR7cmVzcG9uc2UudG90YWx9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgIFNlbnQ6ICAgICAgICAgICAgICR7Y29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHJlc3BvbnNlLnNlbnQpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgICBGYWlsZWQ6ICAgICAgICAgICAke2NvbG9ycy5lcnJvcihTdHJpbmcocmVzcG9uc2UuZmFpbGVkKSl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgQ3JlZGl0cyBVc2VkOiAgICAgJHtyZXNwb25zZS5jcmVkaXRzVXNlZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgQ3JlZGl0cyBSZWZ1bmRlZDogJHtyZXNwb25zZS5jcmVkaXRzUmVmdW5kZWR9YCk7XG5cbiAgICAgICAgLy8gU2hvdyBmYWlsZWQgbWVzc2FnZXMgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlcykge1xuICAgICAgICAgIGNvbnN0IGZhaWxlZE1zZ3MgPSByZXNwb25zZS5tZXNzYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAobSkgPT4gbS5zdGF0dXMgPT09IFwiZmFpbGVkXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmFpbGVkTXNncy5sZW5ndGggPiAwICYmIGZhaWxlZE1zZ3MubGVuZ3RoIDw9IDUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJcXG4gIEZhaWxlZCBtZXNzYWdlczpcIikpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgZmFpbGVkTXNncykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjb2xvcnMuZGltKGAgICAgJHttc2cudG99OiAke21zZy5lcnJvciB8fCBcIlVua25vd24gZXJyb3JcIn1gKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZhaWxlZE1zZ3MubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgYFxcbiAgJHtmYWlsZWRNc2dzLmxlbmd0aH0gbWVzc2FnZXMgZmFpbGVkLiBVc2UgLS1qc29uIGZvciBkZXRhaWxzLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1lc3NhZ2VzRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IEJhdGNoTWVzc2FnZVtdIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gVHJ5IEpTT04gZmlyc3RcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgIHRvOiBpdGVtLnRvLFxuICAgICAgICAgICAgdGV4dDogaXRlbS50ZXh0LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5tZXNzYWdlcyAmJiBBcnJheS5pc0FycmF5KGRhdGEubWVzc2FnZXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubWVzc2FnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IoXCJJbnZhbGlkIEpTT04gZm9ybWF0XCIsIHtcbiAgICAgICAgICBoaW50OiBcIkV4cGVjdGVkIGFycmF5IG9mIHt0bywgdGV4dH0gb2JqZWN0cyBvciB7bWVzc2FnZXM6IFsuLi5dfVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgQ1NWXG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC50cmltKCkuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBCYXRjaE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIEltcHJvdmVkIGhlYWRlciBkZXRlY3Rpb24gLSBjaGVjayBmb3IgY29tbW9uIGhlYWRlciBwYXR0ZXJuc1xuICAgICAgICBjb25zdCBoZWFkZXJQYXR0ZXJucyA9IFtcbiAgICAgICAgICBcInRvXCIsXG4gICAgICAgICAgXCJwaG9uZVwiLFxuICAgICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgICAgXCJyZWNpcGllbnRcIixcbiAgICAgICAgICBcIm1vYmlsZVwiLFxuICAgICAgICAgIFwiY2VsbFwiLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBsaW5lc1swXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBoYXNIZWFkZXIgPSBoZWFkZXJQYXR0ZXJucy5zb21lKChwKSA9PiBmaXJzdExpbmUuaW5jbHVkZXMocCkpO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaGFzSGVhZGVyID8gMSA6IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXS50cmltKCk7XG4gICAgICAgICAgaWYgKCFsaW5lKSBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lc1xuXG4gICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHBob25lID0gcGFydHNbMF0udHJpbSgpLnJlcGxhY2UoL1wiL2csIFwiXCIpO1xuICAgICAgICAgICAgLy8gT25seSBhZGQgaWYgcGhvbmUgbG9va3MgdmFsaWQgKHN0YXJ0cyB3aXRoICsgb3IgZGlnaXQpXG4gICAgICAgICAgICBpZiAocGhvbmUgJiYgKHBob25lLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IC9eXFxkLy50ZXN0KHBob25lKSkpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdG86IHBob25lLnN0YXJ0c1dpdGgoXCIrXCIpID8gcGhvbmUgOiBgKyR7cGhvbmV9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICAgICAgcGFydHMubGVuZ3RoID49IDJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJ0cy5zbGljZSgxKS5qb2luKFwiLFwiKS50cmltKCkucmVwbGFjZSgvXCIvZywgXCJcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKFwiVW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXRcIiwge1xuICAgICAgICBoaW50OiBcIlVzZSAuanNvbiBvciAuY3N2IGZpbGVcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgZXJyb3IoXCJJbnZhbGlkIEpTT04gaW4gZmlsZVwiLCB7IGhpbnQ6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNZXNzYWdlc0Zyb21GbGFncyh0bzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBCYXRjaE1lc3NhZ2VbXSB7XG4gICAgY29uc3QgcGhvbmVzID0gdG8uc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIHJldHVybiBwaG9uZXMubWFwKChwaG9uZSkgPT4gKHsgdG86IHBob25lLCB0ZXh0IH0pKTtcbiAgfVxufVxuIl19
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUE2RzdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUNoQixnRUFBZ0UsQ0FBQztJQUVuRSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLG1EQUFtRDtRQUNuRCx3RUFBd0U7UUFDeEUsNEVBQTRFO1FBQzVFLDZEQUE2RDtRQUM3RCx1RkFBdUY7UUFDdkYsbURBQW1EO1FBQ25ELHVDQUF1QztLQUN4QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSx5REFBeUQ7WUFDdEUsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUM7U0FDdEMsQ0FBQztRQUNGLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFX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RSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbEUsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJhdGNoVXBsb2FkUmVzcG9uc2Uge1xuICB1cGxvYWQ6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB9O1xuICB2YWxpZGF0aW9uOiB7XG4gICAgdG90YWxSb3dzOiBudW1iZXI7XG4gICAgdmFsaWRDb3VudDogbnVtYmVyO1xuICAgIGludmFsaWRDb3VudDogbnVtYmVyO1xuICAgIGR1cGxpY2F0ZXNSZW1vdmVkOiBudW1iZXI7XG4gICAgaGFzSGVhZGVyOiBib29sZWFuO1xuICB9O1xuICByZWNpcGllbnRzOiBBcnJheTx7IHRvOiBzdHJpbmc7IHRleHQ/OiBzdHJpbmcgfT47XG4gIGVycm9yczogQXJyYXk8eyByb3c6IG51bWJlcjsgcGhvbmU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgaGFzTW9yZUVycm9yczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEJhdGNoSGlzdG9yeVJlc3BvbnNlIHtcbiAgdXBsb2FkczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIHRvdGFsUm93czogbnVtYmVyO1xuICAgICAgdmFsaWRDb3VudDogbnVtYmVyO1xuICAgICAgaW52YWxpZENvdW50OiBudW1iZXI7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgfT47XG59XG5cbmludGVyZmFjZSBCYXRjaFJlc3BvbnNlIHtcbiAgYmF0Y2hJZDogc3RyaW5nO1xuICB0b3RhbDogbnVtYmVyO1xuICBzZW50OiBudW1iZXI7XG4gIHF1ZXVlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY3JlZGl0c1VzZWQ6IG51bWJlcjtcbiAgY3JlZGl0c1JlZnVuZGVkOiBudW1iZXI7XG4gIHN0YXR1czogc3RyaW5nO1xuICBtZXNzYWdlcz86IEFycmF5PHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdG86IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBlcnJvcj86IHN0cmluZztcbiAgfT47XG59XG5cbmludGVyZmFjZSBCYXRjaFByZXZpZXdSZXNwb25zZSB7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHNlbmRhYmxlOiBudW1iZXI7XG4gIGJsb2NrZWQ6IG51bWJlcjtcbiAgZHVwbGljYXRlczogbnVtYmVyO1xuICBjcmVkaXRzTmVlZGVkOiBudW1iZXI7XG4gIGNyZWRpdEJhbGFuY2U6IG51bWJlcjtcbiAgaGFzU3VmZmljaWVudENyZWRpdHM6IGJvb2xlYW47XG4gIGtleVR5cGU6IFwidGVzdFwiIHwgXCJsaXZlXCI7XG4gIGtleVNjb3Blczogc3RyaW5nW107XG4gIGhhc1dyaXRlU2NvcGU6IGJvb2xlYW47XG4gIG1lc3NhZ2luZ1Byb2ZpbGU6IHtcbiAgICBpZDogc3RyaW5nIHwgbnVsbDtcbiAgICBjYW5TZW5kRG9tZXN0aWM6IGJvb2xlYW47XG4gICAgY2FuU2VuZEludGVybmF0aW9uYWw6IGJvb2xlYW47XG4gICAgdmVyaWZpY2F0aW9uU3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIHZlcmlmaWNhdGlvblR5cGU6IHN0cmluZyB8IG51bGw7XG4gIH07XG4gIGJ5Q291bnRyeTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBjb3VudDogbnVtYmVyO1xuICAgICAgY3JlZGl0czogbnVtYmVyO1xuICAgICAgdGllcjogc3RyaW5nO1xuICAgICAgYWxsb3dlZDogYm9vbGVhbjtcbiAgICAgIGJsb2NrZWRSZWFzb24/OiBzdHJpbmc7XG4gICAgfVxuICA+O1xuICBibG9ja2VkTWVzc2FnZXM6IEFycmF5PHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gIH0+O1xuICBjb21wbGlhbmNlOiB7XG4gICAgbWVzc2FnZVR5cGU6IFwibWFya2V0aW5nXCIgfCBcInRyYW5zYWN0aW9uYWxcIjtcbiAgICBzaGFmdEJsb2NrZWQ6IG51bWJlcjtcbiAgICBxdWlldEhvdXJzQmxvY2tlZDogbnVtYmVyO1xuICAgIHF1aWV0SG91cnNSZXNjaGVkdWxlZDogbnVtYmVyO1xuICAgIHNoYWZ0QmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgdG86IHN0cmluZztcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgICBtYXRjaGVkVGVybXM6IHN0cmluZ1tdO1xuICAgIH0+O1xuICAgIHF1aWV0SG91cnNCbG9ja2VkTWVzc2FnZXM6IEFycmF5PHtcbiAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICB0bzogc3RyaW5nO1xuICAgICAgcmVjaXBpZW50VGltZXpvbmU6IHN0cmluZztcbiAgICAgIHJlY2lwaWVudExvY2FsVGltZTogc3RyaW5nO1xuICAgICAgbmV4dEFsbG93ZWRUaW1lPzogc3RyaW5nO1xuICAgIH0+O1xuICB9O1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNtc0JhdGNoIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgIFwiU2VuZCBiYXRjaCBTTVMgbWVzc2FnZXMgKHVwbG9hZHMgQ1NWIHRvIGNsb3VkIGZvciBhdWRpdCB0cmFpbClcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHJlY2lwaWVudHMuY3N2XCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcGhvbmVzLmNzdiAtLXRleHQgXCJIZWxsbyBldmVyeW9uZSFcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXRvICsxNTU1MTIzNDU2NywrMTU1NTk4NzY1NDMgLS10ZXh0IFwiSGVsbG8hXCInLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSByZWNpcGllbnRzLmNzdiAtLWRyeS1ydW5cIixcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSBwaG9uZXMuY3N2IC0tdGV4dCBcIkNvZGU6IDEyM1wiIC0tdHlwZSB0cmFuc2FjdGlvbmFsJyxcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXJldXNlIGFiYzEyMy1kZWY0NTZcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWhpc3RvcnlcIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIGZpbGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIkZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNTViBmaWxlIHdpdGggcGhvbmUgbnVtYmVycyAoYW5kIG9wdGlvbmFsIG1lc3NhZ2UgdGV4dClcIixcbiAgICAgIGV4Y2x1c2l2ZTogW1widG9cIiwgXCJyZXVzZVwiLCBcImhpc3RvcnlcIl0sXG4gICAgfSksXG4gICAgdG86IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbW1hLXNlcGFyYXRlZCByZWNpcGllbnQgcGhvbmUgbnVtYmVycyAoRS4xNjQgZm9ybWF0KVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJmaWxlXCIsIFwicmV1c2VcIiwgXCJoaXN0b3J5XCJdLFxuICAgIH0pLFxuICAgIHRleHQ6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm1cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk1lc3NhZ2UgdGV4dCAocmVxdWlyZWQgd2l0aCAtLXRvLCBvcHRpb25hbCB3aXRoIC0tZmlsZSBpZiBDU1YgaGFzIHRleHQgY29sdW1uKVwiLFxuICAgIH0pLFxuICAgIGZyb206IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlbmRlciBJRCBvciBwaG9uZSBudW1iZXIgZm9yIGFsbCBtZXNzYWdlc1wiLFxuICAgIH0pLFxuICAgIHR5cGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNZXNzYWdlIHR5cGU6IG1hcmtldGluZyAoZGVmYXVsdCkgb3IgdHJhbnNhY3Rpb25hbC4gVHJhbnNhY3Rpb25hbCBieXBhc3NlcyBxdWlldCBob3Vycy5cIixcbiAgICAgIG9wdGlvbnM6IFtcIm1hcmtldGluZ1wiLCBcInRyYW5zYWN0aW9uYWxcIl0sXG4gICAgICBkZWZhdWx0OiBcIm1hcmtldGluZ1wiLFxuICAgIH0pLFxuICAgIFwiZHJ5LXJ1blwiOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiZFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJldmlldyBiYXRjaCB3aXRob3V0IHNlbmRpbmcgKHZhbGlkYXRlcyBhY2Nlc3MsIHNob3dzIGNvc3QgYW5kIGNvbXBsaWFuY2UgYnJlYWtkb3duKVwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gICAgcmV1c2U6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZS11c2UgYSBwcmV2aW91cyBiYXRjaCB1cGxvYWQgYnkgSUQgKHNlZSAtLWhpc3RvcnkpXCIsXG4gICAgICBleGNsdXNpdmU6IFtcImZpbGVcIiwgXCJ0b1wiLCBcImhpc3RvcnlcIl0sXG4gICAgfSksXG4gICAgaGlzdG9yeTogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTaG93IHJlY2VudCBiYXRjaCB1cGxvYWQgaGlzdG9yeVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJmaWxlXCIsIFwidG9cIiwgXCJyZXVzZVwiXSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFNtc0JhdGNoKTtcblxuICAgIC8vIEhhbmRsZSBoaXN0b3J5IHN1YmNvbW1hbmRcbiAgICBpZiAoZmxhZ3MuaGlzdG9yeSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd0hpc3RvcnkoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcmV1c2Ugc3ViY29tbWFuZFxuICAgIGlmIChmbGFncy5yZXVzZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV1c2VCYXRjaChmbGFncy5yZXVzZSwgZmxhZ3MpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSAtLXRvIGZsYWcgKGlubGluZSByZWNpcGllbnRzLCBubyB1cGxvYWQgbmVlZGVkKVxuICAgIGlmIChmbGFncy50bykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZElubGluZVJlY2lwaWVudHMoZmxhZ3MpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSAtLWZpbGUgZmxhZyAodXBsb2FkIHRvIFN1cGFiYXNlKVxuICAgIGlmIChmbGFncy5maWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRBbmRTZW5kKGZsYWdzKTtcbiAgICB9XG5cbiAgICBlcnJvcihcIkVpdGhlciAtLWZpbGUsIC0tdG8sIC0tcmV1c2UsIG9yIC0taGlzdG9yeSBpcyByZXF1aXJlZFwiKTtcbiAgICB0aGlzLmV4aXQoMSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBiYXRjaCB1cGxvYWQgaGlzdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaG93SGlzdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIkZldGNoaW5nIGJhdGNoIGhpc3RvcnkuLi5cIikuc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8QmF0Y2hIaXN0b3J5UmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvY2xpL2JhdGNoL2hpc3RvcnlcIixcbiAgICAgICAgeyBsaW1pdDogMTUgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS51cGxvYWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiXFxuTm8gYmF0Y2ggdXBsb2FkcyBmb3VuZC5cXG5cIikpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVwbG9hZCBhIENTViBmaWxlIHdpdGg6IHNlbmRseSBzbXMgYmF0Y2ggLS1maWxlIHlvdXIuY3N2XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TgSBSZWNlbnQgQmF0Y2ggVXBsb2Fkc1xcblwiKSk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDgwKSkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiByZXNwb25zZS51cGxvYWRzKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh1cGxvYWQuY3JlYXRlZEF0KS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5mb3JtYXRCeXRlcyh1cGxvYWQuc2l6ZSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHVwbG9hZC5tZXRhZGF0YT8uc291cmNlID09PSBcImNsaVwiID8gXCJDTElcIiA6IFwiV2ViXCI7XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCR7Y29sb3JzLmluZm8odXBsb2FkLmlkLnNsaWNlKDAsIDgpKX0gICR7dXBsb2FkLmZpbGVuYW1lfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICBgICAgJHtkYXRlfSB8ICR7c2l6ZX0gfCAke3VwbG9hZC5tZXRhZGF0YT8udmFsaWRDb3VudCB8fCAwfSB2YWxpZCByZWNpcGllbnRzIHwgJHtzb3VyY2V9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDgwKSkpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5kaW0oXCJcXG5SZS11c2UgYSBiYXRjaDogc2VuZGx5IHNtcyBiYXRjaCAtLXJldXNlIDxpZD5cIiksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXVzZSBhIHByZXZpb3VzIGJhdGNoIHVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXVzZUJhdGNoKFxuICAgIHVwbG9hZElkOiBzdHJpbmcsXG4gICAgZmxhZ3M6IHsgdGV4dD86IHN0cmluZzsgZnJvbT86IHN0cmluZzsgdHlwZT86IHN0cmluZzsgXCJkcnktcnVuXCI/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiRmV0Y2hpbmcgYmF0Y2ggZGF0YS4uLlwiKS5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxCYXRjaFVwbG9hZFJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvY2xpL2JhdGNoL3JldXNlLyR7dXBsb2FkSWR9YCxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY29sb3JzLnN1Y2Nlc3MoYFxcbuKckyBMb2FkZWQgYmF0Y2g6ICR7cmVzcG9uc2UudXBsb2FkLmZpbGVuYW1lfWApLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgIGAgICR7cmVzcG9uc2UudmFsaWRhdGlvbi52YWxpZENvdW50fSB2YWxpZCByZWNpcGllbnRzIGZyb20gJHtyZXNwb25zZS52YWxpZGF0aW9uLnRvdGFsUm93c30gcm93c2AsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICAvLyBBcHBseSBzaGFyZWQgdGV4dCBpZiBwcm92aWRlZFxuICAgICAgbGV0IG1lc3NhZ2VzID0gcmVzcG9uc2UucmVjaXBpZW50cztcbiAgICAgIGlmIChmbGFncy50ZXh0KSB7XG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMubWFwKChyKSA9PiAoe1xuICAgICAgICAgIHRvOiByLnRvLFxuICAgICAgICAgIHRleHQ6IHIudGV4dCB8fCBmbGFncy50ZXh0LFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGFsbCBtZXNzYWdlcyBoYXZlIHRleHRcbiAgICAgIGNvbnN0IG1pc3NpbmdUZXh0ID0gbWVzc2FnZXMuZmlsdGVyKChtKSA9PiAhbS50ZXh0Py50cmltKCkpO1xuICAgICAgaWYgKG1pc3NpbmdUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYCR7bWlzc2luZ1RleHQubGVuZ3RofSByZWNpcGllbnRzIG1pc3NpbmcgbWVzc2FnZSB0ZXh0LiBVc2UgLS10ZXh0IHRvIHByb3ZpZGUgYSBkZWZhdWx0LmAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VlZCB3aXRoIHByZXZpZXcgb3Igc2VuZFxuICAgICAgYXdhaXQgdGhpcy5wcmV2aWV3T3JTZW5kKFxuICAgICAgICBtZXNzYWdlcyBhcyBBcnJheTx7IHRvOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PixcbiAgICAgICAgZmxhZ3MsXG4gICAgICAgIHJlc3BvbnNlLnVwbG9hZC5pZCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0byBpbmxpbmUgcmVjaXBpZW50cyAoLS10byBmbGFnKVxuICAgKiBUaGlzIHBhdGggZG9lc24ndCB1cGxvYWQgdG8gU3VwYWJhc2Ugc2luY2UgaXQncyBqdXN0IGEgZmV3IG51bWJlcnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZElubGluZVJlY2lwaWVudHMoZmxhZ3M6IHtcbiAgICB0bz86IHN0cmluZztcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICAgIGZyb20/OiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbiAgICBcImRyeS1ydW5cIj86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZsYWdzLnRleHQpIHtcbiAgICAgIGVycm9yKFwiLS10ZXh0IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgLS10b1wiKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaG9uZXMgPSBmbGFncy50byEuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gcGhvbmVzLm1hcCgocGhvbmUpID0+ICh7XG4gICAgICB0bzogcGhvbmUuc3RhcnRzV2l0aChcIitcIikgPyBwaG9uZSA6IGArJHtwaG9uZX1gLFxuICAgICAgdGV4dDogZmxhZ3MudGV4dCEsXG4gICAgfSkpO1xuXG4gICAgLy8gVmFsaWRhdGUgcGhvbmUgbnVtYmVyc1xuICAgIGZvciAoY29uc3QgbXNnIG9mIG1lc3NhZ2VzKSB7XG4gICAgICBpZiAoIS9eXFwrWzEtOV1cXGR7MSwxNH0kLy50ZXN0KG1zZy50bykpIHtcbiAgICAgICAgZXJyb3IoYEludmFsaWQgcGhvbmUgbnVtYmVyOiAke21zZy50b31gLCB7XG4gICAgICAgICAgaGludDogXCJVc2UgRS4xNjQgZm9ybWF0OiArMTU1NTEyMzQ1NjdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByZXZpZXdPclNlbmQobWVzc2FnZXMsIGZsYWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgQ1NWIHRvIFN1cGFiYXNlIGFuZCBzZW5kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwbG9hZEFuZFNlbmQoZmxhZ3M6IHtcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgZnJvbT86IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIFwiZHJ5LXJ1blwiPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZmxhZ3MuZmlsZSE7XG5cbiAgICAvLyBDaGVjayBmaWxlIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIGVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWxlIGV4dGVuc2lvblxuICAgIGlmICghZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBlcnJvcihcIk9ubHkgQ1NWIGZpbGVzIGFyZSBzdXBwb3J0ZWRcIiwge1xuICAgICAgICBoaW50OiBcIkNvbnZlcnQgeW91ciBmaWxlIHRvIENTViBmb3JtYXQgd2l0aCBjb2x1bW5zOiBwaG9uZSxtZXNzYWdlXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIGZpbGVcbiAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYmFzZW5hbWUoZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2hlY2sgZmlsZSBzaXplICg1TUIgbGltaXQpXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPiA1ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIGVycm9yKFwiRmlsZSB0b28gbGFyZ2UgKG1heCA1TUIpXCIsIHtcbiAgICAgICAgaGludDogXCJTcGxpdCB5b3VyIENTViBpbnRvIHNtYWxsZXIgZmlsZXNcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKGBVcGxvYWRpbmcgJHtmaWxlbmFtZX0uLi5gKS5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVwbG9hZCB0byBTdXBhYmFzZSB2aWEgQ0xJIGVuZHBvaW50XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC51cGxvYWRGaWxlPEJhdGNoVXBsb2FkUmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvY2xpL2JhdGNoL3VwbG9hZFwiLFxuICAgICAgICB7IGJ1ZmZlciwgZmlsZW5hbWUsIG1pbWV0eXBlOiBcInRleHQvY3N2XCIgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICAvLyBTaG93IHVwbG9hZCBzdW1tYXJ5XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuc3VjY2VzcyhgXFxu4pyTIFVwbG9hZGVkOiAke3Jlc3BvbnNlLnVwbG9hZC5maWxlbmFtZX1gKSk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKGAgIFVwbG9hZCBJRDogJHtyZXNwb25zZS51cGxvYWQuaWR9YCkpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgYCAgJHtyZXNwb25zZS52YWxpZGF0aW9uLnZhbGlkQ291bnR9IHZhbGlkIC8gJHtyZXNwb25zZS52YWxpZGF0aW9uLmludmFsaWRDb3VudH0gaW52YWxpZCAvICR7cmVzcG9uc2UudmFsaWRhdGlvbi5kdXBsaWNhdGVzUmVtb3ZlZH0gZHVwbGljYXRlcyByZW1vdmVkYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNob3cgdmFsaWRhdGlvbiBlcnJvcnMgaWYgYW55XG4gICAgICBpZiAocmVzcG9uc2UuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLndhcm5pbmcoYFxcbuKaoO+4jyAgVmFsaWRhdGlvbiBlcnJvcnM6YCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiByZXNwb25zZS5lcnJvcnMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5kaW0oYCAgIFJvdyAke2Vyci5yb3d9OiAke2Vyci5waG9uZX0gLSAke2Vyci5lcnJvcn1gKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5oYXNNb3JlRXJyb3JzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICBgICAgLi4uIGFuZCAke3Jlc3BvbnNlLnZhbGlkYXRpb24uaW52YWxpZENvdW50IC0gNX0gbW9yZSBlcnJvcnNgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5yZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBlcnJvcihcIk5vIHZhbGlkIHJlY2lwaWVudHMgZm91bmQgaW4gQ1NWXCIpO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHNoYXJlZCB0ZXh0IGlmIHByb3ZpZGVkXG4gICAgICBsZXQgbWVzc2FnZXMgPSByZXNwb25zZS5yZWNpcGllbnRzO1xuICAgICAgaWYgKGZsYWdzLnRleHQpIHtcbiAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5tYXAoKHIpID0+ICh7XG4gICAgICAgICAgdG86IHIudG8sXG4gICAgICAgICAgdGV4dDogci50ZXh0IHx8IGZsYWdzLnRleHQsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgYWxsIG1lc3NhZ2VzIGhhdmUgdGV4dFxuICAgICAgY29uc3QgbWlzc2luZ1RleHQgPSBtZXNzYWdlcy5maWx0ZXIoKG0pID0+ICFtLnRleHQ/LnRyaW0oKSk7XG4gICAgICBpZiAobWlzc2luZ1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHttaXNzaW5nVGV4dC5sZW5ndGh9IHJlY2lwaWVudHMgbWlzc2luZyBtZXNzYWdlIHRleHQuIFVzZSAtLXRleHQgdG8gcHJvdmlkZSBhIGRlZmF1bHQuYCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgIFwiXFxuQ1NWIHNob3VsZCBoYXZlIGNvbHVtbnM6IHBob25lLG1lc3NhZ2UgT1IgdXNlIC0tdGV4dCBmbGFnXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZWVkIHdpdGggcHJldmlldyBvciBzZW5kXG4gICAgICBhd2FpdCB0aGlzLnByZXZpZXdPclNlbmQoXG4gICAgICAgIG1lc3NhZ2VzIGFzIEFycmF5PHsgdG86IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+LFxuICAgICAgICBmbGFncyxcbiAgICAgICAgcmVzcG9uc2UudXBsb2FkLmlkLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNwaW4uc3RvcCgpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2aWV3IG9yIHNlbmQgdGhlIGJhdGNoXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXZpZXdPclNlbmQoXG4gICAgbWVzc2FnZXM6IEFycmF5PHsgdG86IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+LFxuICAgIGZsYWdzOiB7IGZyb20/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IFwiZHJ5LXJ1blwiPzogYm9vbGVhbiB9LFxuICAgIHVwbG9hZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBiYXRjaCBzaXplXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIGVycm9yKFwiQmF0Y2ggc2l6ZSBjYW5ub3QgZXhjZWVkIDEwMDAgbWVzc2FnZXNcIiwge1xuICAgICAgICBoaW50OiBcIlNwbGl0IHlvdXIgbWVzc2FnZXMgaW50byBzbWFsbGVyIGJhdGNoZXNcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkcnktcnVuIG1vZGVcbiAgICBpZiAoZmxhZ3NbXCJkcnktcnVuXCJdKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93UHJldmlldyhtZXNzYWdlcywgZmxhZ3MpO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIGJhdGNoXG4gICAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoYFNlbmRpbmcgJHttZXNzYWdlcy5sZW5ndGh9IG1lc3NhZ2VzLi4uYCk7XG4gICAgc3Bpbi5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8QmF0Y2hSZXNwb25zZT4oXG4gICAgICAgIFwiL2FwaS92MS9tZXNzYWdlcy9iYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgbWVzc2FnZVR5cGU6IGZsYWdzLnR5cGUsXG4gICAgICAgICAgLi4uKGZsYWdzLmZyb20gJiYgeyBmcm9tOiBmbGFncy5mcm9tIH0pLFxuICAgICAgICAgIC4uLih1cGxvYWRJZCAmJiB7IHVwbG9hZElkIH0pLCAvLyBMaW5rIHRvIGZpbGUgdXBsb2FkIGZvciBhdWRpdCB0cmFpbFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc3Bpbi5zdG9wKCk7XG5cbiAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHN1Y2Nlc3MgbGV2ZWxcbiAgICAgIGNvbnN0IGFsbFN1Y2NlZWRlZCA9IHJlc3BvbnNlLmZhaWxlZCA9PT0gMDtcbiAgICAgIGNvbnN0IGFsbEZhaWxlZCA9IHJlc3BvbnNlLnNlbnQgPT09IDAgJiYgcmVzcG9uc2UuZmFpbGVkID4gMDtcbiAgICAgIGNvbnN0IHBhcnRpYWxTdWNjZXNzID0gcmVzcG9uc2Uuc2VudCA+IDAgJiYgcmVzcG9uc2UuZmFpbGVkID4gMDtcblxuICAgICAgaWYgKGFsbFN1Y2NlZWRlZCkge1xuICAgICAgICBzdWNjZXNzKFwiQmF0Y2ggc2VudCBzdWNjZXNzZnVsbHlcIiwge1xuICAgICAgICAgIFwiQmF0Y2ggSURcIjogcmVzcG9uc2UuYmF0Y2hJZCxcbiAgICAgICAgICBUb3RhbDogcmVzcG9uc2UudG90YWwsXG4gICAgICAgICAgU2VudDogY29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHJlc3BvbnNlLnNlbnQpKSxcbiAgICAgICAgICBcIkNyZWRpdHMgVXNlZFwiOiByZXNwb25zZS5jcmVkaXRzVXNlZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGFsbEZhaWxlZCkge1xuICAgICAgICBlcnJvcihcIkJhdGNoIGZhaWxlZFwiLCB7XG4gICAgICAgICAgaGludDogYEFsbCAke3Jlc3BvbnNlLmZhaWxlZH0gbWVzc2FnZXMgZmFpbGVkIHRvIHNlbmRgLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICBCYXRjaCBJRDogJHtyZXNwb25zZS5iYXRjaElkfWApKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmRpbShgICBDcmVkaXRzIFJlZnVuZGVkOiAke3Jlc3BvbnNlLmNyZWRpdHNSZWZ1bmRlZH1gKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFydGlhbFN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLndhcm5pbmcoXCJcXG7imqDvuI8gIEJhdGNoIGNvbXBsZXRlZCB3aXRoIGVycm9yc1xcblwiKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIEJhdGNoIElEOiAgICAgICAgICR7cmVzcG9uc2UuYmF0Y2hJZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgVG90YWw6ICAgICAgICAgICAgJHtyZXNwb25zZS50b3RhbH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgU2VudDogICAgICAgICAgICAgJHtjb2xvcnMuc3VjY2VzcyhTdHJpbmcocmVzcG9uc2Uuc2VudCkpfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgIEZhaWxlZDogICAgICAgICAgICR7Y29sb3JzLmVycm9yKFN0cmluZyhyZXNwb25zZS5mYWlsZWQpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBDcmVkaXRzIFVzZWQ6ICAgICAke3Jlc3BvbnNlLmNyZWRpdHNVc2VkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBDcmVkaXRzIFJlZnVuZGVkOiAke3Jlc3BvbnNlLmNyZWRpdHNSZWZ1bmRlZH1gKTtcblxuICAgICAgICAvLyBTaG93IGZhaWxlZCBtZXNzYWdlcyBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkTXNncyA9IHJlc3BvbnNlLm1lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChtKSA9PiBtLnN0YXR1cyA9PT0gXCJmYWlsZWRcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsZWRNc2dzLmxlbmd0aCA+IDAgJiYgZmFpbGVkTXNncy5sZW5ndGggPD0gNSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlxcbiAgRmFpbGVkIG1lc3NhZ2VzOlwiKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiBmYWlsZWRNc2dzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNvbG9ycy5kaW0oYCAgICAke21zZy50b306ICR7bXNnLmVycm9yIHx8IFwiVW5rbm93biBlcnJvclwifWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbGVkTXNncy5sZW5ndGggPiA1KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICBgXFxuICAke2ZhaWxlZE1zZ3MubGVuZ3RofSBtZXNzYWdlcyBmYWlsZWQuIFVzZSAtLWpzb24gZm9yIGRldGFpbHMuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBiYXRjaCBwcmV2aWV3IChkcnktcnVuIG1vZGUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNob3dQcmV2aWV3KFxuICAgIG1lc3NhZ2VzOiBBcnJheTx7IHRvOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PixcbiAgICBmbGFnczogeyB0eXBlPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiQW5hbHl6aW5nIGJhdGNoLi4uXCIpLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlldyA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEJhdGNoUHJldmlld1Jlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL2JhdGNoL3ByZXZpZXdcIixcbiAgICAgICAgeyBtZXNzYWdlcywgbWVzc2FnZVR5cGU6IGZsYWdzLnR5cGUgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocHJldmlldyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBjb21wcmVoZW5zaXZlIHByZXZpZXdcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TiiBCYXRjaCBQcmV2aWV3IChEcnkgUnVuKVxcblwiKSk7XG5cbiAgICAgIC8vIFN1bW1hcnkgdGFibGVcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCLilIBcIi5yZXBlYXQoNTApKSk7XG4gICAgICBjb25zb2xlLmxvZyhgVG90YWwgbWVzc2FnZXM6ICAgICAke3ByZXZpZXcudG90YWx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFNlbmRhYmxlOiAgICAgICAgICAgJHtjb2xvcnMuc3VjY2VzcyhTdHJpbmcocHJldmlldy5zZW5kYWJsZSkpfWAsXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBCbG9ja2VkOiAgICAgICAgICAgICR7cHJldmlldy5ibG9ja2VkID4gMCA/IGNvbG9ycy5lcnJvcihTdHJpbmcocHJldmlldy5ibG9ja2VkKSkgOiBcIjBcIn1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKGBEdXBsaWNhdGVzIHJlbW92ZWQ6ICR7cHJldmlldy5kdXBsaWNhdGVzfWApO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIuKUgFwiLnJlcGVhdCg1MCkpKTtcblxuICAgICAgLy8gQ3JlZGl0c1xuICAgICAgY29uc29sZS5sb2coYFxcbkNyZWRpdHMgbmVlZGVkOiAgICAgJHtwcmV2aWV3LmNyZWRpdHNOZWVkZWR9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgWW91ciBiYWxhbmNlOiAgICAgICAke3ByZXZpZXcuY3JlZGl0QmFsYW5jZX1gKTtcbiAgICAgIGlmICghcHJldmlldy5oYXNTdWZmaWNpZW50Q3JlZGl0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjb2xvcnMuZXJyb3IoXG4gICAgICAgICAgICBg4pqg77iPICBJbnN1ZmZpY2llbnQgY3JlZGl0cyEgTmVlZCAke3ByZXZpZXcuY3JlZGl0c05lZWRlZCAtIHByZXZpZXcuY3JlZGl0QmFsYW5jZX0gbW9yZS5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFjY2VzcyBpbmZvXG4gICAgICBjb25zb2xlLmxvZyhgXFxuQVBJIEtleSB0eXBlOiAgICAgICAke3ByZXZpZXcua2V5VHlwZS50b1VwcGVyQ2FzZSgpfWApO1xuICAgICAgY29uc29sZS5sb2coYFdyaXRlIGFjY2VzczogICAgICAgJHtwcmV2aWV3Lmhhc1dyaXRlU2NvcGUgPyBcIuKck1wiIDogXCLinJdcIn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgRG9tZXN0aWMgKFVTL0NBKTogICAke3ByZXZpZXcubWVzc2FnaW5nUHJvZmlsZS5jYW5TZW5kRG9tZXN0aWMgPyBcIuKck1wiIDogXCLinJdcIn1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgSW50ZXJuYXRpb25hbDogICAgICAke3ByZXZpZXcubWVzc2FnaW5nUHJvZmlsZS5jYW5TZW5kSW50ZXJuYXRpb25hbCA/IFwi4pyTXCIgOiBcIuKcl1wifWAsXG4gICAgICApO1xuXG4gICAgICAvLyBDb3VudHJ5IGJyZWFrZG93blxuICAgICAgY29uc3QgY291bnRyaWVzID0gT2JqZWN0LmVudHJpZXMocHJldmlldy5ieUNvdW50cnkpO1xuICAgICAgaWYgKGNvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TjSBCeSBDb3VudHJ5OlxcblwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgW2NvdW50cnksIGRhdGFdIG9mIGNvdW50cmllcykge1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGRhdGEuYWxsb3dlZCA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpIDogY29sb3JzLmVycm9yKFwi4pyXXCIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYCAgJHtzdGF0dXN9ICR7Y291bnRyeX06ICR7ZGF0YS5jb3VudH0gbXNncywgJHtkYXRhLmNyZWRpdHN9IGNyZWRpdHMgKCR7ZGF0YS50aWVyfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFkYXRhLmFsbG93ZWQgJiYgZGF0YS5ibG9ja2VkUmVhc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKGAgICAgIOKUlOKUgCAke2RhdGEuYmxvY2tlZFJlYXNvbn1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsaWFuY2UgY2hlY2sgcmVzdWx0c1xuICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIlxcbvCfm6HvuI8gIENvbXBsaWFuY2UgQ2hlY2s6XFxuXCIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgTWVzc2FnZSBUeXBlOiAgICAgICR7cHJldmlldy5jb21wbGlhbmNlLm1lc3NhZ2VUeXBlLnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5lcnJvcihcbiAgICAgICAgICAgICAgYCAgU0hBRlQgQmxvY2tlZDogICAgICR7cHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZH0gbWVzc2FnZXNgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAzLFxuICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgIGAgICAgIOKUlOKUgCAke21zZy50b306ICR7bXNnLmNhdGVnb3J5fSAoJHttc2cubWF0Y2hlZFRlcm1zLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmV2aWV3LmNvbXBsaWFuY2Uuc2hhZnRCbG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgYCAgICAgLi4uIGFuZCAke3ByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSAzfSBtb3JlYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIFwiICBTSEFGVCBDaGVjazogICAgICAg4pyTIEFsbCBtZXNzYWdlcyBwYXNzIGNvbnRlbnQgZmlsdGVyXCIsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLm1lc3NhZ2VUeXBlID09PSBcIm1hcmtldGluZ1wiKSB7XG4gICAgICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZS5xdWlldEhvdXJzUmVzY2hlZHVsZWQgPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY29sb3JzLndhcm5pbmcoXG4gICAgICAgICAgICAgICAgYCAgUXVpZXQgSG91cnM6ICAgICAgICR7cHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNSZXNjaGVkdWxlZH0gbWVzc2FnZXMgd2lsbCBiZSByZXNjaGVkdWxlZGAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgcHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNCbG9ja2VkTWVzc2FnZXMuc2xpY2UoXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHRUaW1lID0gbXNnLm5leHRBbGxvd2VkVGltZVxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUobXNnLm5leHRBbGxvd2VkVGltZSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgIDogXCJuZXh0IGF2YWlsYWJsZSB3aW5kb3dcIjtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICAgIGAgICAgIOKUlOKUgCAke21zZy50b306ICR7bXNnLnJlY2lwaWVudFRpbWV6b25lfSDihpIgJHtuZXh0VGltZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNCbG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgICAgYCAgICAgLi4uIGFuZCAke3ByZXZpZXcuY29tcGxpYW5jZS5xdWlldEhvdXJzQmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCAtIDN9IG1vcmVgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICBcIiAgUXVpZXQgSG91cnM6ICAgICAgIOKckyBBbGwgcmVjaXBpZW50cyB3aXRoaW4gYWxsb3dlZCBob3Vyc1wiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjb2xvcnMuZGltKFwiICBRdWlldCBIb3VyczogICAgICAgQnlwYXNzZWQgKHRyYW5zYWN0aW9uYWwgbWVzc2FnZSlcIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXYXJuaW5nc1xuICAgICAgaWYgKHByZXZpZXcud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbuKaoO+4jyAgV2FybmluZ3M6XCIpKTtcbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHByZXZpZXcud2FybmluZ3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAg4oCiICR7d31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCbG9ja2VkIG1lc3NhZ2VzIChmaXJzdCA1KVxuICAgICAgaWYgKHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgYFxcbuKdjCBCbG9ja2VkIE1lc3NhZ2VzICgke3ByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aH0gdG90YWwpOmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBiIG9mIHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLnNsaWNlKDAsIDUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICR7Yi50b306ICR7Yi5yZWFzb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5kaW0oYCAgIC4uLiBhbmQgJHtwcmV2aWV3LmJsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSA1fSBtb3JlYCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJcXG5cIiArIGNvbG9ycy5kaW0oXCJObyBtZXNzYWdlcyB3ZXJlIHNlbnQuIFJlbW92ZSAtLWRyeS1ydW4gdG8gc2VuZC5cIiksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBieXRlcyB0byBodW1hbiByZWFkYWJsZSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGAke2J5dGVzfSBCYDtcbiAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX0gTUJgO1xuICB9XG59XG4iXX0=