@banta/sdk 4.3.3 → 4.4.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 (40) hide show
  1. package/banta-sdk.metadata.json +1 -1
  2. package/bundles/banta-sdk.umd.js +581 -27
  3. package/bundles/banta-sdk.umd.js.map +1 -1
  4. package/bundles/banta-sdk.umd.min.js +1 -1
  5. package/bundles/banta-sdk.umd.min.js.map +1 -1
  6. package/esm2015/lib/attachment-scraper.js +2 -0
  7. package/esm2015/lib/banta-sdk.module.js +23 -1
  8. package/esm2015/lib/chat-backend-base.js +15 -1
  9. package/esm2015/lib/chat-backend.js +19 -1
  10. package/esm2015/lib/comments/banta-comments/banta-comments.component.js +1 -1
  11. package/esm2015/lib/comments/comment/comment.component.js +5 -12
  12. package/esm2015/lib/comments/comment-field/comment-field.component.js +89 -7
  13. package/esm2015/lib/common/attachment/attachment.component.js +81 -0
  14. package/esm2015/lib/common/attachments/attachments.component.js +47 -0
  15. package/esm2015/lib/common/common.module.js +13 -3
  16. package/esm2015/lib/common/index.js +4 -1
  17. package/esm2015/lib/common/trust-resource-url.pipe.js +21 -0
  18. package/esm2015/lib/giphy-attachments.js +20 -0
  19. package/esm2015/lib/index.js +6 -1
  20. package/esm2015/lib/tweet-attachments.js +16 -0
  21. package/esm2015/lib/url-attachments.js +46 -0
  22. package/esm2015/lib/youtube-attachments.js +25 -0
  23. package/fesm2015/banta-sdk.js +395 -22
  24. package/fesm2015/banta-sdk.js.map +1 -1
  25. package/lib/attachment-scraper.d.ts +15 -0
  26. package/lib/banta-sdk.module.d.ts +2 -0
  27. package/lib/chat-backend-base.d.ts +10 -1
  28. package/lib/chat-backend.d.ts +2 -1
  29. package/lib/comments/comment/comment.component.d.ts +1 -4
  30. package/lib/comments/comment-field/comment-field.component.d.ts +11 -2
  31. package/lib/common/attachment/attachment.component.d.ts +22 -0
  32. package/lib/common/attachments/attachments.component.d.ts +15 -0
  33. package/lib/common/index.d.ts +3 -0
  34. package/lib/common/trust-resource-url.pipe.d.ts +7 -0
  35. package/lib/giphy-attachments.d.ts +5 -0
  36. package/lib/index.d.ts +5 -0
  37. package/lib/tweet-attachments.d.ts +5 -0
  38. package/lib/url-attachments.d.ts +11 -0
  39. package/lib/youtube-attachments.d.ts +5 -0
  40. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ import { __awaiter } from "tslib";
