kwikid-components
Version:
KwikID's Components Library
128 lines • 27.4 kB
JavaScript
import { __awaiter, __decorate } from "tslib";
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from "@angular/core";
import { logMethod } from "kwikid-toolkit";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class KwikIDRTCConnectionCheckerComponent {
constructor() {
this.userService = { isSDK: false, platform: "iOS" };
this.networkConnectionStateChange = new EventEmitter();
this.steps = ["1", "2", "3"];
this.activeStep = "0";
this.isFrontCam = true;
this.processStep1 = "Initiating network test. Please wait...";
this.processStep2 = "Generating token. This may take a moment...";
}
ngOnInit() {
setTimeout(() => {
var _a;
this.secondaryVideoElement = (_a = this.secondaryPlayer) === null || _a === void 0 ? void 0 : _a.nativeElement;
this.livekitProcess();
}, 1000);
}
ngOnDestroy() {
if (this.streamImageInterval)
clearInterval(this.streamImageInterval);
}
livekitProcess() {
return __awaiter(this, void 0, void 0, function* () {
const participantElement = document.createElement("video");
const agentAudioElement = document.createElement("audio");
const selfElement = this.secondaryVideoElement;
// const livekitToken = await this.livekitService.generateRoomToken(
// localStorage.getItem("session_id"),
// localStorage.getItem("user_id")
// );
const livekitToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2aWRlbyI6eyJyb29tSm9pbiI6dHJ1ZSwicm9vbSI6IjRlYjI4ZGRhLWE2YTQtNGMzZS1hYTAzLTgwOGFiODQ5MTgyOCJ9LCJpc3MiOiJBUEl4aFBZV3Q5NXJTUUgiLCJuYmYiOjE3MzA5MTYzOTYsImV4cCI6MTczMDkzNzk5Niwic3ViIjoiNGViMjhkZGEtYTZhNC00YzNlLWFhMDMtODA4YWI4NDkxODI4X2JhaWp1LmRvZGhpYUB0aGluazM2MC5haSJ9.dqaN4sYb4HTnBKssRhbQXR4idL9KSLq3Ere_seL_ZXg";
this.updateProcessSteps("Token generation successful.", "2");
this.updateProcessSteps("Establishing room connection. Please wait...");
yield this.livekitService.init(selfElement, participantElement, agentAudioElement, livekitToken);
this.updateProcessSteps("Room connection established.", "3");
this.updateProcessSteps("Performing user state test. Please wait...");
const participantState = yield this.livekitService.getParticipantState(localStorage.getItem("session_id"), localStorage.getItem("user_id"));
this.updateProcessSteps("User network state test completed.", "4");
this.emitNetworkConnectionStateChange(participantState);
});
}
switchCameraHtml() {
console.log(this.isFrontCam);
const switched = this.livekitService.switchCamera(!this.isFrontCam ? "Back" : "Front");
if (switched) {
this.isFrontCam = !this.isFrontCam;
}
}
updateProcessSteps(step2, activeStep = null) {
this.processStep1 = this.processStep2;
this.processStep2 = step2;
if (activeStep) {
this.activeStep = activeStep;
}
}
emitNetworkConnectionStateChange(participantState) {
this.networkConnectionStateChange.emit({
success: participantState.participant_exist && participantState.room_exist
});
}
playUserPreview() {
return __awaiter(this, void 0, void 0, function* () {
if (this.shouldRenderImage()) {
this.toggleSecondaryVideoVisibility(false);
this.renderStreamImage();
}
else {
this.toggleSecondaryVideoVisibility(true);
yield this.renderCameraStream();
}
});
}
shouldRenderImage() {
return this.userService.isSDK || this.userService.platform === "android";
}
toggleSecondaryVideoVisibility(visible) {
this.secondaryVideoElement.classList.toggle("invisible", !visible);
}
renderCameraStream() {
return __awaiter(this, void 0, void 0, function* () {
const cameraStream = yield this.mediaService.getCameraStream("f");
this.secondaryVideoElement.srcObject = cameraStream.stream;
});
}
renderStreamImage() {
this.streamImageInterval = setInterval(() => {
const canvasSecondary = (document.getElementById("secondaryCanvas"));
canvasSecondary.width = this.secondaryVideoElement.videoWidth;
canvasSecondary.height = this.secondaryVideoElement.videoHeight;
canvasSecondary
.getContext("2d")
.drawImage(this.secondaryVideoElement, 0, 0);
}, 10);
}
}
/** @nocollapse */ KwikIDRTCConnectionCheckerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDRTCConnectionCheckerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikIDRTCConnectionCheckerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDRTCConnectionCheckerComponent, selector: "kwikid-rtc-connection-checker", inputs: { mediaService: "mediaService", livekitService: "livekitService", userService: "userService" }, outputs: { networkConnectionStateChange: "networkConnectionStateChange" }, viewQueries: [{ propertyName: "videoPlayer", first: true, predicate: ["videoPlayer"], descendants: true, read: ElementRef }, { propertyName: "secondaryPlayer", first: true, predicate: ["secondaryPlayer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<button (click)=\"switchCameraHtml()\">\n Switch [Current -> {{ this.isFrontCam ? \"Front\" : \"Back\" }}]\n</button>\n<br />\n<div class=\"socket-connection\">\n <div class=\"video-fab\">\n <canvas\n id=\"secondaryCanvas\"\n *ngIf=\"userService.isSDK || userService.platform === 'android'\"\n class=\"secondaryPlayerImg\"\n ></canvas>\n <video\n #secondaryPlayer\n id=\"secondary-player\"\n playsinline\n autoplay\n controls\n [muted]=\"'muted'\"\n class=\"secondaryPlayer flip\"\n ></video>\n </div>\n\n <div class=\"status-message\">\n <div class=\"step-container\">\n <div\n *ngFor=\"let step of steps\"\n class=\"step-item\"\n >\n <div\n [ngClass]=\"{\n 'active-card': step == activeStep,\n 'waiting-loader': true,\n 'small-card': steps.length > 7 && step != activeStep\n }\"\n >\n <div *ngIf=\"step < activeStep\">\n <div class=\"icon-container\">\n <div class=\"done\">✓</div>\n <!-- Green ticket icon -->\n </div>\n </div>\n <div *ngIf=\"step === activeStep\">\n <div class=\"icon-container\">\n <div class=\"loader\"></div>\n </div>\n </div>\n <div *ngIf=\"step > activeStep\">\n <div class=\"icon-container\">\n <div class=\"wait\">⌛</div>\n <!-- Stop icon -->\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"step != steps.length && steps.length < 6\"\n [ngClass]=\"{ 'step-line': true, 'active-line': step == activeStep }\"\n ></div>\n </div>\n </div>\n\n <div class=\"step-text-parent\">\n <div class=\"step-text\">\n <div class=\"step-text-item\">{{ processStep1 }}</div>\n </div>\n <div class=\"step-text\">\n <div class=\"step-text-item\">{{ processStep2 }}</div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".socket-connection{display:flex;flex-direction:column;align-items:center;background:#c5c5c5;border-radius:6px;position:relative;overflow:hidden;margin-top:15px}.socket-connection .video-fab{display:flex;height:-moz-fit-content;height:fit-content;border-radius:5px}.socket-connection .video-fab.desktop{width:25%!important;max-width:140px!important}.socket-connection #secondary-player{width:100%;padding:0;margin:0!important;background:transparent!important;border-radius:5px}.socket-connection .secondaryPlayerImg{width:100%;border-radius:5px}.socket-connection .flip{transform:rotateY(180deg)!important}.socket-connection .unflip{transform:rotateY(0)!important}.socket-connection .status-message{text-align:center;position:absolute;padding:10px;top:0;width:100%;background:linear-gradient(0deg,black 0%,rgba(0,0,0,.7596288515) 55%,rgba(0,0,0,.4543067227) 81%,rgba(0,0,0,0) 100%);color:#fff;display:flex;flex-direction:column;align-items:center}.socket-connection .status-message .step-container{display:flex;justify-content:center;margin-bottom:10px}.socket-connection .status-message .step-item{display:flex;align-items:center;justify-content:center}.socket-connection .status-message .step-item .icon-container{position:relative;width:30px;height:30px;border-radius:50%;background-color:var(--kwikui-color-white);display:flex;justify-content:center;align-items:center}.socket-connection .status-message .step-item .icon-container i{font-size:20px}.socket-connection .status-message .step-item .done{width:100%;background:var(--kwikui-color-success);height:100%;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:100%;border:2px solid var(--kwikui-color-white)}.socket-connection .status-message .step-item .wait{width:100%;background:var(--kwikui-color-error);height:100%;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:100%;border:2px solid var(--kwikui-color-white)}.socket-connection .status-message .step-item .loader{border:4px solid rgba(0,0,0,.1);border-left-color:var(--kwikui-color-primary);background:var(--kwikui-color-warn);border-radius:50%;width:30px;height:30px;animation:spin 1s linear infinite;position:absolute;top:0%;left:0%;transform:translate(-50%,-50%)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.socket-connection .status-message .step-item .tick-icon{color:var(--primary-color);font-size:16px}.socket-connection .status-message .step-item .card{height:22px;width:22px;line-height:22px;border-radius:50%;position:relative;z-index:2;text-align:center;color:#fff;font-weight:500;font-size:13px;box-shadow:0 1px 3px #929191,0 1px 2px #747272}.socket-connection .status-message .step-item .card.desktop{height:4vh;width:4vh;line-height:4vh}.socket-connection .status-message .step-item .small-card{height:18px;width:18px;line-height:18px;font-size:10px}.socket-connection .status-message .step-item .active-card{color:var(--primary-color);border:solid .5px var(--primary-color)}.socket-connection .status-message .step-item .step-line{background:gray;height:1px;margin:auto 9px;width:10px}.socket-connection .status-message .step-item .active-line{background:var(--primary-color)}.socket-connection .step-text-parent{font-size:12px}.socket-connection .step-text-parent .step-text-item{display:block}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
__decorate([
logMethod
], KwikIDRTCConnectionCheckerComponent.prototype, "switchCameraHtml", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDRTCConnectionCheckerComponent, decorators: [{
type: Component,
args: [{
selector: "kwikid-rtc-connection-checker",
templateUrl: "./rtc-connection-checker.component.html",
styleUrls: ["./rtc-connection-checker.component.scss"]
}]
}], ctorParameters: function () { return []; }, propDecorators: { videoPlayer: [{
type: ViewChild,
args: ["videoPlayer", { read: ElementRef }]
}], secondaryPlayer: [{
type: ViewChild,
args: ["secondaryPlayer", { read: ElementRef }]
}], mediaService: [{
type: Input
}], livekitService: [{
type: Input
}], userService: [{
type: Input
}], networkConnectionStateChange: [{
type: Output
}], switchCameraHtml: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnRjLWNvbm5lY3Rpb24tY2hlY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcnRjLWNvbm5lY3Rpb24tY2hlY2tlci9ydGMtY29ubmVjdGlvbi1jaGVja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9ydGMtY29ubmVjdGlvbi1jaGVja2VyL3J0Yy1jb25uZWN0aW9uLWNoZWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQWlCM0MsTUFBTSxPQUFPLG1DQUFtQztJQStCOUM7UUFyQlMsZ0JBQVcsR0FBZ0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUU1RCxpQ0FBNEIsR0FDcEMsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQU0xQixVQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLGVBQVUsR0FBRyxHQUFHLENBQUM7UUFFakIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVsQixpQkFBWSxHQUFHLHlDQUF5QyxDQUFDO1FBRXpELGlCQUFZLEdBQUcsNkNBQTZDLENBQUM7SUFJOUMsQ0FBQztJQUVoQixRQUFRO1FBQ04sVUFBVSxDQUFDLEdBQUcsRUFBRTs7WUFDZCxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBQSxJQUFJLENBQUMsZUFBZSwwQ0FB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QUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwrQkFBK0I7b0JBQ3pDLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELFNBQVMsRUFBRSxDQUFDLHlDQUF5QyxDQUFDO2lCQUN2RDswRUFFaUQsV0FBVztzQkFBMUQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUc5QyxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUd6QyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFSSw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBa0VQLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgbG9nTWV0aG9kIH0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5cbmludGVyZmFjZSBVc2VyU2VydmljZSB7XG4gIGlzU0RLOiBib29sZWFuO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGFydGljaXBhbnRTdGF0ZSB7XG4gIHBhcnRpY2lwYW50X2V4aXN0OiBib29sZWFuO1xuICByb29tX2V4aXN0OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa2lkLXJ0Yy1jb25uZWN0aW9uLWNoZWNrZXJcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9ydGMtY29ubmVjdGlvbi1jaGVja2VyLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9ydGMtY29ubmVjdGlvbi1jaGVja2VyLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtJRFJUQ0Nvbm5lY3Rpb25DaGVja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZChcInZpZGVvUGxheWVyXCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB2aWRlb1BsYXllcjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKFwic2Vjb25kYXJ5UGxheWVyXCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBzZWNvbmRhcnlQbGF5ZXI6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgbWVkaWFTZXJ2aWNlOiBhbnk7XG5cbiAgQElucHV0KCkgbGl2ZWtpdFNlcnZpY2U6IGFueTtcblxuICBASW5wdXQoKSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UgPSB7IGlzU0RLOiBmYWxzZSwgcGxhdGZvcm06IFwiaU9TXCIgfTtcblxuICBAT3V0cHV0KCkgbmV0d29ya0Nvbm5lY3Rpb25TdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHByaW1hcnlWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQ7XG5cbiAgc2Vjb25kYXJ5VmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50O1xuXG4gIHN0ZXBzID0gW1wiMVwiLCBcIjJcIiwgXCIzXCJdO1xuXG4gIGFjdGl2ZVN0ZXAgPSBcIjBcIjtcblxuICBpc0Zyb250Q2FtID0gdHJ1ZTtcblxuICBwcm9jZXNzU3RlcDEgPSBcIkluaXRpYXRpbmcgbmV0d29yayB0ZXN0LiBQbGVhc2Ugd2FpdC4uLlwiO1xuXG4gIHByb2Nlc3NTdGVwMiA9IFwiR2VuZXJhdGluZyB0b2tlbi4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLlwiO1xuXG4gIHByaXZhdGUgc3RyZWFtSW1hZ2VJbnRlcnZhbDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2Vjb25kYXJ5VmlkZW9FbGVtZW50ID0gdGhpcy5zZWNvbmRhcnlQbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLmxpdmVraXRQcm9jZXNzKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdHJlYW1JbWFnZUludGVydmFsKSBjbGVhckludGVydmFsKHRoaXMuc3RyZWFtSW1hZ2VJbnRlcnZhbCk7XG4gIH1cblxuICBhc3luYyBsaXZla2l0UHJvY2VzcygpIHtcbiAgICBjb25zdCBwYXJ0aWNpcGFudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidmlkZW9cIik7XG4gICAgY29uc3QgYWdlbnRBdWRpb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYXVkaW9cIik7XG4gICAgY29uc3Qgc2VsZkVsZW1lbnQgPSB0aGlzLnNlY29uZGFyeVZpZGVvRWxlbWVudDtcblxuICAgIC8vIGNvbnN0IGxpdmVraXRUb2tlbiA9IGF3YWl0IHRoaXMubGl2ZWtpdFNlcnZpY2UuZ2VuZXJhdGVSb29tVG9rZW4oXG4gICAgLy8gICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlc3Npb25faWRcIiksXG4gICAgLy8gICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXJfaWRcIilcbiAgICAvLyApO1xuICAgIGNvbnN0IGxpdmVraXRUb2tlbiA9XG4gICAgICBcImV5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUoyYVdSbGJ5STZleUp5YjI5dFNtOXBiaUk2ZEhKMVpTd2ljbTl2YlNJNklqUmxZakk0WkdSaExXRTJZVFF0TkdNelpTMWhZVEF6TFRnd09HRmlPRFE1TVRneU9DSjlMQ0pwYzNNaU9pSkJVRWw0YUZCWlYzUTVOWEpUVVVnaUxDSnVZbVlpT2pFM016QTVNVFl6T1RZc0ltVjRjQ0k2TVRjek1Ea3pOems1Tml3aWMzVmlJam9pTkdWaU1qaGtaR0V0WVRaaE5DMDBZek5sTFdGaE1ETXRPREE0WVdJNE5Ea3hPREk0WDJKaGFXcDFMbVJ2WkdocFlVQjBhR2x1YXpNMk1DNWhhU0o5LmRxYU40c1liNEhUbkJLc3NSaGJRWFI0aWRMOUtTTHEzRXJlX3NlTF9aWGdcIjtcbiAgICB0aGlzLnVwZGF0ZVByb2Nlc3NTdGVwcyhcIlRva2VuIGdlbmVyYXRpb24gc3VjY2Vzc2Z1bC5cIiwgXCIyXCIpO1xuXG4gICAgdGhpcy51cGRhdGVQcm9jZXNzU3RlcHMoXCJFc3RhYmxpc2hpbmcgcm9vbSBjb25uZWN0aW9uLiBQbGVhc2Ugd2FpdC4uLlwiKTtcbiAgICBhd2FpdCB0aGlzLmxpdmVraXRTZXJ2aWNlLmluaXQoXG4gICAgICBzZWxmRWxlbWVudCxcbiAgICAgIHBhcnRpY2lwYW50RWxlbWVudCxcbiAgICAgIGFnZW50QXVkaW9FbGVtZW50LFxuICAgICAgbGl2ZWtpdFRva2VuXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVByb2Nlc3NTdGVwcyhcIlJvb20gY29ubmVjdGlvbiBlc3RhYmxpc2hlZC5cIiwgXCIzXCIpO1xuXG4gICAgdGhpcy51cGRhdGVQcm9jZXNzU3RlcHMoXCJQZXJmb3JtaW5nIHVzZXIgc3RhdGUgdGVzdC4gUGxlYXNlIHdhaXQuLi5cIik7XG4gICAgY29uc3QgcGFydGljaXBhbnRTdGF0ZTogUGFydGljaXBhbnRTdGF0ZSA9XG4gICAgICBhd2FpdCB0aGlzLmxpdmVraXRTZXJ2aWNlLmdldFBhcnRpY2lwYW50U3RhdGUoXG4gICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2Vzc2lvbl9pZFwiKSxcbiAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VyX2lkXCIpXG4gICAgICApO1xuICAgIHRoaXMudXBkYXRlUHJvY2Vzc1N0ZXBzKFwiVXNlciBuZXR3b3JrIHN0YXRlIHRlc3QgY29tcGxldGVkLlwiLCBcIjRcIik7XG5cbiAgICB0aGlzLmVtaXROZXR3b3JrQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHBhcnRpY2lwYW50U3RhdGUpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzd2l0Y2hDYW1lcmFIdG1sKCkge1xuICAgIGNvbnNvbGUubG9nKHRoaXMuaXNGcm9udENhbSk7XG4gICAgY29uc3Qgc3dpdGNoZWQgPSB0aGlzLmxpdmVraXRTZXJ2aWNlLnN3aXRjaENhbWVyYShcbiAgICAgICF0aGlzLmlzRnJvbnRDYW0gPyBcIkJhY2tcIiA6IFwiRnJvbnRcIlxuICAgICk7XG5cbiAgICBpZiAoc3dpdGNoZWQpIHtcbiAgICAgIHRoaXMuaXNGcm9udENhbSA9ICF0aGlzLmlzRnJvbnRDYW07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQcm9jZXNzU3RlcHMoc3RlcDI6IHN0cmluZywgYWN0aXZlU3RlcCA9IG51bGwpIHtcbiAgICB0aGlzLnByb2Nlc3NTdGVwMSA9IHRoaXMucHJvY2Vzc1N0ZXAyO1xuICAgIHRoaXMucHJvY2Vzc1N0ZXAyID0gc3RlcDI7XG4gICAgaWYgKGFjdGl2ZVN0ZXApIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RlcCA9IGFjdGl2ZVN0ZXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TmV0d29ya0Nvbm5lY3Rpb25TdGF0ZUNoYW5nZShwYXJ0aWNpcGFudFN0YXRlOiBQYXJ0aWNpcGFudFN0YXRlKSB7XG4gICAgdGhpcy5uZXR3b3JrQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmVtaXQoe1xuICAgICAgc3VjY2VzczogcGFydGljaXBhbnRTdGF0ZS5wYXJ0aWNpcGFudF9leGlzdCAmJiBwYXJ0aWNpcGFudFN0YXRlLnJvb21fZXhpc3RcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHBsYXlVc2VyUHJldmlldygpIHtcbiAgICBpZiAodGhpcy5zaG91bGRSZW5kZXJJbWFnZSgpKSB7XG4gICAgICB0aGlzLnRvZ2dsZVNlY29uZGFyeVZpZGVvVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICB0aGlzLnJlbmRlclN0cmVhbUltYWdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlU2Vjb25kYXJ5VmlkZW9WaXNpYmlsaXR5KHRydWUpO1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJDYW1lcmFTdHJlYW0oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlbmRlckltYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVzZXJTZXJ2aWNlLmlzU0RLIHx8IHRoaXMudXNlclNlcnZpY2UucGxhdGZvcm0gPT09IFwiYW5kcm9pZFwiO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVTZWNvbmRhcnlWaWRlb1Zpc2liaWxpdHkodmlzaWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2Vjb25kYXJ5VmlkZW9FbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJpbnZpc2libGVcIiwgIXZpc2libGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJDYW1lcmFTdHJlYW0oKSB7XG4gICAgY29uc3QgY2FtZXJhU3RyZWFtID0gYXdhaXQgdGhpcy5tZWRpYVNlcnZpY2UuZ2V0Q2FtZXJhU3RyZWFtKFwiZlwiKTtcbiAgICB0aGlzLnNlY29uZGFyeVZpZGVvRWxlbWVudC5zcmNPYmplY3QgPSBjYW1lcmFTdHJlYW0uc3RyZWFtO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTdHJlYW1JbWFnZSgpIHtcbiAgICB0aGlzLnN0cmVhbUltYWdlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBjYW52YXNTZWNvbmRhcnkgPSA8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlY29uZGFyeUNhbnZhc1wiKVxuICAgICAgKTtcbiAgICAgIGNhbnZhc1NlY29uZGFyeS53aWR0aCA9IHRoaXMuc2Vjb25kYXJ5VmlkZW9FbGVtZW50LnZpZGVvV2lkdGg7XG4gICAgICBjYW52YXNTZWNvbmRhcnkuaGVpZ2h0ID0gdGhpcy5zZWNvbmRhcnlWaWRlb0VsZW1lbnQudmlkZW9IZWlnaHQ7XG4gICAgICBjYW52YXNTZWNvbmRhcnlcbiAgICAgICAgLmdldENvbnRleHQoXCIyZFwiKVxuICAgICAgICAuZHJhd0ltYWdlKHRoaXMuc2Vjb25kYXJ5VmlkZW9FbGVtZW50LCAwLCAwKTtcbiAgICB9LCAxMCk7XG4gIH1cbn1cbiIsIjxidXR0b24gKGNsaWNrKT1cInN3aXRjaENhbWVyYUh0bWwoKVwiPlxuICBTd2l0Y2ggW0N1cnJlbnQgLT4ge3sgdGhpcy5pc0Zyb250Q2FtID8gXCJGcm9udFwiIDogXCJCYWNrXCIgfX1dXG48L2J1dHRvbj5cbjxiciAvPlxuPGRpdiBjbGFzcz1cInNvY2tldC1jb25uZWN0aW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJ2aWRlby1mYWJcIj5cbiAgICA8Y2FudmFzXG4gICAgICBpZD1cInNlY29uZGFyeUNhbnZhc1wiXG4gICAgICAqbmdJZj1cInVzZXJTZXJ2aWNlLmlzU0RLIHx8IHVzZXJTZXJ2aWNlLnBsYXRmb3JtID09PSAnYW5kcm9pZCdcIlxuICAgICAgY2xhc3M9XCJzZWNvbmRhcnlQbGF5ZXJJbWdcIlxuICAgID48L2NhbnZhcz5cbiAgICA8dmlkZW9cbiAgICAgICNzZWNvbmRhcnlQbGF5ZXJcbiAgICAgIGlkPVwic2Vjb25kYXJ5LXBsYXllclwiXG4gICAgICBwbGF5c2lubGluZVxuICAgICAgYXV0b3BsYXlcbiAgICAgIGNvbnRyb2xzXG4gICAgICBbbXV0ZWRdPVwiJ211dGVkJ1wiXG4gICAgICBjbGFzcz1cInNlY29uZGFyeVBsYXllciBmbGlwXCJcbiAgICA+PC92aWRlbz5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInN0YXR1cy1tZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ZXAtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzXCJcbiAgICAgICAgY2xhc3M9XCJzdGVwLWl0ZW1cIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2FjdGl2ZS1jYXJkJzogc3RlcCA9PSBhY3RpdmVTdGVwLFxuICAgICAgICAgICAgJ3dhaXRpbmctbG9hZGVyJzogdHJ1ZSxcbiAgICAgICAgICAgICdzbWFsbC1jYXJkJzogc3RlcHMubGVuZ3RoID4gNyAmJiBzdGVwICE9IGFjdGl2ZVN0ZXBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdGVwIDwgYWN0aXZlU3RlcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb25lXCI+JmNoZWNrbWFyazs8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBHcmVlbiB0aWNrZXQgaWNvbiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdGVwID09PSBhY3RpdmVTdGVwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN0ZXAgPiBhY3RpdmVTdGVwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhaXRcIj4mIzg5ODc7PC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gU3RvcCBpY29uIC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInN0ZXAgIT0gc3RlcHMubGVuZ3RoICYmIHN0ZXBzLmxlbmd0aCA8IDZcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3N0ZXAtbGluZSc6IHRydWUsICdhY3RpdmUtbGluZSc6IHN0ZXAgPT0gYWN0aXZlU3RlcCB9XCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic3RlcC10ZXh0LXBhcmVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtdGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC10ZXh0LWl0ZW1cIj57eyBwcm9jZXNzU3RlcDEgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtdGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC10ZXh0LWl0ZW1cIj57eyBwcm9jZXNzU3RlcDIgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19