@vgroup/dialbox 0.8.18 → 0.8.20

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.
@@ -1,21 +1,21 @@
1
1
  export const environment = {
2
- abb: "d",
2
+ abb: "t",
3
3
  production: false,
4
4
  secureCookies: true,
5
- feUrl: 'https://dev.vgroupinc.com:91/',
6
- apiUrl: 'https://dev-api-t10.vgroupinc.com/dev_softphone_p91',
7
- websocketUrl: 'wss://dev-api-t10.vgroupinc.com/dev_softphone_p91/',
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: "pk_test_51K6aTuBiNVV2TMlQfmBWY8jziwiDo0IZ3TrqWPqth1m32cpMAAg5Qpi2AlSMDEAX6hCZRBXoTzBB1uQQLc8B4tco00q2SgG6zO",
9
+ stripePublishableKey: "pk_test_51NbMVaA3guus6fhlTuCV5ycFTIJmwgN38dDUf9pNPfM319x5CkLbV6EbTQaZiNOrRsfR16RWLE8hQmR0eZFTBqTy00Wlsug4qS",
10
10
  sessionTimeout: 15,
11
11
  deviceType: "web",
12
12
  appVersion: "2.3",
13
13
  channelId: '61481b12e138eb7dc3007579',
14
14
  c2c_support_point_id: '60424735f74ac306c1bfa900',
15
- c2c_support_channel_id: '677f67f3be93ab507fbbfdfc',
15
+ c2c_support_channel_id: '677f6726be93ab507fbbfdf0',
16
16
  c2c_point_url: 'https://app.contexttocall.com/assets/cdn/c2c.js',
17
- c2c_call_label_id: 'ye2XFLfOHCr12GFVRzPh',
18
- c2c_email_label_id: 'mvjVgOP2VCiYsVovQqdq',
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",
@@ -29,7 +29,7 @@ export const environment = {
29
29
  },
30
30
  perspectiveApiKey: 'AIzaSyClf32lvLH4QOy-vOnzLzwSNntKIgapH8s',
31
31
  keycloakURL: 'https://test-keycloak.vgroupinc.com/',
32
- keycloakRealm: 'vgroup-dev',
32
+ keycloakRealm: 'vgroup-test',
33
33
  keycloakClientId: 'c2c-softphone-app'
34
34
  };
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsVUFBVSxFQUFFLEtBQUs7SUFDakIsYUFBYSxFQUFFLElBQUk7SUFDbkIsS0FBSyxFQUFFLCtCQUErQjtJQUN0QyxNQUFNLEVBQUUscURBQXFEO0lBQzdELFlBQVksRUFBRSxvREFBb0Q7SUFDbEUsVUFBVSxFQUFFLDBDQUEwQztJQUN0RCxvQkFBb0IsRUFBRSw2R0FBNkc7SUFDbkksY0FBYyxFQUFFLEVBQUU7SUFDbEIsVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLEtBQUs7SUFDakIsU0FBUyxFQUFFLDBCQUEwQjtJQUNyQyxvQkFBb0IsRUFBRSwwQkFBMEI7SUFDaEQsc0JBQXNCLEVBQUUsMEJBQTBCO0lBQ2xELGFBQWEsRUFBRSxpREFBaUQ7SUFDaEUsaUJBQWlCLEVBQUUsc0JBQXNCO0lBQ3pDLGtCQUFrQixFQUFFLHNCQUFzQjtJQUMxQyxXQUFXLEVBQUUsc0RBQXNEO0lBQ25FLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSx5Q0FBeUM7UUFDakQsVUFBVSxFQUFFLGlDQUFpQztRQUM3QyxTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLGFBQWEsRUFBRSw2QkFBNkI7UUFDNUMsaUJBQWlCLEVBQUUsY0FBYztRQUNqQyxLQUFLLEVBQUUsMkNBQTJDO1FBQ2xELGFBQWEsRUFBRSxjQUFjO1FBQzdCLFFBQVEsRUFBRSx5RkFBeUY7S0FDcEc7SUFDRCxpQkFBaUIsRUFBRSx5Q0FBeUM7SUFDNUQsV0FBVyxFQUFFLHNDQUFzQztJQUNuRCxhQUFhLEVBQUUsWUFBWTtJQUMzQixnQkFBZ0IsRUFBRSxtQkFBbUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcclxuICBhYmI6IFwiZFwiLFxyXG4gIHByb2R1Y3Rpb246IGZhbHNlLFxyXG4gIHNlY3VyZUNvb2tpZXM6IHRydWUsXHJcbiAgZmVVcmw6ICdodHRwczovL2Rldi52Z3JvdXBpbmMuY29tOjkxLycsXHJcbiAgYXBpVXJsOiAnaHR0cHM6Ly9kZXYtYXBpLXQxMC52Z3JvdXBpbmMuY29tL2Rldl9zb2Z0cGhvbmVfcDkxJyxcclxuICB3ZWJzb2NrZXRVcmw6ICd3c3M6Ly9kZXYtYXBpLXQxMC52Z3JvdXBpbmMuY29tL2Rldl9zb2Z0cGhvbmVfcDkxLycsXHJcbiAgY2FwdGNoYUtleTogXCI2TGZwT21FYUFBQUFBR3NJNkpYbE16T2wzYjdyVzRZbVlYRkRqbGREXCIsXHJcbiAgc3RyaXBlUHVibGlzaGFibGVLZXk6IFwicGtfdGVzdF81MUs2YVR1QmlOVlYyVE1sUWZtQldZOGp6aXdpRG8wSVozVHJxV1BxdGgxbTMyY3BNQUFnNVFwaTJBbFNNREVBWDZoQ1pSQlhvVHpCQjF1UVFMYzhCNHRjbzAwcTJTZ0c2ek9cIixcclxuICBzZXNzaW9uVGltZW91dDogMTUsIC8vaW4gbWlucyxcclxuICBkZXZpY2VUeXBlOiBcIndlYlwiLFxyXG4gIGFwcFZlcnNpb246IFwiMi4zXCIsXHJcbiAgY2hhbm5lbElkOiAnNjE0ODFiMTJlMTM4ZWI3ZGMzMDA3NTc5JyxcclxuICBjMmNfc3VwcG9ydF9wb2ludF9pZDogJzYwNDI0NzM1Zjc0YWMzMDZjMWJmYTkwMCcsXHJcbiAgYzJjX3N1cHBvcnRfY2hhbm5lbF9pZDogJzY3N2Y2N2YzYmU5M2FiNTA3ZmJiZmRmYycsXHJcbiAgYzJjX3BvaW50X3VybDogJ2h0dHBzOi8vYXBwLmNvbnRleHR0b2NhbGwuY29tL2Fzc2V0cy9jZG4vYzJjLmpzJyxcclxuICBjMmNfY2FsbF9sYWJlbF9pZDogJ3llMlhGTGZPSENyMTJHRlZSelBoJywvLyBkZXZcclxuICBjMmNfZW1haWxfbGFiZWxfaWQ6ICdtdmpWZ09QMlZDaVlzVm92UXFkcScsLy8gZGV2XHJcbiAgcmFkYXJBUElLZXk6ICdwcmpfbGl2ZV9za181NjliNmY2MzllZGRlNjEyMGEyNmY3MDM1MTFjNjFhYWVjZDNmN2VmJyxcclxuICBmaXJlYmFzZToge1xyXG4gICAgYXBpS2V5OiBcIkFJemFTeUNBOExTUHJxbERxX3RoazI2TGhCUWV4QVFlWTZwa1U1WVwiLFxyXG4gICAgYXV0aERvbWFpbjogXCJzb2Z0cGhvbmUtZDU3NzcuZmlyZWJhc2VhcHAuY29tXCIsXHJcbiAgICBwcm9qZWN0SWQ6IFwic29mdHBob25lLWQ1Nzc3XCIsXHJcbiAgICBzdG9yYWdlQnVja2V0OiBcInNvZnRwaG9uZS1kNTc3Ny5hcHBzcG90LmNvbVwiLFxyXG4gICAgbWVzc2FnaW5nU2VuZGVySWQ6IFwiODUwODEyNDk0NTM4XCIsXHJcbiAgICBhcHBJZDogXCIxOjg1MDgxMjQ5NDUzODp3ZWI6NzRmOGEzMGZjMThlMjhkZWQ3OGEzM1wiLFxyXG4gICAgbWVhc3VyZW1lbnRJZDogXCJHLU5HWFRTVjlTSDNcIixcclxuICAgIHZhcGlkS2V5OiBcIkJENkVnY1FnYlpUak9RZmxlRzNZbEVjMF9TYWpCMDNwcnFUZER5LXFHSmt4VHhlemJxLUFfcXR1WEUxbDN5VDQ3bzhoblRBYlRLQmNIMTVEMkFKQjJUb1wiXHJcbiAgfSxcclxuICBwZXJzcGVjdGl2ZUFwaUtleTogJ0FJemFTeUNsZjMybHZMSDRRT3ktdk9uekx6d1NObnRLSWdhcEg4cycsXHJcbiAga2V5Y2xvYWtVUkw6ICdodHRwczovL3Rlc3Qta2V5Y2xvYWsudmdyb3VwaW5jLmNvbS8nLFxyXG4gIGtleWNsb2FrUmVhbG06ICd2Z3JvdXAtZGV2JyxcclxuICBrZXljbG9ha0NsaWVudElkOiAnYzJjLXNvZnRwaG9uZS1hcHAnXHJcbn07Il19
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsVUFBVSxFQUFFLEtBQUs7SUFDakIsYUFBYSxFQUFFLElBQUk7SUFDbkIsS0FBSyxFQUFDLGdDQUFnQztJQUN0QyxNQUFNLEVBQUUsMkNBQTJDO0lBQ2pELFlBQVksRUFBRSwwQ0FBMEM7SUFDMUQsVUFBVSxFQUFFLDBDQUEwQztJQUN0RCxvQkFBb0IsRUFBRSw2R0FBNkc7SUFDbkksY0FBYyxFQUFFLEVBQUU7SUFDbEIsVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLEtBQUs7SUFDakIsU0FBUyxFQUFFLDBCQUEwQjtJQUNyQyxvQkFBb0IsRUFBQywwQkFBMEI7SUFDL0Msc0JBQXNCLEVBQUMsMEJBQTBCO0lBQ2pELGFBQWEsRUFBQyxpREFBaUQ7SUFDL0QsaUJBQWlCLEVBQUMsc0JBQXNCO0lBQ3hDLGtCQUFrQixFQUFDLHNCQUFzQjtJQUN6QyxXQUFXLEVBQUUsc0RBQXNEO0lBQ25FLFFBQVEsRUFBRTtRQUNOLE1BQU0sRUFBRSx5Q0FBeUM7UUFDakQsVUFBVSxFQUFFLGlDQUFpQztRQUM3QyxTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLGFBQWEsRUFBRSw2QkFBNkI7UUFDNUMsaUJBQWlCLEVBQUUsY0FBYztRQUNqQyxLQUFLLEVBQUUsMkNBQTJDO1FBQ2xELGFBQWEsRUFBRSxjQUFjO1FBQzdCLFFBQVEsRUFBQyx5RkFBeUY7S0FDckc7SUFDSCxpQkFBaUIsRUFBRSx5Q0FBeUM7SUFDMUQsV0FBVyxFQUFFLHNDQUFzQztJQUNuRCxhQUFhLEVBQUUsYUFBYTtJQUM1QixnQkFBZ0IsRUFBRSxtQkFBbUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcclxuICBhYmI6IFwidFwiLFxyXG4gIHByb2R1Y3Rpb246IGZhbHNlLFxyXG4gIHNlY3VyZUNvb2tpZXM6IHRydWUsXHJcbiAgZmVVcmw6J2h0dHBzOi8vdGVzdC52Z3JvdXBpbmMuY29tOjkxLycsXHJcbiAgYXBpVXJsOiAnaHR0cHM6Ly9hcGlzLnZncm91cGluYy5jb20vdGVzdF9zb2Z0cGhvbmUnLFxyXG4gICAgd2Vic29ja2V0VXJsOiAnd3NzOi8vYXBpcy52Z3JvdXBpbmMuY29tL3Rlc3Rfc29mdHBob25lLycsXHJcbiAgY2FwdGNoYUtleTogXCI2TGZwT21FYUFBQUFBR3NJNkpYbE16T2wzYjdyVzRZbVlYRkRqbGREXCIsXHJcbiAgc3RyaXBlUHVibGlzaGFibGVLZXk6IFwicGtfdGVzdF81MU5iTVZhQTNndXVzNmZobFR1Q1Y1eWNGVElKbXdnTjM4ZERVZjlwTlBmTTMxOXg1Q2tMYlY2RWJUUWFaaU5PclJzZlIxNlJXTEU4aFFtUjBlWkZUQnFUeTAwV2xzdWc0cVNcIixcclxuICBzZXNzaW9uVGltZW91dDogMTUsIC8vaW4gbWluc1xyXG4gIGRldmljZVR5cGU6IFwid2ViXCIsXHJcbiAgYXBwVmVyc2lvbjogXCIyLjNcIixcclxuICBjaGFubmVsSWQ6ICc2MTQ4MWIxMmUxMzhlYjdkYzMwMDc1NzknLFxyXG4gIGMyY19zdXBwb3J0X3BvaW50X2lkOic2MDQyNDczNWY3NGFjMzA2YzFiZmE5MDAnLFxyXG4gIGMyY19zdXBwb3J0X2NoYW5uZWxfaWQ6JzY3N2Y2NzI2YmU5M2FiNTA3ZmJiZmRmMCcsXHJcbiAgYzJjX3BvaW50X3VybDonaHR0cHM6Ly9hcHAuY29udGV4dHRvY2FsbC5jb20vYXNzZXRzL2Nkbi9jMmMuanMnLFxyXG4gIGMyY19jYWxsX2xhYmVsX2lkOic2TlU1ZktFMm1HVHlYREMzeWhtSycsLy8gdGVzdFxyXG4gIGMyY19lbWFpbF9sYWJlbF9pZDonWVBNYW1qOFJ2c0dPUlZ2cVhXeWMnLC8vIHRlc3RcclxuICByYWRhckFQSUtleTogJ3Byal9saXZlX3NrXzU2OWI2ZjYzOWVkZGU2MTIwYTI2ZjcwMzUxMWM2MWFhZWNkM2Y3ZWYnLFxyXG4gIGZpcmViYXNlOiB7XHJcbiAgICAgIGFwaUtleTogXCJBSXphU3lDQThMU1BycWxEcV90aGsyNkxoQlFleEFRZVk2cGtVNVlcIixcclxuICAgICAgYXV0aERvbWFpbjogXCJzb2Z0cGhvbmUtZDU3NzcuZmlyZWJhc2VhcHAuY29tXCIsXHJcbiAgICAgIHByb2plY3RJZDogXCJzb2Z0cGhvbmUtZDU3NzdcIixcclxuICAgICAgc3RvcmFnZUJ1Y2tldDogXCJzb2Z0cGhvbmUtZDU3NzcuYXBwc3BvdC5jb21cIixcclxuICAgICAgbWVzc2FnaW5nU2VuZGVySWQ6IFwiODUwODEyNDk0NTM4XCIsXHJcbiAgICAgIGFwcElkOiBcIjE6ODUwODEyNDk0NTM4OndlYjo3NGY4YTMwZmMxOGUyOGRlZDc4YTMzXCIsXHJcbiAgICAgIG1lYXN1cmVtZW50SWQ6IFwiRy1OR1hUU1Y5U0gzXCIsXHJcbiAgICAgIHZhcGlkS2V5OlwiQkQ2RWdjUWdiWlRqT1FmbGVHM1lsRWMwX1NhakIwM3BycVRkRHktcUdKa3hUeGV6YnEtQV9xdHVYRTFsM3lUNDdvOGhuVEFiVEtCY0gxNUQyQUpCMlRvXCJcclxuICB9LFxyXG5wZXJzcGVjdGl2ZUFwaUtleTogJ0FJemFTeUNsZjMybHZMSDRRT3ktdk9uekx6d1NObnRLSWdhcEg4cycsXHJcbiAga2V5Y2xvYWtVUkw6ICdodHRwczovL3Rlc3Qta2V5Y2xvYWsudmdyb3VwaW5jLmNvbS8nLFxyXG4gIGtleWNsb2FrUmVhbG06ICd2Z3JvdXAtdGVzdCcsXHJcbiAga2V5Y2xvYWtDbGllbnRJZDogJ2MyYy1zb2Z0cGhvbmUtYXBwJ1xyXG59OyJdfQ==
@@ -8,6 +8,39 @@ import * as i0 from "@angular/core";
8
8
  import * as i1 from "@angular/common/http";
9
9
  import * as i2 from "./extension.service";
