@hsaadawy/ngx-chat
Version:
84 lines • 18.6 kB
JavaScript
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, EventEmitter, Inject, Input, Output } from '@angular/core';
import { combineLatest } from 'rxjs';
import { map } from 'rxjs/operators';
import { MultiUserChatPlugin } from '../../services/adapters/xmpp/plugins/multi-user-chat.plugin';
import { ChatListStateService } from '../../services/chat-list-state.service';
import { CHAT_SERVICE_TOKEN } from '../../services/chat-service';
export class RosterListComponent {
constructor(chatService, chatListService) {
this.chatService = chatService;
this.chatListService = chatListService;
this.rosterStateChanged = new EventEmitter();
this.multiUserChatPlugin = this.chatService.getPlugin(MultiUserChatPlugin);
}
ngOnInit() {
if (!this.contacts) {
this.contacts = this.chatService.contactsSubscribed$;
}
if (!this.contactRequestsReceived$) {
this.contactRequestsReceived$ = this.chatService.contactRequestsReceived$;
}
if (!this.contactRequestsSent$) {
this.contactRequestsSent$ = this.chatService.contactRequestsSent$;
}
if (!this.contactsUnaffiliated$) {
this.contactsUnaffiliated$ = this.chatService.contactsUnaffiliated$;
}
this.hasNoContacts$ = combineLatest([
this.contacts,
this.contactRequestsReceived$,
this.contactRequestsSent$,
this.contactsUnaffiliated$,
]).pipe(map(([contacts, received, sent, unaffiliated]) => contacts.length + received.length + sent.length + unaffiliated.length === 0));
}
onClickRecipient(recipient) {
this.chatListService.openChat(recipient);
}
toggleVisibility() {
const newState = this.rosterState === 'shown' ? 'hidden' : 'shown';
this.rosterStateChanged.emit(newState);
}
}
RosterListComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-chat-roster-list',
template: "<div class=\"roster-drawer\" (click)=\"toggleVisibility()\" [@drawerVisibility]=\"rosterState\">\r\n <div class=\"roster-drawer__button\" *ngIf=\"rosterState === 'shown'\">»</div>\r\n <div class=\"roster-drawer__button\" *ngIf=\"rosterState === 'hidden'\">«</div>\r\n</div>\r\n\r\n<div class=\"roster-list\" [@rosterVisibility]=\"rosterState\" [attr.data-ngx-chat-state]=\"chatService.state$ | async\">\r\n\r\n <div class=\"roster-header\">\r\n {{ chatService.translations.chat }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"(multiUserChatPlugin.rooms$ | async) as rooms\">\r\n <ng-container *ngIf=\"rooms.length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.rooms}}</div>\r\n\r\n <div class=\"contact-list-wrapper\">\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let room of rooms\"\r\n [recipient]=\"room\"\r\n (click)=\"onClickRecipient(room)\">\r\n </ngx-chat-roster-recipient>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contacts | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contacts}}</div>\r\n\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let contact of (contacts | async)\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contactRequestsReceived$ | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contactRequestIn}}</div>\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let contact of (contactRequestsReceived$ | async)\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contactRequestsSent$ | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contactRequestOut}}</div>\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let contact of (contactRequestsSent$ | async)\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contactsUnaffiliated$ | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contactsUnaffiliated}}</div>\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ng-container *ngFor=\"let contact of (contactsUnaffiliated$ | async)\">\r\n <ngx-chat-roster-recipient\r\n *ngIf=\"contact.messages.length > 0\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n </ng-container>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"roster-list__empty\" *ngIf=\"hasNoContacts$ | async\">\r\n {{chatService.translations.noContacts}}\r\n </div>\r\n\r\n <ng-container *ngIf=\"chatService.enableDebugging\">\r\n <hr/>\r\n\r\n <div class=\"contact-pending-request-received-wrapper\">\r\n debug contact requests in:\r\n <div class=\"contact-pending-request-received\" *ngFor=\"let request of (chatService.contactRequestsReceived$ | async)\">\r\n {{request.name}}\r\n </div>\r\n </div>\r\n\r\n <hr/>\r\n\r\n <div class=\"contact-pending-request-sent-wrapper\">\r\n debug contact requests out:\r\n <div class=\"contact-pending-request-sent\" *ngFor=\"let request of (chatService.contactRequestsSent$ | async)\">\r\n {{request.name}}\r\n </div>\r\n </div>\r\n\r\n <hr/>\r\n\r\n <p>\r\n debug contacts (count: {{ (chatService.contacts$ | async).length }})<br/>\r\n </p>\r\n <p *ngFor=\"let contact of (chatService.contacts$|async)\" style=\"margin-bottom: 1em\">\r\n <em>{{contact.name}}:</em><br/>\r\n subscription={{contact.subscription$ | async}}<br/>\r\n presence={{contact.presence$ | async}}<br/>\r\n pendingIn={{contact.pendingIn$ | async}}<br/>\r\n pendingOut={{contact.pendingOut$ | async}}\r\n </p>\r\n <p class=\"roster-debug-state\">state: {{chatService.state$ | async}}</p>\r\n </ng-container>\r\n\r\n <!--\r\n <div class=\"roster-footer\">\r\n </div>\r\n -->\r\n</div>\r\n",
animations: [
trigger('rosterVisibility', [
state('hidden', style({
right: '-14em',
})),
state('shown', style({
right: '0em',
})),
transition('hidden => shown', animate('400ms ease')),
transition('shown => hidden', animate('400ms ease'))
]),
trigger('drawerVisibility', [
state('hidden', style({
right: '0em',
})),
state('shown', style({
right: '14em',
})),
transition('hidden => shown', animate('400ms ease')),
transition('shown => hidden', animate('400ms ease'))
])
],
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}.roster-list{position:fixed;top:0;bottom:0;right:0;width:14em;overflow-y:auto;border-left:1px solid #e1e1e1;z-index:80;margin-left:10px;background-color:#f5f5f5;text-align:left;padding:.5em .5em 0;display:flex;flex-direction:column}.roster-list .roster-header{text-align:center;margin-bottom:1em}.roster-list .roster-group-header{border-bottom:1px solid #e1e1e1;padding-bottom:.5em}.roster-list .roster-footer{border-top:1px solid #e1e1e1;width:14em;padding-top:.5em}.roster-list .contact-list-wrapper{margin-bottom:1em}.roster-list ngx-chat-roster-recipient{display:block;padding:.5em}.roster-list ngx-chat-roster-recipient:hover{background-color:#e8e8e8;cursor:pointer}.roster-list__empty{color:#999;text-align:center;margin-top:.5em;font-size:1.5em}.roster-drawer{top:0;bottom:0;right:14em;width:1em;position:fixed;z-index:80;cursor:pointer}.roster-drawer:hover{background-color:#1e1e1e33}.roster-drawer__button{top:50%;color:transparent;background-color:transparent;position:fixed;margin-left:.4rem}.roster-drawer:hover .roster-drawer__button{color:#fff}\n"]
},] }
];
RosterListComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [CHAT_SERVICE_TOKEN,] }] },
{ type: ChatListStateService }
];
RosterListComponent.propDecorators = {
rosterState: [{ type: Input }],
contacts: [{ type: Input }],
contactRequestsReceived$: [{ type: Input }],
contactRequestsSent$: [{ type: Input }],
contactsUnaffiliated$: [{ type: Input }],
rosterStateChanged: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1saXN0L3Jvc3Rlci1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBZSxNQUFNLDZCQUE2QixDQUFDO0FBNkI5RSxNQUFNLE9BQU8sbUJBQW1CO0lBd0I1QixZQUErQyxXQUF3QixFQUNuRCxlQUFxQztRQURWLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ25ELG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUx6RCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQU14RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztTQUN4RDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUM7U0FDN0U7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQztTQUN2RTtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRO1lBQ2IsSUFBSSxDQUFDLHdCQUF3QjtZQUM3QixJQUFJLENBQUMsb0JBQW9CO1lBQ3pCLElBQUksQ0FBQyxxQkFBcUI7U0FDN0IsQ0FBQyxDQUFDLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUNqSSxDQUFDO0lBQ04sQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQW9CO1FBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7WUF0RkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLGkrSkFBMkM7Z0JBRTNDLFVBQVUsRUFBRTtvQkFDUixPQUFPLENBQUMsa0JBQWtCLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDOzRCQUNsQixLQUFLLEVBQUUsT0FBTzt5QkFDakIsQ0FBQyxDQUFDO3dCQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDOzRCQUNqQixLQUFLLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7d0JBQ0gsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDcEQsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDdkQsQ0FBQztvQkFDRixPQUFPLENBQUMsa0JBQWtCLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDOzRCQUNsQixLQUFLLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7d0JBQ0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7NEJBQ2pCLEtBQUssRUFBRSxNQUFNO3lCQUNoQixDQUFDLENBQUM7d0JBQ0gsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDcEQsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDdkQsQ0FBQztpQkFDTDs7YUFDSjs7OzRDQXlCZ0IsTUFBTSxTQUFDLGtCQUFrQjtZQXREakMsb0JBQW9COzs7MEJBZ0N4QixLQUFLO3VCQUdMLEtBQUs7dUNBR0wsS0FBSzttQ0FHTCxLQUFLO29DQUdMLEtBQUs7aUNBS0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbnRhY3QgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnRhY3QnO1xyXG5pbXBvcnQgeyBSZWNpcGllbnQgfSBmcm9tICcuLi8uLi9jb3JlL3JlY2lwaWVudCc7XHJcbmltcG9ydCB7IE11bHRpVXNlckNoYXRQbHVnaW4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvbXVsdGktdXNlci1jaGF0LnBsdWdpbic7XHJcbmltcG9ydCB7IENoYXRMaXN0U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhdC1saXN0LXN0YXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDSEFUX1NFUlZJQ0VfVE9LRU4sIENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhdC1zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZ3gtY2hhdC1yb3N0ZXItbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcm9zdGVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vcm9zdGVyLWxpc3QuY29tcG9uZW50Lmxlc3MnXSxcclxuICAgIGFuaW1hdGlvbnM6IFtcclxuICAgICAgICB0cmlnZ2VyKCdyb3N0ZXJWaXNpYmlsaXR5JywgW1xyXG4gICAgICAgICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICctMTRlbScsXHJcbiAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgc3RhdGUoJ3Nob3duJywgc3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwZW0nLFxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiBzaG93bicsIGFuaW1hdGUoJzQwMG1zIGVhc2UnKSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3Nob3duID0+IGhpZGRlbicsIGFuaW1hdGUoJzQwMG1zIGVhc2UnKSlcclxuICAgICAgICBdKSxcclxuICAgICAgICB0cmlnZ2VyKCdkcmF3ZXJWaXNpYmlsaXR5JywgW1xyXG4gICAgICAgICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwZW0nLFxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIHN0YXRlKCdzaG93bicsIHN0eWxlKHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnMTRlbScsXHJcbiAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHNob3duJywgYW5pbWF0ZSgnNDAwbXMgZWFzZScpKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignc2hvd24gPT4gaGlkZGVuJywgYW5pbWF0ZSgnNDAwbXMgZWFzZScpKVxyXG4gICAgICAgIF0pXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb3N0ZXJMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcm9zdGVyU3RhdGU6ICdoaWRkZW4nIHwgJ3Nob3duJztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29udGFjdHM6IE9ic2VydmFibGU8Q29udGFjdFtdPjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkOiBPYnNlcnZhYmxlPENvbnRhY3RbXT47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGNvbnRhY3RSZXF1ZXN0c1NlbnQkOiBPYnNlcnZhYmxlPENvbnRhY3RbXT47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGNvbnRhY3RzVW5hZmZpbGlhdGVkJDogT2JzZXJ2YWJsZTxDb250YWN0W10+O1xyXG5cclxuICAgIGhhc05vQ29udGFjdHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcm9zdGVyU3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjwnaGlkZGVuJyB8ICdzaG93bic+KCk7XHJcblxyXG4gICAgbXVsdGlVc2VyQ2hhdFBsdWdpbjogTXVsdGlVc2VyQ2hhdFBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KENIQVRfU0VSVklDRV9UT0tFTikgcHVibGljIGNoYXRTZXJ2aWNlOiBDaGF0U2VydmljZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgY2hhdExpc3RTZXJ2aWNlOiBDaGF0TGlzdFN0YXRlU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMubXVsdGlVc2VyQ2hhdFBsdWdpbiA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0UGx1Z2luKE11bHRpVXNlckNoYXRQbHVnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWN0cykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0c1N1YnNjcmliZWQkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0UmVxdWVzdHNSZWNlaXZlZCQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jb250YWN0UmVxdWVzdHNTZW50JCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RSZXF1ZXN0c1NlbnQkID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0UmVxdWVzdHNTZW50JDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhY3RzVW5hZmZpbGlhdGVkJCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzVW5hZmZpbGlhdGVkJCA9IHRoaXMuY2hhdFNlcnZpY2UuY29udGFjdHNVbmFmZmlsaWF0ZWQkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhc05vQ29udGFjdHMkID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFjdHMsXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RSZXF1ZXN0c1NlbnQkLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzVW5hZmZpbGlhdGVkJCxcclxuICAgICAgICBdKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKFtjb250YWN0cywgcmVjZWl2ZWQsIHNlbnQsIHVuYWZmaWxpYXRlZF0pID0+IGNvbnRhY3RzLmxlbmd0aCArIHJlY2VpdmVkLmxlbmd0aCArIHNlbnQubGVuZ3RoICsgdW5hZmZpbGlhdGVkLmxlbmd0aCA9PT0gMClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2tSZWNpcGllbnQocmVjaXBpZW50OiBSZWNpcGllbnQpIHtcclxuICAgICAgICB0aGlzLmNoYXRMaXN0U2VydmljZS5vcGVuQ2hhdChyZWNpcGllbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZVZpc2liaWxpdHkoKSB7XHJcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnJvc3RlclN0YXRlID09PSAnc2hvd24nID8gJ2hpZGRlbicgOiAnc2hvd24nO1xyXG4gICAgICAgIHRoaXMucm9zdGVyU3RhdGVDaGFuZ2VkLmVtaXQobmV3U3RhdGUpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=