@vgroup/dialbox 0.4.101 → 0.4.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/call-progress/call-progress.component.mjs +3 -3
- package/esm2020/lib/environments/environments.mjs +1 -1
- package/fesm2015/vgroup-dialbox.mjs +2 -2
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +2 -2
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1570,10 +1570,10 @@ export class CallProgressComponent {
|
|
|
1570
1570
|
}
|
|
1571
1571
|
}
|
|
1572
1572
|
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 }], target: i0.ɵɵFactoryTarget.Component });
|
|
1573
|
-
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", deviceId: "deviceId" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\n <!-- All type Call Hold list -->\n <div class=\"held-call-banner\"\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\n <div class=\"held-call-content\" *ngIf=\"isConferenceCallHold\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">Conference Call</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': isConferenceCallHold }\" (click)=\"swapCalls({},true)\">\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n </div>\n </div>\n <ng-container *ngFor=\"let heldCall of currentCallList\">\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isHold && !heldCall?.isConference\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': heldCall?.isHold }\" (click)=\"swapCalls(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"{{heldCall?.isHold? 'Resume':'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" *ngIf=\"heldCall?.isIncomingCall\"\n (click)=\"onClickExpand(heldCall)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n <!-- <button class=\"held-btn swap-btn\" (click)=\"swapCalls(heldCall)\" title=\"Swap calls\">\n <span class=\"material-symbols-outlined swap-icon\">swap_vert</span>\n </button> -->\n </div>\n </div>\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isIncomingCall && !heldCall?.isAcceptCall\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">phone_callback</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Incoming Call</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"banner-btn receive-btn\" *ngIf=\"!heldCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"add(heldCall)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper banner-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(heldCall)\"> call_end\n </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(heldCall)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Compact banners for concurrent incoming (one per call) -->\n <ng-container *ngIf=\"currentCallList.length > 1 && !currentCall?.id\">\n <div class=\"incoming-banners-container\" *ngIf=\"!isConference && currentCallList.length > 1\">\n <div class=\"\">\n <ng-container *ngFor=\"let inc of currentCallList; let i = index\">\n <div class=\"incoming-banner\" *ngIf=\"inc?.isIncomingCall && !inc?.isAcceptCall\"\n [ngStyle]=\"{ top: ((isCallOnHold && heldCall) ? 64 : 0) + (i * 70) + 'px' }\">\n <div class=\"incoming-banner-content\">\n <div class=\"incoming-info\">\n <span class=\"incom ing-label\">Incoming call</span>\n <div class=\"incoming-caller\">\n <span class=\"caller-name\">{{ inc?.userInfo?.c2cInformation?.name ||\n inc?.customParameters?.get('name') || '-' }}</span>\n <span class=\"caller-number\">{{ inc?.userInfo?.c2cInformation?.number ||\n inc?.parameters?.From || '' }}</span>\n </div>\n </div>\n <div class=\"incoming-actions\">\n <button class=\"banner-btn accept-btn\" (click)=\"add(inc)\">\n <span class=\"material-symbols-outlined\">call</span>\n </button>\n <button class=\"banner-btn reject-btn\" (click)=\"onEndCall(inc)\">\n <span class=\"material-symbols-outlined\">call_end</span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(inc)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- For single incoming call -->\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\n Number'}}</span>\n </div>\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\n <p *ngIf=\"currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\n </div>\n\n <div class=\"call-action-btns mt-auto\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\n </button>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\n </span>\n </button>\n </div>\n </div>\n\n <!-- For multiple incoming calls but not any call progress -->\n\n\n <!-- For single active call -->\n <div *ngIf=\"(!isConference || isConferenceCallHold) && !!currentCall?.id\"\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\n\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCall?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\n </h1>\n <p>{{currentCall?.phone }}</p>\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\n </div>\n\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\n [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\n <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\n [disabled]=\"currentCallList.length < 2\">\n <span>Merge</span>\n </button>\n </div>\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleMute()\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n\n </button>\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\n </span>\n </button>\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div>\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n <!-- <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of contacts\">\n <img class=\"contact-avatar\" [src]=\"c.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c.firstName}} {{c.middleName}} {{c.lastName}}</div>\n <div class=\"contact-title\">{{ (c.numbersList && c.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n </div>\n </div>\n </div> -->\n\n\n <!-- <div class=\"mt-2 px-3 call-info-wrapper \" [ngClass]=\"{'open-collops': isCollops}\">\n <div class=\"text-center\" >\n <i class=\"fa fa-angle-down\" *ngIf=\"isCollops\" (click)=\"isCollops = !isCollops\"></i>\n <i class=\"fa fa-angle-up\" *ngIf=\"!isCollops\" (click)=\"isCollops = !isCollops\"></i>\n </div>\n <ng-container *ngIf=\"isCollops\">\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div >First Name:</div>\n <div >test ttttt</div>\n </div>\n <div class=\"col-6\">\n <div>Last Name:</div>\n <div>tetst test </div>\n </div>\n </div>\n <div class=\"mb-2\">\n <div class=\"\">Email:</div>\n <div class=\"\">abcdeft@vgroup.com</div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Number:</div>\n <div class=\"\">63545985264225</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"\">English</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Image :</div>\n <div class=\"\">test.jpg </div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Extension :</div>\n <div class=\"\">4596</div>\n </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">Note :</div>\n <div class=\"\">tes test test </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">\n <div class=\"\">Subject:</div>\n <div class=\"\">hello world | test</div>\n </div>\n </div>\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"\">test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test </div>\n </div>\n </div>\n </ng-container>\n </div> -->\n </div>\n\n\n <!-- conference call view -->\n <div class=\"conference-call-view\" *ngIf=\"isConference && !isConferenceCallHold\">\n <div class=\"conf-heading\">\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\n <span class=\"conf-title\">Conference Call</span>\n </div>\n\n <div class=\"scroll-container\">\n <div class=\"scroll-text conf-name\">\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\n <ng-container *ngIf=\"call?.isConference\">\n <span *ngIf=\"i != 0\">&</span>\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"conf-timer\">{{ timer }}</div>\n <!-- <div class=\"conf-record\">\n <button class=\"record-stop-btn\" *ngIf=\"isRecording\" (click)=\"toggleRecording()\" title=\"Stop Recording\">\n <span class=\"material-symbols-outlined\"> stop_circle </span>\n </button>\n </div> -->\n\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <!-- <div class=\"conf-remove\">\n <button class=\"remove-btn\" (click)=\"addRemoveParticipant()\">Remove</button>\n </div> -->\n\n <div class=\"conf-actions\">\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div class=\"conf-end\">\n <button class=\"circle-btn danger\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\"\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <!-- <use\n xlink:href=\"#gentle-wave\"\n x=\"48\"\n y=\"5\"\n fill=\"rgba(255,255,255,0.3)\"\n /> -->\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n <!-- </ng-container> -->\n </div>\n\n <!-- Add remove participant panel -->\n <div class=\"contacts-panel\" *ngIf=\"isAddRemoveParticipant && false\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel(true)\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of filteredList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </div>\n </div>\n\n <!-- Incoming call user details shown in model -->\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\n <div class=\"mb-2 user-info-section\" >\n <div class=\"text-center my-3\">\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\n </div>\n <!-- <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"'assets/images/user.jpg'\" alt=\"\" width=\"100\" />\n </div> -->\n <div class=\"mb-3\">\n <h5 class=\"text-white mb-1\">Name:</h5>\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Number:</div>\n <div class=\"\">{{selectedUserInfo?.number}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Extension:</div>\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Email: </div>\n <div>{{selectedUserInfo?.email}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">{{selectedUserInfo?.subject}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2 mb-1\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div>\n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"mb-1\">Message:</div>\n <div>\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}</div>\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See less' : 'See more' }}</small>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Point Name:</div>\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Source Name:</div>\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div> -->\n </div>\n </div>\n\n <!-- contact list panel -->\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <!-- <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span> -->\n <div class=\"title\">Contacts</div>\n <div class=\"d-flex justify-content-between\">\n <p></p>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#000000\"><path 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\"/></svg>\n </span>\n </div>\n </div>\n\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\n <div class=\"search-bar p-3\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\n </div>\n <div class=\"contacts-list\">\n <!-- <ng-container *ngFor=\"let c of filteredList; let i = index\"> -->\n <div class=\"px-2\">\n <h5 class=\"mb-0\">In This Call</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <div class=\"contact-item\">\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">You\n </div>\n <div class=\"contact-title\">{{selectedCallerId?.number}}</div>\n </div>\n </div>\n <div class=\"contact-item\" *ngFor=\"let c of filteredParticipentList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n <hr class=\"m-2\">\n <div class=\"mt-3 px-2\">\n <h5 class=\"mb-0\">Contacts</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <ng-container *ngFor=\"let c of filteredList\">\n <div class=\"contact-item\" *ngIf=\"!c?.IsConnected\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n <!-- <button class=\"call-sec-btn mr-3\" [disabled]=\"c?.hold\"\n (click)=\"onMuteUser(c)\">\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\n </button> -->\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </ng-container>\n <!-- </ng-container> -->\n </div>\n </div>\n</div>\n\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\n <div style=\"display: flex; width: 100%\">\n <div>\n <div class=\"min-call-animation\" id=\"call-avatar\">\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\n </div>\n </div>\n <div>\n <div class=\"min-callerDetails\">\n <div class=\"name\">\n {{callData.name}}\n </div>\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\n </div>\n </div>\n </div>\n <div class=\"min-btn-container\">\n <div class=\"min-timer\">{{timer}}</div>\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\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:hidden}.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}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-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}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.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:44px;height:44px;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:6px 10px;cursor:pointer}.conference-hold-contact{display:inline-flex;align-items:center;gap:6px;background:#727070;color:#fff;border:none;border-radius:50%;padding:8px 9px;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:6px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.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}.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}.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}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
1573
|
+
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", deviceId: "deviceId" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\n <!-- All type Call Hold list -->\n <div class=\"held-call-banner\"\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\n <div class=\"held-call-content\" *ngIf=\"isConferenceCallHold\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">Conference Call</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': isConferenceCallHold }\" (click)=\"swapCalls({},true)\">\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n </div>\n </div>\n <ng-container *ngFor=\"let heldCall of currentCallList\">\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isHold && !heldCall?.isConference\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': heldCall?.isHold }\" (click)=\"swapCalls(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"{{heldCall?.isHold? 'Resume':'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" *ngIf=\"heldCall?.isIncomingCall\"\n (click)=\"onClickExpand(heldCall)\" [ngClass]=\"{'disabled': !heldCall?.businessNumber}\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n <!-- <button class=\"held-btn swap-btn\" (click)=\"swapCalls(heldCall)\" title=\"Swap calls\">\n <span class=\"material-symbols-outlined swap-icon\">swap_vert</span>\n </button> -->\n </div>\n </div>\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isIncomingCall && !heldCall?.isAcceptCall\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">phone_callback</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Incoming Call</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"banner-btn receive-btn\" *ngIf=\"!heldCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"add(heldCall)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper banner-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(heldCall)\"> call_end\n </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(heldCall)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Compact banners for concurrent incoming (one per call) -->\n <ng-container *ngIf=\"currentCallList.length > 1 && !currentCall?.id\">\n <div class=\"incoming-banners-container\" *ngIf=\"!isConference && currentCallList.length > 1\">\n <div class=\"\">\n <ng-container *ngFor=\"let inc of currentCallList; let i = index\">\n <div class=\"incoming-banner\" *ngIf=\"inc?.isIncomingCall && !inc?.isAcceptCall\"\n [ngStyle]=\"{ top: ((isCallOnHold && heldCall) ? 64 : 0) + (i * 70) + 'px' }\">\n <div class=\"incoming-banner-content\">\n <div class=\"incoming-info\">\n <span class=\"incom ing-label\">Incoming call</span>\n <div class=\"incoming-caller\">\n <span class=\"caller-name\">{{ inc?.userInfo?.c2cInformation?.name ||\n inc?.customParameters?.get('name') || '-' }}</span>\n <span class=\"caller-number\">{{ inc?.userInfo?.c2cInformation?.number ||\n inc?.parameters?.From || '' }}</span>\n </div>\n </div>\n <div class=\"incoming-actions\">\n <button class=\"banner-btn accept-btn\" (click)=\"add(inc)\">\n <span class=\"material-symbols-outlined\">call</span>\n </button>\n <button class=\"banner-btn reject-btn\" (click)=\"onEndCall(inc)\">\n <span class=\"material-symbols-outlined\">call_end</span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(inc)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- For single incoming call -->\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\n Number'}}</span>\n </div>\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\n <p *ngIf=\"currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\n </div>\n\n <div class=\"call-action-btns mt-auto\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\n </button>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\n </span>\n </button>\n </div>\n </div>\n\n <!-- For multiple incoming calls but not any call progress -->\n\n\n <!-- For single active call -->\n <div *ngIf=\"(!isConference || isConferenceCallHold) && !!currentCall?.id\"\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\n\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCall?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\n </h1>\n <p>{{currentCall?.phone }}</p>\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\n </div>\n\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\n [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\n <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\n [disabled]=\"currentCallList.length < 2\">\n <span>Merge</span>\n </button>\n </div>\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleMute()\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n\n </button>\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\n </span>\n </button>\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div>\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n <!-- <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of contacts\">\n <img class=\"contact-avatar\" [src]=\"c.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c.firstName}} {{c.middleName}} {{c.lastName}}</div>\n <div class=\"contact-title\">{{ (c.numbersList && c.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n </div>\n </div>\n </div> -->\n\n\n <!-- <div class=\"mt-2 px-3 call-info-wrapper \" [ngClass]=\"{'open-collops': isCollops}\">\n <div class=\"text-center\" >\n <i class=\"fa fa-angle-down\" *ngIf=\"isCollops\" (click)=\"isCollops = !isCollops\"></i>\n <i class=\"fa fa-angle-up\" *ngIf=\"!isCollops\" (click)=\"isCollops = !isCollops\"></i>\n </div>\n <ng-container *ngIf=\"isCollops\">\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div >First Name:</div>\n <div >test ttttt</div>\n </div>\n <div class=\"col-6\">\n <div>Last Name:</div>\n <div>tetst test </div>\n </div>\n </div>\n <div class=\"mb-2\">\n <div class=\"\">Email:</div>\n <div class=\"\">abcdeft@vgroup.com</div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Number:</div>\n <div class=\"\">63545985264225</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"\">English</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Image :</div>\n <div class=\"\">test.jpg </div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Extension :</div>\n <div class=\"\">4596</div>\n </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">Note :</div>\n <div class=\"\">tes test test </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">\n <div class=\"\">Subject:</div>\n <div class=\"\">hello world | test</div>\n </div>\n </div>\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"\">test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test </div>\n </div>\n </div>\n </ng-container>\n </div> -->\n </div>\n\n\n <!-- conference call view -->\n <div class=\"conference-call-view\" *ngIf=\"isConference && !isConferenceCallHold\">\n <div class=\"conf-heading\">\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\n <span class=\"conf-title\">Conference Call</span>\n </div>\n\n <div class=\"scroll-container\">\n <div class=\"scroll-text conf-name\">\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\n <ng-container *ngIf=\"call?.isConference\">\n <span *ngIf=\"i != 0\">&</span>\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"conf-timer\">{{ timer }}</div>\n <!-- <div class=\"conf-record\">\n <button class=\"record-stop-btn\" *ngIf=\"isRecording\" (click)=\"toggleRecording()\" title=\"Stop Recording\">\n <span class=\"material-symbols-outlined\"> stop_circle </span>\n </button>\n </div> -->\n\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <!-- <div class=\"conf-remove\">\n <button class=\"remove-btn\" (click)=\"addRemoveParticipant()\">Remove</button>\n </div> -->\n\n <div class=\"conf-actions\">\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div class=\"conf-end\">\n <button class=\"circle-btn danger\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\"\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <!-- <use\n xlink:href=\"#gentle-wave\"\n x=\"48\"\n y=\"5\"\n fill=\"rgba(255,255,255,0.3)\"\n /> -->\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n <!-- </ng-container> -->\n </div>\n\n <!-- Add remove participant panel -->\n <div class=\"contacts-panel\" *ngIf=\"isAddRemoveParticipant && false\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel(true)\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of filteredList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </div>\n </div>\n\n <!-- Incoming call user details shown in model -->\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\n <div class=\"mb-2 user-info-section\" >\n <div class=\"text-center my-3\">\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\n </div>\n <!-- <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"'assets/images/user.jpg'\" alt=\"\" width=\"100\" />\n </div> -->\n <div class=\"mb-3\">\n <h5 class=\"text-white mb-1\">Name:</h5>\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Number:</div>\n <div class=\"\">{{selectedUserInfo?.number}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Extension:</div>\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Email: </div>\n <div>{{selectedUserInfo?.email}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">{{selectedUserInfo?.subject}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2 mb-1\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div>\n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"mb-1\">Message:</div>\n <div>\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}</div>\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See less' : 'See more' }}</small>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Point Name:</div>\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Source Name:</div>\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div> -->\n </div>\n </div>\n\n <!-- contact list panel -->\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <!-- <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span> -->\n <div class=\"title\">Contacts</div>\n <div class=\"d-flex justify-content-between\">\n <p></p>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#000000\"><path 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\"/></svg>\n </span>\n </div>\n </div>\n\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\n <div class=\"search-bar p-3\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\n </div>\n <div class=\"contacts-list\">\n <!-- <ng-container *ngFor=\"let c of filteredList; let i = index\"> -->\n <div class=\"px-2\">\n <h5 class=\"mb-0\">In This Call</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <div class=\"contact-item\">\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">You\n </div>\n <div class=\"contact-title\">{{selectedCallerId?.number}}</div>\n </div>\n </div>\n <div class=\"contact-item\" *ngFor=\"let c of filteredParticipentList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n <hr class=\"m-2\">\n <div class=\"mt-3 px-2\">\n <h5 class=\"mb-0\">Contacts</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <ng-container *ngFor=\"let c of filteredList\">\n <div class=\"contact-item\" *ngIf=\"!c?.IsConnected\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n <!-- <button class=\"call-sec-btn mr-3\" [disabled]=\"c?.hold\"\n (click)=\"onMuteUser(c)\">\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\n </button> -->\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </ng-container>\n <!-- </ng-container> -->\n </div>\n </div>\n</div>\n\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\n <div style=\"display: flex; width: 100%\">\n <div>\n <div class=\"min-call-animation\" id=\"call-avatar\">\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\n </div>\n </div>\n <div>\n <div class=\"min-callerDetails\">\n <div class=\"name\">\n {{callData.name}}\n </div>\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\n </div>\n </div>\n </div>\n <div class=\"min-btn-container\">\n <div class=\"min-timer\">{{timer}}</div>\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\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:hidden}.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}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-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}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.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:44px;height:44px;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:6px 10px;cursor:pointer}.conference-hold-contact{display:inline-flex;align-items:center;gap:6px;background:#727070;color:#fff;border:none;border-radius:50%;padding:8px 9px;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:6px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.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}.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}.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}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
1574
1574
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, decorators: [{
|
|
1575
1575
|
type: Component,
|
|
1576
|
-
args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\n <!-- All type Call Hold list -->\n <div class=\"held-call-banner\"\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\n <div class=\"held-call-content\" *ngIf=\"isConferenceCallHold\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">Conference Call</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': isConferenceCallHold }\" (click)=\"swapCalls({},true)\">\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n </div>\n </div>\n <ng-container *ngFor=\"let heldCall of currentCallList\">\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isHold && !heldCall?.isConference\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': heldCall?.isHold }\" (click)=\"swapCalls(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"{{heldCall?.isHold? 'Resume':'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" *ngIf=\"heldCall?.isIncomingCall\"\n (click)=\"onClickExpand(heldCall)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n <!-- <button class=\"held-btn swap-btn\" (click)=\"swapCalls(heldCall)\" title=\"Swap calls\">\n <span class=\"material-symbols-outlined swap-icon\">swap_vert</span>\n </button> -->\n </div>\n </div>\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isIncomingCall && !heldCall?.isAcceptCall\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">phone_callback</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Incoming Call</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"banner-btn receive-btn\" *ngIf=\"!heldCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"add(heldCall)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper banner-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(heldCall)\"> call_end\n </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(heldCall)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Compact banners for concurrent incoming (one per call) -->\n <ng-container *ngIf=\"currentCallList.length > 1 && !currentCall?.id\">\n <div class=\"incoming-banners-container\" *ngIf=\"!isConference && currentCallList.length > 1\">\n <div class=\"\">\n <ng-container *ngFor=\"let inc of currentCallList; let i = index\">\n <div class=\"incoming-banner\" *ngIf=\"inc?.isIncomingCall && !inc?.isAcceptCall\"\n [ngStyle]=\"{ top: ((isCallOnHold && heldCall) ? 64 : 0) + (i * 70) + 'px' }\">\n <div class=\"incoming-banner-content\">\n <div class=\"incoming-info\">\n <span class=\"incom ing-label\">Incoming call</span>\n <div class=\"incoming-caller\">\n <span class=\"caller-name\">{{ inc?.userInfo?.c2cInformation?.name ||\n inc?.customParameters?.get('name') || '-' }}</span>\n <span class=\"caller-number\">{{ inc?.userInfo?.c2cInformation?.number ||\n inc?.parameters?.From || '' }}</span>\n </div>\n </div>\n <div class=\"incoming-actions\">\n <button class=\"banner-btn accept-btn\" (click)=\"add(inc)\">\n <span class=\"material-symbols-outlined\">call</span>\n </button>\n <button class=\"banner-btn reject-btn\" (click)=\"onEndCall(inc)\">\n <span class=\"material-symbols-outlined\">call_end</span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(inc)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- For single incoming call -->\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\n Number'}}</span>\n </div>\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\n <p *ngIf=\"currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\n </div>\n\n <div class=\"call-action-btns mt-auto\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\n </button>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\n </span>\n </button>\n </div>\n </div>\n\n <!-- For multiple incoming calls but not any call progress -->\n\n\n <!-- For single active call -->\n <div *ngIf=\"(!isConference || isConferenceCallHold) && !!currentCall?.id\"\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\n\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCall?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\n </h1>\n <p>{{currentCall?.phone }}</p>\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\n </div>\n\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\n [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\n <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\n [disabled]=\"currentCallList.length < 2\">\n <span>Merge</span>\n </button>\n </div>\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleMute()\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n\n </button>\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\n </span>\n </button>\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div>\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n <!-- <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of contacts\">\n <img class=\"contact-avatar\" [src]=\"c.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c.firstName}} {{c.middleName}} {{c.lastName}}</div>\n <div class=\"contact-title\">{{ (c.numbersList && c.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n </div>\n </div>\n </div> -->\n\n\n <!-- <div class=\"mt-2 px-3 call-info-wrapper \" [ngClass]=\"{'open-collops': isCollops}\">\n <div class=\"text-center\" >\n <i class=\"fa fa-angle-down\" *ngIf=\"isCollops\" (click)=\"isCollops = !isCollops\"></i>\n <i class=\"fa fa-angle-up\" *ngIf=\"!isCollops\" (click)=\"isCollops = !isCollops\"></i>\n </div>\n <ng-container *ngIf=\"isCollops\">\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div >First Name:</div>\n <div >test ttttt</div>\n </div>\n <div class=\"col-6\">\n <div>Last Name:</div>\n <div>tetst test </div>\n </div>\n </div>\n <div class=\"mb-2\">\n <div class=\"\">Email:</div>\n <div class=\"\">abcdeft@vgroup.com</div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Number:</div>\n <div class=\"\">63545985264225</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"\">English</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Image :</div>\n <div class=\"\">test.jpg </div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Extension :</div>\n <div class=\"\">4596</div>\n </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">Note :</div>\n <div class=\"\">tes test test </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">\n <div class=\"\">Subject:</div>\n <div class=\"\">hello world | test</div>\n </div>\n </div>\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"\">test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test </div>\n </div>\n </div>\n </ng-container>\n </div> -->\n </div>\n\n\n <!-- conference call view -->\n <div class=\"conference-call-view\" *ngIf=\"isConference && !isConferenceCallHold\">\n <div class=\"conf-heading\">\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\n <span class=\"conf-title\">Conference Call</span>\n </div>\n\n <div class=\"scroll-container\">\n <div class=\"scroll-text conf-name\">\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\n <ng-container *ngIf=\"call?.isConference\">\n <span *ngIf=\"i != 0\">&</span>\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"conf-timer\">{{ timer }}</div>\n <!-- <div class=\"conf-record\">\n <button class=\"record-stop-btn\" *ngIf=\"isRecording\" (click)=\"toggleRecording()\" title=\"Stop Recording\">\n <span class=\"material-symbols-outlined\"> stop_circle </span>\n </button>\n </div> -->\n\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <!-- <div class=\"conf-remove\">\n <button class=\"remove-btn\" (click)=\"addRemoveParticipant()\">Remove</button>\n </div> -->\n\n <div class=\"conf-actions\">\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div class=\"conf-end\">\n <button class=\"circle-btn danger\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\"\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <!-- <use\n xlink:href=\"#gentle-wave\"\n x=\"48\"\n y=\"5\"\n fill=\"rgba(255,255,255,0.3)\"\n /> -->\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n <!-- </ng-container> -->\n </div>\n\n <!-- Add remove participant panel -->\n <div class=\"contacts-panel\" *ngIf=\"isAddRemoveParticipant && false\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel(true)\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of filteredList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </div>\n </div>\n\n <!-- Incoming call user details shown in model -->\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\n <div class=\"mb-2 user-info-section\" >\n <div class=\"text-center my-3\">\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\n </div>\n <!-- <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"'assets/images/user.jpg'\" alt=\"\" width=\"100\" />\n </div> -->\n <div class=\"mb-3\">\n <h5 class=\"text-white mb-1\">Name:</h5>\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Number:</div>\n <div class=\"\">{{selectedUserInfo?.number}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Extension:</div>\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Email: </div>\n <div>{{selectedUserInfo?.email}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">{{selectedUserInfo?.subject}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2 mb-1\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div>\n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"mb-1\">Message:</div>\n <div>\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}</div>\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See less' : 'See more' }}</small>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Point Name:</div>\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Source Name:</div>\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div> -->\n </div>\n </div>\n\n <!-- contact list panel -->\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <!-- <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span> -->\n <div class=\"title\">Contacts</div>\n <div class=\"d-flex justify-content-between\">\n <p></p>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#000000\"><path 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\"/></svg>\n </span>\n </div>\n </div>\n\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\n <div class=\"search-bar p-3\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\n </div>\n <div class=\"contacts-list\">\n <!-- <ng-container *ngFor=\"let c of filteredList; let i = index\"> -->\n <div class=\"px-2\">\n <h5 class=\"mb-0\">In This Call</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <div class=\"contact-item\">\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">You\n </div>\n <div class=\"contact-title\">{{selectedCallerId?.number}}</div>\n </div>\n </div>\n <div class=\"contact-item\" *ngFor=\"let c of filteredParticipentList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n <hr class=\"m-2\">\n <div class=\"mt-3 px-2\">\n <h5 class=\"mb-0\">Contacts</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <ng-container *ngFor=\"let c of filteredList\">\n <div class=\"contact-item\" *ngIf=\"!c?.IsConnected\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n <!-- <button class=\"call-sec-btn mr-3\" [disabled]=\"c?.hold\"\n (click)=\"onMuteUser(c)\">\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\n </button> -->\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </ng-container>\n <!-- </ng-container> -->\n </div>\n </div>\n</div>\n\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\n <div style=\"display: flex; width: 100%\">\n <div>\n <div class=\"min-call-animation\" id=\"call-avatar\">\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\n </div>\n </div>\n <div>\n <div class=\"min-callerDetails\">\n <div class=\"name\">\n {{callData.name}}\n </div>\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\n </div>\n </div>\n </div>\n <div class=\"min-btn-container\">\n <div class=\"min-timer\">{{timer}}</div>\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\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:hidden}.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}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-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}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.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:44px;height:44px;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:6px 10px;cursor:pointer}.conference-hold-contact{display:inline-flex;align-items:center;gap:6px;background:#727070;color:#fff;border:none;border-radius:50%;padding:8px 9px;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:6px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.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}.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}.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}\n"] }]
|
|
1576
|
+
args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\n <!-- All type Call Hold list -->\n <div class=\"held-call-banner\"\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\n <div class=\"held-call-content\" *ngIf=\"isConferenceCallHold\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">Conference Call</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': isConferenceCallHold }\" (click)=\"swapCalls({},true)\">\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n </div>\n </div>\n <ng-container *ngFor=\"let heldCall of currentCallList\">\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isHold && !heldCall?.isConference\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Hold</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': heldCall?.isHold }\" (click)=\"swapCalls(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"{{heldCall?.isHold? 'Resume':'Hold'}}\"> phone_paused </span>\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(heldCall)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" *ngIf=\"heldCall?.isIncomingCall\"\n (click)=\"onClickExpand(heldCall)\" [ngClass]=\"{'disabled': !heldCall?.businessNumber}\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n <!-- <button class=\"held-btn swap-btn\" (click)=\"swapCalls(heldCall)\" title=\"Swap calls\">\n <span class=\"material-symbols-outlined swap-icon\">swap_vert</span>\n </button> -->\n </div>\n </div>\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isIncomingCall && !heldCall?.isAcceptCall\">\n <div class=\"held-info\">\n <span class=\"material-symbols-outlined hold-icon\">phone_callback</span>\n <div class=\"held-caller\">\n <span class=\"held-label\">Incoming Call</span>\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"held-actions\">\n <button class=\"banner-btn receive-btn\" *ngIf=\"!heldCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"add(heldCall)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper banner-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(heldCall)\"> call_end\n </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(heldCall)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Compact banners for concurrent incoming (one per call) -->\n <ng-container *ngIf=\"currentCallList.length > 1 && !currentCall?.id\">\n <div class=\"incoming-banners-container\" *ngIf=\"!isConference && currentCallList.length > 1\">\n <div class=\"\">\n <ng-container *ngFor=\"let inc of currentCallList; let i = index\">\n <div class=\"incoming-banner\" *ngIf=\"inc?.isIncomingCall && !inc?.isAcceptCall\"\n [ngStyle]=\"{ top: ((isCallOnHold && heldCall) ? 64 : 0) + (i * 70) + 'px' }\">\n <div class=\"incoming-banner-content\">\n <div class=\"incoming-info\">\n <span class=\"incom ing-label\">Incoming call</span>\n <div class=\"incoming-caller\">\n <span class=\"caller-name\">{{ inc?.userInfo?.c2cInformation?.name ||\n inc?.customParameters?.get('name') || '-' }}</span>\n <span class=\"caller-number\">{{ inc?.userInfo?.c2cInformation?.number ||\n inc?.parameters?.From || '' }}</span>\n </div>\n </div>\n <div class=\"incoming-actions\">\n <button class=\"banner-btn accept-btn\" (click)=\"add(inc)\">\n <span class=\"material-symbols-outlined\">call</span>\n </button>\n <button class=\"banner-btn reject-btn\" (click)=\"onEndCall(inc)\">\n <span class=\"material-symbols-outlined\">call_end</span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\n (click)=\"onClickExpand(inc)\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- For single incoming call -->\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\n Number'}}</span>\n </div>\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\n <p *ngIf=\"currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\n </div>\n\n <div class=\"call-action-btns mt-auto\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\n </button>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\n </span>\n </button>\n </div>\n </div>\n\n <!-- For multiple incoming calls but not any call progress -->\n\n\n <!-- For single active call -->\n <div *ngIf=\"(!isConference || isConferenceCallHold) && !!currentCall?.id\"\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\n\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"currentCall?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\n </h1>\n <p>{{currentCall?.phone }}</p>\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\n </div>\n\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\n [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\n <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\n [disabled]=\"currentCallList.length < 2\">\n <span>Merge</span>\n </button>\n </div>\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleMute()\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n\n </button>\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\n </span>\n </button>\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div>\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\n (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n <!-- <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of contacts\">\n <img class=\"contact-avatar\" [src]=\"c.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c.firstName}} {{c.middleName}} {{c.lastName}}</div>\n <div class=\"contact-title\">{{ (c.numbersList && c.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n </div>\n </div>\n </div> -->\n\n\n <!-- <div class=\"mt-2 px-3 call-info-wrapper \" [ngClass]=\"{'open-collops': isCollops}\">\n <div class=\"text-center\" >\n <i class=\"fa fa-angle-down\" *ngIf=\"isCollops\" (click)=\"isCollops = !isCollops\"></i>\n <i class=\"fa fa-angle-up\" *ngIf=\"!isCollops\" (click)=\"isCollops = !isCollops\"></i>\n </div>\n <ng-container *ngIf=\"isCollops\">\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div >First Name:</div>\n <div >test ttttt</div>\n </div>\n <div class=\"col-6\">\n <div>Last Name:</div>\n <div>tetst test </div>\n </div>\n </div>\n <div class=\"mb-2\">\n <div class=\"\">Email:</div>\n <div class=\"\">abcdeft@vgroup.com</div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Number:</div>\n <div class=\"\">63545985264225</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"\">English</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6\">\n <div class=\"\">Image :</div>\n <div class=\"\">test.jpg </div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Extension :</div>\n <div class=\"\">4596</div>\n </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">Note :</div>\n <div class=\"\">tes test test </div>\n </div>\n <div class=\" mb-2\">\n <div class=\"\">\n <div class=\"\">Subject:</div>\n <div class=\"\">hello world | test</div>\n </div>\n </div>\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"\">test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test </div>\n </div>\n </div>\n </ng-container>\n </div> -->\n </div>\n\n\n <!-- conference call view -->\n <div class=\"conference-call-view\" *ngIf=\"isConference && !isConferenceCallHold\">\n <div class=\"conf-heading\">\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\n <span class=\"conf-title\">Conference Call</span>\n </div>\n\n <div class=\"scroll-container\">\n <div class=\"scroll-text conf-name\">\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\n <ng-container *ngIf=\"call?.isConference\">\n <span *ngIf=\"i != 0\">&</span>\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"conf-timer\">{{ timer }}</div>\n <!-- <div class=\"conf-record\">\n <button class=\"record-stop-btn\" *ngIf=\"isRecording\" (click)=\"toggleRecording()\" title=\"Stop Recording\">\n <span class=\"material-symbols-outlined\"> stop_circle </span>\n </button>\n </div> -->\n\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\n <span class=\"recording-icon\"></span>\n </button>\n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\n (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <div *ngIf=\"isRecording\" class=\"timer-display\">\n {{ getFormattedTime() }}\n </div>\n </div>\n\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\n (keyup)=\"onCallInputEnter($event)\">\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\n (click)=\"clearInputs()\">close_small</span>\n </div>\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\n {{key.num}}\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\n </div>\n </div>\n\n <!-- <div class=\"conf-remove\">\n <button class=\"remove-btn\" (click)=\"addRemoveParticipant()\">Remove</button>\n </div> -->\n\n <div class=\"conf-actions\">\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\n </button>\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel()\">\n <span class=\"material-symbols-outlined\"> groups_2 </span>\n </button>\n </div>\n\n <div class=\"conf-end\">\n <button class=\"circle-btn danger\" (click)=\"endCall(true)\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n\n\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\"\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <!-- <use\n xlink:href=\"#gentle-wave\"\n x=\"48\"\n y=\"5\"\n fill=\"rgba(255,255,255,0.3)\"\n /> -->\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n <!-- </ng-container> -->\n </div>\n\n <!-- Add remove participant panel -->\n <div class=\"contacts-panel\" *ngIf=\"isAddRemoveParticipant && false\">\n <div class=\"contacts-header\">\n <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel(true)\"> chevron_left </span>\n <div class=\"title\">Contacts</div>\n <span class=\"material-symbols-outlined search\"> search </span>\n </div>\n <div class=\"contacts-list\">\n <div class=\"contact-item\" *ngFor=\"let c of filteredList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </div>\n </div>\n\n <!-- Incoming call user details shown in model -->\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\n <div class=\"mb-2 user-info-section\" >\n <div class=\"text-center my-3\">\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\n </div>\n <!-- <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"'assets/images/user.jpg'\" alt=\"\" width=\"100\" />\n </div> -->\n <div class=\"mb-3\">\n <h5 class=\"text-white mb-1\">Name:</h5>\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Number:</div>\n <div class=\"\">{{selectedUserInfo?.number}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Extension:</div>\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Email: </div>\n <div>{{selectedUserInfo?.email}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">{{selectedUserInfo?.subject}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 mb-2\">\n <div class=\"me-2 mb-1\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div>\n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"mb-1\">Message:</div>\n <div>\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}</div>\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See less' : 'See more' }}</small>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Point Name:</div>\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"mb-1\">Source Name:</div>\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div> -->\n </div>\n </div>\n\n <!-- contact list panel -->\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\n <div class=\"contacts-header\">\n <!-- <span class=\"material-symbols-outlined back\" (click)=\"toggleContactsPanel()\"> chevron_left </span> -->\n <div class=\"title\">Contacts</div>\n <div class=\"d-flex justify-content-between\">\n <p></p>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#000000\"><path 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\"/></svg>\n </span>\n </div>\n </div>\n\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\n <div class=\"search-bar p-3\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\n </div>\n <div class=\"contacts-list\">\n <!-- <ng-container *ngFor=\"let c of filteredList; let i = index\"> -->\n <div class=\"px-2\">\n <h5 class=\"mb-0\">In This Call</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <div class=\"contact-item\">\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">You\n </div>\n <div class=\"contact-title\">{{selectedCallerId?.number}}</div>\n </div>\n </div>\n <div class=\"contact-item\" *ngFor=\"let c of filteredParticipentList\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\n </div>\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\n 'Unknown'}}</div>\n </div>\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n <hr class=\"m-2\">\n <div class=\"mt-3 px-2\">\n <h5 class=\"mb-0\">Contacts</h5>\n </div>\n <hr class=\"mb-2 mt-1\">\n <ng-container *ngFor=\"let c of filteredList\">\n <div class=\"contact-item\" *ngIf=\"!c?.IsConnected\">\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\n </div>\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\">\n <span class=\"material-symbols-outlined\"> call </span>\n <span class=\"label\">Call</span>\n </button>\n <!-- <button class=\"call-sec-btn mr-3\" [disabled]=\"c?.hold\"\n (click)=\"onMuteUser(c)\">\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\n </button> -->\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\n <!-- <span class=\"label\">Hold</span> -->\n </button>\n <button class=\"conference-contact\" (click)=\"onEndCall(c)\" *ngIf=\"c?.IsConnected\">\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\n <!-- <span class=\"label\">End</span> -->\n </button>\n </div>\n </ng-container>\n <!-- </ng-container> -->\n </div>\n </div>\n</div>\n\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\n <div style=\"display: flex; width: 100%\">\n <div>\n <div class=\"min-call-animation\" id=\"call-avatar\">\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\n </div>\n </div>\n <div>\n <div class=\"min-callerDetails\">\n <div class=\"name\">\n {{callData.name}}\n </div>\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\n </div>\n </div>\n </div>\n <div class=\"min-btn-container\">\n <div class=\"min-timer\">{{timer}}</div>\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\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:hidden}.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}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-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}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.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:44px;height:44px;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:6px 10px;cursor:pointer}.conference-hold-contact{display:inline-flex;align-items:center;gap:6px;background:#727070;color:#fff;border:none;border-radius:50%;padding:8px 9px;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:6px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.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}.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}.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}\n"] }]
|
|
1577
1577
|
}], ctorParameters: function () { return [{ type: i1.ExtensionService }, { type: i0.ChangeDetectorRef }, { type: i2.TwilioService }]; }, propDecorators: { callData: [{
|
|
1578
1578
|
type: Input
|
|
1579
1579
|
}], selectedCallerId: [{
|
|
@@ -1593,4 +1593,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1593
1593
|
}], incomingCallInitiated: [{
|
|
1594
1594
|
type: Output
|
|
1595
1595
|
}] } });
|
|
1596
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFvQjlDLE1BQU0sT0FBTyxxQkFBcUI7SUFtRWhDLHNCQUFzQjtJQUN0QixzRkFBc0Y7SUFDdEYsOEZBQThGO0lBQzlGLGtHQUFrRztJQUNsRyw2RUFBNkU7SUFDN0UsOEZBQThGO0lBQzlGLDZFQUE2RTtJQUM3RSxLQUFLO0lBQ0wsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFBVSxhQUE0QjtRQUF4RyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZFbkgseUJBQW9CLEdBQVEsRUFBRSxDQUFDO1FBRTlCLGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUQs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QUFJLEVBQUUsRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUNDLFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQzs7bUhBOW5EVSxxQkFBcUI7dUdBQXJCLHFCQUFxQiwrYUM1QmxDLDA5ckNBK29CTTs0RkRubkJPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7bUtBS3BCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQW9CRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbGwsIERldmljZSB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2V4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi8uLi8uLi9rZXlwYWQnO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XG4gIGNhbGxTaWQ6IHN0cmluZztcbiAgY2FsbFN0YXR1czogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENhbGxTdGF0dXNSZXNwb25zZSB7XG4gIGNhbGxEZXRhaWxzOiBDYWxsRGV0YWlscztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgZXJyb3JUeXBlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jYWxsLXByb2dyZXNzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGNhbGxEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdGVkQ2FsbGVySWQ6IGFueTtcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7XG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgZGV2aWNlPzogRGV2aWNlO1xuICBjYWxsITogQ2FsbDtcbiAgc2hvd1JpbmdBbmltYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGltZXI6IHN0cmluZyA9ICcwMDowMCc7XG4gIGludGVydmFsSWQ6IGFueTtcbiAgc2hvd0tleXBhZDogYm9vbGVhbiA9IGZhbHNlO1xuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XG4gIGNhbGxJbnB1dDogc3RyaW5nID0gJyc7XG4gIGlzTXV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNiYWxlRW5kQ2FsbEJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvbGxvcHMgPSBmYWxzZTtcbiAgY3VycmVudENhbGw6IGFueTtcbiAgLy8gQ29uZmVyZW5jZSBzdGF0ZSBmbGFnXG4gIGlzQ29uZmVyZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc091dGdvaW5nQ2FsbDogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEluY29taW5nIGNhbGwgdmFyaWFibGVzXG4gIGluY29taW5nQ2FsbERpdjogYm9vbGVhbiA9IGZhbHNlO1xuICAvL0BPdXRwdXQoKSBzaG93Q2FsbFByb2dyZXNzRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIFJlY29yZGluZyB2YXJpYWJsZXNcbiAgY2FsbFNpZDogYW55O1xuICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgdGltZUVsYXBzZWQgPSAwOyAvLyBpbiBzZWNvbmRzXG4gIHJlY29yZENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5jb21pbmdDYWxsU2lkOiBhbnk7XG4gIGNhbGxTdGF0dXM6IHN0cmluZyA9ICdyaW5naW5nJztcbiAgaW5jb21pbmdSZWNvcmRDYWxsPzogYW55O1xuICBzZWxlY3RlZEluY29taW5nQ2FsbDogYW55O1xuICBzaG93Q29udGFjdHNQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0FkZFJlbW92ZVBhcnRpY2lwYW50OiBib29sZWFuID0gZmFsc2U7XG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGhlbGRDYWxsPzogQ2FsbDtcbiAgaXNDYWxsT25Ib2xkOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xuICBjdXJyZW50Q2FsbExpc3Q6IGFueVtdID0gW107XG4gIGNvbmZlcmVuY2VJZDogYW55O1xuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcbiAgaXNDbGlja0V4cGFuZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NhbGxJblByb2dyZXNzITogYm9vbGVhbjtcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XG4gIGlzQ29uZmVyZW5jZUNhbGxIb2xkOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkVXNlckluZm86IGFueTtcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XG4gIGlzRXhwYW5kZWQgPSBmYWxzZTtcbnNlYXJjaFRleHQgPSAnJztcbmZpbHRlcmVkTGlzdDogYW55ID0gW107XG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XG4gIHNob3dCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNSaW5naW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGF1ZGlvVVJMOmFueSA9ICcvcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL3NoYXJlZC9pbmNvbWluZ19jYWxsLm1wMyc7XG4gIC8vIC9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2hhcmVkL2luY29taW5nX2NhbGwubXAzXG4gIGluY29taW5nQXVkaW8gPSBuZXcgQXVkaW8odGhpcy5hdWRpb1VSTCk7XG4gIFxuICAvLyBjb250YWN0czogYW55W10gPSBbXG4gIC8vICAgeyBuYW1lOiAnUGFtZWxhIENveCcsIHRpdGxlOiAnUHJvZHVjdCBEZXNpZ25lcicsIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIH0sXG4gIC8vICAgeyBuYW1lOiAnUm9nZXIgUy4gV29vZCcsIHRpdGxlOiAnSmF2YVNjcmlwdCBQcm9ncmFtbWVyJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfSxcbiAgLy8gICB7IG5hbWU6ICdWaWN0b3IgQmxhY2tzdG9uJywgdGl0bGU6ICdEYXRhYmFzZSBBZG1pbmlzdHJhdG9yJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfSxcbiAgLy8gICB7IG5hbWU6ICdUYW1teSBSaW9zJywgdGl0bGU6ICdTdXBwb3J0JywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfSxcbiAgLy8gICB7IG5hbWU6ICdDYXJsb3MgSGVuZGVyc29uJywgdGl0bGU6ICdTb2Z0d2FyZSBBcmNoaXRlY3QnLCBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyB9LFxuICAvLyAgIHsgbmFtZTogJ0VsaXphYmV0aCBCYWlsZXknLCB0aXRsZTogJ0hSJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfVxuICAvLyBdO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlKSB7XG4gICAgY29uc29sZS5sb2coJ0NhbGwgUHJvZ3Jlc3MgQ29tcG9uZW50Jyk7XG4gICAgdGhpcy5jYWxsID0gdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGw7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zb2xlLmxvZygnQ2FsbCBQcm9ncmVzcyBDb21wb25lbnQgbmdPbkluaXQnKTtcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW5jb21pbmcgY2FsbHMgZnJvbSBUd2lsaW9TZXJ2aWNlXG4gICAgdHJ5IHtcbiAgICAgIC8vIHRoaXMuaW5jb21pbmdBdWRpbyA9IG5ldyBBdWRpbygnLi4vLi4vLi4vYXNzZXRzL3Bob25lLXJpbmdpbmcubXAzJyk7XG4gICAgICB0aGlzLmluY29taW5nQXVkaW9bJ2xvb3AnXSA9IHRydWU7XG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY3VycmVudENhbGwuc3Vic2NyaWJlKChpbmNvbWluZzogYW55KSA9PiB7XG4gICAgICAgIGlmICghaW5jb21pbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsIGVtaXR0ZWQ6JywgaW5jb21pbmcpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnQ3VycmVudCBjYWxsIHN0YXR1czonLCB0aGlzLmNhbGw/LnN0YXR1cygpKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gb25nb2luZyBjYWxsLCBzaG93IGNvbmN1cnJlbnQgaW5jb21pbmcgYmFubmVyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDb25jdXJyZW50IGluY29taW5nIGRldGVjdGVkIC0gc2hvd2luZyBiYW5uZXInKTtcbiAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gdHJ1ZTtcbiAgICAgICAgLy8gQWRkIHRvIGxpc3QgaWYgbm90IHByZXNlbnRcbiAgICAgICAgY29uc3QgZXhpc3RzID0gKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgfHwgW10pLnNvbWUoKGM6IGFueSkgPT4gYz8ucGFyYW1ldGVycz8uQ2FsbFNpZCA9PT0gaW5jb21pbmc/LnBhcmFtZXRlcnM/LkNhbGxTaWQpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSBbLi4uKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgfHwgW10pLCBpbmNvbWluZ107XG4gICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mby5lbWl0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy8gfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3Vic2NyaWJpbmcgdG8gaW5jb21pbmcgY2FsbHM6JywgZSk7XG4gICAgfVxuICAgIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10pIHtcbiAgICAgIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uaXNJbmNvbWluZ0NhbGwpIHtcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSB0cnVlO1xuICAgICAgICAvLyB0aGlzLmNhbGxbJ2NhbGxJbmZvJ10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FsbERhdGEpKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xuICAgICAgICBjb25zb2xlLmxvZygndGVzdC1zdGFydENhbGwxMjMnLCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgICAgaWQ6ICcxMjUnLFxuICAgICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0hvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNNdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcGhvbmU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5waG9uZSxcbiAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6ICcxMjEnLFxuICAgICAgICAgICAgICAgICAgbmFtZTogY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/Lm5hbWUgfHwgY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/LmZyb21OYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy50b05hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVyLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhcnRDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10pIHtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBvbmdvaW5nIGNhbGxcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbMF0uY29uZmVyZW5jZUlkO1xuICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaChhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09IHJlcy5pZCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiAhcmVzLmlzTGVmdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgLi4ucmVzLFxuICAgICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzLmlzSG9sZCxcbiAgICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8sXG4gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxuICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXMuam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNob3dDb250YWN0c1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VTaWQpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSAmJiByZXMuaXNMZWZ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMCA/IHRoaXMuY3VycmVudENhbGxMaXN0WzBdIDoge307XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbD8uaXNIb2xkICYmICF0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICBob2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRDYWxsPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25mZXJlbmNlQ2FsbGxpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0NvbmZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmVyZW5jZUNhbGxsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogY29uZmVyZW5jZUNhbGxsaXN0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLnBhcnRpY2lwYW50SWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZTogdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBpZiAoaXRlbS5pc0NvbmZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXRlbS5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGl0ZW0uaXNIb2xkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyB9KVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZih0aGlzLnNob3dDb250YWN0c1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VTaWQpXG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgLi4ucmVzLFxuICAgICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzLmlzSG9sZCxcbiAgICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8sXG4gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxuICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXMuam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGlmKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PSAxICYmIHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCl7XG4gICAgICAgICAgICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vICAgICBpZih0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPT0gMSAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXS5pc0hvbGQpIHtcbiAgICAgICAgICAgICAgLy8gICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICAgIC8vICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmN1cnJlbnRDYWxsTGlzdFswXS5wYXJ0aWNpcGFudElkXSxcbiAgICAgICAgICAgICAgLy8gICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgLy8gICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgICAgIC8vICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzQ29uZmVyZW5jZVxuICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgICAvLyAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAuLi5yZXMsXG4gICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXG4gICAgICAgICAgICAgICAgaXNIb2xkOiByZXMuaXNIb2xkLFxuICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlLFxuICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IHRoaXMuZ2V0VGltZURpZmZlcmVuY2UocmVzLmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcbiAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBsZXQgY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXNBY2NlcHRDYWxsICYmICFpdGVtLmlzSG9sZCk7XG4gICAgICAgICAgaWYoY3VycmVudENhbGw/LmlkKXtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSBjdXJyZW50Q2FsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKXtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFVzZXIgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvLnBhcnRpY2lwYW50SWQpO1xuICAgICAgICAgICAgaWYoc2VsZWN0ZWRVc2VyKXtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRVc2VyLklzVXNlckluZm9TaG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gc2VsZWN0ZWRVc2VyO1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGV0IGluY29taW5nQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xuICAgICAgICAgICAgICBpZihpbmNvbWluZ0NhbGw/LnBhcnRpY2lwYW50SWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGluY29taW5nQ2FsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmlzQ2xpY2tFeHBhbmQpe1xuICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlc0luZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+ICEhaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xuICAgICAgICAgICAgaWYocmVzSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF0uSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF07XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICBsZXQgaW5jb21pbmdEYXRhOiBhbnkgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXMpPT4gcmVzLmlzSW5jb21pbmdDYWxsICYmICFyZXMuaXNBY2NlcHRDYWxsICYmIHJlcy5idXNpbmVzc090cCk7XG4gICAgICAgICAgaWYoaW5jb21pbmdEYXRhPy5pZCAmJiAhdGhpcy5pc1Jpbmdpbmcpe1xuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0F1ZGlvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighaW5jb21pbmdEYXRhPy5pZCAmJiB0aGlzLmlzUmluZ2luZyl7XG4gICAgICAgICAgICB0aGlzLmluY29taW5nQXVkaW8ucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdjdXJyZW50Q2FsbExpc3QnLCB0aGlzLmN1cnJlbnRDYWxsTGlzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgIGlmICh0aGlzLmluY29taW5nQXVkaW8gJiYgdGhpcy5pc1JpbmdpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdBdWRpby5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzUmluZ2luZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPXt9XG4gICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgaWYodGhpcy5jYWxsKXtcbiAgICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG5cbiAgZ2V0U3RhdHVzKHJlczogYW55KSB7XG4gICAgLy8gY29uc3Qgc3RhdHVzTGlzdCA9IFtcImFuc3dlcmVkXCIsIFwicGFydGljaXBhbnQtaG9sZFwiLCBcInBhcnRpY2lwYW50LW11dGVcIiwgXCJwYXJ0aWNpcGFudC1qb2luXCIsIFwicXVldWVkXCIsIFwiaW4tcHJvZ3Jlc3NcIiwgXCJpbml0aWF0ZWRcIiwgJ3JpbmdpbmcnLCAnXCJjb25uZWN0ZWRcIiddO1xuICAgIC8vIGlmIChzdGF0dXNMaXN0LmluY2x1ZGVzKHJlcy5zdGF0dXMpICYmIHJlcy5kaXJlY3Rpb24gIT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcbiAgICAvLyAgIHJldHVybiB0cnVlO1xuICAgIC8vIH0gZWxzZSBpZiAocmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xuICAgIC8vICAgcmV0dXJuIHRoaXMuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5pbmNsdWRlcyhyZXMuaWQpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuICAgIGlmKHJlcy5pbmNvbWluZ1N0YXR1cyA9PSAnYW5zd2VyZWQnICYmIHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAvLyB9LCAzMDAwKTtcblxuICB9XG5cbiAgR2V0Q29udGFjdHNMaXN0KCkge1xuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZWFkQ29udGFjdHModG9rZW4pLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQVBJIFJlc3BvbnNlOicsIHJlcyk7XG5cbiAgICAgICAgLy8gTm90ZTogQ2FwaXRhbCBCIGluIHBob25lQm9va1xuICAgICAgICBpZiAocmVzICYmIHJlcy5waG9uZUJvb2spIHtcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzLnBob25lQm9vaztcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHJlcy5waG9uZUJvb2s7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvbnRhY3RzIGFycmF5OicsIHRoaXMuY29udGFjdHMpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXM7XG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgICAgICBjb25zb2xlLmxvZygnQ29udGFjdHMgYXJyYXk6JywgdGhpcy5jb250YWN0cyk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY29udGFjdHM6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLmNvbnRhY3RzID0gW107XG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBhZGRSZXM6IGFueTtcbiAgYXN5bmMgc3RhcnRDYWxsKGNhbGxEYXRhOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhjYWxsRGF0YSwgJ2NhbGxEYXRhJyk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBlbnZpcm9ubWVudC5jaGFubmVsSWQsXG4gICAgICAgIHVzZXJJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxuICAgICAgICB0bzogY2FsbERhdGEucGhvbmUsXG4gICAgICAgIGZyb21OdW1iZXI6IGNhbGxEYXRhLmZyb20sXG4gICAgICAgIHNjb3BlOiAnbG9jYWwnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XG4gICAgICAgICAgICAgIGJ1c2luZXNzTnVtYmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgY2FsbFNpZDonJyxcbiAgICAgICAgICAgICAgY2FsbFN0YXR1czonJyxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOicnLFxuICAgICAgICAgICAgICBkaWFsOnRydWUsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjonb3V0Z29pbmctY2FsbCcsXG4gICAgICAgICAgICAgIGZvcndhcmRlZFRvOicnLFxuICAgICAgICAgICAgICBmcm9tOmNhbGxEYXRhLmZyb20sXG4gICAgICAgICAgICAgIGlkOid5eXVnZ2hqYicsXG4gICAgICAgICAgICAgIGltZzpjYWxsRGF0YS5pbWcgfHwnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDp0cnVlLFxuICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6ZmFsc2UsXG4gICAgICAgICAgICAgIGlzSG9sZDpmYWxzZSxcbiAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6ZmFsc2UsXG4gICAgICAgICAgICAgIGlzTGVmdDpmYWxzZSxcbiAgICAgICAgICAgICAgaXNNdXRlOmZhbHNlLFxuICAgICAgICAgICAgICBqb2luZWRBdDonJyxcbiAgICAgICAgICAgICAgbmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6J3l5dWdnaGpiJyxcbiAgICAgICAgICAgICAgcGhvbmU6Y2FsbERhdGE/LnBob25lIHx8ICcnLFxuICAgICAgICAgICAgICByb2xlOidjYWxsZWUnLFxuICAgICAgICAgICAgICBzdGF0dXM6JycsXG4gICAgICAgICAgICAgIHRpbWU6JycsXG4gICAgICAgICAgICAgIHRvOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXG4gICAgICAgICAgICAgIHRvTmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICAgIHVzZXJJZDpjYWxsRGF0YT8udXNlcklkIHx8ICcnXG4gICAgICAgICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaW5pdGlhdGVDYWxsKHBheWxvYWQpO1xuICAgICAgdGhpcy5jb25mZXJlbmNlSWQgPSByZXNwb25zZT8uY2FsbGF1dGg/LmlkO1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgY29uc3QgeyBpZDogY2FsbEF1dGhJZCwgcmVjb3JkQ2FsbCB9ID0gYXdhaXQgdGhpcy5nZXRDYWxsQXV0aElkKHJlc3BvbnNlKTtcbiAgICAgICAgLy8gdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY2FsbEF1dGhJZClcbiAgICAgICAgdGhpcy5yZWNvcmRDYWxsID0gcmVjb3JkQ2FsbDsgLy8gU3RvcmUgdGhlIHJlY29yZENhbGwgdmFsdWVcbiAgICAgICAgY29uc3QgdG9rZW5EYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmdldE91dGdvaW5nQ2FsbFRva2VuKGNhbGxBdXRoSWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3RUb0RldmljZSh0b2tlbkRhdGEudG9rZW4sIGNhbGxEYXRhKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcblxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hZGRSZXMgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcbiAgICAgICAgICAgICAgZnJvbTogY2FsbERhdGE/LmZyb20sXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gdGhpcy5jYWxsRGF0YSA9IHsgLi4uY2FsbERhdGEsIHBhcnRpY2lwYW50SWQ6IHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkLCBpc0hvbGQ6IGZhbHNlLCBpc0xlZnQ6IGZhbHNlLCBpc0luY29taW5nQ2FsbDogZmFsc2UsIGlzQ29uZmVyZW5jZTogZmFsc2UsIGlzQWNjZXB0Q2FsbDogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gdGhpcy5jYWxsWydjYWxsSW5mbyddID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbGxEYXRhKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGVzdDExMTExMScpO1xuICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHsuLi50aGlzLmNhbGxEYXRhLCBpbWc6IGNhbGxEYXRhLmltZyB8fCdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ307XG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIGlzQWNjZXB0Q2FsbCBiYXNlZCBvbiBjdXJyZW50IGNhbGwgc3RhdGUgdG8gZW5zdXJlIFVJIHJlbmRlcnMgaWYgYWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xuICAgICAgICAgICAgLy8gICAuLi50aGlzLmNhbGxEYXRhLFxuICAgICAgICAgICAgLy8gICBpbWc6IGNhbGxEYXRhLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAvLyAgIGlzQWNjZXB0Q2FsbDogdHJ1ZVxuICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhbCBwYXJ0aWNpcGFudElkOicsIHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgaW5pdGlhbCBwYXJ0aWNpcGFudDonLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApXG4gICAgICAgIC8vIFBvbGwgdGhlIHN0YXR1cyBmb3IgMzAtNDUgc2Vjb25kc1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAxKSB7XG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnIvPlwiKSwgXCJlcnJvclwiKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QyJylcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICBjb25zb2xlLmxvZygndGVzdDMnKVxuICAgICAgdGhpcy5lbmRDYWxsKCk7XG4gICAgfVxuICB9XG5cbiAgb25Ib2xkQ2FsbChjOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhjLCAnZHNkc2RzZHNkc2RzYWRzYScpO1xuICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICBwYXJ0aWNpcGFudElkOiBbYy5wYXJ0aWNpcGFudElkXSxcbiAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgICBob2xkOiAhYy5ob2xkLFxuICAgICAgY29uZmVyZW5jZTogYy5pc0NvbmZlcmVuY2VcbiAgICB9KVxuICAgIGMuaG9sZCA9ICFjLmhvbGQ7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgYXN5bmMgb25FbmRDYWxsKGM6IGFueSwgaXNBbGxDYWxsRW5kPzogYm9vbGVhbikge1xuICAgIGNvbnNvbGUubG9nKGMsICdkc2RzZHNkc2RzZHNhZHNhJyk7XG4gICAgbGV0IHBhcnRpY2lwYW50SWQgPSBpc0FsbENhbGxFbmQgPyAnYWxsJyA6IGMucGFydGljaXBhbnRJZCB8fCBjLnBhcnRpY2lwYW50SWQ7XG4gICAgbGV0IHJlczogYW55ID0gYXdhaXQgdGhpcy5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgdGhpcy5jb25mZXJlbmNlSWQpO1xuICAgIGlmIChyZXM/LnN0YXR1cyA9PSAyMDEgJiYgcmVzPy5tZXNzYWdlID09ICdwYXJ0aWNpcGFudCBhbHJlYWR5IGxlZnQnKSB7XG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcnRpY2lwYW50SWQgIT09IGMucGFydGljaXBhbnRJZCk7XG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMCA/IHRoaXMuY3VycmVudENhbGxMaXN0WzBdIDogbnVsbDtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy50d2lsaW9TZXJ2aWNlLmNvbmZlcmVuY2VDYWxsSW5mby5jb25mZXJlbmNlU2lkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVDYWxsKHBheWxvYWQ6IGFueSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaW5pdGlhdGVDYWxsKHBheWxvYWQpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgb25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkUGFydGljaXBhbnRUb0NhbGwocGF5bG9hZDogYW55KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLm9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZDogYW55LCBjb25mZXJlbmNlSWQ6IGFueSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENhbGxBdXRoSWQocmVzcG9uc2U6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuY2FsbGF1dGguaWQsXG4gICAgICByZWNvcmRDYWxsOiByZXNwb25zZS5jYWxsYXV0aC5yZWNvcmRDYWxsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEF1dGhJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDb25mZXJlbmNlQ2FsbFRva2VuKHsgYXV0aElkOiBjYWxsQXV0aElkIH0pLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9EZXZpY2UodG9rZW46IGFueSwgY2FsbERhdGE6IGFueSkge1xuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXG4gICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0b2tlbi52YWx1ZSwgb3B0aW9ucyk7XG4gICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy5kZXZpY2UuY29ubmVjdCh7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgRnJvbTogY2FsbERhdGEuZnJvbSxcbiAgICAgICAgVG86IGNhbGxEYXRhLnBob25lLFxuICAgICAgICBFbnY6IGVudmlyb25tZW50LmFiYixcbiAgICAgICAgVG9rZW46IHRva2VuLmlkLFxuICAgICAgICBFeHQ6IGNhbGxEYXRhLmV4dE51bVxuICAgICAgfSxcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxuICAgIH0pO1xuICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xuICAgIGNvbnNvbGUubG9nKCd0ZXN0OTg5OTgxMTExMTEnLCB0aGlzLmNhbGwpO1xuICAgIGNvbnNvbGUubG9nKCd0ZXN0ZGV2aWNlJywgdGhpcy50d2lsaW9TZXJ2aWNlLmRldmljZSk7XG4gICAgLy8gdGhpcy5jYWxsWydjYWxsSW5mbyddID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYWxsRGF0YSkpO1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgdGhpcy5kZXZpY2U/Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jYWxsPy5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2FsbD8ub24oJ2Rpc2Nvbm5lY3QnLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygndGVzdC1kaXNjb25uZWN0JylcbiAgICAgIHRoaXMuY2FsbD8uZGlzY29ubmVjdCgpO1xuICAgICAgLy8gdGhpcy5lbmRDYWxsKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhbGw/Lm9uKCdyaW5naW5nJywgKCkgPT4ge1xuICAgIH0pO1xuXG4gICAgdGhpcy5jYWxsPy5vbigncmVqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3Rlc3Q1JylcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jYWxsPy5vbignYWNjZXB0JywgKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgb3V0Z29pbmcgY2FsbCBpcyBtYXJrZWQgYXMgYWNjZXB0ZWQgc28gdGhlIFVJIHN3aXRjaGVzIHRvIHRoZSBjb25uZWN0ZWQgdmlld1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGlkID0gdGhpcy5jYWxsRGF0YT8ucGFydGljaXBhbnRJZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jdXJyZW50Q2FsbExpc3QpICYmIHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkeCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoYzogYW55KSA9PiAocGlkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IHBpZCkgfHwgKCFwaWQgJiYgYz8ucGhvbmUgPT09IHRoaXMuY2FsbERhdGE/LnBob25lKSk7XG4gICAgICAgICAgLy8gaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0W2lkeF0uaXNBY2NlcHRDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpZHhdO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XG4gICAgICB9XG4gICAgICAvLyBTdGFydCByZWNvcmRpbmcgaWYgcmVjb3JkQ2FsbCBpcyB0cnVlIGFuZCBjYWxsIGlzIGFjY2VwdGVkIGZvciAzMCBzZWNvbmRzXG4gICAgICAvLyBpZiAodGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSByZXR1cm47IC8vIElmIGFscmVhZHkgcmVjb3JkaW5nLCBza2lwXG4gICAgICAvLyAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xuICAgICAgLy8gICB9LCAzMDAwMCk7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICAgIC8vIH1cbiAgICB9KTtcbiAgICB0aGlzLmNhbGw/Lm9uKCdtZXNzYWdlUmVjZWl2ZWQnLCAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGltZXIoKSB7XG4gICAgbGV0IHNlY29uZHMgPSAwO1xuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHNlY29uZHMrKztcbiAgICAgIHRoaXMudGltZXIgPSB0aGlzLmZvcm1hdFRpbWUoc2Vjb25kcyk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lcigpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgdGhpcy50aW1lciA9ICcwMDowMCc7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpbWUodG90YWxTZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIGAke3RoaXMucGFkKG1pbnV0ZXMpfToke3RoaXMucGFkKHNlY29uZHMpfWA7XG4gIH1cblxuICBwcml2YXRlIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBzd2FsKFwiRXJyb3JcIiwgZXJyb3IsIFwiZXJyb3JcIik7XG4gIH1cblxuICAvLyBlbmRDYWxsKCkge1xuICAvLyAgIGNvbnNvbGUubG9nKCdlbmRDYWxsKCkgY2FsbGVkJyk7XG4gIC8vICAgY29uc29sZS5sb2coJ0N1cnJlbnQgY2FsbDonLCB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG4gIC8vICAgY29uc29sZS5sb2coJ0hlbGQgY2FsbCBleGlzdHM6JywgISF0aGlzLmhlbGRDYWxsKTtcblxuICAvLyAgIC8vIERpc2Nvbm5lY3QgdGhlIGN1cnJlbnQgYWN0aXZlIGNhbGxcbiAgLy8gICBpZiAodGhpcy5jYWxsKSB7XG4gIC8vICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xuICAvLyAgICAgdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xuICAvLyAgIH1cblxuICAvLyAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcbiAgLy8gICB0aGlzLnN0b3BUaW1lcigpO1xuXG4gIC8vICAgLy8gSWYgdGhlcmUncyBhIGhlbGQgY2FsbCwgbWFrZSBpdCBhY3RpdmVcbiAgLy8gICBpZiAodGhpcy5oZWxkQ2FsbCkge1xuICAvLyAgICAgY29uc29sZS5sb2coJ1Jlc3VtaW5nIGhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG5cbiAgLy8gICAgIC8vIE1ha2UgaGVsZCBjYWxsIHRoZSBhY3RpdmUgY2FsbFxuICAvLyAgICAgdGhpcy5jYWxsID0gdGhpcy5oZWxkQ2FsbDtcbiAgLy8gICAgIHRoaXMuaGVsZENhbGwgPSB1bmRlZmluZWQ7XG4gIC8vICAgICAvLyB0aGlzLmlzQ2FsbE9uSG9sZCA9IGZhbHNlO1xuICAvLyAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSAhIXRoaXMuaGVsZENhbGw7XG5cblxuICAvLyAgICAgLy8gVW5tdXRlIHRoZSByZXN1bWVkIGNhbGxcbiAgLy8gICAgIHRoaXMuY2FsbC5tdXRlKGZhbHNlKTtcblxuICAvLyAgICAgLy8gVXBkYXRlIFVJIHdpdGggdGhlIHJlc3VtZWQgY2FsbCBpbmZvXG4gIC8vICAgICBjb25zdCBmcm9tTnVtYmVyID0gdGhpcy5jYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcbiAgLy8gICAgIGNvbnN0IGNhbGxlck5hbWUgPSB0aGlzLmNhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xuICAvLyAgICAgY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG5cbiAgLy8gICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gIC8vICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gIC8vICAgICAgIHBob25lOiBmcm9tTnVtYmVyLFxuICAvLyAgICAgICBkaXNwbGF5TnVtOiBmcm9tTnVtYmVyLFxuICAvLyAgICAgICBuYW1lOiBjYWxsZXJOYW1lLFxuICAvLyAgICAgICBpbWc6IGNhbGxlckltZ1xuICAvLyAgICAgfTtcblxuICAvLyAgICAgLy8gUmVzdGFydCB0aW1lciBmb3IgdGhlIHJlc3VtZWQgY2FsbFxuICAvLyAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gIC8vICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XG5cbiAgLy8gICAgIGNvbnNvbGUubG9nKCdIZWxkIGNhbGwgaXMgbm93IGFjdGl2ZTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgLy8gICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgLy8gTm8gaGVsZCBjYWxsLCBjb21wbGV0ZWx5IGVuZFxuICAvLyAgICAgY29uc29sZS5sb2coJ05vIGhlbGQgY2FsbCwgZW5kaW5nIGNvbXBsZXRlbHknKTtcbiAgLy8gICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcbiAgLy8gICAgIHRoaXMubWF4aW1pc2VEaWFscGFkKCk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XG4gICAgY29uc29sZS5sb2coJ2VuZENhbGwoKSBjYWxsZWQnKTtcbiAgICAvLyBjb25zb2xlLmxvZygnQ3VycmVudCBjYWxsOicsIHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snRnJvbSddKTtcbiAgICBjb25zb2xlLmxvZygnSGVsZCBjYWxsIGV4aXN0czonLCAhIXRoaXMuaGVsZENhbGwpO1xuICAgIC8vIExlYXZpbmcgY29uZmVyZW5jZSBzdGF0ZSB3aGVuIGVuZGluZyBjdXJyZW50IGNhbGwgYWN0aW9uXG4gICAgdGhpcy5pc0NvbmZlcmVuY2UgPSBmYWxzZTtcblxuICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcbiAgICBpZiAoaXNBbGxDYWxsRW5kKSB7XG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgICAgdGhpcy5vbkVuZENhbGwoe30sIGlzQWxsQ2FsbEVuZCk7XG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmN1cnJlbnRDYWxsLCBpc0FsbENhbGxFbmQpO1xuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gYz8ucGFydGljaXBhbnRJZCAhPT0gdGhpcy5jdXJyZW50Q2FsbC5wYXJ0aWNpcGFudElkKTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF07XG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gbnVsbDtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FsbCkge1xuICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLmNhbGwucmVqZWN0KCk7XG4gICAgICAgIC8vIHRoaXMuY2FsbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gaWYgKHRoaXMuaGVsZENhbGwpIHtcbiAgICAvLyAgIGlmICh0aGlzLmNhbGwpIHtcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xuICAgIC8vICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmNhbGw/LmNhbGxJbmZvLCBpc0FsbENhbGxFbmQpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc29sZS5sb2coJ1Jlc3VtaW5nIGhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG5cbiAgICAvLyAgIC8vIFByb21vdGUgaGVsZCBjYWxsXG4gICAgLy8gICAvLyB0aGlzLmNhbGwgPSB0aGlzLmhlbGRDYWxsO1xuICAgIC8vICAgdGhpcy5oZWxkQ2FsbCA9IHVuZGVmaW5lZDtcbiAgICAvLyAgIC8vIHRoaXMuaXNDYWxsT25Ib2xkID0gZmFsc2U7XG4gICAgLy8gICAvLyB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlOyAvLyBFbnN1cmUgVUkgcmVuZGVyc1xuXG4gICAgLy8gICAvLyB0aGlzLmNhbGwubXV0ZShmYWxzZSk7XG5cbiAgICAvLyAgIC8vIFVwZGF0ZSBjYWxsRGF0YVxuICAgIC8vICAgY29uc3QgZnJvbU51bWJlciA9IHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgLy8gICBjb25zdCBjYWxsZXJOYW1lID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJztcbiAgICAvLyAgIGNvbnN0IGNhbGxlckltZyA9IHRoaXMuY2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ2ltYWdlJykgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuXG4gICAgLy8gICB0aGlzLmNhbGxEYXRhID0ge1xuICAgIC8vICAgICBwaG9uZTogZnJvbU51bWJlcixcbiAgICAvLyAgICAgZGlzcGxheU51bTogZnJvbU51bWJlcixcbiAgICAvLyAgICAgbmFtZTogY2FsbGVyTmFtZSxcbiAgICAvLyAgICAgaW1nOiBjYWxsZXJJbWdcbiAgICAvLyAgIH07XG5cbiAgICAvLyAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgIC8vICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuXG4gICAgLy8gICAvLyBGb3JjZSBVSSB1cGRhdGVcbiAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpKTtcblxuICAgIC8vICAgY29uc29sZS5sb2coJ0hlbGQgY2FsbCBpcyBub3cgYWN0aXZlOicsIHRoaXMuY2FsbERhdGEpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnTm8gaGVsZCBjYWxsLCBlbmRpbmcgY29tcGxldGVseScpO1xuICAgIC8vICAgY29uc29sZS5sb2coJ3Rlc3Q2JylcbiAgICAvLyAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcbiAgICAvLyAgIGlmICh0aGlzLmNhbGwpIHtcbiAgICAvLyAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5jYWxsPy5jYWxsSW5mbywgaXNBbGxDYWxsRW5kKTtcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5tYXhpbWlzZURpYWxwYWQoKTtcbiAgICAvLyB9XG4gIH1cblxuXG4gIGFzeW5jIHRvZ2dsZU11dGUoaXNDb25mZXJlbmNlPzogYm9vbGVhbikge1xuICAgIC8vIGF3YWl0IHRoaXMub25NdXRlUGFydGljaXBhbnQoe1xuICAgIC8vICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxuICAgIC8vICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAvLyAgIG11dGU6ICF0aGlzLmlzTXV0ZSxcbiAgICAvLyB9KVxuICAgIC8vIHRoaXMuY2FsbCA9IHRoaXMuaGVsZENhbGxcbiAgICAvLyB0aGlzLnRvZ2dsZU1pYygpXG4gICAgdGhpcy5pc011dGUgPSAhdGhpcy5pc011dGU7XG4gICAgY29uc29sZS5sb2coJ2lzTXV0ZScsIHRoaXMuY2FsbCwgdGhpcy5oZWxkQ2FsbClcbiAgICB0aGlzLmNhbGw/Lm11dGUodGhpcy5pc011dGUpO1xuICAgIC8vIGlmIChpc0NvbmZlcmVuY2UpIHtcbiAgICAgIHRoaXMuY3VycmVudENhbGwuaXNNdXRlID0gdGhpcy5pc011dGU7XG4gICAgLy8gfSBlbHNlIHtcblxuICAgIC8vIH1cbiAgfVxuXG4gIGF1ZGlvU3RyZWFtPzogTWVkaWFTdHJlYW07XG5taWNPbiA9IGZhbHNlO1xuXG5hc3luYyB0b2dnbGVNaWMoKSB7XG4gIGlmICghdGhpcy5hdWRpb1N0cmVhbSkge1xuICAgIC8vIGZpcnN0IHRpbWU6IHJlcXVlc3QgbWljXG4gICAgdGhpcy5hdWRpb1N0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gIH1cblxuICB0aGlzLm1pY09uID0gIXRoaXMubWljT247XG5cbiAgdGhpcy5hdWRpb1N0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmZvckVhY2godHJhY2sgPT4ge1xuICAgIHRyYWNrLmVuYWJsZWQgPSB0aGlzLm1pY09uOyAgIC8vIGZhbHNlID0gbXV0ZWQsIHRydWUgPSBzZW5kaW5nIGF1ZGlvXG4gIH0pO1xufVxuICB0b2dnbGVLZXlwYWQoKSB7XG4gICAgdGhpcy5zaG93S2V5cGFkID0gIXRoaXMuc2hvd0tleXBhZDtcbiAgICB0aGlzLmNhbGxJbnB1dCA9ICcnO1xuICB9XG4gIHRvZ2dsZUNvbnRhY3RzUGFuZWwoaXNSZW1vdmU/OiBib29sZWFuKSB7XG4gICAgLy8gaWYgKGlzUmVtb3ZlKSB7XG4gICAgLy8gICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gZmFsc2U7XG4gICAgLy8gICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSAhdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50O1xuICAgIC8vICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICAgIC8vIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSAhdGhpcy5zaG93Q29udGFjdHNQYW5lbDtcbiAgICAgIC8vIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XG4gICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VTaWQpO1xuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzO1xuICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICAgIC8vIH1cbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFkZFJlbW92ZVBhcnRpY2lwYW50KCkge1xuICAgIC8vIGNvbnN0IGNvbmZlcmVuY2VTSWQgPSB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcbiAgICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSAhdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50O1xuICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy50d2lsaW9TZXJ2aWNlLmNvbmZlcmVuY2VDYWxsSW5mby5jb25mZXJlbmNlU2lkKTtcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XG4gIH1cblxuICBhc3luYyBhZGQoZGF0YT86IGFueSkge1xuICAgIC8vIGlmKGRhdGE/LnN0YXR1cyAhPSAncmluZ2luZycpe1xuICAgIHRoaXMuY29uZmVyZW5jZUlkID0gdGhpcy50d2lsaW9TZXJ2aWNlLmNvbmZlcmVuY2VDYWxsSW5mby5jb25mZXJlbmNlSWQ7XG4gICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgdGhpcy5jdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLmlzQ29uZmVyZW5jZSkge1xuICAgICAgICAgICAgLy8gcmVzLmlzSG9sZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcmVzLnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgICAgICAgICBob2xkOiB0cnVlLFxuICAgICAgICAgICAgICBjb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0ucGFydGljaXBhbnRJZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkKTtcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdLmlzSG9sZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0luY29taW5nQ2FsbCA/IFt0aGlzLmN1cnJlbnRDYWxsPy5pZF0gOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICBob2xkOiB0cnVlLFxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZGF0YS5pc0hvbGQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbGV0IGluY29taW5nQ2FsbERhdGEgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0luY29taW5nQ2FsbCAmJiBpdGVtLmlzQWNjZXB0Q2FsbCk7XG4gICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIHRoaXMuY2FsbCA9IGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5jb25uZWN0KCcnKTtcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hZGRJbmNvbWluZ1BhcnRpY2lwYW50KGRhdGE/LmlkLCB0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXMsICdiaGhoaGhoaGhoaGhoaGhoaGhoaCcpXG4gICAgICAgIHRoaXMuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5wdXNoKGRhdGE/LmlkIHx8IGRhdGE/LnBhcnRpY2lwYW50SWQpO1xuICAgICAgICBkYXRhLmlzQWNjZXB0Q2FsbCA9IHRydWU7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldEluY29taW5nQ2FsbFN0YXR1cyhkYXRhKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmNvbm5lY3QoJycpO1xuICAgICAgdGhpcy5pc0N1cnJlbnRJbmNvbWluZ0NhbGxMaXN0LnB1c2goZGF0YT8uaWQpO1xuICAgICAgY29uc29sZS5sb2codGhpcy5jYWxsLCAnY2FsbENvbm5lY3QnKTtcbiAgICAgIGRhdGEuaXNBY2NlcHRDYWxsID0gdHJ1ZTtcbiAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBkYXRhO1xuICAgICAgdGhpcy5zZXRJbmNvbWluZ0NhbGxTdGF0dXMoZGF0YSlcbiAgICB9XG4gICAgLy8gfSBlbHNlIGlmKGRhdGE/LnN0YXR1cyA9PSAncmluZ2luZycpe1xuICAgIC8vICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFkZEluY29taW5nUGFydGljaXBhbnQoZGF0YT8uaWQsIHRoaXMudHdpbGlvU2VydmljZS5jb25mZXJlbmNlQ2FsbEluZm8uY29uZmVyZW5jZUlkKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhkYXRhLCdiaGhoaGhoaGhoaGhoaGhoaGhoaCcpXG4gICAgLy8gICB9KVxuICAgIC8vIH1cblxuICAgIC8vIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSgpOy9cbiAgICAvLyBEZXZpY2UuY29ubmVjdCh7IGNvbmZlcmVuY2VOYW1lOiAnbXktY29uZmVyZW5jZS1yb29tJyB9KTtcbiAgICAvLyB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UoeyBjb25mZXJlbmNlTmFtZTogJ215LWNvbmZlcmVuY2Utcm9vbScgfSk7XG4gIH1cbiAgYXN5bmMgY2FsbENvbnRhY3QoY29udGFjdDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0FkZGluZyBwYXJ0aWNpcGFudDonLCBjb250YWN0KTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jYWxsJywgdGhpcy5jYWxsKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNhbGwnLCB0aGlzLmNhbGwuc3RhdHVzKCkpXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBhY3RpdmUgY2FsbFxuICAgIC8vIGlmICghdGhpcy5jYWxsIHx8IHRoaXMuY2FsbC5zdGF0dXMoKSAhPT0gJ29wZW4nKSB7XG4gICAgLy8gICBjb25zb2xlLmVycm9yKCdObyBhY3RpdmUgY2FsbCcpO1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIC8vIEdldCB0aGUgcGhvbmUgbnVtYmVyIGZyb20gdGhlIGNvbnRhY3RcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGNvbnRhY3Q/Lm51bWJlcnNMaXN0Py5bMF0/Lm51bWJlcjtcbiAgICBjb25zdCBjdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGM6IGFueSkgPT4gYz8ucGhvbmUgPT09IHBob25lTnVtYmVyKTtcbiAgICBpZiAoIXBob25lTnVtYmVyIHx8IGN1cnJlbnRDYWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBwaG9uZSBudW1iZXIgZm91bmQgZm9yIGNvbnRhY3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaXNDb25mZXJlbmNlKSB7XG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWRcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkXSxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2U6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICAgIC8vIC4uLnRoaXMuY2FsbERhdGEsXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxuICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXG4gICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGxEYXRhLCAndGhpcy5jYWxsRGF0YTU2NTYnKVxuICAgICAgICBjb25zb2xlLmxvZygndGVzdDExMTExMTU1NTU1NTU1NTUnKTtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY2FsbERhdGE7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goey4uLnRoaXMuY2FsbERhdGF9KTtcbiAgICAgICAgY29uc29sZS5sb2coXCJQYXJ0aWNpcGFudCBhZGRlZCB0byBjb25mZXJlbmNlOlwiLCBwaG9uZU51bWJlcik7XG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQpIHtcbiAgICAgICAgICAgIC8vIGMuaXNIb2xkID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgaG9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBQdXQgY3VycmVudCBjYWxsIG9uIGhvbGRcbiAgICAgICAgLy8gdGhpcy5oZWxkQ2FsbCA9IHRoaXMuY2FsbDtcbiAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xuICAgICAgICAvLyB0aGlzLmhlbGRDYWxsLm11dGUodHJ1ZSk7XG4gICAgICAgIC8vIHRoaXMuaGVsZENhbGxbJ3BhcmFtZXRlcnMnXVsnY2FsbGVyX25hbWUnXSA9IHsgLi4udGhpcy5jYWxsRGF0YSB9XG4gICAgICAgIC8vIHRoaXMuY2FsbD1udWxsXG4gICAgICAgIC8vIENsb3NlIGNvbnRhY3RzIHBhbmVsIGFuZCBzaG93IHJpbmcgYW5pbWF0aW9uXG4gICAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgIC8vIFVwZGF0ZSBVSSB0byByZWZsZWN0IHRoZSBuZXcgb3V0Ym91bmQgbGVnIGJlaW5nIGRpYWxlZFxuICAgICAgICBjb25zdCBjb250YWN0TmFtZSA9IFtjb250YWN0Py5maXJzdE5hbWUsIGNvbnRhY3Q/Lm1pZGRsZU5hbWUsIGNvbnRhY3Q/Lmxhc3ROYW1lXVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAvLyB0aGlzLmNhbGxbJ2NhbGxJbmZvJ10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FsbERhdGEpKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGNvbmZlcmVuY2UgSUQgZnJvbSB0aGUgY3VycmVudCBjYWxsIG9yIHVzZSB0aGUgc3RvcmVkIG9uZVxuICAgICAgICAvLyBjb25zdCBjb25mZXJlbmNlSWQgPSB0aGlzLmNvbmZlcmVuY2VJZDtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmVyZW5jZUlkKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNvbmZlcmVuY2VJZCBmb3VuZCBmb3IgYWN0aXZlIGNhbGxcIik7XG4gICAgICAgICAgc3dhbChcIkVycm9yXCIsIFwiQ2Fubm90IGFkZCBwYXJ0aWNpcGFudDogY29uZmVyZW5jZSBub3QgZm91bmRcIiwgXCJlcnJvclwiKTtcbiAgICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgLy8gICAuLi50aGlzLmNhbGxEYXRhLFxuICAgICAgICAvLyAgIHBhcnRpY2lwYW50SWQ6ICxcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICAgIC8vIC4uLnRoaXMuY2FsbERhdGEsXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxuICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXG4gICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5jYWxsRGF0YSwgJ3RoaXMuY2FsbERhdGEnKVxuICAgICAgICBjb25zb2xlLmxvZygndGVzdDExMTExMScpO1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jYWxsRGF0YTtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7Li4udGhpcy5jYWxsRGF0YX0pO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlBhcnRpY2lwYW50IGFkZGVkIHRvIGNvbmZlcmVuY2U6XCIsIHBob25lTnVtYmVyKTtcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgcGFydGljaXBhbnQ6JywgZXJyb3IpO1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgLy8gUmVzdG9yZSBoZWxkIGNhbGwgb24gZXJyb3JcbiAgICAgIGlmICh0aGlzLmhlbGRDYWxsKSB7XG4gICAgICAgIC8vIHRoaXMuY2FsbCA9IHRoaXMuaGVsZENhbGw7XG4gICAgICAgIC8vIHRoaXMuaGVsZENhbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHRoaXMuaXNDYWxsT25Ib2xkID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuY2FsbC5tdXRlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbFBhcnRpY2lwYW50cyhjb25mZXJlbmNlU2lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VTaWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gcmVzLnBhcnRpY2lwYW50cztcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcbiAgICAgIC8vIGxldCBpbmRleCA9IHRoaXMuY29udGFjdHMuZmluZEluZGV4KChjOmFueSk9PiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyID09IHJlcz8udG8pO1xuICAgICAgLy8gaWYoaW5kZXggPiAtMSl7XG4gICAgICAvLyAgIHRoaXMuY29udGFjdHNbaW5kZXhdLmlzQ2FsbE9uSG9sZCA9IHRydWU7XG4gICAgICAvLyB9XG4gICAgICAvLyBlbHNlIHtcbiAgICAgIC8vICAgcmVzWydJc0Nvbm5lY3RlZCddID0gdHJ1ZTtcbiAgICAgIC8vICAgdGhpcy5jb250YWN0cy5wdXNoKHJlcylcbiAgICAgIC8vIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFjY2VwdENvbmN1cnJlbnRDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XG4gIC8vICAgaWYgKCFpbmNvbWluZ0NhbGwpIHJldHVybjtcblxuICAvLyAgIC8vIFB1dCBjdXJyZW50IGNhbGwgb24gaG9sZCBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3RpbmdcbiAgLy8gICBpZiAodGhpcy5jYWxsKSB7XG4gIC8vICAgICB0aGlzLmhlbGRDYWxsID0gdGhpcy5jYWxsO1xuICAvLyAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xuICAvLyAgICAgLy8gTXV0ZSB0aGUgaGVsZCBjYWxsXG4gIC8vICAgICB0aGlzLmhlbGRDYWxsLm11dGUodHJ1ZSk7XG4gIC8vICAgfVxuXG4gIC8vICAgaW5jb21pbmdDYWxsLmFjY2VwdCgpO1xuICAvLyAgIHRoaXMuY2FsbCA9IGluY29taW5nQ2FsbDtcbiAgLy8gICB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcbiAgLy8gICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xuICAvLyAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gIC8vICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xuICAvLyAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XG4gIC8vICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuXG4gIC8vICAgLy8gUmVzZXQgdGltZXIgZm9yIG5ldyBjYWxsXG4gIC8vICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgLy8gICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgLy8gICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIC8vIH1cblxuXG4gIGFjY2VwdENvbmN1cnJlbnRDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XG4gICAgaWYgKCFpbmNvbWluZ0NhbGwpIHJldHVybjtcblxuXG4gICAgLy8gUHV0IGN1cnJlbnQgY2FsbCBvbiBob2xkIGluc3RlYWQgb2YgZGlzY29ubmVjdGluZ1xuICAgIC8vIGlmICh0aGlzLmNhbGwpIHtcbiAgICAvLyAvLyAgIHRoaXMuaGVsZENhbGwgPSB0aGlzLmNhbGw7XG4gICAgLy8gICB0aGlzLmlzQ2FsbE9uSG9sZCA9IHRydWU7XG4gICAgLy8gLy8gICAvLyBNdXRlIHRoZSBoZWxkIGNhbGxcbiAgICAvLyAvLyAgIHRoaXMuaGVsZENhbGwubXV0ZSh0cnVlKTtcbiAgICAvLyAvLyB9XG5cbiAgICAvLyAvLyBBY2NlcHQgdGhlIG5ldyBjYWxsXG4gICAgLy8gaW5jb21pbmdDYWxsLmFjY2VwdCgpO1xuICAgIC8vIHRoaXMuY2FsbCA9IGluY29taW5nQ2FsbDtcbiAgICAvLyB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcbiAgICAvLyB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xuICAgIC8vIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgLy8gdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xuICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XG4gICAgLy8gdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuXG4gICAgLy8gLy8g8J+foiBSZW1vdmUgdGhlIGFjY2VwdGVkIGNhbGwgZnJvbSBpbmNvbWluZyBsaXN0XG4gICAgLy8gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCA9ICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0IHx8IFtdKS5maWx0ZXIoXG4gICAgLy8gICAoYzogYW55KSA9PiBjPy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBpbmNvbWluZ0NhbGw/LnBhcmFtZXRlcnM/LkNhbGxTaWRcbiAgICAvLyApO1xuICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsc05ld0luZm8uZW1pdCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcblxuICAgIC8vIC8vIPCflZIgUmVzZXQgdGltZXIgZm9yIG5ldyBjYWxsXG4gICAgLy8gdGhpcy5zdG9wVGltZXIoKTtcbiAgICAvLyB0aGlzLnN0YXJ0VGltZXIoKTtcblxuICAgIC8vIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGFzeW5jIHN3YXBDYWxscyhjYWxsSW5mbzogYW55LGlzQ29uZmVyZW5jZUNhbGw/OiBib29sZWFuKSB7XG4gICAgLy8gaWYgKCF0aGlzLmhlbGRDYWxsIHx8ICF0aGlzLmNhbGwpIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGwsICd0aGlzLmNhbGwnKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmhlbGRDYWxsLCAndGhpcy5oZWxkQ2FsbCcpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENhbGxMaXN0LCAndGhpcy5jdXJyZW50Q2FsbExpc3QnKTtcbiAgICBjb25zb2xlLmxvZyhjYWxsSW5mbywgJ2NhbGxJbmZvIGZvciBzd2FwQ2FsbHMnKTtcbiAgICBpZih0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2Upe1xuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XG4gICAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWM/LmlzSG9sZCkge1xuICAgICAgICAgIC8vIGMuaXNIb2xkID0gdHJ1ZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXG4gICAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsSW5mbz8uaXNIb2xkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IGNhbGxJbmZvPy5wYXJ0aWNpcGFudElkKSB7XG4gICAgICAgICAgLy8gYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmKGlzQ29uZmVyZW5jZUNhbGwpIHtcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYz8uaXNDb25mZXJlbmNlKSB7XG4gICAgICAgICAgLy8gYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYy5pc0hvbGQgPSB0cnVlO1xuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xuICAgICAgaWYgKGM/LnBhcnRpY2lwYW50SWQgJiYgIWM/LmlzSG9sZCkge1xuICAgICAgICAvLyBjLmlzSG9sZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgICAgICAgaG9sZDogdHJ1ZSxcbiAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbGxJbmZvPy5pc0hvbGQgJiYgYz8ucGFydGljaXBhbnRJZCA9PT0gY2FsbEluZm8/LnBhcnRpY2lwYW50SWQpIHtcbiAgICAgICAgLy8gYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICBob2xkOiBmYWxzZSxcbiAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBjO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gICAgLy8gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAvLyAgIHBhcnRpY2lwYW50SWQ6IHRoaXMuY2FsbD8uY2FsbEluZm8/LnBhcnRpY2lwYW50SWQsXG4gICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgIC8vICAgaG9sZDogdHJ1ZVxuICAgIC8vIH0pO1xuICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgLy8gICBwYXJ0aWNpcGFudElkOiB0aGlzLmhlbGRDYWxsPy5jYWxsSW5mbz8ucGFydGljaXBhbnRJZCxcbiAgICAvLyAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgLy8gICBob2xkOiBmYWxzZVxuICAgIC8vIH0pO1xuICAgIGNvbnNvbGUubG9nKCdTd2FwcGluZyBjYWxscy4uLicpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgc3dhcCAtIEFjdGl2ZSBjYWxsOicsIHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgc3dhcCAtIEhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG5cbiAgICAvLyBTd2FwIHRoZSBjYWxsc1xuICAgIC8vIGNvbnN0IHRlbXAgPSB0aGlzLmNhbGw7XG4gICAgLy8gdGhpcy5jYWxsID0gdGhpcy5oZWxkQ2FsbDtcbiAgICAvLyB0aGlzLmhlbGRDYWxsID0gdGVtcDtcblxuXG4gICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xuICAgIC8vIHRoaXMuaGVsZENhbGwubXV0ZSh0cnVlKTtcblxuICAgIC8vIFVwZGF0ZSBVSSB3aXRoIGFjdGl2ZSBjYWxsIGluZm8gLSBleHRyYWN0IGZyb20gY2FsbCBwYXJhbWV0ZXJzXG4gICAgLy8gY29uc3QgZnJvbU51bWJlciA9IHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgLy8gY29uc3QgY2FsbGVyTmFtZSA9IHRoaXMuY2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ25hbWUnKSB8fCAnLSc7XG4gICAgLy8gY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgLy8gY29uc3QgZGlzcGxheU51bWJlciA9IHRoaXMuY2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ2Rpc3BsYXlOdW1iZXInKSB8fCAnLSc7XG5cbiAgICAvLyBVcGRhdGUgY2FsbERhdGEgdG8gcmVmcmVzaCB0aGUgbWFpbiBVSVxuICAgIC8vIHRoaXMuY2FsbERhdGEgPSB7XG4gICAgLy8gICAuLi50aGlzLmNhbGxEYXRhLFxuICAgIC8vICAgcGhvbmU6IGZyb21OdW1iZXIsXG4gICAgLy8gICBkaXNwbGF5TnVtOiAoZGlzcGxheU51bWJlciAmJiBkaXNwbGF5TnVtYmVyICE9PSAnLScpID8gZGlzcGxheU51bWJlciA6IGZyb21OdW1iZXIsXG4gICAgLy8gICBuYW1lOiAoY2FsbGVyTmFtZSAmJiBjYWxsZXJOYW1lICE9PSAnLScpID8gY2FsbGVyTmFtZSA6ICh0aGlzLmNhbGxEYXRhPy5uYW1lIHx8IGZyb21OdW1iZXIpLFxuICAgIC8vICAgaW1nOiBjYWxsZXJJbWcgfHwgdGhpcy5jYWxsRGF0YT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1xuICAgIC8vIH07XG5cbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXIgc3dhcCAtIEFjdGl2ZSBjYWxsOicsIHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdBZnRlciBzd2FwIC0gSGVsZCBjYWxsOicsIHRoaXMuaGVsZENhbGwucGFyYW1ldGVyc1snRnJvbSddKTtcbiAgICAvLyBjb25zb2xlLmxvZygnVXBkYXRlZCBjYWxsRGF0YTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jdXJyZW50Q2FsbExpc3QgYWZ0ZXIgc3dhcCcsIHRoaXMuY3VycmVudENhbGxMaXN0KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBhc3luYyBtZXJnZUNhbGxzKCkge1xuICAgIC8vIE1lcmdlIGZ1bmN0aW9uYWxpdHkgLSB1bm11dGUgYm90aCBjYWxscyBmb3IgY29uZmVyZW5jZVxuICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGM/LnBhcnRpY2lwYW50SWQpIHtcbiAgICAgICAgICAvLyBjLmlzSG9sZCA9IGZhbHNlO1xuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xuICAgICAgICAgIC8vIH0gZWxzZSBpZihjPy5wYXJ0aWNpcGFudElkICYmIGMuaXNJbmNvbWluZ0NhbGwpe1xuICAgICAgICAgIC8vICAgYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmFkZEluY29taW5nUGFydGljaXBhbnQoYz8ucGFydGljaXBhbnRJZCwgdGhpcy5jb25mZXJlbmNlSWQpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gICAgICAgY29uc29sZS5sb2coZGF0YSwnYmhoaGhoaGhoaGhoaGhoaGhoaGgnKVxuICAgICAgICAgIC8vICAgICB9KVxuICAgICAgICAgIC8vICAgYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICAvLyAgIGMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAvLyAgIHBhcnRpY2lwYW50SWQ6IHRoaXMuaGVsZENhbGw/LmNhbGxJbmZvPy5wYXJ0aWNpcGFudElkLFxuICAgICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgLy8gICBob2xkOiBmYWxzZVxuICAgICAgLy8gfSk7XG4gICAgICAvLyB0aGlzLmhlbGRDYWxsLm11dGUoZmFsc2UpO1xuICAgICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xuICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBlbmRIZWxkQ2FsbCgpIHtcbiAgICAvLyBpZiAodGhpcy5oZWxkQ2FsbCkge1xuICAgIC8vICAgdGhpcy5oZWxkQ2FsbC5kaXNjb25uZWN0KCk7XG4gICAgLy8gICB0aGlzLmhlbGRDYWxsID0gdW5kZWZpbmVkO1xuICAgIC8vICAgdGhpcy5pc0NhbGxPbkhvbGQgPSBmYWxzZTtcbiAgICAvLyAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAvLyB9XG4gIH1cblxuXG4gIGhhc0RldGFpbGVkSW5mbyhjYWxsRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXG4gICAgaWYgKGNhbGxEYXRhLnVzZXJJbmZvICYmIGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uKSB7XG4gICAgICBjb25zdCBpbmZvID0gY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb247XG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxuICAgICAgICBpbmZvLmVtYWlsICYmIGluZm8uZW1haWwgIT09ICctJyB8fFxuICAgICAgICBpbmZvLm1lc3NhZ2UgJiYgaW5mby5tZXNzYWdlICE9PSAnLScgfHxcbiAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxuICAgICAgICBpbmZvLnNvdXJjZU5hbWUgJiYgaW5mby5zb3VyY2VOYW1lICE9PSAnLScgfHxcbiAgICAgICAgaW5mby5leHRlbnNpb24gJiYgaW5mby5leHRlbnNpb24gIT09ICctJyB8fFxuICAgICAgICBpbmZvLnVybCB8fFxuICAgICAgICBpbmZvLmxhdGl0dWRlIHx8XG4gICAgICAgIGluZm8ubG9uZ2l0dWRlXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9uQ2xpY2tFeHBhbmQoZGF0YT86IGFueSk6IHZvaWQge1xuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID09PSBkYXRhICYmIHRoaXMuaXNDbGlja0V4cGFuZCkge1xuICAvLyAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XG4gIC8vICAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gbnVsbDtcbiAgLy8gICAgIC8vIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvLmVtaXQoe30pO1xuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBkYXRhO1xuXG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpIHtcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGxbJ2lzQ2xpY2tFeHBhbmQnXSA9IHRydWU7XG5cbiAgLy8gICAgIGlmICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0ICYmIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID4gMCkge1xuICAvLyAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goKGNhbGw6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIGlmIChjYWxsICE9PSB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsKSB7XG4gIC8vICAgICAgICAgICBjYWxsWydpc0NsaWNrRXhwYW5kJ10gPSBmYWxzZTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH0pO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsSW5mby5lbWl0KHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpO1xuXG4gIC8vICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8gfHwgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbC51c2VySW5mby5zdGF0dXMgPT0gMjAxKSB7XG4gIC8vICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIGdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhOiBhbnkpIHtcbiAgLy8gICBsZXQgZGF0YSA9IHRoaXMuZnJvbUVudHJpZXMoQXJyYXkuZnJvbShpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZW50cmllcygpKSk7XG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihkYXRhWyd0d2lsaW9BdXRoSWQnXSkuc3Vic2NyaWJlKFxuICAvLyAgIHJlc3BvbnNlID0+IHtcbiAgLy8gICAgIHNldFRpbWVvdXQoKCk9PntcbiAgLy8gICAgICAgaW5jb21pbmdDYWxsRGF0YVsndXNlckluZm8nXT1yZXNwb25zZVxuICAvLyAgICAgfSwgNTAwMClcbiAgLy8gICB9LCBlcnJvciA9PiB7XG4gIC8vICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICByZWplY3RDb25jdXJyZW50Q2FsbChpbmNvbWluZ0NhbGw6IGFueSkge1xuXG4gICAgaWYgKCFpbmNvbWluZ0NhbGwpIHJldHVybjtcbiAgICBpZiAoaW5jb21pbmdDYWxsLnJlamVjdCkge1xuICAgICAgaW5jb21pbmdDYWxsLnJlamVjdCgpO1xuICAgIH1cbiAgICBpZiAoaW5jb21pbmdDYWxsLmRpc2Nvbm5lY3QpIGluY29taW5nQ2FsbC5kaXNjb25uZWN0KCk7XG4gICAgLy8gUmVtb3ZlIGZyb20gbGlzdFxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCB8fCBbXSkuZmlsdGVyKChjOiBhbnkpID0+IGM/LnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IGluY29taW5nQ2FsbD8ucGFyYW1ldGVycz8uQ2FsbFNpZCk7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mby5lbWl0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QpO1xuICAgIC8vIElmIG5vIG1vcmUgaW5jb21pbmcsIGhpZGUgYmFubmVyXG4gICAgaWYgKCF0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0IHx8IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgb25DYWxsSW5wdXRzKG51bTogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcbiAgICAgICAgaWYgKG51bSA9PSAnIycpIHtcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtaGFzaC0ubXAzYCkucGxheSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtc3Rhci0ubXAzYCkucGxheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQgKyBTdHJpbmcobnVtKTtcbiAgICAgICAgdGhpcy5zaG93Q2xlYXJCdG4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgbGV0IHN0ciA9IFN0cmluZyhudW0pO1xuICAgICAgdGhpcy5jYWxsPy5zZW5kRGlnaXRzKHN0cik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuICB9XG4gIG9uQ2FsbElucHV0RW50ZXIoZXY6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoU3RyaW5nKGV2LmtleSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxuICBjbG9zZUluY29taW5nQ2FsbChkYXRhOiBhbnkpIHtcbiAgICAvLyB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuICAgIGlmIChkYXRhLnNob3cpIHtcbiAgICAgIC8vdGhpcy5zaG93Q2FsbFByb2dyZXNzRXZlbnQuZW1pdCgpXG4gICAgICAvLyBoYW5kbGUgaW5jb21pbmcgY2FsbCBhY2NlcHRlZFxuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XG4gICAgICAvLyB0aGlzLmNhbGwgPSBkYXRhLmNhbGw7XG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBpbmNvbWluZ0RldGFpbCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XG4gICAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGluY29taW5nRGV0YWlsLnJlY29yZENhbGw7XG5cbiAgICAgIGlmICh0aGlzLmluY29taW5nUmVjb3JkQ2FsbCkge1xuICAgICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluY29taW5nIGNhbGwgcmVqZWN0ZWQgb3IgYXV0by1jYW5jZWxsZWRcbiAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBOTyBhY3RpdmUgY2FsbCwgdGhlbiBwcm9wYWdhdGUgZW5kLiBPdGhlcndpc2Uga2VlcCBvbmdvaW5nIFVJLlxuICAgICAgaWYgKCF0aGlzLmNhbGwgfHwgdGhpcy5jYWxsLnN0YXR1cygpICE9PSAnb3BlbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3Q3JylcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjbGVhcklucHV0cygpIHtcbiAgICB0aGlzLmNhbGxJbnB1dCA9IHRoaXMuY2FsbElucHV0LnNsaWNlKDAsIC0xKTtcbiAgfVxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBtaW5pbWlzZURpYWxwYWQoKSB7XG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5pc01pbmltaXNlZCA9IHRydWU7XG4gIH1cbiAgbWF4aW1pc2VEaWFscGFkKCkge1xuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gZmFsc2U7XG4gIH1cbiAgdG9nZ2xlUmVjb3JkaW5nKCkge1xuICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xuICAgIH1cbiAgfVxuICBzdGFydFJlY29yZGluZygpIHtcbiAgICBsZXQgc2lkO1xuICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xuICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xuICAgIHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLmNhbGxTaWQgfHwgdGhpcy5hZGRSZXM/LmNvbmZlcmVuY2VTaWQ7XG5cbiAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICBcImNvbmZlcmVuY2VJZFwiOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICB9XG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcocGF5bG9hZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy50aW1lRWxhcHNlZCA9IDA7XG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIHN0b3BSZWNvcmRpbmcoKSB7XG4gICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbiAgcGF1c2VSZWNvcmRpbmcoKSB7XG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jb25mZXJlbmNlSWQsICdwYXVzZScpLnN1YnNjcmliZShcbiAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nVGltZXIoKTtcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhdXNpbmcgcmVjb3JkaW5nOicsIGVycm9yKTtcbiAgICAgICAgLy8gQ29uc2lkZXIgdXBkYXRpbmcgdGhlIFVJIHRvIHNob3cgdGhlIGVycm9yIHN0YXRlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICByZXN1bWVSZWNvcmRpbmcoKSB7XG4gICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgLy8gICByZXR1cm47IC8vIFNraXAgaWYgcmVjb3JkaW5nIGlzIG5vdCBlbmFibGVkXG4gICAgLy8gfVxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHRoaXMuY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcjEoKTtcbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZXN1bWluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gICAgfSk7XG4gIH1cbiAgZ2V0VGltZURpZmZlcmVuY2UoaW5wdXRUaW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhc3RUaW1lID0gbmV3IERhdGUoaW5wdXRUaW1lKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgIGxldCBkaWZmID0gTWF0aC5mbG9vcigoY3VycmVudFRpbWUgLSBwYXN0VGltZSkgLyAxMDAwKTsgLy8gdG90YWwgc2Vjb25kc1xuXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZGlmZiAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gZGlmZiAlIDYwO1xuXG4gICAgY29uc3QgbW0gPSBtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzIDogbWludXRlcztcbiAgICBjb25zdCBzcyA9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xuXG4gICAgcmV0dXJuIGAke21tfToke3NzfWA7XG4gIH1cbiAgc3RhcnRUaW1lcjEoKSB7XG4gICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IGludGVydmFsKDEwMDApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRpbWVFbGFwc2VkKys7XG4gICAgfSk7XG4gIH1cbiAgc3RvcFJlY29yZGluZ1RpbWVyKCkge1xuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IC8vIFBhdXNlIHRoZSB0aW1lclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgICAgICAgIC8vIE9wdGlvbmFsbHkgcmVzZXQgdGhlIHN1YnNjcmlwdGlvblxuICAgIH1cbiAgfVxuICBnZXRGb3JtYXR0ZWRUaW1lKCkge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMudGltZUVsYXBzZWQgLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMudGltZUVsYXBzZWQgJSA2MDtcbiAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJ30ke3NlY29uZHN9YDtcbiAgfVxuICBwb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXhUaW1lID0gMzAwMDA7IC8vIFBvbGwgZm9yIHVwIHRvIDMwIHNlY29uZHNcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAzMDAwOyAvLyBQb2xsIGV2ZXJ5IDMgc2Vjb25kc1xuICAgIGxldCBlbGFwc2VkVGltZSA9IDA7XG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgIGVsYXBzZWRUaW1lICs9IHBvbGxJbnRlcnZhbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXMoY2FsbEF1dGhJZCkudG9Qcm9taXNlKCkgYXMgQ2FsbFN0YXR1c1Jlc3BvbnNlO1xuICAgICAgICBpZiAoc3RhdHVzUmVzcG9uc2UgJiYgc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMpIHtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0dXMgPSBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscy5jYWxsU3RhdHVzO1xuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbFNpZCA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRDYWxsICYmICF0aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QxJylcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xuICAgICAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdyaW5naW5nJykge1xuICAgICAgICAgICAgLy8gQ29udGludWUgcG9sbGluZzsgZG8gbm90IGNsZWFyIHRoZSBpbnRlcnZhbCB5ZXRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICB9XG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPj0gbWF4VGltZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnTWF4IHBvbGxpbmcgdGltZSByZWFjaGVkLiBTdG9wcGluZyBwb2xsLicpO1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgfVxuICAgIH0sIHBvbGxJbnRlcnZhbCk7XG4gIH1cblxuICBnZXRVc2VySW5mb3JtYXRpb24oaWQ6IGFueSkge1xuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oaWQpLnN1YnNjcmliZShcbiAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XG4gICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHJlc3BvbnNlLmMyY0luZm9ybWF0aW9uO1xuICAgICAgICAvLyBpZih0aGlzLmlzQ2xpY2tFeHBhbmQpe1xuICAgICAgICAvLyAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XG4gICAgICAgIC8vIH1cbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgICAgfSk7XG4gIH1cbiAgaW5jb21pbmdDYWxsc05ld0xpc3QoZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coZGF0YSwgJ25ld0luY29taW5nQ2FsbHNMaXN0T1VSJylcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0ID0gZGF0YTtcbiAgICB0aGlzLmluY29taW5nQ2FsbHNOZXdJbmZvLmVtaXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCk7XG4gIH1cbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvKGRhdGE6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBkYXRhO1xuICB9XG5cbiAgZ2V0SG9sZENhbGxMaXN0KCl7XG4gICAgbGV0IGhvbGRMaXN0OiBhbnlbXSA9IFtdO1xuICAgIGxldCBpc0NvbmZlcmVuY2UgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgIGlmKGM/LmlzSG9sZCAmJiAhYz8uaXNDb25mZXJlbmNlKXtcbiAgICAgICAgaG9sZExpc3QucHVzaChjKTtcbiAgICAgIH1cbiAgICAgIGlmKGM/LmlzQ29uZmVyZW5jZSAmJiAhaXNDb25mZXJlbmNlKXtcbiAgICAgICAgaXNDb25mZXJlbmNlID0gdHJ1ZTtcbiAgICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XG4gICAgICAgIGhvbGRMaXN0LnB1c2goYyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhvbGRMaXN0O1xuICB9XG5cbiAgb25DbGlja0V4cGFuZChkYXRhOiBhbnkpe1xuICAgIGlmKGRhdGEuaWQgIT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKXtcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xuICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gIXRoaXMuaXNDbGlja0V4cGFuZDtcbiAgICAgIGlmKHRoaXMuaXNDbGlja0V4cGFuZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xuICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEluY29taW5nQ2FsbFN0YXR1cyhkYXRhOiBhbnkpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHJlY29yZElkOiBkYXRhPy5pZCxcbiAgICAgIGlwQWRkcmVzczogJycsXG4gICAgICBpcENvdW50cnk6ICcnLFxuICAgICAgY2FsbFN0YXR1czogJ2Fuc3dlcmVkJyxcbiAgICAgIFxuICAgIH1cbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0SW5jb21pbmdDYWxsU3RhdHVzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICB9KVxuICB9XG5cbiAgdG9nZ2xlU2VhcmNoKCkge1xuICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcblxuICAvLyBpZiBjbG9zaW5nIHNlYXJjaCDigJQgcmVzZXQgcmVzdWx0c1xuICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gIHRoaXMuY29udGFjdHM7XG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICB9XG59XG5cbmFwcGx5RmlsdGVyKCkge1xuICBjb25zdCB0ZXh0ID0gdGhpcy5zZWFyY2hUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICAgIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcik7XG4gICAgICBpZihpbmRleCA+IC0xKXtcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cy5maWx0ZXIoKGM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChjPy5maXJzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lmxhc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IFxuICAgICAgKGM/Lm1pZGRsZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/LmZ1bGxOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IFxuICAgICAgKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XG4gICAgfSk7XG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0LmZpbHRlcigoYzogYW55KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IChjPy50b05hbWUgfHwgJycpIDogKGM/LmZyb21OYW1lIHx8ICcnKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IG51bWJlciA9IChjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyAoIGM/LnRvIHx8ICcnKSA6IChjPy5mcm9tIHx8ICcnKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBuYW1lLmluY2x1ZGVzKHRleHQpIHx8IG51bWJlci5pbmNsdWRlcyh0ZXh0KTtcbiAgICB9KTtcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoY2M6IGFueSkgPT4gY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIpO1xuICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbmNoZWNrVGV4dEhlaWdodCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgaWYgKGVsPy5zY3JvbGxIZWlnaHQgPiBlbD8uY2xpZW50SGVpZ2h0KSB7XG4gICAgdGhpcy5zaG93QnV0dG9uID0gdHJ1ZTtcbiAgfVxufVxudG9nZ2xlVGV4dCgpIHtcbiAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcbn1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jYWxsRGF0YS5kaWFsID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCIhaXNNaW5pbWlzZWQgJiYgY3VycmVudENhbGxMaXN0Py5sZW5ndGhcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J2NvbGxvcHMnOiBpc0NvbGxvcHMsICdpbmNvbWluZy1jYWxsLWNvbnRhaW5lcic6IGlzQ2xpY2tFeHBhbmQsICdjb250YWN0cy1vcGVuJzogc2hvd0NvbnRhY3RzUGFuZWwgfVwiPlxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5jb21pbmdDYWxsRGl2IHx8IGlzQ29uY3VycmVudEluY29taW5nIHx8IHRydWVcIj4gLS0+XG4gICAgICAgICAgICA8IS0tIEFsbCB0eXBlIENhbGwgSG9sZCBsaXN0ICAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmICEhY3VycmVudENhbGwgJiYgKChpc0NvbmZlcmVuY2VDYWxsSG9sZCB8fCBpc0NvbmZlcmVuY2UpIHx8ICFpc0NvbmZlcmVuY2UpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJpc0NvbmZlcmVuY2VDYWxsSG9sZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaG9sZC1pY29uXCI+cGF1c2VfY2lyY2xlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SG9sZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPkNvbmZlcmVuY2UgQ2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogaXNDb25mZXJlbmNlQ2FsbEhvbGQgfVwiIChjbGljayk9XCJzd2FwQ2FsbHMoe30sdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cInt7J0hvbGQnfX1cIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJlbmRDYWxsKHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVsZENhbGwgb2YgY3VycmVudENhbGxMaXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtY29udGVudFwiICpuZ0lmPVwiaGVsZENhbGw/LmlzSG9sZCAmJiAhaGVsZENhbGw/LmlzQ29uZmVyZW5jZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBob2xkLWljb25cIj5wYXVzZV9jaXJjbGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPkhvbGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1uYW1lXCI+e3toZWxkQ2FsbD8ubmFtZSB8fCAnVW5rbm93biBudW1iZXInfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1udW1iZXJcIj57e2hlbGRDYWxsPy5waG9uZSB8fCAnJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0XCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGhlbGRDYWxsPy5pc0hvbGQgfVwiIChjbGljayk9XCJzd2FwQ2FsbHMoaGVsZENhbGwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwie3toZWxkQ2FsbD8uaXNIb2xkPyAnUmVzdW1lJzonSG9sZCd9fVwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGhlbGRDYWxsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAqbmdJZj1cImhlbGRDYWxsPy5pc0luY29taW5nQ2FsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGhlbGRDYWxsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImhlbGQtYnRuIHN3YXAtYnRuXCIgKGNsaWNrKT1cInN3YXBDYWxscyhoZWxkQ2FsbClcIiB0aXRsZT1cIlN3YXAgY2FsbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHN3YXAtaWNvblwiPnN3YXBfdmVydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtY29udGVudFwiICpuZ0lmPVwiaGVsZENhbGw/LmlzSW5jb21pbmdDYWxsICYmICFoZWxkQ2FsbD8uaXNBY2NlcHRDYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhvbGQtaWNvblwiPnBob25lX2NhbGxiYWNrPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbGFiZWxcIj5JbmNvbWluZyBDYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7aGVsZENhbGw/Lm5hbWUgfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbnVtYmVyXCI+e3toZWxkQ2FsbD8ucGhvbmUgfHwgJyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYW5uZXItYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhaGVsZENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkKGhlbGRDYWxsKVwiPiBjYWxsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4td3JhcHBlciBiYW5uZXItYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChoZWxkQ2FsbClcIj4gY2FsbF9lbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGhlbGRDYWxsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQ29tcGFjdCBiYW5uZXJzIGZvciBjb25jdXJyZW50IGluY29taW5nIChvbmUgcGVyIGNhbGwpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmICFjdXJyZW50Q2FsbD8uaWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYmFubmVycy1jb250YWluZXJcIiAqbmdJZj1cIiFpc0NvbmZlcmVuY2UgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW5jIG9mIGN1cnJlbnRDYWxsTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1iYW5uZXJcIiAqbmdJZj1cImluYz8uaXNJbmNvbWluZ0NhbGwgJiYgIWluYz8uaXNBY2NlcHRDYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB0b3A6ICgoaXNDYWxsT25Ib2xkICYmIGhlbGRDYWxsKSA/IDY0IDogMCkgKyAoaSAqIDcwKSArICdweCcgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYmFubmVyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmNvbSBpbmctbGFiZWxcIj5JbmNvbWluZyBjYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1jYWxsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxsZXItbmFtZVwiPnt7IGluYz8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmM/LmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxsZXItbnVtYmVyXCI+e3sgaW5jPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm51bWJlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jPy5wYXJhbWV0ZXJzPy5Gcm9tIHx8ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYW5uZXItYnRuIGFjY2VwdC1idG5cIiAoY2xpY2spPVwiYWRkKGluYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+Y2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYmFubmVyLWJ0biByZWplY3QtYnRuXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChpbmMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNhbGxfZW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGluYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTEwMCBweS01XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50Q2FsbExpc3QubGVuZ3RoID09PSAxICYmIGN1cnJlbnRDYWxsTGlzdFswXT8uaXNJbmNvbWluZ0NhbGwgJiYgIWN1cnJlbnRDYWxsTGlzdFswXT8uaXNBY2NlcHRDYWxsIFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsVG9OdW1cIj5JbmNvbWluZyBjYWxsIG9uIDxiciAvPjxzcGFuPnt7Y3VycmVudENhbGxMaXN0WzBdPy50byB8fCAnVW5rbm93blxuICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiY3VycmVudENhbGxMaXN0WzBdPy5pbWdcIiBhbHQ9XCJcIiB3aWR0aD1cIjEyMFwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgxPnt7IGN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZSA/IGN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZSA6IGN1cnJlbnRDYWxsTGlzdFswXT8ucGhvbmUgfHwgJ1Vua25vd24gTnVtYmVyJyB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY3VycmVudENhbGxMaXN0WzBdPy5uYW1lXCI+e3sgY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zIG10LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LmlzQ2FsbENvbm5lY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cImFkZChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJvbkVuZENhbGwoY3VycmVudENhbGxMaXN0WzBdKVwiPiBjYWxsX2VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEZvciBtdWx0aXBsZSBpbmNvbWluZyBjYWxscyBidXQgbm90IGFueSBjYWxsIHByb2dyZXNzIC0tPlxuXG5cbiAgICAgICAgICAgIDwhLS0gRm9yIHNpbmdsZSBhY3RpdmUgY2FsbCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoIWlzQ29uZmVyZW5jZSB8fCBpc0NvbmZlcmVuY2VDYWxsSG9sZCkgJiYgISFjdXJyZW50Q2FsbD8uaWRcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6ICdmbGV4JywgJ2ZsZXgtZGlyZWN0aW9uJzogJ2NvbHVtbicsICdwb3NpdGlvbic6ICdyZWxhdGl2ZSd9XCIgY2xhc3M9XCJhY3RpdmUtY2FsbFwiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJjdXJyZW50Q2FsbD8uaW1nXCIgYWx0PVwiXCIgd2lkdGg9XCIxMjBcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMSBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnOHB4J31cIj57e2N1cnJlbnRDYWxsPy5uYW1lIHx8ICdVbmtub3duIG51bWJlcid9fVxuICAgICAgICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICAgICAgICA8cD57e2N1cnJlbnRDYWxsPy5waG9uZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luLXRvcDogNHB4XCI+e3tjdXJyZW50Q2FsbD8udGltZSB8fCB0aW1lcn19PC9oND5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYWN0aW9uLWJ0bnNcIiAqbmdJZj1cIiFzaG93S2V5cGFkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzcyM3gnfVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwiIWluY29taW5nQ2FsbERpdiB8fCBpc0NvbmN1cnJlbnRJbmNvbWluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhlbGQtYnRuIG1lcmdlLWJ0blwiIChjbGljayk9XCJtZXJnZUNhbGxzKClcIiB0aXRsZT1cIk1lcmdlIGNhbGxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA8IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NZXJnZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cInRvZ2dsZUtleXBhZCgpXCI+IHRyYW5zaXRpb25fZGlzc29sdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gZW5kLWNhbGwtYnRuXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY29udGFjdHMtcGFuZWxcIiAqbmdJZj1cInNob3dDb250YWN0c1BhbmVsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgYmFja1wiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKClcIj4gY2hldnJvbl9sZWZ0IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+Q29udGFjdHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNlYXJjaFwiPiBzZWFyY2ggPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBjb250YWN0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj57e2MuZmlyc3ROYW1lfX0ge3tjLm1pZGRsZU5hbWV9fSB7e2MubGFzdE5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgKGMubnVtYmVyc0xpc3QgJiYgYy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cImNhbGxDb250YWN0KGMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5DYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yIHB4LTMgY2FsbC1pbmZvLXdyYXBwZXIgXCIgIFtuZ0NsYXNzXT1cInsnb3Blbi1jb2xsb3BzJzogaXNDb2xsb3BzfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCIgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG93blwiICpuZ0lmPVwiaXNDb2xsb3BzXCIgKGNsaWNrKT1cImlzQ29sbG9wcyA9ICFpc0NvbGxvcHNcIj48L2k+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS11cFwiICpuZ0lmPVwiIWlzQ29sbG9wc1wiIChjbGljayk9XCJpc0NvbGxvcHMgPSAhaXNDb2xsb3BzXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsb3BzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiA+Rmlyc3QgTmFtZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgPnRlc3QgdHR0dHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5MYXN0IE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PnRldHN0IHRlc3QgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5FbWFpbDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPmFiY2RlZnRAdmdyb3VwLmNvbTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5OdW1iZXI6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+NjM1NDU5ODUyNjQyMjU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkxhbmd1YWdlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkVuZ2xpc2g8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkltYWdlIDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj50ZXN0LmpwZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkV4dGVuc2lvbiA6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+NDU5NjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPk5vdGUgOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+dGVzIHRlc3QgdGVzdCA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlN1YmplY3Q6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+aGVsbG8gd29ybGQgfCB0ZXN0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+TWVzc2FnZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj50ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDwhLS0gY29uZmVyZW5jZSBjYWxsIHZpZXcgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmVyZW5jZS1jYWxsLXZpZXdcIiAqbmdJZj1cImlzQ29uZmVyZW5jZSAmJiAhaXNDb25mZXJlbmNlQ2FsbEhvbGRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi1pY29uIG1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLXRpdGxlXCI+Q29uZmVyZW5jZSBDYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbCBvZiBjdXJyZW50Q2FsbExpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbD8uaXNDb25mZXJlbmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSAhPSAwXCI+Jjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYWxsPy5uYW1lID8gY2FsbD8ubmFtZSA6IGNhbGw/LnBob25lIHx8ICdVbmtub3duIG51bWJlcid9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLXRpbWVyXCI+e3sgdGltZXIgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb25mLXJlY29yZFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtc3RvcC1idG5cIiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCIgdGl0bGU9XCJTdG9wIFJlY29yZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gc3RvcF9jaXJjbGUgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRucyBtdC1hdXRvXCIgKm5nSWY9XCIhc2hvd0tleXBhZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICcyMHB4J31cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInRpbWVyLWRpc3BsYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93S2V5cGFkXCIgY2xhc3M9XCJzZW5kRGlnaXQgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbmYtcmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZW1vdmUtYnRuXCIgKGNsaWNrKT1cImFkZFJlbW92ZVBhcnRpY2lwYW50KClcIj5SZW1vdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc011dGV9XCIgKGNsaWNrKT1cInRvZ2dsZU11dGUodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiB7eyBpc011dGUgPyAnbWljX29mZicgOiAnbWljJyB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHRyYW5zaXRpb25fZGlzc29sdmUgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0biBkYW5nZXJcIiAoY2xpY2spPVwiZW5kQ2FsbCh0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiMFwiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjNcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjUpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHVzZVxuICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxuICAgICAgICAgICAgICAgIHg9XCI0OFwiXG4gICAgICAgICAgICAgICAgeT1cIjVcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuMylcIlxuICAgICAgICAgICAgICAvPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFkZCByZW1vdmUgcGFydGljaXBhbnQgcGFuZWwgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLXBhbmVsXCIgKm5nSWY9XCJpc0FkZFJlbW92ZVBhcnRpY2lwYW50ICYmIGZhbHNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBiYWNrXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwodHJ1ZSlcIj4gY2hldnJvbl9sZWZ0IDwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRhY3RzPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc2VhcmNoXCI+IHNlYXJjaCA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtbGlzdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiIFtzcmNdPVwiYz8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmhvbGQgfVwiIChjbGljayk9XCJvbkhvbGRDYWxsKGMpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiSG9sZFwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Ib2xkPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImxhYmVsXCI+RW5kPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEluY29taW5nIGNhbGwgdXNlciBkZXRhaWxzIHNob3duIGluIG1vZGVsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lci1tb2RlbCBwLTMgdGV4dC13aGl0ZSBtb2RlbC1jb250ZW50IGNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCJpc0NsaWNrRXhwYW5kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIHVzZXItaW5mby1zZWN0aW9uXCIgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTNcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlXCI+QzJDIC1QT0lOVCB7e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIxMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTFcIj5OYW1lOjwvaDU+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwidGV4dC13aGl0ZSB1c2VyTmFtZVwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubmFtZX19PC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TnVtYmVyOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubnVtYmVyfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPkV4dGVuc2lvbjo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5leHRlbnNpb259fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+RW1haWw6IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3NlbGVjdGVkVXNlckluZm8/LmVtYWlsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlN1YmplY3Q6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMiBzdWJqZWN0LXRleHRcIiB0aXRsZT1cInt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19XCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMiBtYi0xXCI+SW1hZ2U6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAmJiBzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAhPT0gJy0nOyBlbHNlIG5vSW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7c2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2V9fVwiIGFsdD1cIlwiIHdpZHRoPVwiMTUwXCIgIGNsYXNzPVwibWwtMlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+Tm8gSW1hZ2UgQXZhaWxhYmxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5NZXNzYWdlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb250YWluZXJcIiBbY2xhc3MuZXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubWVzc2FnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidG9nZ2xlLWJ0blwiICpuZ0lmPVwic2hvd0J1dHRvblwiIChjbGljayk9XCJ0b2dnbGVUZXh0KClcIj57eyBpc0V4cGFuZGVkID8gJ1NlZSBsZXNzJyA6ICdTZWUgbW9yZScgfX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPlBvaW50IE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5wb2ludE5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+U291cmNlIE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5zb3VyY2VOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnMgbXQtMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhc2VsZWN0ZWRJbmNvbWluZ0NhbGw/LmlzQ2FsbENvbm5lY3RlZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJhY2NlcHRDYWxsRnJvbUxpc3Qoc2VsZWN0ZWRJbmNvbWluZ0NhbGwpXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gbXV0ZS1idG5cIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWRcIiAgKGNsaWNrKT1cInRvZ2dsZU11dGUoc2VsZWN0ZWRJbmNvbWluZ0NhbGwpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtbXV0ZSc6IGlzTXV0ZX1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwic2VsZWN0ZWRJbmNvbWluZ0NhbGw/LmlzQ2FsbENvbm5lY3RlZCAmJiAhaXNSZWNvcmRpbmdcIiBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKCcnKVwiIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCIgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwicmVqZWN0Q2FsbEZyb21MaXN0KHNlbGVjdGVkSW5jb21pbmdDYWxsKVwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gY29udGFjdCBsaXN0IHBhbmVsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1wYW5lbFwiICpuZ0lmPVwic2hvd0NvbnRhY3RzUGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWhlYWRlclwiPlxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgYmFja1wiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKClcIj4gY2hldnJvbl9sZWZ0IDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250YWN0czwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxwPjwvcD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIiBmaWxsPVwiIzAwMDAwMFwiPjxwYXRoIGQ9XCJtMjU2LTIwMC01Ni01NiAyMjQtMjI0LTIyNC0yMjQgNTYtNTYgMjI0IDIyNCAyMjQtMjI0IDU2IDU2LTIyNCAyMjQgMjI0IDIyNC01NiA1Ni0yMjQtMjI0LTIyNCAyMjRaXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNFQVJDSCBJTlBVVCAodmlzaWJsZSB3aGVuIGlzU2VhcmNoVmlzaWJsZSA9IHRydWUpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhciBwLTNcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgKGlucHV0KT1cImFwcGx5RmlsdGVyKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWxpc3RcIj5cbiAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3Q7IGxldCBpID0gaW5kZXhcIj4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPkluIFRoaXMgQ2FsbDwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cIidhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj5Zb3VcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIj57e3NlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcn19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cImM/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiSG9sZFwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImxhYmVsXCI+SG9sZDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5FbmQ8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5Db250YWN0czwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Yz8uZmlyc3ROYW1lfX0ge3tjPy5taWRkbGVOYW1lfX0ge3tjPy5sYXN0TmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJjYWxsQ29udGFjdChjKVwiICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+Q2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cImM/LmhvbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTXV0ZVVzZXIoYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiYz8uaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhYz8uaXNNdXRlXCI+IG1pYyA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIiAqbmdJZj1cImM/LklzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkhvbGRcIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkhvbGQ8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJvbkVuZENhbGwoYylcIiAqbmdJZj1cImM/LklzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkVuZDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJtaW4tY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzTWluaW1pc2VkXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGZ1bGxzY3JlZW5cIiAoY2xpY2spPVwibWF4aW1pc2VEaWFscGFkKClcIj4gb3Blbl9pbl9mdWxsIDwvc3Bhbj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCVcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tY2FsbC1hbmltYXRpb25cIiBpZD1cImNhbGwtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm1pbi1hdmF0YXItaW1nXCIgW3NyY109XCJjYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsZXJEZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3tjYWxsRGF0YS5uYW1lfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogMFwiPnt7Y2FsbERhdGEuZGlzcGxheU51bSA/IGNhbGxEYXRhLmRpc3BsYXlOdW0gOiBjYWxsRGF0YS5waG9uZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWluLWJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi10aW1lclwiPnt7dGltZXJ9fTwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtc2VjLWJ0blwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|
|
1596
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFvQjlDLE1BQU0sT0FBTyxxQkFBcUI7SUFtRWhDLHNCQUFzQjtJQUN0QixzRkFBc0Y7SUFDdEYsOEZBQThGO0lBQzlGLGtHQUFrRztJQUNsRyw2RUFBNkU7SUFDN0UsOEZBQThGO0lBQzlGLDZFQUE2RTtJQUM3RSxLQUFLO0lBQ0wsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFBVSxhQUE0QjtRQUF4RyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZFbkgseUJBQW9CLEdBQVEsRUFBRSxDQUFDO1FBRTlCLGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUQs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QUFJLEVBQUUsRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUNDLFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQzs7bUhBOW5EVSxxQkFBcUI7dUdBQXJCLHFCQUFxQiwrYUM1QmxDLGdoc0NBK29CTTs0RkRubkJPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7bUtBS3BCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQW9CRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbGwsIERldmljZSB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2V4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi8uLi8uLi9rZXlwYWQnO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XG4gIGNhbGxTaWQ6IHN0cmluZztcbiAgY2FsbFN0YXR1czogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENhbGxTdGF0dXNSZXNwb25zZSB7XG4gIGNhbGxEZXRhaWxzOiBDYWxsRGV0YWlscztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgZXJyb3JUeXBlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jYWxsLXByb2dyZXNzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGNhbGxEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdGVkQ2FsbGVySWQ6IGFueTtcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7XG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgZGV2aWNlPzogRGV2aWNlO1xuICBjYWxsITogQ2FsbDtcbiAgc2hvd1JpbmdBbmltYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGltZXI6IHN0cmluZyA9ICcwMDowMCc7XG4gIGludGVydmFsSWQ6IGFueTtcbiAgc2hvd0tleXBhZDogYm9vbGVhbiA9IGZhbHNlO1xuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XG4gIGNhbGxJbnB1dDogc3RyaW5nID0gJyc7XG4gIGlzTXV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNiYWxlRW5kQ2FsbEJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvbGxvcHMgPSBmYWxzZTtcbiAgY3VycmVudENhbGw6IGFueTtcbiAgLy8gQ29uZmVyZW5jZSBzdGF0ZSBmbGFnXG4gIGlzQ29uZmVyZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc091dGdvaW5nQ2FsbDogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEluY29taW5nIGNhbGwgdmFyaWFibGVzXG4gIGluY29taW5nQ2FsbERpdjogYm9vbGVhbiA9IGZhbHNlO1xuICAvL0BPdXRwdXQoKSBzaG93Q2FsbFByb2dyZXNzRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIFJlY29yZGluZyB2YXJpYWJsZXNcbiAgY2FsbFNpZDogYW55O1xuICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgdGltZUVsYXBzZWQgPSAwOyAvLyBpbiBzZWNvbmRzXG4gIHJlY29yZENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5jb21pbmdDYWxsU2lkOiBhbnk7XG4gIGNhbGxTdGF0dXM6IHN0cmluZyA9ICdyaW5naW5nJztcbiAgaW5jb21pbmdSZWNvcmRDYWxsPzogYW55O1xuICBzZWxlY3RlZEluY29taW5nQ2FsbDogYW55O1xuICBzaG93Q29udGFjdHNQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0FkZFJlbW92ZVBhcnRpY2lwYW50OiBib29sZWFuID0gZmFsc2U7XG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGhlbGRDYWxsPzogQ2FsbDtcbiAgaXNDYWxsT25Ib2xkOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xuICBjdXJyZW50Q2FsbExpc3Q6IGFueVtdID0gW107XG4gIGNvbmZlcmVuY2VJZDogYW55O1xuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcbiAgaXNDbGlja0V4cGFuZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NhbGxJblByb2dyZXNzITogYm9vbGVhbjtcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XG4gIGlzQ29uZmVyZW5jZUNhbGxIb2xkOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkVXNlckluZm86IGFueTtcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XG4gIGlzRXhwYW5kZWQgPSBmYWxzZTtcbnNlYXJjaFRleHQgPSAnJztcbmZpbHRlcmVkTGlzdDogYW55ID0gW107XG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XG4gIHNob3dCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNSaW5naW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGF1ZGlvVVJMOmFueSA9ICcvcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL3NoYXJlZC9pbmNvbWluZ19jYWxsLm1wMyc7XG4gIC8vIC9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2hhcmVkL2luY29taW5nX2NhbGwubXAzXG4gIGluY29taW5nQXVkaW8gPSBuZXcgQXVkaW8odGhpcy5hdWRpb1VSTCk7XG4gIFxuICAvLyBjb250YWN0czogYW55W10gPSBbXG4gIC8vICAgeyBuYW1lOiAnUGFtZWxhIENveCcsIHRpdGxlOiAnUHJvZHVjdCBEZXNpZ25lcicsIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIH0sXG4gIC8vICAgeyBuYW1lOiAnUm9nZXIgUy4gV29vZCcsIHRpdGxlOiAnSmF2YVNjcmlwdCBQcm9ncmFtbWVyJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfSxcbiAgLy8gICB7IG5hbWU6ICdWaWN0b3IgQmxhY2tzdG9uJywgdGl0bGU6ICdEYXRhYmFzZSBBZG1pbmlzdHJhdG9yJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfSxcbiAgLy8gICB7IG5hbWU6ICdUYW1teSBSaW9zJywgdGl0bGU6ICdTdXBwb3J0JywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfSxcbiAgLy8gICB7IG5hbWU6ICdDYXJsb3MgSGVuZGVyc29uJywgdGl0bGU6ICdTb2Z0d2FyZSBBcmNoaXRlY3QnLCBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyB9LFxuICAvLyAgIHsgbmFtZTogJ0VsaXphYmV0aCBCYWlsZXknLCB0aXRsZTogJ0hSJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfVxuICAvLyBdO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlKSB7XG4gICAgY29uc29sZS5sb2coJ0NhbGwgUHJvZ3Jlc3MgQ29tcG9uZW50Jyk7XG4gICAgdGhpcy5jYWxsID0gdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGw7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zb2xlLmxvZygnQ2FsbCBQcm9ncmVzcyBDb21wb25lbnQgbmdPbkluaXQnKTtcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW5jb21pbmcgY2FsbHMgZnJvbSBUd2lsaW9TZXJ2aWNlXG4gICAgdHJ5IHtcbiAgICAgIC8vIHRoaXMuaW5jb21pbmdBdWRpbyA9IG5ldyBBdWRpbygnLi4vLi4vLi4vYXNzZXRzL3Bob25lLXJpbmdpbmcubXAzJyk7XG4gICAgICB0aGlzLmluY29taW5nQXVkaW9bJ2xvb3AnXSA9IHRydWU7XG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY3VycmVudENhbGwuc3Vic2NyaWJlKChpbmNvbWluZzogYW55KSA9PiB7XG4gICAgICAgIGlmICghaW5jb21pbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsIGVtaXR0ZWQ6JywgaW5jb21pbmcpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnQ3VycmVudCBjYWxsIHN0YXR1czonLCB0aGlzLmNhbGw/LnN0YXR1cygpKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gb25nb2luZyBjYWxsLCBzaG93IGNvbmN1cnJlbnQgaW5jb21pbmcgYmFubmVyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDb25jdXJyZW50IGluY29taW5nIGRldGVjdGVkIC0gc2hvd2luZyBiYW5uZXInKTtcbiAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gdHJ1ZTtcbiAgICAgICAgLy8gQWRkIHRvIGxpc3QgaWYgbm90IHByZXNlbnRcbiAgICAgICAgY29uc3QgZXhpc3RzID0gKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgfHwgW10pLnNvbWUoKGM6IGFueSkgPT4gYz8ucGFyYW1ldGVycz8uQ2FsbFNpZCA9PT0gaW5jb21pbmc/LnBhcmFtZXRlcnM/LkNhbGxTaWQpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSBbLi4uKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgfHwgW10pLCBpbmNvbWluZ107XG4gICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mby5lbWl0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy8gfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3Vic2NyaWJpbmcgdG8gaW5jb21pbmcgY2FsbHM6JywgZSk7XG4gICAgfVxuICAgIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10pIHtcbiAgICAgIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uaXNJbmNvbWluZ0NhbGwpIHtcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSB0cnVlO1xuICAgICAgICAvLyB0aGlzLmNhbGxbJ2NhbGxJbmZvJ10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FsbERhdGEpKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xuICAgICAgICBjb25zb2xlLmxvZygndGVzdC1zdGFydENhbGwxMjMnLCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgICAgaWQ6ICcxMjUnLFxuICAgICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0hvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNNdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcGhvbmU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5waG9uZSxcbiAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6ICcxMjEnLFxuICAgICAgICAgICAgICAgICAgbmFtZTogY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/Lm5hbWUgfHwgY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/LmZyb21OYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy50b05hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVyLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhcnRDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10pIHtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBvbmdvaW5nIGNhbGxcbiAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbMF0uY29uZmVyZW5jZUlkO1xuICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaChhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09IHJlcy5pZCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiAhcmVzLmlzTGVmdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgLi4ucmVzLFxuICAgICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzLmlzSG9sZCxcbiAgICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8sXG4gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxuICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXMuam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNob3dDb250YWN0c1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VTaWQpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSAmJiByZXMuaXNMZWZ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMCA/IHRoaXMuY3VycmVudENhbGxMaXN0WzBdIDoge307XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbD8uaXNIb2xkICYmICF0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICBob2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRDYWxsPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25mZXJlbmNlQ2FsbGxpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0NvbmZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmVyZW5jZUNhbGxsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogY29uZmVyZW5jZUNhbGxsaXN0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLnBhcnRpY2lwYW50SWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZTogdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBpZiAoaXRlbS5pc0NvbmZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXRlbS5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGl0ZW0uaXNIb2xkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyB9KVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZih0aGlzLnNob3dDb250YWN0c1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VTaWQpXG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgLi4ucmVzLFxuICAgICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzLmlzSG9sZCxcbiAgICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcy5pc0NvbmZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8sXG4gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxuICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXMuam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGlmKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PSAxICYmIHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCl7XG4gICAgICAgICAgICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vICAgICBpZih0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPT0gMSAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXS5pc0hvbGQpIHtcbiAgICAgICAgICAgICAgLy8gICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICAgIC8vICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmN1cnJlbnRDYWxsTGlzdFswXS5wYXJ0aWNpcGFudElkXSxcbiAgICAgICAgICAgICAgLy8gICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgLy8gICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgICAgIC8vICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzQ29uZmVyZW5jZVxuICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgICAvLyAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAuLi5yZXMsXG4gICAgICAgICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXG4gICAgICAgICAgICAgICAgaXNIb2xkOiByZXMuaXNIb2xkLFxuICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlLFxuICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IHRoaXMuZ2V0VGltZURpZmZlcmVuY2UocmVzLmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcbiAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBsZXQgY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXNBY2NlcHRDYWxsICYmICFpdGVtLmlzSG9sZCk7XG4gICAgICAgICAgaWYoY3VycmVudENhbGw/LmlkKXtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSBjdXJyZW50Q2FsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKXtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFVzZXIgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvLnBhcnRpY2lwYW50SWQpO1xuICAgICAgICAgICAgaWYoc2VsZWN0ZWRVc2VyKXtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRVc2VyLklzVXNlckluZm9TaG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gc2VsZWN0ZWRVc2VyO1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGV0IGluY29taW5nQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xuICAgICAgICAgICAgICBpZihpbmNvbWluZ0NhbGw/LnBhcnRpY2lwYW50SWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGluY29taW5nQ2FsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmlzQ2xpY2tFeHBhbmQpe1xuICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlc0luZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+ICEhaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xuICAgICAgICAgICAgaWYocmVzSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF0uSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF07XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICBsZXQgaW5jb21pbmdEYXRhOiBhbnkgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXMpPT4gcmVzLmlzSW5jb21pbmdDYWxsICYmICFyZXMuaXNBY2NlcHRDYWxsICYmIHJlcy5idXNpbmVzc090cCk7XG4gICAgICAgICAgaWYoaW5jb21pbmdEYXRhPy5pZCAmJiAhdGhpcy5pc1Jpbmdpbmcpe1xuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0F1ZGlvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighaW5jb21pbmdEYXRhPy5pZCAmJiB0aGlzLmlzUmluZ2luZyl7XG4gICAgICAgICAgICB0aGlzLmluY29taW5nQXVkaW8ucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdjdXJyZW50Q2FsbExpc3QnLCB0aGlzLmN1cnJlbnRDYWxsTGlzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgIGlmICh0aGlzLmluY29taW5nQXVkaW8gJiYgdGhpcy5pc1JpbmdpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdBdWRpby5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzUmluZ2luZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPXt9XG4gICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgaWYodGhpcy5jYWxsKXtcbiAgICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG5cbiAgZ2V0U3RhdHVzKHJlczogYW55KSB7XG4gICAgLy8gY29uc3Qgc3RhdHVzTGlzdCA9IFtcImFuc3dlcmVkXCIsIFwicGFydGljaXBhbnQtaG9sZFwiLCBcInBhcnRpY2lwYW50LW11dGVcIiwgXCJwYXJ0aWNpcGFudC1qb2luXCIsIFwicXVldWVkXCIsIFwiaW4tcHJvZ3Jlc3NcIiwgXCJpbml0aWF0ZWRcIiwgJ3JpbmdpbmcnLCAnXCJjb25uZWN0ZWRcIiddO1xuICAgIC8vIGlmIChzdGF0dXNMaXN0LmluY2x1ZGVzKHJlcy5zdGF0dXMpICYmIHJlcy5kaXJlY3Rpb24gIT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcbiAgICAvLyAgIHJldHVybiB0cnVlO1xuICAgIC8vIH0gZWxzZSBpZiAocmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xuICAgIC8vICAgcmV0dXJuIHRoaXMuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5pbmNsdWRlcyhyZXMuaWQpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuICAgIGlmKHJlcy5pbmNvbWluZ1N0YXR1cyA9PSAnYW5zd2VyZWQnICYmIHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAvLyB9LCAzMDAwKTtcblxuICB9XG5cbiAgR2V0Q29udGFjdHNMaXN0KCkge1xuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZWFkQ29udGFjdHModG9rZW4pLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQVBJIFJlc3BvbnNlOicsIHJlcyk7XG5cbiAgICAgICAgLy8gTm90ZTogQ2FwaXRhbCBCIGluIHBob25lQm9va1xuICAgICAgICBpZiAocmVzICYmIHJlcy5waG9uZUJvb2spIHtcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzLnBob25lQm9vaztcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHJlcy5waG9uZUJvb2s7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvbnRhY3RzIGFycmF5OicsIHRoaXMuY29udGFjdHMpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXM7XG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgICAgICBjb25zb2xlLmxvZygnQ29udGFjdHMgYXJyYXk6JywgdGhpcy5jb250YWN0cyk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY29udGFjdHM6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLmNvbnRhY3RzID0gW107XG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBhZGRSZXM6IGFueTtcbiAgYXN5bmMgc3RhcnRDYWxsKGNhbGxEYXRhOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhjYWxsRGF0YSwgJ2NhbGxEYXRhJyk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBlbnZpcm9ubWVudC5jaGFubmVsSWQsXG4gICAgICAgIHVzZXJJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxuICAgICAgICB0bzogY2FsbERhdGEucGhvbmUsXG4gICAgICAgIGZyb21OdW1iZXI6IGNhbGxEYXRhLmZyb20sXG4gICAgICAgIHNjb3BlOiAnbG9jYWwnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XG4gICAgICAgICAgICAgIGJ1c2luZXNzTnVtYmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgY2FsbFNpZDonJyxcbiAgICAgICAgICAgICAgY2FsbFN0YXR1czonJyxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOicnLFxuICAgICAgICAgICAgICBkaWFsOnRydWUsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjonb3V0Z29pbmctY2FsbCcsXG4gICAgICAgICAgICAgIGZvcndhcmRlZFRvOicnLFxuICAgICAgICAgICAgICBmcm9tOmNhbGxEYXRhLmZyb20sXG4gICAgICAgICAgICAgIGlkOid5eXVnZ2hqYicsXG4gICAgICAgICAgICAgIGltZzpjYWxsRGF0YS5pbWcgfHwnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDp0cnVlLFxuICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6ZmFsc2UsXG4gICAgICAgICAgICAgIGlzSG9sZDpmYWxzZSxcbiAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6ZmFsc2UsXG4gICAgICAgICAgICAgIGlzTGVmdDpmYWxzZSxcbiAgICAgICAgICAgICAgaXNNdXRlOmZhbHNlLFxuICAgICAgICAgICAgICBqb2luZWRBdDonJyxcbiAgICAgICAgICAgICAgbmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6J3l5dWdnaGpiJyxcbiAgICAgICAgICAgICAgcGhvbmU6Y2FsbERhdGE/LnBob25lIHx8ICcnLFxuICAgICAgICAgICAgICByb2xlOidjYWxsZWUnLFxuICAgICAgICAgICAgICBzdGF0dXM6JycsXG4gICAgICAgICAgICAgIHRpbWU6JycsXG4gICAgICAgICAgICAgIHRvOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXG4gICAgICAgICAgICAgIHRvTmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICAgIHVzZXJJZDpjYWxsRGF0YT8udXNlcklkIHx8ICcnXG4gICAgICAgICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaW5pdGlhdGVDYWxsKHBheWxvYWQpO1xuICAgICAgdGhpcy5jb25mZXJlbmNlSWQgPSByZXNwb25zZT8uY2FsbGF1dGg/LmlkO1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgY29uc3QgeyBpZDogY2FsbEF1dGhJZCwgcmVjb3JkQ2FsbCB9ID0gYXdhaXQgdGhpcy5nZXRDYWxsQXV0aElkKHJlc3BvbnNlKTtcbiAgICAgICAgLy8gdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY2FsbEF1dGhJZClcbiAgICAgICAgdGhpcy5yZWNvcmRDYWxsID0gcmVjb3JkQ2FsbDsgLy8gU3RvcmUgdGhlIHJlY29yZENhbGwgdmFsdWVcbiAgICAgICAgY29uc3QgdG9rZW5EYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmdldE91dGdvaW5nQ2FsbFRva2VuKGNhbGxBdXRoSWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3RUb0RldmljZSh0b2tlbkRhdGEudG9rZW4sIGNhbGxEYXRhKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcblxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hZGRSZXMgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcbiAgICAgICAgICAgICAgZnJvbTogY2FsbERhdGE/LmZyb20sXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gdGhpcy5jYWxsRGF0YSA9IHsgLi4uY2FsbERhdGEsIHBhcnRpY2lwYW50SWQ6IHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkLCBpc0hvbGQ6IGZhbHNlLCBpc0xlZnQ6IGZhbHNlLCBpc0luY29taW5nQ2FsbDogZmFsc2UsIGlzQ29uZmVyZW5jZTogZmFsc2UsIGlzQWNjZXB0Q2FsbDogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gdGhpcy5jYWxsWydjYWxsSW5mbyddID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbGxEYXRhKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGVzdDExMTExMScpO1xuICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHsuLi50aGlzLmNhbGxEYXRhLCBpbWc6IGNhbGxEYXRhLmltZyB8fCdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ307XG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIGlzQWNjZXB0Q2FsbCBiYXNlZCBvbiBjdXJyZW50IGNhbGwgc3RhdGUgdG8gZW5zdXJlIFVJIHJlbmRlcnMgaWYgYWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xuICAgICAgICAgICAgLy8gICAuLi50aGlzLmNhbGxEYXRhLFxuICAgICAgICAgICAgLy8gICBpbWc6IGNhbGxEYXRhLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgICAgICAvLyAgIGlzQWNjZXB0Q2FsbDogdHJ1ZVxuICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhbCBwYXJ0aWNpcGFudElkOicsIHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgaW5pdGlhbCBwYXJ0aWNpcGFudDonLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApXG4gICAgICAgIC8vIFBvbGwgdGhlIHN0YXR1cyBmb3IgMzAtNDUgc2Vjb25kc1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAxKSB7XG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnIvPlwiKSwgXCJlcnJvclwiKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QyJylcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICBjb25zb2xlLmxvZygndGVzdDMnKVxuICAgICAgdGhpcy5lbmRDYWxsKCk7XG4gICAgfVxuICB9XG5cbiAgb25Ib2xkQ2FsbChjOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhjLCAnZHNkc2RzZHNkc2RzYWRzYScpO1xuICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICBwYXJ0aWNpcGFudElkOiBbYy5wYXJ0aWNpcGFudElkXSxcbiAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgICBob2xkOiAhYy5ob2xkLFxuICAgICAgY29uZmVyZW5jZTogYy5pc0NvbmZlcmVuY2VcbiAgICB9KVxuICAgIGMuaG9sZCA9ICFjLmhvbGQ7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgYXN5bmMgb25FbmRDYWxsKGM6IGFueSwgaXNBbGxDYWxsRW5kPzogYm9vbGVhbikge1xuICAgIGNvbnNvbGUubG9nKGMsICdkc2RzZHNkc2RzZHNhZHNhJyk7XG4gICAgbGV0IHBhcnRpY2lwYW50SWQgPSBpc0FsbENhbGxFbmQgPyAnYWxsJyA6IGMucGFydGljaXBhbnRJZCB8fCBjLnBhcnRpY2lwYW50SWQ7XG4gICAgbGV0IHJlczogYW55ID0gYXdhaXQgdGhpcy5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgdGhpcy5jb25mZXJlbmNlSWQpO1xuICAgIGlmIChyZXM/LnN0YXR1cyA9PSAyMDEgJiYgcmVzPy5tZXNzYWdlID09ICdwYXJ0aWNpcGFudCBhbHJlYWR5IGxlZnQnKSB7XG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcnRpY2lwYW50SWQgIT09IGMucGFydGljaXBhbnRJZCk7XG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMCA/IHRoaXMuY3VycmVudENhbGxMaXN0WzBdIDogbnVsbDtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy50d2lsaW9TZXJ2aWNlLmNvbmZlcmVuY2VDYWxsSW5mby5jb25mZXJlbmNlU2lkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVDYWxsKHBheWxvYWQ6IGFueSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaW5pdGlhdGVDYWxsKHBheWxvYWQpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgb25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkUGFydGljaXBhbnRUb0NhbGwocGF5bG9hZDogYW55KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLm9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZDogYW55LCBjb25mZXJlbmNlSWQ6IGFueSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENhbGxBdXRoSWQocmVzcG9uc2U6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuY2FsbGF1dGguaWQsXG4gICAgICByZWNvcmRDYWxsOiByZXNwb25zZS5jYWxsYXV0aC5yZWNvcmRDYWxsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEF1dGhJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDb25mZXJlbmNlQ2FsbFRva2VuKHsgYXV0aElkOiBjYWxsQXV0aElkIH0pLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9EZXZpY2UodG9rZW46IGFueSwgY2FsbERhdGE6IGFueSkge1xuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXG4gICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0b2tlbi52YWx1ZSwgb3B0aW9ucyk7XG4gICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy5kZXZpY2UuY29ubmVjdCh7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgRnJvbTogY2FsbERhdGEuZnJvbSxcbiAgICAgICAgVG86IGNhbGxEYXRhLnBob25lLFxuICAgICAgICBFbnY6IGVudmlyb25tZW50LmFiYixcbiAgICAgICAgVG9rZW46IHRva2VuLmlkLFxuICAgICAgICBFeHQ6IGNhbGxEYXRhLmV4dE51bVxuICAgICAgfSxcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxuICAgIH0pO1xuICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xuICAgIGNvbnNvbGUubG9nKCd0ZXN0OTg5OTgxMTExMTEnLCB0aGlzLmNhbGwpO1xuICAgIGNvbnNvbGUubG9nKCd0ZXN0ZGV2aWNlJywgdGhpcy50d2lsaW9TZXJ2aWNlLmRldmljZSk7XG4gICAgLy8gdGhpcy5jYWxsWydjYWxsSW5mbyddID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYWxsRGF0YSkpO1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgdGhpcy5kZXZpY2U/Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jYWxsPy5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2FsbD8ub24oJ2Rpc2Nvbm5lY3QnLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygndGVzdC1kaXNjb25uZWN0JylcbiAgICAgIHRoaXMuY2FsbD8uZGlzY29ubmVjdCgpO1xuICAgICAgLy8gdGhpcy5lbmRDYWxsKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhbGw/Lm9uKCdyaW5naW5nJywgKCkgPT4ge1xuICAgIH0pO1xuXG4gICAgdGhpcy5jYWxsPy5vbigncmVqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3Rlc3Q1JylcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jYWxsPy5vbignYWNjZXB0JywgKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgb3V0Z29pbmcgY2FsbCBpcyBtYXJrZWQgYXMgYWNjZXB0ZWQgc28gdGhlIFVJIHN3aXRjaGVzIHRvIHRoZSBjb25uZWN0ZWQgdmlld1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGlkID0gdGhpcy5jYWxsRGF0YT8ucGFydGljaXBhbnRJZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jdXJyZW50Q2FsbExpc3QpICYmIHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkeCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoYzogYW55KSA9PiAocGlkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IHBpZCkgfHwgKCFwaWQgJiYgYz8ucGhvbmUgPT09IHRoaXMuY2FsbERhdGE/LnBob25lKSk7XG4gICAgICAgICAgLy8gaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0W2lkeF0uaXNBY2NlcHRDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpZHhdO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XG4gICAgICB9XG4gICAgICAvLyBTdGFydCByZWNvcmRpbmcgaWYgcmVjb3JkQ2FsbCBpcyB0cnVlIGFuZCBjYWxsIGlzIGFjY2VwdGVkIGZvciAzMCBzZWNvbmRzXG4gICAgICAvLyBpZiAodGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSByZXR1cm47IC8vIElmIGFscmVhZHkgcmVjb3JkaW5nLCBza2lwXG4gICAgICAvLyAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xuICAgICAgLy8gICB9LCAzMDAwMCk7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICAgIC8vIH1cbiAgICB9KTtcbiAgICB0aGlzLmNhbGw/Lm9uKCdtZXNzYWdlUmVjZWl2ZWQnLCAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGltZXIoKSB7XG4gICAgbGV0IHNlY29uZHMgPSAwO1xuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHNlY29uZHMrKztcbiAgICAgIHRoaXMudGltZXIgPSB0aGlzLmZvcm1hdFRpbWUoc2Vjb25kcyk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lcigpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgdGhpcy50aW1lciA9ICcwMDowMCc7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpbWUodG90YWxTZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIGAke3RoaXMucGFkKG1pbnV0ZXMpfToke3RoaXMucGFkKHNlY29uZHMpfWA7XG4gIH1cblxuICBwcml2YXRlIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBzd2FsKFwiRXJyb3JcIiwgZXJyb3IsIFwiZXJyb3JcIik7XG4gIH1cblxuICAvLyBlbmRDYWxsKCkge1xuICAvLyAgIGNvbnNvbGUubG9nKCdlbmRDYWxsKCkgY2FsbGVkJyk7XG4gIC8vICAgY29uc29sZS5sb2coJ0N1cnJlbnQgY2FsbDonLCB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG4gIC8vICAgY29uc29sZS5sb2coJ0hlbGQgY2FsbCBleGlzdHM6JywgISF0aGlzLmhlbGRDYWxsKTtcblxuICAvLyAgIC8vIERpc2Nvbm5lY3QgdGhlIGN1cnJlbnQgYWN0aXZlIGNhbGxcbiAgLy8gICBpZiAodGhpcy5jYWxsKSB7XG4gIC8vICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xuICAvLyAgICAgdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xuICAvLyAgIH1cblxuICAvLyAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcbiAgLy8gICB0aGlzLnN0b3BUaW1lcigpO1xuXG4gIC8vICAgLy8gSWYgdGhlcmUncyBhIGhlbGQgY2FsbCwgbWFrZSBpdCBhY3RpdmVcbiAgLy8gICBpZiAodGhpcy5oZWxkQ2FsbCkge1xuICAvLyAgICAgY29uc29sZS5sb2coJ1Jlc3VtaW5nIGhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG5cbiAgLy8gICAgIC8vIE1ha2UgaGVsZCBjYWxsIHRoZSBhY3RpdmUgY2FsbFxuICAvLyAgICAgdGhpcy5jYWxsID0gdGhpcy5oZWxkQ2FsbDtcbiAgLy8gICAgIHRoaXMuaGVsZENhbGwgPSB1bmRlZmluZWQ7XG4gIC8vICAgICAvLyB0aGlzLmlzQ2FsbE9uSG9sZCA9IGZhbHNlO1xuICAvLyAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSAhIXRoaXMuaGVsZENhbGw7XG5cblxuICAvLyAgICAgLy8gVW5tdXRlIHRoZSByZXN1bWVkIGNhbGxcbiAgLy8gICAgIHRoaXMuY2FsbC5tdXRlKGZhbHNlKTtcblxuICAvLyAgICAgLy8gVXBkYXRlIFVJIHdpdGggdGhlIHJlc3VtZWQgY2FsbCBpbmZvXG4gIC8vICAgICBjb25zdCBmcm9tTnVtYmVyID0gdGhpcy5jYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcbiAgLy8gICAgIGNvbnN0IGNhbGxlck5hbWUgPSB0aGlzLmNhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xuICAvLyAgICAgY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG5cbiAgLy8gICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gIC8vICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gIC8vICAgICAgIHBob25lOiBmcm9tTnVtYmVyLFxuICAvLyAgICAgICBkaXNwbGF5TnVtOiBmcm9tTnVtYmVyLFxuICAvLyAgICAgICBuYW1lOiBjYWxsZXJOYW1lLFxuICAvLyAgICAgICBpbWc6IGNhbGxlckltZ1xuICAvLyAgICAgfTtcblxuICAvLyAgICAgLy8gUmVzdGFydCB0aW1lciBmb3IgdGhlIHJlc3VtZWQgY2FsbFxuICAvLyAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gIC8vICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XG5cbiAgLy8gICAgIGNvbnNvbGUubG9nKCdIZWxkIGNhbGwgaXMgbm93IGFjdGl2ZTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgLy8gICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgLy8gTm8gaGVsZCBjYWxsLCBjb21wbGV0ZWx5IGVuZFxuICAvLyAgICAgY29uc29sZS5sb2coJ05vIGhlbGQgY2FsbCwgZW5kaW5nIGNvbXBsZXRlbHknKTtcbiAgLy8gICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcbiAgLy8gICAgIHRoaXMubWF4aW1pc2VEaWFscGFkKCk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XG4gICAgY29uc29sZS5sb2coJ2VuZENhbGwoKSBjYWxsZWQnKTtcbiAgICAvLyBjb25zb2xlLmxvZygnQ3VycmVudCBjYWxsOicsIHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snRnJvbSddKTtcbiAgICBjb25zb2xlLmxvZygnSGVsZCBjYWxsIGV4aXN0czonLCAhIXRoaXMuaGVsZENhbGwpO1xuICAgIC8vIExlYXZpbmcgY29uZmVyZW5jZSBzdGF0ZSB3aGVuIGVuZGluZyBjdXJyZW50IGNhbGwgYWN0aW9uXG4gICAgdGhpcy5pc0NvbmZlcmVuY2UgPSBmYWxzZTtcblxuICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcbiAgICBpZiAoaXNBbGxDYWxsRW5kKSB7XG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgICAgdGhpcy5vbkVuZENhbGwoe30sIGlzQWxsQ2FsbEVuZCk7XG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmN1cnJlbnRDYWxsLCBpc0FsbENhbGxFbmQpO1xuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gYz8ucGFydGljaXBhbnRJZCAhPT0gdGhpcy5jdXJyZW50Q2FsbC5wYXJ0aWNpcGFudElkKTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF07XG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gbnVsbDtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FsbCkge1xuICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLmNhbGwucmVqZWN0KCk7XG4gICAgICAgIC8vIHRoaXMuY2FsbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gaWYgKHRoaXMuaGVsZENhbGwpIHtcbiAgICAvLyAgIGlmICh0aGlzLmNhbGwpIHtcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xuICAgIC8vICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmNhbGw/LmNhbGxJbmZvLCBpc0FsbENhbGxFbmQpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc29sZS5sb2coJ1Jlc3VtaW5nIGhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG5cbiAgICAvLyAgIC8vIFByb21vdGUgaGVsZCBjYWxsXG4gICAgLy8gICAvLyB0aGlzLmNhbGwgPSB0aGlzLmhlbGRDYWxsO1xuICAgIC8vICAgdGhpcy5oZWxkQ2FsbCA9IHVuZGVmaW5lZDtcbiAgICAvLyAgIC8vIHRoaXMuaXNDYWxsT25Ib2xkID0gZmFsc2U7XG4gICAgLy8gICAvLyB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlOyAvLyBFbnN1cmUgVUkgcmVuZGVyc1xuXG4gICAgLy8gICAvLyB0aGlzLmNhbGwubXV0ZShmYWxzZSk7XG5cbiAgICAvLyAgIC8vIFVwZGF0ZSBjYWxsRGF0YVxuICAgIC8vICAgY29uc3QgZnJvbU51bWJlciA9IHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgLy8gICBjb25zdCBjYWxsZXJOYW1lID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJztcbiAgICAvLyAgIGNvbnN0IGNhbGxlckltZyA9IHRoaXMuY2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ2ltYWdlJykgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuXG4gICAgLy8gICB0aGlzLmNhbGxEYXRhID0ge1xuICAgIC8vICAgICBwaG9uZTogZnJvbU51bWJlcixcbiAgICAvLyAgICAgZGlzcGxheU51bTogZnJvbU51bWJlcixcbiAgICAvLyAgICAgbmFtZTogY2FsbGVyTmFtZSxcbiAgICAvLyAgICAgaW1nOiBjYWxsZXJJbWdcbiAgICAvLyAgIH07XG5cbiAgICAvLyAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgIC8vICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuXG4gICAgLy8gICAvLyBGb3JjZSBVSSB1cGRhdGVcbiAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpKTtcblxuICAgIC8vICAgY29uc29sZS5sb2coJ0hlbGQgY2FsbCBpcyBub3cgYWN0aXZlOicsIHRoaXMuY2FsbERhdGEpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnTm8gaGVsZCBjYWxsLCBlbmRpbmcgY29tcGxldGVseScpO1xuICAgIC8vICAgY29uc29sZS5sb2coJ3Rlc3Q2JylcbiAgICAvLyAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcbiAgICAvLyAgIGlmICh0aGlzLmNhbGwpIHtcbiAgICAvLyAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5jYWxsPy5jYWxsSW5mbywgaXNBbGxDYWxsRW5kKTtcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5tYXhpbWlzZURpYWxwYWQoKTtcbiAgICAvLyB9XG4gIH1cblxuXG4gIGFzeW5jIHRvZ2dsZU11dGUoaXNDb25mZXJlbmNlPzogYm9vbGVhbikge1xuICAgIC8vIGF3YWl0IHRoaXMub25NdXRlUGFydGljaXBhbnQoe1xuICAgIC8vICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxuICAgIC8vICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAvLyAgIG11dGU6ICF0aGlzLmlzTXV0ZSxcbiAgICAvLyB9KVxuICAgIC8vIHRoaXMuY2FsbCA9IHRoaXMuaGVsZENhbGxcbiAgICAvLyB0aGlzLnRvZ2dsZU1pYygpXG4gICAgdGhpcy5pc011dGUgPSAhdGhpcy5pc011dGU7XG4gICAgY29uc29sZS5sb2coJ2lzTXV0ZScsIHRoaXMuY2FsbCwgdGhpcy5oZWxkQ2FsbClcbiAgICB0aGlzLmNhbGw/Lm11dGUodGhpcy5pc011dGUpO1xuICAgIC8vIGlmIChpc0NvbmZlcmVuY2UpIHtcbiAgICAgIHRoaXMuY3VycmVudENhbGwuaXNNdXRlID0gdGhpcy5pc011dGU7XG4gICAgLy8gfSBlbHNlIHtcblxuICAgIC8vIH1cbiAgfVxuXG4gIGF1ZGlvU3RyZWFtPzogTWVkaWFTdHJlYW07XG5taWNPbiA9IGZhbHNlO1xuXG5hc3luYyB0b2dnbGVNaWMoKSB7XG4gIGlmICghdGhpcy5hdWRpb1N0cmVhbSkge1xuICAgIC8vIGZpcnN0IHRpbWU6IHJlcXVlc3QgbWljXG4gICAgdGhpcy5hdWRpb1N0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gIH1cblxuICB0aGlzLm1pY09uID0gIXRoaXMubWljT247XG5cbiAgdGhpcy5hdWRpb1N0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmZvckVhY2godHJhY2sgPT4ge1xuICAgIHRyYWNrLmVuYWJsZWQgPSB0aGlzLm1pY09uOyAgIC8vIGZhbHNlID0gbXV0ZWQsIHRydWUgPSBzZW5kaW5nIGF1ZGlvXG4gIH0pO1xufVxuICB0b2dnbGVLZXlwYWQoKSB7XG4gICAgdGhpcy5zaG93S2V5cGFkID0gIXRoaXMuc2hvd0tleXBhZDtcbiAgICB0aGlzLmNhbGxJbnB1dCA9ICcnO1xuICB9XG4gIHRvZ2dsZUNvbnRhY3RzUGFuZWwoaXNSZW1vdmU/OiBib29sZWFuKSB7XG4gICAgLy8gaWYgKGlzUmVtb3ZlKSB7XG4gICAgLy8gICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gZmFsc2U7XG4gICAgLy8gICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSAhdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50O1xuICAgIC8vICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICAgIC8vIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSAhdGhpcy5zaG93Q29udGFjdHNQYW5lbDtcbiAgICAgIC8vIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XG4gICAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VTaWQpO1xuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzO1xuICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICAgIC8vIH1cbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFkZFJlbW92ZVBhcnRpY2lwYW50KCkge1xuICAgIC8vIGNvbnN0IGNvbmZlcmVuY2VTSWQgPSB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcbiAgICB0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQgPSAhdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50O1xuICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy50d2lsaW9TZXJ2aWNlLmNvbmZlcmVuY2VDYWxsSW5mby5jb25mZXJlbmNlU2lkKTtcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XG4gIH1cblxuICBhc3luYyBhZGQoZGF0YT86IGFueSkge1xuICAgIC8vIGlmKGRhdGE/LnN0YXR1cyAhPSAncmluZ2luZycpe1xuICAgIHRoaXMuY29uZmVyZW5jZUlkID0gdGhpcy50d2lsaW9TZXJ2aWNlLmNvbmZlcmVuY2VDYWxsSW5mby5jb25mZXJlbmNlSWQ7XG4gICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgdGhpcy5jdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLmlzQ29uZmVyZW5jZSkge1xuICAgICAgICAgICAgLy8gcmVzLmlzSG9sZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcmVzLnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgICAgICAgICBob2xkOiB0cnVlLFxuICAgICAgICAgICAgICBjb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0ucGFydGljaXBhbnRJZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkKTtcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdLmlzSG9sZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0luY29taW5nQ2FsbCA/IFt0aGlzLmN1cnJlbnRDYWxsPy5pZF0gOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICBob2xkOiB0cnVlLFxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZGF0YS5pc0hvbGQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbGV0IGluY29taW5nQ2FsbERhdGEgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0luY29taW5nQ2FsbCAmJiBpdGVtLmlzQWNjZXB0Q2FsbCk7XG4gICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIHRoaXMuY2FsbCA9IGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5jb25uZWN0KCcnKTtcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hZGRJbmNvbWluZ1BhcnRpY2lwYW50KGRhdGE/LmlkLCB0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXMsICdiaGhoaGhoaGhoaGhoaGhoaGhoaCcpXG4gICAgICAgIHRoaXMuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5wdXNoKGRhdGE/LmlkIHx8IGRhdGE/LnBhcnRpY2lwYW50SWQpO1xuICAgICAgICBkYXRhLmlzQWNjZXB0Q2FsbCA9IHRydWU7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldEluY29taW5nQ2FsbFN0YXR1cyhkYXRhKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmNvbm5lY3QoJycpO1xuICAgICAgdGhpcy5pc0N1cnJlbnRJbmNvbWluZ0NhbGxMaXN0LnB1c2goZGF0YT8uaWQpO1xuICAgICAgY29uc29sZS5sb2codGhpcy5jYWxsLCAnY2FsbENvbm5lY3QnKTtcbiAgICAgIGRhdGEuaXNBY2NlcHRDYWxsID0gdHJ1ZTtcbiAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBkYXRhO1xuICAgICAgdGhpcy5zZXRJbmNvbWluZ0NhbGxTdGF0dXMoZGF0YSlcbiAgICB9XG4gICAgLy8gfSBlbHNlIGlmKGRhdGE/LnN0YXR1cyA9PSAncmluZ2luZycpe1xuICAgIC8vICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFkZEluY29taW5nUGFydGljaXBhbnQoZGF0YT8uaWQsIHRoaXMudHdpbGlvU2VydmljZS5jb25mZXJlbmNlQ2FsbEluZm8uY29uZmVyZW5jZUlkKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhkYXRhLCdiaGhoaGhoaGhoaGhoaGhoaGhoaCcpXG4gICAgLy8gICB9KVxuICAgIC8vIH1cblxuICAgIC8vIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSgpOy9cbiAgICAvLyBEZXZpY2UuY29ubmVjdCh7IGNvbmZlcmVuY2VOYW1lOiAnbXktY29uZmVyZW5jZS1yb29tJyB9KTtcbiAgICAvLyB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UoeyBjb25mZXJlbmNlTmFtZTogJ215LWNvbmZlcmVuY2Utcm9vbScgfSk7XG4gIH1cbiAgYXN5bmMgY2FsbENvbnRhY3QoY29udGFjdDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0FkZGluZyBwYXJ0aWNpcGFudDonLCBjb250YWN0KTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jYWxsJywgdGhpcy5jYWxsKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNhbGwnLCB0aGlzLmNhbGwuc3RhdHVzKCkpXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBhY3RpdmUgY2FsbFxuICAgIC8vIGlmICghdGhpcy5jYWxsIHx8IHRoaXMuY2FsbC5zdGF0dXMoKSAhPT0gJ29wZW4nKSB7XG4gICAgLy8gICBjb25zb2xlLmVycm9yKCdObyBhY3RpdmUgY2FsbCcpO1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIC8vIEdldCB0aGUgcGhvbmUgbnVtYmVyIGZyb20gdGhlIGNvbnRhY3RcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGNvbnRhY3Q/Lm51bWJlcnNMaXN0Py5bMF0/Lm51bWJlcjtcbiAgICBjb25zdCBjdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGM6IGFueSkgPT4gYz8ucGhvbmUgPT09IHBob25lTnVtYmVyKTtcbiAgICBpZiAoIXBob25lTnVtYmVyIHx8IGN1cnJlbnRDYWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBwaG9uZSBudW1iZXIgZm91bmQgZm9yIGNvbnRhY3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaXNDb25mZXJlbmNlKSB7XG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWRcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkXSxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2U6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICAgIC8vIC4uLnRoaXMuY2FsbERhdGEsXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxuICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXG4gICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGxEYXRhLCAndGhpcy5jYWxsRGF0YTU2NTYnKVxuICAgICAgICBjb25zb2xlLmxvZygndGVzdDExMTExMTU1NTU1NTU1NTUnKTtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY2FsbERhdGE7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goey4uLnRoaXMuY2FsbERhdGF9KTtcbiAgICAgICAgY29uc29sZS5sb2coXCJQYXJ0aWNpcGFudCBhZGRlZCB0byBjb25mZXJlbmNlOlwiLCBwaG9uZU51bWJlcik7XG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQpIHtcbiAgICAgICAgICAgIC8vIGMuaXNIb2xkID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgICAgaG9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBQdXQgY3VycmVudCBjYWxsIG9uIGhvbGRcbiAgICAgICAgLy8gdGhpcy5oZWxkQ2FsbCA9IHRoaXMuY2FsbDtcbiAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xuICAgICAgICAvLyB0aGlzLmhlbGRDYWxsLm11dGUodHJ1ZSk7XG4gICAgICAgIC8vIHRoaXMuaGVsZENhbGxbJ3BhcmFtZXRlcnMnXVsnY2FsbGVyX25hbWUnXSA9IHsgLi4udGhpcy5jYWxsRGF0YSB9XG4gICAgICAgIC8vIHRoaXMuY2FsbD1udWxsXG4gICAgICAgIC8vIENsb3NlIGNvbnRhY3RzIHBhbmVsIGFuZCBzaG93IHJpbmcgYW5pbWF0aW9uXG4gICAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgIC8vIFVwZGF0ZSBVSSB0byByZWZsZWN0IHRoZSBuZXcgb3V0Ym91bmQgbGVnIGJlaW5nIGRpYWxlZFxuICAgICAgICBjb25zdCBjb250YWN0TmFtZSA9IFtjb250YWN0Py5maXJzdE5hbWUsIGNvbnRhY3Q/Lm1pZGRsZU5hbWUsIGNvbnRhY3Q/Lmxhc3ROYW1lXVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAvLyB0aGlzLmNhbGxbJ2NhbGxJbmZvJ10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FsbERhdGEpKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGNvbmZlcmVuY2UgSUQgZnJvbSB0aGUgY3VycmVudCBjYWxsIG9yIHVzZSB0aGUgc3RvcmVkIG9uZVxuICAgICAgICAvLyBjb25zdCBjb25mZXJlbmNlSWQgPSB0aGlzLmNvbmZlcmVuY2VJZDtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmVyZW5jZUlkKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNvbmZlcmVuY2VJZCBmb3VuZCBmb3IgYWN0aXZlIGNhbGxcIik7XG4gICAgICAgICAgc3dhbChcIkVycm9yXCIsIFwiQ2Fubm90IGFkZCBwYXJ0aWNpcGFudDogY29uZmVyZW5jZSBub3QgZm91bmRcIiwgXCJlcnJvclwiKTtcbiAgICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXG4gICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgLy8gICAuLi50aGlzLmNhbGxEYXRhLFxuICAgICAgICAvLyAgIHBhcnRpY2lwYW50SWQ6ICxcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICAgIC8vIC4uLnRoaXMuY2FsbERhdGEsXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxuICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXG4gICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5jYWxsRGF0YSwgJ3RoaXMuY2FsbERhdGEnKVxuICAgICAgICBjb25zb2xlLmxvZygndGVzdDExMTExMScpO1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jYWxsRGF0YTtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7Li4udGhpcy5jYWxsRGF0YX0pO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlBhcnRpY2lwYW50IGFkZGVkIHRvIGNvbmZlcmVuY2U6XCIsIHBob25lTnVtYmVyKTtcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgcGFydGljaXBhbnQ6JywgZXJyb3IpO1xuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgLy8gUmVzdG9yZSBoZWxkIGNhbGwgb24gZXJyb3JcbiAgICAgIGlmICh0aGlzLmhlbGRDYWxsKSB7XG4gICAgICAgIC8vIHRoaXMuY2FsbCA9IHRoaXMuaGVsZENhbGw7XG4gICAgICAgIC8vIHRoaXMuaGVsZENhbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHRoaXMuaXNDYWxsT25Ib2xkID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuY2FsbC5tdXRlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbFBhcnRpY2lwYW50cyhjb25mZXJlbmNlU2lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VTaWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gcmVzLnBhcnRpY2lwYW50cztcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcbiAgICAgIC8vIGxldCBpbmRleCA9IHRoaXMuY29udGFjdHMuZmluZEluZGV4KChjOmFueSk9PiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyID09IHJlcz8udG8pO1xuICAgICAgLy8gaWYoaW5kZXggPiAtMSl7XG4gICAgICAvLyAgIHRoaXMuY29udGFjdHNbaW5kZXhdLmlzQ2FsbE9uSG9sZCA9IHRydWU7XG4gICAgICAvLyB9XG4gICAgICAvLyBlbHNlIHtcbiAgICAgIC8vICAgcmVzWydJc0Nvbm5lY3RlZCddID0gdHJ1ZTtcbiAgICAgIC8vICAgdGhpcy5jb250YWN0cy5wdXNoKHJlcylcbiAgICAgIC8vIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFjY2VwdENvbmN1cnJlbnRDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XG4gIC8vICAgaWYgKCFpbmNvbWluZ0NhbGwpIHJldHVybjtcblxuICAvLyAgIC8vIFB1dCBjdXJyZW50IGNhbGwgb24gaG9sZCBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3RpbmdcbiAgLy8gICBpZiAodGhpcy5jYWxsKSB7XG4gIC8vICAgICB0aGlzLmhlbGRDYWxsID0gdGhpcy5jYWxsO1xuICAvLyAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xuICAvLyAgICAgLy8gTXV0ZSB0aGUgaGVsZCBjYWxsXG4gIC8vICAgICB0aGlzLmhlbGRDYWxsLm11dGUodHJ1ZSk7XG4gIC8vICAgfVxuXG4gIC8vICAgaW5jb21pbmdDYWxsLmFjY2VwdCgpO1xuICAvLyAgIHRoaXMuY2FsbCA9IGluY29taW5nQ2FsbDtcbiAgLy8gICB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcbiAgLy8gICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xuICAvLyAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gIC8vICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xuICAvLyAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XG4gIC8vICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuXG4gIC8vICAgLy8gUmVzZXQgdGltZXIgZm9yIG5ldyBjYWxsXG4gIC8vICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgLy8gICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgLy8gICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIC8vIH1cblxuXG4gIGFjY2VwdENvbmN1cnJlbnRDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XG4gICAgaWYgKCFpbmNvbWluZ0NhbGwpIHJldHVybjtcblxuXG4gICAgLy8gUHV0IGN1cnJlbnQgY2FsbCBvbiBob2xkIGluc3RlYWQgb2YgZGlzY29ubmVjdGluZ1xuICAgIC8vIGlmICh0aGlzLmNhbGwpIHtcbiAgICAvLyAvLyAgIHRoaXMuaGVsZENhbGwgPSB0aGlzLmNhbGw7XG4gICAgLy8gICB0aGlzLmlzQ2FsbE9uSG9sZCA9IHRydWU7XG4gICAgLy8gLy8gICAvLyBNdXRlIHRoZSBoZWxkIGNhbGxcbiAgICAvLyAvLyAgIHRoaXMuaGVsZENhbGwubXV0ZSh0cnVlKTtcbiAgICAvLyAvLyB9XG5cbiAgICAvLyAvLyBBY2NlcHQgdGhlIG5ldyBjYWxsXG4gICAgLy8gaW5jb21pbmdDYWxsLmFjY2VwdCgpO1xuICAgIC8vIHRoaXMuY2FsbCA9IGluY29taW5nQ2FsbDtcbiAgICAvLyB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcbiAgICAvLyB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xuICAgIC8vIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgLy8gdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xuICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XG4gICAgLy8gdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xuXG4gICAgLy8gLy8g8J+foiBSZW1vdmUgdGhlIGFjY2VwdGVkIGNhbGwgZnJvbSBpbmNvbWluZyBsaXN0XG4gICAgLy8gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCA9ICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0IHx8IFtdKS5maWx0ZXIoXG4gICAgLy8gICAoYzogYW55KSA9PiBjPy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBpbmNvbWluZ0NhbGw/LnBhcmFtZXRlcnM/LkNhbGxTaWRcbiAgICAvLyApO1xuICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsc05ld0luZm8uZW1pdCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcblxuICAgIC8vIC8vIPCflZIgUmVzZXQgdGltZXIgZm9yIG5ldyBjYWxsXG4gICAgLy8gdGhpcy5zdG9wVGltZXIoKTtcbiAgICAvLyB0aGlzLnN0YXJ0VGltZXIoKTtcblxuICAgIC8vIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGFzeW5jIHN3YXBDYWxscyhjYWxsSW5mbzogYW55LGlzQ29uZmVyZW5jZUNhbGw/OiBib29sZWFuKSB7XG4gICAgLy8gaWYgKCF0aGlzLmhlbGRDYWxsIHx8ICF0aGlzLmNhbGwpIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGwsICd0aGlzLmNhbGwnKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmhlbGRDYWxsLCAndGhpcy5oZWxkQ2FsbCcpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENhbGxMaXN0LCAndGhpcy5jdXJyZW50Q2FsbExpc3QnKTtcbiAgICBjb25zb2xlLmxvZyhjYWxsSW5mbywgJ2NhbGxJbmZvIGZvciBzd2FwQ2FsbHMnKTtcbiAgICBpZih0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2Upe1xuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XG4gICAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWM/LmlzSG9sZCkge1xuICAgICAgICAgIC8vIGMuaXNIb2xkID0gdHJ1ZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXG4gICAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsSW5mbz8uaXNIb2xkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IGNhbGxJbmZvPy5wYXJ0aWNpcGFudElkKSB7XG4gICAgICAgICAgLy8gYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmKGlzQ29uZmVyZW5jZUNhbGwpIHtcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYz8uaXNDb25mZXJlbmNlKSB7XG4gICAgICAgICAgLy8gYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYy5pc0hvbGQgPSB0cnVlO1xuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xuICAgICAgaWYgKGM/LnBhcnRpY2lwYW50SWQgJiYgIWM/LmlzSG9sZCkge1xuICAgICAgICAvLyBjLmlzSG9sZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgICAgICAgaG9sZDogdHJ1ZSxcbiAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbGxJbmZvPy5pc0hvbGQgJiYgYz8ucGFydGljaXBhbnRJZCA9PT0gY2FsbEluZm8/LnBhcnRpY2lwYW50SWQpIHtcbiAgICAgICAgLy8gYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICAgICAgICBob2xkOiBmYWxzZSxcbiAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2VcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBjO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gICAgLy8gYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcbiAgICAvLyAgIHBhcnRpY2lwYW50SWQ6IHRoaXMuY2FsbD8uY2FsbEluZm8/LnBhcnRpY2lwYW50SWQsXG4gICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgIC8vICAgaG9sZDogdHJ1ZVxuICAgIC8vIH0pO1xuICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgLy8gICBwYXJ0aWNpcGFudElkOiB0aGlzLmhlbGRDYWxsPy5jYWxsSW5mbz8ucGFydGljaXBhbnRJZCxcbiAgICAvLyAgIGNvbmZlcmVuY2VJZDogdGhpcy5jb25mZXJlbmNlSWQsXG4gICAgLy8gICBob2xkOiBmYWxzZVxuICAgIC8vIH0pO1xuICAgIGNvbnNvbGUubG9nKCdTd2FwcGluZyBjYWxscy4uLicpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgc3dhcCAtIEFjdGl2ZSBjYWxsOicsIHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgc3dhcCAtIEhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XG5cbiAgICAvLyBTd2FwIHRoZSBjYWxsc1xuICAgIC8vIGNvbnN0IHRlbXAgPSB0aGlzLmNhbGw7XG4gICAgLy8gdGhpcy5jYWxsID0gdGhpcy5oZWxkQ2FsbDtcbiAgICAvLyB0aGlzLmhlbGRDYWxsID0gdGVtcDtcblxuXG4gICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xuICAgIC8vIHRoaXMuaGVsZENhbGwubXV0ZSh0cnVlKTtcblxuICAgIC8vIFVwZGF0ZSBVSSB3aXRoIGFjdGl2ZSBjYWxsIGluZm8gLSBleHRyYWN0IGZyb20gY2FsbCBwYXJhbWV0ZXJzXG4gICAgLy8gY29uc3QgZnJvbU51bWJlciA9IHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgLy8gY29uc3QgY2FsbGVyTmFtZSA9IHRoaXMuY2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ25hbWUnKSB8fCAnLSc7XG4gICAgLy8gY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgLy8gY29uc3QgZGlzcGxheU51bWJlciA9IHRoaXMuY2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ2Rpc3BsYXlOdW1iZXInKSB8fCAnLSc7XG5cbiAgICAvLyBVcGRhdGUgY2FsbERhdGEgdG8gcmVmcmVzaCB0aGUgbWFpbiBVSVxuICAgIC8vIHRoaXMuY2FsbERhdGEgPSB7XG4gICAgLy8gICAuLi50aGlzLmNhbGxEYXRhLFxuICAgIC8vICAgcGhvbmU6IGZyb21OdW1iZXIsXG4gICAgLy8gICBkaXNwbGF5TnVtOiAoZGlzcGxheU51bWJlciAmJiBkaXNwbGF5TnVtYmVyICE9PSAnLScpID8gZGlzcGxheU51bWJlciA6IGZyb21OdW1iZXIsXG4gICAgLy8gICBuYW1lOiAoY2FsbGVyTmFtZSAmJiBjYWxsZXJOYW1lICE9PSAnLScpID8gY2FsbGVyTmFtZSA6ICh0aGlzLmNhbGxEYXRhPy5uYW1lIHx8IGZyb21OdW1iZXIpLFxuICAgIC8vICAgaW1nOiBjYWxsZXJJbWcgfHwgdGhpcy5jYWxsRGF0YT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1xuICAgIC8vIH07XG5cbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXIgc3dhcCAtIEFjdGl2ZSBjYWxsOicsIHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdBZnRlciBzd2FwIC0gSGVsZCBjYWxsOicsIHRoaXMuaGVsZENhbGwucGFyYW1ldGVyc1snRnJvbSddKTtcbiAgICAvLyBjb25zb2xlLmxvZygnVXBkYXRlZCBjYWxsRGF0YTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jdXJyZW50Q2FsbExpc3QgYWZ0ZXIgc3dhcCcsIHRoaXMuY3VycmVudENhbGxMaXN0KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBhc3luYyBtZXJnZUNhbGxzKCkge1xuICAgIC8vIE1lcmdlIGZ1bmN0aW9uYWxpdHkgLSB1bm11dGUgYm90aCBjYWxscyBmb3IgY29uZmVyZW5jZVxuICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGM/LnBhcnRpY2lwYW50SWQpIHtcbiAgICAgICAgICAvLyBjLmlzSG9sZCA9IGZhbHNlO1xuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXG4gICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgICAgICAgaG9sZDogZmFsc2UsXG4gICAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xuICAgICAgICAgIC8vIH0gZWxzZSBpZihjPy5wYXJ0aWNpcGFudElkICYmIGMuaXNJbmNvbWluZ0NhbGwpe1xuICAgICAgICAgIC8vICAgYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmFkZEluY29taW5nUGFydGljaXBhbnQoYz8ucGFydGljaXBhbnRJZCwgdGhpcy5jb25mZXJlbmNlSWQpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gICAgICAgY29uc29sZS5sb2coZGF0YSwnYmhoaGhoaGhoaGhoaGhoaGhoaGgnKVxuICAgICAgICAgIC8vICAgICB9KVxuICAgICAgICAgIC8vICAgYy5pc0hvbGQgPSBmYWxzZTtcbiAgICAgICAgICAvLyAgIGMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XG4gICAgICAvLyAgIHBhcnRpY2lwYW50SWQ6IHRoaXMuaGVsZENhbGw/LmNhbGxJbmZvPy5wYXJ0aWNpcGFudElkLFxuICAgICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxuICAgICAgLy8gICBob2xkOiBmYWxzZVxuICAgICAgLy8gfSk7XG4gICAgICAvLyB0aGlzLmhlbGRDYWxsLm11dGUoZmFsc2UpO1xuICAgICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xuICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBlbmRIZWxkQ2FsbCgpIHtcbiAgICAvLyBpZiAodGhpcy5oZWxkQ2FsbCkge1xuICAgIC8vICAgdGhpcy5oZWxkQ2FsbC5kaXNjb25uZWN0KCk7XG4gICAgLy8gICB0aGlzLmhlbGRDYWxsID0gdW5kZWZpbmVkO1xuICAgIC8vICAgdGhpcy5pc0NhbGxPbkhvbGQgPSBmYWxzZTtcbiAgICAvLyAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAvLyB9XG4gIH1cblxuXG4gIGhhc0RldGFpbGVkSW5mbyhjYWxsRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXG4gICAgaWYgKGNhbGxEYXRhLnVzZXJJbmZvICYmIGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uKSB7XG4gICAgICBjb25zdCBpbmZvID0gY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb247XG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxuICAgICAgICBpbmZvLmVtYWlsICYmIGluZm8uZW1haWwgIT09ICctJyB8fFxuICAgICAgICBpbmZvLm1lc3NhZ2UgJiYgaW5mby5tZXNzYWdlICE9PSAnLScgfHxcbiAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxuICAgICAgICBpbmZvLnNvdXJjZU5hbWUgJiYgaW5mby5zb3VyY2VOYW1lICE9PSAnLScgfHxcbiAgICAgICAgaW5mby5leHRlbnNpb24gJiYgaW5mby5leHRlbnNpb24gIT09ICctJyB8fFxuICAgICAgICBpbmZvLnVybCB8fFxuICAgICAgICBpbmZvLmxhdGl0dWRlIHx8XG4gICAgICAgIGluZm8ubG9uZ2l0dWRlXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9uQ2xpY2tFeHBhbmQoZGF0YT86IGFueSk6IHZvaWQge1xuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID09PSBkYXRhICYmIHRoaXMuaXNDbGlja0V4cGFuZCkge1xuICAvLyAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XG4gIC8vICAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gbnVsbDtcbiAgLy8gICAgIC8vIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvLmVtaXQoe30pO1xuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBkYXRhO1xuXG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpIHtcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGxbJ2lzQ2xpY2tFeHBhbmQnXSA9IHRydWU7XG5cbiAgLy8gICAgIGlmICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0ICYmIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID4gMCkge1xuICAvLyAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goKGNhbGw6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIGlmIChjYWxsICE9PSB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsKSB7XG4gIC8vICAgICAgICAgICBjYWxsWydpc0NsaWNrRXhwYW5kJ10gPSBmYWxzZTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH0pO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsSW5mby5lbWl0KHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpO1xuXG4gIC8vICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8gfHwgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbC51c2VySW5mby5zdGF0dXMgPT0gMjAxKSB7XG4gIC8vICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIGdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhOiBhbnkpIHtcbiAgLy8gICBsZXQgZGF0YSA9IHRoaXMuZnJvbUVudHJpZXMoQXJyYXkuZnJvbShpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZW50cmllcygpKSk7XG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihkYXRhWyd0d2lsaW9BdXRoSWQnXSkuc3Vic2NyaWJlKFxuICAvLyAgIHJlc3BvbnNlID0+IHtcbiAgLy8gICAgIHNldFRpbWVvdXQoKCk9PntcbiAgLy8gICAgICAgaW5jb21pbmdDYWxsRGF0YVsndXNlckluZm8nXT1yZXNwb25zZVxuICAvLyAgICAgfSwgNTAwMClcbiAgLy8gICB9LCBlcnJvciA9PiB7XG4gIC8vICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICByZWplY3RDb25jdXJyZW50Q2FsbChpbmNvbWluZ0NhbGw6IGFueSkge1xuXG4gICAgaWYgKCFpbmNvbWluZ0NhbGwpIHJldHVybjtcbiAgICBpZiAoaW5jb21pbmdDYWxsLnJlamVjdCkge1xuICAgICAgaW5jb21pbmdDYWxsLnJlamVjdCgpO1xuICAgIH1cbiAgICBpZiAoaW5jb21pbmdDYWxsLmRpc2Nvbm5lY3QpIGluY29taW5nQ2FsbC5kaXNjb25uZWN0KCk7XG4gICAgLy8gUmVtb3ZlIGZyb20gbGlzdFxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCB8fCBbXSkuZmlsdGVyKChjOiBhbnkpID0+IGM/LnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IGluY29taW5nQ2FsbD8ucGFyYW1ldGVycz8uQ2FsbFNpZCk7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mby5lbWl0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QpO1xuICAgIC8vIElmIG5vIG1vcmUgaW5jb21pbmcsIGhpZGUgYmFubmVyXG4gICAgaWYgKCF0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0IHx8IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgb25DYWxsSW5wdXRzKG51bTogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcbiAgICAgICAgaWYgKG51bSA9PSAnIycpIHtcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtaGFzaC0ubXAzYCkucGxheSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtc3Rhci0ubXAzYCkucGxheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQgKyBTdHJpbmcobnVtKTtcbiAgICAgICAgdGhpcy5zaG93Q2xlYXJCdG4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgbGV0IHN0ciA9IFN0cmluZyhudW0pO1xuICAgICAgdGhpcy5jYWxsPy5zZW5kRGlnaXRzKHN0cik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuICB9XG4gIG9uQ2FsbElucHV0RW50ZXIoZXY6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoU3RyaW5nKGV2LmtleSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxuICBjbG9zZUluY29taW5nQ2FsbChkYXRhOiBhbnkpIHtcbiAgICAvLyB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuICAgIGlmIChkYXRhLnNob3cpIHtcbiAgICAgIC8vdGhpcy5zaG93Q2FsbFByb2dyZXNzRXZlbnQuZW1pdCgpXG4gICAgICAvLyBoYW5kbGUgaW5jb21pbmcgY2FsbCBhY2NlcHRlZFxuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XG4gICAgICAvLyB0aGlzLmNhbGwgPSBkYXRhLmNhbGw7XG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBpbmNvbWluZ0RldGFpbCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XG4gICAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGluY29taW5nRGV0YWlsLnJlY29yZENhbGw7XG5cbiAgICAgIGlmICh0aGlzLmluY29taW5nUmVjb3JkQ2FsbCkge1xuICAgICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluY29taW5nIGNhbGwgcmVqZWN0ZWQgb3IgYXV0by1jYW5jZWxsZWRcbiAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBOTyBhY3RpdmUgY2FsbCwgdGhlbiBwcm9wYWdhdGUgZW5kLiBPdGhlcndpc2Uga2VlcCBvbmdvaW5nIFVJLlxuICAgICAgaWYgKCF0aGlzLmNhbGwgfHwgdGhpcy5jYWxsLnN0YXR1cygpICE9PSAnb3BlbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3Q3JylcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjbGVhcklucHV0cygpIHtcbiAgICB0aGlzLmNhbGxJbnB1dCA9IHRoaXMuY2FsbElucHV0LnNsaWNlKDAsIC0xKTtcbiAgfVxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBtaW5pbWlzZURpYWxwYWQoKSB7XG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5pc01pbmltaXNlZCA9IHRydWU7XG4gIH1cbiAgbWF4aW1pc2VEaWFscGFkKCkge1xuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gZmFsc2U7XG4gIH1cbiAgdG9nZ2xlUmVjb3JkaW5nKCkge1xuICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xuICAgIH1cbiAgfVxuICBzdGFydFJlY29yZGluZygpIHtcbiAgICBsZXQgc2lkO1xuICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xuICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xuICAgIHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLmNhbGxTaWQgfHwgdGhpcy5hZGRSZXM/LmNvbmZlcmVuY2VTaWQ7XG5cbiAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICBcImNvbmZlcmVuY2VJZFwiOiB0aGlzLmNvbmZlcmVuY2VJZCxcbiAgICB9XG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcocGF5bG9hZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy50aW1lRWxhcHNlZCA9IDA7XG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIHN0b3BSZWNvcmRpbmcoKSB7XG4gICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbiAgcGF1c2VSZWNvcmRpbmcoKSB7XG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jb25mZXJlbmNlSWQsICdwYXVzZScpLnN1YnNjcmliZShcbiAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nVGltZXIoKTtcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhdXNpbmcgcmVjb3JkaW5nOicsIGVycm9yKTtcbiAgICAgICAgLy8gQ29uc2lkZXIgdXBkYXRpbmcgdGhlIFVJIHRvIHNob3cgdGhlIGVycm9yIHN0YXRlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICByZXN1bWVSZWNvcmRpbmcoKSB7XG4gICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgLy8gICByZXR1cm47IC8vIFNraXAgaWYgcmVjb3JkaW5nIGlzIG5vdCBlbmFibGVkXG4gICAgLy8gfVxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHRoaXMuY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcjEoKTtcbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZXN1bWluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gICAgfSk7XG4gIH1cbiAgZ2V0VGltZURpZmZlcmVuY2UoaW5wdXRUaW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhc3RUaW1lID0gbmV3IERhdGUoaW5wdXRUaW1lKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgIGxldCBkaWZmID0gTWF0aC5mbG9vcigoY3VycmVudFRpbWUgLSBwYXN0VGltZSkgLyAxMDAwKTsgLy8gdG90YWwgc2Vjb25kc1xuXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZGlmZiAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gZGlmZiAlIDYwO1xuXG4gICAgY29uc3QgbW0gPSBtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzIDogbWludXRlcztcbiAgICBjb25zdCBzcyA9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xuXG4gICAgcmV0dXJuIGAke21tfToke3NzfWA7XG4gIH1cbiAgc3RhcnRUaW1lcjEoKSB7XG4gICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IGludGVydmFsKDEwMDApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRpbWVFbGFwc2VkKys7XG4gICAgfSk7XG4gIH1cbiAgc3RvcFJlY29yZGluZ1RpbWVyKCkge1xuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IC8vIFBhdXNlIHRoZSB0aW1lclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgICAgICAgIC8vIE9wdGlvbmFsbHkgcmVzZXQgdGhlIHN1YnNjcmlwdGlvblxuICAgIH1cbiAgfVxuICBnZXRGb3JtYXR0ZWRUaW1lKCkge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMudGltZUVsYXBzZWQgLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMudGltZUVsYXBzZWQgJSA2MDtcbiAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJ30ke3NlY29uZHN9YDtcbiAgfVxuICBwb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXhUaW1lID0gMzAwMDA7IC8vIFBvbGwgZm9yIHVwIHRvIDMwIHNlY29uZHNcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAzMDAwOyAvLyBQb2xsIGV2ZXJ5IDMgc2Vjb25kc1xuICAgIGxldCBlbGFwc2VkVGltZSA9IDA7XG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgIGVsYXBzZWRUaW1lICs9IHBvbGxJbnRlcnZhbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXMoY2FsbEF1dGhJZCkudG9Qcm9taXNlKCkgYXMgQ2FsbFN0YXR1c1Jlc3BvbnNlO1xuICAgICAgICBpZiAoc3RhdHVzUmVzcG9uc2UgJiYgc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMpIHtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0dXMgPSBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscy5jYWxsU3RhdHVzO1xuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbFNpZCA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRDYWxsICYmICF0aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QxJylcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xuICAgICAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdyaW5naW5nJykge1xuICAgICAgICAgICAgLy8gQ29udGludWUgcG9sbGluZzsgZG8gbm90IGNsZWFyIHRoZSBpbnRlcnZhbCB5ZXRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICB9XG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPj0gbWF4VGltZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnTWF4IHBvbGxpbmcgdGltZSByZWFjaGVkLiBTdG9wcGluZyBwb2xsLicpO1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgfVxuICAgIH0sIHBvbGxJbnRlcnZhbCk7XG4gIH1cblxuICBnZXRVc2VySW5mb3JtYXRpb24oaWQ6IGFueSkge1xuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oaWQpLnN1YnNjcmliZShcbiAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XG4gICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHJlc3BvbnNlLmMyY0luZm9ybWF0aW9uO1xuICAgICAgICAvLyBpZih0aGlzLmlzQ2xpY2tFeHBhbmQpe1xuICAgICAgICAvLyAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XG4gICAgICAgIC8vIH1cbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgICAgfSk7XG4gIH1cbiAgaW5jb21pbmdDYWxsc05ld0xpc3QoZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coZGF0YSwgJ25ld0luY29taW5nQ2FsbHNMaXN0T1VSJylcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0ID0gZGF0YTtcbiAgICB0aGlzLmluY29taW5nQ2FsbHNOZXdJbmZvLmVtaXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCk7XG4gIH1cbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvKGRhdGE6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBkYXRhO1xuICB9XG5cbiAgZ2V0SG9sZENhbGxMaXN0KCl7XG4gICAgbGV0IGhvbGRMaXN0OiBhbnlbXSA9IFtdO1xuICAgIGxldCBpc0NvbmZlcmVuY2UgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgIGlmKGM/LmlzSG9sZCAmJiAhYz8uaXNDb25mZXJlbmNlKXtcbiAgICAgICAgaG9sZExpc3QucHVzaChjKTtcbiAgICAgIH1cbiAgICAgIGlmKGM/LmlzQ29uZmVyZW5jZSAmJiAhaXNDb25mZXJlbmNlKXtcbiAgICAgICAgaXNDb25mZXJlbmNlID0gdHJ1ZTtcbiAgICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XG4gICAgICAgIGhvbGRMaXN0LnB1c2goYyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhvbGRMaXN0O1xuICB9XG5cbiAgb25DbGlja0V4cGFuZChkYXRhOiBhbnkpe1xuICAgIGlmKGRhdGEuaWQgIT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKXtcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xuICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gIXRoaXMuaXNDbGlja0V4cGFuZDtcbiAgICAgIGlmKHRoaXMuaXNDbGlja0V4cGFuZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xuICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEluY29taW5nQ2FsbFN0YXR1cyhkYXRhOiBhbnkpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHJlY29yZElkOiBkYXRhPy5pZCxcbiAgICAgIGlwQWRkcmVzczogJycsXG4gICAgICBpcENvdW50cnk6ICcnLFxuICAgICAgY2FsbFN0YXR1czogJ2Fuc3dlcmVkJyxcbiAgICAgIFxuICAgIH1cbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0SW5jb21pbmdDYWxsU3RhdHVzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICB9KVxuICB9XG5cbiAgdG9nZ2xlU2VhcmNoKCkge1xuICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcblxuICAvLyBpZiBjbG9zaW5nIHNlYXJjaCDigJQgcmVzZXQgcmVzdWx0c1xuICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gIHRoaXMuY29udGFjdHM7XG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICB9XG59XG5cbmFwcGx5RmlsdGVyKCkge1xuICBjb25zdCB0ZXh0ID0gdGhpcy5zZWFyY2hUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xuICAgIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcik7XG4gICAgICBpZihpbmRleCA+IC0xKXtcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cy5maWx0ZXIoKGM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChjPy5maXJzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lmxhc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IFxuICAgICAgKGM/Lm1pZGRsZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/LmZ1bGxOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IFxuICAgICAgKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XG4gICAgfSk7XG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0LmZpbHRlcigoYzogYW55KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IChjPy50b05hbWUgfHwgJycpIDogKGM/LmZyb21OYW1lIHx8ICcnKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IG51bWJlciA9IChjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyAoIGM/LnRvIHx8ICcnKSA6IChjPy5mcm9tIHx8ICcnKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBuYW1lLmluY2x1ZGVzKHRleHQpIHx8IG51bWJlci5pbmNsdWRlcyh0ZXh0KTtcbiAgICB9KTtcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoY2M6IGFueSkgPT4gY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgY2M/LnBob25lID09IGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIpO1xuICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbmNoZWNrVGV4dEhlaWdodCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgaWYgKGVsPy5zY3JvbGxIZWlnaHQgPiBlbD8uY2xpZW50SGVpZ2h0KSB7XG4gICAgdGhpcy5zaG93QnV0dG9uID0gdHJ1ZTtcbiAgfVxufVxudG9nZ2xlVGV4dCgpIHtcbiAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcbn1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jYWxsRGF0YS5kaWFsID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCIhaXNNaW5pbWlzZWQgJiYgY3VycmVudENhbGxMaXN0Py5sZW5ndGhcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J2NvbGxvcHMnOiBpc0NvbGxvcHMsICdpbmNvbWluZy1jYWxsLWNvbnRhaW5lcic6IGlzQ2xpY2tFeHBhbmQsICdjb250YWN0cy1vcGVuJzogc2hvd0NvbnRhY3RzUGFuZWwgfVwiPlxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5jb21pbmdDYWxsRGl2IHx8IGlzQ29uY3VycmVudEluY29taW5nIHx8IHRydWVcIj4gLS0+XG4gICAgICAgICAgICA8IS0tIEFsbCB0eXBlIENhbGwgSG9sZCBsaXN0ICAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmICEhY3VycmVudENhbGwgJiYgKChpc0NvbmZlcmVuY2VDYWxsSG9sZCB8fCBpc0NvbmZlcmVuY2UpIHx8ICFpc0NvbmZlcmVuY2UpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJpc0NvbmZlcmVuY2VDYWxsSG9sZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaG9sZC1pY29uXCI+cGF1c2VfY2lyY2xlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SG9sZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPkNvbmZlcmVuY2UgQ2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogaXNDb25mZXJlbmNlQ2FsbEhvbGQgfVwiIChjbGljayk9XCJzd2FwQ2FsbHMoe30sdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cInt7J0hvbGQnfX1cIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJlbmRDYWxsKHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVsZENhbGwgb2YgY3VycmVudENhbGxMaXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtY29udGVudFwiICpuZ0lmPVwiaGVsZENhbGw/LmlzSG9sZCAmJiAhaGVsZENhbGw/LmlzQ29uZmVyZW5jZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBob2xkLWljb25cIj5wYXVzZV9jaXJjbGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPkhvbGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1uYW1lXCI+e3toZWxkQ2FsbD8ubmFtZSB8fCAnVW5rbm93biBudW1iZXInfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1udW1iZXJcIj57e2hlbGRDYWxsPy5waG9uZSB8fCAnJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0XCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGhlbGRDYWxsPy5pc0hvbGQgfVwiIChjbGljayk9XCJzd2FwQ2FsbHMoaGVsZENhbGwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwie3toZWxkQ2FsbD8uaXNIb2xkPyAnUmVzdW1lJzonSG9sZCd9fVwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGhlbGRDYWxsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAqbmdJZj1cImhlbGRDYWxsPy5pc0luY29taW5nQ2FsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGhlbGRDYWxsKVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiAhaGVsZENhbGw/LmJ1c2luZXNzTnVtYmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImhlbGQtYnRuIHN3YXAtYnRuXCIgKGNsaWNrKT1cInN3YXBDYWxscyhoZWxkQ2FsbClcIiB0aXRsZT1cIlN3YXAgY2FsbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHN3YXAtaWNvblwiPnN3YXBfdmVydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtY29udGVudFwiICpuZ0lmPVwiaGVsZENhbGw/LmlzSW5jb21pbmdDYWxsICYmICFoZWxkQ2FsbD8uaXNBY2NlcHRDYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhvbGQtaWNvblwiPnBob25lX2NhbGxiYWNrPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbGFiZWxcIj5JbmNvbWluZyBDYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7aGVsZENhbGw/Lm5hbWUgfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbnVtYmVyXCI+e3toZWxkQ2FsbD8ucGhvbmUgfHwgJyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYW5uZXItYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhaGVsZENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkKGhlbGRDYWxsKVwiPiBjYWxsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4td3JhcHBlciBiYW5uZXItYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChoZWxkQ2FsbClcIj4gY2FsbF9lbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGhlbGRDYWxsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQ29tcGFjdCBiYW5uZXJzIGZvciBjb25jdXJyZW50IGluY29taW5nIChvbmUgcGVyIGNhbGwpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmICFjdXJyZW50Q2FsbD8uaWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYmFubmVycy1jb250YWluZXJcIiAqbmdJZj1cIiFpc0NvbmZlcmVuY2UgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW5jIG9mIGN1cnJlbnRDYWxsTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1iYW5uZXJcIiAqbmdJZj1cImluYz8uaXNJbmNvbWluZ0NhbGwgJiYgIWluYz8uaXNBY2NlcHRDYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB0b3A6ICgoaXNDYWxsT25Ib2xkICYmIGhlbGRDYWxsKSA/IDY0IDogMCkgKyAoaSAqIDcwKSArICdweCcgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYmFubmVyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmNvbSBpbmctbGFiZWxcIj5JbmNvbWluZyBjYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1jYWxsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxsZXItbmFtZVwiPnt7IGluYz8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmM/LmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxsZXItbnVtYmVyXCI+e3sgaW5jPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm51bWJlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jPy5wYXJhbWV0ZXJzPy5Gcm9tIHx8ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYW5uZXItYnRuIGFjY2VwdC1idG5cIiAoY2xpY2spPVwiYWRkKGluYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+Y2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYmFubmVyLWJ0biByZWplY3QtYnRuXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChpbmMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNhbGxfZW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGluYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTEwMCBweS01XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50Q2FsbExpc3QubGVuZ3RoID09PSAxICYmIGN1cnJlbnRDYWxsTGlzdFswXT8uaXNJbmNvbWluZ0NhbGwgJiYgIWN1cnJlbnRDYWxsTGlzdFswXT8uaXNBY2NlcHRDYWxsIFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsVG9OdW1cIj5JbmNvbWluZyBjYWxsIG9uIDxiciAvPjxzcGFuPnt7Y3VycmVudENhbGxMaXN0WzBdPy50byB8fCAnVW5rbm93blxuICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiY3VycmVudENhbGxMaXN0WzBdPy5pbWdcIiBhbHQ9XCJcIiB3aWR0aD1cIjEyMFwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgxPnt7IGN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZSA/IGN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZSA6IGN1cnJlbnRDYWxsTGlzdFswXT8ucGhvbmUgfHwgJ1Vua25vd24gTnVtYmVyJyB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY3VycmVudENhbGxMaXN0WzBdPy5uYW1lXCI+e3sgY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zIG10LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LmlzQ2FsbENvbm5lY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cImFkZChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJvbkVuZENhbGwoY3VycmVudENhbGxMaXN0WzBdKVwiPiBjYWxsX2VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEZvciBtdWx0aXBsZSBpbmNvbWluZyBjYWxscyBidXQgbm90IGFueSBjYWxsIHByb2dyZXNzIC0tPlxuXG5cbiAgICAgICAgICAgIDwhLS0gRm9yIHNpbmdsZSBhY3RpdmUgY2FsbCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoIWlzQ29uZmVyZW5jZSB8fCBpc0NvbmZlcmVuY2VDYWxsSG9sZCkgJiYgISFjdXJyZW50Q2FsbD8uaWRcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6ICdmbGV4JywgJ2ZsZXgtZGlyZWN0aW9uJzogJ2NvbHVtbicsICdwb3NpdGlvbic6ICdyZWxhdGl2ZSd9XCIgY2xhc3M9XCJhY3RpdmUtY2FsbFwiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJjdXJyZW50Q2FsbD8uaW1nXCIgYWx0PVwiXCIgd2lkdGg9XCIxMjBcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMSBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnOHB4J31cIj57e2N1cnJlbnRDYWxsPy5uYW1lIHx8ICdVbmtub3duIG51bWJlcid9fVxuICAgICAgICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICAgICAgICA8cD57e2N1cnJlbnRDYWxsPy5waG9uZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luLXRvcDogNHB4XCI+e3tjdXJyZW50Q2FsbD8udGltZSB8fCB0aW1lcn19PC9oND5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYWN0aW9uLWJ0bnNcIiAqbmdJZj1cIiFzaG93S2V5cGFkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dLZXlwYWRcIiBjbGFzcz1cInNlbmREaWdpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzcyM3gnfVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwiIWluY29taW5nQ2FsbERpdiB8fCBpc0NvbmN1cnJlbnRJbmNvbWluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhlbGQtYnRuIG1lcmdlLWJ0blwiIChjbGljayk9XCJtZXJnZUNhbGxzKClcIiB0aXRsZT1cIk1lcmdlIGNhbGxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA8IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NZXJnZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cInRvZ2dsZUtleXBhZCgpXCI+IHRyYW5zaXRpb25fZGlzc29sdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gZW5kLWNhbGwtYnRuXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY29udGFjdHMtcGFuZWxcIiAqbmdJZj1cInNob3dDb250YWN0c1BhbmVsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgYmFja1wiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKClcIj4gY2hldnJvbl9sZWZ0IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+Q29udGFjdHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNlYXJjaFwiPiBzZWFyY2ggPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBjb250YWN0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj57e2MuZmlyc3ROYW1lfX0ge3tjLm1pZGRsZU5hbWV9fSB7e2MubGFzdE5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgKGMubnVtYmVyc0xpc3QgJiYgYy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cImNhbGxDb250YWN0KGMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5DYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yIHB4LTMgY2FsbC1pbmZvLXdyYXBwZXIgXCIgIFtuZ0NsYXNzXT1cInsnb3Blbi1jb2xsb3BzJzogaXNDb2xsb3BzfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCIgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG93blwiICpuZ0lmPVwiaXNDb2xsb3BzXCIgKGNsaWNrKT1cImlzQ29sbG9wcyA9ICFpc0NvbGxvcHNcIj48L2k+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS11cFwiICpuZ0lmPVwiIWlzQ29sbG9wc1wiIChjbGljayk9XCJpc0NvbGxvcHMgPSAhaXNDb2xsb3BzXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsb3BzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiA+Rmlyc3QgTmFtZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgPnRlc3QgdHR0dHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5MYXN0IE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PnRldHN0IHRlc3QgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5FbWFpbDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPmFiY2RlZnRAdmdyb3VwLmNvbTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5OdW1iZXI6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+NjM1NDU5ODUyNjQyMjU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkxhbmd1YWdlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkVuZ2xpc2g8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkltYWdlIDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj50ZXN0LmpwZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkV4dGVuc2lvbiA6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+NDU5NjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPk5vdGUgOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+dGVzIHRlc3QgdGVzdCA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlN1YmplY3Q6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+aGVsbG8gd29ybGQgfCB0ZXN0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+TWVzc2FnZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj50ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDwhLS0gY29uZmVyZW5jZSBjYWxsIHZpZXcgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmVyZW5jZS1jYWxsLXZpZXdcIiAqbmdJZj1cImlzQ29uZmVyZW5jZSAmJiAhaXNDb25mZXJlbmNlQ2FsbEhvbGRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi1pY29uIG1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLXRpdGxlXCI+Q29uZmVyZW5jZSBDYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbCBvZiBjdXJyZW50Q2FsbExpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbD8uaXNDb25mZXJlbmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSAhPSAwXCI+Jjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYWxsPy5uYW1lID8gY2FsbD8ubmFtZSA6IGNhbGw/LnBob25lIHx8ICdVbmtub3duIG51bWJlcid9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLXRpbWVyXCI+e3sgdGltZXIgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb25mLXJlY29yZFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtc3RvcC1idG5cIiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCIgdGl0bGU9XCJTdG9wIFJlY29yZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gc3RvcF9jaXJjbGUgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRucyBtdC1hdXRvXCIgKm5nSWY9XCIhc2hvd0tleXBhZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICcyMHB4J31cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInRpbWVyLWRpc3BsYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93S2V5cGFkXCIgY2xhc3M9XCJzZW5kRGlnaXQgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbmYtcmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZW1vdmUtYnRuXCIgKGNsaWNrKT1cImFkZFJlbW92ZVBhcnRpY2lwYW50KClcIj5SZW1vdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc011dGV9XCIgKGNsaWNrKT1cInRvZ2dsZU11dGUodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiB7eyBpc011dGUgPyAnbWljX29mZicgOiAnbWljJyB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHRyYW5zaXRpb25fZGlzc29sdmUgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0biBkYW5nZXJcIiAoY2xpY2spPVwiZW5kQ2FsbCh0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiMFwiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjNcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjUpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHVzZVxuICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxuICAgICAgICAgICAgICAgIHg9XCI0OFwiXG4gICAgICAgICAgICAgICAgeT1cIjVcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuMylcIlxuICAgICAgICAgICAgICAvPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFkZCByZW1vdmUgcGFydGljaXBhbnQgcGFuZWwgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLXBhbmVsXCIgKm5nSWY9XCJpc0FkZFJlbW92ZVBhcnRpY2lwYW50ICYmIGZhbHNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBiYWNrXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwodHJ1ZSlcIj4gY2hldnJvbl9sZWZ0IDwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRhY3RzPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc2VhcmNoXCI+IHNlYXJjaCA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtbGlzdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiIFtzcmNdPVwiYz8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmhvbGQgfVwiIChjbGljayk9XCJvbkhvbGRDYWxsKGMpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiSG9sZFwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Ib2xkPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImxhYmVsXCI+RW5kPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEluY29taW5nIGNhbGwgdXNlciBkZXRhaWxzIHNob3duIGluIG1vZGVsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lci1tb2RlbCBwLTMgdGV4dC13aGl0ZSBtb2RlbC1jb250ZW50IGNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCJpc0NsaWNrRXhwYW5kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIHVzZXItaW5mby1zZWN0aW9uXCIgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTNcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlXCI+QzJDIC1QT0lOVCB7e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIxMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTFcIj5OYW1lOjwvaDU+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwidGV4dC13aGl0ZSB1c2VyTmFtZVwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubmFtZX19PC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TnVtYmVyOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubnVtYmVyfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPkV4dGVuc2lvbjo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5leHRlbnNpb259fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+RW1haWw6IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3NlbGVjdGVkVXNlckluZm8/LmVtYWlsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlN1YmplY3Q6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMiBzdWJqZWN0LXRleHRcIiB0aXRsZT1cInt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19XCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMiBtYi0xXCI+SW1hZ2U6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAmJiBzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAhPT0gJy0nOyBlbHNlIG5vSW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7c2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2V9fVwiIGFsdD1cIlwiIHdpZHRoPVwiMTUwXCIgIGNsYXNzPVwibWwtMlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+Tm8gSW1hZ2UgQXZhaWxhYmxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5NZXNzYWdlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb250YWluZXJcIiBbY2xhc3MuZXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubWVzc2FnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidG9nZ2xlLWJ0blwiICpuZ0lmPVwic2hvd0J1dHRvblwiIChjbGljayk9XCJ0b2dnbGVUZXh0KClcIj57eyBpc0V4cGFuZGVkID8gJ1NlZSBsZXNzJyA6ICdTZWUgbW9yZScgfX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPlBvaW50IE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5wb2ludE5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+U291cmNlIE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5zb3VyY2VOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnMgbXQtMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhc2VsZWN0ZWRJbmNvbWluZ0NhbGw/LmlzQ2FsbENvbm5lY3RlZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJhY2NlcHRDYWxsRnJvbUxpc3Qoc2VsZWN0ZWRJbmNvbWluZ0NhbGwpXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gbXV0ZS1idG5cIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWRcIiAgKGNsaWNrKT1cInRvZ2dsZU11dGUoc2VsZWN0ZWRJbmNvbWluZ0NhbGwpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtbXV0ZSc6IGlzTXV0ZX1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwic2VsZWN0ZWRJbmNvbWluZ0NhbGw/LmlzQ2FsbENvbm5lY3RlZCAmJiAhaXNSZWNvcmRpbmdcIiBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKCcnKVwiIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCIgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwicmVqZWN0Q2FsbEZyb21MaXN0KHNlbGVjdGVkSW5jb21pbmdDYWxsKVwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gY29udGFjdCBsaXN0IHBhbmVsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1wYW5lbFwiICpuZ0lmPVwic2hvd0NvbnRhY3RzUGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWhlYWRlclwiPlxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgYmFja1wiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKClcIj4gY2hldnJvbl9sZWZ0IDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250YWN0czwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxwPjwvcD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIiBmaWxsPVwiIzAwMDAwMFwiPjxwYXRoIGQ9XCJtMjU2LTIwMC01Ni01NiAyMjQtMjI0LTIyNC0yMjQgNTYtNTYgMjI0IDIyNCAyMjQtMjI0IDU2IDU2LTIyNCAyMjQgMjI0IDIyNC01NiA1Ni0yMjQtMjI0LTIyNCAyMjRaXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNFQVJDSCBJTlBVVCAodmlzaWJsZSB3aGVuIGlzU2VhcmNoVmlzaWJsZSA9IHRydWUpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhciBwLTNcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgKGlucHV0KT1cImFwcGx5RmlsdGVyKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWxpc3RcIj5cbiAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3Q7IGxldCBpID0gaW5kZXhcIj4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPkluIFRoaXMgQ2FsbDwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cIidhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj5Zb3VcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIj57e3NlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcn19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cImM/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiSG9sZFwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImxhYmVsXCI+SG9sZDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5FbmQ8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5Db250YWN0czwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Yz8uZmlyc3ROYW1lfX0ge3tjPy5taWRkbGVOYW1lfX0ge3tjPy5sYXN0TmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJjYWxsQ29udGFjdChjKVwiICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+Q2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cImM/LmhvbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTXV0ZVVzZXIoYylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiYz8uaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhYz8uaXNNdXRlXCI+IG1pYyA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIiAqbmdJZj1cImM/LklzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkhvbGRcIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkhvbGQ8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJvbkVuZENhbGwoYylcIiAqbmdJZj1cImM/LklzQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkVuZDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJtaW4tY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzTWluaW1pc2VkXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGZ1bGxzY3JlZW5cIiAoY2xpY2spPVwibWF4aW1pc2VEaWFscGFkKClcIj4gb3Blbl9pbl9mdWxsIDwvc3Bhbj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCVcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tY2FsbC1hbmltYXRpb25cIiBpZD1cImNhbGwtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm1pbi1hdmF0YXItaW1nXCIgW3NyY109XCJjYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsZXJEZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3tjYWxsRGF0YS5uYW1lfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogMFwiPnt7Y2FsbERhdGEuZGlzcGxheU51bSA/IGNhbGxEYXRhLmRpc3BsYXlOdW0gOiBjYWxsRGF0YS5waG9uZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWluLWJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi10aW1lclwiPnt7dGltZXJ9fTwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtc2VjLWJ0blwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|