stream-chat-angular 4.66.1 → 5.0.0-v5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/assets/version.d.ts +1 -1
  2. package/{esm2015/assets/version.js → esm2020/assets/version.mjs} +2 -2
  3. package/esm2020/lib/attachment-configuration.service.mjs +185 -0
  4. package/esm2020/lib/attachment-list/attachment-list.component.mjs +205 -0
  5. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +45 -0
  6. package/esm2020/lib/attachment.service.mjs +262 -0
  7. package/esm2020/lib/avatar/avatar.component.mjs +163 -0
  8. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +74 -0
  9. package/esm2020/lib/channel/channel.component.mjs +46 -0
  10. package/esm2020/lib/channel-header/channel-header.component.mjs +79 -0
  11. package/esm2020/lib/channel-list/channel-list-toggle.service.mjs +72 -0
  12. package/esm2020/lib/channel-list/channel-list.component.mjs +60 -0
  13. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  14. package/esm2020/lib/channel.service.mjs +1460 -0
  15. package/esm2020/lib/chat-client.service.mjs +206 -0
  16. package/{esm2015/lib/custom-templates.service.js → esm2020/lib/custom-templates.service.mjs} +3 -3
  17. package/{esm2015/lib/date-parser.service.js → esm2020/lib/date-parser.service.mjs} +3 -3
  18. package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +83 -0
  19. package/esm2020/lib/get-channel-display-text.mjs +14 -0
  20. package/esm2020/lib/get-message-translation.mjs +12 -0
  21. package/esm2020/lib/icon/icon.component.mjs +21 -0
  22. package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +31 -0
  23. package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +31 -0
  24. package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +38 -0
  25. package/esm2020/lib/message/message.component.mjs +418 -0
  26. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +130 -0
  27. package/esm2020/lib/message-actions.service.mjs +119 -0
  28. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  29. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +262 -0
  30. package/{esm2015/lib/message-input/emoji-input.service.js → esm2020/lib/message-input/emoji-input.service.mjs} +3 -3
  31. package/{esm2015/lib/message-input/message-input-config.service.js → esm2020/lib/message-input/message-input-config.service.mjs} +3 -3
  32. package/esm2020/lib/message-input/message-input.component.mjs +443 -0
  33. package/{esm2015/lib/message-input/textarea/textarea.component.js → esm2020/lib/message-input/textarea/textarea.component.mjs} +5 -9
  34. package/esm2020/lib/message-input/textarea.directive.mjs +89 -0
  35. package/esm2020/lib/message-list/group-styles.mjs +52 -0
  36. package/{esm2015/lib/message-list/image-load.service.js → esm2020/lib/message-list/image-load.service.mjs} +3 -3
  37. package/esm2020/lib/message-list/message-list.component.mjs +699 -0
  38. package/esm2020/lib/message-preview.mjs +21 -0
  39. package/esm2020/lib/message-reactions/message-reactions.component.mjs +252 -0
  40. package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs} +3 -3
  41. package/{esm2015/lib/message.service.js → esm2020/lib/message.service.mjs} +4 -4
  42. package/esm2020/lib/modal/modal.component.mjs +69 -0
  43. package/esm2020/lib/notification/notification.component.mjs +20 -0
  44. package/esm2020/lib/notification-list/notification-list.component.mjs +37 -0
  45. package/esm2020/lib/notification.service.mjs +79 -0
  46. package/esm2020/lib/read-by.mjs +12 -0
  47. package/{esm2015/lib/stream-autocomplete-textarea.module.js → esm2020/lib/stream-autocomplete-textarea.module.mjs} +6 -6
  48. package/{esm2015/lib/stream-avatar.module.js → esm2020/lib/stream-avatar.module.mjs} +5 -5
  49. package/{esm2015/lib/stream-chat.module.js → esm2020/lib/stream-chat.module.mjs} +14 -16
  50. package/{esm2015/lib/stream-i18n.service.js → esm2020/lib/stream-i18n.service.mjs} +5 -5
  51. package/{esm2015/lib/stream-textarea.module.js → esm2020/lib/stream-textarea.module.mjs} +6 -6
  52. package/esm2020/lib/theme.service.mjs +123 -0
  53. package/esm2020/lib/thread/thread.component.mjs +51 -0
  54. package/{esm2015/lib/transliteration.service.js → esm2020/lib/transliteration.service.mjs} +3 -3
  55. package/esm2020/lib/types.mjs +2 -0
  56. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +183 -0
  57. package/esm2020/lib/voice-recording/voice-recording.component.mjs +102 -0
  58. package/fesm2015/{stream-chat-angular.js → stream-chat-angular.mjs} +313 -426
  59. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  60. package/fesm2020/stream-chat-angular.mjs +7123 -0
  61. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  62. package/lib/attachment-list/attachment-list.component.d.ts +3 -3
  63. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  64. package/lib/attachment.service.d.ts +0 -1
  65. package/lib/avatar/avatar.component.d.ts +1 -1
  66. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  67. package/lib/channel/channel.component.d.ts +1 -1
  68. package/lib/channel-header/channel-header.component.d.ts +1 -1
  69. package/lib/channel-list/channel-list-toggle.service.d.ts +0 -1
  70. package/lib/channel-list/channel-list.component.d.ts +1 -1
  71. package/lib/channel-preview/channel-preview.component.d.ts +1 -1
  72. package/lib/channel.service.d.ts +7 -7
  73. package/lib/chat-client.service.d.ts +1 -1
  74. package/lib/edit-message-form/edit-message-form.component.d.ts +1 -1
  75. package/lib/get-message-translation.d.ts +1 -1
  76. package/lib/icon/icon.component.d.ts +1 -1
  77. package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  78. package/lib/loading-indicator/loading-indicator.component.d.ts +1 -1
  79. package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  80. package/lib/message/message.component.d.ts +3 -7
  81. package/lib/message-actions-box/message-actions-box.component.d.ts +2 -4
  82. package/lib/message-actions.service.d.ts +0 -1
  83. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  84. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
  85. package/lib/message-input/message-input.component.d.ts +2 -2
  86. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  87. package/lib/message-input/textarea.directive.d.ts +1 -1
  88. package/lib/message-list/group-styles.d.ts +1 -1
  89. package/lib/message-list/message-list.component.d.ts +4 -5
  90. package/lib/message-reactions/message-reactions.component.d.ts +1 -4
  91. package/lib/message.service.d.ts +0 -1
  92. package/lib/modal/modal.component.d.ts +1 -1
  93. package/lib/notification/notification.component.d.ts +1 -1
  94. package/lib/notification-list/notification-list.component.d.ts +2 -2
  95. package/lib/notification.service.d.ts +2 -5
  96. package/lib/stream-chat.module.d.ts +3 -3
  97. package/lib/theme.service.d.ts +1 -2
  98. package/lib/thread/thread.component.d.ts +1 -1
  99. package/lib/types.d.ts +18 -18
  100. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +2 -2
  101. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  102. package/package.json +31 -17
  103. package/src/assets/styles/v2/css/index.css +1 -1
  104. package/src/assets/styles/v2/css/index.layout.css +1 -1
  105. package/src/assets/styles/v2/scss/_base.scss +2 -2
  106. package/src/assets/version.ts +1 -1
  107. package/bundles/stream-chat-angular.umd.js +0 -8445
  108. package/bundles/stream-chat-angular.umd.js.map +0 -1
  109. package/esm2015/lib/attachment-configuration.service.js +0 -186
  110. package/esm2015/lib/attachment-list/attachment-list.component.js +0 -209
  111. package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +0 -49
  112. package/esm2015/lib/attachment.service.js +0 -276
  113. package/esm2015/lib/avatar/avatar.component.js +0 -172
  114. package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +0 -78
  115. package/esm2015/lib/channel/channel.component.js +0 -50
  116. package/esm2015/lib/channel-header/channel-header.component.js +0 -86
  117. package/esm2015/lib/channel-list/channel-list-toggle.service.js +0 -73
  118. package/esm2015/lib/channel-list/channel-list.component.js +0 -67
  119. package/esm2015/lib/channel-preview/channel-preview.component.js +0 -167
  120. package/esm2015/lib/channel.service.js +0 -1487
  121. package/esm2015/lib/chat-client.service.js +0 -211
  122. package/esm2015/lib/edit-message-form/edit-message-form.component.js +0 -87
  123. package/esm2015/lib/get-channel-display-text.js +0 -15
  124. package/esm2015/lib/get-message-translation.js +0 -13
  125. package/esm2015/lib/icon/icon.component.js +0 -25
  126. package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +0 -35
  127. package/esm2015/lib/loading-indicator/loading-indicator.component.js +0 -35
  128. package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +0 -42
  129. package/esm2015/lib/message/message.component.js +0 -436
  130. package/esm2015/lib/message-actions-box/message-actions-box.component.js +0 -137
  131. package/esm2015/lib/message-actions.service.js +0 -114
  132. package/esm2015/lib/message-bounce-prompt/message-bounce-prompt.component.js +0 -80
  133. package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +0 -262
  134. package/esm2015/lib/message-input/message-input.component.js +0 -455
  135. package/esm2015/lib/message-input/textarea.directive.js +0 -90
  136. package/esm2015/lib/message-list/group-styles.js +0 -53
  137. package/esm2015/lib/message-list/message-list.component.js +0 -726
  138. package/esm2015/lib/message-preview.js +0 -7
  139. package/esm2015/lib/message-reactions/message-reactions.component.js +0 -266
  140. package/esm2015/lib/modal/modal.component.js +0 -74
  141. package/esm2015/lib/notification/notification.component.js +0 -24
  142. package/esm2015/lib/notification-list/notification-list.component.js +0 -38
  143. package/esm2015/lib/notification.service.js +0 -79
  144. package/esm2015/lib/read-by.js +0 -13
  145. package/esm2015/lib/theme.service.js +0 -122
  146. package/esm2015/lib/thread/thread.component.js +0 -55
  147. package/esm2015/lib/types.js +0 -2
  148. package/esm2015/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.js +0 -192
  149. package/esm2015/lib/voice-recording/voice-recording.component.js +0 -115
  150. package/fesm2015/stream-chat-angular.js.map +0 -1
  151. /package/{esm2015/assets/i18n/en.js → esm2020/assets/i18n/en.mjs} +0 -0
  152. /package/{esm2015/lib/injection-tokens.js → esm2020/lib/injection-tokens.mjs} +0 -0
  153. /package/{esm2015/lib/is-image-attachment.js → esm2020/lib/is-image-attachment.mjs} +0 -0
  154. /package/{esm2015/lib/is-image-file.js → esm2020/lib/is-image-file.mjs} +0 -0
  155. /package/{esm2015/lib/is-on-separate-date.js → esm2020/lib/is-on-separate-date.mjs} +0 -0
  156. /package/{esm2015/lib/list-users.js → esm2020/lib/list-users.mjs} +0 -0
  157. /package/{esm2015/lib/message-input/textarea.interface.js → esm2020/lib/message-input/textarea.interface.mjs} +0 -0
  158. /package/{esm2015/lib/parse-date.js → esm2020/lib/parse-date.mjs} +0 -0
  159. /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  160. /package/{esm2015/stream-chat-angular.js → esm2020/stream-chat-angular.mjs} +0 -0
  161. /package/{stream-chat-angular.d.ts → index.d.ts} +0 -0
