@banta/sdk 4.0.1 → 4.0.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.
@@ -30,8 +30,8 @@ export class CommentFieldComponent {
30
30
  let root = document.body.querySelector('[ng-version]') || document.body;
31
31
  root.appendChild(this.autocompleteEl.nativeElement);
32
32
  }
33
- showPermissionDenied() {
34
- this._permissionDeniedError.next();
33
+ sendPermissionDenied(message) {
34
+ this._permissionDeniedError.next(message);
35
35
  }
36
36
  showAutoComplete(options) {
37
37
  this.autoCompleteSelected = 0;
@@ -221,7 +221,7 @@ export class CommentFieldComponent {
221
221
  CommentFieldComponent.decorators = [
222
222
  { type: Component, args: [{
223
223
  selector: 'banta-comment-field',
224
- template: "<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + user?.avatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"text-container\">\r\n <div class=\"field-container\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n (keydown)=\"onKeyDown($event)\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending\"\r\n [(ngModel)]=\"text\"></textarea>\r\n </mat-form-field>\r\n <ng-content></ng-content>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n\r\n <a\r\n mat-button\r\n *ngFor=\"let option of autocompleteOptions; index as index\"\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <mat-spinner *ngIf=\"sending\" class=\"icon loading\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <div *ngIf=\"sendError\" class=\"error-message\" [class.expanded]=\"expandError\">\r\n <mat-icon *ngIf=\"sendError\">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <emoji-selector-button\r\n class=\"top-right\"\r\n (selected)=\"insertEmoji($event)\"\r\n ></emoji-selector-button>\r\n </div>\r\n <div class=\"actions\">\r\n <ng-container *ngIf=\"!user\">\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button\r\n *ngIf=\"canComment\"\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!text || sending\"\r\n >\r\n <mat-icon *ngIf=\"!sending\">chevron_right</mat-icon>\r\n <mat-spinner *ngIf=\"sending\" class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n <ng-container *ngIf=\"!sending\">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"sending\">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </span>\r\n\r\n </button>\r\n <button\r\n *ngIf=\"!canComment\"\r\n type=\"button\"\r\n (click)=\"showPermissionDenied()\"\r\n mat-raised-button\r\n color=\"primary\"\r\n >{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>\r\n",
224
+ template: "<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + user?.avatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"text-container\">\r\n <div class=\"field-container\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n (keydown)=\"onKeyDown($event)\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending\"\r\n [(ngModel)]=\"text\"></textarea>\r\n </mat-form-field>\r\n <ng-content></ng-content>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n\r\n <a\r\n mat-button\r\n *ngFor=\"let option of autocompleteOptions; index as index\"\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <mat-spinner *ngIf=\"sending\" class=\"icon loading\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <div *ngIf=\"sendError\" class=\"error-message\" [class.expanded]=\"expandError\">\r\n <mat-icon *ngIf=\"sendError\">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <emoji-selector-button\r\n class=\"top-right\"\r\n (selected)=\"insertEmoji($event)\"\r\n ></emoji-selector-button>\r\n </div>\r\n <div class=\"actions\">\r\n <ng-container *ngIf=\"!user\">\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button\r\n *ngIf=\"canComment\"\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!text || sending\"\r\n >\r\n <mat-icon *ngIf=\"!sending\">chevron_right</mat-icon>\r\n <mat-spinner *ngIf=\"sending\" class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n <ng-container *ngIf=\"!sending\">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"sending\">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </span>\r\n\r\n </button>\r\n <button\r\n *ngIf=\"!canComment\"\r\n type=\"button\"\r\n (click)=\"sendPermissionDenied('')\"\r\n mat-raised-button\r\n color=\"primary\"\r\n >{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>\r\n",
225
225
  styles: ["@-webkit-keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}:host{margin:0 2em 0 0;display:block;-webkit-animation-name:comment-field-appear;animation-name:comment-field-appear;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-delay:.4s;animation-delay:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.avatar-container{width:calc(48px + 1.75em);display:flex;justify-content:flex-end}.avatar-container .avatar{width:48px;height:48px;background:pink;border-radius:100%;background-size:cover;background-repeat:no-repeat;background-position:50%;margin-top:.75em;margin-right:.75em}form{display:flex;padding:.5em;align-items:center}form .text-container{position:relative;display:flex;flex-grow:1}form .text-container textarea{font-size:14pt;width:100%}form .text-container textarea[disabled]{opacity:.5}form .text-container mat-form-field{margin-bottom:1em}form .text-container emoji-selector-button{bottom:0;right:0;position:absolute}form .text-container .error-message,form .text-container mat-spinner.loading{position:absolute;left:.5em;bottom:.5em}form .text-container .error-message{color:#683333;overflow-x:hidden;max-width:1.5em;white-space:nowrap;transition:max-width 2s ease-in-out}form .text-container .error-message.expanded,form .text-container .error-message:hover{max-width:100%}form .text-container .error-message mat-icon{vertical-align:middle}form input[type=text]{background:#000;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}form.new-message{display:flex;align-items:flex-start}form.new-message .field-container{flex-grow:1;display:flex;flex-direction:column}form.new-message mat-form-field{width:100%}form.new-message button{margin:1.25em 0 0}button.send{min-width:9em}textarea{max-height:7em}.autocomplete-container{width:calc(100% - 2em);position:relative;pointer-events:none;top:-2em}.autocomplete{visibility:hidden;pointer-events:none;position:absolute;background:#333;padding:.5em;display:flex;flex-direction:column;z-index:100}.autocomplete.visible{visibility:visible;pointer-events:auto}.autocomplete a{width:100%;text-align:left}.autocomplete a.active{background:#555}@media (max-width:500px){:host{margin:0}.avatar-container{width:auto}.avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}button.send{min-width:auto;margin-top:1.5em}button.send .label{display:none}}"]
226
226
  },] }
227
227
  ];
@@ -249,4 +249,4 @@ CommentFieldComponent.propDecorators = {
249
249
  permissionDeniedError: [{ type: Output }],
250
250
  submit: [{ type: Input }]
251
251
  };
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tZW50cy9jb21tZW50LWZpZWxkL2NvbW1lbnQtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBaUJyQyxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBU2EsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVqQixtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDckMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVuRCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRVAsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDN0IsU0FBSSxHQUFZLEVBQUUsQ0FBQztRQUNWLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbkIsaUJBQVksR0FBRyxTQUFTLENBQUM7UUFDekIsVUFBSyxHQUFHLGdCQUFnQixDQUFDO1FBQ3pCLDBCQUFxQixHQUFHLGFBQWEsQ0FBQztRQUN0QyxnQkFBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNoQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFRbkMsaUJBQVksR0FBWSxFQUFFLENBQUM7UUFFNUIsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQTRCckQsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLHdCQUFtQixHQUEwQixFQUFFLENBQUM7UUE2QmhE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LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgVXNlciB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBDaGF0U291cmNlQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LXNvdXJjZS1iYXNlXCI7XHJcbmltcG9ydCB7IEVNT0pJUyB9IGZyb20gXCIuLi8uLi9lbW9qaVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdXRvQ29tcGxldGVPcHRpb24ge1xyXG4gICAgbGFiZWwgOiBzdHJpbmc7XHJcbiAgICBhY3Rpb24/IDogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIYXNoVGFnIHtcclxuICAgIGhhc2h0YWcgOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbiA6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLWNvbW1lbnQtZmllbGQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnQtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tbWVudC1maWVsZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb21tZW50RmllbGRDb21wb25lbnQge1xyXG5cclxuICAgIEBJbnB1dCgpIHNvdXJjZSA6IENoYXRTb3VyY2VCYXNlO1xyXG4gICAgQElucHV0KCkgdXNlciA6IFVzZXI7XHJcbiAgICBASW5wdXQoKSBjYW5Db21tZW50ID0gdHJ1ZTtcclxuXHJcbiAgICBAT3V0cHV0KCkgc2lnbkluU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgQE91dHB1dCgpIGVkaXRBdmF0YXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgc2VuZGluZyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgc2VuZEVycm9yIDogRXJyb3I7XHJcbiAgICBASW5wdXQoKSBleHBhbmRFcnJvciA9IGZhbHNlO1xyXG4gICAgdGV4dCA6IHN0cmluZyA9ICcnO1xyXG4gICAgQElucHV0KCkgc2VuZExhYmVsID0gJ1NlbmQnO1xyXG4gICAgQElucHV0KCkgc2VuZGluZ0xhYmVsID0gJ1NlbmRpbmcnO1xyXG4gICAgQElucHV0KCkgbGFiZWwgPSAnUG9zdCBhIGNvbW1lbnQnO1xyXG4gICAgQElucHV0KCkgcGVybWlzc2lvbkRlbmllZExhYmVsID0gJ1VuYXZhaWxhYmxlJztcclxuICAgIEBJbnB1dCgpIHNpZ25JbkxhYmVsID0gJ1NpZ24gSW4nO1xyXG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuICAgIEBPdXRwdXQoKSB0ZXh0Q2hhbmdlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBASW5wdXQoKSBzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZD86IChtZXNzYWdlOiBDaGF0TWVzc2FnZSwgc291cmNlOiBDaGF0U291cmNlQmFzZSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlJykgYXV0b2NvbXBsZXRlRWwgOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZUNvbnRhaW5lcicpIGF1dG9jb21wbGV0ZUNvbnRhaW5lckVsIDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgICBAVmlld0NoaWxkKCd0ZXh0YXJlYScpIHRleHRhcmVhRWwgOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xyXG5cclxuICAgIEBJbnB1dCgpIGhhc2h0YWdzIDogSGFzaFRhZ1tdO1xyXG4gICAgQElucHV0KCkgcGFydGljaXBhbnRzIDogVXNlcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfcGVybWlzc2lvbkRlbmllZEVycm9yID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGdldCBwZXJtaXNzaW9uRGVuaWVkRXJyb3IoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IHJvb3QgPSBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12ZXJzaW9uXScpIHx8IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgcm9vdC5hcHBlbmRDaGlsZCh0aGlzLmF1dG9jb21wbGV0ZUVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dQZXJtaXNzaW9uRGVuaWVkKCkge1xyXG4gICAgICAgIHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvci5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0F1dG9Db21wbGV0ZShvcHRpb25zIDogQXV0b0NvbXBsZXRlT3B0aW9uW10pIHtcclxuICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkID0gMDtcclxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIGxldCBwb3MgPSB0aGlzLmF1dG9jb21wbGV0ZUNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgbGV0IHNpemUgPSB0aGlzLmF1dG9jb21wbGV0ZUVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlRWwubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7d2luZG93LnNjcm9sbFggKyBwb3MubGVmdH1weGA7XHJcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVFbC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IGAke3dpbmRvdy5zY3JvbGxZICsgcG9zLnRvcH1weGA7XHJcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVFbC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cG9zLndpZHRofXB4YDtcclxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVZpc2libGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF1dG9jb21wbGV0ZVZpc2libGUgPSBmYWxzZTtcclxuICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgOiBBdXRvQ29tcGxldGVPcHRpb25bXSA9IFtdO1xyXG5cclxuICAgIGFjdGl2YXRlQXV0b0NvbXBsZXRlKG9wdGlvbiA6IEF1dG9Db21wbGV0ZU9wdGlvbikge1xyXG4gICAgICAgIG9wdGlvbi5hY3Rpb24oKTtcclxuICAgICAgICB0aGlzLmRpc21pc3NBdXRvQ29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNtaXNzQXV0b0NvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29tcGxldGlvbkZ1bmMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY29tcGxldGlvblByZWZpeCA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXJyb3JUaW1lb3V0O1xyXG4gICAgaW5kaWNhdGVFcnJvcihtZXNzYWdlIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kRXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5leHBhbmRFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVycm9yVGltZW91dCk7XHJcbiAgICAgICAgdGhpcy5lcnJvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHBhbmRFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDUqMTAwMCk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wbGV0aW9uRnVuYyA6IChzdHIgOiBzdHJpbmcpID0+IEF1dG9Db21wbGV0ZU9wdGlvbltdO1xyXG5cclxuICAgIGNvbXBsZXRpb25QcmVmaXggOiBzdHJpbmc7XHJcbiAgICBhdXRvQ29tcGxldGVTZWxlY3RlZCA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYXN5bmMgYXV0b2NvbXBsZXRlKHJlcGxhY2VtZW50IDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGVsID0gdGhpcy50ZXh0YXJlYUVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnNsaWNlKDAsIGVsLnNlbGVjdGlvblN0YXJ0IC0gdGhpcy5jb21wbGV0aW9uUHJlZml4Lmxlbmd0aCkgKyByZXBsYWNlbWVudCArIHRoaXMudGV4dC5zbGljZShlbC5zZWxlY3Rpb25TdGFydCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5zZXJ0KHN0ciA6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBlbCA9IHRoaXMudGV4dGFyZWFFbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBlbC5zZWxlY3Rpb25TdGFydCkgKyBzdHIgKyB0aGlzLnRleHQuc2xpY2UoZWwuc2VsZWN0aW9uU3RhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uS2V5RG93bihldmVudCA6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NBdXRvQ29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1NoaWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlQXV0b0NvbXBsZXRlKHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9uc1t0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkXSk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0NvbXBsZXRlU2VsZWN0ZWQgPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVTZWxlY3RlZCA9IHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlU2VsZWN0ZWQgPSB0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkIC0gMTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkID0gKHRoaXMuYXV0b0NvbXBsZXRlU2VsZWN0ZWQgKyAxKSAlIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRpb25GdW5jKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRpb25QcmVmaXggPSB0aGlzLmNvbXBsZXRpb25QcmVmaXguc2xpY2UoMCwgdGhpcy5jb21wbGV0aW9uUHJlZml4Lmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRpb25QcmVmaXggPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzQXV0b0NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJyAnIHx8IGV2ZW50LmtleS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NBdXRvQ29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGlvblByZWZpeCArPSBldmVudC5rZXk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0F1dG9Db21wbGV0ZSh0aGlzLmNvbXBsZXRpb25GdW5jKHRoaXMuY29tcGxldGlvblByZWZpeCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICc6Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9Db21wbGV0ZShldmVudCwgcHJlZml4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXguc2xpY2UoMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIDotKSwgOi0oIGV0YyB3b3JrIChhcyB0aGV5IGFyZSBcIjopXCIgZXRjIGluIHRoZSBkYilcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnN0YXJ0c1dpdGgoJy0nKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnNsaWNlKDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoRU1PSklTKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGsgPT4gay5pbmNsdWRlcyhwcmVmaXgpIHx8IEVNT0pJU1trXS5rZXl3b3Jkcy5zb21lKGt3ID0+IGt3LmluY2x1ZGVzKHByZWZpeCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGsgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtFTU9KSVNba10uY2hhcn0gJHtrfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuYXV0b2NvbXBsZXRlKEVNT0pJU1trXS5jaGFyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDUpXHJcbiAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvQ29tcGxldGUoZXZlbnQsIHByZWZpeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnRpY2lwYW50cy5maWx0ZXIoeCA9PiB4LnVzZXJuYW1lLmluY2x1ZGVzKHByZWZpeCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGBAJHtwLnVzZXJuYW1lfSAtLSAke3AuZGlzcGxheU5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5hdXRvY29tcGxldGUoYEAke3AudXNlcm5hbWV9YClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnIycpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvQ29tcGxldGUoZXZlbnQsIHByZWZpeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnNsaWNlKDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNodGFnc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGh0ID0+IGh0Lmhhc2h0YWcuaW5jbHVkZXMocHJlZml4KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChodCA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAjJHtodC5oYXNodGFnfSR7aHQuZGVzY3JpcHRpb24gPyBgIC0tICR7aHQuZGVzY3JpcHRpb259YCA6IGBgfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuYXV0b2NvbXBsZXRlKGAjJHtodC5oYXNodGFnfWApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgNSlcclxuICAgICAgICAgICAgICAgICAgICA7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGFydEF1dG9Db21wbGV0ZShldmVudCA6IEtleWJvYXJkRXZlbnQsIGNvbXBsZXRpb25GdW5jIDogKHN0ciA6IHN0cmluZykgPT4gQXV0b0NvbXBsZXRlT3B0aW9uW10pIHtcclxuICAgICAgICB0aGlzLmNvbXBsZXRpb25QcmVmaXggPSBldmVudC5rZXk7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0aW9uRnVuYyA9IGNvbXBsZXRpb25GdW5jO1xyXG4gICAgICAgIHRoaXMuc2hvd0F1dG9Db21wbGV0ZSh0aGlzLmNvbXBsZXRpb25GdW5jKHRoaXMuY29tcGxldGlvblByZWZpeCkpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmx1cigpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGlzbWlzc0F1dG9Db21wbGV0ZSgpLCAyNTApO1xyXG4gICAgfVxyXG5cclxuICAgIGluc2VydEVtb2ppKHRleHQgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2lnbkluKCkge1xyXG4gICAgICAgIHRoaXMuc2lnbkluU2VsZWN0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dFZGl0QXZhdGFyKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdEF2YXRhclNlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc3VibWl0OiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IGJvb2xlYW47XHJcblxyXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnNlbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VuZEVycm9yID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgdGV4dCA9ICh0aGlzLnRleHQgfHwgJycpLnRyaW0oKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnJylcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlIDogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICBzZW50QXQ6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICB1cmw6IGxvY2F0aW9uLmhyZWYsXHJcbiAgICAgICAgICAgICAgICBsaWtlczogMCxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRleHRcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9ICcnO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDAwKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljYXRlRXJyb3IoZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuIl19
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tZW50cy9jb21tZW50LWZpZWxkL2NvbW1lbnQtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBaUJyQyxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBU2EsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVqQixtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDckMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVuRCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRVAsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDN0IsU0FBSSxHQUFZLEVBQUUsQ0FBQztRQUNWLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbkIsaUJBQVksR0FBRyxTQUFTLENBQUM7UUFDekIsVUFBSyxHQUFHLGdCQUFnQixDQUFDO1FBQ3pCLDBCQUFxQixHQUFHLGFBQWEsQ0FBQztRQUN0QyxnQkFBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNoQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFRbkMsaUJBQVksR0FBWSxFQUFFLENBQUM7UUFFNUIsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQTRCdkQsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLHdCQUFtQixHQUEwQixFQUFFLENBQUM7UUE2QmhE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WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBVc2VyIH0gZnJvbSBcIkBiYW50YS9jb21tb25cIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IENoYXRTb3VyY2VCYXNlIH0gZnJvbSBcIi4uLy4uL2NoYXQtc291cmNlLWJhc2VcIjtcclxuaW1wb3J0IHsgRU1PSklTIH0gZnJvbSBcIi4uLy4uL2Vtb2ppXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9Db21wbGV0ZU9wdGlvbiB7XHJcbiAgICBsYWJlbCA6IHN0cmluZztcclxuICAgIGFjdGlvbj8gOiAoKSA9PiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhhc2hUYWcge1xyXG4gICAgaGFzaHRhZyA6IHN0cmluZztcclxuICAgIGRlc2NyaXB0aW9uIDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY29tbWVudC1maWVsZCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC1maWVsZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb21tZW50LWZpZWxkLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1lbnRGaWVsZENvbXBvbmVudCB7XHJcblxyXG4gICAgQElucHV0KCkgc291cmNlIDogQ2hhdFNvdXJjZUJhc2U7XHJcbiAgICBASW5wdXQoKSB1c2VyIDogVXNlcjtcclxuICAgIEBJbnB1dCgpIGNhbkNvbW1lbnQgPSB0cnVlO1xyXG5cclxuICAgIEBPdXRwdXQoKSBzaWduSW5TZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgZWRpdEF2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBzZW5kaW5nID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzZW5kRXJyb3IgOiBFcnJvcjtcclxuICAgIEBJbnB1dCgpIGV4cGFuZEVycm9yID0gZmFsc2U7XHJcbiAgICB0ZXh0IDogc3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBzZW5kTGFiZWwgPSAnU2VuZCc7XHJcbiAgICBASW5wdXQoKSBzZW5kaW5nTGFiZWwgPSAnU2VuZGluZyc7XHJcbiAgICBASW5wdXQoKSBsYWJlbCA9ICdQb3N0IGEgY29tbWVudCc7XHJcbiAgICBASW5wdXQoKSBwZXJtaXNzaW9uRGVuaWVkTGFiZWwgPSAnVW5hdmFpbGFibGUnO1xyXG4gICAgQElucHV0KCkgc2lnbkluTGFiZWwgPSAnU2lnbiBJbic7XHJcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG4gICAgQE91dHB1dCgpIHRleHRDaGFuZ2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIEBJbnB1dCgpIHNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPzogKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBzb3VyY2U6IENoYXRTb3VyY2VCYXNlKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdhdXRvY29tcGxldGUnKSBhdXRvY29tcGxldGVFbCA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gICAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlQ29udGFpbmVyJykgYXV0b2NvbXBsZXRlQ29udGFpbmVyRWwgOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3RleHRhcmVhJykgdGV4dGFyZWFFbCA6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcblxyXG4gICAgQElucHV0KCkgaGFzaHRhZ3MgOiBIYXNoVGFnW107XHJcbiAgICBASW5wdXQoKSBwYXJ0aWNpcGFudHMgOiBVc2VyW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIF9wZXJtaXNzaW9uRGVuaWVkRXJyb3IgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgcGVybWlzc2lvbkRlbmllZEVycm9yKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IHJvb3QgPSBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12ZXJzaW9uXScpIHx8IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgcm9vdC5hcHBlbmRDaGlsZCh0aGlzLmF1dG9jb21wbGV0ZUVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRQZXJtaXNzaW9uRGVuaWVkKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvci5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dBdXRvQ29tcGxldGUob3B0aW9ucyA6IEF1dG9Db21wbGV0ZU9wdGlvbltdKSB7XHJcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVTZWxlY3RlZCA9IDA7XHJcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICBsZXQgcG9zID0gdGhpcy5hdXRvY29tcGxldGVDb250YWluZXJFbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGxldCBzaXplID0gdGhpcy5hdXRvY29tcGxldGVFbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGAke3dpbmRvdy5zY3JvbGxYICsgcG9zLmxlZnR9cHhgO1xyXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlRWwubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSBgJHt3aW5kb3cuc2Nyb2xsWSArIHBvcy50b3B9cHhgO1xyXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlRWwubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3Bvcy53aWR0aH1weGA7XHJcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVWaXNpYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhdXRvY29tcGxldGVWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBhdXRvY29tcGxldGVPcHRpb25zIDogQXV0b0NvbXBsZXRlT3B0aW9uW10gPSBbXTtcclxuXHJcbiAgICBhY3RpdmF0ZUF1dG9Db21wbGV0ZShvcHRpb24gOiBBdXRvQ29tcGxldGVPcHRpb24pIHtcclxuICAgICAgICBvcHRpb24uYWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5kaXNtaXNzQXV0b0NvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzbWlzc0F1dG9Db21wbGV0ZSgpIHtcclxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbXBsZXRpb25GdW5jID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNvbXBsZXRpb25QcmVmaXggPSAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVycm9yVGltZW91dDtcclxuICAgIGluZGljYXRlRXJyb3IobWVzc2FnZSA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuc2VuZEVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5lcnJvclRpbWVvdXQpO1xyXG4gICAgICAgIHRoaXMuZXJyb3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmRFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LCA1KjEwMDApO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcGxldGlvbkZ1bmMgOiAoc3RyIDogc3RyaW5nKSA9PiBBdXRvQ29tcGxldGVPcHRpb25bXTtcclxuXHJcbiAgICBjb21wbGV0aW9uUHJlZml4IDogc3RyaW5nO1xyXG4gICAgYXV0b0NvbXBsZXRlU2VsZWN0ZWQgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGFzeW5jIGF1dG9jb21wbGV0ZShyZXBsYWNlbWVudCA6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBlbCA9IHRoaXMudGV4dGFyZWFFbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBlbC5zZWxlY3Rpb25TdGFydCAtIHRoaXMuY29tcGxldGlvblByZWZpeC5sZW5ndGgpICsgcmVwbGFjZW1lbnQgKyB0aGlzLnRleHQuc2xpY2UoZWwuc2VsZWN0aW9uU3RhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluc2VydChzdHIgOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgZWwgPSB0aGlzLnRleHRhcmVhRWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZWwuc2VsZWN0aW9uU3RhcnQpICsgc3RyICsgdGhpcy50ZXh0LnNsaWNlKGVsLnNlbGVjdGlvblN0YXJ0KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbktleURvd24oZXZlbnQgOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzQXV0b0NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdTaGlmdCcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUF1dG9Db21wbGV0ZSh0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnNbdGhpcy5hdXRvQ29tcGxldGVTZWxlY3RlZF0pO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlU2VsZWN0ZWQgPSB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkID0gdGhpcy5hdXRvQ29tcGxldGVTZWxlY3RlZCAtIDE7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVTZWxlY3RlZCA9ICh0aGlzLmF1dG9Db21wbGV0ZVNlbGVjdGVkICsgMSkgJSB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb21wbGV0aW9uRnVuYykge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0aW9uUHJlZml4ID0gdGhpcy5jb21wbGV0aW9uUHJlZml4LnNsaWNlKDAsIHRoaXMuY29tcGxldGlvblByZWZpeC5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0aW9uUHJlZml4ID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzbWlzc0F1dG9Db21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICcgJyB8fCBldmVudC5rZXkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzQXV0b0NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRpb25QcmVmaXggKz0gZXZlbnQua2V5O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dBdXRvQ29tcGxldGUodGhpcy5jb21wbGV0aW9uRnVuYyh0aGlzLmNvbXBsZXRpb25QcmVmaXgpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnOicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvQ29tcGxldGUoZXZlbnQsIHByZWZpeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnNsaWNlKDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyA6LSksIDotKCBldGMgd29yayAoYXMgdGhleSBhcmUgXCI6KVwiIGV0YyBpbiB0aGUgZGIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5zdGFydHNXaXRoKCctJykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5zbGljZSgxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEVNT0pJUylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihrID0+IGsuaW5jbHVkZXMocHJlZml4KSB8fCBFTU9KSVNba10ua2V5d29yZHMuc29tZShrdyA9PiBrdy5pbmNsdWRlcyhwcmVmaXgpKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChrID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogYCR7RU1PSklTW2tdLmNoYXJ9ICR7a31gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmF1dG9jb21wbGV0ZShFTU9KSVNba10uY2hhcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCA1KVxyXG4gICAgICAgICAgICAgICAgICAgIDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0AnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b0NvbXBsZXRlKGV2ZW50LCBwcmVmaXggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5zbGljZSgxKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWNpcGFudHMuZmlsdGVyKHggPT4geC51c2VybmFtZS5pbmNsdWRlcyhwcmVmaXgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgQCR7cC51c2VybmFtZX0gLS0gJHtwLmRpc3BsYXlOYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuYXV0b2NvbXBsZXRlKGBAJHtwLnVzZXJuYW1lfWApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJyMnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b0NvbXBsZXRlKGV2ZW50LCBwcmVmaXggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5zbGljZSgxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzaHRhZ3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihodCA9PiBodC5oYXNodGFnLmluY2x1ZGVzKHByZWZpeCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaHQgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgIyR7aHQuaGFzaHRhZ30ke2h0LmRlc2NyaXB0aW9uID8gYCAtLSAke2h0LmRlc2NyaXB0aW9ufWAgOiBgYH1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmF1dG9jb21wbGV0ZShgIyR7aHQuaGFzaHRhZ31gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDUpXHJcbiAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRBdXRvQ29tcGxldGUoZXZlbnQgOiBLZXlib2FyZEV2ZW50LCBjb21wbGV0aW9uRnVuYyA6IChzdHIgOiBzdHJpbmcpID0+IEF1dG9Db21wbGV0ZU9wdGlvbltdKSB7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0aW9uUHJlZml4ID0gZXZlbnQua2V5O1xyXG4gICAgICAgIHRoaXMuY29tcGxldGlvbkZ1bmMgPSBjb21wbGV0aW9uRnVuYztcclxuICAgICAgICB0aGlzLnNob3dBdXRvQ29tcGxldGUodGhpcy5jb21wbGV0aW9uRnVuYyh0aGlzLmNvbXBsZXRpb25QcmVmaXgpKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkJsdXIoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpc21pc3NBdXRvQ29tcGxldGUoKSwgMjUwKTtcclxuICAgIH1cclxuXHJcbiAgICBpbnNlcnRFbW9qaSh0ZXh0IDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0ICs9IHRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1NpZ25JbigpIHtcclxuICAgICAgICB0aGlzLnNpZ25JblNlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93RWRpdEF2YXRhcigpIHtcclxuICAgICAgICB0aGlzLmVkaXRBdmF0YXJTZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHN1Ym1pdDogKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiBib29sZWFuO1xyXG5cclxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlbmRFcnJvciA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHRleHQgPSAodGhpcy50ZXh0IHx8ICcnKS50cmltKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PT0gJycpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA6IENoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogdGhpcy51c2VyLFxyXG4gICAgICAgICAgICAgICAgc2VudEF0OiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBsb2NhdGlvbi5ocmVmLFxyXG4gICAgICAgICAgICAgICAgbGlrZXM6IDAsXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0ZXh0XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJtaXQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSAnJztcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMTAwMCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRpY2F0ZUVycm9yKGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -7225,8 +7225,8 @@ class BantaChatComponent {
7225
7225
  showSignIn() {
7226
7226
  this._signInSelected.next();
7227
7227
  }
7228
- sendPermissionError() {
7229
- this._permissionDeniedError.next();
7228
+ sendPermissionError(message) {
7229
+ this._permissionDeniedError.next(message);
7230
7230
  }
7231
7231
  insertEmoji(emoji) {
7232
7232
  let message = this.newMessage.message || '';
@@ -8083,9 +8083,7 @@ class BantaCommentsComponent {
8083
8083
  return true;
8084
8084
  }
8085
8085
  catch (e) {
8086
- console.error(`Failed to send message: `, message);
8087
- console.error(e);
8088
- throw new Error(`Could not send: ${e.message}`);
8086
+ this.handleBackendException(e, 'Could not send: ');
8089
8087
  }
8090
8088
  });
8091
8089
  this.sendReply = (message) => __awaiter(this, void 0, void 0, function* () {
@@ -8098,24 +8096,40 @@ class BantaCommentsComponent {
8098
8096
  return true;
8099
8097
  }
8100
8098
  catch (e) {
8101
- console.error(`Failed to send message: `, message);
8102
- console.error(e);
8103
- throw new Error(`Could not send reply: ${e.message}`);
8099
+ this.handleBackendException(e, 'Could not send reply: ');
8104
8100
  }
8105
8101
  });
8106
8102
  }
8103
+ handleBackendExceptionAsAlert(e, prefix = '') {
8104
+ try {
8105
+ this.handleBackendException(e, prefix);
8106
+ }
8107
+ catch (e) {
8108
+ alert(e.message);
8109
+ }
8110
+ }
8111
+ handleBackendException(e, prefix = '') {
8112
+ let errorMessage = e.message;
8113
+ if (errorMessage.startsWith('permission-denied|')) {
8114
+ errorMessage = errorMessage.replace(/^permission-denied\|/, '');
8115
+ if (errorMessage.startsWith(`app-handle|`)) {
8116
+ // If this is an error during authorizeAction on the backend, pass control to the user-provided
8117
+ // permission-denied handler.
8118
+ this.sendPermissionDenied(errorMessage.replace(/^app-handle\|/, ''));
8119
+ return;
8120
+ }
8121
+ }
8122
+ throw new Error(`${prefix}${errorMessage}`);
8123
+ }
8107
8124
  // Lifecycle Events / Initialization
8108
8125
  ngOnInit() {
8109
8126
  this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));
8110
8127
  this.startLoading();
8111
- console.log(`Checking...`);
8112
8128
  if (typeof window !== 'undefined') {
8113
8129
  let queryString = window.location.search.substring(1);
8114
8130
  let query = queryString.split('&')
8115
8131
  .map(s => s.split('='))
8116
8132
  .reduce((o, [k, v]) => (o[k] = v, o), {});
8117
- console.log('here:');
8118
- console.dir(query);
8119
8133
  const commentID = query['comment'];
8120
8134
  if (commentID) {
8121
8135
  this.sharedCommentID = commentID;
@@ -8178,7 +8192,7 @@ class BantaCommentsComponent {
8178
8192
  });
8179
8193
  }
8180
8194
  updateLoading() {
8181
- var _a, _b, _c;
8195
+ var _a, _b;
8182
8196
  if (((_a = this.source) === null || _a === void 0 ? void 0 : _a.state) && ((_b = this.source) === null || _b === void 0 ? void 0 : _b.state) !== 'connecting') {
8183
8197
  clearInterval(this._loadingTimer);
8184
8198
  this.loadingMessage = `Here we go!`;
@@ -8187,7 +8201,6 @@ class BantaCommentsComponent {
8187
8201
  }, 750);
8188
8202
  return true;
8189
8203
  }
8190
- console.log(`[Banta] Status check: ${((_c = this.source) === null || _c === void 0 ? void 0 : _c.state) || 'connecting'}`);
8191
8204
  let messageSwitchTime = 5 * 1000;
8192
8205
  if (this.messageChangedAt + messageSwitchTime < Date.now()) {
8193
8206
  if (this.loadingMessages[this._loadingMessageIndex]) {
@@ -8236,7 +8249,6 @@ class BantaCommentsComponent {
8236
8249
  scrollToComment(commentId) {
8237
8250
  setTimeout(() => {
8238
8251
  const comment = document.querySelectorAll(`[data-comment-id="${commentId}"]`);
8239
- console.dir(comment);
8240
8252
  if (comment.length > 0) {
8241
8253
  // comment.item(0).scroll({behavior: 'smooth'});
8242
8254
  comment.item(0).scrollIntoView();
@@ -8279,8 +8291,8 @@ class BantaCommentsComponent {
8279
8291
  this.scrollToComment(id);
8280
8292
  });
8281
8293
  }
8282
- showPermissionDenied() {
8283
- this._permissionDeniedError.next();
8294
+ sendPermissionDenied(message) {
8295
+ this._permissionDeniedError.next(message);
8284
8296
  }
8285
8297
  scrollToMessage(message) {
8286
8298
  let el = this.elementRef.nativeElement.querySelector(`[data-comment-id="${message.id}"]`);
@@ -8308,8 +8320,7 @@ class BantaCommentsComponent {
8308
8320
  yield source.likeMessage(message.id);
8309
8321
  }
8310
8322
  catch (e) {
8311
- alert(`Could not like this message: ${e.message}`);
8312
- return;
8323
+ this.handleBackendExceptionAsAlert(e, 'Could not like this message: ');
8313
8324
  }
8314
8325
  yield new Promise(resolve => setTimeout(() => resolve(), 250));
8315
8326
  message.transientState.liking = false;
@@ -8326,7 +8337,7 @@ class BantaCommentsComponent {
8326
8337
  yield source.unlikeMessage(message.id);
8327
8338
  }
8328
8339
  catch (e) {
8329
- alert(`Failed to unlike message: ${e.message}`);
8340
+ this.handleBackendExceptionAsAlert(e, 'Failed to unlike this message: ');
8330
8341
  }
8331
8342
  yield new Promise(resolve => setTimeout(() => resolve(), 250));
8332
8343
  message.transientState.liking = false;
@@ -8397,7 +8408,12 @@ class BantaCommentsComponent {
8397
8408
  return __awaiter(this, void 0, void 0, function* () {
8398
8409
  if (!confirm("Are you sure you want to delete this comment? You cannot undo this action."))
8399
8410
  return;
8400
- this.source.deleteMessage(message.id);
8411
+ try {
8412
+ yield this.source.deleteMessage(message.id);
8413
+ }
8414
+ catch (e) {
8415
+ this.handleBackendExceptionAsAlert(e, `Could not delete message: `);
8416
+ }
8401
8417
  });
8402
8418
  }
8403
8419
  editMessage(source, message, newText) {
@@ -8406,7 +8422,7 @@ class BantaCommentsComponent {
8406
8422
  yield source.editMessage(message.id, newText);
8407
8423
  }
8408
8424
  catch (e) {
8409
- alert(e.message);
8425
+ this.handleBackendExceptionAsAlert(e, 'Could not edit this message: ');
8410
8426
  return;
8411
8427
  }
8412
8428
  message.message = newText;
@@ -8426,7 +8442,7 @@ class BantaCommentsComponent {
8426
8442
  message.transientState.editing = false;
8427
8443
  }
8428
8444
  catch (e) {
8429
- alert(`Could not edit message: ${e.message}`);
8445
+ this.handleBackendExceptionAsAlert(e, `Could not edit message: `);
8430
8446
  }
8431
8447
  });
8432
8448
  }
@@ -8434,7 +8450,7 @@ class BantaCommentsComponent {
8434
8450
  BantaCommentsComponent.decorators = [
8435
8451
  { type: Component, args: [{
8436
8452
  selector: 'banta-comments',
8437
- template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>Loading Comments</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (selected)=\"selectMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"permissionDeniedLabel\"\r\n (permissionDeniedError)=\"showPermissionDenied()\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n >\r\n <ng-content select=\".reply-send-options\"></ng-content>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage\">\r\n <banta-comment-field\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n [permissionDeniedLabel]=\"permissionDeniedLabel\"\r\n (permissionDeniedError)=\"showPermissionDenied()\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]=\"sortOrder\"></banta-comment-sort>\r\n\r\n <banta-comment-view\r\n [class.faded]=\"selectedMessage\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (selected)=\"selectMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n </div>\r\n</ng-container>",
8453
+ template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>Loading Comments</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (selected)=\"selectMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"permissionDeniedLabel\"\r\n (permissionDeniedError)=\"sendPermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n >\r\n <ng-content select=\".reply-send-options\"></ng-content>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage\">\r\n <banta-comment-field\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n [permissionDeniedLabel]=\"permissionDeniedLabel\"\r\n (permissionDeniedError)=\"sendPermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]=\"sortOrder\"></banta-comment-sort>\r\n\r\n <banta-comment-view\r\n [class.faded]=\"selectedMessage\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (selected)=\"selectMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n </div>\r\n</ng-container>",
8438
8454
  styles: [":host{display:flex;flex-direction:column}@-webkit-keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{-webkit-animation-name:select-comment;animation-name:select-comment;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:4em}banta-comment-view{opacity:1;transition:opacity .4s ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}@media (max-width:500px){.focused .replies{margin-left:0}}.loading-screen{text-align:center;opacity:0;transition:opacity .25s ease-in-out}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:opacity .25s ease-in-out;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}"]
8439
8455
  },] }
8440
8456
  ];
@@ -8569,8 +8585,8 @@ class CommentFieldComponent {
8569
8585
  let root = document.body.querySelector('[ng-version]') || document.body;
8570
8586
  root.appendChild(this.autocompleteEl.nativeElement);
8571
8587
  }
8572
- showPermissionDenied() {
8573
- this._permissionDeniedError.next();
8588
+ sendPermissionDenied(message) {
8589
+ this._permissionDeniedError.next(message);
8574
8590
  }
8575
8591
  showAutoComplete(options) {
8576
8592
  this.autoCompleteSelected = 0;
@@ -8760,7 +8776,7 @@ class CommentFieldComponent {
8760
8776
  CommentFieldComponent.decorators = [
8761
8777
  { type: Component, args: [{
8762
8778
  selector: 'banta-comment-field',
8763
- template: "<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + user?.avatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"text-container\">\r\n <div class=\"field-container\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n (keydown)=\"onKeyDown($event)\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending\"\r\n [(ngModel)]=\"text\"></textarea>\r\n </mat-form-field>\r\n <ng-content></ng-content>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n\r\n <a\r\n mat-button\r\n *ngFor=\"let option of autocompleteOptions; index as index\"\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <mat-spinner *ngIf=\"sending\" class=\"icon loading\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <div *ngIf=\"sendError\" class=\"error-message\" [class.expanded]=\"expandError\">\r\n <mat-icon *ngIf=\"sendError\">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <emoji-selector-button\r\n class=\"top-right\"\r\n (selected)=\"insertEmoji($event)\"\r\n ></emoji-selector-button>\r\n </div>\r\n <div class=\"actions\">\r\n <ng-container *ngIf=\"!user\">\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button\r\n *ngIf=\"canComment\"\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!text || sending\"\r\n >\r\n <mat-icon *ngIf=\"!sending\">chevron_right</mat-icon>\r\n <mat-spinner *ngIf=\"sending\" class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n <ng-container *ngIf=\"!sending\">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"sending\">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </span>\r\n\r\n </button>\r\n <button\r\n *ngIf=\"!canComment\"\r\n type=\"button\"\r\n (click)=\"showPermissionDenied()\"\r\n mat-raised-button\r\n color=\"primary\"\r\n >{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>\r\n",
8779
+ template: "<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + user?.avatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"text-container\">\r\n <div class=\"field-container\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n (keydown)=\"onKeyDown($event)\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending\"\r\n [(ngModel)]=\"text\"></textarea>\r\n </mat-form-field>\r\n <ng-content></ng-content>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n\r\n <a\r\n mat-button\r\n *ngFor=\"let option of autocompleteOptions; index as index\"\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <mat-spinner *ngIf=\"sending\" class=\"icon loading\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <div *ngIf=\"sendError\" class=\"error-message\" [class.expanded]=\"expandError\">\r\n <mat-icon *ngIf=\"sendError\">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <emoji-selector-button\r\n class=\"top-right\"\r\n (selected)=\"insertEmoji($event)\"\r\n ></emoji-selector-button>\r\n </div>\r\n <div class=\"actions\">\r\n <ng-container *ngIf=\"!user\">\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button\r\n *ngIf=\"canComment\"\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!text || sending\"\r\n >\r\n <mat-icon *ngIf=\"!sending\">chevron_right</mat-icon>\r\n <mat-spinner *ngIf=\"sending\" class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n <ng-container *ngIf=\"!sending\">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"sending\">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </span>\r\n\r\n </button>\r\n <button\r\n *ngIf=\"!canComment\"\r\n type=\"button\"\r\n (click)=\"sendPermissionDenied('')\"\r\n mat-raised-button\r\n color=\"primary\"\r\n >{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>\r\n",
8764
8780
  styles: ["@-webkit-keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}:host{margin:0 2em 0 0;display:block;-webkit-animation-name:comment-field-appear;animation-name:comment-field-appear;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-delay:.4s;animation-delay:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.avatar-container{width:calc(48px + 1.75em);display:flex;justify-content:flex-end}.avatar-container .avatar{width:48px;height:48px;background:pink;border-radius:100%;background-size:cover;background-repeat:no-repeat;background-position:50%;margin-top:.75em;margin-right:.75em}form{display:flex;padding:.5em;align-items:center}form .text-container{position:relative;display:flex;flex-grow:1}form .text-container textarea{font-size:14pt;width:100%}form .text-container textarea[disabled]{opacity:.5}form .text-container mat-form-field{margin-bottom:1em}form .text-container emoji-selector-button{bottom:0;right:0;position:absolute}form .text-container .error-message,form .text-container mat-spinner.loading{position:absolute;left:.5em;bottom:.5em}form .text-container .error-message{color:#683333;overflow-x:hidden;max-width:1.5em;white-space:nowrap;transition:max-width 2s ease-in-out}form .text-container .error-message.expanded,form .text-container .error-message:hover{max-width:100%}form .text-container .error-message mat-icon{vertical-align:middle}form input[type=text]{background:#000;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}form.new-message{display:flex;align-items:flex-start}form.new-message .field-container{flex-grow:1;display:flex;flex-direction:column}form.new-message mat-form-field{width:100%}form.new-message button{margin:1.25em 0 0}button.send{min-width:9em}textarea{max-height:7em}.autocomplete-container{width:calc(100% - 2em);position:relative;pointer-events:none;top:-2em}.autocomplete{visibility:hidden;pointer-events:none;position:absolute;background:#333;padding:.5em;display:flex;flex-direction:column;z-index:100}.autocomplete.visible{visibility:visible;pointer-events:auto}.autocomplete a{width:100%;text-align:left}.autocomplete a.active{background:#555}@media (max-width:500px){:host{margin:0}.avatar-container{width:auto}.avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}button.send{min-width:auto;margin-top:1.5em}button.send .label{display:none}}"]
8765
8781
  },] }
8766
8782
  ];