@sendly/cli 3.29.0 → 3.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/auth.js CHANGED
@@ -76,6 +76,12 @@ export async function browserLogin() {
76
76
  catch {
77
77
  console.log(colors.dim("Please open the URL manually"));
78
78
  }
79
+ // Enable press-to-copy UX while we poll. Only wire this when we have a
80
+ // real interactive TTY — in CI or piped stdin there's nothing to read
81
+ // from and setRawMode throws. The keypress listener is detached on any
82
+ // exit path (success, timeout, error) so we don't leave the terminal in
83
+ // raw mode.
84
+ const keypressCleanup = attachLoginKeypressHandler(data.verificationUrl);
79
85
  console.log();
80
86
  // Poll for token
81
87
  const spin = spinner("Waiting for authorization...");
@@ -93,6 +99,7 @@ export async function browserLogin() {
93
99
  if (tokenResponse.ok) {
94
100
  const tokens = (await tokenResponse.json());
95
101
  spin.succeed("Authorized");
102
+ keypressCleanup();
96
103
  // Store tokens
97
104
  setAuthTokens(tokens.accessToken, tokens.refreshToken, tokens.expiresIn, tokens.userId, tokens.email);
98
105
  // Check if new user needs quick-start (only for CLI sessions)
@@ -111,10 +118,12 @@ export async function browserLogin() {
111
118
  }
112
119
  if (errorData.error === "expired_token") {
113
120
  spin.fail("Login request expired");
121
+ keypressCleanup();
114
122
  process.exit(1);
115
123
  }
116
124
  if (errorData.error === "access_denied") {
117
125
  spin.fail("Login was denied");
126
+ keypressCleanup();
118
127
  process.exit(1);
119
128
  }
120
129
  }
@@ -123,8 +132,102 @@ export async function browserLogin() {
123
132
  }
124
133
  }
125
134
  spin.fail("Login timed out");
135
+ keypressCleanup();
126
136
  process.exit(1);
127
137
  }
138
+ /**
139
+ * Wire up the copy-URL / cancel keybindings during the device-code
140
+ * polling loop. Only active on a real interactive TTY — in CI, piped
141
+ * stdin, or when stdin.setRawMode is missing we no-op and return a
142
+ * cleanup that also no-ops.
143
+ *
144
+ * Returns a cleanup function that the caller MUST invoke on every exit
145
+ * path (success, timeout, error) so the terminal doesn't stay in raw
146
+ * mode. Calling cleanup twice is safe.
147
+ */
148
+ function attachLoginKeypressHandler(urlToCopy) {
149
+ const stdin = process.stdin;
150
+ if (!stdin.isTTY || typeof stdin.setRawMode !== "function") {
151
+ return () => { };
152
+ }
153
+ let cleaned = false;
154
+ const previousRawMode = stdin.isRaw;
155
+ console.log(colors.dim("Press [c] to copy URL to clipboard · [q] or Ctrl-C to cancel"));
156
+ const onData = (key) => {
157
+ const k = typeof key === "string" ? key : key.toString("utf8");
158
+ if (k === "c" || k === "C") {
159
+ copyToClipboard(urlToCopy)
160
+ .then((ok) => {
161
+ if (ok) {
162
+ // Overwrite the hint line with a transient confirmation.
163
+ process.stdout.write("\r" + " ".repeat(70) + "\r" + colors.success(" ✓ URL copied to clipboard\n"));
164
+ }
165
+ else {
166
+ process.stdout.write("\r" + colors.warning(" ✗ Could not copy — copy the URL manually\n"));
167
+ }
168
+ })
169
+ .catch(() => { });
170
+ return;
171
+ }
172
+ if (k === "q" || k === "Q" || k === "\u0003") {
173
+ cleanup();
174
+ console.log(colors.warning("\n Login cancelled."));
175
+ process.exit(130);
176
+ }
177
+ };
178
+ stdin.setRawMode(true);
179
+ stdin.resume();
180
+ stdin.setEncoding("utf8");
181
+ stdin.on("data", onData);
182
+ const cleanup = () => {
183
+ if (cleaned)
184
+ return;
185
+ cleaned = true;
186
+ try {
187
+ stdin.removeListener("data", onData);
188
+ stdin.setRawMode(previousRawMode);
189
+ stdin.pause();
190
+ }
191
+ catch {
192
+ /* no-op */
193
+ }
194
+ };
195
+ return cleanup;
196
+ }
197
+ /**
198
+ * Copy text to the system clipboard via the OS's native tool. Returns
199
+ * true if the write succeeded. Does not throw. Shells out rather than
200
+ * adding a native clipboard dep — the three commands (pbcopy / clip /
201
+ * xclip / wl-copy) cover every platform the CLI runs on.
202
+ */
203
+ async function copyToClipboard(text) {
204
+ const { spawn } = await import("node:child_process");
205
+ const candidates = process.platform === "darwin"
206
+ ? [["pbcopy", []]]
207
+ : process.platform === "win32"
208
+ ? [["clip", []]]
209
+ : [
210
+ ["wl-copy", []],
211
+ ["xclip", ["-selection", "clipboard"]],
212
+ ["xsel", ["--clipboard", "--input"]],
213
+ ];
214
+ for (const [cmd, args] of candidates) {
215
+ try {
216
+ const ok = await new Promise((resolve) => {
217
+ const child = spawn(cmd, args, { stdio: ["pipe", "ignore", "ignore"] });
218
+ child.on("error", () => resolve(false));
219
+ child.on("exit", (code) => resolve(code === 0));
220
+ child.stdin.end(text);
221
+ });
222
+ if (ok)
223
+ return true;
224
+ }
225
+ catch {
226
+ // try next candidate
227
+ }
228
+ }
229
+ return false;
230
+ }
128
231
  /**
129
232
  * Login with an API key directly
130
233
  */