2
+ export class TweetAttachmentResolver {
3
+ resolveFragment(message, fragment) {
4
+ return __awaiter(this, void 0, void 0, function* () {
5
+ if (fragment.type === 'url' && fragment.text.startsWith('https://twitter.com/')) {
6
+ return {
7
+ type: 'tweet',
8
+ url: fragment.text,
9
+ style: 'block'
10
+ };
11
+ }
12
+ return null;
13
+ });
14
+ }
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdlZXQtYXR0YWNobWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi90d2VldC1hdHRhY2htZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsTUFBTSxPQUFPLHVCQUF1QjtJQUMxQixlQUFlLENBQUMsT0FBb0IsRUFBRSxRQUE0Qjs7WUFDcEUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2dCQUM3RSxPQUFPO29CQUNILElBQUksRUFBRSxPQUFPO29CQUNiLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDbEIsS0FBSyxFQUFFLE9BQU87aUJBQ2pCLENBQUM7YUFDTDtZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7S0FBQTtDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlQXR0YWNobWVudCB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGcmFnbWVudCwgQXR0YWNobWVudFJlc29sdmVyIH0gZnJvbSBcIi4vYXR0YWNobWVudC1zY3JhcGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHdlZXRBdHRhY2htZW50UmVzb2x2ZXIgaW1wbGVtZW50cyBBdHRhY2htZW50UmVzb2x2ZXIge1xyXG4gICAgYXN5bmMgcmVzb2x2ZUZyYWdtZW50KG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBmcmFnbWVudDogQXR0YWNobWVudEZyYWdtZW50KTogUHJvbWlzZTxDaGF0TWVzc2FnZUF0dGFjaG1lbnQ+IHtcclxuICAgICAgICBpZiAoZnJhZ21lbnQudHlwZSA9PT0gJ3VybCcgJiYgZnJhZ21lbnQudGV4dC5zdGFydHNXaXRoKCdodHRwczovL3R3aXR0ZXIuY29tLycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAndHdlZXQnLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBmcmFnbWVudC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdibG9jaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59Il19
@@ -0,0 +1,46 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable } from "@angular/core";
3
+ import { ChatBackendBase } from "./chat-backend-base";
4
+ const URL_REGEX = new RegExp('(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?', 'ig');
5
+ export class UrlAttachmentScraper {
6
+ findFragments(message) {
7
+ var _a;
8
+ // If a message already has a URL attachment, don't add another one.
9
+ if (message.attachments && message.attachments.filter(x => x.type === 'url').length > 0)
10
+ return null;
11
+ return (Array.from((_a = message.message.match(URL_REGEX)) !== null && _a !== void 0 ? _a : []))
12
+ .reduce((a, item) => (a.includes(item) ? undefined : a.push(item), a), [])
13
+ .map(url => ({
14
+ text: url,
15
+ offset: message.message.indexOf(url),
16
+ type: 'url'
17
+ }));
18
+ }
19
+ }
20
+ export class UrlAttachmentResolver {
21
+ constructor(backend) {
22
+ this.backend = backend;
23
+ }
24
+ resolveFragment(message, fragment) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ if (fragment.type !== 'url')
27
+ return null;
28
+ let urlCard = yield this.backend.getCardForUrl(fragment.text);
29
+ if (urlCard) {
30
+ return {
31
+ type: 'card',
32
+ url: fragment.text,
33
+ card: urlCard,
34
+ style: 'block'
35
+ };
36
+ }
37
+ });
38
+ }
39
+ }
40
+ UrlAttachmentResolver.decorators = [
41
+ { type: Injectable }
42
+ ];
43
+ UrlAttachmentResolver.ctorParameters = () => [
44
+ { type: ChatBackendBase }
45
+ ];
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLWF0dGFjaG1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvdXJsLWF0dGFjaG1lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxNQUFNLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQywyWUFBMlksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVoYixNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLGFBQWEsQ0FBQyxPQUFvQjs7UUFDOUIsb0VBQW9FO1FBQ3BFLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkYsT0FBTyxJQUFJLENBQUM7UUFFaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3RELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzthQUN6RSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxFQUFFLEdBQUc7WUFDVCxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3BDLElBQUksRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDLENBQ047SUFDTCxDQUFDO0NBQ0o7QUFHRCxNQUFNLE9BQU8scUJBQXFCO0lBQzlCLFlBQW9CLE9BQXdCO1FBQXhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO0lBQzVDLENBQUM7SUFFSyxlQUFlLENBQUMsT0FBb0IsRUFBRSxRQUE0Qjs7WUFDcEUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUs7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDO1lBRWhCLElBQUksT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlELElBQUksT0FBTyxFQUFFO2dCQUNULE9BQU87b0JBQ0gsSUFBSSxFQUFFLE1BQU07b0JBQ1osR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJO29CQUNsQixJQUFJLEVBQUUsT0FBTztvQkFDYixLQUFLLEVBQUUsT0FBTztpQkFDakIsQ0FBQTthQUNKO1FBQ0wsQ0FBQztLQUFBOzs7WUFsQkosVUFBVTs7O1lBckJGLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlQXR0YWNobWVudCB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGcmFnbWVudCwgQXR0YWNobWVudFJlc29sdmVyLCBBdHRhY2htZW50U2NyYXBlciB9IGZyb20gXCIuL2F0dGFjaG1lbnQtc2NyYXBlclwiO1xyXG5pbXBvcnQgeyBDaGF0QmFja2VuZEJhc2UgfSBmcm9tIFwiLi9jaGF0LWJhY2tlbmQtYmFzZVwiO1xyXG5cclxuY29uc3QgVVJMX1JFR0VYID0gbmV3IFJlZ0V4cCgnKD8hbWFpbHRvOikoPzooPzpodHRwfGh0dHBzfGZ0cCk6Ly8pKD86XFxcXFMrKD86OlxcXFxTKik/QCk/KD86KD86KD86WzEtOV1cXFxcZD98MVxcXFxkXFxcXGR8MlswMV1cXFxcZHwyMlswLTNdKSg/OlxcXFwuKD86MT9cXFxcZHsxLDJ9fDJbMC00XVxcXFxkfDI1WzAtNV0pKXsyfSg/OlxcXFwuKD86WzAtOV1cXFxcZD98MVxcXFxkXFxcXGR8MlswLTRdXFxcXGR8MjVbMC00XSkpfCg/Oig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSstPykqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKykoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSstPykqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKykqKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZl17Mix9KSkpfGxvY2FsaG9zdCkoPzo6XFxcXGR7Miw1fSk/KD86KC98XFxcXD98IylbXlxcXFxzXSopPycsICdpZycpO1xyXG5cclxuZXhwb3J0IGNsYXNzIFVybEF0dGFjaG1lbnRTY3JhcGVyIGltcGxlbWVudHMgQXR0YWNobWVudFNjcmFwZXIge1xyXG4gICAgZmluZEZyYWdtZW50cyhtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IEF0dGFjaG1lbnRGcmFnbWVudFtdIHtcclxuICAgICAgICAvLyBJZiBhIG1lc3NhZ2UgYWxyZWFkeSBoYXMgYSBVUkwgYXR0YWNobWVudCwgZG9uJ3QgYWRkIGFub3RoZXIgb25lLlxyXG4gICAgICAgIGlmIChtZXNzYWdlLmF0dGFjaG1lbnRzICYmIG1lc3NhZ2UuYXR0YWNobWVudHMuZmlsdGVyKHggPT4geC50eXBlID09PSAndXJsJykubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiAoQXJyYXkuZnJvbShtZXNzYWdlLm1lc3NhZ2UubWF0Y2goVVJMX1JFR0VYKSA/PyBbXSkpXHJcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGl0ZW0pID0+IChhLmluY2x1ZGVzKGl0ZW0pID8gdW5kZWZpbmVkIDogYS5wdXNoKGl0ZW0pLCBhKSwgW10pXHJcbiAgICAgICAgICAgIC5tYXAodXJsID0+ICh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB1cmwsIFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBtZXNzYWdlLm1lc3NhZ2UuaW5kZXhPZih1cmwpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3VybCdcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgO1xyXG4gICAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVcmxBdHRhY2htZW50UmVzb2x2ZXIgaW1wbGVtZW50cyBBdHRhY2htZW50UmVzb2x2ZXIge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYWNrZW5kOiBDaGF0QmFja2VuZEJhc2UpIHtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXNvbHZlRnJhZ21lbnQobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIGZyYWdtZW50OiBBdHRhY2htZW50RnJhZ21lbnQpOiBQcm9taXNlPENoYXRNZXNzYWdlQXR0YWNobWVudD4ge1xyXG4gICAgICAgIGlmIChmcmFnbWVudC50eXBlICE9PSAndXJsJylcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCB1cmxDYXJkID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldENhcmRGb3JVcmwoZnJhZ21lbnQudGV4dCk7XHJcbiAgICAgICAgaWYgKHVybENhcmQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjYXJkJyxcclxuICAgICAgICAgICAgICAgIHVybDogZnJhZ21lbnQudGV4dCxcclxuICAgICAgICAgICAgICAgIGNhcmQ6IHVybENhcmQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2Jsb2NrJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSJdfQ==
@@ -0,0 +1,25 @@
1
+ import { __awaiter } from "tslib";
2
+ export class YouTubeAttachmentResolver {
3
+ resolveFragment(message, fragment) {
4
+ return __awaiter(this, void 0, void 0, function* () {
5
+ if (fragment.type !== 'url')
6
+ return null;
7
+ let videoId;
8
+ if (fragment.text.match(/https?:\/\/(www\.)?youtube.com\/watch\?v=/)) {
9
+ let match = /watch\?v=([^&]+)/.exec(fragment.text);
10
+ if (match) {
11
+ videoId = match[1];
12
+ }
13
+ }
14
+ if (videoId) {
15
+ return {
16
+ type: 'iframe',
17
+ url: `https://www.youtube.com/embed/${videoId}`,
18
+ style: 'block'
19
+ };
20
+ }
21
+ return null;
22
+ });
23
+ }
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1hdHRhY2htZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL3lvdXR1YmUtYXR0YWNobWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUdBLE1BQU0sT0FBTyx5QkFBeUI7SUFDNUIsZUFBZSxDQUFDLE9BQW9CLEVBQUUsUUFBNEI7O1lBQ3BFLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLO2dCQUN2QixPQUFPLElBQUksQ0FBQztZQUVoQixJQUFJLE9BQWUsQ0FBQztZQUVwQixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLEVBQUU7Z0JBQ2xFLElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELElBQUksS0FBSyxFQUFFO29CQUNQLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RCO2FBQ0o7WUFFRCxJQUFJLE9BQU8sRUFBRTtnQkFDVCxPQUFPO29CQUNILElBQUksRUFBRSxRQUFRO29CQUNkLEdBQUcsRUFBRSxpQ0FBaUMsT0FBTyxFQUFFO29CQUMvQyxLQUFLLEVBQUUsT0FBTztpQkFDakIsQ0FBQzthQUNMO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUFBO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGF0TWVzc2FnZSwgQ2hhdE1lc3NhZ2VBdHRhY2htZW50IH0gZnJvbSBcIkBiYW50YS9jb21tb25cIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudEZyYWdtZW50LCBBdHRhY2htZW50UmVzb2x2ZXIgfSBmcm9tIFwiLi9hdHRhY2htZW50LXNjcmFwZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBZb3VUdWJlQXR0YWNobWVudFJlc29sdmVyIGltcGxlbWVudHMgQXR0YWNobWVudFJlc29sdmVyIHtcclxuICAgIGFzeW5jIHJlc29sdmVGcmFnbWVudChtZXNzYWdlOiBDaGF0TWVzc2FnZSwgZnJhZ21lbnQ6IEF0dGFjaG1lbnRGcmFnbWVudCk6IFByb21pc2U8Q2hhdE1lc3NhZ2VBdHRhY2htZW50PiB7XHJcbiAgICAgICAgaWYgKGZyYWdtZW50LnR5cGUgIT09ICd1cmwnKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IHZpZGVvSWQ6IHN0cmluZztcclxuXHJcbiAgICAgICAgaWYgKGZyYWdtZW50LnRleHQubWF0Y2goL2h0dHBzPzpcXC9cXC8od3d3XFwuKT95b3V0dWJlLmNvbVxcL3dhdGNoXFw/dj0vKSkge1xyXG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSAvd2F0Y2hcXD92PShbXiZdKykvLmV4ZWMoZnJhZ21lbnQudGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgdmlkZW9JZCA9IG1hdGNoWzFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmlkZW9JZCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2lmcmFtZScsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3ZpZGVvSWR9YCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmxvY2snXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==