@jimiford/webex 0.1.1 → 0.1.3
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/README.md +46 -0
- package/dist/channel-plugin.d.ts +17 -1
- package/dist/channel-plugin.js +161 -34
- package/dist/plugin.js +4 -1
- package/dist/send.js +17 -6
- package/openclaw.plugin.json +68 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -309,6 +309,52 @@ WEBHOOK_SECRET=your_webhook_secret
|
|
|
309
309
|
|
|
310
310
|
The plugin includes automatic retry with exponential backoff for rate-limited requests. Adjust `maxRetries` and `retryDelayMs` in config if needed.
|
|
311
311
|
|
|
312
|
+
## Security Considerations
|
|
313
|
+
|
|
314
|
+
When connecting a Webex bot to OpenClaw, keep these security implications in mind:
|
|
315
|
+
|
|
316
|
+
### Access Control
|
|
317
|
+
|
|
318
|
+
- **DM Policy**: The `dmPolicy` setting controls who can interact with your bot:
|
|
319
|
+
- `allow`: Anyone can message the bot and receive responses (use with caution)
|
|
320
|
+
- `deny`: The bot won't respond to direct messages
|
|
321
|
+
- `allowlisted`: Only users in the `allowFrom` list receive responses
|
|
322
|
+
- **Recommendation**: Use `allowlisted` in production and explicitly specify trusted users
|
|
323
|
+
|
|
324
|
+
### Bot Token Permissions
|
|
325
|
+
|
|
326
|
+
- The bot access token can read messages sent to the bot and send replies
|
|
327
|
+
- Keep your token secret — never commit it to version control
|
|
328
|
+
- Rotate tokens periodically via the [Webex Developer Portal](https://developer.webex.com)
|
|
329
|
+
|
|
330
|
+
### Webhook Security
|
|
331
|
+
|
|
332
|
+
- **Always use a webhook secret** in production to verify incoming requests
|
|
333
|
+
- The `webhookSecret` enables HMAC-SHA1 signature verification
|
|
334
|
+
- Without verification, attackers could send fake webhook payloads to your endpoint
|
|
335
|
+
|
|
336
|
+
### Network Exposure
|
|
337
|
+
|
|
338
|
+
- Your webhook endpoint must be publicly accessible for Webex to deliver messages
|
|
339
|
+
- Use HTTPS in production (required by Webex)
|
|
340
|
+
- Consider IP allowlisting if your infrastructure supports it
|
|
341
|
+
- For development, tools like ngrok create temporary public URLs
|
|
342
|
+
|
|
343
|
+
### OpenClaw Agent Access
|
|
344
|
+
|
|
345
|
+
- Messages received by the bot flow through your OpenClaw agent
|
|
346
|
+
- The agent has access to whatever tools you've configured (file access, web browsing, etc.)
|
|
347
|
+
- Treat bot conversations with the same security considerations as direct OpenClaw access
|
|
348
|
+
- Review your agent's tool permissions and workspace access
|
|
349
|
+
|
|
350
|
+
### Best Practices
|
|
351
|
+
|
|
352
|
+
1. Start with `dmPolicy: 'deny'` or `dmPolicy: 'allowlisted'` and explicitly allow trusted users
|
|
353
|
+
2. Always configure a `webhookSecret` for production deployments
|
|
354
|
+
3. Monitor bot activity through Webex admin tools and OpenClaw logs
|
|
355
|
+
4. Use separate bots for development and production environments
|
|
356
|
+
5. Regularly audit the `allowFrom` list
|
|
357
|
+
|
|
312
358
|
## License
|
|
313
359
|
|
|
314
360
|
MIT
|
package/dist/channel-plugin.d.ts
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Implements the ChannelPlugin interface for OpenClaw's plugin system.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
7
|
+
import type { ChannelPlugin, PluginRuntime } from "openclaw/plugin-sdk";
|
|
8
|
+
import { WebexWebhookHandler } from "./webhook";
|
|
7
9
|
import type { WebexChannelConfig } from "./types";
|
|
10
|
+
export declare function setPluginRuntime(runtime: PluginRuntime): void;
|
|
8
11
|
/** Resolved account configuration */
|
|
9
12
|
export interface ResolvedWebexAccount {
|
|
10
13
|
accountId: string;
|
|
@@ -15,4 +18,17 @@ export interface ResolvedWebexAccount {
|
|
|
15
18
|
token?: string;
|
|
16
19
|
webhookUrl?: string;
|
|
17
20
|
}
|
|
21
|
+
/** Webhook target registration for HTTP handler */
|
|
22
|
+
type WebexWebhookTarget = {
|
|
23
|
+
account: ResolvedWebexAccount;
|
|
24
|
+
config: WebexChannelConfig;
|
|
25
|
+
webhookHandler: WebexWebhookHandler;
|
|
26
|
+
};
|
|
27
|
+
export declare function registerWebexWebhookTarget(path: string, target: WebexWebhookTarget): () => void;
|
|
28
|
+
/**
|
|
29
|
+
* Create the webhook handler with access to the plugin runtime.
|
|
30
|
+
* Returns a handler function that can process incoming Webex webhook requests.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createWebhookHandler(): (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
18
33
|
export declare const webexPlugin: ChannelPlugin<ResolvedWebexAccount>;
|
|
34
|
+
export {};
|
package/dist/channel-plugin.js
CHANGED
|
@@ -6,9 +6,163 @@
|
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.webexPlugin = void 0;
|
|
9
|
+
exports.setPluginRuntime = setPluginRuntime;
|
|
10
|
+
exports.registerWebexWebhookTarget = registerWebexWebhookTarget;
|
|
11
|
+
exports.createWebhookHandler = createWebhookHandler;
|
|
9
12
|
const send_1 = require("./send");
|
|
10
13
|
const webhook_1 = require("./webhook");
|
|
14
|
+
// Store the plugin runtime for use in HTTP handlers
|
|
15
|
+
let pluginRuntime = null;
|
|
16
|
+
function setPluginRuntime(runtime) {
|
|
17
|
+
pluginRuntime = runtime;
|
|
18
|
+
}
|
|
11
19
|
const DEFAULT_ACCOUNT_ID = "default";
|
|
20
|
+
const webhookTargets = new Map();
|
|
21
|
+
function normalizeWebhookPath(raw) {
|
|
22
|
+
const trimmed = raw.trim();
|
|
23
|
+
if (!trimmed)
|
|
24
|
+
return "/";
|
|
25
|
+
const withSlash = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
26
|
+
if (withSlash.length > 1 && withSlash.endsWith("/")) {
|
|
27
|
+
return withSlash.slice(0, -1);
|
|
28
|
+
}
|
|
29
|
+
return withSlash;
|
|
30
|
+
}
|
|
31
|
+
function registerWebexWebhookTarget(path, target) {
|
|
32
|
+
const key = normalizeWebhookPath(path);
|
|
33
|
+
webhookTargets.set(key, target);
|
|
34
|
+
return () => {
|
|
35
|
+
webhookTargets.delete(key);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function readJsonBody(req, maxBytes) {
|
|
39
|
+
const chunks = [];
|
|
40
|
+
let total = 0;
|
|
41
|
+
return await new Promise((resolve) => {
|
|
42
|
+
req.on("data", (chunk) => {
|
|
43
|
+
total += chunk.length;
|
|
44
|
+
if (total > maxBytes) {
|
|
45
|
+
resolve({ ok: false, error: "payload too large" });
|
|
46
|
+
req.destroy();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
chunks.push(chunk);
|
|
50
|
+
});
|
|
51
|
+
req.on("end", () => {
|
|
52
|
+
try {
|
|
53
|
+
const body = Buffer.concat(chunks).toString("utf-8");
|
|
54
|
+
const parsed = JSON.parse(body);
|
|
55
|
+
resolve({ ok: true, value: parsed });
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
resolve({ ok: false, error: "invalid json" });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
req.on("error", (err) => {
|
|
62
|
+
resolve({ ok: false, error: err.message });
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create the webhook handler with access to the plugin runtime.
|
|
68
|
+
* Returns a handler function that can process incoming Webex webhook requests.
|
|
69
|
+
*/
|
|
70
|
+
function createWebhookHandler() {
|
|
71
|
+
return async (req, res) => {
|
|
72
|
+
const url = new URL(req.url ?? "/", "http://localhost");
|
|
73
|
+
const path = normalizeWebhookPath(url.pathname);
|
|
74
|
+
// Check if path matches /webhooks/webex/*
|
|
75
|
+
if (!path.startsWith("/webhooks/webex/")) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const target = webhookTargets.get(path);
|
|
79
|
+
if (!target) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (req.method !== "POST") {
|
|
83
|
+
res.statusCode = 405;
|
|
84
|
+
res.setHeader("Allow", "POST");
|
|
85
|
+
res.end("Method Not Allowed");
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
const body = await readJsonBody(req, 1024 * 1024);
|
|
89
|
+
if (!body.ok) {
|
|
90
|
+
res.statusCode = body.error === "payload too large" ? 413 : 400;
|
|
91
|
+
res.end(body.error ?? "invalid payload");
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
const { account, webhookHandler } = target;
|
|
95
|
+
try {
|
|
96
|
+
const signature = req.headers["x-spark-signature"];
|
|
97
|
+
const payload = body.value;
|
|
98
|
+
const envelope = await webhookHandler.handleWebhook(payload, signature);
|
|
99
|
+
if (envelope && pluginRuntime) {
|
|
100
|
+
// Load config using the plugin runtime (cast to any for internal API access)
|
|
101
|
+
const runtime = pluginRuntime;
|
|
102
|
+
const cfg = runtime.config?.loadConfig?.() ?? {};
|
|
103
|
+
// Build the context payload for OpenClaw's message pipeline
|
|
104
|
+
const ctxPayload = {
|
|
105
|
+
Body: envelope.content.text ?? "",
|
|
106
|
+
RawBody: envelope.content.text ?? "",
|
|
107
|
+
CommandBody: envelope.content.text ?? "",
|
|
108
|
+
From: `webex:${envelope.author.id}`,
|
|
109
|
+
To: `webex:${envelope.conversationId}`,
|
|
110
|
+
SessionKey: `agent:main:webex:${envelope.conversationId}`,
|
|
111
|
+
AccountId: account.accountId,
|
|
112
|
+
ChatType: envelope.metadata.roomType === "direct" ? "direct" : "group",
|
|
113
|
+
SenderName: envelope.author.displayName ?? envelope.author.email ?? envelope.author.id,
|
|
114
|
+
SenderId: envelope.author.id,
|
|
115
|
+
Provider: "webex",
|
|
116
|
+
Surface: "webex",
|
|
117
|
+
MessageSid: envelope.id,
|
|
118
|
+
Timestamp: envelope.metadata.timestamp,
|
|
119
|
+
OriginatingChannel: "webex",
|
|
120
|
+
OriginatingTo: `webex:${envelope.conversationId}`,
|
|
121
|
+
MessageThreadId: envelope.metadata.parentId,
|
|
122
|
+
};
|
|
123
|
+
// Use the plugin runtime's dispatch function (cast to any for internal API)
|
|
124
|
+
const dispatchReply = runtime.channel?.reply?.dispatchReplyWithBufferedBlockDispatcher;
|
|
125
|
+
if (dispatchReply) {
|
|
126
|
+
// Create a sender for replies
|
|
127
|
+
const sender = new send_1.WebexSender(account.config);
|
|
128
|
+
await dispatchReply({
|
|
129
|
+
ctx: ctxPayload,
|
|
130
|
+
cfg,
|
|
131
|
+
dispatcherOptions: {
|
|
132
|
+
deliver: async (payload) => {
|
|
133
|
+
if (payload.text) {
|
|
134
|
+
await sender.send({
|
|
135
|
+
to: envelope.conversationId,
|
|
136
|
+
content: { text: payload.text },
|
|
137
|
+
parentId: envelope.metadata.parentId,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
onError: (err) => {
|
|
142
|
+
console.error(`[webex:${account.accountId}] reply dispatch error: ${err.message}`);
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
replyOptions: {},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.warn(`[webex:${account.accountId}] dispatchReply not available in plugin runtime`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
res.statusCode = 200;
|
|
153
|
+
res.setHeader("Content-Type", "application/json");
|
|
154
|
+
res.end(JSON.stringify({ ok: true }));
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
console.error(`[webex:${account.accountId}] webhook error: ${err instanceof Error ? err.message : err}`);
|
|
159
|
+
res.statusCode = 500;
|
|
160
|
+
res.setHeader("Content-Type", "application/json");
|
|
161
|
+
res.end(JSON.stringify({ error: "Internal error" }));
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
12
166
|
function listWebexAccountIds(cfg) {
|
|
13
167
|
const section = cfg.channels?.webex;
|
|
14
168
|
if (!section)
|
|
@@ -364,47 +518,20 @@ exports.webexPlugin = {
|
|
|
364
518
|
catch (err) {
|
|
365
519
|
log?.warn?.(`[${account.accountId}] failed to register webhooks: ${err instanceof Error ? err.message : err}`);
|
|
366
520
|
}
|
|
367
|
-
// Register
|
|
521
|
+
// Register webhook target for HTTP handler
|
|
368
522
|
const webhookPath = `/webhooks/webex/${account.accountId}`;
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
try {
|
|
374
|
-
const signature = req.headers["x-spark-signature"];
|
|
375
|
-
const payload = req.body;
|
|
376
|
-
const envelope = await webhookHandler.handleWebhook(payload, signature);
|
|
377
|
-
if (envelope) {
|
|
378
|
-
// Forward to OpenClaw's message pipeline
|
|
379
|
-
await runtime.messaging.handleInbound({
|
|
380
|
-
channel: "webex",
|
|
381
|
-
accountId: account.accountId,
|
|
382
|
-
senderId: envelope.author.id,
|
|
383
|
-
senderEmail: envelope.author.email,
|
|
384
|
-
conversationId: envelope.conversationId,
|
|
385
|
-
messageId: envelope.id,
|
|
386
|
-
text: envelope.content.text ?? "",
|
|
387
|
-
roomType: envelope.metadata.roomType,
|
|
388
|
-
threadId: envelope.metadata.parentId,
|
|
389
|
-
timestamp: new Date(envelope.metadata.timestamp),
|
|
390
|
-
raw: envelope.metadata.raw,
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
return { status: 200, body: { ok: true } };
|
|
394
|
-
}
|
|
395
|
-
catch (err) {
|
|
396
|
-
log?.error?.(`[${account.accountId}] webhook error: ${err instanceof Error ? err.message : err}`);
|
|
397
|
-
return { status: 500, body: { error: "Internal error" } };
|
|
398
|
-
}
|
|
399
|
-
},
|
|
523
|
+
const unregister = registerWebexWebhookTarget(webhookPath, {
|
|
524
|
+
account,
|
|
525
|
+
config: account.config,
|
|
526
|
+
webhookHandler,
|
|
400
527
|
});
|
|
401
528
|
log?.info?.(`[${account.accountId}] HTTP webhook handler registered at ${webhookPath}`);
|
|
402
529
|
// Return cleanup function
|
|
403
530
|
return async () => {
|
|
404
531
|
log?.info?.(`[${account.accountId}] stopping Webex provider`);
|
|
405
|
-
|
|
532
|
+
unregister();
|
|
406
533
|
};
|
|
407
534
|
},
|
|
408
535
|
},
|
|
409
536
|
};
|
|
410
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2hhbm5lbC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQVFILGlDQUFxQztBQUNyQyx1Q0FBZ0Q7QUFtRGhELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDO0FBRXJDLFNBQVMsbUJBQW1CLENBQUMsR0FBZTtJQUMxQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztJQUNwQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXhCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUV6QiwrQ0FBK0M7SUFDL0MsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksRUFBRSxLQUFLLGtCQUFrQixFQUFFLENBQUM7Z0JBQzlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBRzVCO0lBQ0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFFcEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTztZQUNMLFNB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QixHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FDcEYsQ0FBQzt3QkFDRixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO29CQUM1RCxDQUFDO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7WUFFSCxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQ1QsSUFBSSxPQUFPLENBQUMsU0FBUyx3Q0FBd0MsV0FBVyxFQUFFLENBQzNFLENBQUM7WUFFRiwwQkFBMEI7WUFDMUIsT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDaEIsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsMkJBQTJCLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUM7UUFDSixDQUFDO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQ2xhdyBDaGFubmVsIFBsdWdpbiBmb3IgV2ViZXhcbiAqXG4gKiBJbXBsZW1lbnRzIHRoZSBDaGFubmVsUGx1Z2luIGludGVyZmFjZSBmb3IgT3BlbkNsYXcncyBwbHVnaW4gc3lzdGVtLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2hhbm5lbFBsdWdpbixcbiAgUGx1Z2luUnVudGltZSxcbiAgSHR0cFJlcXVlc3QsXG59IGZyb20gXCJvcGVuY2xhdy9wbHVnaW4tc2RrXCI7XG5cbmltcG9ydCB7IFdlYmV4U2VuZGVyIH0gZnJvbSBcIi4vc2VuZFwiO1xuaW1wb3J0IHsgV2ViZXhXZWJob29rSGFuZGxlciB9IGZyb20gXCIuL3dlYmhvb2tcIjtcbmltcG9ydCB0eXBlIHsgV2ViZXhDaGFubmVsQ29uZmlnLCBXZWJleFdlYmhvb2tQYXlsb2FkIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqIFJlc29sdmVkIGFjY291bnQgY29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdlYmV4QWNjb3VudCB7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBlbmFibGVkOiBib29sZWFuO1xuICBjb25maWd1cmVkOiBib29sZWFuO1xuICBjb25maWc6IFdlYmV4Q2hhbm5lbENvbmZpZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHdlYmhvb2tVcmw/OiBzdHJpbmc7XG59XG5cbi8qKiBDb3JlIGNvbmZpZyB0eXBlIGZvciBhY2Nlc3NpbmcgY2hhbm5lbHMud2ViZXggKi9cbmludGVyZmFjZSBDb3JlQ29uZmlnIHtcbiAgY2hhbm5lbHM/OiB7XG4gICAgd2ViZXg/OiBXZWJleENoYW5uZWxTZWN0aW9uO1xuICAgIGRlZmF1bHRzPzoge1xuICAgICAgZ3JvdXBQb2xpY3k/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFdlYmV4Q2hhbm5lbFNlY3Rpb24ge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgbmFtZT86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHdlYmhvb2tVcmw/OiBzdHJpbmc7XG4gIHdlYmhvb2tTZWNyZXQ/OiBzdHJpbmc7XG4gIGRtUG9saWN5PzogXCJhbGxvd1wiIHwgXCJkZW55XCIgfCBcImFsbG93bGlzdGVkXCIgfCBcInBhaXJpbmdcIjtcbiAgYWxsb3dGcm9tPzogc3RyaW5nW107XG4gIGFwaUJhc2VVcmw/OiBzdHJpbmc7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHJldHJ5RGVsYXlNcz86IG51bWJlcjtcbiAgYWNjb3VudHM/OiBSZWNvcmQ8c3RyaW5nLCBXZWJleEFjY291bnRDb25maWc+O1xufVxuXG5pbnRlcmZhY2UgV2ViZXhBY2NvdW50Q29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICB3ZWJob29rVXJsPzogc3RyaW5nO1xuICB3ZWJob29rU2VjcmV0Pzogc3RyaW5nO1xuICBkbVBvbGljeT86IFwiYWxsb3dcIiB8IFwiZGVueVwiIHwgXCJhbGxvd2xpc3RlZFwiIHwgXCJwYWlyaW5nXCI7XG4gIGFsbG93RnJvbT86IHN0cmluZ1tdO1xuICBhcGlCYXNlVXJsPzogc3RyaW5nO1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICByZXRyeURlbGF5TXM/OiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRfQUNDT1VOVF9JRCA9IFwiZGVmYXVsdFwiO1xuXG5mdW5jdGlvbiBsaXN0V2ViZXhBY2NvdW50SWRzKGNmZzogQ29yZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGNmZy5jaGFubmVscz8ud2ViZXg7XG4gIGlmICghc2VjdGlvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBDaGVjayBmb3IgdG9wLWxldmVsIGNvbmZpZyAoZGVmYXVsdCBhY2NvdW50KVxuICBpZiAoc2VjdGlvbi50b2tlbikge1xuICAgIGlkcy5wdXNoKERFRkFVTFRfQUNDT1VOVF9JRCk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgbmFtZWQgYWNjb3VudHNcbiAgaWYgKHNlY3Rpb24uYWNjb3VudHMpIHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKHNlY3Rpb24uYWNjb3VudHMpKSB7XG4gICAgICBpZiAoaWQgIT09IERFRkFVTFRfQUNDT1VOVF9JRCkge1xuICAgICAgICBpZHMucHVzaChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlkcztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVdlYmV4QWNjb3VudChvcHRzOiB7XG4gIGNmZzogQ29yZUNvbmZpZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xufSk6IFJlc29sdmVkV2ViZXhBY2NvdW50IHtcbiAgY29uc3QgeyBjZmcsIGFjY291bnRJZCA9IERFRkFVTFRfQUNDT1VOVF9JRCB9ID0gb3B0cztcbiAgY29uc3Qgc2VjdGlvbiA9IGNmZy5jaGFubmVscz8ud2ViZXg7XG5cbiAgaWYgKCFzZWN0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRJZCxcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgY29uZmlndXJlZDogZmFsc2UsXG4gICAgICBjb25maWc6IHt9IGFzIFdlYmV4Q2hhbm5lbENvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIG5hbWVkIGFjY291bnQgZmlyc3RcbiAgY29uc3QgbmFtZWRBY2NvdW50ID0gc2VjdGlvbi5hY2NvdW50cz8uW2FjY291bnRJZF07XG5cbiAgaWYgKG5hbWVkQWNjb3VudCkge1xuICAgIGNvbnN0IHRva2VuID0gbmFtZWRBY2NvdW50LnRva2VuID8/IHNlY3Rpb24udG9rZW47XG4gICAgY29uc3Qgd2ViaG9va1VybCA9IG5hbWVkQWNjb3VudC53ZWJob29rVXJsID8/IHNlY3Rpb24ud2ViaG9va1VybDtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50SWQsXG4gICAgICBuYW1lOiBuYW1lZEFjY291bnQubmFtZSxcbiAgICAgIGVuYWJsZWQ6IG5hbWVkQWNjb3VudC5lbmFibGVkICE9PSBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyZWQ6IEJvb2xlYW4odG9rZW4gJiYgd2ViaG9va1VybCksXG4gICAgICB0b2tlbixcbiAgICAgIHdlYmhvb2tVcmwsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdG9rZW46IHRva2VuID8/IFwiXCIsXG4gICAgICAgIHdlYmhvb2tVcmw6IHdlYmhvb2tVcmwgPz8gXCJcIixcbiAgICAgICAgd2ViaG9va1NlY3JldDogbmFtZWRBY2NvdW50LndlYmhvb2tTZWNyZXQgPz8gc2VjdGlvbi53ZWJob29rU2VjcmV0LFxuICAgICAgICBkbVBvbGljeTogbmFtZWRBY2NvdW50LmRtUG9saWN5ID8/IHNlY3Rpb24uZG1Qb2xpY3kgPz8gXCJhbGxvd1wiLFxuICAgICAgICBhbGxvd0Zyb206IG5hbWVkQWNjb3VudC5hbGxvd0Zyb20gPz8gc2VjdGlvbi5hbGxvd0Zyb20sXG4gICAgICAgIGFwaUJhc2VVcmw6IG5hbWVkQWNjb3VudC5hcGlCYXNlVXJsID8/IHNlY3Rpb24uYXBpQmFzZVVybCxcbiAgICAgICAgbWF4UmV0cmllczogbmFtZWRBY2NvdW50Lm1heFJldHJpZXMgPz8gc2VjdGlvbi5tYXhSZXRyaWVzLFxuICAgICAgICByZXRyeURlbGF5TXM6IG5hbWVkQWNjb3VudC5yZXRyeURlbGF5TXMgPz8gc2VjdGlvbi5yZXRyeURlbGF5TXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gdG9wLWxldmVsIGNvbmZpZyAoZGVmYXVsdCBhY2NvdW50KVxuICBpZiAoYWNjb3VudElkID09PSBERUZBVUxUX0FDQ09VTlRfSUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudElkLFxuICAgICAgbmFtZTogc2VjdGlvbi5uYW1lLFxuICAgICAgZW5hYmxlZDogc2VjdGlvbi5lbmFibGVkICE9PSBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyZWQ6IEJvb2xlYW4oc2VjdGlvbi50b2tlbiAmJiBzZWN0aW9uLndlYmhvb2tVcmwpLFxuICAgICAgdG9rZW46IHNlY3Rpb24udG9rZW4sXG4gICAgICB3ZWJob29rVXJsOiBzZWN0aW9uLndlYmhvb2tVcmwsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdG9rZW46IHNlY3Rpb24udG9rZW4gPz8gXCJcIixcbiAgICAgICAgd2ViaG9va1VybDogc2VjdGlvbi53ZWJob29rVXJsID8/IFwiXCIsXG4gICAgICAgIHdlYmhvb2tTZWNyZXQ6IHNlY3Rpb24ud2ViaG9va1NlY3JldCxcbiAgICAgICAgZG1Qb2xpY3k6IHNlY3Rpb24uZG1Qb2xpY3kgPz8gXCJhbGxvd1wiLFxuICAgICAgICBhbGxvd0Zyb206IHNlY3Rpb24uYWxsb3dGcm9tLFxuICAgICAgICBhcGlCYXNlVXJsOiBzZWN0aW9uLmFwaUJhc2VVcmwsXG4gICAgICAgIG1heFJldHJpZXM6IHNlY3Rpb24ubWF4UmV0cmllcyxcbiAgICAgICAgcmV0cnlEZWxheU1zOiBzZWN0aW9uLnJldHJ5RGVsYXlNcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEFjY291bnQgbm90IGZvdW5kXG4gIHJldHVybiB7XG4gICAgYWNjb3VudElkLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGNvbmZpZ3VyZWQ6IGZhbHNlLFxuICAgIGNvbmZpZzoge30gYXMgV2ViZXhDaGFubmVsQ29uZmlnLFxuICB9O1xufVxuXG5jb25zdCBtZXRhID0ge1xuICBpZDogXCJ3ZWJleFwiLFxuICBsYWJlbDogXCJXZWJleFwiLFxuICBzZWxlY3Rpb25MYWJlbDogXCJDaXNjbyBXZWJleFwiLFxuICBkb2NzUGF0aDogXCIvY2hhbm5lbHMvd2ViZXhcIixcbiAgZG9jc0xhYmVsOiBcIndlYmV4XCIsXG4gIGJsdXJiOiBcIkNpc2NvIFdlYmV4IG1lc3NhZ2luZyB2aWEgYm90IHdlYmhvb2tzLlwiLFxuICBvcmRlcjogNzUsXG4gIGFsaWFzZXM6IFtcImNpc2NvLXdlYmV4XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IHdlYmV4UGx1Z2luOiBDaGFubmVsUGx1Z2luPFJlc29sdmVkV2ViZXhBY2NvdW50PiA9IHtcbiAgaWQ6IFwid2ViZXhcIixcbiAgbWV0YSxcblxuICBjYXBhYmlsaXRpZXM6IHtcbiAgICBjaGF0VHlwZXM6IFtcImRpcmVjdFwiLCBcImdyb3VwXCJdLFxuICAgIHRocmVhZHM6IHRydWUsXG4gICAgbWVkaWE6IHRydWUsXG4gIH0sXG5cbiAgcmVsb2FkOiB7IGNvbmZpZ1ByZWZpeGVzOiBbXCJjaGFubmVscy53ZWJleFwiXSB9LFxuXG4gIGNvbmZpZzoge1xuICAgIGxpc3RBY2NvdW50SWRzOiAoY2ZnKSA9PiBsaXN0V2ViZXhBY2NvdW50SWRzKGNmZyBhcyBDb3JlQ29uZmlnKSxcblxuICAgIHJlc29sdmVBY2NvdW50OiAoY2ZnLCBhY2NvdW50SWQpID0+XG4gICAgICByZXNvbHZlV2ViZXhBY2NvdW50KHsgY2ZnOiBjZmcgYXMgQ29yZUNvbmZpZywgYWNjb3VudElkIH0pLFxuXG4gICAgZGVmYXVsdEFjY291bnRJZDogKCkgPT4gREVGQVVMVF9BQ0NPVU5UX0lELFxuXG4gICAgc2V0QWNjb3VudEVuYWJsZWQ6ICh7IGNmZywgYWNjb3VudElkLCBlbmFibGVkIH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGNmZyBhcyBDb3JlQ29uZmlnO1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IGNvbmZpZy5jaGFubmVscz8ud2ViZXggPz8ge307XG5cbiAgICAgIGlmIChhY2NvdW50SWQgPT09IERFRkFVTFRfQUNDT1VOVF9JRCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBjaGFubmVsczoge1xuICAgICAgICAgICAgLi4uY29uZmlnLmNoYW5uZWxzLFxuICAgICAgICAgICAgd2ViZXg6IHtcbiAgICAgICAgICAgICAgLi4uc2VjdGlvbixcbiAgICAgICAgICAgICAgZW5hYmxlZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICBjaGFubmVsczoge1xuICAgICAgICAgIC4uLmNvbmZpZy5jaGFubmVscyxcbiAgICAgICAgICB3ZWJleDoge1xuICAgICAgICAgICAgLi4uc2VjdGlvbixcbiAgICAgICAgICAgIGFjY291bnRzOiB7XG4gICAgICAgICAgICAgIC4uLnNlY3Rpb24uYWNjb3VudHMsXG4gICAgICAgICAgICAgIFthY2NvdW50SWRdOiB7XG4gICAgICAgICAgICAgICAgLi4uc2VjdGlvbi5hY2NvdW50cz8uW2FjY291bnRJZF0sXG4gICAgICAgICAgICAgICAgZW5hYmxlZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGRlbGV0ZUFjY291bnQ6ICh7IGNmZywgYWNjb3VudElkIH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGNmZyBhcyBDb3JlQ29uZmlnO1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IGNvbmZpZy5jaGFubmVscz8ud2ViZXggPz8ge307XG5cbiAgICAgIGlmIChhY2NvdW50SWQgPT09IERFRkFVTFRfQUNDT1VOVF9JRCkge1xuICAgICAgICBjb25zdCB7IHRva2VuLCB3ZWJob29rVXJsLCB3ZWJob29rU2VjcmV0LCBkbVBvbGljeSwgYWxsb3dGcm9tLCAuLi5yZXN0IH0gPSBzZWN0aW9uO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBjaGFubmVsczoge1xuICAgICAgICAgICAgLi4uY29uZmlnLmNoYW5uZWxzLFxuICAgICAgICAgICAgd2ViZXg6IHJlc3QsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNjb3VudHMgPSB7IC4uLnNlY3Rpb24uYWNjb3VudHMgfTtcbiAgICAgIGRlbGV0ZSBhY2NvdW50c1thY2NvdW50SWRdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmNoYW5uZWxzLFxuICAgICAgICAgIHdlYmV4OiB7XG4gICAgICAgICAgICAuLi5zZWN0aW9uLFxuICAgICAgICAgICAgYWNjb3VudHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGlzQ29uZmlndXJlZDogKGFjY291bnQpID0+IGFjY291bnQuY29uZmlndXJlZCxcblxuICAgIGRlc2NyaWJlQWNjb3VudDogKGFjY291bnQpID0+ICh7XG4gICAgICBhY2NvdW50SWQ6IGFjY291bnQuYWNjb3VudElkLFxuICAgICAgbmFtZTogYWNjb3VudC5uYW1lLFxuICAgICAgZW5hYmxlZDogYWNjb3VudC5lbmFibGVkLFxuICAgICAgY29uZmlndXJlZDogYWNjb3VudC5jb25maWd1cmVkLFxuICAgICAgYmFzZVVybDogYWNjb3VudC5jb25maWcuYXBpQmFzZVVybCA/PyBcImh0dHBzOi8vd2ViZXhhcGlzLmNvbS92MVwiLFxuICAgIH0pLFxuXG4gICAgcmVzb2x2ZUFsbG93RnJvbTogKHsgY2ZnIH0pID0+XG4gICAgICAoKGNmZyBhcyBDb3JlQ29uZmlnKS5jaGFubmVscz8ud2ViZXg/LmFsbG93RnJvbSA/PyBbXSkubWFwKFN0cmluZyksXG5cbiAgICBmb3JtYXRBbGxvd0Zyb206ICh7IGFsbG93RnJvbSB9KSA9PlxuICAgICAgYWxsb3dGcm9tLm1hcCgoZW50cnkpID0+IGVudHJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgfSxcblxuICBzZWN1cml0eToge1xuICAgIHJlc29sdmVEbVBvbGljeTogKHsgYWNjb3VudCB9KSA9PiB7XG4gICAgICBjb25zdCBwb2xpY3kgPSBhY2NvdW50LmNvbmZpZy5kbVBvbGljeSA/PyBcImFsbG93XCI7XG4gICAgICAvLyBNYXAgXCJhbGxvd2xpc3RlZFwiIHRvIFwiYWxsb3dsaXN0XCIgZm9yIE9wZW5DbGF3IGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQb2xpY3kgPSBwb2xpY3kgPT09IFwiYWxsb3dsaXN0ZWRcIiA/IFwiYWxsb3dsaXN0XCIgOiBwb2xpY3k7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvbGljeTogbm9ybWFsaXplZFBvbGljeSBhcyBcImFsbG93XCIgfCBcImRlbnlcIiB8IFwiYWxsb3dsaXN0XCIgfCBcInBhaXJpbmdcIixcbiAgICAgICAgYWxsb3dGcm9tOiBhY2NvdW50LmNvbmZpZy5hbGxvd0Zyb20gPz8gW10sXG4gICAgICAgIHBvbGljeVBhdGg6IFwiY2hhbm5lbHMud2ViZXguZG1Qb2xpY3lcIixcbiAgICAgICAgYWxsb3dGcm9tUGF0aDogXCJjaGFubmVscy53ZWJleC5hbGxvd0Zyb21cIixcbiAgICAgICAgYXBwcm92ZUhpbnQ6IFwiQWRkIHVzZXIgSUQgb3IgZW1haWwgdG8gY2hhbm5lbHMud2ViZXguYWxsb3dGcm9tXCIsXG4gICAgICAgIG5vcm1hbGl6ZUVudHJ5OiAocmF3KSA9PiByYXcudHJpbSgpLnRvTG93ZXJDYXNlKCksXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG5cbiAgdGhyZWFkaW5nOiB7XG4gICAgcmVzb2x2ZVJlcGx5VG9Nb2RlOiAoKSA9PiBcIm9mZlwiLFxuICAgIGJ1aWxkVG9vbENvbnRleHQ6ICh7IGNvbnRleHQsIGhhc1JlcGxpZWRSZWYgfSkgPT4gKHtcbiAgICAgIGN1cnJlbnRDaGFubmVsSWQ6IGNvbnRleHQuVG8/LnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICBjdXJyZW50VGhyZWFkVHM6IGNvbnRleHQuTWVzc2FnZVRocmVhZElkICE9IG51bGxcbiAgICAgICAgPyBTdHJpbmcoY29udGV4dC5NZXNzYWdlVGhyZWFkSWQpXG4gICAgICAgIDogY29udGV4dC5SZXBseVRvSWQsXG4gICAgICBoYXNSZXBsaWVkUmVmLFxuICAgIH0pLFxuICB9LFxuXG4gIG1lc3NhZ2luZzoge1xuICAgIG5vcm1hbGl6ZVRhcmdldDogKHJhdzogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgbm9ybWFsaXplZCA9IHJhdy50cmltKCk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAobm9ybWFsaXplZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJ3ZWJleDpcIikpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc2xpY2UoXCJ3ZWJleDpcIi5sZW5ndGgpLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub3JtYWxpemVkIHx8IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHRhcmdldFJlc29sdmVyOiB7XG4gICAgICBsb29rc0xpa2VJZDogKHJhdykgPT4ge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcmF3LnRyaW0oKTtcbiAgICAgICAgaWYgKCF0cmltbWVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIFdlYmV4IElEcyBhcmUgYmFzZTY0LWVuY29kZWQgYW5kIHN0YXJ0IHdpdGggYSBzcGVjaWZpYyBwcmVmaXhcbiAgICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aChcIlkybHpZMjl6Y0dGeWF6b3ZMM1wiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEFsc28gYWNjZXB0IGVtYWlsc1xuICAgICAgICByZXR1cm4gdHJpbW1lZC5pbmNsdWRlcyhcIkBcIik7XG4gICAgICB9LFxuICAgICAgaGludDogXCI8cm9vbUlkfHBlcnNvbklkfGVtYWlsPlwiLFxuICAgIH0sXG4gIH0sXG5cbiAgb3V0Ym91bmQ6IHtcbiAgICBkZWxpdmVyeU1vZGU6IFwiZGlyZWN0XCIsXG4gICAgdGV4dENodW5rTGltaXQ6IDcwMDAsIC8vIFdlYmV4IGhhcyBhIDc0MzkgYnl0ZSBsaW1pdFxuXG4gICAgc2VuZFRleHQ6IGFzeW5jICh7IHRvLCB0ZXh0LCBhY2NvdW50LCByZXBseVRvSWQgfSkgPT4ge1xuICAgICAgY29uc3Qgc2VuZGVyID0gbmV3IFdlYmV4U2VuZGVyKGFjY291bnQuY29uZmlnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VuZGVyLnNlbmQoe1xuICAgICAgICB0byxcbiAgICAgICAgY29udGVudDogeyB0ZXh0IH0sXG4gICAgICAgIHBhcmVudElkOiByZXBseVRvSWQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbDogXCJ3ZWJleFwiLFxuICAgICAgICBtZXNzYWdlSWQ6IHJlc3VsdC5pZCxcbiAgICAgICAgcm9vbUlkOiByZXN1bHQucm9vbUlkLFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgc2VuZE1lZGlhOiBhc3luYyAoeyB0bywgdGV4dCwgbWVkaWFVcmwsIGFjY291bnQsIHJlcGx5VG9JZCB9KSA9PiB7XG4gICAgICBjb25zdCBzZW5kZXIgPSBuZXcgV2ViZXhTZW5kZXIoYWNjb3VudC5jb25maWcpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZW5kZXIuc2VuZCh7XG4gICAgICAgIHRvLFxuICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBmaWxlczogbWVkaWFVcmwgPyBbbWVkaWFVcmxdIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICBwYXJlbnRJZDogcmVwbHlUb0lkLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5uZWw6IFwid2ViZXhcIixcbiAgICAgICAgbWVzc2FnZUlkOiByZXN1bHQuaWQsXG4gICAgICAgIHJvb21JZDogcmVzdWx0LnJvb21JZCxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICBzdGF0dXM6IHtcbiAgICBkZWZhdWx0UnVudGltZToge1xuICAgICAgYWNjb3VudElkOiBERUZBVUxUX0FDQ09VTlRfSUQsXG4gICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgIGxhc3RTdGFydEF0OiBudWxsLFxuICAgICAgbGFzdFN0b3BBdDogbnVsbCxcbiAgICAgIGxhc3RFcnJvcjogbnVsbCxcbiAgICB9LFxuXG4gICAgY29sbGVjdFN0YXR1c0lzc3VlczogKGFjY291bnRzKSA9PlxuICAgICAgYWNjb3VudHMuZmxhdE1hcCgoYWNjb3VudCkgPT4ge1xuICAgICAgICBjb25zdCBsYXN0RXJyb3IgPSB0eXBlb2YgYWNjb3VudC5sYXN0RXJyb3IgPT09IFwic3RyaW5nXCIgPyBhY2NvdW50Lmxhc3RFcnJvci50cmltKCkgOiBcIlwiO1xuICAgICAgICBpZiAoIWxhc3RFcnJvcikgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNoYW5uZWw6IFwid2ViZXhcIixcbiAgICAgICAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQsXG4gICAgICAgICAgICBraW5kOiBcInJ1bnRpbWVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDaGFubmVsIGVycm9yOiAke2xhc3RFcnJvcn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9KSxcblxuICAgIGJ1aWxkQ2hhbm5lbFN1bW1hcnk6ICh7IHNuYXBzaG90IH0pID0+ICh7XG4gICAgICBjb25maWd1cmVkOiAoc25hcHNob3QuY29uZmlndXJlZCA/PyBmYWxzZSkgYXMgYm9vbGVhbixcbiAgICAgIGJhc2VVcmw6IChzbmFwc2hvdC5iYXNlVXJsID8/IG51bGwpIGFzIHN0cmluZyB8IG51bGwsXG4gICAgICBydW5uaW5nOiAoc25hcHNob3QucnVubmluZyA/PyBmYWxzZSkgYXMgYm9vbGVhbixcbiAgICAgIGxhc3RTdGFydEF0OiAoc25hcHNob3QubGFzdFN0YXJ0QXQgPz8gbnVsbCkgYXMgRGF0ZSB8IG51bGwsXG4gICAgICBsYXN0U3RvcEF0OiAoc25hcHNob3QubGFzdFN0b3BBdCA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCxcbiAgICAgIGxhc3RFcnJvcjogKHNuYXBzaG90Lmxhc3RFcnJvciA/PyBudWxsKSBhcyBzdHJpbmcgfCBudWxsLFxuICAgIH0pLFxuXG4gICAgcHJvYmVBY2NvdW50OiBhc3luYyAoeyBhY2NvdW50LCB0aW1lb3V0TXMgfSkgPT4ge1xuICAgICAgaWYgKCFhY2NvdW50LmNvbmZpZ3VyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IFwiQWNjb3VudCBub3QgY29uZmlndXJlZFwiLFxuICAgICAgICAgIGVsYXBzZWRNczogMCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBgJHthY2NvdW50LmNvbmZpZy5hcGlCYXNlVXJsID8/IFwiaHR0cHM6Ly93ZWJleGFwaXMuY29tL3YxXCJ9L3Blb3BsZS9tZWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjb3VudC5jb25maWcudG9rZW59YCxcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmFsOiB0aW1lb3V0TXMgPyBBYm9ydFNpZ25hbC50aW1lb3V0KHRpbWVvdXRNcykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydDtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuICAgICAgICAgICAgZWxhcHNlZE1zLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZWxhcHNlZE1zIH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYnVpbGRBY2NvdW50U25hcHNob3Q6ICh7IGFjY291bnQsIHJ1bnRpbWUsIHByb2JlIH0pID0+ICh7XG4gICAgICBhY2NvdW50SWQ6IGFjY291bnQuYWNjb3VudElkLFxuICAgICAgbmFtZTogYWNjb3VudC5uYW1lLFxuICAgICAgZW5hYmxlZDogYWNjb3VudC5lbmFibGVkLFxuICAgICAgY29uZmlndXJlZDogYWNjb3VudC5jb25maWd1cmVkLFxuICAgICAgYmFzZVVybDogYWNjb3VudC5jb25maWcuYXBpQmFzZVVybCA/PyBcImh0dHBzOi8vd2ViZXhhcGlzLmNvbS92MVwiLFxuICAgICAgcnVubmluZzogcnVudGltZT8ucnVubmluZyA/PyBmYWxzZSxcbiAgICAgIGxhc3RTdGFydEF0OiBydW50aW1lPy5sYXN0U3RhcnRBdCA/PyBudWxsLFxuICAgICAgbGFzdFN0b3BBdDogcnVudGltZT8ubGFzdFN0b3BBdCA/PyBudWxsLFxuICAgICAgbGFzdEVycm9yOiBydW50aW1lPy5sYXN0RXJyb3IgPz8gbnVsbCxcbiAgICAgIHByb2JlLFxuICAgICAgbGFzdFByb2JlQXQ6IHJ1bnRpbWU/Lmxhc3RQcm9iZUF0ID8/IG51bGwsXG4gICAgfSksXG4gIH0sXG5cbiAgZ2F0ZXdheToge1xuICAgIHN0YXJ0QWNjb3VudDogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgY29uc3QgeyBhY2NvdW50LCBydW50aW1lLCBsb2csIHNldFN0YXR1cyB9ID0gY3R4O1xuXG4gICAgICBzZXRTdGF0dXMoe1xuICAgICAgICBhY2NvdW50SWQ6IGFjY291bnQuYWNjb3VudElkLFxuICAgICAgICBiYXNlVXJsOiBhY2NvdW50LmNvbmZpZy5hcGlCYXNlVXJsID8/IFwiaHR0cHM6Ly93ZWJleGFwaXMuY29tL3YxXCIsXG4gICAgICB9KTtcblxuICAgICAgbG9nPy5pbmZvPy4oXG4gICAgICAgIGBbJHthY2NvdW50LmFjY291bnRJZH1dIHN0YXJ0aW5nIFdlYmV4IHByb3ZpZGVyICh3ZWJob29rIG1vZGUpYFxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3ZWJob29rIGhhbmRsZXJcbiAgICAgIGNvbnN0IHdlYmhvb2tIYW5kbGVyID0gbmV3IFdlYmV4V2ViaG9va0hhbmRsZXIoYWNjb3VudC5jb25maWcpO1xuICAgICAgYXdhaXQgd2ViaG9va0hhbmRsZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAvLyBSZWdpc3RlciB3ZWJob29rcyB3aXRoIFdlYmV4XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3ZWJob29rSGFuZGxlci5yZWdpc3RlcldlYmhvb2tzKCk7XG4gICAgICAgIGxvZz8uaW5mbz8uKGBbJHthY2NvdW50LmFjY291bnRJZH1dIHdlYmhvb2tzIHJlZ2lzdGVyZWRgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2c/Lndhcm4/LihcbiAgICAgICAgICBgWyR7YWNjb3VudC5hY2NvdW50SWR9XSBmYWlsZWQgdG8gcmVnaXN0ZXIgd2ViaG9va3M6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdGVyIEhUVFAgaGFuZGxlciBmb3IgaW5jb21pbmcgd2ViaG9va3NcbiAgICAgIGNvbnN0IHdlYmhvb2tQYXRoID0gYC93ZWJob29rcy93ZWJleC8ke2FjY291bnQuYWNjb3VudElkfWA7XG5cbiAgICAgIHJ1bnRpbWUuaHR0cC5yZWdpc3RlckhhbmRsZXIoe1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBwYXRoOiB3ZWJob29rUGF0aCxcbiAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzaWduYXR1cmUgPSByZXEuaGVhZGVyc1tcIngtc3Bhcmstc2lnbmF0dXJlXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSByZXEuYm9keSBhcyBXZWJleFdlYmhvb2tQYXlsb2FkO1xuXG4gICAgICAgICAgICBjb25zdCBlbnZlbG9wZSA9IGF3YWl0IHdlYmhvb2tIYW5kbGVyLmhhbmRsZVdlYmhvb2socGF5bG9hZCwgc2lnbmF0dXJlKTtcblxuICAgICAgICAgICAgaWYgKGVudmVsb3BlKSB7XG4gICAgICAgICAgICAgIC8vIEZvcndhcmQgdG8gT3BlbkNsYXcncyBtZXNzYWdlIHBpcGVsaW5lXG4gICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUubWVzc2FnaW5nLmhhbmRsZUluYm91bmQoe1xuICAgICAgICAgICAgICAgIGNoYW5uZWw6IFwid2ViZXhcIixcbiAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IGFjY291bnQuYWNjb3VudElkLFxuICAgICAgICAgICAgICAgIHNlbmRlcklkOiBlbnZlbG9wZS5hdXRob3IuaWQsXG4gICAgICAgICAgICAgICAgc2VuZGVyRW1haWw6IGVudmVsb3BlLmF1dGhvci5lbWFpbCxcbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogZW52ZWxvcGUuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBlbnZlbG9wZS5pZCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBlbnZlbG9wZS5jb250ZW50LnRleHQgPz8gXCJcIixcbiAgICAgICAgICAgICAgICByb29tVHlwZTogZW52ZWxvcGUubWV0YWRhdGEucm9vbVR5cGUsXG4gICAgICAgICAgICAgICAgdGhyZWFkSWQ6IGVudmVsb3BlLm1ldGFkYXRhLnBhcmVudElkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoZW52ZWxvcGUubWV0YWRhdGEudGltZXN0YW1wKSxcbiAgICAgICAgICAgICAgICByYXc6IGVudmVsb3BlLm1ldGFkYXRhLnJhdyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMjAwLCBib2R5OiB7IG9rOiB0cnVlIH0gfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZz8uZXJyb3I/LihcbiAgICAgICAgICAgICAgYFske2FjY291bnQuYWNjb3VudElkfV0gd2ViaG9vayBlcnJvcjogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDUwMCwgYm9keTogeyBlcnJvcjogXCJJbnRlcm5hbCBlcnJvclwiIH0gfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbG9nPy5pbmZvPy4oXG4gICAgICAgIGBbJHthY2NvdW50LmFjY291bnRJZH1dIEhUVFAgd2ViaG9vayBoYW5kbGVyIHJlZ2lzdGVyZWQgYXQgJHt3ZWJob29rUGF0aH1gXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgbG9nPy5pbmZvPy4oYFske2FjY291bnQuYWNjb3VudElkfV0gc3RvcHBpbmcgV2ViZXggcHJvdmlkZXJgKTtcbiAgICAgICAgcnVudGltZS5odHRwLnVucmVnaXN0ZXJIYW5kbGVyKHdlYmhvb2tQYXRoKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcbn07XG4iXX0=
|
|
537
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2hhbm5lbC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQWdCSCw0Q0FFQztBQXVFRCxnRUFTQztBQWtDRCxvREE0R0M7QUF2T0QsaUNBQXFDO0FBQ3JDLHVDQUFnRDtBQUdoRCxvREFBb0Q7QUFDcEQsSUFBSSxhQUFhLEdBQXlCLElBQUksQ0FBQztBQUUvQyxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFzQjtJQUNyRCxhQUFhLEdBQUcsT0FBTyxDQUFDO0FBQzFCLENBQUM7QUFrREQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUM7QUFTckMsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7QUFFN0QsU0FBUyxvQkFBb0IsQ0FBQyxHQUFXO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNwRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FDeEMsSUFBWSxFQUNaLE1BQTBCO0lBRTFCLE1BQU0sR0FBRyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLGNBQWMsQ0FBQyxHQUFHLENB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QyxNQUFNO2dCQUN0QixjQUFjO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsR0FBRyxFQUFFLElBQUksRUFBRSxDQUNULElBQUksT0FBTyxDQUFDLFNBQVMsd0NBQXdDLFdBQVcsRUFBRSxDQUMzRSxDQUFDO1lBRUYsMEJBQTBCO1lBQzFCLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ2hCLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixDQUFDLENBQUM7Z0JBQzlELFVBQVUsRUFBRSxDQUFDO1lBQ2YsQ0FBQyxDQUFDO1FBQ0osQ0FBQztLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkNsYXcgQ2hhbm5lbCBQbHVnaW4gZm9yIFdlYmV4XG4gKlxuICogSW1wbGVtZW50cyB0aGUgQ2hhbm5lbFBsdWdpbiBpbnRlcmZhY2UgZm9yIE9wZW5DbGF3J3MgcGx1Z2luIHN5c3RlbS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ2hhbm5lbFBsdWdpbixcbiAgUGx1Z2luUnVudGltZSxcbn0gZnJvbSBcIm9wZW5jbGF3L3BsdWdpbi1zZGtcIjtcblxuaW1wb3J0IHsgV2ViZXhTZW5kZXIgfSBmcm9tIFwiLi9zZW5kXCI7XG5pbXBvcnQgeyBXZWJleFdlYmhvb2tIYW5kbGVyIH0gZnJvbSBcIi4vd2ViaG9va1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJleENoYW5uZWxDb25maWcsIFdlYmV4V2ViaG9va1BheWxvYWQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vLyBTdG9yZSB0aGUgcGx1Z2luIHJ1bnRpbWUgZm9yIHVzZSBpbiBIVFRQIGhhbmRsZXJzXG5sZXQgcGx1Z2luUnVudGltZTogUGx1Z2luUnVudGltZSB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0UGx1Z2luUnVudGltZShydW50aW1lOiBQbHVnaW5SdW50aW1lKTogdm9pZCB7XG4gIHBsdWdpblJ1bnRpbWUgPSBydW50aW1lO1xufVxuXG4vKiogUmVzb2x2ZWQgYWNjb3VudCBjb25maWd1cmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkV2ViZXhBY2NvdW50IHtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIGNvbmZpZ3VyZWQ6IGJvb2xlYW47XG4gIGNvbmZpZzogV2ViZXhDaGFubmVsQ29uZmlnO1xuICB0b2tlbj86IHN0cmluZztcbiAgd2ViaG9va1VybD86IHN0cmluZztcbn1cblxuLyoqIENvcmUgY29uZmlnIHR5cGUgZm9yIGFjY2Vzc2luZyBjaGFubmVscy53ZWJleCAqL1xuaW50ZXJmYWNlIENvcmVDb25maWcge1xuICBjaGFubmVscz86IHtcbiAgICB3ZWJleD86IFdlYmV4Q2hhbm5lbFNlY3Rpb247XG4gICAgZGVmYXVsdHM/OiB7XG4gICAgICBncm91cFBvbGljeT86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgV2ViZXhDaGFubmVsU2VjdGlvbiB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBuYW1lPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgd2ViaG9va1VybD86IHN0cmluZztcbiAgd2ViaG9va1NlY3JldD86IHN0cmluZztcbiAgZG1Qb2xpY3k/OiBcImFsbG93XCIgfCBcImRlbnlcIiB8IFwiYWxsb3dsaXN0ZWRcIiB8IFwicGFpcmluZ1wiO1xuICBhbGxvd0Zyb20/OiBzdHJpbmdbXTtcbiAgYXBpQmFzZVVybD86IHN0cmluZztcbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgcmV0cnlEZWxheU1zPzogbnVtYmVyO1xuICBhY2NvdW50cz86IFJlY29yZDxzdHJpbmcsIFdlYmV4QWNjb3VudENvbmZpZz47XG59XG5cbmludGVyZmFjZSBXZWJleEFjY291bnRDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgbmFtZT86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHdlYmhvb2tVcmw/OiBzdHJpbmc7XG4gIHdlYmhvb2tTZWNyZXQ/OiBzdHJpbmc7XG4gIGRtUG9saWN5PzogXCJhbGxvd1wiIHwgXCJkZW55XCIgfCBcImFsbG93bGlzdGVkXCIgfCBcInBhaXJpbmdcIjtcbiAgYWxsb3dGcm9tPzogc3RyaW5nW107XG4gIGFwaUJhc2VVcmw/OiBzdHJpbmc7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHJldHJ5RGVsYXlNcz86IG51bWJlcjtcbn1cblxuY29uc3QgREVGQVVMVF9BQ0NPVU5UX0lEID0gXCJkZWZhdWx0XCI7XG5cbi8qKiBXZWJob29rIHRhcmdldCByZWdpc3RyYXRpb24gZm9yIEhUVFAgaGFuZGxlciAqL1xudHlwZSBXZWJleFdlYmhvb2tUYXJnZXQgPSB7XG4gIGFjY291bnQ6IFJlc29sdmVkV2ViZXhBY2NvdW50O1xuICBjb25maWc6IFdlYmV4Q2hhbm5lbENvbmZpZztcbiAgd2ViaG9va0hhbmRsZXI6IFdlYmV4V2ViaG9va0hhbmRsZXI7XG59O1xuXG5jb25zdCB3ZWJob29rVGFyZ2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBXZWJleFdlYmhvb2tUYXJnZXQ+KCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdlYmhvb2tQYXRoKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IHJhdy50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIFwiL1wiO1xuICBjb25zdCB3aXRoU2xhc2ggPSB0cmltbWVkLnN0YXJ0c1dpdGgoXCIvXCIpID8gdHJpbW1lZCA6IGAvJHt0cmltbWVkfWA7XG4gIGlmICh3aXRoU2xhc2gubGVuZ3RoID4gMSAmJiB3aXRoU2xhc2guZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHdpdGhTbGFzaC5zbGljZSgwLCAtMSk7XG4gIH1cbiAgcmV0dXJuIHdpdGhTbGFzaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyV2ViZXhXZWJob29rVGFyZ2V0KFxuICBwYXRoOiBzdHJpbmcsXG4gIHRhcmdldDogV2ViZXhXZWJob29rVGFyZ2V0XG4pOiAoKSA9PiB2b2lkIHtcbiAgY29uc3Qga2V5ID0gbm9ybWFsaXplV2ViaG9va1BhdGgocGF0aCk7XG4gIHdlYmhvb2tUYXJnZXRzLnNldChrZXksIHRhcmdldCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgd2ViaG9va1RhcmdldHMuZGVsZXRlKGtleSk7XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRKc29uQm9keShyZXE6IEluY29taW5nTWVzc2FnZSwgbWF4Qnl0ZXM6IG51bWJlcik6IFByb21pc2U8eyBvazogYm9vbGVhbjsgdmFsdWU/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgbGV0IHRvdGFsID0gMDtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmVxLm9uKFwiZGF0YVwiLCAoY2h1bms6IEJ1ZmZlcikgPT4ge1xuICAgICAgdG90YWwgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKHRvdGFsID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgcmVzb2x2ZSh7IG9rOiBmYWxzZSwgZXJyb3I6IFwicGF5bG9hZCB0b28gbGFyZ2VcIiB9KTtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH0pO1xuICAgIHJlcS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgIHJlc29sdmUoeyBvazogdHJ1ZSwgdmFsdWU6IHBhcnNlZCB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXNvbHZlKHsgb2s6IGZhbHNlLCBlcnJvcjogXCJpbnZhbGlkIGpzb25cIiB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXEub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICByZXNvbHZlKHsgb2s6IGZhbHNlLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgd2ViaG9vayBoYW5kbGVyIHdpdGggYWNjZXNzIHRvIHRoZSBwbHVnaW4gcnVudGltZS5cbiAqIFJldHVybnMgYSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgaW5jb21pbmcgV2ViZXggd2ViaG9vayByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2tIYW5kbGVyKCk6IChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSkgPT4gUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBhc3luYyAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwgPz8gXCIvXCIsIFwiaHR0cDovL2xvY2FsaG9zdFwiKTtcbiAgICBjb25zdCBwYXRoID0gbm9ybWFsaXplV2ViaG9va1BhdGgodXJsLnBhdGhuYW1lKTtcblxuICAgIC8vIENoZWNrIGlmIHBhdGggbWF0Y2hlcyAvd2ViaG9va3Mvd2ViZXgvKlxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL3dlYmhvb2tzL3dlYmV4L1wiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IHdlYmhvb2tUYXJnZXRzLmdldChwYXRoKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChyZXEubWV0aG9kICE9PSBcIlBPU1RcIikge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDU7XG4gICAgICByZXMuc2V0SGVhZGVyKFwiQWxsb3dcIiwgXCJQT1NUXCIpO1xuICAgICAgcmVzLmVuZChcIk1ldGhvZCBOb3QgQWxsb3dlZFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkSnNvbkJvZHkocmVxLCAxMDI0ICogMTAyNCk7XG4gICAgaWYgKCFib2R5Lm9rKSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IGJvZHkuZXJyb3IgPT09IFwicGF5bG9hZCB0b28gbGFyZ2VcIiA/IDQxMyA6IDQwMDtcbiAgICAgIHJlcy5lbmQoYm9keS5lcnJvciA/PyBcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYWNjb3VudCwgd2ViaG9va0hhbmRsZXIgfSA9IHRhcmdldDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSByZXEuaGVhZGVyc1tcIngtc3Bhcmstc2lnbmF0dXJlXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBib2R5LnZhbHVlIGFzIFdlYmV4V2ViaG9va1BheWxvYWQ7XG5cbiAgICAgIGNvbnN0IGVudmVsb3BlID0gYXdhaXQgd2ViaG9va0hhbmRsZXIuaGFuZGxlV2ViaG9vayhwYXlsb2FkLCBzaWduYXR1cmUpO1xuXG4gICAgICBpZiAoZW52ZWxvcGUgJiYgcGx1Z2luUnVudGltZSkge1xuICAgICAgICAvLyBMb2FkIGNvbmZpZyB1c2luZyB0aGUgcGx1Z2luIHJ1bnRpbWUgKGNhc3QgdG8gYW55IGZvciBpbnRlcm5hbCBBUEkgYWNjZXNzKVxuICAgICAgICBjb25zdCBydW50aW1lID0gcGx1Z2luUnVudGltZSBhcyBhbnk7XG4gICAgICAgIGNvbnN0IGNmZyA9IHJ1bnRpbWUuY29uZmlnPy5sb2FkQ29uZmlnPy4oKSA/PyB7fTtcbiAgICAgICAgXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBjb250ZXh0IHBheWxvYWQgZm9yIE9wZW5DbGF3J3MgbWVzc2FnZSBwaXBlbGluZVxuICAgICAgICBjb25zdCBjdHhQYXlsb2FkID0ge1xuICAgICAgICAgIEJvZHk6IGVudmVsb3BlLmNvbnRlbnQudGV4dCA/PyBcIlwiLFxuICAgICAgICAgIFJhd0JvZHk6IGVudmVsb3BlLmNvbnRlbnQudGV4dCA/PyBcIlwiLFxuICAgICAgICAgIENvbW1hbmRCb2R5OiBlbnZlbG9wZS5jb250ZW50LnRleHQgPz8gXCJcIixcbiAgICAgICAgICBGcm9tOiBgd2ViZXg6JHtlbnZlbG9wZS5hdXRob3IuaWR9YCxcbiAgICAgICAgICBUbzogYHdlYmV4OiR7ZW52ZWxvcGUuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgICBTZXNzaW9uS2V5OiBgYWdlbnQ6bWFpbjp3ZWJleDoke2VudmVsb3BlLmNvbnZlcnNhdGlvbklkfWAsXG4gICAgICAgICAgQWNjb3VudElkOiBhY2NvdW50LmFjY291bnRJZCxcbiAgICAgICAgICBDaGF0VHlwZTogZW52ZWxvcGUubWV0YWRhdGEucm9vbVR5cGUgPT09IFwiZGlyZWN0XCIgPyBcImRpcmVjdFwiIDogXCJncm91cFwiLFxuICAgICAgICAgIFNlbmRlck5hbWU6IGVudmVsb3BlLmF1dGhvci5kaXNwbGF5TmFtZSA/PyBlbnZlbG9wZS5hdXRob3IuZW1haWwgPz8gZW52ZWxvcGUuYXV0aG9yLmlkLFxuICAgICAgICAgIFNlbmRlcklkOiBlbnZlbG9wZS5hdXRob3IuaWQsXG4gICAgICAgICAgUHJvdmlkZXI6IFwid2ViZXhcIixcbiAgICAgICAgICBTdXJmYWNlOiBcIndlYmV4XCIsXG4gICAgICAgICAgTWVzc2FnZVNpZDogZW52ZWxvcGUuaWQsXG4gICAgICAgICAgVGltZXN0YW1wOiBlbnZlbG9wZS5tZXRhZGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgT3JpZ2luYXRpbmdDaGFubmVsOiBcIndlYmV4XCIsXG4gICAgICAgICAgT3JpZ2luYXRpbmdUbzogYHdlYmV4OiR7ZW52ZWxvcGUuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgICBNZXNzYWdlVGhyZWFkSWQ6IGVudmVsb3BlLm1ldGFkYXRhLnBhcmVudElkLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVzZSB0aGUgcGx1Z2luIHJ1bnRpbWUncyBkaXNwYXRjaCBmdW5jdGlvbiAoY2FzdCB0byBhbnkgZm9yIGludGVybmFsIEFQSSlcbiAgICAgICAgY29uc3QgZGlzcGF0Y2hSZXBseSA9IHJ1bnRpbWUuY2hhbm5lbD8ucmVwbHk/LmRpc3BhdGNoUmVwbHlXaXRoQnVmZmVyZWRCbG9ja0Rpc3BhdGNoZXI7XG4gICAgICAgIFxuICAgICAgICBpZiAoZGlzcGF0Y2hSZXBseSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIHNlbmRlciBmb3IgcmVwbGllc1xuICAgICAgICAgIGNvbnN0IHNlbmRlciA9IG5ldyBXZWJleFNlbmRlcihhY2NvdW50LmNvbmZpZyk7XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgZGlzcGF0Y2hSZXBseSh7XG4gICAgICAgICAgICBjdHg6IGN0eFBheWxvYWQsXG4gICAgICAgICAgICBjZmcsXG4gICAgICAgICAgICBkaXNwYXRjaGVyT3B0aW9uczoge1xuICAgICAgICAgICAgICBkZWxpdmVyOiBhc3luYyAocGF5bG9hZDogeyB0ZXh0Pzogc3RyaW5nOyBtZWRpYT86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQudGV4dCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgc2VuZGVyLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICB0bzogZW52ZWxvcGUuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHsgdGV4dDogcGF5bG9hZC50ZXh0IH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudElkOiBlbnZlbG9wZS5tZXRhZGF0YS5wYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb25FcnJvcjogKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbd2ViZXg6JHthY2NvdW50LmFjY291bnRJZH1dIHJlcGx5IGRpc3BhdGNoIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcGx5T3B0aW9uczoge30sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbd2ViZXg6JHthY2NvdW50LmFjY291bnRJZH1dIGRpc3BhdGNoUmVwbHkgbm90IGF2YWlsYWJsZSBpbiBwbHVnaW4gcnVudGltZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KHsgb2s6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW3dlYmV4OiR7YWNjb3VudC5hY2NvdW50SWR9XSB3ZWJob29rIGVycm9yOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9YFxuICAgICAgKTtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IFwiSW50ZXJuYWwgZXJyb3JcIiB9KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGxpc3RXZWJleEFjY291bnRJZHMoY2ZnOiBDb3JlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBzZWN0aW9uID0gY2ZnLmNoYW5uZWxzPy53ZWJleDtcbiAgaWYgKCFzZWN0aW9uKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIENoZWNrIGZvciB0b3AtbGV2ZWwgY29uZmlnIChkZWZhdWx0IGFjY291bnQpXG4gIGlmIChzZWN0aW9uLnRva2VuKSB7XG4gICAgaWRzLnB1c2goREVGQVVMVF9BQ0NPVU5UX0lEKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBuYW1lZCBhY2NvdW50c1xuICBpZiAoc2VjdGlvbi5hY2NvdW50cykge1xuICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXMoc2VjdGlvbi5hY2NvdW50cykpIHtcbiAgICAgIGlmIChpZCAhPT0gREVGQVVMVF9BQ0NPVU5UX0lEKSB7XG4gICAgICAgIGlkcy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaWRzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlV2ViZXhBY2NvdW50KG9wdHM6IHtcbiAgY2ZnOiBDb3JlQ29uZmlnO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG59KTogUmVzb2x2ZWRXZWJleEFjY291bnQge1xuICBjb25zdCB7IGNmZywgYWNjb3VudElkID0gREVGQVVMVF9BQ0NPVU5UX0lEIH0gPSBvcHRzO1xuICBjb25zdCBzZWN0aW9uID0gY2ZnLmNoYW5uZWxzPy53ZWJleDtcblxuICBpZiAoIXNlY3Rpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudElkLFxuICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICBjb25maWd1cmVkOiBmYWxzZSxcbiAgICAgIGNvbmZpZzoge30gYXMgV2ViZXhDaGFubmVsQ29uZmlnLFxuICAgIH07XG4gIH1cblxuICAvLyBDaGVjayBmb3IgbmFtZWQgYWNjb3VudCBmaXJzdFxuICBjb25zdCBuYW1lZEFjY291bnQgPSBzZWN0aW9uLmFjY291bnRzPy5bYWNjb3VudElkXTtcblxuICBpZiAobmFtZWRBY2NvdW50KSB7XG4gICAgY29uc3QgdG9rZW4gPSBuYW1lZEFjY291bnQudG9rZW4gPz8gc2VjdGlvbi50b2tlbjtcbiAgICBjb25zdCB3ZWJob29rVXJsID0gbmFtZWRBY2NvdW50LndlYmhvb2tVcmwgPz8gc2VjdGlvbi53ZWJob29rVXJsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRJZCxcbiAgICAgIG5hbWU6IG5hbWVkQWNjb3VudC5uYW1lLFxuICAgICAgZW5hYmxlZDogbmFtZWRBY2NvdW50LmVuYWJsZWQgIT09IGZhbHNlLFxuICAgICAgY29uZmlndXJlZDogQm9vbGVhbih0b2tlbiAmJiB3ZWJob29rVXJsKSxcbiAgICAgIHRva2VuLFxuICAgICAgd2ViaG9va1VybCxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICB0b2tlbjogdG9rZW4gPz8gXCJcIixcbiAgICAgICAgd2ViaG9va1VybDogd2ViaG9va1VybCA/PyBcIlwiLFxuICAgICAgICB3ZWJob29rU2VjcmV0OiBuYW1lZEFjY291bnQud2ViaG9va1NlY3JldCA/PyBzZWN0aW9uLndlYmhvb2tTZWNyZXQsXG4gICAgICAgIGRtUG9saWN5OiBuYW1lZEFjY291bnQuZG1Qb2xpY3kgPz8gc2VjdGlvbi5kbVBvbGljeSA/PyBcImFsbG93XCIsXG4gICAgICAgIGFsbG93RnJvbTogbmFtZWRBY2NvdW50LmFsbG93RnJvbSA/PyBzZWN0aW9uLmFsbG93RnJvbSxcbiAgICAgICAgYXBpQmFzZVVybDogbmFtZWRBY2NvdW50LmFwaUJhc2VVcmwgPz8gc2VjdGlvbi5hcGlCYXNlVXJsLFxuICAgICAgICBtYXhSZXRyaWVzOiBuYW1lZEFjY291bnQubWF4UmV0cmllcyA/PyBzZWN0aW9uLm1heFJldHJpZXMsXG4gICAgICAgIHJldHJ5RGVsYXlNczogbmFtZWRBY2NvdW50LnJldHJ5RGVsYXlNcyA/PyBzZWN0aW9uLnJldHJ5RGVsYXlNcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byB0b3AtbGV2ZWwgY29uZmlnIChkZWZhdWx0IGFjY291bnQpXG4gIGlmIChhY2NvdW50SWQgPT09IERFRkFVTFRfQUNDT1VOVF9JRCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50SWQsXG4gICAgICBuYW1lOiBzZWN0aW9uLm5hbWUsXG4gICAgICBlbmFibGVkOiBzZWN0aW9uLmVuYWJsZWQgIT09IGZhbHNlLFxuICAgICAgY29uZmlndXJlZDogQm9vbGVhbihzZWN0aW9uLnRva2VuICYmIHNlY3Rpb24ud2ViaG9va1VybCksXG4gICAgICB0b2tlbjogc2VjdGlvbi50b2tlbixcbiAgICAgIHdlYmhvb2tVcmw6IHNlY3Rpb24ud2ViaG9va1VybCxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICB0b2tlbjogc2VjdGlvbi50b2tlbiA/PyBcIlwiLFxuICAgICAgICB3ZWJob29rVXJsOiBzZWN0aW9uLndlYmhvb2tVcmwgPz8gXCJcIixcbiAgICAgICAgd2ViaG9va1NlY3JldDogc2VjdGlvbi53ZWJob29rU2VjcmV0LFxuICAgICAgICBkbVBvbGljeTogc2VjdGlvbi5kbVBvbGljeSA/PyBcImFsbG93XCIsXG4gICAgICAgIGFsbG93RnJvbTogc2VjdGlvbi5hbGxvd0Zyb20sXG4gICAgICAgIGFwaUJhc2VVcmw6IHNlY3Rpb24uYXBpQmFzZVVybCxcbiAgICAgICAgbWF4UmV0cmllczogc2VjdGlvbi5tYXhSZXRyaWVzLFxuICAgICAgICByZXRyeURlbGF5TXM6IHNlY3Rpb24ucmV0cnlEZWxheU1zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQWNjb3VudCBub3QgZm91bmRcbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50SWQsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgY29uZmlndXJlZDogZmFsc2UsXG4gICAgY29uZmlnOiB7fSBhcyBXZWJleENoYW5uZWxDb25maWcsXG4gIH07XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGlkOiBcIndlYmV4XCIsXG4gIGxhYmVsOiBcIldlYmV4XCIsXG4gIHNlbGVjdGlvbkxhYmVsOiBcIkNpc2NvIFdlYmV4XCIsXG4gIGRvY3NQYXRoOiBcIi9jaGFubmVscy93ZWJleFwiLFxuICBkb2NzTGFiZWw6IFwid2ViZXhcIixcbiAgYmx1cmI6IFwiQ2lzY28gV2ViZXggbWVzc2FnaW5nIHZpYSBib3Qgd2ViaG9va3MuXCIsXG4gIG9yZGVyOiA3NSxcbiAgYWxpYXNlczogW1wiY2lzY28td2ViZXhcIl0sXG59O1xuXG5leHBvcnQgY29uc3Qgd2ViZXhQbHVnaW46IENoYW5uZWxQbHVnaW48UmVzb2x2ZWRXZWJleEFjY291bnQ+ID0ge1xuICBpZDogXCJ3ZWJleFwiLFxuICBtZXRhLFxuXG4gIGNhcGFiaWxpdGllczoge1xuICAgIGNoYXRUeXBlczogW1wiZGlyZWN0XCIsIFwiZ3JvdXBcIl0sXG4gICAgdGhyZWFkczogdHJ1ZSxcbiAgICBtZWRpYTogdHJ1ZSxcbiAgfSxcblxuICByZWxvYWQ6IHsgY29uZmlnUHJlZml4ZXM6IFtcImNoYW5uZWxzLndlYmV4XCJdIH0sXG5cbiAgY29uZmlnOiB7XG4gICAgbGlzdEFjY291bnRJZHM6IChjZmcpID0+IGxpc3RXZWJleEFjY291bnRJZHMoY2ZnIGFzIENvcmVDb25maWcpLFxuXG4gICAgcmVzb2x2ZUFjY291bnQ6IChjZmcsIGFjY291bnRJZCkgPT5cbiAgICAgIHJlc29sdmVXZWJleEFjY291bnQoeyBjZmc6IGNmZyBhcyBDb3JlQ29uZmlnLCBhY2NvdW50SWQgfSksXG5cbiAgICBkZWZhdWx0QWNjb3VudElkOiAoKSA9PiBERUZBVUxUX0FDQ09VTlRfSUQsXG5cbiAgICBzZXRBY2NvdW50RW5hYmxlZDogKHsgY2ZnLCBhY2NvdW50SWQsIGVuYWJsZWQgfSkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gY2ZnIGFzIENvcmVDb25maWc7XG4gICAgICBjb25zdCBzZWN0aW9uID0gY29uZmlnLmNoYW5uZWxzPy53ZWJleCA/PyB7fTtcblxuICAgICAgaWYgKGFjY291bnRJZCA9PT0gREVGQVVMVF9BQ0NPVU5UX0lEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgICAgICAuLi5jb25maWcuY2hhbm5lbHMsXG4gICAgICAgICAgICB3ZWJleDoge1xuICAgICAgICAgICAgICAuLi5zZWN0aW9uLFxuICAgICAgICAgICAgICBlbmFibGVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmNoYW5uZWxzLFxuICAgICAgICAgIHdlYmV4OiB7XG4gICAgICAgICAgICAuLi5zZWN0aW9uLFxuICAgICAgICAgICAgYWNjb3VudHM6IHtcbiAgICAgICAgICAgICAgLi4uc2VjdGlvbi5hY2NvdW50cyxcbiAgICAgICAgICAgICAgW2FjY291bnRJZF06IHtcbiAgICAgICAgICAgICAgICAuLi5zZWN0aW9uLmFjY291bnRzPy5bYWNjb3VudElkXSxcbiAgICAgICAgICAgICAgICBlbmFibGVkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgZGVsZXRlQWNjb3VudDogKHsgY2ZnLCBhY2NvdW50SWQgfSkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gY2ZnIGFzIENvcmVDb25maWc7XG4gICAgICBjb25zdCBzZWN0aW9uID0gY29uZmlnLmNoYW5uZWxzPy53ZWJleCA/PyB7fTtcblxuICAgICAgaWYgKGFjY291bnRJZCA9PT0gREVGQVVMVF9BQ0NPVU5UX0lEKSB7XG4gICAgICAgIGNvbnN0IHsgdG9rZW4sIHdlYmhvb2tVcmwsIHdlYmhvb2tTZWNyZXQsIGRtUG9saWN5LCBhbGxvd0Zyb20sIC4uLnJlc3QgfSA9IHNlY3Rpb247XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgICAgICAuLi5jb25maWcuY2hhbm5lbHMsXG4gICAgICAgICAgICB3ZWJleDogcmVzdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IHsgLi4uc2VjdGlvbi5hY2NvdW50cyB9O1xuICAgICAgZGVsZXRlIGFjY291bnRzW2FjY291bnRJZF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgICAuLi5jb25maWcuY2hhbm5lbHMsXG4gICAgICAgICAgd2ViZXg6IHtcbiAgICAgICAgICAgIC4uLnNlY3Rpb24sXG4gICAgICAgICAgICBhY2NvdW50cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgaXNDb25maWd1cmVkOiAoYWNjb3VudCkgPT4gYWNjb3VudC5jb25maWd1cmVkLFxuXG4gICAgZGVzY3JpYmVBY2NvdW50OiAoYWNjb3VudCkgPT4gKHtcbiAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQsXG4gICAgICBuYW1lOiBhY2NvdW50Lm5hbWUsXG4gICAgICBlbmFibGVkOiBhY2NvdW50LmVuYWJsZWQsXG4gICAgICBjb25maWd1cmVkOiBhY2NvdW50LmNvbmZpZ3VyZWQsXG4gICAgICBiYXNlVXJsOiBhY2NvdW50LmNvbmZpZy5hcGlCYXNlVXJsID8/IFwiaHR0cHM6Ly93ZWJleGFwaXMuY29tL3YxXCIsXG4gICAgfSksXG5cbiAgICByZXNvbHZlQWxsb3dGcm9tOiAoeyBjZmcgfSkgPT5cbiAgICAgICgoY2ZnIGFzIENvcmVDb25maWcpLmNoYW5uZWxzPy53ZWJleD8uYWxsb3dGcm9tID8/IFtdKS5tYXAoU3RyaW5nKSxcblxuICAgIGZvcm1hdEFsbG93RnJvbTogKHsgYWxsb3dGcm9tIH0pID0+XG4gICAgICBhbGxvd0Zyb20ubWFwKChlbnRyeSkgPT4gZW50cnkudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFxuICB9LFxuXG4gIHNlY3VyaXR5OiB7XG4gICAgcmVzb2x2ZURtUG9saWN5OiAoeyBhY2NvdW50IH0pID0+IHtcbiAgICAgIGNvbnN0IHBvbGljeSA9IGFjY291bnQuY29uZmlnLmRtUG9saWN5ID8/IFwiYWxsb3dcIjtcbiAgICAgIC8vIE1hcCBcImFsbG93bGlzdGVkXCIgdG8gXCJhbGxvd2xpc3RcIiBmb3IgT3BlbkNsYXcgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFBvbGljeSA9IHBvbGljeSA9PT0gXCJhbGxvd2xpc3RlZFwiID8gXCJhbGxvd2xpc3RcIiA6IHBvbGljeTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9saWN5OiBub3JtYWxpemVkUG9saWN5IGFzIFwiYWxsb3dcIiB8IFwiZGVueVwiIHwgXCJhbGxvd2xpc3RcIiB8IFwicGFpcmluZ1wiLFxuICAgICAgICBhbGxvd0Zyb206IGFjY291bnQuY29uZmlnLmFsbG93RnJvbSA/PyBbXSxcbiAgICAgICAgcG9saWN5UGF0aDogXCJjaGFubmVscy53ZWJleC5kbVBvbGljeVwiLFxuICAgICAgICBhbGxvd0Zyb21QYXRoOiBcImNoYW5uZWxzLndlYmV4LmFsbG93RnJvbVwiLFxuICAgICAgICBhcHByb3ZlSGludDogXCJBZGQgdXNlciBJRCBvciBlbWFpbCB0byBjaGFubmVscy53ZWJleC5hbGxvd0Zyb21cIixcbiAgICAgICAgbm9ybWFsaXplRW50cnk6IChyYXcpID0+IHJhdy50cmltKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICB0aHJlYWRpbmc6IHtcbiAgICByZXNvbHZlUmVwbHlUb01vZGU6ICgpID0+IFwib2ZmXCIsXG4gICAgYnVpbGRUb29sQ29udGV4dDogKHsgY29udGV4dCwgaGFzUmVwbGllZFJlZiB9KSA9PiAoe1xuICAgICAgY3VycmVudENoYW5uZWxJZDogY29udGV4dC5Ubz8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIGN1cnJlbnRUaHJlYWRUczogY29udGV4dC5NZXNzYWdlVGhyZWFkSWQgIT0gbnVsbFxuICAgICAgICA/IFN0cmluZyhjb250ZXh0Lk1lc3NhZ2VUaHJlYWRJZClcbiAgICAgICAgOiBjb250ZXh0LlJlcGx5VG9JZCxcbiAgICAgIGhhc1JlcGxpZWRSZWYsXG4gICAgfSksXG4gIH0sXG5cbiAgbWVzc2FnaW5nOiB7XG4gICAgbm9ybWFsaXplVGFyZ2V0OiAocmF3OiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBub3JtYWxpemVkID0gcmF3LnRyaW0oKTtcbiAgICAgIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChub3JtYWxpemVkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcIndlYmV4OlwiKSkge1xuICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zbGljZShcIndlYmV4OlwiLmxlbmd0aCkudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgdGFyZ2V0UmVzb2x2ZXI6IHtcbiAgICAgIGxvb2tzTGlrZUlkOiAocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICBpZiAoIXRyaW1tZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gV2ViZXggSURzIGFyZSBiYXNlNjQtZW5jb2RlZCBhbmQgc3RhcnQgd2l0aCBhIHNwZWNpZmljIHByZWZpeFxuICAgICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwiWTJselkyOXpjR0Z5YXpvdkwzXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQWxzbyBhY2NlcHQgZW1haWxzXG4gICAgICAgIHJldHVybiB0cmltbWVkLmluY2x1ZGVzKFwiQFwiKTtcbiAgICAgIH0sXG4gICAgICBoaW50OiBcIjxyb29tSWR8cGVyc29uSWR8ZW1haWw+XCIsXG4gICAgfSxcbiAgfSxcblxuICBvdXRib3VuZDoge1xuICAgIGRlbGl2ZXJ5TW9kZTogXCJkaXJlY3RcIixcbiAgICB0ZXh0Q2h1bmtMaW1pdDogNzAwMCwgLy8gV2ViZXggaGFzIGEgNzQzOSBieXRlIGxpbWl0XG5cbiAgICBzZW5kVGV4dDogYXN5bmMgKHsgdG8sIHRleHQsIGFjY291bnQsIHJlcGx5VG9JZCB9KSA9PiB7XG4gICAgICBjb25zdCBzZW5kZXIgPSBuZXcgV2ViZXhTZW5kZXIoYWNjb3VudC5jb25maWcpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZW5kZXIuc2VuZCh7XG4gICAgICAgIHRvLFxuICAgICAgICBjb250ZW50OiB7IHRleHQgfSxcbiAgICAgICAgcGFyZW50SWQ6IHJlcGx5VG9JZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFubmVsOiBcIndlYmV4XCIsXG4gICAgICAgIG1lc3NhZ2VJZDogcmVzdWx0LmlkLFxuICAgICAgICByb29tSWQ6IHJlc3VsdC5yb29tSWQsXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBzZW5kTWVkaWE6IGFzeW5jICh7IHRvLCB0ZXh0LCBtZWRpYVVybCwgYWNjb3VudCwgcmVwbHlUb0lkIH0pID0+IHtcbiAgICAgIGNvbnN0IHNlbmRlciA9IG5ldyBXZWJleFNlbmRlcihhY2NvdW50LmNvbmZpZyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlbmRlci5zZW5kKHtcbiAgICAgICAgdG8sXG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIGZpbGVzOiBtZWRpYVVybCA/IFttZWRpYVVybF0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmVudElkOiByZXBseVRvSWQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbDogXCJ3ZWJleFwiLFxuICAgICAgICBtZXNzYWdlSWQ6IHJlc3VsdC5pZCxcbiAgICAgICAgcm9vbUlkOiByZXN1bHQucm9vbUlkLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIHN0YXR1czoge1xuICAgIGRlZmF1bHRSdW50aW1lOiB7XG4gICAgICBhY2NvdW50SWQ6IERFRkFVTFRfQUNDT1VOVF9JRCxcbiAgICAgIHJ1bm5pbmc6IGZhbHNlLFxuICAgICAgbGFzdFN0YXJ0QXQ6IG51bGwsXG4gICAgICBsYXN0U3RvcEF0OiBudWxsLFxuICAgICAgbGFzdEVycm9yOiBudWxsLFxuICAgIH0sXG5cbiAgICBjb2xsZWN0U3RhdHVzSXNzdWVzOiAoYWNjb3VudHMpID0+XG4gICAgICBhY2NvdW50cy5mbGF0TWFwKChhY2NvdW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhc3RFcnJvciA9IHR5cGVvZiBhY2NvdW50Lmxhc3RFcnJvciA9PT0gXCJzdHJpbmdcIiA/IGFjY291bnQubGFzdEVycm9yLnRyaW0oKSA6IFwiXCI7XG4gICAgICAgIGlmICghbGFzdEVycm9yKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2hhbm5lbDogXCJ3ZWJleFwiLFxuICAgICAgICAgICAgYWNjb3VudElkOiBhY2NvdW50LmFjY291bnRJZCxcbiAgICAgICAgICAgIGtpbmQ6IFwicnVudGltZVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgbWVzc2FnZTogYENoYW5uZWwgZXJyb3I6ICR7bGFzdEVycm9yfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0pLFxuXG4gICAgYnVpbGRDaGFubmVsU3VtbWFyeTogKHsgc25hcHNob3QgfSkgPT4gKHtcbiAgICAgIGNvbmZpZ3VyZWQ6IChzbmFwc2hvdC5jb25maWd1cmVkID8/IGZhbHNlKSBhcyBib29sZWFuLFxuICAgICAgYmFzZVVybDogKHNuYXBzaG90LmJhc2VVcmwgPz8gbnVsbCkgYXMgc3RyaW5nIHwgbnVsbCxcbiAgICAgIHJ1bm5pbmc6IChzbmFwc2hvdC5ydW5uaW5nID8/IGZhbHNlKSBhcyBib29sZWFuLFxuICAgICAgbGFzdFN0YXJ0QXQ6IChzbmFwc2hvdC5sYXN0U3RhcnRBdCA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCxcbiAgICAgIGxhc3RTdG9wQXQ6IChzbmFwc2hvdC5sYXN0U3RvcEF0ID8/IG51bGwpIGFzIERhdGUgfCBudWxsLFxuICAgICAgbGFzdEVycm9yOiAoc25hcHNob3QubGFzdEVycm9yID8/IG51bGwpIGFzIHN0cmluZyB8IG51bGwsXG4gICAgfSksXG5cbiAgICBwcm9iZUFjY291bnQ6IGFzeW5jICh7IGFjY291bnQsIHRpbWVvdXRNcyB9KSA9PiB7XG4gICAgICBpZiAoIWFjY291bnQuY29uZmlndXJlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogXCJBY2NvdW50IG5vdCBjb25maWd1cmVkXCIsXG4gICAgICAgICAgZWxhcHNlZE1zOiAwLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgIGAke2FjY291bnQuY29uZmlnLmFwaUJhc2VVcmwgPz8gXCJodHRwczovL3dlYmV4YXBpcy5jb20vdjFcIn0vcGVvcGxlL21lYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2NvdW50LmNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYWw6IHRpbWVvdXRNcyA/IEFib3J0U2lnbmFsLnRpbWVvdXQodGltZW91dE1zKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAsXG4gICAgICAgICAgICBlbGFwc2VkTXMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBlbGFwc2VkTXMgfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBidWlsZEFjY291bnRTbmFwc2hvdDogKHsgYWNjb3VudCwgcnVudGltZSwgcHJvYmUgfSkgPT4gKHtcbiAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQsXG4gICAgICBuYW1lOiBhY2NvdW50Lm5hbWUsXG4gICAgICBlbmFibGVkOiBhY2NvdW50LmVuYWJsZWQsXG4gICAgICBjb25maWd1cmVkOiBhY2NvdW50LmNvbmZpZ3VyZWQsXG4gICAgICBiYXNlVXJsOiBhY2NvdW50LmNvbmZpZy5hcGlCYXNlVXJsID8/IFwiaHR0cHM6Ly93ZWJleGFwaXMuY29tL3YxXCIsXG4gICAgICBydW5uaW5nOiBydW50aW1lPy5ydW5uaW5nID8/IGZhbHNlLFxuICAgICAgbGFzdFN0YXJ0QXQ6IHJ1bnRpbWU/Lmxhc3RTdGFydEF0ID8/IG51bGwsXG4gICAgICBsYXN0U3RvcEF0OiBydW50aW1lPy5sYXN0U3RvcEF0ID8/IG51bGwsXG4gICAgICBsYXN0RXJyb3I6IHJ1bnRpbWU/Lmxhc3RFcnJvciA/PyBudWxsLFxuICAgICAgcHJvYmUsXG4gICAgICBsYXN0UHJvYmVBdDogcnVudGltZT8ubGFzdFByb2JlQXQgPz8gbnVsbCxcbiAgICB9KSxcbiAgfSxcblxuICBnYXRld2F5OiB7XG4gICAgc3RhcnRBY2NvdW50OiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICBjb25zdCB7IGFjY291bnQsIHJ1bnRpbWUsIGxvZywgc2V0U3RhdHVzIH0gPSBjdHg7XG5cbiAgICAgIHNldFN0YXR1cyh7XG4gICAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQsXG4gICAgICAgIGJhc2VVcmw6IGFjY291bnQuY29uZmlnLmFwaUJhc2VVcmwgPz8gXCJodHRwczovL3dlYmV4YXBpcy5jb20vdjFcIixcbiAgICAgIH0pO1xuXG4gICAgICBsb2c/LmluZm8/LihcbiAgICAgICAgYFske2FjY291bnQuYWNjb3VudElkfV0gc3RhcnRpbmcgV2ViZXggcHJvdmlkZXIgKHdlYmhvb2sgbW9kZSlgXG4gICAgICApO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdlYmhvb2sgaGFuZGxlclxuICAgICAgY29uc3Qgd2ViaG9va0hhbmRsZXIgPSBuZXcgV2ViZXhXZWJob29rSGFuZGxlcihhY2NvdW50LmNvbmZpZyk7XG4gICAgICBhd2FpdCB3ZWJob29rSGFuZGxlci5pbml0aWFsaXplKCk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIHdlYmhvb2tzIHdpdGggV2ViZXhcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdlYmhvb2tIYW5kbGVyLnJlZ2lzdGVyV2ViaG9va3MoKTtcbiAgICAgICAgbG9nPy5pbmZvPy4oYFske2FjY291bnQuYWNjb3VudElkfV0gd2ViaG9va3MgcmVnaXN0ZXJlZGApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZz8ud2Fybj8uKFxuICAgICAgICAgIGBbJHthY2NvdW50LmFjY291bnRJZH1dIGZhaWxlZCB0byByZWdpc3RlciB3ZWJob29rczogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0ZXIgd2ViaG9vayB0YXJnZXQgZm9yIEhUVFAgaGFuZGxlclxuICAgICAgY29uc3Qgd2ViaG9va1BhdGggPSBgL3dlYmhvb2tzL3dlYmV4LyR7YWNjb3VudC5hY2NvdW50SWR9YDtcblxuICAgICAgY29uc3QgdW5yZWdpc3RlciA9IHJlZ2lzdGVyV2ViZXhXZWJob29rVGFyZ2V0KHdlYmhvb2tQYXRoLCB7XG4gICAgICAgIGFjY291bnQsXG4gICAgICAgIGNvbmZpZzogYWNjb3VudC5jb25maWcsXG4gICAgICAgIHdlYmhvb2tIYW5kbGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGxvZz8uaW5mbz8uKFxuICAgICAgICBgWyR7YWNjb3VudC5hY2NvdW50SWR9XSBIVFRQIHdlYmhvb2sgaGFuZGxlciByZWdpc3RlcmVkIGF0ICR7d2ViaG9va1BhdGh9YFxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxvZz8uaW5mbz8uKGBbJHthY2NvdW50LmFjY291bnRJZH1dIHN0b3BwaW5nIFdlYmV4IHByb3ZpZGVyYCk7XG4gICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcbn07XG4iXX0=
|
package/dist/plugin.js
CHANGED
|
@@ -16,8 +16,11 @@ const channel_plugin_1 = require("./channel-plugin");
|
|
|
16
16
|
* It registers the Webex channel with the plugin system.
|
|
17
17
|
*/
|
|
18
18
|
function register(api) {
|
|
19
|
+
// Store the plugin runtime for use in HTTP handlers
|
|
20
|
+
(0, channel_plugin_1.setPluginRuntime)(api.runtime);
|
|
19
21
|
api.registerChannel({ plugin: channel_plugin_1.webexPlugin });
|
|
22
|
+
api.registerHttpHandler((0, channel_plugin_1.createWebhookHandler)());
|
|
20
23
|
}
|
|
21
24
|
// Export the plugin ID for reference
|
|
22
25
|
exports.id = "webex";
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQVdILDJCQU1DO0FBZEQscURBQXVGO0FBRXZGOzs7OztHQUtHO0FBQ0gsU0FBd0IsUUFBUSxDQUFDLEdBQXNCO0lBQ3JELG9EQUFvRDtJQUNwRCxJQUFBLGlDQUFnQixFQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU5QixHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFFLDRCQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFBLHFDQUFvQixHQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQscUNBQXFDO0FBQ3hCLFFBQUEsRUFBRSxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkNsYXcgV2ViZXggQ2hhbm5lbCBQbHVnaW5cbiAqXG4gKiBNYWluIGVudHJ5IHBvaW50IGZvciB0aGUgT3BlbkNsYXcgcGx1Z2luIHN5c3RlbS5cbiAqIEV4cG9ydHMgYSBkZWZhdWx0IGZ1bmN0aW9uIHRoYXQgcmVnaXN0ZXJzIHRoZSBXZWJleCBjaGFubmVsLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT3BlbkNsYXdQbHVnaW5BcGkgfSBmcm9tIFwib3BlbmNsYXcvcGx1Z2luLXNka1wiO1xuaW1wb3J0IHsgd2ViZXhQbHVnaW4sIGNyZWF0ZVdlYmhvb2tIYW5kbGVyLCBzZXRQbHVnaW5SdW50aW1lIH0gZnJvbSBcIi4vY2hhbm5lbC1wbHVnaW5cIjtcblxuLyoqXG4gKiBPcGVuQ2xhdyBwbHVnaW4gcmVnaXN0cmF0aW9uIGZ1bmN0aW9uLlxuICpcbiAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IHRoYXQgT3BlbkNsYXcgY2FsbHMgd2hlbiBsb2FkaW5nIHRoZSBwbHVnaW4uXG4gKiBJdCByZWdpc3RlcnMgdGhlIFdlYmV4IGNoYW5uZWwgd2l0aCB0aGUgcGx1Z2luIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIoYXBpOiBPcGVuQ2xhd1BsdWdpbkFwaSk6IHZvaWQge1xuICAvLyBTdG9yZSB0aGUgcGx1Z2luIHJ1bnRpbWUgZm9yIHVzZSBpbiBIVFRQIGhhbmRsZXJzXG4gIHNldFBsdWdpblJ1bnRpbWUoYXBpLnJ1bnRpbWUpO1xuICBcbiAgYXBpLnJlZ2lzdGVyQ2hhbm5lbCh7IHBsdWdpbjogd2ViZXhQbHVnaW4gfSk7XG4gIGFwaS5yZWdpc3Rlckh0dHBIYW5kbGVyKGNyZWF0ZVdlYmhvb2tIYW5kbGVyKCkpO1xufVxuXG4vLyBFeHBvcnQgdGhlIHBsdWdpbiBJRCBmb3IgcmVmZXJlbmNlXG5leHBvcnQgY29uc3QgaWQgPSBcIndlYmV4XCI7XG4iXX0=
|
package/dist/send.js
CHANGED
|
@@ -112,12 +112,23 @@ class WebexSender {
|
|
|
112
112
|
request.toPersonEmail = to;
|
|
113
113
|
}
|
|
114
114
|
else if (to.startsWith('Y2lzY29zcGFyazovL3')) {
|
|
115
|
-
// Base64-encoded Webex IDs
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
// Base64-encoded Webex IDs - decode to check type
|
|
116
|
+
try {
|
|
117
|
+
const decoded = Buffer.from(to, 'base64').toString('utf-8');
|
|
118
|
+
if (decoded.includes('/ROOM/')) {
|
|
119
|
+
request.roomId = to;
|
|
120
|
+
}
|
|
121
|
+
else if (decoded.includes('/PEOPLE/')) {
|
|
122
|
+
request.toPersonId = to;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Default to roomId for other types
|
|
126
|
+
request.roomId = to;
|
|
127
|
+
}
|
|
118
128
|
}
|
|
119
|
-
|
|
120
|
-
|
|
129
|
+
catch {
|
|
130
|
+
// If decode fails, assume it's a roomId
|
|
131
|
+
request.roomId = to;
|
|
121
132
|
}
|
|
122
133
|
}
|
|
123
134
|
else {
|
|
@@ -301,4 +312,4 @@ class WebexApiRequestError extends Error {
|
|
|
301
312
|
}
|
|
302
313
|
}
|
|
303
314
|
exports.WebexApiRequestError = WebexApiRequestError;
|
|
304
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7O0FBRUgsNERBQTZDO0FBVzdDLE1BQU0sb0JBQW9CLEdBQUcsMEJBQTBCLENBQUM7QUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFFcEMsb0RBQW9EO0FBQ3BELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVoRCxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQXFCO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixZQUFZLENBQWU7SUFFbkMsWUFBWSxNQUEwQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksb0JBQW9CLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxtQkFBbUI7WUFDcEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksc0JBQXNCO1NBQzVELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWdDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLFFBQWlCO1FBQzlELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4QixNQUFNO1lBQ04sSUFBSTtZQUNKLFFB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aENELG9EQWdDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViZXggTWVzc2FnZSBTZW5kaW5nIE1vZHVsZVxuICovXG5cbmltcG9ydCBmZXRjaCwgeyBSZXNwb25zZSB9IGZyb20gJ25vZGUtZmV0Y2gnO1xuaW1wb3J0IHR5cGUge1xuICBXZWJleENoYW5uZWxDb25maWcsXG4gIFdlYmV4TWVzc2FnZSxcbiAgQ3JlYXRlTWVzc2FnZVJlcXVlc3QsXG4gIE9wZW5DbGF3T3V0Ym91bmRNZXNzYWdlLFxuICBXZWJleEFwaUVycm9yLFxuICBSZXRyeU9wdGlvbnMsXG4gIFJlcXVlc3RPcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9BUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly93ZWJleGFwaXMuY29tL3YxJztcbmNvbnN0IERFRkFVTFRfTUFYX1JFVFJJRVMgPSAzO1xuY29uc3QgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyA9IDEwMDA7XG5cbi8vIFJhdGUgbGltaXQgc3RhdHVzIGNvZGVzIHRoYXQgc2hvdWxkIHRyaWdnZXIgcmV0cnlcbmNvbnN0IFJFVFJZX1NUQVRVU19DT0RFUyA9IFs0MjksIDUwMiwgNTAzLCA1MDRdO1xuXG5leHBvcnQgY2xhc3MgV2ViZXhTZW5kZXIge1xuICBwcml2YXRlIGNvbmZpZzogV2ViZXhDaGFubmVsQ29uZmlnO1xuICBwcml2YXRlIGFwaUJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZXRyeU9wdGlvbnM6IFJldHJ5T3B0aW9ucztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFdlYmV4Q2hhbm5lbENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuYXBpQmFzZVVybCA9IGNvbmZpZy5hcGlCYXNlVXJsIHx8IERFRkFVTFRfQVBJX0JBU0VfVVJMO1xuICAgIHRoaXMucmV0cnlPcHRpb25zID0ge1xuICAgICAgbWF4UmV0cmllczogY29uZmlnLm1heFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIHJldHJ5RGVsYXlNczogY29uZmlnLnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIG1lc3NhZ2UgdG8gV2ViZXhcbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogT3BlbkNsYXdPdXRib3VuZE1lc3NhZ2UpOiBQcm9taXNlPFdlYmV4TWVzc2FnZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkTWVzc2FnZVJlcXVlc3QobWVzc2FnZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgdGV4dCBtZXNzYWdlIHRvIGEgcm9vbVxuICAgKi9cbiAgYXN5bmMgc2VuZFRvUm9vbShyb29tSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBtYXJrZG93bj86IHN0cmluZyk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICByb29tSWQsXG4gICAgICB0ZXh0LFxuICAgICAgbWFya2Rvd24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGRpcmVjdCBtZXNzYWdlIHRvIGEgcGVyc29uIGJ5IElEXG4gICAqL1xuICBhc3luYyBzZW5kRGlyZWN0QnlJZChwZXJzb25JZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG1hcmtkb3duPzogc3RyaW5nKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNzYWdlKHtcbiAgICAgIHRvUGVyc29uSWQ6IHBlcnNvbklkLFxuICAgICAgdGV4dCxcbiAgICAgIG1hcmtkb3duLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkaXJlY3QgbWVzc2FnZSB0byBhIHBlcnNvbiBieSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgc2VuZERpcmVjdEJ5RW1haWwoZW1haWw6IHN0cmluZywgdGV4dDogc3RyaW5nLCBtYXJrZG93bj86IHN0cmluZyk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICB0b1BlcnNvbkVtYWlsOiBlbWFpbCxcbiAgICAgIHRleHQsXG4gICAgICBtYXJrZG93bixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB3aXRoIGZpbGUgYXR0YWNobWVudFxuICAgKi9cbiAgYXN5bmMgc2VuZFdpdGhGaWxlKFxuICAgIHJvb21JZDogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBmaWxlVXJsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNzYWdlKHtcbiAgICAgIHJvb21JZCxcbiAgICAgIHRleHQsXG4gICAgICBmaWxlczogW2ZpbGVVcmxdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSB0aHJlYWRlZCByZXBseVxuICAgKi9cbiAgYXN5bmMgc2VuZFJlcGx5KFxuICAgIHJvb21JZDogc3RyaW5nLFxuICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG1hcmtkb3duPzogc3RyaW5nXG4gICk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICByb29tSWQsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHRleHQsXG4gICAgICBtYXJrZG93bixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBtZXNzYWdlIGJ5IElEXG4gICAqL1xuICBhc3luYyBnZXRNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFdlYmV4TWVzc2FnZT4oe1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHBhdGg6IGAvbWVzc2FnZXMvJHttZXNzYWdlSWR9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZXNzYWdlIGJ5IElEXG4gICAqL1xuICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICBwYXRoOiBgL21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBXZWJleCBtZXNzYWdlIHJlcXVlc3QgZnJvbSBhbiBPcGVuQ2xhdyBvdXRib3VuZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTWVzc2FnZVJlcXVlc3QobWVzc2FnZTogT3BlbkNsYXdPdXRib3VuZE1lc3NhZ2UpOiBDcmVhdGVNZXNzYWdlUmVxdWVzdCB7XG4gICAgY29uc3QgcmVxdWVzdDogQ3JlYXRlTWVzc2FnZVJlcXVlc3QgPSB7fTtcblxuICAgIC8vIERldGVybWluZSB0YXJnZXQ6IHJvb21JZCwgcGVyc29uSWQsIG9yIGVtYWlsXG4gICAgY29uc3QgdG8gPSBtZXNzYWdlLnRvO1xuICAgIGlmICh0by5pbmNsdWRlcygnQCcpKSB7XG4gICAgICByZXF1ZXN0LnRvUGVyc29uRW1haWwgPSB0bztcbiAgICB9IGVsc2UgaWYgKHRvLnN0YXJ0c1dpdGgoJ1kybHpZMjl6Y0dGeWF6b3ZMMycpKSB7XG4gICAgICAvLyBCYXNlNjQtZW5jb2RlZCBXZWJleCBJRHMgc3RhcnQgd2l0aCB0aGlzIHByZWZpeFxuICAgICAgaWYgKHRvLmluY2x1ZGVzKCdST09NJykpIHtcbiAgICAgICAgcmVxdWVzdC5yb29tSWQgPSB0bztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QudG9QZXJzb25JZCA9IHRvO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBc3N1bWUgaXQncyBhIHJvb21JZCBpZiBub3QgYW4gZW1haWxcbiAgICAgIHJlcXVlc3Qucm9vbUlkID0gdG87XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbnRlbnRcbiAgICBpZiAobWVzc2FnZS5jb250ZW50LnRleHQpIHtcbiAgICAgIHJlcXVlc3QudGV4dCA9IG1lc3NhZ2UuY29udGVudC50ZXh0O1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50Lm1hcmtkb3duKSB7XG4gICAgICByZXF1ZXN0Lm1hcmtkb3duID0gbWVzc2FnZS5jb250ZW50Lm1hcmtkb3duO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50LmZpbGVzICYmIG1lc3NhZ2UuY29udGVudC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZWJleCBvbmx5IGFsbG93cyBvbmUgZmlsZSBwZXIgbWVzc2FnZVxuICAgICAgcmVxdWVzdC5maWxlcyA9IFttZXNzYWdlLmNvbnRlbnQuZmlsZXNbMF1dO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50LmNhcmQpIHtcbiAgICAgIHJlcXVlc3QuYXR0YWNobWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hZGFwdGl2ZScsXG4gICAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50LmNhcmQsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFNldCB0aHJlYWRpbmdcbiAgICBpZiAobWVzc2FnZS5wYXJlbnRJZCkge1xuICAgICAgcmVxdWVzdC5wYXJlbnRJZCA9IG1lc3NhZ2UucGFyZW50SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWVzc2FnZSB2aWEgdGhlIFdlYmV4IEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVNZXNzYWdlKHJlcXVlc3Q6IENyZWF0ZU1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZVJlcXVlc3QocmVxdWVzdCk7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFdlYmV4TWVzc2FnZT4oe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBwYXRoOiAnL21lc3NhZ2VzJyxcbiAgICAgIGJvZHk6IHJlcXVlc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBtZXNzYWdlIHJlcXVlc3QgYmVmb3JlIHNlbmRpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXNzYWdlUmVxdWVzdChyZXF1ZXN0OiBDcmVhdGVNZXNzYWdlUmVxdWVzdCk6IHZvaWQge1xuICAgIC8vIE11c3QgaGF2ZSBhIHRhcmdldFxuICAgIGlmICghcmVxdWVzdC5yb29tSWQgJiYgIXJlcXVlc3QudG9QZXJzb25JZCAmJiAhcmVxdWVzdC50b1BlcnNvbkVtYWlsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgbXVzdCBoYXZlIGEgdGFyZ2V0OiByb29tSWQsIHRvUGVyc29uSWQsIG9yIHRvUGVyc29uRW1haWwnKTtcbiAgICB9XG5cbiAgICAvLyBNdXN0IGhhdmUgY29udGVudFxuICAgIGlmICghcmVxdWVzdC50ZXh0ICYmICFyZXF1ZXN0Lm1hcmtkb3duICYmICFyZXF1ZXN0LmZpbGVzPy5sZW5ndGggJiYgIXJlcXVlc3QuYXR0YWNobWVudHM/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIG11c3QgaGF2ZSBjb250ZW50OiB0ZXh0LCBtYXJrZG93biwgZmlsZXMsIG9yIGF0dGFjaG1lbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gVGV4dCBoYXMgYSBtYXggc2l6ZSBvZiA3NDM5IGJ5dGVzXG4gICAgaWYgKHJlcXVlc3QudGV4dCAmJiBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LnRleHQsICd1dGY4JykgPiA3NDM5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgdGV4dCBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiA3NDM5IGJ5dGVzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYW4gQVBJIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICB3aGlsZSAoYXR0ZW1wdCA8PSB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdDxUPihvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPiB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmV0cnkoZXJyb3IgYXMgRXJyb3IsIGF0dGVtcHQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQpO1xuICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdSZXF1ZXN0IGZhaWxlZCBhZnRlciByZXRyaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBBUEkgcmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdDxUPihvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpQmFzZVVybH0ke29wdGlvbnMucGF0aH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy50b2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogb3B0aW9ucy5ib2R5ID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5wYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gREVMRVRFIHJlcXVlc3RzIHJldHVybiAyMDQgTm8gQ29udGVudFxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBlcnJvciByZXNwb25zZSBmcm9tIFdlYmV4IEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxFcnJvcj4ge1xuICAgIGxldCBlcnJvckRhdGE6IFdlYmV4QXBpRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgV2ViZXhBcGlFcnJvcjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFJlc3BvbnNlIGJvZHkgbWlnaHQgbm90IGJlIEpTT05cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JEYXRhPy5tZXNzYWdlIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViZXhBcGlSZXF1ZXN0RXJyb3IoXG4gICAgICBtZXNzYWdlLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3JEYXRhPy50cmFja2luZ0lkLFxuICAgICAgZXJyb3JEYXRhPy5lcnJvcnNcbiAgICApO1xuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWRcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkUmV0cnkoZXJyb3I6IEVycm9yLCBhdHRlbXB0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJleEFwaVJlcXVlc3RFcnJvcikge1xuICAgICAgcmV0dXJuIFJFVFJZX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhlcnJvci5zdGF0dXNDb2RlKTtcbiAgICB9XG4gICAgLy8gUmV0cnkgbmV0d29yayBlcnJvcnNcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUNPTk5SRVNFVCcpIHx8XG4gICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpIHx8XG4gICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT1RGT1VORCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBiYWNrb2ZmIGRlbGF5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlRGVsYXkgPSB0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeURlbGF5TXM7XG4gICAgY29uc3QgZXhwb25lbnRpYWxEZWxheSA9IGJhc2VEZWxheSAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKTtcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zICogZXhwb25lbnRpYWxEZWxheTtcbiAgICByZXR1cm4gTWF0aC5taW4oZXhwb25lbnRpYWxEZWxheSArIGppdHRlciwgMzAwMDApOyAvLyBDYXAgYXQgMzAgc2Vjb25kc1xuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwIGZvciBhIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyBmb3IgV2ViZXggQVBJIGVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgV2ViZXhBcGlSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJhY2tpbmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGV0YWlscz86IEFycmF5PHsgZGVzY3JpcHRpb246IHN0cmluZyB9PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHRyYWNraW5nSWQ/OiBzdHJpbmcsXG4gICAgZGV0YWlscz86IEFycmF5PHsgZGVzY3JpcHRpb246IHN0cmluZyB9PlxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnV2ViZXhBcGlSZXF1ZXN0RXJyb3InO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgdGhpcy50cmFja2luZ0lkID0gdHJhY2tpbmdJZDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuXG4gICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgV2ViZXhBcGlSZXF1ZXN0RXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBzdGF0dXNDb2RlOiB0aGlzLnN0YXR1c0NvZGUsXG4gICAgICB0cmFja2luZ0lkOiB0aGlzLnRyYWNraW5nSWQsXG4gICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7O0FBRUgsNERBQTZDO0FBVzdDLE1BQU0sb0JBQW9CLEdBQUcsMEJBQTBCLENBQUM7QUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFFcEMsb0RBQW9EO0FBQ3BELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVoRCxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQXFCO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixZQUFZLENBQWU7SUFFbkMsWUFBWSxNQUEwQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksb0JBQW9CLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxtQkFBbUI7WUFDcEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksc0JBQXNCO1NBQzVELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWdDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLFFBQWlCO1FBQzlELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4QixNQUFNO1lBQ04sSUFBSTtZQUNKLFFB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LElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWhDRCxvREFnQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdlYmV4IE1lc3NhZ2UgU2VuZGluZyBNb2R1bGVcbiAqL1xuXG5pbXBvcnQgZmV0Y2gsIHsgUmVzcG9uc2UgfSBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCB0eXBlIHtcbiAgV2ViZXhDaGFubmVsQ29uZmlnLFxuICBXZWJleE1lc3NhZ2UsXG4gIENyZWF0ZU1lc3NhZ2VSZXF1ZXN0LFxuICBPcGVuQ2xhd091dGJvdW5kTWVzc2FnZSxcbiAgV2ViZXhBcGlFcnJvcixcbiAgUmV0cnlPcHRpb25zLFxuICBSZXF1ZXN0T3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfQVBJX0JBU0VfVVJMID0gJ2h0dHBzOi8vd2ViZXhhcGlzLmNvbS92MSc7XG5jb25zdCBERUZBVUxUX01BWF9SRVRSSUVTID0gMztcbmNvbnN0IERFRkFVTFRfUkVUUllfREVMQVlfTVMgPSAxMDAwO1xuXG4vLyBSYXRlIGxpbWl0IHN0YXR1cyBjb2RlcyB0aGF0IHNob3VsZCB0cmlnZ2VyIHJldHJ5XG5jb25zdCBSRVRSWV9TVEFUVVNfQ09ERVMgPSBbNDI5LCA1MDIsIDUwMywgNTA0XTtcblxuZXhwb3J0IGNsYXNzIFdlYmV4U2VuZGVyIHtcbiAgcHJpdmF0ZSBjb25maWc6IFdlYmV4Q2hhbm5lbENvbmZpZztcbiAgcHJpdmF0ZSBhcGlCYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmV0cnlPcHRpb25zOiBSZXRyeU9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXZWJleENoYW5uZWxDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmFwaUJhc2VVcmwgPSBjb25maWcuYXBpQmFzZVVybCB8fCBERUZBVUxUX0FQSV9CQVNFX1VSTDtcbiAgICB0aGlzLnJldHJ5T3B0aW9ucyA9IHtcbiAgICAgIG1heFJldHJpZXM6IGNvbmZpZy5tYXhSZXRyaWVzID8/IERFRkFVTFRfTUFYX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IGNvbmZpZy5yZXRyeURlbGF5TXMgPz8gREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBtZXNzYWdlIHRvIFdlYmV4XG4gICAqL1xuICBhc3luYyBzZW5kKG1lc3NhZ2U6IE9wZW5DbGF3T3V0Ym91bmRNZXNzYWdlKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZE1lc3NhZ2VSZXF1ZXN0KG1lc3NhZ2UpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU1lc3NhZ2UocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIHRleHQgbWVzc2FnZSB0byBhIHJvb21cbiAgICovXG4gIGFzeW5jIHNlbmRUb1Jvb20ocm9vbUlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgbWFya2Rvd24/OiBzdHJpbmcpOiBQcm9taXNlPFdlYmV4TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgcm9vbUlkLFxuICAgICAgdGV4dCxcbiAgICAgIG1hcmtkb3duLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkaXJlY3QgbWVzc2FnZSB0byBhIHBlcnNvbiBieSBJRFxuICAgKi9cbiAgYXN5bmMgc2VuZERpcmVjdEJ5SWQocGVyc29uSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBtYXJrZG93bj86IHN0cmluZyk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICB0b1BlcnNvbklkOiBwZXJzb25JZCxcbiAgICAgIHRleHQsXG4gICAgICBtYXJrZG93bixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgZGlyZWN0IG1lc3NhZ2UgdG8gYSBwZXJzb24gYnkgZW1haWxcbiAgICovXG4gIGFzeW5jIHNlbmREaXJlY3RCeUVtYWlsKGVtYWlsOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgbWFya2Rvd24/OiBzdHJpbmcpOiBQcm9taXNlPFdlYmV4TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgdG9QZXJzb25FbWFpbDogZW1haWwsXG4gICAgICB0ZXh0LFxuICAgICAgbWFya2Rvd24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIG1lc3NhZ2Ugd2l0aCBmaWxlIGF0dGFjaG1lbnRcbiAgICovXG4gIGFzeW5jIHNlbmRXaXRoRmlsZShcbiAgICByb29tSWQ6IHN0cmluZyxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgZmlsZVVybDogc3RyaW5nXG4gICk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICByb29tSWQsXG4gICAgICB0ZXh0LFxuICAgICAgZmlsZXM6IFtmaWxlVXJsXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgdGhyZWFkZWQgcmVwbHlcbiAgICovXG4gIGFzeW5jIHNlbmRSZXBseShcbiAgICByb29tSWQ6IHN0cmluZyxcbiAgICBwYXJlbnRJZDogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBtYXJrZG93bj86IHN0cmluZ1xuICApOiBQcm9taXNlPFdlYmV4TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgcm9vbUlkLFxuICAgICAgcGFyZW50SWQsXG4gICAgICB0ZXh0LFxuICAgICAgbWFya2Rvd24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbWVzc2FnZSBieSBJRFxuICAgKi9cbiAgYXN5bmMgZ2V0TWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxXZWJleE1lc3NhZ2U+KHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBwYXRoOiBgL21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWVzc2FnZSBieSBJRFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVxdWVzdDx2b2lkPih7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgcGF0aDogYC9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgV2ViZXggbWVzc2FnZSByZXF1ZXN0IGZyb20gYW4gT3BlbkNsYXcgb3V0Ym91bmQgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE1lc3NhZ2VSZXF1ZXN0KG1lc3NhZ2U6IE9wZW5DbGF3T3V0Ym91bmRNZXNzYWdlKTogQ3JlYXRlTWVzc2FnZVJlcXVlc3Qge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENyZWF0ZU1lc3NhZ2VSZXF1ZXN0ID0ge307XG5cbiAgICAvLyBEZXRlcm1pbmUgdGFyZ2V0OiByb29tSWQsIHBlcnNvbklkLCBvciBlbWFpbFxuICAgIGNvbnN0IHRvID0gbWVzc2FnZS50bztcbiAgICBpZiAodG8uaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgcmVxdWVzdC50b1BlcnNvbkVtYWlsID0gdG87XG4gICAgfSBlbHNlIGlmICh0by5zdGFydHNXaXRoKCdZMmx6WTI5emNHRnlhem92TDMnKSkge1xuICAgICAgLy8gQmFzZTY0LWVuY29kZWQgV2ViZXggSURzIC0gZGVjb2RlIHRvIGNoZWNrIHR5cGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbSh0bywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcygnL1JPT00vJykpIHtcbiAgICAgICAgICByZXF1ZXN0LnJvb21JZCA9IHRvO1xuICAgICAgICB9IGVsc2UgaWYgKGRlY29kZWQuaW5jbHVkZXMoJy9QRU9QTEUvJykpIHtcbiAgICAgICAgICByZXF1ZXN0LnRvUGVyc29uSWQgPSB0bztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHRvIHJvb21JZCBmb3Igb3RoZXIgdHlwZXNcbiAgICAgICAgICByZXF1ZXN0LnJvb21JZCA9IHRvO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWYgZGVjb2RlIGZhaWxzLCBhc3N1bWUgaXQncyBhIHJvb21JZFxuICAgICAgICByZXF1ZXN0LnJvb21JZCA9IHRvO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBc3N1bWUgaXQncyBhIHJvb21JZCBpZiBub3QgYW4gZW1haWxcbiAgICAgIHJlcXVlc3Qucm9vbUlkID0gdG87XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbnRlbnRcbiAgICBpZiAobWVzc2FnZS5jb250ZW50LnRleHQpIHtcbiAgICAgIHJlcXVlc3QudGV4dCA9IG1lc3NhZ2UuY29udGVudC50ZXh0O1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50Lm1hcmtkb3duKSB7XG4gICAgICByZXF1ZXN0Lm1hcmtkb3duID0gbWVzc2FnZS5jb250ZW50Lm1hcmtkb3duO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50LmZpbGVzICYmIG1lc3NhZ2UuY29udGVudC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZWJleCBvbmx5IGFsbG93cyBvbmUgZmlsZSBwZXIgbWVzc2FnZVxuICAgICAgcmVxdWVzdC5maWxlcyA9IFttZXNzYWdlLmNvbnRlbnQuZmlsZXNbMF1dO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50LmNhcmQpIHtcbiAgICAgIHJlcXVlc3QuYXR0YWNobWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hZGFwdGl2ZScsXG4gICAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50LmNhcmQsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFNldCB0aHJlYWRpbmdcbiAgICBpZiAobWVzc2FnZS5wYXJlbnRJZCkge1xuICAgICAgcmVxdWVzdC5wYXJlbnRJZCA9IG1lc3NhZ2UucGFyZW50SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWVzc2FnZSB2aWEgdGhlIFdlYmV4IEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVNZXNzYWdlKHJlcXVlc3Q6IENyZWF0ZU1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZVJlcXVlc3QocmVxdWVzdCk7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFdlYmV4TWVzc2FnZT4oe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBwYXRoOiAnL21lc3NhZ2VzJyxcbiAgICAgIGJvZHk6IHJlcXVlc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBtZXNzYWdlIHJlcXVlc3QgYmVmb3JlIHNlbmRpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXNzYWdlUmVxdWVzdChyZXF1ZXN0OiBDcmVhdGVNZXNzYWdlUmVxdWVzdCk6IHZvaWQge1xuICAgIC8vIE11c3QgaGF2ZSBhIHRhcmdldFxuICAgIGlmICghcmVxdWVzdC5yb29tSWQgJiYgIXJlcXVlc3QudG9QZXJzb25JZCAmJiAhcmVxdWVzdC50b1BlcnNvbkVtYWlsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgbXVzdCBoYXZlIGEgdGFyZ2V0OiByb29tSWQsIHRvUGVyc29uSWQsIG9yIHRvUGVyc29uRW1haWwnKTtcbiAgICB9XG5cbiAgICAvLyBNdXN0IGhhdmUgY29udGVudFxuICAgIGlmICghcmVxdWVzdC50ZXh0ICYmICFyZXF1ZXN0Lm1hcmtkb3duICYmICFyZXF1ZXN0LmZpbGVzPy5sZW5ndGggJiYgIXJlcXVlc3QuYXR0YWNobWVudHM/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIG11c3QgaGF2ZSBjb250ZW50OiB0ZXh0LCBtYXJrZG93biwgZmlsZXMsIG9yIGF0dGFjaG1lbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gVGV4dCBoYXMgYSBtYXggc2l6ZSBvZiA3NDM5IGJ5dGVzXG4gICAgaWYgKHJlcXVlc3QudGV4dCAmJiBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LnRleHQsICd1dGY4JykgPiA3NDM5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgdGV4dCBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiA3NDM5IGJ5dGVzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYW4gQVBJIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICB3aGlsZSAoYXR0ZW1wdCA8PSB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdDxUPihvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPiB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmV0cnkoZXJyb3IgYXMgRXJyb3IsIGF0dGVtcHQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQpO1xuICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdSZXF1ZXN0IGZhaWxlZCBhZnRlciByZXRyaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBBUEkgcmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdDxUPihvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpQmFzZVVybH0ke29wdGlvbnMucGF0aH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy50b2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogb3B0aW9ucy5ib2R5ID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5wYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gREVMRVRFIHJlcXVlc3RzIHJldHVybiAyMDQgTm8gQ29udGVudFxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBlcnJvciByZXNwb25zZSBmcm9tIFdlYmV4IEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxFcnJvcj4ge1xuICAgIGxldCBlcnJvckRhdGE6IFdlYmV4QXBpRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgV2ViZXhBcGlFcnJvcjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFJlc3BvbnNlIGJvZHkgbWlnaHQgbm90IGJlIEpTT05cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JEYXRhPy5tZXNzYWdlIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViZXhBcGlSZXF1ZXN0RXJyb3IoXG4gICAgICBtZXNzYWdlLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3JEYXRhPy50cmFja2luZ0lkLFxuICAgICAgZXJyb3JEYXRhPy5lcnJvcnNcbiAgICApO1xuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWRcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkUmV0cnkoZXJyb3I6IEVycm9yLCBhdHRlbXB0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJleEFwaVJlcXVlc3RFcnJvcikge1xuICAgICAgcmV0dXJuIFJFVFJZX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhlcnJvci5zdGF0dXNDb2RlKTtcbiAgICB9XG4gICAgLy8gUmV0cnkgbmV0d29yayBlcnJvcnNcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUNPTk5SRVNFVCcpIHx8XG4gICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpIHx8XG4gICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT1RGT1VORCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBiYWNrb2ZmIGRlbGF5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlRGVsYXkgPSB0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeURlbGF5TXM7XG4gICAgY29uc3QgZXhwb25lbnRpYWxEZWxheSA9IGJhc2VEZWxheSAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKTtcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zICogZXhwb25lbnRpYWxEZWxheTtcbiAgICByZXR1cm4gTWF0aC5taW4oZXhwb25lbnRpYWxEZWxheSArIGppdHRlciwgMzAwMDApOyAvLyBDYXAgYXQgMzAgc2Vjb25kc1xuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwIGZvciBhIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyBmb3IgV2ViZXggQVBJIGVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgV2ViZXhBcGlSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJhY2tpbmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGV0YWlscz86IEFycmF5PHsgZGVzY3JpcHRpb246IHN0cmluZyB9PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHRyYWNraW5nSWQ/OiBzdHJpbmcsXG4gICAgZGV0YWlscz86IEFycmF5PHsgZGVzY3JpcHRpb246IHN0cmluZyB9PlxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnV2ViZXhBcGlSZXF1ZXN0RXJyb3InO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgdGhpcy50cmFja2luZ0lkID0gdHJhY2tpbmdJZDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuXG4gICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgV2ViZXhBcGlSZXF1ZXN0RXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBzdGF0dXNDb2RlOiB0aGlzLnN0YXR1c0NvZGUsXG4gICAgICB0cmFja2luZ0lkOiB0aGlzLnRyYWNraW5nSWQsXG4gICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgfTtcbiAgfVxufVxuIl19
|
package/openclaw.plugin.json
CHANGED
|
@@ -6,28 +6,90 @@
|
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"additionalProperties": false,
|
|
9
|
-
"properties": {
|
|
9
|
+
"properties": {
|
|
10
|
+
"enabled": {
|
|
11
|
+
"type": "boolean",
|
|
12
|
+
"description": "Enable the Webex channel",
|
|
13
|
+
"default": false
|
|
14
|
+
},
|
|
15
|
+
"token": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Webex bot access token from developer.webex.com"
|
|
18
|
+
},
|
|
19
|
+
"webhookUrl": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Public URL for receiving Webex webhooks"
|
|
22
|
+
},
|
|
23
|
+
"webhookSecret": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Secret for verifying webhook signatures (recommended)"
|
|
26
|
+
},
|
|
27
|
+
"dmPolicy": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"enum": ["allow", "deny", "allowlisted", "pairing"],
|
|
30
|
+
"description": "Policy for handling direct messages",
|
|
31
|
+
"default": "deny"
|
|
32
|
+
},
|
|
33
|
+
"allowFrom": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": { "type": "string" },
|
|
36
|
+
"description": "List of allowed person IDs or emails (when dmPolicy is allowlisted)"
|
|
37
|
+
},
|
|
38
|
+
"apiBaseUrl": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "Custom Webex API base URL",
|
|
41
|
+
"default": "https://webexapis.com/v1"
|
|
42
|
+
},
|
|
43
|
+
"maxRetries": {
|
|
44
|
+
"type": "number",
|
|
45
|
+
"description": "Maximum retry attempts for failed API calls",
|
|
46
|
+
"default": 3
|
|
47
|
+
},
|
|
48
|
+
"retryDelayMs": {
|
|
49
|
+
"type": "number",
|
|
50
|
+
"description": "Delay between retries in milliseconds",
|
|
51
|
+
"default": 1000
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"required": ["token", "webhookUrl"]
|
|
10
55
|
},
|
|
11
56
|
"uiHints": {
|
|
12
57
|
"token": {
|
|
13
58
|
"label": "Bot Access Token",
|
|
14
59
|
"sensitive": true,
|
|
15
|
-
"placeholder": "Your Webex bot token"
|
|
60
|
+
"placeholder": "Your Webex bot token from developer.webex.com"
|
|
16
61
|
},
|
|
17
62
|
"webhookUrl": {
|
|
18
63
|
"label": "Webhook URL",
|
|
19
|
-
"placeholder": "https://your-domain.com/webhooks/webex"
|
|
64
|
+
"placeholder": "https://your-domain.com/webhooks/webex/default"
|
|
20
65
|
},
|
|
21
66
|
"webhookSecret": {
|
|
22
67
|
"label": "Webhook Secret",
|
|
23
68
|
"sensitive": true,
|
|
24
|
-
"placeholder": "
|
|
69
|
+
"placeholder": "Strong random secret for webhook verification"
|
|
25
70
|
},
|
|
26
71
|
"dmPolicy": {
|
|
27
|
-
"label": "DM Policy"
|
|
72
|
+
"label": "DM Policy",
|
|
73
|
+
"options": [
|
|
74
|
+
{ "value": "allow", "label": "Allow all" },
|
|
75
|
+
{ "value": "deny", "label": "Deny all" },
|
|
76
|
+
{ "value": "allowlisted", "label": "Allowlist only" },
|
|
77
|
+
{ "value": "pairing", "label": "Pairing required" }
|
|
78
|
+
]
|
|
28
79
|
},
|
|
29
80
|
"allowFrom": {
|
|
30
|
-
"label": "Allowed Senders"
|
|
81
|
+
"label": "Allowed Senders",
|
|
82
|
+
"placeholder": "Person ID or email address"
|
|
83
|
+
},
|
|
84
|
+
"apiBaseUrl": {
|
|
85
|
+
"label": "API Base URL",
|
|
86
|
+
"placeholder": "https://webexapis.com/v1"
|
|
87
|
+
},
|
|
88
|
+
"maxRetries": {
|
|
89
|
+
"label": "Max Retries"
|
|
90
|
+
},
|
|
91
|
+
"retryDelayMs": {
|
|
92
|
+
"label": "Retry Delay (ms)"
|
|
31
93
|
}
|
|
32
94
|
}
|
|
33
95
|
}
|