@@ -184,4 +287,4 @@ export async function getAuthInfo() {
184
287
  function sleep(ms) {
185
288
  return new Promise((resolve) => setTimeout(resolve, ms));
186
289
  }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUNMLGFBQWEsRUFDYixTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsRUFDZCxlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFrQi9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtBQUMzRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxLQUFLLEdBQUcsa0NBQWtDLENBQUMsQ0FBQywwQkFBMEI7SUFDNUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6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Q0FBQztJQUVELE9BQU87UUFDTCxhQUFhLEVBQUUsSUFBSTtRQUNuQixLQUFLO1FBQ0wsTUFBTTtRQUNOLFdBQVc7UUFDWCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGlvbiB1dGlsaXRpZXMgZm9yIENMSVxuICogSGFuZGxlcyBicm93c2VyLWJhc2VkIGxvZ2luIGZsb3cgYW5kIEFQSSBrZXkgYXV0aGVudGljYXRpb25cbiAqL1xuXG5pbXBvcnQgb3BlbiBmcm9tIFwib3BlblwiO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQge1xuICBzZXRBdXRoVG9rZW5zLFxuICBzZXRBcGlLZXksXG4gIGNsZWFyQXV0aCxcbiAgZ2V0Q29uZmlnVmFsdWUsXG4gIGlzQXV0aGVudGljYXRlZCxcbiAgZ2V0QXV0aFRva2VuLFxufSBmcm9tIFwiLi9jb25maWcuanNcIjtcbmltcG9ydCB7IGNvbG9ycywgc3Bpbm5lciB9IGZyb20gXCIuL291dHB1dC5qc1wiO1xuXG5jb25zdCBVU0VSX0NPREVfTEVOR1RIID0gODtcbmNvbnN0IFBPTExfSU5URVJWQUwgPSAyMDAwOyAvLyAyIHNlY29uZHNcbmNvbnN0IE1BWF9QT0xMX0FUVEVNUFRTID0gMTUwOyAvLyA1IG1pbnV0ZXMgbWF4XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlQ29kZVJlc3BvbnNlIHtcbiAgZGV2aWNlQ29kZTogc3RyaW5nO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25Vcmw6IHN0cmluZztcbiAgZXhwaXJlc0luOiBudW1iZXI7XG4gIGludGVydmFsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXNwb25zZSB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICBleHBpcmVzSW46IG51bWJlcjtcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBsb25nIHJhbmRvbSBkZXZpY2UgY29kZSBmb3IgVVJMIChzZXNzaW9uIGlkZW50aWZpZXIpXG4gKiBUaGlzIGdvZXMgaW4gdGhlIFVSTCBhbmQgaWRlbnRpZmllcyB3aGljaCBDTEkgc2Vzc2lvbiBpcyB3YWl0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZURldmljZUNvZGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7IC8vIDMyIGNoYXJzLCBub3QgZ3Vlc3NhYmxlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzaG9ydCBodW1hbi1yZWFkYWJsZSB1c2VyIGNvZGUgZm9yIHRlcm1pbmFsIGRpc3BsYXlcbiAqIFRoaXMgaXMgd2hhdCB0aGUgdXNlciB0eXBlcyB0byBwcm92ZSB0aGV5IGhhdmUgdGVybWluYWwgYWNjZXNzXG4gKiBVc2VzIGNoYXJhY3RlcnMgdGhhdCBhcmUgZWFzeSB0byByZWFkIGFuZCB0eXBlIChubyAwL08sIDEvSS9MIGNvbmZ1c2lvbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVXNlckNvZGUoKTogc3RyaW5nIHtcbiAgY29uc3QgY2hhcnMgPSBcIkFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWjIzNDU2Nzg5XCI7IC8vIEV4Y2x1ZGUgY29uZnVzaW5nIGNoYXJzXG4gIGxldCBjb2RlID0gXCJcIjtcbiAgY29uc3QgYnl0ZXMgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoVVNFUl9DT0RFX0xFTkdUSCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgVVNFUl9DT0RFX0xFTkdUSDsgaSsrKSB7XG4gICAgY29kZSArPSBjaGFyc1tieXRlc1tpXSAlIGNoYXJzLmxlbmd0aF07XG4gIH1cbiAgcmV0dXJuIGNvZGU7XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIGJyb3dzZXItYmFzZWQgbG9naW4gZmxvd1xuICpcbiAqIFNlY3VyaXR5IG1vZGVsOlxuICogLSBkZXZpY2VDb2RlOiBMb25nIHJhbmRvbSB0b2tlbiBpbiBVUkwsIGlkZW50aWZpZXMgQ0xJIHNlc3Npb24gKG5vdCBzZWNyZXQpXG4gKiAtIHVzZXJDb2RlOiBTaG9ydCBjb2RlIHNob3duIE9OTFkgaW4gdGVybWluYWwsIHByb3ZlcyB1c2VyIGhhcyB0ZXJtaW5hbCBhY2Nlc3NcbiAqXG4gKiBUaGUgdXNlckNvZGUgaXMgTkVWRVIgaW4gdGhlIFVSTCAtIHRoaXMgaXMgY3JpdGljYWwgZm9yIHNlY3VyaXR5LlxuICogQW55b25lIHdpdGggdGhlIFVSTCBjYW4ndCBhdXRob3JpemUgd2l0aG91dCBhbHNvIHNlZWluZyB0aGUgdGVybWluYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBicm93c2VyTG9naW4oKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBnZXRDb25maWdWYWx1ZShcImJhc2VVcmxcIikgfHwgXCJodHRwczovL3NlbmRseS5saXZlXCI7XG5cbiAgLy8gR2VuZXJhdGUgVFdPIFNFUEFSQVRFIGNvZGVzIGZvciBzZWN1cml0eVxuICBjb25zdCBkZXZpY2VDb2RlID0gZ2VuZXJhdGVEZXZpY2VDb2RlKCk7IC8vIExvbmcgcmFuZG9tLCBnb2VzIGluIFVSTFxuICBjb25zdCB1c2VyQ29kZSA9IGdlbmVyYXRlVXNlckNvZGUoKTsgLy8gU2hvcnQgcmVhZGFibGUsIHNob3duIGluIHRlcm1pbmFsIG9ubHlcblxuICAvLyBSZXF1ZXN0IGRldmljZSBjb2RlIHJlZ2lzdHJhdGlvbiBmcm9tIHNlcnZlclxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9jbGkvYXV0aC9kZXZpY2UtY29kZWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRldmljZUNvZGUsIHVzZXJDb2RlIH0pLCAvLyBTZW5kIGJvdGggdG8gc2VydmVyXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IChhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBpbml0aWF0ZSBsb2dpblwiKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBEZXZpY2VDb2RlUmVzcG9uc2U7XG5cbiAgLy8gRm9ybWF0IHVzZXIgY29kZSB3aXRoIGh5cGhlbiBmb3IgcmVhZGFiaWxpdHkgKGUuZy4sIFwiQUJDRC1FRkdIXCIpXG4gIGNvbnN0IGRpc3BsYXlVc2VyQ29kZSA9IGAke3VzZXJDb2RlLnNsaWNlKDAsIDQpfS0ke3VzZXJDb2RlLnNsaWNlKDQpfWA7XG5cbiAgLy8gRGlzcGxheSBpbnN0cnVjdGlvbnMgdG8gdXNlclxuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIkxvZ2luIHRvIFNlbmRseVwiKSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGBPcGVuIHRoaXMgVVJMIGluIHlvdXIgYnJvd3NlcjpgKTtcbiAgY29uc29sZS5sb2coY29sb3JzLnByaW1hcnkoYCAgJHtkYXRhLnZlcmlmaWNhdGlvblVybH1gKSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGBBbmQgZW50ZXIgdGhpcyBjb2RlOmApO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMucHJpbWFyeShgICAke2Rpc3BsYXlVc2VyQ29kZX1gKSkpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIFRyeSB0byBvcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseVxuICB0cnkge1xuICAgIGF3YWl0IG9wZW4oZGF0YS52ZXJpZmljYXRpb25VcmwpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJCcm93c2VyIG9wZW5lZCBhdXRvbWF0aWNhbGx5XCIpKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlBsZWFzZSBvcGVuIHRoZSBVUkwgbWFudWFsbHlcIikpO1xuICB9XG5cbiAgY29uc29sZS5sb2coKTtcblxuICAvLyBQb2xsIGZvciB0b2tlblxuICBjb25zdCBzcGluID0gc3Bpbm5lcihcIldhaXRpbmcgZm9yIGF1dGhvcml6YXRpb24uLi5cIik7XG4gIHNwaW4uc3RhcnQoKTtcblxuICBsZXQgYXR0ZW1wdHMgPSAwO1xuICB3aGlsZSAoYXR0ZW1wdHMgPCBNQVhfUE9MTF9BVFRFTVBUUykge1xuICAgIGF3YWl0IHNsZWVwKGRhdGEuaW50ZXJ2YWwgKiAxMDAwIHx8IFBPTExfSU5URVJWQUwpO1xuICAgIGF0dGVtcHRzKys7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9jbGkvYXV0aC90b2tlbmAsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRldmljZUNvZGUgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRva2VuUmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gKGF3YWl0IHRva2VuUmVzcG9uc2UuanNvbigpKSBhcyBUb2tlblJlc3BvbnNlO1xuICAgICAgICBzcGluLnN1Y2NlZWQoXCJBdXRob3JpemVkXCIpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRva2Vuc1xuICAgICAgICBzZXRBdXRoVG9rZW5zKFxuICAgICAgICAgIHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIHRva2Vucy5leHBpcmVzSW4sXG4gICAgICAgICAgdG9rZW5zLnVzZXJJZCxcbiAgICAgICAgICB0b2tlbnMuZW1haWwsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbmV3IHVzZXIgbmVlZHMgcXVpY2stc3RhcnQgKG9ubHkgZm9yIENMSSBzZXNzaW9ucylcbiAgICAgICAgaWYgKHRva2Vucy5hY2Nlc3NUb2tlbi5zdGFydHNXaXRoKFwiY2xpX1wiKSkge1xuICAgICAgICAgIGNvbnN0IHsgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0LCBvZmZlclF1aWNrU3RhcnQgfSA9XG4gICAgICAgICAgICBhd2FpdCBpbXBvcnQoXCIuL29uYm9hcmRpbmcuanNcIik7XG5cbiAgICAgICAgICBpZiAoYXdhaXQgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0KCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9mZmVyUXVpY2tTdGFydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IChhd2FpdCB0b2tlblJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMge1xuICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYXV0aG9yaXphdGlvbl9wZW5kaW5nXCIpIHtcbiAgICAgICAgLy8gU3RpbGwgd2FpdGluZywgY29udGludWUgcG9sbGluZ1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yRGF0YS5lcnJvciA9PT0gXCJleHBpcmVkX3Rva2VuXCIpIHtcbiAgICAgICAgc3Bpbi5mYWlsKFwiTG9naW4gcmVxdWVzdCBleHBpcmVkXCIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYWNjZXNzX2RlbmllZFwiKSB7XG4gICAgICAgIHNwaW4uZmFpbChcIkxvZ2luIHdhcyBkZW5pZWRcIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTmV0d29yayBlcnJvciwgY29udGludWUgcG9sbGluZ1xuICAgIH1cbiAgfVxuXG4gIHNwaW4uZmFpbChcIkxvZ2luIHRpbWVkIG91dFwiKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG4vKipcbiAqIExvZ2luIHdpdGggYW4gQVBJIGtleSBkaXJlY3RseVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBpS2V5TG9naW4oYXBpS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFzZVVybCA9IGdldENvbmZpZ1ZhbHVlKFwiYmFzZVVybFwiKSB8fCBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIjtcblxuICAvLyBWYWxpZGF0ZSB0aGUgQVBJIGtleSB3aXRoIHRoZSBzZXJ2ZXJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hcGkvY2xpL2F1dGgvdmVyaWZ5LWtleWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IChhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBcIkludmFsaWQgQVBJIGtleVwiKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBBUEkga2V5XG4gIHNldEFwaUtleShhcGlLZXkpO1xufVxuXG4vKipcbiAqIExvZ291dCAtIGNsZWFyIGFsbCBzdG9yZWQgY3JlZGVudGlhbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ291dCgpOiB2b2lkIHtcbiAgY2xlYXJBdXRoKCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXV0aCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQXV0aGVudGljYXRlZCgpO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IGF1dGggaW5mbyBmb3IgZGlzcGxheVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aEluZm8oKTogUHJvbWlzZTx7XG4gIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIGVtYWlsPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIGtleVR5cGU/OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gIGNvbnN0IGVtYWlsID0gZ2V0Q29uZmlnVmFsdWUoXCJlbWFpbFwiKTtcbiAgY29uc3QgdXNlcklkID0gZ2V0Q29uZmlnVmFsdWUoXCJ1c2VySWRcIik7XG4gIGNvbnN0IGFwaUtleSA9IGdldENvbmZpZ1ZhbHVlKFwiYXBpS2V5XCIpO1xuICBjb25zdCBlbnZpcm9ubWVudCA9IGdldENvbmZpZ1ZhbHVlKFwiZW52aXJvbm1lbnRcIik7XG5cbiAgaWYgKCF0b2tlbiAmJiAhYXBpS2V5KSB7XG4gICAgcmV0dXJuIHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVudmlyb25tZW50IH07XG4gIH1cblxuICBsZXQga2V5VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoYXBpS2V5KSB7XG4gICAga2V5VHlwZSA9IGFwaUtleS5zdGFydHNXaXRoKFwic2tfdGVzdF9cIikgPyBcInRlc3RcIiA6IFwibGl2ZVwiO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgIGVtYWlsLFxuICAgIHVzZXJJZCxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBrZXlUeXBlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuIl19
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUNMLGFBQWEsRUFDYixTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsRUFDZCxlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFrQi9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtBQUMzRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxLQUFLLEdBQUcsa0NBQWtDLENBQUMsQ0FBQywwQkFBMEI7SUFDNUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6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QyxDQUFDO0lBQ3hDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVsRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksT0FBMkIsQ0FBQztJQUNoQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRCxPQUFPO1FBQ0wsYUFBYSxFQUFFLElBQUk7UUFDbkIsS0FBSztRQUNMLE1BQU07UUFDTixXQUFXO1FBQ1gsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsRUFBVTtJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aGVudGljYXRpb24gdXRpbGl0aWVzIGZvciBDTElcbiAqIEhhbmRsZXMgYnJvd3Nlci1iYXNlZCBsb2dpbiBmbG93IGFuZCBBUEkga2V5IGF1dGhlbnRpY2F0aW9uXG4gKi9cblxuaW1wb3J0IG9wZW4gZnJvbSBcIm9wZW5cIjtcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHtcbiAgc2V0QXV0aFRva2VucyxcbiAgc2V0QXBpS2V5LFxuICBjbGVhckF1dGgsXG4gIGdldENvbmZpZ1ZhbHVlLFxuICBpc0F1dGhlbnRpY2F0ZWQsXG4gIGdldEF1dGhUb2tlbixcbn0gZnJvbSBcIi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgeyBjb2xvcnMsIHNwaW5uZXIgfSBmcm9tIFwiLi9vdXRwdXQuanNcIjtcblxuY29uc3QgVVNFUl9DT0RFX0xFTkdUSCA9IDg7XG5jb25zdCBQT0xMX0lOVEVSVkFMID0gMjAwMDsgLy8gMiBzZWNvbmRzXG5jb25zdCBNQVhfUE9MTF9BVFRFTVBUUyA9IDE1MDsgLy8gNSBtaW51dGVzIG1heFxuXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUNvZGVSZXNwb25zZSB7XG4gIGRldmljZUNvZGU6IHN0cmluZztcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uVXJsOiBzdHJpbmc7XG4gIGV4cGlyZXNJbjogbnVtYmVyO1xuICBpbnRlcnZhbDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVzcG9uc2Uge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0luOiBudW1iZXI7XG4gIHVzZXJJZDogc3RyaW5nO1xuICBlbWFpbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbG9uZyByYW5kb20gZGV2aWNlIGNvZGUgZm9yIFVSTCAoc2Vzc2lvbiBpZGVudGlmaWVyKVxuICogVGhpcyBnb2VzIGluIHRoZSBVUkwgYW5kIGlkZW50aWZpZXMgd2hpY2ggQ0xJIHNlc3Npb24gaXMgd2FpdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVEZXZpY2VDb2RlKCk6IHN0cmluZyB7XG4gIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiaGV4XCIpOyAvLyAzMiBjaGFycywgbm90IGd1ZXNzYWJsZVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2hvcnQgaHVtYW4tcmVhZGFibGUgdXNlciBjb2RlIGZvciB0ZXJtaW5hbCBkaXNwbGF5XG4gKiBUaGlzIGlzIHdoYXQgdGhlIHVzZXIgdHlwZXMgdG8gcHJvdmUgdGhleSBoYXZlIHRlcm1pbmFsIGFjY2Vzc1xuICogVXNlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIGVhc3kgdG8gcmVhZCBhbmQgdHlwZSAobm8gMC9PLCAxL0kvTCBjb25mdXNpb24pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJDb2RlKCk6IHN0cmluZyB7XG4gIGNvbnN0IGNoYXJzID0gXCJBQkNERUZHSEpLTE1OUFFSU1RVVldYWVoyMzQ1Njc4OVwiOyAvLyBFeGNsdWRlIGNvbmZ1c2luZyBjaGFyc1xuICBsZXQgY29kZSA9IFwiXCI7XG4gIGNvbnN0IGJ5dGVzID0gY3J5cHRvLnJhbmRvbUJ5dGVzKFVTRVJfQ09ERV9MRU5HVEgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IFVTRVJfQ09ERV9MRU5HVEg7IGkrKykge1xuICAgIGNvZGUgKz0gY2hhcnNbYnl0ZXNbaV0gJSBjaGFycy5sZW5ndGhdO1xuICB9XG4gIHJldHVybiBjb2RlO1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSBicm93c2VyLWJhc2VkIGxvZ2luIGZsb3dcbiAqXG4gKiBTZWN1cml0eSBtb2RlbDpcbiAqIC0gZGV2aWNlQ29kZTogTG9uZyByYW5kb20gdG9rZW4gaW4gVVJMLCBpZGVudGlmaWVzIENMSSBzZXNzaW9uIChub3Qgc2VjcmV0KVxuICogLSB1c2VyQ29kZTogU2hvcnQgY29kZSBzaG93biBPTkxZIGluIHRlcm1pbmFsLCBwcm92ZXMgdXNlciBoYXMgdGVybWluYWwgYWNjZXNzXG4gKlxuICogVGhlIHVzZXJDb2RlIGlzIE5FVkVSIGluIHRoZSBVUkwgLSB0aGlzIGlzIGNyaXRpY2FsIGZvciBzZWN1cml0eS5cbiAqIEFueW9uZSB3aXRoIHRoZSBVUkwgY2FuJ3QgYXV0aG9yaXplIHdpdGhvdXQgYWxzbyBzZWVpbmcgdGhlIHRlcm1pbmFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnJvd3NlckxvZ2luKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICBjb25zdCBiYXNlVXJsID0gZ2V0Q29uZmlnVmFsdWUoXCJiYXNlVXJsXCIpIHx8IFwiaHR0cHM6Ly9zZW5kbHkubGl2ZVwiO1xuXG4gIC8vIEdlbmVyYXRlIFRXTyBTRVBBUkFURSBjb2RlcyBmb3Igc2VjdXJpdHlcbiAgY29uc3QgZGV2aWNlQ29kZSA9IGdlbmVyYXRlRGV2aWNlQ29kZSgpOyAvLyBMb25nIHJhbmRvbSwgZ29lcyBpbiBVUkxcbiAgY29uc3QgdXNlckNvZGUgPSBnZW5lcmF0ZVVzZXJDb2RlKCk7IC8vIFNob3J0IHJlYWRhYmxlLCBzaG93biBpbiB0ZXJtaW5hbCBvbmx5XG5cbiAgLy8gUmVxdWVzdCBkZXZpY2UgY29kZSByZWdpc3RyYXRpb24gZnJvbSBzZXJ2ZXJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hcGkvY2xpL2F1dGgvZGV2aWNlLWNvZGVgLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkZXZpY2VDb2RlLCB1c2VyQ29kZSB9KSwgLy8gU2VuZCBib3RoIHRvIHNlcnZlclxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpKSBhcyB7XG4gICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIH07XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gaW5pdGlhdGUgbG9naW5cIik7XG4gIH1cblxuICBjb25zdCBkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgRGV2aWNlQ29kZVJlc3BvbnNlO1xuXG4gIC8vIEZvcm1hdCB1c2VyIGNvZGUgd2l0aCBoeXBoZW4gZm9yIHJlYWRhYmlsaXR5IChlLmcuLCBcIkFCQ0QtRUZHSFwiKVxuICBjb25zdCBkaXNwbGF5VXNlckNvZGUgPSBgJHt1c2VyQ29kZS5zbGljZSgwLCA0KX0tJHt1c2VyQ29kZS5zbGljZSg0KX1gO1xuXG4gIC8vIERpc3BsYXkgaW5zdHJ1Y3Rpb25zIHRvIHVzZXJcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJMb2dpbiB0byBTZW5kbHlcIikpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhgT3BlbiB0aGlzIFVSTCBpbiB5b3VyIGJyb3dzZXI6YCk7XG4gIGNvbnNvbGUubG9nKGNvbG9ycy5wcmltYXJ5KGAgICR7ZGF0YS52ZXJpZmljYXRpb25Vcmx9YCkpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhgQW5kIGVudGVyIHRoaXMgY29kZTpgKTtcbiAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoY29sb3JzLnByaW1hcnkoYCAgJHtkaXNwbGF5VXNlckNvZGV9YCkpKTtcbiAgY29uc29sZS5sb2coKTtcblxuICAvLyBUcnkgdG8gb3BlbiBicm93c2VyIGF1dG9tYXRpY2FsbHlcbiAgdHJ5IHtcbiAgICBhd2FpdCBvcGVuKGRhdGEudmVyaWZpY2F0aW9uVXJsKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiQnJvd3NlciBvcGVuZWQgYXV0b21hdGljYWxseVwiKSk7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJQbGVhc2Ugb3BlbiB0aGUgVVJMIG1hbnVhbGx5XCIpKTtcbiAgfVxuXG4gIC8vIEVuYWJsZSBwcmVzcy10by1jb3B5IFVYIHdoaWxlIHdlIHBvbGwuIE9ubHkgd2lyZSB0aGlzIHdoZW4gd2UgaGF2ZSBhXG4gIC8vIHJlYWwgaW50ZXJhY3RpdmUgVFRZIOKAlCBpbiBDSSBvciBwaXBlZCBzdGRpbiB0aGVyZSdzIG5vdGhpbmcgdG8gcmVhZFxuICAvLyBmcm9tIGFuZCBzZXRSYXdNb2RlIHRocm93cy4gVGhlIGtleXByZXNzIGxpc3RlbmVyIGlzIGRldGFjaGVkIG9uIGFueVxuICAvLyBleGl0IHBhdGggKHN1Y2Nlc3MsIHRpbWVvdXQsIGVycm9yKSBzbyB3ZSBkb24ndCBsZWF2ZSB0aGUgdGVybWluYWwgaW5cbiAgLy8gcmF3IG1vZGUuXG4gIGNvbnN0IGtleXByZXNzQ2xlYW51cCA9IGF0dGFjaExvZ2luS2V5cHJlc3NIYW5kbGVyKGRhdGEudmVyaWZpY2F0aW9uVXJsKTtcblxuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIFBvbGwgZm9yIHRva2VuXG4gIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiV2FpdGluZyBmb3IgYXV0aG9yaXphdGlvbi4uLlwiKTtcbiAgc3Bpbi5zdGFydCgpO1xuXG4gIGxldCBhdHRlbXB0cyA9IDA7XG4gIHdoaWxlIChhdHRlbXB0cyA8IE1BWF9QT0xMX0FUVEVNUFRTKSB7XG4gICAgYXdhaXQgc2xlZXAoZGF0YS5pbnRlcnZhbCAqIDEwMDAgfHwgUE9MTF9JTlRFUlZBTCk7XG4gICAgYXR0ZW1wdHMrKztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL2NsaS9hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGV2aWNlQ29kZSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodG9rZW5SZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSAoYXdhaXQgdG9rZW5SZXNwb25zZS5qc29uKCkpIGFzIFRva2VuUmVzcG9uc2U7XG4gICAgICAgIHNwaW4uc3VjY2VlZChcIkF1dGhvcml6ZWRcIik7XG4gICAgICAgIGtleXByZXNzQ2xlYW51cCgpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRva2Vuc1xuICAgICAgICBzZXRBdXRoVG9rZW5zKFxuICAgICAgICAgIHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIHRva2Vucy5leHBpcmVzSW4sXG4gICAgICAgICAgdG9rZW5zLnVzZXJJZCxcbiAgICAgICAgICB0b2tlbnMuZW1haWwsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbmV3IHVzZXIgbmVlZHMgcXVpY2stc3RhcnQgKG9ubHkgZm9yIENMSSBzZXNzaW9ucylcbiAgICAgICAgaWYgKHRva2Vucy5hY2Nlc3NUb2tlbi5zdGFydHNXaXRoKFwiY2xpX1wiKSkge1xuICAgICAgICAgIGNvbnN0IHsgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0LCBvZmZlclF1aWNrU3RhcnQgfSA9XG4gICAgICAgICAgICBhd2FpdCBpbXBvcnQoXCIuL29uYm9hcmRpbmcuanNcIik7XG5cbiAgICAgICAgICBpZiAoYXdhaXQgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0KCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9mZmVyUXVpY2tTdGFydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IChhd2FpdCB0b2tlblJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMge1xuICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYXV0aG9yaXphdGlvbl9wZW5kaW5nXCIpIHtcbiAgICAgICAgLy8gU3RpbGwgd2FpdGluZywgY29udGludWUgcG9sbGluZ1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yRGF0YS5lcnJvciA9PT0gXCJleHBpcmVkX3Rva2VuXCIpIHtcbiAgICAgICAgc3Bpbi5mYWlsKFwiTG9naW4gcmVxdWVzdCBleHBpcmVkXCIpO1xuICAgICAgICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JEYXRhLmVycm9yID09PSBcImFjY2Vzc19kZW5pZWRcIikge1xuICAgICAgICBzcGluLmZhaWwoXCJMb2dpbiB3YXMgZGVuaWVkXCIpO1xuICAgICAgICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBOZXR3b3JrIGVycm9yLCBjb250aW51ZSBwb2xsaW5nXG4gICAgfVxuICB9XG5cbiAgc3Bpbi5mYWlsKFwiTG9naW4gdGltZWQgb3V0XCIpO1xuICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG4vKipcbiAqIFdpcmUgdXAgdGhlIGNvcHktVVJMIC8gY2FuY2VsIGtleWJpbmRpbmdzIGR1cmluZyB0aGUgZGV2aWNlLWNvZGVcbiAqIHBvbGxpbmcgbG9vcC4gT25seSBhY3RpdmUgb24gYSByZWFsIGludGVyYWN0aXZlIFRUWSDigJQgaW4gQ0ksIHBpcGVkXG4gKiBzdGRpbiwgb3Igd2hlbiBzdGRpbi5zZXRSYXdNb2RlIGlzIG1pc3Npbmcgd2Ugbm8tb3AgYW5kIHJldHVybiBhXG4gKiBjbGVhbnVwIHRoYXQgYWxzbyBuby1vcHMuXG4gKlxuICogUmV0dXJucyBhIGNsZWFudXAgZnVuY3Rpb24gdGhhdCB0aGUgY2FsbGVyIE1VU1QgaW52b2tlIG9uIGV2ZXJ5IGV4aXRcbiAqIHBhdGggKHN1Y2Nlc3MsIHRpbWVvdXQsIGVycm9yKSBzbyB0aGUgdGVybWluYWwgZG9lc24ndCBzdGF5IGluIHJhd1xuICogbW9kZS4gQ2FsbGluZyBjbGVhbnVwIHR3aWNlIGlzIHNhZmUuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaExvZ2luS2V5cHJlc3NIYW5kbGVyKHVybFRvQ29weTogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHN0ZGluID0gcHJvY2Vzcy5zdGRpbjtcbiAgaWYgKCFzdGRpbi5pc1RUWSB8fCB0eXBlb2Ygc3RkaW4uc2V0UmF3TW9kZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IHt9O1xuICB9XG5cbiAgbGV0IGNsZWFuZWQgPSBmYWxzZTtcbiAgY29uc3QgcHJldmlvdXNSYXdNb2RlID0gc3RkaW4uaXNSYXc7XG5cbiAgY29uc29sZS5sb2coXG4gICAgY29sb3JzLmRpbShcbiAgICAgIFwiUHJlc3MgW2NdIHRvIGNvcHkgVVJMIHRvIGNsaXBib2FyZCDCtyBbcV0gb3IgQ3RybC1DIHRvIGNhbmNlbFwiLFxuICAgICksXG4gICk7XG5cbiAgY29uc3Qgb25EYXRhID0gKGtleTogQnVmZmVyIHwgc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgayA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGlmIChrID09PSBcImNcIiB8fCBrID09PSBcIkNcIikge1xuICAgICAgY29weVRvQ2xpcGJvYXJkKHVybFRvQ29weSlcbiAgICAgICAgLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIGhpbnQgbGluZSB3aXRoIGEgdHJhbnNpZW50IGNvbmZpcm1hdGlvbi5cbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKFxuICAgICAgICAgICAgICBcIlxcclwiICsgXCIgXCIucmVwZWF0KDcwKSArIFwiXFxyXCIgKyBjb2xvcnMuc3VjY2VzcyhcIiAg4pyTIFVSTCBjb3BpZWQgdG8gY2xpcGJvYXJkXFxuXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXG4gICAgICAgICAgICAgIFwiXFxyXCIgKyBjb2xvcnMud2FybmluZyhcIiAg4pyXIENvdWxkIG5vdCBjb3B5IOKAlCBjb3B5IHRoZSBVUkwgbWFudWFsbHlcXG5cIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGsgPT09IFwicVwiIHx8IGsgPT09IFwiUVwiIHx8IGsgPT09IFwiXFx1MDAwM1wiKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbiAgTG9naW4gY2FuY2VsbGVkLlwiKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMTMwKTtcbiAgICB9XG4gIH07XG5cbiAgc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcbiAgc3RkaW4ucmVzdW1lKCk7XG4gIHN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgc3RkaW4ub24oXCJkYXRhXCIsIG9uRGF0YSk7XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgIGNsZWFuZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzdGRpbi5yZW1vdmVMaXN0ZW5lcihcImRhdGFcIiwgb25EYXRhKTtcbiAgICAgIHN0ZGluLnNldFJhd01vZGUocHJldmlvdXNSYXdNb2RlKTtcbiAgICAgIHN0ZGluLnBhdXNlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBuby1vcCAqL1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY2xlYW51cDtcbn1cblxuLyoqXG4gKiBDb3B5IHRleHQgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgdmlhIHRoZSBPUydzIG5hdGl2ZSB0b29sLiBSZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSB3cml0ZSBzdWNjZWVkZWQuIERvZXMgbm90IHRocm93LiBTaGVsbHMgb3V0IHJhdGhlciB0aGFuXG4gKiBhZGRpbmcgYSBuYXRpdmUgY2xpcGJvYXJkIGRlcCDigJQgdGhlIHRocmVlIGNvbW1hbmRzIChwYmNvcHkgLyBjbGlwIC9cbiAqIHhjbGlwIC8gd2wtY29weSkgY292ZXIgZXZlcnkgcGxhdGZvcm0gdGhlIENMSSBydW5zIG9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgY29uc3QgY2FuZGlkYXRlczogQXJyYXk8W3N0cmluZywgc3RyaW5nW11dPiA9XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIlxuICAgICAgPyBbW1wicGJjb3B5XCIsIFtdXV1cbiAgICAgIDogcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgICAgID8gW1tcImNsaXBcIiwgW11dXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgIFtcIndsLWNvcHlcIiwgW11dLFxuICAgICAgICAgICAgW1wieGNsaXBcIiwgW1wiLXNlbGVjdGlvblwiLCBcImNsaXBib2FyZFwiXV0sXG4gICAgICAgICAgICBbXCJ4c2VsXCIsIFtcIi0tY2xpcGJvYXJkXCIsIFwiLS1pbnB1dFwiXV0sXG4gICAgICAgICAgXTtcblxuICBmb3IgKGNvbnN0IFtjbWQsIGFyZ3NdIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNtZCwgYXJncywgeyBzdGRpbzogW1wicGlwZVwiLCBcImlnbm9yZVwiLCBcImlnbm9yZVwiXSB9KTtcbiAgICAgICAgY2hpbGQub24oXCJlcnJvclwiLCAoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gICAgICAgIGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID09PSAwKSk7XG4gICAgICAgIGNoaWxkLnN0ZGluLmVuZCh0ZXh0KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG9rKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHRyeSBuZXh0IGNhbmRpZGF0ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTG9naW4gd2l0aCBhbiBBUEkga2V5IGRpcmVjdGx5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcGlLZXlMb2dpbihhcGlLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBiYXNlVXJsID0gZ2V0Q29uZmlnVmFsdWUoXCJiYXNlVXJsXCIpIHx8IFwiaHR0cHM6Ly9zZW5kbHkubGl2ZVwiO1xuXG4gIC8vIFZhbGlkYXRlIHRoZSBBUEkga2V5IHdpdGggdGhlIHNlcnZlclxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9jbGkvYXV0aC92ZXJpZnkta2V5YCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMge1xuICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICB9O1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IFwiSW52YWxpZCBBUEkga2V5XCIpO1xuICB9XG5cbiAgLy8gU3RvcmUgdGhlIEFQSSBrZXlcbiAgc2V0QXBpS2V5KGFwaUtleSk7XG59XG5cbi8qKlxuICogTG9nb3V0IC0gY2xlYXIgYWxsIHN0b3JlZCBjcmVkZW50aWFsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KCk6IHZvaWQge1xuICBjbGVhckF1dGgoKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBjdXJyZW50bHkgYXV0aGVudGljYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBdXRoKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNBdXRoZW50aWNhdGVkKCk7XG59XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgYXV0aCBpbmZvIGZvciBkaXNwbGF5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdXRoSW5mbygpOiBQcm9taXNlPHtcbiAgYXV0aGVudGljYXRlZDogYm9vbGVhbjtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAga2V5VHlwZT86IHN0cmluZztcbn0+IHtcbiAgY29uc3QgdG9rZW4gPSBnZXRBdXRoVG9rZW4oKTtcbiAgY29uc3QgZW1haWwgPSBnZXRDb25maWdWYWx1ZShcImVtYWlsXCIpO1xuICBjb25zdCB1c2VySWQgPSBnZXRDb25maWdWYWx1ZShcInVzZXJJZFwiKTtcbiAgY29uc3QgYXBpS2V5ID0gZ2V0Q29uZmlnVmFsdWUoXCJhcGlLZXlcIik7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0Q29uZmlnVmFsdWUoXCJlbnZpcm9ubWVudFwiKTtcblxuICBpZiAoIXRva2VuICYmICFhcGlLZXkpIHtcbiAgICByZXR1cm4geyBhdXRoZW50aWNhdGVkOiBmYWxzZSwgZW52aXJvbm1lbnQgfTtcbiAgfVxuXG4gIGxldCBrZXlUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChhcGlLZXkpIHtcbiAgICBrZXlUeXBlID0gYXBpS2V5LnN0YXJ0c1dpdGgoXCJza190ZXN0X1wiKSA/IFwidGVzdFwiIDogXCJsaXZlXCI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGF1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgZW1haWwsXG4gICAgdXNlcklkLFxuICAgIGVudmlyb25tZW50LFxuICAgIGtleVR5cGUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Detect how the `@sendly/cli` binary was installed so `sendly upgrade`
3
+ * can shell out to the correct package manager.
4
+ *
5
+ * We support two install paths explicitly:
6
+ * - Homebrew — from the SendlyHQ/homebrew-tap formula (`brew install sendly`).
7
+ * Detected via the `HOMEBREW_CELLAR` env var (set by every brew-managed
8
+ * shell) OR by the binary path living under a Homebrew-owned prefix.
9
+ * - npm global — `npm install -g @sendly/cli`. This is the default and
10
+ * what we fall back to when we can't identify Homebrew.
11
+ *
12
+ * Returns `"unknown"` only when we can't determine either. That's rare in
13
+ * practice (npm installs into predictable paths) but we handle it
14
+ * gracefully in the `upgrade` command by printing both options.
15
+ */
16
+ export type InstallPath = "homebrew" | "npm" | "unknown";
17
+ export declare function detectInstallPath(): InstallPath;
18
+ /**
19
+ * Human-readable upgrade command for the detected install path.
20
+ */
21
+ export declare function upgradeCommandFor(path: InstallPath): string;
@@ -0,0 +1,38 @@
1
+ const HOMEBREW_PREFIX_MARKERS = [
2
+ "/opt/homebrew/",
3
+ "/usr/local/Cellar/",
4
+ "/home/linuxbrew/",
5
+ "/Cellar/",
6
+ ];
7
+ export function detectInstallPath() {
8
+ // Strongest signal — the env var that `brew shellenv` sets.
9
+ if (process.env.HOMEBREW_CELLAR) {
10
+ return "homebrew";
11
+ }
12
+ // Fallback — look at the bin path. `process.argv[1]` is the entry
13
+ // script; for Homebrew installs it lives under Cellar/libexec. For npm
14
+ // globals it lives under the npm prefix (e.g. /usr/local/lib/node_modules).
15
+ const binPath = process.argv[1] ?? "";
16
+ for (const marker of HOMEBREW_PREFIX_MARKERS) {
17
+ if (binPath.includes(marker))
18
+ return "homebrew";
19
+ }
20
+ // `node_modules` is the tell-tale for any npm install (global or local).
21
+ if (binPath.includes("/node_modules/"))
22
+ return "npm";
23
+ return "unknown";
24
+ }
25
+ /**
26
+ * Human-readable upgrade command for the detected install path.
27
+ */
28
+ export function upgradeCommandFor(path) {
29
+ switch (path) {
30
+ case "homebrew":
31
+ return "brew upgrade sendly";
32
+ case "npm":
33
+ return "npm install -g @sendly/cli@latest";
34
+ default:
35
+ return "npm install -g @sendly/cli@latest # or: brew upgrade sendly";
36
+ }
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0LWluc3RhbGwtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGV0ZWN0LWluc3RhbGwtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsNERBQTREO0lBQzVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLE1BQU0sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzdDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNsRCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXJELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFpQjtJQUNqRCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsT0FBTyxxQkFBcUIsQ0FBQztRQUMvQixLQUFLLEtBQUs7WUFDUixPQUFPLG1DQUFtQyxDQUFDO1FBQzdDO1lBQ0UsT0FBTyw4REFBOEQsQ0FBQztJQUMxRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGV0ZWN0IGhvdyB0aGUgYEBzZW5kbHkvY2xpYCBiaW5hcnkgd2FzIGluc3RhbGxlZCBzbyBgc2VuZGx5IHVwZ3JhZGVgXG4gKiBjYW4gc2hlbGwgb3V0IHRvIHRoZSBjb3JyZWN0IHBhY2thZ2UgbWFuYWdlci5cbiAqXG4gKiBXZSBzdXBwb3J0IHR3byBpbnN0YWxsIHBhdGhzIGV4cGxpY2l0bHk6XG4gKiAgIC0gSG9tZWJyZXcg4oCUIGZyb20gdGhlIFNlbmRseUhRL2hvbWVicmV3LXRhcCBmb3JtdWxhIChgYnJldyBpbnN0YWxsIHNlbmRseWApLlxuICogICAgIERldGVjdGVkIHZpYSB0aGUgYEhPTUVCUkVXX0NFTExBUmAgZW52IHZhciAoc2V0IGJ5IGV2ZXJ5IGJyZXctbWFuYWdlZFxuICogICAgIHNoZWxsKSBPUiBieSB0aGUgYmluYXJ5IHBhdGggbGl2aW5nIHVuZGVyIGEgSG9tZWJyZXctb3duZWQgcHJlZml4LlxuICogICAtIG5wbSBnbG9iYWwg4oCUIGBucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaWAuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYW5kXG4gKiAgICAgd2hhdCB3ZSBmYWxsIGJhY2sgdG8gd2hlbiB3ZSBjYW4ndCBpZGVudGlmeSBIb21lYnJldy5cbiAqXG4gKiBSZXR1cm5zIGBcInVua25vd25cImAgb25seSB3aGVuIHdlIGNhbid0IGRldGVybWluZSBlaXRoZXIuIFRoYXQncyByYXJlIGluXG4gKiBwcmFjdGljZSAobnBtIGluc3RhbGxzIGludG8gcHJlZGljdGFibGUgcGF0aHMpIGJ1dCB3ZSBoYW5kbGUgaXRcbiAqIGdyYWNlZnVsbHkgaW4gdGhlIGB1cGdyYWRlYCBjb21tYW5kIGJ5IHByaW50aW5nIGJvdGggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbFBhdGggPSBcImhvbWVicmV3XCIgfCBcIm5wbVwiIHwgXCJ1bmtub3duXCI7XG5cbmNvbnN0IEhPTUVCUkVXX1BSRUZJWF9NQVJLRVJTID0gW1xuICBcIi9vcHQvaG9tZWJyZXcvXCIsXG4gIFwiL3Vzci9sb2NhbC9DZWxsYXIvXCIsXG4gIFwiL2hvbWUvbGludXhicmV3L1wiLFxuICBcIi9DZWxsYXIvXCIsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5zdGFsbFBhdGgoKTogSW5zdGFsbFBhdGgge1xuICAvLyBTdHJvbmdlc3Qgc2lnbmFsIOKAlCB0aGUgZW52IHZhciB0aGF0IGBicmV3IHNoZWxsZW52YCBzZXRzLlxuICBpZiAocHJvY2Vzcy5lbnYuSE9NRUJSRVdfQ0VMTEFSKSB7XG4gICAgcmV0dXJuIFwiaG9tZWJyZXdcIjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIOKAlCBsb29rIGF0IHRoZSBiaW4gcGF0aC4gYHByb2Nlc3MuYXJndlsxXWAgaXMgdGhlIGVudHJ5XG4gIC8vIHNjcmlwdDsgZm9yIEhvbWVicmV3IGluc3RhbGxzIGl0IGxpdmVzIHVuZGVyIENlbGxhci9saWJleGVjLiBGb3IgbnBtXG4gIC8vIGdsb2JhbHMgaXQgbGl2ZXMgdW5kZXIgdGhlIG5wbSBwcmVmaXggKGUuZy4gL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzKS5cbiAgY29uc3QgYmluUGF0aCA9IHByb2Nlc3MuYXJndlsxXSA/PyBcIlwiO1xuICBmb3IgKGNvbnN0IG1hcmtlciBvZiBIT01FQlJFV19QUkVGSVhfTUFSS0VSUykge1xuICAgIGlmIChiaW5QYXRoLmluY2x1ZGVzKG1hcmtlcikpIHJldHVybiBcImhvbWVicmV3XCI7XG4gIH1cblxuICAvLyBgbm9kZV9tb2R1bGVzYCBpcyB0aGUgdGVsbC10YWxlIGZvciBhbnkgbnBtIGluc3RhbGwgKGdsb2JhbCBvciBsb2NhbCkuXG4gIGlmIChiaW5QYXRoLmluY2x1ZGVzKFwiL25vZGVfbW9kdWxlcy9cIikpIHJldHVybiBcIm5wbVwiO1xuXG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB1cGdyYWRlIGNvbW1hbmQgZm9yIHRoZSBkZXRlY3RlZCBpbnN0YWxsIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlQ29tbWFuZEZvcihwYXRoOiBJbnN0YWxsUGF0aCk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGF0aCkge1xuICAgIGNhc2UgXCJob21lYnJld1wiOlxuICAgICAgcmV0dXJuIFwiYnJldyB1cGdyYWRlIHNlbmRseVwiO1xuICAgIGNhc2UgXCJucG1cIjpcbiAgICAgIHJldHVybiBcIm5wbSBpbnN0YWxsIC1nIEBzZW5kbHkvY2xpQGxhdGVzdFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaUBsYXRlc3QgICMgb3I6IGJyZXcgdXBncmFkZSBzZW5kbHlcIjtcbiAgfVxufVxuIl19