UNPKG

ngx-tencent-im

Version:
98 lines 27.7 kB
import { Component, Input } from '@angular/core'; import { currentUserProfileSelector } from '../../store/selectors'; import TIM from 'tim-js-sdk'; import * as i0 from "@angular/core"; import * as i1 from "@ngrx/store"; import * as i2 from "../../avatar/avatar.component"; import * as i3 from "../message-status-icon/message-status-icon.component"; import * as i4 from "../message-element/text-element/text-element.component"; import * as i5 from "../message-element/image-element/image-element.component"; import * as i6 from "../message-element/file-element/file-element.component"; import * as i7 from "../message-footer/message-footer.component"; import * as i8 from "../message-header/message-header.component"; import * as i9 from "../message-element/group-tip-element/group-tip-element.component"; import * as i10 from "../message-element/custom-element/custom-element.component"; import * as i11 from "../message-element/group-system-notice-element/group-system-notice-element.component"; import * as i12 from "@angular/common"; export class MessageItemComponent { constructor(store) { this.store = store; this.TIM = TIM; } ngOnInit() { this.subscription = this.store.select(currentUserProfileSelector) .subscribe(res => { this.currentUserProfile = res; }); } // 是否显示头像,群提示消息不显示头像 get showAvatar() { if (this.currentConversation.type === 'C2C' && !this.message.isRevoked) { // C2C且没有撤回的消息 return true; } else if (this.currentConversation.type === 'GROUP' && !this.message.isRevoked) { // group且没有撤回的消息 return this.message.type !== this.TIM.TYPES.MSG_GRP_TIP; } return false; } get currentConversationType() { if (this.currentConversation) { return this.currentConversation.type; } } get avatar() { if (this.currentConversation.type === 'C2C') { return this.isMine ? this.currentUserProfile.avatar : this.currentConversation.userProfile.avatar; } else if (this.currentConversation.type === 'GROUP') { return this.isMine ? this.currentUserProfile.avatar : this.message.avatar; } else { return ''; } } get isMine() { return this.message.flow === 'out'; } get messagePosition() { if (['TIMGroupTipElem', 'TIMGroupSystemNoticeElem'].includes(this.message.type)) { return 'position-center'; } if (this.message.isRevoked) { // 撤回消息 return 'position-center'; } if (this.isMine) { return 'position-right'; } return 'position-left'; } get showMessageHeader() { if (['TIMGroupTipElem', 'TIMGroupSystemNoticeElem'].includes(this.message.type)) { return false; } if (this.message.isRevoked) { // 撤回消息 return false; } return true; } ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } } } MessageItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MessageItemComponent, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Component }); MessageItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: MessageItemComponent, selector: "app-message-item", inputs: { currentConversation: "currentConversation", message: "message" }, ngImport: i0, template: "<div class=\"message-wrapper\" [class]=\"messagePosition\">\r\n <div *ngIf=\"currentConversationType === TIM.TYPES.CONV_C2C\" class=\"c2c-layout\"\r\n [class]=\"messagePosition\">\r\n\r\n <div class=\"col-1\" *ngIf=\"showAvatar\">\r\n <!-- \u5934\u50CF -->\r\n <im-avatar [src]=\"avatar\"></im-avatar>\r\n </div>\r\n <div class=\"col-2\">\r\n <!-- \u6D88\u606F\u4E3B\u4F53 -->\r\n <div class=\"content-wrapper\">\r\n <app-message-status-icon [message]=\"message\" *ngIf=\"isMine\"></app-message-status-icon>\r\n <app-text-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_TEXT\"></app-text-element>\r\n\r\n <app-image-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_IMAGE\"></app-image-element>\r\n\r\n <app-file-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_FILE\"></app-file-element>\r\n </div>\r\n <app-message-footer *ngIf=\"showMessageHeader\" [message]=\"message\"></app-message-footer>\r\n </div>\r\n <div class=\"col-3\">\r\n <!-- \u6D88\u606F\u72B6\u6001 -->\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"currentConversationType === TIM.TYPES.CONV_GROUP\" class=\"group-layout\"\r\n [class]=\"messagePosition\">\r\n <!-- \u5934\u50CF \u7FA4\u7EC4\u6CA1\u6709\u83B7\u53D6\u5355\u4E2A\u5934\u50CF\u7684\u63A5\u53E3\uFF0C\u6682\u65F6\u65E0\u6CD5\u663E\u793A\u5934\u50CF-->\r\n <div class=\"col-1\" *ngIf=\"showAvatar\">\r\n <im-avatar class=\"group-member-avatar\" [src]=\"avatar\">\r\n </im-avatar>\r\n </div>\r\n <div class=\"col-2\">\r\n <!-- \u6D88\u606F\u4E3B\u4F53 -->\r\n <app-message-header *ngIf=\"showMessageHeader\" [message]=\"message\"\r\n [currentConversation]=\"currentConversation\" [currentUserProfile]=\"currentUserProfile\">\r\n </app-message-header>\r\n <div class=\"content-wrapper\">\r\n <app-message-status-icon [message]=\"message\" *ngIf=\"isMine\"></app-message-status-icon>\r\n <app-text-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_TEXT\"></app-text-element>\r\n <app-image-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_IMAGE\"></app-image-element>\r\n <app-file-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_FILE\"></app-file-element>\r\n <app-group-tip-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_GRP_TIP\"></app-group-tip-element>\r\n <app-custom-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_CUSTOM\"></app-custom-element>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <!-- \u6D88\u606F\u72B6\u6001 -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"system-layout\" *ngIf=\"currentConversationType === TIM.TYPES.CONV_SYSTEM\">\r\n <div class=\"col-1\">\r\n <im-avatar [src]=\"avatar\" [type]=\"currentConversationType\"></im-avatar>\r\n </div>\r\n <div class=\"col-2\">\r\n <app-message-header *ngIf=\"showMessageHeader\" [message]=\"message\"\r\n [currentConversation]=\"currentConversation\" [currentUserProfile]=\"currentUserProfile\">\r\n </app-message-header>\r\n <app-group-system-notice-element [message]=\"message\" [payload]=\"message.payload\">\r\n </app-group-system-notice-element>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".message-wrapper{margin:20px 0}.message-wrapper .content-wrapper{display:flex;align-items:center}.group-layout,.c2c-layout,.system-layout{display:flex}.group-layout .group-member-avatar,.c2c-layout .group-member-avatar,.system-layout .group-member-avatar{cursor:pointer}.group-layout .col-2,.c2c-layout .col-2,.system-layout .col-2{display:flex;flex-direction:column}.group-layout .col-3,.c2c-layout .col-3,.system-layout .col-3{width:30px}.group-layout.position-left .col-2,.c2c-layout.position-left .col-2,.system-layout.position-left .col-2{align-items:flex-start}.group-layout.position-right,.c2c-layout.position-right,.system-layout.position-right{flex-direction:row-reverse}.group-layout.position-right .col-2,.c2c-layout.position-right .col-2,.system-layout.position-right .col-2{align-items:flex-end}.group-layout.position-center,.c2c-layout.position-center,.system-layout.position-center{justify-content:center}.c2c-layout .col-2 .base{margin-top:3px}.group-layout .col-2 .chat-bubble{margin-top:5px}:host ::ng-deep .avatar{width:56px;height:56px;border-radius:50%;box-shadow:0 5px 10px #0000001a}\n"], components: [{ type: i2.AvatarComponent, selector: "im-avatar", inputs: ["shape", "size", "type", "title", "src"] }, { type: i3.MessageStatusIconComponent, selector: "app-message-status-icon", inputs: ["message"] }, { type: i4.TextElementComponent, selector: "app-text-element", inputs: ["message", "isMine", "payload"] }, { type: i5.ImageElementComponent, selector: "app-image-element", inputs: ["message", "isMine", "payload", "percent"] }, { type: i6.FileElementComponent, selector: "app-file-element", inputs: ["message", "isMine", "payload"] }, { type: i7.MessageFooterComponent, selector: "app-message-footer", inputs: ["message"] }, { type: i8.MessageHeaderComponent, selector: "app-message-header", inputs: ["message", "currentUserProfile", "currentConversation"] }, { type: i9.GroupTipElementComponent, selector: "app-group-tip-element", inputs: ["message", "isMine", "payload"] }, { type: i10.CustomElementComponent, selector: "app-custom-element", inputs: ["message", "isMine", "payload"] }, { type: i11.GroupSystemNoticeElementComponent, selector: "app-group-system-notice-element", inputs: ["message", "payload"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MessageItemComponent, decorators: [{ type: Component, args: [{ selector: 'app-message-item', template: "<div class=\"message-wrapper\" [class]=\"messagePosition\">\r\n <div *ngIf=\"currentConversationType === TIM.TYPES.CONV_C2C\" class=\"c2c-layout\"\r\n [class]=\"messagePosition\">\r\n\r\n <div class=\"col-1\" *ngIf=\"showAvatar\">\r\n <!-- \u5934\u50CF -->\r\n <im-avatar [src]=\"avatar\"></im-avatar>\r\n </div>\r\n <div class=\"col-2\">\r\n <!-- \u6D88\u606F\u4E3B\u4F53 -->\r\n <div class=\"content-wrapper\">\r\n <app-message-status-icon [message]=\"message\" *ngIf=\"isMine\"></app-message-status-icon>\r\n <app-text-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_TEXT\"></app-text-element>\r\n\r\n <app-image-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_IMAGE\"></app-image-element>\r\n\r\n <app-file-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_FILE\"></app-file-element>\r\n </div>\r\n <app-message-footer *ngIf=\"showMessageHeader\" [message]=\"message\"></app-message-footer>\r\n </div>\r\n <div class=\"col-3\">\r\n <!-- \u6D88\u606F\u72B6\u6001 -->\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"currentConversationType === TIM.TYPES.CONV_GROUP\" class=\"group-layout\"\r\n [class]=\"messagePosition\">\r\n <!-- \u5934\u50CF \u7FA4\u7EC4\u6CA1\u6709\u83B7\u53D6\u5355\u4E2A\u5934\u50CF\u7684\u63A5\u53E3\uFF0C\u6682\u65F6\u65E0\u6CD5\u663E\u793A\u5934\u50CF-->\r\n <div class=\"col-1\" *ngIf=\"showAvatar\">\r\n <im-avatar class=\"group-member-avatar\" [src]=\"avatar\">\r\n </im-avatar>\r\n </div>\r\n <div class=\"col-2\">\r\n <!-- \u6D88\u606F\u4E3B\u4F53 -->\r\n <app-message-header *ngIf=\"showMessageHeader\" [message]=\"message\"\r\n [currentConversation]=\"currentConversation\" [currentUserProfile]=\"currentUserProfile\">\r\n </app-message-header>\r\n <div class=\"content-wrapper\">\r\n <app-message-status-icon [message]=\"message\" *ngIf=\"isMine\"></app-message-status-icon>\r\n <app-text-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_TEXT\"></app-text-element>\r\n <app-image-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_IMAGE\"></app-image-element>\r\n <app-file-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_FILE\"></app-file-element>\r\n <app-group-tip-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_GRP_TIP\"></app-group-tip-element>\r\n <app-custom-element [isMine]=\"isMine\" [message]=\"message\" [payload]=\"message.payload\"\r\n *ngIf=\"message.type === TIM.TYPES.MSG_CUSTOM\"></app-custom-element>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <!-- \u6D88\u606F\u72B6\u6001 -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"system-layout\" *ngIf=\"currentConversationType === TIM.TYPES.CONV_SYSTEM\">\r\n <div class=\"col-1\">\r\n <im-avatar [src]=\"avatar\" [type]=\"currentConversationType\"></im-avatar>\r\n </div>\r\n <div class=\"col-2\">\r\n <app-message-header *ngIf=\"showMessageHeader\" [message]=\"message\"\r\n [currentConversation]=\"currentConversation\" [currentUserProfile]=\"currentUserProfile\">\r\n </app-message-header>\r\n <app-group-system-notice-element [message]=\"message\" [payload]=\"message.payload\">\r\n </app-group-system-notice-element>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".message-wrapper{margin:20px 0}.message-wrapper .content-wrapper{display:flex;align-items:center}.group-layout,.c2c-layout,.system-layout{display:flex}.group-layout .group-member-avatar,.c2c-layout .group-member-avatar,.system-layout .group-member-avatar{cursor:pointer}.group-layout .col-2,.c2c-layout .col-2,.system-layout .col-2{display:flex;flex-direction:column}.group-layout .col-3,.c2c-layout .col-3,.system-layout .col-3{width:30px}.group-layout.position-left .col-2,.c2c-layout.position-left .col-2,.system-layout.position-left .col-2{align-items:flex-start}.group-layout.position-right,.c2c-layout.position-right,.system-layout.position-right{flex-direction:row-reverse}.group-layout.position-right .col-2,.c2c-layout.position-right .col-2,.system-layout.position-right .col-2{align-items:flex-end}.group-layout.position-center,.c2c-layout.position-center,.system-layout.position-center{justify-content:center}.c2c-layout .col-2 .base{margin-top:3px}.group-layout .col-2 .chat-bubble{margin-top:5px}:host ::ng-deep .avatar{width:56px;height:56px;border-radius:50%;box-shadow:0 5px 10px #0000001a}\n"] }] }], ctorParameters: function () { return [{ type: i1.Store }]; }, propDecorators: { currentConversation: [{ type: Input }], message: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZW5jZW50LWltL3NyYy9tZXNzYWdlL21lc3NhZ2UtaXRlbS9tZXNzYWdlLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlbmNlbnQtaW0vc3JjL21lc3NhZ2UvbWVzc2FnZS1pdGVtL21lc3NhZ2UtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFJcEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU83QixNQUFNLE9BQU8sb0JBQW9CO0lBTy9CLFlBQ1UsS0FBWTtRQUFaLFVBQUssR0FBTCxLQUFLLENBQU87UUFQdEIsUUFBRyxHQUFHLEdBQUcsQ0FBQztJQVFOLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQzthQUM5RCxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZixJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixJQUFJLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxjQUFjO1lBQ3RGLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxnQkFBZ0I7WUFDakcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7U0FDekQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLHVCQUF1QjtRQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQyxNQUFNO2dCQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU07Z0JBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztTQUNqRDthQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTTtnQkFDaEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDekI7YUFBTTtZQUNMLE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvRSxPQUFPLGlCQUFpQixDQUFDO1NBQzFCO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU87WUFDbkMsT0FBTyxpQkFBaUIsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU8sZ0JBQWdCLENBQUM7U0FDekI7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0UsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDOztpSEEvRVUsb0JBQW9CO3FHQUFwQixvQkFBb0Isb0lDWmpDLDR6SEF3RUE7MkZENURhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0I7NEZBUW5CLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbnZlcnNhdGlvbiwgTWVzc2FnZSwgUHJvZmlsZSB9IGZyb20gJ3RpbS1qcy1zZGsnO1xyXG5pbXBvcnQgeyBjdXJyZW50VXNlclByb2ZpbGVTZWxlY3RvciB9IGZyb20gJy4uLy4uL3N0b3JlL3NlbGVjdG9ycyc7XHJcbmltcG9ydCBUSU0gZnJvbSAndGltLWpzLXNkayc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1tZXNzYWdlLWl0ZW0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21lc3NhZ2UtaXRlbS5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZXNzYWdlSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBUSU0gPSBUSU07XHJcbiAgY3VycmVudFVzZXJQcm9maWxlOiBQcm9maWxlO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRDb252ZXJzYXRpb246IENvbnZlcnNhdGlvbjtcclxuICBASW5wdXQoKSBtZXNzYWdlOiBNZXNzYWdlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuc3RvcmUuc2VsZWN0KGN1cnJlbnRVc2VyUHJvZmlsZVNlbGVjdG9yKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlclByb2ZpbGUgPSByZXM7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5piv5ZCm5pi+56S65aS05YOP77yM576k5o+Q56S65raI5oGv5LiN5pi+56S65aS05YOPXHJcbiAgZ2V0IHNob3dBdmF0YXIoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Q29udmVyc2F0aW9uLnR5cGUgPT09ICdDMkMnICYmICF0aGlzLm1lc3NhZ2UuaXNSZXZva2VkKSB7IC8vIEMyQ+S4lOayoeacieaSpOWbnueahOa2iOaBr1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50Q29udmVyc2F0aW9uLnR5cGUgPT09ICdHUk9VUCcgJiYgIXRoaXMubWVzc2FnZS5pc1Jldm9rZWQpIHsgLy8gZ3JvdXDkuJTmsqHmnInmkqTlm57nmoTmtojmga9cclxuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZS50eXBlICE9PSB0aGlzLlRJTS5UWVBFUy5NU0dfR1JQX1RJUDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50Q29udmVyc2F0aW9uVHlwZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRDb252ZXJzYXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbnZlcnNhdGlvbi50eXBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF2YXRhcigpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRDb252ZXJzYXRpb24udHlwZSA9PT0gJ0MyQycpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNNaW5lXHJcbiAgICAgICAgPyB0aGlzLmN1cnJlbnRVc2VyUHJvZmlsZS5hdmF0YXJcclxuICAgICAgICA6IHRoaXMuY3VycmVudENvbnZlcnNhdGlvbi51c2VyUHJvZmlsZS5hdmF0YXI7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudENvbnZlcnNhdGlvbi50eXBlID09PSAnR1JPVVAnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzTWluZVxyXG4gICAgICAgID8gdGhpcy5jdXJyZW50VXNlclByb2ZpbGUuYXZhdGFyXHJcbiAgICAgICAgOiB0aGlzLm1lc3NhZ2UuYXZhdGFyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTWluZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2UuZmxvdyA9PT0gJ291dCc7XHJcbiAgfVxyXG5cclxuICBnZXQgbWVzc2FnZVBvc2l0aW9uKCkge1xyXG4gICAgaWYgKFsnVElNR3JvdXBUaXBFbGVtJywgJ1RJTUdyb3VwU3lzdGVtTm90aWNlRWxlbSddLmluY2x1ZGVzKHRoaXMubWVzc2FnZS50eXBlKSkge1xyXG4gICAgICByZXR1cm4gJ3Bvc2l0aW9uLWNlbnRlcic7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tZXNzYWdlLmlzUmV2b2tlZCkgeyAvLyDmkqTlm57mtojmga9cclxuICAgICAgcmV0dXJuICdwb3NpdGlvbi1jZW50ZXInO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNNaW5lKSB7XHJcbiAgICAgIHJldHVybiAncG9zaXRpb24tcmlnaHQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdwb3NpdGlvbi1sZWZ0JztcclxuICB9XHJcblxyXG4gIGdldCBzaG93TWVzc2FnZUhlYWRlcigpIHtcclxuICAgIGlmIChbJ1RJTUdyb3VwVGlwRWxlbScsICdUSU1Hcm91cFN5c3RlbU5vdGljZUVsZW0nXS5pbmNsdWRlcyh0aGlzLm1lc3NhZ2UudHlwZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWVzc2FnZS5pc1Jldm9rZWQpIHsgLy8g5pKk5Zue5raI5oGvXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibWVzc2FnZS13cmFwcGVyXCIgW2NsYXNzXT1cIm1lc3NhZ2VQb3NpdGlvblwiPlxyXG4gIDxkaXYgKm5nSWY9XCJjdXJyZW50Q29udmVyc2F0aW9uVHlwZSA9PT0gVElNLlRZUEVTLkNPTlZfQzJDXCIgY2xhc3M9XCJjMmMtbGF5b3V0XCJcclxuICAgIFtjbGFzc109XCJtZXNzYWdlUG9zaXRpb25cIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIiAqbmdJZj1cInNob3dBdmF0YXJcIj5cclxuICAgICAgPCEtLSDlpLTlg48gLS0+XHJcbiAgICAgIDxpbS1hdmF0YXIgW3NyY109XCJhdmF0YXJcIj48L2ltLWF2YXRhcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgIDwhLS0g5raI5oGv5Li75L2TIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC13cmFwcGVyXCI+XHJcbiAgICAgICAgPGFwcC1tZXNzYWdlLXN0YXR1cy1pY29uIFttZXNzYWdlXT1cIm1lc3NhZ2VcIiAqbmdJZj1cImlzTWluZVwiPjwvYXBwLW1lc3NhZ2Utc3RhdHVzLWljb24+XHJcbiAgICAgICAgPGFwcC10ZXh0LWVsZW1lbnQgW2lzTWluZV09XCJpc01pbmVcIiBbbWVzc2FnZV09XCJtZXNzYWdlXCIgW3BheWxvYWRdPVwibWVzc2FnZS5wYXlsb2FkXCJcclxuICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS50eXBlID09PSBUSU0uVFlQRVMuTVNHX1RFWFRcIj48L2FwcC10ZXh0LWVsZW1lbnQ+XHJcblxyXG4gICAgICAgIDxhcHAtaW1hZ2UtZWxlbWVudCBbaXNNaW5lXT1cImlzTWluZVwiIFttZXNzYWdlXT1cIm1lc3NhZ2VcIiBbcGF5bG9hZF09XCJtZXNzYWdlLnBheWxvYWRcIlxyXG4gICAgICAgICAgKm5nSWY9XCJtZXNzYWdlLnR5cGUgPT09IFRJTS5UWVBFUy5NU0dfSU1BR0VcIj48L2FwcC1pbWFnZS1lbGVtZW50PlxyXG5cclxuICAgICAgICA8YXBwLWZpbGUtZWxlbWVudCBbaXNNaW5lXT1cImlzTWluZVwiIFttZXNzYWdlXT1cIm1lc3NhZ2VcIiBbcGF5bG9hZF09XCJtZXNzYWdlLnBheWxvYWRcIlxyXG4gICAgICAgICAgKm5nSWY9XCJtZXNzYWdlLnR5cGUgPT09IFRJTS5UWVBFUy5NU0dfRklMRVwiPjwvYXBwLWZpbGUtZWxlbWVudD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxhcHAtbWVzc2FnZS1mb290ZXIgKm5nSWY9XCJzaG93TWVzc2FnZUhlYWRlclwiIFttZXNzYWdlXT1cIm1lc3NhZ2VcIj48L2FwcC1tZXNzYWdlLWZvb3Rlcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgIDwhLS0g5raI5oGv54q25oCBIC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJjdXJyZW50Q29udmVyc2F0aW9uVHlwZSA9PT0gVElNLlRZUEVTLkNPTlZfR1JPVVBcIiBjbGFzcz1cImdyb3VwLWxheW91dFwiXHJcbiAgICBbY2xhc3NdPVwibWVzc2FnZVBvc2l0aW9uXCI+XHJcbiAgICA8IS0tIOWktOWDjyDnvqTnu4TmsqHmnInojrflj5bljZXkuKrlpLTlg4/nmoTmjqXlj6PvvIzmmoLml7bml6Dms5XmmL7npLrlpLTlg48tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMVwiICpuZ0lmPVwic2hvd0F2YXRhclwiPlxyXG4gICAgICA8aW0tYXZhdGFyIGNsYXNzPVwiZ3JvdXAtbWVtYmVyLWF2YXRhclwiIFtzcmNdPVwiYXZhdGFyXCI+XHJcbiAgICAgIDwvaW0tYXZhdGFyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgPCEtLSDmtojmga/kuLvkvZMgLS0+XHJcbiAgICAgIDxhcHAtbWVzc2FnZS1oZWFkZXIgKm5nSWY9XCJzaG93TWVzc2FnZUhlYWRlclwiIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxyXG4gICAgICAgIFtjdXJyZW50Q29udmVyc2F0aW9uXT1cImN1cnJlbnRDb252ZXJzYXRpb25cIiBbY3VycmVudFVzZXJQcm9maWxlXT1cImN1cnJlbnRVc2VyUHJvZmlsZVwiPlxyXG4gICAgICA8L2FwcC1tZXNzYWdlLWhlYWRlcj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtd3JhcHBlclwiPlxyXG4gICAgICAgIDxhcHAtbWVzc2FnZS1zdGF0dXMtaWNvbiBbbWVzc2FnZV09XCJtZXNzYWdlXCIgKm5nSWY9XCJpc01pbmVcIj48L2FwcC1tZXNzYWdlLXN0YXR1cy1pY29uPlxyXG4gICAgICAgIDxhcHAtdGV4dC1lbGVtZW50IFtpc01pbmVdPVwiaXNNaW5lXCIgW21lc3NhZ2VdPVwibWVzc2FnZVwiIFtwYXlsb2FkXT1cIm1lc3NhZ2UucGF5bG9hZFwiXHJcbiAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2UudHlwZSA9PT0gVElNLlRZUEVTLk1TR19URVhUXCI+PC9hcHAtdGV4dC1lbGVtZW50PlxyXG4gICAgICAgIDxhcHAtaW1hZ2UtZWxlbWVudCBbaXNNaW5lXT1cImlzTWluZVwiIFttZXNzYWdlXT1cIm1lc3NhZ2VcIiBbcGF5bG9hZF09XCJtZXNzYWdlLnBheWxvYWRcIlxyXG4gICAgICAgICAgKm5nSWY9XCJtZXNzYWdlLnR5cGUgPT09IFRJTS5UWVBFUy5NU0dfSU1BR0VcIj48L2FwcC1pbWFnZS1lbGVtZW50PlxyXG4gICAgICAgIDxhcHAtZmlsZS1lbGVtZW50IFtpc01pbmVdPVwiaXNNaW5lXCIgW21lc3NhZ2VdPVwibWVzc2FnZVwiIFtwYXlsb2FkXT1cIm1lc3NhZ2UucGF5bG9hZFwiXHJcbiAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2UudHlwZSA9PT0gVElNLlRZUEVTLk1TR19GSUxFXCI+PC9hcHAtZmlsZS1lbGVtZW50PlxyXG4gICAgICAgIDxhcHAtZ3JvdXAtdGlwLWVsZW1lbnQgW2lzTWluZV09XCJpc01pbmVcIiBbbWVzc2FnZV09XCJtZXNzYWdlXCIgW3BheWxvYWRdPVwibWVzc2FnZS5wYXlsb2FkXCJcclxuICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS50eXBlID09PSBUSU0uVFlQRVMuTVNHX0dSUF9USVBcIj48L2FwcC1ncm91cC10aXAtZWxlbWVudD5cclxuICAgICAgICA8YXBwLWN1c3RvbS1lbGVtZW50IFtpc01pbmVdPVwiaXNNaW5lXCIgW21lc3NhZ2VdPVwibWVzc2FnZVwiIFtwYXlsb2FkXT1cIm1lc3NhZ2UucGF5bG9hZFwiXHJcbiAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2UudHlwZSA9PT0gVElNLlRZUEVTLk1TR19DVVNUT01cIj48L2FwcC1jdXN0b20tZWxlbWVudD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxyXG4gICAgICA8IS0tIOa2iOaBr+eKtuaAgSAtLT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic3lzdGVtLWxheW91dFwiICpuZ0lmPVwiY3VycmVudENvbnZlcnNhdGlvblR5cGUgPT09IFRJTS5UWVBFUy5DT05WX1NZU1RFTVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgIDxpbS1hdmF0YXIgW3NyY109XCJhdmF0YXJcIiBbdHlwZV09XCJjdXJyZW50Q29udmVyc2F0aW9uVHlwZVwiPjwvaW0tYXZhdGFyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgPGFwcC1tZXNzYWdlLWhlYWRlciAqbmdJZj1cInNob3dNZXNzYWdlSGVhZGVyXCIgW21lc3NhZ2VdPVwibWVzc2FnZVwiXHJcbiAgICAgICAgW2N1cnJlbnRDb252ZXJzYXRpb25dPVwiY3VycmVudENvbnZlcnNhdGlvblwiIFtjdXJyZW50VXNlclByb2ZpbGVdPVwiY3VycmVudFVzZXJQcm9maWxlXCI+XHJcbiAgICAgIDwvYXBwLW1lc3NhZ2UtaGVhZGVyPlxyXG4gICAgICA8YXBwLWdyb3VwLXN5c3RlbS1ub3RpY2UtZWxlbWVudCBbbWVzc2FnZV09XCJtZXNzYWdlXCIgW3BheWxvYWRdPVwibWVzc2FnZS5wYXlsb2FkXCI+XHJcbiAgICAgIDwvYXBwLWdyb3VwLXN5c3RlbS1ub3RpY2UtZWxlbWVudD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19