@cloudbase/realtime 2.0.2-alpha.0 → 2.5.0-beta.0
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/.eslintrc.js +46 -0
- package/dist/cjs/common.js +1 -1
- package/dist/cjs/error.js +8 -12
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/listener.js +2 -4
- package/dist/cjs/message.js +1 -1
- package/dist/cjs/snapshot.js +7 -7
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/virtual-websocket-client.d.ts +8 -8
- package/dist/cjs/virtual-websocket-client.js +281 -272
- package/dist/cjs/websocket-client.d.ts +21 -21
- package/dist/cjs/websocket-client.js +441 -444
- package/dist/cjs/ws-event.d.ts +2 -2
- package/dist/cjs/ws-event.js +47 -47
- package/dist/esm/common.js +1 -1
- package/dist/esm/error.js +8 -12
- package/dist/esm/index.js +3 -3
- package/dist/esm/listener.js +2 -4
- package/dist/esm/message.js +1 -1
- package/dist/esm/snapshot.js +7 -7
- package/dist/esm/utils.js +1 -1
- package/dist/esm/virtual-websocket-client.d.ts +8 -8
- package/dist/esm/virtual-websocket-client.js +282 -273
- package/dist/esm/websocket-client.d.ts +21 -21
- package/dist/esm/websocket-client.js +442 -445
- package/dist/esm/ws-event.d.ts +2 -2
- package/dist/esm/ws-event.js +46 -46
- package/package.json +9 -13
- package/src/common.ts +11 -11
- package/src/error.ts +13 -19
- package/src/index.ts +26 -26
- package/src/listener.ts +2 -4
- package/src/message.ts +2 -4
- package/src/snapshot.ts +6 -6
- package/src/utils.ts +1 -1
- package/src/virtual-websocket-client.ts +187 -387
- package/src/websocket-client.ts +385 -600
- package/src/ws-event.ts +24 -24
- package/.eslintrc +0 -30
|
@@ -47,20 +47,20 @@ import cloneDeep from 'lodash.clonedeep';
|
|
|
47
47
|
import { genRequestId } from './message';
|
|
48
48
|
import { RealtimeListener } from './listener';
|
|
49
49
|
import { Snapshot } from './snapshot';
|
|
50
|
-
import { ERR_CODE, CloudSDKError, isTimeoutError, CancelledError, isCancelledError, isRealtimeErrorMessageError } from './error';
|
|
50
|
+
import { ERR_CODE, CloudSDKError, isTimeoutError, CancelledError, isCancelledError, isRealtimeErrorMessageError, } from './error';
|
|
51
51
|
import { sleep } from './utils';
|
|
52
|
-
var
|
|
53
|
-
(function (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
})(
|
|
52
|
+
var WatchStatus;
|
|
53
|
+
(function (WatchStatus) {
|
|
54
|
+
WatchStatus["LOGGINGIN"] = "LOGGINGIN";
|
|
55
|
+
WatchStatus["INITING"] = "INITING";
|
|
56
|
+
WatchStatus["REBUILDING"] = "REBUILDING";
|
|
57
|
+
WatchStatus["ACTIVE"] = "ACTIVE";
|
|
58
|
+
WatchStatus["ERRORED"] = "ERRORED";
|
|
59
|
+
WatchStatus["CLOSING"] = "CLOSING";
|
|
60
|
+
WatchStatus["CLOSED"] = "CLOSED";
|
|
61
|
+
WatchStatus["PAUSED"] = "PAUSED";
|
|
62
|
+
WatchStatus["RESUMING"] = "RESUMING";
|
|
63
|
+
})(WatchStatus || (WatchStatus = {}));
|
|
64
64
|
var DEFAULT_WAIT_TIME_ON_UNKNOWN_ERROR = 100;
|
|
65
65
|
var DEFAULT_MAX_AUTO_RETRY_ON_ERROR = 2;
|
|
66
66
|
var DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR = 2;
|
|
@@ -70,13 +70,13 @@ var DEFAULT_REBUILD_WATCH_TIMEOUT = 10 * 1000;
|
|
|
70
70
|
var VirtualWebSocketClient = (function () {
|
|
71
71
|
function VirtualWebSocketClient(options) {
|
|
72
72
|
var _this = this;
|
|
73
|
-
this.watchStatus =
|
|
74
|
-
this.
|
|
73
|
+
this.watchStatus = WatchStatus.INITING;
|
|
74
|
+
this.wsLogin = function (envId, refresh) { return __awaiter(_this, void 0, void 0, function () {
|
|
75
75
|
var loginResult;
|
|
76
76
|
return __generator(this, function (_a) {
|
|
77
77
|
switch (_a.label) {
|
|
78
78
|
case 0:
|
|
79
|
-
this.watchStatus =
|
|
79
|
+
this.watchStatus = WatchStatus.LOGGINGIN;
|
|
80
80
|
return [4, this.login(envId, refresh)];
|
|
81
81
|
case 1:
|
|
82
82
|
loginResult = _a.sent();
|
|
@@ -93,99 +93,101 @@ var VirtualWebSocketClient = (function () {
|
|
|
93
93
|
return __generator(this, function (_a) {
|
|
94
94
|
switch (_a.label) {
|
|
95
95
|
case 0:
|
|
96
|
-
if (this.
|
|
97
|
-
return [2, this.
|
|
96
|
+
if (this.initWatchPromise !== null && this.initWatchPromise !== undefined) {
|
|
97
|
+
return [2, this.initWatchPromise];
|
|
98
98
|
}
|
|
99
|
-
this.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return [4, this._login(this.envId, forceRefreshLogin)];
|
|
110
|
-
case 1:
|
|
111
|
-
envId = (_b.sent()).envId;
|
|
112
|
-
if (this.watchStatus === WATCH_STATUS.PAUSED) {
|
|
113
|
-
console.log('[realtime] initWatch cancelled on pause');
|
|
114
|
-
return [2, resolve()];
|
|
115
|
-
}
|
|
116
|
-
this.watchStatus = WATCH_STATUS.INITING;
|
|
117
|
-
initWatchMsg = {
|
|
118
|
-
watchId: this.watchId,
|
|
119
|
-
requestId: genRequestId(),
|
|
120
|
-
msgType: 'INIT_WATCH',
|
|
121
|
-
msgData: {
|
|
122
|
-
envId: envId,
|
|
123
|
-
collName: this.collectionName,
|
|
124
|
-
query: this.query,
|
|
125
|
-
limit: this.limit,
|
|
126
|
-
orderBy: this.orderBy
|
|
99
|
+
this.initWatchPromise = new Promise(function (resolve, reject) {
|
|
100
|
+
void (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
101
|
+
var envId, initWatchMsg, initEventMsg, _a, events, currEvent, _i, events_1, e, snapshot, e_1;
|
|
102
|
+
return __generator(this, function (_b) {
|
|
103
|
+
switch (_b.label) {
|
|
104
|
+
case 0:
|
|
105
|
+
_b.trys.push([0, 3, , 4]);
|
|
106
|
+
if (this.watchStatus === WatchStatus.PAUSED) {
|
|
107
|
+
console.log('[realtime] initWatch cancelled on pause');
|
|
108
|
+
return [2, resolve()];
|
|
127
109
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
})];
|
|
135
|
-
case 2:
|
|
136
|
-
initEventMsg = _b.sent();
|
|
137
|
-
_a = initEventMsg.msgData, events = _a.events, currEvent = _a.currEvent;
|
|
138
|
-
this.sessionInfo = {
|
|
139
|
-
queryID: initEventMsg.msgData.queryID,
|
|
140
|
-
currentEventId: currEvent - 1,
|
|
141
|
-
currentDocs: []
|
|
142
|
-
};
|
|
143
|
-
if (events.length > 0) {
|
|
144
|
-
for (_i = 0, events_1 = events; _i < events_1.length; _i++) {
|
|
145
|
-
e = events_1[_i];
|
|
146
|
-
e.ID = currEvent;
|
|
110
|
+
return [4, this.wsLogin(this.envId, forceRefreshLogin)];
|
|
111
|
+
case 1:
|
|
112
|
+
envId = (_b.sent()).envId;
|
|
113
|
+
if (this.watchStatus === WatchStatus.PAUSED) {
|
|
114
|
+
console.log('[realtime] initWatch cancelled on pause');
|
|
115
|
+
return [2, resolve()];
|
|
147
116
|
}
|
|
148
|
-
this.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
117
|
+
this.watchStatus = WatchStatus.INITING;
|
|
118
|
+
initWatchMsg = {
|
|
119
|
+
watchId: this.watchId,
|
|
120
|
+
requestId: genRequestId(),
|
|
121
|
+
msgType: 'INIT_WATCH',
|
|
122
|
+
msgData: {
|
|
123
|
+
envId: envId,
|
|
124
|
+
collName: this.collectionName,
|
|
125
|
+
query: this.query,
|
|
126
|
+
limit: this.limit,
|
|
127
|
+
orderBy: this.orderBy,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
return [4, this.send({
|
|
131
|
+
msg: initWatchMsg,
|
|
132
|
+
waitResponse: true,
|
|
133
|
+
skipOnMessage: true,
|
|
134
|
+
timeout: DEFAULT_INIT_WATCH_TIMEOUT,
|
|
135
|
+
})];
|
|
136
|
+
case 2:
|
|
137
|
+
initEventMsg = _b.sent();
|
|
138
|
+
_a = initEventMsg.msgData, events = _a.events, currEvent = _a.currEvent;
|
|
139
|
+
this.sessionInfo = {
|
|
140
|
+
queryID: initEventMsg.msgData.queryID,
|
|
141
|
+
currentEventId: currEvent - 1,
|
|
142
|
+
currentDocs: [],
|
|
143
|
+
};
|
|
144
|
+
if (events.length > 0) {
|
|
145
|
+
for (_i = 0, events_1 = events; _i < events_1.length; _i++) {
|
|
146
|
+
e = events_1[_i];
|
|
147
|
+
e.ID = currEvent;
|
|
148
|
+
}
|
|
149
|
+
this.handleServerEvents(initEventMsg);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.sessionInfo.currentEventId = currEvent;
|
|
153
|
+
snapshot = new Snapshot({
|
|
154
|
+
id: currEvent,
|
|
155
|
+
docChanges: [],
|
|
156
|
+
docs: [],
|
|
157
|
+
type: 'init',
|
|
158
|
+
});
|
|
159
|
+
this.listener.onChange(snapshot);
|
|
160
|
+
this.scheduleSendACK();
|
|
161
|
+
}
|
|
162
|
+
this.onWatchStart(this, this.sessionInfo.queryID);
|
|
163
|
+
this.watchStatus = WatchStatus.ACTIVE;
|
|
164
|
+
this.availableRetries.INIT_WATCH = DEFAULT_MAX_AUTO_RETRY_ON_ERROR;
|
|
165
|
+
resolve();
|
|
166
|
+
return [3, 4];
|
|
167
|
+
case 3:
|
|
168
|
+
e_1 = _b.sent();
|
|
169
|
+
this.handleWatchEstablishmentError(e_1, {
|
|
170
|
+
operationName: 'INIT_WATCH',
|
|
171
|
+
resolve: resolve,
|
|
172
|
+
reject: reject,
|
|
157
173
|
});
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
resolve();
|
|
165
|
-
return [3, 4];
|
|
166
|
-
case 3:
|
|
167
|
-
e_1 = _b.sent();
|
|
168
|
-
this.handleWatchEstablishmentError(e_1, {
|
|
169
|
-
operationName: 'INIT_WATCH',
|
|
170
|
-
resolve: resolve,
|
|
171
|
-
reject: reject
|
|
172
|
-
});
|
|
173
|
-
return [3, 4];
|
|
174
|
-
case 4: return [2];
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}); });
|
|
174
|
+
return [3, 4];
|
|
175
|
+
case 4: return [2];
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}); })();
|
|
179
|
+
});
|
|
178
180
|
success = false;
|
|
179
181
|
_a.label = 1;
|
|
180
182
|
case 1:
|
|
181
183
|
_a.trys.push([1, , 3, 4]);
|
|
182
|
-
return [4, this.
|
|
184
|
+
return [4, this.initWatchPromise];
|
|
183
185
|
case 2:
|
|
184
186
|
_a.sent();
|
|
185
187
|
success = true;
|
|
186
188
|
return [3, 4];
|
|
187
189
|
case 3:
|
|
188
|
-
this.
|
|
190
|
+
this.initWatchPromise = undefined;
|
|
189
191
|
return [7];
|
|
190
192
|
case 4:
|
|
191
193
|
console.log("[realtime] initWatch " + (success ? 'success' : 'fail'));
|
|
@@ -199,77 +201,79 @@ var VirtualWebSocketClient = (function () {
|
|
|
199
201
|
return __generator(this, function (_a) {
|
|
200
202
|
switch (_a.label) {
|
|
201
203
|
case 0:
|
|
202
|
-
if (this.
|
|
203
|
-
return [2, this.
|
|
204
|
+
if (this.rebuildWatchPromise !== null && this.rebuildWatchPromise !== undefined) {
|
|
205
|
+
return [2, this.rebuildWatchPromise];
|
|
204
206
|
}
|
|
205
|
-
this.
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
return [4, this._login(this.envId, forceRefreshLogin)];
|
|
216
|
-
case 1:
|
|
217
|
-
envId = (_a.sent()).envId;
|
|
218
|
-
if (!this.sessionInfo) {
|
|
219
|
-
throw new Error('can not rebuildWatch without a successful initWatch (lack of sessionInfo)');
|
|
220
|
-
}
|
|
221
|
-
if (this.watchStatus === WATCH_STATUS.PAUSED) {
|
|
222
|
-
console.log('[realtime] rebuildWatch cancelled on pause');
|
|
223
|
-
return [2, resolve()];
|
|
224
|
-
}
|
|
225
|
-
this.watchStatus = WATCH_STATUS.REBUILDING;
|
|
226
|
-
rebuildWatchMsg = {
|
|
227
|
-
watchId: this.watchId,
|
|
228
|
-
requestId: genRequestId(),
|
|
229
|
-
msgType: 'REBUILD_WATCH',
|
|
230
|
-
msgData: {
|
|
231
|
-
envId: envId,
|
|
232
|
-
collName: this.collectionName,
|
|
233
|
-
queryID: this.sessionInfo.queryID,
|
|
234
|
-
eventID: this.sessionInfo.currentEventId
|
|
207
|
+
this.rebuildWatchPromise = new Promise(function (resolve, reject) {
|
|
208
|
+
void (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
209
|
+
var envId, rebuildWatchMsg, nextEventMsg, e_2;
|
|
210
|
+
return __generator(this, function (_a) {
|
|
211
|
+
switch (_a.label) {
|
|
212
|
+
case 0:
|
|
213
|
+
_a.trys.push([0, 3, , 4]);
|
|
214
|
+
if (this.watchStatus === WatchStatus.PAUSED) {
|
|
215
|
+
console.log('[realtime] rebuildWatch cancelled on pause');
|
|
216
|
+
return [2, resolve()];
|
|
235
217
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
218
|
+
return [4, this.wsLogin(this.envId, forceRefreshLogin)];
|
|
219
|
+
case 1:
|
|
220
|
+
envId = (_a.sent()).envId;
|
|
221
|
+
if (!this.sessionInfo) {
|
|
222
|
+
throw new Error('can not rebuildWatch without a successful initWatch (lack of sessionInfo)');
|
|
223
|
+
}
|
|
224
|
+
if (this.watchStatus === WatchStatus.PAUSED) {
|
|
225
|
+
console.log('[realtime] rebuildWatch cancelled on pause');
|
|
226
|
+
return [2, resolve()];
|
|
227
|
+
}
|
|
228
|
+
this.watchStatus = WatchStatus.REBUILDING;
|
|
229
|
+
rebuildWatchMsg = {
|
|
230
|
+
watchId: this.watchId,
|
|
231
|
+
requestId: genRequestId(),
|
|
232
|
+
msgType: 'REBUILD_WATCH',
|
|
233
|
+
msgData: {
|
|
234
|
+
envId: envId,
|
|
235
|
+
collName: this.collectionName,
|
|
236
|
+
queryID: this.sessionInfo.queryID,
|
|
237
|
+
eventID: this.sessionInfo.currentEventId,
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
return [4, this.send({
|
|
241
|
+
msg: rebuildWatchMsg,
|
|
242
|
+
waitResponse: true,
|
|
243
|
+
skipOnMessage: false,
|
|
244
|
+
timeout: DEFAULT_REBUILD_WATCH_TIMEOUT,
|
|
245
|
+
})];
|
|
246
|
+
case 2:
|
|
247
|
+
nextEventMsg = _a.sent();
|
|
248
|
+
this.handleServerEvents(nextEventMsg);
|
|
249
|
+
this.watchStatus = WatchStatus.ACTIVE;
|
|
250
|
+
this.availableRetries.REBUILD_WATCH = DEFAULT_MAX_AUTO_RETRY_ON_ERROR;
|
|
251
|
+
resolve();
|
|
252
|
+
return [3, 4];
|
|
253
|
+
case 3:
|
|
254
|
+
e_2 = _a.sent();
|
|
255
|
+
this.handleWatchEstablishmentError(e_2, {
|
|
256
|
+
operationName: 'REBUILD_WATCH',
|
|
257
|
+
resolve: resolve,
|
|
258
|
+
reject: reject,
|
|
259
|
+
});
|
|
260
|
+
return [3, 4];
|
|
261
|
+
case 4: return [2];
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}); })();
|
|
265
|
+
});
|
|
262
266
|
success = false;
|
|
263
267
|
_a.label = 1;
|
|
264
268
|
case 1:
|
|
265
269
|
_a.trys.push([1, , 3, 4]);
|
|
266
|
-
return [4, this.
|
|
270
|
+
return [4, this.rebuildWatchPromise];
|
|
267
271
|
case 2:
|
|
268
272
|
_a.sent();
|
|
269
273
|
success = true;
|
|
270
274
|
return [3, 4];
|
|
271
275
|
case 3:
|
|
272
|
-
this.
|
|
276
|
+
this.rebuildWatchPromise = undefined;
|
|
273
277
|
return [7];
|
|
274
278
|
case 4:
|
|
275
279
|
console.log("[realtime] rebuildWatch " + (success ? 'success' : 'fail'));
|
|
@@ -287,18 +291,18 @@ var VirtualWebSocketClient = (function () {
|
|
|
287
291
|
errCode: isInitWatch
|
|
288
292
|
? ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_INIT_WATCH_FAIL
|
|
289
293
|
: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_REBUILD_WATCH_FAIL,
|
|
290
|
-
errMsg: e
|
|
294
|
+
errMsg: e,
|
|
291
295
|
}));
|
|
292
296
|
options.reject(e);
|
|
293
297
|
};
|
|
294
298
|
retry = function (refreshLogin) {
|
|
295
299
|
if (_this.useRetryTicket(options.operationName)) {
|
|
296
300
|
if (isInitWatch) {
|
|
297
|
-
_this.
|
|
301
|
+
_this.initWatchPromise = undefined;
|
|
298
302
|
options.resolve(_this.initWatch(refreshLogin));
|
|
299
303
|
}
|
|
300
304
|
else {
|
|
301
|
-
_this.
|
|
305
|
+
_this.rebuildWatchPromise = undefined;
|
|
302
306
|
options.resolve(_this.rebuildWatch(refreshLogin));
|
|
303
307
|
}
|
|
304
308
|
}
|
|
@@ -311,55 +315,57 @@ var VirtualWebSocketClient = (function () {
|
|
|
311
315
|
onTimeoutError: function () { return retry(false); },
|
|
312
316
|
onNotRetryableError: abortWatch,
|
|
313
317
|
onCancelledError: options.reject,
|
|
314
|
-
onUnknownError: function () {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
return
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
318
|
+
onUnknownError: function () {
|
|
319
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
320
|
+
var onWSDisconnected, e_3;
|
|
321
|
+
var _this = this;
|
|
322
|
+
return __generator(this, function (_a) {
|
|
323
|
+
switch (_a.label) {
|
|
324
|
+
case 0:
|
|
325
|
+
_a.trys.push([0, 8, , 9]);
|
|
326
|
+
onWSDisconnected = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
327
|
+
return __generator(this, function (_a) {
|
|
328
|
+
switch (_a.label) {
|
|
329
|
+
case 0:
|
|
330
|
+
this.pause();
|
|
331
|
+
return [4, this.onceWSConnected()];
|
|
332
|
+
case 1:
|
|
333
|
+
_a.sent();
|
|
334
|
+
retry(true);
|
|
335
|
+
return [2];
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
}); };
|
|
339
|
+
if (!!this.isWSConnected()) return [3, 2];
|
|
340
|
+
return [4, onWSDisconnected()];
|
|
341
|
+
case 1:
|
|
342
|
+
_a.sent();
|
|
343
|
+
return [3, 7];
|
|
344
|
+
case 2: return [4, sleep(DEFAULT_WAIT_TIME_ON_UNKNOWN_ERROR)];
|
|
345
|
+
case 3:
|
|
346
|
+
_a.sent();
|
|
347
|
+
if (!(this.watchStatus === WatchStatus.PAUSED)) return [3, 4];
|
|
348
|
+
options.reject(new CancelledError(options.operationName + " cancelled due to pause after unknownError"));
|
|
349
|
+
return [3, 7];
|
|
350
|
+
case 4:
|
|
351
|
+
if (!!this.isWSConnected()) return [3, 6];
|
|
352
|
+
return [4, onWSDisconnected()];
|
|
353
|
+
case 5:
|
|
354
|
+
_a.sent();
|
|
355
|
+
return [3, 7];
|
|
356
|
+
case 6:
|
|
357
|
+
retry(false);
|
|
358
|
+
_a.label = 7;
|
|
359
|
+
case 7: return [3, 9];
|
|
360
|
+
case 8:
|
|
361
|
+
e_3 = _a.sent();
|
|
362
|
+
retry(true);
|
|
363
|
+
return [3, 9];
|
|
364
|
+
case 9: return [2];
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}); })();
|
|
368
|
+
},
|
|
363
369
|
});
|
|
364
370
|
return [2];
|
|
365
371
|
});
|
|
@@ -370,34 +376,34 @@ var VirtualWebSocketClient = (function () {
|
|
|
370
376
|
switch (_a.label) {
|
|
371
377
|
case 0:
|
|
372
378
|
queryId = this.sessionInfo ? this.sessionInfo.queryID : '';
|
|
373
|
-
if (this.watchStatus !==
|
|
374
|
-
this.watchStatus =
|
|
379
|
+
if (this.watchStatus !== WatchStatus.ACTIVE) {
|
|
380
|
+
this.watchStatus = WatchStatus.CLOSED;
|
|
375
381
|
this.onWatchClose(this, queryId);
|
|
376
382
|
return [2];
|
|
377
383
|
}
|
|
378
384
|
_a.label = 1;
|
|
379
385
|
case 1:
|
|
380
386
|
_a.trys.push([1, 3, 4, 5]);
|
|
381
|
-
this.watchStatus =
|
|
387
|
+
this.watchStatus = WatchStatus.CLOSING;
|
|
382
388
|
closeWatchMsg = {
|
|
383
389
|
watchId: this.watchId,
|
|
384
390
|
requestId: genRequestId(),
|
|
385
391
|
msgType: 'CLOSE_WATCH',
|
|
386
|
-
msgData: null
|
|
392
|
+
msgData: null,
|
|
387
393
|
};
|
|
388
394
|
return [4, this.send({
|
|
389
|
-
msg: closeWatchMsg
|
|
395
|
+
msg: closeWatchMsg,
|
|
390
396
|
})];
|
|
391
397
|
case 2:
|
|
392
398
|
_a.sent();
|
|
393
399
|
this.sessionInfo = undefined;
|
|
394
|
-
this.watchStatus =
|
|
400
|
+
this.watchStatus = WatchStatus.CLOSED;
|
|
395
401
|
return [3, 5];
|
|
396
402
|
case 3:
|
|
397
403
|
e_4 = _a.sent();
|
|
398
404
|
this.closeWithError(new CloudSDKError({
|
|
399
405
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CLOSE_WATCH_FAIL,
|
|
400
|
-
errMsg: e_4
|
|
406
|
+
errMsg: e_4,
|
|
401
407
|
}));
|
|
402
408
|
return [3, 5];
|
|
403
409
|
case 4:
|
|
@@ -409,8 +415,8 @@ var VirtualWebSocketClient = (function () {
|
|
|
409
415
|
}); };
|
|
410
416
|
this.scheduleSendACK = function () {
|
|
411
417
|
_this.clearACKSchedule();
|
|
412
|
-
_this.
|
|
413
|
-
if (_this.
|
|
418
|
+
_this.ackTimeoutId = setTimeout(function () {
|
|
419
|
+
if (_this.waitExpectedTimeoutId) {
|
|
414
420
|
_this.scheduleSendACK();
|
|
415
421
|
}
|
|
416
422
|
else {
|
|
@@ -419,8 +425,8 @@ var VirtualWebSocketClient = (function () {
|
|
|
419
425
|
}, DEFAULT_SEND_ACK_DEBOUNCE_TIMEOUT);
|
|
420
426
|
};
|
|
421
427
|
this.clearACKSchedule = function () {
|
|
422
|
-
if (_this.
|
|
423
|
-
clearTimeout(_this.
|
|
428
|
+
if (_this.ackTimeoutId) {
|
|
429
|
+
clearTimeout(_this.ackTimeoutId);
|
|
424
430
|
}
|
|
425
431
|
};
|
|
426
432
|
this.sendACK = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -429,7 +435,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
429
435
|
switch (_a.label) {
|
|
430
436
|
case 0:
|
|
431
437
|
_a.trys.push([0, 2, , 3]);
|
|
432
|
-
if (this.watchStatus !==
|
|
438
|
+
if (this.watchStatus !== WatchStatus.ACTIVE) {
|
|
433
439
|
this.scheduleSendACK();
|
|
434
440
|
return [2];
|
|
435
441
|
}
|
|
@@ -443,11 +449,11 @@ var VirtualWebSocketClient = (function () {
|
|
|
443
449
|
msgType: 'CHECK_LAST',
|
|
444
450
|
msgData: {
|
|
445
451
|
queryID: this.sessionInfo.queryID,
|
|
446
|
-
eventID: this.sessionInfo.currentEventId
|
|
447
|
-
}
|
|
452
|
+
eventID: this.sessionInfo.currentEventId,
|
|
453
|
+
},
|
|
448
454
|
};
|
|
449
455
|
return [4, this.send({
|
|
450
|
-
msg: ackMsg
|
|
456
|
+
msg: ackMsg,
|
|
451
457
|
})];
|
|
452
458
|
case 1:
|
|
453
459
|
_a.sent();
|
|
@@ -471,7 +477,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
471
477
|
case 'COLLECTION_PERMISSION_DENIED': {
|
|
472
478
|
this.closeWithError(new CloudSDKError({
|
|
473
479
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
|
|
474
|
-
errMsg: msg.msgData.code
|
|
480
|
+
errMsg: msg.msgData.code,
|
|
475
481
|
}));
|
|
476
482
|
return [2];
|
|
477
483
|
}
|
|
@@ -480,15 +486,15 @@ var VirtualWebSocketClient = (function () {
|
|
|
480
486
|
}
|
|
481
487
|
}
|
|
482
488
|
}
|
|
483
|
-
if (this.
|
|
484
|
-
this.
|
|
485
|
-
this.
|
|
489
|
+
if (this.availableRetries.CHECK_LAST
|
|
490
|
+
&& this.availableRetries.CHECK_LAST > 0) {
|
|
491
|
+
this.availableRetries.CHECK_LAST -= 1;
|
|
486
492
|
this.scheduleSendACK();
|
|
487
493
|
}
|
|
488
494
|
else {
|
|
489
495
|
this.closeWithError(new CloudSDKError({
|
|
490
496
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
|
|
491
|
-
errMsg: e_5
|
|
497
|
+
errMsg: e_5,
|
|
492
498
|
}));
|
|
493
499
|
}
|
|
494
500
|
return [3, 3];
|
|
@@ -544,40 +550,42 @@ var VirtualWebSocketClient = (function () {
|
|
|
544
550
|
this.onWatchStart = options.onWatchStart;
|
|
545
551
|
this.onWatchClose = options.onWatchClose;
|
|
546
552
|
this.debug = options.debug;
|
|
547
|
-
this.
|
|
553
|
+
this.availableRetries = {
|
|
548
554
|
INIT_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
|
|
549
555
|
REBUILD_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
|
|
550
|
-
CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR
|
|
556
|
+
CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR,
|
|
551
557
|
};
|
|
552
558
|
this.listener = new RealtimeListener({
|
|
553
|
-
close:
|
|
559
|
+
close: void (function () {
|
|
560
|
+
_this.closeWatch();
|
|
561
|
+
}),
|
|
554
562
|
onChange: options.onChange,
|
|
555
563
|
onError: options.onError,
|
|
556
564
|
debug: this.debug,
|
|
557
|
-
virtualClient: this
|
|
565
|
+
virtualClient: this,
|
|
558
566
|
});
|
|
559
567
|
this.initWatch();
|
|
560
568
|
}
|
|
561
569
|
VirtualWebSocketClient.prototype.onMessage = function (msg) {
|
|
562
570
|
var _this = this;
|
|
563
571
|
switch (this.watchStatus) {
|
|
564
|
-
case
|
|
572
|
+
case WatchStatus.PAUSED: {
|
|
565
573
|
if (msg.msgType !== 'ERROR') {
|
|
566
574
|
return;
|
|
567
575
|
}
|
|
568
576
|
break;
|
|
569
577
|
}
|
|
570
|
-
case
|
|
571
|
-
case
|
|
572
|
-
case
|
|
578
|
+
case WatchStatus.LOGGINGIN:
|
|
579
|
+
case WatchStatus.INITING:
|
|
580
|
+
case WatchStatus.REBUILDING: {
|
|
573
581
|
console.warn("[realtime listener] internal non-fatal error: unexpected message received while " + this.watchStatus);
|
|
574
582
|
return;
|
|
575
583
|
}
|
|
576
|
-
case
|
|
584
|
+
case WatchStatus.CLOSED: {
|
|
577
585
|
console.warn('[realtime listener] internal non-fatal error: unexpected message received when the watch has closed');
|
|
578
586
|
return;
|
|
579
587
|
}
|
|
580
|
-
case
|
|
588
|
+
case WatchStatus.ERRORED: {
|
|
581
589
|
console.warn('[realtime listener] internal non-fatal error: unexpected message received when the watch has ended with error');
|
|
582
590
|
return;
|
|
583
591
|
}
|
|
@@ -597,7 +605,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
597
605
|
if (this.sessionInfo.currentEventId < msg.msgData.currEvent) {
|
|
598
606
|
this.sessionInfo.expectEventId = msg.msgData.currEvent;
|
|
599
607
|
this.clearWaitExpectedEvent();
|
|
600
|
-
this.
|
|
608
|
+
this.waitExpectedTimeoutId = setTimeout(function () {
|
|
601
609
|
_this.rebuildWatch();
|
|
602
610
|
}, this.getWaitExpectedTimeoutLength());
|
|
603
611
|
console.log("[realtime] waitExpectedTimeoutLength " + this.getWaitExpectedTimeoutLength());
|
|
@@ -607,7 +615,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
607
615
|
case 'ERROR': {
|
|
608
616
|
this.closeWithError(new CloudSDKError({
|
|
609
617
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_SERVER_ERROR_MSG,
|
|
610
|
-
errMsg: msg.msgData.code + " - " + msg.msgData.message
|
|
618
|
+
errMsg: msg.msgData.code + " - " + msg.msgData.message,
|
|
611
619
|
}));
|
|
612
620
|
break;
|
|
613
621
|
}
|
|
@@ -618,14 +626,15 @@ var VirtualWebSocketClient = (function () {
|
|
|
618
626
|
}
|
|
619
627
|
};
|
|
620
628
|
VirtualWebSocketClient.prototype.closeWithError = function (error) {
|
|
621
|
-
|
|
629
|
+
var _a;
|
|
630
|
+
this.watchStatus = WatchStatus.ERRORED;
|
|
622
631
|
this.clearACKSchedule();
|
|
623
632
|
this.listener.onError(error);
|
|
624
|
-
this.onWatchClose(this, (this.sessionInfo
|
|
633
|
+
this.onWatchClose(this, ((_a = this.sessionInfo) === null || _a === void 0 ? void 0 : _a.queryID) || '');
|
|
625
634
|
console.log("[realtime] client closed (" + this.collectionName + " " + this.query + ") (watchId " + this.watchId + ")");
|
|
626
635
|
};
|
|
627
636
|
VirtualWebSocketClient.prototype.pause = function () {
|
|
628
|
-
this.watchStatus =
|
|
637
|
+
this.watchStatus = WatchStatus.PAUSED;
|
|
629
638
|
console.log("[realtime] client paused (" + this.collectionName + " " + this.query + ") (watchId " + this.watchId + ")");
|
|
630
639
|
};
|
|
631
640
|
VirtualWebSocketClient.prototype.resume = function () {
|
|
@@ -634,7 +643,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
634
643
|
return __generator(this, function (_a) {
|
|
635
644
|
switch (_a.label) {
|
|
636
645
|
case 0:
|
|
637
|
-
this.watchStatus =
|
|
646
|
+
this.watchStatus = WatchStatus.RESUMING;
|
|
638
647
|
console.log("[realtime] client resuming with " + (this.sessionInfo ? 'REBUILD_WATCH' : 'INIT_WATCH') + " (" + this.collectionName + " " + this.query + ") (" + this.watchId + ")");
|
|
639
648
|
_a.label = 1;
|
|
640
649
|
case 1:
|
|
@@ -654,10 +663,10 @@ var VirtualWebSocketClient = (function () {
|
|
|
654
663
|
});
|
|
655
664
|
};
|
|
656
665
|
VirtualWebSocketClient.prototype.useRetryTicket = function (operationName) {
|
|
657
|
-
if (this.
|
|
658
|
-
this.
|
|
659
|
-
this.
|
|
660
|
-
console.log("[realtime] " + operationName + " use a retry ticket, now only " + this.
|
|
666
|
+
if (this.availableRetries[operationName]
|
|
667
|
+
&& this.availableRetries[operationName] > 0) {
|
|
668
|
+
this.availableRetries[operationName] -= 1;
|
|
669
|
+
console.log("[realtime] " + operationName + " use a retry ticket, now only " + this.availableRetries[operationName] + " retry left");
|
|
661
670
|
return true;
|
|
662
671
|
}
|
|
663
672
|
return false;
|
|
@@ -670,10 +679,10 @@ var VirtualWebSocketClient = (function () {
|
|
|
670
679
|
case 0:
|
|
671
680
|
_a.trys.push([0, 2, , 3]);
|
|
672
681
|
this.scheduleSendACK();
|
|
673
|
-
return [4, this.
|
|
682
|
+
return [4, this.handleServerEventsInternel(msg)];
|
|
674
683
|
case 1:
|
|
675
684
|
_a.sent();
|
|
676
|
-
this.
|
|
685
|
+
this.postHandleServerEventsValidityCheck(msg);
|
|
677
686
|
return [3, 3];
|
|
678
687
|
case 2:
|
|
679
688
|
e_7 = _a.sent();
|
|
@@ -684,7 +693,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
684
693
|
});
|
|
685
694
|
});
|
|
686
695
|
};
|
|
687
|
-
VirtualWebSocketClient.prototype.
|
|
696
|
+
VirtualWebSocketClient.prototype.handleServerEventsInternel = function (msg) {
|
|
688
697
|
return __awaiter(this, void 0, void 0, function () {
|
|
689
698
|
var requestId, events, msgType, sessionInfo, allChangeEvents, docs, initEncountered, _loop_1, this_1, i, len, state_1;
|
|
690
699
|
return __generator(this, function (_a) {
|
|
@@ -703,14 +712,14 @@ var VirtualWebSocketClient = (function () {
|
|
|
703
712
|
catch (e) {
|
|
704
713
|
this.closeWithError(new CloudSDKError({
|
|
705
714
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECEIVE_INVALID_SERVER_DATA,
|
|
706
|
-
errMsg: e
|
|
715
|
+
errMsg: e,
|
|
707
716
|
}));
|
|
708
717
|
return [2];
|
|
709
718
|
}
|
|
710
719
|
docs = __spreadArrays(sessionInfo.currentDocs);
|
|
711
720
|
initEncountered = false;
|
|
712
721
|
_loop_1 = function (i, len) {
|
|
713
|
-
var change, localDoc,
|
|
722
|
+
var change, localDoc, doc_1, _i, _a, fieldPath, err, err, doc, doc, err, ind, ind, docsSnapshot, docChanges, snapshot;
|
|
714
723
|
return __generator(this, function (_b) {
|
|
715
724
|
switch (_b.label) {
|
|
716
725
|
case 0:
|
|
@@ -733,19 +742,19 @@ var VirtualWebSocketClient = (function () {
|
|
|
733
742
|
case 'dequeue': {
|
|
734
743
|
localDoc = docs.find(function (doc) { return doc._id === change.docId; });
|
|
735
744
|
if (localDoc) {
|
|
736
|
-
|
|
745
|
+
doc_1 = cloneDeep(localDoc);
|
|
737
746
|
if (change.updatedFields) {
|
|
738
|
-
|
|
739
|
-
set(
|
|
740
|
-
}
|
|
747
|
+
Object.keys(change.updatedFields).forEach(function (fieldPath) {
|
|
748
|
+
set(doc_1, fieldPath, change.updatedFields[fieldPath]);
|
|
749
|
+
});
|
|
741
750
|
}
|
|
742
751
|
if (change.removedFields) {
|
|
743
752
|
for (_i = 0, _a = change.removedFields; _i < _a.length; _i++) {
|
|
744
753
|
fieldPath = _a[_i];
|
|
745
|
-
unset(
|
|
754
|
+
unset(doc_1, fieldPath);
|
|
746
755
|
}
|
|
747
756
|
}
|
|
748
|
-
change.doc =
|
|
757
|
+
change.doc = doc_1;
|
|
749
758
|
}
|
|
750
759
|
else {
|
|
751
760
|
console.error('[realtime listener] internal non-fatal server error: unexpected update dataType event where no doc is associated.');
|
|
@@ -755,7 +764,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
755
764
|
case 'enqueue': {
|
|
756
765
|
err = new CloudSDKError({
|
|
757
766
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
|
|
758
|
-
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId " + msg.requestId + ")"
|
|
767
|
+
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId " + msg.requestId + ")",
|
|
759
768
|
});
|
|
760
769
|
this_1.closeWithError(err);
|
|
761
770
|
throw err;
|
|
@@ -771,7 +780,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
771
780
|
if (!change.doc) {
|
|
772
781
|
err = new CloudSDKError({
|
|
773
782
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
|
|
774
|
-
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId " + msg.requestId + ")"
|
|
783
|
+
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId " + msg.requestId + ")",
|
|
775
784
|
});
|
|
776
785
|
this_1.closeWithError(err);
|
|
777
786
|
throw err;
|
|
@@ -804,7 +813,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
804
813
|
case 'enqueue': {
|
|
805
814
|
err = new CloudSDKError({
|
|
806
815
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
|
|
807
|
-
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId " + msg.requestId + ")"
|
|
816
|
+
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId " + msg.requestId + ")",
|
|
808
817
|
});
|
|
809
818
|
this_1.closeWithError(err);
|
|
810
819
|
throw err;
|
|
@@ -853,8 +862,8 @@ var VirtualWebSocketClient = (function () {
|
|
|
853
862
|
break;
|
|
854
863
|
}
|
|
855
864
|
}
|
|
856
|
-
if (i === len - 1
|
|
857
|
-
(allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
|
|
865
|
+
if (i === len - 1
|
|
866
|
+
|| (allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
|
|
858
867
|
docsSnapshot = __spreadArrays(docs);
|
|
859
868
|
docChanges = allChangeEvents
|
|
860
869
|
.slice(0, i + 1)
|
|
@@ -865,7 +874,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
865
874
|
id: change.id,
|
|
866
875
|
docChanges: docChanges,
|
|
867
876
|
docs: docsSnapshot,
|
|
868
|
-
msgType: msgType
|
|
877
|
+
msgType: msgType,
|
|
869
878
|
});
|
|
870
879
|
this_1.listener.onChange(snapshot);
|
|
871
880
|
}
|
|
@@ -899,13 +908,13 @@ var VirtualWebSocketClient = (function () {
|
|
|
899
908
|
});
|
|
900
909
|
});
|
|
901
910
|
};
|
|
902
|
-
VirtualWebSocketClient.prototype.
|
|
911
|
+
VirtualWebSocketClient.prototype.postHandleServerEventsValidityCheck = function (msg) {
|
|
903
912
|
if (!this.sessionInfo) {
|
|
904
913
|
console.error('[realtime listener] internal non-fatal error: sessionInfo lost after server event handling, this should never occur');
|
|
905
914
|
return;
|
|
906
915
|
}
|
|
907
|
-
if (this.sessionInfo.expectEventId
|
|
908
|
-
this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
|
|
916
|
+
if (this.sessionInfo.expectEventId
|
|
917
|
+
&& this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
|
|
909
918
|
this.clearWaitExpectedEvent();
|
|
910
919
|
}
|
|
911
920
|
if (this.sessionInfo.currentEventId < msg.msgData.currEvent) {
|
|
@@ -914,9 +923,9 @@ var VirtualWebSocketClient = (function () {
|
|
|
914
923
|
}
|
|
915
924
|
};
|
|
916
925
|
VirtualWebSocketClient.prototype.clearWaitExpectedEvent = function () {
|
|
917
|
-
if (this.
|
|
918
|
-
clearTimeout(this.
|
|
919
|
-
this.
|
|
926
|
+
if (this.waitExpectedTimeoutId) {
|
|
927
|
+
clearTimeout(this.waitExpectedTimeoutId);
|
|
928
|
+
this.waitExpectedTimeoutId = undefined;
|
|
920
929
|
}
|
|
921
930
|
};
|
|
922
931
|
return VirtualWebSocketClient;
|
|
@@ -928,7 +937,7 @@ function getPublicEvent(event) {
|
|
|
928
937
|
dataType: event.DataType,
|
|
929
938
|
queueType: event.QueueType,
|
|
930
939
|
docId: event.DocID,
|
|
931
|
-
doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined
|
|
940
|
+
doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined,
|
|
932
941
|
};
|
|
933
942
|
if (event.DataType === 'update') {
|
|
934
943
|
if (event.UpdatedFields) {
|
|
@@ -940,4 +949,4 @@ function getPublicEvent(event) {
|
|
|
940
949
|
}
|
|
941
950
|
return e;
|
|
942
951
|
}
|
|
943
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNoQyxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBaUJ4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLGFBQWEsRUFDYixjQUFjLEVBQ2QsY0FBYyxFQUNkLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFHNUIsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQTRDL0IsSUFBSyxZQVVKO0FBVkQsV0FBSyxZQUFZO0lBQ2YsdUNBQXVCLENBQUE7SUFDdkIsbUNBQW1CLENBQUE7SUFDbkIseUNBQXlCLENBQUE7SUFDekIsaUNBQWlCLENBQUE7SUFDakIsbUNBQW1CLENBQUE7SUFDbkIsbUNBQW1CLENBQUE7SUFDbkIsaUNBQWlCLENBQUE7SUFDakIsaUNBQWlCLENBQUE7SUFDakIscUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZJLFlBQVksS0FBWixZQUFZLFFBVWhCO0FBRUQsSUFBTSxrQ0FBa0MsR0FBRyxHQUFHLENBQUE7QUFDOUMsSUFBTSwrQkFBK0IsR0FBRyxDQUFDLENBQUE7QUFDekMsSUFBTSx3Q0FBd0MsR0FBRyxDQUFDLENBQUE7QUFDbEQsSUFBTSxpQ0FBaUMsR0FBRyxFQUFFLEdB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QUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDekUsQ0FBQTtJQUVELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFFL0IsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7U0FDbEQ7UUFHRCxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUs5QyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1NBQ2xEO0tBQ0Y7SUFFRCxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2V0IGZyb20gJ2xvZGFzaC5zZXQnXG5pbXBvcnQgdW5zZXQgZnJvbSAnbG9kYXNoLnVuc2V0J1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJ1xuaW1wb3J0IHsgZ2VuUmVxdWVzdElkIH0gZnJvbSAnLi9tZXNzYWdlJ1xuaW1wb3J0IHtcbiAgSVJlc3BvbnNlTWVzc2FnZSxcbiAgSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnLFxuICBJREJFdmVudCxcbiAgSVJlcXVlc3RNZXNzYWdlUmVidWlsZFdhdGNoTXNnLFxuICBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnLFxuICBJUmVxdWVzdE1zZ1R5cGUsXG4gIElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyxcbiAgSVdhdGNoT3B0aW9uc1xufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlYWx0aW1lJ1xuaW1wb3J0IHsgXG4gIElTaW5nbGVEQkV2ZW50XG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvZGF0YWJhc2UnXG4vLyBpbXBvcnQgUmVwb3J0ZXIgZnJvbSBcIi4vZXh0ZXJuYWxzL3B1YmxpYy1saWIvcmVwb3J0ZXJcIlxuaW1wb3J0IHsgUmVhbHRpbWVMaXN0ZW5lciB9IGZyb20gJy4vbGlzdGVuZXInXG5pbXBvcnQgeyBTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QnXG5pbXBvcnQgeyBJV1NTZW5kT3B0aW9ucywgSUxvZ2luUmVzdWx0IH0gZnJvbSAnLi93ZWJzb2NrZXQtY2xpZW50J1xuaW1wb3J0IHsgXG4gIEVSUl9DT0RFLFxuICBDbG91ZFNES0Vycm9yLFxuICBpc1RpbWVvdXRFcnJvcixcbiAgQ2FuY2VsbGVkRXJyb3IsXG4gIGlzQ2FuY2VsbGVkRXJyb3IsXG4gIGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvciwgXG4gIFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IsIFxuICBUaW1lb3V0RXJyb3IgXG59IGZyb20gJy4vZXJyb3InXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnXG5cbi8vID09PT09PT09PT09PT09PSBSZWFsdGltZSBWaXJ0dWFsIFdlYlNvY2tldCBDbGllbnQgKEludGVybmFsKSA9PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBJV2F0Y2hPcHRpb25zIHtcbiAgLy8gd3M6IFJlYWx0aW1lV2ViU29ja2V0Q2xpZW50XG4gIGVudklkPzogc3RyaW5nXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcXVlcnk6IHN0cmluZ1xuICBsaW1pdD86IG51bWJlclxuICBvcmRlckJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBzZW5kOiA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpID0+IFByb21pc2U8VD5cbiAgbG9naW46IChlbnZJZD86IHN0cmluZywgcmVmcmVzaD86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PlxuICBpc1dTQ29ubmVjdGVkOiAoKSA9PiBib29sZWFuXG4gIG9uY2VXU0Nvbm5lY3RlZDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiAoKSA9PiBudW1iZXJcbiAgb25XYXRjaFN0YXJ0OiAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHZvaWRcbiAgb25XYXRjaENsb3NlOiAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHZvaWRcbiAgZGVidWc/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJV2F0Y2hTZXNzaW9uSW5mbyB7XG4gIHF1ZXJ5SUQ6IHN0cmluZ1xuICBjdXJyZW50RXZlbnRJZDogbnVtYmVyXG4gIGN1cnJlbnREb2NzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgZXhwZWN0RXZlbnRJZD86IG51bWJlclxufVxuXG5pbnRlcmZhY2UgSUhhbmRsZUNvbW1vbkVycm9yT3B0aW9ucyB7XG4gIG9uU2lnbkVycm9yOiAoZTogUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcikgPT4gdm9pZFxuICBvblRpbWVvdXRFcnJvcjogKGU6IFRpbWVvdXRFcnJvcikgPT4gdm9pZFxuICBvbkNhbmNlbGxlZEVycm9yOiAoZTogQ2FuY2VsbGVkRXJyb3IpID0+IHZvaWRcbiAgb25Ob3RSZXRyeWFibGVFcnJvcjogKGU6IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IpID0+IHZvaWRcbiAgb25Vbmtub3duRXJyb3I6IChlOiBhbnkpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIElIYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvck9wdGlvbnMge1xuICBvcGVyYXRpb25OYW1lOiAnSU5JVF9XQVRDSCcgfCAnUkVCVUlMRF9XQVRDSCdcbiAgcmVzb2x2ZTogKHZhbHVlPzogUHJvbWlzZUxpa2U8dm9pZD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgcmVqZWN0OiAoZTogYW55KSA9PiB2b2lkXG4gIC8vIHJldHJ5OiAocmVmcmVzaExvZ2luPzogYm9vbGVhbikgPT4gdm9pZFxuICAvLyBhYm9ydFdhdGNoOiAoZTogYW55KSA9PiB2b2lkXG59XG5cbmVudW0gV0FUQ0hfU1RBVFVTIHtcbiAgTE9HR0lOR0lOID0gJ0xPR0dJTkdJTicsXG4gIElOSVRJTkcgPSAnSU5JVElORycsXG4gIFJFQlVJTERJTkcgPSAnUkVCVUlMRElORycsXG4gIEFDVElWRSA9ICdBQ1RJVkUnLFxuICBFUlJPUkVEID0gJ0VSUk9SRUQnLFxuICBDTE9TSU5HID0gJ0NMT1NJTkcnLFxuICBDTE9TRUQgPSAnQ0xPU0VEJyxcbiAgUEFVU0VEID0gJ1BBVVNFRCcsXG4gIFJFU1VNSU5HID0gJ1JFU1VNSU5HJ1xufVxuXG5jb25zdCBERUZBVUxUX1dBSVRfVElNRV9PTl9VTktOT1dOX0VSUk9SID0gMTAwXG5jb25zdCBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SID0gMlxuY29uc3QgREVGQVVMVF9NQVhfU0VORF9BQ0tfQVVUT19SRVRSWV9PTl9FUlJPUiA9IDJcbmNvbnN0IERFRkFVTFRfU0VORF9BQ0tfREVCT1VOQ0VfVElNRU9VVCA9IDEwICogMTAwMFxuY29uc3QgREVGQVVMVF9JTklUX1dBVENIX1RJTUVPVVQgPSAxMCAqIDEwMDBcbmNvbnN0IERFRkFVTFRfUkVCVUlMRF9XQVRDSF9USU1FT1VUID0gMTAgKiAxMDAwXG5cbmV4cG9ydCBjbGFzcyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50IHtcbiAgLy8gcGFzc2VkIG92ZXJcbiAgd2F0Y2hJZDogc3RyaW5nXG4gIC8vIG93blxuICBsaXN0ZW5lcjogUmVhbHRpbWVMaXN0ZW5lclxuICBwcml2YXRlIGVudklkPzogc3RyaW5nXG4gIHByaXZhdGUgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBwcml2YXRlIHF1ZXJ5OiBzdHJpbmdcbiAgcHJpdmF0ZSBsaW1pdDogbnVtYmVyXG4gIHByaXZhdGUgb3JkZXJCeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwcml2YXRlIHNlbmQ6IDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucykgPT4gUHJvbWlzZTxUPlxuICBwcml2YXRlIGxvZ2luOiAoZW52SWQ/OiBzdHJpbmcsIHJlZnJlc2g/OiBib29sZWFuKSA9PiBQcm9taXNlPGFueT5cbiAgcHJpdmF0ZSBpc1dTQ29ubmVjdGVkOiAoKSA9PiBib29sZWFuXG4gIHByaXZhdGUgb25jZVdTQ29ubmVjdGVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aDogKCkgPT4gbnVtYmVyXG4gIHByaXZhdGUgb25XYXRjaFN0YXJ0OiAoXG4gICAgY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LFxuICAgIHF1ZXJ5SUQ6IHN0cmluZ1xuICApID0+IHZvaWRcbiAgcHJpdmF0ZSBvbldhdGNoQ2xvc2U6IChcbiAgICBjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsXG4gICAgcXVlcnlJRDogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBwcml2YXRlIGRlYnVnPzogYm9vbGVhblxuXG4gIHByaXZhdGUgd2F0Y2hTdGF0dXM6IFdBVENIX1NUQVRVUyA9IFdBVENIX1NUQVRVUy5JTklUSU5HXG4gIHByaXZhdGUgX2F2YWlsYWJsZVJldHJpZXM6IFBhcnRpYWw8UmVjb3JkPElSZXF1ZXN0TXNnVHlwZSwgbnVtYmVyPj5cbiAgcHJpdmF0ZSBfYWNrVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgX2luaXRXYXRjaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgX3JlYnVpbGRXYXRjaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG5cbiAgLy8gb2J0YWluZWRcbiAgcHJpdmF0ZSBzZXNzaW9uSW5mbz86IElXYXRjaFNlc3Npb25JbmZvXG5cbiAgLy8gaW50ZXJuYWxcbiAgcHJpdmF0ZSBfd2FpdEV4cGVjdGVkVGltZW91dElkPzogbnVtYmVyXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLndhdGNoSWQgPSBgd2F0Y2hpZF8keytuZXcgRGF0ZSgpfV8ke01hdGgucmFuZG9tKCl9YFxuICAgIHRoaXMuZW52SWQgPSBvcHRpb25zLmVudklkXG4gICAgdGhpcy5jb2xsZWN0aW9uTmFtZSA9IG9wdGlvbnMuY29sbGVjdGlvbk5hbWVcbiAgICB0aGlzLnF1ZXJ5ID0gb3B0aW9ucy5xdWVyeVxuICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0XG4gICAgdGhpcy5vcmRlckJ5ID0gb3B0aW9ucy5vcmRlckJ5XG4gICAgdGhpcy5zZW5kID0gb3B0aW9ucy5zZW5kXG4gICAgdGhpcy5sb2dpbiA9IG9wdGlvbnMubG9naW5cbiAgICB0aGlzLmlzV1NDb25uZWN0ZWQgPSBvcHRpb25zLmlzV1NDb25uZWN0ZWRcbiAgICB0aGlzLm9uY2VXU0Nvbm5lY3RlZCA9IG9wdGlvbnMub25jZVdTQ29ubmVjdGVkXG4gICAgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gb3B0aW9ucy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoXG4gICAgdGhpcy5vbldhdGNoU3RhcnQgPSBvcHRpb25zLm9uV2F0Y2hTdGFydFxuICAgIHRoaXMub25XYXRjaENsb3NlID0gb3B0aW9ucy5vbldhdGNoQ2xvc2VcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1Z1xuXG4gICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcyA9IHtcbiAgICAgIElOSVRfV0FUQ0g6IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgICBSRUJVSUxEX1dBVENIOiBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SLFxuICAgICAgQ0hFQ0tfTEFTVDogREVGQVVMVF9NQVhfU0VORF9BQ0tfQVVUT19SRVRSWV9PTl9FUlJPUlxuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgUmVhbHRpbWVMaXN0ZW5lcih7XG4gICAgICBjbG9zZTogdGhpcy5jbG9zZVdhdGNoLFxuICAgICAgb25DaGFuZ2U6IG9wdGlvbnMub25DaGFuZ2UsXG4gICAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgIHZpcnR1YWxDbGllbnQ6IHRoaXNcbiAgICB9KVxuXG4gICAgdGhpcy5pbml0V2F0Y2goKVxuICB9XG5cbiAgb25NZXNzYWdlKG1zZzogSVJlc3BvbnNlTWVzc2FnZSkge1xuICAgIC8vIHdhdGNoU3RhdHVzIHNhbml0eSBjaGVja1xuICAgIHN3aXRjaCAodGhpcy53YXRjaFN0YXR1cykge1xuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuUEFVU0VEOiB7XG4gICAgICAgIC8vIGlnbm9yZSBhbGwgYnV0IGVycm9yIG1lc3NhZ2VcbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlICE9PSAnRVJST1InKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLkxPR0dJTkdJTjpcbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLklOSVRJTkc6XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5SRUJVSUxESU5HOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGlsZSAke3RoaXMud2F0Y2hTdGF0dXN9YFxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuQ0xPU0VEOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGVuIHRoZSB3YXRjaCBoYXMgY2xvc2VkJ1xuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuRVJST1JFRDoge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiB1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgd2hlbiB0aGUgd2F0Y2ggaGFzIGVuZGVkIHdpdGggZXJyb3InXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbm90IGZvdW5kIHdoaWxlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuJ1xuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuXG4gICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgY2FzZSAnTkVYVF9FVkVOVCc6IHtcbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKHd4Ll9pZ25vcmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBuZXh0ZXZlbnQgJHttc2cubXNnRGF0YS5jdXJyRXZlbnR9IGlnbm9yZWRgLCBtc2cpXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gd3guX2lnbm9yZSA9IGZhbHNlXG4gICAgICAgIC8vIHJldHVyblxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhtc2cpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdDSEVDS19FVkVOVCc6IHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgICAgICAvLyBjbGllbnQgZXZlbnRJRCA8IHNlcnZlciBldmVudElEOlxuICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG9uZSBvciBtb3JlIHBlbmRpbmcgZXZlbnRzIG5vdCB5ZXQgcmVjZWl2ZWQgYnV0IHNlbnQgYnkgdGhlIHNlcnZlclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZCA9IG1zZy5tc2dEYXRhLmN1cnJFdmVudFxuICAgICAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gbXVzdCByZWJ1aWxkIHdhdGNoXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgICAgfSwgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoKCkpXG5cbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbcmVhbHRpbWVdIHdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggJHt0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgoKX1gXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIC8vIHJlY2VpdmUgc2VydmVyIGVycm9yXG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1NFUlZFUl9FUlJPUl9NU0cgYXMgc3RyaW5nLFxuICAgICAgICAgICAgZXJyTXNnOiBgJHttc2cubXNnRGF0YS5jb2RlfSAtICR7bXNnLm1zZ0RhdGEubWVzc2FnZX1gXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIHZpcnR1YWwgY2xpZW50IHJlY2VpdmUgdW5leHBlY3RlZCBtc2cgJHttc2cubXNnVHlwZX06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgIClcbiAgICAgICAgLy8gfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsb3NlV2l0aEVycm9yKGVycm9yOiBhbnkpIHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkVSUk9SRURcbiAgICB0aGlzLmNsZWFyQUNLU2NoZWR1bGUoKVxuICAgIHRoaXMubGlzdGVuZXIub25FcnJvcihlcnJvcilcbiAgICAvLyBSZXBvcnRlci5zdXJyb3VuZFRoaXJkQnlUcnlDYXRjaCgoKSA9PiB0aGlzLmxpc3RlbmVyLm9uRXJyb3IoZXJyb3IpKVxuICAgIHRoaXMub25XYXRjaENsb3NlKFxuICAgICAgdGhpcyxcbiAgICAgICh0aGlzLnNlc3Npb25JbmZvICYmIHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCkgfHwgJydcbiAgICApXG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCBjbG9zZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWBcbiAgICApXG4gICAgLy8gfVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5QQVVTRURcbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCBwYXVzZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWBcbiAgICApXG4gICAgLy8gfVxuICB9XG5cbiAgLy8gcmVzdW1lKCkge1xuICAvLyAgIHJldHVybiB0aGlzLnNlc3Npb25JbmZvID8gdGhpcy5yZWJ1aWxkV2F0Y2goKSA6IHRoaXMuaW5pdFdhdGNoKClcbiAgLy8gfVxuXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLlJFU1VNSU5HXG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWluZyB3aXRoICR7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPyAnUkVCVUlMRF9XQVRDSCcgOiAnSU5JVF9XQVRDSCdcbiAgICAgIH0gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgXG4gICAgKVxuICAgIC8vIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCAodGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMucmVidWlsZFdhdGNoKCkgOiB0aGlzLmluaXRXYXRjaCgpKVxuXG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW3JlYWx0aW1lXSBjbGllbnQgc3VjY2Vzc2Z1bGx5IHJlc3VtZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgXG4gICAgICApXG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW3JlYWx0aW1lXSBjbGllbnQgcmVzdW1lIGZhaWxlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWAsXG4gICAgICAgIGVcbiAgICAgIClcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPElMb2dpblJlc3VsdD4gPT4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuTE9HR0lOR0lOXG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCB0aGlzLmxvZ2luKGVudklkLCByZWZyZXNoKVxuICAgIGlmICghdGhpcy5lbnZJZCkge1xuICAgICAgdGhpcy5lbnZJZCA9IGxvZ2luUmVzdWx0LmVudklkXG4gICAgfVxuICAgIHJldHVybiBsb2dpblJlc3VsdFxuICB9XG5cbiAgcHJpdmF0ZSBpbml0V2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuX2luaXRXYXRjaFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0V2F0Y2hQcm9taXNlXG4gICAgfVxuXG4gICAgdGhpcy5faW5pdFdhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KFxuICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZW52SWQgfSA9IGF3YWl0IHRoaXMuX2xvZ2luKHRoaXMuZW52SWQsIGZvcmNlUmVmcmVzaExvZ2luKVxuXG4gICAgICAgICAgLy8gaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoYGNhbiBub3QgcmVidWlsZFdhdGNoIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbylgKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGlmICgodGhpcy53YXRjaFN0YXR1cyBhcyBXQVRDSF9TVEFUVVMpID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLklOSVRJTkdcblxuICAgICAgICAgIGNvbnN0IGluaXRXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnID0ge1xuICAgICAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICAgIG1zZ1R5cGU6ICdJTklUX1dBVENIJyxcbiAgICAgICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICAgICAgZW52SWQsXG4gICAgICAgICAgICAgIGNvbGxOYW1lOiB0aGlzLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgbGltaXQ6IHRoaXMubGltaXQsXG4gICAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMub3JkZXJCeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluaXRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnPih7XG4gICAgICAgICAgICBtc2c6IGluaXRXYXRjaE1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX0lOSVRfV0FUQ0hfVElNRU9VVFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCB7IGV2ZW50cywgY3VyckV2ZW50IH0gPSBpbml0RXZlbnRNc2cubXNnRGF0YVxuXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mbyA9IHtcbiAgICAgICAgICAgIHF1ZXJ5SUQ6IGluaXRFdmVudE1zZy5tc2dEYXRhLnF1ZXJ5SUQsXG4gICAgICAgICAgICBjdXJyZW50RXZlbnRJZDogY3VyckV2ZW50IC0gMSxcbiAgICAgICAgICAgIGN1cnJlbnREb2NzOiBbXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZJWDogaW4gaW5pdEV2ZW50IG1lc3NhZ2UsIGFsbCBldmVudHMgaGF2ZSBpZCAwLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBjdXJyRXZlbnRcbiAgICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgZS5JRCA9IGN1cnJFdmVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMoaW5pdEV2ZW50TXNnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY3VyckV2ZW50XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBTbmFwc2hvdCh7XG4gICAgICAgICAgICAgIGlkOiBjdXJyRXZlbnQsXG4gICAgICAgICAgICAgIGRvY0NoYW5nZXM6IFtdLFxuICAgICAgICAgICAgICBkb2NzOiBbXSxcbiAgICAgICAgICAgICAgdHlwZTogJ2luaXQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vbkNoYW5nZShzbmFwc2hvdClcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbldhdGNoU3RhcnQodGhpcywgdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEKVxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQUNUSVZFXG4gICAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5JTklUX1dBVENIID0gREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUlxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvcihlLCB7XG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnSU5JVF9XQVRDSCcsXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9pbml0V2F0Y2hQcm9taXNlXG4gICAgICBzdWNjZXNzID0gdHJ1ZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pbml0V2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gaW5pdFdhdGNoICR7c3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdmYWlsJ31gKVxuICAgIC8vIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVidWlsZFdhdGNoID0gYXN5bmMgKGZvcmNlUmVmcmVzaExvZ2luPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZVxuICAgIH1cblxuICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihcbiAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBlbnZJZCB9ID0gYXdhaXQgdGhpcy5fbG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pXG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ2NhbiBub3QgcmVidWlsZFdhdGNoIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbyknXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdBVENIX1NUQVRVUykgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuUkVCVUlMRElOR1xuXG4gICAgICAgICAgY29uc3QgcmVidWlsZFdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VSZWJ1aWxkV2F0Y2hNc2cgPSB7XG4gICAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgICAgbXNnVHlwZTogJ1JFQlVJTERfV0FUQ0gnLFxuICAgICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgICAgY29sbE5hbWU6IHRoaXMuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHF1ZXJ5SUQ6IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCxcbiAgICAgICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5leHRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnPih7XG4gICAgICAgICAgICBtc2c6IHJlYnVpbGRXYXRjaE1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgICAgdGltZW91dDogREVGQVVMVF9SRUJVSUxEX1dBVENIX1RJTUVPVVRcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMobmV4dEV2ZW50TXNnKVxuXG4gICAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5BQ1RJVkVcbiAgICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLlJFQlVJTERfV0FUQ0ggPSBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yKGUsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdSRUJVSUxEX1dBVENIJyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3RcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2VcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWApXG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvciA9IGFzeW5jIChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9uc1xuICApID0+IHtcbiAgICBjb25zdCBpc0luaXRXYXRjaCA9IG9wdGlvbnMub3BlcmF0aW9uTmFtZSA9PT0gJ0lOSVRfV0FUQ0gnXG5cbiAgICBjb25zdCBhYm9ydFdhdGNoID0gKCkgPT4ge1xuICAgICAgLy8gbW9jayB0ZW1wIGNvbW1lbnRcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBpc0luaXRXYXRjaFxuICAgICAgICAgICAgPyAoRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX0lOSVRfV0FUQ0hfRkFJTCBhcyBzdHJpbmcpXG4gICAgICAgICAgICA6IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfUkVCVUlMRF9XQVRDSF9GQUlMIGFzIHN0cmluZyksXG4gICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICBvcHRpb25zLnJlamVjdChlKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5ID0gKHJlZnJlc2hMb2dpbj86IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZVJldHJ5VGlja2V0KG9wdGlvbnMub3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgaWYgKGlzSW5pdFdhdGNoKSB7XG4gICAgICAgICAgdGhpcy5faW5pdFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIG9wdGlvbnMucmVzb2x2ZSh0aGlzLmluaXRXYXRjaChyZWZyZXNoTG9naW4pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgICAgICBvcHRpb25zLnJlc29sdmUodGhpcy5yZWJ1aWxkV2F0Y2gocmVmcmVzaExvZ2luKSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWJvcnRXYXRjaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVDb21tb25FcnJvcihlLCB7XG4gICAgICBvblNpZ25FcnJvcjogKCkgPT4gcmV0cnkodHJ1ZSksXG4gICAgICBvblRpbWVvdXRFcnJvcjogKCkgPT4gcmV0cnkoZmFsc2UpLFxuICAgICAgb25Ob3RSZXRyeWFibGVFcnJvcjogYWJvcnRXYXRjaCxcbiAgICAgIG9uQ2FuY2VsbGVkRXJyb3I6IG9wdGlvbnMucmVqZWN0LFxuICAgICAgb25Vbmtub3duRXJyb3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvbldTRGlzY29ubmVjdGVkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uY2VXU0Nvbm5lY3RlZCgpXG4gICAgICAgICAgICByZXRyeSh0cnVlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9uV1NEaXNjb25uZWN0ZWQoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBzbGVlcChERUZBVUxUX1dBSVRfVElNRV9PTl9VTktOT1dOX0VSUk9SKVxuICAgICAgICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgICAgLy8gY2FuY2VsXG4gICAgICAgICAgICAgIG9wdGlvbnMucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBDYW5jZWxsZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgIGAke29wdGlvbnMub3BlcmF0aW9uTmFtZX0gY2FuY2VsbGVkIGR1ZSB0byBwYXVzZSBhZnRlciB1bmtub3duRXJyb3JgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBhd2FpdCBvbldTRGlzY29ubmVjdGVkKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHJ5KGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgaGFuZGxpbmcgZXJyb3IsIGluIG9yZGVyIHRvIHByb3ZpZGUgbWF4aW11bSBlZmZvcnQgb24gU0VBTUlOR0xFU1MgRkFVTFQgVE9MRVJBTkNFLCBqdXN0IHJldHJ5XG4gICAgICAgICAgcmV0cnkodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNsb3NlV2F0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcXVlcnlJZCA9IHRoaXMuc2Vzc2lvbkluZm8gPyB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQgOiAnJ1xuXG4gICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgIT09IFdBVENIX1NUQVRVUy5BQ1RJVkUpIHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0VEXG4gICAgICB0aGlzLm9uV2F0Y2hDbG9zZSh0aGlzLCBxdWVyeUlkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0lOR1xuXG4gICAgICBjb25zdCBjbG9zZVdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnID0ge1xuICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgIG1zZ1R5cGU6ICdDTE9TRV9XQVRDSCcsXG4gICAgICAgIG1zZ0RhdGE6IG51bGxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBjbG9zZVdhdGNoTXNnXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNlc3Npb25JbmZvID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkNMT1NFRFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0xPU0VfV0FUQ0hfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub25XYXRjaENsb3NlKHRoaXMsIHF1ZXJ5SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVNlbmRBQ0sgPSAoKSA9PiB7XG4gICAgdGhpcy5jbGVhckFDS1NjaGVkdWxlKClcblxuICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBzdGF0dXMgYWZ0ZXIgdGltZW91dFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLl9hY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl93YWl0RXhwZWN0ZWRUaW1lb3V0SWQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kQUNLKClcbiAgICAgIH1cbiAgICB9LCBERUZBVUxUX1NFTkRfQUNLX0RFQk9VTkNFX1RJTUVPVVQpXG4gIH1cblxuICBwcml2YXRlIGNsZWFyQUNLU2NoZWR1bGUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX2Fja1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Fja1RpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbmRBQ0sgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzICE9PSBXQVRDSF9TVEFUVVMuQUNUSVZFKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gY2FuIG5vdCBzZW5kIGFjayB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBpbml0V2F0Y2ggKGxhY2sgb2Ygc2Vzc2lvbkluZm8pJ1xuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2tNc2c6IElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyA9IHtcbiAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICBtc2dUeXBlOiAnQ0hFQ0tfTEFTVCcsXG4gICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICBxdWVyeUlEOiB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQsXG4gICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgIG1zZzogYWNrTXNnXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVE9ETzogcmVmYWN0b3JcbiAgICAgIGlmIChpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IoZSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZS5wYXlsb2FkXG4gICAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAgIC8vIHNpZ25hdHVyZSBlcnJvciAtPiByZXRyeSB3aXRoIHJlZnJlc2hlZCBzaWduYXR1cmVcbiAgICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU0lHTl9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gb3RoZXIgLT4gdGhyb3dcbiAgICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NZU19FUlInOlxuICAgICAgICAgIGNhc2UgJ0lOVkFMSUlEX0VOVic6XG4gICAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICAgIC8vIG11c3QgdGhyb3dcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0hFQ0tfTEFTVF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IG1zZy5tc2dEYXRhLmNvZGVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBtYXliZSByZXRyeWFibGVcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUICYmXG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLkNIRUNLX0xBU1QtLVxuICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKFxuICAgICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DSEVDS19MQVNUX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29tbW9uRXJyb3IgPSAoXG4gICAgZTogYW55LFxuICAgIG9wdGlvbnM6IElIYW5kbGVDb21tb25FcnJvck9wdGlvbnNcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcihlKSkge1xuICAgICAgY29uc3QgbXNnID0gZS5wYXlsb2FkXG4gICAgICBzd2l0Y2ggKG1zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgLy8gc2lnbmF0dXJlIGVycm9yIC0+IHJldHJ5IHdpdGggcmVmcmVzaGVkIHNpZ25hdHVyZVxuICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICBjYXNlICdTSUdOX0VYUElSRURfRVJST1InOlxuICAgICAgICBjYXNlICdTSUdOX0lOVkFMSURfRVJST1InOlxuICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgb3B0aW9ucy5vblNpZ25FcnJvcihlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIG5vdC1yZXRyeWFibGUgZXJyb3IgLT4gdGhyb3dcbiAgICAgICAgY2FzZSAnUVVFUllJRF9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgY2FzZSAnU1lTX0VSUic6XG4gICAgICAgIGNhc2UgJ0lOVkFMSUlEX0VOVic6XG4gICAgICAgIGNhc2UgJ0NPTExFQ1RJT05fUEVSTUlTU0lPTl9ERU5JRUQnOiB7XG4gICAgICAgICAgb3B0aW9ucy5vbk5vdFJldHJ5YWJsZUVycm9yKGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIG9wdGlvbnMub25Ob3RSZXRyeWFibGVFcnJvcihlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RpbWVvdXRFcnJvcihlKSkge1xuICAgICAgLy8gdGltZW91dCBlcnJvclxuICAgICAgb3B0aW9ucy5vblRpbWVvdXRFcnJvcihlKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIGlmIChpc0NhbmNlbGxlZEVycm9yKGUpKSB7XG4gICAgICAvLyBjYW5jZWxsZWQgZXJyb3JcbiAgICAgIG9wdGlvbnMub25DYW5jZWxsZWRFcnJvcihlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5rbm93biBlcnJvclxuICAgIG9wdGlvbnMub25Vbmtub3duRXJyb3IoZSlcbiAgfVxuXG4gIC8vIGNyZWRpdCBhIHJldHJ5IGNoYW5jZSBmcm9tIGF2YWlsYWJsZVJldHJpZXNcbiAgcHJpdmF0ZSB1c2VSZXRyeVRpY2tldChvcGVyYXRpb25OYW1lOiBJUmVxdWVzdE1zZ1R5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdICYmXG4gICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdISA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0hLS1cblxuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtyZWFsdGltZV0gJHtvcGVyYXRpb25OYW1lfSB1c2UgYSByZXRyeSB0aWNrZXQsIG5vdyBvbmx5ICR7dGhpcy5fYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXX0gcmV0cnkgbGVmdGBcbiAgICAgIClcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlcnZlckV2ZW50cyhcbiAgICBtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnXG4gICkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVTZXJ2ZXJFdmVudHMobXNnKVxuICAgICAgdGhpcy5fcG9zdEhhbmRsZVNlcnZlckV2ZW50c1ZhbGlkaXR5Q2hlY2sobXNnKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGhhbmRsZSBzZXJ2ZXIgZXZlbnRzIGZhaWxlZCB3aXRoIGVycm9yOiAnLFxuICAgICAgICBlXG4gICAgICApXG5cbiAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogaGFuZGxlIHNlcnZlciBldmVudHMgZmFpbGVkIHdpdGggZXJyb3I6ICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oe30sIGUsIHtcbiAgICAgIC8vICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgIC8vICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAvLyAgICAgfSlcbiAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgLy8gKVxuICAgICAgLy8gfVxuXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlU2VydmVyRXZlbnRzKFxuICAgIG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2dcbiAgKSB7XG4gICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1zZ1xuXG4gICAgY29uc3QgeyBldmVudHMgfSA9IG1zZy5tc2dEYXRhXG4gICAgY29uc3QgeyBtc2dUeXBlIH0gPSBtc2dcblxuICAgIGlmICghZXZlbnRzLmxlbmd0aCB8fCAhdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2Vzc2lvbkluZm8gPSB0aGlzLnNlc3Npb25JbmZvXG5cbiAgICBsZXQgYWxsQ2hhbmdlRXZlbnRzOiBJU2luZ2xlREJFdmVudFtdXG4gICAgdHJ5IHtcbiAgICAgIGFsbENoYW5nZUV2ZW50cyA9IGV2ZW50cy5tYXAoZ2V0UHVibGljRXZlbnQpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUNFSVZFX0lOVkFMSURfU0VSVkVSX0RBVEEgYXMgc3RyaW5nLFxuICAgICAgICAgIGVyck1zZzogZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gYWdncmVnYXRlIGRvY3NcbiAgICBsZXQgZG9jcyA9IFsuLi5zZXNzaW9uSW5mby5jdXJyZW50RG9jc11cbiAgICBsZXQgaW5pdEVuY291bnRlcmVkID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYWxsQ2hhbmdlRXZlbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBhbGxDaGFuZ2VFdmVudHNbaV1cblxuICAgICAgaWYgKHNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID49IGNoYW5nZS5pZCkge1xuICAgICAgICBpZiAoIWFsbENoYW5nZUV2ZW50c1tpIC0gMV0gfHwgY2hhbmdlLmlkID4gYWxsQ2hhbmdlRXZlbnRzW2kgLSAxXS5pZCkge1xuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudCwgZHJvcGFibGVcbiAgICAgICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW3JlYWx0aW1lXSBkdXBsaWNhdGUgZXZlbnQgcmVjZWl2ZWQsIGN1ciAke3Nlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkfSBidXQgZ290ICR7Y2hhbmdlLmlkfWBcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsbENoYW5nZUV2ZW50cyBzaG91bGQgYmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byBldmVudElkLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW5zLCBtdXN0IHJlcG9ydCBhIG5vbi1mYXRhbCBlcnJvclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBzZXJ2ZXIgbm9uLWZhdGFsIGVycm9yOiBldmVudHMgb3V0IG9mIG9yZGVyICh0aGUgbGF0dGVyIGV2ZW50J3MgaWQgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZvcm1lcikgKHJlcXVlc3RJZCAke3JlcXVlc3RJZH0pYFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gc2VydmVyIG5vbi1mYXRhbCBlcnJvcjogZXZlbnRzIG91dCBvZiBvcmRlciAodGhlIGxhdHRlciBldmVudCdzIGlkIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mIHRoZSBmb3JtZXIpICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgIC8vICAgICApXG4gICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgLy8gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID09PSBjaGFuZ2UuaWQgLSAxKSB7XG4gICAgICAgIC8vIGNvcnJlY3Qgc2VxdWVuY2VcbiAgICAgICAgLy8gZmlyc3QgaGFuZGxlIGRhdGFUeXBlIHRoZW4gcXVldWVUeXBlOlxuICAgICAgICAvLyAxLiBkYXRhVHlwZTogd2UgT05MWSBwb3B1bGF0ZSBjaGFuZ2UuZG9jIGlmIG5lY2Nlc3NhcnlcbiAgICAgICAgLy8gMi4gcXVldWVUeXBlOiB3ZSBidWlsZCB0aGUgZGF0YSBzbmFwc2hvdFxuXG4gICAgICAgIHN3aXRjaCAoY2hhbmdlLmRhdGFUeXBlKSB7XG4gICAgICAgICAgY2FzZSAndXBkYXRlJzoge1xuICAgICAgICAgICAgLy8gb25seSBuZWVkIHRvIHBvcHVsYXRlIGNoYW5nZS5kb2Mgd2hlbiBpdCBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1cGRhdGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RlcXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbERvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgcGFydGlhbCB1cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0gY2xvbmVEZWVwKGxvY2FsRG9jKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UudXBkYXRlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRQYXRoIGluIGNoYW5nZS51cGRhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQoZG9jLCBmaWVsZFBhdGgsIGNoYW5nZS51cGRhdGVkRmllbGRzW2ZpZWxkUGF0aF0pXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5yZW1vdmVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZFBhdGggb2YgY2hhbmdlLnJlbW92ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KGRvYywgZmllbGRQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2NcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCB1cGRhdGUgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgdXBkYXRlIGRhdGFUeXBlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfVU5FWFBFQ1RFRF9GQVRBTF9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJ1cGRhdGVcIiBhbmQgcXVldWVUeXBlPVwiZW5xdWV1ZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOiB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uXG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwicmVwbGFjZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKVxuICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcmVtb3ZlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLidcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHJlbW92ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2xpbWl0Jzoge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIHN3aXRjaChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgbGltaXQgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwibGltaXRcIiBhbmQgcXVldWVUeXBlPVwiZW5xdWV1ZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnaW5pdCc6IHtcbiAgICAgICAgICAgIGlmICghaW5pdEVuY291bnRlcmVkKSB7XG4gICAgICAgICAgICAgIGluaXRFbmNvdW50ZXJlZCA9IHRydWVcbiAgICAgICAgICAgICAgZG9jcyA9IFtjaGFuZ2UuZG9jXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgY29uc3QgaW5kID0gZG9jcy5maW5kSW5kZXgoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzLnNwbGljZShpbmQsIDEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgZGVxdWV1ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBkZXF1ZXVlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndXBkYXRlJzoge1xuICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gZG9jcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgIGRvY3NcbiAgICAgICAgICAgIC8vICAgKX0gY2hhbmdlIGRvYyAke0pTT04uc3RyaW5naWZ5KGNoYW5nZSl9IFxcbmBcbiAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIGNvbnN0IGluZCA9IGRvY3MuZmluZEluZGV4KGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgZG9jc1tpbmRdID0gY2hhbmdlLmRvY1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHF1ZXVlVHlwZSB1cGRhdGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcXVldWVUeXBlIHVwZGF0ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGkgPT09IGxlbiAtIDEgfHxcbiAgICAgICAgICAoYWxsQ2hhbmdlRXZlbnRzW2kgKyAxXSAmJiBhbGxDaGFuZ2VFdmVudHNbaSArIDFdLmlkICE9PSBjaGFuZ2UuaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGEgc2hhbGxvdyBzbGljZSBjcmVhdGVzIGEgc2hhbGxvdyBzbmFwc2hvdFxuICAgICAgICAgIGNvbnN0IGRvY3NTbmFwc2hvdCA9IFsuLi5kb2NzXVxuXG4gICAgICAgICAgLy8gd2Ugc2xpY2UgZmlyc3QgY2F1c2UnIGlmIHRoZXJlJ3JlIGFsbENoYW5nZUV2ZW50cyB0aGF0IGFyZSBvZiB0aGUgc2FtZSBpZCBhZnRlciB0aGlzIGNoYW5nZSwgd2UgZG9uJ3Qgd2FudCB0byBpbnZvbHZlIGl0IGZvciBpdCBpcyB1bmV4cGVjdGVkIGludmFsaWQgb3JkZXJcbiAgICAgICAgICBjb25zdCBkb2NDaGFuZ2VzID0gYWxsQ2hhbmdlRXZlbnRzXG4gICAgICAgICAgICAuc2xpY2UoMCwgaSArIDEpXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gYy5pZCA9PT0gY2hhbmdlLmlkKVxuXG4gICAgICAgICAgLy8gYWxsIGNoYW5nZXMgb2YgdGhpcyBldmVudCBoYXMgYmVlbiBoYW5kbGUsIHdlIGNvdWxkIGRpc3BhdGNoIHRoZSBldmVudCBub3dcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY2hhbmdlLmlkXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RG9jcyA9IGRvY3NcblxuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KHtcbiAgICAgICAgICAgIGlkOiBjaGFuZ2UuaWQsXG4gICAgICAgICAgICBkb2NDaGFuZ2VzLFxuICAgICAgICAgICAgZG9jczogZG9jc1NuYXBzaG90LFxuICAgICAgICAgICAgbXNnVHlwZVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBSZXBvcnRlci5zdXJyb3VuZFRoaXJkQnlUcnlDYXRjaCgoKSA9PlxuICAgICAgICAgIHRoaXMubGlzdGVuZXIub25DaGFuZ2Uoc25hcHNob3QpXG4gICAgICAgICAgLy8gKSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG91dC1vZi1vcmRlciBldmVudFxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBldmVudCByZWNlaXZlZCBpcyBvdXQgb2Ygb3JkZXIsIGN1ciAke3RoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWR9IGJ1dCBnb3QgJHtjaGFuZ2UuaWR9YFxuICAgICAgICApXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gcmVidWlsZCB3YXRjaFxuICAgICAgICBhd2FpdCB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Bvc3RIYW5kbGVTZXJ2ZXJFdmVudHNWYWxpZGl0eUNoZWNrKFxuICAgIG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2dcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIGxvc3QgYWZ0ZXIgc2VydmVyIGV2ZW50IGhhbmRsaW5nLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1cidcbiAgICAgIClcblxuICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBzZXNzaW9uSW5mbyBsb3N0IGFmdGVyIHNlcnZlciBldmVudCBoYW5kbGluZywgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgLy8gICAgICAge30sXG4gICAgICAvLyAgICAgICB7XG4gICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgIC8vICAgICAgIH1cbiAgICAgIC8vICAgICApXG4gICAgICAvLyAgICl9IFxcbmBcbiAgICAgIC8vIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZCAmJlxuICAgICAgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA+PSB0aGlzLnNlc3Npb25JbmZvLmV4cGVjdEV2ZW50SWRcbiAgICApIHtcbiAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBjbGllbnQgZXZlbnRJZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNlcnZlciBldmVudCBpZCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcnXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZClcbiAgICAgIHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQdWJsaWNFdmVudChldmVudDogSURCRXZlbnQpOiBJU2luZ2xlREJFdmVudCB7XG4gIGNvbnN0IGU6IElTaW5nbGVEQkV2ZW50ID0ge1xuICAgIGlkOiBldmVudC5JRCxcbiAgICBkYXRhVHlwZTogZXZlbnQuRGF0YVR5cGUsXG4gICAgcXVldWVUeXBlOiBldmVudC5RdWV1ZVR5cGUsXG4gICAgZG9jSWQ6IGV2ZW50LkRvY0lELFxuICAgIGRvYzogZXZlbnQuRG9jICYmIGV2ZW50LkRvYyAhPT0gJ3t9JyA/IEpTT04ucGFyc2UoZXZlbnQuRG9jKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKGV2ZW50LkRhdGFUeXBlID09PSAndXBkYXRlJykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoZXZlbnQuVXBkYXRlZEZpZWxkcykge1xuICAgICAgZS51cGRhdGVkRmllbGRzID0gSlNPTi5wYXJzZShldmVudC5VcGRhdGVkRmllbGRzKVxuICAgIH1cbiAgICAvLyBUT0RPOiB3YWl0IGZvciB0Y2IgdG8gY2hhbmdlIHJlbW92ZWRGaWVsZHMgdG8gUmVtb3ZlZEZpZWxkc1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoZXZlbnQucmVtb3ZlZEZpZWxkcyB8fCBldmVudC5SZW1vdmVkRmllbGRzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAvLyBlLnJlbW92ZWRGaWVsZHMgPSBldmVudC5yZW1vdmVkRmllbGRzXG4gICAgICAvLyAgID8gSlNPTi5wYXJzZShldmVudC5yZW1vdmVkRmllbGRzKVxuICAgICAgLy8gICA6IEpTT04ucGFyc2UoZXZlbnQuUmVtb3ZlZEZpZWxkcylcbiAgICAgIGUucmVtb3ZlZEZpZWxkcyA9IEpTT04ucGFyc2UoZXZlbnQucmVtb3ZlZEZpZWxkcylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZVxufVxuIl19
|
|
952
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNoQyxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBZ0J4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLGFBQWEsRUFDYixjQUFjLEVBQ2QsY0FBYyxFQUNkLGdCQUFnQixFQUNoQiwyQkFBMkIsR0FHNUIsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQXlDL0IsSUFBSyxXQVVKO0FBVkQsV0FBSyxXQUFXO0lBQ2Qsc0NBQXVCLENBQUE7SUFDdkIsa0NBQW1CLENBQUE7SUFDbkIsd0NBQXlCLENBQUE7SUFDekIsZ0NBQWlCLENBQUE7SUFDakIsa0NBQW1CLENBQUE7SUFDbkIsa0NBQW1CLENBQUE7SUFDbkIsZ0NBQWlCLENBQUE7SUFDakIsZ0NBQWlCLENBQUE7SUFDakIsb0NBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZJLFdBQVcsS0FBWCxXQUFXLFFBVWY7QUFFRCxJQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQTtBQUM5QyxJQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQTtBQUN6QyxJQUFNLHdDQUF3QyxHQUFHLENBQUMsQ0FBQTtBQUNsRCxJQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FB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QUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1lBQ3hDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7U0FDdkM7SUFDSCxDQUFDO0lBQ0gsNkJBQUM7QUFBRCxDQUFDLEFBOTJCRCxJQTgyQkM7O0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBZTtJQUNyQyxJQUFNLENBQUMsR0FBbUI7UUFDeEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ1osUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1FBQ3hCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3pFLENBQUE7SUFFRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBRS9CLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN2QixDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1NBQ2xEO1FBR0QsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFLOUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtTQUNsRDtLQUNGO0lBRUQsT0FBTyxDQUFDLENBQUE7QUFDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNldCBmcm9tICdsb2Rhc2guc2V0J1xuaW1wb3J0IHVuc2V0IGZyb20gJ2xvZGFzaC51bnNldCdcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCdcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSdcbmltcG9ydCB7XG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZUluaXRXYXRjaE1zZyxcbiAgSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyxcbiAgSURCRXZlbnQsXG4gIElSZXF1ZXN0TWVzc2FnZVJlYnVpbGRXYXRjaE1zZyxcbiAgSVJlcXVlc3RNZXNzYWdlQ2xvc2VXYXRjaE1zZyxcbiAgSVJlcXVlc3RNc2dUeXBlLFxuICBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnLFxuICBJUmVxdWVzdE1lc3NhZ2VDaGVja0xhc3RNc2csXG4gIElXYXRjaE9wdGlvbnMsXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvcmVhbHRpbWUnXG5pbXBvcnQge1xuICBJU2luZ2xlREJFdmVudCxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9kYXRhYmFzZSdcbmltcG9ydCB7IFJlYWx0aW1lTGlzdGVuZXIgfSBmcm9tICcuL2xpc3RlbmVyJ1xuaW1wb3J0IHsgU25hcHNob3QgfSBmcm9tICcuL3NuYXBzaG90J1xuaW1wb3J0IHsgSVdTU2VuZE9wdGlvbnMsIElMb2dpblJlc3VsdCB9IGZyb20gJy4vd2Vic29ja2V0LWNsaWVudCdcbmltcG9ydCB7XG4gIEVSUl9DT0RFLFxuICBDbG91ZFNES0Vycm9yLFxuICBpc1RpbWVvdXRFcnJvcixcbiAgQ2FuY2VsbGVkRXJyb3IsXG4gIGlzQ2FuY2VsbGVkRXJyb3IsXG4gIGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcixcbiAgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcixcbiAgVGltZW91dEVycm9yLFxufSBmcm9tICcuL2Vycm9yJ1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3V0aWxzJ1xuXG4vLyA9PT09PT09PT09PT09PT0gUmVhbHRpbWUgVmlydHVhbCBXZWJTb2NrZXQgQ2xpZW50IChJbnRlcm5hbCkgPT09PT09PT09PT09PT09PT09PT1cblxuaW50ZXJmYWNlIElWaXJ0dWFsV2ViU29ja2V0Q2xpZW50Q29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgSVdhdGNoT3B0aW9ucyB7XG4gIGVudklkPzogc3RyaW5nXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcXVlcnk6IHN0cmluZ1xuICBsaW1pdD86IG51bWJlclxuICBvcmRlckJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBzZW5kOiA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpID0+IFByb21pc2U8VD5cbiAgbG9naW46IChlbnZJZD86IHN0cmluZywgcmVmcmVzaD86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PlxuICBpc1dTQ29ubmVjdGVkOiAoKSA9PiBib29sZWFuXG4gIG9uY2VXU0Nvbm5lY3RlZDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiAoKSA9PiBudW1iZXJcbiAgb25XYXRjaFN0YXJ0OiAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHZvaWRcbiAgb25XYXRjaENsb3NlOiAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHZvaWRcbiAgZGVidWc/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJV2F0Y2hTZXNzaW9uSW5mbyB7XG4gIHF1ZXJ5SUQ6IHN0cmluZ1xuICBjdXJyZW50RXZlbnRJZDogbnVtYmVyXG4gIGN1cnJlbnREb2NzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgZXhwZWN0RXZlbnRJZD86IG51bWJlclxufVxuXG5pbnRlcmZhY2UgSUhhbmRsZUNvbW1vbkVycm9yT3B0aW9ucyB7XG4gIG9uU2lnbkVycm9yOiAoZTogUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcikgPT4gdm9pZFxuICBvblRpbWVvdXRFcnJvcjogKGU6IFRpbWVvdXRFcnJvcikgPT4gdm9pZFxuICBvbkNhbmNlbGxlZEVycm9yOiAoZTogQ2FuY2VsbGVkRXJyb3IpID0+IHZvaWRcbiAgb25Ob3RSZXRyeWFibGVFcnJvcjogKGU6IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IpID0+IHZvaWRcbiAgb25Vbmtub3duRXJyb3I6IChlOiBhbnkpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIElIYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvck9wdGlvbnMge1xuICBvcGVyYXRpb25OYW1lOiAnSU5JVF9XQVRDSCcgfCAnUkVCVUlMRF9XQVRDSCdcbiAgcmVzb2x2ZTogKHZhbHVlPzogUHJvbWlzZUxpa2U8dm9pZD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgcmVqZWN0OiAoZTogYW55KSA9PiB2b2lkXG59XG5cbmVudW0gV2F0Y2hTdGF0dXMge1xuICBMT0dHSU5HSU4gPSAnTE9HR0lOR0lOJyxcbiAgSU5JVElORyA9ICdJTklUSU5HJyxcbiAgUkVCVUlMRElORyA9ICdSRUJVSUxESU5HJyxcbiAgQUNUSVZFID0gJ0FDVElWRScsXG4gIEVSUk9SRUQgPSAnRVJST1JFRCcsXG4gIENMT1NJTkcgPSAnQ0xPU0lORycsXG4gIENMT1NFRCA9ICdDTE9TRUQnLFxuICBQQVVTRUQgPSAnUEFVU0VEJyxcbiAgUkVTVU1JTkcgPSAnUkVTVU1JTkcnXG59XG5cbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FX09OX1VOS05PV05fRVJST1IgPSAxMDBcbmNvbnN0IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IgPSAyXG5jb25zdCBERUZBVUxUX01BWF9TRU5EX0FDS19BVVRPX1JFVFJZX09OX0VSUk9SID0gMlxuY29uc3QgREVGQVVMVF9TRU5EX0FDS19ERUJPVU5DRV9USU1FT1VUID0gMTAgKiAxMDAwXG5jb25zdCBERUZBVUxUX0lOSVRfV0FUQ0hfVElNRU9VVCA9IDEwICogMTAwMFxuY29uc3QgREVGQVVMVF9SRUJVSUxEX1dBVENIX1RJTUVPVVQgPSAxMCAqIDEwMDBcblxuZXhwb3J0IGNsYXNzIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQge1xuICAvLyBwYXNzZWQgb3ZlclxuICB3YXRjaElkOiBzdHJpbmdcbiAgLy8gb3duXG4gIGxpc3RlbmVyOiBSZWFsdGltZUxpc3RlbmVyXG4gIHByaXZhdGUgZW52SWQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4gIHByaXZhdGUgcXVlcnk6IHN0cmluZ1xuICBwcml2YXRlIGxpbWl0OiBudW1iZXJcbiAgcHJpdmF0ZSBvcmRlckJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHByaXZhdGUgc2VuZDogPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKSA9PiBQcm9taXNlPFQ+XG4gIHByaXZhdGUgbG9naW46IChlbnZJZD86IHN0cmluZywgcmVmcmVzaD86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PlxuICBwcml2YXRlIGlzV1NDb25uZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgcHJpdmF0ZSBvbmNlV1NDb25uZWN0ZWQ6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgcHJpdmF0ZSBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiAoKSA9PiBudW1iZXJcbiAgcHJpdmF0ZSBvbldhdGNoU3RhcnQ6IChcbiAgICBjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsXG4gICAgcXVlcnlJRDogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZTogKFxuICAgIGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCxcbiAgICBxdWVyeUlEOiBzdHJpbmdcbiAgKSA9PiB2b2lkXG4gIHByaXZhdGUgZGVidWc/OiBib29sZWFuXG5cbiAgcHJpdmF0ZSB3YXRjaFN0YXR1czogV2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5JTklUSU5HXG4gIHByaXZhdGUgYXZhaWxhYmxlUmV0cmllczogUGFydGlhbDxSZWNvcmQ8SVJlcXVlc3RNc2dUeXBlLCBudW1iZXI+PlxuICBwcml2YXRlIGFja1RpbWVvdXRJZD86IG51bWJlclxuICBwcml2YXRlIGluaXRXYXRjaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgcmVidWlsZFdhdGNoUHJvbWlzZT86IFByb21pc2U8dm9pZD5cblxuICAvLyBvYnRhaW5lZFxuICBwcml2YXRlIHNlc3Npb25JbmZvPzogSVdhdGNoU2Vzc2lvbkluZm9cblxuICAvLyBpbnRlcm5hbFxuICBwcml2YXRlIHdhaXRFeHBlY3RlZFRpbWVvdXRJZD86IG51bWJlclxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElWaXJ0dWFsV2ViU29ja2V0Q2xpZW50Q29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgdGhpcy53YXRjaElkID0gYHdhdGNoaWRfJHsrbmV3IERhdGUoKX1fJHtNYXRoLnJhbmRvbSgpfWBcbiAgICB0aGlzLmVudklkID0gb3B0aW9ucy5lbnZJZFxuICAgIHRoaXMuY29sbGVjdGlvbk5hbWUgPSBvcHRpb25zLmNvbGxlY3Rpb25OYW1lXG4gICAgdGhpcy5xdWVyeSA9IG9wdGlvbnMucXVlcnlcbiAgICB0aGlzLmxpbWl0ID0gb3B0aW9ucy5saW1pdFxuICAgIHRoaXMub3JkZXJCeSA9IG9wdGlvbnMub3JkZXJCeVxuICAgIHRoaXMuc2VuZCA9IG9wdGlvbnMuc2VuZFxuICAgIHRoaXMubG9naW4gPSBvcHRpb25zLmxvZ2luXG4gICAgdGhpcy5pc1dTQ29ubmVjdGVkID0gb3B0aW9ucy5pc1dTQ29ubmVjdGVkXG4gICAgdGhpcy5vbmNlV1NDb25uZWN0ZWQgPSBvcHRpb25zLm9uY2VXU0Nvbm5lY3RlZFxuICAgIHRoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCA9IG9wdGlvbnMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aFxuICAgIHRoaXMub25XYXRjaFN0YXJ0ID0gb3B0aW9ucy5vbldhdGNoU3RhcnRcbiAgICB0aGlzLm9uV2F0Y2hDbG9zZSA9IG9wdGlvbnMub25XYXRjaENsb3NlXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWdcblxuICAgIHRoaXMuYXZhaWxhYmxlUmV0cmllcyA9IHtcbiAgICAgIElOSVRfV0FUQ0g6IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgICBSRUJVSUxEX1dBVENIOiBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SLFxuICAgICAgQ0hFQ0tfTEFTVDogREVGQVVMVF9NQVhfU0VORF9BQ0tfQVVUT19SRVRSWV9PTl9FUlJPUixcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbmVyID0gbmV3IFJlYWx0aW1lTGlzdGVuZXIoe1xuICAgICAgY2xvc2U6IHZvaWQgKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZVdhdGNoKClcbiAgICAgIH0pLFxuICAgICAgb25DaGFuZ2U6IG9wdGlvbnMub25DaGFuZ2UsXG4gICAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgIHZpcnR1YWxDbGllbnQ6IHRoaXMsXG4gICAgfSlcblxuICAgIHRoaXMuaW5pdFdhdGNoKClcbiAgfVxuXG4gIG9uTWVzc2FnZShtc2c6IElSZXNwb25zZU1lc3NhZ2UpIHtcbiAgICAvLyB3YXRjaFN0YXR1cyBzYW5pdHkgY2hlY2tcbiAgICBzd2l0Y2ggKHRoaXMud2F0Y2hTdGF0dXMpIHtcbiAgICAgIGNhc2UgV2F0Y2hTdGF0dXMuUEFVU0VEOiB7XG4gICAgICAgIC8vIGlnbm9yZSBhbGwgYnV0IGVycm9yIG1lc3NhZ2VcbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlICE9PSAnRVJST1InKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgV2F0Y2hTdGF0dXMuTE9HR0lOR0lOOlxuICAgICAgY2FzZSBXYXRjaFN0YXR1cy5JTklUSU5HOlxuICAgICAgY2FzZSBXYXRjaFN0YXR1cy5SRUJVSUxESU5HOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGlsZSAke3RoaXMud2F0Y2hTdGF0dXN9YClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYXNlIFdhdGNoU3RhdHVzLkNMT1NFRDoge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiB1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgd2hlbiB0aGUgd2F0Y2ggaGFzIGNsb3NlZCcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSBXYXRjaFN0YXR1cy5FUlJPUkVEOiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGVuIHRoZSB3YXRjaCBoYXMgZW5kZWQgd2l0aCBlcnJvcicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbm90IGZvdW5kIHdoaWxlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcblxuICAgIHN3aXRjaCAobXNnLm1zZ1R5cGUpIHtcbiAgICAgIGNhc2UgJ05FWFRfRVZFTlQnOiB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIGlmICh3eC5faWdub3JlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgbmV4dGV2ZW50ICR7bXNnLm1zZ0RhdGEuY3VyckV2ZW50fSBpZ25vcmVkYCwgbXNnKVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIHd4Ll9pZ25vcmUgPSBmYWxzZVxuICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMobXNnKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnQ0hFQ0tfRVZFTlQnOiB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkIDwgbXNnLm1zZ0RhdGEuY3VyckV2ZW50KSB7XG4gICAgICAgICAgLy8gY2xpZW50IGV2ZW50SUQgPCBzZXJ2ZXIgZXZlbnRJRDpcbiAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBvbmUgb3IgbW9yZSBwZW5kaW5nIGV2ZW50cyBub3QgeWV0IHJlY2VpdmVkIGJ1dCBzZW50IGJ5IHRoZSBzZXJ2ZXJcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmV4cGVjdEV2ZW50SWQgPSBtc2cubXNnRGF0YS5jdXJyRXZlbnRcbiAgICAgICAgICB0aGlzLmNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLndhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gbXVzdCByZWJ1aWxkIHdhdGNoXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgICAgfSwgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoKCkpXG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSB3YWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoICR7dGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoKCl9YClcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIC8vIHJlY2VpdmUgc2VydmVyIGVycm9yXG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9TRVJWRVJfRVJST1JfTVNHIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGAke21zZy5tc2dEYXRhLmNvZGV9IC0gJHttc2cubXNnRGF0YS5tZXNzYWdlfWAsXG4gICAgICAgIH0pKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gdmlydHVhbCBjbGllbnQgcmVjZWl2ZSB1bmV4cGVjdGVkIG1zZyAke21zZy5tc2dUeXBlfTogYCxcbiAgICAgICAgICBtc2dcbiAgICAgICAgKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsb3NlV2l0aEVycm9yKGVycm9yOiBhbnkpIHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuRVJST1JFRFxuICAgIHRoaXMuY2xlYXJBQ0tTY2hlZHVsZSgpXG4gICAgdGhpcy5saXN0ZW5lci5vbkVycm9yKGVycm9yKVxuICAgIHRoaXMub25XYXRjaENsb3NlKFxuICAgICAgdGhpcyxcbiAgICAgICh0aGlzLnNlc3Npb25JbmZvPy5xdWVyeUlEKSB8fCAnJ1xuICAgIClcblxuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGNsaWVudCBjbG9zZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWApXG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuUEFVU0VEXG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gY2xpZW50IHBhdXNlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAod2F0Y2hJZCAke3RoaXMud2F0Y2hJZH0pYClcbiAgfVxuXG5cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5SRVNVTUlOR1xuXG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gY2xpZW50IHJlc3VtaW5nIHdpdGggJHtcbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPyAnUkVCVUlMRF9XQVRDSCcgOiAnSU5JVF9XQVRDSCdcbiAgICB9ICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICgke3RoaXMud2F0Y2hJZH0pYClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCAodGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMucmVidWlsZFdhdGNoKCkgOiB0aGlzLmluaXRXYXRjaCgpKVxuXG4gICAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBjbGllbnQgc3VjY2Vzc2Z1bGx5IHJlc3VtZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWUgZmFpbGVkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICgke3RoaXMud2F0Y2hJZH0pYCxcbiAgICAgICAgZVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd3NMb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPElMb2dpblJlc3VsdD4gPT4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5MT0dHSU5HSU5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IHRoaXMubG9naW4oZW52SWQsIHJlZnJlc2gpXG4gICAgaWYgKCF0aGlzLmVudklkKSB7XG4gICAgICB0aGlzLmVudklkID0gbG9naW5SZXN1bHQuZW52SWRcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gIH1cblxuICBwcml2YXRlIGluaXRXYXRjaCA9IGFzeW5jIChmb3JjZVJlZnJlc2hMb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5pbml0V2F0Y2hQcm9taXNlICE9PSBudWxsICYmIHRoaXMuaW5pdFdhdGNoUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0V2F0Y2hQcm9taXNlXG4gICAgfVxuXG4gICAgdGhpcy5pbml0V2F0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXYXRjaFN0YXR1cy5QQVVTRUQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZW52SWQgfSA9IGF3YWl0IHRoaXMud3NMb2dpbih0aGlzLmVudklkLCBmb3JjZVJlZnJlc2hMb2dpbilcbiAgICAgICAgICBpZiAoKHRoaXMud2F0Y2hTdGF0dXMgYXMgV2F0Y2hTdGF0dXMpID09PSBXYXRjaFN0YXR1cy5QQVVTRUQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5JTklUSU5HXG5cbiAgICAgICAgICBjb25zdCBpbml0V2F0Y2hNc2c6IElSZXF1ZXN0TWVzc2FnZUluaXRXYXRjaE1zZyA9IHtcbiAgICAgICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgICBtc2dUeXBlOiAnSU5JVF9XQVRDSCcsXG4gICAgICAgICAgICBtc2dEYXRhOiB7XG4gICAgICAgICAgICAgIGVudklkLFxuICAgICAgICAgICAgICBjb2xsTmFtZTogdGhpcy5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgcXVlcnk6IHRoaXMucXVlcnksXG4gICAgICAgICAgICAgIGxpbWl0OiB0aGlzLmxpbWl0LFxuICAgICAgICAgICAgICBvcmRlckJ5OiB0aGlzLm9yZGVyQnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluaXRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnPih7XG4gICAgICAgICAgICBtc2c6IGluaXRXYXRjaE1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX0lOSVRfV0FUQ0hfVElNRU9VVCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgeyBldmVudHMsIGN1cnJFdmVudCB9ID0gaW5pdEV2ZW50TXNnLm1zZ0RhdGFcblxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPSB7XG4gICAgICAgICAgICBxdWVyeUlEOiBpbml0RXZlbnRNc2cubXNnRGF0YS5xdWVyeUlELFxuICAgICAgICAgICAgY3VycmVudEV2ZW50SWQ6IGN1cnJFdmVudCAtIDEsXG4gICAgICAgICAgICBjdXJyZW50RG9jczogW10sXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRklYOiBpbiBpbml0RXZlbnQgbWVzc2FnZSwgYWxsIGV2ZW50cyBoYXZlIGlkIDAsIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIGN1cnJFdmVudFxuICAgICAgICAgIGlmIChldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgICAgICAgICAgICBlLklEID0gY3VyckV2ZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhpbml0RXZlbnRNc2cpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPSBjdXJyRXZlbnRcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KHtcbiAgICAgICAgICAgICAgaWQ6IGN1cnJFdmVudCxcbiAgICAgICAgICAgICAgZG9jQ2hhbmdlczogW10sXG4gICAgICAgICAgICAgIGRvY3M6IFtdLFxuICAgICAgICAgICAgICB0eXBlOiAnaW5pdCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vbkNoYW5nZShzbmFwc2hvdClcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbldhdGNoU3RhcnQodGhpcywgdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEKVxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5BQ1RJVkVcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVJldHJpZXMuSU5JVF9XQVRDSCA9IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1JcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3IoZSwge1xuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ0lOSVRfV0FUQ0gnLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgfSlcblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRXYXRjaFByb21pc2VcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5pdFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBpbml0V2F0Y2ggJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWApXG4gIH1cblxuICBwcml2YXRlIHJlYnVpbGRXYXRjaCA9IGFzeW5jIChmb3JjZVJlZnJlc2hMb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5yZWJ1aWxkV2F0Y2hQcm9taXNlICE9PSBudWxsICYmIHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkV2F0Y2hQcm9taXNlXG4gICAgfVxuXG4gICAgdGhpcy5yZWJ1aWxkV2F0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXYXRjaFN0YXR1cy5QQVVTRUQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7IGVudklkIH0gPSBhd2FpdCB0aGlzLndzTG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pXG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCByZWJ1aWxkV2F0Y2ggd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKScpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdhdGNoU3RhdHVzKSA9PT0gV2F0Y2hTdGF0dXMuUEFVU0VEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuUkVCVUlMRElOR1xuXG4gICAgICAgICAgY29uc3QgcmVidWlsZFdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VSZWJ1aWxkV2F0Y2hNc2cgPSB7XG4gICAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgICAgbXNnVHlwZTogJ1JFQlVJTERfV0FUQ0gnLFxuICAgICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgICAgY29sbE5hbWU6IHRoaXMuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHF1ZXJ5SUQ6IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCxcbiAgICAgICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV4dEV2ZW50TXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2c+KHtcbiAgICAgICAgICAgIG1zZzogcmVidWlsZFdhdGNoTXNnLFxuICAgICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX1JFQlVJTERfV0FUQ0hfVElNRU9VVCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMobmV4dEV2ZW50TXNnKVxuXG4gICAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLkFDVElWRVxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUmV0cmllcy5SRUJVSUxEX1dBVENIID0gREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUlxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvcihlLCB7XG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUkVCVUlMRF9XQVRDSCcsXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pKClcbiAgICB9KVxuXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZVxuICAgICAgc3VjY2VzcyA9IHRydWVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZWJ1aWxkV2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gcmVidWlsZFdhdGNoICR7c3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdmYWlsJ31gKVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvciA9IGFzeW5jIChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9uc1xuICApID0+IHtcbiAgICBjb25zdCBpc0luaXRXYXRjaCA9IG9wdGlvbnMub3BlcmF0aW9uTmFtZSA9PT0gJ0lOSVRfV0FUQ0gnXG5cbiAgICBjb25zdCBhYm9ydFdhdGNoID0gKCkgPT4ge1xuICAgICAgLy8gbW9jayB0ZW1wIGNvbW1lbnRcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICBlcnJDb2RlOiBpc0luaXRXYXRjaFxuICAgICAgICAgID8gKEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9JTklUX1dBVENIX0ZBSUwgYXMgc3RyaW5nKVxuICAgICAgICAgIDogKEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUJVSUxEX1dBVENIX0ZBSUwgYXMgc3RyaW5nKSxcbiAgICAgICAgZXJyTXNnOiBlLFxuICAgICAgfSkpXG4gICAgICBvcHRpb25zLnJlamVjdChlKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5ID0gKHJlZnJlc2hMb2dpbj86IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZVJldHJ5VGlja2V0KG9wdGlvbnMub3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgaWYgKGlzSW5pdFdhdGNoKSB7XG4gICAgICAgICAgdGhpcy5pbml0V2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgICAgb3B0aW9ucy5yZXNvbHZlKHRoaXMuaW5pdFdhdGNoKHJlZnJlc2hMb2dpbikpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkV2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgICAgb3B0aW9ucy5yZXNvbHZlKHRoaXMucmVidWlsZFdhdGNoKHJlZnJlc2hMb2dpbikpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFib3J0V2F0Y2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlQ29tbW9uRXJyb3IoZSwge1xuICAgICAgb25TaWduRXJyb3I6ICgpID0+IHJldHJ5KHRydWUpLFxuICAgICAgb25UaW1lb3V0RXJyb3I6ICgpID0+IHJldHJ5KGZhbHNlKSxcbiAgICAgIG9uTm90UmV0cnlhYmxlRXJyb3I6IGFib3J0V2F0Y2gsXG4gICAgICBvbkNhbmNlbGxlZEVycm9yOiBvcHRpb25zLnJlamVjdCxcbiAgICAgIG9uVW5rbm93bkVycm9yOiAoKSA9PiB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG9uV1NEaXNjb25uZWN0ZWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uY2VXU0Nvbm5lY3RlZCgpXG4gICAgICAgICAgICAgIHJldHJ5KHRydWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgYXdhaXQgb25XU0Rpc2Nvbm5lY3RlZCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBzbGVlcChERUZBVUxUX1dBSVRfVElNRV9PTl9VTktOT1dOX0VSUk9SKVxuICAgICAgICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV2F0Y2hTdGF0dXMuUEFVU0VEKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FuY2VsXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZWplY3QobmV3IENhbmNlbGxlZEVycm9yKGAke29wdGlvbnMub3BlcmF0aW9uTmFtZX0gY2FuY2VsbGVkIGR1ZSB0byBwYXVzZSBhZnRlciB1bmtub3duRXJyb3JgKSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvbldTRGlzY29ubmVjdGVkKClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXRyeShmYWxzZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgaGFuZGxpbmcgZXJyb3IsIGluIG9yZGVyIHRvIHByb3ZpZGUgbWF4aW11bSBlZmZvcnQgb24gU0VBTUlOR0xFU1MgRkFVTFQgVE9MRVJBTkNFLCBqdXN0IHJldHJ5XG4gICAgICAgICAgICByZXRyeSh0cnVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVdhdGNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5SWQgPSB0aGlzLnNlc3Npb25JbmZvID8gdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEIDogJydcblxuICAgIGlmICh0aGlzLndhdGNoU3RhdHVzICE9PSBXYXRjaFN0YXR1cy5BQ1RJVkUpIHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5DTE9TRURcbiAgICAgIHRoaXMub25XYXRjaENsb3NlKHRoaXMsIHF1ZXJ5SWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLkNMT1NJTkdcblxuICAgICAgY29uc3QgY2xvc2VXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlQ2xvc2VXYXRjaE1zZyA9IHtcbiAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICBtc2dUeXBlOiAnQ0xPU0VfV0FUQ0gnLFxuICAgICAgICBtc2dEYXRhOiBudWxsLFxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgICBtc2c6IGNsb3NlV2F0Y2hNc2csXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNlc3Npb25JbmZvID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuQ0xPU0VEXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DTE9TRV9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgZXJyTXNnOiBlLFxuICAgICAgfSkpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub25XYXRjaENsb3NlKHRoaXMsIHF1ZXJ5SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVNlbmRBQ0sgPSAoKSA9PiB7XG4gICAgdGhpcy5jbGVhckFDS1NjaGVkdWxlKClcblxuICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBzdGF0dXMgYWZ0ZXIgdGltZW91dFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmFja1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMud2FpdEV4cGVjdGVkVGltZW91dElkKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZEFDSygpXG4gICAgICB9XG4gICAgfSwgREVGQVVMVF9TRU5EX0FDS19ERUJPVU5DRV9USU1FT1VUKVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckFDS1NjaGVkdWxlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmFja1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYWNrVGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZEFDSyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgIT09IFdhdGNoU3RhdHVzLkFDVElWRSkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGNhbiBub3Qgc2VuZCBhY2sgd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2tNc2c6IElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyA9IHtcbiAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICBtc2dUeXBlOiAnQ0hFQ0tfTEFTVCcsXG4gICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICBxdWVyeUlEOiB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQsXG4gICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCxcbiAgICAgICAgfSxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBhY2tNc2csXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVE9ETzogcmVmYWN0b3JcbiAgICAgIGlmIChpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IoZSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZS5wYXlsb2FkXG4gICAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAgIC8vIHNpZ25hdHVyZSBlcnJvciAtPiByZXRyeSB3aXRoIHJlZnJlc2hlZCBzaWduYXR1cmVcbiAgICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU0lHTl9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gb3RoZXIgLT4gdGhyb3dcbiAgICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NZU19FUlInOlxuICAgICAgICAgIGNhc2UgJ0lOVkFMSUlEX0VOVic6XG4gICAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICAgIC8vIG11c3QgdGhyb3dcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0hFQ0tfTEFTVF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZXJyTXNnOiBtc2cubXNnRGF0YS5jb2RlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbWF5YmUgcmV0cnlhYmxlXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUXG4gICAgICAgICYmIHRoaXMuYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUID4gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUIC09IDFcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX0NIRUNLX0xBU1RfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgZXJyTXNnOiBlLFxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbW1vbkVycm9yID0gKFxuICAgIGU6IGFueSxcbiAgICBvcHRpb25zOiBJSGFuZGxlQ29tbW9uRXJyb3JPcHRpb25zXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IoZSkpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGUucGF5bG9hZFxuICAgICAgc3dpdGNoIChtc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgIC8vIHNpZ25hdHVyZSBlcnJvciAtPiByZXRyeSB3aXRoIHJlZnJlc2hlZCBzaWduYXR1cmVcbiAgICAgICAgY2FzZSAnQ0hFQ0tfTE9HSU5fRkFJTEVEJzpcbiAgICAgICAgY2FzZSAnU0lHTl9FWFBJUkVEX0VSUk9SJzpcbiAgICAgICAgY2FzZSAnU0lHTl9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgY2FzZSAnU0lHTl9QQVJBTV9JTlZBTElEJzoge1xuICAgICAgICAgIG9wdGlvbnMub25TaWduRXJyb3IoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBub3QtcmV0cnlhYmxlIGVycm9yIC0+IHRocm93XG4gICAgICAgIGNhc2UgJ1FVRVJZSURfSU5WQUxJRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NZU19FUlInOlxuICAgICAgICBjYXNlICdJTlZBTElJRF9FTlYnOlxuICAgICAgICBjYXNlICdDT0xMRUNUSU9OX1BFUk1JU1NJT05fREVOSUVEJzoge1xuICAgICAgICAgIG9wdGlvbnMub25Ob3RSZXRyeWFibGVFcnJvcihlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBvcHRpb25zLm9uTm90UmV0cnlhYmxlRXJyb3IoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNUaW1lb3V0RXJyb3IoZSkpIHtcbiAgICAgIC8vIHRpbWVvdXQgZXJyb3JcbiAgICAgIG9wdGlvbnMub25UaW1lb3V0RXJyb3IoZSlcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAoaXNDYW5jZWxsZWRFcnJvcihlKSkge1xuICAgICAgLy8gY2FuY2VsbGVkIGVycm9yXG4gICAgICBvcHRpb25zLm9uQ2FuY2VsbGVkRXJyb3IoZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHVua25vd24gZXJyb3JcbiAgICBvcHRpb25zLm9uVW5rbm93bkVycm9yKGUpXG4gIH1cblxuICAvLyBjcmVkaXQgYSByZXRyeSBjaGFuY2UgZnJvbSBhdmFpbGFibGVSZXRyaWVzXG4gIHByaXZhdGUgdXNlUmV0cnlUaWNrZXQob3BlcmF0aW9uTmFtZTogSVJlcXVlc3RNc2dUeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdXG4gICAgICAmJiB0aGlzLmF2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0hID4gMFxuICAgICkge1xuICAgICAgdGhpcy5hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdISAtPSAxXG4gICAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSAke29wZXJhdGlvbk5hbWV9IHVzZSBhIHJldHJ5IHRpY2tldCwgbm93IG9ubHkgJHt0aGlzLmF2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV19IHJldHJ5IGxlZnRgKVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VydmVyRXZlbnRzKG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2cpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHNJbnRlcm5lbChtc2cpXG4gICAgICB0aGlzLnBvc3RIYW5kbGVTZXJ2ZXJFdmVudHNWYWxpZGl0eUNoZWNrKG1zZylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogaGFuZGxlIHNlcnZlciBldmVudHMgZmFpbGVkIHdpdGggZXJyb3I6ICcsXG4gICAgICAgIGVcbiAgICAgIClcbiAgICAgIHRocm93IGVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlcnZlckV2ZW50c0ludGVybmVsKG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2cpIHtcbiAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbXNnXG5cbiAgICBjb25zdCB7IGV2ZW50cyB9ID0gbXNnLm1zZ0RhdGFcbiAgICBjb25zdCB7IG1zZ1R5cGUgfSA9IG1zZ1xuXG4gICAgaWYgKCFldmVudHMubGVuZ3RoIHx8ICF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb25JbmZvIH0gPSB0aGlzXG5cbiAgICBsZXQgYWxsQ2hhbmdlRXZlbnRzOiBJU2luZ2xlREJFdmVudFtdXG4gICAgdHJ5IHtcbiAgICAgIGFsbENoYW5nZUV2ZW50cyA9IGV2ZW50cy5tYXAoZ2V0UHVibGljRXZlbnQpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUNFSVZFX0lOVkFMSURfU0VSVkVSX0RBVEEgYXMgc3RyaW5nLFxuICAgICAgICBlcnJNc2c6IGUsXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGFnZ3JlZ2F0ZSBkb2NzXG4gICAgbGV0IGRvY3MgPSBbLi4uc2Vzc2lvbkluZm8uY3VycmVudERvY3NdXG4gICAgbGV0IGluaXRFbmNvdW50ZXJlZCA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFsbENoYW5nZUV2ZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgY2hhbmdlID0gYWxsQ2hhbmdlRXZlbnRzW2ldXG5cbiAgICAgIGlmIChzZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA+PSBjaGFuZ2UuaWQpIHtcbiAgICAgICAgaWYgKCFhbGxDaGFuZ2VFdmVudHNbaSAtIDFdIHx8IGNoYW5nZS5pZCA+IGFsbENoYW5nZUV2ZW50c1tpIC0gMV0uaWQpIHtcbiAgICAgICAgICAvLyBkdXBsaWNhdGUgZXZlbnQsIGRyb3BhYmxlXG4gICAgICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIGR1cGxpY2F0ZSBldmVudCByZWNlaXZlZCwgY3VyICR7c2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWR9IGJ1dCBnb3QgJHtjaGFuZ2UuaWR9YClcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxsQ2hhbmdlRXZlbnRzIHNob3VsZCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIGV2ZW50SWQsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbnMsIG11c3QgcmVwb3J0IGEgbm9uLWZhdGFsIGVycm9yXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW3JlYWx0aW1lIGxpc3RlbmVyXSBzZXJ2ZXIgbm9uLWZhdGFsIGVycm9yOiBldmVudHMgb3V0IG9mIG9yZGVyICh0aGUgbGF0dGVyIGV2ZW50J3MgaWQgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZvcm1lcikgKHJlcXVlc3RJZCAke3JlcXVlc3RJZH0pYClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA9PT0gY2hhbmdlLmlkIC0gMSkge1xuICAgICAgICAvLyBjb3JyZWN0IHNlcXVlbmNlXG4gICAgICAgIC8vIGZpcnN0IGhhbmRsZSBkYXRhVHlwZSB0aGVuIHF1ZXVlVHlwZTpcbiAgICAgICAgLy8gMS4gZGF0YVR5cGU6IHdlIE9OTFkgcG9wdWxhdGUgY2hhbmdlLmRvYyBpZiBuZWNjZXNzYXJ5XG4gICAgICAgIC8vIDIuIHF1ZXVlVHlwZTogd2UgYnVpbGQgdGhlIGRhdGEgc25hcHNob3RcblxuICAgICAgICBzd2l0Y2ggKGNoYW5nZS5kYXRhVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6IHtcbiAgICAgICAgICAgIC8vIG9ubHkgbmVlZCB0byBwb3B1bGF0ZSBjaGFuZ2UuZG9jIHdoZW4gaXQgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndXBkYXRlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxEb2MgPSBkb2NzLmZpbmQoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERvYykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHBhcnRpYWwgdXBkYXRlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGNsb25lRGVlcChsb2NhbERvYylcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnVwZGF0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2UudXBkYXRlZEZpZWxkcykuZm9yRWFjaCgoZmllbGRQYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQoZG9jLCBmaWVsZFBhdGgsIGNoYW5nZS51cGRhdGVkRmllbGRzW2ZpZWxkUGF0aF0pXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UucmVtb3ZlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRQYXRoIG9mIGNoYW5nZS5yZW1vdmVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNldChkb2MsIGZpZWxkUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgdXBkYXRlIGRhdGFUeXBlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwidXBkYXRlXCIgYW5kIHF1ZXVlVHlwZT1cImVucXVldWVcIiAocmVxdWVzdElkICR7bXNnLnJlcXVlc3RJZH0pYCxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgIHRocm93IGVyclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVwbGFjZSc6IHtcbiAgICAgICAgICAgIC8vIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJyZXBsYWNlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWAsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKVxuICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcmVtb3ZlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdsaW1pdCc6IHtcbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2NcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBsaW1pdCBkYXRhVHlwZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5xdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIC8vIGRvYyBpcyBwcm92aWRlZCBieSBzZXJ2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiBgSGFuZGxlU2VydmVyRXZlbnRzOiBmdWxsIGRvYyBpcyBub3QgcHJvdmlkZWQgd2l0aCBkYXRhVHlwZT1cImxpbWl0XCIgYW5kIHF1ZXVlVHlwZT1cImVucXVldWVcIiAocmVxdWVzdElkICR7bXNnLnJlcXVlc3RJZH0pYCxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgIHRocm93IGVyclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdpbml0Jzoge1xuICAgICAgICAgICAgaWYgKCFpbml0RW5jb3VudGVyZWQpIHtcbiAgICAgICAgICAgICAgaW5pdEVuY291bnRlcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBkb2NzID0gW2NoYW5nZS5kb2NdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkb2NzLnB1c2goY2hhbmdlLmRvYylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICBkb2NzLnB1c2goY2hhbmdlLmRvYylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2RlcXVldWUnOiB7XG4gICAgICAgICAgICBjb25zdCBpbmQgPSBkb2NzLmZpbmRJbmRleChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgaWYgKGluZCA+IC0xKSB7XG4gICAgICAgICAgICAgIGRvY3Muc3BsaWNlKGluZCwgMSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBkZXF1ZXVlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1cGRhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBpbmQgPSBkb2NzLmZpbmRJbmRleChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgaWYgKGluZCA+IC0xKSB7XG4gICAgICAgICAgICAgIGRvY3NbaW5kXSA9IGNoYW5nZS5kb2NcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBxdWV1ZVR5cGUgdXBkYXRlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpID09PSBsZW4gLSAxXG4gICAgICAgICAgfHwgKGFsbENoYW5nZUV2ZW50c1tpICsgMV0gJiYgYWxsQ2hhbmdlRXZlbnRzW2kgKyAxXS5pZCAhPT0gY2hhbmdlLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBhIHNoYWxsb3cgc2xpY2UgY3JlYXRlcyBhIHNoYWxsb3cgc25hcHNob3RcbiAgICAgICAgICBjb25zdCBkb2NzU25hcHNob3QgPSBbLi4uZG9jc11cblxuICAgICAgICAgIC8vIHdlIHNsaWNlIGZpcnN0IGNhdXNlJyBpZiB0aGVyZSdyZSBhbGxDaGFuZ2VFdmVudHMgdGhhdCBhcmUgb2YgdGhlIHNhbWUgaWQgYWZ0ZXIgdGhpcyBjaGFuZ2UsIHdlIGRvbid0IHdhbnQgdG8gaW52b2x2ZSBpdCBmb3IgaXQgaXMgdW5leHBlY3RlZCBpbnZhbGlkIG9yZGVyXG4gICAgICAgICAgY29uc3QgZG9jQ2hhbmdlcyA9IGFsbENoYW5nZUV2ZW50c1xuICAgICAgICAgICAgLnNsaWNlKDAsIGkgKyAxKVxuICAgICAgICAgICAgLmZpbHRlcihjID0+IGMuaWQgPT09IGNoYW5nZS5pZClcblxuICAgICAgICAgIC8vIGFsbCBjaGFuZ2VzIG9mIHRoaXMgZXZlbnQgaGFzIGJlZW4gaGFuZGxlLCB3ZSBjb3VsZCBkaXNwYXRjaCB0aGUgZXZlbnQgbm93XG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA9IGNoYW5nZS5pZFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudERvY3MgPSBkb2NzXG5cbiAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBTbmFwc2hvdCh7XG4gICAgICAgICAgICBpZDogY2hhbmdlLmlkLFxuICAgICAgICAgICAgZG9jQ2hhbmdlcyxcbiAgICAgICAgICAgIGRvY3M6IGRvY3NTbmFwc2hvdCxcbiAgICAgICAgICAgIG1zZ1R5cGUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMubGlzdGVuZXIub25DaGFuZ2Uoc25hcHNob3QpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG91dC1vZi1vcmRlciBldmVudFxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICAgIGNvbnNvbGUud2FybihgW3JlYWx0aW1lIGxpc3RlbmVyXSBldmVudCByZWNlaXZlZCBpcyBvdXQgb2Ygb3JkZXIsIGN1ciAke3RoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWR9IGJ1dCBnb3QgJHtjaGFuZ2UuaWR9YClcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyByZWJ1aWxkIHdhdGNoXG4gICAgICAgIGF3YWl0IHRoaXMucmVidWlsZFdhdGNoKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3N0SGFuZGxlU2VydmVyRXZlbnRzVmFsaWRpdHlDaGVjayhtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbG9zdCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZFxuICAgICAgJiYgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA+PSB0aGlzLnNlc3Npb25JbmZvLmV4cGVjdEV2ZW50SWRcbiAgICApIHtcbiAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGNsaWVudCBldmVudElkIGRvZXMgbm90IG1hdGNoIHdpdGggc2VydmVyIGV2ZW50IGlkIGFmdGVyIHNlcnZlciBldmVudCBoYW5kbGluZycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMud2FpdEV4cGVjdGVkVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy53YWl0RXhwZWN0ZWRUaW1lb3V0SWQpXG4gICAgICB0aGlzLndhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQdWJsaWNFdmVudChldmVudDogSURCRXZlbnQpOiBJU2luZ2xlREJFdmVudCB7XG4gIGNvbnN0IGU6IElTaW5nbGVEQkV2ZW50ID0ge1xuICAgIGlkOiBldmVudC5JRCxcbiAgICBkYXRhVHlwZTogZXZlbnQuRGF0YVR5cGUsXG4gICAgcXVldWVUeXBlOiBldmVudC5RdWV1ZVR5cGUsXG4gICAgZG9jSWQ6IGV2ZW50LkRvY0lELFxuICAgIGRvYzogZXZlbnQuRG9jICYmIGV2ZW50LkRvYyAhPT0gJ3t9JyA/IEpTT04ucGFyc2UoZXZlbnQuRG9jKSA6IHVuZGVmaW5lZCxcbiAgfVxuXG4gIGlmIChldmVudC5EYXRhVHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGV2ZW50LlVwZGF0ZWRGaWVsZHMpIHtcbiAgICAgIGUudXBkYXRlZEZpZWxkcyA9IEpTT04ucGFyc2UoZXZlbnQuVXBkYXRlZEZpZWxkcylcbiAgICB9XG4gICAgLy8gVE9ETzogd2FpdCBmb3IgdGNiIHRvIGNoYW5nZSByZW1vdmVkRmllbGRzIHRvIFJlbW92ZWRGaWVsZHNcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGV2ZW50LnJlbW92ZWRGaWVsZHMgfHwgZXZlbnQuUmVtb3ZlZEZpZWxkcykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgLy8gZS5yZW1vdmVkRmllbGRzID0gZXZlbnQucmVtb3ZlZEZpZWxkc1xuICAgICAgLy8gICA/IEpTT04ucGFyc2UoZXZlbnQucmVtb3ZlZEZpZWxkcylcbiAgICAgIC8vICAgOiBKU09OLnBhcnNlKGV2ZW50LlJlbW92ZWRGaWVsZHMpXG4gICAgICBlLnJlbW92ZWRGaWVsZHMgPSBKU09OLnBhcnNlKGV2ZW50LnJlbW92ZWRGaWVsZHMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVcbn1cbiJdfQ==
|