@vgroup/dialbox 0.7.64 → 0.7.65
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/esm2020/lib/components/call-progress/call-progress.component.mjs +18 -10
- package/esm2020/lib/dialbox.component.mjs +62 -31
- package/esm2020/lib/environments/environments.mjs +12 -12
- package/esm2020/lib/service/twilio.service.mjs +121 -15
- package/fesm2015/vgroup-dialbox.mjs +224 -79
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +208 -63
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/lib/service/twilio.service.d.ts +6 -1
- package/package.json +1 -1
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
export const environment = {
|
|
2
|
-
abb: "
|
|
2
|
+
abb: "t",
|
|
3
3
|
production: false,
|
|
4
4
|
secureCookies: true,
|
|
5
|
-
feUrl: 'https://
|
|
6
|
-
apiUrl: 'https://
|
|
7
|
-
websocketUrl: 'wss://
|
|
5
|
+
feUrl: 'https://test.vgroupinc.com:91/',
|
|
6
|
+
apiUrl: 'https://apis.vgroupinc.com/test_softphone',
|
|
7
|
+
websocketUrl: 'wss://apis.vgroupinc.com/test_softphone/',
|
|
8
8
|
captchaKey: "6LfpOmEaAAAAAGsI6JXlMzOl3b7rW4YmYXFDjldD",
|
|
9
|
-
stripePublishableKey: "
|
|
9
|
+
stripePublishableKey: "pk_test_51NbMVaA3guus6fhlTuCV5ycFTIJmwgN38dDUf9pNPfM319x5CkLbV6EbTQaZiNOrRsfR16RWLE8hQmR0eZFTBqTy00Wlsug4qS",
|
|
10
10
|
sessionTimeout: 15,
|
|
11
11
|
deviceType: "web",
|
|
12
|
-
appVersion: "2.
|
|
13
|
-
channelId: '
|
|
12
|
+
appVersion: "2.3",
|
|
13
|
+
channelId: '61481b12e138eb7dc3007579',
|
|
14
14
|
c2c_support_point_id: '60424735f74ac306c1bfa900',
|
|
15
|
-
c2c_support_channel_id: '
|
|
16
|
-
c2c_point_url: 'https://
|
|
17
|
-
c2c_call_label_id: '
|
|
18
|
-
c2c_email_label_id: '
|
|
15
|
+
c2c_support_channel_id: '677f6726be93ab507fbbfdf0',
|
|
16
|
+
c2c_point_url: 'https://app.contexttocall.com/assets/cdn/c2c.js',
|
|
17
|
+
c2c_call_label_id: '6NU5fKE2mGTyXDC3yhmK',
|
|
18
|
+
c2c_email_label_id: 'YPMamj8RvsGORVvqXWyc',
|
|
19
19
|
radarAPIKey: 'prj_live_sk_569b6f639edde6120a26f703511c61aaecd3f7ef',
|
|
20
20
|
firebase: {
|
|
21
21
|
apiKey: "AIzaSyCA8LSPrqlDq_thk26LhBQexAQeY6pkU5Y",
|
|
@@ -32,4 +32,4 @@ export const environment = {
|
|
|
32
32
|
keycloakRealm: 'vgroup-test',
|
|
33
33
|
keycloakClientId: 'c2c-softphone-app'
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsVUFBVSxFQUFFLEtBQUs7SUFDakIsYUFBYSxFQUFFLElBQUk7SUFDbkIsS0FBSyxFQUFDLGdDQUFnQztJQUN0QyxNQUFNLEVBQUUsMkNBQTJDO0lBQ2pELFlBQVksRUFBRSwwQ0FBMEM7SUFDMUQsVUFBVSxFQUFFLDBDQUEwQztJQUN0RCxvQkFBb0IsRUFBRSw2R0FBNkc7SUFDbkksY0FBYyxFQUFFLEVBQUU7SUFDbEIsVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLEtBQUs7SUFDakIsU0FBUyxFQUFFLDBCQUEwQjtJQUNyQyxvQkFBb0IsRUFBQywwQkFBMEI7SUFDL0Msc0JBQXNCLEVBQUMsMEJBQTBCO0lBQ2pELGFBQWEsRUFBQyxpREFBaUQ7SUFDL0QsaUJBQWlCLEVBQUMsc0JBQXNCO0lBQ3hDLGtCQUFrQixFQUFDLHNCQUFzQjtJQUN6QyxXQUFXLEVBQUUsc0RBQXNEO0lBQ25FLFFBQVEsRUFBRTtRQUNOLE1BQU0sRUFBRSx5Q0FBeUM7UUFDakQsVUFBVSxFQUFFLGlDQUFpQztRQUM3QyxTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLGFBQWEsRUFBRSw2QkFBNkI7UUFDNUMsaUJBQWlCLEVBQUUsY0FBYztRQUNqQyxLQUFLLEVBQUUsMkNBQTJDO1FBQ2xELGFBQWEsRUFBRSxjQUFjO1FBQzdCLFFBQVEsRUFBQyx5RkFBeUY7S0FDckc7SUFDSCxpQkFBaUIsRUFBRSx5Q0FBeUM7SUFDMUQsV0FBVyxFQUFFLHNDQUFzQztJQUNuRCxhQUFhLEVBQUUsYUFBYTtJQUM1QixnQkFBZ0IsRUFBRSxtQkFBbUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcclxuICBhYmI6IFwidFwiLFxyXG4gIHByb2R1Y3Rpb246IGZhbHNlLFxyXG4gIHNlY3VyZUNvb2tpZXM6IHRydWUsXHJcbiAgZmVVcmw6J2h0dHBzOi8vdGVzdC52Z3JvdXBpbmMuY29tOjkxLycsXHJcbiAgYXBpVXJsOiAnaHR0cHM6Ly9hcGlzLnZncm91cGluYy5jb20vdGVzdF9zb2Z0cGhvbmUnLFxyXG4gICAgd2Vic29ja2V0VXJsOiAnd3NzOi8vYXBpcy52Z3JvdXBpbmMuY29tL3Rlc3Rfc29mdHBob25lLycsXHJcbiAgY2FwdGNoYUtleTogXCI2TGZwT21FYUFBQUFBR3NJNkpYbE16T2wzYjdyVzRZbVlYRkRqbGREXCIsXHJcbiAgc3RyaXBlUHVibGlzaGFibGVLZXk6IFwicGtfdGVzdF81MU5iTVZhQTNndXVzNmZobFR1Q1Y1eWNGVElKbXdnTjM4ZERVZjlwTlBmTTMxOXg1Q2tMYlY2RWJUUWFaaU5PclJzZlIxNlJXTEU4aFFtUjBlWkZUQnFUeTAwV2xzdWc0cVNcIixcclxuICBzZXNzaW9uVGltZW91dDogMTUsIC8vaW4gbWluc1xyXG4gIGRldmljZVR5cGU6IFwid2ViXCIsXHJcbiAgYXBwVmVyc2lvbjogXCIyLjNcIixcclxuICBjaGFubmVsSWQ6ICc2MTQ4MWIxMmUxMzhlYjdkYzMwMDc1NzknLFxyXG4gIGMyY19zdXBwb3J0X3BvaW50X2lkOic2MDQyNDczNWY3NGFjMzA2YzFiZmE5MDAnLFxyXG4gIGMyY19zdXBwb3J0X2NoYW5uZWxfaWQ6JzY3N2Y2NzI2YmU5M2FiNTA3ZmJiZmRmMCcsXHJcbiAgYzJjX3BvaW50X3VybDonaHR0cHM6Ly9hcHAuY29udGV4dHRvY2FsbC5jb20vYXNzZXRzL2Nkbi9jMmMuanMnLFxyXG4gIGMyY19jYWxsX2xhYmVsX2lkOic2TlU1ZktFMm1HVHlYREMzeWhtSycsLy8gdGVzdFxyXG4gIGMyY19lbWFpbF9sYWJlbF9pZDonWVBNYW1qOFJ2c0dPUlZ2cVhXeWMnLC8vIHRlc3RcclxuICByYWRhckFQSUtleTogJ3Byal9saXZlX3NrXzU2OWI2ZjYzOWVkZGU2MTIwYTI2ZjcwMzUxMWM2MWFhZWNkM2Y3ZWYnLFxyXG4gIGZpcmViYXNlOiB7XHJcbiAgICAgIGFwaUtleTogXCJBSXphU3lDQThMU1BycWxEcV90aGsyNkxoQlFleEFRZVk2cGtVNVlcIixcclxuICAgICAgYXV0aERvbWFpbjogXCJzb2Z0cGhvbmUtZDU3NzcuZmlyZWJhc2VhcHAuY29tXCIsXHJcbiAgICAgIHByb2plY3RJZDogXCJzb2Z0cGhvbmUtZDU3NzdcIixcclxuICAgICAgc3RvcmFnZUJ1Y2tldDogXCJzb2Z0cGhvbmUtZDU3NzcuYXBwc3BvdC5jb21cIixcclxuICAgICAgbWVzc2FnaW5nU2VuZGVySWQ6IFwiODUwODEyNDk0NTM4XCIsXHJcbiAgICAgIGFwcElkOiBcIjE6ODUwODEyNDk0NTM4OndlYjo3NGY4YTMwZmMxOGUyOGRlZDc4YTMzXCIsXHJcbiAgICAgIG1lYXN1cmVtZW50SWQ6IFwiRy1OR1hUU1Y5U0gzXCIsXHJcbiAgICAgIHZhcGlkS2V5OlwiQkQ2RWdjUWdiWlRqT1FmbGVHM1lsRWMwX1NhakIwM3BycVRkRHktcUdKa3hUeGV6YnEtQV9xdHVYRTFsM3lUNDdvOGhuVEFiVEtCY0gxNUQyQUpCMlRvXCJcclxuICB9LFxyXG5wZXJzcGVjdGl2ZUFwaUtleTogJ0FJemFTeUNsZjMybHZMSDRRT3ktdk9uekx6d1NObnRLSWdhcEg4cycsXHJcbiAga2V5Y2xvYWtVUkw6ICdodHRwczovL3Rlc3Qta2V5Y2xvYWsudmdyb3VwaW5jLmNvbS8nLFxyXG4gIGtleWNsb2FrUmVhbG06ICd2Z3JvdXAtdGVzdCcsXHJcbiAga2V5Y2xvYWtDbGllbnRJZDogJ2MyYy1zb2Z0cGhvbmUtYXBwJ1xyXG59OyJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpHeaders, HttpParams } from '@angular/common/http';
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject, of, throwError } from 'rxjs';
|
|
3
|
+
import { BehaviorSubject, of, Subject, throwError } from 'rxjs';
|
|
4
4
|
import { catchError, shareReplay, tap } from 'rxjs/operators';
|
|
5
5
|
import { Device } from '@twilio/voice-sdk';
|
|
6
6
|
import { environment } from '../environments/environments';
|
|
@@ -44,6 +44,12 @@ export class TwilioService {
|
|
|
44
44
|
this.tokenRefreshInProgress = false;
|
|
45
45
|
this.recoveryAttempts = 0;
|
|
46
46
|
this.recoveryTimer = null;
|
|
47
|
+
// References to the 'unregistered'/'error' handlers currently attached to `this.device`,
|
|
48
|
+
// so an intentional replace can detach exactly those two before destroy() without
|
|
49
|
+
// touching any listeners the Twilio SDK itself may have wired to the same EventEmitter.
|
|
50
|
+
this.currentDeviceUnregisteredHandler = null;
|
|
51
|
+
this.currentDeviceErrorHandler = null;
|
|
52
|
+
this.incomingCallNotification = new Subject();
|
|
47
53
|
// User-controlled switch (in the call-progress UI). When ON, a new incoming
|
|
48
54
|
// call's built-in Twilio ringtone is silenced so it does not disturb the
|
|
49
55
|
// ongoing call. Source of truth so newly created (spare) devices inherit it.
|
|
@@ -63,14 +69,24 @@ export class TwilioService {
|
|
|
63
69
|
if (this.tokenInitialized) {
|
|
64
70
|
return this.tokenInitialization$ || of(null);
|
|
65
71
|
}
|
|
72
|
+
// A fetch is already in flight — AppInitializerService and the dialbox component
|
|
73
|
+
// both call initializeTwilioDevice() on startup, and without this they'd race:
|
|
74
|
+
// the second call would fire its own token request and, once resolved, call
|
|
75
|
+
// initializeDevice() again, destroying the device the first call just created and
|
|
76
|
+
// touching off a spurious 'unregistered' -> recovery cascade. Share the same
|
|
77
|
+
// in-flight request instead.
|
|
78
|
+
if (this.tokenInitialization$) {
|
|
79
|
+
return this.tokenInitialization$;
|
|
80
|
+
}
|
|
66
81
|
this.tokenInitialization$ = this.extensionService.getIncomingCallToken(this.deviceId).pipe(tap((data) => {
|
|
67
82
|
this.incomingCallToken = data.token;
|
|
68
83
|
localStorage.setItem('in-token', data.token);
|
|
69
84
|
this.tokenInitialized = true;
|
|
70
|
-
console.log('dfdfdsfdsfds');
|
|
71
85
|
this.initializeDevice();
|
|
72
86
|
}), catchError(error => {
|
|
73
87
|
console.error('Error initializing Twilio token:', error);
|
|
88
|
+
// Allow a fresh attempt next time since this one failed.
|
|
89
|
+
this.tokenInitialization$ = null;
|
|
74
90
|
return throwError(() => error);
|
|
75
91
|
}), shareReplay(1) // Cache the result for subsequent subscribers
|
|
76
92
|
);
|
|
@@ -91,26 +107,52 @@ export class TwilioService {
|
|
|
91
107
|
console.warn('Skipping device re-init: active accepted calls exist:', this.acceptedCallList.length);
|
|
92
108
|
return;
|
|
93
109
|
}
|
|
110
|
+
// Detach the 'unregistered'/'error' handlers we attached before destroying, so
|
|
111
|
+
// this *intentional* teardown can't fire them below — otherwise a deliberate
|
|
112
|
+
// replace looks identical to an unexpected drop and touches off a
|
|
113
|
+
// destroy -> 'unregistered' -> scheduleDeviceRecovery -> destroy cascade.
|
|
114
|
+
// (Only removes our own handlers, not anything the Twilio SDK itself may have
|
|
115
|
+
// wired to the same EventEmitter, so its own destroy()/cleanup is unaffected.)
|
|
116
|
+
try {
|
|
117
|
+
if (this.currentDeviceUnregisteredHandler) {
|
|
118
|
+
this.device.removeListener('unregistered', this.currentDeviceUnregisteredHandler);
|
|
119
|
+
}
|
|
120
|
+
if (this.currentDeviceErrorHandler) {
|
|
121
|
+
this.device.removeListener('error', this.currentDeviceErrorHandler);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (_) { }
|
|
94
125
|
this.device.destroy();
|
|
95
126
|
}
|
|
96
127
|
if (!this.incomingCallToken) {
|
|
97
128
|
console.error('No Twilio token available');
|
|
98
129
|
return;
|
|
99
130
|
}
|
|
100
|
-
|
|
101
|
-
this.device
|
|
131
|
+
const device = new Device(this.incomingCallToken, { allowIncomingWhileBusy: true });
|
|
132
|
+
this.device = device;
|
|
133
|
+
device.on('registered', () => {
|
|
102
134
|
console.log('Twilio Device registered successfully');
|
|
103
|
-
this.recoveryAttempts =
|
|
135
|
+
this.recoveryAttempts = 10;
|
|
136
|
+
// A recovery attempt may have been scheduled by an earlier device instance
|
|
137
|
+
// before this one came up — it's stale now, cancel it so it can't tear this
|
|
138
|
+
// healthy device down later.
|
|
139
|
+
if (this.recoveryTimer) {
|
|
140
|
+
clearTimeout(this.recoveryTimer);
|
|
141
|
+
this.recoveryTimer = null;
|
|
142
|
+
}
|
|
143
|
+
this.prepareDevice2ForIncomingCall();
|
|
104
144
|
});
|
|
105
145
|
// Twilio fires this ~3 minutes before the access token expires. Swap in a
|
|
106
146
|
// fresh one via updateToken() so the signaling connection never has to drop
|
|
107
147
|
// in the first place (this is the main cause of "idle for a while, BE still
|
|
108
148
|
// notifies but Twilio incoming event never fires").
|
|
109
|
-
|
|
149
|
+
device.on('tokenWillExpire', () => {
|
|
110
150
|
this.refreshDeviceToken();
|
|
111
151
|
});
|
|
112
|
-
|
|
152
|
+
device.on('incoming', (call) => {
|
|
113
153
|
console.log('Twilio Device incoming call event:', call);
|
|
154
|
+
const notification = this.buildIncomingNotification(call);
|
|
155
|
+
this.incomingCallNotification.next(notification);
|
|
114
156
|
if (this.acceptedCallList.length > 0 || this.primaryHasCall) {
|
|
115
157
|
console.log('primary device: concurrent call arriving – spare device will handle it');
|
|
116
158
|
this.isShowIncomingCall = true;
|
|
@@ -122,7 +164,7 @@ export class TwilioService {
|
|
|
122
164
|
this.prepareDevice2ForIncomingCall();
|
|
123
165
|
if (this.isIncomingMuted) {
|
|
124
166
|
try {
|
|
125
|
-
|
|
167
|
+
device.audio?.incoming(false);
|
|
126
168
|
}
|
|
127
169
|
catch (_) { }
|
|
128
170
|
}
|
|
@@ -145,21 +187,32 @@ export class TwilioService {
|
|
|
145
187
|
this.incomingCallDetail = call;
|
|
146
188
|
this.isShowIncomingCall = true;
|
|
147
189
|
});
|
|
148
|
-
|
|
190
|
+
const onDeviceError = (error) => {
|
|
191
|
+
// Stale event from a device we've already intentionally replaced — ignore.
|
|
192
|
+
if (this.device !== device)
|
|
193
|
+
return;
|
|
149
194
|
console.error('Twilio Device Error:', error);
|
|
150
195
|
this.isShowIncomingCall = false;
|
|
151
196
|
this.tokenInitialized = false;
|
|
152
197
|
this.scheduleDeviceRecovery();
|
|
153
|
-
}
|
|
154
|
-
this.
|
|
198
|
+
};
|
|
199
|
+
this.currentDeviceErrorHandler = onDeviceError;
|
|
200
|
+
device.on('error', onDeviceError);
|
|
201
|
+
const onDeviceUnregistered = () => {
|
|
202
|
+
// Stale event from a device we've already intentionally replaced — ignore.
|
|
203
|
+
if (this.device !== device)
|
|
204
|
+
return;
|
|
155
205
|
console.log('Twilio Device unregistered');
|
|
156
206
|
this.isShowIncomingCall = false;
|
|
157
207
|
this.tokenInitialized = false;
|
|
158
208
|
this.scheduleDeviceRecovery();
|
|
159
|
-
}
|
|
209
|
+
};
|
|
210
|
+
this.currentDeviceUnregisteredHandler = onDeviceUnregistered;
|
|
211
|
+
device.on('unregistered', onDeviceUnregistered);
|
|
160
212
|
// Register AFTER attaching all listeners
|
|
161
|
-
|
|
162
|
-
console.log('device created',
|
|
213
|
+
device.register();
|
|
214
|
+
console.log('device created', device);
|
|
215
|
+
return this.tokenInitialization$ || of(null);
|
|
163
216
|
}
|
|
164
217
|
// Proactively swap in a fresh access token ahead of expiry (see 'tokenWillExpire'
|
|
165
218
|
// above) so the Device's signaling connection survives long idle periods.
|
|
@@ -209,6 +262,57 @@ export class TwilioService {
|
|
|
209
262
|
});
|
|
210
263
|
}, delay);
|
|
211
264
|
}
|
|
265
|
+
// Build the full incoming-call notification payload (matches the shape the BE used to
|
|
266
|
+
// push over the socket) from the raw Twilio 'incoming' Call: parsed Params fields plus
|
|
267
|
+
// the derived clientSid/participantSid/notificationType/title/msgBody.
|
|
268
|
+
buildIncomingNotification(call) {
|
|
269
|
+
const notification = this.convertToJson(call?.parameters?.['Params'] || '{}');
|
|
270
|
+
const callSid = call?.parameters?.['CallSid'];
|
|
271
|
+
notification.clientSid = callSid;
|
|
272
|
+
// Only real Twilio SID exposed client-side for this leg; no separate participant SID
|
|
273
|
+
// is available, so it mirrors clientSid.
|
|
274
|
+
notification.participantSid = callSid;
|
|
275
|
+
notification.notificationType = 'incomingcall';
|
|
276
|
+
notification.title = 'Incoming Call';
|
|
277
|
+
notification.msgBody = `you have incoming call ${notification.fromName || ''}`;
|
|
278
|
+
return notification;
|
|
279
|
+
}
|
|
280
|
+
convertToJson(data) {
|
|
281
|
+
const obj = {};
|
|
282
|
+
if (!data) {
|
|
283
|
+
return obj;
|
|
284
|
+
}
|
|
285
|
+
// Format: key=value&key=value
|
|
286
|
+
if (data.includes('&')) {
|
|
287
|
+
const params = new URLSearchParams(data);
|
|
288
|
+
params.forEach((value, key) => {
|
|
289
|
+
obj[key] = value === 'true'
|
|
290
|
+
? true
|
|
291
|
+
: value === 'false'
|
|
292
|
+
? false
|
|
293
|
+
: decodeURIComponent(value);
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// Format: {key=value, key=value}
|
|
298
|
+
const text = data.trim().replace(/^\{|\}$/g, '');
|
|
299
|
+
text.split(',').forEach(item => {
|
|
300
|
+
const index = item.indexOf('=');
|
|
301
|
+
if (index > -1) {
|
|
302
|
+
const key = item.substring(0, index).trim();
|
|
303
|
+
let value = item.substring(index + 1).trim();
|
|
304
|
+
if (value === 'true')
|
|
305
|
+
value = true;
|
|
306
|
+
else if (value === 'false')
|
|
307
|
+
value = false;
|
|
308
|
+
obj[key] = value;
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
obj.read = false;
|
|
313
|
+
obj.save = false;
|
|
314
|
+
return obj;
|
|
315
|
+
}
|
|
212
316
|
// Safety net for the case where the underlying socket dies silently during a long
|
|
213
317
|
// sleep/idle period without ever firing 'error'/'unregistered' (the OS can suspend
|
|
214
318
|
// timers/sockets outright) — re-check device health whenever the app wakes up.
|
|
@@ -381,6 +485,8 @@ export class TwilioService {
|
|
|
381
485
|
this.trackIncomingCall(call);
|
|
382
486
|
this.incomingCallDetail = call;
|
|
383
487
|
this.isShowIncomingCall = true;
|
|
488
|
+
const notification = this.buildIncomingNotification(call);
|
|
489
|
+
this.incomingCallNotification.next(notification);
|
|
384
490
|
console.log('spare device: incoming call', call);
|
|
385
491
|
});
|
|
386
492
|
spare.on('error', (error) => {
|
|
@@ -525,4 +631,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
525
631
|
providedIn: 'root'
|
|
526
632
|
}]
|
|
527
633
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ExtensionService }]; } });
|
|
528
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdpbGlvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS90d2lsaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFjM0QsTUFBTSxPQUFPLGFBQWE7SUFnRHhCLFlBQ1UsSUFBZ0IsRUFDaEIsZ0JBQWtDO1FBRGxDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWhENUMsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDNUQsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUNyRCxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztRQUd0RixzQkFBaUIsR0FBUSxFQUFFLENBQUM7UUFFNUIsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFTLEtBQUssQ0FBQyxDQUFDO1FBRTlDLFVBQUssR0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxD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Q25ELENBQUMsQ0FBQTtJQUNKLENBQUM7OzJHQXpoQlUsYUFBYTsrR0FBYixhQUFhLGNBRlosTUFBTTs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzaGFyZVJlcGxheSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEZXZpY2UsIENhbGwgfSBmcm9tICdAdHdpbGlvL3ZvaWNlLXNkayc7XHJcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGlhbFBheWxvYWQge1xyXG4gIG51bWJlcjogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbWc6IHN0cmluZztcclxuICBjYWxsZXJJZDpzdHJpbmc7XHJcbiAgaXNEaWFsRnJvbUhpc3Rvcnk6Ym9vbGVhbjtcclxuICBmcm9tOnN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyAgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUd2lsaW9TZXJ2aWNlIHtcclxuICBcclxuICBvcGVuSW5Qcm9ncmVzc0RpYWxwYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBjdXJyZW50Q2FsbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbCB8IG51bGw+KG51bGwpO1xyXG4gIGN1cnJlbnRDYWxsU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oJ25vbmUnKTsgLy9pbi1wcm9ncmVzcywgb3V0LXByb2dyZXNzLCBub25lXHJcbiAgZGV2aWNlOmFueTtcclxuICBjYWxsITogQ2FsbDtcclxuICBpbmNvbWluZ0NhbGxUb2tlbjpzdHJpbmc9Jyc7XHJcbiAgb3V0Z29pbmdDYWxsVG9rZW4/OnN0cmluZztcclxuICBjYWxsVHlwZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignTklMJyk7XHJcbiAgaW5jb21pbmdDYWxsRGV0YWlsOiBhbnk7IC8vIGZvciBib3RoIGluY29taW5nIGFuZCBvdXRnb2luZ1xyXG4gIHRva2VuOmFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcclxuICBpc05ld0NvbnRhY3RBZGRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHVwZGF0ZVJlY2VudENhbGwgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBjYWxsaGFuZGxlRnJvbU5vdGlmaWNhdGlvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XHJcblxyXG4gIGVuZENhbGwgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBkaWFsTnVtYmVyRnJvbU90aGVyTW9kdWxlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEaWFsUGF5bG9hZD4oeyBudW1iZXI6ICcnLCBuYW1lOiAnJywgaW1nOiAnJywgY2FsbGVySWQ6ICcnLCBpc0RpYWxGcm9tSGlzdG9yeTogZmFsc2UsIGZyb206ICcnIH0pO1xyXG5cclxuICB0b2dnbGVDYWxsZXJJZEFsZXJ0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuICBpc1RyaWFsT3ZlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGlzUGF5bWVudER1ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGlzQXZhaWxhYmxlTnVtYmVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgY2FsbGVySWRMaXN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xyXG4gIHRyaWdnZXJTTVNSZWxvYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XHJcblxyXG4gIHRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIHRva2VuSW5pdGlhbGl6YXRpb24kOiBPYnNlcnZhYmxlPGFueT4gfCBudWxsID0gbnVsbDtcclxuICBkZXZpY2VJZDogYW55O1xyXG4gIGNvbmZlcmVuY2VDYWxsSW5mbzogYW55O1xyXG4gIGlzU2hvd0luY29taW5nQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBDUklUSUNBTDogVHJhY2sgYWxsIGFjY2VwdGVkIENhbGwgb2JqZWN0cyAobWlycm9ycyBpT1MgYWNjZXB0ZWRDYWxsTGlzdClcclxuICAvLyBVc2VkIHRvIGd1YXJkIGRldmljZSByZS1pbml0aWFsaXphdGlvbiBzbyBhY3RpdmUgY2FsbHMgYXJlIG5ldmVyIHRvcm4gZG93blxyXG4gIGFjY2VwdGVkQ2FsbExpc3Q6IENhbGxbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHByaW1hcnlIYXNDYWxsID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzcGFyZURldmljZTogYW55ID0gbnVsbDtcclxuICBzcGFyZURldmljZVJlYWR5ID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBwZW5kaW5nSW5jb21pbmdEZXZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICBwcml2YXRlIGV4dHJhRGV2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgaW5jb21pbmdDYWxsc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgdG9rZW5SZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVjb3ZlcnlBdHRlbXB0cyA9IDA7XHJcbiAgcHJpdmF0ZSByZWNvdmVyeVRpbWVyOiBhbnkgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVRva2VuKCk7XHJcbiAgICAvLyBTYWZldHkgbmV0IGZvciBsb25nIGlkbGUvc2xlZXAgcGVyaW9kczogdGhlIHNpZ25hbGluZyBzb2NrZXQgY2FuIGRpZSBzaWxlbnRseVxyXG4gICAgLy8gKE9TIHN1c3BlbmRzIHRpbWVycywgdGFiIGlzIGJhY2tncm91bmRlZCkgd2l0aG91dCBldmVyIGZpcmluZyAnZXJyb3InLyd1bnJlZ2lzdGVyZWQnLlxyXG4gICAgLy8gUmUtY2hlY2sgZGV2aWNlIGhlYWx0aCB3aGVuZXZlciB0aGUgYXBwIGJlY29tZXMgYWN0aXZlL29ubGluZSBhZ2Fpbi5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xyXG4gICAgICAgIHRoaXMuZW5zdXJlRGV2aWNlSGVhbHRoeSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCAoKSA9PiB0aGlzLmVuc3VyZURldmljZUhlYWx0aHkoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVUb2tlbigpIHtcclxuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudG9rZW5Jbml0aWFsaXphdGlvbiQgfHwgb2YobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRJbmNvbWluZ0NhbGxUb2tlbih0aGlzLmRldmljZUlkKS5waXBlKFxyXG4gICAgICB0YXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsVG9rZW4gPSBkYXRhLnRva2VuO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdpbi10b2tlbicsIGRhdGEudG9rZW4pO1xyXG4gICAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2RmZGZkc2Zkc2ZkcycpXHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRGV2aWNlKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgVHdpbGlvIHRva2VuOicsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzaGFyZVJlcGxheSgxKSAvLyBDYWNoZSB0aGUgcmVzdWx0IGZvciBzdWJzZXF1ZW50IHN1YnNjcmliZXJzXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXRpYWxpemVUd2lsaW9EZXZpY2UoZGV2aWNlSWQ6IGFueSkge1xyXG4gICAgdGhpcy5kZXZpY2VJZCA9IGRldmljZUlkO1xyXG4gICAgaWYgKHRoaXMudG9rZW5Jbml0aWFsaXplZCAmJiB0aGlzLmluY29taW5nQ2FsbFRva2VuKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURldmljZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplVG9rZW4oKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURldmljZSgpIHtcclxuICAgIGlmICh0aGlzLmRldmljZSkge1xyXG4gICAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1NraXBwaW5nIGRldmljZSByZS1pbml0OiBhY3RpdmUgYWNjZXB0ZWQgY2FsbHMgZXhpc3Q6JywgdGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGV2aWNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsVG9rZW4pIHtcclxuICAgICAgY29uc29sZS5lcnJvcignTm8gVHdpbGlvIHRva2VuIGF2YWlsYWJsZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRoaXMuaW5jb21pbmdDYWxsVG9rZW4sIHsgYWxsb3dJbmNvbWluZ1doaWxlQnVzeTogdHJ1ZSB9KTtcclxuXHJcbiAgICB0aGlzLmRldmljZS5vbigncmVnaXN0ZXJlZCcsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzID0gMDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFR3aWxpbyBmaXJlcyB0aGlzIH4zIG1pbnV0ZXMgYmVmb3JlIHRoZSBhY2Nlc3MgdG9rZW4gZXhwaXJlcy4gU3dhcCBpbiBhXHJcbiAgICAvLyBmcmVzaCBvbmUgdmlhIHVwZGF0ZVRva2VuKCkgc28gdGhlIHNpZ25hbGluZyBjb25uZWN0aW9uIG5ldmVyIGhhcyB0byBkcm9wXHJcbiAgICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgKHRoaXMgaXMgdGhlIG1haW4gY2F1c2Ugb2YgXCJpZGxlIGZvciBhIHdoaWxlLCBCRSBzdGlsbFxyXG4gICAgLy8gbm90aWZpZXMgYnV0IFR3aWxpbyBpbmNvbWluZyBldmVudCBuZXZlciBmaXJlc1wiKS5cclxuICAgIHRoaXMuZGV2aWNlLm9uKCd0b2tlbldpbGxFeHBpcmUnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVRva2VuKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRldmljZS5vbignaW5jb21pbmcnLCAoY2FsbDogQ2FsbCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnVHdpbGlvIERldmljZSBpbmNvbWluZyBjYWxsIGV2ZW50OicsIGNhbGwpO1xyXG4gICAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDAgfHwgdGhpcy5wcmltYXJ5SGFzQ2FsbCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdwcmltYXJ5IGRldmljZTogY29uY3VycmVudCBjYWxsIGFycml2aW5nIOKAkyBzcGFyZSBkZXZpY2Ugd2lsbCBoYW5kbGUgaXQnKTtcclxuICAgICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gdHJ1ZTtcclxuICAgICAgLy8gQXJtIGEgc3BhcmUgZGV2aWNlIHJpZ2h0IG5vdyAoYmVmb3JlIHRoZSB1c2VyIGV2ZW4gYWNjZXB0cykgc28gaXQgY2FuXHJcbiAgICAgIC8vIHJlZ2lzdGVyIGluIHRpbWUgZm9yIGFueSBjYWxsIHRoYXQgYXJyaXZlcyBzZWNvbmRzIGxhdGVyLlxyXG4gICAgICB0aGlzLnByZXBhcmVEZXZpY2UyRm9ySW5jb21pbmdDYWxsKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0luY29taW5nTXV0ZWQpIHtcclxuICAgICAgICB0cnkgeyB0aGlzLmRldmljZS5hdWRpbz8uaW5jb21pbmcoZmFsc2UpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB9XHJcbiAgICAgIGNhbGwub24oJ2FjY2VwdCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmcgY2FsbCBhbnN3ZXJlZC9hY2NlcHRlZCcpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNhbGwub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgZGlzY29ubmVjdGVkJyk7XHJcbiAgICAgICAgdGhpcy5wcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNhbGwub24oJ2NhbmNlbCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ2FsbGVyIGh1bmcgdXAgYmVmb3JlIGFuc3dlcicpO1xyXG4gICAgICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjYWxsLm9uKCdyZWplY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgcmVqZWN0ZWQnKTtcclxuICAgICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRyYWNrSW5jb21pbmdDYWxsKGNhbGwpO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbERldGFpbCA9IGNhbGw7XHJcbiAgICAgIHRoaXMuaXNTaG93SW5jb21pbmdDYWxsID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGV2aWNlLm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1R3aWxpbyBEZXZpY2UgRXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zY2hlZHVsZURldmljZVJlY292ZXJ5KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRldmljZS5vbigndW5yZWdpc3RlcmVkJywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnVHdpbGlvIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcclxuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUmVnaXN0ZXIgQUZURVIgYXR0YWNoaW5nIGFsbCBsaXN0ZW5lcnNcclxuICAgIHRoaXMuZGV2aWNlLnJlZ2lzdGVyKCk7XHJcbiAgICBjb25zb2xlLmxvZygnZGV2aWNlIGNyZWF0ZWQnLCB0aGlzLmRldmljZSk7XHJcbiAgfVxyXG5cclxuICAvLyBQcm9hY3RpdmVseSBzd2FwIGluIGEgZnJlc2ggYWNjZXNzIHRva2VuIGFoZWFkIG9mIGV4cGlyeSAoc2VlICd0b2tlbldpbGxFeHBpcmUnXHJcbiAgLy8gYWJvdmUpIHNvIHRoZSBEZXZpY2UncyBzaWduYWxpbmcgY29ubmVjdGlvbiBzdXJ2aXZlcyBsb25nIGlkbGUgcGVyaW9kcy5cclxuICBwcml2YXRlIHJlZnJlc2hEZXZpY2VUb2tlbigpIHtcclxuICAgIGlmICh0aGlzLnRva2VuUmVmcmVzaEluUHJvZ3Jlc3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRJbmNvbWluZ0NhbGxUb2tlbih0aGlzLmRldmljZUlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxUb2tlbiA9IGRhdGEudG9rZW47XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2luLXRva2VuJywgZGF0YS50b2tlbik7XHJcbiAgICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2U/LnVwZGF0ZVRva2VuKHRoaXMuaW5jb21pbmdDYWxsVG9rZW4pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGFwcGx5IHJlZnJlc2hlZCBUd2lsaW8gdG9rZW46JywgZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggVHdpbGlvIHRva2VuIGFoZWFkIG9mIGV4cGlyeTonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFNlbGYtaGVhbCBhZnRlciB0aGUgRGV2aWNlIGRpZXMgKGV4cGlyZWQgdG9rZW4sIGRyb3BwZWQgc2lnbmFsaW5nIHNvY2tldCB3aGlsZVxyXG4gIC8vIGlkbGUvYXNsZWVwLCBldGMpLiBOZXZlciBydW5zIHdoaWxlIGEgY2FsbCBpcyBhY3R1YWxseSBhY3RpdmUsIGFuZCBiYWNrcyBvZmYgc28gYVxyXG4gIC8vIGdlbnVpbmVseSBsb2dnZWQtb3V0L29mZmxpbmUgdXNlciBkb2Vzbid0IHJldHJ5IGZvcmV2ZXIuXHJcbiAgcHJpdmF0ZSBzY2hlZHVsZURldmljZVJlY292ZXJ5KCkge1xyXG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwIHx8IHRoaXMucmVjb3ZlcnlUaW1lcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWxheSA9IE1hdGgubWluKDMwMDAwLCAyMDAwICogTWF0aC5wb3coMiwgdGhpcy5yZWNvdmVyeUF0dGVtcHRzKSk7XHJcbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMrKztcclxuICAgIHRoaXMucmVjb3ZlcnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlY292ZXJ5VGltZXIgPSBudWxsO1xyXG4gICAgICBjb25zdCBhdXRoVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XHJcbiAgICAgIGlmICghYXV0aFRva2VuIHx8IGF1dGhUb2tlbiA9PT0gJ2xvZ291dCcpIHtcclxuICAgICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplVG9rZW4oKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdUd2lsaW8gZGV2aWNlIHJlY292ZXJ5IGF0dGVtcHQgZmFpbGVkOicsIGVycilcclxuICAgICAgfSk7XHJcbiAgICB9LCBkZWxheSk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWZldHkgbmV0IGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdW5kZXJseWluZyBzb2NrZXQgZGllcyBzaWxlbnRseSBkdXJpbmcgYSBsb25nXHJcbiAgLy8gc2xlZXAvaWRsZSBwZXJpb2Qgd2l0aG91dCBldmVyIGZpcmluZyAnZXJyb3InLyd1bnJlZ2lzdGVyZWQnICh0aGUgT1MgY2FuIHN1c3BlbmRcclxuICAvLyB0aW1lcnMvc29ja2V0cyBvdXRyaWdodCkg4oCUIHJlLWNoZWNrIGRldmljZSBoZWFsdGggd2hlbmV2ZXIgdGhlIGFwcCB3YWtlcyB1cC5cclxuICBwcml2YXRlIGVuc3VyZURldmljZUhlYWx0aHkoKSB7XHJcbiAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmRldmljZSB8fCB0aGlzLmRldmljZS5zdGF0ZSAhPT0gJ3JlZ2lzdGVyZWQnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gZGV2aWNlIHVuaGVhbHRoeSBhZnRlciB3YWtlL3Zpc2liaWxpdHkgY2hhbmdlLCByZS1pbml0aWFsaXppbmcnKTtcclxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVRva2VuKCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignVHdpbGlvIGRldmljZSByZWNvdmVyeSBmYWlsZWQ6JywgZXJyKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVDb250YWN0KHBheWxvYWQ6IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9hZGQvY29udGFjdHMvbWFudWFsbHknLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVDb250YWN0KHBheWxvYWQ6YW55KXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRoaXMudG9rZW59KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBkYXRlL2NvbnRhY3QnLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIFxyXG4gIGRlbGV0ZUNvbnRhY3QoaWQ6c3RyaW5nKXtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBwaG9uZWJvb2tpZDogaWRcclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL2NvbnRhY3QvJytpZCxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGdldENvbnRhY3RMaXN0KCl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svcmVhZC9jb250YWN0cycsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGFkZENvbnRhY3RUb0Zhdm91cml0ZShwYXlsb2FkOiBhbnkpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay91cGRhdGUvZmF2b3VyaXRlJywgcGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmF2b3VyaXRDb250YWN0cygpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2Zhdm91cml0ZS9jb250YWN0cycsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGdldFJlY2VudENhbGxzKHBhZ2VJbmRleD86IHN0cmluZywgcGFnZVNpemU/OiBzdHJpbmcsKXtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSAgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9O1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPXtoZWFkZXJzfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9yZWNlbnQvY2FsbHMnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGRlbGV0ZVJlY2VudENhbGxMb2coaWQ6c3RyaW5nfCBzdHJpbmdbXSl7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmVjb3JkSWQ6IGlkXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2RlbGV0ZS9jYWxscy8nK2lkLHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHVwbG9hZFBob3RvKHBheWxvYWQ6IGFueSl7XHJcbiAgICBsZXQgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay91cGxvYWQvcGhvdG8nLHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVBob3RvKGlkOnN0cmluZyl7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcGhvbmVib29raWQ6IGlkXHJcbiAgICB9XHJcbiAgICBsZXQgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvcGhvdG8vJytpZCxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDb3V0cnlDb2RlVG9hc3QodmFsOmFueSl7XHJcbiAgICBsZXQgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NvdW50cnljb2RlL2FsZXJ0LycgKyB2YWwsIHt9LCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGdldFRvTnVtYmVyKGRpYWxsZWRObzogc3RyaW5nLCBpc29Db2RlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSxcclxuICAgICAgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgnaXNvQ29kZScsIGlzb0NvZGUpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lzb0NvZGUnLCBpc29Db2RlKVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9jaGVjay9jb3VudHJ5Q29kZS8nICsgZGlhbGxlZE5vLCBodHRwT3B0aW9ucyk7XHJcbiAgfSBcclxuICBcclxuICAvLyBSZWNvcmQgYSByaW5naW5nIGluY29taW5nIENhbGwgc28gaXQgY2FuIGxhdGVyIGJlIGFjY2VwdGVkIGJ5IGl0cyBzcGVjaWZpYyBpZC5cclxuICAvLyBUaGUgbWFwIGlzIGNsZWFuZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjYWxsIGlzIGNhbmNlbGxlZC9kaXNjb25uZWN0ZWQvcmVqZWN0ZWQuXHJcbiAgcHJpdmF0ZSB0cmFja0luY29taW5nQ2FsbChjYWxsOiBhbnkpIHtcclxuICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcclxuICAgIGlmIChjYWxsU2lkKSB7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsc01hcC5zZXQoY2FsbFNpZCwgY2FsbCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICBpZiAoIWNhbGxTaWQpIHJldHVybjtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTWFwLmRlbGV0ZShjYWxsU2lkKTtcclxuICAgICAgLy8gSWYgdGhlIGNhbGwgZW5kZWQgYmVmb3JlIHRoZSB1c2VyIGFjY2VwdGVkIGl0LCBkZXN0cm95IHRoZSBwZW5kaW5nIHNwYXJlXHJcbiAgICAgIC8vIGRldmljZSB0aGF0IHdhcyBob2xkaW5nIGl0IHNvIHdlIGRvbid0IGxlYWsgZGV2aWNlIHJlZ2lzdHJhdGlvbnMuXHJcbiAgICAgIGNvbnN0IGRldiA9IHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5nZXQoY2FsbFNpZCk7XHJcbiAgICAgIGlmIChkZXYgJiYgIWRldi5fb3duc0FjY2VwdGVkQ2FsbCkge1xyXG4gICAgICAgIHRyeSB7IGRldi5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmRlbGV0ZShjYWxsU2lkKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGNhbGwub24oJ2NhbmNlbCcsIGNsZWFudXApO1xyXG4gICAgY2FsbC5vbignZGlzY29ubmVjdCcsIGNsZWFudXApO1xyXG4gICAgY2FsbC5vbigncmVqZWN0JywgY2xlYW51cCk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXNvbHZlIHRoZSBFWEFDVCByaW5naW5nIENhbGwgZm9yIGEgZ2l2ZW4gVUkgZW50cnkgaWQgKHBhcnRpY2lwYW50L3JlY29yZCBpZCkuXHJcbiAgLy8gRmFsbHMgYmFjayB0byB0aGUgbW9zdCByZWNlbnQgaW5jb21pbmcgY2FsbCBzbyBvbGRlciBzaW5nbGUtY2FsbCBmbG93cyBzdGlsbCB3b3JrLlxyXG4gIGdldEluY29taW5nQ2FsbEJ5SWQoaWQ6IGFueSkge1xyXG4gICAgaWYgKGlkICE9IG51bGwgJiYgdGhpcy5pbmNvbWluZ0NhbGxzTWFwLmhhcyhpZCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdDYWxsc01hcC5nZXQoaWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaW5jb21pbmdDYWxsRGV0YWlsLnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddID09IGlkID8gdGhpcy5pbmNvbWluZ0NhbGxEZXRhaWwgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKSB7XHJcbiAgICBpZiAodGhpcy5zcGFyZURldmljZSkge1xyXG4gICAgICByZXR1cm47IC8vIGEgZnJlZSBzcGFyZSBpcyBhbHJlYWR5IHdhaXRpbmdcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pbmNvbWluZ0NhbGxUb2tlbikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3ByZXBhcmVTcGFyZURldmljZTogbm8gdG9rZW4gYXZhaWxhYmxlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNwYXJlOiBhbnkgPSBuZXcgRGV2aWNlKHRoaXMuaW5jb21pbmdDYWxsVG9rZW4sIHsgYWxsb3dJbmNvbWluZ1doaWxlQnVzeTogdHJ1ZSB9KTtcclxuICAgIHNwYXJlLl9vd25zQWNjZXB0ZWRDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgc3BhcmUub24oJ3JlZ2lzdGVyZWQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IHRydWU7XHJcbiAgICAgIC8vIEFwcGx5IHRoZSBtdXRlIHByZWZlcmVuY2UgaGVyZSDigJQgYHNwYXJlLmF1ZGlvYCBpcyBvbmx5IHJlYWR5IGFmdGVyIHJlZ2lzdHJhdGlvbixcclxuICAgICAgLy8gc28gdGhlIGNhbGwgYWJvdmUgKGJlZm9yZSByZWdpc3RlcigpKSB3YXMgYWx3YXlzIGEgbm8tb3AuXHJcbiAgICAgIHRyeSB7IHNwYXJlLmF1ZGlvPy5pbmNvbWluZyghdGhpcy5pc0luY29taW5nTXV0ZWQpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICBjb25zb2xlLmxvZygnU3BhcmUgZGV2aWNlIHJlZ2lzdGVyZWQg4oCTIHJlYWR5IGZvciB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNwYXJlLm9uKCdpbmNvbWluZycsIChjYWxsOiBDYWxsKSA9PiB7XHJcbiAgICAgIC8vIEd1YXJkOiBvbmNlIHRoaXMgc3BhcmUgaXMgYWxyZWFkeSBoYW5kbGluZyBhIGNhbGwgKHBlbmRpbmcgb3IgYWNjZXB0ZWQpLFxyXG4gICAgICAvLyBpZ25vcmUgYW55IGZ1cnRoZXIgaW5jb21pbmcgZXZlbnRzIHNvIGFub3RoZXIgc3BhcmUgY2FuIHRha2UgdGhlIG5leHQgY2FsbC5cclxuICAgICAgaWYgKHNwYXJlLl9vd25zQWNjZXB0ZWRDYWxsIHx8IHNwYXJlLl9wZW5kaW5nSW5jb21pbmdDYWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHNwYXJlLl9wZW5kaW5nSW5jb21pbmdDYWxsID0gY2FsbDtcclxuICAgICAgY29uc3QgY2FsbFNpZCA9IGNhbGw/LnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddO1xyXG5cclxuICAgICAgLy8gVHJhbnNpdGlvbiB0aGlzIHNwYXJlIGZyb20gXCJmcmVlXCIg4oaSIFwicGVuZGluZ1wiOiByZW1vdmUgaXQgYXMgdGhlIGFjdGl2ZVxyXG4gICAgICAvLyBzcGFyZURldmljZSBhbmQgdHJhY2sgaXQgYnkgQ2FsbFNpZCBzbyBvbkNvbmN1cnJlbnRDYWxsQWNjZXB0ZWQgY2FuIGZpbmQgaXQuXHJcbiAgICAgIGlmICh0aGlzLnNwYXJlRGV2aWNlID09PSBzcGFyZSkge1xyXG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjYWxsU2lkKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLnNldChjYWxsU2lkLCBzcGFyZSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSW1tZWRpYXRlbHkgYXJtIHRoZSBORVhUIGZyZWUgc3BhcmUgc28gaXQgaXMgcmVhZHkgZm9yIGNhbGwgTisyIHdpdGhvdXRcclxuICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gYWNjZXB0IHRoaXMgY2FsbCBmaXJzdC5cclxuICAgICAgdGhpcy5wcmVwYXJlRGV2aWNlMkZvckluY29taW5nQ2FsbCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaXNJbmNvbWluZ011dGVkKSB7XHJcbiAgICAgICAgdHJ5IHsgc3BhcmUuYXVkaW8/LmluY29taW5nKGZhbHNlKTsgfSBjYXRjaCAoXykge31cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYWNrSW5jb21pbmdDYWxsKGNhbGwpO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbERldGFpbCA9IGNhbGw7XHJcbiAgICAgIHRoaXMuaXNTaG93SW5jb21pbmdDYWxsID0gdHJ1ZTtcclxuICAgICAgY29uc29sZS5sb2coJ3NwYXJlIGRldmljZTogaW5jb21pbmcgY2FsbCcsIGNhbGwpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc3BhcmUub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignU3BhcmUgZGV2aWNlIGVycm9yOicsIGVycm9yKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNwYXJlLnJlZ2lzdGVyKCk7XHJcbiAgICB0aGlzLnNwYXJlRGV2aWNlID0gc3BhcmU7XHJcbiAgICBjb25zb2xlLmxvZygnc3BhcmUgZGV2aWNlIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyaW5nJyk7XHJcbiAgfVxyXG5cclxuICBvbkNvbmN1cnJlbnRDYWxsQWNjZXB0ZWQoYWNjZXB0ZWRDYWxsOiBhbnkpIHtcclxuICAgIGNvbnN0IHNpZCA9IGFjY2VwdGVkQ2FsbD8ucGFyYW1ldGVycz8uWydDYWxsU2lkJ107XHJcbiAgICBpZiAoc2lkKSB7XHJcbiAgICAgIC8vIFByaW1hcnkgcGF0aDogdGhlIGFjY2VwdGVkIGNhbGwgd2FzIGhlbGQgYnkgYSBwZW5kaW5nIHNwYXJlIGRldmljZS5cclxuICAgICAgY29uc3QgZGV2ID0gdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmdldChzaWQpO1xyXG4gICAgICBpZiAoZGV2KSB7XHJcbiAgICAgICAgZGV2Ll9vd25zQWNjZXB0ZWRDYWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmV4dHJhRGV2aWNlcy5zZXQoc2lkLCBkZXYpO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5kZWxldGUoc2lkKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBMZWdhY3kgZmFsbGJhY2s6IG9sZCBzaW5nbGUtc3BhcmUgcGF0aCAoc3BhcmUgc3RpbGwgaG9sZHMgdGhlIGNhbGwpLlxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNwYXJlRGV2aWNlICYmIHRoaXMuc3BhcmVEZXZpY2UuX3BlbmRpbmdJbmNvbWluZ0NhbGwgPT09IGFjY2VwdGVkQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2UuX293bnNBY2NlcHRlZENhbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLnNldChzaWQsIHRoaXMuc3BhcmVEZXZpY2UpO1xyXG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBFbnN1cmUgYSBmcmVlIHNwYXJlIGlzIGFsd2F5cyByZWFkeSBmb3IgdGhlIG5leHQgY29uY3VycmVudCBjYWxsLlxyXG4gICAgdGhpcy5wcmVwYXJlRGV2aWNlMkZvckluY29taW5nQ2FsbCgpO1xyXG4gIH1cclxuXHJcbiAgcmVsZWFzZUNvbmN1cnJlbnRDYWxsRGV2aWNlKGNhbGxTaWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgZGV2ID0gdGhpcy5leHRyYURldmljZXMuZ2V0KGNhbGxTaWQpO1xyXG4gICAgaWYgKGRldikge1xyXG4gICAgICB0cnkgeyBkZXYuZGVzdHJveSgpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB0aGlzLmV4dHJhRGV2aWNlcy5kZWxldGUoY2FsbFNpZCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdyZWxlYXNlZCBjb25jdXJyZW50LWNhbGwgZGV2aWNlIGZvcicsIGNhbGxTaWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBBbHNvIHJlbGVhc2UgcGVuZGluZyBkZXZpY2VzIHRoYXQgd2VyZSBjYW5jZWxsZWQgYmVmb3JlIGFjY2VwdGFuY2UuXHJcbiAgICBjb25zdCBwZW5kaW5nRGV2ID0gdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmdldChjYWxsU2lkKTtcclxuICAgIGlmIChwZW5kaW5nRGV2KSB7XHJcbiAgICAgIHRyeSB7IHBlbmRpbmdEZXYuZGVzdHJveSgpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZGVsZXRlKGNhbGxTaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gV2hlbiBubyBhY2NlcHRlZCBjYWxscyByZW1haW4sIHRlYXIgZG93biBhbGwgc3BhcmUvcGVuZGluZy9leHRyYSBkZXZpY2VzIHNvXHJcbiAgLy8gdGhlIHByaW1hcnkgZGV2aWNlIGNsZWFubHkgaGFuZGxlcyB0aGUgbmV4dCBmcmVzaCBpbmNvbWluZyBjYWxsLlxyXG4gIHRlYXJkb3duU3BhcmVEZXZpY2VzSWZJZGxlKCkge1xyXG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZXh0cmFEZXZpY2VzLmZvckVhY2goKGQpID0+IHsgdHJ5IHsgZC5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9IH0pO1xyXG4gICAgdGhpcy5leHRyYURldmljZXMuY2xlYXIoKTtcclxuICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKChkKSA9PiB7IHRyeSB7IGQuZGVzdHJveSgpOyB9IGNhdGNoIChfKSB7fSB9KTtcclxuICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5jbGVhcigpO1xyXG4gICAgaWYgKHRoaXMuc3BhcmVEZXZpY2UpIHtcclxuICAgICAgdHJ5IHsgdGhpcy5zcGFyZURldmljZS5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBudWxsO1xyXG4gICAgICB0aGlzLnNwYXJlRGV2aWNlUmVhZHkgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSBmYWxzZTtcclxuICAgIGNvbnNvbGUubG9nKCdzcGFyZS9leHRyYSBkZXZpY2VzIHRvcm4gZG93biAoaWRsZSknKTtcclxuICB9XHJcblxyXG4gIC8vIEJhY2t3YXJkcy1jb21wYXRpYmxlIGFsaWFzIGtlcHQgZm9yIGV4aXN0aW5nIGNhbGwgc2l0ZXMuXHJcbiAgZGVzdHJveURldmljZTIoKSB7XHJcbiAgICB0aGlzLnRlYXJkb3duU3BhcmVEZXZpY2VzSWZJZGxlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVc2VyLWNvbnRyb2xsZWQgc3dpdGNoIChpbiB0aGUgY2FsbC1wcm9ncmVzcyBVSSkuIFdoZW4gT04sIGEgbmV3IGluY29taW5nXHJcbiAgLy8gY2FsbCdzIGJ1aWx0LWluIFR3aWxpbyByaW5ndG9uZSBpcyBzaWxlbmNlZCBzbyBpdCBkb2VzIG5vdCBkaXN0dXJiIHRoZVxyXG4gIC8vIG9uZ29pbmcgY2FsbC4gU291cmNlIG9mIHRydXRoIHNvIG5ld2x5IGNyZWF0ZWQgKHNwYXJlKSBkZXZpY2VzIGluaGVyaXQgaXQuXHJcbiAgaXNJbmNvbWluZ011dGVkID0gZmFsc2U7XHJcblxyXG4gIC8vIEFwcGx5IHRoZSBjdXJyZW50IG11dGUgcHJlZmVyZW5jZSB0byBldmVyeSBsaXZlIERldmljZSAocHJpbWFyeSArIHNwYXJlICtcclxuICAvLyBhbnkgY29uY3VycmVudC1jYWxsIGRldmljZXMpIHZpYSBUd2lsaW8ncyBvd24gZGV2aWNlLmF1ZGlvLmluY29taW5nKCkuXHJcbiAgYXBwbHlJbmNvbWluZ011dGUoKSB7XHJcbiAgICBjb25zdCBlbmFibGVkID0gIXRoaXMuaXNJbmNvbWluZ011dGVkOyAvLyByaW5ndG9uZSBlbmFibGVkID0gTk9UIG11dGVkXHJcbiAgICBjb25zdCBhcHBseSA9IChkZXY6IGFueSkgPT4ge1xyXG4gICAgICB0cnkgeyBkZXY/LmF1ZGlvPy5pbmNvbWluZz8uKGVuYWJsZWQpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgfTtcclxuICAgIGFwcGx5KHRoaXMuZGV2aWNlKTtcclxuICAgIGFwcGx5KHRoaXMuc3BhcmVEZXZpY2UpO1xyXG4gICAgdGhpcy5leHRyYURldmljZXMuZm9yRWFjaChhcHBseSk7XHJcbiAgICB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZm9yRWFjaChhcHBseSk7XHJcbiAgfVxyXG5cclxuICAvLyBUb2dnbGUvc2V0IHRoZSBtdXRlIHN3aXRjaCBhbmQgaW1tZWRpYXRlbHkgYXBwbHkgaXQuXHJcbiAgc2V0SW5jb21pbmdNdXRlZChtdXRlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc0luY29taW5nTXV0ZWQgPSBtdXRlZDtcclxuICAgIHRoaXMuYXBwbHlJbmNvbWluZ011dGUoKTtcclxuICAgIGlmIChtdXRlZCkge1xyXG4gICAgICAvLyBkZXZpY2UuYXVkaW8uaW5jb21pbmcoZmFsc2UpIG9ubHkgcHJldmVudHMgZnV0dXJlIHJpbmdzIOKAlCBpdCBkb2VzIE5PVCBzdG9wXHJcbiAgICAgIC8vIGEgY2FsbCB0aGF0IGlzIGFscmVhZHkgcmluZ2luZy4gU3RvcCB0aGUgYWN0aXZlIHJpbmcgZGlyZWN0bHkgdmlhIHNvdW5kY2FjaGUuXHJcbiAgICAgIGNvbnN0IHN0b3BSaW5nID0gKGRldjogYW55KSA9PiB7XHJcbiAgICAgICAgdHJ5IHsgZGV2Py5fc291bmRjYWNoZT8uZ2V0Py4oJ2luY29taW5nJyk/LnN0b3A/LigpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB9O1xyXG4gICAgICBzdG9wUmluZyh0aGlzLmRldmljZSk7XHJcbiAgICAgIHN0b3BSaW5nKHRoaXMuc3BhcmVEZXZpY2UpO1xyXG4gICAgICB0aGlzLmV4dHJhRGV2aWNlcy5mb3JFYWNoKChkZXY6IGFueSkgPT4gc3RvcFJpbmcoZGV2KSk7XHJcbiAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKChkZXY6IGFueSkgPT4gc3RvcFJpbmcoZGV2KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRJbmNvbWluZ1BhcnRpY2lwYW50KHBhcnRpY2lwYW50SWQ6IHN0cmluZywgY29uZmVyZW5jZUlkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pLFxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihgJHtlbnZpcm9ubWVudC5hcGlVcmx9L3V0aWxpdGllcy9leHQvYWRkL2luY29taW5nL3BhcnRpY2lwYW50LyR7cGFydGljaXBhbnRJZH0vJHtjb25mZXJlbmNlSWR9YCxodHRwT3B0aW9ucyk7XHJcbiAgfSBcclxuICBjb25uZWN0KGRhdGE/OiBhbnkpe1xyXG4gICAgaWYgKHRoaXMuZGV2aWNlLl9hY3RpdmVDYWxsKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcyNDQtdGVzdCcpXHJcbiAgICAgIHRoaXMuZGV2aWNlLmRpc2Nvbm5lY3RBbGwoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgVG9rZW46IHRoaXMuY29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQgfHwgZGF0YS5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgQ29uZmVyZW5jZU5hbWU6IHRoaXMuY29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlTmFtZSB8fCBkYXRhLmNvbmZlcmVuY2VOYW1lXHJcbiAgICAgIH0sXHJcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuIl19
|
|
634
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdpbGlvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS90d2lsaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBYzNELE1BQU0sT0FBTyxhQUFhO0lBc0R4QixZQUNVLElBQWdCLEVBQ2hCLGdCQUFrQztRQURsQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUF0RDVDLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWMsSUFBSSxDQUFDLENBQUM7UUFDckQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFHdEYsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBRTVCLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBUyxLQUFLLENBQUMsQ0FBQztRQUU5QyxVQUFLLEdBQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxL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LE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDekIsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZO2dCQUNqRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYzthQUMvRTtZQUNELGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRTtTQUNuRCxDQUFDLENBQUE7SUFDSixDQUFDOzsyR0F2b0JVLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGV2aWNlLCBDYWxsIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERpYWxQYXlsb2FkIHtcclxuICBudW1iZXI6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW1nOiBzdHJpbmc7XHJcbiAgY2FsbGVySWQ6c3RyaW5nO1xyXG4gIGlzRGlhbEZyb21IaXN0b3J5OmJvb2xlYW47XHJcbiAgZnJvbTpzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcgIFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHdpbGlvU2VydmljZSB7XHJcbiAgXHJcbiAgb3BlbkluUHJvZ3Jlc3NEaWFscGFkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgY3VycmVudENhbGwgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGwgfCBudWxsPihudWxsKTtcclxuICBjdXJyZW50Q2FsbFN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCdub25lJyk7IC8vaW4tcHJvZ3Jlc3MsIG91dC1wcm9ncmVzcywgbm9uZVxyXG4gIGRldmljZTphbnk7XHJcbiAgY2FsbCE6IENhbGw7XHJcbiAgaW5jb21pbmdDYWxsVG9rZW46c3RyaW5nPScnO1xyXG4gIG91dGdvaW5nQ2FsbFRva2VuPzpzdHJpbmc7XHJcbiAgY2FsbFR5cGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJ05JTCcpO1xyXG4gIGluY29taW5nQ2FsbERldGFpbDogYW55OyAvLyBmb3IgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmdcclxuICB0b2tlbjphbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XHJcbiAgaXNOZXdDb250YWN0QWRkZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICB1cGRhdGVSZWNlbnRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgY2FsbGhhbmRsZUZyb21Ob3RpZmljYXRpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xyXG5cclxuICBlbmRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgZGlhbE51bWJlckZyb21PdGhlck1vZHVsZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGlhbFBheWxvYWQ+KHsgbnVtYmVyOiAnJywgbmFtZTogJycsIGltZzogJycsIGNhbGxlcklkOiAnJywgaXNEaWFsRnJvbUhpc3Rvcnk6IGZhbHNlLCBmcm9tOiAnJyB9KTtcclxuXHJcbiAgdG9nZ2xlQ2FsbGVySWRBbGVydCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgaXNUcmlhbE92ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc1BheW1lbnREdWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc0F2YWlsYWJsZU51bWJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGNhbGxlcklkTGlzdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICB0cmlnZ2VyU01TUmVsb2FkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG5cclxuICB0b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0b2tlbkluaXRpYWxpemF0aW9uJDogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgZGV2aWNlSWQ6IGFueTtcclxuICBjb25mZXJlbmNlQ2FsbEluZm86IGFueTtcclxuICBpc1Nob3dJbmNvbWluZ0NhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gQ1JJVElDQUw6IFRyYWNrIGFsbCBhY2NlcHRlZCBDYWxsIG9iamVjdHMgKG1pcnJvcnMgaU9TIGFjY2VwdGVkQ2FsbExpc3QpXHJcbiAgLy8gVXNlZCB0byBndWFyZCBkZXZpY2UgcmUtaW5pdGlhbGl6YXRpb24gc28gYWN0aXZlIGNhbGxzIGFyZSBuZXZlciB0b3JuIGRvd25cclxuICBhY2NlcHRlZENhbGxMaXN0OiBDYWxsW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBwcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3BhcmVEZXZpY2U6IGFueSA9IG51bGw7XHJcbiAgc3BhcmVEZXZpY2VSZWFkeSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcGVuZGluZ0luY29taW5nRGV2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgcHJpdmF0ZSBleHRyYURldmljZXMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG4gIGluY29taW5nQ2FsbHNNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG5cclxuICBwcml2YXRlIHRva2VuUmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICBwcml2YXRlIHJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xyXG4gIHByaXZhdGUgcmVjb3ZlcnlUaW1lcjogYW55ID0gbnVsbDtcclxuICAvLyBSZWZlcmVuY2VzIHRvIHRoZSAndW5yZWdpc3RlcmVkJy8nZXJyb3InIGhhbmRsZXJzIGN1cnJlbnRseSBhdHRhY2hlZCB0byBgdGhpcy5kZXZpY2VgLFxyXG4gIC8vIHNvIGFuIGludGVudGlvbmFsIHJlcGxhY2UgY2FuIGRldGFjaCBleGFjdGx5IHRob3NlIHR3byBiZWZvcmUgZGVzdHJveSgpIHdpdGhvdXRcclxuICAvLyB0b3VjaGluZyBhbnkgbGlzdGVuZXJzIHRoZSBUd2lsaW8gU0RLIGl0c2VsZiBtYXkgaGF2ZSB3aXJlZCB0byB0aGUgc2FtZSBFdmVudEVtaXR0ZXIuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RGV2aWNlVW5yZWdpc3RlcmVkSGFuZGxlcjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIGN1cnJlbnREZXZpY2VFcnJvckhhbmRsZXI6IGFueSA9IG51bGw7XHJcbiAgaW5jb21pbmdDYWxsTm90aWZpY2F0aW9uPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplVG9rZW4oKTtcclxuICAgIC8vIFNhZmV0eSBuZXQgZm9yIGxvbmcgaWRsZS9zbGVlcCBwZXJpb2RzOiB0aGUgc2lnbmFsaW5nIHNvY2tldCBjYW4gZGllIHNpbGVudGx5XHJcbiAgICAvLyAoT1Mgc3VzcGVuZHMgdGltZXJzLCB0YWIgaXMgYmFja2dyb3VuZGVkKSB3aXRob3V0IGV2ZXIgZmlyaW5nICdlcnJvcicvJ3VucmVnaXN0ZXJlZCcuXHJcbiAgICAvLyBSZS1jaGVjayBkZXZpY2UgaGVhbHRoIHdoZW5ldmVyIHRoZSBhcHAgYmVjb21lcyBhY3RpdmUvb25saW5lIGFnYWluLlxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcclxuICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XHJcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VIZWFsdGh5KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsICgpID0+IHRoaXMuZW5zdXJlRGV2aWNlSGVhbHRoeSgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRva2VuKCkge1xyXG4gICAgaWYgKHRoaXMudG9rZW5Jbml0aWFsaXplZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCB8fCBvZihudWxsKTtcclxuICAgIH1cclxuICAgIC8vIEEgZmV0Y2ggaXMgYWxyZWFkeSBpbiBmbGlnaHQg4oCUIEFwcEluaXRpYWxpemVyU2VydmljZSBhbmQgdGhlIGRpYWxib3ggY29tcG9uZW50XHJcbiAgICAvLyBib3RoIGNhbGwgaW5pdGlhbGl6ZVR3aWxpb0RldmljZSgpIG9uIHN0YXJ0dXAsIGFuZCB3aXRob3V0IHRoaXMgdGhleSdkIHJhY2U6XHJcbiAgICAvLyB0aGUgc2Vjb25kIGNhbGwgd291bGQgZmlyZSBpdHMgb3duIHRva2VuIHJlcXVlc3QgYW5kLCBvbmNlIHJlc29sdmVkLCBjYWxsXHJcbiAgICAvLyBpbml0aWFsaXplRGV2aWNlKCkgYWdhaW4sIGRlc3Ryb3lpbmcgdGhlIGRldmljZSB0aGUgZmlyc3QgY2FsbCBqdXN0IGNyZWF0ZWQgYW5kXHJcbiAgICAvLyB0b3VjaGluZyBvZmYgYSBzcHVyaW91cyAndW5yZWdpc3RlcmVkJyAtPiByZWNvdmVyeSBjYXNjYWRlLiBTaGFyZSB0aGUgc2FtZVxyXG4gICAgLy8gaW4tZmxpZ2h0IHJlcXVlc3QgaW5zdGVhZC5cclxuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9rZW5Jbml0aWFsaXphdGlvbiQgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0SW5jb21pbmdDYWxsVG9rZW4odGhpcy5kZXZpY2VJZCkucGlwZShcclxuICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbFRva2VuID0gZGF0YS50b2tlbjtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaW4tdG9rZW4nLCBkYXRhLnRva2VuKTtcclxuICAgICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURldmljZSgpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIFR3aWxpbyB0b2tlbjonLCBlcnJvcik7XHJcbiAgICAgICAgLy8gQWxsb3cgYSBmcmVzaCBhdHRlbXB0IG5leHQgdGltZSBzaW5jZSB0aGlzIG9uZSBmYWlsZWQuXHJcbiAgICAgICAgdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgc2hhcmVSZXBsYXkoMSkgLy8gQ2FjaGUgdGhlIHJlc3VsdCBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVyc1xyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplVHdpbGlvRGV2aWNlKGRldmljZUlkOiBhbnkpIHtcclxuICAgIHRoaXMuZGV2aWNlSWQgPSBkZXZpY2VJZDtcclxuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6ZWQgJiYgdGhpcy5pbmNvbWluZ0NhbGxUb2tlbikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVEZXZpY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVRva2VuKCkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEZXZpY2UoKSB7XHJcbiAgICBpZiAodGhpcy5kZXZpY2UpIHtcclxuICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGluZyBkZXZpY2UgcmUtaW5pdDogYWN0aXZlIGFjY2VwdGVkIGNhbGxzIGV4aXN0OicsIHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyBEZXRhY2ggdGhlICd1bnJlZ2lzdGVyZWQnLydlcnJvcicgaGFuZGxlcnMgd2UgYXR0YWNoZWQgYmVmb3JlIGRlc3Ryb3lpbmcsIHNvXHJcbiAgICAgIC8vIHRoaXMgKmludGVudGlvbmFsKiB0ZWFyZG93biBjYW4ndCBmaXJlIHRoZW0gYmVsb3cg4oCUIG90aGVyd2lzZSBhIGRlbGliZXJhdGVcclxuICAgICAgLy8gcmVwbGFjZSBsb29rcyBpZGVudGljYWwgdG8gYW4gdW5leHBlY3RlZCBkcm9wIGFuZCB0b3VjaGVzIG9mZiBhXHJcbiAgICAgIC8vIGRlc3Ryb3kgLT4gJ3VucmVnaXN0ZXJlZCcgLT4gc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSAtPiBkZXN0cm95IGNhc2NhZGUuXHJcbiAgICAgIC8vIChPbmx5IHJlbW92ZXMgb3VyIG93biBoYW5kbGVycywgbm90IGFueXRoaW5nIHRoZSBUd2lsaW8gU0RLIGl0c2VsZiBtYXkgaGF2ZVxyXG4gICAgICAvLyB3aXJlZCB0byB0aGUgc2FtZSBFdmVudEVtaXR0ZXIsIHNvIGl0cyBvd24gZGVzdHJveSgpL2NsZWFudXAgaXMgdW5hZmZlY3RlZC4pXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERldmljZVVucmVnaXN0ZXJlZEhhbmRsZXIpIHtcclxuICAgICAgICAgIHRoaXMuZGV2aWNlLnJlbW92ZUxpc3RlbmVyKCd1bnJlZ2lzdGVyZWQnLCB0aGlzLmN1cnJlbnREZXZpY2VVbnJlZ2lzdGVyZWRIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2UucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5jdXJyZW50RGV2aWNlRXJyb3JIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIHRoaXMuZGV2aWNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsVG9rZW4pIHtcclxuICAgICAgY29uc29sZS5lcnJvcignTm8gVHdpbGlvIHRva2VuIGF2YWlsYWJsZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGV2aWNlOiBhbnkgPSBuZXcgRGV2aWNlKHRoaXMuaW5jb21pbmdDYWxsVG9rZW4sIHsgYWxsb3dJbmNvbWluZ1doaWxlQnVzeTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlO1xyXG5cclxuICAgIGRldmljZS5vbigncmVnaXN0ZXJlZCcsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzID0gMTA7XHJcbiAgICAgIC8vIEEgcmVjb3ZlcnkgYXR0ZW1wdCBtYXkgaGF2ZSBiZWVuIHNjaGVkdWxlZCBieSBhbiBlYXJsaWVyIGRldmljZSBpbnN0YW5jZVxyXG4gICAgICAvLyBiZWZvcmUgdGhpcyBvbmUgY2FtZSB1cCDigJQgaXQncyBzdGFsZSBub3csIGNhbmNlbCBpdCBzbyBpdCBjYW4ndCB0ZWFyIHRoaXNcclxuICAgICAgLy8gaGVhbHRoeSBkZXZpY2UgZG93biBsYXRlci5cclxuICAgICAgaWYgKHRoaXMucmVjb3ZlcnlUaW1lcikge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY292ZXJ5VGltZXIpO1xyXG4gICAgICAgIHRoaXMucmVjb3ZlcnlUaW1lciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wcmVwYXJlRGV2aWNlMkZvckluY29taW5nQ2FsbCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVHdpbGlvIGZpcmVzIHRoaXMgfjMgbWludXRlcyBiZWZvcmUgdGhlIGFjY2VzcyB0b2tlbiBleHBpcmVzLiBTd2FwIGluIGFcclxuICAgIC8vIGZyZXNoIG9uZSB2aWEgdXBkYXRlVG9rZW4oKSBzbyB0aGUgc2lnbmFsaW5nIGNvbm5lY3Rpb24gbmV2ZXIgaGFzIHRvIGRyb3BcclxuICAgIC8vIGluIHRoZSBmaXJzdCBwbGFjZSAodGhpcyBpcyB0aGUgbWFpbiBjYXVzZSBvZiBcImlkbGUgZm9yIGEgd2hpbGUsIEJFIHN0aWxsXHJcbiAgICAvLyBub3RpZmllcyBidXQgVHdpbGlvIGluY29taW5nIGV2ZW50IG5ldmVyIGZpcmVzXCIpLlxyXG4gICAgZGV2aWNlLm9uKCd0b2tlbldpbGxFeHBpcmUnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVRva2VuKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXZpY2Uub24oJ2luY29taW5nJywgKGNhbGw6IENhbGwpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBEZXZpY2UgaW5jb21pbmcgY2FsbCBldmVudDonLCBjYWxsKTtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5idWlsZEluY29taW5nTm90aWZpY2F0aW9uKGNhbGwpO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbE5vdGlmaWNhdGlvbi5uZXh0KG5vdGlmaWNhdGlvbik7XHJcbiAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ2FsbExpc3QubGVuZ3RoID4gMCB8fCB0aGlzLnByaW1hcnlIYXNDYWxsKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW1hcnkgZGV2aWNlOiBjb25jdXJyZW50IGNhbGwgYXJyaXZpbmcg4oCTIHNwYXJlIGRldmljZSB3aWxsIGhhbmRsZSBpdCcpO1xyXG4gICAgICAgIHRoaXMuaXNTaG93SW5jb21pbmdDYWxsID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSB0cnVlO1xyXG4gICAgICAvLyBBcm0gYSBzcGFyZSBkZXZpY2UgcmlnaHQgbm93IChiZWZvcmUgdGhlIHVzZXIgZXZlbiBhY2NlcHRzKSBzbyBpdCBjYW5cclxuICAgICAgLy8gcmVnaXN0ZXIgaW4gdGltZSBmb3IgYW55IGNhbGwgdGhhdCBhcnJpdmVzIHNlY29uZHMgbGF0ZXIuXHJcbiAgICAgIHRoaXMucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzSW5jb21pbmdNdXRlZCkge1xyXG4gICAgICAgIHRyeSB7IGRldmljZS5hdWRpbz8uaW5jb21pbmcoZmFsc2UpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB9XHJcbiAgICAgIGNhbGwub24oJ2FjY2VwdCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmcgY2FsbCBhbnN3ZXJlZC9hY2NlcHRlZCcpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNhbGwub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgZGlzY29ubmVjdGVkJyk7XHJcbiAgICAgICAgdGhpcy5wcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNhbGwub24oJ2NhbmNlbCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ2FsbGVyIGh1bmcgdXAgYmVmb3JlIGFuc3dlcicpO1xyXG4gICAgICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjYWxsLm9uKCdyZWplY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgcmVqZWN0ZWQnKTtcclxuICAgICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRyYWNrSW5jb21pbmdDYWxsKGNhbGwpO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbERldGFpbCA9IGNhbGw7XHJcbiAgICAgIHRoaXMuaXNTaG93SW5jb21pbmdDYWxsID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG9uRGV2aWNlRXJyb3IgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAvLyBTdGFsZSBldmVudCBmcm9tIGEgZGV2aWNlIHdlJ3ZlIGFscmVhZHkgaW50ZW50aW9uYWxseSByZXBsYWNlZCDigJQgaWdub3JlLlxyXG4gICAgICBpZiAodGhpcy5kZXZpY2UgIT09IGRldmljZSkgcmV0dXJuO1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUd2lsaW8gRGV2aWNlIEVycm9yOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSgpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlciA9IG9uRGV2aWNlRXJyb3I7XHJcbiAgICBkZXZpY2Uub24oJ2Vycm9yJywgb25EZXZpY2VFcnJvcik7XHJcblxyXG4gICAgY29uc3Qgb25EZXZpY2VVbnJlZ2lzdGVyZWQgPSAoKSA9PiB7XHJcbiAgICAgIC8vIFN0YWxlIGV2ZW50IGZyb20gYSBkZXZpY2Ugd2UndmUgYWxyZWFkeSBpbnRlbnRpb25hbGx5IHJlcGxhY2VkIOKAlCBpZ25vcmUuXHJcbiAgICAgIGlmICh0aGlzLmRldmljZSAhPT0gZGV2aWNlKSByZXR1cm47XHJcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIHVucmVnaXN0ZXJlZCcpO1xyXG4gICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zY2hlZHVsZURldmljZVJlY292ZXJ5KCk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5jdXJyZW50RGV2aWNlVW5yZWdpc3RlcmVkSGFuZGxlciA9IG9uRGV2aWNlVW5yZWdpc3RlcmVkO1xyXG4gICAgZGV2aWNlLm9uKCd1bnJlZ2lzdGVyZWQnLCBvbkRldmljZVVucmVnaXN0ZXJlZCk7XHJcblxyXG4gICAgLy8gUmVnaXN0ZXIgQUZURVIgYXR0YWNoaW5nIGFsbCBsaXN0ZW5lcnNcclxuICAgIGRldmljZS5yZWdpc3RlcigpO1xyXG4gICAgY29uc29sZS5sb2coJ2RldmljZSBjcmVhdGVkJywgZGV2aWNlKTtcclxuICAgIHJldHVybiB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kIHx8IG9mKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8gUHJvYWN0aXZlbHkgc3dhcCBpbiBhIGZyZXNoIGFjY2VzcyB0b2tlbiBhaGVhZCBvZiBleHBpcnkgKHNlZSAndG9rZW5XaWxsRXhwaXJlJ1xyXG4gIC8vIGFib3ZlKSBzbyB0aGUgRGV2aWNlJ3Mgc2lnbmFsaW5nIGNvbm5lY3Rpb24gc3Vydml2ZXMgbG9uZyBpZGxlIHBlcmlvZHMuXHJcbiAgcHJpdmF0ZSByZWZyZXNoRGV2aWNlVG9rZW4oKSB7XHJcbiAgICBpZiAodGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudG9rZW5SZWZyZXNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0SW5jb21pbmdDYWxsVG9rZW4odGhpcy5kZXZpY2VJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9rZW5SZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsVG9rZW4gPSBkYXRhLnRva2VuO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdpbi10b2tlbicsIGRhdGEudG9rZW4pO1xyXG4gICAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuZGV2aWNlPy51cGRhdGVUb2tlbih0aGlzLmluY29taW5nQ2FsbFRva2VuKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhcHBseSByZWZyZXNoZWQgVHdpbGlvIHRva2VuOicsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudG9rZW5SZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIFR3aWxpbyB0b2tlbiBhaGVhZCBvZiBleHBpcnk6JywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBTZWxmLWhlYWwgYWZ0ZXIgdGhlIERldmljZSBkaWVzIChleHBpcmVkIHRva2VuLCBkcm9wcGVkIHNpZ25hbGluZyBzb2NrZXQgd2hpbGVcclxuICAvLyBpZGxlL2FzbGVlcCwgZXRjKS4gTmV2ZXIgcnVucyB3aGlsZSBhIGNhbGwgaXMgYWN0dWFsbHkgYWN0aXZlLCBhbmQgYmFja3Mgb2ZmIHNvIGFcclxuICAvLyBnZW51aW5lbHkgbG9nZ2VkLW91dC9vZmZsaW5lIHVzZXIgZG9lc24ndCByZXRyeSBmb3JldmVyLlxyXG4gIHByaXZhdGUgc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSgpIHtcclxuICAgIGlmICh0aGlzLmFjY2VwdGVkQ2FsbExpc3QubGVuZ3RoID4gMCB8fCB0aGlzLnJlY292ZXJ5VGltZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbigzMDAwMCwgMjAwMCAqIE1hdGgucG93KDIsIHRoaXMucmVjb3ZlcnlBdHRlbXB0cykpO1xyXG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzKys7XHJcbiAgICB0aGlzLnJlY292ZXJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZWNvdmVyeVRpbWVyID0gbnVsbDtcclxuICAgICAgY29uc3QgYXV0aFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xyXG4gICAgICBpZiAoIWF1dGhUb2tlbiB8fCBhdXRoVG9rZW4gPT09ICdsb2dvdXQnKSB7XHJcbiAgICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVRva2VuKCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignVHdpbGlvIGRldmljZSByZWNvdmVyeSBhdHRlbXB0IGZhaWxlZDonLCBlcnIpXHJcbiAgICAgIH0pO1xyXG4gICAgfSwgZGVsYXkpO1xyXG4gIH1cclxuXHJcbiAgLy8gQnVpbGQgdGhlIGZ1bGwgaW5jb21pbmctY2FsbCBub3RpZmljYXRpb24gcGF5bG9hZCAobWF0Y2hlcyB0aGUgc2hhcGUgdGhlIEJFIHVzZWQgdG9cclxuICAvLyBwdXNoIG92ZXIgdGhlIHNvY2tldCkgZnJvbSB0aGUgcmF3IFR3aWxpbyAnaW5jb21pbmcnIENhbGw6IHBhcnNlZCBQYXJhbXMgZmllbGRzIHBsdXNcclxuICAvLyB0aGUgZGVyaXZlZCBjbGllbnRTaWQvcGFydGljaXBhbnRTaWQvbm90aWZpY2F0aW9uVHlwZS90aXRsZS9tc2dCb2R5LlxyXG4gIGJ1aWxkSW5jb21pbmdOb3RpZmljYXRpb24oY2FsbDogQ2FsbCk6IGFueSB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLmNvbnZlcnRUb0pzb24oY2FsbD8ucGFyYW1ldGVycz8uWydQYXJhbXMnXSB8fCAne30nKTtcclxuICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcclxuICAgIG5vdGlmaWNhdGlvbi5jbGllbnRTaWQgPSBjYWxsU2lkO1xyXG4gICAgLy8gT25seSByZWFsIFR3aWxpbyBTSUQgZXhwb3NlZCBjbGllbnQtc2lkZSBmb3IgdGhpcyBsZWc7IG5vIHNlcGFyYXRlIHBhcnRpY2lwYW50IFNJRFxyXG4gICAgLy8gaXMgYXZhaWxhYmxlLCBzbyBpdCBtaXJyb3JzIGNsaWVudFNpZC5cclxuICAgIG5vdGlmaWNhdGlvbi5wYXJ0aWNpcGFudFNpZCA9IGNhbGxTaWQ7XHJcbiAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZSA9ICdpbmNvbWluZ2NhbGwnO1xyXG4gICAgbm90aWZpY2F0aW9uLnRpdGxlID0gJ0luY29taW5nIENhbGwnO1xyXG4gICAgbm90aWZpY2F0aW9uLm1zZ0JvZHkgPSBgeW91IGhhdmUgaW5jb21pbmcgY2FsbCAke25vdGlmaWNhdGlvbi5mcm9tTmFtZSB8fCAnJ31gO1xyXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRUb0pzb24oZGF0YTogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IG9iajogYW55ID0ge307XHJcblxyXG4gICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9ybWF0OiBrZXk9dmFsdWUma2V5PXZhbHVlXHJcbiAgICBpZiAoZGF0YS5pbmNsdWRlcygnJicpKSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoZGF0YSk7XHJcblxyXG4gICAgICBwYXJhbXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgIG9ialtrZXldID0gdmFsdWUgPT09ICd0cnVlJ1xyXG4gICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICA6IHZhbHVlID09PSAnZmFsc2UnXHJcbiAgICAgICAgICA/IGZhbHNlXHJcbiAgICAgICAgICA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRm9ybWF0OiB7a2V5PXZhbHVlLCBrZXk9dmFsdWV9XHJcbiAgICAgIGNvbnN0IHRleHQgPSBkYXRhLnRyaW0oKS5yZXBsYWNlKC9eXFx7fFxcfSQvZywgJycpO1xyXG5cclxuICAgICAgdGV4dC5zcGxpdCgnLCcpLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtLmluZGV4T2YoJz0nKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IGl0ZW0uc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7XHJcbiAgICAgICAgICBsZXQgdmFsdWU6IGFueSA9IGl0ZW0uc3Vic3RyaW5nKGluZGV4ICsgMSkudHJpbSgpO1xyXG5cclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB2YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykgdmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb2JqLnJlYWQgPSBmYWxzZTtcclxuICAgIG9iai5zYXZlID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbiAgLy8gU2FmZXR5IG5ldCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVuZGVybHlpbmcgc29ja2V0IGRpZXMgc2lsZW50bHkgZHVyaW5nIGEgbG9uZ1xyXG4gIC8vIHNsZWVwL2lkbGUgcGVyaW9kIHdpdGhvdXQgZXZlciBmaXJpbmcgJ2Vycm9yJy8ndW5yZWdpc3RlcmVkJyAodGhlIE9TIGNhbiBzdXNwZW5kXHJcbiAgLy8gdGltZXJzL3NvY2tldHMgb3V0cmlnaHQpIOKAlCByZS1jaGVjayBkZXZpY2UgaGVhbHRoIHdoZW5ldmVyIHRoZSBhcHAgd2FrZXMgdXAuXHJcbiAgcHJpdmF0ZSBlbnN1cmVEZXZpY2VIZWFsdGh5KCkge1xyXG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5kZXZpY2UgfHwgdGhpcy5kZXZpY2Uuc3RhdGUgIT09ICdyZWdpc3RlcmVkJykge1xyXG4gICAgICBjb25zb2xlLmxvZygnVHdpbGlvIGRldmljZSB1bmhlYWx0aHkgYWZ0ZXIgd2FrZS92aXNpYmlsaXR5IGNoYW5nZSwgcmUtaW5pdGlhbGl6aW5nJyk7XHJcbiAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1R3aWxpbyBkZXZpY2UgcmVjb3ZlcnkgZmFpbGVkOicsIGVycilcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzYXZlQ29udGFjdChwYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyl9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svYWRkL2NvbnRhY3RzL21hbnVhbGx5JywgcGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ29udGFjdChwYXlsb2FkOmFueSl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0aGlzLnRva2VufSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwZGF0ZS9jb250YWN0JywgcGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBcclxuICBkZWxldGVDb250YWN0KGlkOnN0cmluZyl7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcGhvbmVib29raWQ6IGlkXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2RlbGV0ZS9jb250YWN0LycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBnZXRDb250YWN0TGlzdCgpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3JlYWQvY29udGFjdHMnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBhZGRDb250YWN0VG9GYXZvdXJpdGUocGF5bG9hZDogYW55KXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBkYXRlL2Zhdm91cml0ZScsIHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGdldEZhdm91cml0Q29udGFjdHMoKXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9mYXZvdXJpdGUvY29udGFjdHMnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWNlbnRDYWxscyhwYWdlSW5kZXg/OiBzdHJpbmcsIHBhZ2VTaXplPzogc3RyaW5nLCl7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID17aGVhZGVyc31cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svcmVjZW50L2NhbGxzJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBkZWxldGVSZWNlbnRDYWxsTG9nKGlkOnN0cmluZ3wgc3RyaW5nW10pe1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIHJlY29yZElkOiBpZFxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY2FsbHMvJytpZCxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRQaG90byhwYXlsb2FkOiBhbnkpe1xyXG4gICAgbGV0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBsb2FkL3Bob3RvJyxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVQaG90byhpZDpzdHJpbmcpe1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIHBob25lYm9va2lkOiBpZFxyXG4gICAgfVxyXG4gICAgbGV0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL3Bob3RvLycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ291dHJ5Q29kZVRvYXN0KHZhbDphbnkpe1xyXG4gICAgbGV0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9jb3VudHJ5Y29kZS9hbGVydC8nICsgdmFsLCB7fSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBnZXRUb051bWJlcihkaWFsbGVkTm86IHN0cmluZywgaXNvQ29kZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSksXHJcbiAgICAgIHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lzb0NvZGUnLCBpc29Db2RlKVxyXG4gICAgfTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpc29Db2RlJywgaXNvQ29kZSlcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvY2hlY2svY291bnRyeUNvZGUvJyArIGRpYWxsZWRObywgaHR0cE9wdGlvbnMpO1xyXG4gIH0gXHJcbiAgXHJcbiAgLy8gUmVjb3JkIGEgcmluZ2luZyBpbmNvbWluZyBDYWxsIHNvIGl0IGNhbiBsYXRlciBiZSBhY2NlcHRlZCBieSBpdHMgc3BlY2lmaWMgaWQuXHJcbiAgLy8gVGhlIG1hcCBpcyBjbGVhbmVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2FsbCBpcyBjYW5jZWxsZWQvZGlzY29ubmVjdGVkL3JlamVjdGVkLlxyXG4gIHByaXZhdGUgdHJhY2tJbmNvbWluZ0NhbGwoY2FsbDogYW55KSB7XHJcbiAgICBjb25zdCBjYWxsU2lkID0gY2FsbD8ucGFyYW1ldGVycz8uWydDYWxsU2lkJ107XHJcbiAgICBpZiAoY2FsbFNpZCkge1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbHNNYXAuc2V0KGNhbGxTaWQsIGNhbGwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgaWYgKCFjYWxsU2lkKSByZXR1cm47XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsc01hcC5kZWxldGUoY2FsbFNpZCk7XHJcbiAgICAgIC8vIElmIHRoZSBjYWxsIGVuZGVkIGJlZm9yZSB0aGUgdXNlciBhY2NlcHRlZCBpdCwgZGVzdHJveSB0aGUgcGVuZGluZyBzcGFyZVxyXG4gICAgICAvLyBkZXZpY2UgdGhhdCB3YXMgaG9sZGluZyBpdCBzbyB3ZSBkb24ndCBsZWFrIGRldmljZSByZWdpc3RyYXRpb25zLlxyXG4gICAgICBjb25zdCBkZXYgPSB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZ2V0KGNhbGxTaWQpO1xyXG4gICAgICBpZiAoZGV2ICYmICFkZXYuX293bnNBY2NlcHRlZENhbGwpIHtcclxuICAgICAgICB0cnkgeyBkZXYuZGVzdHJveSgpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5kZWxldGUoY2FsbFNpZCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBjYWxsLm9uKCdjYW5jZWwnLCBjbGVhbnVwKTtcclxuICAgIGNhbGwub24oJ2Rpc2Nvbm5lY3QnLCBjbGVhbnVwKTtcclxuICAgIGNhbGwub24oJ3JlamVjdCcsIGNsZWFudXApO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVzb2x2ZSB0aGUgRVhBQ1QgcmluZ2luZyBDYWxsIGZvciBhIGdpdmVuIFVJIGVudHJ5IGlkIChwYXJ0aWNpcGFudC9yZWNvcmQgaWQpLlxyXG4gIC8vIEZhbGxzIGJhY2sgdG8gdGhlIG1vc3QgcmVjZW50IGluY29taW5nIGNhbGwgc28gb2xkZXIgc2luZ2xlLWNhbGwgZmxvd3Mgc3RpbGwgd29yay5cclxuICBnZXRJbmNvbWluZ0NhbGxCeUlkKGlkOiBhbnkpIHtcclxuICAgIGlmIChpZCAhPSBudWxsICYmIHRoaXMuaW5jb21pbmdDYWxsc01hcC5oYXMoaWQpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluY29taW5nQ2FsbHNNYXAuZ2V0KGlkKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmluY29taW5nQ2FsbERldGFpbC5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXSA9PSBpZCA/IHRoaXMuaW5jb21pbmdDYWxsRGV0YWlsIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByZXBhcmVEZXZpY2UyRm9ySW5jb21pbmdDYWxsKCkge1xyXG4gICAgaWYgKHRoaXMuc3BhcmVEZXZpY2UpIHtcclxuICAgICAgcmV0dXJuOyAvLyBhIGZyZWUgc3BhcmUgaXMgYWxyZWFkeSB3YWl0aW5nXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsVG9rZW4pIHtcclxuICAgICAgY29uc29sZS53YXJuKCdwcmVwYXJlU3BhcmVEZXZpY2U6IG5vIHRva2VuIGF2YWlsYWJsZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzcGFyZTogYW55ID0gbmV3IERldmljZSh0aGlzLmluY29taW5nQ2FsbFRva2VuLCB7IGFsbG93SW5jb21pbmdXaGlsZUJ1c3k6IHRydWUgfSk7XHJcbiAgICBzcGFyZS5fb3duc0FjY2VwdGVkQ2FsbCA9IGZhbHNlO1xyXG5cclxuICAgIHNwYXJlLm9uKCdyZWdpc3RlcmVkJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNwYXJlRGV2aWNlUmVhZHkgPSB0cnVlO1xyXG4gICAgICAvLyBBcHBseSB0aGUgbXV0ZSBwcmVmZXJlbmNlIGhlcmUg4oCUIGBzcGFyZS5hdWRpb2AgaXMgb25seSByZWFkeSBhZnRlciByZWdpc3RyYXRpb24sXHJcbiAgICAgIC8vIHNvIHRoZSBjYWxsIGFib3ZlIChiZWZvcmUgcmVnaXN0ZXIoKSkgd2FzIGFsd2F5cyBhIG5vLW9wLlxyXG4gICAgICB0cnkgeyBzcGFyZS5hdWRpbz8uaW5jb21pbmcoIXRoaXMuaXNJbmNvbWluZ011dGVkKTsgfSBjYXRjaCAoXykge31cclxuICAgICAgY29uc29sZS5sb2coJ1NwYXJlIGRldmljZSByZWdpc3RlcmVkIOKAkyByZWFkeSBmb3IgdGhlIG5leHQgY29uY3VycmVudCBjYWxsJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzcGFyZS5vbignaW5jb21pbmcnLCAoY2FsbDogQ2FsbCkgPT4ge1xyXG4gICAgICAvLyBHdWFyZDogb25jZSB0aGlzIHNwYXJlIGlzIGFscmVhZHkgaGFuZGxpbmcgYSBjYWxsIChwZW5kaW5nIG9yIGFjY2VwdGVkKSxcclxuICAgICAgLy8gaWdub3JlIGFueSBmdXJ0aGVyIGluY29taW5nIGV2ZW50cyBzbyBhbm90aGVyIHNwYXJlIGNhbiB0YWtlIHRoZSBuZXh0IGNhbGwuXHJcbiAgICAgIGlmIChzcGFyZS5fb3duc0FjY2VwdGVkQ2FsbCB8fCBzcGFyZS5fcGVuZGluZ0luY29taW5nQ2FsbCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzcGFyZS5fcGVuZGluZ0luY29taW5nQ2FsbCA9IGNhbGw7XHJcbiAgICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcclxuXHJcbiAgICAgIC8vIFRyYW5zaXRpb24gdGhpcyBzcGFyZSBmcm9tIFwiZnJlZVwiIOKGkiBcInBlbmRpbmdcIjogcmVtb3ZlIGl0IGFzIHRoZSBhY3RpdmVcclxuICAgICAgLy8gc3BhcmVEZXZpY2UgYW5kIHRyYWNrIGl0IGJ5IENhbGxTaWQgc28gb25Db25jdXJyZW50Q2FsbEFjY2VwdGVkIGNhbiBmaW5kIGl0LlxyXG4gICAgICBpZiAodGhpcy5zcGFyZURldmljZSA9PT0gc3BhcmUpIHtcclxuICAgICAgICB0aGlzLnNwYXJlRGV2aWNlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNwYXJlRGV2aWNlUmVhZHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2FsbFNpZCkge1xyXG4gICAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5zZXQoY2FsbFNpZCwgc3BhcmUpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEltbWVkaWF0ZWx5IGFybSB0aGUgTkVYVCBmcmVlIHNwYXJlIHNvIGl0IGlzIHJlYWR5IGZvciBjYWxsIE4rMiB3aXRob3V0XHJcbiAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSB1c2VyIHRvIGFjY2VwdCB0aGlzIGNhbGwgZmlyc3QuXHJcbiAgICAgIHRoaXMucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzSW5jb21pbmdNdXRlZCkge1xyXG4gICAgICAgIHRyeSB7IHNwYXJlLmF1ZGlvPy5pbmNvbWluZyhmYWxzZSk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmFja0luY29taW5nQ2FsbChjYWxsKTtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEZXRhaWwgPSBjYWxsO1xyXG4gICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuYnVpbGRJbmNvbWluZ05vdGlmaWNhdGlvbihjYWxsKTtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24ubmV4dChub3RpZmljYXRpb24pO1xyXG4gICAgICBjb25zb2xlLmxvZygnc3BhcmUgZGV2aWNlOiBpbmNvbWluZyBjYWxsJywgY2FsbCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzcGFyZS5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdTcGFyZSBkZXZpY2UgZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc3BhcmUucmVnaXN0ZXIoKTtcclxuICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBzcGFyZTtcclxuICAgIGNvbnNvbGUubG9nKCdzcGFyZSBkZXZpY2UgY3JlYXRlZCBhbmQgcmVnaXN0ZXJpbmcnKTtcclxuICB9XHJcblxyXG4gIG9uQ29uY3VycmVudENhbGxBY2NlcHRlZChhY2NlcHRlZENhbGw6IGFueSkge1xyXG4gICAgY29uc3Qgc2lkID0gYWNjZXB0ZWRDYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcclxuICAgIGlmIChzaWQpIHtcclxuICAgICAgLy8gUHJpbWFyeSBwYXRoOiB0aGUgYWNjZXB0ZWQgY2FsbCB3YXMgaGVsZCBieSBhIHBlbmRpbmcgc3BhcmUgZGV2aWNlLlxyXG4gICAgICBjb25zdCBkZXYgPSB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZ2V0KHNpZCk7XHJcbiAgICAgIGlmIChkZXYpIHtcclxuICAgICAgICBkZXYuX293bnNBY2NlcHRlZENhbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLnNldChzaWQsIGRldik7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmRlbGV0ZShzaWQpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIExlZ2FjeSBmYWxsYmFjazogb2xkIHNpbmdsZS1zcGFyZSBwYXRoIChzcGFyZSBzdGlsbCBob2xkcyB0aGUgY2FsbCkuXHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc3BhcmVEZXZpY2UgJiYgdGhpcy5zcGFyZURldmljZS5fcGVuZGluZ0luY29taW5nQ2FsbCA9PT0gYWNjZXB0ZWRDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZS5fb3duc0FjY2VwdGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5leHRyYURldmljZXMuc2V0KHNpZCwgdGhpcy5zcGFyZURldmljZSk7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZVJlYWR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEVuc3VyZSBhIGZyZWUgc3BhcmUgaXMgYWx3YXlzIHJlYWR5IGZvciB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwuXHJcbiAgICB0aGlzLnByZXBhcmVEZXZpY2UyRm9ySW5jb21pbmdDYWxsKCk7XHJcbiAgfVxyXG5cclxuICByZWxlYXNlQ29uY3VycmVudENhbGxEZXZpY2UoY2FsbFNpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBkZXYgPSB0aGlzLmV4dHJhRGV2aWNlcy5nZXQoY2FsbFNpZCk7XHJcbiAgICBpZiAoZGV2KSB7XHJcbiAgICAgIHRyeSB7IGRldi5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLmRlbGV0ZShjYWxsU2lkKTtcclxuICAgICAgY29uc29sZS5sb2coJ3JlbGVhc2VkIGNvbmN1cnJlbnQtY2FsbCBkZXZpY2UgZm9yJywgY2FsbFNpZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEFsc28gcmVsZWFzZSBwZW5kaW5nIGRldmljZXMgdGhhdCB3ZXJlIGNhbmNlbGxlZCBiZWZvcmUgYWNjZXB0YW5jZS5cclxuICAgIGNvbnN0IHBlbmRpbmdEZXYgPSB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZ2V0KGNhbGxTaWQpO1xyXG4gICAgaWYgKHBlbmRpbmdEZXYpIHtcclxuICAgICAgdHJ5IHsgcGVuZGluZ0Rldi5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5kZWxldGUoY2FsbFNpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBXaGVuIG5vIGFjY2VwdGVkIGNhbGxzIHJlbWFpbiwgdGVhciBkb3duIGFsbCBzcGFyZS9wZW5kaW5nL2V4dHJhIGRldmljZXMgc29cclxuICAvLyB0aGUgcHJpbWFyeSBkZXZpY2UgY2xlYW5seSBoYW5kbGVzIHRoZSBuZXh0IGZyZXNoIGluY29taW5nIGNhbGwuXHJcbiAgdGVhcmRvd25TcGFyZURldmljZXNJZklkbGUoKSB7XHJcbiAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHRyYURldmljZXMuZm9yRWFjaCgoZCkgPT4geyB0cnkgeyBkLmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge30gfSk7XHJcbiAgICB0aGlzLmV4dHJhRGV2aWNlcy5jbGVhcigpO1xyXG4gICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmZvckVhY2goKGQpID0+IHsgdHJ5IHsgZC5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9IH0pO1xyXG4gICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmNsZWFyKCk7XHJcbiAgICBpZiAodGhpcy5zcGFyZURldmljZSkge1xyXG4gICAgICB0cnkgeyB0aGlzLnNwYXJlRGV2aWNlLmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge31cclxuICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gICAgY29uc29sZS5sb2coJ3NwYXJlL2V4dHJhIGRldmljZXMgdG9ybiBkb3duIChpZGxlKScpO1xyXG4gIH1cclxuXHJcbiAgLy8gQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMga2VwdCBmb3IgZXhpc3RpbmcgY2FsbCBzaXRlcy5cclxuICBkZXN0cm95RGV2aWNlMigpIHtcclxuICAgIHRoaXMudGVhcmRvd25TcGFyZURldmljZXNJZklkbGUoKTtcclxuICB9XHJcblxyXG4gIC8vIFVzZXItY29udHJvbGxlZCBzd2l0Y2ggKGluIHRoZSBjYWxsLXByb2dyZXNzIFVJKS4gV2hlbiBPTiwgYSBuZXcgaW5jb21pbmdcclxuICAvLyBjYWxsJ3MgYnVpbHQtaW4gVHdpbGlvIHJpbmd0b25lIGlzIHNpbGVuY2VkIHNvIGl0IGRvZXMgbm90IGRpc3R1cmIgdGhlXHJcbiAgLy8gb25nb2luZyBjYWxsLiBTb3VyY2Ugb2YgdHJ1dGggc28gbmV3bHkgY3JlYXRlZCAoc3BhcmUpIGRldmljZXMgaW5oZXJpdCBpdC5cclxuICBpc0luY29taW5nTXV0ZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gQXBwbHkgdGhlIGN1cnJlbnQgbXV0ZSBwcmVmZXJlbmNlIHRvIGV2ZXJ5IGxpdmUgRGV2aWNlIChwcmltYXJ5ICsgc3BhcmUgK1xyXG4gIC8vIGFueSBjb25jdXJyZW50LWNhbGwgZGV2aWNlcykgdmlhIFR3aWxpbydzIG93biBkZXZpY2UuYXVkaW8uaW5jb21pbmcoKS5cclxuICBhcHBseUluY29taW5nTXV0ZSgpIHtcclxuICAgIGNvbnN0IGVuYWJsZWQgPSAhdGhpcy5pc0luY29taW5nTXV0ZWQ7IC8vIHJpbmd0b25lIGVuYWJsZWQgPSBOT1QgbXV0ZWRcclxuICAgIGNvbnN0IGFwcGx5ID0gKGRldjogYW55KSA9PiB7XHJcbiAgICAgIHRyeSB7IGRldj8uYXVkaW8/LmluY29taW5nPy4oZW5hYmxlZCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICB9O1xyXG4gICAgYXBwbHkodGhpcy5kZXZpY2UpO1xyXG4gICAgYXBwbHkodGhpcy5zcGFyZURldmljZSk7XHJcbiAgICB0aGlzLmV4dHJhRGV2aWNlcy5mb3JFYWNoKGFwcGx5KTtcclxuICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKGFwcGx5KTtcclxuICB9XHJcblxyXG4gIC8vIFRvZ2dsZS9zZXQgdGhlIG11dGUgc3dpdGNoIGFuZCBpbW1lZGlhdGVseSBhcHBseSBpdC5cclxuICBzZXRJbmNvbWluZ011dGVkKG11dGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzSW5jb21pbmdNdXRlZCA9IG11dGVkO1xyXG4gICAgdGhpcy5hcHBseUluY29taW5nTXV0ZSgpO1xyXG4gICAgaWYgKG11dGVkKSB7XHJcbiAgICAgIC8vIGRldmljZS5hdWRpby5pbmNvbWluZyhmYWxzZSkgb25seSBwcmV2ZW50cyBmdXR1cmUgcmluZ3Mg4oCUIGl0IGRvZXMgTk9UIHN0b3BcclxuICAgICAgLy8gYSBjYWxsIHRoYXQgaXMgYWxyZWFkeSByaW5naW5nLiBTdG9wIHRoZSBhY3RpdmUgcmluZyBkaXJlY3RseSB2aWEgc291bmRjYWNoZS5cclxuICAgICAgY29uc3Qgc3RvcFJpbmcgPSAoZGV2OiBhbnkpID0+IHtcclxuICAgICAgICB0cnkgeyBkZXY/Ll9zb3VuZGNhY2hlPy5nZXQ/LignaW5jb21pbmcnKT8uc3RvcD8uKCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIH07XHJcbiAgICAgIHN0b3BSaW5nKHRoaXMuZGV2aWNlKTtcclxuICAgICAgc3RvcFJpbmcodGhpcy5zcGFyZURldmljZSk7XHJcbiAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLmZvckVhY2goKGRldjogYW55KSA9PiBzdG9wUmluZyhkZXYpKTtcclxuICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmZvckVhY2goKGRldjogYW55KSA9PiBzdG9wUmluZyhkZXYpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEluY29taW5nUGFydGljaXBhbnQocGFydGljaXBhbnRJZDogc3RyaW5nLCBjb25mZXJlbmNlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSksXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGAke2Vudmlyb25tZW50LmFwaVVybH0vdXRpbGl0aWVzL2V4dC9hZGQvaW5jb21pbmcvcGFydGljaXBhbnQvJHtwYXJ0aWNpcGFudElkfS8ke2NvbmZlcmVuY2VJZH1gLGh0dHBPcHRpb25zKTtcclxuICB9IFxyXG4gIGNvbm5lY3QoZGF0YT86IGFueSl7XHJcbiAgICBpZiAodGhpcy5kZXZpY2UuX2FjdGl2ZUNhbGwpIHtcclxuICAgICAgY29uc29sZS5sb2coJzI0NC10ZXN0JylcclxuICAgICAgdGhpcy5kZXZpY2UuZGlzY29ubmVjdEFsbCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlLmNvbm5lY3Qoe1xyXG4gICAgICBwYXJhbXM6IHtcclxuICAgICAgICBUb2tlbjogdGhpcy5jb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCB8fCBkYXRhLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICBDb25mZXJlbmNlTmFtZTogdGhpcy5jb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VOYW1lIHx8IGRhdGEuY29uZmVyZW5jZU5hbWVcclxuICAgICAgfSxcclxuICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHsgZGV2aWNlSWQ6ICdkZWZhdWx0JyB9IH0sXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iXX0=
|