@vgroup/dialbox 0.6.73 → 0.6.75

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.
@@ -102,14 +102,6 @@ export class CallProgressComponent {
102
102
  if (this.extensionService.userId) {
103
103
  this.userId = this.extensionService.userId;
104
104
  }
105
- // this.twilioService.currentCall.subscribe((incoming: any) => {
106
- // if (!incoming) { return; }
107
- // console.log('TwilioService.currentCall emitted:', incoming);
108
- // console.log('Concurrent incoming detected - showing banner');
109
- // this.isConcurrentIncoming = true;
110
- // this.incomingCallDiv = true;
111
- // this.cdr.detectChanges();
112
- // });
113
105
  }
114
106
  catch (e) {
115
107
  console.error('Error subscribing to incoming calls:', e);
@@ -186,7 +178,7 @@ export class CallProgressComponent {
186
178
  isHold: res?.isHold,
187
179
  isConferenceHold: ourNumberInfo?.isHold || false,
188
180
  isMute: false,
189
- isConference: res?.isConference || this.isConference,
181
+ isConference: this.isConference || res?.isConference,
190
182
  isAcceptCall: res?.direction == "incoming-call" ? this.getStatus(res) : true,
191
183
  dial: true,
192
184
  phone: res?.direction == "incoming-call" ? res?.from : res?.to,
@@ -320,8 +312,7 @@ export class CallProgressComponent {
320
312
  participantId: [holdCallInfo?.id],
321
313
  conferenceId: holdCallInfo?.conferenceId,
322
314
  hold: false,
323
- mute: holdCallInfo?.mute || false,
324
- conference: holdCallInfo?.isConference || false
315
+ mute: holdCallInfo?.mute || false
325
316
  });
326
317
  this.getAllParticipants(holdCallInfo?.conferenceId);
327
318
  this.isUnholdConferenceCall = false;
@@ -372,27 +363,28 @@ export class CallProgressComponent {
372
363
  }));
373
364
  }
374
365
  else if (!this.newIncomingCallsList?.length) {
375
- setInterval(() => {
376
- this.isRinging = false;
377
- this.isConcurrentIncoming = false;
378
- this.incomingCallDiv = false;
379
- if (this.call) {
380
- this.call.disconnect();
381
- }
382
- this.currentCallList = [];
383
- this.currentCall = {};
384
- this.cdr.detectChanges();
385
- if (this.isRinging) {
386
- this.incomeingCallSocketService.pause();
387
- }
388
- this.isRinging = false;
389
- this.isClickExpand = false;
390
- this.isCallInProgress = false;
391
- this.isConferenceCallHold = false;
392
- this.stopTimer();
393
- this.cdr.detectChanges();
394
- this.endCallEvent.emit();
395
- }, 500);
366
+ // setInterval(() => {
367
+ this.isRinging = false;
368
+ this.isConcurrentIncoming = false;
369
+ this.incomingCallDiv = false;
370
+ if (this.call) {
371
+ this.call.disconnect();
372
+ }
373
+ this.currentCallList = [];
374
+ this.currentCall = {};
375
+ this.cdr.detectChanges();
376
+ if (this.isRinging) {
377
+ this.incomeingCallSocketService.pause();
378
+ }
379
+ this.isRinging = false;
380
+ this.isClickExpand = false;
381
+ this.isCallInProgress = false;
382
+ this.isConferenceCallHold = false;
383
+ this.stopTimer();
384
+ this.cdr.detectChanges();
385
+ console.log('431');
386
+ // this.endCallEvent.emit();
387
+ // },500);
396
388
  }
397
389
  ;
398
390
  }
@@ -626,8 +618,7 @@ export class CallProgressComponent {
626
618
  participantId: [c.participantId],
627
619
  conferenceId: c?.conferenceId,
628
620
  hold: !c.isHold,
629
- mute: c?.mute || false,
630
- conference: c.isConference || false
621
+ mute: c?.mute || false
631
622
  });
632
623
  c.isHold = !c.isHold;
633
624
  this.cdr.detectChanges();
@@ -818,6 +809,7 @@ export class CallProgressComponent {
818
809
  this.stopTimer();
819
810
  this.onEndCall({}, isAllCallEnd);
820
811
  if (!this.currentCallList?.length) {
812
+ console.log(896);
821
813
  this.endCallEvent.emit();
822
814
  }
823
815
  }
@@ -896,8 +888,7 @@ export class CallProgressComponent {
896
888
  participantId: [ourNumberInfo?.id],
897
889
  conferenceId: ourNumberInfo?.conferenceId,
898
890
  hold: true,
899
- mute: ourNumberInfo?.mute || false,
900
- conference: ourNumberInfo.isConference || false
891
+ mute: ourNumberInfo?.mute || false
901
892
  });
902
893
  this.isConferenceCallHold = true;
903
894
  }
@@ -933,6 +924,7 @@ export class CallProgressComponent {
933
924
  swal("Error", res?.message.join("<br/>"), "error");
934
925
  this.incomeingCallSocketService.pause();
935
926
  this.isIncomingCallBtnDisable = false;
927
+ console.log('1023');
936
928
  this.endCallEvent.emit(data);
937
929
  }
938
930
  });
@@ -989,13 +981,6 @@ export class CallProgressComponent {
989
981
  participantIDs.push(c?.participantId);
990
982
  }
991
983
  });
992
- await this.onholdOrUnholdParticipant({
993
- participantId: participantIDs,
994
- conferenceId: this.currentCall.conferenceId,
995
- hold: null,
996
- mute: null,
997
- conference: true
998
- });
999
984
  // Put current call on hold
1000
985
  // Add participant to the conference
1001
986
  let data = await this.addParticipantToCall({
@@ -1011,8 +996,9 @@ export class CallProgressComponent {
1011
996
  this.isCallOnHold = true;
1012
997
  this.showRingAnimation = true;
1013
998
  this.isConference = true;
999
+ participantIDs.push(data?.participantId);
1014
1000
  await this.onholdOrUnholdParticipant({
1015
- participantId: [data?.participantId],
1001
+ participantId: participantIDs,
1016
1002
  conferenceId: this.currentCall.conferenceId,
1017
1003
  hold: null,
1018
1004
  mute: null,
@@ -1085,8 +1071,7 @@ export class CallProgressComponent {
1085
1071
  participantId: [ourNumberInfo?.id],
1086
1072
  conferenceId: ourNumberInfo?.conferenceId,
1087
1073
  hold: true,
1088
- mute: ourNumberInfo?.mute || false,
1089
- conference: ourNumberInfo?.isConference || false
1074
+ mute: ourNumberInfo?.mute || false
1090
1075
  });
1091
1076
  this.isConferenceCallHold = true;
1092
1077
  this.onAddNewCall(callData, true);
@@ -1221,8 +1206,7 @@ export class CallProgressComponent {
1221
1206
  participantId: [participantInfo?.id],
1222
1207
  conferenceId: participantInfo?.conferenceId,
1223
1208
  hold: false,
1224
- mute: participantInfo?.mute || false,
1225
- conference: participantInfo?.isConference || false
1209
+ mute: participantInfo?.mute || false
1226
1210
  });
1227
1211
  // this.isConferenceCallHold = true;
1228
1212
  }
@@ -1234,8 +1218,7 @@ export class CallProgressComponent {
1234
1218
  participantId: [participantInfo?.id],
1235
1219
  conferenceId: participantInfo?.conferenceId,
1236
1220
  hold: true,
1237
- mute: participantInfo?.mute || false,
1238
- conference: participantInfo?.isConference || false
1221
+ mute: participantInfo?.mute || false
1239
1222
  });
1240
1223
  // this.isConferenceCallHold = true;
1241
1224
  }
@@ -1245,8 +1228,7 @@ export class CallProgressComponent {
1245
1228
  participantId: [c?.participantId],
1246
1229
  conferenceId: c.conferenceId,
1247
1230
  hold: true,
1248
- mute: c?.mute || false,
1249
- conference: c?.isConference || false
1231
+ mute: c?.mute || false
1250
1232
  });
1251
1233
  // this.isConferenceCallHold = true;
1252
1234
  }
@@ -1691,10 +1673,10 @@ export class CallProgressComponent {
1691
1673
  }
1692
1674
  }
1693
1675
  CallProgressComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, deps: [{ token: i1.ExtensionService }, { token: i0.ChangeDetectorRef }, { token: i2.TwilioService }, { token: i3.IpAddressService }, { token: i4.IncomeingCallSocketService }], target: i0.ɵɵFactoryTarget.Component });
1694
- CallProgressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CallProgressComponent, selector: "lib-call-progress", inputs: { callData: "callData", selectedCallerId: "selectedCallerId", newIncomingCallData: "newIncomingCallData", newIncomingCallsList: "newIncomingCallsList", callerIdList: "callerIdList", deviceId: "deviceId", callAction: "callAction", conferenceCallInfo: "conferenceCallInfo" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated", isLoadershown: "isLoadershown", endIncomingCallEvent: "endIncomingCallEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- Calling Alert -->\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\"\r\n *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\">\r\n Cancel Call\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && twilioService.isShowIncomingCall\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.image || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf)\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf)\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.conferenceName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall && twilioService.isShowIncomingCall\">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img || 'assets/images/user.jpg'\" alt=\"\"\r\n width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown\r\n Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\" > call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from ||\r\n 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to ||\r\n 'Unknown'}}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <!-- <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div> -->\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div>Participant</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.isHold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall()\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <!-- </ng-template> -->\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n\r\n <h3>Conference Call Warning</h3>\r\n\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">Call Disconnected</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1676
+ CallProgressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CallProgressComponent, selector: "lib-call-progress", inputs: { callData: "callData", selectedCallerId: "selectedCallerId", newIncomingCallData: "newIncomingCallData", newIncomingCallsList: "newIncomingCallsList", callerIdList: "callerIdList", deviceId: "deviceId", callAction: "callAction", conferenceCallInfo: "conferenceCallInfo" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated", isLoadershown: "isLoadershown", endIncomingCallEvent: "endIncomingCallEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- Calling Alert -->\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\"\r\n *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\">\r\n Cancel Call\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && twilioService.isShowIncomingCall\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.image || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf)\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf)\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.conferenceName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall\">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img || 'assets/images/user.jpg'\" alt=\"\"\r\n width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown\r\n Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable || !twilioService.isShowIncomingCall\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\" > call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from ||\r\n 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to ||\r\n 'Unknown'}}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <!-- <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div> -->\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div>Participant</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.isHold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall()\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <!-- </ng-template> -->\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n\r\n <h3>Conference Call Warning</h3>\r\n\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">Call Disconnected</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:0;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1695
1677
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, decorators: [{
1696
1678
  type: Component,
1697
- args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- Calling Alert -->\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\"\r\n *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\">\r\n Cancel Call\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && twilioService.isShowIncomingCall\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.image || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf)\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf)\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.conferenceName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall && twilioService.isShowIncomingCall\">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img || 'assets/images/user.jpg'\" alt=\"\"\r\n width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown\r\n Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\" > call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from ||\r\n 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to ||\r\n 'Unknown'}}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <!-- <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div> -->\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div>Participant</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.isHold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall()\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <!-- </ng-template> -->\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n\r\n <h3>Conference Call Warning</h3>\r\n\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">Call Disconnected</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}\n"] }]
1679
+ args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- Calling Alert -->\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\"\r\n *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\">\r\n Cancel Call\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && twilioService.isShowIncomingCall\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.image || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf)\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf)\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.conferenceName}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall\">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img || 'assets/images/user.jpg'\" alt=\"\"\r\n width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown\r\n Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable || !twilioService.isShowIncomingCall\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\" > call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from ||\r\n 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to ||\r\n 'Unknown'}}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <!-- <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div> -->\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : '&nbsp;'}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div>Participant</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.isHold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall()\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <!-- </ng-template> -->\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' :\r\n c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from ||\r\n 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n\r\n <h3>Conference Call Warning</h3>\r\n\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">Call Disconnected</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">&#9660;</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:0;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}\n"] }]
1698
1680
  }], ctorParameters: function () { return [{ type: i1.ExtensionService }, { type: i0.ChangeDetectorRef }, { type: i2.TwilioService }, { type: i3.IpAddressService }, { type: i4.IncomeingCallSocketService }]; }, propDecorators: { callData: [{
1699
1681
  type: Input
1700
1682
  }], selectedCallerId: [{
@@ -1724,4 +1706,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1724
1706
  }], endIncomingCallEvent: [{
1725
1707
  type: Output
1726
1708
  }] } });