@@ -1,49 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../theme.service";
4
- import * as i2 from "../icon-placeholder/icon-placeholder.component";
5
- import * as i3 from "../loading-indicator-placeholder/loading-indicator-placeholder.component";
6
- import * as i4 from "@angular/common";
7
- import * as i5 from "@ngx-translate/core";
8
- /**
9
- * The `AttachmentPreviewList` component displays a preview of the attachments uploaded to a message. Users can delete attachments using the preview component, or retry upload if it failed previously.
10
- */
11
- export class AttachmentPreviewListComponent {
12
- constructor(themeService) {
13
- /**
14
- * An output to notify the parent component if the user tries to retry a failed upload
15
- */
16
- this.retryAttachmentUpload = new EventEmitter();
17
- /**
18
- * An output to notify the parent component if the user wants to delete a file
19
- */
20
- this.deleteAttachment = new EventEmitter();
21
- this.themeVersion = themeService.themeVersion;
22
- }
23
- attachmentUploadRetried(file) {
24
- this.retryAttachmentUpload.emit(file);
25
- }
26
- attachmentDeleted(upload) {
27
- this.deleteAttachment.emit(upload);
28
- }
29
- trackByFile(_, item) {
30
- return item.file;
31
- }
32
- }
33
- AttachmentPreviewListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentPreviewListComponent, deps: [{ token: i1.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
34
- AttachmentPreviewListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: { attachmentUploads$: "attachmentUploads$" }, outputs: { retryAttachmentUpload: "retryAttachmentUpload", deleteAttachment: "deleteAttachment" }, ngImport: i0, template: "<div\n class=\"rfu-image-previewer\"\n *ngIf=\"(attachmentUploads$ | async)?.length && themeVersion === '1'\"\n>\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"rfu-image-previewer__image\"\n [class.rfu-image-previewer__image--loaded]=\"\n attachmentUpload.state === 'success'\n \"\n data-testclass=\"attachment-image-preview\"\n >\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n class=\"rfu-image-previewer__retry\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n data-testclass=\"upload-retry\"\n >\n <stream-icon-placeholder icon=\"retry\"></stream-icon-placeholder>\n </div>\n <div class=\"rfu-thumbnail__wrapper\">\n <div class=\"rfu-thumbnail__overlay\">\n <div\n class=\"rfu-icon-button\"\n data-testclass=\"file-delete\"\n role=\"button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder\n icon=\"close-no-outline\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n class=\"rfu-thumbnail__image\"\n data-testclass=\"attachment-image\"\n />\n </div>\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n color=\"rgba(255,255,255,0.7)\"\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n ></stream-loading-indicator-placeholder>\n </div>\n <div\n class=\"rfu-file-previewer\"\n *ngIf=\"\n attachmentUpload.type === 'file' || attachmentUpload.type === 'video'\n \"\n data-testclass=\"attachment-file-preview\"\n >\n <ol>\n <li\n class=\"rfu-file-previewer__file\"\n [class.rfu-file-previewer__file--uploading]=\"\n attachmentUpload.state === 'uploading'\n \"\n [class.rfu-file-previewer__file--failed]=\"\n attachmentUpload.state === 'error'\n \"\n >\n <stream-icon-placeholder icon=\"file\"></stream-icon-placeholder>\n\n <a\n data-testclass=\"file-download-link\"\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n download\n >\n {{ attachmentUpload.file.name }}\n <ng-container *ngIf=\"attachmentUpload.state === 'error'\">\n <div\n data-testclass=\"upload-retry\"\n class=\"rfu-file-previewer__failed\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n translate\n >\n streamChat.failed\n </div>\n <div\n class=\"rfu-file-previewer__retry\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n translate\n >\n streamChat.retry\n </div>\n </ng-container>\n </a>\n\n <span\n data-testclass=\"file-delete\"\n class=\"rfu-file-previewer__close-button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder\n icon=\"close-no-outline\"\n ></stream-icon-placeholder>\n </span>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"rfu-file-previewer__loading-indicator\"\n >\n <stream-loading-indicator-placeholder></stream-loading-indicator-placeholder>\n </div>\n </li>\n </ol>\n </div>\n </ng-container>\n</div>\n\n<div\n class=\"str-chat__attachment-preview-list\"\n *ngIf=\"(attachmentUploads$ | async)?.length && themeVersion === '2'\"\n>\n <div class=\"str-chat__attachment-list-scroll-container\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"str-chat__attachment-preview-image\"\n data-testclass=\"attachment-image-preview\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"str-chat__attachment-preview-image-loading\"\n >\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n [size]=\"18\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n class=\"str-chat__attachment-preview-thumbnail\"\n data-testclass=\"attachment-image\"\n />\n </div>\n <div\n class=\"str-chat__attachment-preview-file\"\n *ngIf=\"\n attachmentUpload.type === 'file' || attachmentUpload.type === 'video'\n \"\n data-testclass=\"attachment-file-preview\"\n >\n <stream-icon-placeholder\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n\n <div class=\"str-chat__attachment-preview-file-end\">\n <div class=\"str-chat__attachment-preview-file-name\">\n {{ attachmentUpload.file.name }}\n </div>\n <a\n *ngIf=\"attachmentUpload.state === 'success'\"\n class=\"str-chat__attachment-preview-file-download\"\n data-testclass=\"file-download-link\"\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n download\n >\n <stream-icon-placeholder icon=\"download\"></stream-icon-placeholder>\n </a>\n <stream-loading-indicator-placeholder\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n data-testclass=\"loading-indicator\"\n [size]=\"18\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n\n<ng-template #deleteButton let-attachmentUpload=\"attachmentUpload\">\n <div\n class=\"str-chat__attachment-preview-delete\"\n data-testclass=\"file-delete\"\n role=\"button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder icon=\"close-no-outline\"></stream-icon-placeholder>\n </div>\n</ng-template>\n\n<ng-template #retryButton let-attachmentUpload=\"attachmentUpload\">\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n class=\"str-chat__attachment-preview-error str-chat__attachment-preview-error-{{\n attachmentUpload.type === 'image' ? 'image' : 'file'\n }}\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n data-testclass=\"upload-retry\"\n >\n <stream-icon-placeholder icon=\"retry\"></stream-icon-placeholder>\n </div>\n</ng-template>\n", components: [{ type: i2.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i3.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i4.AsyncPipe } });
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentPreviewListComponent, decorators: [{
36
- type: Component,
37
- args: [{
38
- selector: 'stream-attachment-preview-list',
39
- templateUrl: './attachment-preview-list.component.html',
40
- styles: [],
41
- }]
42
- }], ctorParameters: function () { return [{ type: i1.ThemeService }]; }, propDecorators: { attachmentUploads$: [{
43
- type: Input
44
- }], retryAttachmentUpload: [{
45
- type: Output
46
- }], deleteAttachment: [{
47
- type: Output
48
- }] } });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1wcmV2aWV3LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2F0dGFjaG1lbnQtcHJldmlldy1saXN0L2F0dGFjaG1lbnQtcHJldmlldy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LXByZXZpZXctbGlzdC9hdHRhY2htZW50LXByZXZpZXctbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBS3ZFOztHQUVHO0FBTUgsTUFBTSxPQUFPLDhCQUE4QjtJQWV6QyxZQUFZLFlBQTBCO1FBVnRDOztXQUVHO1FBQ2dCLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDcEU7O1dBRUc7UUFDZ0IscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFJekUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxJQUFVO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQXdCO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFTLEVBQUUsSUFBc0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7OzJIQTdCVSw4QkFBOEI7K0dBQTlCLDhCQUE4QiwrTkNiM0MsbzJSQWdRQTsyRkRuUGEsOEJBQThCO2tCQUwxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFdBQVcsRUFBRSwwQ0FBMEM7b0JBQ3ZELE1BQU0sRUFBRSxFQUFFO2lCQUNYO21HQUtVLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFJYSxxQkFBcUI7c0JBQXZDLE1BQU07Z0JBSVksZ0JBQWdCO3NCQUFsQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXR0YWNobWVudFVwbG9hZCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYEF0dGFjaG1lbnRQcmV2aWV3TGlzdGAgY29tcG9uZW50IGRpc3BsYXlzIGEgcHJldmlldyBvZiB0aGUgYXR0YWNobWVudHMgdXBsb2FkZWQgdG8gYSBtZXNzYWdlLiBVc2VycyBjYW4gZGVsZXRlIGF0dGFjaG1lbnRzIHVzaW5nIHRoZSBwcmV2aWV3IGNvbXBvbmVudCwgb3IgcmV0cnkgdXBsb2FkIGlmIGl0IGZhaWxlZCBwcmV2aW91c2x5LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tYXR0YWNobWVudC1wcmV2aWV3LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXR0YWNobWVudC1wcmV2aWV3LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50UHJldmlld0xpc3RDb21wb25lbnQge1xuICAvKipcbiAgICogQSBzdHJlYW0gdGhhdCBlbWl0cyB0aGUgY3VycmVudCBmaWxlIHVwbG9hZHMgYW5kIHRoZWlyIHN0YXRlc1xuICAgKi9cbiAgQElucHV0KCkgYXR0YWNobWVudFVwbG9hZHMkOiBPYnNlcnZhYmxlPEF0dGFjaG1lbnRVcGxvYWRbXT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBBbiBvdXRwdXQgdG8gbm90aWZ5IHRoZSBwYXJlbnQgY29tcG9uZW50IGlmIHRoZSB1c2VyIHRyaWVzIHRvIHJldHJ5IGEgZmFpbGVkIHVwbG9hZFxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJldHJ5QXR0YWNobWVudFVwbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgLyoqXG4gICAqIEFuIG91dHB1dCB0byBub3RpZnkgdGhlIHBhcmVudCBjb21wb25lbnQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlIGEgZmlsZVxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRlbGV0ZUF0dGFjaG1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEF0dGFjaG1lbnRVcGxvYWQ+KCk7XG4gIHRoZW1lVmVyc2lvbjogJzEnIHwgJzInO1xuXG4gIGNvbnN0cnVjdG9yKHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlKSB7XG4gICAgdGhpcy50aGVtZVZlcnNpb24gPSB0aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uO1xuICB9XG5cbiAgYXR0YWNobWVudFVwbG9hZFJldHJpZWQoZmlsZTogRmlsZSkge1xuICAgIHRoaXMucmV0cnlBdHRhY2htZW50VXBsb2FkLmVtaXQoZmlsZSk7XG4gIH1cblxuICBhdHRhY2htZW50RGVsZXRlZCh1cGxvYWQ6IEF0dGFjaG1lbnRVcGxvYWQpIHtcbiAgICB0aGlzLmRlbGV0ZUF0dGFjaG1lbnQuZW1pdCh1cGxvYWQpO1xuICB9XG5cbiAgdHJhY2tCeUZpbGUoXzogbnVtYmVyLCBpdGVtOiBBdHRhY2htZW50VXBsb2FkKSB7XG4gICAgcmV0dXJuIGl0ZW0uZmlsZTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInJmdS1pbWFnZS1wcmV2aWV3ZXJcIlxuICAqbmdJZj1cIihhdHRhY2htZW50VXBsb2FkcyQgfCBhc3luYyk/Lmxlbmd0aCAmJiB0aGVtZVZlcnNpb24gPT09ICcxJ1wiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdGb3I9XCJcbiAgICAgIGxldCBhdHRhY2htZW50VXBsb2FkIG9mIGF0dGFjaG1lbnRVcGxvYWRzJCB8IGFzeW5jO1xuICAgICAgdHJhY2tCeTogdHJhY2tCeUZpbGVcbiAgICBcIlxuICA+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcIlxuICAgICAgY2xhc3M9XCJyZnUtaW1hZ2UtcHJldmlld2VyX19pbWFnZVwiXG4gICAgICBbY2xhc3MucmZ1LWltYWdlLXByZXZpZXdlcl9faW1hZ2UtLWxvYWRlZF09XCJcbiAgICAgICAgYXR0YWNobWVudFVwbG9hZC5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnXG4gICAgICBcIlxuICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWltYWdlLXByZXZpZXdcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnN0YXRlID09PSAnZXJyb3InXCJcbiAgICAgICAgY2xhc3M9XCJyZnUtaW1hZ2UtcHJldmlld2VyX19yZXRyeVwiXG4gICAgICAgIChjbGljayk9XCJhdHRhY2htZW50VXBsb2FkUmV0cmllZChhdHRhY2htZW50VXBsb2FkLmZpbGUpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImF0dGFjaG1lbnRVcGxvYWRSZXRyaWVkKGF0dGFjaG1lbnRVcGxvYWQuZmlsZSlcIlxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInVwbG9hZC1yZXRyeVwiXG4gICAgICA+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwicmV0cnlcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicmZ1LXRodW1ibmFpbF9fd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmZ1LXRodW1ibmFpbF9fb3ZlcmxheVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwicmZ1LWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZmlsZS1kZWxldGVcIlxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXR0YWNobWVudERlbGV0ZWQoYXR0YWNobWVudFVwbG9hZClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImF0dGFjaG1lbnREZWxldGVkKGF0dGFjaG1lbnRVcGxvYWQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgaWNvbj1cImNsb3NlLW5vLW91dGxpbmVcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW1nXG4gICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnVybCB8fCBhdHRhY2htZW50VXBsb2FkLnByZXZpZXdVcmlcIlxuICAgICAgICAgIHNyYz1cInt7XG4gICAgICAgICAgICBhdHRhY2htZW50VXBsb2FkLnVybFxuICAgICAgICAgICAgICA/IGF0dGFjaG1lbnRVcGxvYWQudXJsXG4gICAgICAgICAgICAgIDogYXR0YWNobWVudFVwbG9hZC5wcmV2aWV3VXJpXG4gICAgICAgICAgfX1cIlxuICAgICAgICAgIGFsdD1cInt7IGF0dGFjaG1lbnRVcGxvYWQuZmlsZS5uYW1lIH19XCJcbiAgICAgICAgICBjbGFzcz1cInJmdS10aHVtYm5haWxfX2ltYWdlXCJcbiAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImF0dGFjaG1lbnQtaW1hZ2VcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyXG4gICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICBjb2xvcj1cInJnYmEoMjU1LDI1NSwyNTUsMC43KVwiXG4gICAgICAgICpuZ0lmPVwiYXR0YWNobWVudFVwbG9hZC5zdGF0ZSA9PT0gJ3VwbG9hZGluZydcIlxuICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicmZ1LWZpbGUtcHJldmlld2VyXCJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGF0dGFjaG1lbnRVcGxvYWQudHlwZSA9PT0gJ2ZpbGUnIHx8IGF0dGFjaG1lbnRVcGxvYWQudHlwZSA9PT0gJ3ZpZGVvJ1xuICAgICAgXCJcbiAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXR0YWNobWVudC1maWxlLXByZXZpZXdcIlxuICAgID5cbiAgICAgIDxvbD5cbiAgICAgICAgPGxpXG4gICAgICAgICAgY2xhc3M9XCJyZnUtZmlsZS1wcmV2aWV3ZXJfX2ZpbGVcIlxuICAgICAgICAgIFtjbGFzcy5yZnUtZmlsZS1wcmV2aWV3ZXJfX2ZpbGUtLXVwbG9hZGluZ109XCJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRVcGxvYWQuc3RhdGUgPT09ICd1cGxvYWRpbmcnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbY2xhc3MucmZ1LWZpbGUtcHJldmlld2VyX19maWxlLS1mYWlsZWRdPVwiXG4gICAgICAgICAgICBhdHRhY2htZW50VXBsb2FkLnN0YXRlID09PSAnZXJyb3InXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiZmlsZVwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJmaWxlLWRvd25sb2FkLWxpbmtcIlxuICAgICAgICAgICAgaHJlZj1cInt7IGF0dGFjaG1lbnRVcGxvYWQudXJsIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhdHRhY2htZW50VXBsb2FkLnVybCA/IG51bGwgOiAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRVcGxvYWQudXJsID8gbnVsbCA6ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgZG93bmxvYWRcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBhdHRhY2htZW50VXBsb2FkLmZpbGUubmFtZSB9fVxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dGFjaG1lbnRVcGxvYWQuc3RhdGUgPT09ICdlcnJvcidcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwidXBsb2FkLXJldHJ5XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJmdS1maWxlLXByZXZpZXdlcl9fZmFpbGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXR0YWNobWVudFVwbG9hZFJldHJpZWQoYXR0YWNobWVudFVwbG9hZC5maWxlKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImF0dGFjaG1lbnRVcGxvYWRSZXRyaWVkKGF0dGFjaG1lbnRVcGxvYWQuZmlsZSlcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgc3RyZWFtQ2hhdC5mYWlsZWRcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJmdS1maWxlLXByZXZpZXdlcl9fcmV0cnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhdHRhY2htZW50VXBsb2FkUmV0cmllZChhdHRhY2htZW50VXBsb2FkLmZpbGUpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXR0YWNobWVudFVwbG9hZFJldHJpZWQoYXR0YWNobWVudFVwbG9hZC5maWxlKVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBzdHJlYW1DaGF0LnJldHJ5XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZmlsZS1kZWxldGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJyZnUtZmlsZS1wcmV2aWV3ZXJfX2Nsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXR0YWNobWVudERlbGV0ZWQoYXR0YWNobWVudFVwbG9hZClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImF0dGFjaG1lbnREZWxldGVkKGF0dGFjaG1lbnRVcGxvYWQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgaWNvbj1cImNsb3NlLW5vLW91dGxpbmVcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudFVwbG9hZC5zdGF0ZSA9PT0gJ3VwbG9hZGluZydcIlxuICAgICAgICAgICAgY2xhc3M9XCJyZnUtZmlsZS1wcmV2aWV3ZXJfX2xvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgPC9vbD5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LXByZXZpZXctbGlzdFwiXG4gICpuZ0lmPVwiKGF0dGFjaG1lbnRVcGxvYWRzJCB8IGFzeW5jKT8ubGVuZ3RoICYmIHRoZW1lVmVyc2lvbiA9PT0gJzInXCJcbj5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LWxpc3Qtc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0Zvcj1cIlxuICAgICAgICBsZXQgYXR0YWNobWVudFVwbG9hZCBvZiBhdHRhY2htZW50VXBsb2FkcyQgfCBhc3luYztcbiAgICAgICAgdHJhY2tCeTogdHJhY2tCeUZpbGVcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnRVcGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1wiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1pbWFnZVwiXG4gICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXR0YWNobWVudC1pbWFnZS1wcmV2aWV3XCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBkZWxldGVCdXR0b247XG4gICAgICAgICAgICBjb250ZXh0OiB7IGF0dGFjaG1lbnRVcGxvYWQ6IGF0dGFjaG1lbnRVcGxvYWQgfVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudFVwbG9hZC5zdGF0ZSA9PT0gJ3VwbG9hZGluZydcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1pbWFnZS1sb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdHJlYW0tbG9hZGluZy1pbmRpY2F0b3ItcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAgICAgW3NpemVdPVwiMThcIlxuICAgICAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgcmV0cnlCdXR0b247XG4gICAgICAgICAgICBjb250ZXh0OiB7IGF0dGFjaG1lbnRVcGxvYWQ6IGF0dGFjaG1lbnRVcGxvYWQgfVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudFVwbG9hZC51cmwgfHwgYXR0YWNobWVudFVwbG9hZC5wcmV2aWV3VXJpXCJcbiAgICAgICAgICBzcmM9XCJ7e1xuICAgICAgICAgICAgYXR0YWNobWVudFVwbG9hZC51cmxcbiAgICAgICAgICAgICAgPyBhdHRhY2htZW50VXBsb2FkLnVybFxuICAgICAgICAgICAgICA6IGF0dGFjaG1lbnRVcGxvYWQucHJldmlld1VyaVxuICAgICAgICAgIH19XCJcbiAgICAgICAgICBhbHQ9XCJ7eyBhdHRhY2htZW50VXBsb2FkLmZpbGUubmFtZSB9fVwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LXRodW1ibmFpbFwiXG4gICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWltYWdlXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LXByZXZpZXctZmlsZVwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgYXR0YWNobWVudFVwbG9hZC50eXBlID09PSAnZmlsZScgfHwgYXR0YWNobWVudFVwbG9hZC50eXBlID09PSAndmlkZW8nXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXR0YWNobWVudC1maWxlLXByZXZpZXdcIlxuICAgICAgPlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICBpY29uPVwidW5zcGVjaWZpZWQtZmlsZXR5cGVcIlxuICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1maWxlLWVuZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWZpbGUtbmFtZVwiPlxuICAgICAgICAgICAge3sgYXR0YWNobWVudFVwbG9hZC5maWxlLm5hbWUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnN0YXRlID09PSAnc3VjY2VzcydcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWZpbGUtZG93bmxvYWRcIlxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJmaWxlLWRvd25sb2FkLWxpbmtcIlxuICAgICAgICAgICAgaHJlZj1cInt7IGF0dGFjaG1lbnRVcGxvYWQudXJsIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhdHRhY2htZW50VXBsb2FkLnVybCA/IG51bGwgOiAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRVcGxvYWQudXJsID8gbnVsbCA6ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgZG93bmxvYWRcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImRvd25sb2FkXCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlclxuICAgICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnN0YXRlID09PSAndXBsb2FkaW5nJ1wiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgICAgIFtzaXplXT1cIjE4XCJcbiAgICAgICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3ItcGxhY2Vob2xkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgYXR0YWNobWVudFVwbG9hZDogYXR0YWNobWVudFVwbG9hZCB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIHJldHJ5QnV0dG9uO1xuICAgICAgICAgICAgY29udGV4dDogeyBhdHRhY2htZW50VXBsb2FkOiBhdHRhY2htZW50VXBsb2FkIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWxldGVCdXR0b24gbGV0LWF0dGFjaG1lbnRVcGxvYWQ9XCJhdHRhY2htZW50VXBsb2FkXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LXByZXZpZXctZGVsZXRlXCJcbiAgICBkYXRhLXRlc3RjbGFzcz1cImZpbGUtZGVsZXRlXCJcbiAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwiYXR0YWNobWVudERlbGV0ZWQoYXR0YWNobWVudFVwbG9hZClcIlxuICAgIChrZXl1cC5lbnRlcik9XCJhdHRhY2htZW50RGVsZXRlZChhdHRhY2htZW50VXBsb2FkKVwiXG4gID5cbiAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImNsb3NlLW5vLW91dGxpbmVcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmV0cnlCdXR0b24gbGV0LWF0dGFjaG1lbnRVcGxvYWQ9XCJhdHRhY2htZW50VXBsb2FkXCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cImF0dGFjaG1lbnRVcGxvYWQuc3RhdGUgPT09ICdlcnJvcidcIlxuICAgIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1lcnJvciBzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWVycm9yLXt7XG4gICAgICBhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICdpbWFnZScgPyAnaW1hZ2UnIDogJ2ZpbGUnXG4gICAgfX1cIlxuICAgIChjbGljayk9XCJhdHRhY2htZW50VXBsb2FkUmV0cmllZChhdHRhY2htZW50VXBsb2FkLmZpbGUpXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwiYXR0YWNobWVudFVwbG9hZFJldHJpZWQoYXR0YWNobWVudFVwbG9hZC5maWxlKVwiXG4gICAgZGF0YS10ZXN0Y2xhc3M9XCJ1cGxvYWQtcmV0cnlcIlxuICA+XG4gICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJyZXRyeVwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,276 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { isImageFile } from './is-image-file';
4
- import { BehaviorSubject } from 'rxjs';
5
- import { isImageAttachment } from './is-image-attachment';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./channel.service";
8
- import * as i2 from "./notification.service";
9
- /**
10
- * The `AttachmentService` manages the uploads of a message input.
11
- */
12
- export class AttachmentService {
13
- constructor(channelService, notificationService) {
14
- this.channelService = channelService;
15
- this.notificationService = notificationService;
16
- this.attachmentUploadInProgressCounterSubject = new BehaviorSubject(0);
17
- this.attachmentUploadsSubject = new BehaviorSubject([]);
18
- this.attachmentUploadInProgressCounter$ =
19
- this.attachmentUploadInProgressCounterSubject.asObservable();
20
- this.attachmentUploads$ = this.attachmentUploadsSubject.asObservable();
21
- }
22
- /**
23
- * Resets the attachments uploads (for example after the message with the attachments sent successfully)
24
- */
25
- resetAttachmentUploads() {
26
- this.attachmentUploadsSubject.next([]);
27
- }
28
- /**
29
- * Uploads the selected files, and creates preview for image files. The result is propagated throught the `attachmentUploads$` stream.
30
- * @param fileList The files selected by the user
31
- * @returns A promise with the result
32
- */
33
- filesSelected(fileList) {
34
- return __awaiter(this, void 0, void 0, function* () {
35
- if (!fileList) {
36
- return;
37
- }
38
- const imageFiles = [];
39
- const dataFiles = [];
40
- const videoFiles = [];
41
- Array.from(fileList).forEach((file) => {
42
- if (isImageFile(file)) {
43
- imageFiles.push(file);
44
- }
45
- else if (file.type.startsWith('video/')) {
46
- videoFiles.push(file);
47
- }
48
- else {
49
- dataFiles.push(file);
50
- }
51
- });
52
- imageFiles.forEach((f) => this.createPreview(f));
53
- const newUploads = [
54
- ...imageFiles.map((file) => ({
55
- file,
56
- state: 'uploading',
57
- type: 'image',
58
- })),
59
- ...videoFiles.map((file) => ({
60
- file,
61
- state: 'uploading',
62
- type: 'video',
63
- })),
64
- ...dataFiles.map((file) => ({
65
- file,
66
- state: 'uploading',
67
- type: 'file',
68
- })),
69
- ];
70
- this.attachmentUploadsSubject.next([
71
- ...this.attachmentUploadsSubject.getValue(),
72
- ...newUploads,
73
- ]);
74
- yield this.uploadAttachments(newUploads);
75
- });
76
- }
77
- /**
78
- * You can add custom `image`, `video` and `file` attachments using this method.
79
- *
80
- * Note: If you just want to use your own CDN for file uploads, you don't necessary need this method, you can just specify you own upload function in the [`ChannelService`](./ChannelService.mdx)
81
- *
82
- * @param attachment
83
- */
84
- addAttachment(attachment) {
85
- attachment.isCustomAttachment = true;
86
- this.createFromAttachments([attachment]);
87
- }
88
- /**
89
- * Retries to upload an attachment.
90
- * @param file
91
- * @returns A promise with the result
92
- */
93
- retryAttachmentUpload(file) {
94
- return __awaiter(this, void 0, void 0, function* () {
95
- const attachmentUploads = this.attachmentUploadsSubject.getValue();
96
- const upload = attachmentUploads.find((u) => u.file === file);
97
- if (!upload) {
98
- return;
99
- }
100
- upload.state = 'uploading';
101
- this.attachmentUploadsSubject.next([...attachmentUploads]);
102
- yield this.uploadAttachments([upload]);
103
- });
104
- }
105
- /**
106
- * Deletes an attachment, the attachment can have any state (`error`, `uploading` or `success`).
107
- * @param upload
108
- */
109
- deleteAttachment(upload) {
110
- var _a;
111
- return __awaiter(this, void 0, void 0, function* () {
112
- const attachmentUploads = this.attachmentUploadsSubject.getValue();
113
- let result;
114
- if (upload.state === 'success' &&
115
- !((_a = upload.fromAttachment) === null || _a === void 0 ? void 0 : _a.isCustomAttachment)) {
116
- try {
117
- yield this.channelService.deleteAttachment(upload);
118
- result = [...attachmentUploads];
119
- const index = attachmentUploads.indexOf(upload);
120
- result.splice(index, 1);
121
- }
122
- catch (error) {
123
- result = attachmentUploads;
124
- this.notificationService.addTemporaryNotification('streamChat.Error deleting attachment');
125
- }
126
- }
127
- else {
128
- result = [...attachmentUploads];
129
- const index = attachmentUploads.indexOf(upload);
130
- result.splice(index, 1);
131
- }
132
- this.attachmentUploadsSubject.next([...result]);
133
- });
134
- }
135
- /**
136
- * Maps the current uploads to a format that can be sent along with the message to the Stream API.
137
- * @returns the attachments
138
- */
139
- mapToAttachments() {
140
- const attachmentUploads = this.attachmentUploadsSubject.getValue();
141
- return attachmentUploads
142
- .filter((r) => r.state === 'success')
143
- .map((r) => {
144
- var _a, _b, _c, _d;
145
- const attachment = {
146
- type: r.type,
147
- };
148
- if (r.fromAttachment) {
149
- return r.fromAttachment;
150
- }
151
- else {
152
- attachment.mime_type = (_a = r.file) === null || _a === void 0 ? void 0 : _a.type;
153
- if (r.type === 'image') {
154
- attachment.fallback = (_b = r.file) === null || _b === void 0 ? void 0 : _b.name;
155
- attachment.image_url = r.url;
156
- }
157
- else {
158
- attachment.asset_url = r.url;
159
- attachment.title = (_c = r.file) === null || _c === void 0 ? void 0 : _c.name;
160
- attachment.file_size = (_d = r.file) === null || _d === void 0 ? void 0 : _d.size;
161
- attachment.thumb_url = r.thumb_url;
162
- }
163
- }
164
- return attachment;
165
- });
166
- }
167
- /**
168
- * Maps attachments received from the Stream API to uploads. This is useful when editing a message.
169
- * @param attachments Attachemnts received with the message
170
- */
171
- createFromAttachments(attachments) {
172
- const attachmentUploads = [];
173
- attachments.forEach((attachment) => {
174
- if (isImageAttachment(attachment)) {
175
- attachmentUploads.push({
176
- url: (attachment.img_url ||
177
- attachment.thumb_url ||
178
- attachment.image_url),
179
- state: 'success',
180
- type: 'image',
181
- file: {
182
- name: attachment.fallback,
183
- type: attachment.mime_type,
184
- },
185
- fromAttachment: attachment,
186
- });
187
- }
188
- else if (attachment.type === 'file' || attachment.type === 'video') {
189
- attachmentUploads.push({
190
- url: attachment.asset_url,
191
- state: 'success',
192
- file: {
193
- name: attachment.title,
194
- size: attachment.file_size,
195
- type: attachment.mime_type,
196
- },
197
- type: attachment.type,
198
- thumb_url: attachment.thumb_url,
199
- fromAttachment: attachment,
200
- });
201
- }
202
- });
203
- if (attachmentUploads.length > 0) {
204
- this.attachmentUploadsSubject.next([
205
- ...this.attachmentUploadsSubject.getValue(),
206
- ...attachmentUploads,
207
- ]);
208
- }
209
- }
210
- createPreview(file) {
211
- const reader = new FileReader();
212
- reader.onload = (event) => {
213
- var _a;
214
- const attachmentUploads = this.attachmentUploadsSubject.getValue();
215
- const upload = attachmentUploads.find((upload) => upload.file === file);
216
- if (!upload) {
217
- return;
218
- }
219
- upload.previewUri = ((_a = event.target) === null || _a === void 0 ? void 0 : _a.result) || undefined;
220
- this.attachmentUploadsSubject.next([...attachmentUploads]);
221
- };
222
- reader.readAsDataURL(file);
223
- }
224
- uploadAttachments(uploads) {
225
- return __awaiter(this, void 0, void 0, function* () {
226
- this.attachmentUploadInProgressCounterSubject.next(this.attachmentUploadInProgressCounterSubject.getValue() + 1);
227
- const result = yield this.channelService.uploadAttachments(uploads);
228
- const attachmentUploads = this.attachmentUploadsSubject.getValue();
229
- result.forEach((r) => {
230
- var _a, _b, _c, _d;
231
- const upload = attachmentUploads.find((upload) => upload.file === r.file);
232
- if (!upload) {
233
- if (r.url) {
234
- void this.channelService.deleteAttachment(r);
235
- }
236
- return;
237
- }
238
- upload.state = r.state;
239
- upload.url = r.url;
240
- upload.thumb_url = r.thumb_url;
241
- if (upload.state === 'error') {
242
- upload.errorReason = r.errorReason;
243
- upload.errorExtraInfo = r.errorExtraInfo;
244
- let errorKey;
245
- const translateParams = { name: upload.file.name };
246
- switch (upload.errorReason) {
247
- case 'file-extension':
248
- errorKey =
249
- 'streamChat.Error uploading file, extension not supported';
250
- translateParams.ext = (_b = (_a = upload.errorExtraInfo) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.param;
251
- break;
252
- case 'file-size':
253
- errorKey =
254
- 'streamChat.Error uploading file, maximum file size exceeded';
255
- translateParams.limit = (_d = (_c = upload.errorExtraInfo) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.param;
256
- break;
257
- default:
258
- errorKey = 'streamChat.Error uploading file';
259
- }
260
- this.notificationService.addTemporaryNotification(errorKey, 'error', undefined, translateParams);
261
- }
262
- });
263
- this.attachmentUploadInProgressCounterSubject.next(this.attachmentUploadInProgressCounterSubject.getValue() - 1);
264
- this.attachmentUploadsSubject.next([...attachmentUploads]);
265
- });
266
- }
267
- }
268
- AttachmentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentService, deps: [{ token: i1.ChannelService }, { token: i2.NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
269
- AttachmentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentService, providedIn: 'root' });
270
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentService, decorators: [{
271
- type: Injectable,
272
- args: [{
273
- providedIn: 'root',
274
- }]
275
- }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.NotificationService }]; } });
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2F0dGFjaG1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUduRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUkxRDs7R0FFRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFpQjVCLFlBQ1UsY0FBOEIsRUFDOUIsbUJBQXdDO1FBRHhDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBUjFDLDZDQUF3QyxHQUM5QyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUN6Qiw2QkFBd0IsR0FBRyxJQUFJLGVBQWUsQ0FDcEQsRUFBRSxDQUNILENBQUM7UUFNQSxJQUFJLENBQUMsa0NBQWtDO1lBQ3JDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0csYUFBYSxDQUFDLFFBQXlCOztZQUMzQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNiLE9BQU87YUFDUjtZQUNELE1BQU0sVUFBVSxHQUFXLEVBQUUsQ0FBQztZ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Q0FBd0MsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQzdELENBQUM7WUFDRixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztLQUFBOzs4R0FwUlUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGaEIsTUFBTTsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNJbWFnZUZpbGUgfSBmcm9tICcuL2lzLWltYWdlLWZpbGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBpc0ltYWdlQXR0YWNobWVudCB9IGZyb20gJy4vaXMtaW1hZ2UtYXR0YWNobWVudCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9ub3RpZmljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50VXBsb2FkLCBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBBdHRhY2htZW50U2VydmljZWAgbWFuYWdlcyB0aGUgdXBsb2FkcyBvZiBhIG1lc3NhZ2UgaW5wdXQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50U2VydmljZTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+IHtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBudW1iZXIgb2YgdXBsb2FkcyBpbiBwcm9ncmVzcy5cbiAgICovXG4gIGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzdGF0ZSBvZiB0aGUgdXBsb2FkcyAoW2BBdHRhY2htZW50VXBsb2FkW11gXShodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvYmxvYi9tYXN0ZXIvcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3R5cGVzLnRzKSksIGl0IGFkZHMgYSBzdGF0ZSAoYHN1Y2Nlc3NgLCBgZXJyb3JgIG9yIGB1cGxvYWRpbmdgKSB0byBlYWNoIGZpbGUgdGhlIHVzZXIgc2VsZWN0cyBmb3IgdXBsb2FkLiBJdCBpcyB1c2VkIGJ5IHRoZSBbYEF0dGFjaG1lbnRQcmV2aWV3TGlzdGBdKC4uL2NvbXBvbmVudHMvQXR0YWNobWVudFByZXZpZXdMaXN0Q29tcG9uZW50Lm1keCkgdG8gZGlzcGxheSB0aGUgYXR0YWNobWVudCBwcmV2aWV3cy5cbiAgICovXG4gIGF0dGFjaG1lbnRVcGxvYWRzJDogT2JzZXJ2YWJsZTxBdHRhY2htZW50VXBsb2FkW10+O1xuICBwcml2YXRlIGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlclN1YmplY3QgPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBhdHRhY2htZW50VXBsb2Fkc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dGFjaG1lbnRVcGxvYWRbXT4oXG4gICAgW11cbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIkID1cbiAgICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzJCA9IHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYXR0YWNobWVudHMgdXBsb2FkcyAoZm9yIGV4YW1wbGUgYWZ0ZXIgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgYXR0YWNobWVudHMgc2VudCBzdWNjZXNzZnVsbHkpXG4gICAqL1xuICByZXNldEF0dGFjaG1lbnRVcGxvYWRzKCkge1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIHNlbGVjdGVkIGZpbGVzLCBhbmQgY3JlYXRlcyBwcmV2aWV3IGZvciBpbWFnZSBmaWxlcy4gVGhlIHJlc3VsdCBpcyBwcm9wYWdhdGVkIHRocm91Z2h0IHRoZSBgYXR0YWNobWVudFVwbG9hZHMkYCBzdHJlYW0uXG4gICAqIEBwYXJhbSBmaWxlTGlzdCBUaGUgZmlsZXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXJcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZmlsZXNTZWxlY3RlZChmaWxlTGlzdDogRmlsZUxpc3QgfCBudWxsKSB7XG4gICAgaWYgKCFmaWxlTGlzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZUZpbGVzOiBGaWxlW10gPSBbXTtcbiAgICBjb25zdCBkYXRhRmlsZXM6IEZpbGVbXSA9IFtdO1xuICAgIGNvbnN0IHZpZGVvRmlsZXM6IEZpbGVbXSA9IFtdO1xuXG4gICAgQXJyYXkuZnJvbShmaWxlTGlzdCkuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKGlzSW1hZ2VGaWxlKGZpbGUpKSB7XG4gICAgICAgIGltYWdlRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSB7XG4gICAgICAgIHZpZGVvRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltYWdlRmlsZXMuZm9yRWFjaCgoZikgPT4gdGhpcy5jcmVhdGVQcmV2aWV3KGYpKTtcbiAgICBjb25zdCBuZXdVcGxvYWRzID0gW1xuICAgICAgLi4uaW1hZ2VGaWxlcy5tYXAoKGZpbGUpID0+ICh7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0YXRlOiAndXBsb2FkaW5nJyBhcyAndXBsb2FkaW5nJyxcbiAgICAgICAgdHlwZTogJ2ltYWdlJyBhcyAnaW1hZ2UnLFxuICAgICAgfSkpLFxuICAgICAgLi4udmlkZW9GaWxlcy5tYXAoKGZpbGUpID0+ICh7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0YXRlOiAndXBsb2FkaW5nJyBhcyAndXBsb2FkaW5nJyxcbiAgICAgICAgdHlwZTogJ3ZpZGVvJyBhcyAndmlkZW8nLFxuICAgICAgfSkpLFxuICAgICAgLi4uZGF0YUZpbGVzLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgc3RhdGU6ICd1cGxvYWRpbmcnIGFzICd1cGxvYWRpbmcnLFxuICAgICAgICB0eXBlOiAnZmlsZScgYXMgJ2ZpbGUnLFxuICAgICAgfSkpLFxuICAgIF07XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QubmV4dChbXG4gICAgICAuLi50aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5nZXRWYWx1ZSgpLFxuICAgICAgLi4ubmV3VXBsb2FkcyxcbiAgICBdKTtcbiAgICBhd2FpdCB0aGlzLnVwbG9hZEF0dGFjaG1lbnRzKG5ld1VwbG9hZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gYWRkIGN1c3RvbSBgaW1hZ2VgLCBgdmlkZW9gIGFuZCBgZmlsZWAgYXR0YWNobWVudHMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIE5vdGU6IElmIHlvdSBqdXN0IHdhbnQgdG8gdXNlIHlvdXIgb3duIENETiBmb3IgZmlsZSB1cGxvYWRzLCB5b3UgZG9uJ3QgbmVjZXNzYXJ5IG5lZWQgdGhpcyBtZXRob2QsIHlvdSBjYW4ganVzdCBzcGVjaWZ5IHlvdSBvd24gdXBsb2FkIGZ1bmN0aW9uIGluIHRoZSBbYENoYW5uZWxTZXJ2aWNlYF0oLi9DaGFubmVsU2VydmljZS5tZHgpXG4gICAqXG4gICAqIEBwYXJhbSBhdHRhY2htZW50XG4gICAqL1xuICBhZGRBdHRhY2htZW50KGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ8VD4pIHtcbiAgICBhdHRhY2htZW50LmlzQ3VzdG9tQXR0YWNobWVudCA9IHRydWU7XG4gICAgdGhpcy5jcmVhdGVGcm9tQXR0YWNobWVudHMoW2F0dGFjaG1lbnRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWVzIHRvIHVwbG9hZCBhbiBhdHRhY2htZW50LlxuICAgKiBAcGFyYW0gZmlsZVxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0XG4gICAqL1xuICBhc3luYyByZXRyeUF0dGFjaG1lbnRVcGxvYWQoZmlsZTogRmlsZSkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVcGxvYWRzID0gdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1cGxvYWQgPSBhdHRhY2htZW50VXBsb2Fkcy5maW5kKCh1KSA9PiB1LmZpbGUgPT09IGZpbGUpO1xuICAgIGlmICghdXBsb2FkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwbG9hZC5zdGF0ZSA9ICd1cGxvYWRpbmcnO1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0Lm5leHQoWy4uLmF0dGFjaG1lbnRVcGxvYWRzXSk7XG4gICAgYXdhaXQgdGhpcy51cGxvYWRBdHRhY2htZW50cyhbdXBsb2FkXSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiBhdHRhY2htZW50LCB0aGUgYXR0YWNobWVudCBjYW4gaGF2ZSBhbnkgc3RhdGUgKGBlcnJvcmAsIGB1cGxvYWRpbmdgIG9yIGBzdWNjZXNzYCkuXG4gICAqIEBwYXJhbSB1cGxvYWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUF0dGFjaG1lbnQodXBsb2FkOiBBdHRhY2htZW50VXBsb2FkKSB7XG4gICAgY29uc3QgYXR0YWNobWVudFVwbG9hZHMgPSB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGxldCByZXN1bHQhOiBBdHRhY2htZW50VXBsb2FkW107XG4gICAgaWYgKFxuICAgICAgdXBsb2FkLnN0YXRlID09PSAnc3VjY2VzcycgJiZcbiAgICAgICF1cGxvYWQuZnJvbUF0dGFjaG1lbnQ/LmlzQ3VzdG9tQXR0YWNobWVudFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsU2VydmljZS5kZWxldGVBdHRhY2htZW50KHVwbG9hZCk7XG4gICAgICAgIHJlc3VsdCA9IFsuLi5hdHRhY2htZW50VXBsb2Fkc107XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYXR0YWNobWVudFVwbG9hZHMuaW5kZXhPZih1cGxvYWQpO1xuICAgICAgICByZXN1bHQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlc3VsdCA9IGF0dGFjaG1lbnRVcGxvYWRzO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGRlbGV0aW5nIGF0dGFjaG1lbnQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFsuLi5hdHRhY2htZW50VXBsb2Fkc107XG4gICAgICBjb25zdCBpbmRleCA9IGF0dGFjaG1lbnRVcGxvYWRzLmluZGV4T2YodXBsb2FkKTtcbiAgICAgIHJlc3VsdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5uZXh0KFsuLi5yZXN1bHRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIHRoZSBjdXJyZW50IHVwbG9hZHMgdG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2VudCBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIHRvIHRoZSBTdHJlYW0gQVBJLlxuICAgKiBAcmV0dXJucyB0aGUgYXR0YWNobWVudHNcbiAgICovXG4gIG1hcFRvQXR0YWNobWVudHMoKSB7XG4gICAgY29uc3QgYXR0YWNobWVudFVwbG9hZHMgPSB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIHJldHVybiBhdHRhY2htZW50VXBsb2Fkc1xuICAgICAgLmZpbHRlcigocikgPT4gci5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnKVxuICAgICAgLm1hcCgocikgPT4ge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICAgIHR5cGU6IHIudHlwZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHIuZnJvbUF0dGFjaG1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gci5mcm9tQXR0YWNobWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRhY2htZW50Lm1pbWVfdHlwZSA9IHIuZmlsZT8udHlwZTtcbiAgICAgICAgICBpZiAoci50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICBhdHRhY2htZW50LmZhbGxiYWNrID0gci5maWxlPy5uYW1lO1xuICAgICAgICAgICAgYXR0YWNobWVudC5pbWFnZV91cmwgPSByLnVybDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXR0YWNobWVudC5hc3NldF91cmwgPSByLnVybDtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQudGl0bGUgPSByLmZpbGU/Lm5hbWU7XG4gICAgICAgICAgICBhdHRhY2htZW50LmZpbGVfc2l6ZSA9IHIuZmlsZT8uc2l6ZTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQudGh1bWJfdXJsID0gci50aHVtYl91cmw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGF0dGFjaG1lbnRzIHJlY2VpdmVkIGZyb20gdGhlIFN0cmVhbSBBUEkgdG8gdXBsb2Fkcy4gVGhpcyBpcyB1c2VmdWwgd2hlbiBlZGl0aW5nIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIGF0dGFjaG1lbnRzIEF0dGFjaGVtbnRzIHJlY2VpdmVkIHdpdGggdGhlIG1lc3NhZ2VcbiAgICovXG4gIGNyZWF0ZUZyb21BdHRhY2htZW50cyhhdHRhY2htZW50czogQXR0YWNobWVudDxUPltdKSB7XG4gICAgY29uc3QgYXR0YWNobWVudFVwbG9hZHM6IEF0dGFjaG1lbnRVcGxvYWRbXSA9IFtdO1xuICAgIGF0dGFjaG1lbnRzLmZvckVhY2goKGF0dGFjaG1lbnQpID0+IHtcbiAgICAgIGlmIChpc0ltYWdlQXR0YWNobWVudChhdHRhY2htZW50KSkge1xuICAgICAgICBhdHRhY2htZW50VXBsb2Fkcy5wdXNoKHtcbiAgICAgICAgICB1cmw6IChhdHRhY2htZW50LmltZ191cmwgfHxcbiAgICAgICAgICAgIGF0dGFjaG1lbnQudGh1bWJfdXJsIHx8XG4gICAgICAgICAgICBhdHRhY2htZW50LmltYWdlX3VybCkgYXMgc3RyaW5nLFxuICAgICAgICAgIHN0YXRlOiAnc3VjY2VzcycsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgICAgICBmaWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBhdHRhY2htZW50LmZhbGxiYWNrLFxuICAgICAgICAgICAgdHlwZTogYXR0YWNobWVudC5taW1lX3R5cGUsXG4gICAgICAgICAgfSBhcyBGaWxlLFxuICAgICAgICAgIGZyb21BdHRhY2htZW50OiBhdHRhY2htZW50LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudC50eXBlID09PSAnZmlsZScgfHwgYXR0YWNobWVudC50eXBlID09PSAndmlkZW8nKSB7XG4gICAgICAgIGF0dGFjaG1lbnRVcGxvYWRzLnB1c2goe1xuICAgICAgICAgIHVybDogYXR0YWNobWVudC5hc3NldF91cmwsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICBmaWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBhdHRhY2htZW50LnRpdGxlLFxuICAgICAgICAgICAgc2l6ZTogYXR0YWNobWVudC5maWxlX3NpemUsXG4gICAgICAgICAgICB0eXBlOiBhdHRhY2htZW50Lm1pbWVfdHlwZSxcbiAgICAgICAgICB9IGFzIEZpbGUsXG4gICAgICAgICAgdHlwZTogYXR0YWNobWVudC50eXBlLFxuICAgICAgICAgIHRodW1iX3VybDogYXR0YWNobWVudC50aHVtYl91cmwsXG4gICAgICAgICAgZnJvbUF0dGFjaG1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGF0dGFjaG1lbnRVcGxvYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAuLi50aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5nZXRWYWx1ZSgpLFxuICAgICAgICAuLi5hdHRhY2htZW50VXBsb2FkcyxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUHJldmlldyhmaWxlOiBGaWxlKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhdHRhY2htZW50VXBsb2FkcyA9IHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBjb25zdCB1cGxvYWQgPSBhdHRhY2htZW50VXBsb2Fkcy5maW5kKCh1cGxvYWQpID0+IHVwbG9hZC5maWxlID09PSBmaWxlKTtcbiAgICAgIGlmICghdXBsb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVwbG9hZC5wcmV2aWV3VXJpID0gZXZlbnQudGFyZ2V0Py5yZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QubmV4dChbLi4uYXR0YWNobWVudFVwbG9hZHNdKTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUgYXMgQmxvYik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwbG9hZEF0dGFjaG1lbnRzKHVwbG9hZHM6IEF0dGFjaG1lbnRVcGxvYWRbXSkge1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyU3ViamVjdC5uZXh0KFxuICAgICAgdGhpcy5hdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXJTdWJqZWN0LmdldFZhbHVlKCkgKyAxXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVwbG9hZEF0dGFjaG1lbnRzKHVwbG9hZHMpO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVcGxvYWRzID0gdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICByZXN1bHQuZm9yRWFjaCgocikgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkID0gYXR0YWNobWVudFVwbG9hZHMuZmluZCgodXBsb2FkKSA9PiB1cGxvYWQuZmlsZSA9PT0gci5maWxlKTtcbiAgICAgIGlmICghdXBsb2FkKSB7XG4gICAgICAgIGlmIChyLnVybCkge1xuICAgICAgICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5kZWxldGVBdHRhY2htZW50KHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVwbG9hZC5zdGF0ZSA9IHIuc3RhdGU7XG4gICAgICB1cGxvYWQudXJsID0gci51cmw7XG4gICAgICB1cGxvYWQudGh1bWJfdXJsID0gci50aHVtYl91cmw7XG4gICAgICBpZiAodXBsb2FkLnN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICAgIHVwbG9hZC5lcnJvclJlYXNvbiA9IHIuZXJyb3JSZWFzb247XG4gICAgICAgIHVwbG9hZC5lcnJvckV4dHJhSW5mbyA9IHIuZXJyb3JFeHRyYUluZm87XG4gICAgICAgIGxldCBlcnJvcktleTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlUGFyYW1zOiB7IG5hbWU6IHN0cmluZzsgZXh0Pzogc3RyaW5nOyBsaW1pdD86IHN0cmluZyB9ID1cbiAgICAgICAgICB7IG5hbWU6IHVwbG9hZC5maWxlLm5hbWUgfTtcbiAgICAgICAgc3dpdGNoICh1cGxvYWQuZXJyb3JSZWFzb24pIHtcbiAgICAgICAgICBjYXNlICdmaWxlLWV4dGVuc2lvbic6XG4gICAgICAgICAgICBlcnJvcktleSA9XG4gICAgICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIHVwbG9hZGluZyBmaWxlLCBleHRlbnNpb24gbm90IHN1cHBvcnRlZCc7XG4gICAgICAgICAgICB0cmFuc2xhdGVQYXJhbXMuZXh0ID0gdXBsb2FkLmVycm9yRXh0cmFJbmZvPy5bMF0/LnBhcmFtO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZmlsZS1zaXplJzpcbiAgICAgICAgICAgIGVycm9yS2V5ID1cbiAgICAgICAgICAgICAgJ3N0cmVhbUNoYXQuRXJyb3IgdXBsb2FkaW5nIGZpbGUsIG1heGltdW0gZmlsZSBzaXplIGV4Y2VlZGVkJztcbiAgICAgICAgICAgIHRyYW5zbGF0ZVBhcmFtcy5saW1pdCA9IHVwbG9hZC5lcnJvckV4dHJhSW5mbz8uWzBdPy5wYXJhbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcktleSA9ICdzdHJlYW1DaGF0LkVycm9yIHVwbG9hZGluZyBmaWxlJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgIGVycm9yS2V5LFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYW5zbGF0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyU3ViamVjdC5uZXh0KFxuICAgICAgdGhpcy5hdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXJTdWJqZWN0LmdldFZhbHVlKCkgLSAxXG4gICAgKTtcbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5uZXh0KFsuLi5hdHRhY2htZW50VXBsb2Fkc10pO1xuICB9XG59XG4iXX0=
@@ -1,172 +0,0 @@
1
- import { Component, Input, } from '@angular/core';
2
- import { filter } from 'rxjs/operators';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../chat-client.service";
5
- import * as i2 from "@angular/common";
6
- /**
7
- * The `Avatar` component displays the provided image, with fallback to the first letter of the optional name input.
8
- */
9
- export class AvatarComponent {
10
- constructor(chatClientService, ngZone, cdRef) {
11
- this.chatClientService = chatClientService;
12
- this.ngZone = ngZone;
13
- this.cdRef = cdRef;
14
- /**
15
- * The size in pixels of the avatar image.
16
- */
17
- this.size = 32;
18
- /**
19
- * If a channel avatar is displayed, and if the channel has exactly two members a green dot is displayed if the other member is online. Set this flag to `false` to turn off this behavior.
20
- */
21
- this.showOnlineIndicator = true;
22
- /**
23
- * If channel/user image isn't provided the initials of the name of the channel/user is shown instead, you can choose how the initals should be computed
24
- */
25
- this.initialsType = 'first-letter-of-first-word';
26
- this.isError = false;
27
- this.isOnline = false;
28
- this.initials = '';
29
- this.isViewInited = false;
30
- this.subscriptions = [];
31
- }
32
- ngOnInit() {
33
- this.subscriptions.push(this.chatClientService.user$.subscribe((u) => {
34
- if ((u === null || u === void 0 ? void 0 : u.id) !== this.userId) {
35
- this.userId = u === null || u === void 0 ? void 0 : u.id;
36
- if (this.type || this.channel || this.name) {
37
- this.setInitials();
38
- this.setFallbackChannelImage();
39
- this.updateIsOnlineSubscription();
40
- }
41
- if (this.isViewInited) {
42
- this.cdRef.detectChanges();
43
- }
44
- }
45
- }));
46
- }
47
- ngOnChanges(changes) {
48
- if (changes['channel']) {
49
- this.updateIsOnlineSubscription();
50
- }
51
- if (changes.type || changes.name || changes.channel) {
52
- this.setInitials();
53
- }
54
- if (changes.type || changes.channel) {
55
- this.setFallbackChannelImage();
56
- }
57
- }
58
- setFallbackChannelImage() {
59
- if (this.type !== 'channel') {
60
- this.fallbackChannelImage = undefined;
61
- }
62
- else {
63
- const otherMember = this.getOtherMemberIfOneToOneChannel();
64
- if (otherMember) {
65
- this.fallbackChannelImage = otherMember.image;
66
- }
67
- else {
68
- this.fallbackChannelImage = undefined;
69
- }
70
- }
71
- }
72
- setInitials() {
73
- var _a, _b, _c, _d, _e;
74
- let result = '';
75
- if (this.type === 'user') {
76
- result = ((_a = this.name) === null || _a === void 0 ? void 0 : _a.toString()) || '';
77
- }
78
- else if (this.type === 'channel') {
79
- if ((_c = (_b = this.channel) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.name) {
80
- result = (_e = (_d = this.channel) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.name;
81
- }
82
- else {
83
- const otherMember = this.getOtherMemberIfOneToOneChannel();
84
- if (otherMember) {
85
- result = otherMember.name || otherMember.id || '';
86
- }
87
- else {
88
- result = '#';
89
- }
90
- }
91
- }
92
- const words = result.split(' ');
93
- let initials;
94
- if (this.initialsType === 'first-letter-of-each-word') {
95
- initials = words.map((w) => w.charAt(0) || '').join('');
96
- }
97
- else {
98
- initials = words[0].charAt(0) || '';
99
- }
100
- this.initials = initials;
101
- }
102
- updateIsOnlineSubscription() {
103
- var _a, _b;
104
- if (this.channel) {
105
- const otherMember = this.getOtherMemberIfOneToOneChannel();
106
- if (otherMember) {
107
- this.isOnline = otherMember.online || false;
108
- this.isOnlineSubscription = this.chatClientService.events$
109
- .pipe(filter((e) => e.eventType === 'user.presence.changed'))
110
- .subscribe((event) => {
111
- var _a;
112
- if (((_a = event.event.user) === null || _a === void 0 ? void 0 : _a.id) === otherMember.id) {
113
- this.ngZone.run(() => {
114
- var _a;
115
- this.isOnline = ((_a = event.event.user) === null || _a === void 0 ? void 0 : _a.online) || false;
116
- });
117
- }
118
- });
119
- }
120
- else {
121
- this.isOnline = false;
122
- (_a = this.isOnlineSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
123
- }
124
- }
125
- else {
126
- this.isOnline = false;
127
- (_b = this.isOnlineSubscription) === null || _b === void 0 ? void 0 : _b.unsubscribe();
128
- }
129
- }
130
- ngAfterViewInit() {
131
- this.isViewInited = true;
132
- }
133
- getOtherMemberIfOneToOneChannel() {
134
- var _a, _b;
135
- const otherMembers = Object.values(((_b = (_a = this.channel) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.members) || {}).filter((m) => m.user_id !== this.userId);
136
- if (otherMembers.length === 1) {
137
- return otherMembers[0].user;
138
- }
139
- else {
140
- return undefined;
141
- }
142
- }
143
- }
144
- AvatarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AvatarComponent, deps: [{ token: i1.ChatClientService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
145
- AvatarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AvatarComponent, selector: "stream-avatar", inputs: { name: "name", imageUrl: "imageUrl", size: "size", location: "location", channel: "channel", user: "user", type: "type", showOnlineIndicator: "showOnlineIndicator", initialsType: "initialsType" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"str-chat__avatar str-chat__avatar--circle stream-chat__avatar--{{\n location\n }}\"\n title=\"{{ name }}\"\n [ngStyle]=\"{\n flexBasis: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n fontSize:\n initialsType === 'first-letter-of-first-word'\n ? 'calc(var(--str-chat__spacing-px, 1px) * ' + size / 2 + ')'\n : 'calc(var(--str-chat__spacing-px, 1px) * ' + size / 3 + ')',\n height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n lineHeight: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'\n }\"\n>\n <img\n *ngIf=\"(imageUrl || fallbackChannelImage) && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image\"\n src=\"{{ imageUrl || fallbackChannelImage }}\"\n alt=\"{{ initials }}\"\n data-testid=\"avatar-img\"\n (error)=\"isError = true\"\n [ngStyle]=\"{\n flexBasis: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n objectFit: 'cover',\n width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'\n }\"\n fetchpriority=\"high\"\n />\n <ng-template #fallback>\n <div data-testid=\"fallback-img\" class=\"str-chat__avatar-fallback\">\n {{ initials }}\n </div>\n </ng-template>\n <div\n data-testid=\"online-indicator\"\n *ngIf=\"isOnline && showOnlineIndicator\"\n class=\"str-chat__avatar--online-indicator\"\n ></div>\n</div>\n", styles: [""], directives: [{ type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
146
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AvatarComponent, decorators: [{
147
- type: Component,
148
- args: [{
149
- selector: 'stream-avatar',
150
- templateUrl: './avatar.component.html',
151
- styleUrls: ['./avatar.component.scss'],
152
- }]
153
- }], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { name: [{
154
- type: Input
155
- }], imageUrl: [{
156
- type: Input
157
- }], size: [{
158
- type: Input
159
- }], location: [{
160
- type: Input
161
- }], channel: [{
162
- type: Input
163
- }], user: [{
164
- type: Input
165
- }], type: [{
166
- type: Input
167
- }], showOnlineIndicator: [{
168
- type: Input
169
- }], initialsType: [{
170
- type: Input
171
- }] } });
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsS0FBSyxHQUtOLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQVN4Qzs7R0FFRztBQU1ILE1BQU0sT0FBTyxlQUFlO0lBa0QxQixZQUNVLGlCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsS0FBd0I7UUFGeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUExQ2xDOztXQUVHO1FBQ00sU0FBSSxHQUFHLEVBQUUsQ0FBQztRQWlCbkI7O1dBRUc7UUFDTSx3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDcEM7O1dBRUc7UUFDTSxpQkFBWSxHQUVhLDRCQUE0QixDQUFDO1FBQy9ELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBR2QsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO0lBTXhDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFBLENBQUMs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ZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENoYW5uZWwsIFVzZXIgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQXZhdGFyTG9jYXRpb24sXG4gIEF2YXRhclR5cGUsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG59IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYEF2YXRhcmAgY29tcG9uZW50IGRpc3BsYXlzIHRoZSBwcm92aWRlZCBpbWFnZSwgd2l0aCBmYWxsYmFjayB0byB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBvcHRpb25hbCBuYW1lIGlucHV0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tYXZhdGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F2YXRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F2YXRhci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBdmF0YXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBpbWFnZSwgdXNlZCBmb3IgZmFsbGJhY2sgaW1hZ2Ugb3IgaW1hZ2UgdGl0bGUgKGlmIGBpbWFnZVVybGAgaXMgcHJvdmlkZWQpXG4gICAqL1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgVVJMIG9mIHRoZSBpbWFnZSB0byBiZSBkaXNwbGF5ZWQuIElmIHRoZSBpbWFnZSBjYW4ndCBiZSBkaXNwbGF5ZWQgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgbmFtZSBpbnB1dCBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBpbWFnZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIHNpemUgaW4gcGl4ZWxzIG9mIHRoZSBhdmF0YXIgaW1hZ2UuXG4gICAqL1xuICBASW5wdXQoKSBzaXplID0gMzI7XG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gdGhlIGF2YXRhciB3aWxsIGJlIGRpc3BsYXllZCBpblxuICAgKi9cbiAgQElucHV0KCkgbG9jYXRpb246IEF2YXRhckxvY2F0aW9uIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGNoYW5uZWwgdGhlIGF2YXRhciBiZWxvbmdzIHRvIChpZiBhdmF0YXIgb2YgYSBjaGFubmVsIGlzIGRpc3BsYXllZClcbiAgICovXG4gIEBJbnB1dCgpIGNoYW5uZWw/OiBDaGFubmVsPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xuICAvKipcbiAgICogVGhlIHVzZXIgdGhlIGF2YXRhciBiZWxvbmdzIHRvIChpZiBhdmF0YXIgb2YgYSB1c2VyIGlzIGRpc3BsYXllZClcbiAgICovXG4gIEBJbnB1dCgpIHVzZXI/OiBVc2VyPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGF2YXRhcjogY2hhbm5lbCBpZiBjaGFubmVsIGF2YXRhciBpcyBkaXNwbGF5ZWQsIHVzZXIgaWYgdXNlciBhdmF0YXIgaXMgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSB0eXBlOiBBdmF0YXJUeXBlIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogSWYgYSBjaGFubmVsIGF2YXRhciBpcyBkaXNwbGF5ZWQsIGFuZCBpZiB0aGUgY2hhbm5lbCBoYXMgZXhhY3RseSB0d28gbWVtYmVycyBhIGdyZWVuIGRvdCBpcyBkaXNwbGF5ZWQgaWYgdGhlIG90aGVyIG1lbWJlciBpcyBvbmxpbmUuIFNldCB0aGlzIGZsYWcgdG8gYGZhbHNlYCB0byB0dXJuIG9mZiB0aGlzIGJlaGF2aW9yLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd09ubGluZUluZGljYXRvciA9IHRydWU7XG4gIC8qKlxuICAgKiBJZiBjaGFubmVsL3VzZXIgaW1hZ2UgaXNuJ3QgcHJvdmlkZWQgdGhlIGluaXRpYWxzIG9mIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsL3VzZXIgaXMgc2hvd24gaW5zdGVhZCwgeW91IGNhbiBjaG9vc2UgaG93IHRoZSBpbml0YWxzIHNob3VsZCBiZSBjb21wdXRlZFxuICAgKi9cbiAgQElucHV0KCkgaW5pdGlhbHNUeXBlOlxuICAgIHwgJ2ZpcnN0LWxldHRlci1vZi1maXJzdC13b3JkJ1xuICAgIHwgJ2ZpcnN0LWxldHRlci1vZi1lYWNoLXdvcmQnID0gJ2ZpcnN0LWxldHRlci1vZi1maXJzdC13b3JkJztcbiAgaXNFcnJvciA9IGZhbHNlO1xuICBpc09ubGluZSA9IGZhbHNlO1xuICBwcml2YXRlIGlzT25saW5lU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpbml0aWFsczogc3RyaW5nID0gJyc7XG4gIGZhbGxiYWNrQ2hhbm5lbEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcklkPzogc3RyaW5nO1xuICBwcml2YXRlIGlzVmlld0luaXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodSkgPT4ge1xuICAgICAgICBpZiAodT8uaWQgIT09IHRoaXMudXNlcklkKSB7XG4gICAgICAgICAgdGhpcy51c2VySWQgPSB1Py5pZDtcbiAgICAgICAgICBpZiAodGhpcy50eXBlIHx8IHRoaXMuY2hhbm5lbCB8fCB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmFsbGJhY2tDaGFubmVsSW1hZ2UoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSXNPbmxpbmVTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snY2hhbm5lbCddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUlzT25saW5lU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLnR5cGUgfHwgY2hhbmdlcy5uYW1lIHx8IGNoYW5nZXMuY2hhbm5lbCkge1xuICAgICAgdGhpcy5zZXRJbml0aWFscygpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnR5cGUgfHwgY2hhbmdlcy5jaGFubmVsKSB7XG4gICAgICB0aGlzLnNldEZhbGxiYWNrQ2hhbm5lbEltYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRGYWxsYmFja0NoYW5uZWxJbWFnZSgpIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSAnY2hhbm5lbCcpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tDaGFubmVsSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG90aGVyTWVtYmVyID0gdGhpcy5nZXRPdGhlck1lbWJlcklmT25lVG9PbmVDaGFubmVsKCk7XG4gICAgICBpZiAob3RoZXJNZW1iZXIpIHtcbiAgICAgICAgdGhpcy5mYWxsYmFja0NoYW5uZWxJbWFnZSA9IG90aGVyTWVtYmVyLmltYWdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mYWxsYmFja0NoYW5uZWxJbWFnZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRpYWxzKCkge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9ICcnO1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1c2VyJykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5uYW1lPy50b1N0cmluZygpIHx8ICcnO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnY2hhbm5lbCcpIHtcbiAgICAgIGlmICh0aGlzLmNoYW5uZWw/LmRhdGE/Lm5hbWUpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jaGFubmVsPy5kYXRhPy5uYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3RoZXJNZW1iZXIgPSB0aGlzLmdldE90aGVyTWVtYmVySWZPbmVUb09uZUNoYW5uZWwoKTtcbiAgICAgICAgaWYgKG90aGVyTWVtYmVyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gb3RoZXJNZW1iZXIubmFtZSB8fCBvdGhlck1lbWJlci5pZCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSAnIyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3b3JkcyA9IHJlc3VsdC5zcGxpdCgnICcpO1xuICAgIGxldCBpbml0aWFsczogc3RyaW5nO1xuICAgIGlmICh0aGlzLmluaXRpYWxzVHlwZSA9PT0gJ2ZpcnN0LWxldHRlci1vZi1lYWNoLXdvcmQnKSB7XG4gICAgICBpbml0aWFscyA9IHdvcmRzLm1hcCgodykgPT4gdy5jaGFyQXQoMCkgfHwgJycpLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0aWFscyA9IHdvcmRzWzBdLmNoYXJBdCgwKSB8fCAnJztcbiAgICB9XG4gICAgdGhpcy5pbml0aWFscyA9IGluaXRpYWxzO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJc09ubGluZVN1YnNjcmlwdGlvbigpIHtcbiAgICBpZiAodGhpcy5jaGFubmVsKSB7XG4gICAgICBjb25zdCBvdGhlck1lbWJlciA9IHRoaXMuZ2V0T3RoZXJNZW1iZXJJZk9uZVRvT25lQ2hhbm5lbCgpO1xuICAgICAgaWYgKG90aGVyTWVtYmVyKSB7XG4gICAgICAgIHRoaXMuaXNPbmxpbmUgPSBvdGhlck1lbWJlci5vbmxpbmUgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaXNPbmxpbmVTdWJzY3JpcHRpb24gPSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmV2ZW50cyRcbiAgICAgICAgICAucGlwZShmaWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAndXNlci5wcmVzZW5jZS5jaGFuZ2VkJykpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5ldmVudC51c2VyPy5pZCA9PT0gb3RoZXJNZW1iZXIuaWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT25saW5lID0gZXZlbnQuZXZlbnQudXNlcj8ub25saW5lIHx8IGZhbHNlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNPbmxpbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc09ubGluZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc09ubGluZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pc09ubGluZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZXdJbml0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdGhlck1lbWJlcklmT25lVG9PbmVDaGFubmVsKCkge1xuICAgIGNvbnN0IG90aGVyTWVtYmVycyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICB0aGlzLmNoYW5uZWw/LnN0YXRlPy5tZW1iZXJzIHx8IHt9XG4gICAgKS5maWx0ZXIoKG0pID0+IG0udXNlcl9pZCAhPT0gdGhpcy51c2VySWQpO1xuICAgIGlmIChvdGhlck1lbWJlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gb3RoZXJNZW1iZXJzWzBdLnVzZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic3RyLWNoYXRfX2F2YXRhciBzdHItY2hhdF9fYXZhdGFyLS1jaXJjbGUgc3RyZWFtLWNoYXRfX2F2YXRhci0te3tcbiAgICBsb2NhdGlvblxuICB9fVwiXG4gIHRpdGxlPVwie3sgbmFtZSB9fVwiXG4gIFtuZ1N0eWxlXT1cIntcbiAgICBmbGV4QmFzaXM6ICdjYWxjKHZhcigtLXN0ci1jaGF0X19zcGFjaW5nLXB4LCAxcHgpICogJyArIHNpemUgKyAnKScsXG4gICAgZm9udFNpemU6XG4gICAgICBpbml0aWFsc1R5cGUgPT09ICdmaXJzdC1sZXR0ZXItb2YtZmlyc3Qtd29yZCdcbiAgICAgICAgPyAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplIC8gMiArICcpJ1xuICAgICAgICA6ICdjYWxjKHZhcigtLXN0ci1jaGF0X19zcGFjaW5nLXB4LCAxcHgpICogJyArIHNpemUgLyAzICsgJyknLFxuICAgIGhlaWdodDogJ2NhbGModmFyKC0tc3RyLWNoYXRfX3NwYWNpbmctcHgsIDFweCkgKiAnICsgc2l6ZSArICcpJyxcbiAgICBsaW5lSGVpZ2h0OiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknLFxuICAgIHdpZHRoOiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknXG4gIH1cIlxuPlxuICA8aW1nXG4gICAgKm5nSWY9XCIoaW1hZ2VVcmwgfHwgZmFsbGJhY2tDaGFubmVsSW1hZ2UpICYmICFpc0Vycm9yOyBlbHNlIGZhbGxiYWNrXCJcbiAgICBjbGFzcz1cInN0ci1jaGF0X19hdmF0YXItaW1hZ2Ugc3RyLWNoYXRfX2F2YXRhci1pbWFnZVwiXG4gICAgc3JjPVwie3sgaW1hZ2VVcmwgfHwgZmFsbGJhY2tDaGFubmVsSW1hZ2UgfX1cIlxuICAgIGFsdD1cInt7IGluaXRpYWxzIH19XCJcbiAgICBkYXRhLXRlc3RpZD1cImF2YXRhci1pbWdcIlxuICAgIChlcnJvcik9XCJpc0Vycm9yID0gdHJ1ZVwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgZmxleEJhc2lzOiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknLFxuICAgICAgaGVpZ2h0OiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknLFxuICAgICAgb2JqZWN0Rml0OiAnY292ZXInLFxuICAgICAgd2lkdGg6ICdjYWxjKHZhcigtLXN0ci1jaGF0X19zcGFjaW5nLXB4LCAxcHgpICogJyArIHNpemUgKyAnKSdcbiAgICB9XCJcbiAgICBmZXRjaHByaW9yaXR5PVwiaGlnaFwiXG4gIC8+XG4gIDxuZy10ZW1wbGF0ZSAjZmFsbGJhY2s+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImZhbGxiYWNrLWltZ1wiIGNsYXNzPVwic3RyLWNoYXRfX2F2YXRhci1mYWxsYmFja1wiPlxuICAgICAge3sgaW5pdGlhbHMgfX1cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPGRpdlxuICAgIGRhdGEtdGVzdGlkPVwib25saW5lLWluZGljYXRvclwiXG4gICAgKm5nSWY9XCJpc09ubGluZSAmJiBzaG93T25saW5lSW5kaWNhdG9yXCJcbiAgICBjbGFzcz1cInN0ci1jaGF0X19hdmF0YXItLW9ubGluZS1pbmRpY2F0b3JcIlxuICA+PC9kaXY+XG48L2Rpdj5cbiJdfQ==