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