1727
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQXNCOUMsTUFBTSxPQUFPLHFCQUFxQjtJQXFHaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDN0UsYUFBNEIsRUFDM0IsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM3RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBcEd2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFLdEIsaUJBQVksR0FBdUIsSUFBSSxZQUFZLEVB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Qjt1R0FBckIscUJBQXFCLCtsQkM5QmxDLHczckNBOG9CTTs0RkRobkJPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7Mk9BS3BCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBbUJHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhbGwsIERldmljZSB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUd2lsaW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS90d2lsaW8uc2VydmljZSc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XHJcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcclxuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4vLi4vLi4va2V5cGFkJztcclxuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBJbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvaW5jb21laW5nLWNhbGwtc29ja2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJcEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pcC1hZGRyZXNzLnNlcnZpY2UnO1xyXG5cclxuXHJcbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XHJcbiAgY2FsbFNpZDogc3RyaW5nO1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2FsbFN0YXR1c1Jlc3BvbnNlIHtcclxuICBjYWxsRGV0YWlsczogQ2FsbERldGFpbHM7XHJcbiAgcmVzcG9uc2U6IHN0cmluZztcclxuICBlcnJvclR5cGU6IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNhbGwtcHJvZ3Jlc3MnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsbFByb2dyZXNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGNhbGxEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRDYWxsZXJJZDogYW55O1xyXG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbERhdGE/OiBDYWxsO1xyXG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcclxuICBASW5wdXQoKSBjYWxsZXJJZExpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRldmljZUlkOiBhbnk7XHJcbiAgQElucHV0KCkgY2FsbEFjdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIGNvbmZlcmVuY2VDYWxsSW5mbzogYW55O1xyXG4gIHVzZXJJZDogYW55O1xyXG4gIEBPdXRwdXQoKSBlbmRDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBtaW5pbWlzZUV2ZW50OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgZGV2aWNlPzogRGV2aWNlO1xyXG4gIGNhbGwhOiBDYWxsIHwgYW55O1xyXG4gIHNob3dSaW5nQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXI6IHN0cmluZyA9ICcwMDowMCc7XHJcbiAgaW50ZXJ2YWxJZDogYW55O1xyXG4gIHNob3dLZXlwYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XHJcbiAgY2FsbElucHV0OiBzdHJpbmcgPSAnJztcclxuICBpc011dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNiYWxlRW5kQ2FsbEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDb2xsb3BzID0gZmFsc2U7XHJcbiAgY3VycmVudENhbGw6IGFueTtcclxuICAvLyBDb25mZXJlbmNlIHN0YXRlIGZsYWdcclxuICBpc0NvbmZlcmVuY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc091dGdvaW5nQ2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLy8gSW5jb21pbmcgY2FsbCB2YXJpYWJsZXNcclxuICBpbmNvbWluZ0NhbGxEaXY6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGlzTG9hZGVyc2hvd246IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgZW5kSW5jb21pbmdDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLy8gUmVjb3JkaW5nIHZhcmlhYmxlc1xyXG4gIGNhbGxTaWQ6IGFueTtcclxuICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUGF1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgdGltZUVsYXBzZWQgPSAwOyAvLyBpbiBzZWNvbmRzXHJcbiAgcmVjb3JkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluY29taW5nQ2FsbFNpZDogYW55O1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZyA9ICdyaW5naW5nJztcclxuICBpbmNvbWluZ1JlY29yZENhbGw/OiBhbnk7XHJcbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGw6IGFueTtcclxuICBzaG93Q29udGFjdHNQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQWRkUmVtb3ZlUGFydGljaXBhbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NvbmN1cnJlbnRJbmNvbWluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhlbGRDYWxsPzogQ2FsbDtcclxuICBpc0NhbGxPbkhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjb250YWN0czogYW55W10gPSBbXTtcclxuICBjdXJyZW50Q2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgY29uZmVyZW5jZUlkOiBhbnk7XHJcbiAgYWxsUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgaXNDbGlja0V4cGFuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ2FsbEluUHJvZ3Jlc3MhOiBib29sZWFuO1xyXG4gIGlzQ3VycmVudEluY29taW5nQ2FsbExpc3Q6IGFueSA9IFtdO1xyXG4gIGlzQ29uZmVyZW5jZUNhbGxIb2xkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRVc2VySW5mbzogYW55O1xyXG4gIGlzU2VhcmNoVmlzaWJsZSA9IGZhbHNlO1xyXG4gIGlzRXhwYW5kZWQgPSBmYWxzZTtcclxuICBzZWFyY2hUZXh0ID0gJyc7XHJcbiAgZmlsdGVyZWRMaXN0OiBhbnkgPSBbXTtcclxuICBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdDogYW55O1xyXG4gIHNob3dCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1Jpbmdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0RpcmVjdENhbGxPcHRpb25TaG93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlhbEFsZXJ0ID0ge1xyXG4gICAgbXNnOiAnJyxcclxuICAgIHNob3c6IGZhbHNlXHJcbiAgfVxyXG4gIGxlZnRQYXJ0aWNpcGVudDogYW55ID0ge307XHJcbiAgY29uZmVyZW5jZUNhbGxMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhvc3RudW1iZXI6IGFueTtcclxuICBpc05ld0FkZGVkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRldmljZU51bWJlckxpc3Q6IGFueSA9IFtdO1xyXG4gIG91ck51bWJlckluZm86IGFueSA9IHt9O1xyXG4gIGN1cnJlbnRDb25mZXJlbmNlQ2FsbDogYW55ID0ge307XHJcbiAgaXNSZWFzb25DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBbGxBY2NlcHRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxlYXZlUmVhc29uOiBzdHJpbmcgPSAnJztcclxuICAvLyAyNC1ob3VyIHRpbWUgcGlja2VyXHJcbiAgbGVhdmVIb3VyOiBzdHJpbmcgPSAnJztcclxuICBsZWF2ZU1pbnV0ZTogc3RyaW5nID0gJyc7XHJcbiAgaG91cnM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKTtcclxuICBtaW51dGVzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDYwIH0sIChfLCBpKSA9PiBpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSk7XHJcbiAgc2hvd0hvdXJEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dNaW51dGVEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkQ29uZjogYW55O1xyXG4gIHNob3dDb25mZXJlbmNlV2FybmluZ01vZGFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcGVuZGluZ0NhbGxEYXRhOiBhbnkgPSBudWxsO1xyXG4gIGNhbGxOdW1iZXJUb2FzdCA9IHtcclxuICAgIHNob3c6IGZhbHNlLFxyXG4gICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgbnVtYmVyOiAnJyxcclxuICAgIGRpc3BsYXlOdW06ICcnXHJcbiAgfTtcclxuICBpc1VuaG9sZENvbmZlcmVuY2VDYWxsOiBhbnk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcclxuICAgIHByaXZhdGUgaXBTZXJ2aWNlOiBJcEFkZHJlc3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZTogSW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2VcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdDYWxsIFByb2dyZXNzIENvbXBvbmVudCcpO1xyXG4gICAgdGhpcy5jYWxsID0gdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGw7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdDYWxsIFByb2dyZXNzIENvbXBvbmVudCBuZ09uSW5pdCcpO1xyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGluY29taW5nIGNhbGxzIGZyb20gVHdpbGlvU2VydmljZVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uU2VydmljZS51c2VySWQpIHtcclxuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS51c2VySWQ7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy50d2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsLnN1YnNjcmliZSgoaW5jb21pbmc6IGFueSkgPT4ge1xyXG4gICAgICAvLyAgIGlmICghaW5jb21pbmcpIHsgcmV0dXJuOyB9XHJcbiAgICAgIC8vICAgY29uc29sZS5sb2coJ1R3aWxpb1NlcnZpY2UuY3VycmVudENhbGwgZW1pdHRlZDonLCBpbmNvbWluZyk7XHJcbiAgICAgIC8vICAgY29uc29sZS5sb2coJ0NvbmN1cnJlbnQgaW5jb21pbmcgZGV0ZWN0ZWQgLSBzaG93aW5nIGJhbm5lcicpO1xyXG4gICAgICAvLyAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSB0cnVlO1xyXG4gICAgICAvLyAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gdHJ1ZTtcclxuICAgICAgLy8gICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIC8vIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBpbmNvbWluZyBjYWxsczonLCBlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICAgdGhpcy5HZXRDb250YWN0c0xpc3QoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnVzZXJJZCkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snY2FsbERhdGEnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/LmlzSW5jb21pbmdDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0ZXN0LXN0YXJ0Q2FsbDEyMycsIGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKVxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAuLi5jaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICAgIGlkOiAnMTI1JyxcclxuICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgIHBob25lOiBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8ucGhvbmUsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiAnMTIxJyxcclxuICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoIHx8IGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LnByZXZpb3VzVmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZU51bWJlckxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IGkgPT0gMCA/IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0uY29uZmVyZW5jZUlkIDogdGhpcy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICBsZXQgb3VyTnVtYmVySW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHRoaXMuaXNNdXRlID0gIW91ck51bWJlckluZm8/LmlzSG9sZCA/IG91ck51bWJlckluZm8/LmlzTXV0ZSA6IHRoaXMuaXNNdXRlO1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRjYWxsUGFydGljaXBhbnRMaXN0SUQgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKHJlcyk9PiByZXMuY29uZmVyZW5jZUlkID09IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0uY29uZmVyZW5jZUlkKS5tYXAoKHJlcyk9PiByZXMucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICBsZXQgdXBkYXRlZExpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLnBhcnRpY2lwYW50cy5tYXAoKHJlczphbnkpID0+IHJlcy5pZCk7XHJcbiAgICAgICAgICBjdXJyZW50Y2FsbFBhcnRpY2lwYW50TGlzdElELmZvckVhY2goKHBhcnRpY2lwYW50SWQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCF1cGRhdGVkTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudElkKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXNJbmZvOmFueSkgPT4gcmVzSW5mbz8ucGFydGljaXBhbnRJZCAhPT0gcGFydGljaXBhbnRJZCB8fCAocmVzSW5mbz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAhcmVzSW5mbz8uaXNBY2NlcHRDYWxsKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGlmIChvdXJOdW1iZXJJbmZvPy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLnBhcnRpY2lwYW50cy5mb3JFYWNoKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXM/Lmhvc3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdG51bWJlciA9IHJlcztcclxuICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgIGlmKG91ck51bWJlckluZm8/LmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjb250YWN0OiBhbnkgPSB7fVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFjdHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChyZXNEYXRhKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc0RhdGE/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgPT0gKHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50bylcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSByZXM/LmlkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xICYmICFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCByZXM/LmZyb21OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXM/LmlzQ29uZmVyZW5jZSB8fCB0aGlzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gLTEgJiYgKHJlcz8uaXNMZWZ0IHx8IHJlcz8uc3RhdHVzID09ICduby1hbnN3ZXInIHx8IHJlcz8uc3RhdHVzID09ICdjYW5jZWxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dDb250YWN0c1BhbmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmN1cnJlbnRDYWxsPy5qb2luZWRBdCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gLTEgJiYgIXJlcz8uaXNMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbU5hbWU6IHRoaXMuZ2V0TmFtZShyZXM/LmZyb20pIHx8IHJlcz8uZnJvbU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWc6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IG91ck51bWJlckluZm8/LmlzSG9sZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTXV0ZTogcmVzPy5pc011dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UgPyByZXMuaXNDb25mZXJlbmNlIDogdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCByZXM/LmZyb21OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGltZzogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICBpc0hvbGQ6IHJlcz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IG91ck51bWJlckluZm8/LmlzSG9sZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBpc011dGU6IHJlcz8uaXNNdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogcmVzLmlzQ29uZmVyZW5jZSA/IHJlcy5pc0NvbmZlcmVuY2UgOiB0aGlzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZVNpZDogY2FsbEluZm8/LmNvbmZlcmVuY2VTaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHJlcz8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5sZWZ0UGFydGljaXBlbnRbY2FsbEluZm8/LmNvbmZlcmVuY2VJZF0gPSBbLi4ubmV3IE1hcChjYWxsSW5mbz8ucGFydGljaXBhbnRzLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5pc0xlZnQgPT09IHRydWUpLm1hcCgoaXRlbTogYW55KSA9PiBbaXRlbT8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGl0ZW0/LnRvIHx8ICdVbmtub3duJyA6IGl0ZW0/LmZyb20sIGl0ZW1dKSkudmFsdWVzKClcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmluZ2luZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCB2YWxpZFZhbHVlcyA9IG5ldyBTZXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mbGF0TWFwKChpdGVtOiBhbnkpID0+IGl0ZW0/LnBhcnRpY2lwYW50cy5tYXAoKHZhbDogYW55KSA9PiB2YWw/LmlkKSkpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IHZhbGlkVmFsdWVzLmhhcyhpdGVtPy5wYXJ0aWNpcGFudElkKSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDYWxsOmFueSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiBpdGVtPy5wYXJ0aWNpcGFudHM/LmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDYWxsLnB1c2gocGFydGljaXBhbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzLmxlbmd0aCA9PSAyICYmIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0/LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gey4uLnRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiAhcmVzPy5pc0NvbmZlcmVuY2VIb2xkICYmICgocmVzPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlcz8uY2xpZW50ICYmICF0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzPy5mcm9tKSkgfHwgKHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlcz8udG8pKSB8fCAhcmVzPy5jbGllbnQpKX07XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsWydpc0FjY2VwdENhbGwnXT0gdHJ1ZTtcclxuICAgICAgICAgIGlmKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsWydpc0FjY2VwdENhbGwnXT0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHM/Lmxlbmd0aCA+IDIgJiYgdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1sxXT8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+ICFyZXM/LmlzQ29uZmVyZW5jZUhvbGQpO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZih0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCl7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhdGhpcy5pc05ld0FkZGVkQ2FsbCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgICAgICAgaWYgKCFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pZCkge1xyXG4gICAgICAgICAgICBsZXQgaG9sZENhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFswXS5wYXJ0aWNpcGFudHMuZmluZCgoY2FsbEluZm86IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoY2FsbEluZm8/LmZyb20pICYmIGNhbGxJbmZvPy5jbGllbnQpXHJcbiAgICAgICAgICAgICAgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjYWxsSW5mbz8udG8pICYmIGNhbGxJbmZvPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIWNhbGxJbmZvPy5pc0xlZnQgJiYgY2FsbEluZm8/LmlzSG9sZClcclxuICAgICAgICAgICAgaWYgKGhvbGRDYWxsSW5mbz8uaWQgJiYgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtob2xkQ2FsbEluZm8/LmlkXSxcclxuICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogaG9sZENhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG11dGU6IGhvbGRDYWxsSW5mbz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbmZlcmVuY2U6IGhvbGRDYWxsSW5mbz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMoaG9sZENhbGxJbmZvPy5jb25mZXJlbmNlSWQpOyBcclxuICAgICAgICAgICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCwgJ2N1cnJlbnRDb25mZXJlbmNlQ2FsbCcpXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgbGV0IHNlbGVjdGVkVXNlciA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uaWQgPT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgIGlmIChzZWxlY3RlZFVzZXIpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRVc2VyLklzVXNlckluZm9TaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gc2VsZWN0ZWRVc2VyO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGluY29taW5nQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xyXG4gICAgICAgICAgICBpZiAoaW5jb21pbmdDYWxsPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gaW5jb21pbmdDYWxsO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xpY2tFeHBhbmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHt9O1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCByZXNJbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiAhIWl0ZW0/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgIGlmIChyZXNJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0W3Jlc0luZGV4XS5Jc1VzZXJJbmZvU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHRoaXMuY3VycmVudENhbGxMaXN0W3Jlc0luZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjdXJyZW50Q2FsbExpc3QnLCB0aGlzLmN1cnJlbnRDYWxsTGlzdCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2N1cnJlbnRDYWxsJywgdGhpcy5jdXJyZW50Q2FsbCk7XHJcbiAgICAgICAgdGhpcy5pc0FsbEFjY2VwdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZXZlcnkoKGNhbGw6IGFueSkgPT4gY2FsbD8uaXNBY2NlcHRDYWxsKVxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUxpc3QgPSBbXHJcbiAgICAgICAgICAuLi5uZXcgTWFwKHRoaXMuY3VycmVudENhbGxMaXN0Lm1hcChpdGVtID0+IFtpdGVtLmNvbmZlcmVuY2VJZCwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0ID0gdW5pcXVlTGlzdC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VOYW1lOiBgQ29uZmVyZW5jZSAke2luZGV4ICsgMX1gXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgICAgICBpZih0aGlzLmNhbGwpIHtcclxuICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHt9XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzUmluZ2luZykge1xyXG4gICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzUmluZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH0sNTAwKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydjYWxsQWN0aW9uJ10/LmN1cnJlbnRWYWx1ZSAmJiB0aGlzLmNhbGxBY3Rpb24/LnR5cGUgPT0gJ3JlSm9pbicpIHtcclxuICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgIHRoaXMucmVqb2luSG9zdCh0aGlzLmNhbGxBY3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVqb2luSG9zdChjYWxsSW5mbzogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZWpvaW5QYXJ0aWNpcGVudEluZm8gPSBjYWxsSW5mbz8ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudClcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIDHvuI/ig6MgR2V0IG5ldyB0b2tlbiBmb3Igc2FtZSBjb25mZXJlbmNlXHJcbiAgICAgIGNvbnN0IHRva2VuRGF0YTogYW55ID0gYXdhaXQgdGhpcy5nZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuXHJcbiAgICAgIC8vIDLvuI/ig6MgUmVjb25uZWN0IGRldmljZVxyXG4gICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgICAgY29kZWNQcmVmZXJlbmNlczogWydvcHVzJywgJ3BjbXUnXSxcclxuICAgICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UodG9rZW5EYXRhLnRva2VuLnZhbHVlLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIHRoaXMuY2FsbCA9IGF3YWl0IHRoaXMuZGV2aWNlLmNvbm5lY3Qoe1xyXG4gICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgRnJvbTogcmVqb2luUGFydGljaXBlbnRJbmZvLmZyb20sXHJcbiAgICAgICAgICBUbzogcmVqb2luUGFydGljaXBlbnRJbmZvLnRvLFxyXG4gICAgICAgICAgRW52OiBlbnZpcm9ubWVudC5hYmIsXHJcbiAgICAgICAgICBUb2tlbjogdG9rZW5EYXRhLnRva2VuLmlkLFxyXG4gICAgICAgICAgRXh0OiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZXh0TnVtLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LmNvbmZlcmVuY2VJZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHsgZGV2aWNlSWQ6ICdkZWZhdWx0JyB9IH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGwgPSB0aGlzLmNhbGw7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmNhbGwnLCB0aGlzLmNhbGwpO1xyXG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMgPSB0aGlzLmFkZENsaWVudFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBmcm9tOiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LnRvLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICBjbGllbnRTaWQ6IHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snQ2FsbFNpZCddXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGFkZENsaWVudFBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG5cclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdSZWpvaW4gZmFpbGVkJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuICBzaG93Q2FsbGluZ1RvYXN0KG51bWJlcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdCA9IHtcclxuICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgICBudW1iZXI6IG51bWJlcixcclxuICAgICAgZGlzcGxheU51bTogbnVtYmVyXHJcbiAgICB9O1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCA3MDAwKTtcclxuICB9XHJcbiAgZ2V0U3RhdHVzKHJlczogYW55KSB7XHJcbiAgICBpZiAocmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcclxuICAgICAgcmV0dXJuIHJlcz8uY2FsbFN0YXR1cyA9PSBcInBhcnRpY2lwYW50LWpvaW5cIiB8fCByZXM/LmNhbGxTdGF0dXMgPT0gXCJwYXJ0aWNpcGFudC1tdXRlXCIgfHwgcmVzPy5jYWxsU3RhdHVzID09IFwicGFydGljaXBhbnQtaG9sZFwiIHx8IHJlcz8uY2FsbFN0YXR1cyA9PSAnY29ubmVjdGVkJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChyZXMuc3RhdHVzID09ICdhbnN3ZXJlZCcgJiYgcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgR2V0Q29udGFjdHNMaXN0KCkge1xyXG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfHwgJyc7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucmVhZENvbnRhY3RzKHRva2VuKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdBUEkgUmVzcG9uc2U6JywgcmVzKTtcclxuXHJcbiAgICAgICAgLy8gTm90ZTogQ2FwaXRhbCBCIGluIHBob25lQm9va1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnBob25lQm9vaykge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IHJlcy5waG9uZUJvb2s7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHJlcy5waG9uZUJvb2s7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ29udGFjdHMgYXJyYXk6JywgdGhpcy5jb250YWN0cyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXM7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHJlcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDb250YWN0cyBhcnJheTonLCB0aGlzLmNvbnRhY3RzKTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNvbnRhY3RzOicsIGVycm9yKTtcclxuICAgICAgICB0aGlzLmNvbnRhY3RzID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgYWRkUmVzOiBhbnk7XHJcbiAgYXN5bmMgc3RhcnRDYWxsKGNhbGxEYXRhOiBhbnksIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc29sZS5sb2coY2FsbERhdGEsICdjYWxsRGF0YScpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgY2hhbm5lbElkOiBlbnZpcm9ubWVudC5jaGFubmVsSWQsXHJcbiAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgdG86IGNhbGxEYXRhLnBob25lLFxyXG4gICAgICAgIGZyb21OdW1iZXI6IGNhbGxEYXRhLmZyb20sXHJcbiAgICAgICAgc2NvcGU6ICdsb2NhbCcsXHJcbiAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgZmlyc3RuYW1lOiBudWxsLFxyXG4gICAgICAgIGxhc3RuYW1lOiBudWxsLFxyXG4gICAgICAgIGNvdW50cnljb2RlOiBudWxsLFxyXG4gICAgICAgIG51bWJlcjogbnVsbCxcclxuICAgICAgICBudW1vdHA6IG51bGwsXHJcbiAgICAgICAgZXh0ZW5zaW9uOiBudWxsLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsID0ge1xyXG4gICAgICAgIGJ1c2luZXNzTnVtYmVyOiBmYWxzZSxcclxuICAgICAgICBjYWxsU2lkOiAnJyxcclxuICAgICAgICBjYWxsU3RhdHVzOiAnJyxcclxuICAgICAgICBjb25mZXJlbmNlSWQ6ICcnLFxyXG4gICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmctY2FsbCcsXHJcbiAgICAgICAgZm9yd2FyZGVkVG86ICcnLFxyXG4gICAgICAgIGZyb206IGNhbGxEYXRhLmZyb20sXHJcbiAgICAgICAgaWQ6ICd5eXVnZ2hqYicsXHJcbiAgICAgICAgaW1nOiBjYWxsRGF0YS5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIGlzQWNjZXB0Q2FsbDogdHJ1ZSxcclxuICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgIGlzTGVmdDogZmFsc2UsXHJcbiAgICAgICAgaXNNdXRlOiBmYWxzZSxcclxuICAgICAgICBqb2luZWRBdDogJycsXHJcbiAgICAgICAgbmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgcGFydGljaXBhbnRJZDogJycsXHJcbiAgICAgICAgcGhvbmU6IGNhbGxEYXRhPy5waG9uZSB8fCAnJyxcclxuICAgICAgICByb2xlOiAnY2FsbGVlJyxcclxuICAgICAgICBzdGF0dXM6ICcnLFxyXG4gICAgICAgIHRpbWU6ICcnLFxyXG4gICAgICAgIHRvOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXHJcbiAgICAgICAgdG9OYW1lOiBjYWxsRGF0YT8ubmFtZSB8fCAnJyxcclxuICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGNhbGxEYXRhPy51c2VySWRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5pbml0aWF0ZUNhbGwocGF5bG9hZCk7XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUlkID0gcmVzcG9uc2U/LmNhbGxhdXRoPy5pZDtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICBjb25zdCB7IGlkOiBjYWxsQXV0aElkLCByZWNvcmRDYWxsLCAgdG9rZW5EYXRhfSA9IGF3YWl0IHRoaXMuZ2V0Q2FsbEF1dGhJZChyZXNwb25zZSk7XHJcbiAgICAgICAgLy8gdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY2FsbEF1dGhJZClcclxuICAgICAgICB0aGlzLnJlY29yZENhbGwgPSByZWNvcmRDYWxsOyAvLyBTdG9yZSB0aGUgcmVjb3JkQ2FsbCB2YWx1ZVxyXG4gICAgICAgIC8vIGNvbnN0IHRva2VuRGF0YTogYW55ID0gYXdhaXQgdGhpcy5nZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsQXV0aElkKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3RUb0RldmljZShjYWxsQXV0aElkLCBjYWxsRGF0YSwgdG9rZW5EYXRhKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnBvbGxDYWxsU3RhdHVzKGNhbGxBdXRoSWQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqbmVlZCB0byB1cGRhdGUqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgICAgIGxldCBhZGRDbGllbnRQYXJ0aWNpcGFudFJlcyA9IHRoaXMuYWRkQ2xpZW50UGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICBjbGllbnRTaWQ6IHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snQ2FsbFNpZCddXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2FkZENsaWVudFBhcnRpY2lwYW50UmVzJywgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRSZXMgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcclxuICAgICAgICAgICAgICBmcm9tOiBjYWxsRGF0YT8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXNwb25zZT8uY2FsbGF1dGg/LmlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0xvYWRlcnNob3cubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZXJzaG93bi5lbWl0KGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMocmVzcG9uc2U/LmNhbGxhdXRoPy5pZCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbml0aWFsIHBhcnRpY2lwYW50SWQ6JywgdGhpcy5hZGRSZXM/LnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgaW5pdGlhbCBwYXJ0aWNpcGFudDonLCBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAxNTAwKVxyXG4gICAgICAgIC8vIFBvbGwgdGhlIHN0YXR1cyBmb3IgMzAtNDUgc2Vjb25kc1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDEpIHtcclxuICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkZXJzaG93bi5lbWl0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmlzTmV3QWRkZWRDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxici8+XCIpLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3QzJylcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTXV0ZVVzZXIoYzogYW55KSB7XHJcbiAgICB0aGlzLm9uTXV0ZVBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW2MucGFydGljaXBhbnRJZF0sXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogYz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBob2xkOiBjLmlzSG9sZCxcclxuICAgICAgbXV0ZTogIWM/LmlzTXV0ZSxcclxuICAgICAgY29uZmVyZW5jZTogYy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgIH0pXHJcbiAgICBjLmlzTXV0ZSA9ICFjLmlzTXV0ZTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGM/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkhvbGRDYWxsKGM6IGFueSkge1xyXG4gICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW2MucGFydGljaXBhbnRJZF0sXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogYz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBob2xkOiAhYy5pc0hvbGQsXHJcbiAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgIGNvbmZlcmVuY2U6IGMuaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgYy5pc0hvbGQgPSAhYy5pc0hvbGQ7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjPy5jb25mZXJlbmNlSWQpO1xyXG4gIH1cclxuICBhc3luYyBvbkVuZEluY29taW5nQ2FsbCgpIHtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgocmVzKSA9PiByZXMucGFydGljaXBhbnRJZCA9PSB0aGlzLmN1cnJlbnRDYWxsLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFJlbW92ZVBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LnBhcnRpY2lwYW50SWQsIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uY29uZmVyZW5jZUlkIHx8ICdubycpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgIHRoaXMuZW5kSW5jb21pbmdDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgYXN5bmMgb25FbmRDYWxsKGM6IGFueSwgaXNBbGxDYWxsRW5kPzogYm9vbGVhbiwgaXNDb250ZWN0PzogYm9vbGVhbikge1xyXG4gICAgbGV0IHBhcnRpY2lwYW50SWQgPSBpc0FsbENhbGxFbmQgPyAnYWxsJyA6IGMucGFydGljaXBhbnRJZCB8fCBjPy5pZDtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgbGV0IGNvbmZlcmVuY2VJZCA9IGMuY29uZmVyZW5jZUlkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgIGxldCBjb25mZXJlbmNlU2lkID0gYy5jb25mZXJlbmNlU2lkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VTaWQ7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQpO1xyXG4gICAgaWYgKHJlcz8uc3RhdHVzID09IDIwMSAmJiByZXM/Lm1lc3NhZ2UgPT0gJ3BhcnRpY2lwYW50IGFscmVhZHkgbGVmdCcpIHtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCk7XHJcblxyXG4gICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgdGhpcy5lbmRJbmNvbWluZ0NhbGxFdmVudC5lbWl0KGMpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXRpYXRlQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaW5pdGlhdGVDYWxsKHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRQYXJ0aWNpcGFudFRvQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYWRkUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENsaWVudFBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRDbGllbnRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU3RhdHVzT2ZQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5vbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSwgY29uZmVyZW5jZUlkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldENhbGxBdXRoSWQocmVzcG9uc2U6IGFueSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHJlc3BvbnNlLmNhbGxhdXRoLmlkLFxyXG4gICAgICByZWNvcmRDYWxsOiByZXNwb25zZS5jYWxsYXV0aC5yZWNvcmRDYWxsLFxyXG4gICAgICB0b2tlbkRhdGE6IHJlc3BvbnNlLmNhbGxhdXRoLnRva2VuXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsQXV0aElkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q29uZmVyZW5jZUNhbGxUb2tlbih7IGF1dGhJZDogY2FsbEF1dGhJZCB9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvRGV2aWNlKHRva2VuOiBhbnksIGNhbGxEYXRhOiBhbnksIHRva2VuRGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXHJcbiAgICAgIGNsb3NlUHJvdGVjdGlvbjogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YSwgb3B0aW9ucyk7XHJcbiAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgRnJvbTogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBUbzogY2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgRW52OiBlbnZpcm9ubWVudC5hYmIsXHJcbiAgICAgICAgVG9rZW46IHRva2VuLFxyXG4gICAgICAgIEV4dDogY2FsbERhdGEuZXh0TnVtXHJcbiAgICAgIH0sXHJcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB0cnVlIH0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xyXG4gICAgY29uc29sZS5sb2coJ3Rlc3Q5ODk5ODExMTExMScsIHRoaXMuY2FsbCk7XHJcbiAgICBjb25zb2xlLmxvZygndGVzdGRldmljZScsIHRoaXMudHdpbGlvU2VydmljZS5kZXZpY2UpO1xyXG4gICAgLy8gdGhpcy5jYWxsWydjYWxsSW5mbyddID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYWxsRGF0YSkpO1xyXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XHJcblxyXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICB0aGlzLmRldmljZT8ub24oJ2Vycm9yJywgKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2Rpc2Nvbm5lY3QnLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0LWRpc2Nvbm5lY3QnKVxyXG4gICAgICB0aGlzLmNhbGw/LmRpc2Nvbm5lY3QoKTtcclxuICAgICAgLy8gdGhpcy5lbmRDYWxsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdyaW5naW5nJywgKCkgPT4ge1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbigncmVqZWN0JywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndGVzdDUnKVxyXG4gICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2FjY2VwdCcsICgpID0+IHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XHJcbiAgICAgIC8vIEVuc3VyZSB0aGUgYWN0aXZlIG91dGdvaW5nIGNhbGwgaXMgbWFya2VkIGFzIGFjY2VwdGVkIHNvIHRoZSBVSSBzd2l0Y2hlcyB0byB0aGUgY29ubmVjdGVkIHZpZXdcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwaWQgPSB0aGlzLmNhbGxEYXRhPy5wYXJ0aWNpcGFudElkO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY3VycmVudENhbGxMaXN0KSAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vIGNvbnN0IGlkeCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoYzogYW55KSA9PiAocGlkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IHBpZCkgfHwgKCFwaWQgJiYgYz8ucGhvbmUgPT09IHRoaXMuY2FsbERhdGE/LnBob25lKSk7XHJcbiAgICAgICAgICAvLyBpZiAoaWR4ICE9PSAtMSkge1xyXG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbaWR4XS5pc0FjY2VwdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0W2lkeF07XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jYWxsPy5vbignbWVzc2FnZVJlY2VpdmVkJywgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0VGltZXIoam9pbkF0Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWpvaW5BdCkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBqb2luVGltZSA9IG5ldyBEYXRlKGpvaW5BdCkuZ2V0VGltZSgpIHx8IDA7XHJcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKChub3cgLSBqb2luVGltZSkgLyAxMDAwKTtcclxuICAgIGlmIChzZWNvbmRzIDwgMCkge1xyXG4gICAgICBzZWNvbmRzID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgc2Vjb25kcysrO1xyXG4gICAgICB0aGlzLnRpbWVyID0gdGhpcy5mb3JtYXRUaW1lKHNlY29uZHMpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcFRpbWVyKCkge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xyXG4gICAgdGhpcy50aW1lciA9ICcwMDowMCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdFRpbWUodG90YWxTZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcclxuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XHJcbiAgY29uc3Qgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xyXG4gIGlmIChob3VycyA+IDApIHtcclxuICAgIHJldHVybiBgJHt0aGlzLnBhZChob3Vycyl9OiR7dGhpcy5wYWQobWludXRlcyl9OiR7dGhpcy5wYWQoc2Vjb25kcyl9YDtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFkKG1pbnV0ZXMpfToke3RoaXMucGFkKHNlY29uZHMpfWA7XHJcbiAgfVxyXG59XHJcblxyXG4gIHByaXZhdGUgcGFkKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHZhbHVlIDwgMTAgPyBgMCR7dmFsdWV9YCA6IGAke3ZhbHVlfWA7XHJcbiAgfVxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkge1xyXG4gICAgc3dhbChcIkVycm9yXCIsIGVycm9yLCBcImVycm9yXCIpO1xyXG4gIH1cclxuXHJcbiAgZW5kQ29uZmVyZW5lY2VDYWxsKGNvbmY/OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25mID0gY29uZjtcclxuICAgIHRoaXMuaXNVbmhvbGRDb25mZXJlbmNlQ2FsbCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHRoaXMuaG9zdG51bWJlcj8uZnJvbSkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyh0aGlzLmhvc3RudW1iZXI/LnRvKSAmJiB0aGlzLmhvc3RudW1iZXI/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgdGhpcy5ob3N0bnVtYmVyPy5ob3N0KSkge1xyXG4gICAgICB0aGlzLm9uQ2FsbERpc2Nvbm5lY3RlZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNvbmY/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIGxldCBjb25mZXJlbmNlID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8uZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGNvbmY/LmNvbmZlcmVuY2VJZClcclxuICAgICAgICBsZXQgcGFydGljaXBlbnRJbmZvID0gY29uZmVyZW5jZT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSlcclxuICAgICAgICAgICYmIHBhcnRpY2lwYW50Py5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICAgIGlmIChjb25mZXJlbmNlPy5pZCkge1xyXG4gICAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGlzQWxsQ2FsbEVuZCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh7fSwgaXNBbGxDYWxsRW5kKTtcclxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgdGhpcy5vbkVuZENhbGwoY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbywgaXNBbGxDYWxsRW5kKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNhbGwpIHtcclxuICAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5jYWxsLnJlamVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIHRvZ2dsZU11dGUoaXNDb25mZXJlbmNlPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc011dGUgPSAhdGhpcy5pc011dGU7XHJcbiAgICB0aGlzLmNhbGw/Lm11dGUodGhpcy5pc011dGUpO1xyXG4gICAgY29uc3QgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICB0aGlzLm9uTXV0ZVBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW2N1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8ucGFydGljaXBhbnRJZCB8fCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pZF0sXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBob2xkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvLmlzSG9sZCxcclxuICAgICAgbXV0ZTogIWN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlzTXV0ZSxcclxuICAgICAgY29uZmVyZW5jZTogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmN1cnJlbnRDYWxsLmlzTXV0ZSA9IHRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXVkaW9TdHJlYW0/OiBNZWRpYVN0cmVhbTtcclxuICAvLyBtaWNPbiA9IGZhbHNlO1xyXG5cclxuICAvLyBhc3luYyB0b2dnbGVNaWMoKSB7XHJcbiAgLy8gICBpZiAoIXRoaXMuYXVkaW9TdHJlYW0pIHtcclxuICAvLyAgICAgLy8gZmlyc3QgdGltZTogcmVxdWVzdCBtaWNcclxuICAvLyAgICAgdGhpcy5hdWRpb1N0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgdGhpcy5taWNPbiA9ICF0aGlzLm1pY09uO1xyXG5cclxuICAvLyAgIHRoaXMuYXVkaW9TdHJlYW0uZ2V0QXVkaW9UcmFja3MoKS5mb3JFYWNoKHRyYWNrID0+IHtcclxuICAvLyAgICAgdHJhY2suZW5hYmxlZCA9IHRoaXMubWljT247ICAgLy8gZmFsc2UgPSBtdXRlZCwgdHJ1ZSA9IHNlbmRpbmcgYXVkaW9cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgZ2V0Q3VycmVudENhbGxJbmZvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RcclxuICAgICAgLmZsYXRNYXAoKGNhbGxJbmZvOiBhbnkpID0+IGNhbGxJbmZvLnBhcnRpY2lwYW50cylcclxuICAgICAgLmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJylcclxuICAgICAgICB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCk7XHJcbiAgfVxyXG4gIHRvZ2dsZUtleXBhZCgpIHtcclxuICAgIHRoaXMuc2hvd0tleXBhZCA9ICF0aGlzLnNob3dLZXlwYWQ7XHJcbiAgICB0aGlzLmNhbGxJbnB1dCA9ICcnO1xyXG4gIH1cclxuICB0b2dnbGVDb250YWN0c1BhbmVsKGNhbGxJbmZvPzogYW55LCBpc0Nsb3NlPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoaXNDbG9zZSkge1xyXG4gICAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSAhaXNDbG9zZTtcclxuICAgIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzO1xyXG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gICAgdGhpcy5pc1NlYXJjaFZpc2libGUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmVtb3ZlUGFydGljaXBhbnQoKSB7XHJcbiAgICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSAhdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50O1xyXG4gICAgYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgd2FpdGluZ0NhbGxBY2NlcHQoaW5jb21pbmdDYWxsSW5mbzphbnkpIHtcclxuICAgIGxldCBvdXJOdW1iZXJJbmZvOiBhbnkgPSB7fVxyXG4gICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgIGlmIChjYWxsSW5mbykge1xyXG4gICAgICAgICAgb3VyTnVtYmVySW5mbyA9IGNhbGxJbmZvLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvdXJOdW1iZXJJbmZvPy5pZCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2cob3VyTnVtYmVySW5mbywgJ3NlbGZJbmZvJyk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbb3VyTnVtYmVySW5mbz8uaWRdLFxyXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IG91ck51bWJlckluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogb3VyTnVtYmVySW5mbz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogb3VyTnVtYmVySW5mby5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkKGluY29taW5nQ2FsbEluZm8pO1xyXG4gICAgICB9XHJcblxyXG4gIGFzeW5jIGFkZChkYXRhPzogYW55KSB7XHJcbiAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2U/LmluY29taW5nQ2FsbERldGFpbD8uYWNjZXB0KCk7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gICAgICBpcENvdW50cnk6ICcnLFxyXG4gICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgdXNlcklkOiAgdGhpcy51c2VySWQsXHJcbiAgICAgIGNvbXBhbnlJZDogJycsXHJcbiAgICAgIGNsaWVudFNpZDogdGhpcy50d2lsaW9TZXJ2aWNlPy5pbmNvbWluZ0NhbGxEZXRhaWw/LnBhcmFtZXRlcnM/LkNhbGxTaWQsXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLmlzQ3VycmVudEluY29taW5nQ2FsbExpc3QucHVzaChkYXRhPy5pZCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0FjY2VwdElJbmNvbWluZ0NhbGwubmV4dChkYXRhPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsbCwgJ2NhbGxDb25uZWN0Jyk7XHJcbiAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IGRhdGEucGFydGljaXBhbnRJZClcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2Uuam9pbihcIjxici8+XCIpLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIGFzeW5jIGNhbGxDb250YWN0KGNvbnRhY3Q6IGFueSwgaXNVbnNhdmVkTnVtYmVyPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGlzVW5zYXZlZE51bWJlciA/IGNvbnRhY3QgOiBjb250YWN0Py5udW1iZXJzTGlzdD8uWzBdPy5udW1iZXIgfHwgY29udGFjdD8ucGhvbmU7XHJcbiAgICBsZXQgYWxyZWFkeUluQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiAocmVzLnRvID09IHBob25lTnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykgfHwgKHJlcy5mcm9tID09IHBob25lTnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgJiYgIXJlcz8uaXNMZWZ0KTtcclxuICAgIGlmIChhbHJlYWR5SW5DYWxsKSB7XHJcbiAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtwaG9uZU51bWJlcn0gbnVtYmVyIGluIHRoaXMgY2FsbC5gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcclxuICAgICAgICAgIGZyb206IHRoaXMuY2FsbERhdGE/LmZyb20gPyB0aGlzLmNhbGxEYXRhPy5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkLFxyXG4gICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgY291bnRyeWNvZGU6ICcnLFxyXG4gICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWRcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2RhdGE/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiBudWxsLFxyXG4gICAgICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBuYW1lOiBjb250YWN0Py5uYW1lIHx8IGAke2NvbnRhY3Q/LmZpcnN0TmFtZX0gJHtjb250YWN0Py5sYXN0TmFtZX1gIHx8IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgIGZyb206IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTGVmdDogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlBhcnRpY2lwYW50IGFkZGVkIHRvIGNvbmZlcmVuY2U6XCIsIHBob25lTnVtYmVyKTtcclxuICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudElEczphbnkgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SURzLnB1c2goYz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHBhcnRpY2lwYW50SURzLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IG51bGwsXHJcbiAgICAgICAgICBtdXRlOiBudWxsLFxyXG4gICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFB1dCBjdXJyZW50IGNhbGwgb24gaG9sZFxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICAvLyBBZGQgcGFydGljaXBhbnQgdG8gdGhlIGNvbmZlcmVuY2VcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcclxuICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2RhdGE/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IG51bGwsXHJcbiAgICAgICAgICBtdXRlOiBudWxsLFxyXG4gICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIHBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFscmVhZHlJbkNhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gKChyZXMudG8gPT0gbnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykgfHwgKHJlcy5mcm9tID09IG51bWJlciAmJiByZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcpKSAmJiAhcmVzPy5pc0xlZnQpO1xyXG4gICAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtudW1iZXJ9IG51bWJlciBpbiB0aGlzIGNhbGwuYCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChudW1iZXIgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cclxuICAgICAgY29uc3QgY2FsbERhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogY29udGFjdD8uZmlyc3ROYW1lLFxyXG4gICAgICAgIGltZzogY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIHBob25lOiBudW1iZXIsXHJcbiAgICAgICAgZXh0TnVtOiAnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaXNOZXdDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICAgICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgICAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKG91ck51bWJlckluZm8sICdzZWxmSW5mbycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IG91ck51bWJlckluZm8/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNhbGxEYXRhLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vbkFkZE5ld0NhbGwoY2FsbERhdGEsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICB0aGlzLmNhbGxDb250YWN0KG51bWJlciwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBvbkFkZE5ld0NhbGwoY2FsbERhdGE6IGFueSwgaXNOZXdDb25mZXJlbmNlQ2FsbCA9IGZhbHNlKSB7XHJcblxyXG4gICAgLy8gd2FybmluZyBvbmx5IGZvciBORVcgU0VQQVJBVEUgQ0FMTFxyXG4gICAgaWYgKGlzTmV3Q29uZmVyZW5jZUNhbGwgJiYgdGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBjYWxsRGF0YTtcclxuICAgICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydENhbGwoY2FsbERhdGEsIGlzTmV3Q29uZmVyZW5jZUNhbGwpO1xyXG4gIH1cclxuICBjb25maXJtTmV3Q2FsbCgpIHtcclxuICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWwgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2FsbERhdGEpIHtcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICBzaG93OiB0cnVlLFxyXG4gICAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICAgIG51bWJlcjogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmUsXHJcbiAgICAgIGRpc3BsYXlOdW06IHRoaXMucGVuZGluZ0NhbGxEYXRhLnBob25lXHJcbiAgICB9O1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCA3MDAwKTtcclxuICAgICAgdGhpcy5zdGFydENhbGwodGhpcy5wZW5kaW5nQ2FsbERhdGEsIHRydWUpO1xyXG4gICAgICB0aGlzLnBlbmRpbmdDYWxsRGF0YSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxOZXdDYWxsKCkge1xyXG4gICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIGlmIChkaWFsZWROdW1iZXJbMF0gIT09ICcrJykge1xyXG4gICAgICAvLyB0aGlzIGlzIGNhc2Ugd2hlbiB1c2VyIGdlb2xvY2F0aW9uIGRpYWwgY29kZSBpcyBvblxyXG4gICAgICBsZXQgaXBBZGRyZXNzOiBhbnkgPSBhd2FpdCB0aGlzLmlwU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmdldFRvTnVtYmVyKGRpYWxlZE51bWJlciwgaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICByZXR1cm4gcmVzPy50b051bWJlclxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRpYWxlZE51bWJlclxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKG51bWJlcjogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAobnVtYmVyID09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbGlkTnVtYmVyUGF0dGVybiA9IC9eWytcXGRcXHMoKS1dKiQvOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdmFsaWQgY2hhcmFjdGVyc1xyXG4gICAgICBjb25zdCBwaG9uZU51bWJlciA9IG51bWJlcjtcclxuICAgICAgaWYgKCF2YWxpZE51bWJlclBhdHRlcm4udGVzdChwaG9uZU51bWJlcikpIHtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFsQWxlcnQgPSB7XHJcbiAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgc2hvdzogdHJ1ZVxyXG4gICAgfTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCAzMDAwKTtcclxuICB9XHJcblxyXG5hc3luYyBnZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZUlkOiBzdHJpbmcpIHtcclxuICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gcmVzPy5wYXJ0aWNpcGFudHMgfHwgcmVzPy5wYXJ0aWNpcGFudCB8fCBbXTtcclxuICAgICAgICBpZiAoIXBhcnRpY2lwYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQYXJ0aWNpcGFudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgIHBhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmcm9tTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLmZyb20pO1xyXG4gICAgICAgICAgICBjb25zdCB0b05hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC50byk7XHJcbiAgXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucCxcclxuICAgICAgICAgICAgICBmcm9tTmFtZTogZnJvbU5hbWUgfHwgcC5mcm9tTmFtZSxcclxuICAgICAgICAgICAgICB0b05hbWU6IHRvTmFtZSB8fCBwLnRvTmFtZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICBcclxuICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IHVwZGF0ZWRQYXJ0aWNpcGFudHM7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFsuLi51cGRhdGVkUGFydGljaXBhbnRzXTtcclxuICBcclxuICBcclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0sNzAwKVxyXG59XHJcblxyXG4gIGFzeW5jIHN3YXBDYWxscyhjYWxsSW5mbzogYW55LCBpc0NvbmZlcmVuY2VDYWxsPzogYm9vbGVhbikge1xyXG4gICAgLy8gaWYgKCF0aGlzLmhlbGRDYWxsIHx8ICF0aGlzLmNhbGwpIHJldHVybjtcclxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjPy5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudEluZm8gPSBjLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChwYXJ0aWNpcGFudEluZm8/LmlkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXRlOiBwYXJ0aWNpcGFudEluZm8/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IHBhcnRpY2lwYW50SW5mbz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gYy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAocGFydGljaXBhbnRJbmZvPy5pZCAmJiAhcGFydGljaXBhbnRJbmZvPy5pc0hvbGQpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25mZXJlbmNlOiBwYXJ0aWNpcGFudEluZm8/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGM/LmlzQ29uZmVyZW5jZSAmJiAhYz8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCA9PSBjPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gaXNNZXJnZUNhbGxBbGxvd2VkKCkge1xyXG4gIC8vICAgbGV0IG1lcmdlQ2FsbExpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKHJlcykgPT4gcmVzLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgLy8gICByZXR1cm4gbWVyZ2VDYWxsTGlzdC5sZW5ndGggPD0gMTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGFzeW5jIG1lcmdlQ2FsbHMoKSB7XHJcbiAgLy8gICAvLyBNZXJnZSBmdW5jdGlvbmFsaXR5IC0gdW5tdXRlIGJvdGggY2FsbHMgZm9yIGNvbmZlcmVuY2VcclxuICAvLyAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgLy8gICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmIChjLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCkge1xyXG4gIC8vICAgICAgICAgaWYgKGM/LnBhcnRpY2lwYW50SWQpIHtcclxuICAvLyAgICAgICAgICAgLy8gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAvLyAgICAgICAgICAgLy8gICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgLy8gICAgICAgICAgIC8vICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAvLyAgICAgICAgICAgLy8gICBob2xkOiBmYWxzZSxcclxuICAvLyAgICAgICAgICAgLy8gICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gIC8vICAgICAgICAgICAvLyAgIGNvbmZlcmVuY2U6IHRydWVcclxuICAvLyAgICAgICAgICAgLy8gfSk7XHJcbiAgLy8gICAgICAgICAgIGMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgICB0aGlzLmlzQ2FsbE9uSG9sZCA9IGZhbHNlO1xyXG4gIC8vICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgLy8gICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGhhc0RldGFpbGVkSW5mbyhjYWxsRGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWNhbGxEYXRhKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXHJcbiAgICBpZiAoY2FsbERhdGEudXNlckluZm8gJiYgY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb24pIHtcclxuICAgICAgY29uc3QgaW5mbyA9IGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uO1xyXG4gICAgICByZXR1cm4gISEoXHJcbiAgICAgICAgaW5mby5zdWJqZWN0ICYmIGluZm8uc3ViamVjdCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5lbWFpbCAmJiBpbmZvLmVtYWlsICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLm1lc3NhZ2UgJiYgaW5mby5tZXNzYWdlICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnBvaW50TmFtZSAmJiBpbmZvLnBvaW50TmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5zb3VyY2VOYW1lICYmIGluZm8uc291cmNlTmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5leHRlbnNpb24gJiYgaW5mby5leHRlbnNpb24gIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8udXJsIHx8XHJcbiAgICAgICAgaW5mby5sYXRpdHVkZSB8fFxyXG4gICAgICAgIGluZm8ubG9uZ2l0dWRlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25DYWxsSW5wdXRzKG51bTogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihudW0pIHx8IG51bSA9PSAnKycgfHwgbnVtID09ICcqJyB8fCBudW0gPT0gJyMnKSB7XHJcbiAgICAgICAgaWYgKG51bSA9PSAnIycpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1oYXNoLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gJyonKSB7XHJcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtc3Rhci0ubXAzYCkucGxheSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtJHtudW19LS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGxJbnB1dCA9IHRoaXMuY2FsbElucHV0ICsgU3RyaW5nKG51bSk7XHJcbiAgICAgICAgdGhpcy5zaG93Q2xlYXJCdG4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzdHIgPSBTdHJpbmcobnVtKTtcclxuICAgICAgdGhpcy5jYWxsPy5zZW5kRGlnaXRzKHN0cik7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBvbkNhbGxJbnB1dEVudGVyKGV2OiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuY2FsbD8uc2VuZERpZ2l0cyhTdHJpbmcoZXYua2V5KSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VJbmNvbWluZ0NhbGwoZGF0YTogYW55KSB7XHJcbiAgICBpZiAoZGF0YS5zaG93KSB7XHJcbiAgICAgIC8vIGhhbmRsZSBpbmNvbWluZyBjYWxsIGFjY2VwdGVkXHJcbiAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuXHJcbiAgICAgIGNvbnN0IGluY29taW5nRGV0YWlsID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTaWQoKTtcclxuICAgICAgdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgPSBpbmNvbWluZ0RldGFpbC5yZWNvcmRDYWxsO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBpbmNvbWluZyBjYWxsIHJlamVjdGVkIG9yIGF1dG8tY2FuY2VsbGVkXHJcbiAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgTk8gYWN0aXZlIGNhbGwsIHRoZW4gcHJvcGFnYXRlIGVuZC4gT3RoZXJ3aXNlIGtlZXAgb25nb2luZyBVSS5cclxuICAgICAgaWYgKCF0aGlzLmNhbGwgfHwgdGhpcy5jYWxsLnN0YXR1cygpICE9PSAnb3BlbicpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygndGVzdDcnKVxyXG4gICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBjbGVhcklucHV0cygpIHtcclxuICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQuc2xpY2UoMCwgLTEpO1xyXG4gIH1cclxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1pbmltaXNlRGlhbHBhZCgpIHtcclxuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgdGhpcy5pc01pbmltaXNlZCA9IHRydWU7XHJcbiAgfVxyXG4gIG1heGltaXNlRGlhbHBhZCgpIHtcclxuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGZhbHNlKTtcclxuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSBmYWxzZTtcclxuICB9XHJcbiAgdG9nZ2xlUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXJ0UmVjb3JkaW5nKCkge1xyXG4gICAgbGV0IHNpZDtcclxuICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xyXG4gICAgdGhpcy5pbmNvbWluZ0NhbGxTaWQgPSBkZXRhaWxzLmNhbGxTaWQ7XHJcbiAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGRldGFpbHMucmVjb3JkQ2FsbDtcclxuICAgIHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLmNhbGxTaWQgfHwgdGhpcy5hZGRSZXM/LmNvbmZlcmVuY2VTaWQ7XHJcblxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIFwiY29uZmVyZW5jZUlkXCI6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsUmVjb3JkaW5nKHBheWxvYWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudGltZUVsYXBzZWQgPSAwO1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBzdG9wUmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5pc1JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwYXVzZVJlY29yZGluZygpIHtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCwgJ3BhdXNlJykuc3Vic2NyaWJlKFxyXG4gICAgICByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nVGltZXIoKTtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGF1c2luZyByZWNvcmRpbmc6JywgZXJyb3IpO1xyXG4gICAgICAgIC8vIENvbnNpZGVyIHVwZGF0aW5nIHRoZSBVSSB0byBzaG93IHRoZSBlcnJvciBzdGF0ZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICByZXN1bWVSZWNvcmRpbmcoKSB7XHJcbiAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcclxuICAgIC8vICAgcmV0dXJuOyAvLyBTa2lwIGlmIHJlY29yZGluZyBpcyBub3QgZW5hYmxlZFxyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlc3VtaW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRUaW1lRGlmZmVyZW5jZShpbnB1dFRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXN0VGltZSA9IG5ldyBEYXRlKGlucHV0VGltZSkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBsZXQgZGlmZiA9IE1hdGguZmxvb3IoKGN1cnJlbnRUaW1lIC0gcGFzdFRpbWUpIC8gMTAwMCk7IC8vIHRvdGFsIHNlY29uZHNcclxuXHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkaWZmIC8gNjApO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IGRpZmYgJSA2MDtcclxuXHJcbiAgICBjb25zdCBtbSA9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzO1xyXG4gICAgY29uc3Qgc3MgPSBzZWNvbmRzIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcztcclxuXHJcbiAgICByZXR1cm4gYCR7bW19OiR7c3N9YDtcclxuICB9XHJcbiAgc3RhcnRUaW1lcjEoKSB7XHJcbiAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwoMTAwMCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy50aW1lRWxhcHNlZCsrO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BSZWNvcmRpbmdUaW1lcigpIHtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgLy8gUGF1c2UgdGhlIHRpbWVyXHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7ICAgICAgICAvLyBPcHRpb25hbGx5IHJlc2V0IHRoZSBzdWJzY3JpcHRpb25cclxuICAgIH1cclxuICB9XHJcbiAgZ2V0Rm9ybWF0dGVkVGltZSgpIHtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMudGltZUVsYXBzZWQgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gdGhpcy50aW1lRWxhcHNlZCAlIDYwO1xyXG4gICAgcmV0dXJuIGAke21pbnV0ZXN9OiR7c2Vjb25kcyA8IDEwID8gJzAnIDogJyd9JHtzZWNvbmRzfWA7XHJcbiAgfVxyXG4gIHBvbGxDYWxsU3RhdHVzKGNhbGxBdXRoSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbWF4VGltZSA9IDMwMDAwOyAvLyBQb2xsIGZvciB1cCB0byAzMCBzZWNvbmRzXHJcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAzMDAwOyAvLyBQb2xsIGV2ZXJ5IDMgc2Vjb25kc1xyXG4gICAgbGV0IGVsYXBzZWRUaW1lID0gMDtcclxuICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGVsYXBzZWRUaW1lICs9IHBvbGxJbnRlcnZhbDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdGF0dXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU3RhdHVzKGNhbGxBdXRoSWQpLnRvUHJvbWlzZSgpIGFzIENhbGxTdGF0dXNSZXNwb25zZTtcclxuICAgICAgICBpZiAoc3RhdHVzUmVzcG9uc2UgJiYgc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMpIHtcclxuICAgICAgICAgIHRoaXMuY2FsbFN0YXR1cyA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTdGF0dXM7XHJcbiAgICAgICAgICBpZiAodGhpcy5jYWxsU3RhdHVzID09PSAnaW4tcHJvZ3Jlc3MnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFNpZCA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTaWQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZENhbGwgJiYgIXRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsU3RhdHVzID09PSAnY29tcGxldGVkJykge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVsYXBzZWRUaW1lID49IG1heFRpbWUpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnTWF4IHBvbGxpbmcgdGltZSByZWFjaGVkLiBTdG9wcGluZyBwb2xsLicpO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHBvbGxJbnRlcnZhbCk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VySW5mb3JtYXRpb24oaWQ6IGFueSkge1xyXG4gICAgaWYoaWQpIHtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oaWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSwgJ3VzZXJJbmZvcm1hdGlvbicpO1xyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXRIb2xkQ2FsbExpc3QoKSB7XHJcbiAgICBsZXQgaG9sZExpc3Q6IGFueVtdID0gW107XHJcbiAgICBsZXQgaXNDb25mZXJlbmNlID0gZmFsc2U7XHJcbiAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGM/LmlzSG9sZCAmJiAhYz8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYz8uaXNDb25mZXJlbmNlICYmICFpc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBpc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgIGNbJ2lzQ29uZmVyZW5jZUNhbGxIb2xkJ10gPSB0cnVlO1xyXG4gICAgICAgIGhvbGRMaXN0LnB1c2goYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGhvbGRMaXN0O1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0V4cGFuZChkYXRhOiBhbnkpIHtcclxuICAgIGlmIChkYXRhLmlkICE9IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xyXG4gICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gIXRoaXMuaXNDbGlja0V4cGFuZDtcclxuICAgICAgaWYgKHRoaXMuaXNDbGlja0V4cGFuZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0SW5jb21pbmdDYWxsU3RhdHVzKGRhdGE6IGFueSkge1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIHJlY29yZElkOiBkYXRhPy5pZCxcclxuICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgY2FsbFN0YXR1czogJ2Fuc3dlcmVkJyxcclxuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkIHx8IGRhdGEuY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5pc1NlYXJjaFZpc2libGUgPSAhdGhpcy5pc1NlYXJjaFZpc2libGU7XHJcblxyXG4gICAgLy8gaWYgY2xvc2luZyBzZWFyY2gg4oCUIHJlc2V0IHJlc3VsdHNcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVyKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpXHJcbiAgICBpZiAodGV4dC5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGNjOiBhbnkpID0+ICFjYz8uSXNDb25uZWN0ZWQgJiYgKGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyIHx8IGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyKSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjWydJc0Nvbm5lY3RlZCddID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzLmZpbHRlcigoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiAoYz8uZmlyc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5sYXN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fFxyXG4gICAgICAgIChjPy5taWRkbGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5uaWNrTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fFxyXG4gICAgICAgIChjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgY1snZnJvbU5hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLmZyb20pIHx8IGM/LmZyb21OYW1lO1xyXG4gICAgICBjWyd0b05hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLnRvKSB8fCBjPy50b05hbWU7XHJcbiAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoY2M6IGFueSkgPT4gY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGNoZWNrVGV4dEhlaWdodCgpIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRleHQtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoZWw/LnNjcm9sbEhlaWdodCA+IGVsPy5jbGllbnRIZWlnaHQpIHtcclxuICAgICAgdGhpcy5zaG93QnV0dG9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgdG9nZ2xlVGV4dCgpIHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9ICF0aGlzLmlzRXhwYW5kZWQ7XHJcbiAgfVxyXG5cclxuICBzaG93RGlzY29ubmVjdE1vZGFsID0gZmFsc2U7XHJcblxyXG4gIC8vIENhbGwgdGhpcyB3aGVuIGNhbGwgZGlzY29ubmVjdHNcclxuICBvbkNhbGxEaXNjb25uZWN0ZWQoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZW5kQ29uZmVyZW5jZSgpIHtcclxuICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5zZWxlY3RlZENvbmYsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmRDYWxsKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENvbWJpbmVzIHRoZSB0d28gMjQtaG91ciBzZWxlY3RzIGludG8gbGVhdmVSZWFzb24gKEhIOk1NKSAqL1xyXG4gIG9uVGltZUNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLmxlYXZlSG91ciAhPT0gJycgJiYgdGhpcy5sZWF2ZU1pbnV0ZSAhPT0gJycpIHtcclxuICAgICAgdGhpcy5sZWF2ZVJlYXNvbiA9IGAke3RoaXMubGVhdmVIb3VyfToke3RoaXMubGVhdmVNaW51dGV9YDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUhvdXJEcm9wZG93bigpIHtcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9ICF0aGlzLnNob3dIb3VyRHJvcGRvd247XHJcbiAgICB0aGlzLnNob3dNaW51dGVEcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTWludXRlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLnNob3dNaW51dGVEcm9wZG93biA9ICF0aGlzLnNob3dNaW51dGVEcm9wZG93bjtcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0SG91cihoOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGVhdmVIb3VyID0gaDtcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgdGhpcy5vblRpbWVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdE1pbnV0ZShtOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGVhdmVNaW51dGUgPSBtO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMub25UaW1lQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBsZWF2ZUNvbmZlcmVuY2UoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmlzUmVhc29uQ2hlY2tlZCkge1xyXG4gICAgICBsZXQgcGF5bG9hZCA9IHsgY29uZmVyZW5jZUlkOiB0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkIHx8IHRoaXMuaG9zdG51bWJlcj8uY29uZmVyZW5jZUlkLCB0aW1lOiB0aGlzLmNvbnZlcnRISE1NVG9NaW51dGVzKHRoaXMubGVhdmVSZWFzb24pLCB0aW1lckRhdGU6IG5ldyBEYXRlKCkudG9TdHJpbmcoKSB9XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRUaW1lckZvckVuZENvbmZlcmVuY2VDYWxsKHBheWxvYWQpLnN1YnNjcmliZSgocmVzKSA9PiB7IH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICBsZXQgY29uZmVyZW5jZSA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmNvbmZlcmVuY2VJZCA9PSB0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkKVxyXG4gICAgICBsZXQgcGFydGljaXBlbnRJbmZvID0gY29uZmVyZW5jZT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSlcclxuICAgICAgICAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdClcclxuICAgICAgaWYgKGNvbmZlcmVuY2U/LmlkKSB7XHJcbiAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmhvc3RudW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgY29udmVydEhITU1Ub01pbnV0ZXModGltZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcbiAgICByZXR1cm4gKGhvdXJzICogNjApICsgbWludXRlcztcclxuICB9XHJcblxyXG4gIG9uUmVqZWN0Q2FsbChjYWxsSW5mbzogYW55KSB7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmVjb3JkSWQ6IGNhbGxJbmZvPy5pZCxcclxuICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgY2FsbFN0YXR1czogJ25vJyxcclxuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgIHVzZXJJZDogIHRoaXMudXNlcklkLFxyXG4gICAgICBjb21wYW55SWQ6ICcnLFxyXG4gICAgICBjbGllbnRTaWQ6IHRoaXMudHdpbGlvU2VydmljZT8uaW5jb21pbmdDYWxsRGV0YWlsPy5wYXJhbWV0ZXJzPy5DYWxsU2lkLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXM6IGFueSkgPT4gcmVzPy5pZCAhPSBjYWxsSW5mbz8uaWQpO1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgaXNTZWxmTnVtYmVyKHBhcnRpY2lwYW50OiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmRldmljZU51bWJlckxpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcyA9PSAocGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBwYXJ0aWNpcGFudD8uZnJvbSA6IHBhcnRpY2lwYW50Py50bykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZShudW1iZXI6IGFueSkge1xyXG4gICAgbGV0IGNvbnRhY3RJbmZvID0gdGhpcy5jb250YWN0cy5maW5kKChjOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgID09IG51bWJlciB8fCBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyID09IG51bWJlcjtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbnRhY3RJbmZvPy5maXJzdE5hbWUgfHwgY29udGFjdEluZm8/Lmxhc3ROYW1lID8gYCR7Y29udGFjdEluZm8/LmZpcnN0TmFtZSB8fCAnJ30gJHtjb250YWN0SW5mbz8ubGFzdE5hbWUgfHwgJyd9YCA6IG51bGxcclxuICB9XHJcbiAgZ2V0SW1nKG51bWJlcjogYW55KSB7XHJcbiAgICBsZXQgY29udGFjdEluZm8gPSB0aGlzLmNvbnRhY3RzLmZpbmQoKGM6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciAgPT0gbnVtYmVyIHx8IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIgPT0gbnVtYmVyO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY29udGFjdEluZm8/LmltYWdlIHx8IG51bGxcclxuICB9XHJcblxyXG4gIGdldCBzaG93RW5kQWxsQnV0dG9uKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYWN0aXZlUGFydGljaXBhbnRzID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChjOiBhbnkpID0+ICFjLmlzTGVmdCk7XHJcbiAgICBjb25zb2xlLndhcm4oYWN0aXZlUGFydGljaXBhbnRzLmxlbmd0aCk7XHJcbiAgICByZXR1cm4gYWN0aXZlUGFydGljaXBhbnRzLmxlbmd0aCA+IDI7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5jYWxsRGF0YS5kaWFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCIhaXNNaW5pbWlzZWQgJiYgY3VycmVudENhbGxMaXN0Py5sZW5ndGhcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnY29sbG9wcyc6IGlzQ29sbG9wcywgJ2luY29taW5nLWNhbGwtY29udGFpbmVyJzogaXNDbGlja0V4cGFuZCwgJ2NvbnRhY3RzLW9wZW4nOiBzaG93Q29udGFjdHNQYW5lbCB9XCI+XHJcbiAgICAgICAgPCEtLSBDYWxsaW5nIEFsZXJ0IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFscGFkLWFsZXJ0c1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdjb25mZXJlbmNlLWFsZXJ0JzogaXNDb25mZXJlbmNlICYmIGN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgJ25vcm1hbC1jYWxsLWFsZXJ0JzogIWlzQ29uZmVyZW5jZVxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgICpuZ0lmPVwiY2FsbE51bWJlclRvYXN0LnNob3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxib3gtcG9wMSBhbGVydCBmYWRlIHNob3dcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY2FsbE51bWJlclRvYXN0LnR5cGVcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImFsZXJ0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgWW91J3IgY2FsbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tjYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRpc2MgcC0wIHB4LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICBDYW5jZWwgQ2FsbFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEFsbCB0eXBlIENhbGwgSG9sZCBsaXN0ICAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWJhbm5lclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiKGN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmICEhY3VycmVudENhbGwgJiYgKChpc0NvbmZlcmVuY2VDYWxsSG9sZCB8fCBpc0NvbmZlcmVuY2UpIHx8ICFpc0NvbmZlcmVuY2UpKSB8fCAhaXNBbGxBY2NlcHRlZFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb25mIG9mIGN1cnJlbnRDYWxsTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCIhY29uZj8uaXNBY2NlcHRDYWxsICYmIGN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmIGRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoY29uZj8udG8pICYmIHR3aWxpb1NlcnZpY2UuaXNTaG93SW5jb21pbmdDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZy13cmFwcGVyIGJvcmRlci1yYWRpdXMtNTBcIiBbc3JjXT1cImNvbmY/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCIzNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPnt7Y29uZj8uZnJvbX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLW5hbWVcIj57e2NvbmY/LmZyb21OYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IHJlY2VpdmUtYnRuXCIgKGNsaWNrKT1cIndhaXRpbmdDYWxsQWNjZXB0KGNvbmYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCIgKGNsaWNrKT1cIm9uUmVqZWN0Q2FsbChjb25mKVwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZj8uYnVzaW5lc3NOdW1iZXJcIiBjbGFzcz1cInRvZ2dsZWFycm93LWFycm93IG1lLTJcIiBpZD1cInRvZ2dsZWFycm93XCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb25mIG9mIGNvbmZlcmVuY2VDYWxsTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJjb25mPy5pc0NvbmZlcmVuY2VIb2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaG9sZC1pY29uXCI+cGF1c2VfY2lyY2xlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPkhvbGQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uY29uZmVyZW5jZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3RcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogY29uZj8uaXNDb25mZXJlbmNlSG9sZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzd2FwQ2FsbHMoY29uZix0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJ7eydIb2xkJ319XCI+IHBob25lX3BhdXNlZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRm9yIHNpbmdsZSBpbmNvbWluZyBjYWxsIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLTEwMCBweS01XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Q2FsbExpc3RbMF0/LmlzSW5jb21pbmdDYWxsICYmICFjdXJyZW50Q2FsbExpc3RbMF0/LmlzQWNjZXB0Q2FsbCAmJiB0d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbFRvTnVtXCI+SW5jb21pbmcgY2FsbCBvbiA8YnIgLz48c3Bhbj57e2N1cnJlbnRDYWxsTGlzdFswXT8udG8gfHwgJ1Vua25vd25cclxuICAgICAgICAgICAgICAgICAgICBOdW1iZXInfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJjdXJyZW50Q2FsbExpc3RbMF0/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTIwXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8aDE+e3sgY3VycmVudENhbGxMaXN0WzBdPy5uYW1lID8gY3VycmVudENhbGxMaXN0WzBdPy5uYW1lIDogY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB8fCAnVW5rbm93blxyXG4gICAgICAgICAgICAgICAgICAgIE51bWJlcicgfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhIWN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZVwiPnt7IGN1cnJlbnRDYWxsTGlzdFswXT8ucGhvbmUgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnMgbXQtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LmlzQ2FsbENvbm5lY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZVwiIChjbGljayk9XCJhZGQoY3VycmVudENhbGxMaXN0WzBdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiID4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWplY3QtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uUmVqZWN0Q2FsbChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGxfZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgYWN0aXZlIGNhbGwgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIighaXNDb25mZXJlbmNlIHx8IGlzQ29uZmVyZW5jZUNhbGxIb2xkKSAmJiAoISFjdXJyZW50Q2FsbD8uaWQgJiYgIWN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpICYmIGN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiAnZmxleCcsICdmbGV4LWRpcmVjdGlvbic6ICdjb2x1bW4nLCAncG9zaXRpb24nOiAncmVsYXRpdmUnfVwiIGNsYXNzPVwiYWN0aXZlLWNhbGxcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzhweCd9XCI+e3tjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy50b05hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbD8udG9OYW1lIHx8ICdVbmtub3duJ319PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIj57eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy50byB8fCAnVW5rbm93bicgOiBjdXJyZW50Q2FsbD8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9wPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjdXJyZW50Q2FsbD8uY2xpZW50XCI+e3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbSB8fCAnVW5rbm93bicgOiBjdXJyZW50Q2FsbD8udG8gfHxcclxuICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvcD5cclxuICAgICAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbi10b3A6IDRweFwiPnt7Y3VycmVudENhbGw/LnRpbWUgfHwgdGltZXJ9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRuc1wiICpuZ0lmPVwiIXNob3dLZXlwYWRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnMjBweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF1c2UtcmVzdW1lLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGxheV9hcnJvdyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInRpbWVyLWRpc3BsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhbGwtaW5wdXRzXCIgaWQ9XCJjYWxsLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjYWxsSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJvbkNhbGxJbnB1dEVudGVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFySW5wdXRzKClcIj5jbG9zZV9zbWFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXktYnRuXCIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlwYWRWYWxcIiAoY2xpY2spPVwib25DYWxsSW5wdXRzKGtleS5udW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3trZXkubnVtfX1cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnNcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnNzIzeCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCIhaW5jb21pbmdDYWxsRGl2IHx8IGlzQ29uY3VycmVudEluY29taW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhlbGQtYnRuIG1lcmdlLWJ0blwiIChjbGljayk9XCJtZXJnZUNhbGxzKClcIiB0aXRsZT1cIk1lcmdlIGNhbGxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWVyZ2VDYWxsQWxsb3dlZCgpIHx8IGN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPCAyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1lcmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuIG1yLTNcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cInRvZ2dsZUtleXBhZCgpXCI+IHRyYW5zaXRpb25fZGlzc29sdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBjb25mZXJlbmNlIGNhbGwgdmlldyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmVyZW5jZS1jYWxsLXZpZXdcIiAqbmdJZj1cImlzQ29uZmVyZW5jZSAmJiBjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWhlYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi1pY29uIG1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi10aXRsZVwiPkNvbmZlcmVuY2UgQ2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGwgb2YgY3VycmVudENhbGxMaXN0OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2FsbD8uaXNDb25mZXJlbmNlSG9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpICE9IDBcIj4mPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYWxsPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VsZk51bWJlcihjYWxsKSBlbHNlIHNlbGZOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY2FsbD8uZnJvbU5hbWUgfHwgY2FsbD8uZnJvbSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50b319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZk51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WW91PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjYWxsPy5jbGllbnRcIj57e2NhbGw/LmRpcmVjdGlvbiA9PSBcIm91dGdvaW5nLWNhbGxcIiA/IGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50byA6IGNhbGw/LmZyb21OYW1lIHx8IGNhbGw/LmZyb20gfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtdGltZXJcIj57eyB0aW1lciB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zIG10LWF1dG9cIiAqbmdJZj1cIiFzaG93S2V5cGFkXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICcyMHB4J31cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uQ2FsbElucHV0RW50ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGlucHV0LWNsZWFyLWJ0blwiICpuZ0lmPVwiY2FsbElucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNNdXRlfVwiIChjbGljayk9XCJ0b2dnbGVNdXRlKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHt7IGlzTXV0ZSA/ICdtaWNfb2ZmJyA6ICdtaWMnIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlS2V5cGFkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY3VycmVudENhbGwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG4gZGFuZ2VyXCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndhdmUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMjQgMTUwIDI4XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0tMTYwIDQ0YzMwIDAgNTgtMTggODgtMThzIDU4IDE4IDg4IDE4IDU4LTE4IDg4LTE4IDU4IDE4IDg4IDE4IHY0NGgtMzUyelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjBcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiM1wiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gSW5jb21pbmcgY2FsbCB1c2VyIGRldGFpbHMgc2hvd24gaW4gbW9kZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXItbW9kZWwgcC0zIHRleHQtd2hpdGUgbW9kZWwtY29udGVudCBjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNDbGlja0V4cGFuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIHVzZXItaW5mby1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlXCI+QzJDIC1QT0lOVCB7e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTFcIj5OYW1lOjwvaDU+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJ0ZXh0LXdoaXRlIHVzZXJOYW1lXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5uYW1lfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TnVtYmVyOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5udW1iZXJ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+RXh0ZW5zaW9uOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uZXh0ZW5zaW9ufX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPkVtYWlsOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3NlbGVjdGVkVXNlckluZm8/LmVtYWlsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlN1YmplY3Q6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yIHN1YmplY3QtdGV4dFwiIHRpdGxlPVwie3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTIgbWItMVwiPkltYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2UgJiYgc2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2UgIT09ICctJzsgZWxzZSBub0ltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e3NlbGVjdGVkVXNlckluZm8/LmltYWdlfX1cIiBhbHQ9XCJcIiB3aWR0aD1cIjE1MFwiIGNsYXNzPVwibWwtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5ObyBJbWFnZSBBdmFpbGFibGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5NZXNzYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyXCIgW2NsYXNzLmV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIj57e3NlbGVjdGVkVXNlckluZm8/Lm1lc3NhZ2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0b2dnbGUtYnRuXCIgKm5nSWY9XCJzaG93QnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVRleHQoKVwiPnt7IGlzRXhwYW5kZWQgPyAnU2VlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcycgOiAnU2VlIG1vcmUnIH19PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPlBvaW50IE5hbWU6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5Tb3VyY2UgTmFtZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uc291cmNlTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGNvbnRhY3QgbGlzdCBwYW5lbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1wYW5lbFwiICpuZ0lmPVwic2hvd0NvbnRhY3RzUGFuZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXY+UGFydGljaXBhbnQ8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoe30sIHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDAwMDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNFQVJDSCBJTlBVVCAodmlzaWJsZSB3aGVuIGlzU2VhcmNoVmlzaWJsZSA9IHRydWUpIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYmFyIHAtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChpbnB1dCk9XCJhcHBseUZpbHRlcigpXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdJZj1cInNlYXJjaFRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Yz8uZmlyc3ROYW1lfX0ge3tjPy5taWRkbGVOYW1lfX0ge3tjPy5sYXN0TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG4gbXItMlwiIChjbGljayk9XCJjYWxsQ29udGFjdChjKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjPy5Jc0Nvbm5lY3RlZFwiIHRpdGxlPVwiQWRkIHRvIGNvbmZlcmVuY2UgY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIsIHRydWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZExpc3QubGVuZ3RoICYmIGlzRGlyZWN0Q2FsbE9wdGlvblNob3cgJiYgc2VhcmNoVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCInYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IHNlYXJjaFRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgdG8gY29uZmVyZW5jZSBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPkluIFRoaXMgQ2FsbDwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtYi0yIG10LTFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0lmPVwiIWM/LmlzTGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG8gfHwgJ1Vua25vd24nIDogYz8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiICpuZ0lmPVwiYz8uY2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlbGZOdW1iZXIoYykgZWxzZSBzZWxmTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM/LnRvTmFtZSB8fCAnVW5rbm93bid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGZOdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPllvdTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb20gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bicgOiBjPy50byB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwiYz8uZnJvbSA9PSBob3N0bnVtYmVyPy5mcm9tICYmIGM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1sYWJlbFwiPk9yZ2FuaXplcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pYy1idG4gbXItMlwiIFtkaXNhYmxlZF09XCJjPy5pc0hvbGRcIiAoY2xpY2spPVwib25NdXRlVXNlcihjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJjPy5pc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFjPy5pc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmlzSG9sZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhvbGRDYWxsKGMpXCIgKm5nSWY9XCIhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIiFjPy5pc0hvbGQgPyAnSG9sZCcgOiAnUmVzdW1lJ1wiPiBwaG9uZV9wYXVzZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlLCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5lY2VDYWxsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjPy5ob3N0ICYmIChkZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGM/LmZyb20pIHx8IChkZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGM/LnRvKSAmJiBjPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPlBhcnRpY2lwYW50IGFkZGVkIHRvIHRoZSBjYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPy5mcm9tTmFtZSB8fCAnVW5rbm93bid9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPy50b05hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCJjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24nIDogYz8udG8gfHwgJ1Vua25vd24nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwiYz8uZnJvbSA9PSBob3N0bnVtYmVyPy5mcm9tICYmIGM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG5cIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byA6IGM/LmZyb20pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+UmVqb2luPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSA6IGM/LnRvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJlam9pbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ29uZmVyZW5jZSBXYXJuaW5nIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiY3VzdG9tLW1vZGFsXCIgKm5nSWY9XCJzaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHdhcm5pbmctbW9kYWxcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPndhcm5pbmc8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aDM+Q29uZmVyZW5jZSBDYWxsIFdhcm5pbmc8L2gzPlxyXG5cclxuICAgIDxwPlxyXG4gICAgICBTdGFydGluZyBhIG5ldyBjYWxsIHdpbGwgcHV0IHRoZSBjdXJyZW50IGNvbmZlcmVuY2Ugb24gaG9sZFxyXG4gICAgICBhbmQgY2Fubm90IGJlIG1lcmdlZCBsYXRlci5cclxuICAgIDwvcD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbE5ld0NhbGwoKVwiPlxyXG4gICAgICAgIENhbmNlbFxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJwcm9jZWVkLWJ0blwiIChjbGljayk9XCJjb25maXJtTmV3Q2FsbCgpXCI+XHJcbiAgICAgICAgUHJvY2VlZFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNNaW5pbWlzZWRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBmdWxsc2NyZWVuXCIgKGNsaWNrKT1cIm1heGltaXNlRGlhbHBhZCgpXCI+IG9wZW5faW5fZnVsbCA8L3NwYW4+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCVcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGwtYW5pbWF0aW9uXCIgaWQ9XCJjYWxsLWF2YXRhclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm1pbi1hdmF0YXItaW1nXCIgW3NyY109XCJjYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjYWxsRGF0YS5uYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDBcIj57e2NhbGxEYXRhLmRpc3BsYXlOdW0gPyBjYWxsRGF0YS5kaXNwbGF5TnVtIDogY2FsbERhdGEucGhvbmUgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWluLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXRpbWVyXCI+e3t0aW1lcn19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLXNlYy1idG5cIiAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSBDYWxsIERpc2Nvbm5lY3QgTW9kYWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJjdXN0b20tbW9kYWxcIiAqbmdJZj1cInNob3dEaXNjb25uZWN0TW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHAtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXIgcC0wIHBiLTJcIj5cclxuICAgICAgICAgICAgPGg0IGNsYXNzPVwidGl0bGUgbWItMFwiPkNhbGwgRGlzY29ubmVjdGVkPC9oND5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFudC1ib2R5IG1iLTJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBFeGl0aW5nIHRoaXMgY2FsbCB3aWxsIG5vdCBlbmQgdGhlIGNvbmZlcmVuY2UuIFRoZSBzZXNzaW9uIHdpbGwgY29udGludWUsIGFuZCBjaGFyZ2VzIHdpbGwgaW5jdXIgdG9cclxuICAgICAgICAgICAgICAgIHlvdXJcclxuICAgICAgICAgICAgICAgIGFjY291bnQuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMCBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNSZWFzb25DaGVja2VkXCIgY2xhc3M9XCJtZS0yXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci0yNGhyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBIb3VyIHBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtc2VsZWN0XCIgW2NsYXNzLmRpc2FibGVkLXBpY2tlcl09XCIhaXNSZWFzb25DaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1kaXNwbGF5XCIgKGNsaWNrKT1cImlzUmVhc29uQ2hlY2tlZCAmJiB0b2dnbGVIb3VyRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVhdmVIb3VyIHx8ICdISCcgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlja2VyLWFycm93XCI+JiM5NjYwOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1vcHRpb25zXCIgKm5nSWY9XCJzaG93SG91ckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGggb2YgaG91cnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwibGVhdmVIb3VyID09PSBoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEhvdXIoaClcIj57eyBoIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBcIj46PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTWludXRlIHBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtc2VsZWN0XCIgW2NsYXNzLmRpc2FibGVkLXBpY2tlcl09XCIhaXNSZWFzb25DaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1kaXNwbGF5XCIgKGNsaWNrKT1cImlzUmVhc29uQ2hlY2tlZCAmJiB0b2dnbGVNaW51dGVEcm9wZG93bigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZWF2ZU1pbnV0ZSB8fCAnTU0nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1hcnJvd1wiPiYjOTY2MDs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uc1wiICpuZ0lmPVwic2hvd01pbnV0ZURyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG0gb2YgbWludXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJsZWF2ZU1pbnV0ZSA9PT0gbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNaW51dGUobSlcIj57eyBtIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGVuZC1idG5cIiAoY2xpY2spPVwibGVhdmVDb25mZXJlbmNlKClcIj5cclxuICAgICAgICAgICAgICAgIExlYXZlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGVuZC1idG5cIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5jZSgpXCIgKm5nSWY9XCJzaG93RW5kQWxsQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICBFbmQgQWxsXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
1709
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQXNCOUMsTUFBTSxPQUFPLHFCQUFxQjtJQXFHaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDN0UsYUFBNEIsRUFDM0IsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM3RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBcEd2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFLdEIsaUJBQVksR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUM1RCx5QkFBb0IsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVsRSxrQkFBYSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBRzdFLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRXhCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUNuQixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsd0JBQXdCO1FBQ3hCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLDBCQUEwQjtRQUMxQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUN2QiwwQkFBcUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNyRSxrQkFBYSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ25FLHlCQUFvQixHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBSTlFLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsZ0JBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUIsZUFBVSxHQUFXLFNBQVMsQ0FBQztRQUcvQixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUV0QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixhQUFRLEdBQVUsRUFBRSxDQUFDO1FBQ3JCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBRzVCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRS9CLDhCQUF5QixHQUFRLEVBQUUsQ0FBQztRQUNwQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFFdEMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBRXZCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsY0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEVBQUU7WUFDUCxJQUFJLEVBQUUsS0FBSztTQUNaLENBQUE7UUFDRCxvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQix1QkFBa0IsR0FBVSxFQUFFLENBQUM7UUFDL0IsNkJBQXdCLEdBQVksS0FBSyxDQUFDO1FBRTFDLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUMzQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUN4QiwwQkFBcUIsR0FBUSxFQUFFLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsc0JBQXNCO1FBQ3RCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsVUFBSyxHQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLFlBQU8sR0FBYSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRXBDLCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUM1QyxvQkFBZSxHQUFRLElBQUksQ0FBQztRQUM1QixvQkFBZSxHQUFHO1lBQ2hCLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLGVBQWU7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFtekNGLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBOE83Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUExaEQxQixPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNoRCxpREFBaUQ7UUFDakQsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtnQkFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2FBQzVDO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDMUQ7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDNUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFO2dCQUNwRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFO2dCQUNqRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDbEUsSUFBSSxDQUFDLFdBQVcsR0FBRztvQkFDakIsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWTtvQkFDbkMsRUFBRSxFQUFFLEtBQUs7b0JBQ1QsR0FBRyxFQUFFLHdCQUF3QjtvQkFDN0IsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxLQUFLO29CQUNuQixZQUFZLEVBQUUsSUFBSTtvQkFDbEIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSztvQkFDOUMsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLE1BQU0sSUFBSSxFQUFFO29CQUM1SSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7aUJBQ2pCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDckQ7U0FDRjtRQUNELElBQUksT0FBTyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFO1lBQ25ILElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBRTtnQkFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN6RTtnQkFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLENBQVMsRUFBRSxFQUFFO29CQUM3RCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7b0JBQzNGLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDbEYsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUN6TSxDQUFBO29CQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUMzRSxJQUFJLDRCQUE0QixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckssSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDckYsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBaUIsRUFBRSxFQUFFO3dCQUN6RCxJQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTs0QkFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsS0FBSyxhQUFhLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO3lCQUNuTDtvQkFDSCxDQUFDLENBQUMsQ0FBQTtvQkFDRixJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTs0QkFDbkUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFO2dDQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDOzZCQUN2Qjs0QkFDRCxJQUFHLGFBQWEsRUFBRSxZQUFZLEVBQUU7Z0NBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDOzZCQUMxQjs0QkFDQyxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUE7NEJBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0NBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ3ZDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FDN0YsQ0FBQTs2QkFDRjs0QkFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDcEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dDQUMvRSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUU7b0NBQ3pGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO3dDQUN4QixHQUFHLEdBQUc7d0NBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxRQUFRO3dDQUNsRCxNQUFNLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLE1BQU07d0NBQzdDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsS0FBSyxJQUFJLHdCQUF3Qjt3Q0FDcEgsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZTt3Q0FDakQsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO3dDQUNuQixnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLEtBQUs7d0NBQ2hELE1BQU0sRUFBRSxLQUFLO3dDQUNiLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBRSxZQUFZO3dDQUNwRCxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7d0NBQzVFLElBQUksRUFBRSxJQUFJO3dDQUNWLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0NBQzlELGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRTt3Q0FDdEIsYUFBYSxFQUFFLFFBQVEsRUFBRSxhQUFhO3dDQUN0QyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNO3dDQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxRQUFRLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDeEUsQ0FBQyxDQUFDO29DQUNILElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dDQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzt3Q0FDeEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUNwQjtpQ0FDRjtxQ0FBTSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsRUFBRTtvQ0FDbEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0NBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUU7d0NBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztxQ0FDdkM7eUNBQU07d0NBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FDQUN2QztvQ0FDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3Q0FDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUE7d0NBQ3ZELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDcEI7b0NBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lDQUM3QztxQ0FBTSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7b0NBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUc7d0NBQzVCLEdBQUcsR0FBRzt3Q0FDTixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLFFBQVE7d0NBQ2xELE1BQU0sRUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTTt3Q0FDN0MsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLE9BQU8sRUFBRSxLQUFLLElBQUksd0JBQXdCO3dDQUNwSCxjQUFjLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlO3dDQUNqRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07d0NBQ25CLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLElBQUksS0FBSzt3Q0FDaEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO3dDQUNuQixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVk7d0NBQ3JFLFlBQVksRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTt3Q0FDM0UsSUFBSSxFQUFFLElBQUk7d0NBQ1YsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3Q0FDOUQsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFO3dDQUN0QixhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWE7d0NBQ3RDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU07d0NBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUN4RSxDQUFDO2lDQUNIOzZCQUNGO2lDQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFO2dDQUNqRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztvQ0FDeEIsR0FBRyxHQUFHO29DQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsUUFBUTtvQ0FDaEQsTUFBTSxFQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxNQUFNO29DQUMvQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSx3QkFBd0I7b0NBQ25ILGNBQWMsRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWU7b0NBQ2hELE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTTtvQ0FDbkIsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sSUFBSSxLQUFLO29DQUNoRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07b0NBQ25CLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtvQ0FDckUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO29DQUMzRSxJQUFJLEVBQUUsSUFBSTtvQ0FDVixLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29DQUM3RCxhQUFhLEVBQUUsR0FBRyxDQUFDLEVBQUU7b0NBQ3JCLGFBQWEsRUFBRSxRQUFRLEVBQUUsYUFBYTtvQ0FDdEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTTtvQ0FDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7aUNBQ3hFLENBQUMsQ0FBQztnQ0FDSCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQ0FDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7NkJBQ2hDOzRCQUNILElBQUk7d0JBQ04sQ0FBQyxDQUFDLENBQUE7d0JBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTt5QkFDM08sQ0FBQztxQkFDSDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7d0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7d0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO3dCQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7NEJBQ2xCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt5QkFDekM7d0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO3FCQUMxQjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFFRixJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDeEcsSUFBSSxXQUFXLEdBQU8sRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUN4RSxPQUFPLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFO3dCQUNuRCxJQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUU7NEJBQ3ZQLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQy9CO3dCQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQTtvQkFDN1AsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7b0JBQzNHLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFDLENBQUM7b0JBQ2hULElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUUsSUFBSSxDQUFDO29CQUN2QyxJQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO3dCQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFFLElBQUksQ0FBQztxQkFDeEM7aUJBQ0Y7cUJBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUU7b0JBQzVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25GLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUMxQjtxQkFBTSxJQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQztvQkFDakgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRTtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkQsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsRUFBRTt3QkFDbEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUUsTUFBTSxDQUFDOytCQUNySixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO3dCQUN4SSxJQUFJLFlBQVksRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFOzRCQUNuRCxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0NBQzdCLGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0NBQ2pDLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWTtnQ0FDeEMsSUFBSSxFQUFFLEtBQUs7Z0NBQ1gsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLElBQUksS0FBSzs2QkFDbEMsQ0FBQyxDQUFDOzRCQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQ3BELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7eUJBQ3JDO3FCQUNGO2lCQUNGO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLHVCQUF1QixDQUFDLENBQUE7Z0JBQ2hFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRTtvQkFDeEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUM5RyxJQUFJLFlBQVksRUFBRTt3QkFDaEIsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBQ25DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztxQkFDeEI7eUJBQU07d0JBQ0wsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxZQUFZLEVBQUUsYUFBYSxFQUFFOzRCQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDOzRCQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0NBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs2QkFDeEI7eUJBQ0Y7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzs0QkFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7eUJBQzVCO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO29CQUNyRixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7d0JBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDckQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztxQkFDeEI7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFBO2dCQUNsRixNQUFNLFVBQVUsR0FBRztvQkFDakIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUNqRixDQUFDO2dCQUVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDekQsR0FBRyxJQUFJO29CQUNQLGNBQWMsRUFBRSxjQUFjLEtBQUssR0FBRyxDQUFDLEVBQUU7aUJBQzFDLENBQUMsQ0FBQyxDQUFDO2FBQ0w7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUU7Z0JBQzdDLHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO2dCQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDekM7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xCLDRCQUE0QjtnQkFDOUIsVUFBVTthQUNUO1lBQUEsQ0FBQztTQUNIO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRTtZQUM1RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWE7UUFDNUIsSUFBSTtZQUNGLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUN6RSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FDbkUsQ0FBQTtZQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFFOUIsd0NBQXdDO1lBQ3hDLE1BQU0sU0FBUyxHQUFRLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUUvRSx1QkFBdUI7WUFDdkIsTUFBTSxPQUFPLEdBQVE7Z0JBQ25CLGdCQUFnQixFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDbEMsZUFBZSxFQUFFLElBQUk7YUFDdEIsQ0FBQztZQUVGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFekQsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNwQyxNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUk7b0JBQ2hDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO29CQUM1QixHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7b0JBQ3BCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNO29CQUNqQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsWUFBWTtpQkFDbEQ7Z0JBQ0QsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFO2FBQ25ELENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDcEIsSUFBSTtvQkFDQSxJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDdEQsSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUk7d0JBQ2hDLEtBQUssRUFBRSxVQUFVO3dCQUNqQixpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxFQUFFO3dCQUM1QyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsWUFBWTt3QkFDakQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7d0JBQ3JELEtBQUssRUFBRSxFQUFFO3dCQUNULFdBQVcsRUFBRSxFQUFFO3dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQztxQkFDNUMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2lCQUM1QjtnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN4RDtZQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUdYO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsZUFBZTtZQUNyQixNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7UUFFRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxTQUFTLENBQUMsR0FBUTtRQUNoQixJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxFQUFFO1lBQ3JDLE9BQU8sR0FBRyxFQUFFLFVBQVUsSUFBSSxrQkFBa0IsSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxVQUFVLElBQUksa0JBQWtCLElBQUksR0FBRyxFQUFFLFVBQVUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2pMO2FBQU07WUFDTCxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxFQUFFO2dCQUNoRSxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQ2pELENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVsQywrQkFBK0I7WUFDL0IsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9DO2lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUN4QjtZQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQWEsRUFBRSxlQUF5QjtRQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxJQUFJO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixNQUFNLE9BQU8sR0FBRztnQkFDZCxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7Z0JBQ2hDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNyRCxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ2xCLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDekIsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixTQUFTLEVBQUUsSUFBSTtnQkFDZixRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsTUFBTSxFQUFFLElBQUk7Z0JBQ1osTUFBTSxFQUFFLElBQUk7Z0JBQ1osU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztZQUNGLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxVQUFVLEVBQUUsRUFBRTtnQkFDZCxZQUFZLEVBQUUsRUFBRTtnQkFDaEIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLFdBQVcsRUFBRSxFQUFFO2dCQUNmLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsRUFBRSxFQUFFLFVBQVU7Z0JBQ2QsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksd0JBQXdCO2dCQUM3QyxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsS0FBSztnQkFDYixRQUFRLEVBQUUsRUFBRTtnQkFDWixJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUMxQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDNUIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDekIsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU07YUFDeEMsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRyxTQUFTLEVBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JGLHNDQUFzQztnQkFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyw2QkFBNkI7Z0JBQzNELHNFQUFzRTtnQkFDdEUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzVELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFdEMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUNwQixJQUFJO3dCQUNGLGtEQUFrRDt3QkFDbEQsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7NEJBQ3RELElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSTs0QkFDcEIsS0FBSyxFQUFFLFVBQVU7NEJBQ2pCLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxLQUFLOzRCQUNsQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFOzRCQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzs0QkFDckQsS0FBSyxFQUFFLEVBQUU7NEJBQ1QsV0FBVyxFQUFFLEVBQUU7NEJBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFROzRCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDO3lCQUM1QyxDQUFDLENBQUM7d0JBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO3dCQUVoRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDOzRCQUM1QyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7NEJBQ3BCLEtBQUssRUFBRSxVQUFVOzRCQUNqQixpQkFBaUIsRUFBRSxRQUFRLEVBQUUsS0FBSzs0QkFDbEMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTs0QkFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7NEJBQ3JELEtBQUssRUFBRSxFQUFFOzRCQUNULFdBQVcsRUFBRSxFQUFFOzRCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt5QkFDeEIsQ0FBQyxDQUFDO3dCQUVILElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFBO3dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQy9CLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDbkU7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDdkQ7Z0JBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUNSLG9DQUFvQzthQUNyQztpQkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDaEI7U0FFRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLENBQU07UUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JCLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDaEMsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUFZO1lBQzdCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNkLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNO1lBQ2hCLFVBQVUsRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLEtBQUs7U0FDcEMsQ0FBQyxDQUFBO1FBQ0YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDckIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBTTtRQUNyQixJQUFJLENBQUMseUJBQXlCLENBQUM7WUFDN0IsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUNoQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFlBQVk7WUFDN0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDZixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLO1NBQ3ZCLENBQUMsQ0FBQTtRQUNGLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3JDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFNLEVBQUUsWUFBc0IsRUFBRSxTQUFtQjtRQUNqRSxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksSUFBSSx5QkFBeUIsRUFBRSxZQUFZLENBQUM7UUFDN0UsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGFBQWEsSUFBSSx5QkFBeUIsRUFBRSxhQUFhLENBQUM7UUFDaEYsSUFBSSxHQUFHLEdBQVEsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzdFLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsRUFBRTtZQUNwRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7U0FDckM7UUFDRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFZO1FBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsT0FBWTtRQUMxQyxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQVk7UUFDN0MsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQVk7UUFDdkMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxhQUFrQjtRQUMxRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVGLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBWTtRQUMxQyxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsYUFBa0IsRUFBRSxZQUFpQjtRQUN2RSxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNwRyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFhO1FBQ3ZDLE9BQU87WUFDTCxFQUFFLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hCLFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVU7WUFDeEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSztTQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxVQUFrQjtRQUNuRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEcsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBVSxFQUFFLFFBQWEsRUFBRSxTQUFjO1FBQ3JFLE1BQU0sT0FBTyxHQUFRO1lBQ25CLGdCQUFnQixFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUNsQyxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3BDLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDbEIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUNwQixLQUFLLEVBQUUsS0FBSztnQkFDWixHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU07YUFDckI7WUFDRCxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1NBQ2hDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLG1CQUFtQjtRQUV6QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDeEIsa0JBQWtCO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixpR0FBaUc7WUFDakcsSUFBSTtnQkFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQztnQkFDekMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtvQkFDdEUsNElBQTRJO29CQUM1SSxvQkFBb0I7b0JBQ3BCLGlEQUFpRDtvQkFDakQsZ0RBQWdEO29CQUNoRCxJQUFJO2lCQUNMO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVUsQ0FBQyxNQUFlO1FBQ2hDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV0QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtZQUNmLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDYjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxTQUFTO1FBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRU8sVUFBVSxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUN2RTthQUFNO1lBQ0wsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVTLEdBQUcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ08sV0FBVyxDQUFDLEtBQVU7UUFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVU7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUM1TCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUN0QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQTtnQkFDdkcsSUFBSSxlQUFlLEdBQUcsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO3VCQUN6SCxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7Z0JBQ3JKLElBQUksVUFBVSxFQUFFLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtpQkFDaEM7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDaEI7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQXNCO1FBQ2xDLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUU7Z0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUI7U0FDRjthQUFNO1lBQ0wsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLHlCQUF5QixFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUdELEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBc0I7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JCLGFBQWEsRUFBRSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsSUFBSSx5QkFBeUIsRUFBRSxFQUFFLENBQUM7WUFDekYsWUFBWSxFQUFFLHlCQUF5QixFQUFFLFlBQVk7WUFDckQsSUFBSSxFQUFFLHlCQUF5QixDQUFDLE1BQU07WUFDdEMsSUFBSSxFQUFFLENBQUMseUJBQXlCLEVBQUUsTUFBTTtZQUN4QyxVQUFVLEVBQUUseUJBQXlCLENBQUMsWUFBWSxJQUFJLEtBQUs7U0FDNUQsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLGlCQUFpQjtJQUVqQixzQkFBc0I7SUFDdEIsNkJBQTZCO0lBQzdCLGlDQUFpQztJQUNqQyxxRkFBcUY7SUFDckYsTUFBTTtJQUVOLDhCQUE4QjtJQUU5Qix5REFBeUQ7SUFDekQsMkVBQTJFO0lBQzNFLFFBQVE7SUFDUixJQUFJO0lBRUosa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQjthQUM3QixPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7YUFDakQsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDO2VBQ3hILENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxSixDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxRQUFjLEVBQUUsT0FBaUI7UUFDbkQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzNELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGdCQUFvQjtRQUMxQyxJQUFJLGFBQWEsR0FBUSxFQUFFLENBQUE7UUFDM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuSSxJQUFJLFFBQVEsRUFBRTtZQUNSLGFBQWEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUNuTCxDQUFBO1NBQ0Y7UUFFRCxJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUU7WUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdkMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0JBQ25DLGFBQWEsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLFlBQVksRUFBRSxhQUFhLEVBQUUsWUFBWTtnQkFDekMsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLElBQUksS0FBSzthQUNuQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQVU7UUFDbEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2pELElBQUksT0FBTyxHQUFHO1lBQ1osUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2xCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNO1lBQ3BCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE9BQU87WUFDdEUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLElBQUksSUFBSTtTQUN6QyxDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7WUFDaEYsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDckIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDekM7aUJBQU07Z0JBQ0wsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUM1RixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFZLEVBQUUsZUFBeUI7UUFDdkQsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLEtBQUssQ0FBQztRQUNwRyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLFdBQVcsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1TSxJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzdELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJO1lBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixJQUFJLElBQUksR0FBUSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDOUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU07b0JBQy9FLEtBQUssRUFBRSxVQUFVO29CQUNqQixpQkFBaUIsRUFBRSxXQUFXO29CQUM5QixZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZO29CQUM1QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLEtBQUssRUFBRSxFQUFFO29CQUNULFdBQVcsRUFBRSxFQUFFO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyx5QkFBeUIsQ0FBQztvQkFDN0IsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQztvQkFDcEMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtvQkFDNUMsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEtBQUs7b0JBQ3JDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksV0FBVztvQkFDbEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksd0JBQXdCO29CQUM3QyxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWE7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDbkMsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxJQUFJO2lCQUNuQixDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxJQUFJLGNBQWMsR0FBTyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFNLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO3dCQUN0RixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDdkM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsMkJBQTJCO2dCQUczQixvQ0FBb0M7Z0JBQ3BDLElBQUksSUFBSSxHQUFRLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO29CQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU07b0JBQzFELEtBQUssRUFBRSxVQUFVO29CQUNqQixpQkFBaUIsRUFBRSxXQUFXO29CQUM5QixZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZO29CQUM1QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLEtBQUssRUFBRSxFQUFFO29CQUNULFdBQVcsRUFBRSxFQUFFO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFFekIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7Z0JBQ3hDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO29CQUNuQyxhQUFhLEVBQUUsY0FBYztvQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTtvQkFDM0MsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUk7b0JBQ1YsVUFBVSxFQUFFLElBQUk7aUJBQ2pCLENBQUMsQ0FBQztnQkFFSCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksV0FBVztvQkFDbEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksd0JBQXdCO29CQUM3QyxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWE7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDbkMsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxLQUFLO2lCQUNwQixDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7YUFDaEM7U0FDRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxlQUF5QjtRQUNqRSxJQUFJO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcE0sSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxNQUFNLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3hELE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLE1BQU0sS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDLENBQUM7Z0JBQzlDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO2dCQUNoRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFBO1lBQ3RFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV4Qyx5Q0FBeUM7WUFDekMsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTO2dCQUN4QixHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSx3QkFBd0I7Z0JBQy9DLEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07Z0JBQ2xDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTthQUNwQyxDQUFDO1lBRUYsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixJQUFJLGFBQWEsR0FBUSxFQUFFLENBQUE7Z0JBQzNCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ25JLElBQUksUUFBUSxFQUFFO29CQUNaLGFBQWEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUNuTCxDQUFBO2lCQUNGO2dCQUVELElBQUksYUFBYSxFQUFFLEVBQUUsRUFBRTtvQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUNuQyxhQUFhLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO3dCQUNsQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVk7d0JBQ3pDLElBQUksRUFBRSxJQUFJO3dCQUNWLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQ25DLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO29CQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDbkM7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ25DO2dCQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTthQUMvQjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNqRSxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUNELFlBQVksQ0FBQyxRQUFhLEVBQUUsbUJBQW1CLEdBQUcsS0FBSztRQUVyRCxxQ0FBcUM7UUFDckMsSUFBSSxtQkFBbUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFFMUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7WUFDaEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztZQUV2QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXpCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHO2dCQUNyQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsZUFBZTtnQkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztnQkFDbEMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSzthQUN2QyxDQUFDO1lBRUYsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDcEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQW9CO1FBQ3BDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMzQixxREFBcUQ7WUFDckQsSUFBSSxTQUFTLEdBQVEsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekUsTUFBTSxHQUFHLEdBQVEsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFO2dCQUNyQixPQUFPLEdBQUcsRUFBRSxRQUFRLENBQUE7YUFDckI7aUJBQU07Z0JBQ0wsT0FBTyxZQUFZLENBQUE7YUFDcEI7U0FDRjthQUFNO1lBQ0wsT0FBTyxZQUFZLENBQUE7U0FDcEI7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFjO1FBQ2xDLElBQUk7WUFDRixJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDckMsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLENBQUMsK0NBQStDO1lBQzNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsQ0FBQyxrRUFBa0U7U0FDaEY7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWU7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNmLEdBQUcsRUFBRSxPQUFPO1lBQ1osSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDO1FBQ0YsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUM5QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUgsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFlBQW9CO1FBQzNDLFVBQVUsQ0FBQyxHQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUMvRCxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO29CQUN2QixNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUUsWUFBWSxJQUFJLEdBQUcsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO29CQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsT0FBTztxQkFDUjtvQkFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDM0MsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBTSxFQUFFLEVBQUU7d0JBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBRXhDLE9BQU87NEJBQ0wsR0FBRyxDQUFDOzRCQUNKLFFBQVEsRUFBRSxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVE7NEJBQ2hDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU07eUJBQzNCLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztvQkFFRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7b0JBQzlDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztvQkFHeEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7Z0JBQ3BDLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDUixDQUFDO0lBRUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFhLEVBQUUsZ0JBQTBCO1FBQ3ZELDRDQUE0QztRQUM1QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFNLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsRUFBRSxZQUFZLElBQUksUUFBUSxFQUFFLFlBQVksRUFBRTtnQkFDN0MsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDbkwsQ0FBQTtnQkFDRCxJQUFJLGVBQWUsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUNuQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO3dCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7d0JBQzNDLElBQUksRUFBRSxLQUFLO3dCQUNYLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQ3JDLENBQUMsQ0FBQztvQkFDSCxvQ0FBb0M7aUJBQ3JDO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDbkwsQ0FBQTtnQkFDRCxJQUFJLGVBQWUsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFO29CQUNuRCxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQzt3QkFDbkMsYUFBYSxFQUFFLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzt3QkFDcEMsWUFBWSxFQUFFLGVBQWUsRUFBRSxZQUFZO3dCQUMzQyxJQUFJLEVBQUUsSUFBSTt3QkFDVixJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksSUFBSSxLQUFLO3FCQUNyQyxDQUFDLENBQUM7b0JBQ0gsb0NBQW9DO2lCQUNyQzthQUNGO1lBQ0QsSUFBSSxDQUFDLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO2dCQUN0RixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztvQkFDbkMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQztvQkFDakMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO29CQUM1QixJQUFJLEVBQUUsSUFBSTtvQkFDVixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLO2lCQUN2QixDQUFDLENBQUM7Z0JBQ0gsb0NBQW9DO2FBQ3JDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsaUhBQWlIO0lBQ2pILHNDQUFzQztJQUN0QyxJQUFJO0lBRUosdUJBQXVCO0lBQ3ZCLDhEQUE4RDtJQUM5RCwyQ0FBMkM7SUFDM0MsdURBQXVEO0lBQ3ZELCtEQUErRDtJQUMvRCxrQ0FBa0M7SUFDbEMsc0RBQXNEO0lBQ3RELG9EQUFvRDtJQUNwRCwrQ0FBK0M7SUFDL0MsOEJBQThCO0lBQzlCLHlDQUF5QztJQUN6QyxrQ0FBa0M7SUFDbEMsbUJBQW1CO0lBQ25CLG1DQUFtQztJQUNuQyxZQUFZO0lBQ1osNkNBQTZDO0lBQzdDLFVBQVU7SUFDVixVQUFVO0lBQ1YsaUNBQWlDO0lBQ2pDLGdDQUFnQztJQUNoQyxnQ0FBZ0M7SUFDaEMsTUFBTTtJQUNOLElBQUk7SUFFSixlQUFlLENBQUMsUUFBYTtRQUMzQixJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTVCLG1EQUFtRDtRQUNuRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7WUFDekQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDOUMsT0FBTyxDQUFDLENBQUMsQ0FDUCxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssR0FBRztnQkFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEdBQUc7Z0JBQ2hDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxHQUFHO2dCQUNwQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztnQkFDeEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEdBQUc7Z0JBQzFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHO2dCQUN4QyxJQUFJLENBQUMsR0FBRztnQkFDUixJQUFJLENBQUMsUUFBUTtnQkFDYixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7U0FDSDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFRO1FBQ25CLElBQUk7WUFDRixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtvQkFDZCxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM1RDtxQkFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7b0JBQ3JCLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzVEO3FCQUFNO29CQUNMLElBQUksS0FBSyxDQUFDLGdDQUFnQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM5RDtnQkFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzthQUMxQjtZQUNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM1QjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUk7WUFDRixJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBUztRQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUU3QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7WUFFcEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzthQUMxQjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7YUFBTTtZQUNMLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLDZFQUE2RTtZQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLE1BQU0sRUFBRTtnQkFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMxQjtTQUNGO0lBQ0gsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxHQUFHLENBQUM7UUFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQzdDLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO1FBRS9GLElBQUksT0FBTyxHQUFHO1lBQ1osY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtTQUMvQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUM3RixRQUFRLENBQUMsRUFBRTtZQUNULElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxtREFBbUQ7UUFDckQsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsZUFBZTtRQUNiLHNEQUFzRDtRQUN0RCxnREFBZ0Q7UUFDaEQsSUFBSTtRQUNKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsU0FBaUI7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBRXhFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFFMUIsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xELE1BQU0sRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVsRCxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1lBQ3hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBUSxvQ0FBb0M7U0FDaEY7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxPQUFPLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELGNBQWMsQ0FBQyxVQUFrQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyw0QkFBNEI7UUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsdUJBQXVCO1FBQ2xELElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDeEMsV0FBVyxJQUFJLFlBQVksQ0FBQztZQUM1QixJQUFJO2dCQUNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQXdCLENBQUM7Z0JBQy9HLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ3hELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxhQUFhLEVBQUU7d0JBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7d0JBQ2xELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ3hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt5QkFDdkI7d0JBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUMzQjt5QkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFO3dCQUMxQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzFCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7cUJBQ3RCO2lCQUNGO2FBQ0Y7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDM0I7WUFDRCxJQUFJLFdBQVcsSUFBSSxPQUFPLEVBQUU7Z0JBQzFCLDJEQUEyRDtnQkFDM0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFPO1FBQ3hCLElBQUcsRUFBRSxFQUFFO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDcEQsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUNELHdCQUF3QixDQUFDLElBQVM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFO2dCQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxDQUFDLEVBQUUsWUFBWSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNwQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixDQUFDLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBUztRQUNyQixJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRTtZQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFTO1FBQzdCLElBQUksT0FBTyxHQUFHO1lBQ1osUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2xCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSTtTQUMxRSxDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQzFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRTdDLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ25DLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNoSyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDZCxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUN6QjtxQkFBTTtvQkFDTCxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUMxQjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ2xELE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDMUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDdEcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckksQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ25DLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDO1lBQ3BELENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO1lBQzlDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDZCxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNMLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxlQUFlO1FBQ2IsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBZ0IsQ0FBQztRQUNwRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUlELGtDQUFrQztJQUNsQyxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFTO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQTtZQUNyTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUNwRjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUU7WUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ3BILElBQUksZUFBZSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzttQkFDekgsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3JKLElBQUksVUFBVSxFQUFFLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTthQUNoQztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNqQztJQUVILENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFhO1FBQ3hCLElBQUksT0FBTyxHQUFHO1lBQ1osUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNO1lBQ3BCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE9BQU87WUFDdEUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLElBQUksSUFBSTtTQUM3QyxDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7WUFDaEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxZQUFZLENBQUMsV0FBZ0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUksQ0FBQztJQUVELE9BQU8sQ0FBQyxNQUFXO1FBQ2pCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDOUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSyxNQUFNLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLEVBQUUsU0FBUyxJQUFJLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFLFNBQVMsSUFBSSxFQUFFLElBQUksV0FBVyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ2xJLENBQUM7SUFDRCxNQUFNLENBQUMsTUFBVztRQUNoQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUssTUFBTSxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUE7SUFDbkMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlFLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QztJQUNILENBQUM7O21IQXR2RFUscUJBQXFCO3VHQUFyQixxQkFBcUIsK2xCQzlCbEMseTNyQ0E4b0JNOzRGRGhuQk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjsyT0FLcEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFtQkcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FsbCwgRGV2aWNlIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9leHRlbnNpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi8uLi8uLi9rZXlwYWQnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pbmNvbWVpbmctY2FsbC1zb2NrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2lwLWFkZHJlc3Muc2VydmljZSc7XHJcblxyXG5cclxuaW50ZXJmYWNlIENhbGxEZXRhaWxzIHtcclxuICBjYWxsU2lkOiBzdHJpbmc7XHJcbiAgY2FsbFN0YXR1czogc3RyaW5nO1xyXG59XHJcbmludGVyZmFjZSBDYWxsU3RhdHVzUmVzcG9uc2Uge1xyXG4gIGNhbGxEZXRhaWxzOiBDYWxsRGV0YWlscztcclxuICByZXNwb25zZTogc3RyaW5nO1xyXG4gIGVycm9yVHlwZTogbnVtYmVyO1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICBzdGF0dXM6IG51bWJlcjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FsbC1wcm9ncmVzcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgY2FsbERhdGE6IGFueTtcclxuICBASW5wdXQoKSBzZWxlY3RlZENhbGxlcklkOiBhbnk7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhbGxlcklkTGlzdDogYW55ID0gW107XHJcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcclxuICBASW5wdXQoKSBjYWxsQWN0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgY29uZmVyZW5jZUNhbGxJbmZvOiBhbnk7XHJcbiAgdXNlcklkOiBhbnk7XHJcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxzTmV3SW5mbzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBkZXZpY2U/OiBEZXZpY2U7XHJcbiAgY2FsbCE6IENhbGwgfCBhbnk7XHJcbiAgc2hvd1JpbmdBbmltYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0aW1lcjogc3RyaW5nID0gJzAwOjAwJztcclxuICBpbnRlcnZhbElkOiBhbnk7XHJcbiAgc2hvd0tleXBhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGtleXBhZFZhbCA9IGtleXBhZDtcclxuICBjYWxsSW5wdXQ6IHN0cmluZyA9ICcnO1xyXG4gIGlzTXV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRpc2JhbGVFbmRDYWxsQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93Q2xlYXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NvbGxvcHMgPSBmYWxzZTtcclxuICBjdXJyZW50Q2FsbDogYW55O1xyXG4gIC8vIENvbmZlcmVuY2Ugc3RhdGUgZmxhZ1xyXG4gIGlzQ29uZmVyZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzT3V0Z29pbmdDYWxsOiBib29sZWFuID0gdHJ1ZTtcclxuICAvLyBJbmNvbWluZyBjYWxsIHZhcmlhYmxlc1xyXG4gIGluY29taW5nQ2FsbERpdjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgaXNMb2FkZXJzaG93bjogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBPdXRwdXQoKSBlbmRJbmNvbWluZ0NhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBSZWNvcmRpbmcgdmFyaWFibGVzXHJcbiAgY2FsbFNpZDogYW55O1xyXG4gIGlzUmVjb3JkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQYXVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuICB0aW1lRWxhcHNlZCA9IDA7IC8vIGluIHNlY29uZHNcclxuICByZWNvcmRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW5jb21pbmdDYWxsU2lkOiBhbnk7XHJcbiAgY2FsbFN0YXR1czogc3RyaW5nID0gJ3JpbmdpbmcnO1xyXG4gIGluY29taW5nUmVjb3JkQ2FsbD86IGFueTtcclxuICBzZWxlY3RlZEluY29taW5nQ2FsbDogYW55O1xyXG4gIHNob3dDb250YWN0c1BhbmVsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGVsZENhbGw/OiBDYWxsO1xyXG4gIGlzQ2FsbE9uSG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xyXG4gIGN1cnJlbnRDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBjb25mZXJlbmNlSWQ6IGFueTtcclxuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcclxuICBpc0NsaWNrRXhwYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDYWxsSW5Qcm9ncmVzcyE6IGJvb2xlYW47XHJcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XHJcbiAgaXNDb25mZXJlbmNlQ2FsbEhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFVzZXJJbmZvOiBhbnk7XHJcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuICBmaWx0ZXJlZExpc3Q6IGFueSA9IFtdO1xyXG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgc2hvd0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUmluZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRGlyZWN0Q2FsbE9wdGlvblNob3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaWFsQWxlcnQgPSB7XHJcbiAgICBtc2c6ICcnLFxyXG4gICAgc2hvdzogZmFsc2VcclxuICB9XHJcbiAgbGVmdFBhcnRpY2lwZW50OiBhbnkgPSB7fTtcclxuICBjb25mZXJlbmNlQ2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaG9zdG51bWJlcjogYW55O1xyXG4gIGlzTmV3QWRkZWRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGV2aWNlTnVtYmVyTGlzdDogYW55ID0gW107XHJcbiAgb3VyTnVtYmVySW5mbzogYW55ID0ge307XHJcbiAgY3VycmVudENvbmZlcmVuY2VDYWxsOiBhbnkgPSB7fTtcclxuICBpc1JlYXNvbkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0FsbEFjY2VwdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGVhdmVSZWFzb246IHN0cmluZyA9ICcnO1xyXG4gIC8vIDI0LWhvdXIgdGltZSBwaWNrZXJcclxuICBsZWF2ZUhvdXI6IHN0cmluZyA9ICcnO1xyXG4gIGxlYXZlTWludXRlOiBzdHJpbmcgPSAnJztcclxuICBob3Vyczogc3RyaW5nW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpO1xyXG4gIG1pbnV0ZXM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNjAgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKTtcclxuICBzaG93SG91ckRyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd01pbnV0ZURyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRDb25mOiBhbnk7XHJcbiAgc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwZW5kaW5nQ2FsbERhdGE6IGFueSA9IG51bGw7XHJcbiAgY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgc2hvdzogZmFsc2UsXHJcbiAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICBudW1iZXI6ICcnLFxyXG4gICAgZGlzcGxheU51bTogJydcclxuICB9O1xyXG4gIGlzVW5ob2xkQ29uZmVyZW5jZUNhbGw6IGFueTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpcFNlcnZpY2U6IElwQWRkcmVzc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlOiBJbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZVxyXG4gICkge1xyXG4gICAgY29uc29sZS5sb2coJ0NhbGwgUHJvZ3Jlc3MgQ29tcG9uZW50Jyk7XHJcbiAgICB0aGlzLmNhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc29sZS5sb2coJ0NhbGwgUHJvZ3Jlc3MgQ29tcG9uZW50IG5nT25Jbml0Jyk7XHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW5jb21pbmcgY2FsbHMgZnJvbSBUd2lsaW9TZXJ2aWNlXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCkge1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBpbmNvbWluZyBjYWxsczonLCBlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICAgdGhpcy5HZXRDb250YWN0c0xpc3QoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnVzZXJJZCkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snY2FsbERhdGEnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/LmlzSW5jb21pbmdDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0ZXN0LXN0YXJ0Q2FsbDEyMycsIGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKVxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAuLi5jaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICAgIGlkOiAnMTI1JyxcclxuICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgIHBob25lOiBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8ucGhvbmUsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiAnMTIxJyxcclxuICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoIHx8IGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LnByZXZpb3VzVmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZU51bWJlckxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IGkgPT0gMCA/IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0uY29uZmVyZW5jZUlkIDogdGhpcy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICBsZXQgb3VyTnVtYmVySW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHRoaXMuaXNNdXRlID0gIW91ck51bWJlckluZm8/LmlzSG9sZCA/IG91ck51bWJlckluZm8/LmlzTXV0ZSA6IHRoaXMuaXNNdXRlO1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRjYWxsUGFydGljaXBhbnRMaXN0SUQgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKHJlcyk9PiByZXMuY29uZmVyZW5jZUlkID09IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0uY29uZmVyZW5jZUlkKS5tYXAoKHJlcyk9PiByZXMucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICBsZXQgdXBkYXRlZExpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLnBhcnRpY2lwYW50cy5tYXAoKHJlczphbnkpID0+IHJlcy5pZCk7XHJcbiAgICAgICAgICBjdXJyZW50Y2FsbFBhcnRpY2lwYW50TGlzdElELmZvckVhY2goKHBhcnRpY2lwYW50SWQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCF1cGRhdGVkTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudElkKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXNJbmZvOmFueSkgPT4gcmVzSW5mbz8ucGFydGljaXBhbnRJZCAhPT0gcGFydGljaXBhbnRJZCB8fCAocmVzSW5mbz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAhcmVzSW5mbz8uaXNBY2NlcHRDYWxsKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGlmIChvdXJOdW1iZXJJbmZvPy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLnBhcnRpY2lwYW50cy5mb3JFYWNoKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXM/Lmhvc3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdG51bWJlciA9IHJlcztcclxuICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgIGlmKG91ck51bWJlckluZm8/LmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjb250YWN0OiBhbnkgPSB7fVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFjdHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChyZXNEYXRhKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc0RhdGE/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgPT0gKHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50bylcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSByZXM/LmlkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xICYmICFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCByZXM/LmZyb21OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiB0aGlzLmlzQ29uZmVyZW5jZSB8fCByZXM/LmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gLTEgJiYgKHJlcz8uaXNMZWZ0IHx8IHJlcz8uc3RhdHVzID09ICduby1hbnN3ZXInIHx8IHJlcz8uc3RhdHVzID09ICdjYW5jZWxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dDb250YWN0c1BhbmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmN1cnJlbnRDYWxsPy5qb2luZWRBdCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gLTEgJiYgIXJlcz8uaXNMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbU5hbWU6IHRoaXMuZ2V0TmFtZShyZXM/LmZyb20pIHx8IHJlcz8uZnJvbU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWc6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IG91ck51bWJlckluZm8/LmlzSG9sZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTXV0ZTogcmVzPy5pc011dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UgPyByZXMuaXNDb25mZXJlbmNlIDogdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCByZXM/LmZyb21OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGltZzogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICBpc0hvbGQ6IHJlcz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IG91ck51bWJlckluZm8/LmlzSG9sZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBpc011dGU6IHJlcz8uaXNNdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogcmVzLmlzQ29uZmVyZW5jZSA/IHJlcy5pc0NvbmZlcmVuY2UgOiB0aGlzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZVNpZDogY2FsbEluZm8/LmNvbmZlcmVuY2VTaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHJlcz8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5sZWZ0UGFydGljaXBlbnRbY2FsbEluZm8/LmNvbmZlcmVuY2VJZF0gPSBbLi4ubmV3IE1hcChjYWxsSW5mbz8ucGFydGljaXBhbnRzLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5pc0xlZnQgPT09IHRydWUpLm1hcCgoaXRlbTogYW55KSA9PiBbaXRlbT8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGl0ZW0/LnRvIHx8ICdVbmtub3duJyA6IGl0ZW0/LmZyb20sIGl0ZW1dKSkudmFsdWVzKClcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmluZ2luZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCB2YWxpZFZhbHVlcyA9IG5ldyBTZXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mbGF0TWFwKChpdGVtOiBhbnkpID0+IGl0ZW0/LnBhcnRpY2lwYW50cy5tYXAoKHZhbDogYW55KSA9PiB2YWw/LmlkKSkpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IHZhbGlkVmFsdWVzLmhhcyhpdGVtPy5wYXJ0aWNpcGFudElkKSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDYWxsOmFueSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiBpdGVtPy5wYXJ0aWNpcGFudHM/LmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDYWxsLnB1c2gocGFydGljaXBhbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzLmxlbmd0aCA9PSAyICYmIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0/LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gey4uLnRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiAhcmVzPy5pc0NvbmZlcmVuY2VIb2xkICYmICgocmVzPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlcz8uY2xpZW50ICYmICF0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzPy5mcm9tKSkgfHwgKHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlcz8udG8pKSB8fCAhcmVzPy5jbGllbnQpKX07XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsWydpc0FjY2VwdENhbGwnXT0gdHJ1ZTtcclxuICAgICAgICAgIGlmKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsWydpc0FjY2VwdENhbGwnXT0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHM/Lmxlbmd0aCA+IDIgJiYgdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1sxXT8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+ICFyZXM/LmlzQ29uZmVyZW5jZUhvbGQpO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZih0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCl7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhdGhpcy5pc05ld0FkZGVkQ2FsbCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgICAgICAgaWYgKCFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pZCkge1xyXG4gICAgICAgICAgICBsZXQgaG9sZENhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFswXS5wYXJ0aWNpcGFudHMuZmluZCgoY2FsbEluZm86IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoY2FsbEluZm8/LmZyb20pICYmIGNhbGxJbmZvPy5jbGllbnQpXHJcbiAgICAgICAgICAgICAgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjYWxsSW5mbz8udG8pICYmIGNhbGxJbmZvPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIWNhbGxJbmZvPy5pc0xlZnQgJiYgY2FsbEluZm8/LmlzSG9sZClcclxuICAgICAgICAgICAgaWYgKGhvbGRDYWxsSW5mbz8uaWQgJiYgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtob2xkQ2FsbEluZm8/LmlkXSxcclxuICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogaG9sZENhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG11dGU6IGhvbGRDYWxsSW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGhvbGRDYWxsSW5mbz8uY29uZmVyZW5jZUlkKTsgXHJcbiAgICAgICAgICAgICAgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwsICdjdXJyZW50Q29uZmVyZW5jZUNhbGwnKVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlckluZm8/LnBhcnRpY2lwYW50SWQpIHtcclxuICAgICAgICAgIGxldCBzZWxlY3RlZFVzZXIgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmlkID09IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRVc2VyKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVXNlci5Jc1VzZXJJbmZvU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHNlbGVjdGVkVXNlcjtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpbmNvbWluZ0NhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgaWYgKGluY29taW5nQ2FsbD8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGluY29taW5nQ2FsbDtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB7fTtcclxuICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgcmVzSW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gISFpdGVtPy5idXNpbmVzc051bWJlcik7XHJcbiAgICAgICAgICBpZiAocmVzSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF0uSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnY3VycmVudENhbGxMaXN0JywgdGhpcy5jdXJyZW50Q2FsbExpc3QpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjdXJyZW50Q2FsbCcsIHRoaXMuY3VycmVudENhbGwpO1xyXG4gICAgICAgIHRoaXMuaXNBbGxBY2NlcHRlZCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmV2ZXJ5KChjYWxsOiBhbnkpID0+IGNhbGw/LmlzQWNjZXB0Q2FsbClcclxuICAgICAgICBjb25zdCB1bmlxdWVMaXN0ID0gW1xyXG4gICAgICAgICAgLi4ubmV3IE1hcCh0aGlzLmN1cnJlbnRDYWxsTGlzdC5tYXAoaXRlbSA9PiBbaXRlbS5jb25mZXJlbmNlSWQsIGl0ZW1dKSkudmFsdWVzKClcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdCA9IHVuaXF1ZUxpc3QubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlTmFtZTogYENvbmZlcmVuY2UgJHtpbmRleCArIDF9YFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5jYWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJzQzMScpXHJcbiAgICAgICAgLy8gdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICAvLyB9LDUwMCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snY2FsbEFjdGlvbiddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5jYWxsQWN0aW9uPy50eXBlID09ICdyZUpvaW4nKSB7XHJcbiAgICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICAgICB0aGlzLnJlam9pbkhvc3QodGhpcy5jYWxsQWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHJlam9pbkhvc3QoY2FsbEluZm86IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVqb2luUGFydGljaXBlbnRJbmZvID0gY2FsbEluZm8/LnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAvLyAx77iP4oOjIEdldCBuZXcgdG9rZW4gZm9yIHNhbWUgY29uZmVyZW5jZVxyXG4gICAgICBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk7XHJcblxyXG4gICAgICAvLyAy77iP4oOjIFJlY29ubmVjdCBkZXZpY2VcclxuICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xyXG4gICAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXHJcbiAgICAgICAgY2xvc2VQcm90ZWN0aW9uOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YS50b2tlbi52YWx1ZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgIEZyb206IHJlam9pblBhcnRpY2lwZW50SW5mby5mcm9tLFxyXG4gICAgICAgICAgVG86IHJlam9pblBhcnRpY2lwZW50SW5mby50byxcclxuICAgICAgICAgIEVudjogZW52aXJvbm1lbnQuYWJiLFxyXG4gICAgICAgICAgVG9rZW46IHRva2VuRGF0YS50b2tlbi5pZCxcclxuICAgICAgICAgIEV4dDogcmVqb2luUGFydGljaXBlbnRJbmZvLmV4dE51bSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xyXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5jYWxsJywgdGhpcy5jYWxsKTtcclxuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGFkZENsaWVudFBhcnRpY2lwYW50UmVzID0gdGhpcy5hZGRDbGllbnRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgZnJvbTogcmVqb2luUGFydGljaXBlbnRJbmZvLmZyb20sXHJcbiAgICAgICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcmVqb2luUGFydGljaXBlbnRJbmZvPy50byxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlam9pblBhcnRpY2lwZW50SW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgY2xpZW50U2lkOiB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0NhbGxTaWQnXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhZGRDbGllbnRQYXJ0aWNpcGFudDonLCBlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUmVqb2luIGZhaWxlZCcsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2hvd0NhbGxpbmdUb2FzdChudW1iZXI6IHN0cmluZykge1xyXG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QgPSB7XHJcbiAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgIHR5cGU6ICdhbGVydC1zdWNjZXNzJyxcclxuICAgICAgbnVtYmVyOiBudW1iZXIsXHJcbiAgICAgIGRpc3BsYXlOdW06IG51bWJlclxyXG4gICAgfTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgNzAwMCk7XHJcbiAgfVxyXG4gIGdldFN0YXR1cyhyZXM6IGFueSkge1xyXG4gICAgaWYgKHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiKSB7XHJcbiAgICAgIHJldHVybiByZXM/LmNhbGxTdGF0dXMgPT0gXCJwYXJ0aWNpcGFudC1qb2luXCIgfHwgcmVzPy5jYWxsU3RhdHVzID09IFwicGFydGljaXBhbnQtbXV0ZVwiIHx8IHJlcz8uY2FsbFN0YXR1cyA9PSBcInBhcnRpY2lwYW50LWhvbGRcIiB8fCByZXM/LmNhbGxTdGF0dXMgPT0gJ2Nvbm5lY3RlZCcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAnYW5zd2VyZWQnICYmIHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEdldENvbnRhY3RzTGlzdCgpIHtcclxuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnJlYWRDb250YWN0cyh0b2tlbikuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQVBJIFJlc3BvbnNlOicsIHJlcyk7XHJcblxyXG4gICAgICAgIC8vIE5vdGU6IENhcGl0YWwgQiBpbiBwaG9uZUJvb2tcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5waG9uZUJvb2spIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXMucGhvbmVCb29rO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXMucGhvbmVCb29rO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvbnRhY3RzIGFycmF5OicsIHRoaXMuY29udGFjdHMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ29udGFjdHMgYXJyYXk6JywgdGhpcy5jb250YWN0cyk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0czonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGFkZFJlczogYW55O1xyXG4gIGFzeW5jIHN0YXJ0Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnNvbGUubG9nKGNhbGxEYXRhLCAnY2FsbERhdGEnKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGNoYW5uZWxJZDogZW52aXJvbm1lbnQuY2hhbm5lbElkLFxyXG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgIHRvOiBjYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBmcm9tTnVtYmVyOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIHNjb3BlOiAnbG9jYWwnLFxyXG4gICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgIGZpcnN0bmFtZTogbnVsbCxcclxuICAgICAgICBsYXN0bmFtZTogbnVsbCxcclxuICAgICAgICBjb3VudHJ5Y29kZTogbnVsbCxcclxuICAgICAgICBudW1iZXI6IG51bGwsXHJcbiAgICAgICAgbnVtb3RwOiBudWxsLFxyXG4gICAgICAgIGV4dGVuc2lvbjogbnVsbCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHtcclxuICAgICAgICBidXNpbmVzc051bWJlcjogZmFsc2UsXHJcbiAgICAgICAgY2FsbFNpZDogJycsXHJcbiAgICAgICAgY2FsbFN0YXR1czogJycsXHJcbiAgICAgICAgY29uZmVyZW5jZUlkOiAnJyxcclxuICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nLWNhbGwnLFxyXG4gICAgICAgIGZvcndhcmRlZFRvOiAnJyxcclxuICAgICAgICBmcm9tOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIGlkOiAneXl1Z2doamInLFxyXG4gICAgICAgIGltZzogY2FsbERhdGEuaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICBpc0FjY2VwdENhbGw6IHRydWUsXHJcbiAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZSxcclxuICAgICAgICBpc0hvbGQ6IGZhbHNlLFxyXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgam9pbmVkQXQ6ICcnLFxyXG4gICAgICAgIG5hbWU6IGNhbGxEYXRhPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHBhcnRpY2lwYW50SWQ6ICcnLFxyXG4gICAgICAgIHBob25lOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXHJcbiAgICAgICAgcm9sZTogJ2NhbGxlZScsXHJcbiAgICAgICAgc3RhdHVzOiAnJyxcclxuICAgICAgICB0aW1lOiAnJyxcclxuICAgICAgICB0bzogY2FsbERhdGE/LnBob25lIHx8ICcnLFxyXG4gICAgICAgIHRvTmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBjYWxsRGF0YT8udXNlcklkXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaW5pdGlhdGVDYWxsKHBheWxvYWQpO1xyXG4gICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgY29uc3QgeyBpZDogY2FsbEF1dGhJZCwgcmVjb3JkQ2FsbCwgIHRva2VuRGF0YX0gPSBhd2FpdCB0aGlzLmdldENhbGxBdXRoSWQocmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNhbGxBdXRoSWQpXHJcbiAgICAgICAgdGhpcy5yZWNvcmRDYWxsID0gcmVjb3JkQ2FsbDsgLy8gU3RvcmUgdGhlIHJlY29yZENhbGwgdmFsdWVcclxuICAgICAgICAvLyBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEF1dGhJZCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0VG9EZXZpY2UoY2FsbEF1dGhJZCwgY2FsbERhdGEsIHRva2VuRGF0YSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKm5lZWQgdG8gdXBkYXRlKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgICAgICBsZXQgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMgPSB0aGlzLmFkZENsaWVudFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBmcm9tOiBjYWxsRGF0YT8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXNwb25zZT8uY2FsbGF1dGg/LmlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgY2xpZW50U2lkOiB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0NhbGxTaWQnXVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhZGRDbGllbnRQYXJ0aWNpcGFudFJlcycsIGFkZENsaWVudFBhcnRpY2lwYW50UmVzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUmVzID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICAgICAgZnJvbTogY2FsbERhdGE/LmZyb20sXHJcbiAgICAgICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogY2FsbERhdGE/LnBob25lLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVzcG9uc2U/LmNhbGxhdXRoPy5pZCxcclxuICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICAgICAgY291bnRyeWNvZGU6ICcnLFxyXG4gICAgICAgICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNOZXdBZGRlZENhbGwgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVyc2hvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhbCBwYXJ0aWNpcGFudElkOicsIHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIGluaXRpYWwgcGFydGljaXBhbnQ6JywgZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTUwMClcclxuICAgICAgICAvLyBQb2xsIHRoZSBzdGF0dXMgZm9yIDMwLTQ1IHNlY29uZHNcclxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAxKSB7XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmlzTG9hZGVyc2hvdy5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGVyc2hvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnIvPlwiKSwgXCJlcnJvclwiKTtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0MycpXHJcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk11dGVVc2VyKGM6IGFueSkge1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjLnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogYy5pc0hvbGQsXHJcbiAgICAgIG11dGU6ICFjPy5pc011dGUsXHJcbiAgICAgIGNvbmZlcmVuY2U6IGMuaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgYy5pc011dGUgPSAhYy5pc011dGU7XHJcbiAgICBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25Ib2xkQ2FsbChjOiBhbnkpIHtcclxuICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjLnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogIWMuaXNIb2xkLFxyXG4gICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgYy5pc0hvbGQgPSAhYy5pc0hvbGQ7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjPy5jb25mZXJlbmNlSWQpO1xyXG4gIH1cclxuICBhc3luYyBvbkVuZEluY29taW5nQ2FsbCgpIHtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgocmVzKSA9PiByZXMucGFydGljaXBhbnRJZCA9PSB0aGlzLmN1cnJlbnRDYWxsLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFJlbW92ZVBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LnBhcnRpY2lwYW50SWQsIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uY29uZmVyZW5jZUlkIHx8ICdubycpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgIHRoaXMuZW5kSW5jb21pbmdDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgYXN5bmMgb25FbmRDYWxsKGM6IGFueSwgaXNBbGxDYWxsRW5kPzogYm9vbGVhbiwgaXNDb250ZWN0PzogYm9vbGVhbikge1xyXG4gICAgbGV0IHBhcnRpY2lwYW50SWQgPSBpc0FsbENhbGxFbmQgPyAnYWxsJyA6IGMucGFydGljaXBhbnRJZCB8fCBjPy5pZDtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgbGV0IGNvbmZlcmVuY2VJZCA9IGMuY29uZmVyZW5jZUlkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgIGxldCBjb25mZXJlbmNlU2lkID0gYy5jb25mZXJlbmNlU2lkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VTaWQ7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQpO1xyXG4gICAgaWYgKHJlcz8uc3RhdHVzID09IDIwMSAmJiByZXM/Lm1lc3NhZ2UgPT0gJ3BhcnRpY2lwYW50IGFscmVhZHkgbGVmdCcpIHtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCk7XHJcblxyXG4gICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgdGhpcy5lbmRJbmNvbWluZ0NhbGxFdmVudC5lbWl0KGMpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXRpYXRlQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaW5pdGlhdGVDYWxsKHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRQYXJ0aWNpcGFudFRvQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYWRkUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENsaWVudFBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRDbGllbnRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU3RhdHVzT2ZQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5vbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSwgY29uZmVyZW5jZUlkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldENhbGxBdXRoSWQocmVzcG9uc2U6IGFueSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHJlc3BvbnNlLmNhbGxhdXRoLmlkLFxyXG4gICAgICByZWNvcmRDYWxsOiByZXNwb25zZS5jYWxsYXV0aC5yZWNvcmRDYWxsLFxyXG4gICAgICB0b2tlbkRhdGE6IHJlc3BvbnNlLmNhbGxhdXRoLnRva2VuXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsQXV0aElkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q29uZmVyZW5jZUNhbGxUb2tlbih7IGF1dGhJZDogY2FsbEF1dGhJZCB9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvRGV2aWNlKHRva2VuOiBhbnksIGNhbGxEYXRhOiBhbnksIHRva2VuRGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXHJcbiAgICAgIGNsb3NlUHJvdGVjdGlvbjogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YSwgb3B0aW9ucyk7XHJcbiAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgRnJvbTogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBUbzogY2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgRW52OiBlbnZpcm9ubWVudC5hYmIsXHJcbiAgICAgICAgVG9rZW46IHRva2VuLFxyXG4gICAgICAgIEV4dDogY2FsbERhdGEuZXh0TnVtXHJcbiAgICAgIH0sXHJcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB0cnVlIH0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xyXG4gICAgY29uc29sZS5sb2coJ3Rlc3Q5ODk5ODExMTExMScsIHRoaXMuY2FsbCk7XHJcbiAgICBjb25zb2xlLmxvZygndGVzdGRldmljZScsIHRoaXMudHdpbGlvU2VydmljZS5kZXZpY2UpO1xyXG4gICAgLy8gdGhpcy5jYWxsWydjYWxsSW5mbyddID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYWxsRGF0YSkpO1xyXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XHJcblxyXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICB0aGlzLmRldmljZT8ub24oJ2Vycm9yJywgKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2Rpc2Nvbm5lY3QnLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0LWRpc2Nvbm5lY3QnKVxyXG4gICAgICB0aGlzLmNhbGw/LmRpc2Nvbm5lY3QoKTtcclxuICAgICAgLy8gdGhpcy5lbmRDYWxsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdyaW5naW5nJywgKCkgPT4ge1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbigncmVqZWN0JywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndGVzdDUnKVxyXG4gICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2FjY2VwdCcsICgpID0+IHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XHJcbiAgICAgIC8vIEVuc3VyZSB0aGUgYWN0aXZlIG91dGdvaW5nIGNhbGwgaXMgbWFya2VkIGFzIGFjY2VwdGVkIHNvIHRoZSBVSSBzd2l0Y2hlcyB0byB0aGUgY29ubmVjdGVkIHZpZXdcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwaWQgPSB0aGlzLmNhbGxEYXRhPy5wYXJ0aWNpcGFudElkO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY3VycmVudENhbGxMaXN0KSAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vIGNvbnN0IGlkeCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoYzogYW55KSA9PiAocGlkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IHBpZCkgfHwgKCFwaWQgJiYgYz8ucGhvbmUgPT09IHRoaXMuY2FsbERhdGE/LnBob25lKSk7XHJcbiAgICAgICAgICAvLyBpZiAoaWR4ICE9PSAtMSkge1xyXG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbaWR4XS5pc0FjY2VwdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0W2lkeF07XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jYWxsPy5vbignbWVzc2FnZVJlY2VpdmVkJywgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0VGltZXIoam9pbkF0Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWpvaW5BdCkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBqb2luVGltZSA9IG5ldyBEYXRlKGpvaW5BdCkuZ2V0VGltZSgpIHx8IDA7XHJcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKChub3cgLSBqb2luVGltZSkgLyAxMDAwKTtcclxuICAgIGlmIChzZWNvbmRzIDwgMCkge1xyXG4gICAgICBzZWNvbmRzID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgc2Vjb25kcysrO1xyXG4gICAgICB0aGlzLnRpbWVyID0gdGhpcy5mb3JtYXRUaW1lKHNlY29uZHMpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcFRpbWVyKCkge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xyXG4gICAgdGhpcy50aW1lciA9ICcwMDowMCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdFRpbWUodG90YWxTZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcclxuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XHJcbiAgY29uc3Qgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xyXG4gIGlmIChob3VycyA+IDApIHtcclxuICAgIHJldHVybiBgJHt0aGlzLnBhZChob3Vycyl9OiR7dGhpcy5wYWQobWludXRlcyl9OiR7dGhpcy5wYWQoc2Vjb25kcyl9YDtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFkKG1pbnV0ZXMpfToke3RoaXMucGFkKHNlY29uZHMpfWA7XHJcbiAgfVxyXG59XHJcblxyXG4gIHByaXZhdGUgcGFkKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHZhbHVlIDwgMTAgPyBgMCR7dmFsdWV9YCA6IGAke3ZhbHVlfWA7XHJcbiAgfVxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkge1xyXG4gICAgc3dhbChcIkVycm9yXCIsIGVycm9yLCBcImVycm9yXCIpO1xyXG4gIH1cclxuXHJcbiAgZW5kQ29uZmVyZW5lY2VDYWxsKGNvbmY/OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25mID0gY29uZjtcclxuICAgIHRoaXMuaXNVbmhvbGRDb25mZXJlbmNlQ2FsbCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHRoaXMuaG9zdG51bWJlcj8uZnJvbSkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyh0aGlzLmhvc3RudW1iZXI/LnRvKSAmJiB0aGlzLmhvc3RudW1iZXI/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgdGhpcy5ob3N0bnVtYmVyPy5ob3N0KSkge1xyXG4gICAgICB0aGlzLm9uQ2FsbERpc2Nvbm5lY3RlZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNvbmY/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIGxldCBjb25mZXJlbmNlID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8uZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGNvbmY/LmNvbmZlcmVuY2VJZClcclxuICAgICAgICBsZXQgcGFydGljaXBlbnRJbmZvID0gY29uZmVyZW5jZT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSlcclxuICAgICAgICAgICYmIHBhcnRpY2lwYW50Py5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICAgIGlmIChjb25mZXJlbmNlPy5pZCkge1xyXG4gICAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGlzQWxsQ2FsbEVuZCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh7fSwgaXNBbGxDYWxsRW5kKTtcclxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coODk2KVxyXG4gICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jYWxsKSB7XHJcbiAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuY2FsbC5yZWplY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyB0b2dnbGVNdXRlKGlzQ29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNNdXRlID0gIXRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5jYWxsPy5tdXRlKHRoaXMuaXNNdXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvLnBhcnRpY2lwYW50SWQgfHwgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5pc0hvbGQsXHJcbiAgICAgIG11dGU6ICFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pc011dGUsXHJcbiAgICAgIGNvbmZlcmVuY2U6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgdGhpcy5jdXJyZW50Q2FsbC5pc011dGUgPSB0aGlzLmlzTXV0ZTtcclxuICAgIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIGF1ZGlvU3RyZWFtPzogTWVkaWFTdHJlYW07XHJcbiAgLy8gbWljT24gPSBmYWxzZTtcclxuXHJcbiAgLy8gYXN5bmMgdG9nZ2xlTWljKCkge1xyXG4gIC8vICAgaWYgKCF0aGlzLmF1ZGlvU3RyZWFtKSB7XHJcbiAgLy8gICAgIC8vIGZpcnN0IHRpbWU6IHJlcXVlc3QgbWljXHJcbiAgLy8gICAgIHRoaXMuYXVkaW9TdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHRoaXMubWljT24gPSAhdGhpcy5taWNPbjtcclxuXHJcbiAgLy8gICB0aGlzLmF1ZGlvU3RyZWFtLmdldEF1ZGlvVHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB7XHJcbiAgLy8gICAgIHRyYWNrLmVuYWJsZWQgPSB0aGlzLm1pY09uOyAgIC8vIGZhbHNlID0gbXV0ZWQsIHRydWUgPSBzZW5kaW5nIGF1ZGlvXHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdldEN1cnJlbnRDYWxsSW5mbygpIHtcclxuICAgIHJldHVybiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0XHJcbiAgICAgIC5mbGF0TWFwKChjYWxsSW5mbzogYW55KSA9PiBjYWxsSW5mby5wYXJ0aWNpcGFudHMpXHJcbiAgICAgIC5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcpXHJcbiAgICAgICAgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQgJiYgIXBhcnRpY2lwYW50Py5pc0hvbGQpO1xyXG4gIH1cclxuICB0b2dnbGVLZXlwYWQoKSB7XHJcbiAgICB0aGlzLnNob3dLZXlwYWQgPSAhdGhpcy5zaG93S2V5cGFkO1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSAnJztcclxuICB9XHJcbiAgdG9nZ2xlQ29udGFjdHNQYW5lbChjYWxsSW5mbz86IGFueSwgaXNDbG9zZT86IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgaWYgKGlzQ2xvc2UpIHtcclxuICAgICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gIWlzQ2xvc2U7XHJcbiAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIHRoaXMuaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFJlbW92ZVBhcnRpY2lwYW50KCkge1xyXG4gICAgdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50ID0gIXRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDtcclxuICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHdhaXRpbmdDYWxsQWNjZXB0KGluY29taW5nQ2FsbEluZm86YW55KSB7XHJcbiAgICBsZXQgb3VyTnVtYmVySW5mbzogYW55ID0ge31cclxuICAgIGxldCBjYWxsSW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCA9PSBjYWxsSW5mby5jb25mZXJlbmNlSWQpXHJcbiAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKG91ck51bWJlckluZm8sICdzZWxmSW5mbycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkKGluY29taW5nQ2FsbEluZm8pO1xyXG4gICAgICB9XHJcblxyXG4gIGFzeW5jIGFkZChkYXRhPzogYW55KSB7XHJcbiAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2U/LmluY29taW5nQ2FsbERldGFpbD8uYWNjZXB0KCk7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gICAgICBpcENvdW50cnk6ICcnLFxyXG4gICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgdXNlcklkOiAgdGhpcy51c2VySWQsXHJcbiAgICAgIGNvbXBhbnlJZDogJycsXHJcbiAgICAgIGNsaWVudFNpZDogdGhpcy50d2lsaW9TZXJ2aWNlPy5pbmNvbWluZ0NhbGxEZXRhaWw/LnBhcmFtZXRlcnM/LkNhbGxTaWQsXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLmlzQ3VycmVudEluY29taW5nQ2FsbExpc3QucHVzaChkYXRhPy5pZCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0FjY2VwdElJbmNvbWluZ0NhbGwubmV4dChkYXRhPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsbCwgJ2NhbGxDb25uZWN0Jyk7XHJcbiAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IGRhdGEucGFydGljaXBhbnRJZClcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2Uuam9pbihcIjxici8+XCIpLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCcxMDIzJylcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBhc3luYyBjYWxsQ29udGFjdChjb250YWN0OiBhbnksIGlzVW5zYXZlZE51bWJlcj86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcGhvbmVOdW1iZXIgPSBpc1Vuc2F2ZWROdW1iZXIgPyBjb250YWN0IDogY29udGFjdD8ubnVtYmVyc0xpc3Q/LlswXT8ubnVtYmVyIHx8IGNvbnRhY3Q/LnBob25lO1xyXG4gICAgbGV0IGFscmVhZHlJbkNhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gKHJlcy50byA9PSBwaG9uZU51bWJlciAmJiByZXM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpIHx8IChyZXMuZnJvbSA9PSBwaG9uZU51bWJlciAmJiByZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcpICYmICFyZXM/LmlzTGVmdCk7XHJcbiAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICBzd2FsKCdFcnJvcicsIGBBbHJlYWR5ICR7cGhvbmVOdW1iZXJ9IG51bWJlciBpbiB0aGlzIGNhbGwuYCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tID8gdGhpcy5jYWxsRGF0YT8uZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcclxuICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJQYXJ0aWNpcGFudCBhZGRlZCB0byBjb25mZXJlbmNlOlwiLCBwaG9uZU51bWJlcik7XHJcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJRHM6YW55ID0gW107XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoYz8ucGFydGljaXBhbnRJZCAmJiAhYz8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElEcy5wdXNoKGM/LnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFB1dCBjdXJyZW50IGNhbGwgb24gaG9sZFxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICAvLyBBZGQgcGFydGljaXBhbnQgdG8gdGhlIGNvbmZlcmVuY2VcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcclxuICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICBwYXJ0aWNpcGFudElEcy5wdXNoKGRhdGE/LnBhcnRpY2lwYW50SWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHBhcnRpY2lwYW50SURzLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IG51bGwsXHJcbiAgICAgICAgICBtdXRlOiBudWxsLFxyXG4gICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIHBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFscmVhZHlJbkNhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gKChyZXMudG8gPT0gbnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykgfHwgKHJlcy5mcm9tID09IG51bWJlciAmJiByZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcpKSAmJiAhcmVzPy5pc0xlZnQpO1xyXG4gICAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtudW1iZXJ9IG51bWJlciBpbiB0aGlzIGNhbGwuYCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChudW1iZXIgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cclxuICAgICAgY29uc3QgY2FsbERhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogY29udGFjdD8uZmlyc3ROYW1lLFxyXG4gICAgICAgIGltZzogY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIHBob25lOiBudW1iZXIsXHJcbiAgICAgICAgZXh0TnVtOiAnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaXNOZXdDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICAgICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgICAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKG91ck51bWJlckluZm8sICdzZWxmSW5mbycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm9uQWRkTmV3Q2FsbChjYWxsRGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNhbGxEYXRhLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsQ29udGFjdChudW1iZXIsIHRydWUpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgb25BZGROZXdDYWxsKGNhbGxEYXRhOiBhbnksIGlzTmV3Q29uZmVyZW5jZUNhbGwgPSBmYWxzZSkge1xyXG5cclxuICAgIC8vIHdhcm5pbmcgb25seSBmb3IgTkVXIFNFUEFSQVRFIENBTExcclxuICAgIGlmIChpc05ld0NvbmZlcmVuY2VDYWxsICYmIHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgIHRoaXMucGVuZGluZ0NhbGxEYXRhID0gY2FsbERhdGE7XHJcbiAgICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWwgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRDYWxsKGNhbGxEYXRhLCBpc05ld0NvbmZlcmVuY2VDYWxsKTtcclxuICB9XHJcbiAgY29uZmlybU5ld0NhbGwoKSB7XHJcbiAgICB0aGlzLnNob3dDb25mZXJlbmNlV2FybmluZ01vZGFsID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMucGVuZGluZ0NhbGxEYXRhKSB7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdCA9IHtcclxuICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgICBudW1iZXI6IHRoaXMucGVuZGluZ0NhbGxEYXRhLnBob25lLFxyXG4gICAgICBkaXNwbGF5TnVtOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5waG9uZVxyXG4gICAgfTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgNzAwMCk7XHJcbiAgICAgIHRoaXMuc3RhcnRDYWxsKHRoaXMucGVuZGluZ0NhbGxEYXRhLCB0cnVlKTtcclxuICAgICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsTmV3Q2FsbCgpIHtcclxuICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWwgPSBmYWxzZTtcclxuICAgIHRoaXMucGVuZGluZ0NhbGxEYXRhID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFRvTnVtYmVyKGRpYWxlZE51bWJlcjogc3RyaW5nKSB7XHJcbiAgICBpZiAoZGlhbGVkTnVtYmVyWzBdICE9PSAnKycpIHtcclxuICAgICAgLy8gdGhpcyBpcyBjYXNlIHdoZW4gdXNlciBnZW9sb2NhdGlvbiBkaWFsIGNvZGUgaXMgb25cclxuICAgICAgbGV0IGlwQWRkcmVzczogYW55ID0gYXdhaXQgdGhpcy5pcFNlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5nZXRUb051bWJlcihkaWFsZWROdW1iZXIsIGlwQWRkcmVzcy5hZGRyZXNzLmNvdW50cnlDb2RlKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcz8udG9OdW1iZXJcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZGlhbGVkTnVtYmVyXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGlzSW52YWxpZE51bWJlcihudW1iZXI6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKG51bWJlciA9PSAnJykge1xyXG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2YWxpZE51bWJlclBhdHRlcm4gPSAvXlsrXFxkXFxzKCktXSokLzsgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHZhbGlkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgcGhvbmVOdW1iZXIgPSBudW1iZXI7XHJcbiAgICAgIGlmICghdmFsaWROdW1iZXJQYXR0ZXJuLnRlc3QocGhvbmVOdW1iZXIpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgcmV0dXJuIHRydWU7IC8vIFJldHVybiB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBtZWFuaW5nIHRoZSBudW1iZXIgaXMgaW52YWxpZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0RpYWxBbGVydChtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbEFsZXJ0ID0ge1xyXG4gICAgICBtc2c6IG1lc3NhZ2UsXHJcbiAgICAgIHNob3c6IHRydWVcclxuICAgIH07XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kaWFsQWxlcnQuc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgMzAwMCk7XHJcbiAgfVxyXG5cclxuYXN5bmMgZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VJZDogc3RyaW5nKSB7XHJcbiAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldEFsbFBhcnRpY2lwYW50cyhjb25mZXJlbmNlSWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHJlcz8ucGFydGljaXBhbnRzIHx8IHJlcz8ucGFydGljaXBhbnQgfHwgW107XHJcbiAgICAgICAgaWYgKCFwYXJ0aWNpcGFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjb25zdCB1cGRhdGVkUGFydGljaXBhbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudHMubWFwKGFzeW5jIChwOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZnJvbU5hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC5mcm9tKTtcclxuICAgICAgICAgICAgY29uc3QgdG9OYW1lID0gYXdhaXQgdGhpcy5nZXROYW1lKHAudG8pO1xyXG4gIFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLnAsXHJcbiAgICAgICAgICAgICAgZnJvbU5hbWU6IGZyb21OYW1lIHx8IHAuZnJvbU5hbWUsXHJcbiAgICAgICAgICAgICAgdG9OYW1lOiB0b05hbWUgfHwgcC50b05hbWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgXHJcbiAgICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSB1cGRhdGVkUGFydGljaXBhbnRzO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbLi4udXBkYXRlZFBhcnRpY2lwYW50c107XHJcbiAgXHJcbiAgXHJcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9LDcwMClcclxufVxyXG5cclxuICBhc3luYyBzd2FwQ2FsbHMoY2FsbEluZm86IGFueSwgaXNDb25mZXJlbmNlQ2FsbD86IGJvb2xlYW4pIHtcclxuICAgIC8vIGlmICghdGhpcy5oZWxkQ2FsbCB8fCAhdGhpcy5jYWxsKSByZXR1cm47XHJcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYz8uY29uZmVyZW5jZUlkID09IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gYy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAocGFydGljaXBhbnRJbmZvPy5pZCkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW3BhcnRpY2lwYW50SW5mbz8uaWRdLFxyXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHBhcnRpY2lwYW50SW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gYy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAocGFydGljaXBhbnRJbmZvPy5pZCAmJiAhcGFydGljaXBhbnRJbmZvPy5pc0hvbGQpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoYz8uaXNDb25mZXJlbmNlICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IGMuY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBpc01lcmdlQ2FsbEFsbG93ZWQoKSB7XHJcbiAgLy8gICBsZXQgbWVyZ2VDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzKSA9PiByZXMuY29uZmVyZW5jZUlkID09IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAvLyAgIHJldHVybiBtZXJnZUNhbGxMaXN0Lmxlbmd0aCA8PSAxO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gYXN5bmMgbWVyZ2VDYWxscygpIHtcclxuICAvLyAgIC8vIE1lcmdlIGZ1bmN0aW9uYWxpdHkgLSB1bm11dGUgYm90aCBjYWxscyBmb3IgY29uZmVyZW5jZVxyXG4gIC8vICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAvLyAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKGMuY29uZmVyZW5jZUlkID09IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKSB7XHJcbiAgLy8gICAgICAgICBpZiAoYz8ucGFydGljaXBhbnRJZCkge1xyXG4gIC8vICAgICAgICAgICAvLyBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gIC8vICAgICAgICAgICAvLyAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAvLyAgICAgICAgICAgLy8gICBjb25mZXJlbmNlSWQ6IGMuY29uZmVyZW5jZUlkLFxyXG4gIC8vICAgICAgICAgICAvLyAgIGhvbGQ6IGZhbHNlLFxyXG4gIC8vICAgICAgICAgICAvLyAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIC8vICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gIC8vICAgICAgICAgICAvLyB9KTtcclxuICAvLyAgICAgICAgICAgYy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICAgIHRoaXMuaXNDYWxsT25Ib2xkID0gZmFsc2U7XHJcbiAgLy8gICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAvLyAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgaGFzRGV0YWlsZWRJbmZvKGNhbGxEYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghY2FsbERhdGEpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB1c2VySW5mbyBleGlzdHMgYW5kIGhhcyBtZWFuaW5nZnVsIGRhdGFcclxuICAgIGlmIChjYWxsRGF0YS51c2VySW5mbyAmJiBjYWxsRGF0YS51c2VySW5mby5jMmNJbmZvcm1hdGlvbikge1xyXG4gICAgICBjb25zdCBpbmZvID0gY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb247XHJcbiAgICAgIHJldHVybiAhIShcclxuICAgICAgICBpbmZvLnN1YmplY3QgJiYgaW5mby5zdWJqZWN0ICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLmVtYWlsICYmIGluZm8uZW1haWwgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8ubWVzc2FnZSAmJiBpbmZvLm1lc3NhZ2UgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8ucG9pbnROYW1lICYmIGluZm8ucG9pbnROYW1lICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnNvdXJjZU5hbWUgJiYgaW5mby5zb3VyY2VOYW1lICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLmV4dGVuc2lvbiAmJiBpbmZvLmV4dGVuc2lvbiAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby51cmwgfHxcclxuICAgICAgICBpbmZvLmxhdGl0dWRlIHx8XHJcbiAgICAgICAgaW5mby5sb25naXR1ZGVcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNhbGxJbnB1dHMobnVtOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcclxuICAgICAgICBpZiAobnVtID09ICcjJykge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLWhhc2gtLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQgKyBTdHJpbmcobnVtKTtcclxuICAgICAgICB0aGlzLnNob3dDbGVhckJ0biA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHN0ciA9IFN0cmluZyhudW0pO1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoc3RyKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uQ2FsbElucHV0RW50ZXIoZXY6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jYWxsPy5zZW5kRGlnaXRzKFN0cmluZyhldi5rZXkpKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZUluY29taW5nQ2FsbChkYXRhOiBhbnkpIHtcclxuICAgIGlmIChkYXRhLnNob3cpIHtcclxuICAgICAgLy8gaGFuZGxlIGluY29taW5nIGNhbGwgYWNjZXB0ZWRcclxuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG5cclxuICAgICAgY29uc3QgaW5jb21pbmdEZXRhaWwgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xyXG4gICAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGluY29taW5nRGV0YWlsLnJlY29yZENhbGw7XHJcblxyXG4gICAgICBpZiAodGhpcy5pbmNvbWluZ1JlY29yZENhbGwpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc1JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGluY29taW5nIGNhbGwgcmVqZWN0ZWQgb3IgYXV0by1jYW5jZWxsZWRcclxuICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBOTyBhY3RpdmUgY2FsbCwgdGhlbiBwcm9wYWdhdGUgZW5kLiBPdGhlcndpc2Uga2VlcCBvbmdvaW5nIFVJLlxyXG4gICAgICBpZiAoIXRoaXMuY2FsbCB8fCB0aGlzLmNhbGwuc3RhdHVzKCkgIT09ICdvcGVuJykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0ZXN0NycpXHJcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsZWFySW5wdXRzKCkge1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dC5zbGljZSgwLCAtMSk7XHJcbiAgfVxyXG4gIGlzTWluaW1pc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWluaW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gdHJ1ZTtcclxuICB9XHJcbiAgbWF4aW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGZhbHNlO1xyXG4gIH1cclxuICB0b2dnbGVSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnRSZWNvcmRpbmcoKSB7XHJcbiAgICBsZXQgc2lkO1xyXG4gICAgY29uc3QgZGV0YWlscyA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XHJcbiAgICB0aGlzLmluY29taW5nQ2FsbFNpZCA9IGRldGFpbHMuY2FsbFNpZDtcclxuICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xyXG4gICAgc2lkID0gdGhpcy5pbmNvbWluZ0NhbGxTaWQgPyB0aGlzLmluY29taW5nQ2FsbFNpZCA6IHRoaXMuY2FsbFNpZCB8fCB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcclxuXHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgXCJjb25mZXJlbmNlSWRcIjogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcocGF5bG9hZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy50aW1lRWxhcHNlZCA9IDA7XHJcbiAgICAgIHRoaXMuc3RhcnRUaW1lcjEoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHBhdXNlUmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncGF1c2UnKS5zdWJzY3JpYmUoXHJcbiAgICAgIHJlc3BvbnNlID0+IHtcclxuICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmdUaW1lcigpO1xyXG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXVzaW5nIHJlY29yZGluZzonLCBlcnJvcik7XHJcbiAgICAgICAgLy8gQ29uc2lkZXIgdXBkYXRpbmcgdGhlIFVJIHRvIHNob3cgdGhlIGVycm9yIHN0YXRlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHJlc3VtZVJlY29yZGluZygpIHtcclxuICAgIC8vIGlmICghdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgJiYgIXRoaXMucmVjb3JkQ2FsbCkge1xyXG4gICAgLy8gICByZXR1cm47IC8vIFNraXAgaWYgcmVjb3JkaW5nIGlzIG5vdCBlbmFibGVkXHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsICdyZXN1bWUnKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhcnRUaW1lcjEoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVzdW1pbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldFRpbWVEaWZmZXJlbmNlKGlucHV0VGltZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhc3RUaW1lID0gbmV3IERhdGUoaW5wdXRUaW1lKS5nZXRUaW1lKCk7XHJcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG5cclxuICAgIGxldCBkaWZmID0gTWF0aC5mbG9vcigoY3VycmVudFRpbWUgLSBwYXN0VGltZSkgLyAxMDAwKTsgLy8gdG90YWwgc2Vjb25kc1xyXG5cclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gZGlmZiAlIDYwO1xyXG5cclxuICAgIGNvbnN0IG1tID0gbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XHJcbiAgICBjb25zdCBzcyA9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xyXG5cclxuICAgIHJldHVybiBgJHttbX06JHtzc31gO1xyXG4gIH1cclxuICBzdGFydFRpbWVyMSgpIHtcclxuICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkKys7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZ1RpbWVyKCkge1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAvLyBQYXVzZSB0aGUgdGltZXJcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgICAgICAgIC8vIE9wdGlvbmFsbHkgcmVzZXQgdGhlIHN1YnNjcmlwdGlvblxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRGb3JtYXR0ZWRUaW1lKCkge1xyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodGhpcy50aW1lRWxhcHNlZCAvIDYwKTtcclxuICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLnRpbWVFbGFwc2VkICUgNjA7XHJcbiAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJ30ke3NlY29uZHN9YDtcclxuICB9XHJcbiAgcG9sbENhbGxTdGF0dXMoY2FsbEF1dGhJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYXhUaW1lID0gMzAwMDA7IC8vIFBvbGwgZm9yIHVwIHRvIDMwIHNlY29uZHNcclxuICAgIGNvbnN0IHBvbGxJbnRlcnZhbCA9IDMwMDA7IC8vIFBvbGwgZXZlcnkgMyBzZWNvbmRzXHJcbiAgICBsZXQgZWxhcHNlZFRpbWUgPSAwO1xyXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgZWxhcHNlZFRpbWUgKz0gcG9sbEludGVydmFsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXMoY2FsbEF1dGhJZCkudG9Qcm9taXNlKCkgYXMgQ2FsbFN0YXR1c1Jlc3BvbnNlO1xyXG4gICAgICAgIGlmIChzdGF0dXNSZXNwb25zZSAmJiBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscykge1xyXG4gICAgICAgICAgdGhpcy5jYWxsU3RhdHVzID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFN0YXR1cztcclxuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU2lkID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFNpZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkQ2FsbCAmJiAhdGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPj0gbWF4VGltZSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNYXggcG9sbGluZyB0aW1lIHJlYWNoZWQuIFN0b3BwaW5nIHBvbGwuJyk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfSwgcG9sbEludGVydmFsKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJJbmZvcm1hdGlvbihpZDogYW55KSB7XHJcbiAgICBpZihpZCkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihpZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZWxlY3RlZEluY29taW5nQ2FsbEluZm8oZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gZGF0YTtcclxuICB9XHJcblxyXG4gIGdldEhvbGRDYWxsTGlzdCgpIHtcclxuICAgIGxldCBob2xkTGlzdDogYW55W10gPSBbXTtcclxuICAgIGxldCBpc0NvbmZlcmVuY2UgPSBmYWxzZTtcclxuICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYz8uaXNIb2xkICYmICFjPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBob2xkTGlzdC5wdXNoKGMpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgIGlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XHJcbiAgICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaG9sZExpc3Q7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRXhwYW5kKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKGRhdGEuaWQgIT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSAhdGhpcy5pc0NsaWNrRXhwYW5kO1xyXG4gICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gZGF0YTtcclxuICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbmNvbWluZ0NhbGxTdGF0dXMoZGF0YTogYW55KSB7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gICAgICBpcENvdW50cnk6ICcnLFxyXG4gICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgfHwgZGF0YS5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcclxuXHJcbiAgICAvLyBpZiBjbG9zaW5nIHNlYXJjaCDigJQgcmVzZXQgcmVzdWx0c1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICBpZiAoIXRoaXMuaXNTZWFyY2hWaXNpYmxlKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlGaWx0ZXIoKSB7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5zZWFyY2hUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdGhpcy5pc0RpcmVjdENhbGxPcHRpb25TaG93ID0gL15cXCs/XFxkKyQvLnRlc3QodGV4dClcclxuICAgIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoY2M6IGFueSkgPT4gIWNjPy5Jc0Nvbm5lY3RlZCAmJiAoY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIpKTtcclxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHMuZmlsdGVyKChjOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIChjPy5maXJzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lmxhc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgKGM/Lm1pZGRsZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lm5pY2tOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBjWydmcm9tTmFtZSddID0gdGhpcy5nZXROYW1lKGMuZnJvbSkgfHwgYz8uZnJvbU5hbWU7XHJcbiAgICAgIGNbJ3RvTmFtZSddID0gdGhpcy5nZXROYW1lKGMudG8pIHx8IGM/LnRvTmFtZTtcclxuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcik7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY2hlY2tUZXh0SGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbD8uc2Nyb2xsSGVpZ2h0ID4gZWw/LmNsaWVudEhlaWdodCkge1xyXG4gICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB0b2dnbGVUZXh0KCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcblxyXG4gIHNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuXHJcbiAgLy8gQ2FsbCB0aGlzIHdoZW4gY2FsbCBkaXNjb25uZWN0c1xyXG4gIG9uQ2FsbERpc2Nvbm5lY3RlZCgpIHtcclxuICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBlbmRDb25mZXJlbmNlKCkge1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLnNlbGVjdGVkQ29uZiwgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZENhbGwodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ29tYmluZXMgdGhlIHR3byAyNC1ob3VyIHNlbGVjdHMgaW50byBsZWF2ZVJlYXNvbiAoSEg6TU0pICovXHJcbiAgb25UaW1lQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMubGVhdmVIb3VyICE9PSAnJyAmJiB0aGlzLmxlYXZlTWludXRlICE9PSAnJykge1xyXG4gICAgICB0aGlzLmxlYXZlUmVhc29uID0gYCR7dGhpcy5sZWF2ZUhvdXJ9OiR7dGhpcy5sZWF2ZU1pbnV0ZX1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSG91ckRyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5zaG93SG91ckRyb3Bkb3duID0gIXRoaXMuc2hvd0hvdXJEcm9wZG93bjtcclxuICAgIHRoaXMuc2hvd01pbnV0ZURyb3Bkb3duID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNaW51dGVEcm9wZG93bigpIHtcclxuICAgIHRoaXMuc2hvd01pbnV0ZURyb3Bkb3duID0gIXRoaXMuc2hvd01pbnV0ZURyb3Bkb3duO1xyXG4gICAgdGhpcy5zaG93SG91ckRyb3Bkb3duID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RIb3VyKGg6IHN0cmluZykge1xyXG4gICAgdGhpcy5sZWF2ZUhvdXIgPSBoO1xyXG4gICAgdGhpcy5zaG93SG91ckRyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB0aGlzLm9uVGltZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TWludXRlKG06IHN0cmluZykge1xyXG4gICAgdGhpcy5sZWF2ZU1pbnV0ZSA9IG07XHJcbiAgICB0aGlzLnNob3dNaW51dGVEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgdGhpcy5vblRpbWVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGxlYXZlQ29uZmVyZW5jZSgpIHtcclxuICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaXNSZWFzb25DaGVja2VkKSB7XHJcbiAgICAgIGxldCBwYXlsb2FkID0geyBjb25mZXJlbmNlSWQ6IHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQgfHwgdGhpcy5ob3N0bnVtYmVyPy5jb25mZXJlbmNlSWQsIHRpbWU6IHRoaXMuY29udmVydEhITU1Ub01pbnV0ZXModGhpcy5sZWF2ZVJlYXNvbiksIHRpbWVyRGF0ZTogbmV3IERhdGUoKS50b1N0cmluZygpIH1cclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldFRpbWVyRm9yRW5kQ29uZmVyZW5jZUNhbGwocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHsgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgIGxldCBjb25mZXJlbmNlID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8uZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpXHJcbiAgICAgIGxldCBwYXJ0aWNpcGVudEluZm8gPSBjb25mZXJlbmNlPy5wYXJ0aWNpcGFudHM/LmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKVxyXG4gICAgICAgICYmIHBhcnRpY2lwYW50Py5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICBpZiAoY29uZmVyZW5jZT8uaWQpIHtcclxuICAgICAgICB0aGlzLm9uRW5kQ2FsbChwYXJ0aWNpcGVudEluZm8pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMuaG9zdG51bWJlcik7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBjb252ZXJ0SEhNTVRvTWludXRlcyh0aW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcclxuICAgIHJldHVybiAoaG91cnMgKiA2MCkgKyBtaW51dGVzO1xyXG4gIH1cclxuXHJcbiAgb25SZWplY3RDYWxsKGNhbGxJbmZvOiBhbnkpIHtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICByZWNvcmRJZDogY2FsbEluZm8/LmlkLFxyXG4gICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gICAgICBpcENvdW50cnk6ICcnLFxyXG4gICAgICBjYWxsU3RhdHVzOiAnbm8nLFxyXG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgdXNlcklkOiAgdGhpcy51c2VySWQsXHJcbiAgICAgIGNvbXBhbnlJZDogJycsXHJcbiAgICAgIGNsaWVudFNpZDogdGhpcy50d2lsaW9TZXJ2aWNlPy5pbmNvbWluZ0NhbGxEZXRhaWw/LnBhcmFtZXRlcnM/LkNhbGxTaWQsXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogY2FsbEluZm8/LmNvbmZlcmVuY2VJZCB8fCAnbm8nXHJcbiAgICB9XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0SW5jb21pbmdDYWxsU3RhdHVzKHBheWxvYWQpLnN1YnNjcmliZShhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKHJlczogYW55KSA9PiByZXM/LmlkICE9IGNhbGxJbmZvPy5pZCk7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBpc1NlbGZOdW1iZXIocGFydGljaXBhbnQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5maW5kKChyZXM6IGFueSkgPT4gcmVzID09IChwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IHBhcnRpY2lwYW50Py5mcm9tIDogcGFydGljaXBhbnQ/LnRvKSk7XHJcbiAgfVxyXG5cclxuICBnZXROYW1lKG51bWJlcjogYW55KSB7XHJcbiAgICBsZXQgY29udGFjdEluZm8gPSB0aGlzLmNvbnRhY3RzLmZpbmQoKGM6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciAgPT0gbnVtYmVyIHx8IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIgPT0gbnVtYmVyO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY29udGFjdEluZm8/LmZpcnN0TmFtZSB8fCBjb250YWN0SW5mbz8ubGFzdE5hbWUgPyBgJHtjb250YWN0SW5mbz8uZmlyc3ROYW1lIHx8ICcnfSAke2NvbnRhY3RJbmZvPy5sYXN0TmFtZSB8fCAnJ31gIDogbnVsbFxyXG4gIH1cclxuICBnZXRJbWcobnVtYmVyOiBhbnkpIHtcclxuICAgIGxldCBjb250YWN0SW5mbyA9IHRoaXMuY29udGFjdHMuZmluZCgoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb250YWN0SW5mbz8uaW1hZ2UgfHwgbnVsbFxyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dFbmRBbGxCdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhY3RpdmVQYXJ0aWNpcGFudHMgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gIWMuaXNMZWZ0KTtcclxuICAgIGNvbnNvbGUud2FybihhY3RpdmVQYXJ0aWNpcGFudHMubGVuZ3RoKTtcclxuICAgIHJldHVybiBhY3RpdmVQYXJ0aWNpcGFudHMubGVuZ3RoID4gMjtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZCAmJiBjdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydjb2xsb3BzJzogaXNDb2xsb3BzLCAnaW5jb21pbmctY2FsbC1jb250YWluZXInOiBpc0NsaWNrRXhwYW5kLCAnY29udGFjdHMtb3Blbic6IHNob3dDb250YWN0c1BhbmVsIH1cIj5cclxuICAgICAgICA8IS0tIENhbGxpbmcgQWxlcnQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxwYWQtYWxlcnRzXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ2NvbmZlcmVuY2UtYWxlcnQnOiBpc0NvbmZlcmVuY2UgJiYgY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAnbm9ybWFsLWNhbGwtYWxlcnQnOiAhaXNDb25mZXJlbmNlXHJcbiAgICAgICAgfVwiXHJcbiAgICAgICAgKm5nSWY9XCJjYWxsTnVtYmVyVG9hc3Quc2hvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbGJveC1wb3AxIGFsZXJ0IGZhZGUgc2hvd1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYWxsTnVtYmVyVG9hc3QudHlwZVwiXHJcbiAgICAgICAgICAgICAgICByb2xlPVwiYWxlcnRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICBZb3UnciBjYWxsaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e2NhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGlzYyBwLTAgcHgtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIENhbmNlbCBDYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWxsIHR5cGUgQ2FsbCBIb2xkIGxpc3QgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIoY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgISFjdXJyZW50Q2FsbCAmJiAoKGlzQ29uZmVyZW5jZUNhbGxIb2xkIHx8IGlzQ29uZmVyZW5jZSkgfHwgIWlzQ29uZmVyZW5jZSkpIHx8ICFpc0FsbEFjY2VwdGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY3VycmVudENhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cIiFjb25mPy5pc0FjY2VwdENhbGwgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjb25mPy50bykgJiYgdHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nLXdyYXBwZXIgYm9yZGVyLXJhZGl1cy01MFwiIFtzcmNdPVwiY29uZj8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIzNVwiIGhlaWdodD1cIjM1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+e3tjb25mPy5mcm9tfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uZnJvbU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3QgcmVjZWl2ZS1idG5cIiAoY2xpY2spPVwid2FpdGluZ0NhbGxBY2NlcHQoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIiAoY2xpY2spPVwib25SZWplY3RDYWxsKGNvbmYpXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25mPy5idXNpbmVzc051bWJlclwiIGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY29uZmVyZW5jZUNhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cImNvbmY/LmlzQ29uZmVyZW5jZUhvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBob2xkLWljb25cIj5wYXVzZV9jaXJjbGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SG9sZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1uYW1lXCI+e3tjb25mPy5jb25mZXJlbmNlTmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdFwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjb25mPy5pc0NvbmZlcmVuY2VIb2xkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3YXBDYWxscyhjb25mLHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cInt7J0hvbGQnfX1cIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5lY2VDYWxsKGNvbmYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKGNvbmYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBGb3Igc2luZ2xlIGluY29taW5nIGNhbGwgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImgtMTAwIHB5LTVcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50Q2FsbExpc3QubGVuZ3RoID09PSAxICYmIGN1cnJlbnRDYWxsTGlzdFswXT8uaXNJbmNvbWluZ0NhbGwgJiYgIWN1cnJlbnRDYWxsTGlzdFswXT8uaXNBY2NlcHRDYWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsVG9OdW1cIj5JbmNvbWluZyBjYWxsIG9uIDxiciAvPjxzcGFuPnt7Y3VycmVudENhbGxMaXN0WzBdPy50byB8fCAnVW5rbm93blxyXG4gICAgICAgICAgICAgICAgICAgIE51bWJlcid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiBbc3JjXT1cImN1cnJlbnRDYWxsTGlzdFswXT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMjBcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxoMT57eyBjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWUgPyBjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWUgOiBjdXJyZW50Q2FsbExpc3RbMF0/LnBob25lIHx8ICdVbmtub3duXHJcbiAgICAgICAgICAgICAgICAgICAgTnVtYmVyJyB9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiEhY3VycmVudENhbGxMaXN0WzBdPy5uYW1lXCI+e3sgY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRucyBtdC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gcmVjZWl2ZS1idG5cIiAqbmdJZj1cIiFuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8uaXNDYWxsQ29ubmVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlIHx8ICF0d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbFwiIChjbGljayk9XCJhZGQoY3VycmVudENhbGxMaXN0WzBdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiID4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWplY3QtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uUmVqZWN0Q2FsbChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGxfZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgYWN0aXZlIGNhbGwgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIighaXNDb25mZXJlbmNlIHx8IGlzQ29uZmVyZW5jZUNhbGxIb2xkKSAmJiAoISFjdXJyZW50Q2FsbD8uaWQgJiYgIWN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpICYmIGN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiAnZmxleCcsICdmbGV4LWRpcmVjdGlvbic6ICdjb2x1bW4nLCAncG9zaXRpb24nOiAncmVsYXRpdmUnfVwiIGNsYXNzPVwiYWN0aXZlLWNhbGxcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzhweCd9XCI+e3tjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy50b05hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbD8udG9OYW1lIHx8ICdVbmtub3duJ319PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIj57eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy50byB8fCAnVW5rbm93bicgOiBjdXJyZW50Q2FsbD8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9wPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjdXJyZW50Q2FsbD8uY2xpZW50XCI+e3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbSB8fCAnVW5rbm93bicgOiBjdXJyZW50Q2FsbD8udG8gfHxcclxuICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvcD5cclxuICAgICAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbi10b3A6IDRweFwiPnt7Y3VycmVudENhbGw/LnRpbWUgfHwgdGltZXJ9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRuc1wiICpuZ0lmPVwiIXNob3dLZXlwYWRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnMjBweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF1c2UtcmVzdW1lLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGxheV9hcnJvdyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInRpbWVyLWRpc3BsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhbGwtaW5wdXRzXCIgaWQ9XCJjYWxsLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjYWxsSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJvbkNhbGxJbnB1dEVudGVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFySW5wdXRzKClcIj5jbG9zZV9zbWFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXktYnRuXCIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlwYWRWYWxcIiAoY2xpY2spPVwib25DYWxsSW5wdXRzKGtleS5udW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3trZXkubnVtfX1cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnNcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnNzIzeCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCIhaW5jb21pbmdDYWxsRGl2IHx8IGlzQ29uY3VycmVudEluY29taW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhlbGQtYnRuIG1lcmdlLWJ0blwiIChjbGljayk9XCJtZXJnZUNhbGxzKClcIiB0aXRsZT1cIk1lcmdlIGNhbGxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWVyZ2VDYWxsQWxsb3dlZCgpIHx8IGN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPCAyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1lcmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuIG1yLTNcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cInRvZ2dsZUtleXBhZCgpXCI+IHRyYW5zaXRpb25fZGlzc29sdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBjb25mZXJlbmNlIGNhbGwgdmlldyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmVyZW5jZS1jYWxsLXZpZXdcIiAqbmdJZj1cImlzQ29uZmVyZW5jZSAmJiBjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWhlYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi1pY29uIG1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi10aXRsZVwiPkNvbmZlcmVuY2UgQ2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGwgb2YgY3VycmVudENhbGxMaXN0OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2FsbD8uaXNDb25mZXJlbmNlSG9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpICE9IDBcIj4mPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYWxsPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VsZk51bWJlcihjYWxsKSBlbHNlIHNlbGZOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY2FsbD8uZnJvbU5hbWUgfHwgY2FsbD8uZnJvbSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50b319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZk51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WW91PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjYWxsPy5jbGllbnRcIj57e2NhbGw/LmRpcmVjdGlvbiA9PSBcIm91dGdvaW5nLWNhbGxcIiA/IGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50byA6IGNhbGw/LmZyb21OYW1lIHx8IGNhbGw/LmZyb20gfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtdGltZXJcIj57eyB0aW1lciB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zIG10LWF1dG9cIiAqbmdJZj1cIiFzaG93S2V5cGFkXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICcyMHB4J31cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uQ2FsbElucHV0RW50ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGlucHV0LWNsZWFyLWJ0blwiICpuZ0lmPVwiY2FsbElucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNNdXRlfVwiIChjbGljayk9XCJ0b2dnbGVNdXRlKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHt7IGlzTXV0ZSA/ICdtaWNfb2ZmJyA6ICdtaWMnIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlS2V5cGFkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY3VycmVudENhbGwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG4gZGFuZ2VyXCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndhdmUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMjQgMTUwIDI4XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0tMTYwIDQ0YzMwIDAgNTgtMTggODgtMThzIDU4IDE4IDg4IDE4IDU4LTE4IDg4LTE4IDU4IDE4IDg4IDE4IHY0NGgtMzUyelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjBcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiM1wiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gSW5jb21pbmcgY2FsbCB1c2VyIGRldGFpbHMgc2hvd24gaW4gbW9kZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXItbW9kZWwgcC0zIHRleHQtd2hpdGUgbW9kZWwtY29udGVudCBjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNDbGlja0V4cGFuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIHVzZXItaW5mby1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlXCI+QzJDIC1QT0lOVCB7e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTFcIj5OYW1lOjwvaDU+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJ0ZXh0LXdoaXRlIHVzZXJOYW1lXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5uYW1lfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TnVtYmVyOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5udW1iZXJ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+RXh0ZW5zaW9uOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uZXh0ZW5zaW9ufX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPkVtYWlsOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3NlbGVjdGVkVXNlckluZm8/LmVtYWlsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlN1YmplY3Q6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yIHN1YmplY3QtdGV4dFwiIHRpdGxlPVwie3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTIgbWItMVwiPkltYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2UgJiYgc2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2UgIT09ICctJzsgZWxzZSBub0ltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e3NlbGVjdGVkVXNlckluZm8/LmltYWdlfX1cIiBhbHQ9XCJcIiB3aWR0aD1cIjE1MFwiIGNsYXNzPVwibWwtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5ObyBJbWFnZSBBdmFpbGFibGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5NZXNzYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyXCIgW2NsYXNzLmV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIj57e3NlbGVjdGVkVXNlckluZm8/Lm1lc3NhZ2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0b2dnbGUtYnRuXCIgKm5nSWY9XCJzaG93QnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVRleHQoKVwiPnt7IGlzRXhwYW5kZWQgPyAnU2VlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcycgOiAnU2VlIG1vcmUnIH19PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPlBvaW50IE5hbWU6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5Tb3VyY2UgTmFtZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uc291cmNlTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGNvbnRhY3QgbGlzdCBwYW5lbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1wYW5lbFwiICpuZ0lmPVwic2hvd0NvbnRhY3RzUGFuZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXY+UGFydGljaXBhbnQ8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoe30sIHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDAwMDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNFQVJDSCBJTlBVVCAodmlzaWJsZSB3aGVuIGlzU2VhcmNoVmlzaWJsZSA9IHRydWUpIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYmFyIHAtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChpbnB1dCk9XCJhcHBseUZpbHRlcigpXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdJZj1cInNlYXJjaFRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Yz8uZmlyc3ROYW1lfX0ge3tjPy5taWRkbGVOYW1lfX0ge3tjPy5sYXN0TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG4gbXItMlwiIChjbGljayk9XCJjYWxsQ29udGFjdChjKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjPy5Jc0Nvbm5lY3RlZFwiIHRpdGxlPVwiQWRkIHRvIGNvbmZlcmVuY2UgY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIsIHRydWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZExpc3QubGVuZ3RoICYmIGlzRGlyZWN0Q2FsbE9wdGlvblNob3cgJiYgc2VhcmNoVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCInYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IHNlYXJjaFRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgdG8gY29uZmVyZW5jZSBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPkluIFRoaXMgQ2FsbDwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtYi0yIG10LTFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0lmPVwiIWM/LmlzTGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG8gfHwgJ1Vua25vd24nIDogYz8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiICpuZ0lmPVwiYz8uY2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlbGZOdW1iZXIoYykgZWxzZSBzZWxmTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM/LnRvTmFtZSB8fCAnVW5rbm93bid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGZOdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPllvdTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb20gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bicgOiBjPy50byB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwiYz8uZnJvbSA9PSBob3N0bnVtYmVyPy5mcm9tICYmIGM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1sYWJlbFwiPk9yZ2FuaXplcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pYy1idG4gbXItMlwiIFtkaXNhYmxlZF09XCJjPy5pc0hvbGRcIiAoY2xpY2spPVwib25NdXRlVXNlcihjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJjPy5pc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFjPy5pc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmlzSG9sZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhvbGRDYWxsKGMpXCIgKm5nSWY9XCIhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIiFjPy5pc0hvbGQgPyAnSG9sZCcgOiAnUmVzdW1lJ1wiPiBwaG9uZV9wYXVzZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlLCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5lY2VDYWxsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjPy5ob3N0ICYmIChkZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGM/LmZyb20pIHx8IChkZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGM/LnRvKSAmJiBjPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPlBhcnRpY2lwYW50IGFkZGVkIHRvIHRoZSBjYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPy5mcm9tTmFtZSB8fCAnVW5rbm93bid9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPy50b05hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCJjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24nIDogYz8udG8gfHwgJ1Vua25vd24nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwiYz8uZnJvbSA9PSBob3N0bnVtYmVyPy5mcm9tICYmIGM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG5cIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byA6IGM/LmZyb20pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+UmVqb2luPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSA6IGM/LnRvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJlam9pbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ29uZmVyZW5jZSBXYXJuaW5nIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiY3VzdG9tLW1vZGFsXCIgKm5nSWY9XCJzaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHdhcm5pbmctbW9kYWxcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPndhcm5pbmc8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aDM+Q29uZmVyZW5jZSBDYWxsIFdhcm5pbmc8L2gzPlxyXG5cclxuICAgIDxwPlxyXG4gICAgICBTdGFydGluZyBhIG5ldyBjYWxsIHdpbGwgcHV0IHRoZSBjdXJyZW50IGNvbmZlcmVuY2Ugb24gaG9sZFxyXG4gICAgICBhbmQgY2Fubm90IGJlIG1lcmdlZCBsYXRlci5cclxuICAgIDwvcD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbE5ld0NhbGwoKVwiPlxyXG4gICAgICAgIENhbmNlbFxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJwcm9jZWVkLWJ0blwiIChjbGljayk9XCJjb25maXJtTmV3Q2FsbCgpXCI+XHJcbiAgICAgICAgUHJvY2VlZFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNNaW5pbWlzZWRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBmdWxsc2NyZWVuXCIgKGNsaWNrKT1cIm1heGltaXNlRGlhbHBhZCgpXCI+IG9wZW5faW5fZnVsbCA8L3NwYW4+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCVcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGwtYW5pbWF0aW9uXCIgaWQ9XCJjYWxsLWF2YXRhclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm1pbi1hdmF0YXItaW1nXCIgW3NyY109XCJjYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjYWxsRGF0YS5uYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDBcIj57e2NhbGxEYXRhLmRpc3BsYXlOdW0gPyBjYWxsRGF0YS5kaXNwbGF5TnVtIDogY2FsbERhdGEucGhvbmUgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWluLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXRpbWVyXCI+e3t0aW1lcn19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLXNlYy1idG5cIiAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSBDYWxsIERpc2Nvbm5lY3QgTW9kYWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJjdXN0b20tbW9kYWxcIiAqbmdJZj1cInNob3dEaXNjb25uZWN0TW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHAtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXIgcC0wIHBiLTJcIj5cclxuICAgICAgICAgICAgPGg0IGNsYXNzPVwidGl0bGUgbWItMFwiPkNhbGwgRGlzY29ubmVjdGVkPC9oND5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFudC1ib2R5IG1iLTJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBFeGl0aW5nIHRoaXMgY2FsbCB3aWxsIG5vdCBlbmQgdGhlIGNvbmZlcmVuY2UuIFRoZSBzZXNzaW9uIHdpbGwgY29udGludWUsIGFuZCBjaGFyZ2VzIHdpbGwgaW5jdXIgdG9cclxuICAgICAgICAgICAgICAgIHlvdXJcclxuICAgICAgICAgICAgICAgIGFjY291bnQuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMCBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNSZWFzb25DaGVja2VkXCIgY2xhc3M9XCJtZS0yXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci0yNGhyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBIb3VyIHBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtc2VsZWN0XCIgW2NsYXNzLmRpc2FibGVkLXBpY2tlcl09XCIhaXNSZWFzb25DaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1kaXNwbGF5XCIgKGNsaWNrKT1cImlzUmVhc29uQ2hlY2tlZCAmJiB0b2dnbGVIb3VyRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVhdmVIb3VyIHx8ICdISCcgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlja2VyLWFycm93XCI+JiM5NjYwOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1vcHRpb25zXCIgKm5nSWY9XCJzaG93SG91ckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGggb2YgaG91cnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwibGVhdmVIb3VyID09PSBoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEhvdXIoaClcIj57eyBoIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBcIj46PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTWludXRlIHBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtc2VsZWN0XCIgW2NsYXNzLmRpc2FibGVkLXBpY2tlcl09XCIhaXNSZWFzb25DaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1kaXNwbGF5XCIgKGNsaWNrKT1cImlzUmVhc29uQ2hlY2tlZCAmJiB0b2dnbGVNaW51dGVEcm9wZG93bigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZWF2ZU1pbnV0ZSB8fCAnTU0nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1hcnJvd1wiPiYjOTY2MDs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uc1wiICpuZ0lmPVwic2hvd01pbnV0ZURyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG0gb2YgbWludXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJsZWF2ZU1pbnV0ZSA9PT0gbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNaW51dGUobSlcIj57eyBtIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGVuZC1idG5cIiAoY2xpY2spPVwibGVhdmVDb25mZXJlbmNlKClcIj5cclxuICAgICAgICAgICAgICAgIExlYXZlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGVuZC1idG5cIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5jZSgpXCIgKm5nSWY9XCJzaG93RW5kQWxsQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICBFbmQgQWxsXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=