tas-uell-sdk 0.0.5 → 0.1.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.
Files changed (32) hide show
  1. package/README.md +161 -51
  2. package/esm2020/lib/components/tas-avatar/tas-avatar.component.mjs +75 -0
  3. package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +146 -61
  4. package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +48 -23
  5. package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +109 -0
  6. package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +217 -20
  7. package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +226 -160
  8. package/esm2020/lib/config/tas.config.mjs +1 -1
  9. package/esm2020/lib/interfaces/tas.interfaces.mjs +45 -2
  10. package/esm2020/lib/services/geolocation.service.mjs +56 -0
  11. package/esm2020/lib/services/tas.service.mjs +400 -34
  12. package/esm2020/lib/tas-uell-sdk.module.mjs +25 -21
  13. package/esm2020/public-api.mjs +4 -1
  14. package/fesm2015/tas-uell-sdk.mjs +1323 -302
  15. package/fesm2015/tas-uell-sdk.mjs.map +1 -1
  16. package/fesm2020/tas-uell-sdk.mjs +1307 -300
  17. package/fesm2020/tas-uell-sdk.mjs.map +1 -1
  18. package/lib/components/tas-avatar/tas-avatar.component.d.ts +9 -0
  19. package/lib/components/tas-btn/tas-btn.component.d.ts +35 -15
  20. package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -1
  21. package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +33 -0
  22. package/lib/components/tas-videocall/tas-videocall.component.d.ts +49 -3
  23. package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +50 -35
  24. package/lib/config/tas.config.d.ts +7 -0
  25. package/lib/interfaces/tas.interfaces.d.ts +127 -35
  26. package/lib/services/geolocation.service.d.ts +24 -0
  27. package/lib/services/tas.service.d.ts +98 -9
  28. package/lib/tas-uell-sdk.module.d.ts +6 -3
  29. package/package.json +1 -1
  30. package/public-api.d.ts +3 -0
  31. package/src/lib/styles/tas-global.scss +27 -28
  32. package/INSTALL_AND_TEST.md +0 -427
@@ -1,12 +1,12 @@
1
- import { Injectable, Inject } from "@angular/core";
2
- import { BehaviorSubject } from "rxjs";
3
- import { catchError, map } from "rxjs/operators";
4
- import * as OT from "@opentok/client";
5
- import { CallState, ViewMode, } from "../interfaces/tas.interfaces";
6
- import { TAS_CONFIG, TAS_HTTP_CLIENT } from "../config/tas.config";
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { catchError, map } from 'rxjs/operators';
4
+ import * as OT from '@opentok/client';
5
+ import { UserCallAction, RoomUserStatus, TasBusinessRole, TasUserRole, CallState, ViewMode, } from '../interfaces/tas.interfaces';
6
+ import { TAS_CONFIG, TAS_HTTP_CLIENT, } from '../config/tas.config';
7
7
  import * as i0 from "@angular/core";
8
8
  // Re-export enums for backward compatibility
