@angular-generic-table/core 5.0.0-rc.13 → 5.0.0-rc.15

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 (39) hide show
  1. package/esm2020/lib/core.component.mjs +37 -13
  2. package/esm2020/lib/core.module.mjs +11 -8
  3. package/esm2020/lib/core.service.mjs +3 -3
  4. package/esm2020/lib/gt-delta/gt-delta.component.mjs +95 -73
  5. package/esm2020/lib/models/table-column.interface.mjs +1 -1
  6. package/esm2020/lib/models/table-config.interface.mjs +1 -1
  7. package/esm2020/lib/models/table-events.interface.mjs +1 -1
  8. package/esm2020/lib/models/table-meta.interface.mjs +1 -1
  9. package/esm2020/lib/models/table-row.interface.mjs +1 -1
  10. package/esm2020/lib/pagination/pagination.component.mjs +6 -6
  11. package/esm2020/lib/pagination/pagination.module.mjs +6 -7
  12. package/esm2020/lib/pipes/capital-case.pipe.mjs +5 -4
  13. package/esm2020/lib/pipes/dash-case.pipe.mjs +5 -4
  14. package/esm2020/lib/pipes/dynamic.pipe.mjs +5 -4
  15. package/esm2020/lib/pipes/highlight.pipe.mjs +5 -4
  16. package/esm2020/lib/pipes/sort-class.pipe.mjs +5 -4
  17. package/esm2020/lib/utilities/utilities.mjs +72 -2
  18. package/fesm2015/angular-generic-table-core.mjs +274 -144
  19. package/fesm2015/angular-generic-table-core.mjs.map +1 -1
  20. package/fesm2020/angular-generic-table-core.mjs +266 -144
  21. package/fesm2020/angular-generic-table-core.mjs.map +1 -1
  22. package/lib/core.component.d.ts +12 -6
  23. package/lib/core.module.d.ts +9 -9
  24. package/lib/gt-delta/gt-delta.component.d.ts +18 -6
  25. package/lib/models/table-column.interface.d.ts +4 -2
  26. package/lib/models/table-config.interface.d.ts +22 -3
  27. package/lib/models/table-events.interface.d.ts +4 -4
  28. package/lib/models/table-meta.interface.d.ts +3 -3
  29. package/lib/models/table-row.interface.d.ts +0 -1
  30. package/lib/pagination/pagination.component.d.ts +3 -3
  31. package/lib/pagination/pagination.module.d.ts +3 -3
  32. package/lib/pipes/capital-case.pipe.d.ts +1 -1
  33. package/lib/pipes/dash-case.pipe.d.ts +1 -1
  34. package/lib/pipes/dynamic.pipe.d.ts +1 -1
  35. package/lib/pipes/highlight.pipe.d.ts +1 -1
  36. package/lib/pipes/sort-class.pipe.d.ts +1 -1
  37. package/lib/utilities/utilities.d.ts +5 -0
  38. package/package.json +1 -1
  39. package/scss/index.scss +41 -3
