@igo2/utils 1.15.4 → 16.0.0-rc.1

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 (50) hide show
  1. package/{esm2020 → esm2022}/igo2-utils.mjs +4 -4
  2. package/esm2022/lib/base64.mjs +85 -0
  3. package/esm2022/lib/cache.utils.mjs +10 -0
  4. package/esm2022/lib/change.interface.mjs +7 -0
  5. package/esm2022/lib/change.mjs +87 -0
  6. package/{esm2020 → esm2022}/lib/clipboard.mjs +52 -52
  7. package/esm2022/lib/dom.utils.mjs +16 -0
  8. package/esm2022/lib/file.mjs +28 -0
  9. package/esm2022/lib/index.mjs +16 -0
  10. package/esm2022/lib/number-utils.mjs +7 -0
  11. package/esm2022/lib/object-utils.mjs +248 -0
  12. package/{esm2020 → esm2022}/lib/strenum.mjs +8 -8
  13. package/{esm2020 → esm2022}/lib/string-utils.mjs +113 -105
  14. package/esm2022/lib/theme.utils.mjs +18 -0
  15. package/{esm2020 → esm2022}/lib/user-agent.mjs +3 -3
  16. package/{esm2020 → esm2022}/lib/uuid.mjs +9 -9
  17. package/esm2022/lib/watcher.mjs +40 -0
  18. package/{esm2020 → esm2022}/public_api.mjs +5 -5
  19. package/{fesm2020 → fesm2022}/igo2-utils.mjs +706 -656
  20. package/fesm2022/igo2-utils.mjs.map +1 -0
  21. package/index.d.ts +5 -5
  22. package/lib/base64.d.ts +8 -8
  23. package/lib/cache.utils.d.ts +1 -0
  24. package/lib/change.d.ts +5 -5
  25. package/lib/change.interface.d.ts +24 -24
  26. package/lib/clipboard.d.ts +7 -7
  27. package/lib/dom.utils.d.ts +4 -0
  28. package/lib/file.d.ts +16 -16
  29. package/lib/index.d.ts +15 -12
  30. package/lib/number-utils.d.ts +3 -3
  31. package/lib/object-utils.d.ts +27 -26
  32. package/lib/strenum.d.ts +4 -4
  33. package/lib/string-utils.d.ts +8 -6
  34. package/lib/theme.utils.d.ts +1 -0
  35. package/lib/user-agent.d.ts +5 -5
  36. package/lib/uuid.d.ts +2 -2
  37. package/lib/watcher.d.ts +19 -19
  38. package/package.json +10 -16
  39. package/public_api.d.ts +1 -1
  40. package/esm2020/lib/base64.mjs +0 -85
  41. package/esm2020/lib/change.interface.mjs +0 -7
  42. package/esm2020/lib/change.mjs +0 -87
  43. package/esm2020/lib/file.mjs +0 -28
  44. package/esm2020/lib/index.mjs +0 -13
  45. package/esm2020/lib/number-utils.mjs +0 -7
  46. package/esm2020/lib/object-utils.mjs +0 -248
  47. package/esm2020/lib/watcher.mjs +0 -41
  48. package/fesm2015/igo2-utils.mjs +0 -688
  49. package/fesm2015/igo2-utils.mjs.map +0 -1
  50. package/fesm2020/igo2-utils.mjs.map +0 -1
