@discordeno/rest 19.0.0-next.fe00a6f → 19.0.0-next.ffdef6c
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 +15 -1
- package/dist/cjs/index.cjs +25 -0
- package/dist/cjs/invalidBucket.cjs +86 -0
- package/dist/cjs/manager.cjs +1547 -0
- package/dist/cjs/queue.cjs +164 -0
- package/dist/cjs/routes.cjs +589 -0
- package/dist/cjs/types.cjs +6 -0
- package/dist/cjs/typings/routes.cjs +6 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/invalidBucket.js +82 -0
- package/dist/esm/manager.js +1505 -0
- package/dist/esm/queue.js +154 -0
- package/dist/esm/routes.js +579 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/typings/routes.js +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +5 -0
- package/dist/types/invalidBucket.d.ts.map +1 -0
- package/dist/types/manager.d.ts.map +1 -0
- package/dist/{queue.d.ts → types/queue.d.ts} +12 -1
- package/dist/types/queue.d.ts.map +1 -0
- package/dist/types/routes.d.ts.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +808 -317
- package/dist/types/types.d.ts.map +1 -0
- package/dist/{typings → types/typings}/routes.d.ts +69 -6
- package/dist/types/typings/routes.d.ts.map +1 -0
- package/package.json +33 -29
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
- package/dist/invalidBucket.d.ts.map +0 -1
- package/dist/invalidBucket.js +0 -82
- package/dist/invalidBucket.js.map +0 -1
- package/dist/manager.d.ts.map +0 -1
- package/dist/manager.js +0 -1139
- package/dist/manager.js.map +0 -1
- package/dist/queue.d.ts.map +0 -1
- package/dist/queue.js +0 -153
- package/dist/queue.js.map +0 -1
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js +0 -487
- package/dist/routes.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/typings/routes.d.ts.map +0 -1
- package/dist/typings/routes.js +0 -3
- package/dist/typings/routes.js.map +0 -1
- /package/dist/{index.d.ts → types/index.d.ts} +0 -0
- /package/dist/{manager.d.ts → types/manager.d.ts} +0 -0
- /package/dist/{routes.d.ts → types/routes.d.ts} +0 -0
|
@@ -0,0 +1,1505 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { InteractionResponseTypes } from '@discordeno/types';
|
|
3
|
+
import { calculateBits, camelToSnakeCase, camelize, delay, getBotIdFromToken, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
|
|
4
|
+
import { createInvalidRequestBucket } from './invalidBucket.js';
|
|
5
|
+
import { Queue } from './queue.js';
|
|
6
|
+
import { createRoutes } from './routes.js';
|
|
7
|
+
// TODO: make dynamic based on package.json file
|
|
8
|
+
const version = '19.0.0';
|
|
9
|
+
export const DISCORD_API_VERSION = 10;
|
|
10
|
+
export const DISCORD_API_URL = 'https://discord.com/api';
|
|
11
|
+
export const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
|
|
12
|
+
export const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
|
|
13
|
+
export const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
|
|
14
|
+
export const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
|
|
15
|
+
export const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
|
|
16
|
+
export const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
|
|
17
|
+
export const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
|
|
18
|
+
export function createRestManager(options) {
|
|
19
|
+
const applicationId = options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token);
|
|
20
|
+
const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
|
|
21
|
+
const rest = {
|
|
22
|
+
applicationId,
|
|
23
|
+
authorization: options.proxy?.authorization,
|
|
24
|
+
authorizationHeader: options.proxy?.authorizationHeader ?? 'authorization',
|
|
25
|
+
baseUrl,
|
|
26
|
+
deleteQueueDelay: 60000,
|
|
27
|
+
globallyRateLimited: false,
|
|
28
|
+
invalidBucket: createInvalidRequestBucket({
|
|
29
|
+
logger: options.logger
|
|
30
|
+
}),
|
|
31
|
+
isProxied: !baseUrl.startsWith(DISCORD_API_URL),
|
|
32
|
+
updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
|
|
33
|
+
maxRetryCount: Infinity,
|
|
34
|
+
processingRateLimitedPaths: false,
|
|
35
|
+
queues: new Map(),
|
|
36
|
+
rateLimitedPaths: new Map(),
|
|
37
|
+
token: options.token,
|
|
38
|
+
version: options.version ?? DISCORD_API_VERSION,
|
|
39
|
+
logger: options.logger ?? logger,
|
|
40
|
+
routes: createRoutes(),
|
|
41
|
+
createBaseHeaders () {
|
|
42
|
+
return {
|
|
43
|
+
'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
checkRateLimits (url, identifier) {
|
|
47
|
+
const ratelimited = rest.rateLimitedPaths.get(`${identifier}${url}`);
|
|
48
|
+
const global = rest.rateLimitedPaths.get('global');
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
if (ratelimited && now < ratelimited.resetTimestamp) {
|
|
51
|
+
return ratelimited.resetTimestamp - now;
|
|
52
|
+
}
|
|
53
|
+
if (global && now < global.resetTimestamp) {
|
|
54
|
+
return global.resetTimestamp - now;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
},
|
|
58
|
+
async updateTokenQueues (oldToken, newToken) {
|
|
59
|
+
if (rest.isProxied) {
|
|
60
|
+
if (!rest.updateBearerTokenEndpoint) {
|
|
61
|
+
throw new Error("The 'proxy.updateBearerTokenEndpoint' option needs to be set when using a rest proxy and needed to call 'updateTokenQueues'");
|
|
62
|
+
}
|
|
63
|
+
const headers = {
|
|
64
|
+
'content-type': 'application/json'
|
|
65
|
+
};
|
|
66
|
+
if (rest.authorization !== undefined) {
|
|
67
|
+
headers[rest.authorizationHeader] = rest.authorization;
|
|
68
|
+
}
|
|
69
|
+
await fetch(`${rest.baseUrl}/${rest.updateBearerTokenEndpoint}`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
body: JSON.stringify({
|
|
72
|
+
oldToken,
|
|
73
|
+
newToken
|
|
74
|
+
}),
|
|
75
|
+
headers
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const newIdentifier = `Bearer ${newToken}`;
|
|
80
|
+
// Update all the queues
|
|
81
|
+
for (const [key, queue] of rest.queues.entries()){
|
|
82
|
+
if (!key.startsWith(`Bearer ${oldToken}`)) continue;
|
|
83
|
+
rest.queues.delete(key);
|
|
84
|
+
queue.identifier = newIdentifier;
|
|
85
|
+
const newKey = `${newIdentifier}${queue.url}`;
|
|
86
|
+
const newQueue = rest.queues.get(newKey);
|
|
87
|
+
// Merge the queues
|
|
88
|
+
if (newQueue) {
|
|
89
|
+
newQueue.waiting.unshift(...queue.waiting);
|
|
90
|
+
newQueue.pending.unshift(...queue.pending);
|
|
91
|
+
queue.waiting = [];
|
|
92
|
+
queue.pending = [];
|
|
93
|
+
queue.cleanup();
|
|
94
|
+
} else {
|
|
95
|
+
rest.queues.set(newKey, queue);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
for (const [key, ratelimitPath] of rest.rateLimitedPaths.entries()){
|
|
99
|
+
if (!key.startsWith(`Bearer ${oldToken}`)) continue;
|
|
100
|
+
rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.url}`, ratelimitPath);
|
|
101
|
+
if (ratelimitPath.bucketId) {
|
|
102
|
+
rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.bucketId}`, ratelimitPath);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
changeToDiscordFormat (obj) {
|
|
107
|
+
if (obj === null) return null;
|
|
108
|
+
if (typeof obj === 'object') {
|
|
109
|
+
if (Array.isArray(obj)) {
|
|
110
|
+
return obj.map((item)=>rest.changeToDiscordFormat(item));
|
|
111
|
+
}
|
|
112
|
+
const newObj = {};
|
|
113
|
+
for (const key of Object.keys(obj)){
|
|
114
|
+
const value = obj[key];
|
|
115
|
+
// If the key is already in snake_case we can assume it is already in the discord format.
|
|
116
|
+
if (key.includes('_')) {
|
|
117
|
+
newObj[key] = value;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// Some falsy values should be allowed like null or 0
|
|
121
|
+
if (value !== undefined) {
|
|
122
|
+
switch(key){
|
|
123
|
+
case 'permissions':
|
|
124
|
+
case 'allow':
|
|
125
|
+
case 'deny':
|
|
126
|
+
newObj[key] = typeof value === 'string' ? value : calculateBits(value);
|
|
127
|
+
continue;
|
|
128
|
+
case 'defaultMemberPermissions':
|
|
129
|
+
newObj.default_member_permissions = typeof value === 'string' ? value : calculateBits(value);
|
|
130
|
+
continue;
|
|
131
|
+
case 'nameLocalizations':
|
|
132
|
+
newObj.name_localizations = value;
|
|
133
|
+
continue;
|
|
134
|
+
case 'descriptionLocalizations':
|
|
135
|
+
newObj.description_localizations = value;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(value);
|
|
140
|
+
}
|
|
141
|
+
return newObj;
|
|
142
|
+
}
|
|
143
|
+
if (typeof obj === 'bigint') return obj.toString();
|
|
144
|
+
return obj;
|
|
145
|
+
},
|
|
146
|
+
createRequestBody (method, options) {
|
|
147
|
+
const headers = this.createBaseHeaders();
|
|
148
|
+
if (options?.unauthorized !== true) headers.authorization = `Bot ${rest.token}`;
|
|
149
|
+
// IF A REASON IS PROVIDED ENCODE IT IN HEADERS
|
|
150
|
+
if (options?.reason !== undefined) {
|
|
151
|
+
headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
|
|
152
|
+
}
|
|
153
|
+
let body;
|
|
154
|
+
// TODO: check if we need to add specific check for GET method
|
|
155
|
+
// Since GET does not allow bodies
|
|
156
|
+
// Have to check for attachments first, since body then has to be send in a different way.
|
|
157
|
+
if (options?.files !== undefined) {
|
|
158
|
+
const form = new FormData();
|
|
159
|
+
for(let i = 0; i < options.files.length; ++i){
|
|
160
|
+
form.append(`file${i}`, options.files[i].blob, options.files[i].name);
|
|
161
|
+
}
|
|
162
|
+
// Have to use changeToDiscordFormat or else JSON.stringify may throw an error for the presence of BigInt(s) in the json
|
|
163
|
+
form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
|
|
164
|
+
...options.body,
|
|
165
|
+
files: undefined
|
|
166
|
+
})));
|
|
167
|
+
// No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
|
|
168
|
+
body = form;
|
|
169
|
+
} else if (options?.body && options.headers && options.headers['content-type'] === 'application/x-www-form-urlencoded') {
|
|
170
|
+
// OAuth2 body handling
|
|
171
|
+
const formBody = [];
|
|
172
|
+
const discordBody = rest.changeToDiscordFormat(options.body);
|
|
173
|
+
for(const prop in discordBody){
|
|
174
|
+
formBody.push(`${encodeURIComponent(prop)}=${encodeURIComponent(discordBody[prop])}`);
|
|
175
|
+
}
|
|
176
|
+
body = formBody.join('&');
|
|
177
|
+
} else if (options?.body !== undefined) {
|
|
178
|
+
if (options.body instanceof FormData) {
|
|
179
|
+
body = options.body;
|
|
180
|
+
// No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
|
|
181
|
+
} else {
|
|
182
|
+
body = JSON.stringify(rest.changeToDiscordFormat(options.body));
|
|
183
|
+
headers['content-type'] = `application/json`;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
|
|
187
|
+
if (options?.headers) {
|
|
188
|
+
Object.assign(headers, options.headers);
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
body,
|
|
192
|
+
headers,
|
|
193
|
+
method
|
|
194
|
+
};
|
|
195
|
+
},
|
|
196
|
+
processRateLimitedPaths () {
|
|
197
|
+
const now = Date.now();
|
|
198
|
+
for (const [key, value] of rest.rateLimitedPaths.entries()){
|
|
199
|
+
// rest.debug(
|
|
200
|
+
// `[REST - processRateLimitedPaths] Running for of loop. ${
|
|
201
|
+
// value.resetTimestamp - now
|
|
202
|
+
// }`
|
|
203
|
+
// )
|
|
204
|
+
// If the time has not reached cancel
|
|
205
|
+
if (value.resetTimestamp > now) continue;
|
|
206
|
+
// Rate limit is over, delete the rate limiter
|
|
207
|
+
rest.rateLimitedPaths.delete(key);
|
|
208
|
+
// If it was global, also mark the global value as false
|
|
209
|
+
if (key === 'global') rest.globallyRateLimited = false;
|
|
210
|
+
}
|
|
211
|
+
// ALL PATHS ARE CLEARED CAN CANCEL OUT!
|
|
212
|
+
if (rest.rateLimitedPaths.size === 0) {
|
|
213
|
+
rest.processingRateLimitedPaths = false;
|
|
214
|
+
} else {
|
|
215
|
+
rest.processingRateLimitedPaths = true;
|
|
216
|
+
// RECHECK IN 1 SECOND
|
|
217
|
+
setTimeout(()=>{
|
|
218
|
+
// rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
|
|
219
|
+
rest.processRateLimitedPaths();
|
|
220
|
+
}, 1000);
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
/** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers, identifier) {
|
|
224
|
+
let rateLimited = false;
|
|
225
|
+
// GET ALL NECESSARY HEADERS
|
|
226
|
+
const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
|
|
227
|
+
const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
228
|
+
const reset = Date.now() + Number(retryAfter) * 1000;
|
|
229
|
+
const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
|
|
230
|
+
// undefined override null needed for typings
|
|
231
|
+
const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
|
|
232
|
+
const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
|
|
233
|
+
// If we didn't received the identifier, fallback to the bot token
|
|
234
|
+
identifier ??= `Bot ${rest.token}`;
|
|
235
|
+
rest.queues.get(`${identifier}${url}`)?.handleCompletedRequest({
|
|
236
|
+
remaining: remaining ? Number(remaining) : undefined,
|
|
237
|
+
interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
|
|
238
|
+
max: limit ? Number(limit) : undefined
|
|
239
|
+
});
|
|
240
|
+
// IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
|
|
241
|
+
if (remaining === '0') {
|
|
242
|
+
rateLimited = true;
|
|
243
|
+
// SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
|
|
244
|
+
rest.rateLimitedPaths.set(`${identifier}${url}`, {
|
|
245
|
+
url,
|
|
246
|
+
resetTimestamp: reset,
|
|
247
|
+
bucketId
|
|
248
|
+
});
|
|
249
|
+
// SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
|
|
250
|
+
if (bucketId) {
|
|
251
|
+
rest.rateLimitedPaths.set(`${identifier}${bucketId}`, {
|
|
252
|
+
url,
|
|
253
|
+
resetTimestamp: reset,
|
|
254
|
+
bucketId
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
|
|
259
|
+
if (global) {
|
|
260
|
+
const retryAfter = Number(headers.get('retry-after')) * 1000;
|
|
261
|
+
const globalReset = Date.now() + retryAfter;
|
|
262
|
+
// rest.debug(
|
|
263
|
+
// `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
|
|
264
|
+
// )
|
|
265
|
+
rest.globallyRateLimited = true;
|
|
266
|
+
rateLimited = true;
|
|
267
|
+
setTimeout(()=>{
|
|
268
|
+
rest.globallyRateLimited = false;
|
|
269
|
+
}, retryAfter);
|
|
270
|
+
rest.rateLimitedPaths.set('global', {
|
|
271
|
+
url: 'global',
|
|
272
|
+
resetTimestamp: globalReset,
|
|
273
|
+
bucketId
|
|
274
|
+
});
|
|
275
|
+
if (bucketId) {
|
|
276
|
+
rest.rateLimitedPaths.set(identifier, {
|
|
277
|
+
url: 'global',
|
|
278
|
+
resetTimestamp: globalReset,
|
|
279
|
+
bucketId
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (rateLimited && !rest.processingRateLimitedPaths) {
|
|
284
|
+
rest.processRateLimitedPaths();
|
|
285
|
+
}
|
|
286
|
+
return rateLimited ? bucketId : undefined;
|
|
287
|
+
},
|
|
288
|
+
async sendRequest (options) {
|
|
289
|
+
const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
|
|
290
|
+
const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
|
|
291
|
+
const loggingHeaders = {
|
|
292
|
+
...payload.headers
|
|
293
|
+
};
|
|
294
|
+
if (payload.headers.authorization) {
|
|
295
|
+
const authorizationScheme = payload.headers.authorization?.split(' ')[0];
|
|
296
|
+
loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
|
|
297
|
+
}
|
|
298
|
+
rest.logger.debug(`sending request to ${url}`, 'with payload:', {
|
|
299
|
+
...payload,
|
|
300
|
+
headers: loggingHeaders
|
|
301
|
+
});
|
|
302
|
+
const response = await fetch(url, payload).catch(async (error)=>{
|
|
303
|
+
rest.logger.error(error);
|
|
304
|
+
// Mark request and completed
|
|
305
|
+
rest.invalidBucket.handleCompletedRequest(999, false);
|
|
306
|
+
options.reject({
|
|
307
|
+
ok: false,
|
|
308
|
+
status: 999,
|
|
309
|
+
error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
|
|
310
|
+
});
|
|
311
|
+
throw error;
|
|
312
|
+
});
|
|
313
|
+
rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
|
|
314
|
+
// Mark request and completed
|
|
315
|
+
rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
|
|
316
|
+
// Set the bucket id if it was available on the headers
|
|
317
|
+
const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
|
|
318
|
+
if (bucketId) options.bucketId = bucketId;
|
|
319
|
+
if (response.status < 200 || response.status >= 400) {
|
|
320
|
+
rest.logger.debug(`Request to ${url} failed.`);
|
|
321
|
+
if (response.status !== 429) {
|
|
322
|
+
options.reject({
|
|
323
|
+
ok: false,
|
|
324
|
+
status: response.status,
|
|
325
|
+
body: await response.text()
|
|
326
|
+
});
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
rest.logger.debug(`Request to ${url} was ratelimited.`);
|
|
330
|
+
// Too many attempts, get rid of request from queue.
|
|
331
|
+
if (options.retryCount >= rest.maxRetryCount) {
|
|
332
|
+
rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
|
|
333
|
+
// rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
|
|
334
|
+
options.reject({
|
|
335
|
+
ok: false,
|
|
336
|
+
status: response.status,
|
|
337
|
+
error: 'The request was rate limited and it maxed out the retries limit.'
|
|
338
|
+
});
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
options.retryCount += 1;
|
|
342
|
+
const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
343
|
+
if (resetAfter) await delay(Number(resetAfter) * 1000);
|
|
344
|
+
// process the response to prevent mem leak
|
|
345
|
+
await response.arrayBuffer();
|
|
346
|
+
return await options.retryRequest?.(options);
|
|
347
|
+
}
|
|
348
|
+
// Discord sometimes sends no response with no content.
|
|
349
|
+
options.resolve({
|
|
350
|
+
ok: true,
|
|
351
|
+
status: response.status,
|
|
352
|
+
body: response.status === 204 ? undefined : await response.text()
|
|
353
|
+
});
|
|
354
|
+
},
|
|
355
|
+
simplifyUrl (url, method) {
|
|
356
|
+
const parts = url.split('/');
|
|
357
|
+
const secondLastPart = parts[parts.length - 2];
|
|
358
|
+
if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
|
|
359
|
+
return url;
|
|
360
|
+
}
|
|
361
|
+
if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
|
|
362
|
+
parts.splice(-2);
|
|
363
|
+
parts.push('reactions');
|
|
364
|
+
} else {
|
|
365
|
+
parts.splice(-1);
|
|
366
|
+
parts.push('x');
|
|
367
|
+
}
|
|
368
|
+
if (parts[parts.length - 3] === 'reactions') {
|
|
369
|
+
parts.splice(-2);
|
|
370
|
+
}
|
|
371
|
+
if (method === 'DELETE' && secondLastPart === 'messages') {
|
|
372
|
+
return `D${parts.join('/')}`;
|
|
373
|
+
}
|
|
374
|
+
return parts.join('/');
|
|
375
|
+
},
|
|
376
|
+
async processRequest (request) {
|
|
377
|
+
const url = rest.simplifyUrl(request.route, request.method);
|
|
378
|
+
if (request.runThroughQueue === false) {
|
|
379
|
+
await rest.sendRequest(request);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
// If we the request has a token, use it
|
|
383
|
+
// Else fallback to prefix with the bot token
|
|
384
|
+
const queueIdentifier = request.requestBodyOptions?.headers?.authorization ?? `Bot ${rest.token}`;
|
|
385
|
+
const queue = rest.queues.get(`${queueIdentifier}${url}`);
|
|
386
|
+
if (queue !== undefined) {
|
|
387
|
+
queue.makeRequest(request);
|
|
388
|
+
} else {
|
|
389
|
+
// CREATES A NEW QUEUE
|
|
390
|
+
const bucketQueue = new Queue(rest, {
|
|
391
|
+
url,
|
|
392
|
+
deleteQueueDelay: rest.deleteQueueDelay,
|
|
393
|
+
identifier: queueIdentifier
|
|
394
|
+
});
|
|
395
|
+
// Save queue
|
|
396
|
+
rest.queues.set(`${queueIdentifier}${url}`, bucketQueue);
|
|
397
|
+
// Add request to queue
|
|
398
|
+
bucketQueue.makeRequest(request);
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
async makeRequest (method, route, options) {
|
|
402
|
+
// This error needs to be created here because of how stack traces get calculated
|
|
403
|
+
const error = new Error();
|
|
404
|
+
error.message = 'Failed to send request to discord.';
|
|
405
|
+
if (rest.isProxied) {
|
|
406
|
+
if (rest.authorization) {
|
|
407
|
+
options ??= {};
|
|
408
|
+
options.headers ??= {};
|
|
409
|
+
options.headers[rest.authorizationHeader] = rest.authorization;
|
|
410
|
+
}
|
|
411
|
+
const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
|
|
412
|
+
if (!result.ok) {
|
|
413
|
+
const errText = await result.text().catch(()=>null);
|
|
414
|
+
if (errText) {
|
|
415
|
+
error.cause = {
|
|
416
|
+
ok: false,
|
|
417
|
+
status: result.status,
|
|
418
|
+
body: errText
|
|
419
|
+
};
|
|
420
|
+
throw error;
|
|
421
|
+
}
|
|
422
|
+
const err = await result.json().catch(()=>{});
|
|
423
|
+
// Legacy Handling to not break old code or when body is missing
|
|
424
|
+
if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
|
|
425
|
+
throw new Error(JSON.stringify(err));
|
|
426
|
+
}
|
|
427
|
+
return result.status !== 204 ? await result.json() : undefined;
|
|
428
|
+
}
|
|
429
|
+
return await new Promise(async (resolve, reject)=>{
|
|
430
|
+
const payload = {
|
|
431
|
+
route,
|
|
432
|
+
method,
|
|
433
|
+
requestBodyOptions: options,
|
|
434
|
+
retryCount: 0,
|
|
435
|
+
retryRequest: async (payload)=>{
|
|
436
|
+
await rest.processRequest(payload);
|
|
437
|
+
},
|
|
438
|
+
resolve: (data)=>{
|
|
439
|
+
resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
|
|
440
|
+
},
|
|
441
|
+
reject: (reason)=>{
|
|
442
|
+
error.cause = reason;
|
|
443
|
+
reject(error);
|
|
444
|
+
},
|
|
445
|
+
runThroughQueue: options?.runThroughQueue
|
|
446
|
+
};
|
|
447
|
+
await rest.processRequest(payload);
|
|
448
|
+
});
|
|
449
|
+
},
|
|
450
|
+
async get (url, options) {
|
|
451
|
+
return camelize(await rest.makeRequest('GET', url, options));
|
|
452
|
+
},
|
|
453
|
+
async post (url, options) {
|
|
454
|
+
return camelize(await rest.makeRequest('POST', url, options));
|
|
455
|
+
},
|
|
456
|
+
async delete (url, options) {
|
|
457
|
+
camelize(await rest.makeRequest('DELETE', url, options));
|
|
458
|
+
},
|
|
459
|
+
async patch (url, options) {
|
|
460
|
+
return camelize(await rest.makeRequest('PATCH', url, options));
|
|
461
|
+
},
|
|
462
|
+
async put (url, options) {
|
|
463
|
+
return camelize(await rest.makeRequest('PUT', url, options));
|
|
464
|
+
},
|
|
465
|
+
async addReaction (channelId, messageId, reaction) {
|
|
466
|
+
reaction = processReactionString(reaction);
|
|
467
|
+
await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
468
|
+
},
|
|
469
|
+
async addReactions (channelId, messageId, reactions, ordered = false) {
|
|
470
|
+
if (!ordered) {
|
|
471
|
+
await Promise.all(reactions.map(async (reaction)=>{
|
|
472
|
+
await rest.addReaction(channelId, messageId, reaction);
|
|
473
|
+
}));
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
for (const reaction of reactions){
|
|
477
|
+
await rest.addReaction(channelId, messageId, reaction);
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
async addRole (guildId, userId, roleId, reason) {
|
|
481
|
+
await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
482
|
+
reason
|
|
483
|
+
});
|
|
484
|
+
},
|
|
485
|
+
async addThreadMember (channelId, userId) {
|
|
486
|
+
await rest.put(rest.routes.channels.threads.user(channelId, userId));
|
|
487
|
+
},
|
|
488
|
+
async addDmRecipient (channelId, userId, body) {
|
|
489
|
+
await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
|
|
490
|
+
body
|
|
491
|
+
});
|
|
492
|
+
},
|
|
493
|
+
async createAutomodRule (guildId, body, reason) {
|
|
494
|
+
return await rest.post(rest.routes.guilds.automod.rules(guildId), {
|
|
495
|
+
body,
|
|
496
|
+
reason
|
|
497
|
+
});
|
|
498
|
+
},
|
|
499
|
+
async createChannel (guildId, body, reason) {
|
|
500
|
+
return await rest.post(rest.routes.guilds.channels(guildId), {
|
|
501
|
+
body,
|
|
502
|
+
reason
|
|
503
|
+
});
|
|
504
|
+
},
|
|
505
|
+
async createEmoji (guildId, body, reason) {
|
|
506
|
+
return await rest.post(rest.routes.guilds.emojis(guildId), {
|
|
507
|
+
body,
|
|
508
|
+
reason
|
|
509
|
+
});
|
|
510
|
+
},
|
|
511
|
+
async createApplicationEmoji (body) {
|
|
512
|
+
return await rest.post(rest.routes.applicationEmojis(rest.applicationId), {
|
|
513
|
+
body
|
|
514
|
+
});
|
|
515
|
+
},
|
|
516
|
+
async createGlobalApplicationCommand (body, options) {
|
|
517
|
+
const restOptions = {
|
|
518
|
+
body
|
|
519
|
+
};
|
|
520
|
+
if (options?.bearerToken) {
|
|
521
|
+
restOptions.unauthorized = true;
|
|
522
|
+
restOptions.headers = {
|
|
523
|
+
authorization: `Bearer ${options.bearerToken}`
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
|
|
527
|
+
},
|
|
528
|
+
async createGuild (body) {
|
|
529
|
+
return await rest.post(rest.routes.guilds.all(), {
|
|
530
|
+
body
|
|
531
|
+
});
|
|
532
|
+
},
|
|
533
|
+
async createGuildApplicationCommand (body, guildId, options) {
|
|
534
|
+
const restOptions = {
|
|
535
|
+
body
|
|
536
|
+
};
|
|
537
|
+
if (options?.bearerToken) {
|
|
538
|
+
restOptions.unauthorized = true;
|
|
539
|
+
restOptions.headers = {
|
|
540
|
+
authorization: `Bearer ${options.bearerToken}`
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
|
|
544
|
+
},
|
|
545
|
+
async createGuildFromTemplate (templateCode, body) {
|
|
546
|
+
if (body.icon) {
|
|
547
|
+
body.icon = await urlToBase64(body.icon);
|
|
548
|
+
}
|
|
549
|
+
return await rest.post(rest.routes.guilds.templates.code(templateCode), {
|
|
550
|
+
body
|
|
551
|
+
});
|
|
552
|
+
},
|
|
553
|
+
async createGuildSticker (guildId, options, reason) {
|
|
554
|
+
const form = new FormData();
|
|
555
|
+
form.append('file', options.file.blob, options.file.name);
|
|
556
|
+
form.append('name', options.name);
|
|
557
|
+
form.append('description', options.description);
|
|
558
|
+
form.append('tags', options.tags);
|
|
559
|
+
return await rest.post(rest.routes.guilds.stickers(guildId), {
|
|
560
|
+
body: form,
|
|
561
|
+
reason
|
|
562
|
+
});
|
|
563
|
+
},
|
|
564
|
+
async createGuildTemplate (guildId, body) {
|
|
565
|
+
return await rest.post(rest.routes.guilds.templates.all(guildId), {
|
|
566
|
+
body
|
|
567
|
+
});
|
|
568
|
+
},
|
|
569
|
+
async createForumThread (channelId, body, reason) {
|
|
570
|
+
return await rest.post(rest.routes.channels.forum(channelId), {
|
|
571
|
+
body,
|
|
572
|
+
files: body.files,
|
|
573
|
+
reason
|
|
574
|
+
});
|
|
575
|
+
},
|
|
576
|
+
async createInvite (channelId, body = {}, reason) {
|
|
577
|
+
return await rest.post(rest.routes.channels.invites(channelId), {
|
|
578
|
+
body,
|
|
579
|
+
reason
|
|
580
|
+
});
|
|
581
|
+
},
|
|
582
|
+
async createRole (guildId, body, reason) {
|
|
583
|
+
return await rest.post(rest.routes.guilds.roles.all(guildId), {
|
|
584
|
+
body,
|
|
585
|
+
reason
|
|
586
|
+
});
|
|
587
|
+
},
|
|
588
|
+
async createScheduledEvent (guildId, body, reason) {
|
|
589
|
+
return await rest.post(rest.routes.guilds.events.events(guildId), {
|
|
590
|
+
body,
|
|
591
|
+
reason
|
|
592
|
+
});
|
|
593
|
+
},
|
|
594
|
+
async createStageInstance (body, reason) {
|
|
595
|
+
return await rest.post(rest.routes.channels.stages(), {
|
|
596
|
+
body,
|
|
597
|
+
reason
|
|
598
|
+
});
|
|
599
|
+
},
|
|
600
|
+
async createWebhook (channelId, options, reason) {
|
|
601
|
+
return await rest.post(rest.routes.channels.webhooks(channelId), {
|
|
602
|
+
body: {
|
|
603
|
+
name: options.name,
|
|
604
|
+
avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
|
|
605
|
+
},
|
|
606
|
+
reason
|
|
607
|
+
});
|
|
608
|
+
},
|
|
609
|
+
async deleteAutomodRule (guildId, ruleId, reason) {
|
|
610
|
+
await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
611
|
+
reason
|
|
612
|
+
});
|
|
613
|
+
},
|
|
614
|
+
async deleteChannel (channelId, reason) {
|
|
615
|
+
await rest.delete(rest.routes.channels.channel(channelId), {
|
|
616
|
+
reason
|
|
617
|
+
});
|
|
618
|
+
},
|
|
619
|
+
async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
|
|
620
|
+
await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
|
|
621
|
+
reason
|
|
622
|
+
});
|
|
623
|
+
},
|
|
624
|
+
async deleteEmoji (guildId, id, reason) {
|
|
625
|
+
await rest.delete(rest.routes.guilds.emoji(guildId, id), {
|
|
626
|
+
reason
|
|
627
|
+
});
|
|
628
|
+
},
|
|
629
|
+
async deleteApplicationEmoji (id) {
|
|
630
|
+
await rest.delete(rest.routes.applicationEmoji(rest.applicationId, id));
|
|
631
|
+
},
|
|
632
|
+
async deleteFollowupMessage (token, messageId) {
|
|
633
|
+
await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
634
|
+
unauthorized: true
|
|
635
|
+
});
|
|
636
|
+
},
|
|
637
|
+
async deleteGlobalApplicationCommand (commandId) {
|
|
638
|
+
await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
639
|
+
},
|
|
640
|
+
async deleteGuild (guildId) {
|
|
641
|
+
await rest.delete(rest.routes.guilds.guild(guildId));
|
|
642
|
+
},
|
|
643
|
+
async deleteGuildApplicationCommand (commandId, guildId) {
|
|
644
|
+
await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
645
|
+
},
|
|
646
|
+
async deleteGuildSticker (guildId, stickerId, reason) {
|
|
647
|
+
await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
648
|
+
reason
|
|
649
|
+
});
|
|
650
|
+
},
|
|
651
|
+
async deleteGuildTemplate (guildId, templateCode) {
|
|
652
|
+
await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
|
|
653
|
+
},
|
|
654
|
+
async deleteIntegration (guildId, integrationId, reason) {
|
|
655
|
+
await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
|
|
656
|
+
reason
|
|
657
|
+
});
|
|
658
|
+
},
|
|
659
|
+
async deleteInvite (inviteCode, reason) {
|
|
660
|
+
await rest.delete(rest.routes.guilds.invite(inviteCode), {
|
|
661
|
+
reason
|
|
662
|
+
});
|
|
663
|
+
},
|
|
664
|
+
async deleteMessage (channelId, messageId, reason) {
|
|
665
|
+
await rest.delete(rest.routes.channels.message(channelId, messageId), {
|
|
666
|
+
reason
|
|
667
|
+
});
|
|
668
|
+
},
|
|
669
|
+
async deleteMessages (channelId, messageIds, reason) {
|
|
670
|
+
await rest.post(rest.routes.channels.bulk(channelId), {
|
|
671
|
+
body: {
|
|
672
|
+
messages: messageIds.slice(0, 100).map((id)=>id.toString())
|
|
673
|
+
},
|
|
674
|
+
reason
|
|
675
|
+
});
|
|
676
|
+
},
|
|
677
|
+
async deleteOriginalInteractionResponse (token) {
|
|
678
|
+
await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
679
|
+
unauthorized: true
|
|
680
|
+
});
|
|
681
|
+
},
|
|
682
|
+
async deleteOwnReaction (channelId, messageId, reaction) {
|
|
683
|
+
reaction = processReactionString(reaction);
|
|
684
|
+
await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
685
|
+
},
|
|
686
|
+
async deleteReactionsAll (channelId, messageId) {
|
|
687
|
+
await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
|
|
688
|
+
},
|
|
689
|
+
async deleteReactionsEmoji (channelId, messageId, reaction) {
|
|
690
|
+
reaction = processReactionString(reaction);
|
|
691
|
+
await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
|
|
692
|
+
},
|
|
693
|
+
async deleteRole (guildId, roleId, reason) {
|
|
694
|
+
await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
|
|
695
|
+
reason
|
|
696
|
+
});
|
|
697
|
+
},
|
|
698
|
+
async deleteScheduledEvent (guildId, eventId) {
|
|
699
|
+
await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
|
|
700
|
+
},
|
|
701
|
+
async deleteStageInstance (channelId, reason) {
|
|
702
|
+
await rest.delete(rest.routes.channels.stage(channelId), {
|
|
703
|
+
reason
|
|
704
|
+
});
|
|
705
|
+
},
|
|
706
|
+
async deleteUserReaction (channelId, messageId, userId, reaction) {
|
|
707
|
+
reaction = processReactionString(reaction);
|
|
708
|
+
await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
|
|
709
|
+
},
|
|
710
|
+
async deleteWebhook (webhookId, reason) {
|
|
711
|
+
await rest.delete(rest.routes.webhooks.id(webhookId), {
|
|
712
|
+
reason
|
|
713
|
+
});
|
|
714
|
+
},
|
|
715
|
+
async deleteWebhookMessage (webhookId, token, messageId, options) {
|
|
716
|
+
await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
|
|
717
|
+
},
|
|
718
|
+
async deleteWebhookWithToken (webhookId, token) {
|
|
719
|
+
await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
|
|
720
|
+
unauthorized: true
|
|
721
|
+
});
|
|
722
|
+
},
|
|
723
|
+
async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
|
|
724
|
+
return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
|
|
725
|
+
body: {
|
|
726
|
+
permissions
|
|
727
|
+
},
|
|
728
|
+
headers: {
|
|
729
|
+
authorization: `Bearer ${bearerToken}`
|
|
730
|
+
}
|
|
731
|
+
});
|
|
732
|
+
},
|
|
733
|
+
async editAutomodRule (guildId, ruleId, body, reason) {
|
|
734
|
+
return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
735
|
+
body,
|
|
736
|
+
reason
|
|
737
|
+
});
|
|
738
|
+
},
|
|
739
|
+
async editBotProfile (options) {
|
|
740
|
+
const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
|
|
741
|
+
const banner = options?.botBannerURL ? await urlToBase64(options?.botBannerURL) : options?.botBannerURL;
|
|
742
|
+
return await rest.patch(rest.routes.currentUser(), {
|
|
743
|
+
body: {
|
|
744
|
+
username: options.username?.trim(),
|
|
745
|
+
avatar,
|
|
746
|
+
banner
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
},
|
|
750
|
+
async editChannel (channelId, body, reason) {
|
|
751
|
+
return await rest.patch(rest.routes.channels.channel(channelId), {
|
|
752
|
+
body,
|
|
753
|
+
reason
|
|
754
|
+
});
|
|
755
|
+
},
|
|
756
|
+
async editChannelPermissionOverrides (channelId, body, reason) {
|
|
757
|
+
await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
|
|
758
|
+
body,
|
|
759
|
+
reason
|
|
760
|
+
});
|
|
761
|
+
},
|
|
762
|
+
async editChannelPositions (guildId, body) {
|
|
763
|
+
await rest.patch(rest.routes.guilds.channels(guildId), {
|
|
764
|
+
body
|
|
765
|
+
});
|
|
766
|
+
},
|
|
767
|
+
async editEmoji (guildId, id, body, reason) {
|
|
768
|
+
return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
|
|
769
|
+
body,
|
|
770
|
+
reason
|
|
771
|
+
});
|
|
772
|
+
},
|
|
773
|
+
async editApplicationEmoji (id, body) {
|
|
774
|
+
return await rest.patch(rest.routes.applicationEmoji(rest.applicationId, id), {
|
|
775
|
+
body
|
|
776
|
+
});
|
|
777
|
+
},
|
|
778
|
+
async editFollowupMessage (token, messageId, body) {
|
|
779
|
+
return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
780
|
+
body,
|
|
781
|
+
files: body.files,
|
|
782
|
+
unauthorized: true
|
|
783
|
+
});
|
|
784
|
+
},
|
|
785
|
+
async editGlobalApplicationCommand (commandId, body) {
|
|
786
|
+
return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
|
|
787
|
+
body
|
|
788
|
+
});
|
|
789
|
+
},
|
|
790
|
+
async editGuild (guildId, body, reason) {
|
|
791
|
+
return await rest.patch(rest.routes.guilds.guild(guildId), {
|
|
792
|
+
body,
|
|
793
|
+
reason
|
|
794
|
+
});
|
|
795
|
+
},
|
|
796
|
+
async editGuildApplicationCommand (commandId, guildId, body) {
|
|
797
|
+
return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
|
|
798
|
+
body
|
|
799
|
+
});
|
|
800
|
+
},
|
|
801
|
+
async editGuildMfaLevel (guildId, mfaLevel, reason) {
|
|
802
|
+
await rest.post(rest.routes.guilds.mfa(guildId), {
|
|
803
|
+
body: {
|
|
804
|
+
level: mfaLevel
|
|
805
|
+
},
|
|
806
|
+
reason
|
|
807
|
+
});
|
|
808
|
+
},
|
|
809
|
+
async editGuildSticker (guildId, stickerId, body, reason) {
|
|
810
|
+
return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
811
|
+
body,
|
|
812
|
+
reason
|
|
813
|
+
});
|
|
814
|
+
},
|
|
815
|
+
async editGuildTemplate (guildId, templateCode, body) {
|
|
816
|
+
return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
|
|
817
|
+
body
|
|
818
|
+
});
|
|
819
|
+
},
|
|
820
|
+
async editMessage (channelId, messageId, body) {
|
|
821
|
+
return await rest.patch(rest.routes.channels.message(channelId, messageId), {
|
|
822
|
+
body,
|
|
823
|
+
files: body.files
|
|
824
|
+
});
|
|
825
|
+
},
|
|
826
|
+
async editOriginalInteractionResponse (token, body) {
|
|
827
|
+
return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
828
|
+
body,
|
|
829
|
+
files: body.files
|
|
830
|
+
});
|
|
831
|
+
},
|
|
832
|
+
async editOriginalWebhookMessage (webhookId, token, options) {
|
|
833
|
+
return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
|
|
834
|
+
body: {
|
|
835
|
+
type: InteractionResponseTypes.UpdateMessage,
|
|
836
|
+
data: options
|
|
837
|
+
},
|
|
838
|
+
files: options.files,
|
|
839
|
+
unauthorized: true
|
|
840
|
+
});
|
|
841
|
+
},
|
|
842
|
+
async editOwnVoiceState (guildId, options) {
|
|
843
|
+
await rest.patch(rest.routes.guilds.voice(guildId), {
|
|
844
|
+
body: {
|
|
845
|
+
...options,
|
|
846
|
+
requestToSpeakTimestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
|
|
847
|
+
}
|
|
848
|
+
});
|
|
849
|
+
},
|
|
850
|
+
async editScheduledEvent (guildId, eventId, body, reason) {
|
|
851
|
+
return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
|
|
852
|
+
body,
|
|
853
|
+
reason
|
|
854
|
+
});
|
|
855
|
+
},
|
|
856
|
+
async editRole (guildId, roleId, body, reason) {
|
|
857
|
+
return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
|
|
858
|
+
body,
|
|
859
|
+
reason
|
|
860
|
+
});
|
|
861
|
+
},
|
|
862
|
+
async editRolePositions (guildId, body, reason) {
|
|
863
|
+
return await rest.patch(rest.routes.guilds.roles.all(guildId), {
|
|
864
|
+
body,
|
|
865
|
+
reason
|
|
866
|
+
});
|
|
867
|
+
},
|
|
868
|
+
async editStageInstance (channelId, topic, reason) {
|
|
869
|
+
return await rest.patch(rest.routes.channels.stage(channelId), {
|
|
870
|
+
body: {
|
|
871
|
+
topic
|
|
872
|
+
},
|
|
873
|
+
reason
|
|
874
|
+
});
|
|
875
|
+
},
|
|
876
|
+
async editUserVoiceState (guildId, options) {
|
|
877
|
+
await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
|
|
878
|
+
body: options
|
|
879
|
+
});
|
|
880
|
+
},
|
|
881
|
+
async editWebhook (webhookId, body, reason) {
|
|
882
|
+
return await rest.patch(rest.routes.webhooks.id(webhookId), {
|
|
883
|
+
body,
|
|
884
|
+
reason
|
|
885
|
+
});
|
|
886
|
+
},
|
|
887
|
+
async editWebhookMessage (webhookId, token, messageId, options) {
|
|
888
|
+
return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
889
|
+
body: options,
|
|
890
|
+
files: options.files,
|
|
891
|
+
unauthorized: true
|
|
892
|
+
});
|
|
893
|
+
},
|
|
894
|
+
async editWebhookWithToken (webhookId, token, body) {
|
|
895
|
+
return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
|
|
896
|
+
body,
|
|
897
|
+
unauthorized: true
|
|
898
|
+
});
|
|
899
|
+
},
|
|
900
|
+
async editWelcomeScreen (guildId, body, reason) {
|
|
901
|
+
return await rest.patch(rest.routes.guilds.welcome(guildId), {
|
|
902
|
+
body,
|
|
903
|
+
reason
|
|
904
|
+
});
|
|
905
|
+
},
|
|
906
|
+
async editWidgetSettings (guildId, body, reason) {
|
|
907
|
+
return await rest.patch(rest.routes.guilds.widget(guildId), {
|
|
908
|
+
body,
|
|
909
|
+
reason
|
|
910
|
+
});
|
|
911
|
+
},
|
|
912
|
+
async executeWebhook (webhookId, token, options) {
|
|
913
|
+
return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
|
|
914
|
+
body: options,
|
|
915
|
+
unauthorized: true
|
|
916
|
+
});
|
|
917
|
+
},
|
|
918
|
+
async followAnnouncement (sourceChannelId, targetChannelId, reason) {
|
|
919
|
+
return await rest.post(rest.routes.channels.follow(sourceChannelId), {
|
|
920
|
+
body: {
|
|
921
|
+
webhookChannelId: targetChannelId
|
|
922
|
+
},
|
|
923
|
+
reason
|
|
924
|
+
});
|
|
925
|
+
},
|
|
926
|
+
async getActiveThreads (guildId) {
|
|
927
|
+
return await rest.get(rest.routes.channels.threads.active(guildId));
|
|
928
|
+
},
|
|
929
|
+
async getApplicationCommandPermission (guildId, commandId, options) {
|
|
930
|
+
const restOptions = {};
|
|
931
|
+
if (options?.accessToken) {
|
|
932
|
+
restOptions.unauthorized = true;
|
|
933
|
+
restOptions.headers = {
|
|
934
|
+
authorization: `Bearer ${options.accessToken}`
|
|
935
|
+
};
|
|
936
|
+
}
|
|
937
|
+
return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
|
|
938
|
+
},
|
|
939
|
+
async getApplicationCommandPermissions (guildId, options) {
|
|
940
|
+
const restOptions = {};
|
|
941
|
+
if (options?.accessToken) {
|
|
942
|
+
restOptions.unauthorized = true;
|
|
943
|
+
restOptions.headers = {
|
|
944
|
+
authorization: `Bearer ${options.accessToken}`
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
|
|
948
|
+
},
|
|
949
|
+
async getApplicationInfo () {
|
|
950
|
+
return await rest.get(rest.routes.oauth2.application());
|
|
951
|
+
},
|
|
952
|
+
async editApplicationInfo (body) {
|
|
953
|
+
return await rest.patch(rest.routes.application(), {
|
|
954
|
+
body
|
|
955
|
+
});
|
|
956
|
+
},
|
|
957
|
+
async getCurrentAuthenticationInfo (token) {
|
|
958
|
+
return await rest.get(rest.routes.oauth2.currentAuthorization(), {
|
|
959
|
+
headers: {
|
|
960
|
+
authorization: `Bearer ${token}`
|
|
961
|
+
},
|
|
962
|
+
unauthorized: true
|
|
963
|
+
});
|
|
964
|
+
},
|
|
965
|
+
async exchangeToken (clientId, clientSecret, body) {
|
|
966
|
+
const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
|
|
967
|
+
const restOptions = {
|
|
968
|
+
body,
|
|
969
|
+
headers: {
|
|
970
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
971
|
+
authorization: `Basic ${basicCredentials.toString('base64')}`
|
|
972
|
+
},
|
|
973
|
+
runThroughQueue: false,
|
|
974
|
+
unauthorized: true
|
|
975
|
+
};
|
|
976
|
+
if (body.grantType === 'client_credentials') {
|
|
977
|
+
restOptions.body.scope = body.scope.join(' ');
|
|
978
|
+
}
|
|
979
|
+
return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
|
|
980
|
+
},
|
|
981
|
+
async revokeToken (clientId, clientSecret, body) {
|
|
982
|
+
const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
|
|
983
|
+
await rest.post(rest.routes.oauth2.tokenRevoke(), {
|
|
984
|
+
body,
|
|
985
|
+
headers: {
|
|
986
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
987
|
+
authorization: `Basic ${basicCredentials.toString('base64')}`
|
|
988
|
+
},
|
|
989
|
+
unauthorized: true
|
|
990
|
+
});
|
|
991
|
+
},
|
|
992
|
+
async getAuditLog (guildId, options) {
|
|
993
|
+
return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
|
|
994
|
+
},
|
|
995
|
+
async getAutomodRule (guildId, ruleId) {
|
|
996
|
+
return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
|
|
997
|
+
},
|
|
998
|
+
async getAutomodRules (guildId) {
|
|
999
|
+
return await rest.get(rest.routes.guilds.automod.rules(guildId));
|
|
1000
|
+
},
|
|
1001
|
+
async getAvailableVoiceRegions () {
|
|
1002
|
+
return await rest.get(rest.routes.regions());
|
|
1003
|
+
},
|
|
1004
|
+
async getBan (guildId, userId) {
|
|
1005
|
+
return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
|
|
1006
|
+
},
|
|
1007
|
+
async getBans (guildId, options) {
|
|
1008
|
+
return await rest.get(rest.routes.guilds.members.bans(guildId, options));
|
|
1009
|
+
},
|
|
1010
|
+
async getChannel (id) {
|
|
1011
|
+
return await rest.get(rest.routes.channels.channel(id));
|
|
1012
|
+
},
|
|
1013
|
+
async getChannelInvites (channelId) {
|
|
1014
|
+
return await rest.get(rest.routes.channels.invites(channelId));
|
|
1015
|
+
},
|
|
1016
|
+
async getChannels (guildId) {
|
|
1017
|
+
return await rest.get(rest.routes.guilds.channels(guildId));
|
|
1018
|
+
},
|
|
1019
|
+
async getChannelWebhooks (channelId) {
|
|
1020
|
+
return await rest.get(rest.routes.channels.webhooks(channelId));
|
|
1021
|
+
},
|
|
1022
|
+
async getDmChannel (userId) {
|
|
1023
|
+
return await rest.post(rest.routes.channels.dm(), {
|
|
1024
|
+
body: {
|
|
1025
|
+
recipientId: userId
|
|
1026
|
+
}
|
|
1027
|
+
});
|
|
1028
|
+
},
|
|
1029
|
+
async getGroupDmChannel (body) {
|
|
1030
|
+
return await rest.post(rest.routes.channels.dm(), {
|
|
1031
|
+
body
|
|
1032
|
+
});
|
|
1033
|
+
},
|
|
1034
|
+
async getEmoji (guildId, emojiId) {
|
|
1035
|
+
return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
|
|
1036
|
+
},
|
|
1037
|
+
async getApplicationEmoji (emojiId) {
|
|
1038
|
+
return await rest.get(rest.routes.applicationEmoji(rest.applicationId, emojiId));
|
|
1039
|
+
},
|
|
1040
|
+
async getEmojis (guildId) {
|
|
1041
|
+
return await rest.get(rest.routes.guilds.emojis(guildId));
|
|
1042
|
+
},
|
|
1043
|
+
async getApplicationEmojis () {
|
|
1044
|
+
return await rest.get(rest.routes.applicationEmojis(rest.applicationId));
|
|
1045
|
+
},
|
|
1046
|
+
async getFollowupMessage (token, messageId) {
|
|
1047
|
+
return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
1048
|
+
unauthorized: true
|
|
1049
|
+
});
|
|
1050
|
+
},
|
|
1051
|
+
async getGatewayBot () {
|
|
1052
|
+
return await rest.get(rest.routes.gatewayBot());
|
|
1053
|
+
},
|
|
1054
|
+
async getGlobalApplicationCommand (commandId) {
|
|
1055
|
+
return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
1056
|
+
},
|
|
1057
|
+
async getGlobalApplicationCommands () {
|
|
1058
|
+
return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
|
|
1059
|
+
},
|
|
1060
|
+
async getGuild (guildId, options = {
|
|
1061
|
+
counts: true
|
|
1062
|
+
}) {
|
|
1063
|
+
return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
|
|
1064
|
+
},
|
|
1065
|
+
async getGuilds (token, options) {
|
|
1066
|
+
const makeRequestOptions = token ? {
|
|
1067
|
+
headers: {
|
|
1068
|
+
authorization: `Bearer ${token}`
|
|
1069
|
+
},
|
|
1070
|
+
unauthorized: true
|
|
1071
|
+
} : undefined;
|
|
1072
|
+
return await rest.get(rest.routes.guilds.userGuilds(options), makeRequestOptions);
|
|
1073
|
+
},
|
|
1074
|
+
async getGuildApplicationCommand (commandId, guildId) {
|
|
1075
|
+
return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
1076
|
+
},
|
|
1077
|
+
async getGuildApplicationCommands (guildId) {
|
|
1078
|
+
return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
|
|
1079
|
+
},
|
|
1080
|
+
async getGuildPreview (guildId) {
|
|
1081
|
+
return await rest.get(rest.routes.guilds.preview(guildId));
|
|
1082
|
+
},
|
|
1083
|
+
async getGuildTemplate (templateCode) {
|
|
1084
|
+
return await rest.get(rest.routes.guilds.templates.code(templateCode));
|
|
1085
|
+
},
|
|
1086
|
+
async getGuildTemplates (guildId) {
|
|
1087
|
+
return await rest.get(rest.routes.guilds.templates.all(guildId));
|
|
1088
|
+
},
|
|
1089
|
+
async getGuildWebhooks (guildId) {
|
|
1090
|
+
return await rest.get(rest.routes.guilds.webhooks(guildId));
|
|
1091
|
+
},
|
|
1092
|
+
async getIntegrations (guildId) {
|
|
1093
|
+
return await rest.get(rest.routes.guilds.integrations(guildId));
|
|
1094
|
+
},
|
|
1095
|
+
async getInvite (inviteCode, options) {
|
|
1096
|
+
return await rest.get(rest.routes.guilds.invite(inviteCode, options));
|
|
1097
|
+
},
|
|
1098
|
+
async getInvites (guildId) {
|
|
1099
|
+
return await rest.get(rest.routes.guilds.invites(guildId));
|
|
1100
|
+
},
|
|
1101
|
+
async getMessage (channelId, messageId) {
|
|
1102
|
+
return await rest.get(rest.routes.channels.message(channelId, messageId));
|
|
1103
|
+
},
|
|
1104
|
+
async getMessages (channelId, options) {
|
|
1105
|
+
return await rest.get(rest.routes.channels.messages(channelId, options));
|
|
1106
|
+
},
|
|
1107
|
+
async getStickerPack (stickerPackId) {
|
|
1108
|
+
return await rest.get(rest.routes.stickerPack(stickerPackId));
|
|
1109
|
+
},
|
|
1110
|
+
async getStickerPacks () {
|
|
1111
|
+
return await rest.get(rest.routes.stickerPacks());
|
|
1112
|
+
},
|
|
1113
|
+
async getOriginalInteractionResponse (token) {
|
|
1114
|
+
return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
1115
|
+
unauthorized: true
|
|
1116
|
+
});
|
|
1117
|
+
},
|
|
1118
|
+
async getPinnedMessages (channelId) {
|
|
1119
|
+
return await rest.get(rest.routes.channels.pins(channelId));
|
|
1120
|
+
},
|
|
1121
|
+
async getPrivateArchivedThreads (channelId, options) {
|
|
1122
|
+
return await rest.get(rest.routes.channels.threads.private(channelId, options));
|
|
1123
|
+
},
|
|
1124
|
+
async getPrivateJoinedArchivedThreads (channelId, options) {
|
|
1125
|
+
return await rest.get(rest.routes.channels.threads.joined(channelId, options));
|
|
1126
|
+
},
|
|
1127
|
+
async getPruneCount (guildId, options) {
|
|
1128
|
+
return await rest.get(rest.routes.guilds.prune(guildId, options));
|
|
1129
|
+
},
|
|
1130
|
+
async getPublicArchivedThreads (channelId, options) {
|
|
1131
|
+
return await rest.get(rest.routes.channels.threads.public(channelId, options));
|
|
1132
|
+
},
|
|
1133
|
+
async getRoles (guildId) {
|
|
1134
|
+
return await rest.get(rest.routes.guilds.roles.all(guildId));
|
|
1135
|
+
},
|
|
1136
|
+
async getRole (guildId, roleId) {
|
|
1137
|
+
return await rest.get(rest.routes.guilds.roles.one(guildId, roleId));
|
|
1138
|
+
},
|
|
1139
|
+
async getScheduledEvent (guildId, eventId, options) {
|
|
1140
|
+
return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
|
|
1141
|
+
},
|
|
1142
|
+
async getScheduledEvents (guildId, options) {
|
|
1143
|
+
return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
|
|
1144
|
+
},
|
|
1145
|
+
async getScheduledEventUsers (guildId, eventId, options) {
|
|
1146
|
+
return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
|
|
1147
|
+
},
|
|
1148
|
+
async getSessionInfo () {
|
|
1149
|
+
return await rest.getGatewayBot();
|
|
1150
|
+
},
|
|
1151
|
+
async getStageInstance (channelId) {
|
|
1152
|
+
return await rest.get(rest.routes.channels.stage(channelId));
|
|
1153
|
+
},
|
|
1154
|
+
async getOwnVoiceState (guildId) {
|
|
1155
|
+
return await rest.get(rest.routes.guilds.voice(guildId));
|
|
1156
|
+
},
|
|
1157
|
+
async getUserVoiceState (guildId, userId) {
|
|
1158
|
+
return await rest.get(rest.routes.guilds.voice(guildId, userId));
|
|
1159
|
+
},
|
|
1160
|
+
async getSticker (stickerId) {
|
|
1161
|
+
return await rest.get(rest.routes.sticker(stickerId));
|
|
1162
|
+
},
|
|
1163
|
+
async getGuildSticker (guildId, stickerId) {
|
|
1164
|
+
return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
|
|
1165
|
+
},
|
|
1166
|
+
async getGuildStickers (guildId) {
|
|
1167
|
+
return await rest.get(rest.routes.guilds.stickers(guildId));
|
|
1168
|
+
},
|
|
1169
|
+
async getThreadMember (channelId, userId) {
|
|
1170
|
+
return await rest.get(rest.routes.channels.threads.user(channelId, userId));
|
|
1171
|
+
},
|
|
1172
|
+
async getThreadMembers (channelId) {
|
|
1173
|
+
return await rest.get(rest.routes.channels.threads.members(channelId));
|
|
1174
|
+
},
|
|
1175
|
+
async getReactions (channelId, messageId, reaction, options) {
|
|
1176
|
+
return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
|
|
1177
|
+
},
|
|
1178
|
+
async getUser (id) {
|
|
1179
|
+
return await rest.get(rest.routes.user(id));
|
|
1180
|
+
},
|
|
1181
|
+
async getCurrentUser (token) {
|
|
1182
|
+
return await rest.get(rest.routes.currentUser(), {
|
|
1183
|
+
headers: {
|
|
1184
|
+
authorization: `Bearer ${token}`
|
|
1185
|
+
},
|
|
1186
|
+
unauthorized: true
|
|
1187
|
+
});
|
|
1188
|
+
},
|
|
1189
|
+
async getUserConnections (token) {
|
|
1190
|
+
return await rest.get(rest.routes.oauth2.connections(), {
|
|
1191
|
+
headers: {
|
|
1192
|
+
authorization: `Bearer ${token}`
|
|
1193
|
+
},
|
|
1194
|
+
unauthorized: true
|
|
1195
|
+
});
|
|
1196
|
+
},
|
|
1197
|
+
async getUserApplicationRoleConnection (token, applicationId) {
|
|
1198
|
+
return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
|
|
1199
|
+
headers: {
|
|
1200
|
+
authorization: `Bearer ${token}`
|
|
1201
|
+
},
|
|
1202
|
+
unauthorized: true
|
|
1203
|
+
});
|
|
1204
|
+
},
|
|
1205
|
+
async getVanityUrl (guildId) {
|
|
1206
|
+
return await rest.get(rest.routes.guilds.vanity(guildId));
|
|
1207
|
+
},
|
|
1208
|
+
async getVoiceRegions (guildId) {
|
|
1209
|
+
return await rest.get(rest.routes.guilds.regions(guildId));
|
|
1210
|
+
},
|
|
1211
|
+
async getWebhook (webhookId) {
|
|
1212
|
+
return await rest.get(rest.routes.webhooks.id(webhookId));
|
|
1213
|
+
},
|
|
1214
|
+
async getWebhookMessage (webhookId, token, messageId, options) {
|
|
1215
|
+
return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
1216
|
+
unauthorized: true
|
|
1217
|
+
});
|
|
1218
|
+
},
|
|
1219
|
+
async getWebhookWithToken (webhookId, token) {
|
|
1220
|
+
return await rest.get(rest.routes.webhooks.webhook(webhookId, token), {
|
|
1221
|
+
unauthorized: true
|
|
1222
|
+
});
|
|
1223
|
+
},
|
|
1224
|
+
async getWelcomeScreen (guildId) {
|
|
1225
|
+
return await rest.get(rest.routes.guilds.welcome(guildId));
|
|
1226
|
+
},
|
|
1227
|
+
async getWidget (guildId) {
|
|
1228
|
+
return await rest.get(rest.routes.guilds.widgetJson(guildId));
|
|
1229
|
+
},
|
|
1230
|
+
async getWidgetSettings (guildId) {
|
|
1231
|
+
return await rest.get(rest.routes.guilds.widget(guildId));
|
|
1232
|
+
},
|
|
1233
|
+
async joinThread (channelId) {
|
|
1234
|
+
await rest.put(rest.routes.channels.threads.me(channelId));
|
|
1235
|
+
},
|
|
1236
|
+
async leaveGuild (guildId) {
|
|
1237
|
+
await rest.delete(rest.routes.guilds.leave(guildId));
|
|
1238
|
+
},
|
|
1239
|
+
async leaveThread (channelId) {
|
|
1240
|
+
await rest.delete(rest.routes.channels.threads.me(channelId));
|
|
1241
|
+
},
|
|
1242
|
+
async publishMessage (channelId, messageId) {
|
|
1243
|
+
return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
|
|
1244
|
+
},
|
|
1245
|
+
async removeRole (guildId, userId, roleId, reason) {
|
|
1246
|
+
await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
1247
|
+
reason
|
|
1248
|
+
});
|
|
1249
|
+
},
|
|
1250
|
+
async removeThreadMember (channelId, userId) {
|
|
1251
|
+
await rest.delete(rest.routes.channels.threads.user(channelId, userId));
|
|
1252
|
+
},
|
|
1253
|
+
async removeDmRecipient (channelId, userId) {
|
|
1254
|
+
await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
|
|
1255
|
+
},
|
|
1256
|
+
async sendFollowupMessage (token, options) {
|
|
1257
|
+
return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
|
|
1258
|
+
body: options,
|
|
1259
|
+
files: options.files,
|
|
1260
|
+
unauthorized: true
|
|
1261
|
+
});
|
|
1262
|
+
},
|
|
1263
|
+
async sendInteractionResponse (interactionId, token, options, params) {
|
|
1264
|
+
return await rest.post(rest.routes.interactions.responses.callback(interactionId, token, params), {
|
|
1265
|
+
body: options,
|
|
1266
|
+
files: options.data?.files,
|
|
1267
|
+
runThroughQueue: false,
|
|
1268
|
+
unauthorized: true
|
|
1269
|
+
});
|
|
1270
|
+
},
|
|
1271
|
+
async sendMessage (channelId, body) {
|
|
1272
|
+
return await rest.post(rest.routes.channels.messages(channelId), {
|
|
1273
|
+
body,
|
|
1274
|
+
files: body.files
|
|
1275
|
+
});
|
|
1276
|
+
},
|
|
1277
|
+
async startThreadWithMessage (channelId, messageId, body, reason) {
|
|
1278
|
+
return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
|
|
1279
|
+
body,
|
|
1280
|
+
reason
|
|
1281
|
+
});
|
|
1282
|
+
},
|
|
1283
|
+
async startThreadWithoutMessage (channelId, body, reason) {
|
|
1284
|
+
return await rest.post(rest.routes.channels.threads.all(channelId), {
|
|
1285
|
+
body,
|
|
1286
|
+
reason
|
|
1287
|
+
});
|
|
1288
|
+
},
|
|
1289
|
+
async getPollAnswerVoters (channelId, messageId, answerId, options) {
|
|
1290
|
+
return await rest.get(rest.routes.channels.polls.votes(channelId, messageId, answerId, options));
|
|
1291
|
+
},
|
|
1292
|
+
async endPoll (channelId, messageId) {
|
|
1293
|
+
return await rest.post(rest.routes.channels.polls.expire(channelId, messageId));
|
|
1294
|
+
},
|
|
1295
|
+
async syncGuildTemplate (guildId) {
|
|
1296
|
+
return await rest.put(rest.routes.guilds.templates.all(guildId));
|
|
1297
|
+
},
|
|
1298
|
+
async banMember (guildId, userId, body, reason) {
|
|
1299
|
+
await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1300
|
+
body,
|
|
1301
|
+
reason
|
|
1302
|
+
});
|
|
1303
|
+
},
|
|
1304
|
+
async bulkBanMembers (guildId, options, reason) {
|
|
1305
|
+
return await rest.post(rest.routes.guilds.members.bulkBan(guildId), {
|
|
1306
|
+
body: options,
|
|
1307
|
+
reason
|
|
1308
|
+
});
|
|
1309
|
+
},
|
|
1310
|
+
async editBotMember (guildId, body, reason) {
|
|
1311
|
+
return await rest.patch(rest.routes.guilds.members.bot(guildId), {
|
|
1312
|
+
body,
|
|
1313
|
+
reason
|
|
1314
|
+
});
|
|
1315
|
+
},
|
|
1316
|
+
async editMember (guildId, userId, body, reason) {
|
|
1317
|
+
return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
|
|
1318
|
+
body,
|
|
1319
|
+
reason
|
|
1320
|
+
});
|
|
1321
|
+
},
|
|
1322
|
+
async getMember (guildId, userId) {
|
|
1323
|
+
return await rest.get(rest.routes.guilds.members.member(guildId, userId));
|
|
1324
|
+
},
|
|
1325
|
+
async getCurrentMember (guildId, token) {
|
|
1326
|
+
return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
|
|
1327
|
+
headers: {
|
|
1328
|
+
authorization: `Bearer ${token}`
|
|
1329
|
+
},
|
|
1330
|
+
unauthorized: true
|
|
1331
|
+
});
|
|
1332
|
+
},
|
|
1333
|
+
async getMembers (guildId, options) {
|
|
1334
|
+
return await rest.get(rest.routes.guilds.members.members(guildId, options));
|
|
1335
|
+
},
|
|
1336
|
+
async getApplicationActivityInstance (applicationId, instanceId) {
|
|
1337
|
+
return await rest.get(rest.routes.applicationActivityInstance(applicationId, instanceId));
|
|
1338
|
+
},
|
|
1339
|
+
async kickMember (guildId, userId, reason) {
|
|
1340
|
+
await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
|
|
1341
|
+
reason
|
|
1342
|
+
});
|
|
1343
|
+
},
|
|
1344
|
+
async pinMessage (channelId, messageId, reason) {
|
|
1345
|
+
await rest.put(rest.routes.channels.pin(channelId, messageId), {
|
|
1346
|
+
reason
|
|
1347
|
+
});
|
|
1348
|
+
},
|
|
1349
|
+
async pruneMembers (guildId, body, reason) {
|
|
1350
|
+
return await rest.post(rest.routes.guilds.members.prune(guildId), {
|
|
1351
|
+
body,
|
|
1352
|
+
reason
|
|
1353
|
+
});
|
|
1354
|
+
},
|
|
1355
|
+
async searchMembers (guildId, query, options) {
|
|
1356
|
+
return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
|
|
1357
|
+
},
|
|
1358
|
+
async getGuildOnboarding (guildId) {
|
|
1359
|
+
return await rest.get(rest.routes.guilds.onboarding(guildId));
|
|
1360
|
+
},
|
|
1361
|
+
async editGuildOnboarding (guildId, options, reason) {
|
|
1362
|
+
return await rest.put(rest.routes.guilds.onboarding(guildId), {
|
|
1363
|
+
body: options,
|
|
1364
|
+
reason
|
|
1365
|
+
});
|
|
1366
|
+
},
|
|
1367
|
+
async unbanMember (guildId, userId, reason) {
|
|
1368
|
+
await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1369
|
+
reason
|
|
1370
|
+
});
|
|
1371
|
+
},
|
|
1372
|
+
async unpinMessage (channelId, messageId, reason) {
|
|
1373
|
+
await rest.delete(rest.routes.channels.pin(channelId, messageId), {
|
|
1374
|
+
reason
|
|
1375
|
+
});
|
|
1376
|
+
},
|
|
1377
|
+
async triggerTypingIndicator (channelId) {
|
|
1378
|
+
await rest.post(rest.routes.channels.typing(channelId));
|
|
1379
|
+
},
|
|
1380
|
+
async upsertGlobalApplicationCommands (body, options) {
|
|
1381
|
+
const restOptions = {
|
|
1382
|
+
body
|
|
1383
|
+
};
|
|
1384
|
+
if (options?.bearerToken) {
|
|
1385
|
+
restOptions.unauthorized = true;
|
|
1386
|
+
restOptions.headers = {
|
|
1387
|
+
authorization: `Bearer ${options.bearerToken}`
|
|
1388
|
+
};
|
|
1389
|
+
}
|
|
1390
|
+
return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
|
|
1391
|
+
},
|
|
1392
|
+
async upsertGuildApplicationCommands (guildId, body, options) {
|
|
1393
|
+
const restOptions = {
|
|
1394
|
+
body
|
|
1395
|
+
};
|
|
1396
|
+
if (options?.bearerToken) {
|
|
1397
|
+
restOptions.unauthorized = true;
|
|
1398
|
+
restOptions.headers = {
|
|
1399
|
+
authorization: `Bearer ${options.bearerToken}`
|
|
1400
|
+
};
|
|
1401
|
+
}
|
|
1402
|
+
return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
|
|
1403
|
+
},
|
|
1404
|
+
async editUserApplicationRoleConnection (token, applicationId, body) {
|
|
1405
|
+
return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
|
|
1406
|
+
body,
|
|
1407
|
+
headers: {
|
|
1408
|
+
authorization: `Bearer ${token}`
|
|
1409
|
+
},
|
|
1410
|
+
unauthorized: true
|
|
1411
|
+
});
|
|
1412
|
+
},
|
|
1413
|
+
async addGuildMember (guildId, userId, body) {
|
|
1414
|
+
return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
|
|
1415
|
+
body
|
|
1416
|
+
});
|
|
1417
|
+
},
|
|
1418
|
+
async createTestEntitlement (applicationId, body) {
|
|
1419
|
+
return await rest.post(rest.routes.monetization.entitlements(applicationId), {
|
|
1420
|
+
body
|
|
1421
|
+
});
|
|
1422
|
+
},
|
|
1423
|
+
async listEntitlements (applicationId, options) {
|
|
1424
|
+
return await rest.get(rest.routes.monetization.entitlements(applicationId, options));
|
|
1425
|
+
},
|
|
1426
|
+
async getEntitlement (applicationId, entitlementId) {
|
|
1427
|
+
return await rest.get(rest.routes.monetization.entitlement(applicationId, entitlementId));
|
|
1428
|
+
},
|
|
1429
|
+
async deleteTestEntitlement (applicationId, entitlementId) {
|
|
1430
|
+
await rest.delete(rest.routes.monetization.entitlement(applicationId, entitlementId));
|
|
1431
|
+
},
|
|
1432
|
+
async consumeEntitlement (applicationId, entitlementId) {
|
|
1433
|
+
await rest.post(rest.routes.monetization.consumeEntitlement(applicationId, entitlementId));
|
|
1434
|
+
},
|
|
1435
|
+
async listSkus (applicationId) {
|
|
1436
|
+
return await rest.get(rest.routes.monetization.skus(applicationId));
|
|
1437
|
+
},
|
|
1438
|
+
async listSubscriptions (skuId, options) {
|
|
1439
|
+
return await rest.get(rest.routes.monetization.subscriptions(skuId, options));
|
|
1440
|
+
},
|
|
1441
|
+
async getSubscription (skuId, subscriptionId) {
|
|
1442
|
+
return await rest.get(rest.routes.monetization.subscription(skuId, subscriptionId));
|
|
1443
|
+
},
|
|
1444
|
+
async sendSoundboardSound (channelId, options) {
|
|
1445
|
+
await rest.post(rest.routes.soundboard.sendSound(channelId), {
|
|
1446
|
+
body: options
|
|
1447
|
+
});
|
|
1448
|
+
},
|
|
1449
|
+
async listDefaultSoundboardSounds () {
|
|
1450
|
+
return await rest.get(rest.routes.soundboard.listDefault());
|
|
1451
|
+
},
|
|
1452
|
+
async listGuildSoundboardSounds (guildId) {
|
|
1453
|
+
return await rest.get(rest.routes.soundboard.guildSounds(guildId));
|
|
1454
|
+
},
|
|
1455
|
+
async getGuildSoundboardSound (guildId, soundId) {
|
|
1456
|
+
return await rest.get(rest.routes.soundboard.guildSound(guildId, soundId));
|
|
1457
|
+
},
|
|
1458
|
+
async createGuildSoundboardSound (guildId, options, reason) {
|
|
1459
|
+
return await rest.post(rest.routes.soundboard.guildSounds(guildId), {
|
|
1460
|
+
body: options,
|
|
1461
|
+
reason
|
|
1462
|
+
});
|
|
1463
|
+
},
|
|
1464
|
+
async modifyGuildSoundboardSound (guildId, soundId, options, reason) {
|
|
1465
|
+
return await rest.post(rest.routes.soundboard.guildSound(guildId, soundId), {
|
|
1466
|
+
body: options,
|
|
1467
|
+
reason
|
|
1468
|
+
});
|
|
1469
|
+
},
|
|
1470
|
+
async deleteGuildSoundboardSound (guildId, soundId, reason) {
|
|
1471
|
+
return await rest.delete(rest.routes.soundboard.guildSound(guildId, soundId), {
|
|
1472
|
+
reason
|
|
1473
|
+
});
|
|
1474
|
+
},
|
|
1475
|
+
preferSnakeCase (enabled) {
|
|
1476
|
+
const camelizer = enabled ? (x)=>x : camelize;
|
|
1477
|
+
rest.get = async (url, options)=>{
|
|
1478
|
+
return camelizer(await rest.makeRequest('GET', url, options));
|
|
1479
|
+
};
|
|
1480
|
+
rest.post = async (url, options)=>{
|
|
1481
|
+
return camelizer(await rest.makeRequest('POST', url, options));
|
|
1482
|
+
};
|
|
1483
|
+
rest.delete = async (url, options)=>{
|
|
1484
|
+
camelizer(await rest.makeRequest('DELETE', url, options));
|
|
1485
|
+
};
|
|
1486
|
+
rest.patch = async (url, options)=>{
|
|
1487
|
+
return camelizer(await rest.makeRequest('PATCH', url, options));
|
|
1488
|
+
};
|
|
1489
|
+
rest.put = async (url, options)=>{
|
|
1490
|
+
return camelizer(await rest.makeRequest('PUT', url, options));
|
|
1491
|
+
};
|
|
1492
|
+
return rest;
|
|
1493
|
+
}
|
|
1494
|
+
};
|
|
1495
|
+
return rest;
|
|
1496
|
+
}
|
|
1497
|
+
var HttpResponseCode = /*#__PURE__*/ function(HttpResponseCode) {
|
|
1498
|
+
/** Minimum value of a code in oder to consider that it was successful. */ HttpResponseCode[HttpResponseCode["Success"] = 200] = "Success";
|
|
1499
|
+
/** Request completed successfully, but Discord returned an empty body. */ HttpResponseCode[HttpResponseCode["NoContent"] = 204] = "NoContent";
|
|
1500
|
+
/** Minimum value of a code in order to consider that something went wrong. */ HttpResponseCode[HttpResponseCode["Error"] = 400] = "Error";
|
|
1501
|
+
/** This request got rate limited. */ HttpResponseCode[HttpResponseCode["TooManyRequests"] = 429] = "TooManyRequests";
|
|
1502
|
+
return HttpResponseCode;
|
|
1503
|
+
}(HttpResponseCode || {});
|
|
1504
|
+
|
|
1505
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHtcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIHR5cGUgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIHR5cGUgRGlzY29yZEF1ZGl0TG9nLFxuICB0eXBlIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIHR5cGUgRGlzY29yZEJhbixcbiAgdHlwZSBEaXNjb3JkQnVsa0JhbixcbiAgdHlwZSBEaXNjb3JkQ2hhbm5lbCxcbiAgdHlwZSBEaXNjb3JkQ29ubmVjdGlvbixcbiAgdHlwZSBEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24sXG4gIHR5cGUgRGlzY29yZEVtb2ppLFxuICB0eXBlIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgdHlwZSBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICB0eXBlIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRHdWlsZCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgdHlwZSBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICB0eXBlIERpc2NvcmRHdWlsZFByZXZpZXcsXG4gIHR5cGUgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICB0eXBlIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICB0eXBlIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgdHlwZSBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRJbnZpdGUsXG4gIHR5cGUgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICB0eXBlIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyLFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkTWVzc2FnZSxcbiAgdHlwZSBEaXNjb3JkUHJ1bmVkQ291bnQsXG4gIHR5cGUgRGlzY29yZFJvbGUsXG4gIHR5cGUgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICB0eXBlIERpc2NvcmRTa3UsXG4gIHR5cGUgRGlzY29yZFNvdW5kYm9hcmRTb3VuZCxcbiAgdHlwZSBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgdHlwZSBEaXNjb3JkU3RpY2tlcixcbiAgdHlwZSBEaXNjb3JkU3RpY2tlclBhY2ssXG4gIHR5cGUgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgdHlwZSBEaXNjb3JkVGVtcGxhdGUsXG4gIHR5cGUgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgdHlwZSBEaXNjb3JkVXNlcixcbiAgdHlwZSBEaXNjb3JkVmFuaXR5VXJsLFxuICB0eXBlIERpc2NvcmRWb2ljZVJlZ2lvbixcbiAgdHlwZSBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgdHlwZSBEaXNjb3JkV2ViaG9vayxcbiAgdHlwZSBEaXNjb3JkV2VsY29tZVNjcmVlbixcbiAgSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLFxuICB0eXBlIE1mYUxldmVscyxcbiAgdHlwZSBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IGNhbGN1bGF0ZUJpdHMsIGNhbWVsVG9TbmFrZUNhc2UsIGNhbWVsaXplLCBkZWxheSwgZ2V0Qm90SWRGcm9tVG9rZW4sIGxvZ2dlciwgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLCB1cmxUb0Jhc2U2NCB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnXG5cbi8vIFRPRE86IG1ha2UgZHluYW1pYyBiYXNlZCBvbiBwYWNrYWdlLmpzb24gZmlsZVxuY29uc3QgdmVyc2lvbiA9ICcxOS4wLjAnXG5cbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9WRVJTSU9OID0gMTBcbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9VUkwgPSAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknXG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZydcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1idWNrZXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9MSU1JVF9IRUFERVIgPSAneC1yYXRlbGltaXQtbGltaXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pXG5cbiAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMXG5cbiAgY29uc3QgcmVzdDogUmVzdE1hbmFnZXIgPSB7XG4gICAgYXBwbGljYXRpb25JZCxcbiAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnByb3h5Py5hdXRob3JpemF0aW9uLFxuICAgIGF1dGhvcml6YXRpb25IZWFkZXI6IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb25IZWFkZXIgPz8gJ2F1dGhvcml6YXRpb24nLFxuICAgIGJhc2VVcmwsXG4gICAgZGVsZXRlUXVldWVEZWxheTogNjAwMDAsXG4gICAgZ2xvYmFsbHlSYXRlTGltaXRlZDogZmFsc2UsXG4gICAgaW52YWxpZEJ1Y2tldDogY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQoeyBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyIH0pLFxuICAgIGlzUHJveGllZDogIWJhc2VVcmwuc3RhcnRzV2l0aChESVNDT1JEX0FQSV9VUkwpLFxuICAgIHVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQ6IG9wdGlvbnMucHJveHk/LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQsXG4gICAgbWF4UmV0cnlDb3VudDogSW5maW5pdHksXG4gICAgcHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHM6IGZhbHNlLFxuICAgIHF1ZXVlczogbmV3IE1hcCgpLFxuICAgIHJhdGVMaW1pdGVkUGF0aHM6IG5ldyBNYXAoKSxcbiAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gRElTQ09SRF9BUElfVkVSU0lPTixcbiAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlcixcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke3ZlcnNpb259KWAsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwsIGlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApXG5cbiAgICAgIGNvbnN0IGdsb2JhbCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQoJ2dsb2JhbCcpXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgIGlmIChyYXRlbGltaXRlZCAmJiBub3cgPCByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgaWYgKGdsb2JhbCAmJiBub3cgPCBnbG9iYWwucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlVG9rZW5RdWV1ZXMob2xkVG9rZW4sIG5ld1Rva2VuKSB7XG4gICAgICBpZiAocmVzdC5pc1Byb3hpZWQpIHtcbiAgICAgICAgaWYgKCFyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZSAncHJveHkudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCcgb3B0aW9uIG5lZWRzIHRvIGJlIHNldCB3aGVuIHVzaW5nIGEgcmVzdCBwcm94eSBhbmQgbmVlZGVkIHRvIGNhbGwgJ3VwZGF0ZVRva2VuUXVldWVzJ1wiLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgICAgICAgaWYgKHJlc3QuYXV0aG9yaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaGVhZGVyc1tyZXN0LmF1dGhvcml6YXRpb25IZWFkZXJdID0gcmVzdC5hdXRob3JpemF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBmZXRjaChgJHtyZXN0LmJhc2VVcmx9LyR7cmVzdC51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50fWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvbGRUb2tlbixcbiAgICAgICAgICAgIG5ld1Rva2VuLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0lkZW50aWZpZXIgPSBgQmVhcmVyICR7bmV3VG9rZW59YFxuXG4gICAgICAvLyBVcGRhdGUgYWxsIHRoZSBxdWV1ZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgcXVldWVdIG9mIHJlc3QucXVldWVzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGBCZWFyZXIgJHtvbGRUb2tlbn1gKSkgY29udGludWVcblxuICAgICAgICByZXN0LnF1ZXVlcy5kZWxldGUoa2V5KVxuICAgICAgICBxdWV1ZS5pZGVudGlmaWVyID0gbmV3SWRlbnRpZmllclxuXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGAke25ld0lkZW50aWZpZXJ9JHtxdWV1ZS51cmx9YFxuICAgICAgICBjb25zdCBuZXdRdWV1ZSA9IHJlc3QucXVldWVzLmdldChuZXdLZXkpXG5cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHF1ZXVlc1xuICAgICAgICBpZiAobmV3UXVldWUpIHtcbiAgICAgICAgICBuZXdRdWV1ZS53YWl0aW5nLnVuc2hpZnQoLi4ucXVldWUud2FpdGluZylcbiAgICAgICAgICBuZXdRdWV1ZS5wZW5kaW5nLnVuc2hpZnQoLi4ucXVldWUucGVuZGluZylcblxuICAgICAgICAgIHF1ZXVlLndhaXRpbmcgPSBbXVxuICAgICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBbXVxuXG4gICAgICAgICAgcXVldWUuY2xlYW51cCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KG5ld0tleSwgcXVldWUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBba2V5LCByYXRlbGltaXRQYXRoXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGgudXJsfWAsIHJhdGVsaW1pdFBhdGgpXG5cbiAgICAgICAgaWYgKHJhdGVsaW1pdFBhdGguYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke25ld0lkZW50aWZpZXJ9JHtyYXRlbGltaXRQYXRoLmJ1Y2tldElkfWAsIHJhdGVsaW1pdFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9iajogYW55KTogYW55IHtcbiAgICAgIGlmIChvYmogPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5tYXAoKGl0ZW0pID0+IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KGl0ZW0pKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3T2JqOiBhbnkgPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG5cbiAgICAgICAgICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gc25ha2VfY2FzZSB3ZSBjYW4gYXNzdW1lIGl0IGlzIGFscmVhZHkgaW4gdGhlIGRpc2NvcmQgZm9ybWF0LlxuICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTb21lIGZhbHN5IHZhbHVlcyBzaG91bGQgYmUgYWxsb3dlZCBsaWtlIG51bGwgb3IgMFxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICBjYXNlICdwZXJtaXNzaW9ucyc6XG4gICAgICAgICAgICAgIGNhc2UgJ2FsbG93JzpcbiAgICAgICAgICAgICAgY2FzZSAnZGVueSc6XG4gICAgICAgICAgICAgICAgbmV3T2JqW2tleV0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBjYWxjdWxhdGVCaXRzKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHRNZW1iZXJQZXJtaXNzaW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLmRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogY2FsY3VsYXRlQml0cyh2YWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICduYW1lTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLm5hbWVfbG9jYWxpemF0aW9ucyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnZGVzY3JpcHRpb25Mb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdPYmpbY2FtZWxUb1NuYWtlQ2FzZShrZXkpXSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld09ialxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHJldHVybiBvYmoudG9TdHJpbmcoKVxuXG4gICAgICByZXR1cm4gb2JqXG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuY3JlYXRlQmFzZUhlYWRlcnMoKVxuXG4gICAgICBpZiAob3B0aW9ucz8udW5hdXRob3JpemVkICE9PSB0cnVlKSBoZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgQm90ICR7cmVzdC50b2tlbn1gXG5cbiAgICAgIC8vIElGIEEgUkVBU09OIElTIFBST1ZJREVEIEVOQ09ERSBJVCBJTiBIRUFERVJTXG4gICAgICBpZiAob3B0aW9ucz8ucmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tBVURJVF9MT0dfUkVBU09OX0hFQURFUl0gPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucz8ucmVhc29uKVxuICAgICAgfVxuXG4gICAgICBsZXQgYm9keTogc3RyaW5nIHwgRm9ybURhdGEgfCB1bmRlZmluZWRcblxuICAgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBhZGQgc3BlY2lmaWMgY2hlY2sgZm9yIEdFVCBtZXRob2RcbiAgICAgIC8vIFNpbmNlIEdFVCBkb2VzIG5vdCBhbGxvdyBib2RpZXNcblxuICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgYXR0YWNobWVudHMgZmlyc3QsIHNpbmNlIGJvZHkgdGhlbiBoYXMgdG8gYmUgc2VuZCBpbiBhIGRpZmZlcmVudCB3YXkuXG4gICAgICBpZiAob3B0aW9ucz8uZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmZpbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoYGZpbGUke2l9YCwgb3B0aW9ucy5maWxlc1tpXS5ibG9iLCBvcHRpb25zLmZpbGVzW2ldLm5hbWUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYXZlIHRvIHVzZSBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQgb3IgZWxzZSBKU09OLnN0cmluZ2lmeSBtYXkgdGhyb3cgYW4gZXJyb3IgZm9yIHRoZSBwcmVzZW5jZSBvZiBCaWdJbnQocykgaW4gdGhlIGpzb25cbiAgICAgICAgZm9ybS5hcHBlbmQoJ3BheWxvYWRfanNvbicsIEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KHsgLi4ub3B0aW9ucy5ib2R5LCBmaWxlczogdW5kZWZpbmVkIH0pKSlcblxuICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIGJvZHkgPSBmb3JtXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgJiYgb3B0aW9ucy5oZWFkZXJzICYmIG9wdGlvbnMuaGVhZGVyc1snY29udGVudC10eXBlJ10gPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICAgIC8vIE9BdXRoMiBib2R5IGhhbmRsaW5nXG4gICAgICAgIGNvbnN0IGZvcm1Cb2R5OiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgICAgY29uc3QgZGlzY29yZEJvZHkgPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpXG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRpc2NvcmRCb2R5KSB7XG4gICAgICAgICAgZm9ybUJvZHkucHVzaChgJHtlbmNvZGVVUklDb21wb25lbnQocHJvcCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc2NvcmRCb2R5W3Byb3BdKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgYm9keSA9IGZvcm1Cb2R5LmpvaW4oJyYnKVxuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgYm9keSA9IG9wdGlvbnMuYm9keVxuICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KSlcbiAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGBhcHBsaWNhdGlvbi9qc29uYFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNPTUVUSU1FUyBTUEVDSUFMIEhFQURFUlMgKEUuRy4gQ1VTVE9NIEFVVEhPUklaQVRJT04pIE5FRUQgVE8gQkUgVVNFRFxuICAgICAgaWYgKG9wdGlvbnM/LmhlYWRlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBmb3Igb2YgbG9vcC4gJHtcbiAgICAgICAgLy8gICB2YWx1ZS5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgICAvLyB9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgLy8gSWYgdGhlIHRpbWUgaGFzIG5vdCByZWFjaGVkIGNhbmNlbFxuICAgICAgICBpZiAodmFsdWUucmVzZXRUaW1lc3RhbXAgPiBub3cpIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSlcbiAgICAgICAgLy8gSWYgaXQgd2FzIGdsb2JhbCwgYWxzbyBtYXJrIHRoZSBnbG9iYWwgdmFsdWUgYXMgZmFsc2VcbiAgICAgICAgaWYgKGtleSA9PT0gJ2dsb2JhbCcpIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIEFMTCBQQVRIUyBBUkUgQ0xFQVJFRCBDQU4gQ0FOQ0VMIE9VVCFcbiAgICAgIGlmIChyZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlXG4gICAgICAgIC8vIFJFQ0hFQ0sgSU4gMSBTRUNPTkRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZygnW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBzZXRUaW1lb3V0LicpXG4gICAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICAgIH0sIDEwMDApXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMsIGlkZW50aWZpZXIpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEdFVCBBTEwgTkVDRVNTQVJZIEhFQURFUlNcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUilcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUilcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDBcbiAgICAgIGNvbnN0IGdsb2JhbCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfR0xPQkFMX0hFQURFUilcbiAgICAgIC8vIHVuZGVmaW5lZCBvdmVycmlkZSBudWxsIG5lZWRlZCBmb3IgdHlwaW5nc1xuICAgICAgY29uc3QgYnVja2V0SWQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIpID8/IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0xJTUlUX0hFQURFUilcblxuICAgICAgLy8gSWYgd2UgZGlkbid0IHJlY2VpdmVkIHRoZSBpZGVudGlmaWVyLCBmYWxsYmFjayB0byB0aGUgYm90IHRva2VuXG4gICAgICBpZGVudGlmaWVyID8/PSBgQm90ICR7cmVzdC50b2tlbn1gXG5cbiAgICAgIHJlc3QucXVldWVzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApPy5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHtcbiAgICAgICAgcmVtYWluaW5nOiByZW1haW5pbmcgPyBOdW1iZXIocmVtYWluaW5nKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJ2YWw6IHJldHJ5QWZ0ZXIgPyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwIDogdW5kZWZpbmVkLFxuICAgICAgICBtYXg6IGxpbWl0ID8gTnVtYmVyKGxpbWl0KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIFVSTCBBUyBMSU1JVEVELCBJTVBPUlRBTlQgRk9SIE5FVyBSRVFVRVNUUyBCWSBVU0VSIFdJVEhPVVQgQlVDS0VUXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7aWRlbnRpZmllcn0ke3VybH1gLCB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTQVZFIFRIRSBCVUNLRVQgQVMgTElNSVRFRCBTSU5DRSBESUZGRVJFTlQgVVJMUyBNQVkgU0hBUkUgQSBCVUNLRVRcbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtpZGVudGlmaWVyfSR7YnVja2V0SWR9YCwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpKSAqIDEwMDBcbiAgICAgICAgY29uc3QgZ2xvYmFsUmVzZXQgPSBEYXRlLm5vdygpICsgcmV0cnlBZnRlclxuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCA9IEdsb2JhbGx5IFJhdGUgTGltaXRlZF0gVVJMOiAke3VybH0gfCBHbG9iYWwgUmVzdDogJHtnbG9iYWxSZXNldH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSB0cnVlXG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICAgIH0sIHJldHJ5QWZ0ZXIpXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoaWRlbnRpZmllciwge1xuICAgICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhdGVMaW1pdGVkICYmICFyZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgdXJsID0gYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtvcHRpb25zLnJvdXRlfWBcbiAgICAgIGNvbnN0IHBheWxvYWQgPSByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG9wdGlvbnMubWV0aG9kLCBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucylcblxuICAgICAgY29uc3QgbG9nZ2luZ0hlYWRlcnMgPSB7IC4uLnBheWxvYWQuaGVhZGVycyB9XG5cbiAgICAgIGlmIChwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uU2NoZW1lID0gcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMF1cbiAgICAgICAgbG9nZ2luZ0hlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGAke2F1dGhvcml6YXRpb25TY2hlbWV9IHRva2VuaGVyZWBcbiAgICAgIH1cblxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogbG9nZ2luZ0hlYWRlcnMgfSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIC8vIE1hcmsgcmVxdWVzdCBhbmQgY29tcGxldGVkXG4gICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KDk5OSwgZmFsc2UpXG4gICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgZXJyb3I6ICdQb3NzaWJsZSBuZXR3b3JrIG9yIHJlcXVlc3Qgc2hhcGUgaXNzdWUgb2NjdXJyZWQuIElmIHRoaXMgaXMgcmFyZSwgaXRzIGEgbmV0d29yayBnbGl0Y2guIElmIGl0IG9jY3VycyBhIGxvdCBzb21ldGhpbmcgaXMgd3JvbmcuJyxcbiAgICAgICAgfSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0pXG4gICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCBmZXRjaGVkIGZyb20gJHt1cmx9IHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfSAmICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuXG4gICAgICAvLyBNYXJrIHJlcXVlc3QgYW5kIGNvbXBsZXRlZFxuICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1NDT1BFX0hFQURFUikgPT09ICdzaGFyZWQnKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnJvdXRlLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMsIHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKVxuXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgSHR0cFJlc3BvbnNlQ29kZS5TdWNjZXNzIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwUmVzcG9uc2VDb2RlLkVycm9yKSB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBmYWlsZWQuYClcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIdHRwUmVzcG9uc2VDb2RlLlRvb01hbnlSZXF1ZXN0cykge1xuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHsgb2s6IGZhbHNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgYm9keTogYXdhaXQgcmVzcG9uc2UudGV4dCgpIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gd2FzIHJhdGVsaW1pdGVkLmApXG4gICAgICAgIC8vIFRvbyBtYW55IGF0dGVtcHRzLCBnZXQgcmlkIG9mIHJlcXVlc3QgZnJvbSBxdWV1ZS5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZXhjZWVkZWQgdGhlIG1heGltdW0gYWxsb3dlZCByZXRyaWVzLmAsICd3aXRoIHBheWxvYWQ6JywgcGF5bG9hZClcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKGBbUkVTVCAtIFJldHJpZXNNYXhlZF0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6ICdUaGUgcmVxdWVzdCB3YXMgcmF0ZSBsaW1pdGVkIGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLnJldHJ5Q291bnQgKz0gMVxuXG4gICAgICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUilcbiAgICAgICAgaWYgKHJlc2V0QWZ0ZXIpIGF3YWl0IGRlbGF5KE51bWJlcihyZXNldEFmdGVyKSAqIDEwMDApXG4gICAgICAgIC8vIHByb2Nlc3MgdGhlIHJlc3BvbnNlIHRvIHByZXZlbnQgbWVtIGxlYWtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLnJldHJ5UmVxdWVzdD8uKG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIG5vIHJlc3BvbnNlIHdpdGggbm8gY29udGVudC5cbiAgICAgIG9wdGlvbnMucmVzb2x2ZSh7IG9rOiB0cnVlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgYm9keTogcmVzcG9uc2Uuc3RhdHVzID09PSBIdHRwUmVzcG9uc2VDb2RlLk5vQ29udGVudCA/IHVuZGVmaW5lZCA6IGF3YWl0IHJlc3BvbnNlLnRleHQoKSB9KVxuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3QgcGFydHMgPSB1cmwuc3BsaXQoJy8nKVxuICAgICAgY29uc3Qgc2Vjb25kTGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXVxuXG4gICAgICBpZiAoc2Vjb25kTGFzdFBhcnQgPT09ICdjaGFubmVscycgfHwgc2Vjb25kTGFzdFBhcnQgPT09ICdndWlsZHMnKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cblxuICAgICAgaWYgKHNlY29uZExhc3RQYXJ0ID09PSAncmVhY3Rpb25zJyB8fCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PT0gJ0BtZScpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0yKVxuICAgICAgICBwYXJ0cy5wdXNoKCdyZWFjdGlvbnMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0xKVxuICAgICAgICBwYXJ0cy5wdXNoKCd4JylcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDNdID09PSAncmVhY3Rpb25zJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTIpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdERUxFVEUnICYmIHNlY29uZExhc3RQYXJ0ID09PSAnbWVzc2FnZXMnKSB7XG4gICAgICAgIHJldHVybiBgRCR7cGFydHMuam9pbignLycpfWBcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy8nKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpXG5cbiAgICAgIGlmIChyZXF1ZXN0LnJ1blRocm91Z2hRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSB0aGUgcmVxdWVzdCBoYXMgYSB0b2tlbiwgdXNlIGl0XG4gICAgICAvLyBFbHNlIGZhbGxiYWNrIHRvIHByZWZpeCB3aXRoIHRoZSBib3QgdG9rZW5cbiAgICAgIGNvbnN0IHF1ZXVlSWRlbnRpZmllciA9IHJlcXVlc3QucmVxdWVzdEJvZHlPcHRpb25zPy5oZWFkZXJzPy5hdXRob3JpemF0aW9uID8/IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWApXG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsLCBkZWxldGVRdWV1ZURlbGF5OiByZXN0LmRlbGV0ZVF1ZXVlRGVsYXksIGlkZW50aWZpZXI6IHF1ZXVlSWRlbnRpZmllciB9KVxuXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gLCBidWNrZXRRdWV1ZSlcblxuICAgICAgICAvLyBBZGQgcmVxdWVzdCB0byBxdWV1ZVxuICAgICAgICBidWNrZXRRdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaGVyZSBiZWNhdXNlIG9mIGhvdyBzdGFjayB0cmFjZXMgZ2V0IGNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHNlbmQgcmVxdWVzdCB0byBkaXNjb3JkLidcblxuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA/Pz0ge31cbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2goYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtyb3V0ZX1gLCByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzdWx0LnRleHQoKS5jYXRjaCgoKSA9PiBudWxsKVxuXG4gICAgICAgICAgaWYgKGVyclRleHQpIHtcbiAgICAgICAgICAgIGVycm9yLmNhdXNlID0ge1xuICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICAgICAgYm9keTogZXJyVGV4dCxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlcnIgPSAoYXdhaXQgcmVzdWx0Lmpzb24oKS5jYXRjaCgoKSA9PiB7fSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAvLyBMZWdhY3kgSGFuZGxpbmcgdG8gbm90IGJyZWFrIG9sZCBjb2RlIG9yIHdoZW4gYm9keSBpcyBtaXNzaW5nXG4gICAgICAgICAgaWYgKCFlcnI/LmJvZHkpIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7ZXJyLm1lc3NhZ2UgPz8gcmVzdWx0LnN0YXR1c1RleHR9YClcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlcnIpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zdGF0dXMgIT09IDIwNCA/IGF3YWl0IHJlc3VsdC5qc29uKCkgOiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICByZXF1ZXN0Qm9keU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIChwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyBKU09OLnBhcnNlKGRhdGEuYm9keSA/PyAne30nKSA6IHVuZGVmaW5lZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgZXJyb3IuY2F1c2UgPSByZWFzb25cbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1blRocm91Z2hRdWV1ZTogb3B0aW9ucz8ucnVuVGhyb3VnaFF1ZXVlLFxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcG9zdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0PFQgPSB2b2lkPih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb25zLCBvcmRlcmVkID0gZmFsc2UpIHtcbiAgICAgIGlmICghb3JkZXJlZCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZWFjdGlvbnMubWFwKGFzeW5jIChyZWFjdGlvbikgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcmVhY3Rpb24gb2YgcmVhY3Rpb25zKSB7XG4gICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZERtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5kbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBdXRvbW9kUnVsZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUNoYW5uZWwoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUVtb2ppKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUFwcGxpY2F0aW9uRW1vamkoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamlzKHJlc3QuYXBwbGljYXRpb25JZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGQoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5hbGwoKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGJvZHksIGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRGcm9tVGVtcGxhdGUodGVtcGxhdGVDb2RlLCBib2R5KSB7XG4gICAgICBpZiAoYm9keS5pY29uKSB7XG4gICAgICAgIGJvZHkuaWNvbiA9IGF3YWl0IHVybFRvQmFzZTY0KGJvZHkuaWNvbilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuY29kZSh0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICBmb3JtLmFwcGVuZCgnZmlsZScsIG9wdGlvbnMuZmlsZS5ibG9iLCBvcHRpb25zLmZpbGUubmFtZSlcbiAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5uYW1lKVxuICAgICAgZm9ybS5hcHBlbmQoJ2Rlc2NyaXB0aW9uJywgb3B0aW9ucy5kZXNjcmlwdGlvbilcbiAgICAgIGZvcm0uYXBwZW5kKCd0YWdzJywgb3B0aW9ucy50YWdzKVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCksIHsgYm9keTogZm9ybSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRm9ydW1UaHJlYWQoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvcnVtKGNoYW5uZWxJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMsIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBib2R5ID0ge30sIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkSW52aXRlPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVJvbGUoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU3RhZ2VJbnN0YW5jZShib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUVtb2ppKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUFwcGxpY2F0aW9uRW1vamkoaWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZChndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnZpdGUoaW52aXRlQ29kZSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlcyhjaGFubmVsSWQsIG1lc3NhZ2VJZHMsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmNoYW5uZWxzLmJ1bGsoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VJZHMuc2xpY2UoMCwgMTAwKS5tYXAoKGlkKSA9PiBpZC50b1N0cmluZygpKSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPd25SZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0FsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmFsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0Vtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5lbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVVzZXJSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgdXNlcklkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy51c2VyKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9vayh3ZWJob29rSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgcGVybWlzc2lvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAge1xuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczogeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuICAgICAgY29uc3QgYmFubmVyID0gb3B0aW9ucz8uYm90QmFubmVyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QmFubmVyVVJMKSA6IG9wdGlvbnM/LmJvdEJhbm5lclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdXNlcm5hbWU6IG9wdGlvbnMudXNlcm5hbWU/LnRyaW0oKSxcbiAgICAgICAgICBhdmF0YXIsXG4gICAgICAgICAgYmFubmVyLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWwoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyhjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgYm9keS5pZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEVtb2ppKGd1aWxkSWQsIGlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uRW1vamkoaWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGlkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkTWZhTGV2ZWwoZ3VpbGRJZDogQmlnU3RyaW5nLCBtZmFMZXZlbDogTWZhTGV2ZWxzLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5ndWlsZHMubWZhKGd1aWxkSWQpLCB7IGJvZHk6IHsgbGV2ZWw6IG1mYUxldmVsIH0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIGJvZHk6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5vcmlnaW5hbCh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgICAgZGF0YTogb3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPd25Wb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHJlcXVlc3RUb1NwZWFrVGltZXN0YW1wOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wXG4gICAgICAgICAgICA/IG5ldyBEYXRlKG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXApLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGUoZ3VpbGRJZCwgcm9sZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlUG9zaXRpb25zKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFJvbGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCB0b3BpYywgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyBib2R5OiB7IHRvcGljIH0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0VXNlclZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCwgb3B0aW9ucy51c2VySWQpLCB7IGJvZHk6IG9wdGlvbnMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2sod2ViaG9va0lkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2VsY29tZVNjcmVlbihndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWxjb21lU2NyZWVuPihyZXN0LnJvdXRlcy5ndWlsZHMud2VsY29tZShndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdpZGdldFNldHRpbmdzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGV4ZWN1dGVXZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEZvbGxvd2VkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9sbG93KHNvdXJjZUNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHdlYmhvb2tDaGFubmVsSWQ6IHRhcmdldENoYW5uZWxJZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbihndWlsZElkLCBjb21tYW5kSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBPbWl0PE1ha2VSZXF1ZXN0T3B0aW9ucywgJ2JvZHknPiA9IHt9XG5cbiAgICAgIGlmIChvcHRpb25zPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYWNjZXNzVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihvcHRpb25zPy5hcHBsaWNhdGlvbklkID8/IHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBPbWl0PE1ha2VSZXF1ZXN0T3B0aW9ucywgJ2JvZHknPiA9IHt9XG5cbiAgICAgIGlmIChvcHRpb25zPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYWNjZXNzVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucyhvcHRpb25zPy5hcHBsaWNhdGlvbklkID8/IHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuYXBwbGljYXRpb24oKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uSW5mbyhib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRBdXRoZW50aWNhdGlvbkluZm8odG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5jdXJyZW50QXV0aG9yaXphdGlvbigpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhjaGFuZ2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApXG5cbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWNDcmVkZW50aWFscy50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgfSxcbiAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBmYWxzZSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfVxuXG4gICAgICBpZiAoYm9keS5ncmFudFR5cGUgPT09ICdjbGllbnRfY3JlZGVudGlhbHMnKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmJvZHkuc2NvcGUgPSBib2R5LnNjb3BlLmpvaW4oJyAnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBY2Nlc3NUb2tlblJlc3BvbnNlPihyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5FeGNoYW5nZSgpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgcmV2b2tlVG9rZW4oY2xpZW50SWQsIGNsaWVudFNlY3JldCwgYm9keSkge1xuICAgICAgY29uc3QgYmFzaWNDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGAke2NsaWVudElkfToke2NsaWVudFNlY3JldH1gKVxuXG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMub2F1dGgyLnRva2VuUmV2b2tlKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY0NyZWRlbnRpYWxzLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1ZGl0TG9nPihyZXN0LnJvdXRlcy5ndWlsZHMuYXVkaXRsb2dzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5yZWdpb25zKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJhbihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW5zKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsSW52aXRlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVscyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWxbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RG1DaGFubmVsKHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5OiB7IHJlY2lwaWVudElkOiB1c2VySWQgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdyb3VwRG1DaGFubmVsKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBlbW9qaUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25FbW9qaShlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppW10+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamlzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHsgaXRlbXM6IERpc2NvcmRFbW9qaVtdIH0+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamlzKHJlc3QuYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHYXRld2F5Qm90KCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRHYXRld2F5Qm90PihyZXN0LnJvdXRlcy5nYXRld2F5Qm90KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkcyh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgY29uc3QgbWFrZVJlcXVlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB0b2tlblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PFBhcnRpYWw8RGlzY29yZEd1aWxkPltdPihyZXN0LnJvdXRlcy5ndWlsZHMudXNlckd1aWxkcyhvcHRpb25zKSwgbWFrZVJlcXVlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFByZXZpZXcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFByZXZpZXc+KHJlc3Qucm91dGVzLmd1aWxkcy5wcmV2aWV3KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkV2ViaG9va3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWJob29rcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGE+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2VbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlclBhY2soc3RpY2tlclBhY2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyUGFjaz4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2soc3RpY2tlclBhY2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2tzKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQaW5uZWRNZXNzYWdlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5waW5zKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcnVuZUNvdW50KGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUHJ1bmVkQ291bnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5wcnVuZShndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFJvbGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZShndWlsZElkLCByb2xlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3duVm9pY2VTdGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlclZvaWNlU3RhdGUoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyKHN0aWNrZXJJZDogQmlnU3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLnN0aWNrZXIoc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXJzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXI+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcnMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lbWJlcnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXIoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlcihpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRVc2VyKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyQ29ubmVjdGlvbnModG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ29ubmVjdGlvbltdPihyZXN0LnJvdXRlcy5vYXV0aDIuY29ubmVjdGlvbnMoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZvaWNlUmVnaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yZWdpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rKHdlYmhvb2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWxjb21lU2NyZWVuPihyZXN0LnJvdXRlcy5ndWlsZHMud2VsY29tZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXQ+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXRKc29uKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXRTZXR0aW5ncyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGpvaW5UaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmxlYXZlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHVibGlzaE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNyb3NzcG9zdChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kSW50ZXJhY3Rpb25SZXNwb25zZShpbnRlcmFjdGlvbklkLCB0b2tlbiwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHZvaWQgfCBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLmNhbGxiYWNrKGludGVyYWN0aW9uSWQsIHRva2VuLCBwYXJhbXMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmRhdGE/LmZpbGVzLFxuICAgICAgICBydW5UaHJvdWdoUXVldWU6IGZhbHNlLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kTWVzc2FnZShjaGFubmVsSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFsbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQb2xsQW5zd2VyVm90ZXJzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy52b3RlcyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYW5zd2VySWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlbmRQb2xsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy5leHBpcmUoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVsa0Jhbk1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRCdWxrQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5idWxrQmFuKGd1aWxkSWQpLCB7IGJvZHk6IG9wdGlvbnMsIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90TWVtYmVyKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lbWJlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYm90KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudE1lbWJlcihndWlsZElkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuY3VycmVudE1lbWJlcihndWlsZElkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UoYXBwbGljYXRpb25JZCwgaW5zdGFuY2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBY3Rpdml0eUluc3RhbmNlPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UoYXBwbGljYXRpb25JZCwgaW5zdGFuY2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHJ1bmVNZW1iZXJzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZE9uYm9hcmRpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5vbmJvYXJkaW5nKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZE9uYm9hcmRpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5vbmJvYXJkaW5nKGd1aWxkSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5waW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHRyaWdnZXJUeXBpbmdJbmRpY2F0b3IoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMudHlwaW5nKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZEd1aWxkTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVUZXN0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RFbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbnRpdGxlbWVudFtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVudGl0bGVtZW50PihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFNrdXMoYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTa3VbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnNrdXMoYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbltdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9ucyhza3VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRTb3VuZGJvYXJkU291bmQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuc291bmRib2FyZC5zZW5kU291bmQoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmRbXT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5saXN0RGVmYXVsdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkU291bmRib2FyZFNvdW5kW10gfT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJlZmVyU25ha2VDYXNlKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplciA9IGVuYWJsZWQgPyAoeDogYW55KSA9PiB4IDogY2FtZWxpemVcblxuICAgICAgcmVzdC5nZXQgPSBhc3luYyAodXJsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wb3N0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LmRlbGV0ZSA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucGF0Y2ggPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnB1dCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdFxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5lbnVtIEh0dHBSZXNwb25zZUNvZGUge1xuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb2RlciB0byBjb25zaWRlciB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsLiAqL1xuICBTdWNjZXNzID0gMjAwLFxuICAvKiogUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgRGlzY29yZCByZXR1cm5lZCBhbiBlbXB0eSBib2R5LiAqL1xuICBOb0NvbnRlbnQgPSAyMDQsXG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvcmRlciB0byBjb25zaWRlciB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBFcnJvciA9IDQwMCxcbiAgLyoqIFRoaXMgcmVxdWVzdCBnb3QgcmF0ZSBsaW1pdGVkLiAqL1xuICBUb29NYW55UmVxdWVzdHMgPSA0MjksXG59XG4iXSwibmFtZXMiOlsiQnVmZmVyIiwiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiY2FsY3VsYXRlQml0cyIsImNhbWVsVG9TbmFrZUNhc2UiLCJjYW1lbGl6ZSIsImRlbGF5IiwiZ2V0Qm90SWRGcm9tVG9rZW4iLCJsb2dnZXIiLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJ1cmxUb0Jhc2U2NCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwiUXVldWUiLCJjcmVhdGVSb3V0ZXMiLCJ2ZXJzaW9uIiwiRElTQ09SRF9BUElfVkVSU0lPTiIsIkRJU0NPUkRfQVBJX1VSTCIsIkFVRElUX0xPR19SRUFTT05fSEVBREVSIiwiUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSIiwiUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIiLCJSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIiLCJSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIiLCJSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiIsIlJBVEVfTElNSVRfU0NPUEVfSEVBREVSIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJvcHRpb25zIiwiYXBwbGljYXRpb25JZCIsIkJpZ0ludCIsInRva2VuIiwiYmFzZVVybCIsInByb3h5IiwicmVzdCIsImF1dGhvcml6YXRpb24iLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGVsZXRlUXVldWVEZWxheSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJpbnZhbGlkQnVja2V0IiwiaXNQcm94aWVkIiwic3RhcnRzV2l0aCIsInVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQiLCJtYXhSZXRyeUNvdW50IiwiSW5maW5pdHkiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsInF1ZXVlcyIsIk1hcCIsInJhdGVMaW1pdGVkUGF0aHMiLCJyb3V0ZXMiLCJjcmVhdGVCYXNlSGVhZGVycyIsImNoZWNrUmF0ZUxpbWl0cyIsInVybCIsImlkZW50aWZpZXIiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsIkRhdGUiLCJyZXNldFRpbWVzdGFtcCIsInVwZGF0ZVRva2VuUXVldWVzIiwib2xkVG9rZW4iLCJuZXdUb2tlbiIsIkVycm9yIiwiaGVhZGVycyIsInVuZGVmaW5lZCIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXdJZGVudGlmaWVyIiwia2V5IiwicXVldWUiLCJlbnRyaWVzIiwiZGVsZXRlIiwibmV3S2V5IiwibmV3UXVldWUiLCJ3YWl0aW5nIiwidW5zaGlmdCIsInBlbmRpbmciLCJjbGVhbnVwIiwic2V0IiwicmF0ZWxpbWl0UGF0aCIsImJ1Y2tldElkIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaXRlbSIsIm5ld09iaiIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMiLCJuYW1lX2xvY2FsaXphdGlvbnMiLCJkZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zIiwidG9TdHJpbmciLCJjcmVhdGVSZXF1ZXN0Qm9keSIsInVuYXV0aG9yaXplZCIsInJlYXNvbiIsImVuY29kZVVSSUNvbXBvbmVudCIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiaSIsImxlbmd0aCIsImFwcGVuZCIsImJsb2IiLCJuYW1lIiwiZm9ybUJvZHkiLCJkaXNjb3JkQm9keSIsInByb3AiLCJwdXNoIiwiam9pbiIsImFzc2lnbiIsInByb2Nlc3NSYXRlTGltaXRlZFBhdGhzIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJhdGVMaW1pdGVkIiwicmVtYWluaW5nIiwicmV0cnlBZnRlciIsInJlc2V0IiwiTnVtYmVyIiwibGltaXQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiaW50ZXJ2YWwiLCJtYXgiLCJnbG9iYWxSZXNldCIsInNlbmRSZXF1ZXN0Iiwicm91dGUiLCJwYXlsb2FkIiwicmVxdWVzdEJvZHlPcHRpb25zIiwibG9nZ2luZ0hlYWRlcnMiLCJhdXRob3JpemF0aW9uU2NoZW1lIiwic3BsaXQiLCJkZWJ1ZyIsInJlc3BvbnNlIiwiY2F0Y2giLCJlcnJvciIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInNpbXBsaWZ5VXJsIiwidGV4dCIsInJldHJ5Q291bnQiLCJyZXNldEFmdGVyIiwiYXJyYXlCdWZmZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwicGFydHMiLCJzZWNvbmRMYXN0UGFydCIsInNwbGljZSIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJtZXNzYWdlIiwicmVzdWx0IiwiZXJyVGV4dCIsImNhdXNlIiwiZXJyIiwianNvbiIsIlByb21pc2UiLCJkYXRhIiwicGFyc2UiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJhZGRSZWFjdGlvbiIsImNoYW5uZWxJZCIsIm1lc3NhZ2VJZCIsInJlYWN0aW9uIiwiY2hhbm5lbHMiLCJyZWFjdGlvbnMiLCJib3QiLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWxsIiwiYWRkUm9sZSIsImd1aWxkSWQiLCJ1c2VySWQiLCJyb2xlSWQiLCJndWlsZHMiLCJyb2xlcyIsIm1lbWJlciIsImFkZFRocmVhZE1lbWJlciIsInRocmVhZHMiLCJ1c2VyIiwiYWRkRG1SZWNpcGllbnQiLCJkbVJlY2lwaWVudCIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiYXV0b21vZCIsInJ1bGVzIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiZW1vamlzIiwiY3JlYXRlQXBwbGljYXRpb25FbW9qaSIsImFwcGxpY2F0aW9uRW1vamlzIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwicmVzdE9wdGlvbnMiLCJiZWFyZXJUb2tlbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY3JlYXRlR3VpbGQiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiaWNvbiIsInRlbXBsYXRlcyIsImNvZGUiLCJjcmVhdGVHdWlsZFN0aWNrZXIiLCJmaWxlIiwiZGVzY3JpcHRpb24iLCJ0YWdzIiwic3RpY2tlcnMiLCJjcmVhdGVHdWlsZFRlbXBsYXRlIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJmb3J1bSIsImNyZWF0ZUludml0ZSIsImludml0ZXMiLCJjcmVhdGVSb2xlIiwiY3JlYXRlU2NoZWR1bGVkRXZlbnQiLCJldmVudHMiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwic3RhZ2VzIiwiY3JlYXRlV2ViaG9vayIsIndlYmhvb2tzIiwiYXZhdGFyIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJydWxlSWQiLCJydWxlIiwiZGVsZXRlQ2hhbm5lbCIsImNoYW5uZWwiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwib3ZlcndyaXRlSWQiLCJvdmVyd3JpdGUiLCJkZWxldGVFbW9qaSIsImlkIiwiZW1vamkiLCJkZWxldGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsInJlc3BvbnNlcyIsImRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImNvbW1hbmRJZCIsImNvbW1hbmQiLCJkZWxldGVHdWlsZCIsImd1aWxkIiwiZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJvbmUiLCJkZWxldGVHdWlsZFN0aWNrZXIiLCJzdGlja2VySWQiLCJzdGlja2VyIiwiZGVsZXRlR3VpbGRUZW1wbGF0ZSIsImRlbGV0ZUludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9uIiwiZGVsZXRlSW52aXRlIiwiaW52aXRlQ29kZSIsImludml0ZSIsImRlbGV0ZU1lc3NhZ2UiLCJkZWxldGVNZXNzYWdlcyIsIm1lc3NhZ2VJZHMiLCJidWxrIiwibWVzc2FnZXMiLCJzbGljZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsIm9yaWdpbmFsIiwiZGVsZXRlT3duUmVhY3Rpb24iLCJkZWxldGVSZWFjdGlvbnNBbGwiLCJkZWxldGVSZWFjdGlvbnNFbW9qaSIsImRlbGV0ZVJvbGUiLCJkZWxldGVTY2hlZHVsZWRFdmVudCIsImV2ZW50SWQiLCJldmVudCIsImRlbGV0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZSIsImRlbGV0ZVVzZXJSZWFjdGlvbiIsImRlbGV0ZVdlYmhvb2siLCJ3ZWJob29rSWQiLCJkZWxldGVXZWJob29rTWVzc2FnZSIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJ3ZWJob29rIiwiZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJiYW5uZXIiLCJib3RCYW5uZXJVUkwiLCJjdXJyZW50VXNlciIsInVzZXJuYW1lIiwidHJpbSIsImVkaXRDaGFubmVsIiwiZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzIiwiZWRpdENoYW5uZWxQb3NpdGlvbnMiLCJlZGl0RW1vamkiLCJlZGl0QXBwbGljYXRpb25FbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkTWZhTGV2ZWwiLCJtZmFMZXZlbCIsIm1mYSIsImxldmVsIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2UiLCJ0eXBlIiwiVXBkYXRlTWVzc2FnZSIsImVkaXRPd25Wb2ljZVN0YXRlIiwidm9pY2UiLCJyZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCIsInRvSVNPU3RyaW5nIiwiZWRpdFNjaGVkdWxlZEV2ZW50IiwiZWRpdFJvbGUiLCJlZGl0Um9sZVBvc2l0aW9ucyIsImVkaXRTdGFnZUluc3RhbmNlIiwidG9waWMiLCJlZGl0VXNlclZvaWNlU3RhdGUiLCJlZGl0V2ViaG9vayIsImVkaXRXZWJob29rTWVzc2FnZSIsImVkaXRXZWJob29rV2l0aFRva2VuIiwiZWRpdFdlbGNvbWVTY3JlZW4iLCJ3ZWxjb21lIiwiZWRpdFdpZGdldFNldHRpbmdzIiwid2lkZ2V0IiwiZXhlY3V0ZVdlYmhvb2siLCJmb2xsb3dBbm5vdW5jZW1lbnQiLCJzb3VyY2VDaGFubmVsSWQiLCJ0YXJnZXRDaGFubmVsSWQiLCJmb2xsb3ciLCJ3ZWJob29rQ2hhbm5lbElkIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImFjdGl2ZSIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJhY2Nlc3NUb2tlbiIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwiZ2V0QXBwbGljYXRpb25JbmZvIiwib2F1dGgyIiwiYXBwbGljYXRpb24iLCJlZGl0QXBwbGljYXRpb25JbmZvIiwiZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyIsImN1cnJlbnRBdXRob3JpemF0aW9uIiwiZXhjaGFuZ2VUb2tlbiIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiYmFzaWNDcmVkZW50aWFscyIsImZyb20iLCJncmFudFR5cGUiLCJzY29wZSIsInRva2VuRXhjaGFuZ2UiLCJyZXZva2VUb2tlbiIsInRva2VuUmV2b2tlIiwiZ2V0QXVkaXRMb2ciLCJhdWRpdGxvZ3MiLCJnZXRBdXRvbW9kUnVsZSIsImdldEF1dG9tb2RSdWxlcyIsImdldEF2YWlsYWJsZVZvaWNlUmVnaW9ucyIsInJlZ2lvbnMiLCJnZXRCYW4iLCJtZW1iZXJzIiwiYmFuIiwiZ2V0QmFucyIsImJhbnMiLCJnZXRDaGFubmVsIiwiZ2V0Q2hhbm5lbEludml0ZXMiLCJnZXRDaGFubmVscyIsImdldENoYW5uZWxXZWJob29rcyIsImdldERtQ2hhbm5lbCIsImRtIiwicmVjaXBpZW50SWQiLCJnZXRHcm91cERtQ2hhbm5lbCIsImdldEVtb2ppIiwiZW1vamlJZCIsImdldEFwcGxpY2F0aW9uRW1vamkiLCJnZXRFbW9qaXMiLCJnZXRBcHBsaWNhdGlvbkVtb2ppcyIsImdldEZvbGxvd3VwTWVzc2FnZSIsImdldEdhdGV3YXlCb3QiLCJnYXRld2F5Qm90IiwiZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkIiwiY291bnRzIiwiZ2V0R3VpbGRzIiwibWFrZVJlcXVlc3RPcHRpb25zIiwidXNlckd1aWxkcyIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGRQcmV2aWV3IiwicHJldmlldyIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRJbnRlZ3JhdGlvbnMiLCJpbnRlZ3JhdGlvbnMiLCJnZXRJbnZpdGUiLCJnZXRJbnZpdGVzIiwiZ2V0TWVzc2FnZSIsImdldE1lc3NhZ2VzIiwiZ2V0U3RpY2tlclBhY2siLCJzdGlja2VyUGFja0lkIiwic3RpY2tlclBhY2siLCJnZXRTdGlja2VyUGFja3MiLCJzdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRQaW5uZWRNZXNzYWdlcyIsInBpbnMiLCJnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzIiwicHJpdmF0ZSIsImdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMiLCJqb2luZWQiLCJnZXRQcnVuZUNvdW50IiwicHJ1bmUiLCJnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMiLCJwdWJsaWMiLCJnZXRSb2xlcyIsImdldFJvbGUiLCJnZXRTY2hlZHVsZWRFdmVudCIsIndpdGhVc2VyQ291bnQiLCJnZXRTY2hlZHVsZWRFdmVudHMiLCJnZXRTY2hlZHVsZWRFdmVudFVzZXJzIiwidXNlcnMiLCJnZXRTZXNzaW9uSW5mbyIsImdldFN0YWdlSW5zdGFuY2UiLCJnZXRPd25Wb2ljZVN0YXRlIiwiZ2V0VXNlclZvaWNlU3RhdGUiLCJnZXRTdGlja2VyIiwiZ2V0R3VpbGRTdGlja2VyIiwiZ2V0R3VpbGRTdGlja2VycyIsImdldFRocmVhZE1lbWJlciIsImdldFRocmVhZE1lbWJlcnMiLCJnZXRSZWFjdGlvbnMiLCJnZXRVc2VyIiwiZ2V0Q3VycmVudFVzZXIiLCJnZXRVc2VyQ29ubmVjdGlvbnMiLCJjb25uZWN0aW9ucyIsImdldFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwicm9sZUNvbm5lY3Rpb25zIiwiZ2V0VmFuaXR5VXJsIiwidmFuaXR5IiwiZ2V0Vm9pY2VSZWdpb25zIiwiZ2V0V2ViaG9vayIsImdldFdlYmhvb2tNZXNzYWdlIiwiZ2V0V2ViaG9va1dpdGhUb2tlbiIsImdldFdlbGNvbWVTY3JlZW4iLCJnZXRXaWRnZXQiLCJ3aWRnZXRKc29uIiwiZ2V0V2lkZ2V0U2V0dGluZ3MiLCJqb2luVGhyZWFkIiwibWUiLCJsZWF2ZUd1aWxkIiwibGVhdmUiLCJsZWF2ZVRocmVhZCIsInB1Ymxpc2hNZXNzYWdlIiwiY3Jvc3Nwb3N0IiwicmVtb3ZlUm9sZSIsInJlbW92ZVRocmVhZE1lbWJlciIsInJlbW92ZURtUmVjaXBpZW50Iiwic2VuZEZvbGxvd3VwTWVzc2FnZSIsInNlbmRJbnRlcmFjdGlvblJlc3BvbnNlIiwiaW50ZXJhY3Rpb25JZCIsInBhcmFtcyIsImNhbGxiYWNrIiwic2VuZE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSIsImdldFBvbGxBbnN3ZXJWb3RlcnMiLCJhbnN3ZXJJZCIsInBvbGxzIiwidm90ZXMiLCJlbmRQb2xsIiwiZXhwaXJlIiwic3luY0d1aWxkVGVtcGxhdGUiLCJiYW5NZW1iZXIiLCJidWxrQmFuTWVtYmVycyIsImJ1bGtCYW4iLCJlZGl0Qm90TWVtYmVyIiwiZWRpdE1lbWJlciIsImdldE1lbWJlciIsImdldEN1cnJlbnRNZW1iZXIiLCJjdXJyZW50TWVtYmVyIiwiZ2V0TWVtYmVycyIsImdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImluc3RhbmNlSWQiLCJhcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UiLCJraWNrTWVtYmVyIiwicGluTWVzc2FnZSIsInBpbiIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJxdWVyeSIsInNlYXJjaCIsImdldEd1aWxkT25ib2FyZGluZyIsIm9uYm9hcmRpbmciLCJlZGl0R3VpbGRPbmJvYXJkaW5nIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidHlwaW5nIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsImFkZEd1aWxkTWVtYmVyIiwiY3JlYXRlVGVzdEVudGl0bGVtZW50IiwibW9uZXRpemF0aW9uIiwiZW50aXRsZW1lbnRzIiwibGlzdEVudGl0bGVtZW50cyIsImdldEVudGl0bGVtZW50IiwiZW50aXRsZW1lbnRJZCIsImVudGl0bGVtZW50IiwiZGVsZXRlVGVzdEVudGl0bGVtZW50IiwiY29uc3VtZUVudGl0bGVtZW50IiwibGlzdFNrdXMiLCJza3VzIiwibGlzdFN1YnNjcmlwdGlvbnMiLCJza3VJZCIsInN1YnNjcmlwdGlvbnMiLCJnZXRTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25JZCIsInN1YnNjcmlwdGlvbiIsInNlbmRTb3VuZGJvYXJkU291bmQiLCJzb3VuZGJvYXJkIiwic2VuZFNvdW5kIiwibGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzIiwibGlzdERlZmF1bHQiLCJsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRTb3VuZHMiLCJnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kSWQiLCJndWlsZFNvdW5kIiwiY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZCIsImRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kIiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxNQUFNLFFBQVEsY0FBYTtBQUNwQyxTQW9ERUMsd0JBQXdCLFFBR25CLG9CQUFtQjtBQUMxQixTQUFTQyxhQUFhLEVBQUVDLGdCQUFnQixFQUFFQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsaUJBQWlCLEVBQUVDLE1BQU0sRUFBRUMscUJBQXFCLEVBQUVDLFdBQVcsUUFBUSxvQkFBbUI7QUFDbkosU0FBU0MsMEJBQTBCLFFBQVEscUJBQW9CO0FBQy9ELFNBQVNDLEtBQUssUUFBUSxhQUFZO0FBQ2xDLFNBQVNDLFlBQVksUUFBUSxjQUFhO0FBRzFDLGdEQUFnRDtBQUNoRCxNQUFNQyxVQUFVO0FBRWhCLE9BQU8sTUFBTUMsc0JBQXNCLEdBQUU7QUFDckMsT0FBTyxNQUFNQyxrQkFBa0IsMEJBQXlCO0FBRXhELE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFvQjtBQUMzRCxPQUFPLE1BQU1DLDhCQUE4Qix3QkFBdUI7QUFDbEUsT0FBTyxNQUFNQyxnQ0FBZ0MsMEJBQXlCO0FBQ3RFLE9BQU8sTUFBTUMsMkJBQTJCLHFCQUFvQjtBQUM1RCxPQUFPLE1BQU1DLDJCQUEyQixxQkFBb0I7QUFDNUQsT0FBTyxNQUFNQywwQkFBMEIsb0JBQW1CO0FBQzFELE9BQU8sTUFBTUMsMEJBQTBCLG9CQUFtQjtBQUUxRCxPQUFPLFNBQVNDLGtCQUFrQkMsT0FBaUM7SUFDakUsTUFBTUMsZ0JBQWdCRCxRQUFRQyxhQUFhLEdBQUdDLE9BQU9GLFFBQVFDLGFBQWEsSUFBSW5CLGtCQUFrQmtCLFFBQVFHLEtBQUs7SUFFN0csTUFBTUMsVUFBVUosUUFBUUssS0FBSyxFQUFFRCxXQUFXYjtJQUUxQyxNQUFN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
|