@vgroup/dialbox 0.7.14 → 0.7.16

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.
@@ -101,6 +101,8 @@ export class CallProgressComponent {
101
101
  this.pendingAutoUnhold = false;
102
102
  this.pendingMuteParticipants = new Set();
103
103
  this.intendedMuteStates = new Map();
104
+ this.showNewCallLoader = false;
105
+ this.newCallLoaderData = { name: '', phone: '', img: 'assets/images/user.jpg' };
104
106
  this.isMinimised = false;
105
107
  this.showDisconnectModal = false;
106
108
  this.call = this.twilioService.call;
@@ -235,9 +237,6 @@ export class CallProgressComponent {
235
237
  // Check if a mute update is pending for this participant
236
238
  const isMutePending = this.pendingMuteParticipants.has(participantId);
237
239
  const intendedMute = this.intendedMuteStates.get(participantId);
238
- console.log("is mute pending =>", isMutePending);
239
- console.log("intended mute =>", intendedMute);
240
- console.log(participantId);
241
240
  let updatedMute;
242
241
  if (isMutePending) {
243
242
  // If the server already confirmed our change, accept it and clear pending
@@ -360,12 +359,37 @@ export class CallProgressComponent {
360
359
  this.pendingAutoUnhold = true;
361
360
  }
362
361
  }
362
+ // if (this.currentConferenceCall?.participants.length == 2 && this.currentConferenceCall?.participants[0]?.id) {
363
+ // this.currentCall = {...this.currentCallList.find((res: any) => !res?.isConferenceHold && ((res?.direction == 'outgoing-call' && res?.client && !this.deviceNumberList.includes(res?.from)) || (res?.direction == 'incoming-call' && res?.client && !this.deviceNumberList.includes(res?.to)) || !res?.client))};
364
+ // this.currentCall['isAcceptCall']= true;
365
+ // if(this.currentCallList.length == 1) {
366
+ // this.currentCall = this.currentCallList[0]
367
+ // this.currentCall['isAcceptCall']= true;
368
+ // }
369
+ // }
363
370
  if (this.currentConferenceCall?.participants.length == 2 && this.currentConferenceCall?.participants[0]?.id) {
364
- this.currentCall = { ...this.currentCallList.find((res) => !res?.isConferenceHold && ((res?.direction == 'outgoing-call' && res?.client && !this.deviceNumberList.includes(res?.from)) || (res?.direction == 'incoming-call' && res?.client && !this.deviceNumberList.includes(res?.to)) || !res?.client)) };
365
- this.currentCall['isAcceptCall'] = true;
366
- if (this.currentCallList.length == 1) {
367
- this.currentCall = this.currentCallList[0];
368
- this.currentCall['isAcceptCall'] = true;
371
+ const ownNumbers = this.deviceNumberList && this.deviceNumberList.length > 0
372
+ ? this.deviceNumberList
373
+ : null;
374
+ const callerNumber = this.callData?.from || this.selectedCallerId?.number;
375
+ const selected = this.currentCallList.find((res) => {
376
+ if (res?.isConferenceHold)
377
+ return false;
378
+ if (ownNumbers) {
379
+ // Original logic – works when the caller‑ID list is loaded
380
+ return (res?.direction == 'outgoing-call' && res?.client && !ownNumbers.includes(res?.from)) ||
381
+ (res?.direction == 'incoming-call' && res?.client && !ownNumbers.includes(res?.to)) ||
382
+ !res?.client;
383
+ }
384
+ else {
385
+ // Safe fallback: exclude the participant whose number matches the caller ID we used
386
+ const isOwn = (res?.direction == 'outgoing-call' && res?.from === callerNumber) ||
387
+ (res?.direction == 'incoming-call' && res?.to === callerNumber);
388
+ return !isOwn;
389
+ }
390
+ });
391
+ if (selected) {
392
+ this.currentCall = { ...selected, isAcceptCall: true };
369
393
  }
370
394
  }
371
395
  else if (this.currentConferenceCall?.participants?.length > 2 && this.currentConferenceCall?.participants[1]?.isConference) {
@@ -374,9 +398,10 @@ export class CallProgressComponent {
374
398
  }
375
399
  else if (this.currentConferenceCall?.participants?.length == 1 && this.currentConferenceCall?.participants[0]?.id) {
376
400
  this.currentCall = this.currentCallList.find((callInfo) => callInfo?.id == this.currentConferenceCall?.participants[0]?.id);
377
- if (this.currentCall?.client && this.currentCall?.direction == 'outgoing-call' && this.deviceNumberList.includes(this.currentCall?.from)) {
401
+ if (this.currentCall?.client && this.currentCall?.direction == 'outgoing-call') {
378
402
  this.currentCall['client'] = false;
379
403
  this.currentCall['isAcceptCall'] = true;
404
+ console.log(this.currentCall);
380
405
  }
381
406
  }
382
407
  else if (!this.currentConferenceCall && this.currentCall && this.currentCallList?.length > 0) {
@@ -503,7 +528,7 @@ export class CallProgressComponent {
503
528
  if (changes['callAction']?.currentValue && this.callAction?.type == 'reJoin') {
504
529
  this.deviceNumberList = this.callerIdList.map((res) => res.number);
505
530
  let data = this.newIncomingCallsList.find((item) => item?.conferenceId == this.callAction?.conferenceId)?.participants.find((resData) => resData?.host);
506
- if (data?.isLeft || !this.newIncomingCallsList?.length) {
531
+ if (data?.isLeft || !data) {
507
532
  this.rejoinHost(this.callAction);
508
533
  }
509
534
  }
@@ -562,6 +587,7 @@ export class CallProgressComponent {
562
587
  deviceId: this.deviceId,
563
588
  clientSid: this.call?.parameters['CallSid']
564
589
  });
590
+ this.conferenceCallIDForParticipantList = rejoinParticipentInfo?.conferenceId;
565
591
  this.setupEventListeners();
566
592
  }
567
593
  catch (error) {
@@ -604,7 +630,6 @@ export class CallProgressComponent {
604
630
  }
605
631
  }
606
632
  async participantListIndo(participants) {
607
- console.log("participantListIndo");
608
633
  if (!participants?.length) {
609
634
  if (this.allParticipentList?.length) {
610
635
  this.allParticipentList = [];
@@ -775,6 +800,9 @@ export class CallProgressComponent {
775
800
  countrycode: '',
776
801
  deviceId: this.deviceId,
777
802
  });
803
+ if (isNewConference) {
804
+ this.conferenceCallIDForParticipantList = response?.callauth?.id;
805
+ }
778
806
  this.isNewAddedCall = false;
779
807
  this.extensionService.isLoadershow.next(false);
780
808
  this.isLoadershown.emit(false);
@@ -809,7 +837,6 @@ export class CallProgressComponent {
809
837
  this.intendedMuteStates.set(participantId, newMuteState);
810
838
  c.isMute = newMuteState;
811
839
  this.cdr.detectChanges();
812
- console.log(c.isMute);
813
840
  this.onMuteParticipant({
814
841
  participantId: [participantId],
815
842
  conferenceId: c?.conferenceId,
@@ -980,6 +1007,9 @@ export class CallProgressComponent {
980
1007
  this.endCall();
981
1008
  });
982
1009
  this.call?.on('accept', () => {
1010
+ setTimeout(() => {
1011
+ this.showNewCallLoader = false;
1012
+ }, 2000);
983
1013
  this.showRingAnimation = false;
984
1014
  this.disbaleEndCallBtn = false;
985
1015
  // Ensure the active outgoing call is marked as accepted so the UI switches to the connected view
@@ -1034,7 +1064,7 @@ export class CallProgressComponent {
1034
1064
  // this.isUnholdConferenceCall = true;
1035
1065
  let conference = this.newIncomingCallsList?.find((res) => res?.conferenceId == conf?.conferenceId);
1036
1066
  let hostNumber = conference?.participants?.find((participant) => participant?.host);
1037
- if (this.deviceNumberList.includes(hostNumber?.from) || (this.deviceNumberList.includes(hostNumber?.to) && hostNumber?.direction == 'incoming-call' && hostNumber?.host)) {
1067
+ if ((this.deviceNumberList.includes(hostNumber?.from) || (this.deviceNumberList.includes(hostNumber?.to) && hostNumber?.direction == 'incoming-call' && hostNumber?.host)) && conference?.participants.filter((p) => !p.isLeft).length > 2) {
1038
1068
  this.selectedConf['conName'] = this.conferenceCallList.find((res) => res?.conferenceId == conf?.conferenceId)?.conferenceName || '';
1039
1069
  this.onCallDisconnected();
1040
1070
  }
@@ -1168,6 +1198,7 @@ export class CallProgressComponent {
1168
1198
  this.extensionService.setIncomingCallStatus(payload).subscribe(async (res) => {
1169
1199
  if (res.status == 200) {
1170
1200
  clearInterval(intervalId);
1201
+ this.conferenceCallIDForParticipantList = data?.conferenceId;
1171
1202
  this.incomeingCallSocketService.isCurrentIncomingCallList.push(data?.id);
1172
1203
  this.twilioService.isShowIncomingCall = false;
1173
1204
  this.extensionService.isAcceptIIncomingCall.next(data?.conferenceId);
@@ -1406,12 +1437,18 @@ export class CallProgressComponent {
1406
1437
  confirmNewCall() {
1407
1438
  this.showConferenceWarningModal = false;
1408
1439
  if (this.pendingCallData) {
1440
+ this.newCallLoaderData = {
1441
+ name: this.pendingCallData.name || '',
1442
+ phone: this.pendingCallData.phone,
1443
+ img: this.pendingCallData.img || 'assets/images/user.jpg'
1444
+ };
1409
1445
  this.callNumberToast = {
1410
1446
  show: true,
1411
1447
  type: 'alert-success',
1412
1448
  number: this.pendingCallData.phone,
1413
1449
  displayNum: this.pendingCallData.phone
1414
1450
  };
1451
+ this.showNewCallLoader = true;
1415
1452
  setTimeout(() => {
1416
1453
  this.callNumberToast.show = false;
1417
1454
  }, 7000);
@@ -1924,6 +1961,10 @@ export class CallProgressComponent {
1924
1961
  isSelfNumber(participant) {
1925
1962
  return this.deviceNumberList.find((res) => res == (participant?.direction == 'outgoing-call' ? participant?.from : participant?.to));
1926
1963
  }
1964
+ shouldShowSeparator(index) {
1965
+ const visibleCount = this.currentCallList.slice(0, index).filter((call) => !call?.isConferenceHold).length;
1966
+ return visibleCount > 0;
1967
+ }
1927
1968
  getName(number) {
1928
1969
  let contactInfo = this.contacts.find((c) => {
1929
1970
  return c?.numbersList[0]?.number == number || c?.numbersList[1]?.number == number;
@@ -1948,10 +1989,10 @@ export class CallProgressComponent {
1948
1989
  }
1949
1990
  }
1950
1991
  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 });
1951
- 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", newCallConference: "newCallConference", missCallInfo: "missCallInfo", 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 <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\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 <div class=\"d-flex justify-content-between align-items-center\">\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 <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\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 && conf?.isNotification\">\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 && conferenceCallList.length > 1\">\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)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </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 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=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\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 </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 <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'\" 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'\" 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 || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || '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'\" [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\" (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\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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=\"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 </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 <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 <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\" [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\" (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 mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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 <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 <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\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 </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 <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 <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 <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 <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 <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) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</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\">{{selectedConfName}}'s active participants</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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || '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' : 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 || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\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\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false)\"\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(c)\"\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 </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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined\"\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 && !c?.joined\"\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 <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\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 <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\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\">{{selectedConf?.conName || 'Call'}} Disconnect</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()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\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 </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}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}\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"] }] });
1992
+ 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", newCallConference: "newCallConference", missCallInfo: "missCallInfo", 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 <div class=\"loader-wrapper outgoing-call-loader\"\r\n *ngIf=\"showNewCallLoader\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"newCallLoaderData?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ newCallLoaderData?.name || newCallLoaderData?.phone || 'Unknown' }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled (click)=\"endCall()\" style=\"visibility: hidden;\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\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 <div class=\"d-flex justify-content-between align-items-center\">\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 <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\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 && conf?.isNotification\">\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 && conferenceCallList.length > 1\">\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)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </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 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=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\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 </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 <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'\" 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'\" 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 || 'Unknown1' :\r\n currentCall?.fromName || 'Unknown2'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown3' :\r\n currentCall?.toName || 'Unknown4'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || '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'\" [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\" (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\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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=\"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 </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 <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 <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=\"shouldShowSeparator(i)\"> & </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\" [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\" (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 mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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 <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 <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\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 </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 <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 <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 <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 <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 <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) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</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\">{{selectedConfName}}'s active participants</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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || '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' : 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 || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\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\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false)\"\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(c)\"\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 </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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined\"\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 && !c?.joined\"\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 <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\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 <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\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\">{{selectedConf?.conName || 'Call'}} Disconnect</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()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\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 </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}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}.loader-wrapper.outgoing-call-loader{position:absolute;inset:0;background:linear-gradient(to bottom,#1742DE,#1b369b);z-index:100;display:flex;align-items:center;justify-content:center}\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"] }] });
1952
1993
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, decorators: [{
1953
1994
  type: Component,
1954
- 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 <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\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 <div class=\"d-flex justify-content-between align-items-center\">\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 <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\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 && conf?.isNotification\">\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 && conferenceCallList.length > 1\">\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)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </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 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=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\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 </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 <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'\" 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'\" 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 || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || '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'\" [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\" (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\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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=\"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 </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 <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 <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\" [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\" (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 mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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 <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 <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\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 </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 <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 <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 <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 <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 <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) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</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\">{{selectedConfName}}'s active participants</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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || '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' : 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 || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\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\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false)\"\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(c)\"\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 </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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined\"\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 && !c?.joined\"\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 <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\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 <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\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\">{{selectedConf?.conName || 'Call'}} Disconnect</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()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\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 </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}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}\n"] }]
1995
+ 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 <div class=\"loader-wrapper outgoing-call-loader\"\r\n *ngIf=\"showNewCallLoader\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"newCallLoaderData?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ newCallLoaderData?.name || newCallLoaderData?.phone || 'Unknown' }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled (click)=\"endCall()\" style=\"visibility: hidden;\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\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 <div class=\"d-flex justify-content-between align-items-center\">\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 <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\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 && conf?.isNotification\">\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 && conferenceCallList.length > 1\">\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)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </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 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=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\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 </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 <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'\" 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'\" 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 || 'Unknown1' :\r\n currentCall?.fromName || 'Unknown2'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown3' :\r\n currentCall?.toName || 'Unknown4'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || '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'\" [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\" (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\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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=\"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 </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 <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 <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=\"shouldShowSeparator(i)\"> & </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\" [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\" (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 mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (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 <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 <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\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 </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 <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 <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 <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 <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 <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) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</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\">{{selectedConfName}}'s active participants</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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || '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' : 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 || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\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\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false)\"\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(c)\"\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 </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'\" 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'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined\"\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 && !c?.joined\"\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 <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\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 <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\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\">{{selectedConf?.conName || 'Call'}} Disconnect</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()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\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 </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}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}.loader-wrapper.outgoing-call-loader{position:absolute;inset:0;background:linear-gradient(to bottom,#1742DE,#1b369b);z-index:100;display:flex;align-items:center;justify-content:center}\n"] }]
1955
1996
  }], ctorParameters: function () { return [{ type: i1.ExtensionService }, { type: i0.ChangeDetectorRef }, { type: i2.TwilioService }, { type: i3.IpAddressService }, { type: i4.IncomeingCallSocketService }]; }, propDecorators: { callData: [{
1956
1997
  type: Input
1957
1998
  }], selectedCallerId: [{
@@ -1985,4 +2026,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1985
2026
  }], endIncomingCallEvent: [{
1986
2027
  type: Output
1987
2028
  }] } });
1988
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQW1COUMsTUFBTSxPQUFPLHFCQUFxQjtJQWlIaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDN0UsYUFBNEIsRUFDM0IsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM3RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBaEh2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBQzVCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBS3RCLGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUQseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUMsQ0FBQSxFQUFFO1FBQ3BFLGtCQUFhLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFHN0Usc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLFVBQUssR0FBVyxPQUFPLENBQUM7UUFFeEIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ25CLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsc0JBQWlCLEdBQW1CLElBQUksQ0FBQztRQUN6QyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDbEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixtQkFBYyxHQUFZLElBQUksQ0FBQztRQUNyQiwwQkFBcUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNyRSxrQkFBYSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ25FLHlCQUFvQixHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBSTlFLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsZ0JBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUIsZUFBVSxHQUFXLFNBQVMsQ0FBQyxDQUFJLEVBQUU7UUFHckMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLDJCQUFzQixHQUFZLEtBQUssQ0FBQyxDQUFHLEVBQUU7UUFDN0MseUJBQW9CLEdBQVksS0FBSyxDQUFDLENBQUcsRUFBRTtRQUUzQyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixhQUFRLEdBQVUsRUFBRSxDQUFDO1FBQ3JCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBRzVCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRS9CLDhCQUF5QixHQUFRLEVBQUUsQ0FBQztRQUNwQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFFdEMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBRXZCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsY0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEVBQUU7WUFDUCxJQUFJLEVBQUUsS0FBSztTQUNaLENBQUE7UUFDRCxvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQix1QkFBa0IsR0FBVSxFQUFFLENBQUM7UUFDL0IsNkJBQXdCLEdBQVksS0FBSyxDQUFDO1FBQzFDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUMzQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUN4QiwwQkFBcUIsR0FBUSxFQUFFLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsc0JBQXNCO1FBQ3RCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsVUFBSyxHQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLFlBQU8sR0FBYSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRXBDLCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUM1QyxvQkFBZSxHQUFRLElBQUksQ0FBQztRQUM1QixvQkFBZSxHQUFHO1lBQ2hCLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLGVBQWU7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFFRiw0QkFBdUIsR0FBVyxDQUFDLENBQUM7UUFDcEMsMEJBQXFCLEdBQVEsRUFBRSxDQUFDO1FBRXhCLHFCQUFnQixHQUFVLEVBQUUsQ0FBQztRQUNyQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDZCwyQkFBc0IsR0FBa0IsSUFBSSxDQUFDO1FBQzdDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUUzQyw0QkFBdUIsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNqRCx1QkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQWlpRHJELGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBeVA3Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFweEQxQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04saURBQWlEO1FBQ2hELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJO1lBQ0YsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7YUFDNUM7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMxRDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFFLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzVDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFO2dCQUNqRyxJQUFJLENBQUMsV0FBVyxHQUFHO29CQUNqQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZO29CQUNuQyxFQUFFLEVBQUUsS0FBSztvQkFDVCxHQUFHLEVBQUUsd0JBQXdCO29CQUM3QixjQUFjLEVBQUUsS0FBSztvQkFDckIsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsWUFBWSxFQUFFLEtBQUs7b0JBQ25CLFlBQVksRUFBRSxJQUFJO29CQUNsQixJQUFJLEVBQUUsSUFBSTtvQkFDVixLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLO29CQUM5QyxhQUFhLEVBQUUsS0FBSztvQkFDcEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxJQUFJLEVBQUU7b0JBQzVJLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztpQkFDakIsQ0FBQztnQkFDRixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNyRDtTQUNGO1FBQ0QsSUFBSSxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUU7WUFDbkgsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRTtvQkFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3pFO2dCQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsQ0FBUyxFQUFFLEVBQUU7b0JBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDM0YsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUNsRixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQ3pNLENBQUE7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3QkFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7cUJBQzVFO3lCQUFNLElBQUksYUFBYSxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0JBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxFQUFFLE1BQU0sQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztxQkFDL0I7b0JBQ0QsNkVBQTZFO29CQUM3RSxJQUFJLDRCQUE0QixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckssSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3JMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ25FLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWlCLEVBQUUsRUFBRTt3QkFDekQsSUFBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7NEJBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxhQUFhLEtBQUssYUFBYSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTt5QkFDbkw7b0JBQ0gsQ0FBQyxDQUFDLENBQUE7b0JBQ0YsSUFBSSxhQUFhLEVBQUUsRUFBRSxFQUFFO3dCQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUN4RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7NEJBQ25FLElBQUksR0FBRyxFQUFFLElBQUksRUFBRTtnQ0FDYixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQzs2QkFDdkI7NEJBQ0QsSUFBRyxhQUFhLEVBQUUsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLElBQUksR0FBRyxFQUFFLFlBQVksQ0FBQyxFQUFFO2dDQUN2SCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzs2QkFDMUI7NEJBQ0MsSUFBSSxPQUFPLEdBQVEsRUFBRSxDQUFBOzRCQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO2dDQUN6QixPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUN2QyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQzdGLENBQUE7NkJBQ0Y7NEJBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQ3BDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQ0FDL0UsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFO29DQUN6RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQzt3Q0FDeEIsR0FBRyxHQUFHO3dDQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO3dDQUN2QyxNQUFNLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRTt3Q0FDcEMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLE9BQU8sRUFBRSxLQUFLLElBQUksd0JBQXdCO3dDQUNwSCxjQUFjLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlO3dDQUNqRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07d0NBQ25CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLO3dDQUN2RixjQUFjLEVBQUUsUUFBUSxFQUFFLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSzt3Q0FDckgsTUFBTSxFQUFFLEtBQUs7d0NBQ2IsWUFBWSxFQUFFLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVk7d0NBQ3BELFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTt3Q0FDNUUsSUFBSSxFQUFFLElBQUk7d0NBQ1YsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3Q0FDOUQsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFO3dDQUN0QixhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWE7d0NBQ3RDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU07d0NBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUN4RSxDQUFDLENBQUM7b0NBQ0gsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0NBQzFCLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQzt3Q0FDekUsMkRBQTJEO3dDQUMzRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7cUNBQ3BCO29DQUNELElBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxFQUFDO3dDQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztxQ0FDMUM7aUNBQ0Y7cUNBQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLEVBQUU7b0NBQ2xHLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO29DQUMzQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO3dDQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUNBQ3ZDO3lDQUFNO3dDQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztxQ0FDdkM7b0NBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0NBQzFCLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQzt3Q0FDekUsMERBQTBEO3dDQUMxRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7cUNBQ3BCO29DQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztpQ0FDN0M7cUNBQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFO29DQUN0QyxtQkFBbUI7b0NBQ25CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0NBRTdCLHlEQUF5RDtvQ0FDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQ0FDdEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQ0FDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxhQUFhLENBQUMsQ0FBQztvQ0FDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLENBQUMsQ0FBQztvQ0FDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtvQ0FDMUIsSUFBSSxXQUFvQixDQUFDO29DQUN6QixJQUFJLGFBQWEsRUFBRTt3Q0FDakIsMEVBQTBFO3dDQUMxRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssWUFBWSxFQUFFOzRDQUMvQixXQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQzs0Q0FDekIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQzs0Q0FDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQzt5Q0FDL0M7NkNBQU07NENBQ0wsMEVBQTBFOzRDQUMxRSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7eUNBQ2xEO3FDQUNGO3lDQUFNO3dDQUNMLDJDQUEyQzt3Q0FDM0MsV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7cUNBQzFCO29DQUNELElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUc7d0NBQzVCLEdBQUcsR0FBRzt3Q0FDTixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTt3Q0FDdkMsTUFBTSxFQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUU7d0NBQ3BDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsS0FBSyxJQUFJLHdCQUF3Qjt3Q0FDcEgsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZTt3Q0FDakQsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO3dDQUNuQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSzt3Q0FDdkYsY0FBYyxFQUFFLFFBQVEsRUFBRSxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0NBQ3JILE1BQU0sRUFBRSxXQUFXO3dDQUNuQixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVk7d0NBQ3JFLFlBQVksRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTt3Q0FDM0UsSUFBSSxFQUFFLElBQUk7d0NBQ1YsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3Q0FDOUQsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFO3dDQUN0QixhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWE7d0NBQ3RDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU07d0NBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUN4RSxDQUFDO2lDQUNIOzZCQUNGO2lDQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFO2dDQUNqRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztvQ0FDeEIsR0FBRyxHQUFHO29DQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO29DQUNyQyxNQUFNLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRTtvQ0FDdEMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLE9BQU8sRUFBRSxLQUFLLElBQUksd0JBQXdCO29DQUNuSCxjQUFjLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlO29DQUNoRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07b0NBQ25CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLO29DQUN2RixjQUFjLEVBQUUsUUFBUSxFQUFFLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztvQ0FDckgsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO29DQUNuQixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVk7b0NBQ3JFLFlBQVksRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQ0FDM0UsSUFBSSxFQUFFLElBQUk7b0NBQ1YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQ0FDN0QsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFO29DQUNyQixhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWE7b0NBQ3RDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU07b0NBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lDQUN4RSxDQUFDLENBQUM7Z0NBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7Z0NBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDOzZCQUNoQzt3QkFDTCxDQUFDLENBQUMsQ0FBQTt3QkFDRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO3FCQUNsQzt5QkFBTTt3QkFDTCxJQUFHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEVBQUU7NEJBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTs0QkFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7NEJBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7NEJBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOzRCQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzs0QkFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs0QkFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzs0QkFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzs0QkFDL0IsdUNBQXVDOzRCQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQzs0QkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7NEJBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7NEJBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQ0FDbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDOzZCQUN6Qzs0QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOzRCQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7NEJBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQzFCO3dCQUNELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO3FCQUM5QjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFDRixnRkFBZ0Y7Z0JBQ2hGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3JHLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRTtvQkFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDcEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzNDO2lCQUNGO2dCQUNELElBQUksV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUN4RyxJQUFJLFdBQVcsR0FBTyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQ3hFLE9BQU8sSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUU7d0JBQ25ELElBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUU7NEJBQ3JTLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQy9CO3dCQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUE7b0JBQzNTLENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2dCQUNILGdFQUFnRTtnQkFDaEUsd0ZBQXdGO2dCQUV4RixJQUFJLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDO29CQUN0RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUNoQztxQkFBTSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztvQkFDM0csTUFBTSx3QkFBd0IsR0FBRyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQ3ZFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO3dCQUN6RixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FDeEcsQ0FBQztvQkFDRixpR0FBaUc7b0JBQ2pHLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLEVBQUU7d0JBQ2xELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7cUJBQy9CO2lCQUNGO2dCQUNELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUMzRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBQyxDQUFDO29CQUNoVCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFFLElBQUksQ0FBQztvQkFDdkMsSUFBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7d0JBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRSxJQUFJLENBQUM7cUJBQ3hDO2lCQUNGO3FCQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFO29CQUM1SCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNuRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztpQkFDMUI7cUJBQU0sSUFBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUM7b0JBQ2pILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFZLEVBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDL0gsSUFBRyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUN2SSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFFLEtBQUssQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRSxJQUFJLENBQUM7cUJBQ3hDO2lCQUNGO3FCQUFNLElBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDN0Y7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZELElBQUkseUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dCQUM1RCxnRUFBZ0U7d0JBQ2hFLGtGQUFrRjt3QkFDbEYsK0VBQStFO3dCQUMvRSxJQUFJLFlBQVksR0FBUSxJQUFJLENBQUM7d0JBQzdCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFOzRCQUM1QyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLHNCQUFzQjtnQ0FBRSxTQUFTOzRCQUMvRCxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUUsTUFBTSxDQUFDO21DQUN6SCxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzRCQUN6SSxJQUFJLFlBQVk7Z0NBQUUsTUFBTTt5QkFDekI7d0JBQ0QsSUFBSSxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFOzRCQUNwRCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0NBQ2pELGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0NBQ2pDLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWTtnQ0FDeEMsSUFBSSxFQUFFLEtBQUs7Z0NBQ1gsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLElBQUksS0FBSzs2QkFDbEMsQ0FBQyxDQUFDOzRCQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0NBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFBOzZCQUN4Qzs0QkFDRCxJQUFJLENBQUMsa0NBQWtDLEdBQUcsWUFBWSxFQUFFLFlBQVksQ0FBQzs0QkFDckUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQzs0QkFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzs0QkFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzt5QkFDcEM7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFO29CQUN4QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQzlHLElBQUksWUFBWSxFQUFFO3dCQUNoQixZQUFZLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDbkMsSUFBRyxZQUFZLENBQUMsY0FBYyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7NEJBQ2xFLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRTtnQ0FDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7b0NBQzdFLElBQUksRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFO3dDQUN2QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7d0NBQ2xHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQzt3Q0FDckcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7d0NBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7b0NBQzdFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3Q0FDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsQ0FBQztvQ0FDbEQsQ0FBQztpQ0FDQSxDQUFDLENBQUM7NkJBQ0o7aUNBQU07Z0NBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDOzZCQUN0RTt5QkFDRjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO3lCQUN0Qzt3QkFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7cUJBQ3hCO3lCQUFNO3dCQUNMLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7d0JBQ2xGLElBQUksWUFBWSxFQUFFLGFBQWEsRUFBRTs0QkFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQzs0QkFDckMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dDQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7NkJBQ3hCO3lCQUNGOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7NEJBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO3lCQUM1QjtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDckYsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBQ3JELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7cUJBQ3hCO2lCQUNGO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQTtnQkFDbEYsTUFBTSxVQUFVLEdBQUc7b0JBQ2pCLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDakYsQ0FBQztnQkFFRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3pELEdBQUcsSUFBSTtvQkFDUCxjQUFjLEVBQUUsY0FBYyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2lCQUMxQyxDQUFDLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFO2dCQUMvQyxJQUFHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEVBQUM7b0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN2QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO29CQUNsQyxJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7d0JBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFDeEI7b0JBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO29CQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQ2xCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDekM7b0JBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO29CQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO29CQUNsQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQzFCO2dCQUNELElBQUksQ0FBQyx1QkFBdUIsSUFBRyxDQUFDLENBQUM7Z0JBQy9CLDRCQUE0QjthQUM3QjtZQUFBLENBQUM7U0FDSDtRQUNELElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDNUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsSyxJQUFHLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFO2dCQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNsQztTQUNGO1FBQ0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxZQUFZLEVBQUU7WUFDOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7U0FDL0Q7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFhO1FBQzVCLElBQUk7WUFDRixJQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUU7Z0JBQ3BDLElBQUkseUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFELElBQUkseUJBQXlCLEVBQUUsRUFBRSxFQUFFO29CQUNqQyxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7d0JBQ2pELGFBQWEsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQzt3QkFDOUMsWUFBWSxFQUFFLHlCQUF5QixFQUFFLFlBQVk7d0JBQ3JELElBQUksRUFBRSxJQUFJO3dCQUNWLElBQUksRUFBRSx5QkFBeUIsRUFBRSxJQUFJLElBQUksS0FBSztxQkFDL0MsQ0FBQyxDQUFDO29CQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7d0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFBO3FCQUN4QztpQkFDRjthQUNGO1lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQ3pFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUNuRSxDQUFBO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5Qix3Q0FBd0M7WUFDeEMsTUFBTSxTQUFTLEdBQVEsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9FLHVCQUF1QjtZQUN2QixNQUFNLE9BQU8sR0FBUTtnQkFDbkIsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2dCQUNsQyxlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV6RCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRTtvQkFDTixJQUFJLEVBQUUscUJBQXFCLENBQUMsSUFBSTtvQkFDaEMsRUFBRSxFQUFFLHFCQUFxQixDQUFDLEVBQUU7b0JBQzVCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztvQkFDcEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDekIsR0FBRyxFQUFFLHFCQUFxQixDQUFDLE1BQU07b0JBQ2pDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxZQUFZO2lCQUNsRDtnQkFDRCxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUU7YUFDbkQsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNwQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLElBQUk7b0JBQ0EsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7d0JBQ3RELElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO3dCQUNoQyxLQUFLLEVBQUUsVUFBVTt3QkFDakIsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsRUFBRTt3QkFDNUMsWUFBWSxFQUFFLHFCQUFxQixFQUFFLFlBQVk7d0JBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO3dCQUNyRCxLQUFLLEVBQUUsRUFBRTt3QkFDVCxXQUFXLEVBQUUsRUFBRTt3QkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7d0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7cUJBQzVDLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztpQkFDNUI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDeEQ7WUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDWjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLGVBQW9CLEVBQUUsVUFBZTtRQUMvQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUMxQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUMxQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM1QyxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxlQUFlLENBQUMsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNoRCxlQUFlLENBQUUsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUMzQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUM5QyxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxlQUFlLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLENBQUMscUJBQXFCLENBQUM7UUFDNUUsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDdEQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsT0FBTyxFQUFDLEdBQUcsZUFBZSxFQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELHNCQUFzQixDQUFDLFdBQWU7UUFDcEMsSUFBRyxXQUFXLEVBQUUsTUFBTSxFQUFDO1lBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsV0FBVyxDQUFDO1NBQ3hFO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDakU7UUFDRCxJQUFHLElBQUksQ0FBQyxrQ0FBa0MsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQzdILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQztTQUMvRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLENBQUM7WUFDbkYsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFlBQWtCO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7YUFDbkM7WUFDRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2hDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRiw2RUFBNkU7UUFDN0UsK0RBQStEO1FBQy9ELG9GQUFvRjtRQUNwRiw0RkFBNEY7UUFDNUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ3pCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzNELENBQUM7UUFFRixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLE1BQU0sR0FBVSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsSUFBSSxhQUFhLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTtvQkFDaEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN6QztxQkFBTTtvQkFDTCxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUM3QzthQUNGO1lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUN2SixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLGVBQWU7WUFDckIsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO1FBRUYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsU0FBUyxDQUFDLEdBQVE7UUFDaEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRTtZQUNyQyxPQUFPLEdBQUcsRUFBRSxVQUFVLElBQUksa0JBQWtCLElBQUksR0FBRyxFQUFFLFVBQVUsSUFBSSxrQkFBa0IsSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxVQUFVLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNqTDthQUFNO1lBQ0wsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsRUFBRTtnQkFDaEUsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUNqRCxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBYSxFQUFFLGVBQXlCO1FBQ3RELElBQUk7WUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHO2dCQUNkLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDbEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUN6QixLQUFLLEVBQUUsT0FBTztnQkFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixNQUFNLEVBQUUsSUFBSTtnQkFDWixNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRztnQkFDakIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFVBQVUsRUFBRSxFQUFFO2dCQUNkLFlBQVksRUFBRSxFQUFFO2dCQUNoQixJQUFJLEVBQUUsSUFBSTtnQkFDVixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixFQUFFLEVBQUUsVUFBVTtnQkFDZCxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSx3QkFBd0I7Z0JBQzdDLFlBQVksRUFBRSxJQUFJO2dCQUNsQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFFBQVEsRUFBRSxFQUFFO2dCQUNaLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQzFCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUM1QixJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixJQUFJLEVBQUUsRUFBRTtnQkFDUixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN6QixNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTTthQUN4QyxDQUFDO1lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFHLFNBQVMsRUFBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyw2QkFBNkI7Z0JBQzNELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDcEIsSUFBSTt3QkFDRixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzs0QkFDdEQsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJOzRCQUNwQixLQUFLLEVBQUUsVUFBVTs0QkFDakIsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLEtBQUs7NEJBQ2xDLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7NEJBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDOzRCQUNyRCxLQUFLLEVBQUUsRUFBRTs0QkFDVCxXQUFXLEVBQUUsRUFBRTs0QkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7eUJBQzVDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDOzRCQUM1QyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7NEJBQ3BCLEtBQUssRUFBRSxVQUFVOzRCQUNqQixpQkFBaUIsRUFBRSxRQUFRLEVBQUUsS0FBSzs0QkFDbEMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTs0QkFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7NEJBQ3JELEtBQUssRUFBRSxFQUFFOzRCQUNULFdBQVcsRUFBRSxFQUFFOzRCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt5QkFDeEIsQ0FBQyxDQUFDO3dCQUVILElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFBO3dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQy9CLG9FQUFvRTt3QkFDcEUseURBQXlEO3FCQUMxRDtvQkFBQyxPQUFPLENBQUMsRUFBRTt3QkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN2RDtnQkFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ1Isb0NBQW9DO2FBQ3JDO2lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtTQUVGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLENBQU07UUFDckIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFHL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV6RCxDQUFDLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQixhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDOUIsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUFZO1lBQzdCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNkLElBQUksRUFBRSxZQUFZO1NBQ25CLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9DO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBTTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUM1SyxJQUFJLFVBQVUsR0FBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksSUFBSSxFQUFFLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO29CQUN6QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzVELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUNuTCxDQUFBO29CQUNELElBQUksZUFBZSxFQUFFLEVBQUUsRUFBRzt3QkFDeEIsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLHlCQUF5QixDQUFDOzRCQUNqRCxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDOzRCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7NEJBQzNDLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxNQUFNOzRCQUM5QixJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksSUFBSSxLQUFLO3lCQUNyQyxDQUFDLENBQUM7d0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTs0QkFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUE7eUJBQ3ZDO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUN2TyxDQUFBO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFVBQVUsRUFBRSxFQUFFLElBQUksVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFO2dCQUNyRCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7b0JBQ2pELGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7b0JBQy9CLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWTtvQkFDdEMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU07b0JBQ3pCLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxJQUFJLEtBQUs7aUJBQ2hDLENBQUMsQ0FBQztnQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDeEM7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1NBQ0Y7YUFBTTtZQUNMLElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakQsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUFZO2dCQUM3QixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDZixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLO2FBQ3ZCLENBQUMsQ0FBQztZQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFBO2FBQ3hDO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUN0QjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUM7UUFDMUQsa0RBQWtEO0lBQ3BELENBQUM7SUFDRCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQU0sRUFBRSxZQUFzQixFQUFFLFNBQW1CO1FBQ2pFLElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDcEUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBWSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1SyxJQUFHLGVBQWUsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzdDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLHlCQUF5QixFQUFFLFlBQVksQ0FBQztRQUM3RSxJQUFJLEdBQUcsR0FBUSxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDN0UsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLDBCQUEwQixFQUFFO1lBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjthQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLFlBQVksQ0FBQztRQUN2RCxpRUFBaUU7UUFDakUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQVk7UUFDckMsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxPQUFZO1FBQzFDLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFFLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBWTtRQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBWTtRQUN2QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQVk7UUFDMUMsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLGFBQWtCLEVBQUUsWUFBaUI7UUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEcsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBYTtRQUN2QyxPQUFPO1lBQ0wsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4QixVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ3hDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsVUFBa0I7UUFDbkQsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hHLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQVUsRUFBRSxRQUFhLEVBQUUsU0FBYztRQUNyRSxNQUFNLE9BQU8sR0FBUTtZQUNuQixnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDbEMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ2xCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztnQkFDcEIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2FBQ3JCO1lBQ0QsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUNoQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLDJFQUEyRTtZQUMzRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUM7WUFDdkQsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxlQUFlLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDOUUsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxLQUFLLGVBQWUsQ0FDdEQsQ0FBQzthQUNIO1lBQ0QsMkJBQTJCO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixpR0FBaUc7WUFDakcsSUFBSTtnQkFDRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNoRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFZLEVBQUUsRUFBRTtRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBZTtRQUNoQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7WUFDZixPQUFPLEdBQUcsQ0FBQyxDQUFDO1NBQ2I7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDakMsT0FBTyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sU0FBUztRQUNmLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxZQUFvQjtRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDdkU7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUNwRDtJQUNILENBQUM7SUFFUyxHQUFHLENBQUMsS0FBYTtRQUN2QixPQUFPLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNPLFdBQVcsQ0FBQyxLQUFVO1FBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFVO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLHNDQUFzQztRQUN0QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN4RyxJQUFJLFVBQVUsR0FBRyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ3hLLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUN6SSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUN0QixJQUFJLGVBQWUsR0FBRyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7dUJBQ3pILFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtnQkFDckosSUFBSSxlQUFlLEVBQUUsRUFBRSxFQUFFO29CQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFBO2lCQUNoQzthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtTQUNGO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBc0I7UUFDbEMsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxZQUFZLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRTtnQkFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMxQjtTQUNGO2FBQU07WUFDTCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBR0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFzQjtRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQixhQUFhLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLElBQUkseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1lBQ3pGLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxZQUFZO1lBQ3JELElBQUksRUFBRSx5QkFBeUIsQ0FBQyxNQUFNO1lBQ3RDLElBQUksRUFBRSxDQUFDLHlCQUF5QixFQUFFLE1BQU07WUFDeEMsOERBQThEO1NBQy9ELENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsMERBQTBEO0lBQzVELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CO2FBQzdCLE9BQU8sQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQzthQUNqRCxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQztlQUMvSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqTCxDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxRQUFjLEVBQUUsT0FBaUI7UUFDbkQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLFFBQVEsRUFBRSxZQUFZLENBQUM7UUFDakUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFXLEVBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLEtBQUssUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDN0ksbURBQW1EO1FBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDM0QsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBb0I7UUFDMUMsSUFBSSxhQUFhLEdBQVEsRUFBRSxDQUFBO1FBQzNCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDbkksSUFBSSxRQUFRLEVBQUU7WUFDWixhQUFhLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUMxRCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDbkwsQ0FBQTtTQUNGO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztRQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLGFBQWEsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLFlBQVksS0FBSyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUU7WUFDdkYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDdkQsYUFBYSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDbEMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZO2dCQUN6QyxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksSUFBSSxLQUFLO2FBQ25DLENBQUMsQ0FBQztZQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2FBQ3pDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQVUsRUFBRSxhQUFtQixFQUFFLFlBQW1CO1FBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFekIsTUFBTSxZQUFZLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUM7UUFFM0UsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3hDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxhQUFhLEdBQUc7b0JBQ3BCLElBQUksRUFBRSxZQUFZO29CQUNsQixPQUFPLEVBQUUsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPO29CQUN6QyxJQUFJO2lCQUNMLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZELElBQUksT0FBTyxHQUFHO29CQUNaLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDbEIsU0FBUyxFQUFFLEVBQUU7b0JBQ2IsU0FBUyxFQUFFLEVBQUU7b0JBQ2IsVUFBVSxFQUFFLFVBQVU7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3RELFNBQVMsRUFBRSxFQUFFO29CQUNiLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU87b0JBQzNDLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUk7aUJBQ3pDLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7b0JBQ2hGLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7d0JBQ3JCLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO3dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDckUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQzt3QkFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBRXhDLGdFQUFnRTt3QkFDaEUscUVBQXFFO3dCQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLDZCQUE2QixFQUFFLENBQUM7d0JBRW5ELHdEQUF3RDt3QkFDeEQsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFOzRCQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN0QyxDQUFDLENBQUMsQ0FBQzt3QkFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO3FCQUMxQjt5QkFBTTt3QkFDTCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUM5RSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUMxQyxDQUFDO3dCQUNGLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTt3QkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3ZELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTt3QkFDNUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7d0JBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDbEY7b0JBQ0QsVUFBVSxDQUFDLEdBQUUsRUFBRTt3QkFDYixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO29CQUN0QyxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ1IsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBQztnQkFDdEcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUM5RSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUMxQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQVksRUFBRSxlQUF5QjtRQUN2RCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ3BHLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDek4sSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLFdBQVcsdUJBQXVCLENBQUMsQ0FBQztZQUM3RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxJQUFJLEdBQVEsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7b0JBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO29CQUMvRSxLQUFLLEVBQUUsVUFBVTtvQkFDakIsaUJBQWlCLEVBQUUsV0FBVztvQkFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtvQkFDNUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3JELEtBQUssRUFBRSxFQUFFO29CQUNULFdBQVcsRUFBRSxFQUFFO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztvQkFDakQsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNoRCxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZO29CQUM1QyxJQUFJLEVBQUUsSUFBSTtvQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksS0FBSztvQkFDckMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCLENBQUMsQ0FBQztnQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDekM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksV0FBVztvQkFDbEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksd0JBQXdCO29CQUM3QyxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWE7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDbkMsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxJQUFJO2lCQUNuQixDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztnQkFDeEUsMERBQTBEO2dCQUMxRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxJQUFJLGNBQWMsR0FBTyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFNLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO3dCQUN0RixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDdkM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsb0NBQW9DO2dCQUNwQyxJQUFJLElBQUksR0FBUSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDOUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO29CQUMxRCxLQUFLLEVBQUUsVUFBVTtvQkFDakIsaUJBQWlCLEVBQUUsV0FBVztvQkFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtvQkFDNUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3JELEtBQUssRUFBRSxFQUFFO29CQUNULFdBQVcsRUFBRSxFQUFFO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFFekIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7Z0JBQ3hDLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO29CQUN2RCxhQUFhLEVBQUUsY0FBYztvQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTtvQkFDM0MsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUk7b0JBQ1YsVUFBVSxFQUFFLElBQUk7aUJBQ2pCLENBQUMsQ0FBQztnQkFFSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDekM7Z0JBRUQsZ0VBQWdFO2dCQUNoRSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksV0FBVztvQkFDbEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksd0JBQXdCO29CQUM3QyxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWE7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDbkMsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxLQUFLO2lCQUNwQixDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7YUFDaEM7U0FDRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxlQUF5QjtRQUNqRSxJQUFJO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNoTixJQUFJLGFBQWEsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLE1BQU0sdUJBQXVCLENBQUMsQ0FBQztnQkFDeEQsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELElBQUksTUFBTSxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsOEJBQThCLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQ2hELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUE7WUFDdEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXhDLHlDQUF5QztZQUN6QyxNQUFNLFFBQVEsR0FBRztnQkFDZixJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVM7Z0JBQ3hCLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLHdCQUF3QjtnQkFDL0MsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtnQkFDbEMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3BDLENBQUM7WUFFRixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLElBQUksYUFBYSxHQUFRLEVBQUUsQ0FBQTtnQkFDM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDbkksSUFBSSxRQUFRLEVBQUU7b0JBQ1osYUFBYSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQ25MLENBQUE7aUJBQ0Y7Z0JBRUQsSUFBSSxhQUFhLEVBQUUsRUFBRSxFQUFFO29CQUNyQixJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQzt3QkFDdkQsYUFBYSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQzt3QkFDbEMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZO3dCQUN6QyxJQUFJLEVBQUUsSUFBSTt3QkFDVixJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksSUFBSSxLQUFLO3FCQUNuQyxDQUFDLENBQUM7b0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7cUJBQ3pDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDbkM7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO2FBQy9CO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWEsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ3JELHFDQUFxQztRQUNyQyxJQUFJLG1CQUFtQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUc7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxlQUFlO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2dCQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2FBQ3ZDLENBQUM7WUFFRixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNwQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBb0I7UUFDcEMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQzNCLHFEQUFxRDtZQUNyRCxJQUFJLFNBQVMsR0FBUSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6RSxNQUFNLEdBQUcsR0FBUSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9HLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQ3JCLE9BQU8sR0FBRyxFQUFFLFFBQVEsQ0FBQTthQUNyQjtpQkFBTTtnQkFDTCxPQUFPLFlBQVksQ0FBQTthQUNwQjtTQUNGO2FBQU07WUFDTCxPQUFPLFlBQVksQ0FBQTtTQUNwQjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQWM7UUFDbEMsSUFBSTtZQUNGLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsQ0FBQywrQ0FBK0M7WUFDM0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDckMsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxDQUFDLGtFQUFrRTtTQUNoRjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsT0FBZTtRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsR0FBRyxFQUFFLE9BQU87WUFDWixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7UUFDRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsWUFBb0I7UUFDM0MsVUFBVSxDQUFDLEdBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQy9ELElBQUksRUFBRSxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7b0JBQ3ZCLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxZQUFZLElBQUksR0FBRyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7b0JBQ2pFLDhCQUE4QjtvQkFDOUIsa0NBQWtDO29CQUNsQyx1Q0FBdUM7b0JBQ3ZDLFlBQVk7b0JBQ1osSUFBSTtvQkFDSixpREFBaUQ7b0JBQ2pELHlDQUF5QztvQkFDekMsbURBQW1EO29CQUNuRCwrQ0FBK0M7b0JBRS9DLGVBQWU7b0JBQ2YsY0FBYztvQkFDZCwwQ0FBMEM7b0JBQzFDLG9DQUFvQztvQkFDcEMsU0FBUztvQkFDVCxPQUFPO29CQUNQLEtBQUs7b0JBRUwsaURBQWlEO29CQUNqRCw2REFBNkQ7b0JBQzdELHNCQUFzQjtnQkFDeEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO2dCQUNwQyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ1IsQ0FBQztJQUVDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBYSxFQUFFLGdCQUEwQjtRQUN2RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFNLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsRUFBRSxZQUFZLElBQUksUUFBUSxFQUFFLFlBQVksRUFBRTtnQkFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDN0IsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDbkwsQ0FBQTtnQkFDRCxJQUFJLGVBQWUsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUN2RCxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO3dCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7d0JBQzNDLElBQUksRUFBRSxLQUFLO3dCQUNYLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQ3JDLENBQUMsQ0FBQztvQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO3dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtxQkFDekM7b0JBQ0Qsb0NBQW9DO29CQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUM5QixJQUFJLENBQUMsa0NBQWtDLEdBQUcsUUFBUSxFQUFFLFlBQVksQ0FBQTtvQkFDaEUsbURBQW1EO2lCQUNwRDthQUNGO2lCQUFNO2dCQUNMLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQ25MLENBQUE7Z0JBQ0QsSUFBSSxlQUFlLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRTtvQkFDbkQsSUFBSSxRQUFRLEdBQVEsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUM7d0JBQ3ZELGFBQWEsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7d0JBQ3BDLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWTt3QkFDM0MsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLElBQUksS0FBSztxQkFDckMsQ0FBQyxDQUFDO29CQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7d0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO3FCQUN6QztvQkFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUM5QixvQ0FBb0M7aUJBQ3JDO2FBQ0Y7WUFDRCxJQUFJLENBQUMsRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUU7Z0JBQ3RGLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO29CQUN2RCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzFDLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtvQkFDNUIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSztpQkFDdkIsQ0FBQyxDQUFDO2dCQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2lCQUN6QztnQkFDRCxvQ0FBb0M7YUFDckM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELGVBQWUsQ0FBQyxRQUFhO1FBQzNCLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUIsbURBQW1EO1FBQ25ELElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUN6RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUM5QyxPQUFPLENBQUMsQ0FBQyxDQUNQLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxHQUFHO2dCQUNwQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRztnQkFDaEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEdBQUc7Z0JBQ3BDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHO2dCQUN4QyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssR0FBRztnQkFDMUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUc7Z0JBQ3hDLElBQUksQ0FBQyxHQUFHO2dCQUNSLElBQUksQ0FBQyxRQUFRO2dCQUNiLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztTQUNIO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVE7UUFDbkIsSUFBSTtZQUNGLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtnQkFDbkUsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO29CQUNkLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzVEO3FCQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtvQkFDckIsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsSUFBSSxLQUFLLENBQUMsZ0NBQWdDLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzlEO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzVCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUNELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSTtZQUNGLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN2QztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBQ0QsY0FBYztRQUNaLElBQUksR0FBRyxDQUFDO1FBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN2QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUM3QyxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQztRQUUvRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM5RyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUM3RixRQUFRLENBQUMsRUFBRTtZQUNULElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxtREFBbUQ7UUFDckQsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsU0FBaUI7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFFMUIsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xELE1BQU0sRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVsRCxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1lBQ3hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBUSxvQ0FBb0M7U0FDaEY7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxPQUFPLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELGNBQWMsQ0FBQyxVQUFrQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyw0QkFBNEI7UUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsdUJBQXVCO1FBQ2xELElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDeEMsV0FBVyxJQUFJLFlBQVksQ0FBQztZQUM1QixJQUFJO2dCQUNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQXdCLENBQUM7Z0JBQy9HLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ3hELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxhQUFhLEVBQUU7d0JBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7d0JBQ2xELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ3hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt5QkFDdkI7d0JBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUMzQjt5QkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFO3dCQUMxQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzFCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7cUJBQ3RCO2lCQUNGO2FBQ0Y7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDM0I7WUFDRCxJQUFJLFdBQVcsSUFBSSxPQUFPLEVBQUU7Z0JBQzFCLDJEQUEyRDtnQkFDM0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsYUFBYTtJQUNiLDREQUE0RDtJQUM1RCwyQkFBMkI7SUFDM0Isa0RBQWtEO0lBQ2xELG9CQUFvQjtJQUNwQiwwREFBMEQ7SUFDMUQsVUFBVTtJQUNWLE1BQU07SUFDTixJQUFJO0lBQ0osd0JBQXdCLENBQUMsSUFBUztRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLDhCQUE4QjtJQUM5QiwrQ0FBK0M7SUFDL0MsMkNBQTJDO0lBQzNDLDBCQUEwQjtJQUMxQixRQUFRO0lBQ1IsOENBQThDO0lBQzlDLDZCQUE2QjtJQUM3QiwwQ0FBMEM7SUFDMUMsMEJBQTBCO0lBQzFCLFFBQVE7SUFDUixRQUFRO0lBQ1IscUJBQXFCO0lBQ3JCLElBQUk7SUFFSixhQUFhLENBQUMsSUFBUztRQUNyQixJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRTtZQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQixxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IsZ0ZBQWdGO0lBQ2hGLE1BQU07SUFDTixtRkFBbUY7SUFDbkYsdUJBQXVCO0lBQ3ZCLE9BQU87SUFDUCxJQUFJO0lBRUosWUFBWTtRQUNWLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIscUNBQXFDO1lBQ3JDLDBDQUEwQztZQUMxQyxxS0FBcUs7WUFDckssc0JBQXNCO1lBQ3RCLCtCQUErQjtZQUMvQixhQUFhO1lBQ2IsZ0NBQWdDO1lBQ2hDLE1BQU07WUFDTixNQUFNO1lBQ04sT0FBTztTQUNSO1FBQ0QsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBVSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUMvQixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUN4QyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3BDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzNDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ2pFLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNoRCxDQUFDLENBQUMsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxTQUFTLEVBQUU7b0JBQ2IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztvQkFDL0IsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ2pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTs0QkFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDakQsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7eUJBQU07d0JBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEI7aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNuQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNoRyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDZCxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNMLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxlQUFlO1FBQ2IsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBZ0IsQ0FBQztRQUNwRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFTO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQTtZQUNyTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUNwRjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUU7WUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ3BILElBQUksZUFBZSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzttQkFDekgsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3JKLElBQUksZUFBZSxFQUFFLEVBQUUsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTthQUNoQztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNqQztJQUVILENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFhO1FBQ3hCLElBQUksT0FBTyxHQUFHO1lBQ1osUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDdEQsU0FBUyxFQUFFLEVBQUU7WUFDYixTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsT0FBTztZQUN0RSxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVksSUFBSSxJQUFJO1NBQzdDLENBQUE7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtZQUNoRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxXQUFnQjtRQUMzQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1SSxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQVc7UUFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUM5QyxPQUFPLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFLLE1BQU0sSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsRUFBRSxTQUFTLElBQUksV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsU0FBUyxJQUFJLEVBQUUsSUFBSSxXQUFXLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDbEksQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFXO1FBQ2hCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDOUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSyxNQUFNLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtJQUNuQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUUsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QztJQUNILENBQUM7O21IQTEvRFUscUJBQXFCO3VHQUFyQixxQkFBcUIscXFCQzNCbEMsdThzQ0E2bUJNOzRGRGxsQk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjsyT0FLcEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFrQkcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FsbCwgRGV2aWNlIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9leHRlbnNpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi8uLi8uLi9rZXlwYWQnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pbmNvbWVpbmctY2FsbC1zb2NrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2lwLWFkZHJlc3Muc2VydmljZSc7XHJcbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XHJcbiAgY2FsbFNpZDogc3RyaW5nO1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2FsbFN0YXR1c1Jlc3BvbnNlIHtcclxuICBjYWxsRGV0YWlsczogQ2FsbERldGFpbHM7XHJcbiAgcmVzcG9uc2U6IHN0cmluZztcclxuICBlcnJvclR5cGU6IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbn1cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FsbC1wcm9ncmVzcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgY2FsbERhdGE6IGFueTtcclxuICBASW5wdXQoKSBzZWxlY3RlZENhbGxlcklkOiBhbnk7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7IC8vXHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhbGxlcklkTGlzdDogYW55ID0gW107XHJcbiAgQElucHV0KCkgbmV3Q2FsbENvbmZlcmVuY2U6IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIG1pc3NDYWxsSW5mbzogYW55ID0ge307XHJcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcclxuICBASW5wdXQoKSBjYWxsQWN0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgY29uZmVyZW5jZUNhbGxJbmZvOiBhbnk7XHJcbiAgdXNlcklkOiBhbnk7XHJcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxzTmV3SW5mbzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsvL1xyXG4gIEBPdXRwdXQoKSBtaW5pbWlzZUV2ZW50OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgZGV2aWNlPzogRGV2aWNlO1xyXG4gIGNhbGwhOiBDYWxsIHwgYW55O1xyXG4gIHNob3dSaW5nQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXI6IHN0cmluZyA9ICcwMDowMCc7XHJcbiAgaW50ZXJ2YWxJZDogYW55O1xyXG4gIHNob3dLZXlwYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XHJcbiAgY2FsbElucHV0OiBzdHJpbmcgPSAnJztcclxuICBpc011dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwZW5kaW5nTXV0ZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlOyBcclxuICBpbnRlbmRlZE11dGVTdGF0ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG4gIGRpc2JhbGVFbmRDYWxsQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93Q2xlYXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NvbGxvcHMgPSBmYWxzZTtcclxuICBjdXJyZW50Q2FsbDogYW55O1xyXG4gIGlzQ29uZmVyZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzT3V0Z29pbmdDYWxsOiBib29sZWFuID0gdHJ1ZTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGlzTG9hZGVyc2hvd246IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgZW5kSW5jb21pbmdDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLy8gUmVjb3JkaW5nIHZhcmlhYmxlc1xyXG4gIGNhbGxTaWQ6IGFueTtcclxuICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUGF1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgdGltZUVsYXBzZWQgPSAwOyAvLyBpbiBzZWNvbmRzXHJcbiAgcmVjb3JkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluY29taW5nQ2FsbFNpZDogYW55O1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZyA9ICdyaW5naW5nJzsgICAgLy9cclxuICBpbmNvbWluZ1JlY29yZENhbGw/OiBhbnk7XHJcbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGw6IGFueTtcclxuICBzaG93Q29udGFjdHNQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQWRkUmVtb3ZlUGFydGljaXBhbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAvL1xyXG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7ICAgLy9cclxuICBoZWxkQ2FsbD86IENhbGw7ICAvL1xyXG4gIGlzQ2FsbE9uSG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xyXG4gIGN1cnJlbnRDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBjb25mZXJlbmNlSWQ6IGFueTtcclxuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcclxuICBpc0NsaWNrRXhwYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDYWxsSW5Qcm9ncmVzcyE6IGJvb2xlYW47XHJcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XHJcbiAgaXNDb25mZXJlbmNlQ2FsbEhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFVzZXJJbmZvOiBhbnk7XHJcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuICBmaWx0ZXJlZExpc3Q6IGFueSA9IFtdO1xyXG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgc2hvd0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUmluZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRGlyZWN0Q2FsbE9wdGlvblNob3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaWFsQWxlcnQgPSB7XHJcbiAgICBtc2c6ICcnLFxyXG4gICAgc2hvdzogZmFsc2VcclxuICB9XHJcbiAgbGVmdFBhcnRpY2lwZW50OiBhbnkgPSB7fTtcclxuICBjb25mZXJlbmNlQ2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDb25uZWN0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaG9zdG51bWJlcjogYW55O1xyXG4gIGlzTmV3QWRkZWRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGV2aWNlTnVtYmVyTGlzdDogYW55ID0gW107XHJcbiAgb3VyTnVtYmVySW5mbzogYW55ID0ge307XHJcbiAgY3VycmVudENvbmZlcmVuY2VDYWxsOiBhbnkgPSB7fTtcclxuICBpc1JlYXNvbkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0FsbEFjY2VwdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGVhdmVSZWFzb246IHN0cmluZyA9ICcnO1xyXG4gIC8vIDI0LWhvdXIgdGltZSBwaWNrZXJcclxuICBsZWF2ZUhvdXI6IHN0cmluZyA9ICcnO1xyXG4gIGxlYXZlTWludXRlOiBzdHJpbmcgPSAnJztcclxuICBob3Vyczogc3RyaW5nW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpO1xyXG4gIG1pbnV0ZXM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNjAgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKTtcclxuICBzaG93SG91ckRyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd01pbnV0ZURyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRDb25mOiBhbnk7XHJcbiAgc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwZW5kaW5nQ2FsbERhdGE6IGFueSA9IG51bGw7XHJcbiAgY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgc2hvdzogZmFsc2UsXHJcbiAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICBudW1iZXI6ICcnLFxyXG4gICAgZGlzcGxheU51bTogJydcclxuICB9O1xyXG4gIGlzVW5ob2xkQ29uZmVyZW5jZUNhbGw6IGFueTsgIC8vXHJcbiAgY29uZmVyZW5jZUNhbGxOdWxsQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgYWxsQ29uUGFydGljaXBlbnRMaXN0OiBhbnkgPSB7fTtcclxuICBjb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0OiBhbnk7XHJcbiAgcHJpdmF0ZSBhY2NlcHRlZENhbGxMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGlzSG9sZEJ0bkRpc2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBDMkNvbmZvTGlzdDogYW55ID0ge307XHJcbiAgcHJpdmF0ZSBsYXN0QWN0aXZlQ29uZmVyZW5jZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBlbmRpbmdBdXRvVW5ob2xkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRDb25mTmFtZTogYW55O1xyXG4gIHBlbmRpbmdNdXRlUGFydGljaXBhbnRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuICBpbnRlbmRlZE11dGVTdGF0ZXM6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIHR3aWxpb1NlcnZpY2U6IFR3aWxpb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGlwU2VydmljZTogSXBBZGRyZXNzU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2U6IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGluY29taW5nIGNhbGxzIGZyb20gVHdpbGlvU2VydmljZVxyXG4gICAgIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCkge1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBpbmNvbWluZyBjYWxsczonLCBlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICBcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnVzZXJJZCkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10pIHtcclxuICAgICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5pc0luY29taW5nQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAuLi5jaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICAgIGlkOiAnMTI1JyxcclxuICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgIHBob25lOiBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8ucGhvbmUsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiAnMTIxJyxcclxuICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoIHx8IGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LnByZXZpb3VzVmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZU51bWJlckxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IGkgPT0gMCA/IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0uY29uZmVyZW5jZUlkIDogdGhpcy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICBsZXQgb3VyTnVtYmVySW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nTXV0ZVVwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTXV0ZSA9ICFvdXJOdW1iZXJJbmZvPy5pc0hvbGQgPyBvdXJOdW1iZXJJbmZvPy5pc011dGUgOiB0aGlzLmlzTXV0ZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAob3VyTnVtYmVySW5mbz8uaXNNdXRlID09PSB0aGlzLmludGVuZGVkTXV0ZVN0YXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNdXRlID0gb3VyTnVtYmVySW5mbz8uaXNNdXRlO1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdNdXRlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGUgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy90aGlzLmlzTXV0ZSA9ICFvdXJOdW1iZXJJbmZvPy5pc0hvbGQgPyBvdXJOdW1iZXJJbmZvPy5pc011dGUgOiB0aGlzLmlzTXV0ZTtcclxuICAgICAgICAgIGxldCBjdXJyZW50Y2FsbFBhcnRpY2lwYW50TGlzdElEID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXMpPT4gcmVzLmNvbmZlcmVuY2VJZCA9PSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLmNvbmZlcmVuY2VJZCkubWFwKChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgbGV0IHVwZGF0ZWRMaXN0ID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGNvbmY6IGFueSkgPT4gY29uZi5jb25mZXJlbmNlSWQgPT09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuZmxhdE1hcCgoY29uZjogYW55KSA9PiBjb25mLnBhcnRpY2lwYW50cy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCkpO1xyXG4gICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5wYXJ0aWNpcGFudHMubWFwKChyZXM6YW55KSA9PiByZXMuaWQpO1xyXG4gICAgICAgICAgY3VycmVudGNhbGxQYXJ0aWNpcGFudExpc3RJRC5mb3JFYWNoKChwYXJ0aWNpcGFudElkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZighdXBkYXRlZExpc3QuaW5jbHVkZXMocGFydGljaXBhbnRJZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzSW5mbzphbnkpID0+IHJlc0luZm8/LnBhcnRpY2lwYW50SWQgIT09IHBhcnRpY2lwYW50SWQgfHwgKHJlc0luZm8/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0luZm8/LmlzQWNjZXB0Q2FsbCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVkUGFydGljaXBhbnRMaXN0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0/LnBhcnRpY2lwYW50cyk7XHJcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZvckVhY2goYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcz8uaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0bnVtYmVyID0gcmVzO1xyXG4gICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgaWYob3VyTnVtYmVySW5mbz8uaXNDb25mZXJlbmNlIHx8ICh0aGlzLmhvc3RudW1iZXI/LmlzQ29uZmVyZW5jZSAmJiB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCA9PSByZXM/LmNvbmZlcmVuY2VJZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGFjdDogYW55ID0ge31cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhY3RzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZCgocmVzRGF0YSkgPT5cclxuICAgICAgICAgICAgICAgICAgICByZXNEYXRhPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyID09IChyZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8pXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbT8uaWQgPT0gcmVzPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiAhcmVzLmlzTGVmdCAmJiByZXM/LnN0YXR1cyAhPSAnbm8tYW5zd2VyJyAmJiByZXM/LnN0YXR1cyAhPSAnY2FuY2VsZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tTmFtZTogdGhpcy5nZXROYW1lKHJlcz8uZnJvbSkgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWc6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCA+IDEgPyBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTm90aWZpY2F0aW9uOiBjYWxsSW5mbz8uX2lzTm90aWZpY2F0aW9uICYmICF0aGlzLmdldFN0YXR1cyhyZXMpICYmIHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogcmVzPy5pc0NvbmZlcmVuY2UgfHwgdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdGhpcy5nZXRTdGF0dXMocmVzKSA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcz8uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlcz8ubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnRpbWVyIHx8IHRoaXMudGltZXIgPT0gJzAwOjAwJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIob3VyTnVtYmVySW5mbz8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSAmJiAocmVzPy5pc0xlZnQgfHwgcmVzPy5zdGF0dXMgPT0gJ25vLWFuc3dlcicgfHwgcmVzPy5zdGF0dXMgPT0gJ2NhbmNlbGVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdPy5pZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZClcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHRoaXMuY3VycmVudENhbGw/LmpvaW5lZEF0KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSAmJiAhcmVzPy5pc0xlZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydGljaXBhbnRJZCA9IHJlcy5pZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSBtdXRlIHVwZGF0ZSBpcyBwZW5kaW5nIGZvciB0aGlzIHBhcnRpY2lwYW50XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNdXRlUGVuZGluZyA9IHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuaGFzKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVuZGVkTXV0ZSA9IHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmdldChwYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImlzIG11dGUgcGVuZGluZyA9PlwiLCBpc011dGVQZW5kaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImludGVuZGVkIG11dGUgPT5cIiwgaW50ZW5kZWRNdXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkTXV0ZTogYm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNdXRlUGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZlciBhbHJlYWR5IGNvbmZpcm1lZCBvdXIgY2hhbmdlLCBhY2NlcHQgaXQgYW5kIGNsZWFyIHBlbmRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuaXNNdXRlID09PSBpbnRlbmRlZE11dGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE11dGUgPSByZXMuaXNNdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmRlbGV0ZShwYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBrZWVwIHRoZSBjdXJyZW50IGxvY2FsIHZhbHVlIChpZ25vcmUgdGhlIHN0YWxlIHNlcnZlciBzdGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE11dGUgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0uaXNNdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBObyBwZW5kaW5nIG11dGUg4oCTIHRydXN0IHRoZSBzZXJ2ZXIgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRNdXRlID0gcmVzLmlzTXV0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbU5hbWU6IHRoaXMuZ2V0TmFtZShyZXM/LmZyb20pIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPiAxID8gb3VyTnVtYmVySW5mbz8uaXNIb2xkIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc05vdGlmaWNhdGlvbjogY2FsbEluZm8/Ll9pc05vdGlmaWNhdGlvbiAmJiAhdGhpcy5nZXRTdGF0dXMocmVzKSAmJiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTXV0ZTogdXBkYXRlZE11dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UgPyByZXMuaXNDb25mZXJlbmNlIDogdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvTmFtZTogIHRoaXMuZ2V0TmFtZShyZXM/LnRvKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBpbWc6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LnRvSW1hZ2UgOiByZXM/LmZyb21JbWFnZSB8fCBjb250YWN0Py5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPiAxID8gb3VyTnVtYmVySW5mbz8uaXNIb2xkIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IGNhbGxJbmZvPy5faXNOb3RpZmljYXRpb24gJiYgIXRoaXMuZ2V0U3RhdHVzKHJlcykgJiYgcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiByZXM/LmlzTXV0ZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UgPyByZXMuaXNDb25mZXJlbmNlIDogdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNBY2NlcHRDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdGhpcy5nZXRTdGF0dXMocmVzKSA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlcz8ubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IHRoaXMuZ2V0VGltZURpZmZlcmVuY2UocmVzPy5qb2luZWRBdCB8fCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpLFxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy50aW1lciA9ICcwMDowMCc7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcihyZXM/LmpvaW5lZEF0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCA9IDA7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50ID4gNSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDYWxsIGVuZCBpbiAyOTknKVxyXG4gICAgICAgICAgICB0aGlzLmlzUmluZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuaXNVbmhvbGRDb25mZXJlbmNlQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0ge31cclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAvLyBSZW1vdmUgcGFydGljaXBhbnQgZGF0YSBmb3IgY29uZmVyZW5jZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBhY3RpdmUgbGlzdFxyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNvbmZlcmVuY2VJZHMgPSBuZXcgU2V0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uY29uZmVyZW5jZUlkKSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb25mSWQgb2YgT2JqZWN0LmtleXModGhpcy5hbGxDb25QYXJ0aWNpcGVudExpc3QpKSB7XHJcbiAgICAgICAgICBpZiAoIWFjdGl2ZUNvbmZlcmVuY2VJZHMuaGFzKGNvbmZJZCkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0W2NvbmZJZF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB2YWxpZFZhbHVlcyA9IG5ldyBTZXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mbGF0TWFwKChpdGVtOiBhbnkpID0+IGl0ZW0/LnBhcnRpY2lwYW50cy5tYXAoKHZhbDogYW55KSA9PiB2YWw/LmlkKSkpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IHZhbGlkVmFsdWVzLmhhcyhpdGVtPy5wYXJ0aWNpcGFudElkKSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDYWxsOmFueSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiBpdGVtPy5wYXJ0aWNpcGFudHM/LmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHBhcnRpY2lwYW50Py5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSkgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQgJiYgIXBhcnRpY2lwYW50Py5pc0hvbGQpIHtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2FsbC5wdXNoKHBhcnRpY2lwYW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHBhcnRpY2lwYW50Py5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSkgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQgJiYgIXBhcnRpY2lwYW50Py5pc0hvbGRcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gRGV0ZWN0IGRpc2Nvbm5lY3QgdnMuIGhvbGQgdHJhbnNpdGlvbiBleGFjdGx5IG9uY2UgcGVyIGV2ZW50LlxyXG4gICAgICAgIC8vIFNhbWUgcGFydGljaXBhbnQgZmlsdGVyIGFzIGdldEN1cnJlbnRDYWxsSW5mbygpICh3aXRob3V0ICFpc0hvbGQpIHRvIHN0YXkgY29uc2lzdGVudC5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsICYmICFjdXJyZW50Q2FsbFswXT8uaXNIb2xkKSB7XHJcbiAgICAgICAgICB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQgPSB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbC5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdBdXRvVW5ob2xkID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQgJiYgIXRoaXMucGVuZGluZ0F1dG9VbmhvbGQpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RDb25mID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjOiBhbnkpID0+IGMuY29uZmVyZW5jZUlkID09IHRoaXMubGFzdEFjdGl2ZUNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICBjb25zdCBvdXJQYXJ0aWNpcGFudEluTGFzdENvbmYgPSBsYXN0Q29uZj8ucGFydGljaXBhbnRzPy5maW5kKChwOiBhbnkpID0+XHJcbiAgICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHA/LmZyb20pICYmIHA/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcD8uY2xpZW50KSB8fFxyXG4gICAgICAgICAgICAgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwPy50bykgJiYgcD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiBwPy5jbGllbnQpKSAmJiAhcD8uaXNMZWZ0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgLy8gQ29uZmVyZW5jZSBnb25lIE9SIG91ciBwYXJ0aWNpcGFudCBub3QgaGVsZCDihpIgdGhlIGFjdGl2ZSBjYWxsIGRpc2Nvbm5lY3RlZCDihpIgcXVldWUgYXV0by11bmhvbGRcclxuICAgICAgICAgIGlmICghbGFzdENvbmYgfHwgIW91clBhcnRpY2lwYW50SW5MYXN0Q29uZj8uaXNIb2xkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0F1dG9VbmhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cy5sZW5ndGggPT0gMiAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCkge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHsuLi50aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gIXJlcz8uaXNDb25mZXJlbmNlSG9sZCAmJiAoKHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlcz8uZnJvbSkpIHx8IChyZXM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcmVzPy5jbGllbnQgJiYgIXRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXM/LnRvKSkgfHwgIXJlcz8uY2xpZW50KSl9O1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbFsnaXNBY2NlcHRDYWxsJ109IHRydWU7XHJcbiAgICAgICAgICBpZih0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF1cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbFsnaXNBY2NlcHRDYWxsJ109IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzPy5sZW5ndGggPiAyICYmIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMV0/LmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiAhcmVzPy5pc0NvbmZlcmVuY2VIb2xkKTtcclxuICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cz8ubGVuZ3RoID09IDEgJiYgdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1swXT8uaWQpe1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGNhbGxJbmZvOmFueSk9PiBjYWxsSW5mbz8uaWQgPT0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1swXT8uaWQpO1xyXG4gICAgICAgICAgaWYodGhpcy5jdXJyZW50Q2FsbD8uY2xpZW50ICYmIHRoaXMuY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHRoaXMuY3VycmVudENhbGw/LmZyb20pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxbJ2NsaWVudCddPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbFsnaXNBY2NlcHRDYWxsJ109IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmKCF0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJnRoaXMuY3VycmVudENhbGwgJiYgdGhpcy5jdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5pZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwgJiYgIXRoaXMuaXNOZXdBZGRlZENhbGwpIHtcclxuICAgICAgICAgIGxldCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgICAgIGlmICghY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWQgJiYgdGhpcy5wZW5kaW5nQXV0b1VuaG9sZCkge1xyXG4gICAgICAgICAgICAvLyBTZWFyY2ggQUxMIGNvbmZlcmVuY2VzIGV4Y2VwdCB0aGUgb25lIHRoYXQganVzdCBkaXNjb25uZWN0ZWQuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgYSBzaW5nbGUtY29uZmVyZW5jZSBob2xkIChpbmNsdWRpbmcgYnJpZWYgaXNMZWZ0IHJhY2UgY29uZGl0aW9ucylcclxuICAgICAgICAgICAgLy8gZnJvbSBldmVyIHRyaWdnZXJpbmcgYW4gdW5ob2xkIOKAlCB3ZSBvbmx5IHVuaG9sZCBhIERJRkZFUkVOVCBoZWxkIGNvbmZlcmVuY2UuXHJcbiAgICAgICAgICAgIGxldCBob2xkQ2FsbEluZm86IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZiBvZiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbmYuY29uZmVyZW5jZUlkID09IHRoaXMubGFzdEFjdGl2ZUNvbmZlcmVuY2VJZCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgaG9sZENhbGxJbmZvID0gY29uZi5wYXJ0aWNpcGFudHMuZmluZCgoY2FsbEluZm86IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoY2FsbEluZm8/LmZyb20pICYmIGNhbGxJbmZvPy5jbGllbnQpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGNhbGxJbmZvPy50bykgJiYgY2FsbEluZm8/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhY2FsbEluZm8/LmlzTGVmdCAmJiBjYWxsSW5mbz8uaXNIb2xkKTtcclxuICAgICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvKSBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvPy5pZCAmJiAhdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2hvbGRDYWxsSW5mbz8uaWRdLFxyXG4gICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBob2xkQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbXV0ZTogaG9sZENhbGxJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDM4NycsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBob2xkQ2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdBdXRvVW5ob2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICBsZXQgc2VsZWN0ZWRVc2VyID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSB0aGlzLnNlbGVjdGVkVXNlckluZm8/LnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkVXNlcikge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFVzZXIuSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZihzZWxlY3RlZFVzZXIuYnVzaW5lc3NOdW1iZXIgPT0gdHJ1ZSAmJiAhc2VsZWN0ZWRVc2VyLnVzZXJJbmZvSWQpIHtcclxuICAgICAgICAgICAgICBpZighdGhpcy5DMkNvbmZvTGlzdFtzZWxlY3RlZFVzZXIucGFydGljaXBhbnRJZF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oc2VsZWN0ZWRVc2VyLnBhcnRpY2lwYW50SWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgIG5leHQ6IChyZXNJbmZvOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0/LnBhcnRpY2lwYW50SWQgPT0gc2VsZWN0ZWRVc2VyPy5pZCkgXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XSA9IHRoaXMubWFwVXNlckluZm8odGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdLCByZXNJbmZvPy5jMmNJbmZvcm1hdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5DMkNvbmZvTGlzdFtzZWxlY3RlZFVzZXIucGFydGljaXBhbnRJZF0gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF07XHJcbiAgICAgICAgICAgICAgICB9LCBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyB1c2VyIGluZm86JywgZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLkMyQ29uZm9MaXN0W3NlbGVjdGVkVXNlci5wYXJ0aWNpcGFudElkXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gc2VsZWN0ZWRVc2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaW5jb21pbmdDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtPy5idXNpbmVzc051bWJlcik7XHJcbiAgICAgICAgICAgIGlmIChpbmNvbWluZ0NhbGw/LnBhcnRpY2lwYW50SWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBpbmNvbWluZ0NhbGw7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDbGlja0V4cGFuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0ge307XHJcbiAgICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHJlc0luZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+ICEhaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xyXG4gICAgICAgICAgaWYgKHJlc0luZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdLklzVXNlckluZm9TaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5pc0FsbEFjY2VwdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZXZlcnkoKGNhbGw6IGFueSkgPT4gY2FsbD8uaXNBY2NlcHRDYWxsKVxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUxpc3QgPSBbXHJcbiAgICAgICAgICAuLi5uZXcgTWFwKHRoaXMuY3VycmVudENhbGxMaXN0Lm1hcChpdGVtID0+IFtpdGVtLmNvbmZlcmVuY2VJZCwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0ID0gdW5pcXVlTGlzdC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VOYW1lOiBgQ29uZmVyZW5jZSAke2luZGV4ICsgMX1gXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxOdWxsQ291bnQgPSAwO1xyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgaWYodGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCA+IDUpe1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCc0MTEnKVxyXG4gICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKHRoaXMuY2FsbCkge1xyXG4gICAgICAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0ge31cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSaW5naW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxOdWxsQ291bnQgKz0xO1xyXG4gICAgICAgIC8vIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydjYWxsQWN0aW9uJ10/LmN1cnJlbnRWYWx1ZSAmJiB0aGlzLmNhbGxBY3Rpb24/LnR5cGUgPT0gJ3JlSm9pbicpIHtcclxuICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgIGxldCBkYXRhID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmNvbmZlcmVuY2VJZCA9PSB0aGlzLmNhbGxBY3Rpb24/LmNvbmZlcmVuY2VJZCk/LnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+IHJlc0RhdGE/Lmhvc3QpO1xyXG4gICAgICBpZihkYXRhPy5pc0xlZnQgfHwgIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMucmVqb2luSG9zdCh0aGlzLmNhbGxBY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snbmV3Q2FsbENvbmZlcmVuY2UnXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuQ2FsbFRvVW5zYXZlZE51bWJlcih0aGlzLm5ld0NhbGxDb25mZXJlbmNlPy5udW1iZXIsIHRydWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWpvaW5Ib3N0KGNhbGxJbmZvOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2N1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMzg3JywgaG9sZEluZm8pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlam9pblBhcnRpY2lwZW50SW5mbyA9IGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAvLyAx77iP4oOjIEdldCBuZXcgdG9rZW4gZm9yIHNhbWUgY29uZmVyZW5jZVxyXG4gICAgICBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgIC8vIDLvuI/ig6MgUmVjb25uZWN0IGRldmljZVxyXG4gICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgICAgY29kZWNQcmVmZXJlbmNlczogWydvcHVzJywgJ3BjbXUnXSxcclxuICAgICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0b2tlbkRhdGEudG9rZW4udmFsdWUsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy5kZXZpY2UuY29ubmVjdCh7XHJcbiAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICBGcm9tOiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZnJvbSxcclxuICAgICAgICAgIFRvOiByZWpvaW5QYXJ0aWNpcGVudEluZm8udG8sXHJcbiAgICAgICAgICBFbnY6IGVudmlyb25tZW50LmFiYixcclxuICAgICAgICAgIFRva2VuOiB0b2tlbkRhdGEudG9rZW4uaWQsXHJcbiAgICAgICAgICBFeHQ6IHJlam9pblBhcnRpY2lwZW50SW5mby5leHROdW0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlam9pblBhcnRpY2lwZW50SW5mbz8uY29uZmVyZW5jZUlkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBydGNDb25zdHJhaW50czogeyBhdWRpbzogeyBkZXZpY2VJZDogJ2RlZmF1bHQnIH0gfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbCA9IHRoaXMuY2FsbDtcclxuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGFkZENsaWVudFBhcnRpY2lwYW50UmVzID0gdGhpcy5hZGRDbGllbnRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgZnJvbTogcmVqb2luUGFydGljaXBlbnRJbmZvLmZyb20sXHJcbiAgICAgICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcmVqb2luUGFydGljaXBlbnRJbmZvPy50byxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlam9pblBhcnRpY2lwZW50SW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgY2xpZW50U2lkOiB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0NhbGxTaWQnXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhZGRDbGllbnRQYXJ0aWNpcGFudDonLCBlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdSZWpvaW4gZmFpbGVkJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwVXNlckluZm8ocGFydGljaXBhbnRJbmZvOiBhbnksIGNhbGxlckluZm86IGFueSkge1xyXG4gICAgcGFydGljaXBhbnRJbmZvWydlbWFpbCddID0gY2FsbGVySW5mby5lbWFpbDtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWyduYW1lJ10gPSBjYWxsZXJJbmZvLm5hbWU7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snaW1hZ2UnXSA9IGNhbGxlckluZm8uaW1hZ2U7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snZXh0ZW5zaW9uJ10gPSBjYWxsZXJJbmZvLmV4dGVuc2lvbjtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWyd1c2VySW5mb0lkJ10gPSBjYWxsZXJJbmZvLmlkO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ21lc3NhZ2UnXSA9IGNhbGxlckluZm8ubWVzc2FnZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvIFsnbm90ZSddID0gY2FsbGVySW5mby5ub3RlO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ251bWJlciddID0gY2FsbGVySW5mby5udW1iZXI7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1sncG9pbnROYW1lJ10gPSBjYWxsZXJJbmZvLnBvaW50TmFtZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzb2Z0cGhvbmVUd2lsaW9BdXRoSWQnXSA9IGNhbGxlckluZm8uc29mdHBob25lVHdpbGlvQXV0aElkO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ3NvdXJjZU5hbWUnXSA9IGNhbGxlckluZm8uc291cmNlTmFtZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzdWJqZWN0J10gPSBjYWxsZXJJbmZvLnN1YmplY3Q7XHJcbiAgICAgIHJldHVybiB7Li4ucGFydGljaXBhbnRJbmZvfTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZWRQYXJ0aWNpcGFudExpc3QocGFydGljaXBhbnQ6YW55KSB7XHJcbiAgICBpZihwYXJ0aWNpcGFudD8ubGVuZ3RoKXtcclxuICAgICAgdGhpcy5hbGxDb25QYXJ0aWNpcGVudExpc3RbcGFydGljaXBhbnRbMF0/LmNvbmZlcmVuY2VJZF0gPSBwYXJ0aWNpcGFudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFtwYXJ0aWNpcGFudFswXT8uY29uZmVyZW5jZUlkXTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCAmJiAhIXRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0Py5bdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0XT8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucGFydGljaXBhbnRMaXN0SW5kbyh0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFt0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3RdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgIHRoaXMucGFydGljaXBhbnRMaXN0SW5kbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcGFydGljaXBhbnRMaXN0SW5kbyhwYXJ0aWNpcGFudHM/OiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKFwicGFydGljaXBhbnRMaXN0SW5kb1wiKVxyXG4gICAgaWYgKCFwYXJ0aWNpcGFudHM/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBwYXJ0aWNpcGFudHMubWFwKGFzeW5jIChwOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBmcm9tTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLmZyb20pO1xyXG4gICAgICAgIGNvbnN0IHRvTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLnRvKTtcclxuICAgICAgICByZXR1cm4geyAuLi5wLCBmcm9tTmFtZTogZnJvbU5hbWUgfHwgcC5mcm9tTmFtZSwgdG9OYW1lOiB0b05hbWUgfHwgcC50b05hbWUgfTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gQnVpbGQgYSBsb29rdXAgbWFwIGZyb20gdGhlIGN1cnJlbnQgcmVuZGVyZWQgbGlzdCBzbyB3ZSBjYW4gcmV1c2UgdGhlIHNhbWVcclxuICAgIC8vIG9iamVjdCByZWZlcmVuY2UgZm9yIHBhcnRpY2lwYW50cyB3aG9zZSBkYXRhIGhhc24ndCBjaGFuZ2VkLlxyXG4gICAgLy8gQW5ndWxhcidzICpuZ0ZvciB1c2VzIG9iamVjdCBpZGVudGl0eSAoPT09KSB0byBkZWNpZGUgd2hldGhlciB0byByZS1yZW5kZXIgYSByb3c7XHJcbiAgICAvLyBrZWVwaW5nIHRoZSBzYW1lIHJlZmVyZW5jZSBwcmV2ZW50cyBET00gZGVzdHJ1Y3Rpb24vcmVjcmVhdGlvbiBhbmQgZWxpbWluYXRlcyBmbGlja2VyaW5nLlxyXG4gICAgY29uc3QgZXhpc3RpbmdNYXAgPSBuZXcgTWFwPGFueSwgYW55PihcclxuICAgICAgKHRoaXMuYWxsUGFydGljaXBlbnRMaXN0IHx8IFtdKS5tYXAoKHA6IGFueSkgPT4gW3AuaWQsIHBdKVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgYW55Q2hhbmdlID0gcmVzb2x2ZWQubGVuZ3RoICE9PSAodGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q/Lmxlbmd0aCB8fCAwKTtcclxuXHJcbiAgICBjb25zdCBtZXJnZWQ6IGFueVtdID0gcmVzb2x2ZWQubWFwKChuZXdQOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBleGlzdGluZ01hcC5nZXQobmV3UC5pZCk7XHJcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcclxuICAgICAgICBhbnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBuZXdQO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBpc011dGVQZW5kaW5nID0gdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5oYXMobmV3UC5pZCk7XHJcbiAgICAgIGNvbnN0IGludGVuZGVkTXV0ZSA9IHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmdldChuZXdQLmlkKTtcclxuICAgICAgaWYgKGlzTXV0ZVBlbmRpbmcgJiYgaW50ZW5kZWRNdXRlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAobmV3UC5pc011dGUgPT09IGludGVuZGVkTXV0ZSkge1xyXG4gICAgICAgICAgdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5kZWxldGUobmV3UC5pZCk7XHJcbiAgICAgICAgICB0aGlzLmludGVuZGVkTXV0ZVN0YXRlcy5kZWxldGUobmV3UC5pZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld1AgPSB7IC4uLm5ld1AsIGlzTXV0ZTogZXhpc3RpbmcuaXNNdXRlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjaGFuZ2VkID0gT2JqZWN0LmtleXMobmV3UCkuc29tZShrID0+IGV4aXN0aW5nW2tdICE9PSBuZXdQW2tdKTtcclxuICAgICAgaWYgKGNoYW5nZWQpIHtcclxuICAgICAgICBhbnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB7IC4uLmV4aXN0aW5nLCAuLi5uZXdQIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGFueUNoYW5nZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29uZk5hbWUgPSB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0KT8uY29uZmVyZW5jZU5hbWUgfHwgJyc7XHJcbiAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gbWVyZ2VkO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gWy4uLm1lcmdlZF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93Q2FsbGluZ1RvYXN0KG51bWJlcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdCA9IHtcclxuICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgICBudW1iZXI6IG51bWJlcixcclxuICAgICAgZGlzcGxheU51bTogbnVtYmVyXHJcbiAgICB9O1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCA3MDAwKTtcclxuICB9XHJcbiAgZ2V0U3RhdHVzKHJlczogYW55KSB7XHJcbiAgICBpZiAocmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcclxuICAgICAgcmV0dXJuIHJlcz8uY2FsbFN0YXR1cyA9PSBcInBhcnRpY2lwYW50LWpvaW5cIiB8fCByZXM/LmNhbGxTdGF0dXMgPT0gXCJwYXJ0aWNpcGFudC1tdXRlXCIgfHwgcmVzPy5jYWxsU3RhdHVzID09IFwicGFydGljaXBhbnQtaG9sZFwiIHx8IHJlcz8uY2FsbFN0YXR1cyA9PSAnY29ubmVjdGVkJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChyZXMuc3RhdHVzID09ICdhbnN3ZXJlZCcgJiYgcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgR2V0Q29udGFjdHNMaXN0KCkge1xyXG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfHwgJyc7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucmVhZENvbnRhY3RzKHRva2VuKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnBob25lQm9vaykge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IHJlcy5waG9uZUJvb2s7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHJlcy5waG9uZUJvb2s7XHJcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXM7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHJlcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY29udGFjdHM6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuY29udGFjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBhZGRSZXM6IGFueTtcclxuICBhc3luYyBzdGFydENhbGwoY2FsbERhdGE6IGFueSwgaXNOZXdDb25mZXJlbmNlPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICBjaGFubmVsSWQ6IGVudmlyb25tZW50LmNoYW5uZWxJZCxcclxuICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgICB0bzogY2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgZnJvbU51bWJlcjogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBzY29wZTogJ2xvY2FsJyxcclxuICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICBmaXJzdG5hbWU6IG51bGwsXHJcbiAgICAgICAgbGFzdG5hbWU6IG51bGwsXHJcbiAgICAgICAgY291bnRyeWNvZGU6IG51bGwsXHJcbiAgICAgICAgbnVtYmVyOiBudWxsLFxyXG4gICAgICAgIG51bW90cDogbnVsbCxcclxuICAgICAgICBleHRlbnNpb246IG51bGwsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgYnVzaW5lc3NOdW1iZXI6IGZhbHNlLFxyXG4gICAgICAgIGNhbGxTaWQ6ICcnLFxyXG4gICAgICAgIGNhbGxTdGF0dXM6ICcnLFxyXG4gICAgICAgIGNvbmZlcmVuY2VJZDogJycsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBkaXJlY3Rpb246ICdvdXRnb2luZy1jYWxsJyxcclxuICAgICAgICBmb3J3YXJkZWRUbzogJycsXHJcbiAgICAgICAgZnJvbTogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBpZDogJ3l5dWdnaGpiJyxcclxuICAgICAgICBpbWc6IGNhbGxEYXRhLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2UsXHJcbiAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgIGpvaW5lZEF0OiAnJyxcclxuICAgICAgICBuYW1lOiBjYWxsRGF0YT8ubmFtZSB8fCAnJyxcclxuICAgICAgICBwYXJ0aWNpcGFudElkOiAnJyxcclxuICAgICAgICBwaG9uZTogY2FsbERhdGE/LnBob25lIHx8ICcnLFxyXG4gICAgICAgIHJvbGU6ICdjYWxsZWUnLFxyXG4gICAgICAgIHN0YXR1czogJycsXHJcbiAgICAgICAgdGltZTogJycsXHJcbiAgICAgICAgdG86IGNhbGxEYXRhPy5waG9uZSB8fCAnJyxcclxuICAgICAgICB0b05hbWU6IGNhbGxEYXRhPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgY2FsbERhdGE/LnVzZXJJZFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmluaXRpYXRlQ2FsbChwYXlsb2FkKTtcclxuICAgICAgdGhpcy5jb25mZXJlbmNlSWQgPSByZXNwb25zZT8uY2FsbGF1dGg/LmlkO1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIGNvbnN0IHsgaWQ6IGNhbGxBdXRoSWQsIHJlY29yZENhbGwsICB0b2tlbkRhdGF9ID0gYXdhaXQgdGhpcy5nZXRDYWxsQXV0aElkKHJlc3BvbnNlKTtcclxuICAgICAgICB0aGlzLnJlY29yZENhbGwgPSByZWNvcmRDYWxsOyAvLyBTdG9yZSB0aGUgcmVjb3JkQ2FsbCB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvRGV2aWNlKGNhbGxBdXRoSWQsIGNhbGxEYXRhLCB0b2tlbkRhdGEpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucG9sbENhbGxTdGF0dXMoY2FsbEF1dGhJZCk7XHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMgPSB0aGlzLmFkZENsaWVudFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBmcm9tOiBjYWxsRGF0YT8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXNwb25zZT8uY2FsbGF1dGg/LmlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgY2xpZW50U2lkOiB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0NhbGxTaWQnXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZXMgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcclxuICAgICAgICAgICAgICBmcm9tOiBjYWxsRGF0YT8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXNwb25zZT8uY2FsbGF1dGg/LmlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0xvYWRlcnNob3cubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZXJzaG93bi5lbWl0KGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gcmVzcG9uc2U/LmNhbGxhdXRoPy5pZDtcclxuICAgICAgICAgICAgLy8gYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMocmVzcG9uc2U/LmNhbGxhdXRoPy5pZCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFkZGluZyBpbml0aWFsIHBhcnRpY2lwYW50OicsIGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDE1MDApXHJcbiAgICAgICAgLy8gUG9sbCB0aGUgc3RhdHVzIGZvciAzMC00NSBzZWNvbmRzXHJcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMSkge1xyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0xvYWRlcnNob3cubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRlcnNob3duLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaXNOZXdBZGRlZENhbGwgPSBmYWxzZTtcclxuICAgICAgICBzd2FsKFwiRXJyb3JcIiwgcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyLz5cIiksIFwiZXJyb3JcIik7XHJcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25NdXRlVXNlcihjOiBhbnkpIHtcclxuICAgIGNvbnN0IHBhcnRpY2lwYW50SWQgPSBjLmlkO1xyXG4gICAgY29uc3QgbmV3TXV0ZVN0YXRlID0gIWMuaXNNdXRlO1xyXG5cclxuICAgIFxyXG4gICAgdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5hZGQocGFydGljaXBhbnRJZCk7XHJcbiAgICB0aGlzLmludGVuZGVkTXV0ZVN0YXRlcy5zZXQocGFydGljaXBhbnRJZCwgbmV3TXV0ZVN0YXRlKTtcclxuXHJcbiAgICBjLmlzTXV0ZSA9IG5ld011dGVTdGF0ZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGNvbnNvbGUubG9nKGMuaXNNdXRlKVxyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudElkXSxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgIGhvbGQ6IGMuaXNIb2xkLFxyXG4gICAgICBtdXRlOiBuZXdNdXRlU3RhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIC8vcmVtb3ZlIHBlbmRpbmcgZ3VhcmQgYWZ0ZXIgNSBzZWNvbmRzIGlmIG5vIGNvbmZpcm1hdGlvblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmhhcyhwYXJ0aWNpcGFudElkKSkge1xyXG4gICAgICAgIHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmRlbGV0ZShwYXJ0aWNpcGFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkhvbGRDYWxsKGM6IGFueSkge1xyXG4gICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gdHJ1ZTtcclxuICAgIGlmKCgoYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiB0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoYz8uZnJvbSkpIHx8IChjPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy50bykpKSAmJiBjPy5jbGllbnQpIHtcclxuICAgICAgbGV0IHVuSG9sZEluZm86IGFueSA9IHt9O1xyXG4gICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goYXN5bmMgKGNhbGw6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjYWxsPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gY2FsbC5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBpZiAocGFydGljaXBhbnRJbmZvPy5pZCApIHtcclxuICAgICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHBhcnRpY2lwYW50SW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgIGhvbGQ6ICFwYXJ0aWNpcGFudEluZm8/LmlzSG9sZCxcclxuICAgICAgICAgICAgICBtdXRlOiBwYXJ0aWNpcGFudEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyA3ODgnLCBob2xkSW5mbylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB1bkhvbGRJbmZvID0gY2FsbC5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcmVzRGF0YT8uY2xpZW50KSkgJiYgIXJlc0RhdGE/LmlzTGVmdCAmJiByZXNEYXRhPy5pc0hvbGQgIT09IGM/LmlzSG9sZFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmICh1bkhvbGRJbmZvPy5pZCAmJiB1bkhvbGRJbmZvPy5pc0hvbGQgIT0gYz8uaXNIb2xkKSB7XHJcbiAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW3VuSG9sZEluZm8/LmlkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdW5Ib2xkSW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogIXVuSG9sZEluZm8/LmlzSG9sZCxcclxuICAgICAgICAgIG11dGU6IHVuSG9sZEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gODA1JywgaG9sZEluZm8pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgaG9sZEluZm86IGFueSA9IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgcGFydGljaXBhbnRJZDogW2MuaWRdLFxyXG4gICAgICAgIGNvbmZlcmVuY2VJZDogYz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgIGhvbGQ6ICFjLmlzSG9sZCxcclxuICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDgxOScsIGhvbGRJbmZvKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICBjLmlzSG9sZCA9ICFjLmlzSG9sZDtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IGM/LmNvbmZlcmVuY2VJZDtcclxuICAgIC8vIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGM/LmNvbmZlcmVuY2VJZCk7XHJcbiAgfVxyXG4gIGFzeW5jIG9uRW5kQ2FsbChjOiBhbnksIGlzQWxsQ2FsbEVuZD86IGJvb2xlYW4sIGlzQ29udGVjdD86IGJvb2xlYW4pIHtcclxuICAgIGxldCBwYXJ0aWNpcGFudElkID0gaXNBbGxDYWxsRW5kID8gJ2FsbCcgOiBjLnBhcnRpY2lwYW50SWQgfHwgYz8uaWQ7XHJcbiAgICBjb25zdCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgIGNvbnN0IHBhcnRpY2lwYW50TGlzdCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoY2FsbEluZm86YW55KSA9PiBjYWxsSW5mbz8uY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkucGFydGljaXBhbnRzLmZpbHRlcigocmVzRGF0YTogYW55KSA9PiAhcmVzRGF0YT8uaXNMZWZ0KTtcclxuICAgIGlmKHBhcnRpY2lwYW50TGlzdD8ubGVuZ3RoID09IDIgJiYgIWlzQ29udGVjdCkge1xyXG4gICAgICBwYXJ0aWNpcGFudElkID0gJ2FsbCc7XHJcbiAgICB9XHJcbiAgICBsZXQgY29uZmVyZW5jZUlkID0gYy5jb25mZXJlbmNlSWQgfHwgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uY29uZmVyZW5jZUlkO1xyXG4gICAgbGV0IHJlczogYW55ID0gYXdhaXQgdGhpcy5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgY29uZmVyZW5jZUlkKTtcclxuICAgIGlmIChyZXM/LnN0YXR1cyA9PSAyMDEgJiYgcmVzPy5tZXNzYWdlID09ICdwYXJ0aWNpcGFudCBhbHJlYWR5IGxlZnQnKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhcnRpY2lwYW50IGFscmVhZHkgbGVmdCcsIHJlcyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSBpZiAocmVzPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlbW92aW5nIHBhcnRpY2lwYW50JywgcmVzKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gY29uZmVyZW5jZUlkO1xyXG4gICAgLy8gYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgIHRoaXMuZW5kSW5jb21pbmdDYWxsRXZlbnQuZW1pdChjKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0aWF0ZUNhbGwocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmluaXRpYXRlQ2FsbChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYWRkUGFydGljaXBhbnRUb0NhbGwocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmFkZFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRDbGllbnRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYWRkQ2xpZW50UGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5vbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSwgY29uZmVyZW5jZUlkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldENhbGxBdXRoSWQocmVzcG9uc2U6IGFueSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHJlc3BvbnNlLmNhbGxhdXRoLmlkLFxyXG4gICAgICByZWNvcmRDYWxsOiByZXNwb25zZS5jYWxsYXV0aC5yZWNvcmRDYWxsLFxyXG4gICAgICB0b2tlbkRhdGE6IHJlc3BvbnNlLmNhbGxhdXRoLnRva2VuXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsQXV0aElkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q29uZmVyZW5jZUNhbGxUb2tlbih7IGF1dGhJZDogY2FsbEF1dGhJZCB9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvRGV2aWNlKHRva2VuOiBhbnksIGNhbGxEYXRhOiBhbnksIHRva2VuRGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXHJcbiAgICAgIGNsb3NlUHJvdGVjdGlvbjogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YSwgb3B0aW9ucyk7XHJcbiAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgRnJvbTogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBUbzogY2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgRW52OiBlbnZpcm9ubWVudC5hYmIsXHJcbiAgICAgICAgVG9rZW46IHRva2VuLFxyXG4gICAgICAgIEV4dDogY2FsbERhdGEuZXh0TnVtXHJcbiAgICAgIH0sXHJcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB0cnVlIH0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xyXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XHJcbiAgICB0aGlzLnN0YXJ0VGltZXIoKTtcclxuICAgIHRoaXMuZGV2aWNlPy5vbignZXJyb3InLCAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignZGlzY29ubmVjdCcsIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3QtZGlzY29ubmVjdCcpXHJcbiAgICAgIGNvbnNvbGUubG9nKCc4MzInKVxyXG4gICAgICAvLyBDbGVhbiB1cCB0aGlzIGNhbGwgZnJvbSBhY2NlcHRlZENhbGxMaXN0cyBzbyBkZXZpY2UgcmUtaW5pdCBndWFyZCByZXNldHNcclxuICAgICAgY29uc3QgZGlzY29ubmVjdGVkU2lkID0gdGhpcy5jYWxsPy5wYXJhbWV0ZXJzPy5DYWxsU2lkO1xyXG4gICAgICBpZiAoZGlzY29ubmVjdGVkU2lkKSB7XHJcbiAgICAgICAgdGhpcy5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihjID0+IGMuY2FsbFNpZCAhPT0gZGlzY29ubmVjdGVkU2lkKTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgIChjOiBhbnkpID0+IGMucGFyYW1ldGVycz8uQ2FsbFNpZCAhPT0gZGlzY29ubmVjdGVkU2lkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLmNhbGw/LmRpc2Nvbm5lY3QoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ3JpbmdpbmcnLCAoKSA9PiB7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdyZWplY3QnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0NScpXHJcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignYWNjZXB0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgb3V0Z29pbmcgY2FsbCBpcyBtYXJrZWQgYXMgYWNjZXB0ZWQgc28gdGhlIFVJIHN3aXRjaGVzIHRvIHRoZSBjb25uZWN0ZWQgdmlld1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jYWxsPy5vbignbWVzc2FnZVJlY2VpdmVkJywgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0VGltZXIoam9pbkF0Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWpvaW5BdCkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBqb2luVGltZSA9IG5ldyBEYXRlKGpvaW5BdCkuZ2V0VGltZSgpIHx8IDA7XHJcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoKG5vdyAtIGpvaW5UaW1lKSAvIDEwMDApO1xyXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XHJcbiAgICAgIHNlY29uZHMgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBzZWNvbmRzKys7XHJcbiAgICAgIHRoaXMudGltZXIgPSB0aGlzLmZvcm1hdFRpbWUoc2Vjb25kcyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wVGltZXIoKSB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XHJcbiAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0VGltZSh0b3RhbFNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xyXG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0b3RhbFNlY29uZHMgJSAzNjAwKSAvIDYwKTtcclxuICBjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7XHJcbiAgaWYgKGhvdXJzID4gMCkge1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFkKGhvdXJzKX06JHt0aGlzLnBhZChtaW51dGVzKX06JHt0aGlzLnBhZChzZWNvbmRzKX1gO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5wYWQobWludXRlcyl9OiR7dGhpcy5wYWQoc2Vjb25kcyl9YDtcclxuICB9XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBwYWQodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcclxuICB9XHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICBzd2FsKFwiRXJyb3JcIiwgZXJyb3IsIFwiZXJyb3JcIik7XHJcbiAgfVxyXG5cclxuICBlbmRDb25mZXJlbmVjZUNhbGwoY29uZj86IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmYgPSBjb25mO1xyXG4gICAgLy8gdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gdHJ1ZTtcclxuICAgIGxldCBjb25mZXJlbmNlID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8uZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGNvbmY/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICBsZXQgaG9zdE51bWJlciA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gcGFydGljaXBhbnQ/Lmhvc3QpO1xyXG4gICAgaWYgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhob3N0TnVtYmVyPy5mcm9tKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGhvc3ROdW1iZXI/LnRvKSAmJiBob3N0TnVtYmVyPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIGhvc3ROdW1iZXI/Lmhvc3QpKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25mWydjb25OYW1lJ10gPSB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gY29uZj8uY29uZmVyZW5jZUlkKT8uY29uZmVyZW5jZU5hbWUgfHwgJyc7XHJcbiAgICAgIHRoaXMub25DYWxsRGlzY29ubmVjdGVkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoY29uZj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgICAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdClcclxuICAgICAgICBpZiAocGFydGljaXBlbnRJbmZvPy5pZCkge1xyXG4gICAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGlzQWxsQ2FsbEVuZCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh7fSwgaXNBbGxDYWxsRW5kKTtcclxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coODk2KVxyXG4gICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgdG9nZ2xlTXV0ZShpc0NvbmZlcmVuY2U/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzTXV0ZSA9ICF0aGlzLmlzTXV0ZTtcclxuICAgIHRoaXMucGVuZGluZ011dGVVcGRhdGUgPSB0cnVlOyBcclxuICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGUgPSB0aGlzLmlzTXV0ZTtcclxuICAgIHRoaXMuY2FsbD8ubXV0ZSh0aGlzLmlzTXV0ZSk7XHJcbiAgICBjb25zdCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgIHRoaXMub25NdXRlUGFydGljaXBhbnQoe1xyXG4gICAgICBwYXJ0aWNpcGFudElkOiBbY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5wYXJ0aWNpcGFudElkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkXSxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgIGhvbGQ6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8uaXNIb2xkLFxyXG4gICAgICBtdXRlOiAhY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaXNNdXRlXHJcbiAgICAgIC8vIGNvbmZlcmVuY2U6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgdGhpcy5jdXJyZW50Q2FsbC5pc011dGUgPSB0aGlzLmlzTXV0ZTtcclxuICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRDYWxsSW5mbygpIHtcclxuICAgIHJldHVybiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0XHJcbiAgICAgIC5mbGF0TWFwKChjYWxsSW5mbzogYW55KSA9PiBjYWxsSW5mby5wYXJ0aWNpcGFudHMpXHJcbiAgICAgIC5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudClcclxuICAgICAgICB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkKTtcclxuICB9XHJcbiAgdG9nZ2xlS2V5cGFkKCkge1xyXG4gICAgdGhpcy5zaG93S2V5cGFkID0gIXRoaXMuc2hvd0tleXBhZDtcclxuICAgIHRoaXMuY2FsbElucHV0ID0gJyc7XHJcbiAgfVxyXG4gIHRvZ2dsZUNvbnRhY3RzUGFuZWwoY2FsbEluZm8/OiBhbnksIGlzQ2xvc2U/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChpc0Nsb3NlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9ICFpc0Nsb3NlO1xyXG4gICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25mTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKHJlc0RhdGE6YW55KT0+IHJlc0RhdGE/LmNvbmZlcmVuY2VJZCA9PT0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk/LmNvbmZlcmVuY2VOYW1lIHx8ICcnO1xyXG4gICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMoY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRSZW1vdmVQYXJ0aWNpcGFudCgpIHtcclxuICAgIHRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudCA9ICF0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQ7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgfVxyXG5cclxuICBhc3luYyB3YWl0aW5nQ2FsbEFjY2VwdChpbmNvbWluZ0NhbGxJbmZvOmFueSkge1xyXG4gICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICBsZXQgY2FsbEluZm8gPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGNhbGxJbmZvOiBhbnksIGk6IG51bWJlcikgPT4gdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8uY29uZmVyZW5jZUlkKVxyXG4gICAgaWYgKGNhbGxJbmZvKSB7XHJcbiAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgKVxyXG4gICAgfVxyXG4gICAgY29uc3QgY2FwdHVyZWRDYWxsID0gdGhpcy50d2lsaW9TZXJ2aWNlLmluY29taW5nQ2FsbERldGFpbDtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZvckVhY2goKGNhbGw6IGFueSkgPT4ge1xyXG4gICAgICBjYWxsLm11dGUodHJ1ZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChvdXJOdW1iZXJJbmZvPy5pZCAmJiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQgIT09IGluY29taW5nQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSB0cnVlO1xyXG4gICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICBjb25mZXJlbmNlSWQ6IG91ck51bWJlckluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMTA5MScsIGhvbGRJbmZvKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGQoaW5jb21pbmdDYWxsSW5mbywgb3VyTnVtYmVySW5mbywgY2FwdHVyZWRDYWxsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZChkYXRhPzogYW55LCBvdXJOdW1iZXJJbmZvPzogYW55LCBjYXB0dXJlZENhbGw/OiBDYWxsKSB7XHJcbiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQubmV4dChkYXRhPy5pZCk7XHJcbiAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgY29uc3QgY2FsbFRvQWNjZXB0ID0gY2FwdHVyZWRDYWxsIHx8IHRoaXMudHdpbGlvU2VydmljZS5pbmNvbWluZ0NhbGxEZXRhaWw7XHJcblxyXG4gICAgbGV0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMudHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwpIHtcclxuICAgICAgICBjYWxsVG9BY2NlcHQuYWNjZXB0KCk7XHJcbiAgICAgICAgY29uc3QgYWNjZXB0ZWRFbnRyeSA9IHtcclxuICAgICAgICAgIGNhbGw6IGNhbGxUb0FjY2VwdCxcclxuICAgICAgICAgIGNhbGxTaWQ6IGNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkLFxyXG4gICAgICAgICAgZGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hY2NlcHRlZENhbGxMaXN0LnB1c2goYWNjZXB0ZWRFbnRyeSk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QucHVzaChjYWxsVG9BY2NlcHQpO1xyXG4gICAgICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgICAgIGlwQ291bnRyeTogJycsXHJcbiAgICAgICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6ICB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICBjb21wYW55SWQ6ICcnLFxyXG4gICAgICAgICAgY2xpZW50U2lkOiBjYWxsVG9BY2NlcHQucGFyYW1ldGVycz8uQ2FsbFNpZCxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5pc0N1cnJlbnRJbmNvbWluZ0NhbGxMaXN0LnB1c2goZGF0YT8uaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNTaG93SW5jb21pbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0FjY2VwdElJbmNvbWluZ0NhbGwubmV4dChkYXRhPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQubmV4dCgnJyk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGRldmljZTIgc28gYW55IHN1YnNlcXVlbnQgaW5jb21pbmcgY2FsbCBhcnJpdmVzIG9uIGFcclxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgRGV2aWNlIGFuZCBjYW5ub3QgZGlzcGxhY2UgdGhpcyBjYWxsJ3MgV2ViUlRDIGNvbm5lY3Rpb24uXHJcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5wcmVwYXJlRGV2aWNlMkZvckluY29taW5nQ2FsbCgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZGV2aWNlMiB3aGVuIHRoaXMgYWNjZXB0ZWQgY2FsbCBkaXNjb25uZWN0cy5cclxuICAgICAgICAgICAgY2FsbFRvQWNjZXB0Lm9uKCdkaXNjb25uZWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5kZXN0cm95RGV2aWNlMigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZCA9IGNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkO1xyXG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKGMgPT4gYy5jYWxsU2lkICE9PSBzaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgICAgICAoYzogYW55KSA9PiBjLnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IHNpZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpXHJcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZC5uZXh0KCcnKTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IGRhdGEucGFydGljaXBhbnRJZClcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNTaG93SW5jb21pbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJzEwOTYnKVxyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2U/LmpvaW4/LihcIjxici8+XCIpIHx8ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgIH0sNTAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmKHRoaXMubWlzc0NhbGxJbmZvPy5kYXRhPy5kYXRhPy5yZWNvcmRJZCA9PSBkYXRhPy5pZCAmJiAhdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCl7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICBjb25zdCBzaWQgPSBjYWxsVG9BY2NlcHQucGFyYW1ldGVycz8uQ2FsbFNpZDtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKGMgPT4gYy5jYWxsU2lkICE9PSBzaWQpO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgKGM6IGFueSkgPT4gYy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBzaWRcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5kZXN0cm95RGV2aWNlMigpO1xyXG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCAnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgXCJlcnJvclwiKTtcclxuICAgICAgICB0aGlzLm1pc3NDYWxsSW5mbyA9IHt9O1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcbiAgYXN5bmMgY2FsbENvbnRhY3QoY29udGFjdDogYW55LCBpc1Vuc2F2ZWROdW1iZXI/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHBob25lTnVtYmVyID0gaXNVbnNhdmVkTnVtYmVyID8gY29udGFjdCA6IGNvbnRhY3Q/Lm51bWJlcnNMaXN0Py5bMF0/Lm51bWJlciB8fCBjb250YWN0Py5waG9uZTtcclxuICAgIGxldCBhbHJlYWR5SW5DYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IChyZXMudG8gPT0gcGhvbmVOdW1iZXIgJiYgcmVzPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSB8fCAocmVzLmZyb20gPT0gcGhvbmVOdW1iZXIgJiYgcmVzPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlcz8uaG9zdCkgJiYgIXJlcz8uaXNMZWZ0KTtcclxuICAgIGlmIChhbHJlYWR5SW5DYWxsKSB7XHJcbiAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtwaG9uZU51bWJlcn0gbnVtYmVyIGluIHRoaXMgY2FsbC5gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcclxuICAgICAgICAgIGZyb206IHRoaXMuY2FsbERhdGE/LmZyb20gPyB0aGlzLmNhbGxEYXRhPy5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2RhdGE/LnBhcnRpY2lwYW50SWQgfHwgZGF0YT8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiBudWxsLFxyXG4gICAgICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMTIxOCcsIGhvbGRJbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBuYW1lOiBjb250YWN0Py5uYW1lIHx8IGAke2NvbnRhY3Q/LmZpcnN0TmFtZX0gJHtjb250YWN0Py5sYXN0TmFtZX1gIHx8IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgIGZyb206IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTGVmdDogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudElEczphbnkgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SURzLnB1c2goYz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBwYXJ0aWNpcGFudCB0byB0aGUgY29uZmVyZW5jZVxyXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcclxuICAgICAgICAgIGZyb206IHRoaXMuY2FsbERhdGE/LmZyb20gfHwgdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICBwYXJ0aWNpcGFudElEcy5wdXNoKGRhdGE/LnBhcnRpY2lwYW50SWQpXHJcbiAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogcGFydGljaXBhbnRJRHMsXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgIG11dGU6IG51bGwsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyAxMjc3JywgaG9sZEluZm8pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIHBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFscmVhZHlJbkNhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gKChyZXMudG8gPT0gbnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykgfHwgKHJlcy5mcm9tID09IG51bWJlciAmJiByZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcmVzLmhvc3QpKSAmJiAhcmVzPy5pc0xlZnQpO1xyXG4gICAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtudW1iZXJ9IG51bWJlciBpbiB0aGlzIGNhbGwuYCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChudW1iZXIgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cclxuICAgICAgY29uc3QgY2FsbERhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogY29udGFjdD8uZmlyc3ROYW1lLFxyXG4gICAgICAgIGltZzogY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIHBob25lOiBudW1iZXIsXHJcbiAgICAgICAgZXh0TnVtOiAnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaXNOZXdDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICAgICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgICAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMTM1NScsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm9uQWRkTmV3Q2FsbChjYWxsRGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNhbGxEYXRhLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsQ29udGFjdChudW1iZXIsIHRydWUpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQWRkTmV3Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2VDYWxsID0gZmFsc2UpIHtcclxuICAgIC8vIHdhcm5pbmcgb25seSBmb3IgTkVXIFNFUEFSQVRFIENBTExcclxuICAgIGlmIChpc05ld0NvbmZlcmVuY2VDYWxsICYmIHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBjYWxsRGF0YTtcclxuICAgICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydENhbGwoY2FsbERhdGEsIGlzTmV3Q29uZmVyZW5jZUNhbGwpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlybU5ld0NhbGwoKSB7XHJcbiAgICB0aGlzLnNob3dDb25mZXJlbmNlV2FybmluZ01vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2FsbERhdGEpIHtcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICBzaG93OiB0cnVlLFxyXG4gICAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICAgIG51bWJlcjogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmUsXHJcbiAgICAgIGRpc3BsYXlOdW06IHRoaXMucGVuZGluZ0NhbGxEYXRhLnBob25lXHJcbiAgICB9O1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCA3MDAwKTtcclxuICAgICAgdGhpcy5zdGFydENhbGwodGhpcy5wZW5kaW5nQ2FsbERhdGEsIHRydWUpO1xyXG4gICAgICB0aGlzLnBlbmRpbmdDYWxsRGF0YSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxOZXdDYWxsKCkge1xyXG4gICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIGlmIChkaWFsZWROdW1iZXJbMF0gIT09ICcrJykge1xyXG4gICAgICAvLyB0aGlzIGlzIGNhc2Ugd2hlbiB1c2VyIGdlb2xvY2F0aW9uIGRpYWwgY29kZSBpcyBvblxyXG4gICAgICBsZXQgaXBBZGRyZXNzOiBhbnkgPSBhd2FpdCB0aGlzLmlwU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmdldFRvTnVtYmVyKGRpYWxlZE51bWJlciwgaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICByZXR1cm4gcmVzPy50b051bWJlclxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRpYWxlZE51bWJlclxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKG51bWJlcjogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAobnVtYmVyID09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbGlkTnVtYmVyUGF0dGVybiA9IC9eWytcXGRcXHMoKS1dKiQvOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdmFsaWQgY2hhcmFjdGVyc1xyXG4gICAgICBjb25zdCBwaG9uZU51bWJlciA9IG51bWJlcjtcclxuICAgICAgaWYgKCF2YWxpZE51bWJlclBhdHRlcm4udGVzdChwaG9uZU51bWJlcikpIHtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFsQWxlcnQgPSB7XHJcbiAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgc2hvdzogdHJ1ZVxyXG4gICAgfTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCAzMDAwKTtcclxuICB9XHJcblxyXG5hc3luYyBnZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZUlkOiBzdHJpbmcpIHtcclxuICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gcmVzPy5wYXJ0aWNpcGFudHMgfHwgcmVzPy5wYXJ0aWNpcGFudCB8fCBbXTtcclxuICAgICAgICAvLyBpZiAoIXBhcnRpY2lwYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgLy8gICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgLy8gICByZXR1cm47XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbnN0IHVwZGF0ZWRQYXJ0aWNpcGFudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAvLyAgIHBhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHA6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBmcm9tTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLmZyb20pO1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0b05hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC50byk7XHJcbiAgXHJcbiAgICAgICAgLy8gICAgIHJldHVybiB7XHJcbiAgICAgICAgLy8gICAgICAgLi4ucCxcclxuICAgICAgICAvLyAgICAgICBmcm9tTmFtZTogZnJvbU5hbWUgfHwgcC5mcm9tTmFtZSxcclxuICAgICAgICAvLyAgICAgICB0b05hbWU6IHRvTmFtZSB8fCBwLnRvTmFtZSxcclxuICAgICAgICAvLyAgICAgfTtcclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gKTtcclxuICBcclxuICAgICAgICAvLyB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IHVwZGF0ZWRQYXJ0aWNpcGFudHM7XHJcbiAgICAgICAgLy8gdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFsuLi51cGRhdGVkUGFydGljaXBhbnRzXTsgIFxyXG4gICAgICAgIC8vIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSw3MDApXHJcbn1cclxuXHJcbiAgYXN5bmMgc3dhcENhbGxzKGNhbGxJbmZvOiBhbnksIGlzQ29uZmVyZW5jZUNhbGw/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYz8uY29uZmVyZW5jZUlkID09IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudEluZm8gPSBjLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChwYXJ0aWNpcGFudEluZm8/LmlkKSB7XHJcbiAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG11dGU6IHBhcnRpY2lwYW50SW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyAxNTAyJywgaG9sZEluZm8pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZFxyXG4gICAgICAgICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMoY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudEluZm8gPSBjLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChwYXJ0aWNpcGFudEluZm8/LmlkICYmICFwYXJ0aWNpcGFudEluZm8/LmlzSG9sZCkge1xyXG4gICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IHBhcnRpY2lwYW50SW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyAxNTIxJywgaG9sZEluZm8pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoYz8uaXNDb25mZXJlbmNlICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkIHx8IGM/LmlkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyAxNTM1JywgaG9sZEluZm8pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgaGFzRGV0YWlsZWRJbmZvKGNhbGxEYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghY2FsbERhdGEpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIENoZWNrIGlmIHVzZXJJbmZvIGV4aXN0cyBhbmQgaGFzIG1lYW5pbmdmdWwgZGF0YVxyXG4gICAgaWYgKGNhbGxEYXRhLnVzZXJJbmZvICYmIGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBjYWxsRGF0YS51c2VySW5mby5jMmNJbmZvcm1hdGlvbjtcclxuICAgICAgcmV0dXJuICEhKFxyXG4gICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uZW1haWwgJiYgaW5mby5lbWFpbCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5tZXNzYWdlICYmIGluZm8ubWVzc2FnZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uc291cmNlTmFtZSAmJiBpbmZvLnNvdXJjZU5hbWUgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uZXh0ZW5zaW9uICYmIGluZm8uZXh0ZW5zaW9uICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnVybCB8fFxyXG4gICAgICAgIGluZm8ubGF0aXR1ZGUgfHxcclxuICAgICAgICBpbmZvLmxvbmdpdHVkZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25DYWxsSW5wdXRzKG51bTogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihudW0pIHx8IG51bSA9PSAnKycgfHwgbnVtID09ICcqJyB8fCBudW0gPT0gJyMnKSB7XHJcbiAgICAgICAgaWYgKG51bSA9PSAnIycpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1oYXNoLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gJyonKSB7XHJcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtc3Rhci0ubXAzYCkucGxheSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtJHtudW19LS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQgKyBTdHJpbmcobnVtKTtcclxuICAgICAgICB0aGlzLnNob3dDbGVhckJ0biA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHN0ciA9IFN0cmluZyhudW0pO1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoc3RyKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uQ2FsbElucHV0RW50ZXIoZXY6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jYWxsPy5zZW5kRGlnaXRzKFN0cmluZyhldi5rZXkpKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhcklucHV0cygpIHtcclxuICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQuc2xpY2UoMCwgLTEpO1xyXG4gIH1cclxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1pbmltaXNlRGlhbHBhZCgpIHtcclxuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgdGhpcy5pc01pbmltaXNlZCA9IHRydWU7XHJcbiAgfVxyXG4gIG1heGltaXNlRGlhbHBhZCgpIHtcclxuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGZhbHNlKTtcclxuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSBmYWxzZTtcclxuICB9XHJcbiAgdG9nZ2xlUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXJ0UmVjb3JkaW5nKCkge1xyXG4gICAgbGV0IHNpZDtcclxuICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xyXG4gICAgdGhpcy5pbmNvbWluZ0NhbGxTaWQgPSBkZXRhaWxzLmNhbGxTaWQ7XHJcbiAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGRldGFpbHMucmVjb3JkQ2FsbDtcclxuICAgIHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLmNhbGxTaWQgfHwgdGhpcy5hZGRSZXM/LmNvbmZlcmVuY2VTaWQ7XHJcblxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcoeyBcImNvbmZlcmVuY2VJZFwiOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgfSkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy50aW1lRWxhcHNlZCA9IDA7XHJcbiAgICAgIHRoaXMuc3RhcnRUaW1lcjEoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHBhdXNlUmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncGF1c2UnKS5zdWJzY3JpYmUoXHJcbiAgICAgIHJlc3BvbnNlID0+IHtcclxuICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmdUaW1lcigpO1xyXG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXVzaW5nIHJlY29yZGluZzonLCBlcnJvcik7XHJcbiAgICAgICAgLy8gQ29uc2lkZXIgdXBkYXRpbmcgdGhlIFVJIHRvIHNob3cgdGhlIGVycm9yIHN0YXRlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHJlc3VtZVJlY29yZGluZygpIHtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCwgJ3Jlc3VtZScpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZXN1bWluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0VGltZURpZmZlcmVuY2UoaW5wdXRUaW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFzdFRpbWUgPSBuZXcgRGF0ZShpbnB1dFRpbWUpLmdldFRpbWUoKTtcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgbGV0IGRpZmYgPSBNYXRoLmZsb29yKChjdXJyZW50VGltZSAtIHBhc3RUaW1lKSAvIDEwMDApOyAvLyB0b3RhbCBzZWNvbmRzXHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkaWZmIC8gNjApO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IGRpZmYgJSA2MDtcclxuXHJcbiAgICBjb25zdCBtbSA9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzO1xyXG4gICAgY29uc3Qgc3MgPSBzZWNvbmRzIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcztcclxuXHJcbiAgICByZXR1cm4gYCR7bW19OiR7c3N9YDtcclxuICB9XHJcbiAgc3RhcnRUaW1lcjEoKSB7XHJcbiAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwoMTAwMCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy50aW1lRWxhcHNlZCsrO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BSZWNvcmRpbmdUaW1lcigpIHtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgLy8gUGF1c2UgdGhlIHRpbWVyXHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7ICAgICAgICAvLyBPcHRpb25hbGx5IHJlc2V0IHRoZSBzdWJzY3JpcHRpb25cclxuICAgIH1cclxuICB9XHJcbiAgZ2V0Rm9ybWF0dGVkVGltZSgpIHtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMudGltZUVsYXBzZWQgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gdGhpcy50aW1lRWxhcHNlZCAlIDYwO1xyXG4gICAgcmV0dXJuIGAke21pbnV0ZXN9OiR7c2Vjb25kcyA8IDEwID8gJzAnIDogJyd9JHtzZWNvbmRzfWA7XHJcbiAgfVxyXG4gIHBvbGxDYWxsU3RhdHVzKGNhbGxBdXRoSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbWF4VGltZSA9IDMwMDAwOyAvLyBQb2xsIGZvciB1cCB0byAzMCBzZWNvbmRzXHJcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAzMDAwOyAvLyBQb2xsIGV2ZXJ5IDMgc2Vjb25kc1xyXG4gICAgbGV0IGVsYXBzZWRUaW1lID0gMDtcclxuICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGVsYXBzZWRUaW1lICs9IHBvbGxJbnRlcnZhbDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdGF0dXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU3RhdHVzKGNhbGxBdXRoSWQpLnRvUHJvbWlzZSgpIGFzIENhbGxTdGF0dXNSZXNwb25zZTtcclxuICAgICAgICBpZiAoc3RhdHVzUmVzcG9uc2UgJiYgc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMpIHtcclxuICAgICAgICAgIHRoaXMuY2FsbFN0YXR1cyA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTdGF0dXM7XHJcbiAgICAgICAgICBpZiAodGhpcy5jYWxsU3RhdHVzID09PSAnaW4tcHJvZ3Jlc3MnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFNpZCA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTaWQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZENhbGwgJiYgIXRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsU3RhdHVzID09PSAnY29tcGxldGVkJykge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVsYXBzZWRUaW1lID49IG1heFRpbWUpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnTWF4IHBvbGxpbmcgdGltZSByZWFjaGVkLiBTdG9wcGluZyBwb2xsLicpO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHBvbGxJbnRlcnZhbCk7XHJcbiAgfVxyXG5cclxuICAvLyBnZXRVc2VySW5mb3JtYXRpb24oaWQ6IGFueSkge1xyXG4gIC8vICAgaWYoaWQpIHtcclxuICAvLyAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oaWQpLnN1YnNjcmliZShcclxuICAvLyAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSwgJ3VzZXJJbmZvcm1hdGlvbicpO1xyXG4gIC8vICAgICB9LCBlcnJvciA9PiB7XHJcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICAvLyBnZXRIb2xkQ2FsbExpc3QoKSB7XHJcbiAgLy8gICBsZXQgaG9sZExpc3Q6IGFueVtdID0gW107XHJcbiAgLy8gICBsZXQgaXNDb25mZXJlbmNlID0gZmFsc2U7XHJcbiAgLy8gICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAvLyAgICAgaWYgKGM/LmlzSG9sZCAmJiAhYz8uaXNDb25mZXJlbmNlKSB7XHJcbiAgLy8gICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBpZiAoYz8uaXNDb25mZXJlbmNlICYmICFpc0NvbmZlcmVuY2UpIHtcclxuICAvLyAgICAgICBpc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gIC8vICAgICAgIGNbJ2lzQ29uZmVyZW5jZUNhbGxIb2xkJ10gPSB0cnVlO1xyXG4gIC8vICAgICAgIGhvbGRMaXN0LnB1c2goYyk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgcmV0dXJuIGhvbGRMaXN0O1xyXG4gIC8vIH1cclxuXHJcbiAgb25DbGlja0V4cGFuZChkYXRhOiBhbnkpIHtcclxuICAgIGlmIChkYXRhLmlkICE9IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xyXG4gICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gIXRoaXMuaXNDbGlja0V4cGFuZDtcclxuICAgICAgaWYgKHRoaXMuaXNDbGlja0V4cGFuZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc2V0SW5jb21pbmdDYWxsU3RhdHVzKGRhdGE6IGFueSkge1xyXG4gIC8vICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgLy8gICAgIHJlY29yZElkOiBkYXRhPy5pZCxcclxuICAvLyAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAvLyAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAvLyAgICAgY2FsbFN0YXR1czogJ2Fuc3dlcmVkJyxcclxuICAvLyAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgLy8gICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkIHx8IGRhdGEuY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxuXHJcbiAgdG9nZ2xlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5pc1NlYXJjaFZpc2libGUgPSAhdGhpcy5pc1NlYXJjaFZpc2libGU7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgIGlmICghdGhpcy5pc1NlYXJjaFZpc2libGUpIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcigpIHtcclxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnNlYXJjaFRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLmlzRGlyZWN0Q2FsbE9wdGlvblNob3cgPSAvXlxcKz9cXGQrJC8udGVzdCh0ZXh0KVxyXG4gICAgaWYgKHRleHQubGVuZ3RoIDwgMykge1xyXG4gICAgICAvLyB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICAgIC8vIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICAvLyAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoY2M6IGFueSkgPT4gIWNjPy5Jc0Nvbm5lY3RlZCAmJiAoY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIpKTtcclxuICAgICAgLy8gICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAvLyAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIC8vICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc051bWVyaWNTZWFyY2ggPSAvXlxcKz9cXGQrJC8udGVzdCh0ZXh0KTtcclxuICAgIGNvbnN0IGV4cGFuZGVkOiBhbnlbXSA9IFtdO1xyXG4gICAgdGhpcy5jb250YWN0cy5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGlzTnVtZXJpY1NlYXJjaCkge1xyXG4gICAgICAgIChjPy5udW1iZXJzTGlzdCB8fCBbXSkuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoKG4/Lm51bWJlciB8fCAnJykuaW5jbHVkZXModGV4dCkpIHtcclxuICAgICAgICAgICAgZXhwYW5kZWQucHVzaCh7IC4uLmMsIG51bWJlcnNMaXN0OiBbbl0gfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gKGM/LmZpcnN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fFxyXG4gICAgICAgICAgKGM/Lmxhc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubWlkZGxlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fFxyXG4gICAgICAgICAgKGM/Lm5pY2tOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpO1xyXG4gICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcclxuICAgICAgICAgIGNvbnN0IG51bWJlcnMgPSBjPy5udW1iZXJzTGlzdDtcclxuICAgICAgICAgIGlmIChudW1iZXJzICYmIG51bWJlcnMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBudW1iZXJzLmZvckVhY2goKG51bU9iajogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgZXhwYW5kZWQucHVzaCh7IC4uLmMsIG51bWJlcnNMaXN0OiBbbnVtT2JqXSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHBhbmRlZC5wdXNoKGMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IGV4cGFuZGVkO1xyXG4gICAgdGhpcy5maWx0ZXJlZExpc3QuZm9yRWFjaCgoYzogYW55KSA9PiB7XHJcbiAgICAgIGNbJ2Zyb21OYW1lJ10gPSB0aGlzLmdldE5hbWUoYy5mcm9tKSB8fCAnJztcclxuICAgICAgY1sndG9OYW1lJ10gPSB0aGlzLmdldE5hbWUoYy50bykgfHwgJyc7XHJcbiAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoY2M6IGFueSkgPT4gY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGNoZWNrVGV4dEhlaWdodCgpIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRleHQtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoZWw/LnNjcm9sbEhlaWdodCA+IGVsPy5jbGllbnRIZWlnaHQpIHtcclxuICAgICAgdGhpcy5zaG93QnV0dG9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgdG9nZ2xlVGV4dCgpIHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9ICF0aGlzLmlzRXhwYW5kZWQ7XHJcbiAgfVxyXG4gIHNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuICAvLyBDYWxsIHRoaXMgd2hlbiBjYWxsIGRpc2Nvbm5lY3RzXHJcbiAgb25DYWxsRGlzY29ubmVjdGVkKCkge1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGVuZENvbmZlcmVuY2UoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMuc2VsZWN0ZWRDb25mLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5kQ2FsbCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDb21iaW5lcyB0aGUgdHdvIDI0LWhvdXIgc2VsZWN0cyBpbnRvIGxlYXZlUmVhc29uIChISDpNTSkgKi9cclxuICBvblRpbWVDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5sZWF2ZUhvdXIgIT09ICcnICYmIHRoaXMubGVhdmVNaW51dGUgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMubGVhdmVSZWFzb24gPSBgJHt0aGlzLmxlYXZlSG91cn06JHt0aGlzLmxlYXZlTWludXRlfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIb3VyRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSAhdGhpcy5zaG93SG91ckRyb3Bkb3duO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1pbnV0ZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSAhdGhpcy5zaG93TWludXRlRHJvcGRvd247XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEhvdXIoaDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxlYXZlSG91ciA9IGg7XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMub25UaW1lQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RNaW51dGUobTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxlYXZlTWludXRlID0gbTtcclxuICAgIHRoaXMuc2hvd01pbnV0ZURyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB0aGlzLm9uVGltZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbGVhdmVDb25mZXJlbmNlKCkge1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5pc1JlYXNvbkNoZWNrZWQpIHtcclxuICAgICAgbGV0IHBheWxvYWQgPSB7IGNvbmZlcmVuY2VJZDogdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCB8fCB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCwgdGltZTogdGhpcy5jb252ZXJ0SEhNTVRvTWludXRlcyh0aGlzLmxlYXZlUmVhc29uKSwgdGltZXJEYXRlOiBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkgfVxyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0VGltZXJGb3JFbmRDb25mZXJlbmNlQ2FsbChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4geyB9KVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgbGV0IGNvbmZlcmVuY2UgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZClcclxuICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQpXHJcbiAgICAgIGlmIChwYXJ0aWNpcGVudEluZm8/LmlkKSB7XHJcbiAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmhvc3RudW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgY29udmVydEhITU1Ub01pbnV0ZXModGltZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcbiAgICByZXR1cm4gKGhvdXJzICogNjApICsgbWludXRlcztcclxuICB9XHJcblxyXG4gIG9uUmVqZWN0Q2FsbChjYWxsSW5mbzogYW55KSB7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmVjb3JkSWQ6IGNhbGxJbmZvPy5pZCxcclxuICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgY2FsbFN0YXR1czogJ25vJyxcclxuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgIHVzZXJJZDogIHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgY29tcGFueUlkOiAnJyxcclxuICAgICAgY2xpZW50U2lkOiB0aGlzLnR3aWxpb1NlcnZpY2U/LmluY29taW5nQ2FsbERldGFpbD8ucGFyYW1ldGVycz8uQ2FsbFNpZCxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjYWxsSW5mbz8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzOiBhbnkpID0+IHJlcz8uaWQgIT0gY2FsbEluZm8/LmlkKTtcclxuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pXHJcbiAgfVxyXG4gIFxyXG4gIGlzU2VsZk51bWJlcihwYXJ0aWNpcGFudDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXMgPT0gKHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gcGFydGljaXBhbnQ/LmZyb20gOiBwYXJ0aWNpcGFudD8udG8pKTtcclxuICB9XHJcblxyXG4gIGdldE5hbWUobnVtYmVyOiBhbnkpIHtcclxuICAgIGxldCBjb250YWN0SW5mbyA9IHRoaXMuY29udGFjdHMuZmluZCgoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb250YWN0SW5mbz8uZmlyc3ROYW1lIHx8IGNvbnRhY3RJbmZvPy5sYXN0TmFtZSA/IGAke2NvbnRhY3RJbmZvPy5maXJzdE5hbWUgfHwgJyd9ICR7Y29udGFjdEluZm8/Lmxhc3ROYW1lIHx8ICcnfWAgOiBudWxsXHJcbiAgfVxyXG4gIGdldEltZyhudW1iZXI6IGFueSkge1xyXG4gICAgbGV0IGNvbnRhY3RJbmZvID0gdGhpcy5jb250YWN0cy5maW5kKChjOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgID09IG51bWJlciB8fCBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyID09IG51bWJlcjtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbnRhY3RJbmZvPy5pbWFnZSB8fCBudWxsXHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0VuZEFsbEJ1dHRvbigpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGl2ZVBhcnRpY2lwYW50cyA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoYzogYW55KSA9PiAhYy5pc0xlZnQpO1xyXG4gICAgcmV0dXJuIGFjdGl2ZVBhcnRpY2lwYW50cy5sZW5ndGggPiAyO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuY2FsbERhdGEuZGlhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkICYmIGN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2NvbGxvcHMnOiBpc0NvbGxvcHMsICdpbmNvbWluZy1jYWxsLWNvbnRhaW5lcic6IGlzQ2xpY2tFeHBhbmQsICdjb250YWN0cy1vcGVuJzogc2hvd0NvbnRhY3RzUGFuZWwgfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFscGFkLWFsZXJ0c1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdjb25mZXJlbmNlLWFsZXJ0JzogaXNDb25mZXJlbmNlICYmIGN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgJ25vcm1hbC1jYWxsLWFsZXJ0JzogIWlzQ29uZmVyZW5jZVxyXG4gICAgICAgIH1cIiAqbmdJZj1cImNhbGxOdW1iZXJUb2FzdC5zaG93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsYm94LXBvcDEgYWxlcnQgZmFkZSBzaG93XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNhbGxOdW1iZXJUb2FzdC50eXBlXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICBZb3UnciBjYWxsaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e2NhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kaXNjIHAtMCBweC0xXCI+IENhbmNlbCBDYWxsIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWxsIHR5cGUgQ2FsbCBIb2xkIGxpc3QgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIoY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgISFjdXJyZW50Q2FsbCAmJiAoKGlzQ29uZmVyZW5jZUNhbGxIb2xkIHx8IGlzQ29uZmVyZW5jZSkgfHwgIWlzQ29uZmVyZW5jZSkpIHx8ICFpc0FsbEFjY2VwdGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY3VycmVudENhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cIiFjb25mPy5pc0FjY2VwdENhbGwgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjb25mPy50bykgJiYgdHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwgJiYgY29uZj8uaXNOb3RpZmljYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nLXdyYXBwZXIgYm9yZGVyLXJhZGl1cy01MFwiIFtzcmNdPVwiY29uZj8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIzNVwiIGhlaWdodD1cIjM1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+e3tjb25mPy5mcm9tfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uZnJvbU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3QgcmVjZWl2ZS1idG5cIiAoY2xpY2spPVwid2FpdGluZ0NhbGxBY2NlcHQoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIiAoY2xpY2spPVwib25SZWplY3RDYWxsKGNvbmYpXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25mPy5idXNpbmVzc051bWJlclwiIGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY29uZmVyZW5jZUNhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cImNvbmY/LmlzQ29uZmVyZW5jZUhvbGQgJiYgY29uZmVyZW5jZUNhbGxMaXN0Lmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBob2xkLWljb25cIj5wYXVzZV9jaXJjbGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SG9sZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1uYW1lXCI+e3tjb25mPy5jb25mZXJlbmNlTmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdFwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjb25mPy5pc0NvbmZlcmVuY2VIb2xkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3YXBDYWxscyhjb25mLHRydWUpXCIgW2Rpc2FibGVkXT1cImlzSG9sZEJ0bkRpc2FibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZj8uaXNDb25mZXJlbmNlSG9sZFwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCInUmVzdW1lJ1wiPiByZXN1bWUgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJlbmRDb25mZXJlbmVjZUNhbGwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFycm93LWFycm93IG1lLTJcIiBpZD1cInRvZ2dsZWFycm93XCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xMDAgcHktNVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPT09IDEgJiYgY3VycmVudENhbGxMaXN0WzBdPy5pc0luY29taW5nQ2FsbCAmJiAhY3VycmVudENhbGxMaXN0WzBdPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxUb051bVwiPkluY29taW5nIGNhbGwgb24gPGJyIC8+PHNwYW4+e3tjdXJyZW50Q2FsbExpc3RbMF0/LnRvIHx8ICdVbmtub3duIE51bWJlcid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiBbc3JjXT1cImN1cnJlbnRDYWxsTGlzdFswXT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIHdpZHRoPVwiMTIwXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8aDE+e3sgY3VycmVudENhbGxMaXN0WzBdPy5uYW1lID8gY3VycmVudENhbGxMaXN0WzBdPy5uYW1lIDogY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB8fCAnVW5rbm93biBOdW1iZXInIH19PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiISFjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWVcIj57eyBjdXJyZW50Q2FsbExpc3RbMF0/LnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBDb25uZWN0aW5nIG92ZXJsYXkgKHNob3duIGFmdGVyIGFjY2VwdCBidG4gY2xpY2ssIGhpZGRlbiBvbiBBUEkgcmVzcG9uc2UpIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy1vdmVybGF5IG10LWF1dG9cIiAqbmdJZj1cImlzQ29ubmVjdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbm5lY3RpbmctZG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbm5lY3RpbmctdGV4dFwiPkNvbm5lY3RpbmcuLi48L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnMgbXQtYXV0b1wiICpuZ0lmPVwiIWlzQ29ubmVjdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LmlzQ2FsbENvbm5lY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZVwiIChjbGljayk9XCJhZGQoY3VycmVudENhbGxMaXN0WzBdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwib25SZWplY3RDYWxsKGN1cnJlbnRDYWxsTGlzdFswXSlcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgYWN0aXZlIGNhbGwgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIighaXNDb25mZXJlbmNlIHx8IGlzQ29uZmVyZW5jZUNhbGxIb2xkKSAmJiAoISFjdXJyZW50Q2FsbD8uaWQgJiYgIWN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpICYmIGN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiAnZmxleCcsICdmbGV4LWRpcmVjdGlvbic6ICdjb2x1bW4nLCAncG9zaXRpb24nOiAncmVsYXRpdmUnfVwiIGNsYXNzPVwiYWN0aXZlLWNhbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjdXJyZW50Q2FsbD8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8aDEgKm5nSWY9XCIhY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG9OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGw/LmZyb21OYW1lIHx8ICdVbmtub3duJ319PC9oMT5cclxuICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnOHB4J31cIj57e2N1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGw/LnRvTmFtZSB8fCAnVW5rbm93bid9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCI+e3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG8gfHwgJ1Vua25vd24nIDogY3VycmVudENhbGw/LmZyb20gfHwgJ1Vua25vd24nfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIj57eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy5mcm9tIHx8ICdVbmtub3duJyA6IGN1cnJlbnRDYWxsPy50byB8fCAnVW5rbm93bid9fTwvcD5cclxuICAgICAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbi10b3A6IDRweFwiPnt7Y3VycmVudENhbGw/LnRpbWUgfHwgdGltZXJ9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRuc1wiICpuZ0lmPVwiIXNob3dLZXlwYWRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnMjBweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF1c2UtcmVzdW1lLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIiAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0tleXBhZFwiIGNsYXNzPVwic2VuZERpZ2l0XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiIChrZXl1cCk9XCJvbkNhbGxJbnB1dEVudGVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiIChjbGljayk9XCJjbGVhcklucHV0cygpXCI+Y2xvc2Vfc21hbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJzaG93S2V5cGFkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5LWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsXCIgKGNsaWNrKT1cIm9uQ2FsbElucHV0cyhrZXkubnVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDogJyZuYnNwOyd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzcyM3gnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwidG9nZ2xlS2V5cGFkKClcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0blwiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKGN1cnJlbnRDYWxsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIiAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gY29uZmVyZW5jZSBjYWxsIHZpZXcgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZlcmVuY2UtY2FsbC12aWV3XCIgKm5nSWY9XCJpc0NvbmZlcmVuY2UgJiYgY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1oZWFkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmYtaWNvbiBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3VwcyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmYtdGl0bGVcIj5Db25mZXJlbmNlIENhbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGwgb2YgY3VycmVudENhbGxMaXN0OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2FsbD8uaXNDb25mZXJlbmNlSG9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpICE9IDBcIj4mPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYWxsPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VsZk51bWJlcihjYWxsKSBlbHNlIHNlbGZOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY2FsbD8uZnJvbU5hbWUgfHwgY2FsbD8uZnJvbSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50b319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZk51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WW91PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjYWxsPy5jbGllbnRcIj57e2NhbGw/LmRpcmVjdGlvbiA9PSBcIm91dGdvaW5nLWNhbGxcIiA/IGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50byA6IGNhbGw/LmZyb21OYW1lIHx8IGNhbGw/LmZyb20gfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtdGltZXJcIj57eyB0aW1lciB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zIG10LWF1dG9cIiAqbmdJZj1cIiFzaG93S2V5cGFkXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwiIWlzUmVjb3JkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCIgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGxheV9hcnJvdyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInRpbWVyLWRpc3BsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiIChrZXl1cCk9XCJvbkNhbGxJbnB1dEVudGVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiIChjbGljayk9XCJjbGVhcklucHV0cygpXCI+Y2xvc2Vfc21hbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJzaG93S2V5cGFkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5LWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsXCIgKGNsaWNrKT1cIm9uQ2FsbElucHV0cyhrZXkubnVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDogJyZuYnNwOyd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGlzTXV0ZX1cIiAoY2xpY2spPVwidG9nZ2xlTXV0ZSh0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiB7eyBpc011dGUgPyAnbWljX29mZicgOiAnbWljJyB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUtleXBhZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHRyYW5zaXRpb25fZGlzc29sdmUgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKGN1cnJlbnRDYWxsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBncm91cHNfMiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG4gZGFuZ2VyXCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1swXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIndhdmVzXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIj5cclxuICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPVwiZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiMFwiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIzXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbmNvbWluZyBjYWxsIHVzZXIgZGV0YWlscyBzaG93biBpbiBtb2RlbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lci1tb2RlbCBwLTMgdGV4dC13aGl0ZSBtb2RlbC1jb250ZW50IGNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCJpc0NsaWNrRXhwYW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgdXNlci1pbmZvLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTNcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGVcIj5DMkMgLVBPSU5UIHt7c2VsZWN0ZWRVc2VySW5mbz8ucG9pbnROYW1lfX08L2gzPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInRleHQtd2hpdGUgbWItMVwiPk5hbWU6PC9oNT5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cInRleHQtd2hpdGUgdXNlck5hbWVcIj57e3NlbGVjdGVkVXNlckluZm8/Lm5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZi0xM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5OdW1iZXI6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/Lm51bWJlcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5FeHRlbnNpb246PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5leHRlbnNpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5FbWFpbDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tzZWxlY3RlZFVzZXJJbmZvPy5lbWFpbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlN1YmplY3Q6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yIHN1YmplY3QtdGV4dFwiIHRpdGxlPVwie3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMiBtYi0xXCI+SW1hZ2U6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAmJiBzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAhPT0gJy0nOyBlbHNlIG5vSW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7c2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2V9fVwiIGFsdD1cIlwiIHdpZHRoPVwiMTUwXCIgY2xhc3M9XCJtbC0yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPk5vIEltYWdlIEF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TWVzc2FnZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbnRhaW5lclwiIFtjbGFzcy5leHBhbmRlZF09XCJpc0V4cGFuZGVkXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5tZXNzYWdlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidG9nZ2xlLWJ0blwiICpuZ0lmPVwic2hvd0J1dHRvblwiIChjbGljayk9XCJ0b2dnbGVUZXh0KClcIj57eyBpc0V4cGFuZGVkID8gJ1NlZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MnIDogJ1NlZSBtb3JlJyB9fTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPlBvaW50IE5hbWU6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5Tb3VyY2UgTmFtZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uc291cmNlTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGNvbnRhY3QgbGlzdCBwYW5lbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1wYW5lbFwiICpuZ0lmPVwic2hvd0NvbnRhY3RzUGFuZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXY+UGFydGljaXBhbnQ8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoe30sIHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDAwMDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNFQVJDSCBJTlBVVCAodmlzaWJsZSB3aGVuIGlzU2VhcmNoVmlzaWJsZSA9IHRydWUpIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYmFyIHAtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChpbnB1dCk9XCJhcHBseUZpbHRlcigpXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdJZj1cInNlYXJjaFRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Yz8uZmlyc3ROYW1lfX0ge3tjPy5taWRkbGVOYW1lfX0ge3tjPy5sYXN0TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKSB9fXt7IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXJMYWJlbCA/ICcgKCcgKyBjLm51bWJlcnNMaXN0WzBdLm51bWJlckxhYmVsICsgJyknIDogJycgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cImNhbGxDb250YWN0KGMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJBZGQgdG8gY29uZmVyZW5jZSBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIiB0aXRsZT1cIk5ldyBDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpbHRlcmVkTGlzdC5sZW5ndGggJiYgaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyAmJiBzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cIidhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgc2VhcmNoVGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuIG1yLTJcIiAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihzZWFyY2hUZXh0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkFkZCB0byBjb25mZXJlbmNlIGNhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG5cIiAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihzZWFyY2hUZXh0LCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIk5ldyBDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0wIHRpdGxlXCI+e3tzZWxlY3RlZENvbmZOYW1lfX0ncyBhY3RpdmUgcGFydGljaXBhbnRzPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCIhYz8uaXNMZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgKm5nSWY9XCIhYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cImM/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiIWM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8ICdVbmtub3duJ319PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCIgKm5nSWY9XCJjPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNTZWxmTnVtYmVyKGMpIGVsc2Ugc2VsZk51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6IGM/LnRvTmFtZSB8fCAnVW5rbm93bid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxmTnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPllvdTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb20gfHwgJ1Vua25vd24nIDogYz8udG8gfHwgJ1Vua25vd24nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwiYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbGFiZWxcIj5Pcmdhbml6ZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjPy5qb2luZWQgJiYgIWM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbm5lY3Rpbmctd3JhcHBlciBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJpbmdpbmctdGV4dFwiPlJpbmdpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjPy5qb2luZWQgfHwgYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWljLWJ0biBtci0yXCIgW2Rpc2FibGVkXT1cImM/LmlzSG9sZFwiIChjbGljayk9XCJvbk11dGVVc2VyKGMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImM/LmlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWM/LmlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaXNIb2xkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIiAqbmdJZj1cIiFjPy5ob3N0XCIgW2Rpc2FibGVkXT1cImlzSG9sZEJ0bkRpc2FibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWM/LmlzSG9sZFwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCInSG9sZCdcIj4gcGhvbmVfcGF1c2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjPy5pc0hvbGRcIiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBbdGl0bGVdPVwiJ1Jlc3VtZSdcIj4gcmVzdW1lIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJvbkVuZENhbGwoYywgZmFsc2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYz8uaG9zdCAmJiAoZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy5mcm9tKSB8fCAoZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy50bykgJiYgYz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPlBhcnRpY2lwYW50IGFkZGVkIHRvIHRoZSBjYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDogYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiIWM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6IGM/LnRvTmFtZSB8fCAnVW5rbm93bid9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tIHx8ICdVbmtub3duJyA6IGM/LnRvIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiAqbmdJZj1cImM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy13cmFwcGVyXCIgKm5nSWY9XCJjPy5qb2luZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyaW5naW5nLXRleHRcIj5SaW5naW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlLCB0cnVlKVwiICpuZ0lmPVwiIWM/Lmhvc3QgJiYgYz8uam9pbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiIWM/LmNsaWVudCAmJiAhYz8uam9pbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG8gOiBjPy5mcm9tKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJlam9pbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG5cIiAqbmdJZj1cImM/LmNsaWVudCAmJiAhYz8uam9pbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSA6IGM/LnRvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJlam9pbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ29uZmVyZW5jZSBXYXJuaW5nIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiY3VzdG9tLW1vZGFsXCIgKm5nSWY9XCJzaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHdhcm5pbmctbW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ3YXJuaW5nLWljb25cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+d2FybmluZzwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGgzPkNvbmZlcmVuY2UgQ2FsbCBXYXJuaW5nPC9oMz5cclxuICAgIDxwPlxyXG4gICAgICBTdGFydGluZyBhIG5ldyBjYWxsIHdpbGwgcHV0IHRoZSBjdXJyZW50IGNvbmZlcmVuY2Ugb24gaG9sZFxyXG4gICAgICBhbmQgY2Fubm90IGJlIG1lcmdlZCBsYXRlci5cclxuICAgIDwvcD5cclxuICAgIDxkaXYgY2xhc3M9XCJ3YXJuaW5nLWFjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idG5cIiAoY2xpY2spPVwiY2FuY2VsTmV3Q2FsbCgpXCI+XHJcbiAgICAgICAgQ2FuY2VsXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwicHJvY2VlZC1idG5cIiAoY2xpY2spPVwiY29uZmlybU5ld0NhbGwoKVwiPlxyXG4gICAgICAgIFByb2NlZWRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNNaW5pbWlzZWRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBmdWxsc2NyZWVuXCIgKGNsaWNrKT1cIm1heGltaXNlRGlhbHBhZCgpXCI+IG9wZW5faW5fZnVsbCA8L3NwYW4+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCVcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGwtYW5pbWF0aW9uXCIgaWQ9XCJjYWxsLWF2YXRhclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm1pbi1hdmF0YXItaW1nXCIgW3NyY109XCJjYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjYWxsRGF0YS5uYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDBcIj57e2NhbGxEYXRhLmRpc3BsYXlOdW0gPyBjYWxsRGF0YS5kaXNwbGF5TnVtIDogY2FsbERhdGEucGhvbmUgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWluLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXRpbWVyXCI+e3t0aW1lcn19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLXNlYy1idG5cIiAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSBDYWxsIERpc2Nvbm5lY3QgTW9kYWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJjdXN0b20tbW9kYWxcIiAqbmdJZj1cInNob3dEaXNjb25uZWN0TW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHAtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXIgcC0wIHBiLTJcIj5cclxuICAgICAgICAgICAgPGg0IGNsYXNzPVwidGl0bGUgbWItMFwiPnt7c2VsZWN0ZWRDb25mPy5jb25OYW1lIHx8ICdDYWxsJ319IERpc2Nvbm5lY3Q8L2g0PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwic2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDAwMDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YW50LWJvZHkgbWItMlwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgIEV4aXRpbmcgdGhpcyBjYWxsIHdpbGwgbm90IGVuZCB0aGUgY29uZmVyZW5jZS4gVGhlIHNlc3Npb24gd2lsbCBjb250aW51ZSwgYW5kIGNoYXJnZXMgd2lsbCBpbmN1ciB0b1xyXG4gICAgICAgICAgICAgICAgeW91clxyXG4gICAgICAgICAgICAgICAgYWNjb3VudC5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3RhcnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0wIG1yLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJpc1JlYXNvbkNoZWNrZWRcIiBjbGFzcz1cIm1lLTJcIi8+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGlja2VyLTI0aHJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEhvdXIgcGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1zZWxlY3RcIiBbY2xhc3MuZGlzYWJsZWQtcGlja2VyXT1cIiFpc1JlYXNvbkNoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLWRpc3BsYXlcIiAoY2xpY2spPVwiaXNSZWFzb25DaGVja2VkICYmIHRvZ2dsZUhvdXJEcm9wZG93bigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZWF2ZUhvdXIgfHwgJ0hIJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaWNrZXItYXJyb3dcIj4mIzk2NjA7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvbnNcIiAqbmdJZj1cInNob3dIb3VyRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1vcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaCBvZiBob3Vyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJsZWF2ZUhvdXIgPT09IGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SG91cihoKVwiPnt7IGggfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcFwiPjo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNaW51dGUgcGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1zZWxlY3RcIiBbY2xhc3MuZGlzYWJsZWQtcGlja2VyXT1cIiFpc1JlYXNvbkNoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLWRpc3BsYXlcIiAoY2xpY2spPVwiaXNSZWFzb25DaGVja2VkICYmIHRvZ2dsZU1pbnV0ZURyb3Bkb3duKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxlYXZlTWludXRlIHx8ICdNTScgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlja2VyLWFycm93XCI+JiM5NjYwOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1vcHRpb25zXCIgKm5nSWY9XCJzaG93TWludXRlRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1vcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbSBvZiBtaW51dGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImxlYXZlTWludXRlID09PSBtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1pbnV0ZShtKVwiPnt7IG0gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZW5kLWJ0blwiIChjbGljayk9XCJsZWF2ZUNvbmZlcmVuY2UoKVwiIFtkaXNhYmxlZF09XCJpc1JlYXNvbkNoZWNrZWQgJiYgKCFsZWF2ZUhvdXIgfHwgIWxlYXZlTWludXRlKVwiPlxyXG4gICAgICAgICAgICAgICAgTGVhdmVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZW5kLWJ0blwiIChjbGljayk9XCJlbmRDb25mZXJlbmNlKClcIiAqbmdJZj1cInNob3dFbmRBbGxCdXR0b25cIj5cclxuICAgICAgICAgICAgICAgIEVuZCBBbGxcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
2029
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQW1COUMsTUFBTSxPQUFPLHFCQUFxQjtJQW1IaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDN0UsYUFBNEIsRUFDM0IsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM3RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBbEh2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBQzVCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBS3RCLGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUQseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUMsQ0FBQSxFQUFFO1FBQ3BFLGtCQUFhLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFHN0Usc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLFVBQUssR0FBVyxPQUFPLENBQUM7UUFFeEIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ25CLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsc0JBQWlCLEdBQW1CLElBQUksQ0FBQztRQUN6QyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDbEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixtQkFBYyxHQUFZLElBQUksQ0FBQztRQUNyQiwwQkFBcUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNyRSxrQkFBYSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ25FLHlCQUFvQixHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBSTlFLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsZ0JBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUIsZUFBVSxHQUFXLFNBQVMsQ0FBQyxDQUFJLEVBQUU7UUFHckMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLDJCQUFzQixHQUFZLEtBQUssQ0FBQyxDQUFHLEVBQUU7UUFDN0MseUJBQW9CLEdBQVksS0FBSyxDQUFDLENBQUcsRUFBRTtRQUUzQyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixhQUFRLEdBQVUsRUFBRSxDQUFDO1FBQ3JCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBRzVCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRS9CLDhCQUF5QixHQUFRLEVBQUUsQ0FBQztRQUNwQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFFdEMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBRXZCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsY0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEVBQUU7WUFDUCxJQUFJLEVBQUUsS0FBSztTQUNaLENBQUE7UUFDRCxvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQix1QkFBa0IsR0FBVSxFQUFFLENBQUM7UUFDL0IsNkJBQXdCLEdBQVksS0FBSyxDQUFDO1FBQzFDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUMzQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUN4QiwwQkFBcUIsR0FBUSxFQUFFLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsc0JBQXNCO1FBQ3RCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsVUFBSyxHQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLFlBQU8sR0FBYSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRXBDLCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUM1QyxvQkFBZSxHQUFRLElBQUksQ0FBQztRQUM1QixvQkFBZSxHQUFHO1lBQ2hCLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLGVBQWU7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFFRiw0QkFBdUIsR0FBVyxDQUFDLENBQUM7UUFDcEMsMEJBQXFCLEdBQVEsRUFBRSxDQUFDO1FBRXhCLHFCQUFnQixHQUFVLEVBQUUsQ0FBQztRQUNyQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDZCwyQkFBc0IsR0FBa0IsSUFBSSxDQUFDO1FBQzdDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUUzQyw0QkFBdUIsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNqRCx1QkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyRCxzQkFBaUIsR0FBVyxLQUFLLENBQUM7UUFDbEMsc0JBQWlCLEdBQWtELEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxDQUFDO1FBMmtEMUgsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUF5UDdCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQTl6RDFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELFFBQVE7UUFDTixpREFBaUQ7UUFDaEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQzthQUM1QztTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUUsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDNUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFO2dCQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUU7Z0JBQ2pHLElBQUksQ0FBQyxXQUFXLEdBQUc7b0JBQ2pCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVk7b0JBQ25DLEVBQUUsRUFBRSxLQUFLO29CQUNULEdBQUcsRUFBRSx3QkFBd0I7b0JBQzdCLGNBQWMsRUFBRSxLQUFLO29CQUNyQixNQUFNLEVBQUUsS0FBSztvQkFDYixNQUFNLEVBQUUsS0FBSztvQkFDYixZQUFZLEVBQUUsS0FBSztvQkFDbkIsWUFBWSxFQUFFLElBQUk7b0JBQ2xCLElBQUksRUFBRSxJQUFJO29CQUNWLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLEtBQUs7b0JBQzlDLGFBQWEsRUFBRSxLQUFLO29CQUNwQixJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxRQUFRLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksRUFBRTtvQkFDNUksSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNqQixDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3JEO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRTtZQUNuSCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFO29CQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDekU7Z0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWEsRUFBRSxDQUFTLEVBQUUsRUFBRTtvQkFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUMzRixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQ2xGLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDek0sQ0FBQTtvQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dCQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztxQkFDNUU7eUJBQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3QkFDM0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLEVBQUUsTUFBTSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO3dCQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO3FCQUMvQjtvQkFDRCw2RUFBNkU7b0JBQzdFLElBQUksNEJBQTRCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNySyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDckwsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbkUsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBaUIsRUFBRSxFQUFFO3dCQUN6RCxJQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTs0QkFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsS0FBSyxhQUFhLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO3lCQUNuTDtvQkFDSCxDQUFDLENBQUMsQ0FBQTtvQkFDRixJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQ3hFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTs0QkFDbkUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFO2dDQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDOzZCQUN2Qjs0QkFDRCxJQUFHLGFBQWEsRUFBRSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksSUFBSSxHQUFHLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0NBQ3ZILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDOzZCQUMxQjs0QkFDQyxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUE7NEJBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0NBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ3ZDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FDN0YsQ0FBQTs2QkFDRjs0QkFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDcEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dDQUMvRSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUU7b0NBQ3pGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO3dDQUN4QixHQUFHLEdBQUc7d0NBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7d0NBQ3ZDLE1BQU0sRUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFO3dDQUNwQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSx3QkFBd0I7d0NBQ3BILGNBQWMsRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWU7d0NBQ2pELE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTTt3Q0FDbkIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0NBQ3ZGLGNBQWMsRUFBRSxRQUFRLEVBQUUsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO3dDQUNySCxNQUFNLEVBQUUsS0FBSzt3Q0FDYixZQUFZLEVBQUUsR0FBRyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTt3Q0FDcEQsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dDQUM1RSxJQUFJLEVBQUUsSUFBSTt3Q0FDVixLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dDQUM5RCxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0NBQ3RCLGFBQWEsRUFBRSxRQUFRLEVBQUUsYUFBYTt3Q0FDdEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTTt3Q0FDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7cUNBQ3hFLENBQUMsQ0FBQztvQ0FDSCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3Q0FDMUIsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO3dDQUN6RSwyREFBMkQ7d0NBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDcEI7b0NBQ0QsSUFBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEVBQUM7d0NBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3FDQUMxQztpQ0FDRjtxQ0FBTSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsRUFBRTtvQ0FDbEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0NBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUU7d0NBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztxQ0FDdkM7eUNBQU07d0NBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FDQUN2QztvQ0FDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3Q0FDMUIsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO3dDQUN6RSwwREFBMEQ7d0NBQzFELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDcEI7b0NBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lDQUM3QztxQ0FBTSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7b0NBQ3RDLG1CQUFtQjtvQ0FDbkIsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FFN0IseURBQXlEO29DQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29DQUN0RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29DQUVoRSxJQUFJLFdBQW9CLENBQUM7b0NBQ3pCLElBQUksYUFBYSxFQUFFO3dDQUNqQiwwRUFBMEU7d0NBQzFFLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxZQUFZLEVBQUU7NENBQy9CLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDOzRDQUN6QixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDOzRDQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3lDQUMvQzs2Q0FBTTs0Q0FDTCwwRUFBMEU7NENBQzFFLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQzt5Q0FDbEQ7cUNBQ0Y7eUNBQU07d0NBQ0wsMkNBQTJDO3dDQUMzQyxXQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztxQ0FDMUI7b0NBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRzt3Q0FDNUIsR0FBRyxHQUFHO3dDQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO3dDQUN2QyxNQUFNLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRTt3Q0FDcEMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLE9BQU8sRUFBRSxLQUFLLElBQUksd0JBQXdCO3dDQUNwSCxjQUFjLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlO3dDQUNqRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07d0NBQ25CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLO3dDQUN2RixjQUFjLEVBQUUsUUFBUSxFQUFFLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSzt3Q0FDckgsTUFBTSxFQUFFLFdBQVc7d0NBQ25CLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTt3Q0FDckUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dDQUMzRSxJQUFJLEVBQUUsSUFBSTt3Q0FDVixLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dDQUM5RCxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0NBQ3RCLGFBQWEsRUFBRSxRQUFRLEVBQUUsYUFBYTt3Q0FDdEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTTt3Q0FDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7cUNBQ3hFLENBQUM7aUNBQ0g7NkJBQ0Y7aUNBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUU7Z0NBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO29DQUN4QixHQUFHLEdBQUc7b0NBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7b0NBQ3JDLE1BQU0sRUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFO29DQUN0QyxHQUFHLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSx3QkFBd0I7b0NBQ25ILGNBQWMsRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWU7b0NBQ2hELE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTTtvQ0FDbkIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUs7b0NBQ3ZGLGNBQWMsRUFBRSxRQUFRLEVBQUUsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO29DQUNySCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07b0NBQ25CLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtvQ0FDckUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO29DQUMzRSxJQUFJLEVBQUUsSUFBSTtvQ0FDVixLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29DQUM3RCxhQUFhLEVBQUUsR0FBRyxDQUFDLEVBQUU7b0NBQ3JCLGFBQWEsRUFBRSxRQUFRLEVBQUUsYUFBYTtvQ0FDdEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTTtvQ0FDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7aUNBQ3hFLENBQUMsQ0FBQztnQ0FDSCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQ0FDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7NkJBQ2hDO3dCQUNMLENBQUMsQ0FBQyxDQUFBO3dCQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7cUJBQ2xDO3lCQUFNO3dCQUNMLElBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsRUFBRTs0QkFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBOzRCQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs0QkFDdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzs0QkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7NEJBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzRCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOzRCQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDOzRCQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDOzRCQUMvQix1Q0FBdUM7NEJBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDOzRCQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQTs0QkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dDQUNsQixJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7NkJBQ3pDOzRCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQzt5QkFDMUI7d0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7cUJBQzlCO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLGdGQUFnRjtnQkFDaEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDckcsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO29CQUM1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUNwQyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDM0M7aUJBQ0Y7Z0JBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLElBQUksV0FBVyxHQUFPLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDeEUsT0FBTyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRTt3QkFDbkQsSUFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRTs0QkFDclMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDL0I7d0JBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQTtvQkFDM1MsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsZ0VBQWdFO2dCQUNoRSx3RkFBd0Y7Z0JBRXhGLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtvQkFDekQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUM7b0JBQ3RFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7aUJBQ2hDO3FCQUFNLElBQUksSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUMzRyxNQUFNLHdCQUF3QixHQUFHLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDdkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7d0JBQ3pGLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUN4RyxDQUFDO29CQUNGLGlHQUFpRztvQkFDakcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sRUFBRTt3QkFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztxQkFDL0I7aUJBQ0Y7Z0JBQ0QsaUhBQWlIO2dCQUNqSCxxVEFBcVQ7Z0JBQ3JULDRDQUE0QztnQkFDNUMsMkNBQTJDO2dCQUMzQyxpREFBaUQ7Z0JBQ2pELDhDQUE4QztnQkFDOUMsTUFBTTtnQkFDTixJQUFJO2dCQUNKLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUMzRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUMxRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQjt3QkFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDVCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO29CQUUxRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUN0RCxJQUFJLEdBQUcsRUFBRSxnQkFBZ0I7NEJBQUUsT0FBTyxLQUFLLENBQUM7d0JBRXhDLElBQUksVUFBVSxFQUFFOzRCQUNkLDJEQUEyRDs0QkFDM0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQ0FDMUYsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQ25GLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQzt5QkFDaEI7NkJBQU07NEJBQ0wsb0ZBQW9GOzRCQUNwRixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssWUFBWSxDQUFDO2dDQUM3RSxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssWUFBWSxDQUFDLENBQUM7NEJBQ2xFLE9BQU8sQ0FBQyxLQUFLLENBQUM7eUJBQ2Y7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxRQUFRLEVBQUU7d0JBQ1osSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDeEQ7aUJBQ0Y7cUJBQ0ssSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUU7b0JBQzNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25GLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUMxQjtxQkFBTSxJQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQztvQkFDakgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVksRUFBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMvSCxJQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRTt3QkFDN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRSxLQUFLLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUUsSUFBSSxDQUFDO3dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDL0I7aUJBQ0Y7cUJBQU0sSUFBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDNUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkQsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0JBQzVELGdFQUFnRTt3QkFDaEUsa0ZBQWtGO3dCQUNsRiwrRUFBK0U7d0JBQy9FLElBQUksWUFBWSxHQUFRLElBQUksQ0FBQzt3QkFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7NEJBQzVDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsc0JBQXNCO2dDQUFFLFNBQVM7NEJBQy9ELFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRSxNQUFNLENBQUM7bUNBQ3pILENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7NEJBQ3pJLElBQUksWUFBWTtnQ0FBRSxNQUFNO3lCQUN6Qjt3QkFDRCxJQUFJLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7NEJBQ3BELElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQ0FDakQsYUFBYSxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztnQ0FDakMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZO2dDQUN4QyxJQUFJLEVBQUUsS0FBSztnQ0FDWCxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksSUFBSSxLQUFLOzZCQUNsQyxDQUFDLENBQUM7NEJBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQ0FDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUE7NkJBQ3hDOzRCQUNELElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxZQUFZLEVBQUUsWUFBWSxDQUFDOzRCQUNyRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDOzRCQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDOzRCQUMvQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO3lCQUNwQztxQkFDRjtpQkFDRjtnQkFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUU7b0JBQ3hDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDOUcsSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO3dCQUNuQyxJQUFHLFlBQVksQ0FBQyxjQUFjLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTs0QkFDbEUsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dDQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQ0FDN0UsSUFBSSxFQUFFLENBQUMsT0FBWSxFQUFFLEVBQUU7d0NBQ3ZCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxJQUFJLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTt3Q0FDbEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO3dDQUNyRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3Q0FDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDN0UsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dDQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO29DQUNsRCxDQUFDO2lDQUNBLENBQUMsQ0FBQzs2QkFDSjtpQ0FBTTtnQ0FDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7NkJBQ3RFO3lCQUNGOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7eUJBQ3RDO3dCQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztxQkFDeEI7eUJBQU07d0JBQ0wsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxZQUFZLEVBQUUsYUFBYSxFQUFFOzRCQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDOzRCQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0NBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs2QkFDeEI7eUJBQ0Y7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzs0QkFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7eUJBQzVCO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO29CQUNyRixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7d0JBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDckQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztxQkFDeEI7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFBO2dCQUNsRixNQUFNLFVBQVUsR0FBRztvQkFDakIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUNqRixDQUFDO2dCQUVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDekQsR0FBRyxJQUFJO29CQUNQLGNBQWMsRUFBRSxjQUFjLEtBQUssR0FBRyxDQUFDLEVBQUU7aUJBQzFDLENBQUMsQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUU7Z0JBQy9DLElBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsRUFBQztvQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7b0JBQ2xDLElBQUcsSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO3FCQUN4QjtvQkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7b0JBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUN6QztvQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDMUI7Z0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixJQUFHLENBQUMsQ0FBQztnQkFDL0IsNEJBQTRCO2FBQzdCO1lBQUEsQ0FBQztTQUNIO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRTtZQUM1RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xLLElBQUcsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDbEM7U0FDRjtRQUNELElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsWUFBWSxFQUFFO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQy9EO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBYTtRQUM1QixJQUFJO1lBQ0YsSUFBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFO2dCQUNwQyxJQUFJLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLHlCQUF5QixFQUFFLEVBQUUsRUFBRTtvQkFDakMsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUNqRCxhQUFhLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUM7d0JBQzlDLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxZQUFZO3dCQUNyRCxJQUFJLEVBQUUsSUFBSTt3QkFDVixJQUFJLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQy9DLENBQUMsQ0FBQztvQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO3dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQTtxQkFDeEM7aUJBQ0Y7YUFDRjtZQUNELE1BQU0scUJBQXFCLEdBQUcsUUFBUSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUN6RSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FDbkUsQ0FBQTtZQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFDOUIsd0NBQXdDO1lBQ3hDLE1BQU0sU0FBUyxHQUFRLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMvRSx1QkFBdUI7WUFDdkIsTUFBTSxPQUFPLEdBQVE7Z0JBQ25CLGdCQUFnQixFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDbEMsZUFBZSxFQUFFLElBQUk7YUFDdEIsQ0FBQztZQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFekQsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNwQyxNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUk7b0JBQ2hDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO29CQUM1QixHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7b0JBQ3BCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNO29CQUNqQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsWUFBWTtpQkFDbEQ7Z0JBQ0QsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFO2FBQ25ELENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNwQixJQUFJO29CQUNBLElBQUksdUJBQXVCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO3dCQUN0RCxJQUFJLEVBQUUscUJBQXFCLENBQUMsSUFBSTt3QkFDaEMsS0FBSyxFQUFFLFVBQVU7d0JBQ2pCLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLEVBQUU7d0JBQzVDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxZQUFZO3dCQUNqRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzt3QkFDckQsS0FBSyxFQUFFLEVBQUU7d0JBQ1QsV0FBVyxFQUFFLEVBQUU7d0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDO3FCQUM1QyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLHFCQUFxQixFQUFFLFlBQVksQ0FBQztvQkFDOUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7aUJBQzVCO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3hEO1lBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxlQUFvQixFQUFFLFVBQWU7UUFDL0MsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDMUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDMUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDNUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDcEQsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsZUFBZSxDQUFFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDM0MsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDOUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDcEQsZUFBZSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixDQUFDO1FBQzVFLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3RELGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2hELE9BQU8sRUFBQyxHQUFHLGVBQWUsRUFBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxXQUFlO1FBQ3BDLElBQUcsV0FBVyxFQUFFLE1BQU0sRUFBQztZQUNyQixJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQztTQUN4RTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsSUFBRyxJQUFJLENBQUMsa0NBQWtDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUM3SCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUM7U0FDL0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDO1lBQ25GLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxZQUFrQjtRQUMxQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7YUFDbkM7WUFDRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2hDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRiw2RUFBNkU7UUFDN0UsK0RBQStEO1FBQy9ELG9GQUFvRjtRQUNwRiw0RkFBNEY7UUFDNUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ3pCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzNELENBQUM7UUFFRixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLE1BQU0sR0FBVSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsSUFBSSxhQUFhLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTtvQkFDaEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN6QztxQkFBTTtvQkFDTCxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUM3QzthQUNGO1lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUN2SixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLGVBQWU7WUFDckIsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO1FBRUYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsU0FBUyxDQUFDLEdBQVE7UUFDaEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRTtZQUNyQyxPQUFPLEdBQUcsRUFBRSxVQUFVLElBQUksa0JBQWtCLElBQUksR0FBRyxFQUFFLFVBQVUsSUFBSSxrQkFBa0IsSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxVQUFVLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNqTDthQUFNO1lBQ0wsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsRUFBRTtnQkFDaEUsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUNqRCxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBYSxFQUFFLGVBQXlCO1FBQ3RELElBQUk7WUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHO2dCQUNkLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDbEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUN6QixLQUFLLEVBQUUsT0FBTztnQkFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixNQUFNLEVBQUUsSUFBSTtnQkFDWixNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRztnQkFDakIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFVBQVUsRUFBRSxFQUFFO2dCQUNkLFlBQVksRUFBRSxFQUFFO2dCQUNoQixJQUFJLEVBQUUsSUFBSTtnQkFDVixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixFQUFFLEVBQUUsVUFBVTtnQkFDZCxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSx3QkFBd0I7Z0JBQzdDLFlBQVksRUFBRSxJQUFJO2dCQUNsQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFFBQVEsRUFBRSxFQUFFO2dCQUNaLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQzFCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUM1QixJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixJQUFJLEVBQUUsRUFBRTtnQkFDUixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN6QixNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTTthQUN4QyxDQUFDO1lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFHLFNBQVMsRUFBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyw2QkFBNkI7Z0JBQzNELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDcEIsSUFBSTt3QkFDRixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzs0QkFDdEQsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJOzRCQUNwQixLQUFLLEVBQUUsVUFBVTs0QkFDakIsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLEtBQUs7NEJBQ2xDLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7NEJBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDOzRCQUNyRCxLQUFLLEVBQUUsRUFBRTs0QkFDVCxXQUFXLEVBQUUsRUFBRTs0QkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7eUJBQzVDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDOzRCQUM1QyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7NEJBQ3BCLEtBQUssRUFBRSxVQUFVOzRCQUNqQixpQkFBaUIsRUFBRSxRQUFRLEVBQUUsS0FBSzs0QkFDbEMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTs0QkFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7NEJBQ3JELEtBQUssRUFBRSxFQUFFOzRCQUNULFdBQVcsRUFBRSxFQUFFOzRCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt5QkFDeEIsQ0FBQyxDQUFDO3dCQUNILElBQUcsZUFBZSxFQUFFOzRCQUNsQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7eUJBQ2xFO3dCQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFBO3dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQy9CLG9FQUFvRTt3QkFDcEUseURBQXlEO3FCQUMxRDtvQkFBQyxPQUFPLENBQUMsRUFBRTt3QkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN2RDtnQkFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ1Isb0NBQW9DO2FBQ3JDO2lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtTQUVGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLENBQU07UUFDckIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFHL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV6RCxDQUFDLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQixhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDOUIsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUFZO1lBQzdCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNkLElBQUksRUFBRSxZQUFZO1NBQ25CLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9DO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBTTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUM1SyxJQUFJLFVBQVUsR0FBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksSUFBSSxFQUFFLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO29CQUN6QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzVELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUNuTCxDQUFBO29CQUNELElBQUksZUFBZSxFQUFFLEVBQUUsRUFBRzt3QkFDeEIsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLHlCQUF5QixDQUFDOzRCQUNqRCxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDOzRCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7NEJBQzNDLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxNQUFNOzRCQUM5QixJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksSUFBSSxLQUFLO3lCQUNyQyxDQUFDLENBQUM7d0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTs0QkFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUE7eUJBQ3ZDO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUN2TyxDQUFBO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFVBQVUsRUFBRSxFQUFFLElBQUksVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFO2dCQUNyRCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7b0JBQ2pELGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7b0JBQy9CLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWTtvQkFDdEMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU07b0JBQ3pCLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxJQUFJLEtBQUs7aUJBQ2hDLENBQUMsQ0FBQztnQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDeEM7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1NBQ0Y7YUFBTTtZQUNMLElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakQsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUFZO2dCQUM3QixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDZixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLO2FBQ3ZCLENBQUMsQ0FBQztZQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFBO2FBQ3hDO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUN0QjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUM7UUFDMUQsa0RBQWtEO0lBQ3BELENBQUM7SUFDRCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQU0sRUFBRSxZQUFzQixFQUFFLFNBQW1CO1FBQ2pFLElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDcEUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBWSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1SyxJQUFHLGVBQWUsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzdDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLHlCQUF5QixFQUFFLFlBQVksQ0FBQztRQUM3RSxJQUFJLEdBQUcsR0FBUSxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDN0UsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLDBCQUEwQixFQUFFO1lBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjthQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLFlBQVksQ0FBQztRQUN2RCxpRUFBaUU7UUFDakUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQVk7UUFDckMsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxPQUFZO1FBQzFDLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFFLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBWTtRQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBWTtRQUN2QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQVk7UUFDMUMsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLGFBQWtCLEVBQUUsWUFBaUI7UUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEcsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBYTtRQUN2QyxPQUFPO1lBQ0wsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4QixVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ3hDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsVUFBa0I7UUFDbkQsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hHLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQVUsRUFBRSxRQUFhLEVBQUUsU0FBYztRQUNyRSxNQUFNLE9BQU8sR0FBUTtZQUNuQixnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDbEMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ2xCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztnQkFDcEIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2FBQ3JCO1lBQ0QsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUNoQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLDJFQUEyRTtZQUMzRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUM7WUFDdkQsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxlQUFlLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDOUUsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxLQUFLLGVBQWUsQ0FDdEQsQ0FBQzthQUNIO1lBQ0QsMkJBQTJCO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUNqQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFVCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsaUdBQWlHO1lBQ2pHLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBWSxFQUFFLEVBQUU7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQWU7UUFDaEMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXRCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsT0FBTyxHQUFHLENBQUMsQ0FBQztTQUNiO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pDLE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFNBQVM7UUFDZixhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxVQUFVLENBQUMsWUFBb0I7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBRVMsR0FBRyxDQUFDLEtBQWE7UUFDdkIsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFDTyxXQUFXLENBQUMsS0FBVTtRQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBVTtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixzQ0FBc0M7UUFDdEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEcsSUFBSSxVQUFVLEdBQUcsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL08sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ3pJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ3RCLElBQUksZUFBZSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzt1QkFDekgsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUNySixJQUFJLGVBQWUsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7aUJBQ2hDO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2hCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFzQjtRQUNsQyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFO2dCQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7YUFBTTtZQUNMLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQztTQUN6RDtJQUNILENBQUM7SUFHRCxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQXNCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JCLGFBQWEsRUFBRSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsSUFBSSx5QkFBeUIsRUFBRSxFQUFFLENBQUM7WUFDekYsWUFBWSxFQUFFLHlCQUF5QixFQUFFLFlBQVk7WUFDckQsSUFBSSxFQUFFLHlCQUF5QixDQUFDLE1BQU07WUFDdEMsSUFBSSxFQUFFLENBQUMseUJBQXlCLEVBQUUsTUFBTTtZQUN4Qyw4REFBOEQ7U0FDL0QsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QywwREFBMEQ7SUFDNUQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxvQkFBb0I7YUFDN0IsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2FBQ2pELElBQUksQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxXQUFXLEVBQUUsTUFBTSxDQUFDO2VBQy9JLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pMLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNELG1CQUFtQixDQUFDLFFBQWMsRUFBRSxPQUFpQjtRQUNuRCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsa0NBQWtDLEdBQUcsUUFBUSxFQUFFLFlBQVksQ0FBQztRQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVcsRUFBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksS0FBSyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUM3SSxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUMzRCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGdCQUFvQjtRQUMxQyxJQUFJLGFBQWEsR0FBUSxFQUFFLENBQUE7UUFDM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuSSxJQUFJLFFBQVEsRUFBRTtZQUNaLGFBQWEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUNuTCxDQUFBO1NBQ0Y7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksYUFBYSxFQUFFLEVBQUUsSUFBSSxhQUFhLEVBQUUsWUFBWSxLQUFLLGdCQUFnQixFQUFFLFlBQVksRUFBRTtZQUN2RixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ25DLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO2dCQUN2RCxhQUFhLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO2dCQUNsQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVk7Z0JBQ3pDLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxJQUFJLEtBQUs7YUFDbkMsQ0FBQyxDQUFDO1lBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7YUFDekM7WUFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBVSxFQUFFLGFBQW1CLEVBQUUsWUFBbUI7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUV6QixNQUFNLFlBQVksR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztRQUUzRSxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2hDLElBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDeEMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLGFBQWEsR0FBRztvQkFDcEIsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLE9BQU8sRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU87b0JBQ3pDLElBQUk7aUJBQ0wsQ0FBQztnQkFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxPQUFPLEdBQUc7b0JBQ1osUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFO29CQUNsQixTQUFTLEVBQUUsRUFBRTtvQkFDYixTQUFTLEVBQUUsRUFBRTtvQkFDYixVQUFVLEVBQUUsVUFBVTtvQkFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN2QixNQUFNLEVBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztvQkFDdEQsU0FBUyxFQUFFLEVBQUU7b0JBQ2IsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTztvQkFDM0MsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLElBQUksSUFBSTtpQkFDekMsQ0FBQTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtvQkFDaEYsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDckIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxFQUFFLFlBQVksQ0FBQzt3QkFDN0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO3dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDckUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQzt3QkFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBRXhDLGdFQUFnRTt3QkFDaEUscUVBQXFFO3dCQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLDZCQUE2QixFQUFFLENBQUM7d0JBRW5ELHdEQUF3RDt3QkFDeEQsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFOzRCQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN0QyxDQUFDLENBQUMsQ0FBQzt3QkFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO3FCQUMxQjt5QkFBTTt3QkFDTCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUM5RSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUMxQyxDQUFDO3dCQUNGLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTt3QkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3ZELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTt3QkFDNUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7d0JBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDbEY7b0JBQ0QsVUFBVSxDQUFDLEdBQUUsRUFBRTt3QkFDYixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO29CQUN0QyxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ1IsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBQztnQkFDdEcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUM5RSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUMxQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQVksRUFBRSxlQUF5QjtRQUN2RCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ3BHLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDek4sSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLFdBQVcsdUJBQXVCLENBQUMsQ0FBQztZQUM3RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxJQUFJLEdBQVEsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7b0JBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO29CQUMvRSxLQUFLLEVBQUUsVUFBVTtvQkFDakIsaUJBQWlCLEVBQUUsV0FBVztvQkFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtvQkFDNUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3JELEtBQUssRUFBRSxFQUFFO29CQUNULFdBQVcsRUFBRSxFQUFFO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztvQkFDakQsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNoRCxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZO29CQUM1QyxJQUFJLEVBQUUsSUFBSTtvQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksS0FBSztvQkFDckMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCLENBQUMsQ0FBQztnQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDekM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksV0FBVztvQkFDbEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksd0JBQXdCO29CQUM3QyxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWE7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDbkMsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxJQUFJO2lCQUNuQixDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztnQkFDeEUsMERBQTBEO2dCQUMxRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFFSCxJQUFJLGNBQWMsR0FBUSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFNLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO3dCQUN0RixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDdkM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsb0NBQW9DO2dCQUNwQyxJQUFJLElBQUksR0FBUSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDOUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO29CQUMxRCxLQUFLLEVBQUUsVUFBVTtvQkFDakIsaUJBQWlCLEVBQUUsV0FBVztvQkFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtvQkFDNUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3JELEtBQUssRUFBRSxFQUFFO29CQUNULFdBQVcsRUFBRSxFQUFFO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFFekIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7Z0JBQ3hDLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO29CQUN2RCxhQUFhLEVBQUUsY0FBYztvQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTtvQkFDM0MsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUk7b0JBQ1YsVUFBVSxFQUFFLElBQUk7aUJBQ2pCLENBQUMsQ0FBQztnQkFFSCxJQUFJLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDekM7Z0JBRUQsZ0VBQWdFO2dCQUNoRSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksV0FBVztvQkFDbEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksd0JBQXdCO29CQUM3QyxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWE7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDbkMsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLFlBQVksRUFBRSxLQUFLO2lCQUNwQixDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7YUFDbEM7U0FDRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxlQUF5QjtRQUNqRSxJQUFJO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNoTixJQUFJLGFBQWEsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLE1BQU0sdUJBQXVCLENBQUMsQ0FBQztnQkFDeEQsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELElBQUksTUFBTSxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsOEJBQThCLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQ2hELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUE7WUFDdEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXhDLHlDQUF5QztZQUN6QyxNQUFNLFFBQVEsR0FBRztnQkFDZixJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVM7Z0JBQ3hCLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLHdCQUF3QjtnQkFDL0MsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtnQkFDbEMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3BDLENBQUM7WUFFRixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLElBQUksYUFBYSxHQUFRLEVBQUUsQ0FBQTtnQkFDM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDbkksSUFBSSxRQUFRLEVBQUU7b0JBQ1osYUFBYSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQ25MLENBQUE7aUJBQ0Y7Z0JBRUQsSUFBSSxhQUFhLEVBQUUsRUFBRSxFQUFFO29CQUNyQixJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQzt3QkFDdkQsYUFBYSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQzt3QkFDbEMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZO3dCQUN6QyxJQUFJLEVBQUUsSUFBSTt3QkFDVixJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksSUFBSSxLQUFLO3FCQUNuQyxDQUFDLENBQUM7b0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7cUJBQ3pDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDbkM7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO2FBQy9CO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWEsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ3JELHFDQUFxQztRQUNyQyxJQUFJLG1CQUFtQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRztnQkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUs7Z0JBQ2pDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSx3QkFBd0I7YUFDMUQsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLEdBQUc7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxlQUFlO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2dCQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2FBQ3ZDLENBQUM7WUFFRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBRzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3BDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFvQjtRQUNwQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDM0IscURBQXFEO1lBQ3JELElBQUksU0FBUyxHQUFRLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sR0FBRyxHQUFRLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0csSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDckIsT0FBTyxHQUFHLEVBQUUsUUFBUSxDQUFBO2FBQ3JCO2lCQUFNO2dCQUNMLE9BQU8sWUFBWSxDQUFBO2FBQ3BCO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sWUFBWSxDQUFBO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBYztRQUNsQyxJQUFJO1lBQ0YsSUFBSSxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxDQUFDLCtDQUErQztZQUMzRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLENBQUMsa0VBQWtFO1NBQ2hGO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFlO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixHQUFHLEVBQUUsT0FBTztZQUNaLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQztRQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxZQUFvQjtRQUMzQyxVQUFVLENBQUMsR0FBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDL0QsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtvQkFDdkIsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLFlBQVksSUFBSSxHQUFHLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztvQkFDakUsOEJBQThCO29CQUM5QixrQ0FBa0M7b0JBQ2xDLHVDQUF1QztvQkFDdkMsWUFBWTtvQkFDWixJQUFJO29CQUNKLGlEQUFpRDtvQkFDakQseUNBQXlDO29CQUN6QyxtREFBbUQ7b0JBQ25ELCtDQUErQztvQkFFL0MsZUFBZTtvQkFDZixjQUFjO29CQUNkLDBDQUEwQztvQkFDMUMsb0NBQW9DO29CQUNwQyxTQUFTO29CQUNULE9BQU87b0JBQ1AsS0FBSztvQkFFTCxpREFBaUQ7b0JBQ2pELDZEQUE2RDtvQkFDN0Qsc0JBQXNCO2dCQUN4QixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7Z0JBQ3BDLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDUixDQUFDO0lBRUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFhLEVBQUUsZ0JBQTBCO1FBQ3ZELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxFQUFFLFlBQVksSUFBSSxRQUFRLEVBQUUsWUFBWSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUNuTCxDQUFBO2dCQUNELElBQUksZUFBZSxFQUFFLEVBQUUsRUFBRTtvQkFDdkIsSUFBSSxRQUFRLEdBQVEsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUM7d0JBQ3ZELGFBQWEsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7d0JBQ3BDLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWTt3QkFDM0MsSUFBSSxFQUFFLEtBQUs7d0JBQ1gsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLElBQUksS0FBSztxQkFDckMsQ0FBQyxDQUFDO29CQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7d0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO3FCQUN6QztvQkFDRCxvQ0FBb0M7b0JBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFBO29CQUNoRSxtREFBbUQ7aUJBQ3BEO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDbkwsQ0FBQTtnQkFDRCxJQUFJLGVBQWUsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFO29CQUNuRCxJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQzt3QkFDdkQsYUFBYSxFQUFFLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzt3QkFDcEMsWUFBWSxFQUFFLGVBQWUsRUFBRSxZQUFZO3dCQUMzQyxJQUFJLEVBQUUsSUFBSTt3QkFDVixJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksSUFBSSxLQUFLO3FCQUNyQyxDQUFDLENBQUM7b0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7cUJBQ3pDO29CQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLG9DQUFvQztpQkFDckM7YUFDRjtZQUNELElBQUksQ0FBQyxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRTtnQkFDdEYsSUFBSSxRQUFRLEdBQVEsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUM7b0JBQ3ZELGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxhQUFhLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDMUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO29CQUM1QixJQUFJLEVBQUUsSUFBSTtvQkFDVixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLO2lCQUN2QixDQUFDLENBQUM7Z0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtvQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7aUJBQ3pDO2dCQUNELG9DQUFvQzthQUNyQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsZUFBZSxDQUFDLFFBQWE7UUFDM0IsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM1QixtREFBbUQ7UUFDbkQsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFO1lBQ3pELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxDQUFDLENBQ1AsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEdBQUc7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssR0FBRztnQkFDcEMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUc7Z0JBQ3hDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxHQUFHO2dCQUMxQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztnQkFDeEMsSUFBSSxDQUFDLEdBQUc7Z0JBQ1IsSUFBSSxDQUFDLFFBQVE7Z0JBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FDZixDQUFDO1NBQ0g7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBUTtRQUNuQixJQUFJO1lBQ0YsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO2dCQUNuRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDNUQ7cUJBQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO29CQUNyQixJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM1RDtxQkFBTTtvQkFDTCxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDOUQ7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDMUI7WUFDRCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDNUI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJO1lBQ0YsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxHQUFHLENBQUM7UUFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQzdDLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO1FBRS9GLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzlHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGFBQWE7UUFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBQ0QsY0FBYztRQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQzdGLFFBQVEsQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELG1EQUFtRDtRQUNyRCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMxRyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxTQUFpQjtRQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXpDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7UUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUUxQixNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEQsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRWxELE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDckQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7WUFDeEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFRLG9DQUFvQztTQUNoRjtJQUNILENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEMsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsY0FBYyxDQUFDLFVBQWtCO1FBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLDRCQUE0QjtRQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyx1QkFBdUI7UUFDbEQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN4QyxXQUFXLElBQUksWUFBWSxDQUFDO1lBQzVCLElBQUk7Z0JBQ0YsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsRUFBd0IsQ0FBQztnQkFDL0csSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztvQkFDeEQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGFBQWEsRUFBRTt3QkFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQzt3QkFDbEQsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDeEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3lCQUN2Qjt3QkFDRCxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQzNCO3lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxXQUFXLEVBQUU7d0JBQzFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztxQkFDdEI7aUJBQ0Y7YUFDRjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMzQjtZQUNELElBQUksV0FBVyxJQUFJLE9BQU8sRUFBRTtnQkFDMUIsMkRBQTJEO2dCQUMzRCxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxhQUFhO0lBQ2IsNERBQTREO0lBQzVELDJCQUEyQjtJQUMzQixrREFBa0Q7SUFDbEQsb0JBQW9CO0lBQ3BCLDBEQUEwRDtJQUMxRCxVQUFVO0lBQ1YsTUFBTTtJQUNOLElBQUk7SUFDSix3QkFBd0IsQ0FBQyxJQUFTO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUVELHNCQUFzQjtJQUN0Qiw4QkFBOEI7SUFDOUIsOEJBQThCO0lBQzlCLCtDQUErQztJQUMvQywyQ0FBMkM7SUFDM0MsMEJBQTBCO0lBQzFCLFFBQVE7SUFDUiw4Q0FBOEM7SUFDOUMsNkJBQTZCO0lBQzdCLDBDQUEwQztJQUMxQywwQkFBMEI7SUFDMUIsUUFBUTtJQUNSLFFBQVE7SUFDUixxQkFBcUI7SUFDckIsSUFBSTtJQUVKLGFBQWEsQ0FBQyxJQUFTO1FBQ3JCLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFO1lBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxvQkFBb0I7SUFDcEIsMEJBQTBCO0lBQzFCLHFCQUFxQjtJQUNyQixxQkFBcUI7SUFDckIsOEJBQThCO0lBQzlCLCtCQUErQjtJQUMvQixnRkFBZ0Y7SUFDaEYsTUFBTTtJQUNOLG1GQUFtRjtJQUNuRix1QkFBdUI7SUFDdkIsT0FBTztJQUNQLElBQUk7SUFFSixZQUFZO1FBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2xDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQixxQ0FBcUM7WUFDckMsMENBQTBDO1lBQzFDLHFLQUFxSztZQUNySyxzQkFBc0I7WUFDdEIsK0JBQStCO1lBQy9CLGFBQWE7WUFDYixnQ0FBZ0M7WUFDaEMsTUFBTTtZQUNOLE1BQU07WUFDTixPQUFPO1NBQ1I7UUFDRCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQy9CLElBQUksZUFBZSxFQUFFO2dCQUNuQixDQUFDLENBQUMsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDM0M7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDakUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ2hELENBQUMsQ0FBQyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNsRCxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLFNBQVMsRUFBRTtvQkFDYixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDO29CQUMvQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDakMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFOzRCQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRCxDQUFDLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNsQjtpQkFDRjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ25DLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNkLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUMxQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGVBQWU7UUFDYixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFnQixDQUFDO1FBQ3BFLElBQUksRUFBRSxFQUFFLFlBQVksR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBWSxDQUFDLENBQVM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLE9BQU8sR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFBO1lBQ3JMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1NBQ3BGO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtZQUNuQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDcEgsSUFBSSxlQUFlLEdBQUcsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO21CQUN6SCxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDckosSUFBSSxlQUFlLEVBQUUsRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFBO2FBQ2hDO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pDO0lBRUgsQ0FBQztJQUNELG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWE7UUFDeEIsSUFBSSxPQUFPLEdBQUc7WUFDWixRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDdEIsU0FBUyxFQUFFLEVBQUU7WUFDYixTQUFTLEVBQUUsRUFBRTtZQUNiLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN0RCxTQUFTLEVBQUUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQ3RFLFlBQVksRUFBRSxRQUFRLEVBQUUsWUFBWSxJQUFJLElBQUk7U0FDN0MsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO1lBQ2hGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWSxDQUFDLFdBQWdCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVJLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFhO1FBQy9CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2hILE9BQU8sWUFBWSxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQVc7UUFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUM5QyxPQUFPLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFLLE1BQU0sSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsRUFBRSxTQUFTLElBQUksV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsU0FBUyxJQUFJLEVBQUUsSUFBSSxXQUFXLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDbEksQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFXO1FBQ2hCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDOUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSyxNQUFNLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtJQUNuQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUUsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QztJQUNILENBQUM7O21IQTVpRVUscUJBQXFCO3VHQUFyQixxQkFBcUIscXFCQzNCbEMsc3B2Q0Fpb0JNOzRGRHRtQk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjsyT0FLcEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFrQkcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FsbCwgRGV2aWNlIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9leHRlbnNpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi8uLi8uLi9rZXlwYWQnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pbmNvbWVpbmctY2FsbC1zb2NrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2lwLWFkZHJlc3Muc2VydmljZSc7XHJcbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XHJcbiAgY2FsbFNpZDogc3RyaW5nO1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2FsbFN0YXR1c1Jlc3BvbnNlIHtcclxuICBjYWxsRGV0YWlsczogQ2FsbERldGFpbHM7XHJcbiAgcmVzcG9uc2U6IHN0cmluZztcclxuICBlcnJvclR5cGU6IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbn1cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FsbC1wcm9ncmVzcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgY2FsbERhdGE6IGFueTtcclxuICBASW5wdXQoKSBzZWxlY3RlZENhbGxlcklkOiBhbnk7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7IC8vXHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhbGxlcklkTGlzdDogYW55ID0gW107XHJcbiAgQElucHV0KCkgbmV3Q2FsbENvbmZlcmVuY2U6IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIG1pc3NDYWxsSW5mbzogYW55ID0ge307XHJcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcclxuICBASW5wdXQoKSBjYWxsQWN0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgY29uZmVyZW5jZUNhbGxJbmZvOiBhbnk7XHJcbiAgdXNlcklkOiBhbnk7XHJcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxzTmV3SW5mbzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsvL1xyXG4gIEBPdXRwdXQoKSBtaW5pbWlzZUV2ZW50OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgZGV2aWNlPzogRGV2aWNlO1xyXG4gIGNhbGwhOiBDYWxsIHwgYW55O1xyXG4gIHNob3dSaW5nQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXI6IHN0cmluZyA9ICcwMDowMCc7XHJcbiAgaW50ZXJ2YWxJZDogYW55O1xyXG4gIHNob3dLZXlwYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XHJcbiAgY2FsbElucHV0OiBzdHJpbmcgPSAnJztcclxuICBpc011dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwZW5kaW5nTXV0ZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlOyBcclxuICBpbnRlbmRlZE11dGVTdGF0ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG4gIGRpc2JhbGVFbmRDYWxsQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93Q2xlYXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NvbGxvcHMgPSBmYWxzZTtcclxuICBjdXJyZW50Q2FsbDogYW55O1xyXG4gIGlzQ29uZmVyZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzT3V0Z29pbmdDYWxsOiBib29sZWFuID0gdHJ1ZTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGlzTG9hZGVyc2hvd246IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgZW5kSW5jb21pbmdDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLy8gUmVjb3JkaW5nIHZhcmlhYmxlc1xyXG4gIGNhbGxTaWQ6IGFueTtcclxuICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUGF1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgdGltZUVsYXBzZWQgPSAwOyAvLyBpbiBzZWNvbmRzXHJcbiAgcmVjb3JkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluY29taW5nQ2FsbFNpZDogYW55O1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZyA9ICdyaW5naW5nJzsgICAgLy9cclxuICBpbmNvbWluZ1JlY29yZENhbGw/OiBhbnk7XHJcbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGw6IGFueTtcclxuICBzaG93Q29udGFjdHNQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQWRkUmVtb3ZlUGFydGljaXBhbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAvL1xyXG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7ICAgLy9cclxuICBoZWxkQ2FsbD86IENhbGw7ICAvL1xyXG4gIGlzQ2FsbE9uSG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xyXG4gIGN1cnJlbnRDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBjb25mZXJlbmNlSWQ6IGFueTtcclxuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcclxuICBpc0NsaWNrRXhwYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDYWxsSW5Qcm9ncmVzcyE6IGJvb2xlYW47XHJcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XHJcbiAgaXNDb25mZXJlbmNlQ2FsbEhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFVzZXJJbmZvOiBhbnk7XHJcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuICBmaWx0ZXJlZExpc3Q6IGFueSA9IFtdO1xyXG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgc2hvd0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUmluZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRGlyZWN0Q2FsbE9wdGlvblNob3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaWFsQWxlcnQgPSB7XHJcbiAgICBtc2c6ICcnLFxyXG4gICAgc2hvdzogZmFsc2VcclxuICB9XHJcbiAgbGVmdFBhcnRpY2lwZW50OiBhbnkgPSB7fTtcclxuICBjb25mZXJlbmNlQ2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDb25uZWN0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaG9zdG51bWJlcjogYW55O1xyXG4gIGlzTmV3QWRkZWRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGV2aWNlTnVtYmVyTGlzdDogYW55ID0gW107XHJcbiAgb3VyTnVtYmVySW5mbzogYW55ID0ge307XHJcbiAgY3VycmVudENvbmZlcmVuY2VDYWxsOiBhbnkgPSB7fTtcclxuICBpc1JlYXNvbkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0FsbEFjY2VwdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGVhdmVSZWFzb246IHN0cmluZyA9ICcnO1xyXG4gIC8vIDI0LWhvdXIgdGltZSBwaWNrZXJcclxuICBsZWF2ZUhvdXI6IHN0cmluZyA9ICcnO1xyXG4gIGxlYXZlTWludXRlOiBzdHJpbmcgPSAnJztcclxuICBob3Vyczogc3RyaW5nW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpO1xyXG4gIG1pbnV0ZXM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNjAgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKTtcclxuICBzaG93SG91ckRyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd01pbnV0ZURyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRDb25mOiBhbnk7XHJcbiAgc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwZW5kaW5nQ2FsbERhdGE6IGFueSA9IG51bGw7XHJcbiAgY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgc2hvdzogZmFsc2UsXHJcbiAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICBudW1iZXI6ICcnLFxyXG4gICAgZGlzcGxheU51bTogJydcclxuICB9O1xyXG4gIGlzVW5ob2xkQ29uZmVyZW5jZUNhbGw6IGFueTsgIC8vXHJcbiAgY29uZmVyZW5jZUNhbGxOdWxsQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgYWxsQ29uUGFydGljaXBlbnRMaXN0OiBhbnkgPSB7fTtcclxuICBjb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0OiBhbnk7XHJcbiAgcHJpdmF0ZSBhY2NlcHRlZENhbGxMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGlzSG9sZEJ0bkRpc2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBDMkNvbmZvTGlzdDogYW55ID0ge307XHJcbiAgcHJpdmF0ZSBsYXN0QWN0aXZlQ29uZmVyZW5jZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBlbmRpbmdBdXRvVW5ob2xkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRDb25mTmFtZTogYW55O1xyXG4gIHBlbmRpbmdNdXRlUGFydGljaXBhbnRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuICBpbnRlbmRlZE11dGVTdGF0ZXM6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xyXG4gIHNob3dOZXdDYWxsTG9hZGVyOmJvb2xlYW4gPSBmYWxzZTtcclxuICBuZXdDYWxsTG9hZGVyRGF0YTogeyBuYW1lOiBzdHJpbmc7IHBob25lOiBzdHJpbmcsIGltZz86IHN0cmluZyB9ID0geyBuYW1lOiAnJywgcGhvbmU6ICcnLCBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyB9O1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIHR3aWxpb1NlcnZpY2U6IFR3aWxpb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGlwU2VydmljZTogSXBBZGRyZXNzU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2U6IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGluY29taW5nIGNhbGxzIGZyb20gVHdpbGlvU2VydmljZVxyXG4gICAgIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCkge1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBpbmNvbWluZyBjYWxsczonLCBlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICBcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnVzZXJJZCkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10pIHtcclxuICAgICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5pc0luY29taW5nQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAuLi5jaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICAgIGlkOiAnMTI1JyxcclxuICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgIHBob25lOiBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8ucGhvbmUsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiAnMTIxJyxcclxuICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoIHx8IGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LnByZXZpb3VzVmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZU51bWJlckxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IGkgPT0gMCA/IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0uY29uZmVyZW5jZUlkIDogdGhpcy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICBsZXQgb3VyTnVtYmVySW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nTXV0ZVVwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTXV0ZSA9ICFvdXJOdW1iZXJJbmZvPy5pc0hvbGQgPyBvdXJOdW1iZXJJbmZvPy5pc011dGUgOiB0aGlzLmlzTXV0ZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAob3VyTnVtYmVySW5mbz8uaXNNdXRlID09PSB0aGlzLmludGVuZGVkTXV0ZVN0YXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNdXRlID0gb3VyTnVtYmVySW5mbz8uaXNNdXRlO1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdNdXRlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGUgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy90aGlzLmlzTXV0ZSA9ICFvdXJOdW1iZXJJbmZvPy5pc0hvbGQgPyBvdXJOdW1iZXJJbmZvPy5pc011dGUgOiB0aGlzLmlzTXV0ZTtcclxuICAgICAgICAgIGxldCBjdXJyZW50Y2FsbFBhcnRpY2lwYW50TGlzdElEID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXMpPT4gcmVzLmNvbmZlcmVuY2VJZCA9PSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLmNvbmZlcmVuY2VJZCkubWFwKChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgbGV0IHVwZGF0ZWRMaXN0ID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGNvbmY6IGFueSkgPT4gY29uZi5jb25mZXJlbmNlSWQgPT09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuZmxhdE1hcCgoY29uZjogYW55KSA9PiBjb25mLnBhcnRpY2lwYW50cy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCkpO1xyXG4gICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5wYXJ0aWNpcGFudHMubWFwKChyZXM6YW55KSA9PiByZXMuaWQpO1xyXG4gICAgICAgICAgY3VycmVudGNhbGxQYXJ0aWNpcGFudExpc3RJRC5mb3JFYWNoKChwYXJ0aWNpcGFudElkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZighdXBkYXRlZExpc3QuaW5jbHVkZXMocGFydGljaXBhbnRJZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzSW5mbzphbnkpID0+IHJlc0luZm8/LnBhcnRpY2lwYW50SWQgIT09IHBhcnRpY2lwYW50SWQgfHwgKHJlc0luZm8/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0luZm8/LmlzQWNjZXB0Q2FsbCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVkUGFydGljaXBhbnRMaXN0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0/LnBhcnRpY2lwYW50cyk7XHJcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZvckVhY2goYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcz8uaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0bnVtYmVyID0gcmVzO1xyXG4gICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgaWYob3VyTnVtYmVySW5mbz8uaXNDb25mZXJlbmNlIHx8ICh0aGlzLmhvc3RudW1iZXI/LmlzQ29uZmVyZW5jZSAmJiB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCA9PSByZXM/LmNvbmZlcmVuY2VJZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGFjdDogYW55ID0ge31cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhY3RzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZCgocmVzRGF0YSkgPT5cclxuICAgICAgICAgICAgICAgICAgICByZXNEYXRhPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyID09IChyZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8pXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbT8uaWQgPT0gcmVzPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiAhcmVzLmlzTGVmdCAmJiByZXM/LnN0YXR1cyAhPSAnbm8tYW5zd2VyJyAmJiByZXM/LnN0YXR1cyAhPSAnY2FuY2VsZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tTmFtZTogdGhpcy5nZXROYW1lKHJlcz8uZnJvbSkgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWc6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCA+IDEgPyBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTm90aWZpY2F0aW9uOiBjYWxsSW5mbz8uX2lzTm90aWZpY2F0aW9uICYmICF0aGlzLmdldFN0YXR1cyhyZXMpICYmIHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogcmVzPy5pc0NvbmZlcmVuY2UgfHwgdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdGhpcy5nZXRTdGF0dXMocmVzKSA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcz8uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlcz8ubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnRpbWVyIHx8IHRoaXMudGltZXIgPT0gJzAwOjAwJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIob3VyTnVtYmVySW5mbz8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSAmJiAocmVzPy5pc0xlZnQgfHwgcmVzPy5zdGF0dXMgPT0gJ25vLWFuc3dlcicgfHwgcmVzPy5zdGF0dXMgPT0gJ2NhbmNlbGVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdPy5pZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZClcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHRoaXMuY3VycmVudENhbGw/LmpvaW5lZEF0KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSAmJiAhcmVzPy5pc0xlZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydGljaXBhbnRJZCA9IHJlcy5pZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSBtdXRlIHVwZGF0ZSBpcyBwZW5kaW5nIGZvciB0aGlzIHBhcnRpY2lwYW50XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNdXRlUGVuZGluZyA9IHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuaGFzKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVuZGVkTXV0ZSA9IHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmdldChwYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZE11dGU6IGJvb2xlYW47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTXV0ZVBlbmRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgYWxyZWFkeSBjb25maXJtZWQgb3VyIGNoYW5nZSwgYWNjZXB0IGl0IGFuZCBjbGVhciBwZW5kaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmlzTXV0ZSA9PT0gaW50ZW5kZWRNdXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRNdXRlID0gcmVzLmlzTXV0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5kZWxldGUocGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmRlbGV0ZShwYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwga2VlcCB0aGUgY3VycmVudCBsb2NhbCB2YWx1ZSAoaWdub3JlIHRoZSBzdGFsZSBzZXJ2ZXIgc3RhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRNdXRlID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdLmlzTXV0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm8gcGVuZGluZyBtdXRlIOKAkyB0cnVzdCB0aGUgc2VydmVyIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkTXV0ZSA9IHJlcy5pc011dGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvTmFtZTogIHRoaXMuZ2V0TmFtZShyZXM/LnRvKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGltZzogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LnRvSW1hZ2UgOiByZXM/LmZyb21JbWFnZSB8fCBjb250YWN0Py5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0hvbGQ6IHJlcz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlSG9sZDogdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoID4gMSA/IG91ck51bWJlckluZm8/LmlzSG9sZCA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IGNhbGxJbmZvPy5faXNOb3RpZmljYXRpb24gJiYgIXRoaXMuZ2V0U3RhdHVzKHJlcykgJiYgcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IHVwZGF0ZWRNdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlID8gcmVzLmlzQ29uZmVyZW5jZSA6IHRoaXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNBY2NlcHRDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdGhpcy5nZXRTdGF0dXMocmVzKSA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcz8uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlcz8ubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzLmlzTGVmdCAmJiByZXM/LnN0YXR1cyAhPSAnbm8tYW5zd2VyJyAmJiByZXM/LnN0YXR1cyAhPSAnY2FuY2VsZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICBmcm9tTmFtZTogdGhpcy5nZXROYW1lKHJlcz8uZnJvbSkgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1nOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlSG9sZDogdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoID4gMSA/IG91ck51bWJlckluZm8/LmlzSG9sZCA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTm90aWZpY2F0aW9uOiBjYWxsSW5mbz8uX2lzTm90aWZpY2F0aW9uICYmICF0aGlzLmdldFN0YXR1cyhyZXMpICYmIHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTXV0ZTogcmVzPy5pc011dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlID8gcmVzLmlzQ29uZmVyZW5jZSA6IHRoaXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcclxuICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXM/Lm5hbWUgfHwgcmVzPy5mcm9tTmFtZSB8fCByZXM/LnRvTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudGltZXIgPSAnMDA6MDAnO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIocmVzPy5qb2luZWRBdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxOdWxsQ291bnQgPSAwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYodGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCA+IDUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FsbCBlbmQgaW4gMjk5JylcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzUmluZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHt9XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNSaW5naW5nKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gUmVtb3ZlIHBhcnRpY2lwYW50IGRhdGEgZm9yIGNvbmZlcmVuY2VzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYWN0aXZlIGxpc3RcclxuICAgICAgICBjb25zdCBhY3RpdmVDb25mZXJlbmNlSWRzID0gbmV3IFNldCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmNvbmZlcmVuY2VJZCkpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZklkIG9mIE9iamVjdC5rZXlzKHRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0KSkge1xyXG4gICAgICAgICAgaWYgKCFhY3RpdmVDb25mZXJlbmNlSWRzLmhhcyhjb25mSWQpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFtjb25mSWRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsaWRWYWx1ZXMgPSBuZXcgU2V0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmxhdE1hcCgoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudHMubWFwKCh2YWw6IGFueSkgPT4gdmFsPy5pZCkpKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiB2YWxpZFZhbHVlcy5oYXMoaXRlbT8ucGFydGljaXBhbnRJZCkpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Q2FsbDphbnkgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gaXRlbT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudENhbGwucHVzaChwYXJ0aWNpcGFudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIERldGVjdCBkaXNjb25uZWN0IHZzLiBob2xkIHRyYW5zaXRpb24gZXhhY3RseSBvbmNlIHBlciBldmVudC5cclxuICAgICAgICAvLyBTYW1lIHBhcnRpY2lwYW50IGZpbHRlciBhcyBnZXRDdXJyZW50Q2FsbEluZm8oKSAod2l0aG91dCAhaXNIb2xkKSB0byBzdGF5IGNvbnNpc3RlbnQuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhY3VycmVudENhbGxbMF0/LmlzSG9sZCkge1xyXG4gICAgICAgICAgdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgdGhpcy5wZW5kaW5nQXV0b1VuaG9sZCA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkICYmICF0aGlzLnBlbmRpbmdBdXRvVW5ob2xkKSB7XHJcbiAgICAgICAgICBjb25zdCBsYXN0Q29uZiA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoYzogYW55KSA9PiBjLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQpO1xyXG4gICAgICAgICAgY29uc3Qgb3VyUGFydGljaXBhbnRJbkxhc3RDb25mID0gbGFzdENvbmY/LnBhcnRpY2lwYW50cz8uZmluZCgocDogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwPy5mcm9tKSAmJiBwPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHA/LmNsaWVudCkgfHxcclxuICAgICAgICAgICAgICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocD8udG8pICYmIHA/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcD8uY2xpZW50KSkgJiYgIXA/LmlzTGVmdFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIC8vIENvbmZlcmVuY2UgZ29uZSBPUiBvdXIgcGFydGljaXBhbnQgbm90IGhlbGQg4oaSIHRoZSBhY3RpdmUgY2FsbCBkaXNjb25uZWN0ZWQg4oaSIHF1ZXVlIGF1dG8tdW5ob2xkXHJcbiAgICAgICAgICBpZiAoIWxhc3RDb25mIHx8ICFvdXJQYXJ0aWNpcGFudEluTGFzdENvbmY/LmlzSG9sZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdBdXRvVW5ob2xkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHMubGVuZ3RoID09IDIgJiYgdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1swXT8uaWQpIHtcclxuICAgICAgICAvLyAgIHRoaXMuY3VycmVudENhbGwgPSB7Li4udGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+ICFyZXM/LmlzQ29uZmVyZW5jZUhvbGQgJiYgKChyZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcmVzPy5jbGllbnQgJiYgIXRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXM/LmZyb20pKSB8fCAocmVzPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIHJlcz8uY2xpZW50ICYmICF0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzPy50bykpIHx8ICFyZXM/LmNsaWVudCkpfTtcclxuICAgICAgICAvLyAgIHRoaXMuY3VycmVudENhbGxbJ2lzQWNjZXB0Q2FsbCddPSB0cnVlO1xyXG4gICAgICAgIC8vICAgaWYodGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0WzBdXHJcbiAgICAgICAgLy8gICAgIHRoaXMuY3VycmVudENhbGxbJ2lzQWNjZXB0Q2FsbCddPSB0cnVlO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cy5sZW5ndGggPT0gMiAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCkge1xyXG4gICAgICAgICAgY29uc3Qgb3duTnVtYmVycyA9IHRoaXMuZGV2aWNlTnVtYmVyTGlzdCAmJiB0aGlzLmRldmljZU51bWJlckxpc3QubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZGV2aWNlTnVtYmVyTGlzdFxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICBjb25zdCBjYWxsZXJOdW1iZXIgPSB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcz8uaXNDb25mZXJlbmNlSG9sZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG93bk51bWJlcnMpIHtcclxuICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBsb2dpYyDigJMgd29ya3Mgd2hlbiB0aGUgY2FsbGVy4oCRSUQgbGlzdCBpcyBsb2FkZWRcclxuICAgICAgICAgICAgICByZXR1cm4gKHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhb3duTnVtYmVycy5pbmNsdWRlcyhyZXM/LmZyb20pKSB8fFxyXG4gICAgICAgICAgICAgICAgKHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhb3duTnVtYmVycy5pbmNsdWRlcyhyZXM/LnRvKSkgfHxcclxuICAgICAgICAgICAgICAgICFyZXM/LmNsaWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBTYWZlIGZhbGxiYWNrOiBleGNsdWRlIHRoZSBwYXJ0aWNpcGFudCB3aG9zZSBudW1iZXIgbWF0Y2hlcyB0aGUgY2FsbGVyIElEIHdlIHVzZWRcclxuICAgICAgICAgICAgICBjb25zdCBpc093biA9IChyZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcmVzPy5mcm9tID09PSBjYWxsZXJOdW1iZXIpIHx8XHJcbiAgICAgICAgICAgICAgICAocmVzPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIHJlcz8udG8gPT09IGNhbGxlck51bWJlcik7XHJcbiAgICAgICAgICAgICAgcmV0dXJuICFpc093bjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7IC4uLnNlbGVjdGVkLCBpc0FjY2VwdENhbGw6IHRydWUgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgIGVsc2UgaWYgKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHM/Lmxlbmd0aCA+IDIgJiYgdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50c1sxXT8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+ICFyZXM/LmlzQ29uZmVyZW5jZUhvbGQpO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZih0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCl7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgoY2FsbEluZm86YW55KT0+IGNhbGxJbmZvPy5pZCA9PSB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCk7XHJcbiAgICAgICAgICBpZih0aGlzLmN1cnJlbnRDYWxsPy5jbGllbnQgJiYgdGhpcy5jdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsWydjbGllbnQnXT0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxbJ2lzQWNjZXB0Q2FsbCddPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRDYWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYoIXRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsICYmdGhpcy5jdXJyZW50Q2FsbCAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmlkID09IHRoaXMuY3VycmVudENhbGw/LmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhdGhpcy5pc05ld0FkZGVkQ2FsbCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgICAgICAgaWYgKCFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pZCAmJiB0aGlzLnBlbmRpbmdBdXRvVW5ob2xkKSB7XHJcbiAgICAgICAgICAgIC8vIFNlYXJjaCBBTEwgY29uZmVyZW5jZXMgZXhjZXB0IHRoZSBvbmUgdGhhdCBqdXN0IGRpc2Nvbm5lY3RlZC5cclxuICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIHNpbmdsZS1jb25mZXJlbmNlIGhvbGQgKGluY2x1ZGluZyBicmllZiBpc0xlZnQgcmFjZSBjb25kaXRpb25zKVxyXG4gICAgICAgICAgICAvLyBmcm9tIGV2ZXIgdHJpZ2dlcmluZyBhbiB1bmhvbGQg4oCUIHdlIG9ubHkgdW5ob2xkIGEgRElGRkVSRU5UIGhlbGQgY29uZmVyZW5jZS5cclxuICAgICAgICAgICAgbGV0IGhvbGRDYWxsSW5mbzogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb25mIG9mIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QpIHtcclxuICAgICAgICAgICAgICBpZiAoY29uZi5jb25mZXJlbmNlSWQgPT0gdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICBob2xkQ2FsbEluZm8gPSBjb25mLnBhcnRpY2lwYW50cy5maW5kKChjYWxsSW5mbzogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjYWxsSW5mbz8uZnJvbSkgJiYgY2FsbEluZm8/LmNsaWVudClcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoY2FsbEluZm8/LnRvKSAmJiBjYWxsSW5mbz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFjYWxsSW5mbz8uaXNMZWZ0ICYmIGNhbGxJbmZvPy5pc0hvbGQpO1xyXG4gICAgICAgICAgICAgIGlmIChob2xkQ2FsbEluZm8pIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChob2xkQ2FsbEluZm8/LmlkICYmICF0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwpIHtcclxuICAgICAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbaG9sZENhbGxJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IGhvbGRDYWxsSW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtdXRlOiBob2xkQ2FsbEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMzg3JywgaG9sZEluZm8pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IGhvbGRDYWxsSW5mbz8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNVbmhvbGRDb25mZXJlbmNlQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMucGVuZGluZ0F1dG9VbmhvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlckluZm8/LnBhcnRpY2lwYW50SWQpIHtcclxuICAgICAgICAgIGxldCBzZWxlY3RlZFVzZXIgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmlkID09IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRVc2VyKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVXNlci5Jc1VzZXJJbmZvU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKHNlbGVjdGVkVXNlci5idXNpbmVzc051bWJlciA9PSB0cnVlICYmICFzZWxlY3RlZFVzZXIudXNlckluZm9JZCkge1xyXG4gICAgICAgICAgICAgIGlmKCF0aGlzLkMyQ29uZm9MaXN0W3NlbGVjdGVkVXNlci5wYXJ0aWNpcGFudElkXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihzZWxlY3RlZFVzZXIucGFydGljaXBhbnRJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc0luZm86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbT8ucGFydGljaXBhbnRJZCA9PSBzZWxlY3RlZFVzZXI/LmlkKSBcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0gdGhpcy5tYXBVc2VySW5mbyh0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0sIHJlc0luZm8/LmMyY0luZm9ybWF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkMyQ29uZm9MaXN0W3NlbGVjdGVkVXNlci5wYXJ0aWNpcGFudElkXSA9IHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XTtcclxuICAgICAgICAgICAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHVzZXIgaW5mbzonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHRoaXMuQzJDb25mb0xpc3Rbc2VsZWN0ZWRVc2VyLnBhcnRpY2lwYW50SWRdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBzZWxlY3RlZFVzZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpbmNvbWluZ0NhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgaWYgKGluY29taW5nQ2FsbD8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGluY29taW5nQ2FsbDtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB7fTtcclxuICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgcmVzSW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gISFpdGVtPy5idXNpbmVzc051bWJlcik7XHJcbiAgICAgICAgICBpZiAocmVzSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF0uSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmlzQWxsQWNjZXB0ZWQgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5ldmVyeSgoY2FsbDogYW55KSA9PiBjYWxsPy5pc0FjY2VwdENhbGwpXHJcbiAgICAgICAgY29uc3QgdW5pcXVlTGlzdCA9IFtcclxuICAgICAgICAgIC4uLm5ldyBNYXAodGhpcy5jdXJyZW50Q2FsbExpc3QubWFwKGl0ZW0gPT4gW2l0ZW0uY29uZmVyZW5jZUlkLCBpdGVtXSkpLnZhbHVlcygpXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QgPSB1bmlxdWVMaXN0Lm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgY29uZmVyZW5jZU5hbWU6IGBDb25mZXJlbmNlICR7aW5kZXggKyAxfWBcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCA9IDA7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICBpZih0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50ID4gNSl7XHJcbiAgICAgICAgY29uc29sZS5sb2coJzQxMScpXHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5jYWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCArPTE7XHJcbiAgICAgICAgLy8gdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxBY3Rpb24nXT8uY3VycmVudFZhbHVlICYmIHRoaXMuY2FsbEFjdGlvbj8udHlwZSA9PSAncmVKb2luJykge1xyXG4gICAgICB0aGlzLmRldmljZU51bWJlckxpc3QgPSB0aGlzLmNhbGxlcklkTGlzdC5tYXAoKHJlczogYW55KSA9PiByZXMubnVtYmVyKTtcclxuICAgICAgbGV0IGRhdGEgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uY29uZmVyZW5jZUlkID09IHRoaXMuY2FsbEFjdGlvbj8uY29uZmVyZW5jZUlkKT8ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT4gcmVzRGF0YT8uaG9zdCk7XHJcbiAgICAgIGlmKGRhdGE/LmlzTGVmdCB8fCAhZGF0YSkge1xyXG4gICAgICAgIHRoaXMucmVqb2luSG9zdCh0aGlzLmNhbGxBY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snbmV3Q2FsbENvbmZlcmVuY2UnXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuQ2FsbFRvVW5zYXZlZE51bWJlcih0aGlzLm5ld0NhbGxDb25mZXJlbmNlPy5udW1iZXIsIHRydWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWpvaW5Ib3N0KGNhbGxJbmZvOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2N1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMzg3JywgaG9sZEluZm8pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlam9pblBhcnRpY2lwZW50SW5mbyA9IGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAvLyAx77iP4oOjIEdldCBuZXcgdG9rZW4gZm9yIHNhbWUgY29uZmVyZW5jZVxyXG4gICAgICBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgIC8vIDLvuI/ig6MgUmVjb25uZWN0IGRldmljZVxyXG4gICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgICAgY29kZWNQcmVmZXJlbmNlczogWydvcHVzJywgJ3BjbXUnXSxcclxuICAgICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0b2tlbkRhdGEudG9rZW4udmFsdWUsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy5kZXZpY2UuY29ubmVjdCh7XHJcbiAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICBGcm9tOiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZnJvbSxcclxuICAgICAgICAgIFRvOiByZWpvaW5QYXJ0aWNpcGVudEluZm8udG8sXHJcbiAgICAgICAgICBFbnY6IGVudmlyb25tZW50LmFiYixcclxuICAgICAgICAgIFRva2VuOiB0b2tlbkRhdGEudG9rZW4uaWQsXHJcbiAgICAgICAgICBFeHQ6IHJlam9pblBhcnRpY2lwZW50SW5mby5leHROdW0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlam9pblBhcnRpY2lwZW50SW5mbz8uY29uZmVyZW5jZUlkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBydGNDb25zdHJhaW50czogeyBhdWRpbzogeyBkZXZpY2VJZDogJ2RlZmF1bHQnIH0gfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbCA9IHRoaXMuY2FsbDtcclxuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGFkZENsaWVudFBhcnRpY2lwYW50UmVzID0gdGhpcy5hZGRDbGllbnRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgZnJvbTogcmVqb2luUGFydGljaXBlbnRJbmZvLmZyb20sXHJcbiAgICAgICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcmVqb2luUGFydGljaXBlbnRJbmZvPy50byxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlam9pblBhcnRpY2lwZW50SW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgY2xpZW50U2lkOiB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0NhbGxTaWQnXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gYWRkQ2xpZW50UGFydGljaXBhbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMDApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUmVqb2luIGZhaWxlZCcsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hcFVzZXJJbmZvKHBhcnRpY2lwYW50SW5mbzogYW55LCBjYWxsZXJJbmZvOiBhbnkpIHtcclxuICAgIHBhcnRpY2lwYW50SW5mb1snZW1haWwnXSA9IGNhbGxlckluZm8uZW1haWw7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snbmFtZSddID0gY2FsbGVySW5mby5uYW1lO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ2ltYWdlJ10gPSBjYWxsZXJJbmZvLmltYWdlO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ2V4dGVuc2lvbiddID0gY2FsbGVySW5mby5leHRlbnNpb247XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1sndXNlckluZm9JZCddID0gY2FsbGVySW5mby5pZDtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydtZXNzYWdlJ10gPSBjYWxsZXJJbmZvLm1lc3NhZ2U7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mbyBbJ25vdGUnXSA9IGNhbGxlckluZm8ubm90ZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydudW1iZXInXSA9IGNhbGxlckluZm8ubnVtYmVyO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ3BvaW50TmFtZSddID0gY2FsbGVySW5mby5wb2ludE5hbWU7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snc29mdHBob25lVHdpbGlvQXV0aElkJ10gPSBjYWxsZXJJbmZvLnNvZnRwaG9uZVR3aWxpb0F1dGhJZDtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzb3VyY2VOYW1lJ10gPSBjYWxsZXJJbmZvLnNvdXJjZU5hbWU7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snc3ViamVjdCddID0gY2FsbGVySW5mby5zdWJqZWN0O1xyXG4gICAgICByZXR1cm4gey4uLnBhcnRpY2lwYW50SW5mb307XHJcbiAgfVxyXG5cclxuICB1cGRhdGVkUGFydGljaXBhbnRMaXN0KHBhcnRpY2lwYW50OmFueSkge1xyXG4gICAgaWYocGFydGljaXBhbnQ/Lmxlbmd0aCl7XHJcbiAgICAgIHRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0W3BhcnRpY2lwYW50WzBdPy5jb25mZXJlbmNlSWRdID0gcGFydGljaXBhbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkZWxldGUgdGhpcy5hbGxDb25QYXJ0aWNpcGVudExpc3RbcGFydGljaXBhbnRbMF0/LmNvbmZlcmVuY2VJZF07XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgJiYgISF0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdD8uW3RoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdF0/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnBhcnRpY2lwYW50TGlzdEluZG8odGhpcy5hbGxDb25QYXJ0aWNpcGVudExpc3RbdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0XSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICB0aGlzLnBhcnRpY2lwYW50TGlzdEluZG8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHBhcnRpY2lwYW50TGlzdEluZG8ocGFydGljaXBhbnRzPzogYW55KSB7XHJcbiAgICBpZiAoIXBhcnRpY2lwYW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLmFsbFBhcnRpY2lwZW50TGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHBhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHA6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZyb21OYW1lID0gYXdhaXQgdGhpcy5nZXROYW1lKHAuZnJvbSk7XHJcbiAgICAgICAgY29uc3QgdG9OYW1lID0gYXdhaXQgdGhpcy5nZXROYW1lKHAudG8pO1xyXG4gICAgICAgIHJldHVybiB7IC4uLnAsIGZyb21OYW1lOiBmcm9tTmFtZSB8fCBwLmZyb21OYW1lLCB0b05hbWU6IHRvTmFtZSB8fCBwLnRvTmFtZSB9O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBCdWlsZCBhIGxvb2t1cCBtYXAgZnJvbSB0aGUgY3VycmVudCByZW5kZXJlZCBsaXN0IHNvIHdlIGNhbiByZXVzZSB0aGUgc2FtZVxyXG4gICAgLy8gb2JqZWN0IHJlZmVyZW5jZSBmb3IgcGFydGljaXBhbnRzIHdob3NlIGRhdGEgaGFzbid0IGNoYW5nZWQuXHJcbiAgICAvLyBBbmd1bGFyJ3MgKm5nRm9yIHVzZXMgb2JqZWN0IGlkZW50aXR5ICg9PT0pIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHJlLXJlbmRlciBhIHJvdztcclxuICAgIC8vIGtlZXBpbmcgdGhlIHNhbWUgcmVmZXJlbmNlIHByZXZlbnRzIERPTSBkZXN0cnVjdGlvbi9yZWNyZWF0aW9uIGFuZCBlbGltaW5hdGVzIGZsaWNrZXJpbmcuXHJcbiAgICBjb25zdCBleGlzdGluZ01hcCA9IG5ldyBNYXA8YW55LCBhbnk+KFxyXG4gICAgICAodGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgfHwgW10pLm1hcCgocDogYW55KSA9PiBbcC5pZCwgcF0pXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBhbnlDaGFuZ2UgPSByZXNvbHZlZC5sZW5ndGggIT09ICh0aGlzLmFsbFBhcnRpY2lwZW50TGlzdD8ubGVuZ3RoIHx8IDApO1xyXG5cclxuICAgIGNvbnN0IG1lcmdlZDogYW55W10gPSByZXNvbHZlZC5tYXAoKG5ld1A6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBleGlzdGluZyA9IGV4aXN0aW5nTWFwLmdldChuZXdQLmlkKTtcclxuICAgICAgaWYgKCFleGlzdGluZykge1xyXG4gICAgICAgIGFueUNoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIG5ld1A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGlzTXV0ZVBlbmRpbmcgPSB0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmhhcyhuZXdQLmlkKTtcclxuICAgICAgY29uc3QgaW50ZW5kZWRNdXRlID0gdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZ2V0KG5ld1AuaWQpO1xyXG4gICAgICBpZiAoaXNNdXRlUGVuZGluZyAmJiBpbnRlbmRlZE11dGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChuZXdQLmlzTXV0ZSA9PT0gaW50ZW5kZWRNdXRlKSB7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmRlbGV0ZShuZXdQLmlkKTtcclxuICAgICAgICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmRlbGV0ZShuZXdQLmlkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3UCA9IHsgLi4ubmV3UCwgaXNNdXRlOiBleGlzdGluZy5pc011dGUgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBPYmplY3Qua2V5cyhuZXdQKS5zb21lKGsgPT4gZXhpc3Rpbmdba10gIT09IG5ld1Bba10pO1xyXG4gICAgICBpZiAoY2hhbmdlZCkge1xyXG4gICAgICAgIGFueUNoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uZXhpc3RpbmcsIC4uLm5ld1AgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoYW55Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25mTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmNvbmZlcmVuY2VJZCA9PSB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QpPy5jb25mZXJlbmNlTmFtZSB8fCAnJztcclxuICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSBtZXJnZWQ7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbLi4ubWVyZ2VkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dDYWxsaW5nVG9hc3QobnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICBzaG93OiB0cnVlLFxyXG4gICAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICAgIG51bWJlcjogbnVtYmVyLFxyXG4gICAgICBkaXNwbGF5TnVtOiBudW1iZXJcclxuICAgIH07XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LnNob3cgPSBmYWxzZTtcclxuICAgIH0sIDcwMDApO1xyXG4gIH1cclxuICBnZXRTdGF0dXMocmVzOiBhbnkpIHtcclxuICAgIGlmIChyZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xyXG4gICAgICByZXR1cm4gcmVzPy5jYWxsU3RhdHVzID09IFwicGFydGljaXBhbnQtam9pblwiIHx8IHJlcz8uY2FsbFN0YXR1cyA9PSBcInBhcnRpY2lwYW50LW11dGVcIiB8fCByZXM/LmNhbGxTdGF0dXMgPT0gXCJwYXJ0aWNpcGFudC1ob2xkXCIgfHwgcmVzPy5jYWxsU3RhdHVzID09ICdjb25uZWN0ZWQnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gJ2Fuc3dlcmVkJyAmJiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRDb250YWN0c0xpc3QoKSB7XHJcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB8fCAnJztcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZWFkQ29udGFjdHModG9rZW4pLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMucGhvbmVCb29rKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzLnBob25lQm9vaztcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gcmVzLnBob25lQm9vaztcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IHJlcztcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gcmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0czonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGFkZFJlczogYW55O1xyXG4gIGFzeW5jIHN0YXJ0Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGNoYW5uZWxJZDogZW52aXJvbm1lbnQuY2hhbm5lbElkLFxyXG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgIHRvOiBjYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBmcm9tTnVtYmVyOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIHNjb3BlOiAnbG9jYWwnLFxyXG4gICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgIGZpcnN0bmFtZTogbnVsbCxcclxuICAgICAgICBsYXN0bmFtZTogbnVsbCxcclxuICAgICAgICBjb3VudHJ5Y29kZTogbnVsbCxcclxuICAgICAgICBudW1iZXI6IG51bGwsXHJcbiAgICAgICAgbnVtb3RwOiBudWxsLFxyXG4gICAgICAgIGV4dGVuc2lvbjogbnVsbCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHtcclxuICAgICAgICBidXNpbmVzc051bWJlcjogZmFsc2UsXHJcbiAgICAgICAgY2FsbFNpZDogJycsXHJcbiAgICAgICAgY2FsbFN0YXR1czogJycsXHJcbiAgICAgICAgY29uZmVyZW5jZUlkOiAnJyxcclxuICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nLWNhbGwnLFxyXG4gICAgICAgIGZvcndhcmRlZFRvOiAnJyxcclxuICAgICAgICBmcm9tOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIGlkOiAneXl1Z2doamInLFxyXG4gICAgICAgIGltZzogY2FsbERhdGEuaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICBpc0FjY2VwdENhbGw6IHRydWUsXHJcbiAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZSxcclxuICAgICAgICBpc0hvbGQ6IGZhbHNlLFxyXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgam9pbmVkQXQ6ICcnLFxyXG4gICAgICAgIG5hbWU6IGNhbGxEYXRhPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHBhcnRpY2lwYW50SWQ6ICcnLFxyXG4gICAgICAgIHBob25lOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXHJcbiAgICAgICAgcm9sZTogJ2NhbGxlZScsXHJcbiAgICAgICAgc3RhdHVzOiAnJyxcclxuICAgICAgICB0aW1lOiAnJyxcclxuICAgICAgICB0bzogY2FsbERhdGE/LnBob25lIHx8ICcnLFxyXG4gICAgICAgIHRvTmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBjYWxsRGF0YT8udXNlcklkXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaW5pdGlhdGVDYWxsKHBheWxvYWQpO1xyXG4gICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgY29uc3QgeyBpZDogY2FsbEF1dGhJZCwgcmVjb3JkQ2FsbCwgIHRva2VuRGF0YX0gPSBhd2FpdCB0aGlzLmdldENhbGxBdXRoSWQocmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkQ2FsbCA9IHJlY29yZENhbGw7IC8vIFN0b3JlIHRoZSByZWNvcmRDYWxsIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0VG9EZXZpY2UoY2FsbEF1dGhJZCwgY2FsbERhdGEsIHRva2VuRGF0YSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBhZGRDbGllbnRQYXJ0aWNpcGFudFJlcyA9IHRoaXMuYWRkQ2xpZW50UGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICBjbGllbnRTaWQ6IHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snQ2FsbFNpZCddXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlcyA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmKGlzTmV3Q29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNOZXdBZGRlZENhbGwgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVyc2hvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgaW5pdGlhbCBwYXJ0aWNpcGFudDonLCBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAxNTAwKVxyXG4gICAgICAgIC8vIFBvbGwgdGhlIHN0YXR1cyBmb3IgMzAtNDUgc2Vjb25kc1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDEpIHtcclxuICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkZXJzaG93bi5lbWl0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmlzTmV3QWRkZWRDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxici8+XCIpLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTXV0ZVVzZXIoYzogYW55KSB7XHJcbiAgICBjb25zdCBwYXJ0aWNpcGFudElkID0gYy5pZDtcclxuICAgIGNvbnN0IG5ld011dGVTdGF0ZSA9ICFjLmlzTXV0ZTtcclxuXHJcbiAgICBcclxuICAgIHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuYWRkKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuc2V0KHBhcnRpY2lwYW50SWQsIG5ld011dGVTdGF0ZSk7XHJcblxyXG4gICAgYy5pc011dGUgPSBuZXdNdXRlU3RhdGU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLm9uTXV0ZVBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW3BhcnRpY2lwYW50SWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogYy5pc0hvbGQsXHJcbiAgICAgIG11dGU6IG5ld011dGVTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy9yZW1vdmUgcGVuZGluZyBndWFyZCBhZnRlciA1IHNlY29uZHMgaWYgbm8gY29uZmlybWF0aW9uXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuaGFzKHBhcnRpY2lwYW50SWQpKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5kZWxldGUocGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MDAwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uSG9sZENhbGwoYzogYW55KSB7XHJcbiAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgaWYoKChjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy5mcm9tKSkgfHwgKGM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGM/LnRvKSkpICYmIGM/LmNsaWVudCkge1xyXG4gICAgICBsZXQgdW5Ib2xkSW5mbzogYW55ID0ge307XHJcbiAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaChhc3luYyAoY2FsbDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGNhbGw/LmNvbmZlcmVuY2VJZCA9PSBjPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICAgIGxldCBwYXJ0aWNpcGFudEluZm8gPSBjYWxsLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGlmIChwYXJ0aWNpcGFudEluZm8/LmlkICkge1xyXG4gICAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW3BhcnRpY2lwYW50SW5mbz8uaWRdLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgaG9sZDogIXBhcnRpY2lwYW50SW5mbz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgIG11dGU6IHBhcnRpY2lwYW50SW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDc4OCcsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVuSG9sZEluZm8gPSBjYWxsLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXNEYXRhPy5jbGllbnQpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0ICYmIHJlc0RhdGE/LmlzSG9sZCAhPT0gYz8uaXNIb2xkXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHVuSG9sZEluZm8/LmlkICYmIHVuSG9sZEluZm8/LmlzSG9sZCAhPSBjPy5pc0hvbGQpIHtcclxuICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbdW5Ib2xkSW5mbz8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB1bkhvbGRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiAhdW5Ib2xkSW5mbz8uaXNIb2xkLFxyXG4gICAgICAgICAgbXV0ZTogdW5Ib2xkSW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyA4MDUnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICBwYXJ0aWNpcGFudElkOiBbYy5pZF0sXHJcbiAgICAgICAgY29uZmVyZW5jZUlkOiBjPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgaG9sZDogIWMuaXNIb2xkLFxyXG4gICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gODE5JywgaG9sZEluZm8pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgIGMuaXNIb2xkID0gIWMuaXNIb2xkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gYz8uY29uZmVyZW5jZUlkO1xyXG4gICAgLy8gYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMoYz8uY29uZmVyZW5jZUlkKTtcclxuICB9XHJcbiAgYXN5bmMgb25FbmRDYWxsKGM6IGFueSwgaXNBbGxDYWxsRW5kPzogYm9vbGVhbiwgaXNDb250ZWN0PzogYm9vbGVhbikge1xyXG4gICAgbGV0IHBhcnRpY2lwYW50SWQgPSBpc0FsbENhbGxFbmQgPyAnYWxsJyA6IGMucGFydGljaXBhbnRJZCB8fCBjPy5pZDtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgY29uc3QgcGFydGljaXBhbnRMaXN0ID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzphbnkpID0+IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKS5wYXJ0aWNpcGFudHMuZmlsdGVyKChyZXNEYXRhOiBhbnkpID0+ICFyZXNEYXRhPy5pc0xlZnQpO1xyXG4gICAgaWYocGFydGljaXBhbnRMaXN0Py5sZW5ndGggPT0gMiAmJiAhaXNDb250ZWN0KSB7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQgPSAnYWxsJztcclxuICAgIH1cclxuICAgIGxldCBjb25mZXJlbmNlSWQgPSBjLmNvbmZlcmVuY2VJZCB8fCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQ7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQpO1xyXG4gICAgaWYgKHJlcz8uc3RhdHVzID09IDIwMSAmJiByZXM/Lm1lc3NhZ2UgPT0gJ3BhcnRpY2lwYW50IGFscmVhZHkgbGVmdCcpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUGFydGljaXBhbnQgYWxyZWFkeSBsZWZ0JywgcmVzKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIGlmIChyZXM/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVtb3ZpbmcgcGFydGljaXBhbnQnLCByZXMpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBjb25mZXJlbmNlSWQ7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgdGhpcy5lbmRJbmNvbWluZ0NhbGxFdmVudC5lbWl0KGMpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXRpYXRlQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaW5pdGlhdGVDYWxsKHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRQYXJ0aWNpcGFudFRvQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYWRkUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENsaWVudFBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRDbGllbnRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25NdXRlUGFydGljaXBhbnQocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLm9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZDogYW55LCBjb25mZXJlbmNlSWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgY29uZmVyZW5jZUlkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbEF1dGhJZChyZXNwb25zZTogYW55KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogcmVzcG9uc2UuY2FsbGF1dGguaWQsXHJcbiAgICAgIHJlY29yZENhbGw6IHJlc3BvbnNlLmNhbGxhdXRoLnJlY29yZENhbGwsXHJcbiAgICAgIHRva2VuRGF0YTogcmVzcG9uc2UuY2FsbGF1dGgudG9rZW5cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldE91dGdvaW5nQ2FsbFRva2VuKGNhbGxBdXRoSWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDb25mZXJlbmNlQ2FsbFRva2VuKHsgYXV0aElkOiBjYWxsQXV0aElkIH0pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9EZXZpY2UodG9rZW46IGFueSwgY2FsbERhdGE6IGFueSwgdG9rZW5EYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgY29kZWNQcmVmZXJlbmNlczogWydvcHVzJywgJ3BjbXUnXSxcclxuICAgICAgY2xvc2VQcm90ZWN0aW9uOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UodG9rZW5EYXRhLCBvcHRpb25zKTtcclxuICAgIHRoaXMuY2FsbCA9IGF3YWl0IHRoaXMuZGV2aWNlLmNvbm5lY3Qoe1xyXG4gICAgICBwYXJhbXM6IHtcclxuICAgICAgICBGcm9tOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIFRvOiBjYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBFbnY6IGVudmlyb25tZW50LmFiYixcclxuICAgICAgICBUb2tlbjogdG9rZW4sXHJcbiAgICAgICAgRXh0OiBjYWxsRGF0YS5leHROdW1cclxuICAgICAgfSxcclxuICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHRydWUgfSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGwgPSB0aGlzLmNhbGw7XHJcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpIHtcclxuICAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gICAgdGhpcy5kZXZpY2U/Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdkaXNjb25uZWN0JywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndGVzdC1kaXNjb25uZWN0JylcclxuICAgICAgY29uc29sZS5sb2coJzgzMicpXHJcbiAgICAgIC8vIENsZWFuIHVwIHRoaXMgY2FsbCBmcm9tIGFjY2VwdGVkQ2FsbExpc3RzIHNvIGRldmljZSByZS1pbml0IGd1YXJkIHJlc2V0c1xyXG4gICAgICBjb25zdCBkaXNjb25uZWN0ZWRTaWQgPSB0aGlzLmNhbGw/LnBhcmFtZXRlcnM/LkNhbGxTaWQ7XHJcbiAgICAgIGlmIChkaXNjb25uZWN0ZWRTaWQpIHtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKGMgPT4gYy5jYWxsU2lkICE9PSBkaXNjb25uZWN0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgKGM6IGFueSkgPT4gYy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBkaXNjb25uZWN0ZWRTaWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuY2FsbD8uZGlzY29ubmVjdCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbigncmluZ2luZycsICgpID0+IHtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ3JlamVjdCcsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3Q1JylcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdhY2NlcHQnLCAoKSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd05ld0NhbGxMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgfSwgMjAwMCk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgb3V0Z29pbmcgY2FsbCBpcyBtYXJrZWQgYXMgYWNjZXB0ZWQgc28gdGhlIFVJIHN3aXRjaGVzIHRvIHRoZSBjb25uZWN0ZWQgdmlld1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jYWxsPy5vbignbWVzc2FnZVJlY2VpdmVkJywgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0VGltZXIoam9pbkF0Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWpvaW5BdCkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBqb2luVGltZSA9IG5ldyBEYXRlKGpvaW5BdCkuZ2V0VGltZSgpIHx8IDA7XHJcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoKG5vdyAtIGpvaW5UaW1lKSAvIDEwMDApO1xyXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XHJcbiAgICAgIHNlY29uZHMgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBzZWNvbmRzKys7XHJcbiAgICAgIHRoaXMudGltZXIgPSB0aGlzLmZvcm1hdFRpbWUoc2Vjb25kcyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wVGltZXIoKSB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XHJcbiAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0VGltZSh0b3RhbFNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xyXG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0b3RhbFNlY29uZHMgJSAzNjAwKSAvIDYwKTtcclxuICBjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7XHJcbiAgaWYgKGhvdXJzID4gMCkge1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFkKGhvdXJzKX06JHt0aGlzLnBhZChtaW51dGVzKX06JHt0aGlzLnBhZChzZWNvbmRzKX1gO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5wYWQobWludXRlcyl9OiR7dGhpcy5wYWQoc2Vjb25kcyl9YDtcclxuICB9XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBwYWQodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcclxuICB9XHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICBzd2FsKFwiRXJyb3JcIiwgZXJyb3IsIFwiZXJyb3JcIik7XHJcbiAgfVxyXG5cclxuICBlbmRDb25mZXJlbmVjZUNhbGwoY29uZj86IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmYgPSBjb25mO1xyXG4gICAgLy8gdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gdHJ1ZTtcclxuICAgIGxldCBjb25mZXJlbmNlID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8uZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGNvbmY/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICBsZXQgaG9zdE51bWJlciA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gcGFydGljaXBhbnQ/Lmhvc3QpO1xyXG4gICAgaWYgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoaG9zdE51bWJlcj8uZnJvbSkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhob3N0TnVtYmVyPy50bykgJiYgaG9zdE51bWJlcj8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiBob3N0TnVtYmVyPy5ob3N0KSkgJiYgY29uZmVyZW5jZT8ucGFydGljaXBhbnRzLmZpbHRlcigocDogYW55KSA9PiAhcC5pc0xlZnQpLmxlbmd0aCA+IDIpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmZbJ2Nvbk5hbWUnXSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmNvbmZlcmVuY2VJZCA9PSBjb25mPy5jb25mZXJlbmNlSWQpPy5jb25mZXJlbmNlTmFtZSB8fCAnJztcclxuICAgICAgdGhpcy5vbkNhbGxEaXNjb25uZWN0ZWQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChjb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICBsZXQgcGFydGljaXBlbnRJbmZvID0gY29uZmVyZW5jZT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSlcclxuICAgICAgICAgICYmIHBhcnRpY2lwYW50Py5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICAgIGlmIChwYXJ0aWNpcGVudEluZm8/LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uRW5kQ2FsbChwYXJ0aWNpcGVudEluZm8pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBlbmRDYWxsKGlzQWxsQ2FsbEVuZD86IGJvb2xlYW4pIHtcclxuICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICBpZiAoaXNBbGxDYWxsRW5kKSB7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHt9LCBpc0FsbENhbGxFbmQpO1xyXG4gICAgICBpZiAoIXRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyg4OTYpXHJcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgdGhpcy5vbkVuZENhbGwoY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbywgaXNBbGxDYWxsRW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyB0b2dnbGVNdXRlKGlzQ29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNNdXRlID0gIXRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5wZW5kaW5nTXV0ZVVwZGF0ZSA9IHRydWU7IFxyXG4gICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZSA9IHRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5jYWxsPy5tdXRlKHRoaXMuaXNNdXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvLnBhcnRpY2lwYW50SWQgfHwgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5pc0hvbGQsXHJcbiAgICAgIG11dGU6ICFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pc011dGVcclxuICAgICAgLy8gY29uZmVyZW5jZTogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmN1cnJlbnRDYWxsLmlzTXV0ZSA9IHRoaXMuaXNNdXRlO1xyXG4gICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudENhbGxJbmZvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RcclxuICAgICAgLmZsYXRNYXAoKGNhbGxJbmZvOiBhbnkpID0+IGNhbGxJbmZvLnBhcnRpY2lwYW50cylcclxuICAgICAgLmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KVxyXG4gICAgICAgIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSkgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQgJiYgIXBhcnRpY2lwYW50Py5pc0hvbGQpO1xyXG4gIH1cclxuICB0b2dnbGVLZXlwYWQoKSB7XHJcbiAgICB0aGlzLnNob3dLZXlwYWQgPSAhdGhpcy5zaG93S2V5cGFkO1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSAnJztcclxuICB9XHJcbiAgdG9nZ2xlQ29udGFjdHNQYW5lbChjYWxsSW5mbz86IGFueSwgaXNDbG9zZT86IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgaWYgKGlzQ2xvc2UpIHtcclxuICAgICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gIWlzQ2xvc2U7XHJcbiAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBjYWxsSW5mbz8uY29uZmVyZW5jZUlkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmZOYW1lID0gdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZmluZCgocmVzRGF0YTphbnkpPT4gcmVzRGF0YT8uY29uZmVyZW5jZUlkID09PSBjYWxsSW5mbz8uY29uZmVyZW5jZUlkKT8uY29uZmVyZW5jZU5hbWUgfHwgJyc7XHJcbiAgICAvLyB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIHRoaXMuaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFJlbW92ZVBhcnRpY2lwYW50KCkge1xyXG4gICAgdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50ID0gIXRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDtcclxuICAgIC8vIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHdhaXRpbmdDYWxsQWNjZXB0KGluY29taW5nQ2FsbEluZm86YW55KSB7XHJcbiAgICBsZXQgb3VyTnVtYmVySW5mbzogYW55ID0ge31cclxuICAgIGxldCBjYWxsSW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCA9PSBjYWxsSW5mby5jb25mZXJlbmNlSWQpXHJcbiAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgb3VyTnVtYmVySW5mbyA9IGNhbGxJbmZvLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICBjb25zdCBjYXB0dXJlZENhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuaW5jb21pbmdDYWxsRGV0YWlsO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QuZm9yRWFjaCgoY2FsbDogYW55KSA9PiB7XHJcbiAgICAgIGNhbGwubXV0ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKG91ck51bWJlckluZm8/LmlkICYmIG91ck51bWJlckluZm8/LmNvbmZlcmVuY2VJZCAhPT0gaW5jb21pbmdDYWxsSW5mbz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgIHRoaXMuaXNVbmhvbGRDb25mZXJlbmNlQ2FsbCA9IHRydWU7XHJcbiAgICAgIGxldCBob2xkSW5mbzogYW55ID0gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICBwYXJ0aWNpcGFudElkOiBbb3VyTnVtYmVySW5mbz8uaWRdLFxyXG4gICAgICAgIGNvbmZlcmVuY2VJZDogb3VyTnVtYmVySW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgbXV0ZTogb3VyTnVtYmVySW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyAxMDkxJywgaG9sZEluZm8pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFkZChpbmNvbWluZ0NhbGxJbmZvLCBvdXJOdW1iZXJJbmZvLCBjYXB0dXJlZENhbGwpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkKGRhdGE/OiBhbnksIG91ck51bWJlckluZm8/OiBhbnksIGNhcHR1cmVkQ2FsbD86IENhbGwpIHtcclxuICAgIHRoaXMuaXNDb25uZWN0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZC5uZXh0KGRhdGE/LmlkKTtcclxuICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICBjb25zdCBjYWxsVG9BY2NlcHQgPSBjYXB0dXJlZENhbGwgfHwgdGhpcy50d2lsaW9TZXJ2aWNlLmluY29taW5nQ2FsbERldGFpbDtcclxuXHJcbiAgICBsZXQgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgaWYodGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCkge1xyXG4gICAgICAgIGNhbGxUb0FjY2VwdC5hY2NlcHQoKTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZEVudHJ5ID0ge1xyXG4gICAgICAgICAgY2FsbDogY2FsbFRvQWNjZXB0LFxyXG4gICAgICAgICAgY2FsbFNpZDogY2FsbFRvQWNjZXB0LnBhcmFtZXRlcnM/LkNhbGxTaWQsXHJcbiAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QucHVzaChhY2NlcHRlZEVudHJ5KTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5wdXNoKGNhbGxUb0FjY2VwdCk7XHJcbiAgICAgICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgICByZWNvcmRJZDogZGF0YT8uaWQsXHJcbiAgICAgICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gICAgICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgICAgIGNhbGxTdGF0dXM6ICdhbnN3ZXJlZCcsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgIHVzZXJJZDogIHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgICAgIGNvbXBhbnlJZDogJycsXHJcbiAgICAgICAgICBjbGllbnRTaWQ6IGNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBkYXRhPy5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0SW5jb21pbmdDYWxsU3RhdHVzKHBheWxvYWQpLnN1YnNjcmliZShhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBkYXRhPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5wdXNoKGRhdGE/LmlkKTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNBY2NlcHRJSW5jb21pbmdDYWxsLm5leHQoZGF0YT8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkLm5leHQoJycpO1xyXG4gICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBkZXZpY2UyIHNvIGFueSBzdWJzZXF1ZW50IGluY29taW5nIGNhbGwgYXJyaXZlcyBvbiBhXHJcbiAgICAgICAgICAgIC8vIHNlcGFyYXRlIERldmljZSBhbmQgY2Fubm90IGRpc3BsYWNlIHRoaXMgY2FsbCdzIFdlYlJUQyBjb25uZWN0aW9uLlxyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGRldmljZTIgd2hlbiB0aGlzIGFjY2VwdGVkIGNhbGwgZGlzY29ubmVjdHMuXHJcbiAgICAgICAgICAgIGNhbGxUb0FjY2VwdC5vbignZGlzY29ubmVjdCcsICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuZGVzdHJveURldmljZTIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzaWQgPSBjYWxsVG9BY2NlcHQucGFyYW1ldGVycz8uQ2FsbFNpZDtcclxuICAgICAgICAgICAgdGhpcy5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihjID0+IGMuY2FsbFNpZCAhPT0gc2lkKTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBzaWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKVxyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQubmV4dCgnJyk7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgocmVzKSA9PiByZXMucGFydGljaXBhbnRJZCA9PSBkYXRhLnBhcnRpY2lwYW50SWQpXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcxMDk2JylcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdChkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICBzd2FsKFwiRXJyb3JcIiwgcmVzPy5tZXNzYWdlPy5qb2luPy4oXCI8YnIvPlwiKSB8fCAnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgXCJlcnJvclwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgICAgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICB9LDUwMClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZClcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0gZWxzZSBpZih0aGlzLm1pc3NDYWxsSW5mbz8uZGF0YT8uZGF0YT8ucmVjb3JkSWQgPT0gZGF0YT8uaWQgJiYgIXRoaXMudHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwpe1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgY29uc3Qgc2lkID0gY2FsbFRvQWNjZXB0LnBhcmFtZXRlcnM/LkNhbGxTaWQ7XHJcbiAgICAgICAgdGhpcy5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihjID0+IGMuY2FsbFNpZCAhPT0gc2lkKTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgIChjOiBhbnkpID0+IGMucGFyYW1ldGVycz8uQ2FsbFNpZCAhPT0gc2lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNTaG93SW5jb21pbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuZGVzdHJveURldmljZTIoKTtcclxuICAgICAgICBzd2FsKFwiRXJyb3JcIiwgJ0ludGVybmFsIFNlcnZlciBFcnJvcicsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgdGhpcy5taXNzQ2FsbEluZm8gPSB7fTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG4gIGFzeW5jIGNhbGxDb250YWN0KGNvbnRhY3Q6IGFueSwgaXNVbnNhdmVkTnVtYmVyPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGlzVW5zYXZlZE51bWJlciA/IGNvbnRhY3QgOiBjb250YWN0Py5udW1iZXJzTGlzdD8uWzBdPy5udW1iZXIgfHwgY29udGFjdD8ucGhvbmU7XHJcbiAgICBsZXQgYWxyZWFkeUluQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiAocmVzLnRvID09IHBob25lTnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykgfHwgKHJlcy5mcm9tID09IHBob25lTnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/Lmhvc3QpICYmICFyZXM/LmlzTGVmdCk7XHJcbiAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICBzd2FsKCdFcnJvcicsIGBBbHJlYWR5ICR7cGhvbmVOdW1iZXJ9IG51bWJlciBpbiB0aGlzIGNhbGwuYCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tID8gdGhpcy5jYWxsRGF0YT8uZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkIHx8IGRhdGE/LmlkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEyMTgnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRJRHM6IGFueSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJRHMucHVzaChjPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXHJcbiAgICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICAgIGZyb206IHRoaXMuY2FsbERhdGE/LmZyb20gfHwgdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgcGFydGljaXBhbnRJRHMucHVzaChkYXRhPy5wYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBwYXJ0aWNpcGFudElEcyxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgICAgbXV0ZTogbnVsbCxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEyNzcnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIHBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFscmVhZHlJbkNhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gKChyZXMudG8gPT0gbnVtYmVyICYmIHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykgfHwgKHJlcy5mcm9tID09IG51bWJlciAmJiByZXM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcmVzLmhvc3QpKSAmJiAhcmVzPy5pc0xlZnQpO1xyXG4gICAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtudW1iZXJ9IG51bWJlciBpbiB0aGlzIGNhbGwuYCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChudW1iZXIgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cclxuICAgICAgY29uc3QgY2FsbERhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogY29udGFjdD8uZmlyc3ROYW1lLFxyXG4gICAgICAgIGltZzogY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIHBob25lOiBudW1iZXIsXHJcbiAgICAgICAgZXh0TnVtOiAnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaXNOZXdDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICAgICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgICAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMTM1NScsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm9uQWRkTmV3Q2FsbChjYWxsRGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNhbGxEYXRhLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsQ29udGFjdChudW1iZXIsIHRydWUpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQWRkTmV3Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2VDYWxsID0gZmFsc2UpIHtcclxuICAgIC8vIHdhcm5pbmcgb25seSBmb3IgTkVXIFNFUEFSQVRFIENBTExcclxuICAgIGlmIChpc05ld0NvbmZlcmVuY2VDYWxsICYmIHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBjYWxsRGF0YTtcclxuICAgICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydENhbGwoY2FsbERhdGEsIGlzTmV3Q29uZmVyZW5jZUNhbGwpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlybU5ld0NhbGwoKSB7XHJcbiAgICB0aGlzLnNob3dDb25mZXJlbmNlV2FybmluZ01vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2FsbERhdGEpIHtcclxuICAgICAgdGhpcy5uZXdDYWxsTG9hZGVyRGF0YSA9IHtcclxuICAgICAgICBuYW1lOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHBob25lOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBpbWc6IHRoaXMucGVuZGluZ0NhbGxEYXRhLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QgPSB7XHJcbiAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICAgICAgbnVtYmVyOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBkaXNwbGF5TnVtOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5waG9uZVxyXG4gICAgICB9OyAgXHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnNob3dOZXdDYWxsTG9hZGVyID0gdHJ1ZTtcclxuICAgICAgXHJcbiAgICAgIFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XHJcbiAgICAgIH0sIDcwMDApO1xyXG4gICAgICB0aGlzLnN0YXJ0Q2FsbCh0aGlzLnBlbmRpbmdDYWxsRGF0YSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMucGVuZGluZ0NhbGxEYXRhID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbmNlbE5ld0NhbGwoKSB7XHJcbiAgICB0aGlzLnNob3dDb25mZXJlbmNlV2FybmluZ01vZGFsID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlbmRpbmdDYWxsRGF0YSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRUb051bWJlcihkaWFsZWROdW1iZXI6IHN0cmluZykge1xyXG4gICAgaWYgKGRpYWxlZE51bWJlclswXSAhPT0gJysnKSB7XHJcbiAgICAgIC8vIHRoaXMgaXMgY2FzZSB3aGVuIHVzZXIgZ2VvbG9jYXRpb24gZGlhbCBjb2RlIGlzIG9uXHJcbiAgICAgIGxldCBpcEFkZHJlc3M6IGFueSA9IGF3YWl0IHRoaXMuaXBTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS50b1Byb21pc2UoKTtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyLCBpcEFkZHJlc3MuYWRkcmVzcy5jb3VudHJ5Q29kZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXMuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIHJldHVybiByZXM/LnRvTnVtYmVyXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGRpYWxlZE51bWJlclxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZGlhbGVkTnVtYmVyXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBpc0ludmFsaWROdW1iZXIobnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChudW1iZXIgPT0gJycpIHtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmFsaWROdW1iZXJQYXR0ZXJuID0gL15bK1xcZFxccygpLV0qJC87IC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB2YWxpZCBjaGFyYWN0ZXJzXHJcbiAgICAgIGNvbnN0IHBob25lTnVtYmVyID0gbnVtYmVyO1xyXG4gICAgICBpZiAoIXZhbGlkTnVtYmVyUGF0dGVybi50ZXN0KHBob25lTnVtYmVyKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgIHJldHVybiB0cnVlOyAvLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgbWVhbmluZyB0aGUgbnVtYmVyIGlzIGludmFsaWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dEaWFsQWxlcnQobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpYWxBbGVydCA9IHtcclxuICAgICAgbXNnOiBtZXNzYWdlLFxyXG4gICAgICBzaG93OiB0cnVlXHJcbiAgICB9O1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhbEFsZXJ0LnNob3cgPSBmYWxzZTtcclxuICAgIH0sIDMwMDApO1xyXG4gIH1cclxuXHJcbmFzeW5jIGdldEFsbFBhcnRpY2lwYW50cyhjb25mZXJlbmNlSWQ6IHN0cmluZykge1xyXG4gIHNldFRpbWVvdXQoKCk9PntcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZUlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSByZXM/LnBhcnRpY2lwYW50cyB8fCByZXM/LnBhcnRpY2lwYW50IHx8IFtdO1xyXG4gICAgICAgIC8vIGlmICghcGFydGljaXBhbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgICAvLyAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgICAvLyAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gY29uc3QgdXBkYXRlZFBhcnRpY2lwYW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIC8vICAgcGFydGljaXBhbnRzLm1hcChhc3luYyAocDogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGZyb21OYW1lID0gYXdhaXQgdGhpcy5nZXROYW1lKHAuZnJvbSk7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRvTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLnRvKTtcclxuICBcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHtcclxuICAgICAgICAvLyAgICAgICAuLi5wLFxyXG4gICAgICAgIC8vICAgICAgIGZyb21OYW1lOiBmcm9tTmFtZSB8fCBwLmZyb21OYW1lLFxyXG4gICAgICAgIC8vICAgICAgIHRvTmFtZTogdG9OYW1lIHx8IHAudG9OYW1lLFxyXG4gICAgICAgIC8vICAgICB9O1xyXG4gICAgICAgIC8vICAgfSlcclxuICAgICAgICAvLyApO1xyXG4gIFxyXG4gICAgICAgIC8vIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gdXBkYXRlZFBhcnRpY2lwYW50cztcclxuICAgICAgICAvLyB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gWy4uLnVwZGF0ZWRQYXJ0aWNpcGFudHNdOyAgXHJcbiAgICAgICAgLy8gdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9LDcwMClcclxufVxyXG5cclxuICBhc3luYyBzd2FwQ2FsbHMoY2FsbEluZm86IGFueSwgaXNDb25mZXJlbmNlQ2FsbD86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjPy5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IHRydWU7XHJcbiAgICAgICAgbGV0IHBhcnRpY2lwYW50SW5mbyA9IGMucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50SW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW3BhcnRpY2lwYW50SW5mbz8uaWRdLFxyXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHBhcnRpY2lwYW50SW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MDInLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBjYWxsSW5mbz8uY29uZmVyZW5jZUlkXHJcbiAgICAgICAgICAvLyB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHBhcnRpY2lwYW50SW5mbyA9IGMucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50SW5mbz8uaWQgJiYgIXBhcnRpY2lwYW50SW5mbz8uaXNIb2xkKSB7XHJcbiAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MjEnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWM/LmlzSG9sZCAmJiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWQgfHwgYz8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MzUnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBoYXNEZXRhaWxlZEluZm8oY2FsbERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXHJcbiAgICBpZiAoY2FsbERhdGEudXNlckluZm8gJiYgY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb24pIHtcclxuICAgICAgY29uc3QgaW5mbyA9IGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uO1xyXG4gICAgICByZXR1cm4gISEoXHJcbiAgICAgICAgaW5mby5zdWJqZWN0ICYmIGluZm8uc3ViamVjdCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5lbWFpbCAmJiBpbmZvLmVtYWlsICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLm1lc3NhZ2UgJiYgaW5mby5tZXNzYWdlICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnBvaW50TmFtZSAmJiBpbmZvLnBvaW50TmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5zb3VyY2VOYW1lICYmIGluZm8uc291cmNlTmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5leHRlbnNpb24gJiYgaW5mby5leHRlbnNpb24gIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8udXJsIHx8XHJcbiAgICAgICAgaW5mby5sYXRpdHVkZSB8fFxyXG4gICAgICAgIGluZm8ubG9uZ2l0dWRlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNhbGxJbnB1dHMobnVtOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcclxuICAgICAgICBpZiAobnVtID09ICcjJykge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLWhhc2gtLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dCArIFN0cmluZyhudW0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0NsZWFyQnRuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc3RyID0gU3RyaW5nKG51bSk7XHJcbiAgICAgIHRoaXMuY2FsbD8uc2VuZERpZ2l0cyhzdHIpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25DYWxsSW5wdXRFbnRlcihldjogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoU3RyaW5nKGV2LmtleSkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFySW5wdXRzKCkge1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dC5zbGljZSgwLCAtMSk7XHJcbiAgfVxyXG4gIGlzTWluaW1pc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWluaW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gdHJ1ZTtcclxuICB9XHJcbiAgbWF4aW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGZhbHNlO1xyXG4gIH1cclxuICB0b2dnbGVSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnRSZWNvcmRpbmcoKSB7XHJcbiAgICBsZXQgc2lkO1xyXG4gICAgY29uc3QgZGV0YWlscyA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XHJcbiAgICB0aGlzLmluY29taW5nQ2FsbFNpZCA9IGRldGFpbHMuY2FsbFNpZDtcclxuICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xyXG4gICAgc2lkID0gdGhpcy5pbmNvbWluZ0NhbGxTaWQgPyB0aGlzLmluY29taW5nQ2FsbFNpZCA6IHRoaXMuY2FsbFNpZCB8fCB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcclxuXHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFJlY29yZGluZyh7IFwiY29uZmVyZW5jZUlkXCI6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCB9KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkID0gMDtcclxuICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZygpIHtcclxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcGF1c2VSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsICdwYXVzZScpLnN1YnNjcmliZShcclxuICAgICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcFJlY29yZGluZ1RpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhdXNpbmcgcmVjb3JkaW5nOicsIGVycm9yKTtcclxuICAgICAgICAvLyBDb25zaWRlciB1cGRhdGluZyB0aGUgVUkgdG8gc2hvdyB0aGUgZXJyb3Igc3RhdGVcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVzdW1lUmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlc3VtaW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRUaW1lRGlmZmVyZW5jZShpbnB1dFRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXN0VGltZSA9IG5ldyBEYXRlKGlucHV0VGltZSkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBsZXQgZGlmZiA9IE1hdGguZmxvb3IoKGN1cnJlbnRUaW1lIC0gcGFzdFRpbWUpIC8gMTAwMCk7IC8vIHRvdGFsIHNlY29uZHNcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gZGlmZiAlIDYwO1xyXG5cclxuICAgIGNvbnN0IG1tID0gbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XHJcbiAgICBjb25zdCBzcyA9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xyXG5cclxuICAgIHJldHVybiBgJHttbX06JHtzc31gO1xyXG4gIH1cclxuICBzdGFydFRpbWVyMSgpIHtcclxuICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkKys7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZ1RpbWVyKCkge1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAvLyBQYXVzZSB0aGUgdGltZXJcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgICAgICAgIC8vIE9wdGlvbmFsbHkgcmVzZXQgdGhlIHN1YnNjcmlwdGlvblxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRGb3JtYXR0ZWRUaW1lKCkge1xyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodGhpcy50aW1lRWxhcHNlZCAvIDYwKTtcclxuICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLnRpbWVFbGFwc2VkICUgNjA7XHJcbiAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJ30ke3NlY29uZHN9YDtcclxuICB9XHJcbiAgcG9sbENhbGxTdGF0dXMoY2FsbEF1dGhJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYXhUaW1lID0gMzAwMDA7IC8vIFBvbGwgZm9yIHVwIHRvIDMwIHNlY29uZHNcclxuICAgIGNvbnN0IHBvbGxJbnRlcnZhbCA9IDMwMDA7IC8vIFBvbGwgZXZlcnkgMyBzZWNvbmRzXHJcbiAgICBsZXQgZWxhcHNlZFRpbWUgPSAwO1xyXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgZWxhcHNlZFRpbWUgKz0gcG9sbEludGVydmFsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXMoY2FsbEF1dGhJZCkudG9Qcm9taXNlKCkgYXMgQ2FsbFN0YXR1c1Jlc3BvbnNlO1xyXG4gICAgICAgIGlmIChzdGF0dXNSZXNwb25zZSAmJiBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscykge1xyXG4gICAgICAgICAgdGhpcy5jYWxsU3RhdHVzID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFN0YXR1cztcclxuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU2lkID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFNpZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkQ2FsbCAmJiAhdGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPj0gbWF4VGltZSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNYXggcG9sbGluZyB0aW1lIHJlYWNoZWQuIFN0b3BwaW5nIHBvbGwuJyk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfSwgcG9sbEludGVydmFsKTtcclxuICB9XHJcblxyXG4gIC8vIGdldFVzZXJJbmZvcm1hdGlvbihpZDogYW55KSB7XHJcbiAgLy8gICBpZihpZCkge1xyXG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihpZCkuc3Vic2NyaWJlKFxyXG4gIC8vICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XHJcbiAgLy8gICAgIH0sIGVycm9yID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICBzZWxlY3RlZEluY29taW5nQ2FsbEluZm8oZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gZGF0YTtcclxuICB9XHJcblxyXG4gIC8vIGdldEhvbGRDYWxsTGlzdCgpIHtcclxuICAvLyAgIGxldCBob2xkTGlzdDogYW55W10gPSBbXTtcclxuICAvLyAgIGxldCBpc0NvbmZlcmVuY2UgPSBmYWxzZTtcclxuICAvLyAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gIC8vICAgICBpZiAoYz8uaXNIb2xkICYmICFjPy5pc0NvbmZlcmVuY2UpIHtcclxuICAvLyAgICAgICBob2xkTGlzdC5wdXNoKGMpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWlzQ29uZmVyZW5jZSkge1xyXG4gIC8vICAgICAgIGlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgLy8gICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XHJcbiAgLy8gICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICByZXR1cm4gaG9sZExpc3Q7XHJcbiAgLy8gfVxyXG5cclxuICBvbkNsaWNrRXhwYW5kKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKGRhdGEuaWQgIT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSAhdGhpcy5pc0NsaWNrRXhwYW5kO1xyXG4gICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gZGF0YTtcclxuICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzZXRJbmNvbWluZ0NhbGxTdGF0dXMoZGF0YTogYW55KSB7XHJcbiAgLy8gICBsZXQgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gIC8vICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gIC8vICAgICBpcENvdW50cnk6ICcnLFxyXG4gIC8vICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gIC8vICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAvLyAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgfHwgZGF0YS5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAvLyAgIH0pXHJcbiAgLy8gfVxyXG5cclxuICB0b2dnbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVyKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpXHJcbiAgICBpZiAodGV4dC5sZW5ndGggPCAzKSB7XHJcbiAgICAgIC8vIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgICAgLy8gdGhpcy5maWx0ZXJlZExpc3QuZm9yRWFjaCgoYzogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiAhY2M/LklzQ29ubmVjdGVkICYmIChjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcikpO1xyXG4gICAgICAvLyAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIC8vICAgICBjWydJc0Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgLy8gICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzTnVtZXJpY1NlYXJjaCA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpO1xyXG4gICAgY29uc3QgZXhwYW5kZWQ6IGFueVtdID0gW107XHJcbiAgICB0aGlzLmNvbnRhY3RzLmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNOdW1lcmljU2VhcmNoKSB7XHJcbiAgICAgICAgKGM/Lm51bWJlcnNMaXN0IHx8IFtdKS5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICgobj8ubnVtYmVyIHx8ICcnKS5pbmNsdWRlcyh0ZXh0KSkge1xyXG4gICAgICAgICAgICBleHBhbmRlZC5wdXNoKHsgLi4uYywgbnVtYmVyc0xpc3Q6IFtuXSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSAoYz8uZmlyc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubGFzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHxcclxuICAgICAgICAgIChjPy5taWRkbGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubmlja05hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XHJcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xyXG4gICAgICAgICAgY29uc3QgbnVtYmVycyA9IGM/Lm51bWJlcnNMaXN0O1xyXG4gICAgICAgICAgaWYgKG51bWJlcnMgJiYgbnVtYmVycy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIG51bWJlcnMuZm9yRWFjaCgobnVtT2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBleHBhbmRlZC5wdXNoKHsgLi4uYywgbnVtYmVyc0xpc3Q6IFtudW1PYmpdIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4cGFuZGVkLnB1c2goYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gZXhwYW5kZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgY1snZnJvbU5hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLmZyb20pIHx8ICcnO1xyXG4gICAgICBjWyd0b05hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLnRvKSB8fCAnJztcclxuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlcik7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY2hlY2tUZXh0SGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbD8uc2Nyb2xsSGVpZ2h0ID4gZWw/LmNsaWVudEhlaWdodCkge1xyXG4gICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB0b2dnbGVUZXh0KCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcbiAgc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gIC8vIENhbGwgdGhpcyB3aGVuIGNhbGwgZGlzY29ubmVjdHNcclxuICBvbkNhbGxEaXNjb25uZWN0ZWQoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZW5kQ29uZmVyZW5jZSgpIHtcclxuICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5zZWxlY3RlZENvbmYsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmRDYWxsKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENvbWJpbmVzIHRoZSB0d28gMjQtaG91ciBzZWxlY3RzIGludG8gbGVhdmVSZWFzb24gKEhIOk1NKSAqL1xyXG4gIG9uVGltZUNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLmxlYXZlSG91ciAhPT0gJycgJiYgdGhpcy5sZWF2ZU1pbnV0ZSAhPT0gJycpIHtcclxuICAgICAgdGhpcy5sZWF2ZVJlYXNvbiA9IGAke3RoaXMubGVhdmVIb3VyfToke3RoaXMubGVhdmVNaW51dGV9YDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUhvdXJEcm9wZG93bigpIHtcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9ICF0aGlzLnNob3dIb3VyRHJvcGRvd247XHJcbiAgICB0aGlzLnNob3dNaW51dGVEcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTWludXRlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLnNob3dNaW51dGVEcm9wZG93biA9ICF0aGlzLnNob3dNaW51dGVEcm9wZG93bjtcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0SG91cihoOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGVhdmVIb3VyID0gaDtcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgdGhpcy5vblRpbWVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdE1pbnV0ZShtOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGVhdmVNaW51dGUgPSBtO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMub25UaW1lQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBsZWF2ZUNvbmZlcmVuY2UoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmlzUmVhc29uQ2hlY2tlZCkge1xyXG4gICAgICBsZXQgcGF5bG9hZCA9IHsgY29uZmVyZW5jZUlkOiB0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkIHx8IHRoaXMuaG9zdG51bWJlcj8uY29uZmVyZW5jZUlkLCB0aW1lOiB0aGlzLmNvbnZlcnRISE1NVG9NaW51dGVzKHRoaXMubGVhdmVSZWFzb24pLCB0aW1lckRhdGU6IG5ldyBEYXRlKCkudG9TdHJpbmcoKSB9XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRUaW1lckZvckVuZENvbmZlcmVuY2VDYWxsKHBheWxvYWQpLnN1YnNjcmliZSgocmVzKSA9PiB7IH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICBsZXQgY29uZmVyZW5jZSA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmNvbmZlcmVuY2VJZCA9PSB0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkKVxyXG4gICAgICBsZXQgcGFydGljaXBlbnRJbmZvID0gY29uZmVyZW5jZT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSlcclxuICAgICAgICAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdClcclxuICAgICAgaWYgKHBhcnRpY2lwZW50SW5mbz8uaWQpIHtcclxuICAgICAgICB0aGlzLm9uRW5kQ2FsbChwYXJ0aWNpcGVudEluZm8pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMuaG9zdG51bWJlcik7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBjb252ZXJ0SEhNTVRvTWludXRlcyh0aW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcclxuICAgIHJldHVybiAoaG91cnMgKiA2MCkgKyBtaW51dGVzO1xyXG4gIH1cclxuXHJcbiAgb25SZWplY3RDYWxsKGNhbGxJbmZvOiBhbnkpIHtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICByZWNvcmRJZDogY2FsbEluZm8/LmlkLFxyXG4gICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gICAgICBpcENvdW50cnk6ICcnLFxyXG4gICAgICBjYWxsU3RhdHVzOiAnbm8nLFxyXG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgdXNlcklkOiAgdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICBjb21wYW55SWQ6ICcnLFxyXG4gICAgICBjbGllbnRTaWQ6IHRoaXMudHdpbGlvU2VydmljZT8uaW5jb21pbmdDYWxsRGV0YWlsPy5wYXJhbWV0ZXJzPy5DYWxsU2lkLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXM6IGFueSkgPT4gcmVzPy5pZCAhPSBjYWxsSW5mbz8uaWQpO1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgXHJcbiAgaXNTZWxmTnVtYmVyKHBhcnRpY2lwYW50OiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmRldmljZU51bWJlckxpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcyA9PSAocGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBwYXJ0aWNpcGFudD8uZnJvbSA6IHBhcnRpY2lwYW50Py50bykpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkU2hvd1NlcGFyYXRvcihpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB2aXNpYmxlQ291bnQgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zbGljZSgwLCBpbmRleCkuZmlsdGVyKChjYWxsOiBhbnkpID0+ICFjYWxsPy5pc0NvbmZlcmVuY2VIb2xkKS5sZW5ndGg7XHJcbiAgICByZXR1cm4gdmlzaWJsZUNvdW50ID4gMDtcclxuICB9XHJcblxyXG4gIGdldE5hbWUobnVtYmVyOiBhbnkpIHtcclxuICAgIGxldCBjb250YWN0SW5mbyA9IHRoaXMuY29udGFjdHMuZmluZCgoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb250YWN0SW5mbz8uZmlyc3ROYW1lIHx8IGNvbnRhY3RJbmZvPy5sYXN0TmFtZSA/IGAke2NvbnRhY3RJbmZvPy5maXJzdE5hbWUgfHwgJyd9ICR7Y29udGFjdEluZm8/Lmxhc3ROYW1lIHx8ICcnfWAgOiBudWxsXHJcbiAgfVxyXG4gIFxyXG4gIGdldEltZyhudW1iZXI6IGFueSkge1xyXG4gICAgbGV0IGNvbnRhY3RJbmZvID0gdGhpcy5jb250YWN0cy5maW5kKChjOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgID09IG51bWJlciB8fCBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyID09IG51bWJlcjtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbnRhY3RJbmZvPy5pbWFnZSB8fCBudWxsXHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0VuZEFsbEJ1dHRvbigpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGl2ZVBhcnRpY2lwYW50cyA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoYzogYW55KSA9PiAhYy5pc0xlZnQpO1xyXG4gICAgcmV0dXJuIGFjdGl2ZVBhcnRpY2lwYW50cy5sZW5ndGggPiAyO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuY2FsbERhdGEuZGlhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkICYmIGN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2NvbGxvcHMnOiBpc0NvbGxvcHMsICdpbmNvbWluZy1jYWxsLWNvbnRhaW5lcic6IGlzQ2xpY2tFeHBhbmQsICdjb250YWN0cy1vcGVuJzogc2hvd0NvbnRhY3RzUGFuZWwgfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkZXItd3JhcHBlciBvdXRnb2luZy1jYWxsLWxvYWRlclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd05ld0NhbGxMb2FkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGl2ZS1jYWxsXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb24gY2FsbC1hbmltYXRpb24tcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJuZXdDYWxsTG9hZGVyRGF0YT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4O1wiPkNvbm5lY3RpbmcuLi48L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XCI+e3sgbmV3Q2FsbExvYWRlckRhdGE/Lm5hbWUgfHwgbmV3Q2FsbExvYWRlckRhdGE/LnBob25lIHx8ICdVbmtub3duJyB9fTwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIGRpc2FibGVkIChjbGljayk9XCJlbmRDYWxsKClcIiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFscGFkLWFsZXJ0c1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdjb25mZXJlbmNlLWFsZXJ0JzogaXNDb25mZXJlbmNlICYmIGN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgJ25vcm1hbC1jYWxsLWFsZXJ0JzogIWlzQ29uZmVyZW5jZVxyXG4gICAgICAgIH1cIiAqbmdJZj1cImNhbGxOdW1iZXJUb2FzdC5zaG93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsYm94LXBvcDEgYWxlcnQgZmFkZSBzaG93XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNhbGxOdW1iZXJUb2FzdC50eXBlXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICBZb3UnciBjYWxsaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e2NhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kaXNjIHAtMCBweC0xXCI+IENhbmNlbCBDYWxsIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWxsIHR5cGUgQ2FsbCBIb2xkIGxpc3QgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIoY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgISFjdXJyZW50Q2FsbCAmJiAoKGlzQ29uZmVyZW5jZUNhbGxIb2xkIHx8IGlzQ29uZmVyZW5jZSkgfHwgIWlzQ29uZmVyZW5jZSkpIHx8ICFpc0FsbEFjY2VwdGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY3VycmVudENhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cIiFjb25mPy5pc0FjY2VwdENhbGwgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjb25mPy50bykgJiYgdHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwgJiYgY29uZj8uaXNOb3RpZmljYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nLXdyYXBwZXIgYm9yZGVyLXJhZGl1cy01MFwiIFtzcmNdPVwiY29uZj8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIzNVwiIGhlaWdodD1cIjM1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+e3tjb25mPy5mcm9tfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uZnJvbU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3QgcmVjZWl2ZS1idG5cIiAoY2xpY2spPVwid2FpdGluZ0NhbGxBY2NlcHQoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIiAoY2xpY2spPVwib25SZWplY3RDYWxsKGNvbmYpXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25mPy5idXNpbmVzc051bWJlclwiIGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY29uZmVyZW5jZUNhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cImNvbmY/LmlzQ29uZmVyZW5jZUhvbGQgJiYgY29uZmVyZW5jZUNhbGxMaXN0Lmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBob2xkLWljb25cIj5wYXVzZV9jaXJjbGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SG9sZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1uYW1lXCI+e3tjb25mPy5jb25mZXJlbmNlTmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdFwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjb25mPy5pc0NvbmZlcmVuY2VIb2xkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3YXBDYWxscyhjb25mLHRydWUpXCIgW2Rpc2FibGVkXT1cImlzSG9sZEJ0bkRpc2FibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZj8uaXNDb25mZXJlbmNlSG9sZFwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCInUmVzdW1lJ1wiPiByZXN1bWUgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJlbmRDb25mZXJlbmVjZUNhbGwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFycm93LWFycm93IG1lLTJcIiBpZD1cInRvZ2dsZWFycm93XCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xMDAgcHktNVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPT09IDEgJiYgY3VycmVudENhbGxMaXN0WzBdPy5pc0luY29taW5nQ2FsbCAmJiAhY3VycmVudENhbGxMaXN0WzBdPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxUb051bVwiPkluY29taW5nIGNhbGwgb24gPGJyIC8+PHNwYW4+e3tjdXJyZW50Q2FsbExpc3RbMF0/LnRvIHx8ICdVbmtub3duIE51bWJlcid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiBbc3JjXT1cImN1cnJlbnRDYWxsTGlzdFswXT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIHdpZHRoPVwiMTIwXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8aDE+e3sgY3VycmVudENhbGxMaXN0WzBdPy5uYW1lID8gY3VycmVudENhbGxMaXN0WzBdPy5uYW1lIDogY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB8fCAnVW5rbm93biBOdW1iZXInIH19PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiISFjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWVcIj57eyBjdXJyZW50Q2FsbExpc3RbMF0/LnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBDb25uZWN0aW5nIG92ZXJsYXkgKHNob3duIGFmdGVyIGFjY2VwdCBidG4gY2xpY2ssIGhpZGRlbiBvbiBBUEkgcmVzcG9uc2UpIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy1vdmVybGF5IG10LWF1dG9cIiAqbmdJZj1cImlzQ29ubmVjdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbm5lY3RpbmctZG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbm5lY3RpbmctdGV4dFwiPkNvbm5lY3RpbmcuLi48L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnMgbXQtYXV0b1wiICpuZ0lmPVwiIWlzQ29ubmVjdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LmlzQ2FsbENvbm5lY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZVwiIChjbGljayk9XCJhZGQoY3VycmVudENhbGxMaXN0WzBdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwib25SZWplY3RDYWxsKGN1cnJlbnRDYWxsTGlzdFswXSlcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgYWN0aXZlIGNhbGwgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIighaXNDb25mZXJlbmNlIHx8IGlzQ29uZmVyZW5jZUNhbGxIb2xkKSAmJiAoISFjdXJyZW50Q2FsbD8uaWQgJiYgIWN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpICYmIGN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiAnZmxleCcsICdmbGV4LWRpcmVjdGlvbic6ICdjb2x1bW4nLCAncG9zaXRpb24nOiAncmVsYXRpdmUnfVwiIGNsYXNzPVwiYWN0aXZlLWNhbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjdXJyZW50Q2FsbD8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8aDEgKm5nSWY9XCIhY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG9OYW1lIHx8ICdVbmtub3duMScgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDYWxsPy5mcm9tTmFtZSB8fCAnVW5rbm93bjInfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24zJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGw/LnRvTmFtZSB8fCAnVW5rbm93bjQnfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhY3VycmVudENhbGw/LmNsaWVudFwiPnt7IGN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LnRvIHx8ICdVbmtub3duJyA6IGN1cnJlbnRDYWxsPy5mcm9tIHx8ICdVbmtub3duJ319PC9wPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjdXJyZW50Q2FsbD8uY2xpZW50XCI+e3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbSB8fCAnVW5rbm93bicgOiBjdXJyZW50Q2FsbD8udG8gfHwgJ1Vua25vd24nfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW4tdG9wOiA0cHhcIj57e2N1cnJlbnRDYWxsPy50aW1lIHx8IHRpbWVyfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYWN0aW9uLWJ0bnNcIiAqbmdJZj1cIiFzaG93S2V5cGFkXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwiIWlzUmVjb3JkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCIgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGxheV9hcnJvdyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInRpbWVyLWRpc3BsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhbGwtaW5wdXRzXCIgaWQ9XCJjYWxsLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjYWxsSW5wdXRcIiAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaW5wdXQtY2xlYXItYnRuXCIgKm5nSWY9XCJjYWxsSW5wdXRcIiAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRuc1wiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc3MjN4J31cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZXZlbmx5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuIG1yLTNcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIiAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuIG1yLTNcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cInRvZ2dsZUtleXBhZCgpXCI+IHRyYW5zaXRpb25fZGlzc29sdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gZW5kLWNhbGwtYnRuXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCIgKGNsaWNrKT1cImVuZENhbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGNvbmZlcmVuY2UgY2FsbCB2aWV3IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25mZXJlbmNlLWNhbGwtdmlld1wiICpuZ0lmPVwiaXNDb25mZXJlbmNlICYmIGN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtaGVhZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBncm91cHMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLXRpdGxlXCI+Q29uZmVyZW5jZSBDYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGwtdGV4dCBjb25mLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYWxsIG9mIGN1cnJlbnRDYWxsTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNhbGw/LmlzQ29uZmVyZW5jZUhvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvdWxkU2hvd1NlcGFyYXRvcihpKVwiPiAmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2FsbD8uY2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlbGZOdW1iZXIoY2FsbCkgZWxzZSBzZWxmTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGNhbGw/LmZyb21OYW1lIHx8IGNhbGw/LmZyb20gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsPy50b05hbWUgfHwgY2FsbD8udG99fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGZOdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPllvdTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY2FsbD8uY2xpZW50XCI+e3tjYWxsPy5kaXJlY3Rpb24gPT0gXCJvdXRnb2luZy1jYWxsXCIgPyBjYWxsPy50b05hbWUgfHwgY2FsbD8udG8gOiBjYWxsPy5mcm9tTmFtZSB8fCBjYWxsPy5mcm9tIHx8ICdVbmtub3duIG51bWJlcid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLXRpbWVyXCI+e3sgdGltZXIgfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRucyBtdC1hdXRvXCIgKm5nSWY9XCIhc2hvd0tleXBhZFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICcyMHB4J31cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiIChjbGljayk9XCJwYXVzZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1BhdXNlZFwiIChjbGljayk9XCJyZXN1bWVSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0Rm9ybWF0dGVkVGltZSgpIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93S2V5cGFkXCIgY2xhc3M9XCJzZW5kRGlnaXQgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhbGwtaW5wdXRzXCIgaWQ9XCJjYWxsLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjYWxsSW5wdXRcIiAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaW5wdXQtY2xlYXItYnRuXCIgKm5nSWY9XCJjYWxsSW5wdXRcIiAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc011dGV9XCIgKGNsaWNrKT1cInRvZ2dsZU11dGUodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4ge3sgaXNNdXRlID8gJ21pY19vZmYnIDogJ21pYycgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiB0cmFuc2l0aW9uX2Rpc3NvbHZlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuIGRhbmdlclwiIChjbGljayk9XCJlbmRDb25mZXJlbmVjZUNhbGwoY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndhdmUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMjQgMTUwIDI4XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0tMTYwIDQ0YzMwIDAgNTgtMTggODgtMThzIDU4IDE4IDg4IDE4IDU4LTE4IDg4LTE4IDU4IDE4IDg4IDE4IHY0NGgtMzUyelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjBcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiM1wiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gSW5jb21pbmcgY2FsbCB1c2VyIGRldGFpbHMgc2hvd24gaW4gbW9kZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXItbW9kZWwgcC0zIHRleHQtd2hpdGUgbW9kZWwtY29udGVudCBjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNDbGlja0V4cGFuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIHVzZXItaW5mby1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlXCI+QzJDIC1QT0lOVCB7e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTFcIj5OYW1lOjwvaDU+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJ0ZXh0LXdoaXRlIHVzZXJOYW1lXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5uYW1lfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TnVtYmVyOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5udW1iZXJ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+RXh0ZW5zaW9uOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uZXh0ZW5zaW9ufX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+RW1haWw6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7c2VsZWN0ZWRVc2VySW5mbz8uZW1haWx9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5TdWJqZWN0OjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMiBzdWJqZWN0LXRleHRcIiB0aXRsZT1cInt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkVXNlckluZm8/LnN1YmplY3R9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTIgbWItMVwiPkltYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2UgJiYgc2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2UgIT09ICctJzsgZWxzZSBub0ltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e3NlbGVjdGVkVXNlckluZm8/LmltYWdlfX1cIiBhbHQ9XCJcIiB3aWR0aD1cIjE1MFwiIGNsYXNzPVwibWwtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5ObyBJbWFnZSBBdmFpbGFibGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPk1lc3NhZ2U6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb250YWluZXJcIiBbY2xhc3MuZXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubWVzc2FnZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRvZ2dsZS1idG5cIiAqbmdJZj1cInNob3dCdXR0b25cIiAoY2xpY2spPVwidG9nZ2xlVGV4dCgpXCI+e3sgaXNFeHBhbmRlZCA/ICdTZWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzJyA6ICdTZWUgbW9yZScgfX08L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5Qb2ludCBOYW1lOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5wb2ludE5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+U291cmNlIE5hbWU6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/LnNvdXJjZU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBjb250YWN0IGxpc3QgcGFuZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtcGFuZWxcIiAqbmdJZj1cInNob3dDb250YWN0c1BhbmVsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2PlBhcnRpY2lwYW50PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgIDxwPjwvcD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBkaWFsLWNsb3NlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKHt9LCB0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTRUFSQ0ggSU5QVVQgKHZpc2libGUgd2hlbiBpc1NlYXJjaFZpc2libGUgPSB0cnVlKSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhciBwLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiAoaW5wdXQpPVwiYXBwbHlGaWx0ZXIoKVwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFjdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiIFtzcmNdPVwiYz8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj57e2M/LmZpcnN0TmFtZX19IHt7Yz8ubWlkZGxlTmFtZX19IHt7Yz8ubGFzdE5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIj57eyAoYz8ubnVtYmVyc0xpc3QgJiYgYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlcikgfX17eyBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyTGFiZWwgPyAnICgnICsgYy5udW1iZXJzTGlzdFswXS5udW1iZXJMYWJlbCArICcpJyA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG4gbXItMlwiIChjbGljayk9XCJjYWxsQ29udGFjdChjKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjPy5Jc0Nvbm5lY3RlZFwiIHRpdGxlPVwiQWRkIHRvIGNvbmZlcmVuY2UgY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIsIHRydWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZExpc3QubGVuZ3RoICYmIGlzRGlyZWN0Q2FsbE9wdGlvblNob3cgJiYgc2VhcmNoVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCInYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IHNlYXJjaFRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgdG8gY29uZmVyZW5jZSBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPnt7c2VsZWN0ZWRDb25mTmFtZX19J3MgYWN0aXZlIHBhcnRpY2lwYW50czwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtYi0yIG10LTFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0lmPVwiIWM/LmlzTGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiIWM/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgKm5nSWY9XCJjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogYz8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiICpuZ0lmPVwiIWM/LmNsaWVudFwiPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvTmFtZSB8fCAnVW5rbm93bicgOiBjPy5mcm9tTmFtZSB8fCAnVW5rbm93bid9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG8gfHwgJ1Vua25vd24nIDogYz8uZnJvbSB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiICpuZ0lmPVwiYz8uY2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VsZk51bWJlcihjKSBlbHNlIHNlbGZOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tTmFtZSB8fCAnVW5rbm93bicgOiBjPy50b05hbWUgfHwgJ1Vua25vd24nfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZk51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Zb3U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tIHx8ICdVbmtub3duJyA6IGM/LnRvIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiAqbmdJZj1cImM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYz8uam9pbmVkICYmICFjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25uZWN0aW5nLXdyYXBwZXIgbXItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyaW5naW5nLXRleHRcIj5SaW5naW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYz8uam9pbmVkIHx8IGM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pYy1idG4gbXItMlwiIFtkaXNhYmxlZF09XCJjPy5pc0hvbGRcIiAoY2xpY2spPVwib25NdXRlVXNlcihjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJjPy5pc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFjPy5pc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmlzSG9sZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhvbGRDYWxsKGMpXCIgKm5nSWY9XCIhYz8uaG9zdFwiIFtkaXNhYmxlZF09XCJpc0hvbGRCdG5EaXNhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjPy5pc0hvbGRcIiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBbdGl0bGVdPVwiJ0hvbGQnXCI+IHBob25lX3BhdXNlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYz8uaXNIb2xkXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIidSZXN1bWUnXCI+IHJlc3VtZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJlbmRDb25mZXJlbmVjZUNhbGwoYylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImM/Lmhvc3QgJiYgKGRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoYz8uZnJvbSkgfHwgKGRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoYz8udG8pICYmIGM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGhyIGNsYXNzPVwibS0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIHB4LTJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTAgdGl0bGVcIj5QYXJ0aWNpcGFudCBhZGRlZCB0byB0aGUgY2FsbDwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtYi0yIG10LTFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0lmPVwiYz8uaXNMZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgKm5nSWY9XCIhYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cImM/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG8gfHwgJ1Vua25vd24nIDogYz8uZnJvbSB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCIgKm5nSWY9XCJjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tTmFtZSB8fCAnVW5rbm93bicgOiBjPy50b05hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCJjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSB8fCAnVW5rbm93bicgOiBjPy50byB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgKm5nSWY9XCJjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1sYWJlbFwiPk9yZ2FuaXplcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbm5lY3Rpbmctd3JhcHBlclwiICpuZ0lmPVwiYz8uam9pbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmluZ2luZy10ZXh0XCI+UmluZ2luZzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjLCBmYWxzZSwgdHJ1ZSlcIiAqbmdJZj1cIiFjPy5ob3N0ICYmIGM/LmpvaW5lZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG5cIiAqbmdJZj1cIiFjPy5jbGllbnQgJiYgIWM/LmpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIDogYz8uZnJvbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5SZWpvaW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuXCIgKm5nSWY9XCJjPy5jbGllbnQgJiYgIWM/LmpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb20gOiBjPy50bylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5SZWpvaW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENvbmZlcmVuY2UgV2FybmluZyBNb2RhbCAtLT5cclxuPGRpdiBjbGFzcz1cImN1c3RvbS1tb2RhbFwiICpuZ0lmPVwic2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWxcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCB3YXJuaW5nLW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPndhcm5pbmc8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMz5Db25mZXJlbmNlIENhbGwgV2FybmluZzwvaDM+XHJcbiAgICA8cD5cclxuICAgICAgU3RhcnRpbmcgYSBuZXcgY2FsbCB3aWxsIHB1dCB0aGUgY3VycmVudCBjb25mZXJlbmNlIG9uIGhvbGRcclxuICAgICAgYW5kIGNhbm5vdCBiZSBtZXJnZWQgbGF0ZXIuXHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbE5ld0NhbGwoKVwiPlxyXG4gICAgICAgIENhbmNlbFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInByb2NlZWQtYnRuXCIgKGNsaWNrKT1cImNvbmZpcm1OZXdDYWxsKClcIj5cclxuICAgICAgICBQcm9jZWVkXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtaW4tY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzTWluaW1pc2VkXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZnVsbHNjcmVlblwiIChjbGljayk9XCJtYXhpbWlzZURpYWxwYWQoKVwiPiBvcGVuX2luX2Z1bGwgPC9zcGFuPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IHdpZHRoOiAxMDAlXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWFuaW1hdGlvblwiIGlkPVwiY2FsbC1hdmF0YXJcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJtaW4tYXZhdGFyLWltZ1wiIFtzcmNdPVwiY2FsbERhdGEuaW1nXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Y2FsbERhdGEubmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiAwXCI+e3tjYWxsRGF0YS5kaXNwbGF5TnVtID8gY2FsbERhdGEuZGlzcGxheU51bSA6IGNhbGxEYXRhLnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbi1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi10aW1lclwiPnt7dGltZXJ9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtaW4tY2FsbC1zZWMtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIiAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjwhLS0gQ2FsbCBEaXNjb25uZWN0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiY3VzdG9tLW1vZGFsXCIgKm5nSWY9XCJzaG93RGlzY29ubmVjdE1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCBwLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyIHAtMCBwYi0yXCI+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cInRpdGxlIG1iLTBcIj57e3NlbGVjdGVkQ29uZj8uY29uTmFtZSB8fCAnQ2FsbCd9fSBEaXNjb25uZWN0PC9oND5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFudC1ib2R5IG1iLTJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBFeGl0aW5nIHRoaXMgY2FsbCB3aWxsIG5vdCBlbmQgdGhlIGNvbmZlcmVuY2UuIFRoZSBzZXNzaW9uIHdpbGwgY29udGludWUsIGFuZCBjaGFyZ2VzIHdpbGwgaW5jdXIgdG9cclxuICAgICAgICAgICAgICAgIHlvdXJcclxuICAgICAgICAgICAgICAgIGFjY291bnQuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMCBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNSZWFzb25DaGVja2VkXCIgY2xhc3M9XCJtZS0yXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci0yNGhyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBIb3VyIHBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtc2VsZWN0XCIgW2NsYXNzLmRpc2FibGVkLXBpY2tlcl09XCIhaXNSZWFzb25DaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1kaXNwbGF5XCIgKGNsaWNrKT1cImlzUmVhc29uQ2hlY2tlZCAmJiB0b2dnbGVIb3VyRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVhdmVIb3VyIHx8ICdISCcgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlja2VyLWFycm93XCI+JiM5NjYwOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1vcHRpb25zXCIgKm5nSWY9XCJzaG93SG91ckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGggb2YgaG91cnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwibGVhdmVIb3VyID09PSBoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEhvdXIoaClcIj57eyBoIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBcIj46PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTWludXRlIHBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtc2VsZWN0XCIgW2NsYXNzLmRpc2FibGVkLXBpY2tlcl09XCIhaXNSZWFzb25DaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZS1kaXNwbGF5XCIgKGNsaWNrKT1cImlzUmVhc29uQ2hlY2tlZCAmJiB0b2dnbGVNaW51dGVEcm9wZG93bigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZWF2ZU1pbnV0ZSB8fCAnTU0nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1hcnJvd1wiPiYjOTY2MDs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uc1wiICpuZ0lmPVwic2hvd01pbnV0ZURyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG0gb2YgbWludXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJsZWF2ZU1pbnV0ZSA9PT0gbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNaW51dGUobSlcIj57eyBtIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGVuZC1idG5cIiAoY2xpY2spPVwibGVhdmVDb25mZXJlbmNlKClcIiBbZGlzYWJsZWRdPVwiaXNSZWFzb25DaGVja2VkICYmICghbGVhdmVIb3VyIHx8ICFsZWF2ZU1pbnV0ZSlcIj5cclxuICAgICAgICAgICAgICAgIExlYXZlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGVuZC1idG5cIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5jZSgpXCIgKm5nSWY9XCJzaG93RW5kQWxsQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICBFbmQgQWxsXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==