@discordeno/rest 19.0.0-next.e2d86ea → 19.0.0-next.e315ee6

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