@discordeno/gateway 19.0.0-next.e2d86ea → 19.0.0-next.e33b44e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Shard.cjs +489 -0
- package/dist/cjs/index.cjs +22 -0
- package/dist/cjs/manager.cjs +303 -0
- package/dist/cjs/types.cjs +41 -0
- package/dist/esm/Shard.js +466 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/manager.js +288 -0
- package/dist/esm/types.js +23 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/{Shard.d.ts → types/Shard.d.ts} +12 -89
- package/dist/types/Shard.d.ts.map +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{manager.d.ts → types/manager.d.ts} +27 -9
- package/dist/types/manager.d.ts.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +1 -1
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +28 -23
- package/dist/Shard.d.ts.map +0 -1
- package/dist/Shard.js +0 -615
- package/dist/Shard.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +0 -1
- package/dist/manager.d.ts.map +0 -1
- package/dist/manager.js +0 -243
- package/dist/manager.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -23
- package/dist/types.js.map +0 -1
- /package/dist/{index.d.ts → types/index.d.ts} +0 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-confusing-void-expression */ "use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createGatewayManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createGatewayManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _types = require("@discordeno/types");
|
|
12
|
+
const _utils = require("@discordeno/utils");
|
|
13
|
+
const _Shard = /*#__PURE__*/ _interop_require_default(require("./Shard.cjs"));
|
|
14
|
+
function _interop_require_default(obj) {
|
|
15
|
+
return obj && obj.__esModule ? obj : {
|
|
16
|
+
default: obj
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function createGatewayManager(options) {
|
|
20
|
+
const connectionOptions = options.connection ?? {
|
|
21
|
+
url: 'wss://gateway.discord.gg',
|
|
22
|
+
shards: 1,
|
|
23
|
+
sessionStartLimit: {
|
|
24
|
+
maxConcurrency: 1,
|
|
25
|
+
remaining: 1000,
|
|
26
|
+
total: 1000,
|
|
27
|
+
resetAfter: 1000 * 60 * 60 * 24
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const gateway = {
|
|
31
|
+
events: options.events ?? {},
|
|
32
|
+
compress: options.compress ?? false,
|
|
33
|
+
intents: options.intents ?? 0,
|
|
34
|
+
properties: {
|
|
35
|
+
os: options.properties?.os ?? process.platform,
|
|
36
|
+
browser: options.properties?.browser ?? 'Discordeno',
|
|
37
|
+
device: options.properties?.device ?? 'Discordeno'
|
|
38
|
+
},
|
|
39
|
+
token: options.token,
|
|
40
|
+
url: options.url ?? connectionOptions.url ?? 'wss://gateway.discord.gg',
|
|
41
|
+
version: options.version ?? 10,
|
|
42
|
+
connection: connectionOptions,
|
|
43
|
+
totalShards: options.totalShards ?? connectionOptions.shards ?? 1,
|
|
44
|
+
lastShardId: options.lastShardId ?? (options.totalShards ? options.totalShards - 1 : connectionOptions ? connectionOptions.shards - 1 : 0),
|
|
45
|
+
firstShardId: options.firstShardId ?? 0,
|
|
46
|
+
totalWorkers: options.totalWorkers ?? 4,
|
|
47
|
+
shardsPerWorker: options.shardsPerWorker ?? 25,
|
|
48
|
+
spawnShardDelay: options.spawnShardDelay ?? 5300,
|
|
49
|
+
preferSnakeCase: options.preferSnakeCase ?? false,
|
|
50
|
+
shards: new Map(),
|
|
51
|
+
buckets: new Map(),
|
|
52
|
+
cache: {
|
|
53
|
+
requestMembers: {
|
|
54
|
+
enabled: options.cache?.requestMembers?.enabled ?? false,
|
|
55
|
+
pending: new _utils.Collection()
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
logger: options.logger ?? _utils.logger,
|
|
59
|
+
calculateTotalShards () {
|
|
60
|
+
// Bots under 100k servers do not have access to total shards.
|
|
61
|
+
if (gateway.totalShards < 100) {
|
|
62
|
+
gateway.logger.debug(`[Gateway] Calculating total shards: ${gateway.totalShards}`);
|
|
63
|
+
return gateway.totalShards;
|
|
64
|
+
}
|
|
65
|
+
gateway.logger.debug(`[Gateway] Calculating total shards`, gateway.totalShards, gateway.connection.sessionStartLimit.maxConcurrency);
|
|
66
|
+
// Calculate a multiple of `maxConcurrency` which can be used to connect to the gateway.
|
|
67
|
+
return Math.ceil(gateway.totalShards / // If `maxConcurrency` is 1 we can safely use 16.
|
|
68
|
+
(gateway.connection.sessionStartLimit.maxConcurrency === 1 ? 16 : gateway.connection.sessionStartLimit.maxConcurrency)) * gateway.connection.sessionStartLimit.maxConcurrency;
|
|
69
|
+
},
|
|
70
|
+
calculateWorkerId (shardId) {
|
|
71
|
+
const workerId = Math.min(shardId % gateway.shardsPerWorker, gateway.totalWorkers - 1);
|
|
72
|
+
gateway.logger.debug(`[Gateway] Calculating workerId: Shard: ${shardId} -> Worker: ${workerId} -> Per Worker: ${gateway.shardsPerWorker} -> Total: ${gateway.totalWorkers}`);
|
|
73
|
+
return workerId;
|
|
74
|
+
},
|
|
75
|
+
prepareBuckets () {
|
|
76
|
+
for(let i = 0; i < gateway.connection.sessionStartLimit.maxConcurrency; ++i){
|
|
77
|
+
gateway.logger.debug(`[Gateway] Preparing buckets for concurrency: ${i}`);
|
|
78
|
+
gateway.buckets.set(i, {
|
|
79
|
+
workers: [],
|
|
80
|
+
identifyRequests: []
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// ORGANIZE ALL SHARDS INTO THEIR OWN BUCKETS
|
|
84
|
+
for(let shardId = gateway.firstShardId; shardId <= gateway.lastShardId; ++shardId){
|
|
85
|
+
gateway.logger.debug(`[Gateway] Preparing buckets for shard: ${shardId}`);
|
|
86
|
+
if (shardId >= gateway.totalShards) {
|
|
87
|
+
throw new Error(`Shard (id: ${shardId}) is bigger or equal to the used amount of used shards which is ${gateway.totalShards}`);
|
|
88
|
+
}
|
|
89
|
+
const bucketId = shardId % gateway.connection.sessionStartLimit.maxConcurrency;
|
|
90
|
+
const bucket = gateway.buckets.get(bucketId);
|
|
91
|
+
if (!bucket) {
|
|
92
|
+
throw new Error(`Shard (id: ${shardId}) got assigned to an illegal bucket id: ${bucketId}, expected a bucket id between 0 and ${gateway.connection.sessionStartLimit.maxConcurrency - 1}`);
|
|
93
|
+
}
|
|
94
|
+
// FIND A QUEUE IN THIS BUCKET THAT HAS SPACE
|
|
95
|
+
// const worker = bucket.workers.find((w) => w.queue.length < gateway.shardsPerWorker);
|
|
96
|
+
const workerId = gateway.calculateWorkerId(shardId);
|
|
97
|
+
const worker = bucket.workers.find((w)=>w.id === workerId);
|
|
98
|
+
if (worker) {
|
|
99
|
+
// IF THE QUEUE HAS SPACE JUST ADD IT TO THIS QUEUE
|
|
100
|
+
worker.queue.push(shardId);
|
|
101
|
+
} else {
|
|
102
|
+
bucket.workers.push({
|
|
103
|
+
id: workerId,
|
|
104
|
+
queue: [
|
|
105
|
+
shardId
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const bucket of gateway.buckets.values()){
|
|
111
|
+
for (const worker of bucket.workers.values()){
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/require-array-sort-compare
|
|
113
|
+
worker.queue = worker.queue.sort((a, b)=>a - b);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
async spawnShards () {
|
|
118
|
+
// PREPARES ALL SHARDS IN SPECIFIC BUCKETS
|
|
119
|
+
gateway.prepareBuckets();
|
|
120
|
+
// Prefer concurrency of forEach instead of forof
|
|
121
|
+
await Promise.all([
|
|
122
|
+
...gateway.buckets.entries()
|
|
123
|
+
].map(async ([bucketId, bucket])=>{
|
|
124
|
+
for (const worker of bucket.workers){
|
|
125
|
+
for (const shardId of worker.queue){
|
|
126
|
+
await gateway.tellWorkerToIdentify(worker.id, shardId, bucketId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
},
|
|
131
|
+
async shutdown (code, reason) {
|
|
132
|
+
gateway.shards.forEach((shard)=>shard.close(code, reason));
|
|
133
|
+
await (0, _utils.delay)(5000);
|
|
134
|
+
},
|
|
135
|
+
async sendPayload (shardId, payload) {
|
|
136
|
+
const shard = gateway.shards.get(shardId);
|
|
137
|
+
if (!shard) {
|
|
138
|
+
throw new Error(`Shard (id: ${shardId} not found`);
|
|
139
|
+
}
|
|
140
|
+
await shard.send(payload);
|
|
141
|
+
},
|
|
142
|
+
async tellWorkerToIdentify (workerId, shardId, bucketId) {
|
|
143
|
+
gateway.logger.debug(`[Gateway] tell worker to identify (${workerId}, ${shardId}, ${bucketId})`);
|
|
144
|
+
await gateway.identify(shardId);
|
|
145
|
+
},
|
|
146
|
+
async identify (shardId) {
|
|
147
|
+
let shard = this.shards.get(shardId);
|
|
148
|
+
gateway.logger.debug(`[Gateway] identifying ${shard ? 'existing' : 'new'} shard (${shardId})`);
|
|
149
|
+
if (!shard) {
|
|
150
|
+
shard = new _Shard.default({
|
|
151
|
+
id: shardId,
|
|
152
|
+
connection: {
|
|
153
|
+
compress: this.compress,
|
|
154
|
+
intents: this.intents,
|
|
155
|
+
properties: this.properties,
|
|
156
|
+
token: this.token,
|
|
157
|
+
totalShards: this.totalShards,
|
|
158
|
+
url: this.url,
|
|
159
|
+
version: this.version
|
|
160
|
+
},
|
|
161
|
+
events: options.events ?? {},
|
|
162
|
+
logger: this.logger,
|
|
163
|
+
requestIdentify: async ()=>{
|
|
164
|
+
await gateway.identify(shardId);
|
|
165
|
+
},
|
|
166
|
+
shardIsReady: async ()=>{
|
|
167
|
+
gateway.logger.debug(`[Shard] Shard #${shardId} is ready`);
|
|
168
|
+
await (0, _utils.delay)(gateway.spawnShardDelay);
|
|
169
|
+
gateway.logger.debug(`[Shard] Resolving shard identify request`);
|
|
170
|
+
gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency).identifyRequests.shift()?.();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
if (this.preferSnakeCase) {
|
|
174
|
+
shard.forwardToBot = async (payload)=>{
|
|
175
|
+
shard.events.message?.(shard, payload);
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
this.shards.set(shardId, shard);
|
|
179
|
+
}
|
|
180
|
+
const bucket = gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency);
|
|
181
|
+
if (!bucket) return;
|
|
182
|
+
return await new Promise((resolve)=>{
|
|
183
|
+
// Mark that we are making an identify request so another is not made.
|
|
184
|
+
bucket.identifyRequests.push(resolve);
|
|
185
|
+
gateway.logger.debug(`[Gateway] identifying shard #(${shardId}).`);
|
|
186
|
+
// This will trigger identify and when READY is received it will resolve the above request.
|
|
187
|
+
shard?.identify();
|
|
188
|
+
});
|
|
189
|
+
},
|
|
190
|
+
async kill (shardId) {
|
|
191
|
+
const shard = this.shards.get(shardId);
|
|
192
|
+
if (!shard) {
|
|
193
|
+
return gateway.logger.debug(`[Gateway] kill shard but not found (${shardId})`);
|
|
194
|
+
}
|
|
195
|
+
gateway.logger.debug(`[Gateway] kill shard (${shardId})`);
|
|
196
|
+
this.shards.delete(shardId);
|
|
197
|
+
await shard.shutdown();
|
|
198
|
+
},
|
|
199
|
+
async requestIdentify (shardId) {
|
|
200
|
+
gateway.logger.debug(`[Gateway] requesting identify`);
|
|
201
|
+
// const bucket = gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency)
|
|
202
|
+
// if (!bucket) return
|
|
203
|
+
// return await new Promise((resolve) => {
|
|
204
|
+
// bucket.identifyRequests.push(resolve)
|
|
205
|
+
// })
|
|
206
|
+
},
|
|
207
|
+
// Helpers methods below this
|
|
208
|
+
calculateShardId (guildId, totalShards) {
|
|
209
|
+
// If none is provided, use the total shards number from gateway object.
|
|
210
|
+
if (!totalShards) totalShards = gateway.totalShards;
|
|
211
|
+
// If it is only 1 shard, it will always be shard id 0
|
|
212
|
+
if (totalShards === 1) {
|
|
213
|
+
gateway.logger.debug(`[Gateway] calculateShardId (1 shard)`);
|
|
214
|
+
return 0;
|
|
215
|
+
}
|
|
216
|
+
gateway.logger.debug(`[Gateway] calculateShardId (guildId: ${guildId}, totalShards: ${totalShards})`);
|
|
217
|
+
return Number((BigInt(guildId) >> 22n) % BigInt(totalShards));
|
|
218
|
+
},
|
|
219
|
+
async joinVoiceChannel (guildId, channelId, options) {
|
|
220
|
+
const shardId = gateway.calculateShardId(guildId);
|
|
221
|
+
gateway.logger.debug(`[Gateway] joinVoiceChannel guildId: ${guildId} channelId: ${channelId}`);
|
|
222
|
+
await gateway.sendPayload(shardId, {
|
|
223
|
+
op: _types.GatewayOpcodes.VoiceStateUpdate,
|
|
224
|
+
d: {
|
|
225
|
+
guild_id: guildId.toString(),
|
|
226
|
+
channel_id: channelId.toString(),
|
|
227
|
+
self_mute: options?.selfMute ?? false,
|
|
228
|
+
self_deaf: options?.selfDeaf ?? true
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
},
|
|
232
|
+
async editBotStatus (data) {
|
|
233
|
+
gateway.logger.debug(`[Gateway] editBotStatus data: ${JSON.stringify(data)}`);
|
|
234
|
+
await Promise.all([
|
|
235
|
+
...gateway.shards.values()
|
|
236
|
+
].map(async (shard)=>{
|
|
237
|
+
gateway.editShardStatus(shard.id, data);
|
|
238
|
+
}));
|
|
239
|
+
},
|
|
240
|
+
async editShardStatus (shardId, data) {
|
|
241
|
+
gateway.logger.debug(`[Gateway] editShardStatus shardId: ${shardId} -> data: ${JSON.stringify(data)}`);
|
|
242
|
+
await gateway.sendPayload(shardId, {
|
|
243
|
+
op: _types.GatewayOpcodes.PresenceUpdate,
|
|
244
|
+
d: {
|
|
245
|
+
since: null,
|
|
246
|
+
afk: false,
|
|
247
|
+
activities: data.activities,
|
|
248
|
+
status: data.status
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
},
|
|
252
|
+
async requestMembers (guildId, options) {
|
|
253
|
+
const shardId = gateway.calculateShardId(guildId);
|
|
254
|
+
if (gateway.intents && (!options?.limit || options.limit > 1) && !(gateway.intents & _types.GatewayIntents.GuildMembers)) throw new Error('Cannot fetch more then 1 member without the GUILD_MEMBERS intent');
|
|
255
|
+
gateway.logger.debug(`[Gateway] requestMembers guildId: ${guildId} -> data: ${JSON.stringify(options)}`);
|
|
256
|
+
if (options?.userIds?.length) {
|
|
257
|
+
gateway.logger.debug(`[Gateway] requestMembers guildId: ${guildId} -> setting user limit based on userIds length: ${options.userIds.length}`);
|
|
258
|
+
options.limit = options.userIds.length;
|
|
259
|
+
}
|
|
260
|
+
const members = !gateway.cache.requestMembers.enabled || !options?.nonce ? [] : new Promise((resolve, reject)=>{
|
|
261
|
+
// Should never happen.
|
|
262
|
+
if (!gateway.cache.requestMembers.enabled || !options?.nonce) {
|
|
263
|
+
reject(new Error("Can't request the members without the nonce or with the feature disabled."));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
gateway.cache.requestMembers.pending.set(options.nonce, {
|
|
267
|
+
nonce: options.nonce,
|
|
268
|
+
resolve,
|
|
269
|
+
members: []
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
await gateway.sendPayload(shardId, {
|
|
273
|
+
op: _types.GatewayOpcodes.RequestGuildMembers,
|
|
274
|
+
d: {
|
|
275
|
+
guild_id: guildId.toString(),
|
|
276
|
+
// If a query is provided use it, OR if a limit is NOT provided use ""
|
|
277
|
+
query: options?.query ?? (options?.limit ? undefined : ''),
|
|
278
|
+
limit: options?.limit ?? 0,
|
|
279
|
+
presences: options?.presences ?? false,
|
|
280
|
+
user_ids: options?.userIds?.map((id)=>id.toString()),
|
|
281
|
+
nonce: options?.nonce
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
return await members;
|
|
285
|
+
},
|
|
286
|
+
async leaveVoiceChannel (guildId) {
|
|
287
|
+
const shardId = gateway.calculateShardId(guildId);
|
|
288
|
+
gateway.logger.debug(`[Gateway] leaveVoiceChannel guildId: ${guildId} Shard ${shardId}`);
|
|
289
|
+
await gateway.sendPayload(shardId, {
|
|
290
|
+
op: _types.GatewayOpcodes.VoiceStateUpdate,
|
|
291
|
+
d: {
|
|
292
|
+
guild_id: guildId.toString(),
|
|
293
|
+
channel_id: null,
|
|
294
|
+
self_mute: false,
|
|
295
|
+
self_deaf: false
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
return gateway;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1jb25mdXNpbmctdm9pZC1leHByZXNzaW9uICovXG5pbXBvcnQge1xuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgQXRMZWFzdE9uZSxcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEdldEdhdGV3YXlCb3QsXG4gIHR5cGUgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICB0eXBlIFJlcXVlc3RHdWlsZE1lbWJlcnMsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IFNoYXJkIGZyb20gJy4vU2hhcmQuanMnXG5pbXBvcnQgdHlwZSB7IFNoYXJkRXZlbnRzLCBTaGFyZFNvY2tldFJlcXVlc3QsIFN0YXR1c1VwZGF0ZSwgVXBkYXRlVm9pY2VTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHYXRld2F5TWFuYWdlcihvcHRpb25zOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMpOiBHYXRld2F5TWFuYWdlciB7XG4gIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gb3B0aW9ucy5jb25uZWN0aW9uID8/IHtcbiAgICB1cmw6ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHNoYXJkczogMSxcbiAgICBzZXNzaW9uU3RhcnRMaW1pdDoge1xuICAgICAgbWF4Q29uY3VycmVuY3k6IDEsXG4gICAgICByZW1haW5pbmc6IDEwMDAsXG4gICAgICB0b3RhbDogMTAwMCxcbiAgICAgIHJlc2V0QWZ0ZXI6IDEwMDAgKiA2MCAqIDYwICogMjQsXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgaW50ZW50czogb3B0aW9ucy5pbnRlbnRzID8/IDAsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgb3M6IG9wdGlvbnMucHJvcGVydGllcz8ub3MgPz8gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICAgIGJyb3dzZXI6IG9wdGlvbnMucHJvcGVydGllcz8uYnJvd3NlciA/PyAnRGlzY29yZGVubycsXG4gICAgICBkZXZpY2U6IG9wdGlvbnMucHJvcGVydGllcz8uZGV2aWNlID8/ICdEaXNjb3JkZW5vJyxcbiAgICB9LFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHVybDogb3B0aW9ucy51cmwgPz8gY29ubmVjdGlvbk9wdGlvbnMudXJsID8/ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAxMCxcbiAgICBjb25uZWN0aW9uOiBjb25uZWN0aW9uT3B0aW9ucyxcbiAgICB0b3RhbFNoYXJkczogb3B0aW9ucy50b3RhbFNoYXJkcyA/PyBjb25uZWN0aW9uT3B0aW9ucy5zaGFyZHMgPz8gMSxcbiAgICBsYXN0U2hhcmRJZDogb3B0aW9ucy5sYXN0U2hhcmRJZCA/PyAob3B0aW9ucy50b3RhbFNoYXJkcyA/IG9wdGlvbnMudG90YWxTaGFyZHMgLSAxIDogY29ubmVjdGlvbk9wdGlvbnMgPyBjb25uZWN0aW9uT3B0aW9ucy5zaGFyZHMgLSAxIDogMCksXG4gICAgZmlyc3RTaGFyZElkOiBvcHRpb25zLmZpcnN0U2hhcmRJZCA/PyAwLFxuICAgIHRvdGFsV29ya2Vyczogb3B0aW9ucy50b3RhbFdvcmtlcnMgPz8gNCxcbiAgICBzaGFyZHNQZXJXb3JrZXI6IG9wdGlvbnMuc2hhcmRzUGVyV29ya2VyID8/IDI1LFxuICAgIHNwYXduU2hhcmREZWxheTogb3B0aW9ucy5zcGF3blNoYXJkRGVsYXkgPz8gNTMwMCxcbiAgICBwcmVmZXJTbmFrZUNhc2U6IG9wdGlvbnMucHJlZmVyU25ha2VDYXNlID8/IGZhbHNlLFxuICAgIHNoYXJkczogbmV3IE1hcCgpLFxuICAgIGJ1Y2tldHM6IG5ldyBNYXAoKSxcbiAgICBjYWNoZToge1xuICAgICAgcmVxdWVzdE1lbWJlcnM6IHtcbiAgICAgICAgZW5hYmxlZDogb3B0aW9ucy5jYWNoZT8ucmVxdWVzdE1lbWJlcnM/LmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgIHBlbmRpbmc6IG5ldyBDb2xsZWN0aW9uKCksXG4gICAgICB9LFxuICAgIH0sXG4gICAgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciA/PyBsb2dnZXIsXG5cbiAgICBjYWxjdWxhdGVUb3RhbFNoYXJkcygpIHtcbiAgICAgIC8vIEJvdHMgdW5kZXIgMTAwayBzZXJ2ZXJzIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0b3RhbCBzaGFyZHMuXG4gICAgICBpZiAoZ2F0ZXdheS50b3RhbFNoYXJkcyA8IDEwMCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIENhbGN1bGF0aW5nIHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApXG4gICAgICAgIHJldHVybiBnYXRld2F5LnRvdGFsU2hhcmRzXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gQ2FsY3VsYXRpbmcgdG90YWwgc2hhcmRzYCwgZ2F0ZXdheS50b3RhbFNoYXJkcywgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuICAgICAgLy8gQ2FsY3VsYXRlIGEgbXVsdGlwbGUgb2YgYG1heENvbmN1cnJlbmN5YCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBnYXRld2F5LlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgL1xuICAgICAgICAgICAgLy8gSWYgYG1heENvbmN1cnJlbmN5YCBpcyAxIHdlIGNhbiBzYWZlbHkgdXNlIDE2LlxuICAgICAgICAgICAgKGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSA9PT0gMSA/IDE2IDogZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KSxcbiAgICAgICAgKSAqIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeVxuICAgICAgKVxuICAgIH0sXG4gICAgY2FsY3VsYXRlV29ya2VySWQoc2hhcmRJZCkge1xuICAgICAgY29uc3Qgd29ya2VySWQgPSBNYXRoLm1pbihzaGFyZElkICUgZ2F0ZXdheS5zaGFyZHNQZXJXb3JrZXIsIGdhdGV3YXkudG90YWxXb3JrZXJzIC0gMSlcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW0dhdGV3YXldIENhbGN1bGF0aW5nIHdvcmtlcklkOiBTaGFyZDogJHtzaGFyZElkfSAtPiBXb3JrZXI6ICR7d29ya2VySWR9IC0+IFBlciBXb3JrZXI6ICR7Z2F0ZXdheS5zaGFyZHNQZXJXb3JrZXJ9IC0+IFRvdGFsOiAke2dhdGV3YXkudG90YWxXb3JrZXJzfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gd29ya2VySWRcbiAgICB9LFxuICAgIHByZXBhcmVCdWNrZXRzKCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3k7ICsraSkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBjb25jdXJyZW5jeTogJHtpfWApXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5zZXQoaSwge1xuICAgICAgICAgIHdvcmtlcnM6IFtdLFxuICAgICAgICAgIGlkZW50aWZ5UmVxdWVzdHM6IFtdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBPUkdBTklaRSBBTEwgU0hBUkRTIElOVE8gVEhFSVIgT1dOIEJVQ0tFVFNcbiAgICAgIGZvciAobGV0IHNoYXJkSWQgPSBnYXRld2F5LmZpcnN0U2hhcmRJZDsgc2hhcmRJZCA8PSBnYXRld2F5Lmxhc3RTaGFyZElkOyArK3NoYXJkSWQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBQcmVwYXJpbmcgYnVja2V0cyBmb3Igc2hhcmQ6ICR7c2hhcmRJZH1gKVxuICAgICAgICBpZiAoc2hhcmRJZCA+PSBnYXRld2F5LnRvdGFsU2hhcmRzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZCAoaWQ6ICR7c2hhcmRJZH0pIGlzIGJpZ2dlciBvciBlcXVhbCB0byB0aGUgdXNlZCBhbW91bnQgb2YgdXNlZCBzaGFyZHMgd2hpY2ggaXMgJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRJZCA9IHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3lcbiAgICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChidWNrZXRJZClcbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2hhcmQgKGlkOiAke3NoYXJkSWR9KSBnb3QgYXNzaWduZWQgdG8gYW4gaWxsZWdhbCBidWNrZXQgaWQ6ICR7YnVja2V0SWR9LCBleHBlY3RlZCBhIGJ1Y2tldCBpZCBiZXR3ZWVuIDAgYW5kICR7XG4gICAgICAgICAgICAgIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSAtIDFcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJTkQgQSBRVUVVRSBJTiBUSElTIEJVQ0tFVCBUSEFUIEhBUyBTUEFDRVxuICAgICAgICAvLyBjb25zdCB3b3JrZXIgPSBidWNrZXQud29ya2Vycy5maW5kKCh3KSA9PiB3LnF1ZXVlLmxlbmd0aCA8IGdhdGV3YXkuc2hhcmRzUGVyV29ya2VyKTtcbiAgICAgICAgY29uc3Qgd29ya2VySWQgPSBnYXRld2F5LmNhbGN1bGF0ZVdvcmtlcklkKHNoYXJkSWQpXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IGJ1Y2tldC53b3JrZXJzLmZpbmQoKHcpID0+IHcuaWQgPT09IHdvcmtlcklkKVxuICAgICAgICBpZiAod29ya2VyKSB7XG4gICAgICAgICAgLy8gSUYgVEhFIFFVRVVFIEhBUyBTUEFDRSBKVVNUIEFERCBJVCBUTyBUSElTIFFVRVVFXG4gICAgICAgICAgd29ya2VyLnF1ZXVlLnB1c2goc2hhcmRJZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud29ya2Vycy5wdXNoKHsgaWQ6IHdvcmtlcklkLCBxdWV1ZTogW3NoYXJkSWRdIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBidWNrZXQgb2YgZ2F0ZXdheS5idWNrZXRzLnZhbHVlcygpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIGJ1Y2tldC53b3JrZXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWFycmF5LXNvcnQtY29tcGFyZVxuICAgICAgICAgIHdvcmtlci5xdWV1ZSA9IHdvcmtlci5xdWV1ZS5zb3J0KChhLCBiKSA9PiBhIC0gYilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc3Bhd25TaGFyZHMoKSB7XG4gICAgICAvLyBQUkVQQVJFUyBBTEwgU0hBUkRTIElOIFNQRUNJRklDIEJVQ0tFVFNcbiAgICAgIGdhdGV3YXkucHJlcGFyZUJ1Y2tldHMoKVxuXG4gICAgICAvLyBQcmVmZXIgY29uY3VycmVuY3kgb2YgZm9yRWFjaCBpbnN0ZWFkIG9mIGZvcm9mXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLmdhdGV3YXkuYnVja2V0cy5lbnRyaWVzKCldLm1hcChhc3luYyAoW2J1Y2tldElkLCBidWNrZXRdKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS50ZWxsV29ya2VyVG9JZGVudGlmeSh3b3JrZXIuaWQsIHNoYXJkSWQsIGJ1Y2tldElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSxcbiAgICBhc3luYyBzaHV0ZG93bihjb2RlLCByZWFzb24pIHtcbiAgICAgIGdhdGV3YXkuc2hhcmRzLmZvckVhY2goKHNoYXJkKSA9PiBzaGFyZC5jbG9zZShjb2RlLCByZWFzb24pKVxuXG4gICAgICBhd2FpdCBkZWxheSg1MDAwKVxuICAgIH0sXG4gICAgYXN5bmMgc2VuZFBheWxvYWQoc2hhcmRJZCwgcGF5bG9hZCkge1xuICAgICAgY29uc3Qgc2hhcmQgPSBnYXRld2F5LnNoYXJkcy5nZXQoc2hhcmRJZClcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSBub3QgZm91bmRgKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBzaGFyZC5zZW5kKHBheWxvYWQpXG4gICAgfSxcbiAgICBhc3luYyB0ZWxsV29ya2VyVG9JZGVudGlmeSh3b3JrZXJJZCwgc2hhcmRJZCwgYnVja2V0SWQpIHtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gdGVsbCB3b3JrZXIgdG8gaWRlbnRpZnkgKCR7d29ya2VySWR9LCAke3NoYXJkSWR9LCAke2J1Y2tldElkfSlgKVxuICAgICAgYXdhaXQgZ2F0ZXdheS5pZGVudGlmeShzaGFyZElkKVxuICAgIH0sXG4gICAgYXN5bmMgaWRlbnRpZnkoc2hhcmRJZDogbnVtYmVyKSB7XG4gICAgICBsZXQgc2hhcmQgPSB0aGlzLnNoYXJkcy5nZXQoc2hhcmRJZClcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gaWRlbnRpZnlpbmcgJHtzaGFyZCA/ICdleGlzdGluZycgOiAnbmV3J30gc2hhcmQgKCR7c2hhcmRJZH0pYClcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBzaGFyZCA9IG5ldyBTaGFyZCh7XG4gICAgICAgICAgaWQ6IHNoYXJkSWQsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3MsXG4gICAgICAgICAgICBpbnRlbnRzOiB0aGlzLmludGVudHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0b2tlbjogdGhpcy50b2tlbixcbiAgICAgICAgICAgIHRvdGFsU2hhcmRzOiB0aGlzLnRvdGFsU2hhcmRzLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGdhdGV3YXkuaWRlbnRpZnkoc2hhcmRJZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNoYXJkSXNSZWFkeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7c2hhcmRJZH0gaXMgcmVhZHlgKVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoZ2F0ZXdheS5zcGF3blNoYXJkRGVsYXkpXG4gICAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXNvbHZpbmcgc2hhcmQgaWRlbnRpZnkgcmVxdWVzdGApXG4gICAgICAgICAgICBnYXRld2F5LmJ1Y2tldHMuZ2V0KHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpIS5pZGVudGlmeVJlcXVlc3RzLnNoaWZ0KCk/LigpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5wcmVmZXJTbmFrZUNhc2UpIHtcbiAgICAgICAgICBzaGFyZC5mb3J3YXJkVG9Cb3QgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgc2hhcmQhLmV2ZW50cy5tZXNzYWdlPy4oc2hhcmQhLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hhcmRzLnNldChzaGFyZElkLCBzaGFyZClcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuICAgICAgaWYgKCFidWNrZXQpIHJldHVyblxuXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgLy8gTWFyayB0aGF0IHdlIGFyZSBtYWtpbmcgYW4gaWRlbnRpZnkgcmVxdWVzdCBzbyBhbm90aGVyIGlzIG5vdCBtYWRlLlxuICAgICAgICBidWNrZXQuaWRlbnRpZnlSZXF1ZXN0cy5wdXNoKHJlc29sdmUpXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gaWRlbnRpZnlpbmcgc2hhcmQgIygke3NoYXJkSWR9KS5gKVxuICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBpZGVudGlmeSBhbmQgd2hlbiBSRUFEWSBpcyByZWNlaXZlZCBpdCB3aWxsIHJlc29sdmUgdGhlIGFib3ZlIHJlcXVlc3QuXG4gICAgICAgIHNoYXJkPy5pZGVudGlmeSgpXG4gICAgICB9KVxuICAgIH0sXG4gICAgYXN5bmMga2lsbChzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHNoYXJkID0gdGhpcy5zaGFyZHMuZ2V0KHNoYXJkSWQpXG4gICAgICBpZiAoIXNoYXJkKSB7XG4gICAgICAgIHJldHVybiBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGtpbGwgc2hhcmQgYnV0IG5vdCBmb3VuZCAoJHtzaGFyZElkfSlgKVxuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGtpbGwgc2hhcmQgKCR7c2hhcmRJZH0pYClcbiAgICAgIHRoaXMuc2hhcmRzLmRlbGV0ZShzaGFyZElkKVxuICAgICAgYXdhaXQgc2hhcmQuc2h1dGRvd24oKVxuICAgIH0sXG4gICAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KHNoYXJkSWQ6IG51bWJlcikge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0aW5nIGlkZW50aWZ5YClcbiAgICAgIC8vIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoc2hhcmRJZCAlIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgIC8vIGlmICghYnVja2V0KSByZXR1cm5cblxuICAgICAgLy8gcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyAgIGJ1Y2tldC5pZGVudGlmeVJlcXVlc3RzLnB1c2gocmVzb2x2ZSlcbiAgICAgIC8vIH0pXG4gICAgfSxcblxuICAgIC8vIEhlbHBlcnMgbWV0aG9kcyBiZWxvdyB0aGlzXG5cbiAgICBjYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQsIHRvdGFsU2hhcmRzKSB7XG4gICAgICAvLyBJZiBub25lIGlzIHByb3ZpZGVkLCB1c2UgdGhlIHRvdGFsIHNoYXJkcyBudW1iZXIgZnJvbSBnYXRld2F5IG9iamVjdC5cbiAgICAgIGlmICghdG90YWxTaGFyZHMpIHRvdGFsU2hhcmRzID0gZ2F0ZXdheS50b3RhbFNoYXJkc1xuICAgICAgLy8gSWYgaXQgaXMgb25seSAxIHNoYXJkLCBpdCB3aWxsIGFsd2F5cyBiZSBzaGFyZCBpZCAwXG4gICAgICBpZiAodG90YWxTaGFyZHMgPT09IDEpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBjYWxjdWxhdGVTaGFyZElkICgxIHNoYXJkKWApXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoZ3VpbGRJZDogJHtndWlsZElkfSwgdG90YWxTaGFyZHM6ICR7dG90YWxTaGFyZHN9KWApXG4gICAgICByZXR1cm4gTnVtYmVyKChCaWdJbnQoZ3VpbGRJZCkgPj4gMjJuKSAlIEJpZ0ludCh0b3RhbFNoYXJkcykpXG4gICAgfSxcblxuICAgIGFzeW5jIGpvaW5Wb2ljZUNoYW5uZWwoZ3VpbGRJZCwgY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gam9pblZvaWNlQ2hhbm5lbCBndWlsZElkOiAke2d1aWxkSWR9IGNoYW5uZWxJZDogJHtjaGFubmVsSWR9YClcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgZ3VpbGRfaWQ6IGd1aWxkSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjaGFubmVsX2lkOiBjaGFubmVsSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBzZWxmX211dGU6IG9wdGlvbnM/LnNlbGZNdXRlID8/IGZhbHNlLFxuICAgICAgICAgIHNlbGZfZGVhZjogb3B0aW9ucz8uc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RTdGF0dXMoZGF0YSkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBlZGl0Qm90U3RhdHVzIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YClcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5nYXRld2F5LnNoYXJkcy52YWx1ZXMoKV0ubWFwKGFzeW5jIChzaGFyZCkgPT4ge1xuICAgICAgICAgIGdhdGV3YXkuZWRpdFNoYXJkU3RhdHVzKHNoYXJkLmlkLCBkYXRhKVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFNoYXJkU3RhdHVzKHNoYXJkSWQsIGRhdGEpIHtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gZWRpdFNoYXJkU3RhdHVzIHNoYXJkSWQ6ICR7c2hhcmRJZH0gLT4gZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gKVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlByZXNlbmNlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgc2luY2U6IG51bGwsXG4gICAgICAgICAgYWZrOiBmYWxzZSxcbiAgICAgICAgICBhY3Rpdml0aWVzOiBkYXRhLmFjdGl2aXRpZXMsXG4gICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZClcblxuICAgICAgaWYgKGdhdGV3YXkuaW50ZW50cyAmJiAoIW9wdGlvbnM/LmxpbWl0IHx8IG9wdGlvbnMubGltaXQgPiAxKSAmJiAhKGdhdGV3YXkuaW50ZW50cyAmIEdhdGV3YXlJbnRlbnRzLkd1aWxkTWVtYmVycykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZldGNoIG1vcmUgdGhlbiAxIG1lbWJlciB3aXRob3V0IHRoZSBHVUlMRF9NRU1CRVJTIGludGVudCcpXG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gcmVxdWVzdE1lbWJlcnMgZ3VpbGRJZDogJHtndWlsZElkfSAtPiBkYXRhOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApXG5cbiAgICAgIGlmIChvcHRpb25zPy51c2VySWRzPy5sZW5ndGgpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0TWVtYmVycyBndWlsZElkOiAke2d1aWxkSWR9IC0+IHNldHRpbmcgdXNlciBsaW1pdCBiYXNlZCBvbiB1c2VySWRzIGxlbmd0aDogJHtvcHRpb25zLnVzZXJJZHMubGVuZ3RofWApXG5cbiAgICAgICAgb3B0aW9ucy5saW1pdCA9IG9wdGlvbnMudXNlcklkcy5sZW5ndGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVtYmVycyA9XG4gICAgICAgICFnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWQgfHwgIW9wdGlvbnM/Lm5vbmNlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogbmV3IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gICAgICAgICAgICAgIGlmICghZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkIHx8ICFvcHRpb25zPy5ub25jZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IHRoZSBtZW1iZXJzIHdpdGhvdXQgdGhlIG5vbmNlIG9yIHdpdGggdGhlIGZlYXR1cmUgZGlzYWJsZWQuXCIpKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5wZW5kaW5nLnNldChvcHRpb25zLm5vbmNlLCB7XG4gICAgICAgICAgICAgICAgbm9uY2U6IG9wdGlvbnMubm9uY2UsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICBtZW1iZXJzOiBbXSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdEd1aWxkTWVtYmVycyxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgLy8gSWYgYSBxdWVyeSBpcyBwcm92aWRlZCB1c2UgaXQsIE9SIGlmIGEgbGltaXQgaXMgTk9UIHByb3ZpZGVkIHVzZSBcIlwiXG4gICAgICAgICAgcXVlcnk6IG9wdGlvbnM/LnF1ZXJ5ID8/IChvcHRpb25zPy5saW1pdCA/IHVuZGVmaW5lZCA6ICcnKSxcbiAgICAgICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gMCxcbiAgICAgICAgICBwcmVzZW5jZXM6IG9wdGlvbnM/LnByZXNlbmNlcyA/PyBmYWxzZSxcbiAgICAgICAgICB1c2VyX2lkczogb3B0aW9ucz8udXNlcklkcz8ubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgICAgbm9uY2U6IG9wdGlvbnM/Lm5vbmNlLFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IG1lbWJlcnNcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVWb2ljZUNoYW5uZWwoZ3VpbGRJZCkge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGxlYXZlVm9pY2VDaGFubmVsIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gU2hhcmQgJHtzaGFyZElkfWApXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuVm9pY2VTdGF0ZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhbm5lbF9pZDogbnVsbCxcbiAgICAgICAgICBzZWxmX211dGU6IGZhbHNlLFxuICAgICAgICAgIHNlbGZfZGVhZjogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gZ2F0ZXdheVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUdhdGV3YXlNYW5hZ2VyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZCBvZiB0aGUgZmlyc3QgU2hhcmQgd2hpY2ggc2hvdWxkIGdldCBjb250cm9sbGVkIGJ5IHRoaXMgbWFuYWdlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgZmlyc3RTaGFyZElkPzogbnVtYmVyXG4gIC8qKlxuICAgKiBJZCBvZiB0aGUgbGFzdCBTaGFyZCB3aGljaCBzaG91bGQgZ2V0IGNvbnRyb2xsZWQgYnkgdGhpcyBtYW5hZ2VyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBsYXN0U2hhcmRJZD86IG51bWJlclxuICAvKipcbiAgICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNwYXduaW5nIG5leHQgc2hhcmQuIE9QVElNQUwgSVMgQUJPVkUgNTEwMC4gWU9VIERPTidUIFdBTlQgVE8gSElUIFRIRSBSQVRFIExJTUlUISEhXG4gICAqIEBkZWZhdWx0IDUzMDBcbiAgICovXG4gIHNwYXduU2hhcmREZWxheT86IG51bWJlclxuICAvKipcbiAgICogV2hldGhlciB0byBzZW5kIHRoZSBkaXNjb3JkIHBhY2tldHMgaW4gc25ha2UgY2FzZSBmb3JtLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcHJlZmVyU25ha2VDYXNlPzogYm9vbGVhblxuICAvKipcbiAgICogVG90YWwgYW1vdW50IG9mIHNoYXJkcyB5b3VyIGJvdCB1c2VzLiBVc2VmdWwgZm9yIHplcm8tZG93bnRpbWUgdXBkYXRlcyBvciByZXNoYXJkaW5nLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICB0b3RhbFNoYXJkcz86IG51bWJlclxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBzaGFyZHMgdG8gbG9hZCBwZXIgd29ya2VyLlxuICAgKiBAZGVmYXVsdCAyNVxuICAgKi9cbiAgc2hhcmRzUGVyV29ya2VyPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIHdvcmtlcnMgdG8gdXNlIGZvciB5b3VyIGJvdC5cbiAgICogQGRlZmF1bHQgNFxuICAgKi9cbiAgdG90YWxXb3JrZXJzPzogbnVtYmVyXG4gIC8qKiBJbXBvcnRhbnQgZGF0YSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBtYW5hZ2VyIHRvIGNvbm5lY3Qgc2hhcmRzIHRvIHRoZSBnYXRld2F5LiAqL1xuICBjb25uZWN0aW9uPzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+XG4gIC8qKiBXaGV0aGVyIGluY29taW5nIHBheWxvYWRzIGFyZSBjb21wcmVzc2VkIHVzaW5nIHpsaWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb21wcmVzcz86IGJvb2xlYW5cbiAgLyoqIFRoZSBjYWxjdWxhdGVkIGludGVudCB2YWx1ZSBvZiB0aGUgZXZlbnRzIHdoaWNoIHRoZSBzaGFyZCBzaG91bGQgcmVjZWl2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgaW50ZW50cz86IG51bWJlclxuICAvKiogSWRlbnRpZnkgcHJvcGVydGllcyB0byB1c2UgKi9cbiAgcHJvcGVydGllcz86IHtcbiAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSB0aGUgc2hhcmQgcnVucyBvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiZGFyd2luXCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIlxuICAgICAqL1xuICAgIG9zOiBzdHJpbmdcbiAgICAvKiogVGhlIFwiYnJvd3NlclwiIHdoZXJlIHRoaXMgc2hhcmQgaXMgcnVubmluZyBvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgYnJvd3Nlcjogc3RyaW5nXG4gICAgLyoqIFRoZSBkZXZpY2Ugb24gd2hpY2ggdGhlIHNoYXJkIGlzIHJ1bm5pbmcuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIkRpc2NvcmRlbm9cIlxuICAgICAqL1xuICAgIGRldmljZTogc3RyaW5nXG4gIH1cbiAgLyoqIEJvdCB0b2tlbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZCAqL1xuICB0b2tlbjogc3RyaW5nXG4gIC8qKiBUaGUgVVJMIG9mIHRoZSBnYXRld2F5IHdoaWNoIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwid3NzOi8vZ2F0ZXdheS5kaXNjb3JkLmdnXCJcbiAgICovXG4gIHVybD86IHN0cmluZ1xuICAvKiogVGhlIGdhdGV3YXkgdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHZlcnNpb24/OiBudW1iZXJcbiAgLyoqIFRoZSBldmVudHMgaGFuZGxlcnMgKi9cbiAgZXZlbnRzPzogU2hhcmRFdmVudHNcbiAgLyoqIFRoaXMgbWFuYWdlcnMgY2FjaGUgcmVsYXRlZCBzZXR0aW5ncy4gKi9cbiAgY2FjaGU/OiB7XG4gICAgcmVxdWVzdE1lbWJlcnM/OiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkPzogYm9vbGVhblxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGxvZ2dlciB0aGF0IHRoZSBnYXRld2F5IG1hbmFnZXIgd2lsbCB1c2VcbiAgICogQGRlZmF1bHQgbG9nZ2VyIC8vIFRoZSBsb2dnZXIgZXhwb3J0ZWQgYnkgYEBkaXNjb3JkZW5vL3V0aWxzYFxuICAgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheU1hbmFnZXIgZXh0ZW5kcyBSZXF1aXJlZDxDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnM+IHtcbiAgLyoqIFRoZSBtYXggY29uY3VycmVuY3kgYnVja2V0cy4gVGhvc2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGBzcGF3blNoYXJkc2AgKHdoaWNoIGNhbGxzIGBwcmVwYXJlQnVja2V0c2AgdW5kZXIgdGhlIGhvb2QpIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiAqL1xuICBidWNrZXRzOiBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHtcbiAgICAgIHdvcmtlcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcXVldWU6IG51bWJlcltdIH0+XG4gICAgICAvKiogUmVxdWVzdHMgdG8gaWRlbnRpZnkgc2hhcmRzIGFyZSBtYWRlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYXZhaWxhYmxlIHRvIGJlIG1hZGUuICovXG4gICAgICBpZGVudGlmeVJlcXVlc3RzOiBBcnJheTwodmFsdWU6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPikgPT4gdm9pZD5cbiAgICB9XG4gID5cbiAgLyoqIFRoZSBzaGFyZHMgdGhhdCBhcmUgY3JlYXRlZC4gKi9cbiAgc2hhcmRzOiBNYXA8bnVtYmVyLCBTaGFyZD5cbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBnYXRld2F5IG1hbmFnZXIgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIERldGVybWluZSBtYXggbnVtYmVyIG9mIHNoYXJkcyB0byB1c2UgYmFzZWQgdXBvbiB0aGUgbWF4IGNvbmN1cnJlbmN5LiAqL1xuICBjYWxjdWxhdGVUb3RhbFNoYXJkczogKCkgPT4gbnVtYmVyXG4gIC8qKiBEZXRlcm1pbmUgdGhlIGlkIG9mIHRoZSB3b3JrZXIgd2hpY2ggaXMgaGFuZGxpbmcgYSBzaGFyZC4gKi9cbiAgY2FsY3VsYXRlV29ya2VySWQ6IChzaGFyZElkOiBudW1iZXIpID0+IG51bWJlclxuICAvKiogUHJlcGFyZXMgYWxsIHRoZSBidWNrZXRzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgaWRlbnRpZnlpbmcgdGhlIHNoYXJkcy4gKi9cbiAgcHJlcGFyZUJ1Y2tldHM6ICgpID0+IHZvaWRcbiAgLyoqIFN0YXJ0IGlkZW50aWZ5aW5nIGFsbCB0aGUgc2hhcmRzLiAqL1xuICBzcGF3blNoYXJkczogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogU2h1dGRvd24gYWxsIHNoYXJkcy4gKi9cbiAgc2h1dGRvd246IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIHNlbmRQYXlsb2FkOiAoc2hhcmRJZDogbnVtYmVyLCBwYXlsb2FkOiBTaGFyZFNvY2tldFJlcXVlc3QpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEFsbG93cyB1c2VycyB0byBob29rIGluIGFuZCBjaGFuZ2UgdG8gY29tbXVuaWNhdGUgdG8gZGlmZmVyZW50IHdvcmtlcnMgYWNyb3NzIGRpZmZlcmVudCBzZXJ2ZXJzIG9yIGFueXRoaW5nIHRoZXkgbGlrZS4gRm9yIGV4YW1wbGUgdXNpbmcgcmVkaXMgcHVic3ViIHRvIHRhbGsgdG8gb3RoZXIgc2VydmVycy4gKi9cbiAgdGVsbFdvcmtlclRvSWRlbnRpZnk6ICh3b3JrZXJJZDogbnVtYmVyLCBzaGFyZElkOiBudW1iZXIsIGJ1Y2tldElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRlbGwgdGhlIG1hbmFnZXIgdG8gaWRlbnRpZnkgYSBTaGFyZC4gSWYgdGhpcyBTaGFyZCBpcyBub3QgYWxyZWFkeSBtYW5hZ2VkIHRoaXMgd2lsbCBhbHNvIGFkZCB0aGUgU2hhcmQgdG8gdGhlIG1hbmFnZXIuICovXG4gIGlkZW50aWZ5OiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBLaWxsIGEgc2hhcmQuIENsb3NlIGEgc2hhcmRzIGNvbm5lY3Rpb24gdG8gRGlzY29yZCdzIGdhdGV3YXkgKGlmIGFueSkgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBtYW5hZ2VyLiAqL1xuICBraWxsOiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgYnVja2V0IGlzIGFsbG93ZWQgdG8gbWFrZSB0aGUgbmV4dCBpZGVudGlmeSByZXF1ZXN0LiAqL1xuICByZXF1ZXN0SWRlbnRpZnk6IChzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBzaGFyZHMgYmFzZWQgb24gdGhlIGd1aWxkIGlkIGFuZCB0b3RhbCBzaGFyZHMuICovXG4gIGNhbGN1bGF0ZVNoYXJkSWQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRvdGFsU2hhcmRzPzogbnVtYmVyKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIENvbm5lY3RzIHRoZSBib3QgdXNlciB0byBhIHZvaWNlIG9yIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIF9VcGRhdGUgVm9pY2UgU3RhdGVfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIHZvaWNlIGNoYW5uZWwgdG8gbGVhdmUgaXMgaW4uXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgeW91IHdhbnQgdG8gam9pbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBDT05ORUNUYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9Wb2ljZSBTdGF0ZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3VwZGF0ZS12b2ljZS1zdGF0ZX1cbiAgICovXG4gIGpvaW5Wb2ljZUNoYW5uZWw6IChndWlsZElkOiBCaWdTdHJpbmcsIGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQXRMZWFzdE9uZTxPbWl0PFVwZGF0ZVZvaWNlU3RhdGUsICdndWlsZElkJyB8ICdjaGFubmVsSWQnPj4pID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBib3Qgc3RhdHVzIGluIGFsbCBzaGFyZHMgdGhhdCB0aGlzIGdhdGV3YXkgbWFuYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIHN0YXR1cyBkYXRhIHRvIHNldCB0aGUgYm90cyBzdGF0dXMgdG8uXG4gICAqIEByZXR1cm5zIFByb21pc2U8dm9pZD5cbiAgICovXG4gIGVkaXRCb3RTdGF0dXM6IChkYXRhOiBTdGF0dXNVcGRhdGUpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBib3QncyBzdGF0dXMgb24gb25lIHNoYXJkLlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcmRJZCBUaGUgc2hhcmQgaWQgdG8gZWRpdCB0aGUgc3RhdHVzIGZvci5cbiAgICogQHBhcmFtIGRhdGEgVGhlIHN0YXR1cyBkYXRhIHRvIHNldCB0aGUgYm90cyBzdGF0dXMgdG8uXG4gICAqIEByZXR1cm5zIFByb21pc2U8dm9pZD5cbiAgICovXG4gIGVkaXRTaGFyZFN0YXR1czogKHNoYXJkSWQ6IG51bWJlciwgZGF0YTogU3RhdHVzVXBkYXRlKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIG1lbWJlcnMgZm9yIGEgZ3VpbGQgb3ZlciB0aGUgZ2F0ZXdheS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZW1iZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiByZXF1ZXN0aW5nIHRoZSBlbnRpcmUgbWVtYmVyIGxpc3Q6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBHVUlMRF9NRU1CRVJTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgcHJlc2VuY2VzICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5wcmVzZW5jZXMgfCBwcmVzZW5jZXN9IHNldCB0byBgdHJ1ZWApOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfUFJFU0VOQ0VTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSBwcmVmaXggKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnF1ZXJ5IHwgcXVlcnl9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSB1c2VycyBieSBJRCAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMudXNlcklkcyB8IHVzZXJJZHN9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlcnMgQ2h1bmtfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IDEwMDAgbWVtYmVycyBmZXRjaGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqL1xuICByZXF1ZXN0TWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IE9taXQ8UmVxdWVzdEd1aWxkTWVtYmVycywgJ2d1aWxkSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gIC8qKlxuICAgKiBMZWF2ZXMgdGhlIHZvaWNlIGNoYW5uZWwgdGhlIGJvdCB1c2VyIGlzIGN1cnJlbnRseSBpbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSN1cGRhdGUtdm9pY2Utc3RhdGV9XG4gICAqL1xuICBsZWF2ZVZvaWNlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZToge1xuICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkOiBib29sZWFuXG4gICAgICAvKiogVGhlIHBlbmRpbmcgcmVxdWVzdHMuICovXG4gICAgICBwZW5kaW5nOiBDb2xsZWN0aW9uPHN0cmluZywgUmVxdWVzdE1lbWJlclJlcXVlc3Q+XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE1lbWJlclJlcXVlc3Qge1xuICAvKiogVGhlIHVuaXF1ZSBub25jZSBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBub25jZTogc3RyaW5nXG4gIC8qKiBUaGUgcmVzb2x2ZXIgaGFuZGxlciB0byBydW4gd2hlbiBhbGwgbWVtYmVycyBhcnJpdmUuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogQ2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+IHwgUHJvbWlzZUxpa2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PikgPT4gdm9pZFxuICAvKiogVGhlIG1lbWJlcnMgdGhhdCBoYXZlIGFscmVhZHkgYXJyaXZlZCBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBtZW1iZXJzOiBEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUdhdGV3YXlNYW5hZ2VyIiwib3B0aW9ucyIsImNvbm5lY3Rpb25PcHRpb25zIiwiY29ubmVjdGlvbiIsInVybCIsInNoYXJkcyIsInNlc3Npb25TdGFydExpbWl0IiwibWF4Q29uY3VycmVuY3kiLCJyZW1haW5pbmciLCJ0b3RhbCIsInJlc2V0QWZ0ZXIiLCJnYXRld2F5IiwiZXZlbnRzIiwiY29tcHJlc3MiLCJpbnRlbnRzIiwicHJvcGVydGllcyIsIm9zIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYnJvd3NlciIsImRldmljZSIsInRva2VuIiwidmVyc2lvbiIsInRvdGFsU2hhcmRzIiwibGFzdFNoYXJkSWQiLCJmaXJzdFNoYXJkSWQiLCJ0b3RhbFdvcmtlcnMiLCJzaGFyZHNQZXJXb3JrZXIiLCJzcGF3blNoYXJkRGVsYXkiLCJwcmVmZXJTbmFrZUNhc2UiLCJNYXAiLCJidWNrZXRzIiwiY2FjaGUiLCJyZXF1ZXN0TWVtYmVycyIsImVuYWJsZWQiLCJwZW5kaW5nIiwiQ29sbGVjdGlvbiIsImxvZ2dlciIsImNhbGN1bGF0ZVRvdGFsU2hhcmRzIiwiZGVidWciLCJNYXRoIiwiY2VpbCIsImNhbGN1bGF0ZVdvcmtlcklkIiwic2hhcmRJZCIsIndvcmtlcklkIiwibWluIiwicHJlcGFyZUJ1Y2tldHMiLCJpIiwic2V0Iiwid29ya2VycyIsImlkZW50aWZ5UmVxdWVzdHMiLCJFcnJvciIsImJ1Y2tldElkIiwiYnVja2V0IiwiZ2V0Iiwid29ya2VyIiwiZmluZCIsInciLCJpZCIsInF1ZXVlIiwicHVzaCIsInZhbHVlcyIsInNvcnQiLCJhIiwiYiIsInNwYXduU2hhcmRzIiwiUHJvbWlzZSIsImFsbCIsImVudHJpZXMiLCJtYXAiLCJ0ZWxsV29ya2VyVG9JZGVudGlmeSIsInNodXRkb3duIiwiY29kZSIsInJlYXNvbiIsImZvckVhY2giLCJzaGFyZCIsImNsb3NlIiwiZGVsYXkiLCJzZW5kUGF5bG9hZCIsInBheWxvYWQiLCJzZW5kIiwiaWRlbnRpZnkiLCJTaGFyZCIsInJlcXVlc3RJZGVudGlmeSIsInNoYXJkSXNSZWFkeSIsInNoaWZ0IiwiZm9yd2FyZFRvQm90IiwibWVzc2FnZSIsInJlc29sdmUiLCJraWxsIiwiZGVsZXRlIiwiY2FsY3VsYXRlU2hhcmRJZCIsImd1aWxkSWQiLCJOdW1iZXIiLCJCaWdJbnQiLCJqb2luVm9pY2VDaGFubmVsIiwiY2hhbm5lbElkIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIlZvaWNlU3RhdGVVcGRhdGUiLCJkIiwiZ3VpbGRfaWQiLCJ0b1N0cmluZyIsImNoYW5uZWxfaWQiLCJzZWxmX211dGUiLCJzZWxmTXV0ZSIsInNlbGZfZGVhZiIsInNlbGZEZWFmIiwiZWRpdEJvdFN0YXR1cyIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZWRpdFNoYXJkU3RhdHVzIiwiUHJlc2VuY2VVcGRhdGUiLCJzaW5jZSIsImFmayIsImFjdGl2aXRpZXMiLCJzdGF0dXMiLCJsaW1pdCIsIkdhdGV3YXlJbnRlbnRzIiwiR3VpbGRNZW1iZXJzIiwidXNlcklkcyIsImxlbmd0aCIsIm1lbWJlcnMiLCJub25jZSIsInJlamVjdCIsIlJlcXVlc3RHdWlsZE1lbWJlcnMiLCJxdWVyeSIsInVuZGVmaW5lZCIsInByZXNlbmNlcyIsInVzZXJfaWRzIiwibGVhdmVWb2ljZUNoYW5uZWwiXSwibWFwcGluZ3MiOiJBQUFBLGtFQUFrRTs7OzsrQkFlbERBOzs7ZUFBQUE7Ozt1QkFMVDt1QkFDbUM7OERBQ3hCOzs7Ozs7QUFHWCxTQUFTQSxxQkFBcUJDLE9BQW9DO0lBQ3ZFLE1BQU1DLG9CQUFvQkQsUUFBUUUsVUFBVSxJQUFJO1FBQzlDQyxLQUFLO1FBQ0xDLFFBQVE7UUFDUkMsbUJBQW1CO1lBQ2pCQyxnQkFBZ0I7WUFDaEJDLFdBQVc7WUFDWEMsT0FBTztZQUNQQyxZQUFZLE9BQU8sS0FBSyxLQUFLO1FBQy9CO0lBQ0Y7SUFFQSxNQUFNQyxVQUEwQjtRQUM5QkMsUUFBUVgsUUFBUVcsTUFBTSxJQUFJLENBQUM7UUFD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
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
ShardSocketCloseCodes: function() {
|
|
13
|
+
return ShardSocketCloseCodes;
|
|
14
|
+
},
|
|
15
|
+
ShardState: function() {
|
|
16
|
+
return ShardState;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var ShardState;
|
|
20
|
+
(function(ShardState) {
|
|
21
|
+
/** Shard is fully connected to the gateway and receiving events from Discord. */ ShardState[ShardState["Connected"] = 0] = "Connected";
|
|
22
|
+
/** Shard started to connect to the gateway. This is only used if the shard is not currently trying to identify or resume. */ ShardState[ShardState["Connecting"] = 1] = "Connecting";
|
|
23
|
+
/** Shard got disconnected and reconnection actions have been started. */ ShardState[ShardState["Disconnected"] = 2] = "Disconnected";
|
|
24
|
+
/** The shard is connected to the gateway but only heartbeating. At this state the shard has not been identified with discord. */ ShardState[ShardState["Unidentified"] = 3] = "Unidentified";
|
|
25
|
+
/** Shard is trying to identify with the gateway to create a new session. */ ShardState[ShardState["Identifying"] = 4] = "Identifying";
|
|
26
|
+
/** Shard is trying to resume a session with the gateway. */ ShardState[ShardState["Resuming"] = 5] = "Resuming";
|
|
27
|
+
/** Shard got shut down studied or due to a not (self) fixable error and may not attempt to reconnect on its own. */ ShardState[ShardState["Offline"] = 6] = "Offline";
|
|
28
|
+
})(ShardState || (ShardState = {}));
|
|
29
|
+
var ShardSocketCloseCodes;
|
|
30
|
+
(function(ShardSocketCloseCodes) {
|
|
31
|
+
/** A regular Shard shutdown. */ ShardSocketCloseCodes[ShardSocketCloseCodes["Shutdown"] = 3000] = "Shutdown";
|
|
32
|
+
/** A resume has been requested and therefore the old connection needs to be closed. */ ShardSocketCloseCodes[ShardSocketCloseCodes["ResumeClosingOldConnection"] = 3024] = "ResumeClosingOldConnection";
|
|
33
|
+
/** Did not receive a heartbeat ACK in time.
|
|
34
|
+
* Closing the shard and creating a new session.
|
|
35
|
+
*/ ShardSocketCloseCodes[ShardSocketCloseCodes["ZombiedConnection"] = 3010] = "ZombiedConnection";
|
|
36
|
+
/** Discordeno's gateway tests hae been finished, therefore the Shard can be turned off. */ ShardSocketCloseCodes[ShardSocketCloseCodes["TestingFinished"] = 3064] = "TestingFinished";
|
|
37
|
+
/** Special close code reserved for Discordeno's zero-downtime resharding system. */ ShardSocketCloseCodes[ShardSocketCloseCodes["Resharded"] = 3065] = "Resharded";
|
|
38
|
+
/** Shard is re-identifying therefore the old connection needs to be closed. */ ShardSocketCloseCodes[ShardSocketCloseCodes["ReIdentifying"] = 3066] = "ReIdentifying";
|
|
39
|
+
})(ShardSocketCloseCodes || (ShardSocketCloseCodes = {}));
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGl2aXR5VHlwZXMsIENhbWVsaXplLCBEaXNjb3JkQWN0aXZpdHksIERpc2NvcmRHYXRld2F5UGF5bG9hZCwgR2F0ZXdheU9wY29kZXMsIFByZXNlbmNlU3RhdHVzIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgdHlwZSBTaGFyZCBmcm9tICcuL1NoYXJkLmpzJ1xuXG5leHBvcnQgZW51bSBTaGFyZFN0YXRlIHtcbiAgLyoqIFNoYXJkIGlzIGZ1bGx5IGNvbm5lY3RlZCB0byB0aGUgZ2F0ZXdheSBhbmQgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIERpc2NvcmQuICovXG4gIENvbm5lY3RlZCA9IDAsXG4gIC8qKiBTaGFyZCBzdGFydGVkIHRvIGNvbm5lY3QgdG8gdGhlIGdhdGV3YXkuIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBzaGFyZCBpcyBub3QgY3VycmVudGx5IHRyeWluZyB0byBpZGVudGlmeSBvciByZXN1bWUuICovXG4gIENvbm5lY3RpbmcgPSAxLFxuICAvKiogU2hhcmQgZ290IGRpc2Nvbm5lY3RlZCBhbmQgcmVjb25uZWN0aW9uIGFjdGlvbnMgaGF2ZSBiZWVuIHN0YXJ0ZWQuICovXG4gIERpc2Nvbm5lY3RlZCA9IDIsXG4gIC8qKiBUaGUgc2hhcmQgaXMgY29ubmVjdGVkIHRvIHRoZSBnYXRld2F5IGJ1dCBvbmx5IGhlYXJ0YmVhdGluZy4gQXQgdGhpcyBzdGF0ZSB0aGUgc2hhcmQgaGFzIG5vdCBiZWVuIGlkZW50aWZpZWQgd2l0aCBkaXNjb3JkLiAqL1xuICBVbmlkZW50aWZpZWQgPSAzLFxuICAvKiogU2hhcmQgaXMgdHJ5aW5nIHRvIGlkZW50aWZ5IHdpdGggdGhlIGdhdGV3YXkgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24uICovXG4gIElkZW50aWZ5aW5nID0gNCxcbiAgLyoqIFNoYXJkIGlzIHRyeWluZyB0byByZXN1bWUgYSBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIFJlc3VtaW5nID0gNSxcbiAgLyoqIFNoYXJkIGdvdCBzaHV0IGRvd24gc3R1ZGllZCBvciBkdWUgdG8gYSBub3QgKHNlbGYpIGZpeGFibGUgZXJyb3IgYW5kIG1heSBub3QgYXR0ZW1wdCB0byByZWNvbm5lY3Qgb24gaXRzIG93bi4gKi9cbiAgT2ZmbGluZSA9IDYsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgaW5jb21pbmcgcGF5bG9hZHMgYXJlIGNvbXByZXNzZWQgdXNpbmcgemxpYi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGNvbXByZXNzOiBib29sZWFuXG4gIC8qKiBUaGUgY2FsY3VsYXRlZCBpbnRlbnQgdmFsdWUgb2YgdGhlIGV2ZW50cyB3aGljaCB0aGUgc2hhcmQgc2hvdWxkIHJlY2VpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGludGVudHM6IG51bWJlclxuICAvKiogSWRlbnRpZnkgcHJvcGVydGllcyB0byB1c2UgKi9cbiAgcHJvcGVydGllczoge1xuICAgIC8qKiBPcGVyYXRpbmcgc3lzdGVtIHRoZSBzaGFyZCBydW5zIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJkYXJ3aW5cIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiXG4gICAgICovXG4gICAgb3M6IHN0cmluZ1xuICAgIC8qKiBUaGUgXCJicm93c2VyXCIgd2hlcmUgdGhpcyBzaGFyZCBpcyBydW5uaW5nIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJEaXNjb3JkZW5vXCJcbiAgICAgKi9cbiAgICBicm93c2VyOiBzdHJpbmdcbiAgICAvKiogVGhlIGRldmljZSBvbiB3aGljaCB0aGUgc2hhcmQgaXMgcnVubmluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgZGV2aWNlOiBzdHJpbmdcbiAgfVxuICAvKiogQm90IHRva2VuIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkICovXG4gIHRva2VuOiBzdHJpbmdcbiAgLyoqIFRoZSBVUkwgb2YgdGhlIGdhdGV3YXkgd2hpY2ggc2hvdWxkIGJlIGNvbm5lY3RlZCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2dcIlxuICAgKi9cbiAgdXJsOiBzdHJpbmdcbiAgLyoqIFRoZSBnYXRld2F5IHZlcnNpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB2ZXJzaW9uOiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzIHRvIGNvbm5lY3QgdG8gYWNyb3NzIHRoZSBlbnRpcmUgYm90LlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICB0b3RhbFNoYXJkczogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRIZWFydCB7XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgaGVhcnRiZWF0IHdhcyBhY2tub3dsZWRnZWQgYnkgRGlzY29yZCBpbiB0aW1lLiAqL1xuICBhY2tub3dsZWRnZWQ6IGJvb2xlYW5cbiAgLyoqIEludGVydmFsIGJldHdlZW4gaGVhcnRiZWF0cyByZXF1ZXN0ZWQgYnkgRGlzY29yZC4gKi9cbiAgaW50ZXJ2YWw6IG51bWJlclxuICAvKiogSWQgb2YgdGhlIGludGVydmFsLCB3aGljaCBpcyB1c2VkIGZvciBzZW5kaW5nIHRoZSBoZWFydGJlYXRzLiAqL1xuICBpbnRlcnZhbElkPzogTm9kZUpTLlRpbWVvdXRcbiAgLyoqIFVuaXggKGluIG1pbGxpc2Vjb25kcykgdGltZXN0YW1wIHdoZW4gdGhlIGxhc3QgaGVhcnRiZWF0IEFDSyB3YXMgcmVjZWl2ZWQgZnJvbSBEaXNjb3JkLiAqL1xuICBsYXN0QWNrPzogbnVtYmVyXG4gIC8qKiBVbml4IHRpbWVzdGFtcCAoaW4gbWlsbGlzZWNvbmRzKSB3aGVuIHRoZSBsYXN0IGhlYXJ0YmVhdCB3YXMgc2VudC4gKi9cbiAgbGFzdEJlYXQ/OiBudW1iZXJcbiAgLyoqIFJvdW5kIHRyaXAgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBmcm9tIFNoYXJkIHRvIERpc2NvcmQgYW5kIGJhY2suXG4gICAqIENhbGN1bGF0ZWQgdXNpbmcgdGhlIGhlYXJ0YmVhdCBzeXN0ZW0uXG4gICAqIE5vdGU6IHRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIHVudGlsIHRoZSBmaXJzdCBoZWFydGJlYXQgdG8gRGlzY29yZCBoYXMgaGFwcGVuZWQuXG4gICAqL1xuICBydHQ/OiBudW1iZXJcbiAgLyoqIElkIG9mIHRoZSB0aW1lb3V0IHdoaWNoIGlzIHVzZWQgZm9yIHNlbmRpbmcgdGhlIGZpcnN0IGhlYXJ0YmVhdCB0byBEaXNjb3JkIHNpbmNlIGl0J3MgXCJzcGVjaWFsXCIuICovXG4gIHRpbWVvdXRJZD86IE5vZGVKUy5UaW1lb3V0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRFdmVudHMge1xuICAvKiogQSBoZWFydGJlYXQgaGFzIGJlZW4gc2VuZC4gKi9cbiAgaGVhcnRiZWF0PzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogQSBoZWFydGJlYXQgQUNLIHdhcyByZWNlaXZlZC4gKi9cbiAgaGVhcnRiZWF0QWNrPzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogU2hhcmQgaGFzIHJlY2VpdmVkIGEgSGVsbG8gcGF5bG9hZC4gKi9cbiAgaGVsbG8/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgU2hhcmRzIHNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICovXG4gIGludmFsaWRTZXNzaW9uPzogKHNoYXJkOiBTaGFyZCwgcmVzdW1hYmxlOiBib29sZWFuKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgc2hhcmQgaGFzIHN0YXJ0ZWQgYSByZXN1bWUgYWN0aW9uLiAqL1xuICByZXN1bWluZz86IChzaGFyZDogU2hhcmQpID0+IHVua25vd25cbiAgLyoqIFRoZSBzaGFyZCBoYXMgc3VjY2Vzc2Z1bGx5IHJlc3VtZWQgYW4gb2xkIHNlc3Npb24uICovXG4gIHJlc3VtZWQ/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBEaXNjb3JkIGhhcyByZXF1ZXN0ZWQgdGhlIFNoYXJkIHRvIHJlY29ubmVjdC4gKi9cbiAgcmVxdWVzdGVkUmVjb25uZWN0PzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogVGhlIHNoYXJkIHN0YXJ0ZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkJ3MgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGluZz86IChzaGFyZDogU2hhcmQpID0+IHVua25vd25cbiAgLyoqIFRoZSBzaGFyZCBpcyBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGVkPzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogVGhlIHNoYXJkIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBmcm9tIERpc2NvcmQncyBnYXRld2F5LiAqL1xuICBkaXNjb25uZWN0ZWQ/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgc2hhcmQgaGFzIHN0YXJ0ZWQgdG8gaWRlbnRpZnkgaXRzZWxmIHRvIERpc2NvcmQuICovXG4gIGlkZW50aWZ5aW5nPzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogVGhlIHNoYXJkIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpZGVudGlmaWVkIGl0c2VsZiB3aXRoIERpc2NvcmQuICovXG4gIGlkZW50aWZpZWQ/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgc2hhcmQgaGFzIHJlY2VpdmVkIGEgbWVzc2FnZSBmcm9tIERpc2NvcmQuICovXG4gIG1lc3NhZ2U/OiAoc2hhcmQ6IFNoYXJkLCBwYXlsb2FkOiBDYW1lbGl6ZTxEaXNjb3JkR2F0ZXdheVBheWxvYWQ+KSA9PiB1bmtub3duXG59XG5cbmV4cG9ydCBlbnVtIFNoYXJkU29ja2V0Q2xvc2VDb2RlcyB7XG4gIC8qKiBBIHJlZ3VsYXIgU2hhcmQgc2h1dGRvd24uICovXG4gIFNodXRkb3duID0gMzAwMCxcbiAgLyoqIEEgcmVzdW1lIGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlcmVmb3JlIHRoZSBvbGQgY29ubmVjdGlvbiBuZWVkcyB0byBiZSBjbG9zZWQuICovXG4gIFJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uID0gMzAyNCxcbiAgLyoqIERpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS5cbiAgICogQ2xvc2luZyB0aGUgc2hhcmQgYW5kIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24uXG4gICAqL1xuICBab21iaWVkQ29ubmVjdGlvbiA9IDMwMTAsXG4gIC8qKiBEaXNjb3JkZW5vJ3MgZ2F0ZXdheSB0ZXN0cyBoYWUgYmVlbiBmaW5pc2hlZCwgdGhlcmVmb3JlIHRoZSBTaGFyZCBjYW4gYmUgdHVybmVkIG9mZi4gKi9cbiAgVGVzdGluZ0ZpbmlzaGVkID0gMzA2NCxcbiAgLyoqIFNwZWNpYWwgY2xvc2UgY29kZSByZXNlcnZlZCBmb3IgRGlzY29yZGVubydzIHplcm8tZG93bnRpbWUgcmVzaGFyZGluZyBzeXN0ZW0uICovXG4gIFJlc2hhcmRlZCA9IDMwNjUsXG4gIC8qKiBTaGFyZCBpcyByZS1pZGVudGlmeWluZyB0aGVyZWZvcmUgdGhlIG9sZCBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIGNsb3NlZC4gKi9cbiAgUmVJZGVudGlmeWluZyA9IDMwNjYsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRTb2NrZXRSZXF1ZXN0IHtcbiAgLyoqIFRoZSBPUC1Db2RlIGZvciB0aGUgcGF5bG9hZCB0byBzZW5kLiAqL1xuICBvcDogR2F0ZXdheU9wY29kZXNcbiAgLyoqIFBheWxvYWQgZGF0YS4gKi9cbiAgZDogdW5rbm93blxufVxuXG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXktZXZlbnRzI3VwZGF0ZS1wcmVzZW5jZSAqL1xuZXhwb3J0IGludGVyZmFjZSBCb3RTdGF0dXNVcGRhdGUge1xuICAvLyAvKiogVW5peCB0aW1lIChpbiBtaWxsaXNlY29uZHMpIG9mIHdoZW4gdGhlIGNsaWVudCB3ZW50IGlkbGUsIG9yIG51bGwgaWYgdGhlIGNsaWVudCBpcyBub3QgaWRsZSAqL1xuICBzaW5jZTogbnVtYmVyIHwgbnVsbFxuICAvKiogVGhlIHVzZXIncyBhY3Rpdml0aWVzICovXG4gIGFjdGl2aXRpZXM6IEJvdEFjdGl2aXR5W11cbiAgLyoqIFRoZSB1c2VyJ3MgbmV3IHN0YXR1cyAqL1xuICBzdGF0dXM6IGtleW9mIHR5cGVvZiBQcmVzZW5jZVN0YXR1c1xufVxuXG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXktZXZlbnRzI2FjdGl2aXR5LW9iamVjdCAqL1xuZXhwb3J0IGludGVyZmFjZSBCb3RBY3Rpdml0eSB7XG4gIG5hbWU6IHN0cmluZ1xuICB0eXBlOiBBY3Rpdml0eVR5cGVzXG4gIHVybD86IHN0cmluZ1xufVxuXG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjdXBkYXRlLXZvaWNlLXN0YXRlICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZvaWNlU3RhdGUge1xuICAvKiogaWQgb2YgdGhlIGd1aWxkICovXG4gIGd1aWxkSWQ6IHN0cmluZ1xuICAvKiogaWQgb2YgdGhlIHZvaWNlIGNoYW5uZWwgY2xpZW50IHdhbnRzIHRvIGpvaW4gKG51bGwgaWYgZGlzY29ubmVjdGluZykgKi9cbiAgY2hhbm5lbElkOiBzdHJpbmcgfCBudWxsXG4gIC8qKiBJcyB0aGUgY2xpZW50IG11dGVkICovXG4gIHNlbGZNdXRlOiBib29sZWFuXG4gIC8qKiBJcyB0aGUgY2xpZW50IGRlYWZlbmVkICovXG4gIHNlbGZEZWFmOiBib29sZWFuXG59XG5cbi8qKiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheS1ldmVudHMjdXBkYXRlLXByZXNlbmNlICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c1VwZGF0ZSB7XG4gIC8vIC8qKiBVbml4IHRpbWUgKGluIG1pbGxpc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2xpZW50IHdlbnQgaWRsZSwgb3IgbnVsbCBpZiB0aGUgY2xpZW50IGlzIG5vdCBpZGxlICovXG4gIC8vIHNpbmNlOiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIHVzZXIncyBhY3Rpdml0aWVzICovXG4gIGFjdGl2aXRpZXM/OiBDYW1lbGl6ZTxBcnJheTxPbWl0PERpc2NvcmRBY3Rpdml0eSwgJ2NyZWF0ZWRfYXQnPj4+XG4gIC8qKiBUaGUgdXNlcidzIG5ldyBzdGF0dXMgKi9cbiAgc3RhdHVzOiBrZXlvZiB0eXBlb2YgUHJlc2VuY2VTdGF0dXNcbiAgLy8gLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBjbGllbnQgaXMgYWZrICovXG4gIC8vIGFmazogYm9vbGVhbjtcbn1cbiJdLCJuYW1lcyI6WyJTaGFyZFN0YXRlIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBR1lBO0lBQ1YsK0VBQStFO0lBRS9FLDJIQUEySDtJQUUzSCx1RUFBdUU7SUFFdkUsK0hBQStIO0lBRS9ILDBFQUEwRTtJQUUxRSwwREFBMEQ7SUFFMUQsa0hBQWtIO0dBYnhHQSxlQUFBQTs7VUFrSEFDO0lBQ1YsOEJBQThCO0lBRTlCLHFGQUFxRjtJQUVyRjs7R0FFQztJQUVELHlGQUF5RjtJQUV6RixrRkFBa0Y7SUFFbEYsNkVBQTZFO0dBYm5FQSwwQkFBQUEifQ==
|