@@ -35,11 +35,17 @@ search = (text, caseSensitive, data, config) => {
35
35
  const match = Object.entries(row)
36
36
  .filter(([key, value]) => searchColumns.indexOf(key) !== -1)
37
37
  .reduce((acc, [key, value], index) => {
38
+ const search = config?.columns[key]?.search;
39
+ // if search is a function...
40
+ if (typeof search === 'function') {
41
+ // ...use search function to return value to search
42
+ value = search(row, key, value);
43
+ }
38
44
  return (acc +
39
45
  (index === 0 ? '' : ' ? ') +
40
46
  (caseSensitive ? value + '' : (value + '').toLowerCase()));
41
47
  }, '')
42
- .indexOf(text) !== -1;
48
+ .indexOf(caseSensitive ? text : text.toLowerCase()) !== -1;
43
49
  if (match) {
44
50
  FILTERED[FILTERED.length] = row;
45
51
  }
@@ -50,4 +56,68 @@ search = (text, caseSensitive, data, config) => {
50
56
  return data;
51
57
  }
52
58
  };
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3V0aWxpdGllcy91dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxDQUFDLElBQUksTUFBNkIsQ0FBQztBQUN6QyxNQUFNLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFFMUUsTUFBTSxDQUFDLElBQUksVUFBaUMsQ0FBQztBQUM3QyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNqQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztLQUNsQixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO0tBQ2hDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDO0tBQzlCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO0tBQ3ZCLElBQUksRUFBRSxDQUFDO0FBRVosTUFBTSxDQUFDLElBQUksS0FHZ0IsQ0FBQztBQUM1QixLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7SUFDM0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztLQUN2QztJQUNELElBQUksU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEI7SUFDRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFO1FBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxJQUFJLE1BS0ksQ0FBQztBQUNoQixNQUFNLEdBQUcsQ0FDUCxJQUFZLEVBQ1osYUFBc0IsRUFDdEIsSUFBcUIsRUFDckIsTUFBbUIsRUFDbkIsRUFBRTtJQUNGLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNsQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNO1FBQ3RELGFBQWE7UUFDYixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sTUFBTSxDQUFDLE9BQU87WUFDZCxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTTtZQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sS0FBSyxLQUFLLENBQ3hDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sS0FBSyxHQUNULE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUNoQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDM0QsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBVSxFQUFFO2dCQUMzQyxPQUFPLENBQ0wsR0FBRztvQkFDSCxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUMxQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDMUQsQ0FBQztZQUNKLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksS0FBSyxFQUFFO2dCQUNULFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQ2pDO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztLQUNqQjtTQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7S0FDYjtBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLXJvdy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBsZXQgZGFzaGVkOiAoczogc3RyaW5nKSA9PiBzdHJpbmc7XG5kYXNoZWQgPSAoczogc3RyaW5nKSA9PiBzLnJlcGxhY2UoL1tBLVpdL2csIChtKSA9PiAnLScgKyBtLnRvTG93ZXJDYXNlKCkpO1xuXG5leHBvcnQgbGV0IGNhcGl0YWxpemU6IChzOiBzdHJpbmcpID0+IHN0cmluZztcbmNhcGl0YWxpemUgPSAocykgPT5cbiAgKHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpKVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvKFtBLVpdW2Etel0rKS9nLCAnICQxJylcbiAgICAucmVwbGFjZSgvKFtBLVpdezIsfSkvZywgJyAkMScpXG4gICAgLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbmV4cG9ydCBsZXQgY2h1bms6IChcbiAgYXJyYXk6IEFycmF5PGFueT4sXG4gIGNodW5rU2l6ZTogbnVtYmVyXG4pID0+IEFycmF5PEFycmF5PFRhYmxlUm93Pj47XG5jaHVuayA9IChhcnJheSwgY2h1bmtTaXplKSA9PiB7XG4gIGlmIChjaHVua1NpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNodW5rIHNpemUnKTtcbiAgfVxuICBpZiAoY2h1bmtTaXplID09PSAwICYmICFjaHVua1NpemUpIHtcbiAgICByZXR1cm4gW2FycmF5XTtcbiAgfVxuICBjb25zdCBDSFVOSyA9IFtdO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpICs9IGNodW5rU2l6ZSkge1xuICAgIENIVU5LLnB1c2goYXJyYXkuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSkpO1xuICB9XG4gIHJldHVybiBDSFVOSztcbn07XG5cbmV4cG9ydCBsZXQgc2VhcmNoOiAoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbixcbiAgZGF0YTogQXJyYXk8VGFibGVSb3c+LFxuICBjb25maWc6IFRhYmxlQ29uZmlnXG4pID0+IFRhYmxlUm93W107XG5zZWFyY2ggPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbixcbiAgZGF0YTogQXJyYXk8VGFibGVSb3c+LFxuICBjb25maWc6IFRhYmxlQ29uZmlnXG4pID0+IHtcbiAgaWYgKGNvbmZpZy5jb2x1bW5zKSB7XG4gICAgY29uc3Qgc2VhcmNoQ29sdW1ucyA9IE9iamVjdC5rZXlzKGNvbmZpZy5jb2x1bW5zKS5maWx0ZXIoXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAoa2V5KSA9PlxuICAgICAgICBjb25maWcuY29sdW1ucyAmJlxuICAgICAgICAhY29uZmlnLmNvbHVtbnNba2V5XT8uaGlkZGVuICYmXG4gICAgICAgIGNvbmZpZy5jb2x1bW5zW2tleV0/LnNlYXJjaCAhPT0gZmFsc2VcbiAgICApO1xuXG4gICAgY29uc3QgRklMVEVSRUQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IGRhdGFbaV07XG4gICAgICBjb25zdCBtYXRjaCA9XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJvdylcbiAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHNlYXJjaENvbHVtbnMuaW5kZXhPZihrZXkpICE9PSAtMSlcbiAgICAgICAgICAucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSwgaW5kZXgpOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgYWNjICtcbiAgICAgICAgICAgICAgKGluZGV4ID09PSAwID8gJycgOiAnID8gJykgK1xuICAgICAgICAgICAgICAoY2FzZVNlbnNpdGl2ZSA/IHZhbHVlICsgJycgOiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSwgJycpXG4gICAgICAgICAgLmluZGV4T2YodGV4dCkgIT09IC0xO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIEZJTFRFUkVEW0ZJTFRFUkVELmxlbmd0aF0gPSByb3c7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBGSUxURVJFRDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufTtcbiJdfQ==
59
+ export let calculate = (data, config) => {
60
+ const CALCULATIONS = {};
61
+ const COLUMN_CALCULATIONS = {};
62
+ let CALCULATED = Object.entries(config.footer?.columns || {})
63
+ .filter(([columnName, calculations]) => Object.values(calculations || {}).filter((value) => value !== false)
64
+ .length >= 0)
65
+ .reduce((acc, [columnName, calculations], index) => {
66
+ acc[columnName] = Object.entries(calculations || {})
67
+ .filter(([calculation, value]) => value !== false)
68
+ .reduce((acc, [calculation, value]) => {
69
+ if (COLUMN_CALCULATIONS[columnName]) {
70
+ COLUMN_CALCULATIONS[columnName].push(calculation);
71
+ }
72
+ else if (value === true) {
73
+ COLUMN_CALCULATIONS[columnName] = [calculation];
74
+ }
75
+ CALCULATIONS[calculation] = true;
76
+ if (typeof value === 'function') {
77
+ value = value(data, columnName);
78
+ }
79
+ acc[calculation] = value === true ? 0 : value;
80
+ return acc;
81
+ }, {});
82
+ return acc;
83
+ }, {});
84
+ if (Object.keys(CALCULATED).length > 0) {
85
+ for (let i = 0; i < data.length; i++) {
86
+ Object.entries(COLUMN_CALCULATIONS).forEach(([column, calculations]) => {
87
+ if (calculations.indexOf('sum') > -1) {
88
+ CALCULATED[column].sum += data[i][column];
89
+ }
90
+ if (calculations.indexOf('avg') > -1 &&
91
+ calculations.indexOf('sum') === -1) {
92
+ if (CALCULATED[column].sum === undefined) {
93
+ CALCULATED[column].sum = 0;
94
+ }
95
+ CALCULATED[column].sum += data[i][column];
96
+ }
97
+ if (calculations.indexOf('max') > -1 &&
98
+ (!CALCULATED[column].max || +data[i][column] > CALCULATED[column].max)) {
99
+ CALCULATED[column].max = +data[i][column];
100
+ }
101
+ if (calculations.indexOf('min') > -1 &&
102
+ (!CALCULATED[column].min || +data[i][column] < CALCULATED[column].min)) {
103
+ CALCULATED[column].min = +data[i][column];
104
+ }
105
+ });
106
+ }
107
+ Object.entries(COLUMN_CALCULATIONS).forEach(([column, calculations]) => {
108
+ if (calculations.indexOf('avg') !== -1) {
109
+ CALCULATED[column].avg = CALCULATED[column]?.sum / data.length;
110
+ }
111
+ if (calculations.indexOf('count') !== -1) {
112
+ CALCULATED[column].count = data.length;
113
+ }
114
+ });
115
+ }
116
+ return {
117
+ calculated: CALCULATED,
118
+ calculations: Object.keys(CALCULATIONS).sort((a, b) => (config.footer?.rowOrder?.indexOf(a) || 0) -
119
+ (config.footer?.rowOrder?.indexOf(b) || 0)),
120
+ calculatedColumnsCount: Object.keys(CALCULATED).length || 0,
121
+ };
122
+ };
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3V0aWxpdGllcy91dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxDQUFDLElBQUksTUFBNkIsQ0FBQztBQUN6QyxNQUFNLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFFMUUsTUFBTSxDQUFDLElBQUksVUFBaUMsQ0FBQztBQUM3QyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNqQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztLQUNsQixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO0tBQ2hDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDO0tBQzlCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO0tBQ3ZCLElBQUksRUFBRSxDQUFDO0FBRVosTUFBTSxDQUFDLElBQUksS0FHZ0IsQ0FBQztBQUM1QixLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7SUFDM0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztLQUN2QztJQUNELElBQUksU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEI7SUFDRCxNQUFNLEtBQUss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QUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDeEMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE9BQU87UUFDTCxVQUFVLEVBQUUsVUFBVTtRQUN0QixZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ1AsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUM3QztRQUNELHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUM7S0FDNUQsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLXJvdy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBsZXQgZGFzaGVkOiAoczogc3RyaW5nKSA9PiBzdHJpbmc7XG5kYXNoZWQgPSAoczogc3RyaW5nKSA9PiBzLnJlcGxhY2UoL1tBLVpdL2csIChtKSA9PiAnLScgKyBtLnRvTG93ZXJDYXNlKCkpO1xuXG5leHBvcnQgbGV0IGNhcGl0YWxpemU6IChzOiBzdHJpbmcpID0+IHN0cmluZztcbmNhcGl0YWxpemUgPSAocykgPT5cbiAgKHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpKVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvKFtBLVpdW2Etel0rKS9nLCAnICQxJylcbiAgICAucmVwbGFjZSgvKFtBLVpdezIsfSkvZywgJyAkMScpXG4gICAgLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbmV4cG9ydCBsZXQgY2h1bms6IChcbiAgYXJyYXk6IEFycmF5PGFueT4sXG4gIGNodW5rU2l6ZTogbnVtYmVyXG4pID0+IEFycmF5PEFycmF5PFRhYmxlUm93Pj47XG5jaHVuayA9IChhcnJheSwgY2h1bmtTaXplKSA9PiB7XG4gIGlmIChjaHVua1NpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNodW5rIHNpemUnKTtcbiAgfVxuICBpZiAoY2h1bmtTaXplID09PSAwICYmICFjaHVua1NpemUpIHtcbiAgICByZXR1cm4gW2FycmF5XTtcbiAgfVxuICBjb25zdCBDSFVOSyA9IFtdO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpICs9IGNodW5rU2l6ZSkge1xuICAgIENIVU5LLnB1c2goYXJyYXkuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSkpO1xuICB9XG4gIHJldHVybiBDSFVOSztcbn07XG5cbmV4cG9ydCBsZXQgc2VhcmNoOiAoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbixcbiAgZGF0YTogQXJyYXk8VGFibGVSb3c+LFxuICBjb25maWc6IFRhYmxlQ29uZmlnXG4pID0+IFRhYmxlUm93W107XG5zZWFyY2ggPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbixcbiAgZGF0YTogQXJyYXk8VGFibGVSb3c+LFxuICBjb25maWc6IFRhYmxlQ29uZmlnXG4pID0+IHtcbiAgaWYgKGNvbmZpZy5jb2x1bW5zKSB7XG4gICAgY29uc3Qgc2VhcmNoQ29sdW1ucyA9IE9iamVjdC5rZXlzKGNvbmZpZy5jb2x1bW5zKS5maWx0ZXIoXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAoa2V5KSA9PlxuICAgICAgICBjb25maWcuY29sdW1ucyAmJlxuICAgICAgICAhY29uZmlnLmNvbHVtbnNba2V5XT8uaGlkZGVuICYmXG4gICAgICAgIGNvbmZpZy5jb2x1bW5zW2tleV0/LnNlYXJjaCAhPT0gZmFsc2VcbiAgICApO1xuXG4gICAgY29uc3QgRklMVEVSRUQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IGRhdGFbaV07XG4gICAgICBjb25zdCBtYXRjaCA9XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJvdylcbiAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHNlYXJjaENvbHVtbnMuaW5kZXhPZihrZXkpICE9PSAtMSlcbiAgICAgICAgICAucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSwgaW5kZXgpOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoID0gY29uZmlnPy5jb2x1bW5zIVtrZXldPy5zZWFyY2g7XG4gICAgICAgICAgICAvLyBpZiBzZWFyY2ggaXMgYSBmdW5jdGlvbi4uLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgLy8gLi4udXNlIHNlYXJjaCBmdW5jdGlvbiB0byByZXR1cm4gdmFsdWUgdG8gc2VhcmNoXG4gICAgICAgICAgICAgIHZhbHVlID0gc2VhcmNoKHJvdywga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBhY2MgK1xuICAgICAgICAgICAgICAoaW5kZXggPT09IDAgPyAnJyA6ICcgPyAnKSArXG4gICAgICAgICAgICAgIChjYXNlU2Vuc2l0aXZlID8gdmFsdWUgKyAnJyA6ICh2YWx1ZSArICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LCAnJylcbiAgICAgICAgICAuaW5kZXhPZihjYXNlU2Vuc2l0aXZlID8gdGV4dCA6IHRleHQudG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIEZJTFRFUkVEW0ZJTFRFUkVELmxlbmd0aF0gPSByb3c7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBGSUxURVJFRDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBjYWxjdWxhdGUgPSAoZGF0YTogQXJyYXk8VGFibGVSb3c+LCBjb25maWc6IFRhYmxlQ29uZmlnKSA9PiB7XG4gIGNvbnN0IENBTENVTEFUSU9OUzogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgY29uc3QgQ09MVU1OX0NBTENVTEFUSU9OUzogeyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+IH0gPSB7fTtcbiAgbGV0IENBTENVTEFURUQgPSBPYmplY3QuZW50cmllcyhjb25maWcuZm9vdGVyPy5jb2x1bW5zIHx8IHt9KVxuICAgIC5maWx0ZXIoXG4gICAgICAoW2NvbHVtbk5hbWUsIGNhbGN1bGF0aW9uc10pID0+XG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FsY3VsYXRpb25zIHx8IHt9KS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gZmFsc2UpXG4gICAgICAgICAgLmxlbmd0aCA+PSAwXG4gICAgKVxuICAgIC5yZWR1Y2UoKGFjYzogYW55LCBbY29sdW1uTmFtZSwgY2FsY3VsYXRpb25zXSwgaW5kZXgpID0+IHtcbiAgICAgIGFjY1tjb2x1bW5OYW1lXSA9IE9iamVjdC5lbnRyaWVzKGNhbGN1bGF0aW9ucyB8fCB7fSlcbiAgICAgICAgLmZpbHRlcigoW2NhbGN1bGF0aW9uLCB2YWx1ZV0pID0+IHZhbHVlICE9PSBmYWxzZSlcbiAgICAgICAgLnJlZHVjZSgoYWNjOiBhbnksIFtjYWxjdWxhdGlvbiwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgaWYgKENPTFVNTl9DQUxDVUxBVElPTlNbY29sdW1uTmFtZV0pIHtcbiAgICAgICAgICAgIENPTFVNTl9DQUxDVUxBVElPTlNbY29sdW1uTmFtZV0ucHVzaChjYWxjdWxhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgQ09MVU1OX0NBTENVTEFUSU9OU1tjb2x1bW5OYW1lXSA9IFtjYWxjdWxhdGlvbl07XG4gICAgICAgICAgfVxuICAgICAgICAgIENBTENVTEFUSU9OU1tjYWxjdWxhdGlvbl0gPSB0cnVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUoZGF0YSwgY29sdW1uTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjY1tjYWxjdWxhdGlvbl0gPSB2YWx1ZSA9PT0gdHJ1ZSA/IDAgOiB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgaWYgKE9iamVjdC5rZXlzKENBTENVTEFURUQpLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKENPTFVNTl9DQUxDVUxBVElPTlMpLmZvckVhY2goKFtjb2x1bW4sIGNhbGN1bGF0aW9uc10pID0+IHtcbiAgICAgICAgaWYgKGNhbGN1bGF0aW9ucy5pbmRleE9mKCdzdW0nKSA+IC0xKSB7XG4gICAgICAgICAgQ0FMQ1VMQVRFRFtjb2x1bW5dLnN1bSArPSBkYXRhW2ldW2NvbHVtbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGN1bGF0aW9ucy5pbmRleE9mKCdhdmcnKSA+IC0xICYmXG4gICAgICAgICAgY2FsY3VsYXRpb25zLmluZGV4T2YoJ3N1bScpID09PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoQ0FMQ1VMQVRFRFtjb2x1bW5dLnN1bSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDQUxDVUxBVEVEW2NvbHVtbl0uc3VtID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgQ0FMQ1VMQVRFRFtjb2x1bW5dLnN1bSArPSBkYXRhW2ldW2NvbHVtbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGN1bGF0aW9ucy5pbmRleE9mKCdtYXgnKSA+IC0xICYmXG4gICAgICAgICAgKCFDQUxDVUxBVEVEW2NvbHVtbl0ubWF4IHx8ICtkYXRhW2ldW2NvbHVtbl0gPiBDQUxDVUxBVEVEW2NvbHVtbl0ubWF4KVxuICAgICAgICApIHtcbiAgICAgICAgICBDQUxDVUxBVEVEW2NvbHVtbl0ubWF4ID0gK2RhdGFbaV1bY29sdW1uXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2FsY3VsYXRpb25zLmluZGV4T2YoJ21pbicpID4gLTEgJiZcbiAgICAgICAgICAoIUNBTENVTEFURURbY29sdW1uXS5taW4gfHwgK2RhdGFbaV1bY29sdW1uXSA8IENBTENVTEFURURbY29sdW1uXS5taW4pXG4gICAgICAgICkge1xuICAgICAgICAgIENBTENVTEFURURbY29sdW1uXS5taW4gPSArZGF0YVtpXVtjb2x1bW5dO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXMoQ09MVU1OX0NBTENVTEFUSU9OUykuZm9yRWFjaCgoW2NvbHVtbiwgY2FsY3VsYXRpb25zXSkgPT4ge1xuICAgICAgaWYgKGNhbGN1bGF0aW9ucy5pbmRleE9mKCdhdmcnKSAhPT0gLTEpIHtcbiAgICAgICAgQ0FMQ1VMQVRFRFtjb2x1bW5dLmF2ZyA9IENBTENVTEFURURbY29sdW1uXT8uc3VtIC8gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoY2FsY3VsYXRpb25zLmluZGV4T2YoJ2NvdW50JykgIT09IC0xKSB7XG4gICAgICAgIENBTENVTEFURURbY29sdW1uXS5jb3VudCA9IGRhdGEubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlZDogQ0FMQ1VMQVRFRCxcbiAgICBjYWxjdWxhdGlvbnM6IE9iamVjdC5rZXlzKENBTENVTEFUSU9OUykuc29ydChcbiAgICAgIChhLCBiKSA9PlxuICAgICAgICAoY29uZmlnLmZvb3Rlcj8ucm93T3JkZXI/LmluZGV4T2YoYSkgfHwgMCkgLVxuICAgICAgICAoY29uZmlnLmZvb3Rlcj8ucm93T3JkZXI/LmluZGV4T2YoYikgfHwgMClcbiAgICApLFxuICAgIGNhbGN1bGF0ZWRDb2x1bW5zQ291bnQ6IE9iamVjdC5rZXlzKENBTENVTEFURUQpLmxlbmd0aCB8fCAwLFxuICB9O1xufTtcbiJdfQ==