@leanix/components 0.2.238 → 0.2.241
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2020/index.mjs +5 -1
- package/esm2020/lib/core-ui/components/button/button.component.mjs +2 -2
- package/esm2020/lib/core-ui/components/ellipsis/ellipsis.component.mjs +111 -56
- package/esm2020/lib/core-ui/core-ui.module.mjs +11 -1
- package/esm2020/lib/core-ui/pipes/linkify/linkify.pipe.mjs +130 -0
- package/esm2020/lib/core-ui/pipes/linkify/unlinkify.pipe.mjs +48 -0
- package/esm2020/lib/core-ui/services/resize-observer.service.mjs +47 -0
- package/fesm2015/leanix-components.mjs +439 -158
- package/fesm2015/leanix-components.mjs.map +1 -1
- package/fesm2020/leanix-components.mjs +436 -157
- package/fesm2020/leanix-components.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/lib/core-ui/components/ellipsis/ellipsis.component.d.ts +31 -21
- package/lib/core-ui/core-ui.module.d.ts +20 -18
- package/lib/core-ui/pipes/linkify/linkify.pipe.d.ts +48 -0
- package/lib/core-ui/pipes/linkify/unlinkify.pipe.d.ts +20 -0
- package/lib/core-ui/services/resize-observer.service.d.ts +27 -0
- package/package.json +1 -1
@@ -0,0 +1,130 @@
|
|
1
|
+
import { Pipe } from '@angular/core';
|
2
|
+
import * as i0 from "@angular/core";
|
3
|
+
/**
|
4
|
+
* This pipe transforms...
|
5
|
+
* - "raw" http(s) links
|
6
|
+
* - markdown link syntax
|
7
|
+
* ... into clickable anchor elements.
|
8
|
+
*
|
9
|
+
* You have an user interface where you don't want clickable links but also
|
10
|
+
* don't want users to see the "ugly" markdown link syntax?
|
11
|
+
* -> Use the 'lxUnlikify' pipe to replace markdown link syntax with just the link name
|
12
|
+
*/
|
13
|
+
export class LxLinkifyPipe {
|
14
|
+
transform(text) {
|
15
|
+
if (text && typeof text === 'string') {
|
16
|
+
const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(text);
|
17
|
+
const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
|
18
|
+
return textWithRawAndNamedLinks;
|
19
|
+
}
|
20
|
+
else {
|
21
|
+
return text;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
turnMarkdownStyleLinksIntoAnchorTags(text) {
|
25
|
+
let textWithRawAndNamedLinks = text;
|
26
|
+
const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
|
27
|
+
namedLinkMatches.forEach((namedLinkMatch) => {
|
28
|
+
const [source, name, url] = namedLinkMatch;
|
29
|
+
const urlIsValid = url && !/javascript\:/i.test(url);
|
30
|
+
if (source && name && urlIsValid) {
|
31
|
+
textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
|
32
|
+
}
|
33
|
+
});
|
34
|
+
return textWithRawAndNamedLinks;
|
35
|
+
}
|
36
|
+
wrapRawHttpLinksWithAnchorTags(text) {
|
37
|
+
let textWithRawLinks = text;
|
38
|
+
/**
|
39
|
+
* Keeping track of this index prevents infinite loops
|
40
|
+
* where a previously processed link starts with the same characters
|
41
|
+
* as a second link.
|
42
|
+
* e.g. https://angular.io/docs followed by https://angular.io
|
43
|
+
*/
|
44
|
+
let nextIndexToStartReplacingFrom = 0;
|
45
|
+
const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
|
46
|
+
rawLinkMatches.forEach((rawLinkMatch) => {
|
47
|
+
const [url] = rawLinkMatch;
|
48
|
+
const wrapUrlInAnchor = (sanitizedUrlMatch) => {
|
49
|
+
const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
|
50
|
+
const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
|
51
|
+
const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
|
52
|
+
textWithRawLinks = firstPart + secondPart;
|
53
|
+
nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
|
54
|
+
};
|
55
|
+
if (url) {
|
56
|
+
/*
|
57
|
+
* TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
|
58
|
+
* The following is RegExp that handles the same stuff as the JS code below:
|
59
|
+
*
|
60
|
+
* /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
|
61
|
+
*
|
62
|
+
* Demo on regex101: https://regex101.com/r/7Vl9bg/1
|
63
|
+
*
|
64
|
+
* Check lookbehind support here: https://caniuse.com/?search=lookbehind
|
65
|
+
*/
|
66
|
+
const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
|
67
|
+
const textUsedToPerformMatching = rawLinkMatch.input;
|
68
|
+
const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
|
69
|
+
const twoCharactersInFrontOfTheLink = rawLinkMatch.index > 3
|
70
|
+
? `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`
|
71
|
+
: '';
|
72
|
+
const isMarkdownSyntaxLink = twoCharactersInFrontOfTheLink === '](';
|
73
|
+
if (!isMarkdownSyntaxLink && lastCharacterInUrl === '.') {
|
74
|
+
const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
|
75
|
+
if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
|
76
|
+
const urlWithoutDotAtTheEnd = url.slice(0, -1);
|
77
|
+
wrapUrlInAnchor(urlWithoutDotAtTheEnd);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
else if (!isMarkdownSyntaxLink) {
|
81
|
+
wrapUrlInAnchor(url);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
});
|
85
|
+
return textWithRawLinks;
|
86
|
+
}
|
87
|
+
getAllRegexMatches(regex, input) {
|
88
|
+
let match;
|
89
|
+
const matches = [];
|
90
|
+
while ((match = regex.exec(input)) !== null) {
|
91
|
+
matches.push(match);
|
92
|
+
}
|
93
|
+
return matches;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
/**
|
97
|
+
* This is not the "one URL regex to rule them all", but a more realistic one which should work
|
98
|
+
* for any URLs that our customers include in text fields on a Fact Sheet.
|
99
|
+
*
|
100
|
+
* Regex rules explained in plain text:
|
101
|
+
*
|
102
|
+
* (?:(?:https?):\/\/) -> Links must start with "https://" or "http://"
|
103
|
+
*
|
104
|
+
* (?:[^\s/$.?#][^\s]*(?<![\.)])) LET'S SPLIT THIS ONE UP
|
105
|
+
*
|
106
|
+
* [^\s/$.?#][^\s]* -> Match any legal URL character until the next whitespace
|
107
|
+
* (?<![\.)] -> A negative lookahead to prevent matching a dot or parenthesis following a URL
|
108
|
+
*
|
109
|
+
* Link to regex101: https://regex101.com/r/d3KtfH/1 (NOTE: please update this link when changing the regex)
|
110
|
+
*/
|
111
|
+
LxLinkifyPipe.HTTP_LINK_REGEX = /(?:(?:https?):\/\/)(?:[^\s/$.?#][^\s]*)/gi;
|
112
|
+
/**
|
113
|
+
* This will match the markdown link syntax: [link name](url)
|
114
|
+
* Regex rules explained in plain text:
|
115
|
+
*
|
116
|
+
* (?:\[([^\]]*)\]) -> Match any characters inside square brackets
|
117
|
+
* \(([^\s\/$.?#][^\s]*)\) -> Notice that this is the same regex as the HTTP_LINK_REGEX above,
|
118
|
+
* but without the requirement for the http protocol.
|
119
|
+
* This allows for links without including the protocol or also "mailto:hello@world.de" links
|
120
|
+
*
|
121
|
+
* Link to regex101: https://regex101.com/r/5UMUH8/1
|
122
|
+
*/
|
123
|
+
LxLinkifyPipe.NAMED_LINK_REGEX = /(?:\[([^\]]*)\])\(([^\s\/$.?#][^\s]*)\)/gi;
|
124
|
+
LxLinkifyPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxLinkifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
125
|
+
LxLinkifyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxLinkifyPipe, name: "lxLinkify" });
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxLinkifyPipe, decorators: [{
|
127
|
+
type: Pipe,
|
128
|
+
args: [{ name: 'lxLinkify' }]
|
129
|
+
}] });
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RixPQUFPLHdCQUF3QixDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVPLG9DQUFvQyxDQUFDLElBQVk7UUFDdkQsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUU7Z0JBQ2hDLHdCQUF3QixHQUFHLHdCQUF3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QyxLQUFLLElBQUksRUFBRTtZQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7QUFwSEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDb0IsNkJBQWUsR0FBRywyQ0FBNEMsQ0FBQTtBQUVyRjs7Ozs7Ozs7OztHQVVHO0FBQ29CLDhCQUFnQixHQUFHLDJDQUE0QyxDQUFBOzBHQTdCM0UsYUFBYTt3R0FBYixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRoaXMgcGlwZSB0cmFuc2Zvcm1zLi4uXG4gKiAtIFwicmF3XCIgaHR0cChzKSBsaW5rc1xuICogLSBtYXJrZG93biBsaW5rIHN5bnRheFxuICogLi4uIGludG8gY2xpY2thYmxlIGFuY2hvciBlbGVtZW50cy5cbiAqXG4gKiBZb3UgaGF2ZSBhbiB1c2VyIGludGVyZmFjZSB3aGVyZSB5b3UgZG9uJ3Qgd2FudCBjbGlja2FibGUgbGlua3MgYnV0IGFsc29cbiAqIGRvbid0IHdhbnQgdXNlcnMgdG8gc2VlIHRoZSBcInVnbHlcIiBtYXJrZG93biBsaW5rIHN5bnRheD9cbiAqIC0+IFVzZSB0aGUgJ2x4VW5saWtpZnknIHBpcGUgdG8gcmVwbGFjZSBtYXJrZG93biBsaW5rIHN5bnRheCB3aXRoIGp1c3QgdGhlIGxpbmsgbmFtZVxuICovXG5AUGlwZSh7IG5hbWU6ICdseExpbmtpZnknIH0pXG5leHBvcnQgY2xhc3MgTHhMaW5raWZ5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVGhpcyBpcyBub3QgdGhlIFwib25lIFVSTCByZWdleCB0byBydWxlIHRoZW0gYWxsXCIsIGJ1dCBhIG1vcmUgcmVhbGlzdGljIG9uZSB3aGljaCBzaG91bGQgd29ya1xuICAgKiBmb3IgYW55IFVSTHMgdGhhdCBvdXIgY3VzdG9tZXJzIGluY2x1ZGUgaW4gdGV4dCBmaWVsZHMgb24gYSBGYWN0IFNoZWV0LlxuICAgKlxuICAgKiBSZWdleCBydWxlcyBleHBsYWluZWQgaW4gcGxhaW4gdGV4dDpcbiAgICpcbiAgICogKD86KD86aHR0cHM/KTpcXC9cXC8pICAgICAgIC0+ICAgIExpbmtzIG11c3Qgc3RhcnQgd2l0aCBcImh0dHBzOi8vXCIgb3IgXCJodHRwOi8vXCJcbiAgICpcbiAgICogKD86W15cXHMvJC4/I11bXlxcc10qKD88IVtcXC4pXSkpIExFVCdTIFNQTElUIFRISVMgT05FIFVQXG4gICAqXG4gICAqIFteXFxzLyQuPyNdW15cXHNdKiAgIC0+ICAgIE1hdGNoIGFueSBsZWdhbCBVUkwgY2hhcmFjdGVyIHVudGlsIHRoZSBuZXh0IHdoaXRlc3BhY2VcbiAgICogKD88IVtcXC4pXSAgICAgICAgICAtPiAgICBBIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBwcmV2ZW50IG1hdGNoaW5nIGEgZG90IG9yIHBhcmVudGhlc2lzIGZvbGxvd2luZyBhIFVSTFxuICAgKlxuICAgKiBMaW5rIHRvIHJlZ2V4MTAxOiBodHRwczovL3JlZ2V4MTAxLmNvbS9yL2QzS3RmSC8xIChOT1RFOiBwbGVhc2UgdXBkYXRlIHRoaXMgbGluayB3aGVuIGNoYW5naW5nIHRoZSByZWdleClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSFRUUF9MSU5LX1JFR0VYID0gLyg/Oig/Omh0dHBzPyk6XFwvXFwvKSg/OlteXFxzLyQuPyNdW15cXHNdKikvZ2k7XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBtYXRjaCB0aGUgbWFya2Rvd24gbGluayBzeW50YXg6IFtsaW5rIG5hbWVdKHVybClcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/OlxcWyhbXlxcXV0qKVxcXSkgICAgICAgICAgICAtPiAgICAgTWF0Y2ggYW55IGNoYXJhY3RlcnMgaW5zaWRlIHNxdWFyZSBicmFja2V0c1xuICAgKiBcXCgoW15cXHNcXC8kLj8jXVteXFxzXSopXFwpICAgICAtPiAgICAgTm90aWNlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSByZWdleCBhcyB0aGUgSFRUUF9MSU5LX1JFR0VYIGFib3ZlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3aXRob3V0IHRoZSByZXF1aXJlbWVudCBmb3IgdGhlIGh0dHAgcHJvdG9jb2wuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGxpbmtzIHdpdGhvdXQgaW5jbHVkaW5nIHRoZSBwcm90b2NvbCBvciBhbHNvIFwibWFpbHRvOmhlbGxvQHdvcmxkLmRlXCIgbGlua3NcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci81VU1VSDgvMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBOQU1FRF9MSU5LX1JFR0VYID0gLyg/OlxcWyhbXlxcXV0qKVxcXSlcXCgoW15cXHNcXC8kLj8jXVteXFxzXSopXFwpL2dpO1xuXG4gIHRyYW5zZm9ybSh0ZXh0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIGlmICh0ZXh0ICYmIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdGV4dFdpdGhSYXdMaW5rcyA9IHRoaXMud3JhcFJhd0h0dHBMaW5rc1dpdGhBbmNob3JUYWdzKHRleHQpO1xuICAgICAgY29uc3QgdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzID0gdGhpcy50dXJuTWFya2Rvd25TdHlsZUxpbmtzSW50b0FuY2hvclRhZ3ModGV4dFdpdGhSYXdMaW5rcyk7XG4gICAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHR1cm5NYXJrZG93blN0eWxlTGlua3NJbnRvQW5jaG9yVGFncyh0ZXh0OiBzdHJpbmcpIHtcbiAgICBsZXQgdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzID0gdGV4dDtcbiAgICBjb25zdCBuYW1lZExpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICBuYW1lZExpbmtNYXRjaGVzLmZvckVhY2goKG5hbWVkTGlua01hdGNoKSA9PiB7XG4gICAgICBjb25zdCBbc291cmNlLCBuYW1lLCB1cmxdID0gbmFtZWRMaW5rTWF0Y2g7XG4gICAgICBjb25zdCB1cmxJc1ZhbGlkID0gdXJsICYmICEvamF2YXNjcmlwdFxcOi9pLnRlc3QodXJsKTtcbiAgICAgIGlmIChzb3VyY2UgJiYgbmFtZSAmJiB1cmxJc1ZhbGlkKSB7XG4gICAgICAgIHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcy5yZXBsYWNlKFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBgPGEgaHJlZj1cIiR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj4ke25hbWV9PC9hPmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwUmF3SHR0cExpbmtzV2l0aEFuY2hvclRhZ3ModGV4dDogc3RyaW5nKSB7XG4gICAgbGV0IHRleHRXaXRoUmF3TGlua3MgPSB0ZXh0O1xuICAgIC8qKlxuICAgICAqIEtlZXBpbmcgdHJhY2sgb2YgdGhpcyBpbmRleCBwcmV2ZW50cyBpbmZpbml0ZSBsb29wc1xuICAgICAqIHdoZXJlIGEgcHJldmlvdXNseSBwcm9jZXNzZWQgbGluayBzdGFydHMgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJzXG4gICAgICogYXMgYSBzZWNvbmQgbGluay5cbiAgICAgKiBlLmcuIGh0dHBzOi8vYW5ndWxhci5pby9kb2NzIGZvbGxvd2VkIGJ5IGh0dHBzOi8vYW5ndWxhci5pb1xuICAgICAqL1xuICAgIGxldCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IDA7XG4gICAgY29uc3QgcmF3TGlua01hdGNoZXMgPSB0aGlzLmdldEFsbFJlZ2V4TWF0Y2hlcyhMeExpbmtpZnlQaXBlLkhUVFBfTElOS19SRUdFWCwgdGV4dCk7XG4gICAgcmF3TGlua01hdGNoZXMuZm9yRWFjaCgocmF3TGlua01hdGNoKSA9PiB7XG4gICAgICBjb25zdCBbdXJsXSA9IHJhd0xpbmtNYXRjaDtcbiAgICAgIGNvbnN0IHdyYXBVcmxJbkFuY2hvciA9IChzYW5pdGl6ZWRVcmxNYXRjaDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0UGFydCA9IHRleHRXaXRoUmF3TGlua3Muc3Vic3RyaW5nKDAsIG5leHRJbmRleFRvU3RhcnRSZXBsYWNpbmdGcm9tKTtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFnSHRtbCA9IGA8YSBocmVmPVwiJHtzYW5pdGl6ZWRVcmxNYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtzYW5pdGl6ZWRVcmxNYXRjaH08L2E+YDtcbiAgICAgICAgY29uc3Qgc2Vjb25kUGFydCA9IHRleHRXaXRoUmF3TGlua3Muc3Vic3RyaW5nKG5leHRJbmRleFRvU3RhcnRSZXBsYWNpbmdGcm9tKS5yZXBsYWNlKHNhbml0aXplZFVybE1hdGNoISwgYW5jaG9yVGFnSHRtbCk7XG4gICAgICAgIHRleHRXaXRoUmF3TGlua3MgPSBmaXJzdFBhcnQgKyBzZWNvbmRQYXJ0O1xuICAgICAgICBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IHJhd0xpbmtNYXRjaC5pbmRleCArIGFuY2hvclRhZ0h0bWwubGVuZ3RoO1xuICAgICAgfTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogVE9ETzogZ2V0IHJpZCBvZiBhbGwgdGhpcyBjb2RlIG9uY2UgU2FmYXJpIHN1cHBvcnRzIG5lZ2F0aXZlIGxvb2tiZWhpbmRzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAgICAgICogVGhlIGZvbGxvd2luZyBpcyBSZWdFeHAgdGhhdCBoYW5kbGVzIHRoZSBzYW1lIHN0dWZmIGFzIHRoZSBKUyBjb2RlIGJlbG93OlxuICAgICAgICAgKlxuICAgICAgICAgKiAvKD86KD86KD88IVxcXVxcKCkpKD86aHR0cHN8aHR0cCk6XFwvXFwvKSg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKS9naTtcbiAgICAgICAgICpcbiAgICAgICAgICogRGVtbyBvbiByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci83Vmw5YmcvMVxuICAgICAgICAgKlxuICAgICAgICAgKiBDaGVjayBsb29rYmVoaW5kIHN1cHBvcnQgaGVyZTogaHR0cHM6Ly9jYW5pdXNlLmNvbS8/c2VhcmNoPWxvb2tiZWhpbmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGxhc3RVcmxDaGFyYWN0ZXJJbmRleCA9IHJhd0xpbmtNYXRjaC5pbmRleCArIHVybC5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nID0gcmF3TGlua01hdGNoLmlucHV0O1xuICAgICAgICBjb25zdCBsYXN0Q2hhcmFjdGVySW5VcmwgPSB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW2xhc3RVcmxDaGFyYWN0ZXJJbmRleF07XG4gICAgICAgIGNvbnN0IHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rID1cbiAgICAgICAgICByYXdMaW5rTWF0Y2guaW5kZXggPiAzXG4gICAgICAgICAgICA/IGAke3RleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbcmF3TGlua01hdGNoLmluZGV4IC0gMl19JHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDFdfWBcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IGlzTWFya2Rvd25TeW50YXhMaW5rID0gdHdvQ2hhcmFjdGVyc0luRnJvbnRPZlRoZUxpbmsgPT09ICddKCc7XG5cbiAgICAgICAgaWYgKCFpc01hcmtkb3duU3ludGF4TGluayAmJiBsYXN0Q2hhcmFjdGVySW5VcmwgPT09ICcuJykge1xuICAgICAgICAgIGNvbnN0IGNoYXJhY3RlckFmdGVyVXJsID0gdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZ1tsYXN0VXJsQ2hhcmFjdGVySW5kZXggKyAxXTtcbiAgICAgICAgICBpZiAoIWNoYXJhY3RlckFmdGVyVXJsIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnICcgfHwgY2hhcmFjdGVyQWZ0ZXJVcmwgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb25zdCB1cmxXaXRob3V0RG90QXRUaGVFbmQgPSB1cmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgd3JhcFVybEluQW5jaG9yKHVybFdpdGhvdXREb3RBdFRoZUVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc01hcmtkb3duU3ludGF4TGluaykge1xuICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHRXaXRoUmF3TGlua3M7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFJlZ2V4TWF0Y2hlcyhyZWdleDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import { Pipe } from '@angular/core';
|
2
|
+
import { LxLinkifyPipe } from './linkify.pipe';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
/**
|
5
|
+
* This pipe replaces markdown link syntax with just the link name (omits the link altogether).
|
6
|
+
* Example: [Angular documentation](http://angular.io/docs) -> Angular documentation
|
7
|
+
*
|
8
|
+
* It can also be used for "bridging the gap" until your view is ready to use "lxLinkify"
|
9
|
+
* and you just want to get rid of the "useless" markdown syntax fast.
|
10
|
+
*
|
11
|
+
* While there are views where we want markdown style links to be clickable anchor tags,
|
12
|
+
* there are other views where this can degrade the UX.
|
13
|
+
* Example: in the Fact Sheet list on the inventory list view, having an arbitrary number
|
14
|
+
* of links on the page can slow down the keyboard navigation while navigating through the list.
|
15
|
+
*/
|
16
|
+
export class LxUnlinkifyPipe {
|
17
|
+
transform(text) {
|
18
|
+
if (text && typeof text === 'string') {
|
19
|
+
let textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName = text;
|
20
|
+
const markdownLinkSyntaxMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
|
21
|
+
markdownLinkSyntaxMatches.forEach((markdownLinkSyntaxMatch) => {
|
22
|
+
const [source, name] = markdownLinkSyntaxMatch;
|
23
|
+
if (source && name) {
|
24
|
+
textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName = textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName.replace(source, name);
|
25
|
+
}
|
26
|
+
});
|
27
|
+
return textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName;
|
28
|
+
}
|
29
|
+
else {
|
30
|
+
return text;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
getAllRegexMatches(regex, input) {
|
34
|
+
let match;
|
35
|
+
const matches = [];
|
36
|
+
while ((match = regex.exec(input)) !== null) {
|
37
|
+
matches.push(match);
|
38
|
+
}
|
39
|
+
return matches;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
LxUnlinkifyPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxUnlinkifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
43
|
+
LxUnlinkifyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxUnlinkifyPipe, name: "lxUnlinkify" });
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxUnlinkifyPipe, decorators: [{
|
45
|
+
type: Pipe,
|
46
|
+
args: [{ name: 'lxUnlinkify' }]
|
47
|
+
}] });
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5saW5raWZ5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3BpcGVzL2xpbmtpZnkvdW5saW5raWZ5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUUvQzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsSUFBSSx3REFBd0QsR0FBRyxJQUFJLENBQUM7WUFDcEUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQzVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7Z0JBQy9DLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtvQkFDbEIsd0RBQXdELEdBQUcsd0RBQXdELENBQUMsT0FBTyxDQUN6SCxNQUFNLEVBQ04sSUFBSSxDQUNMLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sd0RBQXdELENBQUM7U0FDakU7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDckQsSUFBSSxLQUE2QixDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OzRHQTVCVSxlQUFlOzBHQUFmLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsSUFBSTttQkFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMeExpbmtpZnlQaXBlIH0gZnJvbSAnLi9saW5raWZ5LnBpcGUnO1xuXG4vKipcbiAqIFRoaXMgcGlwZSByZXBsYWNlcyBtYXJrZG93biBsaW5rIHN5bnRheCB3aXRoIGp1c3QgdGhlIGxpbmsgbmFtZSAob21pdHMgdGhlIGxpbmsgYWx0b2dldGhlcikuXG4gKiBFeGFtcGxlOiBbQW5ndWxhciBkb2N1bWVudGF0aW9uXShodHRwOi8vYW5ndWxhci5pby9kb2NzKSAtPiBBbmd1bGFyIGRvY3VtZW50YXRpb25cbiAqXG4gKiBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBcImJyaWRnaW5nIHRoZSBnYXBcIiB1bnRpbCB5b3VyIHZpZXcgaXMgcmVhZHkgdG8gdXNlIFwibHhMaW5raWZ5XCJcbiAqIGFuZCB5b3UganVzdCB3YW50IHRvIGdldCByaWQgb2YgdGhlIFwidXNlbGVzc1wiIG1hcmtkb3duIHN5bnRheCBmYXN0LlxuICpcbiAqIFdoaWxlIHRoZXJlIGFyZSB2aWV3cyB3aGVyZSB3ZSB3YW50IG1hcmtkb3duIHN0eWxlIGxpbmtzIHRvIGJlIGNsaWNrYWJsZSBhbmNob3IgdGFncyxcbiAqIHRoZXJlIGFyZSBvdGhlciB2aWV3cyB3aGVyZSB0aGlzIGNhbiBkZWdyYWRlIHRoZSBVWC5cbiAqIEV4YW1wbGU6IGluIHRoZSBGYWN0IFNoZWV0IGxpc3Qgb24gdGhlIGludmVudG9yeSBsaXN0IHZpZXcsIGhhdmluZyBhbiBhcmJpdHJhcnkgbnVtYmVyXG4gKiBvZiBsaW5rcyBvbiB0aGUgcGFnZSBjYW4gc2xvdyBkb3duIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIHdoaWxlIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgbGlzdC5cbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHhVbmxpbmtpZnknIH0pXG5leHBvcnQgY2xhc3MgTHhVbmxpbmtpZnlQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh0ZXh0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIGlmICh0ZXh0ICYmIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IHRleHRXaGVyZU1hcmtkb3duTGlua1N5bnRheElzUmVwbGFjZWRXaXRoSnVzdFRoZUxpbmtOYW1lID0gdGV4dDtcbiAgICAgIGNvbnN0IG1hcmtkb3duTGlua1N5bnRheE1hdGNoZXMgPSB0aGlzLmdldEFsbFJlZ2V4TWF0Y2hlcyhMeExpbmtpZnlQaXBlLk5BTUVEX0xJTktfUkVHRVgsIHRleHQpO1xuICAgICAgbWFya2Rvd25MaW5rU3ludGF4TWF0Y2hlcy5mb3JFYWNoKChtYXJrZG93bkxpbmtTeW50YXhNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBbc291cmNlLCBuYW1lXSA9IG1hcmtkb3duTGlua1N5bnRheE1hdGNoO1xuICAgICAgICBpZiAoc291cmNlICYmIG5hbWUpIHtcbiAgICAgICAgICB0ZXh0V2hlcmVNYXJrZG93bkxpbmtTeW50YXhJc1JlcGxhY2VkV2l0aEp1c3RUaGVMaW5rTmFtZSA9IHRleHRXaGVyZU1hcmtkb3duTGlua1N5bnRheElzUmVwbGFjZWRXaXRoSnVzdFRoZUxpbmtOYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0ZXh0V2hlcmVNYXJrZG93bkxpbmtTeW50YXhJc1JlcGxhY2VkV2l0aEp1c3RUaGVMaW5rTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxSZWdleE1hdGNoZXMocmVnZXg6IFJlZ0V4cCwgaW5wdXQ6IHN0cmluZykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoaW5wdXQpKSAhPT0gbnVsbCkge1xuICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cbn1cbiJdfQ==
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import { Injectable } from '@angular/core';
|
2
|
+
import * as i0 from "@angular/core";
|
3
|
+
function isResizeableElement(element) {
|
4
|
+
return element && !!element.handleResize;
|
5
|
+
}
|
6
|
+
/**
|
7
|
+
* Sharing one ResizeObserver object results in much better performance
|
8
|
+
* over individual components creating their own ResizeObserver.
|
9
|
+
* This is why this service exists.
|
10
|
+
* Source:
|
11
|
+
* - https://github.com/WICG/resize-observer/issues/59#issuecomment-408098151
|
12
|
+
* - https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ
|
13
|
+
*
|
14
|
+
* Learn more about the ResizeObserver API:
|
15
|
+
* - https://www.w3.org/TR/resize-observer/
|
16
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver
|
17
|
+
* - https://www.digitalocean.com/community/tutorials/js-resize-observer
|
18
|
+
*/
|
19
|
+
export class ResizeObserverService {
|
20
|
+
observe(element, callback, options) {
|
21
|
+
if (!this.resizeObserver) {
|
22
|
+
this.resizeObserver = new ResizeObserver(this.resizeObserverCallback.bind(this));
|
23
|
+
}
|
24
|
+
element.handleResize = callback;
|
25
|
+
this.resizeObserver.observe(element, options);
|
26
|
+
}
|
27
|
+
unobserve(element) {
|
28
|
+
if (!this.resizeObserver) {
|
29
|
+
return;
|
30
|
+
}
|
31
|
+
this.resizeObserver.unobserve(element);
|
32
|
+
}
|
33
|
+
resizeObserverCallback(entries, _observer) {
|
34
|
+
entries.forEach((entry) => {
|
35
|
+
if (isResizeableElement(entry.target)) {
|
36
|
+
entry.target.handleResize(entry);
|
37
|
+
}
|
38
|
+
});
|
39
|
+
}
|
40
|
+
}
|
41
|
+
ResizeObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
42
|
+
ResizeObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, providedIn: 'root' });
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, decorators: [{
|
44
|
+
type: Injectable,
|
45
|
+
args: [{ providedIn: 'root' }]
|
46
|
+
}] });
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3NlcnZpY2VzL3Jlc2l6ZS1vYnNlcnZlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBUTNDLFNBQVMsbUJBQW1CLENBQUMsT0FBWTtJQUN2QyxPQUFPLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxPQUFPLENBQUMsT0FBMEIsRUFBRSxRQUFrQyxFQUFFLE9BQStCO1FBQ3JHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO1FBQ0QsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxTQUFTLENBQUMsT0FBb0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQThCLEVBQUUsU0FBeUI7UUFDdEYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7a0hBeEJVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRFIsTUFBTTsyRkFDbkIscUJBQXFCO2tCQURqQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTHhSZXNpemVPYnNlcnZlckNhbGxiYWNrID0gKHJlc2l6ZWRFbGVtZW50OiBSZXNpemVPYnNlcnZlckVudHJ5KSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgUmVzaXplYWJsZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgaGFuZGxlUmVzaXplOiBMeFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGlzUmVzaXplYWJsZUVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBSZXNpemVhYmxlRWxlbWVudCB7XG4gIHJldHVybiBlbGVtZW50ICYmICEhZWxlbWVudC5oYW5kbGVSZXNpemU7XG59XG5cbi8qKlxuICogU2hhcmluZyBvbmUgUmVzaXplT2JzZXJ2ZXIgb2JqZWN0IHJlc3VsdHMgaW4gbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqIG92ZXIgaW5kaXZpZHVhbCBjb21wb25lbnRzIGNyZWF0aW5nIHRoZWlyIG93biBSZXNpemVPYnNlcnZlci5cbiAqIFRoaXMgaXMgd2h5IHRoaXMgc2VydmljZSBleGlzdHMuXG4gKiBTb3VyY2U6XG4gKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3Jlc2l6ZS1vYnNlcnZlci9pc3N1ZXMvNTkjaXNzdWVjb21tZW50LTQwODA5ODE1MVxuICogLSBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2EvY2hyb21pdW0ub3JnL2cvYmxpbmstZGV2L2MvejZpZW5PTlViNUEvbS9GNS1WY1VadEJBQUpcbiAqXG4gKiBMZWFybiBtb3JlIGFib3V0IHRoZSBSZXNpemVPYnNlcnZlciBBUEk6XG4gKiAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9yZXNpemUtb2JzZXJ2ZXIvXG4gKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXNpemVPYnNlcnZlclxuICogLSBodHRwczovL3d3dy5kaWdpdGFsb2NlYW4uY29tL2NvbW11bml0eS90dXRvcmlhbHMvanMtcmVzaXplLW9ic2VydmVyXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIG9ic2VydmUoZWxlbWVudDogUmVzaXplYWJsZUVsZW1lbnQsIGNhbGxiYWNrOiBMeFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2ssIG9wdGlvbnM/OiBSZXNpemVPYnNlcnZlck9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5yZXNpemVPYnNlcnZlckNhbGxiYWNrLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBlbGVtZW50LmhhbmRsZVJlc2l6ZSA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHVub2JzZXJ2ZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10sIF9vYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoaXNSZXNpemVhYmxlRWxlbWVudChlbnRyeS50YXJnZXQpKSB7XG4gICAgICAgIGVudHJ5LnRhcmdldC5oYW5kbGVSZXNpemUoZW50cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
|