9
- export { CallState, ViewMode };
9
+ export { CallState, ViewMode, TasBusinessRole, UserCallAction, RoomUserStatus };
10
10
  export class TasService {
11
11
  constructor(httpClient, config) {
12
12
  this.httpClient = httpClient;
@@ -23,6 +23,86 @@ export class TasService {
23
23
  // Session info for PiP mode restoration
24
24
  this.currentSessionId = null;
25
25
  this.currentToken = null;
26
+ this.STORAGE_KEY = 'tas_session_state';
27
+ this.DISCONNECTED_FLAG_KEY = 'tas_session_disconnected';
28
+ this.isFinishingSession = false;
29
+ // Proxy-video circuit state
30
+ this.proxyVideoSessionId = null;
31
+ this.proxyVideoToken = null;
32
+ this.currentBusinessRole = TasBusinessRole.USER;
33
+ // Waiting room and status polling
34
+ this.waitingRoomUsersSubject = new BehaviorSubject([]);
35
+ this.waitingRoomUsers$ = this.waitingRoomUsersSubject.asObservable();
36
+ this.ownerHasJoinedSubject = new BehaviorSubject(false);
37
+ this.ownerHasJoined$ = this.ownerHasJoinedSubject.asObservable();
38
+ // Observable that emits true when owner was present but then left
39
+ this.ownerHasLeftSubject = new BehaviorSubject(false);
40
+ this.ownerHasLeft$ = this.ownerHasLeftSubject.asObservable();
41
+ this.joinableSubject = new BehaviorSubject(false);
42
+ this.joinable$ = this.joinableSubject.asObservable();
43
+ // Observable for when backend requests geolocation activation
44
+ this.activateGeoSubject = new BehaviorSubject(false);
45
+ this.activateGeo$ = this.activateGeoSubject.asObservable();
46
+ // Observable for when geo request is active (owner waiting for user response)
47
+ this.geoRequestActiveSubject = new BehaviorSubject(false);
48
+ this.geoRequestActive$ = this.geoRequestActiveSubject.asObservable();
49
+ // Observable for when all geo has been granted
50
+ this.allGeoGrantedSubject = new BehaviorSubject(false);
51
+ this.allGeoGranted$ = this.allGeoGrantedSubject.asObservable();
52
+ this.statusPollingInterval = null;
53
+ this.DEFAULT_POLL_INTERVAL_MS = 30000; // Default 30s
54
+ this.wasOwnerPresent = false;
55
+ // Current call context
56
+ this.currentAppointmentId = null;
57
+ this.currentVideoCallId = null;
58
+ this.currentTenant = null;
59
+ }
60
+ // ... (Getters and other methods remain unchanged)
61
+ /**
62
+ * Start automatic status polling for the current session.
63
+ * Status is polled every intervalMs (default 30s).
64
+ */
65
+ startStatusPolling(params, intervalMs = this.DEFAULT_POLL_INTERVAL_MS) {
66
+ this.stopStatusPolling(); // Clear any existing polling
67
+ // Store context for polling
68
+ if (params.sessionId) {
69
+ this.currentSessionId = params.sessionId;
70
+ }
71
+ if (params.appointmentId) {
72
+ this.currentAppointmentId = params.appointmentId;
73
+ }
74
+ if (params.tenant) {
75
+ this.currentTenant = params.tenant;
76
+ }
77
+ console.log(`[TAS DEBUG] Starting status polling with interval ${intervalMs}ms`);
78
+ // Initial status fetch
79
+ this.fetchAndProcessStatus(params);
80
+ // Set up periodic polling
81
+ this.statusPollingInterval = setInterval(() => {
82
+ this.fetchAndProcessStatus(params);
83
+ }, intervalMs);
84
+ }
85
+ /**
86
+ * Stop automatic status polling.
87
+ */
88
+ stopStatusPolling() {
89
+ if (this.statusPollingInterval) {
90
+ clearInterval(this.statusPollingInterval);
91
+ this.statusPollingInterval = null;
92
+ }
93
+ // Do NOT reset waiting room state here, as other components might observe it
94
+ }
95
+ /**
96
+ * Reset polling state (waiting room, owner status, etc)
97
+ * Call this when completely exiting the flow
98
+ */
99
+ resetPollingState() {
100
+ this.stopStatusPolling();
101
+ this.waitingRoomUsersSubject.next([]);
102
+ this.ownerHasJoinedSubject.next(false);
103
+ this.ownerHasLeftSubject.next(false);
104
+ this.joinableSubject.next(false);
105
+ this.wasOwnerPresent = false;
26
106
  }
27
107
  // Getters
28
108
  get currentSession() {
@@ -40,18 +120,36 @@ export class TasService {
40
120
  get token() {
41
121
  return this.currentToken;
42
122
  }
123
+ get proxySessionId() {
124
+ return this.proxyVideoSessionId;
125
+ }
126
+ get proxyToken() {
127
+ return this.proxyVideoToken;
128
+ }
129
+ get businessRole() {
130
+ return this.currentBusinessRole;
131
+ }
43
132
  get isMuted() {
44
133
  return this.isMutedSubject.getValue();
45
134
  }
46
135
  // View Mode Methods
47
136
  setViewMode(mode) {
48
137
  this.viewModeSubject.next(mode);
138
+ if (this.currentSessionId && this.currentToken) {
139
+ this.saveSessionState(this.currentSessionId, this.currentToken, mode, this.currentBusinessRole);
140
+ }
49
141
  }
50
142
  enterPipMode() {
51
143
  this.viewModeSubject.next(ViewMode.PIP);
144
+ if (this.currentSessionId && this.currentToken) {
145
+ this.saveSessionState(this.currentSessionId, this.currentToken, ViewMode.PIP, this.currentBusinessRole);
146
+ }
52
147
  }
53
148
  exitPipMode() {
54
149
  this.viewModeSubject.next(ViewMode.FULLSCREEN);
150
+ if (this.currentSessionId && this.currentToken) {
151
+ this.saveSessionState(this.currentSessionId, this.currentToken, ViewMode.FULLSCREEN, this.currentBusinessRole);
152
+ }
55
153
  }
56
154
  isPipMode() {
57
155
  return this.viewModeSubject.getValue() === ViewMode.PIP;
@@ -78,7 +176,17 @@ export class TasService {
78
176
  }
79
177
  }
80
178
  // Session Management
81
- disconnectSession() {
179
+ disconnectSession(clearStorage = true) {
180
+ console.log('[TAS DEBUG] TasService.disconnectSession called. clearStorage:', clearStorage);
181
+ // Call finishSession before disconnecting if we have a sessionId
182
+ const sessionIdToFinish = this.currentSessionId;
183
+ // Clear storage FIRST to prevent any race conditions where state might be saved after disconnect
184
+ if (clearStorage) {
185
+ this.clearSessionState();
186
+ // Set a flag to indicate this session was intentionally disconnected
187
+ // This prevents reconnection on page reload
188
+ sessionStorage.setItem(this.DISCONNECTED_FLAG_KEY, 'true');
189
+ }
82
190
  if (this.session) {
83
191
  this.session.disconnect();
84
192
  this.session = null;
@@ -87,49 +195,288 @@ export class TasService {
87
195
  this.subscribers = [];
88
196
  this.currentSessionId = null;
89
197
  this.currentToken = null;
198
+ this.proxyVideoSessionId = null;
199
+ this.proxyVideoToken = null;
90
200
  this.isMutedSubject.next(false); // Reset mute state
91
201
  this.viewModeSubject.next(ViewMode.FULLSCREEN);
92
202
  this.callStateSubject.next(CallState.DISCONNECTED);
203
+ // Call proxy finish after disconnecting (only if not already finishing)
204
+ if (sessionIdToFinish && !this.isFinishingSession) {
205
+ this.isFinishingSession = true;
206
+ this.finishProxyVideoSession({
207
+ sessionId: sessionIdToFinish,
208
+ businessRole: this.currentBusinessRole,
209
+ }).subscribe({
210
+ next: (response) => {
211
+ console.log('[TAS DEBUG] Session finished successfully:', response);
212
+ this.isFinishingSession = false;
213
+ },
214
+ error: (error) => {
215
+ console.error('[TAS DEBUG] Error finishing session:', error);
216
+ this.isFinishingSession = false;
217
+ },
218
+ });
219
+ }
93
220
  }
94
221
  isCallActive() {
95
222
  return this.callStateSubject.getValue() === CallState.CONNECTED;
96
223
  }
224
+ // State Persistence
225
+ saveSessionState(sessionId, token, viewMode, businessRole = TasBusinessRole.USER) {
226
+ const state = {
227
+ sessionId,
228
+ token,
229
+ viewMode,
230
+ businessRole,
231
+ };
232
+ sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify(state));
233
+ }
234
+ clearSessionState() {
235
+ sessionStorage.removeItem(this.STORAGE_KEY);
236
+ // Also clear the disconnected flag when clearing state
237
+ sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
238
+ }
239
+ canRestoreSession() {
240
+ return !!sessionStorage.getItem(this.STORAGE_KEY);
241
+ }
242
+ restoreSession(containerId) {
243
+ const savedState = sessionStorage.getItem(this.STORAGE_KEY);
244
+ if (!savedState)
245
+ return;
246
+ // Check if this session was intentionally disconnected
247
+ // If so, don't restore it on page reload
248
+ const wasDisconnected = sessionStorage.getItem(this.DISCONNECTED_FLAG_KEY);
249
+ if (wasDisconnected === 'true') {
250
+ console.log('[TAS DEBUG] Session was intentionally disconnected, skipping restore');
251
+ this.clearSessionState();
252
+ sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
253
+ return;
254
+ }
255
+ // Don't restore if we're already disconnected or if there's no active session
256
+ // This prevents restoring sessions that were properly disconnected
257
+ if (this.callStateSubject.getValue() === CallState.DISCONNECTED) {
258
+ console.log('[TAS DEBUG] Call state is DISCONNECTED, skipping restore');
259
+ this.clearSessionState();
260
+ return;
261
+ }
262
+ try {
263
+ const state = JSON.parse(savedState);
264
+ if (state.sessionId && state.token) {
265
+ console.log('[TAS DEBUG] Restoring session from storage');
266
+ // Force PiP mode for restoration to ensure UI consistency
267
+ this.viewModeSubject.next(ViewMode.PIP);
268
+ if (state.businessRole) {
269
+ this.currentBusinessRole = state.businessRole;
270
+ }
271
+ this.connectSession(state.sessionId, state.token, containerId, // Use the same container for both since we are in PiP
272
+ containerId, this.currentBusinessRole)
273
+ .then(() => {
274
+ console.log('[TAS DEBUG] Session restored successfully');
275
+ // Clear the disconnected flag if restoration succeeds
276
+ sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
277
+ })
278
+ .catch((err) => {
279
+ console.error('[TAS DEBUG] Failed to restore session:', err);
280
+ this.clearSessionState(); // Clear bad state
281
+ });
282
+ }
283
+ }
284
+ catch (e) {
285
+ console.error('[TAS DEBUG] Error parsing saved session state', e);
286
+ this.clearSessionState();
287
+ }
288
+ }
97
289
  // API Methods
98
- createRoom(payload) {
99
- return this.httpClient.post("v2/room", { body: payload, headers: {} }).pipe(map((response) => response), catchError((error) => {
100
- console.error("TAS Service: createRoom failed", error);
290
+ /**
291
+ * PROXY circuit token: /v2/proxy/video/start
292
+ */
293
+ startProxyVideoSession(payload) {
294
+ return this.httpClient
295
+ .post('v2/proxy/video/start', {
296
+ body: payload,
297
+ headers: {},
298
+ })
299
+ .pipe(map((response) => response), catchError((error) => {
300
+ console.error('TAS Service: startProxyVideoSession failed', error);
101
301
  throw error;
102
302
  }));
103
303
  }
104
- generateToken(payload) {
105
- return this.httpClient.post("v2/room/token", { body: payload, headers: {} }).pipe(map((response) => response), catchError((error) => {
106
- console.error("TAS Service: generateToken failed", error);
304
+ /**
305
+ * PROXY circuit status: /v2/proxy/video/status
306
+ */
307
+ getProxyVideoStatus(payload) {
308
+ return this.httpClient
309
+ .post('v2/proxy/video/status', {
310
+ body: payload,
311
+ headers: {},
312
+ })
313
+ .pipe(map((response) => response), catchError((error) => {
314
+ console.error('TAS Service: getProxyVideoStatus failed', error);
107
315
  throw error;
108
316
  }));
109
317
  }
318
+ /**
319
+ * PROXY circuit user modification: /v2/proxy/video/user/modify
320
+ */
321
+ modifyProxyVideoUser(payload) {
322
+ return this.httpClient
323
+ .patch('v2/proxy/video/user/modify', {
324
+ body: payload,
325
+ headers: {},
326
+ })
327
+ .pipe(catchError((error) => {
328
+ console.error('TAS Service: modifyProxyVideoUser failed', error);
329
+ throw error;
330
+ }));
331
+ }
332
+ finishProxyVideoSession(payload) {
333
+ return this.httpClient
334
+ .post('v2/proxy/video/finish', {
335
+ body: payload,
336
+ headers: {},
337
+ })
338
+ .pipe(map((response) => response), catchError((error) => {
339
+ console.error('TAS Service: finishProxyVideoSession failed', error);
340
+ throw error;
341
+ }));
342
+ }
343
+ /**
344
+ * Get user appointments within a date range.
345
+ * @param params Date range for querying appointments
346
+ * @returns Observable of appointment array
347
+ */
348
+ getAppointments(params) {
349
+ return this.httpClient
350
+ .get(`v2/proxy/appointment/agendas/user/appointments?fromDate=${params.fromDate}&toDate=${params.toDate}`, { headers: {} })
351
+ .pipe(catchError((error) => {
352
+ console.error('TAS Service: getAppointments failed', error);
353
+ throw error;
354
+ }));
355
+ }
356
+ /**
357
+ * Start automatic status polling for the current session.
358
+ * Status is polled every STATUS_POLL_INTERVAL_MS milliseconds.
359
+ */
360
+ /**
361
+ * Stop automatic status polling.
362
+ */
363
+ /**
364
+ * Fetch status and process the response.
365
+ */
366
+ fetchAndProcessStatus(params) {
367
+ this.getProxyVideoStatus(params).subscribe({
368
+ next: (response) => {
369
+ this.processStatusResponse(response);
370
+ },
371
+ error: (err) => {
372
+ console.error('[TAS DEBUG] Status polling error:', err);
373
+ },
374
+ });
375
+ }
376
+ /**
377
+ * Process status response to update waiting room users and owner join status.
378
+ */
379
+ processStatusResponse(response) {
380
+ const content = response.content;
381
+ // Update videoCallId if available
382
+ if (content.videoCallId) {
383
+ this.currentVideoCallId = content.videoCallId;
384
+ }
385
+ // Update sessionId if available
386
+ if (content.sessionId) {
387
+ this.currentSessionId = content.sessionId;
388
+ this.proxyVideoSessionId = content.sessionId;
389
+ }
390
+ // Update joinable status
391
+ this.joinableSubject.next(content.joinable);
392
+ // Update activateGeo status
393
+ if (content.activateGeo !== undefined) {
394
+ console.log('[TAS DEBUG] activateGeo received:', content.activateGeo);
395
+ this.activateGeoSubject.next(content.activateGeo);
396
+ }
397
+ // Update geoRequestActive status (owner waiting for user geo response)
398
+ if (content.geoRequestActive !== undefined) {
399
+ console.log('[TAS DEBUG] geoRequestActive received:', content.geoRequestActive);
400
+ this.geoRequestActiveSubject.next(content.geoRequestActive);
401
+ }
402
+ // Update allGeoGranted status (all users responded with geo)
403
+ if (content.allGeoGranted !== undefined) {
404
+ console.log('[TAS DEBUG] allGeoGranted received:', content.allGeoGranted);
405
+ this.allGeoGrantedSubject.next(content.allGeoGranted);
406
+ }
407
+ // Check if owner has joined
408
+ const ownerJoined = this.checkIfOwnerJoined(content.users);
409
+ this.ownerHasJoinedSubject.next(ownerJoined);
410
+ // Detect if owner left: was present, now not present
411
+ if (this.wasOwnerPresent && !ownerJoined) {
412
+ console.log('[TAS DEBUG] Owner has left the session');
413
+ this.ownerHasLeftSubject.next(true);
414
+ }
415
+ if (ownerJoined) {
416
+ this.wasOwnerPresent = true;
417
+ }
418
+ // Extract waiting room users (status === WAITING)
419
+ const waitingUsers = content.users
420
+ .filter((u) => u.status === 'WAITING')
421
+ .map((u) => ({
422
+ userId: u.userId,
423
+ name: `User ${u.userId}`,
424
+ status: RoomUserStatus.WAITING,
425
+ }));
426
+ this.waitingRoomUsersSubject.next(waitingUsers);
427
+ }
428
+ /**
429
+ * Check if at least one OWNER has joined the call.
430
+ */
431
+ checkIfOwnerJoined(users) {
432
+ return users.some((u) => u.rol === TasUserRole.OWNER && u.status === 'JOINED');
433
+ }
434
+ /**
435
+ * Admit a user from the waiting room by changing their status.
436
+ */
437
+ admitUserFromWaitingRoom(userId, videoCallId) {
438
+ return this.modifyProxyVideoUser({
439
+ userId,
440
+ videoCallId,
441
+ action: UserCallAction.WAITING_ROOM_LEAVE,
442
+ });
443
+ }
444
+ // Getters for current call context
445
+ get appointmentId() {
446
+ return this.currentAppointmentId;
447
+ }
448
+ get videoCallId() {
449
+ return this.currentVideoCallId;
450
+ }
110
451
  /**
111
452
  * Connects to a TokBox video session
112
453
  */
113
- connectSession(sessionId, token, publisherElement, subscriberElement) {
454
+ connectSession(sessionId, token, publisherElement, subscriberElement, businessRole = TasBusinessRole.USER) {
114
455
  this.callStateSubject.next(CallState.CONNECTING);
115
456
  this.currentSessionId = sessionId;
116
457
  this.currentToken = token;
458
+ this.currentBusinessRole = businessRole;
459
+ this.isFinishingSession = false; // Reset flag for new session
460
+ // Save initial state (defaulting to current view mode)
461
+ this.saveSessionState(sessionId, token, this.viewModeSubject.getValue(), businessRole);
462
+ // Clear the disconnected flag when starting a new connection
463
+ sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
117
464
  return new Promise((resolve, reject) => {
118
465
  if (!OT.checkSystemRequirements()) {
119
466
  this.callStateSubject.next(CallState.ERROR);
120
- reject(new Error("Browser not compatible with TokBox"));
467
+ reject(new Error('Browser not compatible with TokBox'));
121
468
  return;
122
469
  }
123
470
  this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);
124
471
  // Handle new streams (remote participants joining)
125
- this.session.on("streamCreated", (event) => {
472
+ this.session.on('streamCreated', (event) => {
126
473
  const subscriber = this.session?.subscribe(event.stream, subscriberElement, {
127
- insertMode: "append",
128
- width: "100%",
129
- height: "100%",
474
+ insertMode: 'append',
475
+ width: '100%',
476
+ height: '100%',
130
477
  }, (error) => {
131
478
  if (error) {
132
- console.error("Error subscribing to stream:", error);
479
+ console.error('Error subscribing to stream:', error);
133
480
  }
134
481
  });
135
482
  if (subscriber) {
@@ -137,29 +484,48 @@ export class TasService {
137
484
  }
138
485
  });
139
486
  // Handle streams ending (remote participants leaving)
140
- this.session.on("streamDestroyed", (event) => {
487
+ this.session.on('streamDestroyed', (event) => {
141
488
  this.subscribers = this.subscribers.filter((sub) => sub.stream?.streamId !== event.stream.streamId);
142
489
  });
143
490
  // Handle session disconnection
144
- this.session.on("sessionDisconnected", () => {
491
+ this.session.on('sessionDisconnected', () => {
145
492
  this.callStateSubject.next(CallState.DISCONNECTED);
493
+ // Call finishSession when session is disconnected (e.g., by server)
494
+ // Only call if not already finishing (prevents duplicate calls)
495
+ const sessionIdToFinish = this.currentSessionId;
496
+ if (sessionIdToFinish && !this.isFinishingSession) {
497
+ this.isFinishingSession = true;
498
+ this.finishProxyVideoSession({
499
+ sessionId: sessionIdToFinish,
500
+ businessRole: this.currentBusinessRole,
501
+ }).subscribe({
502
+ next: (response) => {
503
+ console.log('[TAS DEBUG] Session finished on disconnect event:', response);
504
+ this.isFinishingSession = false;
505
+ },
506
+ error: (error) => {
507
+ console.error('[TAS DEBUG] Error finishing session on disconnect:', error);
508
+ this.isFinishingSession = false;
509
+ },
510
+ });
511
+ }
146
512
  });
147
513
  // Connect to session
148
514
  this.session.connect(token, (error) => {
149
515
  if (error) {
150
- console.error("Error connecting to session:", error);
516
+ console.error('Error connecting to session:', error);
151
517
  this.callStateSubject.next(CallState.ERROR);
152
518
  reject(error);
153
519
  return;
154
520
  }
155
521
  // Initialize publisher (local video)
156
522
  this.publisher = OT.initPublisher(publisherElement, {
157
- insertMode: "append",
158
- width: "100%",
159
- height: "100%",
523
+ insertMode: 'append',
524
+ width: '100%',
525
+ height: '100%',
160
526
  }, (err) => {
161
527
  if (err) {
162
- console.error("Error initializing publisher:", err);
528
+ console.error('Error initializing publisher:', err);
163
529
  this.callStateSubject.next(CallState.ERROR);
164
530
  reject(err);
165
531
  return;
@@ -167,7 +533,7 @@ export class TasService {
167
533
  // Publish to session
168
534
  this.session?.publish(this.publisher, (pubErr) => {
169
535
  if (pubErr) {
170
- console.error("Error publishing stream:", pubErr);
536
+ console.error('Error publishing stream:', pubErr);
171
537
  this.callStateSubject.next(CallState.ERROR);
172
538
  reject(pubErr);
173
539
  }
@@ -227,12 +593,12 @@ export class TasService {
227
593
  this.movePublisherTo('publisher-container');
228
594
  }
229
595
  }
230
- TasService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasService, deps: [{ token: TAS_HTTP_CLIENT }, { token: TAS_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
231
- TasService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasService, providedIn: "root" });
232
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasService, decorators: [{
596
+ TasService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasService, deps: [{ token: TAS_HTTP_CLIENT }, { token: TAS_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
597
+ TasService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasService, providedIn: 'root' });
598
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasService, decorators: [{
233
599
  type: Injectable,
234
600
  args: [{
235
- providedIn: "root",
601
+ providedIn: 'root',
236
602
  }]
237
603
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
238
604
  type: Inject,
@@ -241,4 +607,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
241
607
  type: Inject,
242
608
  args: [TAS_CONFIG]
243
609
  }] }]; } });
244
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9zZXJ2aWNlcy90YXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBS04sU0FBUyxFQUNULFFBQVEsR0FDUixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUE0QixNQUFNLHNCQUFzQixDQUFDOztBQUU3Riw2Q0FBNkM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUsvQixNQUFNLE9BQU8sVUFBVTtJQWtCdEIsWUFDa0MsVUFBeUIsRUFDOUIsTUFBaUI7UUFEWixlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQzlCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFuQnRDLFlBQU8sR0FBc0IsSUFBSSxDQUFDO1FBQ2xDLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBQ3RDLGdCQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUVsQyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBWSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsZUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVqRCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFXLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RSxjQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVB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QUMsc0JBQXNCLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDN0MsQ0FBQzs7dUdBdFJXLFVBQVUsa0JBbUJiLGVBQWUsYUFDZixVQUFVOzJHQXBCUCxVQUFVLGNBRlYsTUFBTTsyRkFFTixVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQjs7MEJBb0JFLE1BQU07MkJBQUMsZUFBZTs7MEJBQ3RCLE1BQU07MkJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgKiBhcyBPVCBmcm9tIFwiQG9wZW50b2svY2xpZW50XCI7XG5pbXBvcnQge1xuXHRDcmVhdGVSb29tUmVxdWVzdCxcblx0Q3JlYXRlUm9vbVJlc3BvbnNlLFxuXHRHZW5lcmF0ZVRva2VuUmVxdWVzdCxcblx0R2VuZXJhdGVUb2tlblJlc3BvbnNlLFxuXHRDYWxsU3RhdGUsXG5cdFZpZXdNb2RlLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgVEFTX0NPTkZJRywgVEFTX0hUVFBfQ0xJRU5ULCBUYXNDb25maWcsIFRhc0h0dHBDbGllbnQgfSBmcm9tIFwiLi4vY29uZmlnL3Rhcy5jb25maWdcIjtcblxuLy8gUmUtZXhwb3J0IGVudW1zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5leHBvcnQgeyBDYWxsU3RhdGUsIFZpZXdNb2RlIH07XG5cbkBJbmplY3RhYmxlKHtcblx0cHJvdmlkZWRJbjogXCJyb290XCIsXG59KVxuZXhwb3J0IGNsYXNzIFRhc1NlcnZpY2Uge1xuXHRwcml2YXRlIHNlc3Npb246IE9ULlNlc3Npb24gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBwdWJsaXNoZXI6IE9ULlB1Ymxpc2hlciB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN1YnNjcmliZXJzOiBPVC5TdWJzY3JpYmVyW10gPSBbXTtcblxuXHRwcml2YXRlIGNhbGxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGxTdGF0ZT4oQ2FsbFN0YXRlLklETEUpO1xuXHRwdWJsaWMgY2FsbFN0YXRlJCA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuXHRwcml2YXRlIHZpZXdNb2RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Vmlld01vZGU+KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuXHRwdWJsaWMgdmlld01vZGUkID0gdGhpcy52aWV3TW9kZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cblx0cHJpdmF0ZSBpc011dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXHRwdWJsaWMgaXNNdXRlZCQgPSB0aGlzLmlzTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG5cdC8vIFNlc3Npb24gaW5mbyBmb3IgUGlQIG1vZGUgcmVzdG9yYXRpb25cblx0cHJpdmF0ZSBjdXJyZW50U2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBjdXJyZW50VG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdEBJbmplY3QoVEFTX0hUVFBfQ0xJRU5UKSBwcml2YXRlIGh0dHBDbGllbnQ6IFRhc0h0dHBDbGllbnQsXG5cdFx0QEluamVjdChUQVNfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVGFzQ29uZmlnXG5cdCkge31cblxuXHQvLyBHZXR0ZXJzXG5cdHB1YmxpYyBnZXQgY3VycmVudFNlc3Npb24oKTogT1QuU2Vzc2lvbiB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLnNlc3Npb247XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGN1cnJlbnRQdWJsaXNoZXIoKTogT1QuUHVibGlzaGVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMucHVibGlzaGVyO1xuXHR9XG5cblx0cHVibGljIGdldCBjdXJyZW50U3Vic2NyaWJlcnMoKTogT1QuU3Vic2NyaWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5zdWJzY3JpYmVycztcblx0fVxuXG5cdHB1YmxpYyBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmN1cnJlbnRTZXNzaW9uSWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmN1cnJlbnRUb2tlbjtcblx0fVxuXG5cdHB1YmxpYyBnZXQgaXNNdXRlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5pc011dGVkU3ViamVjdC5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0Ly8gVmlldyBNb2RlIE1ldGhvZHNcblx0cHVibGljIHNldFZpZXdNb2RlKG1vZGU6IFZpZXdNb2RlKTogdm9pZCB7XG5cdFx0dGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChtb2RlKTtcblx0fVxuXG5cdHB1YmxpYyBlbnRlclBpcE1vZGUoKTogdm9pZCB7XG5cdFx0dGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChWaWV3TW9kZS5QSVApO1xuXHR9XG5cblx0cHVibGljIGV4aXRQaXBNb2RlKCk6IHZvaWQge1xuXHRcdHRoaXMudmlld01vZGVTdWJqZWN0Lm5leHQoVmlld01vZGUuRlVMTFNDUkVFTik7XG5cdH1cblxuXHRwdWJsaWMgaXNQaXBNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZpZXdNb2RlU3ViamVjdC5nZXRWYWx1ZSgpID09PSBWaWV3TW9kZS5QSVA7XG5cdH1cblxuXHQvLyBBdWRpbyBDb250cm9sXG5cdHB1YmxpYyB0b2dnbGVNdXRlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnB1Ymxpc2hlcikge1xuXHRcdFx0Y29uc3QgbmV3TXV0ZVN0YXRlID0gIXRoaXMuaXNNdXRlZFN1YmplY3QuZ2V0VmFsdWUoKTtcblx0XHRcdGNvbnN0IHNob3VsZEVuYWJsZUF1ZGlvID0gIW5ld011dGVTdGF0ZTtcblx0XHRcdFxuXHRcdFx0Ly8gVXNlIE9wZW5Ub2sncyBwdWJsaXNoQXVkaW9cblx0XHRcdHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyhzaG91bGRFbmFibGVBdWRpbyk7XG5cdFx0XHRcblx0XHRcdC8vIEFsc28gZGlyZWN0bHkgY29udHJvbCB0aGUgTWVkaWFTdHJlYW1UcmFjayBhcyBiYWNrdXBcblx0XHRcdGNvbnN0IGF1ZGlvVHJhY2sgPSB0aGlzLnB1Ymxpc2hlci5nZXRBdWRpb1NvdXJjZT8uKCk7XG5cdFx0XHRpZiAoYXVkaW9UcmFjaykge1xuXHRcdFx0XHRhdWRpb1RyYWNrLmVuYWJsZWQgPSBzaG91bGRFbmFibGVBdWRpbztcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0dGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG5ld011dGVTdGF0ZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldE11dGUobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5wdWJsaXNoZXIpIHtcblx0XHRcdHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyghbXV0ZWQpO1xuXHRcdFx0dGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG11dGVkKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTZXNzaW9uIE1hbmFnZW1lbnRcblx0cHVibGljIGRpc2Nvbm5lY3RTZXNzaW9uKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnNlc3Npb24pIHtcblx0XHRcdHRoaXMuc2Vzc2lvbi5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLnNlc3Npb24gPSBudWxsO1xuXHRcdH1cblx0XHR0aGlzLnB1Ymxpc2hlciA9IG51bGw7XG5cdFx0dGhpcy5zdWJzY3JpYmVycyA9IFtdO1xuXHRcdHRoaXMuY3VycmVudFNlc3Npb25JZCA9IG51bGw7XG5cdFx0dGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xuXHRcdHRoaXMuaXNNdXRlZFN1YmplY3QubmV4dChmYWxzZSk7IC8vIFJlc2V0IG11dGUgc3RhdGVcblx0XHR0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuXHRcdHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5ESVNDT05ORUNURUQpO1xuXHR9XG5cblx0cHVibGljIGlzQ2FsbEFjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jYWxsU3RhdGVTdWJqZWN0LmdldFZhbHVlKCkgPT09IENhbGxTdGF0ZS5DT05ORUNURUQ7XG5cdH1cblxuXHQvLyBBUEkgTWV0aG9kc1xuXHRwdWJsaWMgY3JlYXRlUm9vbShwYXlsb2FkOiBDcmVhdGVSb29tUmVxdWVzdCk6IE9ic2VydmFibGU8Q3JlYXRlUm9vbVJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PENyZWF0ZVJvb21SZXNwb25zZT4oXCJ2Mi9yb29tXCIsIHsgYm9keTogcGF5bG9hZCwgaGVhZGVyczoge30gfSkucGlwZShcblx0XHRcdG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlIGFzIENyZWF0ZVJvb21SZXNwb25zZSksXG5cdFx0XHRjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiVEFTIFNlcnZpY2U6IGNyZWF0ZVJvb20gZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2VuZXJhdGVUb2tlbihwYXlsb2FkOiBHZW5lcmF0ZVRva2VuUmVxdWVzdCk6IE9ic2VydmFibGU8R2VuZXJhdGVUb2tlblJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEdlbmVyYXRlVG9rZW5SZXNwb25zZT4oXCJ2Mi9yb29tL3Rva2VuXCIsIHsgYm9keTogcGF5bG9hZCwgaGVhZGVyczoge30gfSkucGlwZShcblx0XHRcdG1hcCgocmVzcG9uc2U6IGFueSkgPT4gcmVzcG9uc2UgYXMgR2VuZXJhdGVUb2tlblJlc3BvbnNlKSxcblx0XHRcdGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJUQVMgU2VydmljZTogZ2VuZXJhdGVUb2tlbiBmYWlsZWRcIiwgZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0cyB0byBhIFRva0JveCB2aWRlbyBzZXNzaW9uXG5cdCAqL1xuXHRwdWJsaWMgY29ubmVjdFNlc3Npb24oXG5cdFx0c2Vzc2lvbklkOiBzdHJpbmcsXG5cdFx0dG9rZW46IHN0cmluZyxcblx0XHRwdWJsaXNoZXJFbGVtZW50OiBzdHJpbmcsXG5cdFx0c3Vic2NyaWJlckVsZW1lbnQ6IHN0cmluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cdFx0dGhpcy5jdXJyZW50U2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuXHRcdHRoaXMuY3VycmVudFRva2VuID0gdG9rZW47XG5cdFx0XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGlmICghT1QuY2hlY2tTeXN0ZW1SZXF1aXJlbWVudHMoKSkge1xuXHRcdFx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuXHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiQnJvd3NlciBub3QgY29tcGF0aWJsZSB3aXRoIFRva0JveFwiKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXNzaW9uID0gT1QuaW5pdFNlc3Npb24odGhpcy5jb25maWcudG9rQm94QXBpS2V5LCBzZXNzaW9uSWQpO1xuXG5cdFx0XHQvLyBIYW5kbGUgbmV3IHN0cmVhbXMgKHJlbW90ZSBwYXJ0aWNpcGFudHMgam9pbmluZylcblx0XHRcdHRoaXMuc2Vzc2lvbi5vbihcInN0cmVhbUNyZWF0ZWRcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN1YnNjcmliZXIgPSB0aGlzLnNlc3Npb24/LnN1YnNjcmliZShcblx0XHRcdFx0XHRldmVudC5zdHJlYW0sXG5cdFx0XHRcdFx0c3Vic2NyaWJlckVsZW1lbnQsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aW5zZXJ0TW9kZTogXCJhcHBlbmRcIixcblx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdGhlaWdodDogXCIxMDAlXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRcdGlmIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3Igc3Vic2NyaWJpbmcgdG8gc3RyZWFtOlwiLCBlcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoc3Vic2NyaWJlcikge1xuXHRcdFx0XHRcdHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdHJlYW1zIGVuZGluZyAocmVtb3RlIHBhcnRpY2lwYW50cyBsZWF2aW5nKVxuXHRcdFx0dGhpcy5zZXNzaW9uLm9uKFwic3RyZWFtRGVzdHJveWVkXCIsIChldmVudCkgPT4ge1xuXHRcdFx0XHR0aGlzLnN1YnNjcmliZXJzID0gdGhpcy5zdWJzY3JpYmVycy5maWx0ZXIoXG5cdFx0XHRcdFx0KHN1YikgPT4gc3ViLnN0cmVhbT8uc3RyZWFtSWQgIT09IGV2ZW50LnN0cmVhbS5zdHJlYW1JZFxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEhhbmRsZSBzZXNzaW9uIGRpc2Nvbm5lY3Rpb25cblx0XHRcdHRoaXMuc2Vzc2lvbi5vbihcInNlc3Npb25EaXNjb25uZWN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRElTQ09OTkVDVEVEKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDb25uZWN0IHRvIHNlc3Npb25cblx0XHRcdHRoaXMuc2Vzc2lvbi5jb25uZWN0KHRva2VuLCAoZXJyb3IpID0+IHtcblx0XHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcIkVycm9yIGNvbm5lY3RpbmcgdG8gc2Vzc2lvbjpcIiwgZXJyb3IpO1xuXHRcdFx0XHRcdHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5FUlJPUik7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJbml0aWFsaXplIHB1Ymxpc2hlciAobG9jYWwgdmlkZW8pXG5cdFx0XHRcdHRoaXMucHVibGlzaGVyID0gT1QuaW5pdFB1Ymxpc2hlcihcblx0XHRcdFx0XHRwdWJsaXNoZXJFbGVtZW50LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGluc2VydE1vZGU6IFwiYXBwZW5kXCIsXG5cdFx0XHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KGVycikgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3IgaW5pdGlhbGl6aW5nIHB1Ymxpc2hlcjpcIiwgZXJyKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycik7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gUHVibGlzaCB0byBzZXNzaW9uXG5cdFx0XHRcdFx0XHR0aGlzLnNlc3Npb24/LnB1Ymxpc2godGhpcy5wdWJsaXNoZXIsIChwdWJFcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHB1YkVycikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwdWJsaXNoaW5nIHN0cmVhbTpcIiwgcHViRXJyKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuXHRcdFx0XHRcdFx0XHRcdHJlamVjdChwdWJFcnIpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5DT05ORUNURUQpO1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBWaWRlbyBFbGVtZW50IE1vdmVtZW50IE1ldGhvZHNcblx0cHVibGljIG1vdmVQdWJsaXNoZXJUbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLnB1Ymxpc2hlcikgcmV0dXJuO1xuXHRcdFxuXHRcdGNvbnN0IHB1Ymxpc2hlckVsZW1lbnQgPSB0aGlzLnB1Ymxpc2hlci5lbGVtZW50O1xuXHRcdGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcblx0XHRcblx0XHRpZiAocHVibGlzaGVyRWxlbWVudCAmJiBuZXdDb250YWluZXIpIHtcblx0XHRcdG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZChwdWJsaXNoZXJFbGVtZW50KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgbW92ZVN1YnNjcmliZXJzVG8obmV3Q29udGFpbmVySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcblx0XHRpZiAoIW5ld0NvbnRhaW5lcikgcmV0dXJuO1xuXHRcdFxuXHRcdHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuXHRcdFx0Y29uc3Qgc3Vic2NyaWJlckVsZW1lbnQgPSBzdWJzY3JpYmVyLmVsZW1lbnQ7XG5cdFx0XHRpZiAoc3Vic2NyaWJlckVsZW1lbnQpIHtcblx0XHRcdFx0bmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHN1YnNjcmliZXJFbGVtZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB0aGUgbWFpbiB2aWRlbyAoc3Vic2NyaWJlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBwdWJsaXNoZXIpIHRvIGEgY29udGFpbmVyLlxuXHQgKiBVc2VkIGZvciBQaVAgbW9kZSB0byBzaG93IG9ubHkgb25lIHZpZGVvLlxuXHQgKi9cblx0cHVibGljIG1vdmVNYWluVmlkZW9UbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgbmV3Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmV3Q29udGFpbmVySWQpO1xuXHRcdGlmICghbmV3Q29udGFpbmVyKSByZXR1cm47XG5cblx0XHQvLyBQcmVmZXIgcmVtb3RlIHZpZGVvIChzdWJzY3JpYmVyKSBhcyBtYWluXG5cdFx0aWYgKHRoaXMuc3Vic2NyaWJlcnMubGVuZ3RoID4gMCAmJiB0aGlzLnN1YnNjcmliZXJzWzBdLmVsZW1lbnQpIHtcblx0XHRcdG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnN1YnNjcmliZXJzWzBdLmVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGwgYmFjayB0byBsb2NhbCB2aWRlbyAocHVibGlzaGVyKVxuXHRcdGlmICh0aGlzLnB1Ymxpc2hlcj8uZWxlbWVudCkge1xuXHRcdFx0bmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucHVibGlzaGVyLmVsZW1lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB2aWRlb3MgYmFjayB0byBmdWxsc2NyZWVuIGNvbnRhaW5lcnNcblx0ICovXG5cdHB1YmxpYyBtb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCk6IHZvaWQge1xuXHRcdHRoaXMubW92ZVN1YnNjcmliZXJzVG8oJ3N1YnNjcmliZXItY29udGFpbmVyJyk7XG5cdFx0dGhpcy5tb3ZlUHVibGlzaGVyVG8oJ3B1Ymxpc2hlci1jb250YWluZXInKTtcblx0fVxufVxuXG4iXX0=
610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9zZXJ2aWNlcy90YXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBUUwsY0FBYyxFQUNkLGNBQWMsRUFFZCxlQUFlLEVBQ2YsV0FBVyxFQUNYLFNBQVMsRUFDVCxRQUFRLEdBSVQsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGVBQWUsR0FHaEIsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFOUIsNkNBQTZDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFLaEYsTUFBTSxPQUFPLFVBQVU7SUE2RHJCLFlBQ21DLFVBQXlCLEVBQzlCLE1BQWlCO1FBRFosZUFBVSxHQUFWLFVBQVUsQ0FBZTtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBOUR2QyxZQUFPLEdBQXNCLElBQUksQ0FBQztRQUNsQyxjQUFTLEdBQXdCLElBQUksQ0FBQztRQUN0QyxnQkFBVyxHQUFvQixFQUFFLENBQUM7UUFFbEMscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLGVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFakQsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FB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LEVBQUU7WUFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELHVDQUF1QztRQUN2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFO1lBQzNCLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHNCQUFzQjtRQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDOUMsQ0FBQzs7d0dBeHZCVSxVQUFVLGtCQThEWCxlQUFlLGFBQ2YsVUFBVTs0R0EvRFQsVUFBVSxjQUZULE1BQU07NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQStESSxNQUFNOzJCQUFDLGVBQWU7OzBCQUN0QixNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgT1QgZnJvbSAnQG9wZW50b2svY2xpZW50JztcbmltcG9ydCB7XG4gIEdlbmVyYXRlVG9rZW5SZXNwb25zZSxcbiAgU3RhcnRTZXNzaW9uUmVxdWVzdCxcbiAgRmluaXNoU2Vzc2lvblJlc3BvbnNlLFxuICBQcm94eVZpZGVvU3RhdHVzUmVxdWVzdCxcbiAgUHJveHlWaWRlb1N0YXR1c1Jlc3BvbnNlLFxuICBQcm94eVZpZGVvRmluaXNoUmVxdWVzdCxcbiAgUHJveHlWaWRlb1VzZXJNb2RpZnlSZXF1ZXN0LFxuICBVc2VyQ2FsbEFjdGlvbixcbiAgUm9vbVVzZXJTdGF0dXMsXG4gIFRhc0N1cnJlbnRVc2VyLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc1VzZXJSb2xlLFxuICBDYWxsU3RhdGUsXG4gIFZpZXdNb2RlLFxuICBXYWl0aW5nUm9vbVVzZXIsXG4gIFRhc0FwcG9pbnRtZW50LFxuICBHZXRBcHBvaW50bWVudHNSZXF1ZXN0LFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIFRBU19DT05GSUcsXG4gIFRBU19IVFRQX0NMSUVOVCxcbiAgVGFzQ29uZmlnLFxuICBUYXNIdHRwQ2xpZW50LFxufSBmcm9tICcuLi9jb25maWcvdGFzLmNvbmZpZyc7XG5cbi8vIFJlLWV4cG9ydCBlbnVtcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuZXhwb3J0IHsgQ2FsbFN0YXRlLCBWaWV3TW9kZSwgVGFzQnVzaW5lc3NSb2xlLCBVc2VyQ2FsbEFjdGlvbiwgUm9vbVVzZXJTdGF0dXMgfTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRhc1NlcnZpY2Uge1xuICBwcml2YXRlIHNlc3Npb246IE9ULlNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwdWJsaXNoZXI6IE9ULlB1Ymxpc2hlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN1YnNjcmliZXJzOiBPVC5TdWJzY3JpYmVyW10gPSBbXTtcblxuICBwcml2YXRlIGNhbGxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGxTdGF0ZT4oQ2FsbFN0YXRlLklETEUpO1xuICBwdWJsaWMgY2FsbFN0YXRlJCA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHZpZXdNb2RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Vmlld01vZGU+KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuICBwdWJsaWMgdmlld01vZGUkID0gdGhpcy52aWV3TW9kZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBpc011dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNNdXRlZCQgPSB0aGlzLmlzTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIFNlc3Npb24gaW5mbyBmb3IgUGlQIG1vZGUgcmVzdG9yYXRpb25cbiAgcHJpdmF0ZSBjdXJyZW50U2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50VG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfS0VZID0gJ3Rhc19zZXNzaW9uX3N0YXRlJztcbiAgcHJpdmF0ZSByZWFkb25seSBESVNDT05ORUNURURfRkxBR19LRVkgPSAndGFzX3Nlc3Npb25fZGlzY29ubmVjdGVkJztcbiAgcHJpdmF0ZSBpc0ZpbmlzaGluZ1Nlc3Npb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBQcm94eS12aWRlbyBjaXJjdWl0IHN0YXRlXG4gIHByaXZhdGUgcHJveHlWaWRlb1Nlc3Npb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJveHlWaWRlb1Rva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50QnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUjtcblxuICAvLyBXYWl0aW5nIHJvb20gYW5kIHN0YXR1cyBwb2xsaW5nXG4gIHByaXZhdGUgd2FpdGluZ1Jvb21Vc2Vyc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdhaXRpbmdSb29tVXNlcltdPihbXSk7XG4gIHB1YmxpYyB3YWl0aW5nUm9vbVVzZXJzJCA9IHRoaXMud2FpdGluZ1Jvb21Vc2Vyc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBvd25lckhhc0pvaW5lZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIG93bmVySGFzSm9pbmVkJCA9IHRoaXMub3duZXJIYXNKb2luZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0cnVlIHdoZW4gb3duZXIgd2FzIHByZXNlbnQgYnV0IHRoZW4gbGVmdFxuICBwcml2YXRlIG93bmVySGFzTGVmdFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIG93bmVySGFzTGVmdCQgPSB0aGlzLm93bmVySGFzTGVmdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBqb2luYWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGpvaW5hYmxlJCA9IHRoaXMuam9pbmFibGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIE9ic2VydmFibGUgZm9yIHdoZW4gYmFja2VuZCByZXF1ZXN0cyBnZW9sb2NhdGlvbiBhY3RpdmF0aW9uXG4gIHByaXZhdGUgYWN0aXZhdGVHZW9TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBhY3RpdmF0ZUdlbyQgPSB0aGlzLmFjdGl2YXRlR2VvU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvLyBPYnNlcnZhYmxlIGZvciB3aGVuIGdlbyByZXF1ZXN0IGlzIGFjdGl2ZSAob3duZXIgd2FpdGluZyBmb3IgdXNlciByZXNwb25zZSlcbiAgcHJpdmF0ZSBnZW9SZXF1ZXN0QWN0aXZlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgZ2VvUmVxdWVzdEFjdGl2ZSQgPSB0aGlzLmdlb1JlcXVlc3RBY3RpdmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIE9ic2VydmFibGUgZm9yIHdoZW4gYWxsIGdlbyBoYXMgYmVlbiBncmFudGVkXG4gIHByaXZhdGUgYWxsR2VvR3JhbnRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGFsbEdlb0dyYW50ZWQkID0gdGhpcy5hbGxHZW9HcmFudGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0YXR1c1BvbGxpbmdJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMzAwMDA7IC8vIERlZmF1bHQgMzBzXG4gIHByaXZhdGUgd2FzT3duZXJQcmVzZW50ID0gZmFsc2U7XG5cbiAgLy8gQ3VycmVudCBjYWxsIGNvbnRleHRcbiAgcHJpdmF0ZSBjdXJyZW50QXBwb2ludG1lbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFZpZGVvQ2FsbElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50VGVuYW50OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFRBU19IVFRQX0NMSUVOVCkgcHJpdmF0ZSBodHRwQ2xpZW50OiBUYXNIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoVEFTX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRhc0NvbmZpZ1xuICApIHt9XG5cbiAgLy8gLi4uIChHZXR0ZXJzIGFuZCBvdGhlciBtZXRob2RzIHJlbWFpbiB1bmNoYW5nZWQpXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGF1dG9tYXRpYyBzdGF0dXMgcG9sbGluZyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICogU3RhdHVzIGlzIHBvbGxlZCBldmVyeSBpbnRlcnZhbE1zIChkZWZhdWx0IDMwcykuXG4gICAqL1xuICBwdWJsaWMgc3RhcnRTdGF0dXNQb2xsaW5nKFxuICAgIHBhcmFtczogUHJveHlWaWRlb1N0YXR1c1JlcXVlc3QsIFxuICAgIGludGVydmFsTXM6IG51bWJlciA9IHRoaXMuREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFN0YXR1c1BvbGxpbmcoKTsgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHBvbGxpbmdcblxuICAgIC8vIFN0b3JlIGNvbnRleHQgZm9yIHBvbGxpbmdcbiAgICBpZiAocGFyYW1zLnNlc3Npb25JZCkge1xuICAgICAgdGhpcy5jdXJyZW50U2Vzc2lvbklkID0gcGFyYW1zLnNlc3Npb25JZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hcHBvaW50bWVudElkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRBcHBvaW50bWVudElkID0gcGFyYW1zLmFwcG9pbnRtZW50SWQ7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudGVuYW50KSB7XG4gICAgICB0aGlzLmN1cnJlbnRUZW5hbnQgPSBwYXJhbXMudGVuYW50O1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbVEFTIERFQlVHXSBTdGFydGluZyBzdGF0dXMgcG9sbGluZyB3aXRoIGludGVydmFsICR7aW50ZXJ2YWxNc31tc2ApO1xuXG4gICAgLy8gSW5pdGlhbCBzdGF0dXMgZmV0Y2hcbiAgICB0aGlzLmZldGNoQW5kUHJvY2Vzc1N0YXR1cyhwYXJhbXMpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hBbmRQcm9jZXNzU3RhdHVzKHBhcmFtcyk7XG4gICAgfSwgaW50ZXJ2YWxNcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBhdXRvbWF0aWMgc3RhdHVzIHBvbGxpbmcuXG4gICAqL1xuICBwdWJsaWMgc3RvcFN0YXR1c1BvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdHVzUG9sbGluZ0ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuc3RhdHVzUG9sbGluZ0ludGVydmFsKTtcbiAgICAgIHRoaXMuc3RhdHVzUG9sbGluZ0ludGVydmFsID0gbnVsbDtcbiAgICB9XG4gICAgLy8gRG8gTk9UIHJlc2V0IHdhaXRpbmcgcm9vbSBzdGF0ZSBoZXJlLCBhcyBvdGhlciBjb21wb25lbnRzIG1pZ2h0IG9ic2VydmUgaXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwb2xsaW5nIHN0YXRlICh3YWl0aW5nIHJvb20sIG93bmVyIHN0YXR1cywgZXRjKVxuICAgKiBDYWxsIHRoaXMgd2hlbiBjb21wbGV0ZWx5IGV4aXRpbmcgdGhlIGZsb3dcbiAgICovXG4gIHB1YmxpYyByZXNldFBvbGxpbmdTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BTdGF0dXNQb2xsaW5nKCk7XG4gICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLm93bmVySGFzSm9pbmVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLm93bmVySGFzTGVmdFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5qb2luYWJsZVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy53YXNPd25lclByZXNlbnQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgcHVibGljIGdldCBjdXJyZW50U2Vzc2lvbigpOiBPVC5TZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFB1Ymxpc2hlcigpOiBPVC5QdWJsaXNoZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRTdWJzY3JpYmVycygpOiBPVC5TdWJzY3JpYmVyW10ge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZXJzO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFRva2VuO1xuICB9XG5cbiAgcHVibGljIGdldCBwcm94eVNlc3Npb25JZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wcm94eVZpZGVvU2Vzc2lvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBwcm94eVRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnByb3h5VmlkZW9Ub2tlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYnVzaW5lc3NSb2xlKCk6IFRhc0J1c2luZXNzUm9sZSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEJ1c2luZXNzUm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNdXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc011dGVkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gVmlldyBNb2RlIE1ldGhvZHNcbiAgcHVibGljIHNldFZpZXdNb2RlKG1vZGU6IFZpZXdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChtb2RlKTtcbiAgICBpZiAodGhpcy5jdXJyZW50U2Vzc2lvbklkICYmIHRoaXMuY3VycmVudFRva2VuKSB7XG4gICAgICB0aGlzLnNhdmVTZXNzaW9uU3RhdGUoXG4gICAgICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCxcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4sXG4gICAgICAgIG1vZGUsXG4gICAgICAgIHRoaXMuY3VycmVudEJ1c2luZXNzUm9sZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW50ZXJQaXBNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGVTdWJqZWN0Lm5leHQoVmlld01vZGUuUElQKTtcbiAgICBpZiAodGhpcy5jdXJyZW50U2Vzc2lvbklkICYmIHRoaXMuY3VycmVudFRva2VuKSB7XG4gICAgICB0aGlzLnNhdmVTZXNzaW9uU3RhdGUoXG4gICAgICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCxcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4sXG4gICAgICAgIFZpZXdNb2RlLlBJUCxcbiAgICAgICAgdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBleGl0UGlwTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTZXNzaW9uSWQgJiYgdGhpcy5jdXJyZW50VG9rZW4pIHtcbiAgICAgIHRoaXMuc2F2ZVNlc3Npb25TdGF0ZShcbiAgICAgICAgdGhpcy5jdXJyZW50U2Vzc2lvbklkLFxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbixcbiAgICAgICAgVmlld01vZGUuRlVMTFNDUkVFTixcbiAgICAgICAgdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1BpcE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlld01vZGVTdWJqZWN0LmdldFZhbHVlKCkgPT09IFZpZXdNb2RlLlBJUDtcbiAgfVxuXG4gIC8vIEF1ZGlvIENvbnRyb2xcbiAgcHVibGljIHRvZ2dsZU11dGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHVibGlzaGVyKSB7XG4gICAgICBjb25zdCBuZXdNdXRlU3RhdGUgPSAhdGhpcy5pc011dGVkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgY29uc3Qgc2hvdWxkRW5hYmxlQXVkaW8gPSAhbmV3TXV0ZVN0YXRlO1xuXG4gICAgICAvLyBVc2UgT3BlblRvaydzIHB1Ymxpc2hBdWRpb1xuICAgICAgdGhpcy5wdWJsaXNoZXIucHVibGlzaEF1ZGlvKHNob3VsZEVuYWJsZUF1ZGlvKTtcblxuICAgICAgLy8gQWxzbyBkaXJlY3RseSBjb250cm9sIHRoZSBNZWRpYVN0cmVhbVRyYWNrIGFzIGJhY2t1cFxuICAgICAgY29uc3QgYXVkaW9UcmFjayA9IHRoaXMucHVibGlzaGVyLmdldEF1ZGlvU291cmNlPy4oKTtcbiAgICAgIGlmIChhdWRpb1RyYWNrKSB7XG4gICAgICAgIGF1ZGlvVHJhY2suZW5hYmxlZCA9IHNob3VsZEVuYWJsZUF1ZGlvO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzTXV0ZWRTdWJqZWN0Lm5leHQobmV3TXV0ZVN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0TXV0ZShtdXRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnB1Ymxpc2hlcikge1xuICAgICAgdGhpcy5wdWJsaXNoZXIucHVibGlzaEF1ZGlvKCFtdXRlZCk7XG4gICAgICB0aGlzLmlzTXV0ZWRTdWJqZWN0Lm5leHQobXV0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlc3Npb24gTWFuYWdlbWVudFxuICBwdWJsaWMgZGlzY29ubmVjdFNlc3Npb24oY2xlYXJTdG9yYWdlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1tUQVMgREVCVUddIFRhc1NlcnZpY2UuZGlzY29ubmVjdFNlc3Npb24gY2FsbGVkLiBjbGVhclN0b3JhZ2U6JyxcbiAgICAgIGNsZWFyU3RvcmFnZVxuICAgICk7XG5cbiAgICAvLyBDYWxsIGZpbmlzaFNlc3Npb24gYmVmb3JlIGRpc2Nvbm5lY3RpbmcgaWYgd2UgaGF2ZSBhIHNlc3Npb25JZFxuICAgIGNvbnN0IHNlc3Npb25JZFRvRmluaXNoID0gdGhpcy5jdXJyZW50U2Vzc2lvbklkO1xuXG4gICAgLy8gQ2xlYXIgc3RvcmFnZSBGSVJTVCB0byBwcmV2ZW50IGFueSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc3RhdGUgbWlnaHQgYmUgc2F2ZWQgYWZ0ZXIgZGlzY29ubmVjdFxuICAgIGlmIChjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuY2xlYXJTZXNzaW9uU3RhdGUoKTtcbiAgICAgIC8vIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhpcyBzZXNzaW9uIHdhcyBpbnRlbnRpb25hbGx5IGRpc2Nvbm5lY3RlZFxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZWNvbm5lY3Rpb24gb24gcGFnZSByZWxvYWRcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5ESVNDT05ORUNURURfRkxBR19LRVksICd0cnVlJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbikge1xuICAgICAgdGhpcy5zZXNzaW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucHVibGlzaGVyID0gbnVsbDtcbiAgICB0aGlzLnN1YnNjcmliZXJzID0gW107XG4gICAgdGhpcy5jdXJyZW50U2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5wcm94eVZpZGVvU2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnByb3h5VmlkZW9Ub2tlbiA9IG51bGw7XG4gICAgdGhpcy5pc011dGVkU3ViamVjdC5uZXh0KGZhbHNlKTsgLy8gUmVzZXQgbXV0ZSBzdGF0ZVxuICAgIHRoaXMudmlld01vZGVTdWJqZWN0Lm5leHQoVmlld01vZGUuRlVMTFNDUkVFTik7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkRJU0NPTk5FQ1RFRCk7XG5cbiAgICAvLyBDYWxsIHByb3h5IGZpbmlzaCBhZnRlciBkaXNjb25uZWN0aW5nIChvbmx5IGlmIG5vdCBhbHJlYWR5IGZpbmlzaGluZylcbiAgICBpZiAoc2Vzc2lvbklkVG9GaW5pc2ggJiYgIXRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uKSB7XG4gICAgICB0aGlzLmlzRmluaXNoaW5nU2Vzc2lvbiA9IHRydWU7XG4gICAgICB0aGlzLmZpbmlzaFByb3h5VmlkZW9TZXNzaW9uKHtcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRUb0ZpbmlzaCxcbiAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmN1cnJlbnRCdXNpbmVzc1JvbGUsXG4gICAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU2Vzc2lvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHk6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIHRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBFcnJvciBmaW5pc2hpbmcgc2Vzc2lvbjonLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5pc0ZpbmlzaGluZ1Nlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0NhbGxBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5nZXRWYWx1ZSgpID09PSBDYWxsU3RhdGUuQ09OTkVDVEVEO1xuICB9XG5cbiAgLy8gU3RhdGUgUGVyc2lzdGVuY2VcbiAgcHJpdmF0ZSBzYXZlU2Vzc2lvblN0YXRlKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgdmlld01vZGU6IFZpZXdNb2RlLFxuICAgIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVJcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0b2tlbixcbiAgICAgIHZpZXdNb2RlLFxuICAgICAgYnVzaW5lc3NSb2xlLFxuICAgIH07XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNlc3Npb25TdGF0ZSgpOiB2b2lkIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuU1RPUkFHRV9LRVkpO1xuICAgIC8vIEFsc28gY2xlYXIgdGhlIGRpc2Nvbm5lY3RlZCBmbGFnIHdoZW4gY2xlYXJpbmcgc3RhdGVcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuRElTQ09OTkVDVEVEX0ZMQUdfS0VZKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5SZXN0b3JlU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVkpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVTZXNzaW9uKGNvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzYXZlZFN0YXRlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlNUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXNhdmVkU3RhdGUpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgc2Vzc2lvbiB3YXMgaW50ZW50aW9uYWxseSBkaXNjb25uZWN0ZWRcbiAgICAvLyBJZiBzbywgZG9uJ3QgcmVzdG9yZSBpdCBvbiBwYWdlIHJlbG9hZFxuICAgIGNvbnN0IHdhc0Rpc2Nvbm5lY3RlZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5ESVNDT05ORUNURURfRkxBR19LRVkpO1xuICAgIGlmICh3YXNEaXNjb25uZWN0ZWQgPT09ICd0cnVlJykge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFNlc3Npb24gd2FzIGludGVudGlvbmFsbHkgZGlzY29ubmVjdGVkLCBza2lwcGluZyByZXN0b3JlJyk7XG4gICAgICB0aGlzLmNsZWFyU2Vzc2lvblN0YXRlKCk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuRElTQ09OTkVDVEVEX0ZMQUdfS0VZKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCByZXN0b3JlIGlmIHdlJ3JlIGFscmVhZHkgZGlzY29ubmVjdGVkIG9yIGlmIHRoZXJlJ3Mgbm8gYWN0aXZlIHNlc3Npb25cbiAgICAvLyBUaGlzIHByZXZlbnRzIHJlc3RvcmluZyBzZXNzaW9ucyB0aGF0IHdlcmUgcHJvcGVybHkgZGlzY29ubmVjdGVkXG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC5nZXRWYWx1ZSgpID09PSBDYWxsU3RhdGUuRElTQ09OTkVDVEVEKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gQ2FsbCBzdGF0ZSBpcyBESVNDT05ORUNURUQsIHNraXBwaW5nIHJlc3RvcmUnKTtcbiAgICAgIHRoaXMuY2xlYXJTZXNzaW9uU3RhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdGUgPSBKU09OLnBhcnNlKHNhdmVkU3RhdGUpO1xuICAgICAgaWYgKHN0YXRlLnNlc3Npb25JZCAmJiBzdGF0ZS50b2tlbikge1xuICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gUmVzdG9yaW5nIHNlc3Npb24gZnJvbSBzdG9yYWdlJyk7XG4gICAgICAgIC8vIEZvcmNlIFBpUCBtb2RlIGZvciByZXN0b3JhdGlvbiB0byBlbnN1cmUgVUkgY29uc2lzdGVuY3lcbiAgICAgICAgdGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChWaWV3TW9kZS5QSVApO1xuXG4gICAgICAgIGlmIChzdGF0ZS5idXNpbmVzc1JvbGUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRCdXNpbmVzc1JvbGUgPSBzdGF0ZS5idXNpbmVzc1JvbGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbm5lY3RTZXNzaW9uKFxuICAgICAgICAgIHN0YXRlLnNlc3Npb25JZCxcbiAgICAgICAgICBzdGF0ZS50b2tlbixcbiAgICAgICAgICBjb250YWluZXJJZCwgLy8gVXNlIHRoZSBzYW1lIGNvbnRhaW5lciBmb3IgYm90aCBzaW5jZSB3ZSBhcmUgaW4gUGlQXG4gICAgICAgICAgY29udGFpbmVySWQsXG4gICAgICAgICAgdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlXG4gICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU2Vzc2lvbiByZXN0b3JlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIC8vIENsZWFyIHRoZSBkaXNjb25uZWN0ZWQgZmxhZyBpZiByZXN0b3JhdGlvbiBzdWNjZWVkc1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkRJU0NPTk5FQ1RFRF9GTEFHX0tFWSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRmFpbGVkIHRvIHJlc3RvcmUgc2Vzc2lvbjonLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlc3Npb25TdGF0ZSgpOyAvLyBDbGVhciBiYWQgc3RhdGVcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBFcnJvciBwYXJzaW5nIHNhdmVkIHNlc3Npb24gc3RhdGUnLCBlKTtcbiAgICAgIHRoaXMuY2xlYXJTZXNzaW9uU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBUEkgTWV0aG9kc1xuICAvKipcbiAgICogUFJPWFkgY2lyY3VpdCB0b2tlbjogL3YyL3Byb3h5L3ZpZGVvL3N0YXJ0XG4gICAqL1xuICBwdWJsaWMgc3RhcnRQcm94eVZpZGVvU2Vzc2lvbihcbiAgICBwYXlsb2FkOiBTdGFydFNlc3Npb25SZXF1ZXN0XG4gICk6IE9ic2VydmFibGU8R2VuZXJhdGVUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3Q8R2VuZXJhdGVUb2tlblJlc3BvbnNlPigndjIvcHJveHkvdmlkZW8vc3RhcnQnLCB7XG4gICAgICAgIGJvZHk6IHBheWxvYWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHJlc3BvbnNlIGFzIEdlbmVyYXRlVG9rZW5SZXNwb25zZSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVEFTIFNlcnZpY2U6IHN0YXJ0UHJveHlWaWRlb1Nlc3Npb24gZmFpbGVkJywgZXJyb3IpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQUk9YWSBjaXJjdWl0IHN0YXR1czogL3YyL3Byb3h5L3ZpZGVvL3N0YXR1c1xuICAgKi9cbiAgcHVibGljIGdldFByb3h5VmlkZW9TdGF0dXMoXG4gICAgcGF5bG9hZDogUHJveHlWaWRlb1N0YXR1c1JlcXVlc3RcbiAgKTogT2JzZXJ2YWJsZTxQcm94eVZpZGVvU3RhdHVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAucG9zdDxQcm94eVZpZGVvU3RhdHVzUmVzcG9uc2U+KCd2Mi9wcm94eS92aWRlby9zdGF0dXMnLCB7XG4gICAgICAgIGJvZHk6IHBheWxvYWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHJlc3BvbnNlIGFzIFByb3h5VmlkZW9TdGF0dXNSZXNwb25zZSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVEFTIFNlcnZpY2U6IGdldFByb3h5VmlkZW9TdGF0dXMgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQUk9YWSBjaXJjdWl0IHVzZXIgbW9kaWZpY2F0aW9uOiAvdjIvcHJveHkvdmlkZW8vdXNlci9tb2RpZnlcbiAgICovXG4gIHB1YmxpYyBtb2RpZnlQcm94eVZpZGVvVXNlcihwYXlsb2FkOiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5wYXRjaDxhbnk+KCd2Mi9wcm94eS92aWRlby91c2VyL21vZGlmeScsIHtcbiAgICAgICAgYm9keTogcGF5bG9hZCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVEFTIFNlcnZpY2U6IG1vZGlmeVByb3h5VmlkZW9Vc2VyIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZmluaXNoUHJveHlWaWRlb1Nlc3Npb24ocGF5bG9hZDogUHJveHlWaWRlb0ZpbmlzaFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAucG9zdDxGaW5pc2hTZXNzaW9uUmVzcG9uc2U+KCd2Mi9wcm94eS92aWRlby9maW5pc2gnLCB7XG4gICAgICAgIGJvZHk6IHBheWxvYWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHJlc3BvbnNlIGFzIEZpbmlzaFNlc3Npb25SZXNwb25zZSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVEFTIFNlcnZpY2U6IGZpbmlzaFByb3h5VmlkZW9TZXNzaW9uIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXIgYXBwb2ludG1lbnRzIHdpdGhpbiBhIGRhdGUgcmFuZ2UuXG4gICAqIEBwYXJhbSBwYXJhbXMgRGF0ZSByYW5nZSBmb3IgcXVlcnlpbmcgYXBwb2ludG1lbnRzXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgYXBwb2ludG1lbnQgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBnZXRBcHBvaW50bWVudHMocGFyYW1zOiBHZXRBcHBvaW50bWVudHNSZXF1ZXN0KTogT2JzZXJ2YWJsZTxUYXNBcHBvaW50bWVudFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLmdldDxUYXNBcHBvaW50bWVudFtdPihcbiAgICAgICAgYHYyL3Byb3h5L2FwcG9pbnRtZW50L2FnZW5kYXMvdXNlci9hcHBvaW50bWVudHM/ZnJvbURhdGU9JHtwYXJhbXMuZnJvbURhdGV9JnRvRGF0ZT0ke3BhcmFtcy50b0RhdGV9YCxcbiAgICAgICAgeyBoZWFkZXJzOiB7fSB9XG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQVMgU2VydmljZTogZ2V0QXBwb2ludG1lbnRzIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYXV0b21hdGljIHN0YXR1cyBwb2xsaW5nIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgKiBTdGF0dXMgaXMgcG9sbGVkIGV2ZXJ5IFNUQVRVU19QT0xMX0lOVEVSVkFMX01TIG1pbGxpc2Vjb25kcy5cbiAgICovXG5cblxuICAvKipcbiAgICogU3RvcCBhdXRvbWF0aWMgc3RhdHVzIHBvbGxpbmcuXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIEZldGNoIHN0YXR1cyBhbmQgcHJvY2VzcyB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIGZldGNoQW5kUHJvY2Vzc1N0YXR1cyhwYXJhbXM6IFByb3h5VmlkZW9TdGF0dXNSZXF1ZXN0KTogdm9pZCB7XG4gICAgdGhpcy5nZXRQcm94eVZpZGVvU3RhdHVzKHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdGF0dXNSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gU3RhdHVzIHBvbGxpbmcgZXJyb3I6JywgZXJyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBzdGF0dXMgcmVzcG9uc2UgdG8gdXBkYXRlIHdhaXRpbmcgcm9vbSB1c2VycyBhbmQgb3duZXIgam9pbiBzdGF0dXMuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NTdGF0dXNSZXNwb25zZShyZXNwb25zZTogUHJveHlWaWRlb1N0YXR1c1Jlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgY29udGVudCA9IHJlc3BvbnNlLmNvbnRlbnQ7XG5cbiAgICAvLyBVcGRhdGUgdmlkZW9DYWxsSWQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGNvbnRlbnQudmlkZW9DYWxsSWQpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZGVvQ2FsbElkID0gY29udGVudC52aWRlb0NhbGxJZDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc2Vzc2lvbklkIGlmIGF2YWlsYWJsZVxuICAgIGlmIChjb250ZW50LnNlc3Npb25JZCkge1xuICAgICAgdGhpcy5jdXJyZW50U2Vzc2lvbklkID0gY29udGVudC5zZXNzaW9uSWQ7XG4gICAgICB0aGlzLnByb3h5VmlkZW9TZXNzaW9uSWQgPSBjb250ZW50LnNlc3Npb25JZDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgam9pbmFibGUgc3RhdHVzXG4gICAgdGhpcy5qb2luYWJsZVN1YmplY3QubmV4dChjb250ZW50LmpvaW5hYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBhY3RpdmF0ZUdlbyBzdGF0dXNcbiAgICBpZiAoY29udGVudC5hY3RpdmF0ZUdlbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gYWN0aXZhdGVHZW8gcmVjZWl2ZWQ6JywgY29udGVudC5hY3RpdmF0ZUdlbyk7XG4gICAgICB0aGlzLmFjdGl2YXRlR2VvU3ViamVjdC5uZXh0KGNvbnRlbnQuYWN0aXZhdGVHZW8pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBnZW9SZXF1ZXN0QWN0aXZlIHN0YXR1cyAob3duZXIgd2FpdGluZyBmb3IgdXNlciBnZW8gcmVzcG9uc2UpXG4gICAgaWYgKGNvbnRlbnQuZ2VvUmVxdWVzdEFjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gZ2VvUmVxdWVzdEFjdGl2ZSByZWNlaXZlZDonLCBjb250ZW50Lmdlb1JlcXVlc3RBY3RpdmUpO1xuICAgICAgdGhpcy5nZW9SZXF1ZXN0QWN0aXZlU3ViamVjdC5uZXh0KGNvbnRlbnQuZ2VvUmVxdWVzdEFjdGl2ZSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGFsbEdlb0dyYW50ZWQgc3RhdHVzIChhbGwgdXNlcnMgcmVzcG9uZGVkIHdpdGggZ2VvKVxuICAgIGlmIChjb250ZW50LmFsbEdlb0dyYW50ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGFsbEdlb0dyYW50ZWQgcmVjZWl2ZWQ6JywgY29udGVudC5hbGxHZW9HcmFudGVkKTtcbiAgICAgIHRoaXMuYWxsR2VvR3JhbnRlZFN1YmplY3QubmV4dChjb250ZW50LmFsbEdlb0dyYW50ZWQpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG93bmVyIGhhcyBqb2luZWRcbiAgICBjb25zdCBvd25lckpvaW5lZCA9IHRoaXMuY2hlY2tJZk93bmVySm9pbmVkKGNvbnRlbnQudXNlcnMpO1xuICAgIHRoaXMub3duZXJIYXNKb2luZWRTdWJqZWN0Lm5leHQob3duZXJKb2luZWQpO1xuXG4gICAgLy8gRGV0ZWN0IGlmIG93bmVyIGxlZnQ6IHdhcyBwcmVzZW50LCBub3cgbm90IHByZXNlbnRcbiAgICBpZiAodGhpcy53YXNPd25lclByZXNlbnQgJiYgIW93bmVySm9pbmVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gT3duZXIgaGFzIGxlZnQgdGhlIHNlc3Npb24nKTtcbiAgICAgIHRoaXMub3duZXJIYXNMZWZ0U3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cblxuICAgIGlmIChvd25lckpvaW5lZCkge1xuICAgICAgdGhpcy53YXNPd25lclByZXNlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgd2FpdGluZyByb29tIHVzZXJzIChzdGF0dXMgPT09IFdBSVRJTkcpXG4gICAgY29uc3Qgd2FpdGluZ1VzZXJzOiBXYWl0aW5nUm9vbVVzZXJbXSA9IGNvbnRlbnQudXNlcnNcbiAgICAgIC5maWx0ZXIoKHUpID0+ICh1LnN0YXR1cyBhcyBzdHJpbmcpID09PSAnV0FJVElORycpXG4gICAgICAubWFwKCh1KSA9PiAoe1xuICAgICAgICB1c2VySWQ6IHUudXNlcklkLFxuICAgICAgICBuYW1lOiBgVXNlciAke3UudXNlcklkfWAsIC8vIFRPRE86IEZldGNoIGFjdHVhbCB1c2VyIG5hbWVzIGZyb20gYSB1c2VyIHNlcnZpY2VcbiAgICAgICAgc3RhdHVzOiBSb29tVXNlclN0YXR1cy5XQUlUSU5HLFxuICAgICAgfSkpO1xuXG4gICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzU3ViamVjdC5uZXh0KHdhaXRpbmdVc2Vycyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYXQgbGVhc3Qgb25lIE9XTkVSIGhhcyBqb2luZWQgdGhlIGNhbGwuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrSWZPd25lckpvaW5lZChcbiAgICB1c2VyczogeyB1c2VySWQ6IG51bWJlcjsgcm9sOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH1bXVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXNlcnMuc29tZShcbiAgICAgICh1KSA9PiB1LnJvbCA9PT0gVGFzVXNlclJvbGUuT1dORVIgJiYgdS5zdGF0dXMgPT09ICdKT0lORUQnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZG1pdCBhIHVzZXIgZnJvbSB0aGUgd2FpdGluZyByb29tIGJ5IGNoYW5naW5nIHRoZWlyIHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBhZG1pdFVzZXJGcm9tV2FpdGluZ1Jvb20oXG4gICAgdXNlcklkOiBudW1iZXIsXG4gICAgdmlkZW9DYWxsSWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm1vZGlmeVByb3h5VmlkZW9Vc2VyKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHZpZGVvQ2FsbElkLFxuICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5XQUlUSU5HX1JPT01fTEVBVkUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBHZXR0ZXJzIGZvciBjdXJyZW50IGNhbGwgY29udGV4dFxuICBwdWJsaWMgZ2V0IGFwcG9pbnRtZW50SWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEFwcG9pbnRtZW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpZGVvQ2FsbElkKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWRlb0NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0cyB0byBhIFRva0JveCB2aWRlbyBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgY29ubmVjdFNlc3Npb24oXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBwdWJsaXNoZXJFbGVtZW50OiBzdHJpbmcsXG4gICAgc3Vic2NyaWJlckVsZW1lbnQ6IHN0cmluZyxcbiAgICBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5DT05ORUNUSU5HKTtcbiAgICB0aGlzLmN1cnJlbnRTZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgdGhpcy5jdXJyZW50VG9rZW4gPSB0b2tlbjtcbiAgICB0aGlzLmN1cnJlbnRCdXNpbmVzc1JvbGUgPSBidXNpbmVzc1JvbGU7XG4gICAgdGhpcy5pc0ZpbmlzaGluZ1Nlc3Npb24gPSBmYWxzZTsgLy8gUmVzZXQgZmxhZyBmb3IgbmV3IHNlc3Npb25cblxuICAgIC8vIFNhdmUgaW5pdGlhbCBzdGF0ZSAoZGVmYXVsdGluZyB0byBjdXJyZW50IHZpZXcgbW9kZSlcbiAgICB0aGlzLnNhdmVTZXNzaW9uU3RhdGUoXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0b2tlbixcbiAgICAgIHRoaXMudmlld01vZGVTdWJqZWN0LmdldFZhbHVlKCksXG4gICAgICBidXNpbmVzc1JvbGVcbiAgICApO1xuICAgIC8vIENsZWFyIHRoZSBkaXNjb25uZWN0ZWQgZmxhZyB3aGVuIHN0YXJ0aW5nIGEgbmV3IGNvbm5lY3Rpb25cbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuRElTQ09OTkVDVEVEX0ZMQUdfS0VZKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIU9ULmNoZWNrU3lzdGVtUmVxdWlyZW1lbnRzKCkpIHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQnJvd3NlciBub3QgY29tcGF0aWJsZSB3aXRoIFRva0JveCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlc3Npb24gPSBPVC5pbml0U2Vzc2lvbih0aGlzLmNvbmZpZy50b2tCb3hBcGlLZXksIHNlc3Npb25JZCk7XG5cbiAgICAgIC8vIEhhbmRsZSBuZXcgc3RyZWFtcyAocmVtb3RlIHBhcnRpY2lwYW50cyBqb2luaW5nKVxuICAgICAgdGhpcy5zZXNzaW9uLm9uKCdzdHJlYW1DcmVhdGVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSB0aGlzLnNlc3Npb24/LnN1YnNjcmliZShcbiAgICAgICAgICBldmVudC5zdHJlYW0sXG4gICAgICAgICAgc3Vic2NyaWJlckVsZW1lbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0TW9kZTogJ2FwcGVuZCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBzdHJlYW06JywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBIYW5kbGUgc3RyZWFtcyBlbmRpbmcgKHJlbW90ZSBwYXJ0aWNpcGFudHMgbGVhdmluZylcbiAgICAgIHRoaXMuc2Vzc2lvbi5vbignc3RyZWFtRGVzdHJveWVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMgPSB0aGlzLnN1YnNjcmliZXJzLmZpbHRlcihcbiAgICAgICAgICAoc3ViKSA9PiBzdWIuc3RyZWFtPy5zdHJlYW1JZCAhPT0gZXZlbnQuc3RyZWFtLnN0cmVhbUlkXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSGFuZGxlIHNlc3Npb24gZGlzY29ubmVjdGlvblxuICAgICAgdGhpcy5zZXNzaW9uLm9uKCdzZXNzaW9uRGlzY29ubmVjdGVkJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRElTQ09OTkVDVEVEKTtcblxuICAgICAgICAvLyBDYWxsIGZpbmlzaFNlc3Npb24gd2hlbiBzZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCAoZS5nLiwgYnkgc2VydmVyKVxuICAgICAgICAvLyBPbmx5IGNhbGwgaWYgbm90IGFscmVhZHkgZmluaXNoaW5nIChwcmV2ZW50cyBkdXBsaWNhdGUgY2FsbHMpXG4gICAgICAgIGNvbnN0IHNlc3Npb25JZFRvRmluaXNoID0gdGhpcy5jdXJyZW50U2Vzc2lvbklkO1xuICAgICAgICBpZiAoc2Vzc2lvbklkVG9GaW5pc2ggJiYgIXRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy5pc0ZpbmlzaGluZ1Nlc3Npb24gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZmluaXNoUHJveHlWaWRlb1Nlc3Npb24oe1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRUb0ZpbmlzaCxcbiAgICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlLFxuICAgICAgICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFNlc3Npb24gZmluaXNoZWQgb24gZGlzY29ubmVjdCBldmVudDonLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBFcnJvciBmaW5pc2hpbmcgc2Vzc2lvbiBvbiBkaXNjb25uZWN0OicsIGVycm9yKTtcbiAgICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGluZ1Nlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBDb25uZWN0IHRvIHNlc3Npb25cbiAgICAgIHRoaXMuc2Vzc2lvbi5jb25uZWN0KHRva2VuLCAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY29ubmVjdGluZyB0byBzZXNzaW9uOicsIGVycm9yKTtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwdWJsaXNoZXIgKGxvY2FsIHZpZGVvKVxuICAgICAgICB0aGlzLnB1Ymxpc2hlciA9IE9ULmluaXRQdWJsaXNoZXIoXG4gICAgICAgICAgcHVibGlzaGVyRWxlbWVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnNlcnRNb2RlOiAnYXBwZW5kJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHB1Ymxpc2hlcjonLCBlcnIpO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQdWJsaXNoIHRvIHNlc3Npb25cbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbj8ucHVibGlzaCh0aGlzLnB1Ymxpc2hlciwgKHB1YkVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAocHViRXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHVibGlzaGluZyBzdHJlYW06JywgcHViRXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuICAgICAgICAgICAgICAgIHJlamVjdChwdWJFcnIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5DT05ORUNURUQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBWaWRlbyBFbGVtZW50IE1vdmVtZW50IE1ldGhvZHNcbiAgcHVibGljIG1vdmVQdWJsaXNoZXJUbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnB1Ymxpc2hlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgcHVibGlzaGVyRWxlbWVudCA9IHRoaXMucHVibGlzaGVyLmVsZW1lbnQ7XG4gICAgY29uc3QgbmV3Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmV3Q29udGFpbmVySWQpO1xuXG4gICAgaWYgKHB1Ymxpc2hlckVsZW1lbnQgJiYgbmV3Q29udGFpbmVyKSB7XG4gICAgICBuZXdDb250YWluZXIuYXBwZW5kQ2hpbGQocHVibGlzaGVyRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vdmVTdWJzY3JpYmVyc1RvKG5ld0NvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXdDb250YWluZXJJZCk7XG4gICAgaWYgKCFuZXdDb250YWluZXIpIHJldHVybjtcblxuICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaWJlckVsZW1lbnQgPSBzdWJzY3JpYmVyLmVsZW1lbnQ7XG4gICAgICBpZiAoc3Vic2NyaWJlckVsZW1lbnQpIHtcbiAgICAgICAgbmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHN1YnNjcmliZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbWFpbiB2aWRlbyAoc3Vic2NyaWJlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBwdWJsaXNoZXIpIHRvIGEgY29udGFpbmVyLlxuICAgKiBVc2VkIGZvciBQaVAgbW9kZSB0byBzaG93IG9ubHkgb25lIHZpZGVvLlxuICAgKi9cbiAgcHVibGljIG1vdmVNYWluVmlkZW9UbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmV3Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmV3Q29udGFpbmVySWQpO1xuICAgIGlmICghbmV3Q29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBQcmVmZXIgcmVtb3RlIHZpZGVvIChzdWJzY3JpYmVyKSBhcyBtYWluXG4gICAgaWYgKHRoaXMuc3Vic2NyaWJlcnMubGVuZ3RoID4gMCAmJiB0aGlzLnN1YnNjcmliZXJzWzBdLmVsZW1lbnQpIHtcbiAgICAgIG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnN1YnNjcmliZXJzWzBdLmVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byBsb2NhbCB2aWRlbyAocHVibGlzaGVyKVxuICAgIGlmICh0aGlzLnB1Ymxpc2hlcj8uZWxlbWVudCkge1xuICAgICAgbmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucHVibGlzaGVyLmVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB2aWRlb3MgYmFjayB0byBmdWxsc2NyZWVuIGNvbnRhaW5lcnNcbiAgICovXG4gIHB1YmxpYyBtb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCk6IHZvaWQge1xuICAgIHRoaXMubW92ZVN1YnNjcmliZXJzVG8oJ3N1YnNjcmliZXItY29udGFpbmVyJyk7XG4gICAgdGhpcy5tb3ZlUHVibGlzaGVyVG8oJ3B1Ymxpc2hlci1jb250YWluZXInKTtcbiAgfVxufVxuIl19