@hsaadawy/ngx-chat
Version:
163 lines • 25.4 kB
JavaScript
import { __awaiter } from "tslib";
import { HttpClient } from '@angular/common/http';
import { Component, ElementRef, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
import { Direction, MessageState } from '../../core/message';
import { extractUrls } from '../../core/utils-links';
import { MessageStatePlugin } from '../../services/adapters/xmpp/plugins/message-state.plugin';
import { XmppChatAdapter } from '../../services/adapters/xmpp/xmpp-chat-adapter.service';
import { CONTACT_CLICK_HANDLER_TOKEN } from '../../services/chat-contact-click-handler';
import { CHAT_SERVICE_TOKEN } from '../../services/chat-service';
import { ReplyMessageEvent } from '../../events/reply-message-event';
import { ForwardMessageEvent } from '../../events/forward-message-event';
export const MAX_IMAGE_SIZE = 250 * 1024;
export class ChatMessageComponent {
constructor(chatService, httpClient, eRef, replyMessageEvent, forwordMessageEvent, contactClickHandler) {
this.chatService = chatService;
this.httpClient = httpClient;
this.eRef = eRef;
this.replyMessageEvent = replyMessageEvent;
this.forwordMessageEvent = forwordMessageEvent;
this.contactClickHandler = contactClickHandler;
this.showForward = false;
this.selectedContact = [];
this.ReplySent = new EventEmitter();
this.showMessageReadState = true;
this.showImagePlaceholder = true;
this.Direction = Direction;
this.showMenu = false;
this.messageStatePlugin = this.chatService.getPlugin(MessageStatePlugin);
}
ngOnInit() {
this.tryFindImageLink();
if (!this.contacts) {
this.contacts = this.chatService.contactsSubscribed$;
}
}
tryFindImageLink() {
if (this.chatService instanceof XmppChatAdapter) {
const candidateUrls = extractUrls(this.message.body);
if (candidateUrls.length === 0) {
this.showImagePlaceholder = false;
return;
}
void this.tryFindEmbedImageUrls(candidateUrls);
}
}
tryFindEmbedImageUrls(candidateUrls) {
return __awaiter(this, void 0, void 0, function* () {
for (const url of candidateUrls) {
try {
const headRequest = yield this.httpClient.head(url, { observe: 'response' }).toPromise();
const contentType = headRequest.headers.get('Content-Type');
const isImage = contentType && contentType.startsWith('image');
const isAudio = url.includes('mp3');
const isVideo = url.includes('ogg') || url.includes('mp4');
if (isImage || isAudio || isVideo) {
this.imageLink = url;
break;
}
}
catch (e) {
}
}
if (!this.imageLink) {
this.showImagePlaceholder = false;
}
});
}
getMessageState() {
if (this.showMessageReadState) {
if (this.message.state) {
return this.message.state;
}
else if (this.messageStatePlugin && this.contact) {
const date = this.message.datetime;
const states = this.messageStatePlugin.getContactMessageState(this.contact.jidBare.toString());
return this.getStateForDate(date, states);
}
}
return undefined;
}
getStateForDate(date, states) {
if (date <= states.lastRecipientSeen) {
return MessageState.RECIPIENT_SEEN;
}
else if (date <= states.lastRecipientReceived) {
return MessageState.RECIPIENT_RECEIVED;
}
else if (date <= states.lastSent) {
return MessageState.SENT;
}
return undefined;
}
onContactClick() {
if (this.contactClickHandler) {
this.contactClickHandler.onClick(this.contact);
}
}
getAvatar() {
if (this.showAvatars) {
if (this.message.direction === Direction.in) {
return this.avatar;
}
else {
return this.chatService.userAvatar$.getValue();
}
}
return undefined;
}
reply(message) {
console.log(message);
// this.replyMessageEvent.changeReplyMessage(message);
this.ReplySent.emit(message);
}
forward(message) {
this.showForward = true;
this.forwardMessage = message;
// this.forwordMessageEvent.changeForwardMessage(`<div class="messageItem">forworded</div>` + message);
}
selectReceiver(contact, event) {
if (event.target.checked) {
this.selectedContact.push(contact);
}
else {
this.selectedContact = this.selectedContact.filter(x => x.jidBare.local != contact.jidBare.local);
}
}
forwordMessage() {
this.selectedContact.forEach((element, index) => {
if (this.forwardMessage.includes("fa-share")) {
this.chatService.sendMessage(element, this.forwardMessage);
}
else {
this.chatService.sendMessage(element, `<div class=""><i style="font-family: 'Font Awesome 5 Pro' !important" class="fas fa-share"></i></div>` + this.forwardMessage);
}
});
this.showForward = false;
}
}
ChatMessageComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-chat-message',
template: "<div style=\" width: 10px;\r\nposition: absolute;\r\ntop: 10px;\r\ndisplay: inline-block;\" class=\"showMenuposition\">\r\n\r\n <i style=\"\r\ncolor: #88898b;\" (click)=\"showMenu=!showMenu\" class=\"fa fa-ellipsis-v\" aria-hidden=\"true\"></i>\r\n <div *ngIf=\"showMenu\" style=\" position: absolute;\r\n top: 15px;\r\n width: 100px;\r\n background: #fff;\r\n right: 5px;\r\n box-shadow: 0 1px 3px grey;\r\n padding: 8px;\r\n z-index: 99;\">\r\n <span role=\"button\" *ngIf=\"message.direction === Direction.in\" (click)=\"reply(message.body);showMenu=false\"\r\n style=\"display: block;padding: 5px;font-size: 14px;\">\r\n <i class=\"fa fa-reply\" aria-hidden=\"true\"></i>\r\n Reply\r\n </span>\r\n\r\n <span role=\"button\" (click)=\"forward(message.body);showMenu=false\"\r\n style=\"display: block;padding: 5px;font-size: 14px\">\r\n <i class=\"fa fa-forward\" aria-hidden=\"true\"></i>\r\n Forward\r\n </span>\r\n </div>\r\n</div>\r\n<div *ngIf=\"showMenu\" (click)=\"showMenu=!showMenu\" style=\"position: fixed;\r\n background-color: transparent;\r\n width: 100%;\r\n height: 100vh;\r\n top: 0;\r\n right: 0;\r\n z-index: 2;\"></div>\r\n\r\n\r\n\r\n\r\n<ngx-chat-message-simple style=\"display: inline-block;\" [imageLink]=\"imageLink\"\r\n [showImagePlaceholder]=\"showImagePlaceholder\" [avatar]=\"getAvatar()\"\r\n [avatarInteractive]=\"message.direction === Direction.in\" (avatarClickHandler)=\"onContactClick()\"\r\n [direction]=\"message.direction\" [messageState]=\"getMessageState()\"\r\n [formattedDate]=\"message.datetime | date:chatService.translations.timeFormat\" [nick]=\"nick\">\r\n <span [ngxChatLinks]=\"message.body\"></span>\r\n</ngx-chat-message-simple>\r\n\r\n\r\n<div *ngIf=\"showForward\" style=\"position: fixed;\r\nbackground: #8080807a;\r\nwidth: 100%;\r\nheight: 100vh;\r\ntop: 0;\r\nright: 0;\r\nz-index: 9999999999999999999999999999900;\" class=\"showforward\">\r\n\r\n <div *ngIf=\"contacts\" class=\"row\" style=\" display: block;\r\n width: 50%;\r\n margin: 3% auto;\r\n padding: 15px;\r\n background: #fff;border-radius: 10px;\">\r\n <p style=\" font-size: 18px;\r\n margin: 0;\r\n margin-bottom: 12px;position: relative;\">Select Contacts <i class=\"fas fa-times\" style=\"font-family: 'Font Awesome 5 Pro' !important;float: right;padding: 0 5px; position: absolute;\r\n right: 0;\r\n top: 4px;\" (click)=\"showForward=false\" aria-hidden=\"true\"></i></p>\r\n <div *ngFor=\"let contact of (contacts | async)\" class=\"col-md-6\"\r\n style=\"width: 50%;display: inline-block;margin:4px 0 0 0; \">\r\n <input type=\"checkbox\" (change)=\"selectReceiver(contact,$event)\">\r\n <div class=\"roster-recipient-name\" style=\"display:inline\">\r\n {{contact.name}}\r\n </div>\r\n\r\n </div>\r\n\r\n <div style=\"width: 100%;display: inline-block;\">\r\n <button type=\"button\" style=\"padding: 8px 20px;float:right\" (click)=\"forwordMessage()\">Forword</button>\r\n </div>\r\n\r\n </div>\r\n\r\n</div>\r\n",
styles: [":host.chat-message--out{align-self:flex-end}:host.chat-message--in{align-self:flex-start}\n"]
},] }
];
ChatMessageComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [CHAT_SERVICE_TOKEN,] }] },
{ type: HttpClient },
{ type: ElementRef },
{ type: ReplyMessageEvent, decorators: [{ type: Inject, args: [ReplyMessageEvent,] }] },
{ type: ForwardMessageEvent, decorators: [{ type: Inject, args: [ForwardMessageEvent,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [CONTACT_CLICK_HANDLER_TOKEN,] }, { type: Optional }] }
];
ChatMessageComponent.propDecorators = {
ReplySent: [{ type: Output }],
showAvatars: [{ type: Input }],
avatar: [{ type: Input }],
message: [{ type: Input }],
nick: [{ type: Input }],
contact: [{ type: Input }],
showMessageReadState: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvY29tcG9uZW50cy9jaGF0LW1lc3NhZ2UvY2hhdC1tZXNzYWdlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLFNBQVMsRUFBVyxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFhLE1BQU0sMkRBQTJELENBQUM7QUFDMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3pGLE9BQU8sRUFBMkIsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQWUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd6RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQU96QyxNQUFNLE9BQU8sb0JBQW9CO0lBdUM3QixZQUN1QyxXQUF3QixFQUNuRCxVQUFzQixFQUN0QixJQUFnQixFQUNVLGlCQUFvQyxFQUNsQyxtQkFBd0MsRUFDcEIsbUJBQTRDO1FBTGpFLGdCQUFXLEdBQVgsV0FBVyxDQUFh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QkFDUCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1Qiwwc0dBQTRDOzthQUUvQzs7OzRDQXlDUSxNQUFNLFNBQUMsa0JBQWtCO1lBNUR6QixVQUFVO1lBQ0MsVUFBVTtZQVFyQixpQkFBaUIsdUJBc0RqQixNQUFNLFNBQUMsaUJBQWlCO1lBckR4QixtQkFBbUIsdUJBc0RuQixNQUFNLFNBQUMsbUJBQW1COzRDQUMxQixNQUFNLFNBQUMsMkJBQTJCLGNBQUcsUUFBUTs7O3dCQXRDakQsTUFBTTswQkFHTixLQUFLO3FCQUdMLEtBQUs7c0JBR0wsS0FBSzttQkFHTCxLQUFLO3NCQUdMLEtBQUs7bUNBR0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250YWN0IH0gZnJvbSAnLi4vLi4vY29yZS9jb250YWN0JztcclxuaW1wb3J0IHsgRGlyZWN0aW9uLCBNZXNzYWdlLCBNZXNzYWdlU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL21lc3NhZ2UnO1xyXG5pbXBvcnQgeyBleHRyYWN0VXJscyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMtbGlua3MnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU3RhdGVQbHVnaW4sIFN0YXRlRGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FkYXB0ZXJzL3htcHAvcGx1Z2lucy9tZXNzYWdlLXN0YXRlLnBsdWdpbic7XHJcbmltcG9ydCB7IFhtcHBDaGF0QWRhcHRlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FkYXB0ZXJzL3htcHAveG1wcC1jaGF0LWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENoYXRDb250YWN0Q2xpY2tIYW5kbGVyLCBDT05UQUNUX0NMSUNLX0hBTkRMRVJfVE9LRU4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGF0LWNvbnRhY3QtY2xpY2staGFuZGxlcic7XHJcbmltcG9ydCB7IENIQVRfU0VSVklDRV9UT0tFTiwgQ2hhdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGF0LXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXBseU1lc3NhZ2VFdmVudCB9IGZyb20gJy4uLy4uL2V2ZW50cy9yZXBseS1tZXNzYWdlLWV2ZW50JztcclxuaW1wb3J0IHsgRm9yd2FyZE1lc3NhZ2VFdmVudCB9IGZyb20gJy4uLy4uL2V2ZW50cy9mb3J3YXJkLW1lc3NhZ2UtZXZlbnQnO1xyXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tICdodHRwJztcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhfSU1BR0VfU0laRSA9IDI1MCAqIDEwMjQ7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd4LWNoYXQtbWVzc2FnZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgc2hvd0ZvcndhcmQgPSBmYWxzZTtcclxuICAgIGNvbnRhY3RzO1xyXG4gICAgc2VsZWN0ZWRDb250YWN0OiBDb250YWN0W10gPSBbXTtcclxuICAgIGZvcndhcmRNZXNzYWdlO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIFJlcGx5U2VudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2hvd0F2YXRhcnM6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGF2YXRhcj86IHN0cmluZztcclxuICAgIHRleHQ7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgbWVzc2FnZTogTWVzc2FnZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgbmljazogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBjb250YWN0OiBDb250YWN0O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzaG93TWVzc2FnZVJlYWRTdGF0ZSA9IHRydWU7XHJcblxyXG4gICAgc2hvd0ltYWdlUGxhY2Vob2xkZXIgPSB0cnVlO1xyXG4gICAgaW1hZ2VMaW5rOiBzdHJpbmc7XHJcblxyXG4gICAgRGlyZWN0aW9uID0gRGlyZWN0aW9uO1xyXG5cclxuXHJcblxyXG4gICAgc2hvd01lbnUgPSBmYWxzZVxyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVN0YXRlUGx1Z2luOiBNZXNzYWdlU3RhdGVQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdChDSEFUX1NFUlZJQ0VfVE9LRU4pIHB1YmxpYyBjaGF0U2VydmljZTogQ2hhdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBASW5qZWN0KFJlcGx5TWVzc2FnZUV2ZW50KSBwdWJsaWMgcmVwbHlNZXNzYWdlRXZlbnQ6IFJlcGx5TWVzc2FnZUV2ZW50LFxyXG4gICAgICAgIEBJbmplY3QoRm9yd2FyZE1lc3NhZ2VFdmVudCkgcHVibGljIGZvcndvcmRNZXNzYWdlRXZlbnQ6IEZvcndhcmRNZXNzYWdlRXZlbnQsXHJcbiAgICAgICAgQEluamVjdChDT05UQUNUX0NMSUNLX0hBTkRMRVJfVE9LRU4pIEBPcHRpb25hbCgpIHB1YmxpYyBjb250YWN0Q2xpY2tIYW5kbGVyOiBDaGF0Q29udGFjdENsaWNrSGFuZGxlclxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU3RhdGVQbHVnaW4gPSB0aGlzLmNoYXRTZXJ2aWNlLmdldFBsdWdpbihNZXNzYWdlU3RhdGVQbHVnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMudHJ5RmluZEltYWdlTGluaygpO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWN0cykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0c1N1YnNjcmliZWQkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeUZpbmRJbWFnZUxpbmsoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhdFNlcnZpY2UgaW5zdGFuY2VvZiBYbXBwQ2hhdEFkYXB0ZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlVXJscyA9IGV4dHJhY3RVcmxzKHRoaXMubWVzc2FnZS5ib2R5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVVcmxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93SW1hZ2VQbGFjZWhvbGRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2b2lkIHRoaXMudHJ5RmluZEVtYmVkSW1hZ2VVcmxzKGNhbmRpZGF0ZVVybHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHRyeUZpbmRFbWJlZEltYWdlVXJscyhjYW5kaWRhdGVVcmxzOiBSZWdFeHBNYXRjaEFycmF5KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgY2FuZGlkYXRlVXJscykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZFJlcXVlc3QgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQuaGVhZCh1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZFJlcXVlc3QuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNJbWFnZSA9IGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0F1ZGlvID0gdXJsLmluY2x1ZGVzKCdtcDMnKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNWaWRlbyA9IHVybC5pbmNsdWRlcygnb2dnJykgfHwgdXJsLmluY2x1ZGVzKCdtcDQnKVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNJbWFnZSB8fCBpc0F1ZGlvIHx8IGlzVmlkZW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlTGluayA9IHVybDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VMaW5rKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0ltYWdlUGxhY2Vob2xkZXIgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWVzc2FnZVN0YXRlKCk6IE1lc3NhZ2VTdGF0ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd01lc3NhZ2VSZWFkU3RhdGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZS5zdGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1lc3NhZ2VTdGF0ZVBsdWdpbiAmJiB0aGlzLmNvbnRhY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLm1lc3NhZ2UuZGF0ZXRpbWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLm1lc3NhZ2VTdGF0ZVBsdWdpbi5nZXRDb250YWN0TWVzc2FnZVN0YXRlKHRoaXMuY29udGFjdC5qaWRCYXJlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGVGb3JEYXRlKGRhdGUsIHN0YXRlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN0YXRlRm9yRGF0ZShkYXRlOiBEYXRlLCBzdGF0ZXM6IFN0YXRlRGF0ZSk6IE1lc3NhZ2VTdGF0ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKGRhdGUgPD0gc3RhdGVzLmxhc3RSZWNpcGllbnRTZWVuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNZXNzYWdlU3RhdGUuUkVDSVBJRU5UX1NFRU47XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlIDw9IHN0YXRlcy5sYXN0UmVjaXBpZW50UmVjZWl2ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VTdGF0ZS5SRUNJUElFTlRfUkVDRUlWRUQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlIDw9IHN0YXRlcy5sYXN0U2VudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWVzc2FnZVN0YXRlLlNFTlQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db250YWN0Q2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFjdENsaWNrSGFuZGxlcikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RDbGlja0hhbmRsZXIub25DbGljayh0aGlzLmNvbnRhY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRBdmF0YXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93QXZhdGFycykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlLmRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLmluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hdmF0YXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGF0U2VydmljZS51c2VyQXZhdGFyJC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICByZXBseShtZXNzYWdlOiBhbnkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcclxuICAgICAgICAvLyB0aGlzLnJlcGx5TWVzc2FnZUV2ZW50LmNoYW5nZVJlcGx5TWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLlJlcGx5U2VudC5lbWl0KG1lc3NhZ2UpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmb3J3YXJkKG1lc3NhZ2U6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0ZvcndhcmQgPSB0cnVlXHJcbiAgICAgICAgdGhpcy5mb3J3YXJkTWVzc2FnZSA9IG1lc3NhZ2VcclxuICAgICAgICAvLyB0aGlzLmZvcndvcmRNZXNzYWdlRXZlbnQuY2hhbmdlRm9yd2FyZE1lc3NhZ2UoYDxkaXYgIGNsYXNzPVwibWVzc2FnZUl0ZW1cIj5mb3J3b3JkZWQ8L2Rpdj5gICsgbWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0UmVjZWl2ZXIoY29udGFjdDogQ29udGFjdCwgZXZlbnQpIHtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb250YWN0LnB1c2goY29udGFjdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbnRhY3QgPSB0aGlzLnNlbGVjdGVkQ29udGFjdC5maWx0ZXIoeCA9PiB4LmppZEJhcmUubG9jYWwgIT0gY29udGFjdC5qaWRCYXJlLmxvY2FsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvcndvcmRNZXNzYWdlKCkge1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29udGFjdC5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3J3YXJkTWVzc2FnZS5pbmNsdWRlcyhcImZhLXNoYXJlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnNlbmRNZXNzYWdlKGVsZW1lbnQsIHRoaXMuZm9yd2FyZE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zZW5kTWVzc2FnZShlbGVtZW50LCBgPGRpdiBjbGFzcz1cIlwiPjxpICBzdHlsZT1cImZvbnQtZmFtaWx5OiAnRm9udCBBd2Vzb21lIDUgUHJvJyAhaW1wb3J0YW50XCIgY2xhc3M9XCJmYXMgZmEtc2hhcmVcIj48L2k+PC9kaXY+YCArIHRoaXMuZm9yd2FyZE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zaG93Rm9yd2FyZCA9IGZhbHNlXHJcbiAgICB9XHJcbn1cclxuIl19