10
10
  export class TwilioService {
11
+ requestSpecialCallConfirm(message, inCallScreen) {
12
+ this.resolveSpecialCallConfirm(false); // close any stale confirmation
13
+ this.isAwaitingSpecialCallConfirm = true;
14
+ return new Promise((resolve) => {
15
+ this.specialCallConfirmResolver = resolve;
16
+ this.specialCallConfirm = { message, inCallScreen };
17
+ });
18
+ }
19
+ resolveSpecialCallConfirm(isConfirmed) {
20
+ const resolve = this.specialCallConfirmResolver;
21
+ this.specialCallConfirmResolver = null;
22
+ this.specialCallConfirm = null;
23
+ if (isConfirmed) {
24
+ // Twilio has not connected yet – keep the call screen alive until call-progress reports the
25
+ // client leg is connected (releaseSpecialCallGuard), with a safety timeout.
26
+ this.holdCallScreenGuard(20000);
27
+ }
28
+ else {
29
+ this.releaseSpecialCallGuard();
30
+ }
31
+ resolve?.(isConfirmed);
32
+ }
33
+ // Keep the call screen alive while an outgoing call is set up. The safety timeout only covers
34
+ // API/Twilio waits — requestSpecialCallConfirm() clears it so the charges modal can stay open indefinitely.
35
+ holdCallScreenGuard(timeoutMs = 30000) {
36
+ clearTimeout(this.specialCallGuardTimer);
37
+ this.isAwaitingSpecialCallConfirm = true;
38
+ this.specialCallGuardTimer = setTimeout(() => this.releaseSpecialCallGuard(), timeoutMs);
39
+ }
40
+ releaseSpecialCallGuard() {
41
+ clearTimeout(this.specialCallGuardTimer);
42
+ this.isAwaitingSpecialCallConfirm = false;
43
+ }
11
44
  constructor(http, extensionService) {
12
45
  this.http = http;
13
46
  this.extensionService = extensionService;
@@ -35,12 +68,23 @@ export class TwilioService {
35
68
  // CRITICAL: Track all accepted Call objects (mirrors iOS acceptedCallList)
36
69
  // Used to guard device re-initialization so active calls are never torn down
37
70
  this.acceptedCallList = [];
71
+ // True while an outgoing call is being set up (initiate API → special call charges modal → Twilio
72
+ // client leg connected). Socket ticks are empty during this window, so dialbox must not treat them as idle.
73
+ this.isAwaitingSpecialCallConfirm = false;
74
+ // Special call charges modal state. inCallScreen: true → rendered by call-progress (a call screen is open),
75
+ // false → rendered by dialbox over the "Connecting..." loader (first call, call screen not rendered yet)
76
+ this.specialCallConfirm = null;
77
+ this.specialCallConfirmResolver = null;
38
78
  this.primaryHasCall = false;
39
79
  this.spareDevice = null;
40
80
  this.spareDeviceReady = false;
41
81
  this.pendingIncomingDevices = new Map();
42
82
  this.extraDevices = new Map();
43
83
  this.incomingCallsMap = new Map();
84
+ // BE issues incoming-call access tokens with a 1h30m TTL. Ask Twilio to fire
85
+ // 'tokenWillExpire' 5 minutes before that (SDK default is only 10s) so a slow
86
+ // network / backgrounded tab still has time to fetch and apply a fresh token.
87
+ this.TOKEN_REFRESH_MS = 5 * 60 * 1000;
44
88
  this.tokenRefreshInProgress = false;
45
89
  this.recoveryAttempts = 0;
46
90
  this.recoveryTimer = null;
@@ -129,7 +173,7 @@ export class TwilioService {
129
173
  console.error('No Twilio token available');
130
174
  return;
131
175
  }
132
- const device = new Device(this.incomingCallToken, { allowIncomingWhileBusy: true });
176
+ const device = new Device(this.incomingCallToken, { allowIncomingWhileBusy: true, tokenRefreshMs: this.TOKEN_REFRESH_MS });
133
177
  this.device = device;
134
178
  device.on('registered', () => {
135
179
  console.log('Twilio Device registered successfully');
@@ -143,7 +187,7 @@ export class TwilioService {
143
187
  }
144
188
  this.prepareDevice2ForIncomingCall();
145
189
  });
146
- // Twilio fires this ~3 minutes before the access token expires. Swap in a
190
+ // Twilio fires this TOKEN_REFRESH_MS before the access token expires. Swap in a
147
191
  // fresh one via updateToken() so the signaling connection never has to drop
148
192
  // in the first place (this is the main cause of "idle for a while, BE still
149
193
  // notifies but Twilio incoming event never fires").
@@ -238,12 +282,23 @@ export class TwilioService {
238
282
  this.incomingCallToken = data.token;
239
283
  localStorage.setItem('in-token', data.token);
240
284
  this.tokenInitialized = true;
241
- try {
242
- this.device?.updateToken(this.incomingCallToken);
243
- }
244
- catch (err) {
245
- console.error('Failed to apply refreshed Twilio token:', err);
246
- }
285
+ // Every live Device was created from the same token, so they all expire
286
+ // together — refresh the spare/pending/concurrent ones too, otherwise the
287
+ // spare silently dies after 1h30m idle and concurrent calls never ring.
288
+ const apply = (dev) => {
289
+ if (!dev)
290
+ return;
291
+ try {
292
+ dev.updateToken(this.incomingCallToken);
293
+ }
294
+ catch (err) {
295
+ console.error('Failed to apply refreshed Twilio token:', err);
296
+ }
297
+ };
298
+ apply(this.device);
299
+ apply(this.spareDevice);
300
+ this.pendingIncomingDevices.forEach(apply);
301
+ this.extraDevices.forEach(apply);
247
302
  },
248
303
  error: (err) => {
249
304
  this.tokenRefreshInProgress = false;
@@ -458,8 +513,13 @@ export class TwilioService {
458
513
  console.warn('prepareSpareDevice: no token available');
459
514
  return;
460
515
  }
461
- const spare = new Device(this.incomingCallToken, { allowIncomingWhileBusy: true });
516
+ const spare = new Device(this.incomingCallToken, { allowIncomingWhileBusy: true, tokenRefreshMs: this.TOKEN_REFRESH_MS });
462
517
  spare._ownsAcceptedCall = false;
518
+ // Fallback in case the primary device is gone/replaced: the spare can trigger
519
+ // the shared refresh itself (refreshDeviceToken dedupes concurrent requests).
520
+ spare.on('tokenWillExpire', () => {
521
+ this.refreshDeviceToken();
522
+ });
463
523
  spare.on('registered', () => {
464
524
  this.spareDeviceReady = true;
465
525
  // Apply the mute preference here — `spare.audio` is only ready after registration,
@@ -652,4 +712,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
652
712
  providedIn: 'root'
653
713
  }]
654
714
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ExtensionService }]; } });
655
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdpbGlvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS90d2lsaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBYzNELE1BQU0sT0FBTyxhQUFhO0lBdUR4QixZQUNVLElBQWdCLEVBQ2hCLGdCQUFrQztRQURsQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUF2RDVDLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWMsSUFBSSxDQUFDLENBQUM7UUFDckQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFHdEYsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBRTVCLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBUyxLQUFLLENBQUMsQ0FBQztRQUU5QyxVQUFLLEdBQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxL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SUFBSSxDQUFDLGtCQUFrQixFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYzthQUMvRTtZQUNELGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRTtTQUNuRCxDQUFDLENBQUE7SUFDSixDQUFDOzsyR0E1cEJVLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGV2aWNlLCBDYWxsIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERpYWxQYXlsb2FkIHtcclxuICBudW1iZXI6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW1nOiBzdHJpbmc7XHJcbiAgY2FsbGVySWQ6c3RyaW5nO1xyXG4gIGlzRGlhbEZyb21IaXN0b3J5OmJvb2xlYW47XHJcbiAgZnJvbTpzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcgIFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHdpbGlvU2VydmljZSB7XHJcbiAgXHJcbiAgb3BlbkluUHJvZ3Jlc3NEaWFscGFkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgY3VycmVudENhbGwgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGwgfCBudWxsPihudWxsKTtcclxuICBjdXJyZW50Q2FsbFN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCdub25lJyk7IC8vaW4tcHJvZ3Jlc3MsIG91dC1wcm9ncmVzcywgbm9uZVxyXG4gIGRldmljZTphbnk7XHJcbiAgY2FsbCE6IENhbGw7XHJcbiAgaW5jb21pbmdDYWxsVG9rZW46c3RyaW5nPScnO1xyXG4gIG91dGdvaW5nQ2FsbFRva2VuPzpzdHJpbmc7XHJcbiAgY2FsbFR5cGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJ05JTCcpO1xyXG4gIGluY29taW5nQ2FsbERldGFpbDogYW55OyAvLyBmb3IgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmdcclxuICB0b2tlbjphbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XHJcbiAgaXNOZXdDb250YWN0QWRkZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICB1cGRhdGVSZWNlbnRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgY2FsbGhhbmRsZUZyb21Ob3RpZmljYXRpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xyXG5cclxuICBlbmRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgZGlhbE51bWJlckZyb21PdGhlck1vZHVsZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGlhbFBheWxvYWQ+KHsgbnVtYmVyOiAnJywgbmFtZTogJycsIGltZzogJycsIGNhbGxlcklkOiAnJywgaXNEaWFsRnJvbUhpc3Rvcnk6IGZhbHNlLCBmcm9tOiAnJyB9KTtcclxuXHJcbiAgdG9nZ2xlQ2FsbGVySWRBbGVydCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgaXNUcmlhbE92ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc1BheW1lbnREdWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc0F2YWlsYWJsZU51bWJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGNhbGxlcklkTGlzdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICB0cmlnZ2VyU01TUmVsb2FkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG5cclxuICB0b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0b2tlbkluaXRpYWxpemF0aW9uJDogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgZGV2aWNlSWQ6IGFueTtcclxuICBjb25mZXJlbmNlQ2FsbEluZm86IGFueTtcclxuICBpc1Nob3dJbmNvbWluZ0NhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gQ1JJVElDQUw6IFRyYWNrIGFsbCBhY2NlcHRlZCBDYWxsIG9iamVjdHMgKG1pcnJvcnMgaU9TIGFjY2VwdGVkQ2FsbExpc3QpXHJcbiAgLy8gVXNlZCB0byBndWFyZCBkZXZpY2UgcmUtaW5pdGlhbGl6YXRpb24gc28gYWN0aXZlIGNhbGxzIGFyZSBuZXZlciB0b3JuIGRvd25cclxuICBhY2NlcHRlZENhbGxMaXN0OiBDYWxsW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBwcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gIHNwYXJlRGV2aWNlOiBhbnkgPSBudWxsO1xyXG4gIHNwYXJlRGV2aWNlUmVhZHkgPSBmYWxzZTtcclxuICBwcml2YXRlIHBlbmRpbmdJbmNvbWluZ0RldmljZXMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG4gIHByaXZhdGUgZXh0cmFEZXZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICBpbmNvbWluZ0NhbGxzTWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSB0b2tlblJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzID0gMDtcclxuICBwcml2YXRlIHJlY292ZXJ5VGltZXI6IGFueSA9IG51bGw7XHJcbiAgLy8gUmVmZXJlbmNlcyB0byB0aGUgJ3VucmVnaXN0ZXJlZCcvJ2Vycm9yJyBoYW5kbGVycyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gYHRoaXMuZGV2aWNlYCxcclxuICAvLyBzbyBhbiBpbnRlbnRpb25hbCByZXBsYWNlIGNhbiBkZXRhY2ggZXhhY3RseSB0aG9zZSB0d28gYmVmb3JlIGRlc3Ryb3koKSB3aXRob3V0XHJcbiAgLy8gdG91Y2hpbmcgYW55IGxpc3RlbmVycyB0aGUgVHdpbGlvIFNESyBpdHNlbGYgbWF5IGhhdmUgd2lyZWQgdG8gdGhlIHNhbWUgRXZlbnRFbWl0dGVyLlxyXG4gIHByaXZhdGUgY3VycmVudERldmljZVVucmVnaXN0ZXJlZEhhbmRsZXI6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RGV2aWNlRXJyb3JIYW5kbGVyOiBhbnkgPSBudWxsO1xyXG4gIGluY29taW5nQ2FsbE5vdGlmaWNhdGlvbj0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHByZXZpb3VzSW5jb21pbmdDYWxsTm90aWZpY2F0aW9uOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplVG9rZW4oKTtcclxuICAgIC8vIFNhZmV0eSBuZXQgZm9yIGxvbmcgaWRsZS9zbGVlcCBwZXJpb2RzOiB0aGUgc2lnbmFsaW5nIHNvY2tldCBjYW4gZGllIHNpbGVudGx5XHJcbiAgICAvLyAoT1Mgc3VzcGVuZHMgdGltZXJzLCB0YWIgaXMgYmFja2dyb3VuZGVkKSB3aXRob3V0IGV2ZXIgZmlyaW5nICdlcnJvcicvJ3VucmVnaXN0ZXJlZCcuXHJcbiAgICAvLyBSZS1jaGVjayBkZXZpY2UgaGVhbHRoIHdoZW5ldmVyIHRoZSBhcHAgYmVjb21lcyBhY3RpdmUvb25saW5lIGFnYWluLlxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcclxuICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XHJcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VIZWFsdGh5KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsICgpID0+IHRoaXMuZW5zdXJlRGV2aWNlSGVhbHRoeSgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRva2VuKCkge1xyXG4gICAgaWYgKHRoaXMudG9rZW5Jbml0aWFsaXplZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCB8fCBvZihudWxsKTtcclxuICAgIH1cclxuICAgIC8vIEEgZmV0Y2ggaXMgYWxyZWFkeSBpbiBmbGlnaHQg4oCUIEFwcEluaXRpYWxpemVyU2VydmljZSBhbmQgdGhlIGRpYWxib3ggY29tcG9uZW50XHJcbiAgICAvLyBib3RoIGNhbGwgaW5pdGlhbGl6ZVR3aWxpb0RldmljZSgpIG9uIHN0YXJ0dXAsIGFuZCB3aXRob3V0IHRoaXMgdGhleSdkIHJhY2U6XHJcbiAgICAvLyB0aGUgc2Vjb25kIGNhbGwgd291bGQgZmlyZSBpdHMgb3duIHRva2VuIHJlcXVlc3QgYW5kLCBvbmNlIHJlc29sdmVkLCBjYWxsXHJcbiAgICAvLyBpbml0aWFsaXplRGV2aWNlKCkgYWdhaW4sIGRlc3Ryb3lpbmcgdGhlIGRldmljZSB0aGUgZmlyc3QgY2FsbCBqdXN0IGNyZWF0ZWQgYW5kXHJcbiAgICAvLyB0b3VjaGluZyBvZmYgYSBzcHVyaW91cyAndW5yZWdpc3RlcmVkJyAtPiByZWNvdmVyeSBjYXNjYWRlLiBTaGFyZSB0aGUgc2FtZVxyXG4gICAgLy8gaW4tZmxpZ2h0IHJlcXVlc3QgaW5zdGVhZC5cclxuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9rZW5Jbml0aWFsaXphdGlvbiQgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0SW5jb21pbmdDYWxsVG9rZW4odGhpcy5kZXZpY2VJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGV2aWNlSWQnKSkucGlwZShcclxuICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbFRva2VuID0gZGF0YS50b2tlbjtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaW4tdG9rZW4nLCBkYXRhLnRva2VuKTtcclxuICAgICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURldmljZSgpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIFR3aWxpbyB0b2tlbjonLCBlcnJvcik7XHJcbiAgICAgICAgLy8gQWxsb3cgYSBmcmVzaCBhdHRlbXB0IG5leHQgdGltZSBzaW5jZSB0aGlzIG9uZSBmYWlsZWQuXHJcbiAgICAgICAgdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgc2hhcmVSZXBsYXkoMSkgLy8gQ2FjaGUgdGhlIHJlc3VsdCBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVyc1xyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplVHdpbGlvRGV2aWNlKGRldmljZUlkOiBhbnkpIHtcclxuICAgIHRoaXMuZGV2aWNlSWQgPSBkZXZpY2VJZDtcclxuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6ZWQgJiYgdGhpcy5pbmNvbWluZ0NhbGxUb2tlbikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVEZXZpY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVRva2VuKCkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEZXZpY2UoKSB7XHJcbiAgICBpZiAodGhpcy5kZXZpY2UpIHtcclxuICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGluZyBkZXZpY2UgcmUtaW5pdDogYWN0aXZlIGFjY2VwdGVkIGNhbGxzIGV4aXN0OicsIHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyBEZXRhY2ggdGhlICd1bnJlZ2lzdGVyZWQnLydlcnJvcicgaGFuZGxlcnMgd2UgYXR0YWNoZWQgYmVmb3JlIGRlc3Ryb3lpbmcsIHNvXHJcbiAgICAgIC8vIHRoaXMgKmludGVudGlvbmFsKiB0ZWFyZG93biBjYW4ndCBmaXJlIHRoZW0gYmVsb3cg4oCUIG90aGVyd2lzZSBhIGRlbGliZXJhdGVcclxuICAgICAgLy8gcmVwbGFjZSBsb29rcyBpZGVudGljYWwgdG8gYW4gdW5leHBlY3RlZCBkcm9wIGFuZCB0b3VjaGVzIG9mZiBhXHJcbiAgICAgIC8vIGRlc3Ryb3kgLT4gJ3VucmVnaXN0ZXJlZCcgLT4gc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSAtPiBkZXN0cm95IGNhc2NhZGUuXHJcbiAgICAgIC8vIChPbmx5IHJlbW92ZXMgb3VyIG93biBoYW5kbGVycywgbm90IGFueXRoaW5nIHRoZSBUd2lsaW8gU0RLIGl0c2VsZiBtYXkgaGF2ZVxyXG4gICAgICAvLyB3aXJlZCB0byB0aGUgc2FtZSBFdmVudEVtaXR0ZXIsIHNvIGl0cyBvd24gZGVzdHJveSgpL2NsZWFudXAgaXMgdW5hZmZlY3RlZC4pXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERldmljZVVucmVnaXN0ZXJlZEhhbmRsZXIpIHtcclxuICAgICAgICAgIHRoaXMuZGV2aWNlLnJlbW92ZUxpc3RlbmVyKCd1bnJlZ2lzdGVyZWQnLCB0aGlzLmN1cnJlbnREZXZpY2VVbnJlZ2lzdGVyZWRIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2UucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5jdXJyZW50RGV2aWNlRXJyb3JIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIGNvbnNvbGUubG9nKCcxNTMgY2FsbCBlbmQnKVxyXG4gICAgICB0aGlzLmRldmljZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmluY29taW5nQ2FsbFRva2VuKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIFR3aWxpbyB0b2tlbiBhdmFpbGFibGUnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRldmljZTogYW55ID0gbmV3IERldmljZSh0aGlzLmluY29taW5nQ2FsbFRva2VuLCB7IGFsbG93SW5jb21pbmdXaGlsZUJ1c3k6IHRydWUgfSk7XHJcbiAgICB0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHJcbiAgICBkZXZpY2Uub24oJ3JlZ2lzdGVyZWQnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDEwO1xyXG4gICAgICAvLyBBIHJlY292ZXJ5IGF0dGVtcHQgbWF5IGhhdmUgYmVlbiBzY2hlZHVsZWQgYnkgYW4gZWFybGllciBkZXZpY2UgaW5zdGFuY2VcclxuICAgICAgLy8gYmVmb3JlIHRoaXMgb25lIGNhbWUgdXAg4oCUIGl0J3Mgc3RhbGUgbm93LCBjYW5jZWwgaXQgc28gaXQgY2FuJ3QgdGVhciB0aGlzXHJcbiAgICAgIC8vIGhlYWx0aHkgZGV2aWNlIGRvd24gbGF0ZXIuXHJcbiAgICAgIGlmICh0aGlzLnJlY292ZXJ5VGltZXIpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvdmVyeVRpbWVyKTtcclxuICAgICAgICB0aGlzLnJlY292ZXJ5VGltZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFR3aWxpbyBmaXJlcyB0aGlzIH4zIG1pbnV0ZXMgYmVmb3JlIHRoZSBhY2Nlc3MgdG9rZW4gZXhwaXJlcy4gU3dhcCBpbiBhXHJcbiAgICAvLyBmcmVzaCBvbmUgdmlhIHVwZGF0ZVRva2VuKCkgc28gdGhlIHNpZ25hbGluZyBjb25uZWN0aW9uIG5ldmVyIGhhcyB0byBkcm9wXHJcbiAgICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgKHRoaXMgaXMgdGhlIG1haW4gY2F1c2Ugb2YgXCJpZGxlIGZvciBhIHdoaWxlLCBCRSBzdGlsbFxyXG4gICAgLy8gbm90aWZpZXMgYnV0IFR3aWxpbyBpbmNvbWluZyBldmVudCBuZXZlciBmaXJlc1wiKS5cclxuICAgIGRldmljZS5vbigndG9rZW5XaWxsRXhwaXJlJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlZnJlc2hEZXZpY2VUb2tlbigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGV2aWNlLm9uKCdpbmNvbWluZycsIChjYWxsOiBDYWxsIHwgYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGluY29taW5nQ2FsbFNpZCA9IGNhbGw/LnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddO1xyXG4gICAgICBpZiAoaW5jb21pbmdDYWxsU2lkICYmIHRoaXMuaW5jb21pbmdDYWxsc01hcC5oYXMoaW5jb21pbmdDYWxsU2lkKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdwcmltYXJ5IGRldmljZTogZHVwbGljYXRlIGluY29taW5nIGZvciBhbHJlYWR5LXRyYWNrZWQgY2FsbCwgaWdub3JpbmcnLCBpbmNvbWluZ0NhbGxTaWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZygnVHdpbGlvIERldmljZSBpbmNvbWluZyBjYWxsIGV2ZW50OicsIGNhbGwpO1xyXG4gICAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLmJ1aWxkSW5jb21pbmdOb3RpZmljYXRpb24oY2FsbCk7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24ubmV4dChub3RpZmljYXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDAgfHwgdGhpcy5wcmltYXJ5SGFzQ2FsbCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdwcmltYXJ5IGRldmljZTogY29uY3VycmVudCBjYWxsIGFycml2aW5nIOKAkyBzcGFyZSBkZXZpY2Ugd2lsbCBoYW5kbGUgaXQnKTtcclxuICAgICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSB0cnVlO1xyXG4gICAgICAvLyBBcm0gYSBzcGFyZSBkZXZpY2UgcmlnaHQgbm93IChiZWZvcmUgdGhlIHVzZXIgZXZlbiBhY2NlcHRzKSBzbyBpdCBjYW5cclxuICAgICAgLy8gcmVnaXN0ZXIgaW4gdGltZSBmb3IgYW55IGNhbGwgdGhhdCBhcnJpdmVzIHNlY29uZHMgbGF0ZXIuXHJcbiAgICAgIHRoaXMucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzSW5jb21pbmdNdXRlZCkge1xyXG4gICAgICAgIHRyeSB7IGRldmljZS5hdWRpbz8uaW5jb21pbmcoZmFsc2UpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB9XHJcbiAgICAgIGNhbGwub24oJ2FjY2VwdCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmcgY2FsbCBhbnN3ZXJlZC9hY2NlcHRlZCcpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNhbGwub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgZGlzY29ubmVjdGVkJyk7XHJcbiAgICAgICAgdGhpcy5wcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNhbGwub24oJ2NhbmNlbCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ2FsbGVyIGh1bmcgdXAgYmVmb3JlIGFuc3dlcicpO1xyXG4gICAgICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjYWxsLm9uKCdyZWplY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgcmVqZWN0ZWQnKTtcclxuICAgICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRyYWNrSW5jb21pbmdDYWxsKGNhbGwpO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbERldGFpbCA9IGNhbGw7XHJcbiAgICAgIHRoaXMuaXNTaG93SW5jb21pbmdDYWxsID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG9uRGV2aWNlRXJyb3IgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAvLyBTdGFsZSBldmVudCBmcm9tIGEgZGV2aWNlIHdlJ3ZlIGFscmVhZHkgaW50ZW50aW9uYWxseSByZXBsYWNlZCDigJQgaWdub3JlLlxyXG4gICAgICBpZiAodGhpcy5kZXZpY2UgIT09IGRldmljZSkgcmV0dXJuO1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUd2lsaW8gRGV2aWNlIEVycm9yOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSgpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlciA9IG9uRGV2aWNlRXJyb3I7XHJcbiAgICBkZXZpY2Uub24oJ2Vycm9yJywgb25EZXZpY2VFcnJvcik7XHJcbiAgICBkZXZpY2Uub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIGRpc2Nvbm5lY3RlZCcpO1xyXG4gICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNjaGVkdWxlRGV2aWNlUmVjb3ZlcnkoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG9uRGV2aWNlVW5yZWdpc3RlcmVkID0gKCkgPT4ge1xyXG4gICAgICAvLyBTdGFsZSBldmVudCBmcm9tIGEgZGV2aWNlIHdlJ3ZlIGFscmVhZHkgaW50ZW50aW9uYWxseSByZXBsYWNlZCDigJQgaWdub3JlLlxyXG4gICAgICBpZiAodGhpcy5kZXZpY2UgIT09IGRldmljZSkgcmV0dXJuO1xyXG4gICAgICBjb25zb2xlLmxvZygnVHdpbGlvIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcclxuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSgpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuY3VycmVudERldmljZVVucmVnaXN0ZXJlZEhhbmRsZXIgPSBvbkRldmljZVVucmVnaXN0ZXJlZDtcclxuICAgIGRldmljZS5vbigndW5yZWdpc3RlcmVkJywgb25EZXZpY2VVbnJlZ2lzdGVyZWQpO1xyXG5cclxuICAgIC8vIFJlZ2lzdGVyIEFGVEVSIGF0dGFjaGluZyBhbGwgbGlzdGVuZXJzXHJcbiAgICBkZXZpY2UucmVnaXN0ZXIoKTtcclxuICAgIGNvbnNvbGUubG9nKCdkZXZpY2UgY3JlYXRlZCcsIGRldmljZSk7XHJcbiAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCB8fCBvZihudWxsKTtcclxuICB9XHJcblxyXG4gIC8vIFByb2FjdGl2ZWx5IHN3YXAgaW4gYSBmcmVzaCBhY2Nlc3MgdG9rZW4gYWhlYWQgb2YgZXhwaXJ5IChzZWUgJ3Rva2VuV2lsbEV4cGlyZSdcclxuICAvLyBhYm92ZSkgc28gdGhlIERldmljZSdzIHNpZ25hbGluZyBjb25uZWN0aW9uIHN1cnZpdmVzIGxvbmcgaWRsZSBwZXJpb2RzLlxyXG4gIHByaXZhdGUgcmVmcmVzaERldmljZVRva2VuKCkge1xyXG4gICAgaWYgKHRoaXMudG9rZW5SZWZyZXNoSW5Qcm9ncmVzcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaEluUHJvZ3Jlc3MgPSB0cnVlO1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldEluY29taW5nQ2FsbFRva2VuKHRoaXMuZGV2aWNlSWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RldmljZUlkJykpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRva2VuUmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbFRva2VuID0gZGF0YS50b2tlbjtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaW4tdG9rZW4nLCBkYXRhLnRva2VuKTtcclxuICAgICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLmRldmljZT8udXBkYXRlVG9rZW4odGhpcy5pbmNvbWluZ0NhbGxUb2tlbik7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYXBwbHkgcmVmcmVzaGVkIFR3aWxpbyB0b2tlbjonLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRva2VuUmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCBUd2lsaW8gdG9rZW4gYWhlYWQgb2YgZXhwaXJ5OicsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gU2VsZi1oZWFsIGFmdGVyIHRoZSBEZXZpY2UgZGllcyAoZXhwaXJlZCB0b2tlbiwgZHJvcHBlZCBzaWduYWxpbmcgc29ja2V0IHdoaWxlXHJcbiAgLy8gaWRsZS9hc2xlZXAsIGV0YykuIE5ldmVyIHJ1bnMgd2hpbGUgYSBjYWxsIGlzIGFjdHVhbGx5IGFjdGl2ZSwgYW5kIGJhY2tzIG9mZiBzbyBhXHJcbiAgLy8gZ2VudWluZWx5IGxvZ2dlZC1vdXQvb2ZmbGluZSB1c2VyIGRvZXNuJ3QgcmV0cnkgZm9yZXZlci5cclxuICBwcml2YXRlIHNjaGVkdWxlRGV2aWNlUmVjb3ZlcnkoKSB7XHJcbiAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDAgfHwgdGhpcy5yZWNvdmVyeVRpbWVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4oMzAwMDAsIDIwMDAgKiBNYXRoLnBvdygyLCB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMpKTtcclxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cysrO1xyXG4gICAgdGhpcy5yZWNvdmVyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVjb3ZlcnlUaW1lciA9IG51bGw7XHJcbiAgICAgIGNvbnN0IGF1dGhUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcclxuICAgICAgaWYgKCFhdXRoVG9rZW4gfHwgYXV0aFRva2VuID09PSAnbG9nb3V0Jykge1xyXG4gICAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1R3aWxpbyBkZXZpY2UgcmVjb3ZlcnkgYXR0ZW1wdCBmYWlsZWQ6JywgZXJyKVxyXG4gICAgICB9KTtcclxuICAgIH0sIGRlbGF5KTtcclxuICB9XHJcblxyXG4gIC8vIEJ1aWxkIHRoZSBmdWxsIGluY29taW5nLWNhbGwgbm90aWZpY2F0aW9uIHBheWxvYWQgKG1hdGNoZXMgdGhlIHNoYXBlIHRoZSBCRSB1c2VkIHRvXHJcbiAgLy8gcHVzaCBvdmVyIHRoZSBzb2NrZXQpIGZyb20gdGhlIHJhdyBUd2lsaW8gJ2luY29taW5nJyBDYWxsOiBwYXJzZWQgUGFyYW1zIGZpZWxkcyBwbHVzXHJcbiAgLy8gdGhlIGRlcml2ZWQgY2xpZW50U2lkL3BhcnRpY2lwYW50U2lkL25vdGlmaWNhdGlvblR5cGUvdGl0bGUvbXNnQm9keS5cclxuICBidWlsZEluY29taW5nTm90aWZpY2F0aW9uKGNhbGw6IENhbGwpOiBhbnkge1xyXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5jb252ZXJ0VG9Kc29uKGNhbGw/LnBhcmFtZXRlcnM/LlsnUGFyYW1zJ10gfHwgJ3t9Jyk7XHJcbiAgICBjb25zdCBjYWxsU2lkID0gY2FsbD8ucGFyYW1ldGVycz8uWydDYWxsU2lkJ107XHJcbiAgICBub3RpZmljYXRpb24uY2xpZW50U2lkID0gY2FsbFNpZDtcclxuICAgIC8vIE9ubHkgcmVhbCBUd2lsaW8gU0lEIGV4cG9zZWQgY2xpZW50LXNpZGUgZm9yIHRoaXMgbGVnOyBubyBzZXBhcmF0ZSBwYXJ0aWNpcGFudCBTSURcclxuICAgIC8vIGlzIGF2YWlsYWJsZSwgc28gaXQgbWlycm9ycyBjbGllbnRTaWQuXHJcbiAgICBub3RpZmljYXRpb24ucGFydGljaXBhbnRTaWQgPSBjYWxsU2lkO1xyXG4gICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGUgPSAnaW5jb21pbmdjYWxsJztcclxuICAgIG5vdGlmaWNhdGlvbi50aXRsZSA9ICdJbmNvbWluZyBDYWxsJztcclxuICAgIG5vdGlmaWNhdGlvbi5tc2dCb2R5ID0gYHlvdSBoYXZlIGluY29taW5nIGNhbGwgJHtub3RpZmljYXRpb24uZnJvbU5hbWUgfHwgJyd9YDtcclxuICAgIHJldHVybiBub3RpZmljYXRpb247XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0VG9Kc29uKGRhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xyXG5cclxuICAgIGlmICghZGF0YSkge1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvcm1hdDoga2V5PXZhbHVlJmtleT12YWx1ZVxyXG4gICAgaWYgKGRhdGEuaW5jbHVkZXMoJyYnKSkge1xyXG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGRhdGEpO1xyXG5cclxuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICBvYmpba2V5XSA9IHZhbHVlID09PSAndHJ1ZSdcclxuICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gJ2ZhbHNlJ1xyXG4gICAgICAgICAgPyBmYWxzZVxyXG4gICAgICAgICAgOiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEZvcm1hdDoge2tleT12YWx1ZSwga2V5PXZhbHVlfVxyXG4gICAgICBjb25zdCB0ZXh0ID0gZGF0YS50cmltKCkucmVwbGFjZSgvXlxce3xcXH0kL2csICcnKTtcclxuXHJcbiAgICAgIHRleHQuc3BsaXQoJywnKS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbS5pbmRleE9mKCc9Jyk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSBpdGVtLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBpdGVtLnN1YnN0cmluZyhpbmRleCArIDEpLnRyaW0oKTtcclxuXHJcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykgdmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9iai5yZWFkID0gZmFsc2U7XHJcbiAgICBvYmouc2F2ZSA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG4gIC8vIFNhZmV0eSBuZXQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBkaWVzIHNpbGVudGx5IGR1cmluZyBhIGxvbmdcclxuICAvLyBzbGVlcC9pZGxlIHBlcmlvZCB3aXRob3V0IGV2ZXIgZmlyaW5nICdlcnJvcicvJ3VucmVnaXN0ZXJlZCcgKHRoZSBPUyBjYW4gc3VzcGVuZFxyXG4gIC8vIHRpbWVycy9zb2NrZXRzIG91dHJpZ2h0KSDigJQgcmUtY2hlY2sgZGV2aWNlIGhlYWx0aCB3aGVuZXZlciB0aGUgYXBwIHdha2VzIHVwLlxyXG4gIHByaXZhdGUgZW5zdXJlRGV2aWNlSGVhbHRoeSgpIHtcclxuICAgIGlmICh0aGlzLmFjY2VwdGVkQ2FsbExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZGV2aWNlIHx8IHRoaXMuZGV2aWNlLnN0YXRlICE9PSAncmVnaXN0ZXJlZCcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBkZXZpY2UgdW5oZWFsdGh5IGFmdGVyIHdha2UvdmlzaWJpbGl0eSBjaGFuZ2UsIHJlLWluaXRpYWxpemluZycpO1xyXG4gICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplVG9rZW4oKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdUd2lsaW8gZGV2aWNlIHJlY292ZXJ5IGZhaWxlZDonLCBlcnIpXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbnRhY3QocGF5bG9hZDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2FkZC9jb250YWN0cy9tYW51YWxseScsIHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUNvbnRhY3QocGF5bG9hZDphbnkpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdGhpcy50b2tlbn0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay91cGRhdGUvY29udGFjdCcsIHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgXHJcbiAgZGVsZXRlQ29udGFjdChpZDpzdHJpbmcpe1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIHBob25lYm9va2lkOiBpZFxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY29udGFjdC8nK2lkLHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0Q29udGFjdExpc3QoKXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9yZWFkL2NvbnRhY3RzJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgYWRkQ29udGFjdFRvRmF2b3VyaXRlKHBheWxvYWQ6IGFueSl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwZGF0ZS9mYXZvdXJpdGUnLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXRGYXZvdXJpdENvbnRhY3RzKCl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZmF2b3VyaXRlL2NvbnRhY3RzJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVjZW50Q2FsbHMocGFnZUluZGV4Pzogc3RyaW5nLCBwYWdlU2l6ZT86IHN0cmluZywpe1xyXG4gICAgY29uc3QgaGVhZGVycyA9ICB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH07XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9e2hlYWRlcnN9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3JlY2VudC9jYWxscycsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZGVsZXRlUmVjZW50Q2FsbExvZyhpZDpzdHJpbmd8IHN0cmluZ1tdKXtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICByZWNvcmRJZDogaWRcclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL2NhbGxzLycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkUGhvdG8ocGF5bG9hZDogYW55KXtcclxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwbG9hZC9waG90bycscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUGhvdG8oaWQ6c3RyaW5nKXtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBwaG9uZWJvb2tpZDogaWRcclxuICAgIH1cclxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2RlbGV0ZS9waG90by8nK2lkLHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvdXRyeUNvZGVUb2FzdCh2YWw6YW55KXtcclxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvY291bnRyeWNvZGUvYWxlcnQvJyArIHZhbCwge30sIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0VG9OdW1iZXIoZGlhbGxlZE5vOiBzdHJpbmcsIGlzb0NvZGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pLFxyXG4gICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpc29Db2RlJywgaXNvQ29kZSlcclxuICAgIH07XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldCgnaXNvQ29kZScsIGlzb0NvZGUpXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NoZWNrL2NvdW50cnlDb2RlLycgKyBkaWFsbGVkTm8sIGh0dHBPcHRpb25zKTtcclxuICB9IFxyXG4gIFxyXG4gIC8vIFJlY29yZCBhIHJpbmdpbmcgaW5jb21pbmcgQ2FsbCBzbyBpdCBjYW4gbGF0ZXIgYmUgYWNjZXB0ZWQgYnkgaXRzIHNwZWNpZmljIGlkLlxyXG4gIC8vIFRoZSBtYXAgaXMgY2xlYW5lZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNhbGwgaXMgY2FuY2VsbGVkL2Rpc2Nvbm5lY3RlZC9yZWplY3RlZC5cclxuICBwcml2YXRlIHRyYWNrSW5jb21pbmdDYWxsKGNhbGw6IGFueSkge1xyXG4gICAgY29uc3QgY2FsbFNpZCA9IGNhbGw/LnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddO1xyXG4gICAgaWYgKGNhbGxTaWQpIHtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTWFwLnNldChjYWxsU2lkLCBjYWxsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgIGlmICghY2FsbFNpZCkgcmV0dXJuO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbHNNYXAuZGVsZXRlKGNhbGxTaWQpO1xyXG4gICAgICAvLyBJZiB0aGUgY2FsbCBlbmRlZCBiZWZvcmUgdGhlIHVzZXIgYWNjZXB0ZWQgaXQsIGRlc3Ryb3kgdGhlIHBlbmRpbmcgc3BhcmVcclxuICAgICAgLy8gZGV2aWNlIHRoYXQgd2FzIGhvbGRpbmcgaXQgc28gd2UgZG9uJ3QgbGVhayBkZXZpY2UgcmVnaXN0cmF0aW9ucy5cclxuICAgICAgY29uc3QgZGV2ID0gdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmdldChjYWxsU2lkKTtcclxuICAgICAgaWYgKGRldiAmJiAhZGV2Ll9vd25zQWNjZXB0ZWRDYWxsKSB7XHJcbiAgICAgICAgdHJ5IHsgZGV2LmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge31cclxuICAgICAgICB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZGVsZXRlKGNhbGxTaWQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY2FsbC5vbignY2FuY2VsJywgY2xlYW51cCk7XHJcbiAgICBjYWxsLm9uKCdkaXNjb25uZWN0JywgY2xlYW51cCk7XHJcbiAgICBjYWxsLm9uKCdyZWplY3QnLCBjbGVhbnVwKTtcclxuICB9XHJcblxyXG4gIC8vIFJlc29sdmUgdGhlIEVYQUNUIHJpbmdpbmcgQ2FsbCBmb3IgYSBnaXZlbiBVSSBlbnRyeSBpZCAocGFydGljaXBhbnQvcmVjb3JkIGlkKS5cclxuICAvLyBGYWxscyBiYWNrIHRvIHRoZSBtb3N0IHJlY2VudCBpbmNvbWluZyBjYWxsIHNvIG9sZGVyIHNpbmdsZS1jYWxsIGZsb3dzIHN0aWxsIHdvcmsuXHJcbiAgZ2V0SW5jb21pbmdDYWxsQnlJZChpZDogYW55KSB7XHJcbiAgICBpZiAoaWQgIT0gbnVsbCAmJiB0aGlzLmluY29taW5nQ2FsbHNNYXAuaGFzKGlkKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbmNvbWluZ0NhbGxzTWFwLmdldChpZCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsRGV0YWlsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaW5jb21pbmdDYWxsRGV0YWlsLnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddID09IGlkID8gdGhpcy5pbmNvbWluZ0NhbGxEZXRhaWwgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKSB7XHJcbiAgICBpZiAodGhpcy5zcGFyZURldmljZSkge1xyXG4gICAgICByZXR1cm47IC8vIGEgZnJlZSBzcGFyZSBpcyBhbHJlYWR5IHdhaXRpbmdcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pbmNvbWluZ0NhbGxUb2tlbikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3ByZXBhcmVTcGFyZURldmljZTogbm8gdG9rZW4gYXZhaWxhYmxlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNwYXJlOiBhbnkgPSBuZXcgRGV2aWNlKHRoaXMuaW5jb21pbmdDYWxsVG9rZW4sIHsgYWxsb3dJbmNvbWluZ1doaWxlQnVzeTogdHJ1ZSB9KTtcclxuICAgIHNwYXJlLl9vd25zQWNjZXB0ZWRDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgc3BhcmUub24oJ3JlZ2lzdGVyZWQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IHRydWU7XHJcbiAgICAgIC8vIEFwcGx5IHRoZSBtdXRlIHByZWZlcmVuY2UgaGVyZSDigJQgYHNwYXJlLmF1ZGlvYCBpcyBvbmx5IHJlYWR5IGFmdGVyIHJlZ2lzdHJhdGlvbixcclxuICAgICAgLy8gc28gdGhlIGNhbGwgYWJvdmUgKGJlZm9yZSByZWdpc3RlcigpKSB3YXMgYWx3YXlzIGEgbm8tb3AuXHJcbiAgICAgIHRyeSB7IHNwYXJlLmF1ZGlvPy5pbmNvbWluZyghdGhpcy5pc0luY29taW5nTXV0ZWQpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICBjb25zb2xlLmxvZygnU3BhcmUgZGV2aWNlIHJlZ2lzdGVyZWQg4oCTIHJlYWR5IGZvciB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNwYXJlLm9uKCdpbmNvbWluZycsIChjYWxsOiBDYWxsIHwgYW55KSA9PiB7XHJcbiAgICAgIC8vIEd1YXJkOiBvbmNlIHRoaXMgc3BhcmUgaXMgYWxyZWFkeSBoYW5kbGluZyBhIGNhbGwgKHBlbmRpbmcgb3IgYWNjZXB0ZWQpLFxyXG4gICAgICAvLyBpZ25vcmUgYW55IGZ1cnRoZXIgaW5jb21pbmcgZXZlbnRzIHNvIGFub3RoZXIgc3BhcmUgY2FuIHRha2UgdGhlIG5leHQgY2FsbC5cclxuICAgICAgaWYgKHNwYXJlLl9vd25zQWNjZXB0ZWRDYWxsIHx8IHNwYXJlLl9wZW5kaW5nSW5jb21pbmdDYWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcclxuICAgICAgLy8gU2FtZSBzaGFyZWQtaWRlbnRpdHkgZmFuLW91dCBndWFyZCBhcyB0aGUgcHJpbWFyeSBkZXZpY2UncyAnaW5jb21pbmcnIGhhbmRsZXI6XHJcbiAgICAgIC8vIGlmIGFub3RoZXIgRGV2aWNlIGFscmVhZHkgY2xhaW1lZCB0aGlzIENhbGxTaWQsIHRoaXMgaXMgYSBkdXBsaWNhdGUgbGVnIG9mXHJcbiAgICAgIC8vIHRoZSBzYW1lIGNhbGwsIG5vdCBhIGdlbnVpbmVseSBuZXcgY29uY3VycmVudCBjYWxsIOKAlCBpZ25vcmUgaXQuXHJcbiAgICAgIGlmIChjYWxsU2lkICYmIHRoaXMuaW5jb21pbmdDYWxsc01hcC5oYXMoY2FsbFNpZCkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnc3BhcmUgZGV2aWNlOiBkdXBsaWNhdGUgaW5jb21pbmcgZm9yIGFscmVhZHktdHJhY2tlZCBjYWxsLCBpZ25vcmluZycsIGNhbGxTaWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzcGFyZS5fcGVuZGluZ0luY29taW5nQ2FsbCA9IGNhbGw7XHJcblxyXG4gICAgICAvLyBUcmFuc2l0aW9uIHRoaXMgc3BhcmUgZnJvbSBcImZyZWVcIiDihpIgXCJwZW5kaW5nXCI6IHJlbW92ZSBpdCBhcyB0aGUgYWN0aXZlXHJcbiAgICAgIC8vIHNwYXJlRGV2aWNlIGFuZCB0cmFjayBpdCBieSBDYWxsU2lkIHNvIG9uQ29uY3VycmVudENhbGxBY2NlcHRlZCBjYW4gZmluZCBpdC5cclxuICAgICAgaWYgKHRoaXMuc3BhcmVEZXZpY2UgPT09IHNwYXJlKSB7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZVJlYWR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNhbGxTaWQpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuc2V0KGNhbGxTaWQsIHNwYXJlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBJbW1lZGlhdGVseSBhcm0gdGhlIE5FWFQgZnJlZSBzcGFyZSBzbyBpdCBpcyByZWFkeSBmb3IgY2FsbCBOKzIgd2l0aG91dFxyXG4gICAgICAvLyB3YWl0aW5nIGZvciB0aGUgdXNlciB0byBhY2NlcHQgdGhpcyBjYWxsIGZpcnN0LlxyXG4gICAgICB0aGlzLnByZXBhcmVEZXZpY2UyRm9ySW5jb21pbmdDYWxsKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0luY29taW5nTXV0ZWQpIHtcclxuICAgICAgICB0cnkgeyBzcGFyZS5hdWRpbz8uaW5jb21pbmcoZmFsc2UpOyB9IGNhdGNoIChfKSB7fVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhY2tJbmNvbWluZ0NhbGwoY2FsbCk7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGV0YWlsID0gY2FsbDtcclxuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSB0cnVlO1xyXG4gICAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLmJ1aWxkSW5jb21pbmdOb3RpZmljYXRpb24oY2FsbCk7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24ubmV4dChub3RpZmljYXRpb24pO1xyXG4gICAgICBjb25zb2xlLmxvZygnc3BhcmUgZGV2aWNlOiBpbmNvbWluZyBjYWxsJywgY2FsbCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzcGFyZS5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdTcGFyZSBkZXZpY2UgZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc3BhcmUucmVnaXN0ZXIoKTtcclxuICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBzcGFyZTtcclxuICAgIGNvbnNvbGUubG9nKCdzcGFyZSBkZXZpY2UgY3JlYXRlZCBhbmQgcmVnaXN0ZXJpbmcnKTtcclxuICB9XHJcblxyXG4gIG9uQ29uY3VycmVudENhbGxBY2NlcHRlZChhY2NlcHRlZENhbGw6IGFueSkge1xyXG4gICAgY29uc3Qgc2lkID0gYWNjZXB0ZWRDYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcclxuICAgIGlmIChzaWQpIHtcclxuICAgICAgLy8gUHJpbWFyeSBwYXRoOiB0aGUgYWNjZXB0ZWQgY2FsbCB3YXMgaGVsZCBieSBhIHBlbmRpbmcgc3BhcmUgZGV2aWNlLlxyXG4gICAgICBjb25zdCBkZXYgPSB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZ2V0KHNpZCk7XHJcbiAgICAgIGlmIChkZXYpIHtcclxuICAgICAgICBkZXYuX293bnNBY2NlcHRlZENhbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLnNldChzaWQsIGRldik7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmRlbGV0ZShzaWQpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIExlZ2FjeSBmYWxsYmFjazogb2xkIHNpbmdsZS1zcGFyZSBwYXRoIChzcGFyZSBzdGlsbCBob2xkcyB0aGUgY2FsbCkuXHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc3BhcmVEZXZpY2UgJiYgdGhpcy5zcGFyZURldmljZS5fcGVuZGluZ0luY29taW5nQ2FsbCA9PT0gYWNjZXB0ZWRDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZS5fb3duc0FjY2VwdGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5leHRyYURldmljZXMuc2V0KHNpZCwgdGhpcy5zcGFyZURldmljZSk7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zcGFyZURldmljZVJlYWR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEVuc3VyZSBhIGZyZWUgc3BhcmUgaXMgYWx3YXlzIHJlYWR5IGZvciB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwuXHJcbiAgICB0aGlzLnByZXBhcmVEZXZpY2UyRm9ySW5jb21pbmdDYWxsKCk7XHJcbiAgfVxyXG5cclxuICByZWxlYXNlQ29uY3VycmVudENhbGxEZXZpY2UoY2FsbFNpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBkZXYgPSB0aGlzLmV4dHJhRGV2aWNlcy5nZXQoY2FsbFNpZCk7XHJcbiAgICBpZiAoZGV2KSB7XHJcbiAgICAgIHRyeSB7IGRldi5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLmRlbGV0ZShjYWxsU2lkKTtcclxuICAgICAgY29uc29sZS5sb2coJ3JlbGVhc2VkIGNvbmN1cnJlbnQtY2FsbCBkZXZpY2UgZm9yJywgY2FsbFNpZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEFsc28gcmVsZWFzZSBwZW5kaW5nIGRldmljZXMgdGhhdCB3ZXJlIGNhbmNlbGxlZCBiZWZvcmUgYWNjZXB0YW5jZS5cclxuICAgIGNvbnN0IHBlbmRpbmdEZXYgPSB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZ2V0KGNhbGxTaWQpO1xyXG4gICAgaWYgKHBlbmRpbmdEZXYpIHtcclxuICAgICAgdHJ5IHsgcGVuZGluZ0Rldi5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5kZWxldGUoY2FsbFNpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBXaGVuIG5vIGFjY2VwdGVkIGNhbGxzIHJlbWFpbiwgdGVhciBkb3duIGFsbCBzcGFyZS9wZW5kaW5nL2V4dHJhIGRldmljZXMgc29cclxuICAvLyB0aGUgcHJpbWFyeSBkZXZpY2UgY2xlYW5seSBoYW5kbGVzIHRoZSBuZXh0IGZyZXNoIGluY29taW5nIGNhbGwuXHJcbiAgdGVhcmRvd25TcGFyZURldmljZXNJZklkbGUoKSB7XHJcbiAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHRyYURldmljZXMuZm9yRWFjaCgoZCkgPT4geyB0cnkgeyBkLmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge30gfSk7XHJcbiAgICB0aGlzLmV4dHJhRGV2aWNlcy5jbGVhcigpO1xyXG4gICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmZvckVhY2goKGQpID0+IHsgdHJ5IHsgZC5kZXN0cm95KCk7IH0gY2F0Y2ggKF8pIHt9IH0pO1xyXG4gICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmNsZWFyKCk7XHJcbiAgICBpZiAodGhpcy5zcGFyZURldmljZSkge1xyXG4gICAgICB0cnkgeyB0aGlzLnNwYXJlRGV2aWNlLmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge31cclxuICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xyXG4gICAgY29uc29sZS5sb2coJ3NwYXJlL2V4dHJhIGRldmljZXMgdG9ybiBkb3duIChpZGxlKScpO1xyXG4gIH1cclxuXHJcbiAgLy8gQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMga2VwdCBmb3IgZXhpc3RpbmcgY2FsbCBzaXRlcy5cclxuICBkZXN0cm95RGV2aWNlMigpIHtcclxuICAgIHRoaXMudGVhcmRvd25TcGFyZURldmljZXNJZklkbGUoKTtcclxuICB9XHJcblxyXG4gIC8vIFVzZXItY29udHJvbGxlZCBzd2l0Y2ggKGluIHRoZSBjYWxsLXByb2dyZXNzIFVJKS4gV2hlbiBPTiwgYSBuZXcgaW5jb21pbmdcclxuICAvLyBjYWxsJ3MgYnVpbHQtaW4gVHdpbGlvIHJpbmd0b25lIGlzIHNpbGVuY2VkIHNvIGl0IGRvZXMgbm90IGRpc3R1cmIgdGhlXHJcbiAgLy8gb25nb2luZyBjYWxsLiBTb3VyY2Ugb2YgdHJ1dGggc28gbmV3bHkgY3JlYXRlZCAoc3BhcmUpIGRldmljZXMgaW5oZXJpdCBpdC5cclxuICBpc0luY29taW5nTXV0ZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gQXBwbHkgdGhlIGN1cnJlbnQgbXV0ZSBwcmVmZXJlbmNlIHRvIGV2ZXJ5IGxpdmUgRGV2aWNlIChwcmltYXJ5ICsgc3BhcmUgK1xyXG4gIC8vIGFueSBjb25jdXJyZW50LWNhbGwgZGV2aWNlcykgdmlhIFR3aWxpbydzIG93biBkZXZpY2UuYXVkaW8uaW5jb21pbmcoKS5cclxuICBhcHBseUluY29taW5nTXV0ZSgpIHtcclxuICAgIGNvbnN0IGVuYWJsZWQgPSAhdGhpcy5pc0luY29taW5nTXV0ZWQ7IC8vIHJpbmd0b25lIGVuYWJsZWQgPSBOT1QgbXV0ZWRcclxuICAgIGNvbnN0IGFwcGx5ID0gKGRldjogYW55KSA9PiB7XHJcbiAgICAgIHRyeSB7IGRldj8uYXVkaW8/LmluY29taW5nPy4oZW5hYmxlZCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICB9O1xyXG4gICAgYXBwbHkodGhpcy5kZXZpY2UpO1xyXG4gICAgYXBwbHkodGhpcy5zcGFyZURldmljZSk7XHJcbiAgICB0aGlzLmV4dHJhRGV2aWNlcy5mb3JFYWNoKGFwcGx5KTtcclxuICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKGFwcGx5KTtcclxuICB9XHJcblxyXG4gIC8vIFRvZ2dsZS9zZXQgdGhlIG11dGUgc3dpdGNoIGFuZCBpbW1lZGlhdGVseSBhcHBseSBpdC5cclxuICBzZXRJbmNvbWluZ011dGVkKG11dGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzSW5jb21pbmdNdXRlZCA9IG11dGVkO1xyXG4gICAgdGhpcy5hcHBseUluY29taW5nTXV0ZSgpO1xyXG4gICAgaWYgKG11dGVkKSB7XHJcbiAgICAgIC8vIGRldmljZS5hdWRpby5pbmNvbWluZyhmYWxzZSkgb25seSBwcmV2ZW50cyBmdXR1cmUgcmluZ3Mg4oCUIGl0IGRvZXMgTk9UIHN0b3BcclxuICAgICAgLy8gYSBjYWxsIHRoYXQgaXMgYWxyZWFkeSByaW5naW5nLiBTdG9wIHRoZSBhY3RpdmUgcmluZyBkaXJlY3RseSB2aWEgc291bmRjYWNoZS5cclxuICAgICAgY29uc3Qgc3RvcFJpbmcgPSAoZGV2OiBhbnkpID0+IHtcclxuICAgICAgICB0cnkgeyBkZXY/Ll9zb3VuZGNhY2hlPy5nZXQ/LignaW5jb21pbmcnKT8uc3RvcD8uKCk7IH0gY2F0Y2ggKF8pIHt9XHJcbiAgICAgIH07XHJcbiAgICAgIHN0b3BSaW5nKHRoaXMuZGV2aWNlKTtcclxuICAgICAgc3RvcFJpbmcodGhpcy5zcGFyZURldmljZSk7XHJcbiAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLmZvckVhY2goKGRldjogYW55KSA9PiBzdG9wUmluZyhkZXYpKTtcclxuICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmZvckVhY2goKGRldjogYW55KSA9PiBzdG9wUmluZyhkZXYpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEluY29taW5nUGFydGljaXBhbnQocGFydGljaXBhbnRJZDogc3RyaW5nLCBjb25mZXJlbmNlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSksXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGAke2Vudmlyb25tZW50LmFwaVVybH0vdXRpbGl0aWVzL2V4dC9hZGQvaW5jb21pbmcvcGFydGljaXBhbnQvJHtwYXJ0aWNpcGFudElkfS8ke2NvbmZlcmVuY2VJZH1gLGh0dHBPcHRpb25zKTtcclxuICB9IFxyXG4gIGNvbm5lY3QoZGF0YT86IGFueSl7XHJcbiAgICBpZiAodGhpcy5kZXZpY2UuX2FjdGl2ZUNhbGwpIHtcclxuICAgICAgY29uc29sZS5sb2coJzI0NC10ZXN0JylcclxuICAgICAgdGhpcy5kZXZpY2UuZGlzY29ubmVjdEFsbCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlLmNvbm5lY3Qoe1xyXG4gICAgICBwYXJhbXM6IHtcclxuICAgICAgICBUb2tlbjogdGhpcy5jb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCB8fCBkYXRhLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICBDb25mZXJlbmNlTmFtZTogdGhpcy5jb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VOYW1lIHx8IGRhdGEuY29uZmVyZW5jZU5hbWVcclxuICAgICAgfSxcclxuICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHsgZGV2aWNlSWQ6ICdkZWZhdWx0JyB9IH0sXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iXX0=
715
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdpbGlvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS90d2lsaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBYzNELE1BQU0sT0FBTyxhQUFhO0lBNEN4Qix5QkFBeUIsQ0FBQyxPQUFZLEVBQUUsWUFBcUI7UUFDM0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsK0JBQStCO1FBQ3RFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7UUFDekMsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxPQUFPLENBQUM7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlCQUF5QixDQUFDLFdBQW9CO1FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQztRQUNoRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFD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QUFTLEVBQUUsRUFBRTtTQUNuRCxDQUFDLENBQUE7SUFDSixDQUFDOzsyR0E1dEJVLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERldmljZSwgQ2FsbCB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlhbFBheWxvYWQge1xuICBudW1iZXI6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpbWc6IHN0cmluZztcbiAgY2FsbGVySWQ6c3RyaW5nO1xuICBpc0RpYWxGcm9tSGlzdG9yeTpib29sZWFuO1xuICBmcm9tOnN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcgIFxufSlcbmV4cG9ydCBjbGFzcyBUd2lsaW9TZXJ2aWNlIHtcbiAgXG4gIG9wZW5JblByb2dyZXNzRGlhbHBhZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBjdXJyZW50Q2FsbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbCB8IG51bGw+KG51bGwpO1xuICBjdXJyZW50Q2FsbFN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCdub25lJyk7IC8vaW4tcHJvZ3Jlc3MsIG91dC1wcm9ncmVzcywgbm9uZVxuICBkZXZpY2U6YW55O1xuICBjYWxsITogQ2FsbDtcbiAgaW5jb21pbmdDYWxsVG9rZW46c3RyaW5nPScnO1xuICBvdXRnb2luZ0NhbGxUb2tlbj86c3RyaW5nO1xuICBjYWxsVHlwZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignTklMJyk7XG4gIGluY29taW5nQ2FsbERldGFpbDogYW55OyAvLyBmb3IgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmdcbiAgdG9rZW46YW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xuICBpc05ld0NvbnRhY3RBZGRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICB1cGRhdGVSZWNlbnRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGNhbGxoYW5kbGVGcm9tTm90aWZpY2F0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcblxuICBlbmRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGRpYWxOdW1iZXJGcm9tT3RoZXJNb2R1bGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERpYWxQYXlsb2FkPih7IG51bWJlcjogJycsIG5hbWU6ICcnLCBpbWc6ICcnLCBjYWxsZXJJZDogJycsIGlzRGlhbEZyb21IaXN0b3J5OiBmYWxzZSwgZnJvbTogJycgfSk7XG5cbiAgdG9nZ2xlQ2FsbGVySWRBbGVydCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIGlzVHJpYWxPdmVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzUGF5bWVudER1ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc0F2YWlsYWJsZU51bWJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBjYWxsZXJJZExpc3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gIHRyaWdnZXJTTVNSZWxvYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0b2tlbkluaXRpYWxpemF0aW9uJDogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIGRldmljZUlkOiBhbnk7XG4gIGNvbmZlcmVuY2VDYWxsSW5mbzogYW55O1xuICBpc1Nob3dJbmNvbWluZ0NhbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBDUklUSUNBTDogVHJhY2sgYWxsIGFjY2VwdGVkIENhbGwgb2JqZWN0cyAobWlycm9ycyBpT1MgYWNjZXB0ZWRDYWxsTGlzdClcbiAgLy8gVXNlZCB0byBndWFyZCBkZXZpY2UgcmUtaW5pdGlhbGl6YXRpb24gc28gYWN0aXZlIGNhbGxzIGFyZSBuZXZlciB0b3JuIGRvd25cbiAgYWNjZXB0ZWRDYWxsTGlzdDogQ2FsbFtdID0gW107XG4gIC8vIFRydWUgd2hpbGUgYW4gb3V0Z29pbmcgY2FsbCBpcyBiZWluZyBzZXQgdXAgKGluaXRpYXRlIEFQSSDihpIgc3BlY2lhbCBjYWxsIGNoYXJnZXMgbW9kYWwg4oaSIFR3aWxpb1xuICAvLyBjbGllbnQgbGVnIGNvbm5lY3RlZCkuIFNvY2tldCB0aWNrcyBhcmUgZW1wdHkgZHVyaW5nIHRoaXMgd2luZG93LCBzbyBkaWFsYm94IG11c3Qgbm90IHRyZWF0IHRoZW0gYXMgaWRsZS5cbiAgaXNBd2FpdGluZ1NwZWNpYWxDYWxsQ29uZmlybTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBTcGVjaWFsIGNhbGwgY2hhcmdlcyBtb2RhbCBzdGF0ZS4gaW5DYWxsU2NyZWVuOiB0cnVlIOKGkiByZW5kZXJlZCBieSBjYWxsLXByb2dyZXNzIChhIGNhbGwgc2NyZWVuIGlzIG9wZW4pLFxuICAvLyBmYWxzZSDihpIgcmVuZGVyZWQgYnkgZGlhbGJveCBvdmVyIHRoZSBcIkNvbm5lY3RpbmcuLi5cIiBsb2FkZXIgKGZpcnN0IGNhbGwsIGNhbGwgc2NyZWVuIG5vdCByZW5kZXJlZCB5ZXQpXG4gIHNwZWNpYWxDYWxsQ29uZmlybTogeyBtZXNzYWdlOiBhbnk7IGluQ2FsbFNjcmVlbjogYm9vbGVhbiB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BlY2lhbENhbGxDb25maXJtUmVzb2x2ZXI6ICgoaXNDb25maXJtZWQ6IGJvb2xlYW4pID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgcmVxdWVzdFNwZWNpYWxDYWxsQ29uZmlybShtZXNzYWdlOiBhbnksIGluQ2FsbFNjcmVlbjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMucmVzb2x2ZVNwZWNpYWxDYWxsQ29uZmlybShmYWxzZSk7IC8vIGNsb3NlIGFueSBzdGFsZSBjb25maXJtYXRpb25cbiAgICB0aGlzLmlzQXdhaXRpbmdTcGVjaWFsQ2FsbENvbmZpcm0gPSB0cnVlO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zcGVjaWFsQ2FsbENvbmZpcm1SZXNvbHZlciA9IHJlc29sdmU7XG4gICAgICB0aGlzLnNwZWNpYWxDYWxsQ29uZmlybSA9IHsgbWVzc2FnZSwgaW5DYWxsU2NyZWVuIH07XG4gICAgfSk7XG4gIH1cblxuICByZXNvbHZlU3BlY2lhbENhbGxDb25maXJtKGlzQ29uZmlybWVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzb2x2ZSA9IHRoaXMuc3BlY2lhbENhbGxDb25maXJtUmVzb2x2ZXI7XG4gICAgdGhpcy5zcGVjaWFsQ2FsbENvbmZpcm1SZXNvbHZlciA9IG51bGw7XG4gICAgdGhpcy5zcGVjaWFsQ2FsbENvbmZpcm0gPSBudWxsO1xuICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgLy8gVHdpbGlvIGhhcyBub3QgY29ubmVjdGVkIHlldCDigJMga2VlcCB0aGUgY2FsbCBzY3JlZW4gYWxpdmUgdW50aWwgY2FsbC1wcm9ncmVzcyByZXBvcnRzIHRoZVxuICAgICAgLy8gY2xpZW50IGxlZyBpcyBjb25uZWN0ZWQgKHJlbGVhc2VTcGVjaWFsQ2FsbEd1YXJkKSwgd2l0aCBhIHNhZmV0eSB0aW1lb3V0LlxuICAgICAgdGhpcy5ob2xkQ2FsbFNjcmVlbkd1YXJkKDIwMDAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWxlYXNlU3BlY2lhbENhbGxHdWFyZCgpO1xuICAgIH1cbiAgICByZXNvbHZlPy4oaXNDb25maXJtZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGVjaWFsQ2FsbEd1YXJkVGltZXI6IGFueTtcbiAgLy8gS2VlcCB0aGUgY2FsbCBzY3JlZW4gYWxpdmUgd2hpbGUgYW4gb3V0Z29pbmcgY2FsbCBpcyBzZXQgdXAuIFRoZSBzYWZldHkgdGltZW91dCBvbmx5IGNvdmVyc1xuICAvLyBBUEkvVHdpbGlvIHdhaXRzIOKAlCByZXF1ZXN0U3BlY2lhbENhbGxDb25maXJtKCkgY2xlYXJzIGl0IHNvIHRoZSBjaGFyZ2VzIG1vZGFsIGNhbiBzdGF5IG9wZW4gaW5kZWZpbml0ZWx5LlxuICBob2xkQ2FsbFNjcmVlbkd1YXJkKHRpbWVvdXRNczogbnVtYmVyID0gMzAwMDApIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5zcGVjaWFsQ2FsbEd1YXJkVGltZXIpO1xuICAgIHRoaXMuaXNBd2FpdGluZ1NwZWNpYWxDYWxsQ29uZmlybSA9IHRydWU7XG4gICAgdGhpcy5zcGVjaWFsQ2FsbEd1YXJkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVsZWFzZVNwZWNpYWxDYWxsR3VhcmQoKSwgdGltZW91dE1zKTtcbiAgfVxuXG4gIHJlbGVhc2VTcGVjaWFsQ2FsbEd1YXJkKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnNwZWNpYWxDYWxsR3VhcmRUaW1lcik7XG4gICAgdGhpcy5pc0F3YWl0aW5nU3BlY2lhbENhbGxDb25maXJtID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHByaW1hcnlIYXNDYWxsID0gZmFsc2U7XG4gIHNwYXJlRGV2aWNlOiBhbnkgPSBudWxsO1xuICBzcGFyZURldmljZVJlYWR5ID0gZmFsc2U7XG4gIHByaXZhdGUgcGVuZGluZ0luY29taW5nRGV2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgZXh0cmFEZXZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgaW5jb21pbmdDYWxsc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbiAgLy8gQkUgaXNzdWVzIGluY29taW5nLWNhbGwgYWNjZXNzIHRva2VucyB3aXRoIGEgMWgzMG0gVFRMLiBBc2sgVHdpbGlvIHRvIGZpcmVcbiAgLy8gJ3Rva2VuV2lsbEV4cGlyZScgNSBtaW51dGVzIGJlZm9yZSB0aGF0IChTREsgZGVmYXVsdCBpcyBvbmx5IDEwcykgc28gYSBzbG93XG4gIC8vIG5ldHdvcmsgLyBiYWNrZ3JvdW5kZWQgdGFiIHN0aWxsIGhhcyB0aW1lIHRvIGZldGNoIGFuZCBhcHBseSBhIGZyZXNoIHRva2VuLlxuICBwcml2YXRlIHJlYWRvbmx5IFRPS0VOX1JFRlJFU0hfTVMgPSA1ICogNjAgKiAxMDAwO1xuICBwcml2YXRlIHRva2VuUmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWNvdmVyeVRpbWVyOiBhbnkgPSBudWxsO1xuICAvLyBSZWZlcmVuY2VzIHRvIHRoZSAndW5yZWdpc3RlcmVkJy8nZXJyb3InIGhhbmRsZXJzIGN1cnJlbnRseSBhdHRhY2hlZCB0byBgdGhpcy5kZXZpY2VgLFxuICAvLyBzbyBhbiBpbnRlbnRpb25hbCByZXBsYWNlIGNhbiBkZXRhY2ggZXhhY3RseSB0aG9zZSB0d28gYmVmb3JlIGRlc3Ryb3koKSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIGFueSBsaXN0ZW5lcnMgdGhlIFR3aWxpbyBTREsgaXRzZWxmIG1heSBoYXZlIHdpcmVkIHRvIHRoZSBzYW1lIEV2ZW50RW1pdHRlci5cbiAgcHJpdmF0ZSBjdXJyZW50RGV2aWNlVW5yZWdpc3RlcmVkSGFuZGxlcjogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50RGV2aWNlRXJyb3JIYW5kbGVyOiBhbnkgPSBudWxsO1xuICBpbmNvbWluZ0NhbGxOb3RpZmljYXRpb249IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJldmlvdXNJbmNvbWluZ0NhbGxOb3RpZmljYXRpb246IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpO1xuICAgIC8vIFNhZmV0eSBuZXQgZm9yIGxvbmcgaWRsZS9zbGVlcCBwZXJpb2RzOiB0aGUgc2lnbmFsaW5nIHNvY2tldCBjYW4gZGllIHNpbGVudGx5XG4gICAgLy8gKE9TIHN1c3BlbmRzIHRpbWVycywgdGFiIGlzIGJhY2tncm91bmRlZCkgd2l0aG91dCBldmVyIGZpcmluZyAnZXJyb3InLyd1bnJlZ2lzdGVyZWQnLlxuICAgIC8vIFJlLWNoZWNrIGRldmljZSBoZWFsdGggd2hlbmV2ZXIgdGhlIGFwcCBiZWNvbWVzIGFjdGl2ZS9vbmxpbmUgYWdhaW4uXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcbiAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgICB0aGlzLmVuc3VyZURldmljZUhlYWx0aHkoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgKCkgPT4gdGhpcy5lbnN1cmVEZXZpY2VIZWFsdGh5KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVG9rZW4oKSB7XG4gICAgaWYgKHRoaXMudG9rZW5Jbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW5Jbml0aWFsaXphdGlvbiQgfHwgb2YobnVsbCk7XG4gICAgfVxuICAgIC8vIEEgZmV0Y2ggaXMgYWxyZWFkeSBpbiBmbGlnaHQg4oCUIEFwcEluaXRpYWxpemVyU2VydmljZSBhbmQgdGhlIGRpYWxib3ggY29tcG9uZW50XG4gICAgLy8gYm90aCBjYWxsIGluaXRpYWxpemVUd2lsaW9EZXZpY2UoKSBvbiBzdGFydHVwLCBhbmQgd2l0aG91dCB0aGlzIHRoZXknZCByYWNlOlxuICAgIC8vIHRoZSBzZWNvbmQgY2FsbCB3b3VsZCBmaXJlIGl0cyBvd24gdG9rZW4gcmVxdWVzdCBhbmQsIG9uY2UgcmVzb2x2ZWQsIGNhbGxcbiAgICAvLyBpbml0aWFsaXplRGV2aWNlKCkgYWdhaW4sIGRlc3Ryb3lpbmcgdGhlIGRldmljZSB0aGUgZmlyc3QgY2FsbCBqdXN0IGNyZWF0ZWQgYW5kXG4gICAgLy8gdG91Y2hpbmcgb2ZmIGEgc3B1cmlvdXMgJ3VucmVnaXN0ZXJlZCcgLT4gcmVjb3ZlcnkgY2FzY2FkZS4gU2hhcmUgdGhlIHNhbWVcbiAgICAvLyBpbi1mbGlnaHQgcmVxdWVzdCBpbnN0ZWFkLlxuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJDtcbiAgICB9XG5cbiAgICB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldEluY29taW5nQ2FsbFRva2VuKHRoaXMuZGV2aWNlSWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RldmljZUlkJykpLnBpcGUoXG4gICAgICB0YXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmluY29taW5nQ2FsbFRva2VuID0gZGF0YS50b2tlbjtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2luLXRva2VuJywgZGF0YS50b2tlbik7XG4gICAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURldmljZSgpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIFR3aWxpbyB0b2tlbjonLCBlcnJvcik7XG4gICAgICAgIC8vIEFsbG93IGEgZnJlc2ggYXR0ZW1wdCBuZXh0IHRpbWUgc2luY2UgdGhpcyBvbmUgZmFpbGVkLlxuICAgICAgICB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSAvLyBDYWNoZSB0aGUgcmVzdWx0IGZvciBzdWJzZXF1ZW50IHN1YnNjcmliZXJzXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnRva2VuSW5pdGlhbGl6YXRpb24kO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVUd2lsaW9EZXZpY2UoZGV2aWNlSWQ6IGFueSkge1xuICAgIHRoaXMuZGV2aWNlSWQgPSBkZXZpY2VJZDtcbiAgICBpZiAodGhpcy50b2tlbkluaXRpYWxpemVkICYmIHRoaXMuaW5jb21pbmdDYWxsVG9rZW4pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURldmljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURldmljZSgpIHtcbiAgICBpZiAodGhpcy5kZXZpY2UpIHtcbiAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ2FsbExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NraXBwaW5nIGRldmljZSByZS1pbml0OiBhY3RpdmUgYWNjZXB0ZWQgY2FsbHMgZXhpc3Q6JywgdGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERldGFjaCB0aGUgJ3VucmVnaXN0ZXJlZCcvJ2Vycm9yJyBoYW5kbGVycyB3ZSBhdHRhY2hlZCBiZWZvcmUgZGVzdHJveWluZywgc29cbiAgICAgIC8vIHRoaXMgKmludGVudGlvbmFsKiB0ZWFyZG93biBjYW4ndCBmaXJlIHRoZW0gYmVsb3cg4oCUIG90aGVyd2lzZSBhIGRlbGliZXJhdGVcbiAgICAgIC8vIHJlcGxhY2UgbG9va3MgaWRlbnRpY2FsIHRvIGFuIHVuZXhwZWN0ZWQgZHJvcCBhbmQgdG91Y2hlcyBvZmYgYVxuICAgICAgLy8gZGVzdHJveSAtPiAndW5yZWdpc3RlcmVkJyAtPiBzY2hlZHVsZURldmljZVJlY292ZXJ5IC0+IGRlc3Ryb3kgY2FzY2FkZS5cbiAgICAgIC8vIChPbmx5IHJlbW92ZXMgb3VyIG93biBoYW5kbGVycywgbm90IGFueXRoaW5nIHRoZSBUd2lsaW8gU0RLIGl0c2VsZiBtYXkgaGF2ZVxuICAgICAgLy8gd2lyZWQgdG8gdGhlIHNhbWUgRXZlbnRFbWl0dGVyLCBzbyBpdHMgb3duIGRlc3Ryb3koKS9jbGVhbnVwIGlzIHVuYWZmZWN0ZWQuKVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERldmljZVVucmVnaXN0ZXJlZEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmRldmljZS5yZW1vdmVMaXN0ZW5lcigndW5yZWdpc3RlcmVkJywgdGhpcy5jdXJyZW50RGV2aWNlVW5yZWdpc3RlcmVkSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlcikge1xuICAgICAgICAgIHRoaXMuZGV2aWNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICBjb25zb2xlLmxvZygnMTUzIGNhbGwgZW5kJylcbiAgICAgIHRoaXMuZGV2aWNlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIFR3aWxpbyB0b2tlbiBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZXZpY2U6IGFueSA9IG5ldyBEZXZpY2UodGhpcy5pbmNvbWluZ0NhbGxUb2tlbiwgeyBhbGxvd0luY29taW5nV2hpbGVCdXN5OiB0cnVlLCB0b2tlblJlZnJlc2hNczogdGhpcy5UT0tFTl9SRUZSRVNIX01TIH0pO1xuICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlO1xuXG4gICAgZGV2aWNlLm9uKCdyZWdpc3RlcmVkJywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDEwO1xuICAgICAgLy8gQSByZWNvdmVyeSBhdHRlbXB0IG1heSBoYXZlIGJlZW4gc2NoZWR1bGVkIGJ5IGFuIGVhcmxpZXIgZGV2aWNlIGluc3RhbmNlXG4gICAgICAvLyBiZWZvcmUgdGhpcyBvbmUgY2FtZSB1cCDigJQgaXQncyBzdGFsZSBub3csIGNhbmNlbCBpdCBzbyBpdCBjYW4ndCB0ZWFyIHRoaXNcbiAgICAgIC8vIGhlYWx0aHkgZGV2aWNlIGRvd24gbGF0ZXIuXG4gICAgICBpZiAodGhpcy5yZWNvdmVyeVRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY292ZXJ5VGltZXIpO1xuICAgICAgICB0aGlzLnJlY292ZXJ5VGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5wcmVwYXJlRGV2aWNlMkZvckluY29taW5nQ2FsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVHdpbGlvIGZpcmVzIHRoaXMgVE9LRU5fUkVGUkVTSF9NUyBiZWZvcmUgdGhlIGFjY2VzcyB0b2tlbiBleHBpcmVzLiBTd2FwIGluIGFcbiAgICAvLyBmcmVzaCBvbmUgdmlhIHVwZGF0ZVRva2VuKCkgc28gdGhlIHNpZ25hbGluZyBjb25uZWN0aW9uIG5ldmVyIGhhcyB0byBkcm9wXG4gICAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlICh0aGlzIGlzIHRoZSBtYWluIGNhdXNlIG9mIFwiaWRsZSBmb3IgYSB3aGlsZSwgQkUgc3RpbGxcbiAgICAvLyBub3RpZmllcyBidXQgVHdpbGlvIGluY29taW5nIGV2ZW50IG5ldmVyIGZpcmVzXCIpLlxuICAgIGRldmljZS5vbigndG9rZW5XaWxsRXhwaXJlJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoRGV2aWNlVG9rZW4oKTtcbiAgICB9KTtcblxuICAgIGRldmljZS5vbignaW5jb21pbmcnLCAoY2FsbDogQ2FsbCB8IGFueSkgPT4ge1xuICAgICAgY29uc3QgaW5jb21pbmdDYWxsU2lkID0gY2FsbD8ucGFyYW1ldGVycz8uWydDYWxsU2lkJ107XG4gICAgICBpZiAoaW5jb21pbmdDYWxsU2lkICYmIHRoaXMuaW5jb21pbmdDYWxsc01hcC5oYXMoaW5jb21pbmdDYWxsU2lkKSkge1xuICAgICAgICBjb25zb2xlLmxvZygncHJpbWFyeSBkZXZpY2U6IGR1cGxpY2F0ZSBpbmNvbWluZyBmb3IgYWxyZWFkeS10cmFja2VkIGNhbGwsIGlnbm9yaW5nJywgaW5jb21pbmdDYWxsU2lkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBEZXZpY2UgaW5jb21pbmcgY2FsbCBldmVudDonLCBjYWxsKTtcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuYnVpbGRJbmNvbWluZ05vdGlmaWNhdGlvbihjYWxsKTtcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24ubmV4dChub3RpZmljYXRpb24pO1xuICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwIHx8IHRoaXMucHJpbWFyeUhhc0NhbGwpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW1hcnkgZGV2aWNlOiBjb25jdXJyZW50IGNhbGwgYXJyaXZpbmcg4oCTIHNwYXJlIGRldmljZSB3aWxsIGhhbmRsZSBpdCcpO1xuICAgICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJpbWFyeUhhc0NhbGwgPSB0cnVlO1xuICAgICAgLy8gQXJtIGEgc3BhcmUgZGV2aWNlIHJpZ2h0IG5vdyAoYmVmb3JlIHRoZSB1c2VyIGV2ZW4gYWNjZXB0cykgc28gaXQgY2FuXG4gICAgICAvLyByZWdpc3RlciBpbiB0aW1lIGZvciBhbnkgY2FsbCB0aGF0IGFycml2ZXMgc2Vjb25kcyBsYXRlci5cbiAgICAgIHRoaXMucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcblxuICAgICAgaWYgKHRoaXMuaXNJbmNvbWluZ011dGVkKSB7XG4gICAgICAgIHRyeSB7IGRldmljZS5hdWRpbz8uaW5jb21pbmcoZmFsc2UpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgICAgY2FsbC5vbignYWNjZXB0JywgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmcgY2FsbCBhbnN3ZXJlZC9hY2NlcHRlZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGNhbGwub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDYWxsIGRpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgY2FsbC5vbignY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2FsbGVyIGh1bmcgdXAgYmVmb3JlIGFuc3dlcicpO1xuICAgICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgY2FsbC5vbigncmVqZWN0JywgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2FsbCByZWplY3RlZCcpO1xuICAgICAgICB0aGlzLnByaW1hcnlIYXNDYWxsID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudHJhY2tJbmNvbWluZ0NhbGwoY2FsbCk7XG4gICAgICB0aGlzLmluY29taW5nQ2FsbERldGFpbCA9IGNhbGw7XG4gICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkRldmljZUVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIFN0YWxlIGV2ZW50IGZyb20gYSBkZXZpY2Ugd2UndmUgYWxyZWFkeSBpbnRlbnRpb25hbGx5IHJlcGxhY2VkIOKAlCBpZ25vcmUuXG4gICAgICBpZiAodGhpcy5kZXZpY2UgIT09IGRldmljZSkgcmV0dXJuO1xuICAgICAgY29uc29sZS5lcnJvcignVHdpbGlvIERldmljZSBFcnJvcjonLCBlcnJvcik7XG4gICAgICB0aGlzLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNjaGVkdWxlRGV2aWNlUmVjb3ZlcnkoKTtcbiAgICB9O1xuICAgIHRoaXMuY3VycmVudERldmljZUVycm9ySGFuZGxlciA9IG9uRGV2aWNlRXJyb3I7XG4gICAgZGV2aWNlLm9uKCdlcnJvcicsIG9uRGV2aWNlRXJyb3IpO1xuICAgIGRldmljZS5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIGRpc2Nvbm5lY3RlZCcpO1xuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVEZXZpY2VSZWNvdmVyeSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb25EZXZpY2VVbnJlZ2lzdGVyZWQgPSAoKSA9PiB7XG4gICAgICAvLyBTdGFsZSBldmVudCBmcm9tIGEgZGV2aWNlIHdlJ3ZlIGFscmVhZHkgaW50ZW50aW9uYWxseSByZXBsYWNlZCDigJQgaWdub3JlLlxuICAgICAgaWYgKHRoaXMuZGV2aWNlICE9PSBkZXZpY2UpIHJldHVybjtcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIHVucmVnaXN0ZXJlZCcpO1xuICAgICAgdGhpcy5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zY2hlZHVsZURldmljZVJlY292ZXJ5KCk7XG4gICAgfTtcbiAgICB0aGlzLmN1cnJlbnREZXZpY2VVbnJlZ2lzdGVyZWRIYW5kbGVyID0gb25EZXZpY2VVbnJlZ2lzdGVyZWQ7XG4gICAgZGV2aWNlLm9uKCd1bnJlZ2lzdGVyZWQnLCBvbkRldmljZVVucmVnaXN0ZXJlZCk7XG5cbiAgICAvLyBSZWdpc3RlciBBRlRFUiBhdHRhY2hpbmcgYWxsIGxpc3RlbmVyc1xuICAgIGRldmljZS5yZWdpc3RlcigpO1xuICAgIGNvbnNvbGUubG9nKCdkZXZpY2UgY3JlYXRlZCcsIGRldmljZSk7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Jbml0aWFsaXphdGlvbiQgfHwgb2YobnVsbCk7XG4gIH1cblxuICAvLyBQcm9hY3RpdmVseSBzd2FwIGluIGEgZnJlc2ggYWNjZXNzIHRva2VuIGFoZWFkIG9mIGV4cGlyeSAoc2VlICd0b2tlbldpbGxFeHBpcmUnXG4gIC8vIGFib3ZlKSBzbyB0aGUgRGV2aWNlJ3Mgc2lnbmFsaW5nIGNvbm5lY3Rpb24gc3Vydml2ZXMgbG9uZyBpZGxlIHBlcmlvZHMuXG4gIHByaXZhdGUgcmVmcmVzaERldmljZVRva2VuKCkge1xuICAgIGlmICh0aGlzLnRva2VuUmVmcmVzaEluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzID0gdHJ1ZTtcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0SW5jb21pbmdDYWxsVG9rZW4odGhpcy5kZXZpY2VJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGV2aWNlSWQnKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsVG9rZW4gPSBkYXRhLnRva2VuO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaW4tdG9rZW4nLCBkYXRhLnRva2VuKTtcbiAgICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgLy8gRXZlcnkgbGl2ZSBEZXZpY2Ugd2FzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSB0b2tlbiwgc28gdGhleSBhbGwgZXhwaXJlXG4gICAgICAgIC8vIHRvZ2V0aGVyIOKAlCByZWZyZXNoIHRoZSBzcGFyZS9wZW5kaW5nL2NvbmN1cnJlbnQgb25lcyB0b28sIG90aGVyd2lzZSB0aGVcbiAgICAgICAgLy8gc3BhcmUgc2lsZW50bHkgZGllcyBhZnRlciAxaDMwbSBpZGxlIGFuZCBjb25jdXJyZW50IGNhbGxzIG5ldmVyIHJpbmcuXG4gICAgICAgIGNvbnN0IGFwcGx5ID0gKGRldjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFkZXYpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGV2LnVwZGF0ZVRva2VuKHRoaXMuaW5jb21pbmdDYWxsVG9rZW4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGFwcGx5IHJlZnJlc2hlZCBUd2lsaW8gdG9rZW46JywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGFwcGx5KHRoaXMuZGV2aWNlKTtcbiAgICAgICAgYXBwbHkodGhpcy5zcGFyZURldmljZSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKGFwcGx5KTtcbiAgICAgICAgdGhpcy5leHRyYURldmljZXMuZm9yRWFjaChhcHBseSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIFR3aWxpbyB0b2tlbiBhaGVhZCBvZiBleHBpcnk6JywgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNlbGYtaGVhbCBhZnRlciB0aGUgRGV2aWNlIGRpZXMgKGV4cGlyZWQgdG9rZW4sIGRyb3BwZWQgc2lnbmFsaW5nIHNvY2tldCB3aGlsZVxuICAvLyBpZGxlL2FzbGVlcCwgZXRjKS4gTmV2ZXIgcnVucyB3aGlsZSBhIGNhbGwgaXMgYWN0dWFsbHkgYWN0aXZlLCBhbmQgYmFja3Mgb2ZmIHNvIGFcbiAgLy8gZ2VudWluZWx5IGxvZ2dlZC1vdXQvb2ZmbGluZSB1c2VyIGRvZXNuJ3QgcmV0cnkgZm9yZXZlci5cbiAgcHJpdmF0ZSBzY2hlZHVsZURldmljZVJlY292ZXJ5KCkge1xuICAgIGlmICh0aGlzLmFjY2VwdGVkQ2FsbExpc3QubGVuZ3RoID4gMCB8fCB0aGlzLnJlY292ZXJ5VGltZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbigzMDAwMCwgMjAwMCAqIE1hdGgucG93KDIsIHRoaXMucmVjb3ZlcnlBdHRlbXB0cykpO1xuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cysrO1xuICAgIHRoaXMucmVjb3ZlcnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvdmVyeVRpbWVyID0gbnVsbDtcbiAgICAgIGNvbnN0IGF1dGhUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcbiAgICAgIGlmICghYXV0aFRva2VuIHx8IGF1dGhUb2tlbiA9PT0gJ2xvZ291dCcpIHtcbiAgICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdUd2lsaW8gZGV2aWNlIHJlY292ZXJ5IGF0dGVtcHQgZmFpbGVkOicsIGVycilcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBmdWxsIGluY29taW5nLWNhbGwgbm90aWZpY2F0aW9uIHBheWxvYWQgKG1hdGNoZXMgdGhlIHNoYXBlIHRoZSBCRSB1c2VkIHRvXG4gIC8vIHB1c2ggb3ZlciB0aGUgc29ja2V0KSBmcm9tIHRoZSByYXcgVHdpbGlvICdpbmNvbWluZycgQ2FsbDogcGFyc2VkIFBhcmFtcyBmaWVsZHMgcGx1c1xuICAvLyB0aGUgZGVyaXZlZCBjbGllbnRTaWQvcGFydGljaXBhbnRTaWQvbm90aWZpY2F0aW9uVHlwZS90aXRsZS9tc2dCb2R5LlxuICBidWlsZEluY29taW5nTm90aWZpY2F0aW9uKGNhbGw6IENhbGwpOiBhbnkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuY29udmVydFRvSnNvbihjYWxsPy5wYXJhbWV0ZXJzPy5bJ1BhcmFtcyddIHx8ICd7fScpO1xuICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcbiAgICBub3RpZmljYXRpb24uY2xpZW50U2lkID0gY2FsbFNpZDtcbiAgICAvLyBPbmx5IHJlYWwgVHdpbGlvIFNJRCBleHBvc2VkIGNsaWVudC1zaWRlIGZvciB0aGlzIGxlZzsgbm8gc2VwYXJhdGUgcGFydGljaXBhbnQgU0lEXG4gICAgLy8gaXMgYXZhaWxhYmxlLCBzbyBpdCBtaXJyb3JzIGNsaWVudFNpZC5cbiAgICBub3RpZmljYXRpb24ucGFydGljaXBhbnRTaWQgPSBjYWxsU2lkO1xuICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlID0gJ2luY29taW5nY2FsbCc7XG4gICAgbm90aWZpY2F0aW9uLnRpdGxlID0gJ0luY29taW5nIENhbGwnO1xuICAgIG5vdGlmaWNhdGlvbi5tc2dCb2R5ID0gYHlvdSBoYXZlIGluY29taW5nIGNhbGwgJHtub3RpZmljYXRpb24uZnJvbU5hbWUgfHwgJyd9YDtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG5cbiAgY29udmVydFRvSnNvbihkYXRhOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0OiBrZXk9dmFsdWUma2V5PXZhbHVlXG4gICAgaWYgKGRhdGEuaW5jbHVkZXMoJyYnKSkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhkYXRhKTtcblxuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZSA9PT0gJ3RydWUnXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gJ2ZhbHNlJ1xuICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9ybWF0OiB7a2V5PXZhbHVlLCBrZXk9dmFsdWV9XG4gICAgICBjb25zdCB0ZXh0ID0gZGF0YS50cmltKCkucmVwbGFjZSgvXlxce3xcXH0kL2csICcnKTtcblxuICAgICAgdGV4dC5zcGxpdCgnLCcpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbS5pbmRleE9mKCc9Jyk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBpdGVtLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpO1xuICAgICAgICAgIGxldCB2YWx1ZTogYW55ID0gaXRlbS5zdWJzdHJpbmcoaW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykgdmFsdWUgPSB0cnVlO1xuICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB2YWx1ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2JqLnJlYWQgPSBmYWxzZTtcbiAgICBvYmouc2F2ZSA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICAvLyBTYWZldHkgbmV0IGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdW5kZXJseWluZyBzb2NrZXQgZGllcyBzaWxlbnRseSBkdXJpbmcgYSBsb25nXG4gIC8vIHNsZWVwL2lkbGUgcGVyaW9kIHdpdGhvdXQgZXZlciBmaXJpbmcgJ2Vycm9yJy8ndW5yZWdpc3RlcmVkJyAodGhlIE9TIGNhbiBzdXNwZW5kXG4gIC8vIHRpbWVycy9zb2NrZXRzIG91dHJpZ2h0KSDigJQgcmUtY2hlY2sgZGV2aWNlIGhlYWx0aCB3aGVuZXZlciB0aGUgYXBwIHdha2VzIHVwLlxuICBwcml2YXRlIGVuc3VyZURldmljZUhlYWx0aHkoKSB7XG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kZXZpY2UgfHwgdGhpcy5kZXZpY2Uuc3RhdGUgIT09ICdyZWdpc3RlcmVkJykge1xuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBkZXZpY2UgdW5oZWFsdGh5IGFmdGVyIHdha2UvdmlzaWJpbGl0eSBjaGFuZ2UsIHJlLWluaXRpYWxpemluZycpO1xuICAgICAgdGhpcy50b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdUd2lsaW8gZGV2aWNlIHJlY292ZXJ5IGZhaWxlZDonLCBlcnIpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzYXZlQ29udGFjdChwYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9hZGQvY29udGFjdHMvbWFudWFsbHknLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICB1cGRhdGVDb250YWN0KHBheWxvYWQ6YW55KXtcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0aGlzLnRva2VufSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay91cGRhdGUvY29udGFjdCcsIHBheWxvYWQsIGh0dHBPcHRpb25zKTtcbiAgfVxuICBcbiAgZGVsZXRlQ29udGFjdChpZDpzdHJpbmcpe1xuICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgcGhvbmVib29raWQ6IGlkXG4gICAgfVxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2RlbGV0ZS9jb250YWN0LycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xuICB9XG4gIGdldENvbnRhY3RMaXN0KCl7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9yZWFkL2NvbnRhY3RzJywgaHR0cE9wdGlvbnMpO1xuICB9XG5cbiAgYWRkQ29udGFjdFRvRmF2b3VyaXRlKHBheWxvYWQ6IGFueSl7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBkYXRlL2Zhdm91cml0ZScsIHBheWxvYWQsIGh0dHBPcHRpb25zKTtcbiAgfVxuXG4gIGdldEZhdm91cml0Q29udGFjdHMoKXtcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2Zhdm91cml0ZS9jb250YWN0cycsIGh0dHBPcHRpb25zKTtcbiAgfVxuXG4gIGdldFJlY2VudENhbGxzKHBhZ2VJbmRleD86IHN0cmluZywgcGFnZVNpemU/OiBzdHJpbmcsKXtcbiAgICBjb25zdCBoZWFkZXJzID0gIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfTtcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9e2hlYWRlcnN9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9yZWNlbnQvY2FsbHMnLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgZGVsZXRlUmVjZW50Q2FsbExvZyhpZDpzdHJpbmd8IHN0cmluZ1tdKXtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHJlY29yZElkOiBpZFxuICAgIH1cbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY2FsbHMvJytpZCxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICB1cGxvYWRQaG90byhwYXlsb2FkOiBhbnkpe1xuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBsb2FkL3Bob3RvJyxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGVQaG90byhpZDpzdHJpbmcpe1xuICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgcGhvbmVib29raWQ6IGlkXG4gICAgfVxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL3Bob3RvLycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xuICB9XG5cbiAgdG9nZ2xlQ291dHJ5Q29kZVRvYXN0KHZhbDphbnkpe1xuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9jb3VudHJ5Y29kZS9hbGVydC8nICsgdmFsLCB7fSwgaHR0cE9wdGlvbnMpO1xuICB9XG4gIGdldFRvTnVtYmVyKGRpYWxsZWRObzogc3RyaW5nLCBpc29Db2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pLFxuICAgICAgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgnaXNvQ29kZScsIGlzb0NvZGUpXG4gICAgfTtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldCgnaXNvQ29kZScsIGlzb0NvZGUpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9jaGVjay9jb3VudHJ5Q29kZS8nICsgZGlhbGxlZE5vLCBodHRwT3B0aW9ucyk7XG4gIH0gXG4gIFxuICAvLyBSZWNvcmQgYSByaW5naW5nIGluY29taW5nIENhbGwgc28gaXQgY2FuIGxhdGVyIGJlIGFjY2VwdGVkIGJ5IGl0cyBzcGVjaWZpYyBpZC5cbiAgLy8gVGhlIG1hcCBpcyBjbGVhbmVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2FsbCBpcyBjYW5jZWxsZWQvZGlzY29ubmVjdGVkL3JlamVjdGVkLlxuICBwcml2YXRlIHRyYWNrSW5jb21pbmdDYWxsKGNhbGw6IGFueSkge1xuICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcbiAgICBpZiAoY2FsbFNpZCkge1xuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTWFwLnNldChjYWxsU2lkLCBjYWxsKTtcbiAgICB9XG4gICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgIGlmICghY2FsbFNpZCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTWFwLmRlbGV0ZShjYWxsU2lkKTtcbiAgICAgIC8vIElmIHRoZSBjYWxsIGVuZGVkIGJlZm9yZSB0aGUgdXNlciBhY2NlcHRlZCBpdCwgZGVzdHJveSB0aGUgcGVuZGluZyBzcGFyZVxuICAgICAgLy8gZGV2aWNlIHRoYXQgd2FzIGhvbGRpbmcgaXQgc28gd2UgZG9uJ3QgbGVhayBkZXZpY2UgcmVnaXN0cmF0aW9ucy5cbiAgICAgIGNvbnN0IGRldiA9IHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5nZXQoY2FsbFNpZCk7XG4gICAgICBpZiAoZGV2ICYmICFkZXYuX293bnNBY2NlcHRlZENhbGwpIHtcbiAgICAgICAgdHJ5IHsgZGV2LmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmRlbGV0ZShjYWxsU2lkKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNhbGwub24oJ2NhbmNlbCcsIGNsZWFudXApO1xuICAgIGNhbGwub24oJ2Rpc2Nvbm5lY3QnLCBjbGVhbnVwKTtcbiAgICBjYWxsLm9uKCdyZWplY3QnLCBjbGVhbnVwKTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIEVYQUNUIHJpbmdpbmcgQ2FsbCBmb3IgYSBnaXZlbiBVSSBlbnRyeSBpZCAocGFydGljaXBhbnQvcmVjb3JkIGlkKS5cbiAgLy8gRmFsbHMgYmFjayB0byB0aGUgbW9zdCByZWNlbnQgaW5jb21pbmcgY2FsbCBzbyBvbGRlciBzaW5nbGUtY2FsbCBmbG93cyBzdGlsbCB3b3JrLlxuICBnZXRJbmNvbWluZ0NhbGxCeUlkKGlkOiBhbnkpIHtcbiAgICBpZiAoaWQgIT0gbnVsbCAmJiB0aGlzLmluY29taW5nQ2FsbHNNYXAuaGFzKGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdDYWxsc01hcC5nZXQoaWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsRGV0YWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5jb21pbmdDYWxsRGV0YWlsLnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddID09IGlkID8gdGhpcy5pbmNvbWluZ0NhbGxEZXRhaWwgOiBudWxsO1xuICB9XG5cbiAgcHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKSB7XG4gICAgaWYgKHRoaXMuc3BhcmVEZXZpY2UpIHtcbiAgICAgIHJldHVybjsgLy8gYSBmcmVlIHNwYXJlIGlzIGFscmVhZHkgd2FpdGluZ1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaW5jb21pbmdDYWxsVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUud2FybigncHJlcGFyZVNwYXJlRGV2aWNlOiBubyB0b2tlbiBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BhcmU6IGFueSA9IG5ldyBEZXZpY2UodGhpcy5pbmNvbWluZ0NhbGxUb2tlbiwgeyBhbGxvd0luY29taW5nV2hpbGVCdXN5OiB0cnVlLCB0b2tlblJlZnJlc2hNczogdGhpcy5UT0tFTl9SRUZSRVNIX01TIH0pO1xuICAgIHNwYXJlLl9vd25zQWNjZXB0ZWRDYWxsID0gZmFsc2U7XG5cbiAgICAvLyBGYWxsYmFjayBpbiBjYXNlIHRoZSBwcmltYXJ5IGRldmljZSBpcyBnb25lL3JlcGxhY2VkOiB0aGUgc3BhcmUgY2FuIHRyaWdnZXJcbiAgICAvLyB0aGUgc2hhcmVkIHJlZnJlc2ggaXRzZWxmIChyZWZyZXNoRGV2aWNlVG9rZW4gZGVkdXBlcyBjb25jdXJyZW50IHJlcXVlc3RzKS5cbiAgICBzcGFyZS5vbigndG9rZW5XaWxsRXhwaXJlJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoRGV2aWNlVG9rZW4oKTtcbiAgICB9KTtcblxuICAgIHNwYXJlLm9uKCdyZWdpc3RlcmVkJywgKCkgPT4ge1xuICAgICAgdGhpcy5zcGFyZURldmljZVJlYWR5ID0gdHJ1ZTtcbiAgICAgIC8vIEFwcGx5IHRoZSBtdXRlIHByZWZlcmVuY2UgaGVyZSDigJQgYHNwYXJlLmF1ZGlvYCBpcyBvbmx5IHJlYWR5IGFmdGVyIHJlZ2lzdHJhdGlvbixcbiAgICAgIC8vIHNvIHRoZSBjYWxsIGFib3ZlIChiZWZvcmUgcmVnaXN0ZXIoKSkgd2FzIGFsd2F5cyBhIG5vLW9wLlxuICAgICAgdHJ5IHsgc3BhcmUuYXVkaW8/LmluY29taW5nKCF0aGlzLmlzSW5jb21pbmdNdXRlZCk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICBjb25zb2xlLmxvZygnU3BhcmUgZGV2aWNlIHJlZ2lzdGVyZWQg4oCTIHJlYWR5IGZvciB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwnKTtcbiAgICB9KTtcblxuICAgIHNwYXJlLm9uKCdpbmNvbWluZycsIChjYWxsOiBDYWxsIHwgYW55KSA9PiB7XG4gICAgICAvLyBHdWFyZDogb25jZSB0aGlzIHNwYXJlIGlzIGFscmVhZHkgaGFuZGxpbmcgYSBjYWxsIChwZW5kaW5nIG9yIGFjY2VwdGVkKSxcbiAgICAgIC8vIGlnbm9yZSBhbnkgZnVydGhlciBpbmNvbWluZyBldmVudHMgc28gYW5vdGhlciBzcGFyZSBjYW4gdGFrZSB0aGUgbmV4dCBjYWxsLlxuICAgICAgaWYgKHNwYXJlLl9vd25zQWNjZXB0ZWRDYWxsIHx8IHNwYXJlLl9wZW5kaW5nSW5jb21pbmdDYWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhbGxTaWQgPSBjYWxsPy5wYXJhbWV0ZXJzPy5bJ0NhbGxTaWQnXTtcbiAgICAgIC8vIFNhbWUgc2hhcmVkLWlkZW50aXR5IGZhbi1vdXQgZ3VhcmQgYXMgdGhlIHByaW1hcnkgZGV2aWNlJ3MgJ2luY29taW5nJyBoYW5kbGVyOlxuICAgICAgLy8gaWYgYW5vdGhlciBEZXZpY2UgYWxyZWFkeSBjbGFpbWVkIHRoaXMgQ2FsbFNpZCwgdGhpcyBpcyBhIGR1cGxpY2F0ZSBsZWcgb2ZcbiAgICAgIC8vIHRoZSBzYW1lIGNhbGwsIG5vdCBhIGdlbnVpbmVseSBuZXcgY29uY3VycmVudCBjYWxsIOKAlCBpZ25vcmUgaXQuXG4gICAgICBpZiAoY2FsbFNpZCAmJiB0aGlzLmluY29taW5nQ2FsbHNNYXAuaGFzKGNhbGxTaWQpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzcGFyZSBkZXZpY2U6IGR1cGxpY2F0ZSBpbmNvbWluZyBmb3IgYWxyZWFkeS10cmFja2VkIGNhbGwsIGlnbm9yaW5nJywgY2FsbFNpZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNwYXJlLl9wZW5kaW5nSW5jb21pbmdDYWxsID0gY2FsbDtcblxuICAgICAgLy8gVHJhbnNpdGlvbiB0aGlzIHNwYXJlIGZyb20gXCJmcmVlXCIg4oaSIFwicGVuZGluZ1wiOiByZW1vdmUgaXQgYXMgdGhlIGFjdGl2ZVxuICAgICAgLy8gc3BhcmVEZXZpY2UgYW5kIHRyYWNrIGl0IGJ5IENhbGxTaWQgc28gb25Db25jdXJyZW50Q2FsbEFjY2VwdGVkIGNhbiBmaW5kIGl0LlxuICAgICAgaWYgKHRoaXMuc3BhcmVEZXZpY2UgPT09IHNwYXJlKSB7XG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNwYXJlRGV2aWNlUmVhZHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjYWxsU2lkKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5zZXQoY2FsbFNpZCwgc3BhcmUpO1xuICAgICAgfVxuICAgICAgLy8gSW1tZWRpYXRlbHkgYXJtIHRoZSBORVhUIGZyZWUgc3BhcmUgc28gaXQgaXMgcmVhZHkgZm9yIGNhbGwgTisyIHdpdGhvdXRcbiAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSB1c2VyIHRvIGFjY2VwdCB0aGlzIGNhbGwgZmlyc3QuXG4gICAgICB0aGlzLnByZXBhcmVEZXZpY2UyRm9ySW5jb21pbmdDYWxsKCk7XG5cbiAgICAgIGlmICh0aGlzLmlzSW5jb21pbmdNdXRlZCkge1xuICAgICAgICB0cnkgeyBzcGFyZS5hdWRpbz8uaW5jb21pbmcoZmFsc2UpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgICAgdGhpcy50cmFja0luY29taW5nQ2FsbChjYWxsKTtcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGV0YWlsID0gY2FsbDtcbiAgICAgIHRoaXMuaXNTaG93SW5jb21pbmdDYWxsID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuYnVpbGRJbmNvbWluZ05vdGlmaWNhdGlvbihjYWxsKTtcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24ubmV4dChub3RpZmljYXRpb24pO1xuICAgICAgY29uc29sZS5sb2coJ3NwYXJlIGRldmljZTogaW5jb21pbmcgY2FsbCcsIGNhbGwpO1xuICAgIH0pO1xuXG4gICAgc3BhcmUub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1NwYXJlIGRldmljZSBlcnJvcjonLCBlcnJvcik7XG4gICAgfSk7XG5cbiAgICBzcGFyZS5yZWdpc3RlcigpO1xuICAgIHRoaXMuc3BhcmVEZXZpY2UgPSBzcGFyZTtcbiAgICBjb25zb2xlLmxvZygnc3BhcmUgZGV2aWNlIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyaW5nJyk7XG4gIH1cblxuICBvbkNvbmN1cnJlbnRDYWxsQWNjZXB0ZWQoYWNjZXB0ZWRDYWxsOiBhbnkpIHtcbiAgICBjb25zdCBzaWQgPSBhY2NlcHRlZENhbGw/LnBhcmFtZXRlcnM/LlsnQ2FsbFNpZCddO1xuICAgIGlmIChzaWQpIHtcbiAgICAgIC8vIFByaW1hcnkgcGF0aDogdGhlIGFjY2VwdGVkIGNhbGwgd2FzIGhlbGQgYnkgYSBwZW5kaW5nIHNwYXJlIGRldmljZS5cbiAgICAgIGNvbnN0IGRldiA9IHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5nZXQoc2lkKTtcbiAgICAgIGlmIChkZXYpIHtcbiAgICAgICAgZGV2Ll9vd25zQWNjZXB0ZWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHRyYURldmljZXMuc2V0KHNpZCwgZGV2KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmRlbGV0ZShzaWQpO1xuICAgICAgfVxuICAgICAgLy8gTGVnYWN5IGZhbGxiYWNrOiBvbGQgc2luZ2xlLXNwYXJlIHBhdGggKHNwYXJlIHN0aWxsIGhvbGRzIHRoZSBjYWxsKS5cbiAgICAgIGVsc2UgaWYgKHRoaXMuc3BhcmVEZXZpY2UgJiYgdGhpcy5zcGFyZURldmljZS5fcGVuZGluZ0luY29taW5nQ2FsbCA9PT0gYWNjZXB0ZWRDYWxsKSB7XG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2UuX293bnNBY2NlcHRlZENhbGwgPSB0cnVlO1xuICAgICAgICB0aGlzLmV4dHJhRGV2aWNlcy5zZXQoc2lkLCB0aGlzLnNwYXJlRGV2aWNlKTtcbiAgICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3BhcmVEZXZpY2VSZWFkeSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBFbnN1cmUgYSBmcmVlIHNwYXJlIGlzIGFsd2F5cyByZWFkeSBmb3IgdGhlIG5leHQgY29uY3VycmVudCBjYWxsLlxuICAgIHRoaXMucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcbiAgfVxuXG4gIHJlbGVhc2VDb25jdXJyZW50Q2FsbERldmljZShjYWxsU2lkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkZXYgPSB0aGlzLmV4dHJhRGV2aWNlcy5nZXQoY2FsbFNpZCk7XG4gICAgaWYgKGRldikge1xuICAgICAgdHJ5IHsgZGV2LmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLmRlbGV0ZShjYWxsU2lkKTtcbiAgICAgIGNvbnNvbGUubG9nKCdyZWxlYXNlZCBjb25jdXJyZW50LWNhbGwgZGV2aWNlIGZvcicsIGNhbGxTaWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBbHNvIHJlbGVhc2UgcGVuZGluZyBkZXZpY2VzIHRoYXQgd2VyZSBjYW5jZWxsZWQgYmVmb3JlIGFjY2VwdGFuY2UuXG4gICAgY29uc3QgcGVuZGluZ0RldiA9IHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5nZXQoY2FsbFNpZCk7XG4gICAgaWYgKHBlbmRpbmdEZXYpIHtcbiAgICAgIHRyeSB7IHBlbmRpbmdEZXYuZGVzdHJveSgpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmRlbGV0ZShjYWxsU2lkKTtcbiAgICB9XG4gIH1cblxuICAvLyBXaGVuIG5vIGFjY2VwdGVkIGNhbGxzIHJlbWFpbiwgdGVhciBkb3duIGFsbCBzcGFyZS9wZW5kaW5nL2V4dHJhIGRldmljZXMgc29cbiAgLy8gdGhlIHByaW1hcnkgZGV2aWNlIGNsZWFubHkgaGFuZGxlcyB0aGUgbmV4dCBmcmVzaCBpbmNvbWluZyBjYWxsLlxuICB0ZWFyZG93blNwYXJlRGV2aWNlc0lmSWRsZSgpIHtcbiAgICBpZiAodGhpcy5hY2NlcHRlZENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leHRyYURldmljZXMuZm9yRWFjaCgoZCkgPT4geyB0cnkgeyBkLmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge30gfSk7XG4gICAgdGhpcy5leHRyYURldmljZXMuY2xlYXIoKTtcbiAgICB0aGlzLnBlbmRpbmdJbmNvbWluZ0RldmljZXMuZm9yRWFjaCgoZCkgPT4geyB0cnkgeyBkLmRlc3Ryb3koKTsgfSBjYXRjaCAoXykge30gfSk7XG4gICAgdGhpcy5wZW5kaW5nSW5jb21pbmdEZXZpY2VzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc3BhcmVEZXZpY2UpIHtcbiAgICAgIHRyeSB7IHRoaXMuc3BhcmVEZXZpY2UuZGVzdHJveSgpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgdGhpcy5zcGFyZURldmljZSA9IG51bGw7XG4gICAgICB0aGlzLnNwYXJlRGV2aWNlUmVhZHkgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wcmltYXJ5SGFzQ2FsbCA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKCdzcGFyZS9leHRyYSBkZXZpY2VzIHRvcm4gZG93biAoaWRsZSknKTtcbiAgfVxuXG4gIC8vIEJhY2t3YXJkcy1jb21wYXRpYmxlIGFsaWFzIGtlcHQgZm9yIGV4aXN0aW5nIGNhbGwgc2l0ZXMuXG4gIGRlc3Ryb3lEZXZpY2UyKCkge1xuICAgIHRoaXMudGVhcmRvd25TcGFyZURldmljZXNJZklkbGUoKTtcbiAgfVxuXG4gIC8vIFVzZXItY29udHJvbGxlZCBzd2l0Y2ggKGluIHRoZSBjYWxsLXByb2dyZXNzIFVJKS4gV2hlbiBPTiwgYSBuZXcgaW5jb21pbmdcbiAgLy8gY2FsbCdzIGJ1aWx0LWluIFR3aWxpbyByaW5ndG9uZSBpcyBzaWxlbmNlZCBzbyBpdCBkb2VzIG5vdCBkaXN0dXJiIHRoZVxuICAvLyBvbmdvaW5nIGNhbGwuIFNvdXJjZSBvZiB0cnV0aCBzbyBuZXdseSBjcmVhdGVkIChzcGFyZSkgZGV2aWNlcyBpbmhlcml0IGl0LlxuICBpc0luY29taW5nTXV0ZWQgPSBmYWxzZTtcblxuICAvLyBBcHBseSB0aGUgY3VycmVudCBtdXRlIHByZWZlcmVuY2UgdG8gZXZlcnkgbGl2ZSBEZXZpY2UgKHByaW1hcnkgKyBzcGFyZSArXG4gIC8vIGFueSBjb25jdXJyZW50LWNhbGwgZGV2aWNlcykgdmlhIFR3aWxpbydzIG93biBkZXZpY2UuYXVkaW8uaW5jb21pbmcoKS5cbiAgYXBwbHlJbmNvbWluZ011dGUoKSB7XG4gICAgY29uc3QgZW5hYmxlZCA9ICF0aGlzLmlzSW5jb21pbmdNdXRlZDsgLy8gcmluZ3RvbmUgZW5hYmxlZCA9IE5PVCBtdXRlZFxuICAgIGNvbnN0IGFwcGx5ID0gKGRldjogYW55KSA9PiB7XG4gICAgICB0cnkgeyBkZXY/LmF1ZGlvPy5pbmNvbWluZz8uKGVuYWJsZWQpOyB9IGNhdGNoIChfKSB7fVxuICAgIH07XG4gICAgYXBwbHkodGhpcy5kZXZpY2UpO1xuICAgIGFwcGx5KHRoaXMuc3BhcmVEZXZpY2UpO1xuICAgIHRoaXMuZXh0cmFEZXZpY2VzLmZvckVhY2goYXBwbHkpO1xuICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKGFwcGx5KTtcbiAgfVxuXG4gIC8vIFRvZ2dsZS9zZXQgdGhlIG11dGUgc3dpdGNoIGFuZCBpbW1lZGlhdGVseSBhcHBseSBpdC5cbiAgc2V0SW5jb21pbmdNdXRlZChtdXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNJbmNvbWluZ011dGVkID0gbXV0ZWQ7XG4gICAgdGhpcy5hcHBseUluY29taW5nTXV0ZSgpO1xuICAgIGlmIChtdXRlZCkge1xuICAgICAgLy8gZGV2aWNlLmF1ZGlvLmluY29taW5nKGZhbHNlKSBvbmx5IHByZXZlbnRzIGZ1dHVyZSByaW5ncyDigJQgaXQgZG9lcyBOT1Qgc3RvcFxuICAgICAgLy8gYSBjYWxsIHRoYXQgaXMgYWxyZWFkeSByaW5naW5nLiBTdG9wIHRoZSBhY3RpdmUgcmluZyBkaXJlY3RseSB2aWEgc291bmRjYWNoZS5cbiAgICAgIGNvbnN0IHN0b3BSaW5nID0gKGRldjogYW55KSA9PiB7XG4gICAgICAgIHRyeSB7IGRldj8uX3NvdW5kY2FjaGU/LmdldD8uKCdpbmNvbWluZycpPy5zdG9wPy4oKTsgfSBjYXRjaCAoXykge31cbiAgICAgIH07XG4gICAgICBzdG9wUmluZyh0aGlzLmRldmljZSk7XG4gICAgICBzdG9wUmluZyh0aGlzLnNwYXJlRGV2aWNlKTtcbiAgICAgIHRoaXMuZXh0cmFEZXZpY2VzLmZvckVhY2goKGRldjogYW55KSA9PiBzdG9wUmluZyhkZXYpKTtcbiAgICAgIHRoaXMucGVuZGluZ0luY29taW5nRGV2aWNlcy5mb3JFYWNoKChkZXY6IGFueSkgPT4gc3RvcFJpbmcoZGV2KSk7XG4gICAgfVxuICB9XG5cbiAgYWRkSW5jb21pbmdQYXJ0aWNpcGFudChwYXJ0aWNpcGFudElkOiBzdHJpbmcsIGNvbmZlcmVuY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGAke2Vudmlyb25tZW50LmFwaVVybH0vdXRpbGl0aWVzL2V4dC9hZGQvaW5jb21pbmcvcGFydGljaXBhbnQvJHtwYXJ0aWNpcGFudElkfS8ke2NvbmZlcmVuY2VJZH1gLGh0dHBPcHRpb25zKTtcbiAgfSBcbiAgY29ubmVjdChkYXRhPzogYW55KXtcbiAgICBpZiAodGhpcy5kZXZpY2UuX2FjdGl2ZUNhbGwpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcyNDQtdGVzdCcpXG4gICAgICB0aGlzLmRldmljZS5kaXNjb25uZWN0QWxsKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRldmljZS5jb25uZWN0KHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBUb2tlbjogdGhpcy5jb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCB8fCBkYXRhLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgQ29uZmVyZW5jZU5hbWU6IHRoaXMuY29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlTmFtZSB8fCBkYXRhLmNvbmZlcmVuY2VOYW1lXG4gICAgICB9LFxuICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHsgZGV2aWNlSWQ6ICdkZWZhdWx0JyB9IH0sXG4gICAgfSlcbiAgfVxufVxuIl19