@@ -0,0 +1,248 @@
1
+ export class ObjectUtils {
2
+ static resolve(obj, key) {
3
+ const keysArray = key.replace(/\[/g, '.').replace(/\]/g, '').split('.');
4
+ let current = obj;
5
+ while (keysArray.length) {
6
+ if (typeof current !== 'object') {
7
+ return undefined;
8
+ }
9
+ current = current[keysArray.shift()];
10
+ }
11
+ return current;
12
+ }
13
+ static isObject(item) {
14
+ return (item &&
15
+ typeof item === 'object' &&
16
+ !Array.isArray(item) &&
17
+ item !== null &&
18
+ !(item instanceof Date));
19
+ }
20
+ static mergeDeep(target, source, ignoreUndefined = false) {
21
+ const output = Object.assign({}, target);
22
+ if (ObjectUtils.isObject(target) && ObjectUtils.isObject(source)) {
23
+ Object.keys(source)
24
+ .filter((key) => !ignoreUndefined || source[key] !== undefined)
25
+ .forEach((key) => {
26
+ if (ObjectUtils.isObject(source[key])) {
27
+ if (!(key in target)) {
28
+ Object.assign(output, { [key]: source[key] });
29
+ }
30
+ else {
31
+ output[key] = ObjectUtils.mergeDeep(target[key], source[key], ignoreUndefined);
32
+ }
33
+ }
34
+ else {
35
+ Object.assign(output, { [key]: source[key] });
36
+ }
37
+ });
38
+ }
39
+ return output;
40
+ }
41
+ static copyDeep(src) {
42
+ const target = Array.isArray(src) ? [] : {};
43
+ for (const prop in src) {
44
+ if (src.hasOwnProperty(prop)) {
45
+ const value = src[prop];
46
+ if (value && typeof value === 'object') {
47
+ target[prop] = this.copyDeep(value);
48
+ }
49
+ else {
50
+ target[prop] = value;
51
+ }
52
+ }
53
+ }
54
+ return target;
55
+ }
56
+ static removeDuplicateCaseInsensitive(obj) {
57
+ const summaryCapitalizeObject = {};
58
+ const capitalizeObject = {};
59
+ const upperCaseCount = [];
60
+ for (const property in obj) {
61
+ if (obj.hasOwnProperty(property)) {
62
+ const upperCaseProperty = property.toUpperCase();
63
+ if (!summaryCapitalizeObject.hasOwnProperty(upperCaseProperty)) {
64
+ summaryCapitalizeObject[upperCaseProperty] = [
65
+ { [property]: obj[property] }
66
+ ];
67
+ }
68
+ else {
69
+ summaryCapitalizeObject[upperCaseProperty].push({
70
+ [property]: obj[property]
71
+ });
72
+ }
73
+ // counting the number of uppercase lettersMna
74
+ upperCaseCount.push({
75
+ key: property,
76
+ count: property.replace(/[^A-Z]/g, '').length
77
+ });
78
+ }
79
+ }
80
+ for (const capitalizedProperty in summaryCapitalizeObject) {
81
+ if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
82
+ if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
83
+ const capitalizedPropertyObject = summaryCapitalizeObject[capitalizedProperty];
84
+ if (capitalizedPropertyObject.length === 1) {
85
+ // for single params (no duplicates)
86
+ const singlePossibility = capitalizedPropertyObject[0];
87
+ capitalizeObject[capitalizedProperty] =
88
+ singlePossibility[Object.keys(singlePossibility)[0]];
89
+ }
90
+ else if (capitalizedPropertyObject.length > 1) {
91
+ // defining the closest to lowercase property
92
+ const paramClosestToLowercase = upperCaseCount
93
+ .filter((f) => f.key.toLowerCase() === capitalizedProperty.toLowerCase())
94
+ .reduce((prev, current) => {
95
+ return prev.y < current.y ? prev : current;
96
+ });
97
+ capitalizeObject[paramClosestToLowercase.key.toUpperCase()] =
98
+ obj[paramClosestToLowercase.key];
99
+ }
100
+ }
101
+ }
102
+ }
103
+ for (const property in obj) {
104
+ if (obj.hasOwnProperty(property)) {
105
+ delete obj[property];
106
+ }
107
+ }
108
+ for (const property in capitalizeObject) {
109
+ if (capitalizeObject.hasOwnProperty(property)) {
110
+ obj[property] = capitalizeObject[property];
111
+ }
112
+ }
113
+ }
114
+ static removeUndefined(obj) {
115
+ const output = {};
116
+ if (ObjectUtils.isObject(obj)) {
117
+ Object.keys(obj)
118
+ .filter((key) => obj[key] !== undefined)
119
+ .forEach((key) => {
120
+ if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
121
+ output[key] = ObjectUtils.removeUndefined(obj[key]);
122
+ }
123
+ else {
124
+ output[key] = obj[key];
125
+ }
126
+ });
127
+ return output;
128
+ }
129
+ if (Array.isArray(obj)) {
130
+ return obj.map((o) => ObjectUtils.removeUndefined(o));
131
+ }
132
+ return obj;
133
+ }
134
+ static removeNull(obj) {
135
+ const output = {};
136
+ if (ObjectUtils.isObject(obj)) {
137
+ Object.keys(obj)
138
+ .filter((key) => obj[key] !== null)
139
+ .forEach((key) => {
140
+ if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
141
+ output[key] = ObjectUtils.removeNull(obj[key]);
142
+ }
143
+ else {
144
+ output[key] = obj[key];
145
+ }
146
+ });
147
+ return output;
148
+ }
149
+ if (Array.isArray(obj)) {
150
+ return obj.map((o) => ObjectUtils.removeNull(o));
151
+ }
152
+ return obj;
153
+ }
154
+ static naturalCompare(a, b, direction = 'asc', nullsFirst) {
155
+ if (direction === 'desc') {
156
+ b = [a, (a = b)][0];
157
+ }
158
+ // nullsFirst = undefined : end if direction = 'asc', first if direction = 'desc'
159
+ // nullsFirst = true : always first
160
+ // nullsFirst = false : always end
161
+ if (a === null ||
162
+ a === '' ||
163
+ a === undefined ||
164
+ b === null ||
165
+ b === '' ||
166
+ b === undefined) {
167
+ const nullScore = a === b
168
+ ? 0
169
+ : a === undefined
170
+ ? 3
171
+ : b === undefined
172
+ ? -3
173
+ : a === null
174
+ ? 2
175
+ : b === null
176
+ ? -2
177
+ : a === ''
178
+ ? 1
179
+ : -1;
180
+ if (direction === 'desc') {
181
+ return nullsFirst !== false ? nullScore : nullScore * -1;
182
+ }
183
+ return nullsFirst === true ? nullScore * -1 : nullScore;
184
+ }
185
+ const ax = [];
186
+ const bx = [];
187
+ a = '' + a;
188
+ b = '' + b;
189
+ a.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
190
+ ax.push([$1 || Infinity, $2 || '']);
191
+ });
192
+ b.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
193
+ bx.push([$1 || Infinity, $2 || '']);
194
+ });
195
+ while (ax.length && bx.length) {
196
+ const an = ax.shift();
197
+ const bn = bx.shift();
198
+ const nn = an[0] - bn[0] || an[1].localeCompare(bn[1]);
199
+ if (nn) {
200
+ return nn;
201
+ }
202
+ }
203
+ return ax.length - bx.length;
204
+ }
205
+ /**
206
+ * Return true if two object are equivalent.
207
+ * Objects are considered equivalent if they have the same properties and
208
+ * if all of their properties (first-level only) share the same value.
209
+ * @param obj1 First object
210
+ * @param obj2 Second object
211
+ * @returns Whether two objects arer equivalent
212
+ */
213
+ static objectsAreEquivalent(obj1, obj2) {
214
+ if (obj1 === obj2) {
215
+ return true;
216
+ }
217
+ const obj1Props = Object.getOwnPropertyNames(obj1);
218
+ const obj2Props = Object.getOwnPropertyNames(obj2);
219
+ if (obj1Props.length !== obj2Props.length) {
220
+ return false;
221
+ }
222
+ for (const prop of obj1Props) {
223
+ if (obj1[prop] !== obj2[prop]) {
224
+ return false;
225
+ }
226
+ }
227
+ return true;
228
+ }
229
+ /**
230
+ * Return a new object with an array of keys removed
231
+ * @param obj Source object
232
+ * @param keys Keys to remove
233
+ * @returns A new object
234
+ */
235
+ static removeKeys(obj, keys) {
236
+ const newObj = Object.keys(obj)
237
+ .filter((key) => keys.indexOf(key) < 0)
238
+ .reduce((_obj, key) => {
239
+ _obj[key] = obj[key];
240
+ return _obj;
241
+ }, {});
242
+ return newObj;
243
+ }
244
+ static isEmpty(obj) {
245
+ return Object.keys(obj).length === 0;
246
+ }
247
+ }
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9vYmplY3QtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUNyQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbEIsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ3ZCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUMvQixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdEM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLE9BQU8sQ0FDTCxJQUFJO1lBQ0osT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN4QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3BCLElBQUksS0FBSyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUNkLE1BQWMsRUFDZCxNQUFjLEVBQ2QsZUFBZSxHQUFHLEtBQUs7UUFFdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1B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QU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQVc7UUFDeEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgc3RhdGljIHJlc29sdmUob2JqOiBvYmplY3QsIGtleTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBrZXlzQXJyYXkgPSBrZXkucmVwbGFjZSgvXFxbL2csICcuJykucmVwbGFjZSgvXFxdL2csICcnKS5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIHdoaWxlIChrZXlzQXJyYXkubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXlzQXJyYXkuc2hpZnQoKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBzdGF0aWMgaXNPYmplY3QoaXRlbTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGl0ZW0gJiZcbiAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoaXRlbSkgJiZcbiAgICAgIGl0ZW0gIT09IG51bGwgJiZcbiAgICAgICEoaXRlbSBpbnN0YW5jZW9mIERhdGUpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtZXJnZURlZXAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgc291cmNlOiBvYmplY3QsXG4gICAgaWdub3JlVW5kZWZpbmVkID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICBjb25zdCBvdXRwdXQgPSBPYmplY3QuYXNzaWduKHt9LCB0YXJnZXQpO1xuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdCh0YXJnZXQpICYmIE9iamVjdFV0aWxzLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSlcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhaWdub3JlVW5kZWZpbmVkIHx8IHNvdXJjZVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXRwdXRba2V5XSA9IE9iamVjdFV0aWxzLm1lcmdlRGVlcChcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSxcbiAgICAgICAgICAgICAgICBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgICAgICBpZ25vcmVVbmRlZmluZWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvdXRwdXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBzdGF0aWMgY29weURlZXAoc3JjKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzcmNbcHJvcF07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdGhpcy5jb3B5RGVlcCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVEdXBsaWNhdGVDYXNlSW5zZW5zaXRpdmUob2JqOiBvYmplY3QpIHtcbiAgICBjb25zdCBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdCA9IHt9O1xuICAgIGNvbnN0IGNhcGl0YWxpemVPYmplY3QgPSB7fTtcbiAgICBjb25zdCB1cHBlckNhc2VDb3VudCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyQ2FzZVByb3BlcnR5ID0gcHJvcGVydHkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eSh1cHBlckNhc2VQcm9wZXJ0eSkpIHtcbiAgICAgICAgICBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdFt1cHBlckNhc2VQcm9wZXJ0eV0gPSBbXG4gICAgICAgICAgICB7IFtwcm9wZXJ0eV06IG9ialtwcm9wZXJ0eV0gfVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VtbWFyeUNhcGl0YWxpemVPYmplY3RbdXBwZXJDYXNlUHJvcGVydHldLnB1c2goe1xuICAgICAgICAgICAgW3Byb3BlcnR5XTogb2JqW3Byb3BlcnR5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnNNbmFcbiAgICAgICAgdXBwZXJDYXNlQ291bnQucHVzaCh7XG4gICAgICAgICAga2V5OiBwcm9wZXJ0eSxcbiAgICAgICAgICBjb3VudDogcHJvcGVydHkucmVwbGFjZSgvW15BLVpdL2csICcnKS5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FwaXRhbGl6ZWRQcm9wZXJ0eSBpbiBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdCkge1xuICAgICAgaWYgKHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0Lmhhc093blByb3BlcnR5KGNhcGl0YWxpemVkUHJvcGVydHkpKSB7XG4gICAgICAgIGlmIChzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShjYXBpdGFsaXplZFByb3BlcnR5KSkge1xuICAgICAgICAgIGNvbnN0IGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QgPVxuICAgICAgICAgICAgc3VtbWFyeUNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2luZ2xlIHBhcmFtcyAobm8gZHVwbGljYXRlcylcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVBvc3NpYmlsaXR5ID0gY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdFswXTtcbiAgICAgICAgICAgIGNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICBzaW5nbGVQb3NzaWJpbGl0eVtPYmplY3Qua2V5cyhzaW5nbGVQb3NzaWJpbGl0eSlbMF1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBkZWZpbmluZyB0aGUgY2xvc2VzdCB0byBsb3dlcmNhc2UgcHJvcGVydHlcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtQ2xvc2VzdFRvTG93ZXJjYXNlID0gdXBwZXJDYXNlQ291bnRcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZikgPT4gZi5rZXkudG9Mb3dlckNhc2UoKSA9PT0gY2FwaXRhbGl6ZWRQcm9wZXJ0eS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LnkgPCBjdXJyZW50LnkgPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXBpdGFsaXplT2JqZWN0W3BhcmFtQ2xvc2VzdFRvTG93ZXJjYXNlLmtleS50b1VwcGVyQ2FzZSgpXSA9XG4gICAgICAgICAgICAgIG9ialtwYXJhbUNsb3Nlc3RUb0xvd2VyY2FzZS5rZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgZGVsZXRlIG9ialtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBjYXBpdGFsaXplT2JqZWN0KSB7XG4gICAgICBpZiAoY2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgb2JqW3Byb3BlcnR5XSA9IGNhcGl0YWxpemVPYmplY3RbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVVbmRlZmluZWQob2JqOiBvYmplY3QpOiBhbnkge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmopKSB7XG4gICAgICBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4gb2JqW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlVW5kZWZpbmVkKG9ialtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoubWFwKChvKSA9PiBPYmplY3RVdGlscy5yZW1vdmVVbmRlZmluZWQobykpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlTnVsbChvYmo6IG9iamVjdCk6IGFueSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgIE9iamVjdC5rZXlzKG9iailcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBvYmpba2V5XSAhPT0gbnVsbClcbiAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvYmpba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gb2JqLm1hcCgobykgPT4gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHN0YXRpYyBuYXR1cmFsQ29tcGFyZShhLCBiLCBkaXJlY3Rpb24gPSAnYXNjJywgbnVsbHNGaXJzdD86IGJvb2xlYW4pIHtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgIGIgPSBbYSwgKGEgPSBiKV1bMF07XG4gICAgfVxuXG4gICAgLy8gbnVsbHNGaXJzdCA9IHVuZGVmaW5lZCA6IGVuZCBpZiBkaXJlY3Rpb24gPSAnYXNjJywgZmlyc3QgaWYgZGlyZWN0aW9uID0gJ2Rlc2MnXG4gICAgLy8gbnVsbHNGaXJzdCA9IHRydWUgOiBhbHdheXMgZmlyc3RcbiAgICAvLyBudWxsc0ZpcnN0ID0gZmFsc2UgOiBhbHdheXMgZW5kXG4gICAgaWYgKFxuICAgICAgYSA9PT0gbnVsbCB8fFxuICAgICAgYSA9PT0gJycgfHxcbiAgICAgIGEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgYiA9PT0gbnVsbCB8fFxuICAgICAgYiA9PT0gJycgfHxcbiAgICAgIGIgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgbnVsbFNjb3JlID1cbiAgICAgICAgYSA9PT0gYlxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogYSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAzXG4gICAgICAgICAgOiBiID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IC0zXG4gICAgICAgICAgOiBhID09PSBudWxsXG4gICAgICAgICAgPyAyXG4gICAgICAgICAgOiBiID09PSBudWxsXG4gICAgICAgICAgPyAtMlxuICAgICAgICAgIDogYSA9PT0gJydcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IC0xO1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgIHJldHVybiBudWxsc0ZpcnN0ICE9PSBmYWxzZSA/IG51bGxTY29yZSA6IG51bGxTY29yZSAqIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxzRmlyc3QgPT09IHRydWUgPyBudWxsU2NvcmUgKiAtMSA6IG51bGxTY29yZTtcbiAgICB9XG5cbiAgICBjb25zdCBheCA9IFtdO1xuICAgIGNvbnN0IGJ4ID0gW107XG4gICAgYSA9ICcnICsgYTtcbiAgICBiID0gJycgKyBiO1xuXG4gICAgYS5yZXBsYWNlKC8oXFxkKyl8KFxcRCspL2csIChfLCAkMSwgJDIpID0+IHtcbiAgICAgIGF4LnB1c2goWyQxIHx8IEluZmluaXR5LCAkMiB8fCAnJ10pO1xuICAgIH0pO1xuXG4gICAgYi5yZXBsYWNlKC8oXFxkKyl8KFxcRCspL2csIChfLCAkMSwgJDIpID0+IHtcbiAgICAgIGJ4LnB1c2goWyQxIHx8IEluZmluaXR5LCAkMiB8fCAnJ10pO1xuICAgIH0pO1xuXG4gICAgd2hpbGUgKGF4Lmxlbmd0aCAmJiBieC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGFuID0gYXguc2hpZnQoKTtcbiAgICAgIGNvbnN0IGJuID0gYnguc2hpZnQoKTtcbiAgICAgIGNvbnN0IG5uID0gYW5bMF0gLSBiblswXSB8fCBhblsxXS5sb2NhbGVDb21wYXJlKGJuWzFdKTtcbiAgICAgIGlmIChubikge1xuICAgICAgICByZXR1cm4gbm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF4Lmxlbmd0aCAtIGJ4Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB0d28gb2JqZWN0IGFyZSBlcXVpdmFsZW50LlxuICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHByb3BlcnRpZXMgYW5kXG4gICAqIGlmIGFsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIChmaXJzdC1sZXZlbCBvbmx5KSBzaGFyZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICogQHBhcmFtIG9iajEgRmlyc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSBvYmoyIFNlY29uZCBvYmplY3RcbiAgICogQHJldHVybnMgV2hldGhlciB0d28gb2JqZWN0cyBhcmVyIGVxdWl2YWxlbnRcbiAgICovXG4gIHN0YXRpYyBvYmplY3RzQXJlRXF1aXZhbGVudChvYmoxOiBvYmplY3QsIG9iajI6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmIChvYmoxID09PSBvYmoyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBvYmoxUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmoxKTtcbiAgICBjb25zdCBvYmoyUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmoyKTtcbiAgICBpZiAob2JqMVByb3BzLmxlbmd0aCAhPT0gb2JqMlByb3BzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmoxUHJvcHMpIHtcbiAgICAgIGlmIChvYmoxW3Byb3BdICE9PSBvYmoyW3Byb3BdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBuZXcgb2JqZWN0IHdpdGggYW4gYXJyYXkgb2Yga2V5cyByZW1vdmVkXG4gICAqIEBwYXJhbSBvYmogU291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0ga2V5cyBLZXlzIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBBIG5ldyBvYmplY3RcbiAgICovXG4gIHN0YXRpYyByZW1vdmVLZXlzKG9iajogb2JqZWN0LCBrZXlzOiBzdHJpbmdbXSk6IG9iamVjdCB7XG4gICAgY29uc3QgbmV3T2JqID0gT2JqZWN0LmtleXMob2JqKVxuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXlzLmluZGV4T2Yoa2V5KSA8IDApXG4gICAgICAucmVkdWNlKChfb2JqLCBrZXkpID0+IHtcbiAgICAgICAgX29ialtrZXldID0gb2JqW2tleV07XG4gICAgICAgIHJldHVybiBfb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgcmV0dXJuIG5ld09iajtcbiAgfVxuXG4gIHN0YXRpYyBpc0VtcHR5KG9iajogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICB9XG59XG4iXX0=
@@ -1,8 +1,8 @@
1
- /** Utility function to create a K:V from a list of strings */
2
- export function strEnum(o) {
3
- return o.reduce((res, key) => {
4
- res[key] = key;
5
- return res;
6
- }, Object.create(null));
7
- }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvc3RyZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLE9BQU8sQ0FBbUIsQ0FBVztJQUNuRCxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgSzpWIGZyb20gYSBsaXN0IG9mIHN0cmluZ3MgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHN0ckVudW08VCBleHRlbmRzIHN0cmluZz4obzogQXJyYXk8VD4pOiB7IFtLIGluIFRdOiBLIH0ge1xyXG4gIHJldHVybiBvLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcclxuICAgIHJlc1trZXldID0ga2V5O1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcclxufVxyXG4iXX0=
1
+ /** Utility function to create a K:V from a list of strings */
2
+ export function strEnum(o) {
3
+ return o.reduce((res, key) => {
4
+ res[key] = key;
5
+ return res;
6
+ }, Object.create(null));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvc3RyZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLE9BQU8sQ0FBbUIsQ0FBVztJQUNuRCxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgSzpWIGZyb20gYSBsaXN0IG9mIHN0cmluZ3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJFbnVtPFQgZXh0ZW5kcyBzdHJpbmc+KG86IEFycmF5PFQ+KTogeyBbSyBpbiBUXTogSyB9IHtcbiAgcmV0dXJuIG8ucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgIHJlc1trZXldID0ga2V5O1xuICAgIHJldHVybiByZXM7XG4gIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufVxuIl19
@@ -1,105 +1,113 @@
1
- export class StringUtils {
2
- static diff(s1, s2, p = 4) {
3
- if (!s1 && !s2) {
4
- return '';
5
- }
6
- if (!s1) {
7
- return '<span class="inserted">' + s2 + '</span>';
8
- }
9
- if (!s2) {
10
- return '<span class="deleted">' + s1 + '</span>';
11
- }
12
- s1 = s1.toString();
13
- s2 = s2.toString();
14
- const changeData = StringUtils.getChanges(s1, s2, '', p);
15
- const nextS = s2.slice(changeData.mtc.length + changeData.ins.length + changeData.sbs.length); // remaining part of "s"
16
- const nextThis = s1.slice(changeData.mtc.length + changeData.del.length + changeData.sbs.length); // remaining part of "this"
17
- let result = ''; // the glorious result
18
- if (changeData.del.length > 0) {
19
- changeData.del = '<span class="deleted">' + changeData.del + '</span>';
20
- }
21
- if (changeData.ins.length > 0) {
22
- changeData.ins = '<span class="inserted">' + changeData.ins + '</span>';
23
- }
24
- result = changeData.mtc + changeData.del + changeData.ins + changeData.sbs;
25
- result +=
26
- nextThis !== '' || nextS !== ''
27
- ? StringUtils.diff(nextThis, nextS, p)
28
- : '';
29
- return result;
30
- }
31
- static getMatchingSubstring(s, l, m) {
32
- // returns the first matching substring in-between the two strings
33
- let i = 0;
34
- let match = false;
35
- const slen = s.length;
36
- const o = { fis: slen, mtc: m, sbs: '' }; // temporary object used to construct the cd (change data) object
37
- while (i < slen) {
38
- l[i] === s[i]
39
- ? match
40
- ? (o.sbs += s[i]) // o.sbs holds the matching substring itsef
41
- : ((match = true), (o.fis = i), (o.sbs = s[i]))
42
- : match
43
- ? (i = slen) // stop after the first found substring
44
- : (i = i);
45
- ++i;
46
- }
47
- return o;
48
- }
49
- static getChanges(s1, s2, m, p) {
50
- const isThisLonger = s1.length >= s1.length ? true : false;
51
- let [longer, shorter] = isThisLonger ? [s1, s2] : [s2, s1]; // assignment of longer and shorter by es6 destructuring
52
- let bi = 0; // base index designating the index of first mismacthing character in both strings
53
- while (shorter[bi] === longer[bi] && bi < shorter.length) {
54
- ++bi;
55
- } // make bi the index of first mismatching character
56
- longer = longer.split('').slice(bi); // as the longer string will be rotated it is converted into array
57
- shorter = shorter.slice(bi); // shorter and longer now starts from the first mismatching character
58
- const len = longer.length; // length of the longer string
59
- let cd = {
60
- fis: shorter.length,
61
- fil: len,
62
- sbs: '',
63
- mtc: m + s2.slice(0, bi)
64
- }; // if exists mtc holds the matching string at the front
65
- let sub = { sbs: '' }; // returned substring per 1 character rotation of the longer string
66
- if (shorter !== '') {
67
- for (let rc = 0; rc < len && sub.sbs.length < p; rc++) {
68
- // rc -> rotate count, p -> precision factor
69
- sub = StringUtils.getMatchingSubstring(shorter, StringUtils.rotateArray(longer, rc), cd.mtc); // rotate longer string 1 char and get substring
70
- sub.fil =
71
- rc < len - sub.fis
72
- ? sub.fis + rc // mismatch is longer than the mismatch in short
73
- : sub.fis - len + rc; // mismatch is shorter than the mismatch in short
74
- if (sub.sbs.length > cd.sbs.length) {
75
- cd = sub; // only keep the one with the longest substring.
76
- }
77
- }
78
- }
79
- // insert the mismatching delete subsrt and insert substr to the cd object and attach the previous substring
80
- [cd.del, cd.ins] = isThisLonger
81
- ? [longer.slice(0, cd.fil).join(''), shorter.slice(0, cd.fis)]
82
- : [shorter.slice(0, cd.fis), longer.slice(0, cd.fil).join('')];
83
- return cd.del.indexOf(' ') === -1 ||
84
- cd.ins.indexOf(' ') === -1 ||
85
- cd.del === '' ||
86
- cd.ins === '' ||
87
- cd.sbs === ''
88
- ? cd
89
- : StringUtils.getChanges(cd.del, cd.ins, cd.mtc, p);
90
- }
91
- static rotateArray(array, n) {
92
- const len = array.length;
93
- const res = new Array(array.length);
94
- if (n % len === 0) {
95
- return array.slice();
96
- }
97
- else {
98
- for (let i = 0; i < len; i++) {
99
- res[i] = array[(i + (len + (n % len))) % len];
100
- }
101
- }
102
- return res;
103
- }
104
- }
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9zdHJpbmctdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDZCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU8seUJBQXlCLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7U0FDbEQ7UUFDRCxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUNwQixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLHdCQUF3QjtRQUMzQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUN2QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLDJCQUEyQjtRQUM5QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7UUFDdkMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsVUFBVSxDQUFDLEdBQUcsR0FBRyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztTQUN4RTtRQUNELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLFVBQVUsQ0FBQyxHQUFHLEdBQUcseUJBQXlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7U0FDekU7UUFDRCxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUMzRSxNQUFNO1lBQ0osUUFBUSxLQUFLLEVBQUUsSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFDN0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsaUVBQWlFO1FBRTNHLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRTtZQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNYLENBQUMsQ0FBQyxLQUFLO29CQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDO29CQUM3RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLENBQUMsS0FBSztvQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsdUNBQXVDO29CQUNwRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDZCxFQUFFLENBQUMsQ0FBQztTQUNMO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHdEQUF3RDtRQUNwSCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxrRkFBa0Y7UUFFOUYsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3hELEVBQUUsRUFBRSxDQUFDO1NBQ04sQ0FBQyxtREFBbUQ7UUFDckQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0VBQWtFO1FBQ3ZHLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMscUVBQXFFO1FBRWxHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyw4QkFBOEI7UUFDekQsSUFBSSxFQUFFLEdBQVE7WUFDWixHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDbkIsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ3pCLENBQUMsQ0FBQyx1REFBdUQ7UUFDMUQsSUFBSSxHQUFHLEdBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxtRUFBbUU7UUFFL0YsSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ2xCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUNyRCw0Q0FBNEM7Z0JBQzVDLEdBQUcsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQ3BDLE9BQU8sRUFDUCxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFDbkMsRUFBRSxDQUFDLEdBQUcsQ0FDUCxDQUFDLENBQUMsZ0RBQWdEO2dCQUNuRCxHQUFHLENBQUMsR0FBRztvQkFDTCxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHO3dCQUNoQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsZ0RBQWdEO3dCQUMvRCxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsaURBQWlEO2dCQUMzRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO29CQUNsQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsZ0RBQWdEO2lCQUMzRDthQUNGO1NBQ0Y7UUFDRCw0R0FBNEc7UUFDNUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZO1lBQzdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRTtZQUNiLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRTtZQUNiLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRTtZQUNiLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDL0M7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFN0cmluZ1V0aWxzIHtcclxuICBzdGF0aWMgZGlmZihzMTogc3RyaW5nLCBzMjogc3RyaW5nLCBwID0gNCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXMxICYmICFzMikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAoIXMxKSB7XHJcbiAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJpbnNlcnRlZFwiPicgKyBzMiArICc8L3NwYW4+JztcclxuICAgIH1cclxuICAgIGlmICghczIpIHtcclxuICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cImRlbGV0ZWRcIj4nICsgczEgKyAnPC9zcGFuPic7XHJcbiAgICB9XHJcbiAgICBzMSA9IHMxLnRvU3RyaW5nKCk7XHJcbiAgICBzMiA9IHMyLnRvU3RyaW5nKCk7XHJcbiAgICBjb25zdCBjaGFuZ2VEYXRhID0gU3RyaW5nVXRpbHMuZ2V0Q2hhbmdlcyhzMSwgczIsICcnLCBwKTtcclxuICAgIGNvbnN0IG5leHRTID0gczIuc2xpY2UoXHJcbiAgICAgIGNoYW5nZURhdGEubXRjLmxlbmd0aCArIGNoYW5nZURhdGEuaW5zLmxlbmd0aCArIGNoYW5nZURhdGEuc2JzLmxlbmd0aFxyXG4gICAgKTsgLy8gcmVtYWluaW5nIHBhcnQgb2YgXCJzXCJcclxuICAgIGNvbnN0IG5leHRUaGlzID0gczEuc2xpY2UoXHJcbiAgICAgIGNoYW5nZURhdGEubXRjLmxlbmd0aCArIGNoYW5nZURhdGEuZGVsLmxlbmd0aCArIGNoYW5nZURhdGEuc2JzLmxlbmd0aFxyXG4gICAgKTsgLy8gcmVtYWluaW5nIHBhcnQgb2YgXCJ0aGlzXCJcclxuICAgIGxldCByZXN1bHQgPSAnJzsgLy8gdGhlIGdsb3Jpb3VzIHJlc3VsdFxyXG4gICAgaWYgKGNoYW5nZURhdGEuZGVsLmxlbmd0aCA+IDApIHtcclxuICAgICAgY2hhbmdlRGF0YS5kZWwgPSAnPHNwYW4gY2xhc3M9XCJkZWxldGVkXCI+JyArIGNoYW5nZURhdGEuZGVsICsgJzwvc3Bhbj4nO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZURhdGEuaW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY2hhbmdlRGF0YS5pbnMgPSAnPHNwYW4gY2xhc3M9XCJpbnNlcnRlZFwiPicgKyBjaGFuZ2VEYXRhLmlucyArICc8L3NwYW4+JztcclxuICAgIH1cclxuICAgIHJlc3VsdCA9IGNoYW5nZURhdGEubXRjICsgY2hhbmdlRGF0YS5kZWwgKyBjaGFuZ2VEYXRhLmlucyArIGNoYW5nZURhdGEuc2JzO1xyXG4gICAgcmVzdWx0ICs9XHJcbiAgICAgIG5leHRUaGlzICE9PSAnJyB8fCBuZXh0UyAhPT0gJydcclxuICAgICAgICA/IFN0cmluZ1V0aWxzLmRpZmYobmV4dFRoaXMsIG5leHRTLCBwKVxyXG4gICAgICAgIDogJyc7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWF0Y2hpbmdTdWJzdHJpbmcocywgbCwgbSkge1xyXG4gICAgLy8gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgc3Vic3RyaW5nIGluLWJldHdlZW4gdGhlIHR3byBzdHJpbmdzXHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgbWF0Y2ggPSBmYWxzZTtcclxuICAgIGNvbnN0IHNsZW4gPSBzLmxlbmd0aDtcclxuICAgIGNvbnN0IG8gPSB7IGZpczogc2xlbiwgbXRjOiBtLCBzYnM6ICcnIH07IC8vIHRlbXBvcmFyeSBvYmplY3QgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGNkIChjaGFuZ2UgZGF0YSkgb2JqZWN0XHJcblxyXG4gICAgd2hpbGUgKGkgPCBzbGVuKSB7XHJcbiAgICAgIGxbaV0gPT09IHNbaV1cclxuICAgICAgICA/IG1hdGNoXHJcbiAgICAgICAgICA/IChvLnNicyArPSBzW2ldKSAvLyBvLnNicyBob2xkcyB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nIGl0c2VmXHJcbiAgICAgICAgICA6ICgobWF0Y2ggPSB0cnVlKSwgKG8uZmlzID0gaSksIChvLnNicyA9IHNbaV0pKVxyXG4gICAgICAgIDogbWF0Y2hcclxuICAgICAgICAgID8gKGkgPSBzbGVuKSAvLyBzdG9wIGFmdGVyIHRoZSBmaXJzdCBmb3VuZCBzdWJzdHJpbmdcclxuICAgICAgICAgIDogKGkgPSBpKTtcclxuICAgICAgKytpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRDaGFuZ2VzKHMxLCBzMiwgbSwgcCkge1xyXG4gICAgY29uc3QgaXNUaGlzTG9uZ2VyID0gczEubGVuZ3RoID49IHMxLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGxldCBbbG9uZ2VyLCBzaG9ydGVyXSA9IGlzVGhpc0xvbmdlciA/IFtzMSwgczJdIDogW3MyLCBzMV07IC8vIGFzc2lnbm1lbnQgb2YgbG9uZ2VyIGFuZCBzaG9ydGVyIGJ5IGVzNiBkZXN0cnVjdHVyaW5nXHJcbiAgICBsZXQgYmkgPSAwOyAvLyBiYXNlIGluZGV4IGRlc2lnbmF0aW5nIHRoZSBpbmRleCBvZiBmaXJzdCBtaXNtYWN0aGluZyBjaGFyYWN0ZXIgaW4gYm90aCBzdHJpbmdzXHJcblxyXG4gICAgd2hpbGUgKHNob3J0ZXJbYmldID09PSBsb25nZXJbYmldICYmIGJpIDwgc2hvcnRlci5sZW5ndGgpIHtcclxuICAgICAgKytiaTtcclxuICAgIH0gLy8gbWFrZSBiaSB0aGUgaW5kZXggb2YgZmlyc3QgbWlzbWF0Y2hpbmcgY2hhcmFjdGVyXHJcbiAgICBsb25nZXIgPSBsb25nZXIuc3BsaXQoJycpLnNsaWNlKGJpKTsgLy8gYXMgdGhlIGxvbmdlciBzdHJpbmcgd2lsbCBiZSByb3RhdGVkIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGFycmF5XHJcbiAgICBzaG9ydGVyID0gc2hvcnRlci5zbGljZShiaSk7IC8vIHNob3J0ZXIgYW5kIGxvbmdlciBub3cgc3RhcnRzIGZyb20gdGhlIGZpcnN0IG1pc21hdGNoaW5nIGNoYXJhY3RlclxyXG5cclxuICAgIGNvbnN0IGxlbiA9IGxvbmdlci5sZW5ndGg7IC8vIGxlbmd0aCBvZiB0aGUgbG9uZ2VyIHN0cmluZ1xyXG4gICAgbGV0IGNkOiBhbnkgPSB7XHJcbiAgICAgIGZpczogc2hvcnRlci5sZW5ndGgsIC8vIHRoZSBpbmRleCBvZiBtYXRjaGluZyBzdHJpbmcgaW4gdGhlIHNob3J0ZXIgc3RyaW5nXHJcbiAgICAgIGZpbDogbGVuLCAvLyB0aGUgaW5kZXggb2YgbWF0Y2hpbmcgc3RyaW5nIGluIHRoZSBsb25nZXIgc3RyaW5nXHJcbiAgICAgIHNiczogJycsIC8vIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcgaXRzZWxmXHJcbiAgICAgIG10YzogbSArIHMyLnNsaWNlKDAsIGJpKVxyXG4gICAgfTsgLy8gaWYgZXhpc3RzIG10YyBob2xkcyB0aGUgbWF0Y2hpbmcgc3RyaW5nIGF0IHRoZSBmcm9udFxyXG4gICAgbGV0IHN1YjogYW55ID0geyBzYnM6ICcnIH07IC8vIHJldHVybmVkIHN1YnN0cmluZyBwZXIgMSBjaGFyYWN0ZXIgcm90YXRpb24gb2YgdGhlIGxvbmdlciBzdHJpbmdcclxuXHJcbiAgICBpZiAoc2hvcnRlciAhPT0gJycpIHtcclxuICAgICAgZm9yIChsZXQgcmMgPSAwOyByYyA8IGxlbiAmJiBzdWIuc2JzLmxlbmd0aCA8IHA7IHJjKyspIHtcclxuICAgICAgICAvLyByYyAtPiByb3RhdGUgY291bnQsIHAgLT4gcHJlY2lzaW9uIGZhY3RvclxyXG4gICAgICAgIHN1YiA9IFN0cmluZ1V0aWxzLmdldE1hdGNoaW5nU3Vic3RyaW5nKFxyXG4gICAgICAgICAgc2hvcnRlcixcclxuICAgICAgICAgIFN0cmluZ1V0aWxzLnJvdGF0ZUFycmF5KGxvbmdlciwgcmMpLFxyXG4gICAgICAgICAgY2QubXRjXHJcbiAgICAgICAgKTsgLy8gcm90YXRlIGxvbmdlciBzdHJpbmcgMSBjaGFyIGFuZCBnZXQgc3Vic3RyaW5nXHJcbiAgICAgICAgc3ViLmZpbCA9XHJcbiAgICAgICAgICByYyA8IGxlbiAtIHN1Yi5maXNcclxuICAgICAgICAgICAgPyBzdWIuZmlzICsgcmMgLy8gbWlzbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XHJcbiAgICAgICAgICAgIDogc3ViLmZpcyAtIGxlbiArIHJjOyAvLyBtaXNtYXRjaCBpcyBzaG9ydGVyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XHJcbiAgICAgICAgaWYgKHN1Yi5zYnMubGVuZ3RoID4gY2Quc2JzLmxlbmd0aCkge1xyXG4gICAgICAgICAgY2QgPSBzdWI7IC8vIG9ubHkga2VlcCB0aGUgb25lIHdpdGggdGhlIGxvbmdlc3Qgc3Vic3RyaW5nLlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaW5zZXJ0IHRoZSBtaXNtYXRjaGluZyBkZWxldGUgc3Vic3J0IGFuZCBpbnNlcnQgc3Vic3RyIHRvIHRoZSBjZCBvYmplY3QgYW5kIGF0dGFjaCB0aGUgcHJldmlvdXMgc3Vic3RyaW5nXHJcbiAgICBbY2QuZGVsLCBjZC5pbnNdID0gaXNUaGlzTG9uZ2VyXHJcbiAgICAgID8gW2xvbmdlci5zbGljZSgwLCBjZC5maWwpLmpvaW4oJycpLCBzaG9ydGVyLnNsaWNlKDAsIGNkLmZpcyldXHJcbiAgICAgIDogW3Nob3J0ZXIuc2xpY2UoMCwgY2QuZmlzKSwgbG9uZ2VyLnNsaWNlKDAsIGNkLmZpbCkuam9pbignJyldO1xyXG4gICAgcmV0dXJuIGNkLmRlbC5pbmRleE9mKCcgJykgPT09IC0xIHx8XHJcbiAgICAgIGNkLmlucy5pbmRleE9mKCcgJykgPT09IC0xIHx8XHJcbiAgICAgIGNkLmRlbCA9PT0gJycgfHxcclxuICAgICAgY2QuaW5zID09PSAnJyB8fFxyXG4gICAgICBjZC5zYnMgPT09ICcnXHJcbiAgICAgID8gY2RcclxuICAgICAgOiBTdHJpbmdVdGlscy5nZXRDaGFuZ2VzKGNkLmRlbCwgY2QuaW5zLCBjZC5tdGMsIHApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcm90YXRlQXJyYXkoYXJyYXksIG4pIHtcclxuICAgIGNvbnN0IGxlbiA9IGFycmF5Lmxlbmd0aDtcclxuICAgIGNvbnN0IHJlcyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xyXG4gICAgaWYgKG4gJSBsZW4gPT09IDApIHtcclxuICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgcmVzW2ldID0gYXJyYXlbKGkgKyAobGVuICsgKG4gJSBsZW4pKSkgJSBsZW5dO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ export class StringUtils {
2
+ static diff(s1, s2, p = 4) {
3
+ if (!s1 && !s2) {
4
+ return '';
5
+ }
6
+ if (!s1) {
7
+ return '<span class="inserted">' + s2 + '</span>';
8
+ }
9
+ if (!s2) {
10
+ return '<span class="deleted">' + s1 + '</span>';
11
+ }
12
+ s1 = s1.toString();
13
+ s2 = s2.toString();
14
+ const changeData = StringUtils.getChanges(s1, s2, '', p);
15
+ const nextS = s2.slice(changeData.mtc.length + changeData.ins.length + changeData.sbs.length); // remaining part of "s"
16
+ const nextThis = s1.slice(changeData.mtc.length + changeData.del.length + changeData.sbs.length); // remaining part of "this"
17
+ let result = ''; // the glorious result
18
+ if (changeData.del.length > 0) {
19
+ changeData.del = '<span class="deleted">' + changeData.del + '</span>';
20
+ }
21
+ if (changeData.ins.length > 0) {
22
+ changeData.ins = '<span class="inserted">' + changeData.ins + '</span>';
23
+ }
24
+ result = changeData.mtc + changeData.del + changeData.ins + changeData.sbs;
25
+ result +=
26
+ nextThis !== '' || nextS !== ''
27
+ ? StringUtils.diff(nextThis, nextS, p)
28
+ : '';
29
+ return result;
30
+ }
31
+ static getMatchingSubstring(s, l, m) {
32
+ // returns the first matching substring in-between the two strings
33
+ let i = 0;
34
+ let match = false;
35
+ const slen = s.length;
36
+ const o = { fis: slen, mtc: m, sbs: '' }; // temporary object used to construct the cd (change data) object
37
+ while (i < slen) {
38
+ l[i] === s[i]
39
+ ? match
40
+ ? (o.sbs += s[i]) // o.sbs holds the matching substring itsef
41
+ : ((match = true), (o.fis = i), (o.sbs = s[i]))
42
+ : match
43
+ ? (i = slen) // stop after the first found substring
44
+ : (i = i);
45
+ ++i;
46
+ }
47
+ return o;
48
+ }
49
+ static getChanges(s1, s2, m, p) {
50
+ const isThisLonger = s1.length >= s1.length ? true : false;
51
+ let [longer, shorter] = isThisLonger ? [s1, s2] : [s2, s1]; // assignment of longer and shorter by es6 destructuring
52
+ let bi = 0; // base index designating the index of first mismacthing character in both strings
53
+ while (shorter[bi] === longer[bi] && bi < shorter.length) {
54
+ ++bi;
55
+ } // make bi the index of first mismatching character
56
+ longer = longer.split('').slice(bi); // as the longer string will be rotated it is converted into array
57
+ shorter = shorter.slice(bi); // shorter and longer now starts from the first mismatching character
58
+ const len = longer.length; // length of the longer string
59
+ let cd = {
60
+ fis: shorter.length,
61
+ fil: len,
62
+ sbs: '',
63
+ mtc: m + s2.slice(0, bi)
64
+ }; // if exists mtc holds the matching string at the front
65
+ let sub = { sbs: '' }; // returned substring per 1 character rotation of the longer string
66
+ if (shorter !== '') {
67
+ for (let rc = 0; rc < len && sub.sbs.length < p; rc++) {
68
+ // rc -> rotate count, p -> precision factor
69
+ sub = StringUtils.getMatchingSubstring(shorter, StringUtils.rotateArray(longer, rc), cd.mtc); // rotate longer string 1 char and get substring
70
+ sub.fil =
71
+ rc < len - sub.fis
72
+ ? sub.fis + rc // mismatch is longer than the mismatch in short
73
+ : sub.fis - len + rc; // mismatch is shorter than the mismatch in short
74
+ if (sub.sbs.length > cd.sbs.length) {
75
+ cd = sub; // only keep the one with the longest substring.
76
+ }
77
+ }
78
+ }
79
+ // insert the mismatching delete subsrt and insert substr to the cd object and attach the previous substring
80
+ [cd.del, cd.ins] = isThisLonger
81
+ ? [longer.slice(0, cd.fil).join(''), shorter.slice(0, cd.fis)]
82
+ : [shorter.slice(0, cd.fis), longer.slice(0, cd.fil).join('')];
83
+ return cd.del.indexOf(' ') === -1 ||
84
+ cd.ins.indexOf(' ') === -1 ||
85
+ cd.del === '' ||
86
+ cd.ins === '' ||
87
+ cd.sbs === ''
88
+ ? cd
89
+ : StringUtils.getChanges(cd.del, cd.ins, cd.mtc, p);
90
+ }
91
+ static rotateArray(array, n) {
92
+ const len = array.length;
93
+ const res = new Array(array.length);
94
+ if (n % len === 0) {
95
+ return array.slice();
96
+ }
97
+ else {
98
+ for (let i = 0; i < len; i++) {
99
+ res[i] = array[(i + (len + (n % len))) % len];
100
+ }
101
+ }
102
+ return res;
103
+ }
104
+ static isValidNumber(value) {
105
+ return !isNaN(Number(value));
106
+ }
107
+ static isOctalNumber(value) {
108
+ return (StringUtils.isValidNumber(value) &&
109
+ value.startsWith('0') &&
110
+ value.length > 1);
111
+ }
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9zdHJpbmctdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDZCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU8seUJBQXlCLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7U0FDbEQ7UUFDRCxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUNwQixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLHdCQUF3QjtRQUMzQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUN2QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLDJCQUEy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QUM7SUFDeEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDL0M7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQWE7UUFDaEMsT0FBTyxDQUNMLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQ3JCLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUNqQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFN0cmluZ1V0aWxzIHtcbiAgc3RhdGljIGRpZmYoczE6IHN0cmluZywgczI6IHN0cmluZywgcCA9IDQpOiBzdHJpbmcge1xuICAgIGlmICghczEgJiYgIXMyKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICghczEpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJpbnNlcnRlZFwiPicgKyBzMiArICc8L3NwYW4+JztcbiAgICB9XG4gICAgaWYgKCFzMikge1xuICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cImRlbGV0ZWRcIj4nICsgczEgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHMxID0gczEudG9TdHJpbmcoKTtcbiAgICBzMiA9IHMyLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlRGF0YSA9IFN0cmluZ1V0aWxzLmdldENoYW5nZXMoczEsIHMyLCAnJywgcCk7XG4gICAgY29uc3QgbmV4dFMgPSBzMi5zbGljZShcbiAgICAgIGNoYW5nZURhdGEubXRjLmxlbmd0aCArIGNoYW5nZURhdGEuaW5zLmxlbmd0aCArIGNoYW5nZURhdGEuc2JzLmxlbmd0aFxuICAgICk7IC8vIHJlbWFpbmluZyBwYXJ0IG9mIFwic1wiXG4gICAgY29uc3QgbmV4dFRoaXMgPSBzMS5zbGljZShcbiAgICAgIGNoYW5nZURhdGEubXRjLmxlbmd0aCArIGNoYW5nZURhdGEuZGVsLmxlbmd0aCArIGNoYW5nZURhdGEuc2JzLmxlbmd0aFxuICAgICk7IC8vIHJlbWFpbmluZyBwYXJ0IG9mIFwidGhpc1wiXG4gICAgbGV0IHJlc3VsdCA9ICcnOyAvLyB0aGUgZ2xvcmlvdXMgcmVzdWx0XG4gICAgaWYgKGNoYW5nZURhdGEuZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZURhdGEuZGVsID0gJzxzcGFuIGNsYXNzPVwiZGVsZXRlZFwiPicgKyBjaGFuZ2VEYXRhLmRlbCArICc8L3NwYW4+JztcbiAgICB9XG4gICAgaWYgKGNoYW5nZURhdGEuaW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZURhdGEuaW5zID0gJzxzcGFuIGNsYXNzPVwiaW5zZXJ0ZWRcIj4nICsgY2hhbmdlRGF0YS5pbnMgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHJlc3VsdCA9IGNoYW5nZURhdGEubXRjICsgY2hhbmdlRGF0YS5kZWwgKyBjaGFuZ2VEYXRhLmlucyArIGNoYW5nZURhdGEuc2JzO1xuICAgIHJlc3VsdCArPVxuICAgICAgbmV4dFRoaXMgIT09ICcnIHx8IG5leHRTICE9PSAnJ1xuICAgICAgICA/IFN0cmluZ1V0aWxzLmRpZmYobmV4dFRoaXMsIG5leHRTLCBwKVxuICAgICAgICA6ICcnO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRNYXRjaGluZ1N1YnN0cmluZyhzLCBsLCBtKSB7XG4gICAgLy8gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgc3Vic3RyaW5nIGluLWJldHdlZW4gdGhlIHR3byBzdHJpbmdzXG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgIGNvbnN0IHNsZW4gPSBzLmxlbmd0aDtcbiAgICBjb25zdCBvID0geyBmaXM6IHNsZW4sIG10YzogbSwgc2JzOiAnJyB9OyAvLyB0ZW1wb3Jhcnkgb2JqZWN0IHVzZWQgdG8gY29uc3RydWN0IHRoZSBjZCAoY2hhbmdlIGRhdGEpIG9iamVjdFxuXG4gICAgd2hpbGUgKGkgPCBzbGVuKSB7XG4gICAgICBsW2ldID09PSBzW2ldXG4gICAgICAgID8gbWF0Y2hcbiAgICAgICAgICA/IChvLnNicyArPSBzW2ldKSAvLyBvLnNicyBob2xkcyB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nIGl0c2VmXG4gICAgICAgICAgOiAoKG1hdGNoID0gdHJ1ZSksIChvLmZpcyA9IGkpLCAoby5zYnMgPSBzW2ldKSlcbiAgICAgICAgOiBtYXRjaFxuICAgICAgICA/IChpID0gc2xlbikgLy8gc3RvcCBhZnRlciB0aGUgZmlyc3QgZm91bmQgc3Vic3RyaW5nXG4gICAgICAgIDogKGkgPSBpKTtcbiAgICAgICsraTtcbiAgICB9XG4gICAgcmV0dXJuIG87XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRDaGFuZ2VzKHMxLCBzMiwgbSwgcCkge1xuICAgIGNvbnN0IGlzVGhpc0xvbmdlciA9IHMxLmxlbmd0aCA+PSBzMS5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgbGV0IFtsb25nZXIsIHNob3J0ZXJdID0gaXNUaGlzTG9uZ2VyID8gW3MxLCBzMl0gOiBbczIsIHMxXTsgLy8gYXNzaWdubWVudCBvZiBsb25nZXIgYW5kIHNob3J0ZXIgYnkgZXM2IGRlc3RydWN0dXJpbmdcbiAgICBsZXQgYmkgPSAwOyAvLyBiYXNlIGluZGV4IGRlc2lnbmF0aW5nIHRoZSBpbmRleCBvZiBmaXJzdCBtaXNtYWN0aGluZyBjaGFyYWN0ZXIgaW4gYm90aCBzdHJpbmdzXG5cbiAgICB3aGlsZSAoc2hvcnRlcltiaV0gPT09IGxvbmdlcltiaV0gJiYgYmkgPCBzaG9ydGVyLmxlbmd0aCkge1xuICAgICAgKytiaTtcbiAgICB9IC8vIG1ha2UgYmkgdGhlIGluZGV4IG9mIGZpcnN0IG1pc21hdGNoaW5nIGNoYXJhY3RlclxuICAgIGxvbmdlciA9IGxvbmdlci5zcGxpdCgnJykuc2xpY2UoYmkpOyAvLyBhcyB0aGUgbG9uZ2VyIHN0cmluZyB3aWxsIGJlIHJvdGF0ZWQgaXQgaXMgY29udmVydGVkIGludG8gYXJyYXlcbiAgICBzaG9ydGVyID0gc2hvcnRlci5zbGljZShiaSk7IC8vIHNob3J0ZXIgYW5kIGxvbmdlciBub3cgc3RhcnRzIGZyb20gdGhlIGZpcnN0IG1pc21hdGNoaW5nIGNoYXJhY3RlclxuXG4gICAgY29uc3QgbGVuID0gbG9uZ2VyLmxlbmd0aDsgLy8gbGVuZ3RoIG9mIHRoZSBsb25nZXIgc3RyaW5nXG4gICAgbGV0IGNkOiBhbnkgPSB7XG4gICAgICBmaXM6IHNob3J0ZXIubGVuZ3RoLCAvLyB0aGUgaW5kZXggb2YgbWF0Y2hpbmcgc3RyaW5nIGluIHRoZSBzaG9ydGVyIHN0cmluZ1xuICAgICAgZmlsOiBsZW4sIC8vIHRoZSBpbmRleCBvZiBtYXRjaGluZyBzdHJpbmcgaW4gdGhlIGxvbmdlciBzdHJpbmdcbiAgICAgIHNiczogJycsIC8vIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcgaXRzZWxmXG4gICAgICBtdGM6IG0gKyBzMi5zbGljZSgwLCBiaSlcbiAgICB9OyAvLyBpZiBleGlzdHMgbXRjIGhvbGRzIHRoZSBtYXRjaGluZyBzdHJpbmcgYXQgdGhlIGZyb250XG4gICAgbGV0IHN1YjogYW55ID0geyBzYnM6ICcnIH07IC8vIHJldHVybmVkIHN1YnN0cmluZyBwZXIgMSBjaGFyYWN0ZXIgcm90YXRpb24gb2YgdGhlIGxvbmdlciBzdHJpbmdcblxuICAgIGlmIChzaG9ydGVyICE9PSAnJykge1xuICAgICAgZm9yIChsZXQgcmMgPSAwOyByYyA8IGxlbiAmJiBzdWIuc2JzLmxlbmd0aCA8IHA7IHJjKyspIHtcbiAgICAgICAgLy8gcmMgLT4gcm90YXRlIGNvdW50LCBwIC0+IHByZWNpc2lvbiBmYWN0b3JcbiAgICAgICAgc3ViID0gU3RyaW5nVXRpbHMuZ2V0TWF0Y2hpbmdTdWJzdHJpbmcoXG4gICAgICAgICAgc2hvcnRlcixcbiAgICAgICAgICBTdHJpbmdVdGlscy5yb3RhdGVBcnJheShsb25nZXIsIHJjKSxcbiAgICAgICAgICBjZC5tdGNcbiAgICAgICAgKTsgLy8gcm90YXRlIGxvbmdlciBzdHJpbmcgMSBjaGFyIGFuZCBnZXQgc3Vic3RyaW5nXG4gICAgICAgIHN1Yi5maWwgPVxuICAgICAgICAgIHJjIDwgbGVuIC0gc3ViLmZpc1xuICAgICAgICAgICAgPyBzdWIuZmlzICsgcmMgLy8gbWlzbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XG4gICAgICAgICAgICA6IHN1Yi5maXMgLSBsZW4gKyByYzsgLy8gbWlzbWF0Y2ggaXMgc2hvcnRlciB0aGFuIHRoZSBtaXNtYXRjaCBpbiBzaG9ydFxuICAgICAgICBpZiAoc3ViLnNicy5sZW5ndGggPiBjZC5zYnMubGVuZ3RoKSB7XG4gICAgICAgICAgY2QgPSBzdWI7IC8vIG9ubHkga2VlcCB0aGUgb25lIHdpdGggdGhlIGxvbmdlc3Qgc3Vic3RyaW5nLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGluc2VydCB0aGUgbWlzbWF0Y2hpbmcgZGVsZXRlIHN1YnNydCBhbmQgaW5zZXJ0IHN1YnN0ciB0byB0aGUgY2Qgb2JqZWN0IGFuZCBhdHRhY2ggdGhlIHByZXZpb3VzIHN1YnN0cmluZ1xuICAgIFtjZC5kZWwsIGNkLmluc10gPSBpc1RoaXNMb25nZXJcbiAgICAgID8gW2xvbmdlci5zbGljZSgwLCBjZC5maWwpLmpvaW4oJycpLCBzaG9ydGVyLnNsaWNlKDAsIGNkLmZpcyldXG4gICAgICA6IFtzaG9ydGVyLnNsaWNlKDAsIGNkLmZpcyksIGxvbmdlci5zbGljZSgwLCBjZC5maWwpLmpvaW4oJycpXTtcbiAgICByZXR1cm4gY2QuZGVsLmluZGV4T2YoJyAnKSA9PT0gLTEgfHxcbiAgICAgIGNkLmlucy5pbmRleE9mKCcgJykgPT09IC0xIHx8XG4gICAgICBjZC5kZWwgPT09ICcnIHx8XG4gICAgICBjZC5pbnMgPT09ICcnIHx8XG4gICAgICBjZC5zYnMgPT09ICcnXG4gICAgICA/IGNkXG4gICAgICA6IFN0cmluZ1V0aWxzLmdldENoYW5nZXMoY2QuZGVsLCBjZC5pbnMsIGNkLm10YywgcCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByb3RhdGVBcnJheShhcnJheSwgbikge1xuICAgIGNvbnN0IGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCByZXMgPSBuZXcgQXJyYXkoYXJyYXkubGVuZ3RoKTtcbiAgICBpZiAobiAlIGxlbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gYXJyYXlbKGkgKyAobGVuICsgKG4gJSBsZW4pKSkgJSBsZW5dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgc3RhdGljIGlzVmFsaWROdW1iZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7XG4gIH1cblxuICBzdGF0aWMgaXNPY3RhbE51bWJlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIodmFsdWUpICYmXG4gICAgICB2YWx1ZS5zdGFydHNXaXRoKCcwJykgJiZcbiAgICAgIHZhbHVlLmxlbmd0aCA+IDFcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { DomUtils } from './dom.utils';
2
+ const PATH_PREBUILT_THEMES = 'assets/igo2/core/theming/prebuilt-themes';
3
+ const LINK_ID = 'theme-styles';
4
+ export function loadTheme(doc, themeName, path = PATH_PREBUILT_THEMES) {
5
+ const src = `${path}/${themeName}.css`;
6
+ const head = doc.getElementsByTagName('head')[0];
7
+ let themeLink = doc.getElementById(LINK_ID);
8
+ themeLink ? (themeLink.href = src) : createHtmlLink(doc, src, head);
9
+ }
10
+ function createHtmlLink(doc, src, parent) {
11
+ const element = DomUtils.create(doc, 'link', {
12
+ id: LINK_ID,
13
+ rel: 'stylesheet',
14
+ href: src
15
+ });
16
+ parent.appendChild(element);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91dGlscy9zcmMvbGliL3RoZW1lLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkMsTUFBTSxvQkFBb0IsR0FBRywwQ0FBMEMsQ0FBQztBQUN4RSxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUM7QUFFL0IsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsR0FBYSxFQUNiLFNBQWlCLEVBQ2pCLE9BQWUsb0JBQW9CO0lBRW5DLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLFNBQVMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRCxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBb0IsQ0FBQztJQUMvRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQWEsRUFBRSxHQUFXLEVBQUUsTUFBbUI7SUFDckUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFO1FBQzNDLEVBQUUsRUFBRSxPQUFPO1FBQ1gsR0FBRyxFQUFFLFlBQVk7UUFDakIsSUFBSSxFQUFFLEdBQUc7S0FDVixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb21VdGlscyB9IGZyb20gJy4vZG9tLnV0aWxzJztcblxuY29uc3QgUEFUSF9QUkVCVUlMVF9USEVNRVMgPSAnYXNzZXRzL2lnbzIvY29yZS90aGVtaW5nL3ByZWJ1aWx0LXRoZW1lcyc7XG5jb25zdCBMSU5LX0lEID0gJ3RoZW1lLXN0eWxlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkVGhlbWUoXG4gIGRvYzogRG9jdW1lbnQsXG4gIHRoZW1lTmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcgPSBQQVRIX1BSRUJVSUxUX1RIRU1FU1xuKTogdm9pZCB7XG4gIGNvbnN0IHNyYyA9IGAke3BhdGh9LyR7dGhlbWVOYW1lfS5jc3NgO1xuICBjb25zdCBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG5cbiAgbGV0IHRoZW1lTGluayA9IGRvYy5nZXRFbGVtZW50QnlJZChMSU5LX0lEKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gIHRoZW1lTGluayA/ICh0aGVtZUxpbmsuaHJlZiA9IHNyYykgOiBjcmVhdGVIdG1sTGluayhkb2MsIHNyYywgaGVhZCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxMaW5rKGRvYzogRG9jdW1lbnQsIHNyYzogc3RyaW5nLCBwYXJlbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBEb21VdGlscy5jcmVhdGUoZG9jLCAnbGluaycsIHtcbiAgICBpZDogTElOS19JRCxcbiAgICByZWw6ICdzdHlsZXNoZWV0JyxcbiAgICBocmVmOiBzcmNcbiAgfSk7XG4gIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbn1cbiJdfQ==
@@ -1,3 +1,3 @@
1
- import * as Bowser from 'bowser';
2
- export const userAgent = Bowser.getParser(window.navigator.userAgent);
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1hZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvdXNlci1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU1qQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDdkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJvd3NlciBmcm9tICdib3dzZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWdlbnQgZXh0ZW5kcyBCb3dzZXIuUGFyc2VyLlBhcnNlciB7XHJcbiAgY29tcGFyZVZlcnNpb246ICh2ZXJzaW9uOiBzdHJpbmcpID0+IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB1c2VyQWdlbnQgPSBCb3dzZXIuZ2V0UGFyc2VyKFxyXG4gIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50XHJcbikgYXMgVXNlckFnZW50O1xyXG4iXX0=
1
+ import * as Bowser from 'bowser';
2
+ export const userAgent = Bowser.getParser(window.navigator.userAgent);
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1hZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvdXNlci1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU1qQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDdkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJvd3NlciBmcm9tICdib3dzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZ2VudCBleHRlbmRzIEJvd3Nlci5QYXJzZXIuUGFyc2VyIHtcbiAgY29tcGFyZVZlcnNpb246ICh2ZXJzaW9uOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB1c2VyQWdlbnQgPSBCb3dzZXIuZ2V0UGFyc2VyKFxuICB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudFxuKSBhcyBVc2VyQWdlbnQ7XG4iXX0=