UNPKG

@hsaadawy/ngx-chat

Version:
88 lines 16.1 kB
import { __awaiter } from "tslib"; import { Component, Inject, Input, Optional, ViewChild, } from "@angular/core"; import { Subject } from "rxjs"; import { filter, takeUntil } from "rxjs/operators"; import { Direction } from "../../core/message"; import { HttpFileUploadPlugin } from "../../services/adapters/xmpp/plugins/http-file-upload.plugin"; import { CONTACT_CLICK_HANDLER_TOKEN, } from "../../services/chat-contact-click-handler"; import { ChatListStateService, } from "../../services/chat-list-state.service"; import { CHAT_SERVICE_TOKEN } from "../../services/chat-service"; import { ChatMessageInputComponent } from "../chat-message-input/chat-message-input.component"; import { ChatMessageListComponent } from "../chat-message-list/chat-message-list.component"; export class ChatWindowComponent { constructor(chatService, chatListService, contactClickHandler) { this.chatService = chatService; this.chatListService = chatListService; this.contactClickHandler = contactClickHandler; this.ReplyString = ''; this.ngDestroy = new Subject(); this.httpFileUploadPlugin = this.chatService.getPlugin(HttpFileUploadPlugin); } ngOnInit() { const messages$ = this.chatWindowState.recipient.messages$; messages$ .pipe(filter((message) => message.direction === Direction.in), takeUntil(this.ngDestroy)) .subscribe(() => { this.chatWindowState.isCollapsed = false; }); } ngOnDestroy() { this.ngDestroy.next(); this.ngDestroy.complete(); } onClickHeader() { this.chatWindowState.isCollapsed = !this.chatWindowState.isCollapsed; } onClickClose() { this.chatListService.closeChat(this.chatWindowState.recipient); } sendMessage() { this.messageInput.onSendMessage(); } afterSendMessage() { this.contactMessageList.scheduleScrollToLastMessage(); } uploadFile(file) { return __awaiter(this, void 0, void 0, function* () { const url = yield this.httpFileUploadPlugin.upload(file); this.chatService.sendMessage(this.chatWindowState.recipient, url); }); } onFocus() { this.messageInput.focus(); } onActionClick(chatAction) { chatAction.onClick({ contact: this.chatWindowState.recipient.jidBare.toString(), chatWindow: this, }); } onContactClick($event) { if (this.contactClickHandler && !this.chatWindowState.isCollapsed) { $event.stopPropagation(); this.contactClickHandler.onClick(this.chatWindowState.recipient); } } newReply(e) { this.ReplyString = e; } } ChatWindowComponent.decorators = [ { type: Component, args: [{ selector: "ngx-chat-window", template: "<ngx-chat-window-frame (headerClick)=\"onClickHeader()\" (closeClick)=\"onClickClose()\">\r\n\r\n <ng-container class=\"window-header-content\">\r\n <div class=\"chat-contact-avatar-wrapper\" (click)=\"onContactClick($event)\">\r\n <ngx-chat-avatar [imageUrl]=\"chatWindowState.recipient.avatar\"></ngx-chat-avatar>\r\n </div>\r\n\r\n <div class=\"header-middle\">\r\n\r\n <div class=\"chat-contact-name-wrapper\" [title]=\"chatWindowState.recipient.name\">\r\n <span [ngClass]=\"{'has-click-handler': !chatWindowState.isCollapsed && !!this.contactClickHandler}\"\r\n (click)=\"onContactClick($event)\">\r\n {{chatWindowState.recipient.name}}\r\n </span>\r\n </div>\r\n\r\n <div class=\"chat-contact-status-wrapper\"\r\n *ngIf=\"!chatWindowState.isCollapsed && chatWindowState.recipient.recipientType === 'contact'\">\r\n <span class=\"chat-contact-status\">\r\n {{chatService.translations.presence[chatWindowState.recipient.presence$ | async]}}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ngx-chat-filedrop *ngIf=\"!chatWindowState.isCollapsed\" class=\"window-content\"\r\n [enabled]=\"httpFileUploadPlugin.fileUploadSupported\" (fileUpload)=\"uploadFile($event)\"\r\n [dropMessage]=\"chatService.translations.dropMessage\">\r\n <div (click)=\"onFocus()\">\r\n <ngx-chat-message-list (Reply)=\"newReply($event)\" [recipient]=\"chatWindowState.recipient\"\r\n [showAvatars]=\"false\"></ngx-chat-message-list>\r\n <div class=\"chat-input-container\">\r\n <ngx-chat-message-input [Reply]=\"ReplyString\" [recipient]=\"chatWindowState.recipient\"\r\n (messageSent)=\"afterSendMessage()\"></ngx-chat-message-input>\r\n <div *ngFor=\"let action of chatService.chatActions\" (click)=\"onActionClick(action)\" class=\"chat-action\"\r\n [ngClass]=\"action.cssClass\" [innerHTML]=\"action.html\">\r\n </div>\r\n </div>\r\n </div>\r\n </ngx-chat-filedrop>\r\n \r\n</ngx-chat-window-frame>\r\n\r\n\r\n\r\n", styles: ["@keyframes ngx-chat-message-in{0%{transform:translate(50px);opacity:0}to{transform:none;opacity:1}}@keyframes ngx-chat-message-out{0%{transform:translate(-50px);opacity:0}to{transform:none;opacity:1}}.messageItem{background-color:red;width:100%;border-radius:2px}*{box-sizing:border-box;margin:0;padding:0;font-family:\"Helvetica\",\"Arial\",serif}.chat-contact-avatar-wrapper{min-width:2em;width:2em;min-height:2em;height:2em}.header-middle{flex-grow:1;flex-shrink:1;padding:0 .5em;white-space:nowrap;overflow:hidden;font-size:.8em;line-height:1.2;height:100%;display:flex;flex-direction:column;justify-content:space-around}.chat-contact-name-wrapper,.chat-contact-status-wrapper{text-overflow:ellipsis;overflow:hidden;display:block}.has-click-handler:hover{text-decoration:underline}.chat-contact-status{color:#999}.window-content{text-align:left;padding:0;min-height:5em;display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}.chat-input-container{display:flex;padding:.5em;border-top:1px solid #e1e1e1;background:#fff;cursor:text}.chat-action{cursor:pointer;align-self:center;text-align:center}.chat-window-send{background-color:#fff;border-color:#fff;color:#000;width:1.5em}.chat-window-send:active{border:none}ngx-chat-message-input{flex-grow:1}\n"] },] } ]; ChatWindowComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [CHAT_SERVICE_TOKEN,] }] }, { type: ChatListStateService }, { type: undefined, decorators: [{ type: Inject, args: [CONTACT_CLICK_HANDLER_TOKEN,] }, { type: Optional }] } ]; ChatWindowComponent.propDecorators = { chatWindowState: [{ type: Input }], messageInput: [{ type: ViewChild, args: [ChatMessageInputComponent,] }], contactMessageList: [{ type: ViewChild, args: [ChatMessageListComponent,] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9jb21wb25lbnRzL2NoYXQtd2luZG93L2NoYXQtd2luZG93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQVcsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUVwRyxPQUFPLEVBRUwsMkJBQTJCLEdBQzVCLE1BQU0sMkNBQTJDLENBQUM7QUFDbkQsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBZSxNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBTzVGLE1BQU0sT0FBTyxtQkFBbUI7SUFjOUIsWUFDdUMsV0FBd0IsRUFDNUMsZUFBcUMsRUFHN0MsbUJBQTRDO1FBSmhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzVDLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUc3Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXlCO1FBaEJ2RCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQVNBLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBUy9DLElBQUksQ0FBQyxvQkFBb0I7WUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUMzQyxTQUFTO2FBQ04sSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUM7SUFDdkUsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFSyxVQUFVLENBQUMsSUFBVTs7WUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7S0FBQTtJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhLENBQUMsVUFBc0I7UUFDbEMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUMxRCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWtCO1FBQy9CLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUU7WUFDakUsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsRTtJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsQ0FBQztRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7OztZQXpGRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtnQkFDM0IsOHdFQUEyQzs7YUFFNUM7Ozs0Q0FnQkksTUFBTSxTQUFDLGtCQUFrQjtZQTNCNUIsb0JBQW9COzRDQTZCakIsTUFBTSxTQUFDLDJCQUEyQixjQUNsQyxRQUFROzs7OEJBakJWLEtBQUs7MkJBR0wsU0FBUyxTQUFDLHlCQUF5QjtpQ0FHbkMsU0FBUyxTQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9uLCBNZXNzYWdlIH0gZnJvbSBcIi4uLy4uL2NvcmUvbWVzc2FnZVwiO1xyXG5pbXBvcnQgeyBIdHRwRmlsZVVwbG9hZFBsdWdpbiB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvaHR0cC1maWxlLXVwbG9hZC5wbHVnaW5cIjtcclxuaW1wb3J0IHsgUm9vbU1lc3NhZ2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL211bHRpLXVzZXItY2hhdC5wbHVnaW5cIjtcclxuaW1wb3J0IHtcclxuICBDaGF0Q29udGFjdENsaWNrSGFuZGxlcixcclxuICBDT05UQUNUX0NMSUNLX0hBTkRMRVJfVE9LRU4sXHJcbn0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NoYXQtY29udGFjdC1jbGljay1oYW5kbGVyXCI7XHJcbmltcG9ydCB7XHJcbiAgQ2hhdExpc3RTdGF0ZVNlcnZpY2UsXHJcbiAgQ2hhdFdpbmRvd1N0YXRlLFxyXG59IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9jaGF0LWxpc3Qtc3RhdGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBDSEFUX1NFUlZJQ0VfVE9LRU4sIENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NoYXQtc2VydmljZVwiO1xyXG5pbXBvcnQgeyBDaGF0TWVzc2FnZUlucHV0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoYXQtbWVzc2FnZS1pbnB1dC9jaGF0LW1lc3NhZ2UtaW5wdXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlTGlzdENvbXBvbmVudCB9IGZyb20gXCIuLi9jaGF0LW1lc3NhZ2UtbGlzdC9jaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcIm5neC1jaGF0LXdpbmRvd1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY2hhdC13aW5kb3cuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vY2hhdC13aW5kb3cuY29tcG9uZW50Lmxlc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0V2luZG93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNoYXRXaW5kb3dTdGF0ZTogQ2hhdFdpbmRvd1N0YXRlO1xyXG4gIFJlcGx5U3RyaW5nID0gJyc7XHJcbiAgQFZpZXdDaGlsZChDaGF0TWVzc2FnZUlucHV0Q29tcG9uZW50KVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUlucHV0OiBDaGF0TWVzc2FnZUlucHV0Q29tcG9uZW50O1xyXG5cclxuICBAVmlld0NoaWxkKENoYXRNZXNzYWdlTGlzdENvbXBvbmVudClcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhY3RNZXNzYWdlTGlzdDogQ2hhdE1lc3NhZ2VMaXN0Q29tcG9uZW50O1xyXG5cclxuICByZWFkb25seSBodHRwRmlsZVVwbG9hZFBsdWdpbjogSHR0cEZpbGVVcGxvYWRQbHVnaW47XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmdEZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KENIQVRfU0VSVklDRV9UT0tFTikgcmVhZG9ubHkgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGF0TGlzdFNlcnZpY2U6IENoYXRMaXN0U3RhdGVTZXJ2aWNlLFxyXG4gICAgQEluamVjdChDT05UQUNUX0NMSUNLX0hBTkRMRVJfVE9LRU4pXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgcmVhZG9ubHkgY29udGFjdENsaWNrSGFuZGxlcjogQ2hhdENvbnRhY3RDbGlja0hhbmRsZXJcclxuICApIHtcclxuICAgIHRoaXMuaHR0cEZpbGVVcGxvYWRQbHVnaW4gPVxyXG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdldFBsdWdpbihIdHRwRmlsZVVwbG9hZFBsdWdpbik7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnN0IG1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxSb29tTWVzc2FnZSB8IE1lc3NhZ2U+ID1cclxuICAgICAgdGhpcy5jaGF0V2luZG93U3RhdGUucmVjaXBpZW50Lm1lc3NhZ2VzJDtcclxuICAgIG1lc3NhZ2VzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UuZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uaW4pLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYXRXaW5kb3dTdGF0ZS5pc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5uZ0Rlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5uZ0Rlc3Ryb3kuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrSGVhZGVyKCkge1xyXG4gICAgdGhpcy5jaGF0V2luZG93U3RhdGUuaXNDb2xsYXBzZWQgPSAhdGhpcy5jaGF0V2luZG93U3RhdGUuaXNDb2xsYXBzZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGlja0Nsb3NlKCkge1xyXG4gICAgdGhpcy5jaGF0TGlzdFNlcnZpY2UuY2xvc2VDaGF0KHRoaXMuY2hhdFdpbmRvd1N0YXRlLnJlY2lwaWVudCk7XHJcbiAgfVxyXG5cclxuICBzZW5kTWVzc2FnZSgpIHtcclxuICAgIHRoaXMubWVzc2FnZUlucHV0Lm9uU2VuZE1lc3NhZ2UoKTtcclxuICB9XHJcblxyXG4gIGFmdGVyU2VuZE1lc3NhZ2UoKSB7XHJcbiAgICB0aGlzLmNvbnRhY3RNZXNzYWdlTGlzdC5zY2hlZHVsZVNjcm9sbFRvTGFzdE1lc3NhZ2UoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZEZpbGUoZmlsZTogRmlsZSkge1xyXG4gICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5odHRwRmlsZVVwbG9hZFBsdWdpbi51cGxvYWQoZmlsZSk7XHJcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLnNlbmRNZXNzYWdlKHRoaXMuY2hhdFdpbmRvd1N0YXRlLnJlY2lwaWVudCwgdXJsKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKSB7XHJcbiAgICB0aGlzLm1lc3NhZ2VJbnB1dC5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgb25BY3Rpb25DbGljayhjaGF0QWN0aW9uOiBDaGF0QWN0aW9uKSB7XHJcbiAgICBjaGF0QWN0aW9uLm9uQ2xpY2soe1xyXG4gICAgICBjb250YWN0OiB0aGlzLmNoYXRXaW5kb3dTdGF0ZS5yZWNpcGllbnQuamlkQmFyZS50b1N0cmluZygpLFxyXG4gICAgICBjaGF0V2luZG93OiB0aGlzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNvbnRhY3RDbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmNvbnRhY3RDbGlja0hhbmRsZXIgJiYgIXRoaXMuY2hhdFdpbmRvd1N0YXRlLmlzQ29sbGFwc2VkKSB7XHJcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5jb250YWN0Q2xpY2tIYW5kbGVyLm9uQ2xpY2sodGhpcy5jaGF0V2luZG93U3RhdGUucmVjaXBpZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5ld1JlcGx5KGUpIHtcclxuICAgIHRoaXMuUmVwbHlTdHJpbmcgPSBlXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXRBY3Rpb24ge1xyXG4gIGNzc0NsYXNzOiB7IFtjbGFzc05hbWU6IHN0cmluZ106IGJvb2xlYW4gfSB8IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gIC8qKlxyXG4gICAqIHRvIGlkZW50aWZ5IGFjdGlvbnNcclxuICAgKi9cclxuICBpZDogc3RyaW5nO1xyXG4gIGh0bWw6IHN0cmluZztcclxuXHJcbiAgb25DbGljayhjaGF0QWN0aW9uQ29udGV4dDogQ2hhdEFjdGlvbkNvbnRleHQpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXRBY3Rpb25Db250ZXh0IHtcclxuICBjb250YWN0OiBzdHJpbmc7XHJcbiAgY2hhdFdpbmRvdzogQ2hhdFdpbmRvd0NvbXBvbmVudDtcclxufVxyXG4iXX0=