@sumaris-net/ngx-components 2.4.114 → 2.4.115

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 (49) hide show
  1. package/doc/changelog.md +3 -0
  2. package/esm2020/public_api.mjs +2 -1
  3. package/esm2020/src/app/admin/services/filter/person.filter.mjs +1 -1
  4. package/esm2020/src/app/admin/services/person.service.mjs +9 -1
  5. package/esm2020/src/app/core/form/entity/editor.class.mjs +6 -6
  6. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +5 -2
  7. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +1 -1
  8. package/esm2020/src/app/core/menu/menu.component.mjs +32 -197
  9. package/esm2020/src/app/core/menu/menu.model.mjs +38 -13
  10. package/esm2020/src/app/core/menu/menu.service.mjs +249 -18
  11. package/esm2020/src/app/core/menu/testing/menu-other.testing.mjs +52 -0
  12. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +68 -51
  13. package/esm2020/src/app/core/menu/testing/menu.testing.module.mjs +41 -6
  14. package/esm2020/src/app/core/services/crypto.service.mjs +14 -21
  15. package/esm2020/src/app/core/services/model/account.model.mjs +1 -1
  16. package/esm2020/src/app/core/services/model/config.model.mjs +1 -1
  17. package/esm2020/src/app/core/services/model/department.model.mjs +1 -1
  18. package/esm2020/src/app/core/services/model/peer.model.mjs +1 -1
  19. package/esm2020/src/app/core/services/model/person.model.mjs +1 -1
  20. package/esm2020/src/app/core/services/model/referential.model.mjs +1 -1
  21. package/esm2020/src/app/core/services/model/settings.model.mjs +1 -1
  22. package/esm2020/src/app/core/services/platform.service.mjs +3 -2
  23. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +1 -1
  24. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +1 -1
  25. package/esm2020/src/app/shared/file/json.utils.mjs +3 -3
  26. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
  27. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +1 -1
  28. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +1 -1
  29. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +1 -1
  30. package/esm2020/src/app/shared/services/startable-service.class.mjs +1 -1
  31. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +1 -1
  32. package/esm2020/src/app/social/message/message.model.mjs +1 -1
  33. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +1 -1
  34. package/fesm2015/sumaris-net.ngx-components.mjs +917 -739
  35. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  36. package/fesm2020/sumaris-net.ngx-components.mjs +910 -736
  37. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  38. package/package.json +7 -5
  39. package/public_api.d.ts +1 -0
  40. package/src/app/admin/services/person.service.d.ts +5 -0
  41. package/src/app/core/form/text-popover/text-popover.component.d.ts +2 -1
  42. package/src/app/core/menu/menu.component.d.ts +10 -19
  43. package/src/app/core/menu/menu.model.d.ts +17 -7
  44. package/src/app/core/menu/menu.service.d.ts +51 -11
  45. package/src/app/core/menu/testing/menu-other.testing.d.ts +13 -0
  46. package/src/app/core/menu/testing/menu.testing.d.ts +16 -3
  47. package/src/app/core/menu/testing/menu.testing.module.d.ts +6 -5
  48. package/src/app/core/services/crypto.service.d.ts +7 -7
  49. package/src/app/core/services/platform.service.d.ts +3 -2
@@ -1,22 +1,29 @@
1
- import { equals } from '../../shared/functions';
1
+ import { isNilOrBlank } from '../../shared/functions';
2
2
  export class MenuItems {
3
3
  /**
4
4
  * Compare, without checking the children
5
- * @param a
6
- * @param b
5
+ * @param mainItem
6
+ * @param otherItem
7
7
  */
8
- static isSame(a, b) {
9
- return a.path === b.path
10
- && a.parentPath === b.parentPath
11
- && a.title === b.title
12
- && this.isSameParams(a.pathParams, b.pathParams);
8
+ static isSame(mainItem, otherItem) {
9
+ return mainItem.path === otherItem.path
10
+ && mainItem.parentPath === otherItem.parentPath
11
+ && mainItem.title === otherItem.title
12
+ && this.isSameParams(mainItem.pathParams, otherItem.pathParams);
13
13
  }
14
- static isSameParams(a, b) {
15
- return equals(a || {}, b || {});
14
+ /**
15
+ * All key/value of the mainParams should exist (and be equals) in the other params
16
+ * @param mainParams
17
+ * @param otherParams
18
+ */
19
+ static isSameParams(mainParams, otherParams) {
20
+ const result = Object.entries(mainParams).every(([key, value]) => value === otherParams[key]);
21
+ return result;
16
22
  }
17
23
  static isParent(child, parent) {
18
- return child.parentPath && child.parentPath === parent?.path
19
- && this.isSameParams(child.parentPathParams, parent.pathParams) || false;
24
+ const result = child.parentPath && child.parentPath === parent?.path
25
+ && this.isSameParams(child.parentPathParams, parent['pathParams'] || parent['params']) || false;
26
+ return result;
20
27
  }
21
28
  static checkIfVisible(item, accountService, config, opts) {
22
29
  opts = opts || {};
@@ -48,7 +55,25 @@ export class MenuItems {
48
55
  }
49
56
  return true;
50
57
  }
58
+ static parsePathWithQuery(pathWithQuery) {
59
+ const index = pathWithQuery.lastIndexOf('?');
60
+ if (index < 0)
61
+ return { path: pathWithQuery, params: {} };
62
+ const path = pathWithQuery.substring(0, index);
63
+ const queryString = pathWithQuery.substring(index);
64
+ const params = Object.fromEntries(new URLSearchParams(queryString));
65
+ return { path, params };
66
+ }
67
+ static getUrl(item) {
68
+ return this.getUrlFromPathAndParams(item?.path, item?.pathParams);
69
+ }
70
+ static getUrlFromPathAndParams(path, params) {
71
+ const queryString = Object.entries(params || {}).map(([key, value]) => `${key}=${value}`).join('&');
72
+ if (isNilOrBlank(queryString))
73
+ return path || '';
74
+ return `${path || ''}?${queryString}`;
75
+ }
51
76
  }
52
77
  export class MenuOptions {
53
78
  }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9tZW51L21lbnUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBc0I5QyxNQUFNLE9BQU8sU0FBUztJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFXLEVBQUUsQ0FBVztRQUNwQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUk7ZUFDckIsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVTtlQUM3QixDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLO2VBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBMEIsRUFBRSxDQUEwQjtRQUN4RSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFlLEVBQUUsTUFBZ0I7UUFDL0MsT0FBTyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFLElBQUk7ZUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFjLEVBQ2QsY0FBOEIsRUFDOUIsTUFBcUIsRUFDckIsSUFJQztRQUNyQixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsS0FBSztvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksUUFBUSxlQUFlLElBQUksQ0FBQyxLQUFLLDRCQUE0QixJQUFJLENBQUMsT0FBTyxxQkFBcUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ3ZLLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUVJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUMxQixNQUFNLGVBQWUsR0FBSSxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxRQUFRLGVBQWUsSUFBSSxDQUFDLEtBQUssMEJBQTBCLElBQUksQ0FBQyxZQUFZLHFCQUFxQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDMUssT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQix3R0FBd0c7WUFDeEcsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssTUFBTSxDQUFDO1lBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDckIsSUFBSSxJQUFJLENBQUMsS0FBSztvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqSCxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxXQUFXO0NBRXZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVc2VyUHJvZmlsZUxhYmVsfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7SWNvblJlZn0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7ZXF1YWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBNZW51SXRlbSBleHRlbmRzIEljb25SZWYge1xuICB0aXRsZTogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmcgfCBhbnk7XG4gIHByb2ZpbGU/OiBVc2VyUHJvZmlsZUxhYmVsO1xuICBleGFjdFByb2ZpbGU/OiBVc2VyUHJvZmlsZUxhYmVsO1xuICBjb2xvcj86IHN0cmluZztcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIC8vIEEgY29uZmlnIHByb3BlcnR5LCB0byBlbmFibGUgdGhlIG1lbnUgaXRlbVxuICBpZlByb3BlcnR5Pzogc3RyaW5nO1xuICAvLyBBIGNvbmZpZyBwcm9wZXJ0eSwgdG8gb3ZlcnJpZGUgdGhlIHRpdGxlXG4gIHRpdGxlUHJvcGVydHk/OiBzdHJpbmc7XG4gIHRpdGxlQXJncz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBwYXRoUGFyYW1zPzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIHBhcmVudFBhdGg/OiBzdHJpbmc7XG4gIHBhcmVudFBhdGhQYXJhbXM/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICBjaGlsZHJlbj86IE1lbnVJdGVtW107XG59XG5cbmV4cG9ydCBjbGFzcyBNZW51SXRlbXMge1xuXG4gIC8qKlxuICAgKiBDb21wYXJlLCB3aXRob3V0IGNoZWNraW5nIHRoZSBjaGlsZHJlblxuICAgKiBAcGFyYW0gYVxuICAgKiBAcGFyYW0gYlxuICAgKi9cbiAgc3RhdGljIGlzU2FtZShhOiBNZW51SXRlbSwgYjogTWVudUl0ZW0pIHtcbiAgICByZXR1cm4gYS5wYXRoID09PSBiLnBhdGhcbiAgICAmJiBhLnBhcmVudFBhdGggPT09IGIucGFyZW50UGF0aFxuICAgICYmIGEudGl0bGUgPT09IGIudGl0bGVcbiAgICAmJiB0aGlzLmlzU2FtZVBhcmFtcyhhLnBhdGhQYXJhbXMsIGIucGF0aFBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgaXNTYW1lUGFyYW1zKGE6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBiOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgIHJldHVybiBlcXVhbHMoYSB8fCB7fSwgYiB8fCB7fSk7XG4gIH1cblxuICBzdGF0aWMgaXNQYXJlbnQoY2hpbGQ6IE1lbnVJdGVtLCBwYXJlbnQ6IE1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIGNoaWxkLnBhcmVudFBhdGggJiYgY2hpbGQucGFyZW50UGF0aCA9PT0gcGFyZW50Py5wYXRoXG4gICAgICAmJiB0aGlzLmlzU2FtZVBhcmFtcyhjaGlsZC5wYXJlbnRQYXRoUGFyYW1zLCBwYXJlbnQucGF0aFBhcmFtcykgfHwgZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZpc2libGUoaXRlbTogTWVudUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzPzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvZ2luPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTogYm9vbGVhbiB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKGl0ZW0ucHJvZmlsZSkge1xuICAgICAgY29uc3QgaGFzUHJvZmlsZSA9IGFjY291bnRTZXJ2aWNlLmlzTG9naW4oKSAmJiBhY2NvdW50U2VydmljZS5oYXNNaW5Qcm9maWxlKGl0ZW0ucHJvZmlsZSk7XG4gICAgICBpZiAoIWhhc1Byb2ZpbGUpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7b3B0cyAmJiBvcHRzLmxvZ1ByZWZpeCB8fCAnW21lbnVdJ30gSGlkZSBpdGVtICcke2l0ZW0udGl0bGV9JzogbmVlZCB0aGUgbWluIHByb2ZpbGUgJyR7aXRlbS5wcm9maWxlfScgdG8gYWNjZXNzIHBhdGggJyR7aXRlbS5wYXRofSdgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsc2UgaWYgKGl0ZW0uZXhhY3RQcm9maWxlKSB7XG4gICAgICBjb25zdCBoYXNFeGFjdFByb2ZpbGUgPSAgYWNjb3VudFNlcnZpY2UuaGFzRXhhY3RQcm9maWxlKGl0ZW0uZXhhY3RQcm9maWxlKTtcbiAgICAgIGlmICghaGFzRXhhY3RQcm9maWxlKSB7XG4gICAgICAgIGlmIChvcHRzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke29wdHMgJiYgb3B0cy5sb2dQcmVmaXggfHwgJ1ttZW51XSd9IEhpZGUgaXRlbSAnJHtpdGVtLnRpdGxlfSc6IG5lZWQgZXhhY3QgcHJvZmlsZSAnJHtpdGVtLmV4YWN0UHJvZmlsZX0nIHRvIGFjY2VzcyBwYXRoICcke2l0ZW0ucGF0aH0nYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBlbmFibGUgYnkgY29uZmlnXG4gICAgaWYgKGl0ZW0uaWZQcm9wZXJ0eSkge1xuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiW21lbnVdIENoZWNraW5nIGlmIHByb3BlcnR5IGVuYWJsZSA/IFwiICsgaXRlbS5pZlByb3BlcnR5LCBjb25maWcgJiYgY29uZmlnLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgaXNFbmFibGVCeUNvbmZpZyA9IGNvbmZpZyAmJiBjb25maWcucHJvcGVydGllc1tpdGVtLmlmUHJvcGVydHldID09PSAndHJ1ZSc7XG4gICAgICBpZiAoIWlzRW5hYmxlQnlDb25maWcpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW51XSBDb25maWcgcHJvcGVydHkgXFwnJyArIGl0ZW0uaWZQcm9wZXJ0eSArICdcXCcgbm90IFxcJ3RydWVcXCcgZm9yICcsIGl0ZW0ucGF0aCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWVudU9wdGlvbnMge1xuICAvLyBUT0RPIGFkZCBvcHRpb25zLCB3aGVuIG5lZWQgc3BlY2lmaWMgYmVoYXZpb3Igb24gcHJvamVjdHNcbn1cbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9tZW51L21lbnUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBd0JwRCxNQUFNLE9BQU8sU0FBUztJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFrQixFQUFFLFNBQW1CO1FBQ25ELE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSTtlQUNwQyxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxVQUFVO2VBQzVDLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLEtBQUs7ZUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBbUMsRUFBRSxXQUFvQztRQUMzRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBZSxFQUFFLE1BQWdDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUUsSUFBSTtlQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksTUFB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QUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BHLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNqRCxPQUFPLEdBQUcsSUFBSSxJQUFHLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sV0FBVztDQUV2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VXNlclByb2ZpbGVMYWJlbH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvcGVyc29uLm1vZGVsJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7QWNjb3VudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQge0ljb25SZWZ9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQge2lzTmlsT3JCbGFua30gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7TWVudVBhdGhQYXJhbX0gZnJvbSBcIi4vbWVudS5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW0gZXh0ZW5kcyBJY29uUmVmIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nIHwgYW55O1xuICBwcm9maWxlPzogVXNlclByb2ZpbGVMYWJlbDtcbiAgZXhhY3RQcm9maWxlPzogVXNlclByb2ZpbGVMYWJlbDtcbiAgY29sb3I/OiBzdHJpbmc7XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuICAvLyBBIGNvbmZpZyBwcm9wZXJ0eSwgdG8gZW5hYmxlIHRoZSBtZW51IGl0ZW1cbiAgaWZQcm9wZXJ0eT86IHN0cmluZztcbiAgLy8gQSBjb25maWcgcHJvcGVydHksIHRvIG92ZXJyaWRlIHRoZSB0aXRsZVxuICB0aXRsZVByb3BlcnR5Pzogc3RyaW5nO1xuICB0aXRsZUFyZ3M/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgcGF0aFBhcmFtcz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBwYXJlbnRQYXRoPzogc3RyaW5nO1xuICBwYXJlbnRQYXRoUGFyYW1zPzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgJGNoaWxkcmVuPzogQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+O1xufVxuXG5leHBvcnQgY2xhc3MgTWVudUl0ZW1zIHtcblxuICAvKipcbiAgICogQ29tcGFyZSwgd2l0aG91dCBjaGVja2luZyB0aGUgY2hpbGRyZW5cbiAgICogQHBhcmFtIG1haW5JdGVtXG4gICAqIEBwYXJhbSBvdGhlckl0ZW1cbiAgICovXG4gIHN0YXRpYyBpc1NhbWUobWFpbkl0ZW06IE1lbnVJdGVtLCBvdGhlckl0ZW06IE1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIG1haW5JdGVtLnBhdGggPT09IG90aGVySXRlbS5wYXRoXG4gICAgJiYgbWFpbkl0ZW0ucGFyZW50UGF0aCA9PT0gb3RoZXJJdGVtLnBhcmVudFBhdGhcbiAgICAmJiBtYWluSXRlbS50aXRsZSA9PT0gb3RoZXJJdGVtLnRpdGxlXG4gICAgJiYgdGhpcy5pc1NhbWVQYXJhbXMobWFpbkl0ZW0ucGF0aFBhcmFtcywgb3RoZXJJdGVtLnBhdGhQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBrZXkvdmFsdWUgb2YgdGhlIG1haW5QYXJhbXMgc2hvdWxkIGV4aXN0IChhbmQgYmUgZXF1YWxzKSBpbiB0aGUgb3RoZXIgcGFyYW1zXG4gICAqIEBwYXJhbSBtYWluUGFyYW1zXG4gICAqIEBwYXJhbSBvdGhlclBhcmFtc1xuICAgKi9cbiAgc3RhdGljIGlzU2FtZVBhcmFtcyhtYWluUGFyYW1zOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgb3RoZXJQYXJhbXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMobWFpblBhcmFtcykuZXZlcnkoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgPT09IG90aGVyUGFyYW1zW2tleV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgaXNQYXJlbnQoY2hpbGQ6IE1lbnVJdGVtLCBwYXJlbnQ6IE1lbnVJdGVtIHwgTWVudVBhdGhQYXJhbSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNoaWxkLnBhcmVudFBhdGggJiYgY2hpbGQucGFyZW50UGF0aCA9PT0gcGFyZW50Py5wYXRoXG4gICAgICAgICYmIHRoaXMuaXNTYW1lUGFyYW1zKGNoaWxkLnBhcmVudFBhdGhQYXJhbXMsIHBhcmVudFsncGF0aFBhcmFtcyddIHx8IHBhcmVudFsncGFyYW1zJ10pIHx8IGZhbHNlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZpc2libGUoaXRlbTogTWVudUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzPzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvZ2luPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTogYm9vbGVhbiB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKGl0ZW0ucHJvZmlsZSkge1xuICAgICAgY29uc3QgaGFzUHJvZmlsZSA9IGFjY291bnRTZXJ2aWNlLmlzTG9naW4oKSAmJiBhY2NvdW50U2VydmljZS5oYXNNaW5Qcm9maWxlKGl0ZW0ucHJvZmlsZSk7XG4gICAgICBpZiAoIWhhc1Byb2ZpbGUpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7b3B0cyAmJiBvcHRzLmxvZ1ByZWZpeCB8fCAnW21lbnVdJ30gSGlkZSBpdGVtICcke2l0ZW0udGl0bGV9JzogbmVlZCB0aGUgbWluIHByb2ZpbGUgJyR7aXRlbS5wcm9maWxlfScgdG8gYWNjZXNzIHBhdGggJyR7aXRlbS5wYXRofSdgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsc2UgaWYgKGl0ZW0uZXhhY3RQcm9maWxlKSB7XG4gICAgICBjb25zdCBoYXNFeGFjdFByb2ZpbGUgPSAgYWNjb3VudFNlcnZpY2UuaGFzRXhhY3RQcm9maWxlKGl0ZW0uZXhhY3RQcm9maWxlKTtcbiAgICAgIGlmICghaGFzRXhhY3RQcm9maWxlKSB7XG4gICAgICAgIGlmIChvcHRzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke29wdHMgJiYgb3B0cy5sb2dQcmVmaXggfHwgJ1ttZW51XSd9IEhpZGUgaXRlbSAnJHtpdGVtLnRpdGxlfSc6IG5lZWQgZXhhY3QgcHJvZmlsZSAnJHtpdGVtLmV4YWN0UHJvZmlsZX0nIHRvIGFjY2VzcyBwYXRoICcke2l0ZW0ucGF0aH0nYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBlbmFibGUgYnkgY29uZmlnXG4gICAgaWYgKGl0ZW0uaWZQcm9wZXJ0eSkge1xuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiW21lbnVdIENoZWNraW5nIGlmIHByb3BlcnR5IGVuYWJsZSA/IFwiICsgaXRlbS5pZlByb3BlcnR5LCBjb25maWcgJiYgY29uZmlnLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgaXNFbmFibGVCeUNvbmZpZyA9IGNvbmZpZyAmJiBjb25maWcucHJvcGVydGllc1tpdGVtLmlmUHJvcGVydHldID09PSAndHJ1ZSc7XG4gICAgICBpZiAoIWlzRW5hYmxlQnlDb25maWcpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW51XSBDb25maWcgcHJvcGVydHkgXFwnJyArIGl0ZW0uaWZQcm9wZXJ0eSArICdcXCcgbm90IFxcJ3RydWVcXCcgZm9yICcsIGl0ZW0ucGF0aCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVBhdGhXaXRoUXVlcnkocGF0aFdpdGhRdWVyeTogc3RyaW5nKTogTWVudVBhdGhQYXJhbSB7XG4gICAgY29uc3QgaW5kZXggPSBwYXRoV2l0aFF1ZXJ5Lmxhc3RJbmRleE9mKCc/Jyk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHtwYXRoOiBwYXRoV2l0aFF1ZXJ5LCBwYXJhbXM6IHt9fTtcbiAgICBjb25zdCBwYXRoID0gcGF0aFdpdGhRdWVyeS5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcGF0aFdpdGhRdWVyeS5zdWJzdHJpbmcoaW5kZXgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcm9tRW50cmllcyhuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5U3RyaW5nKSk7XG4gICAgcmV0dXJuIHtwYXRoLCBwYXJhbXN9O1xuICB9XG5cbiAgc3RhdGljIGdldFVybChpdGVtOiBNZW51SXRlbSkge1xuICAgIHJldHVybiB0aGlzLmdldFVybEZyb21QYXRoQW5kUGFyYW1zKGl0ZW0/LnBhdGgsIGl0ZW0/LnBhdGhQYXJhbXMpO1xuICB9XG4gIHN0YXRpYyBnZXRVcmxGcm9tUGF0aEFuZFBhcmFtcyhwYXRoOiBzdHJpbmcsIHBhcmFtcz86IGFueSkge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmVudHJpZXMocGFyYW1zIHx8IHt9KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApLmpvaW4oJyYnKTtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHF1ZXJ5U3RyaW5nKSkgcmV0dXJuIHBhdGggfHwgJyc7XG4gICAgcmV0dXJuIGAke3BhdGggfHwnJ30/JHtxdWVyeVN0cmluZ31gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZW51T3B0aW9ucyB7XG4gIC8vIFRPRE8gYWRkIG9wdGlvbnMsIHdoZW4gbmVlZCBzcGVjaWZpYyBiZWhhdmlvciBvbiBwcm9qZWN0c1xufVxuIl19
@@ -1,18 +1,42 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
1
+ import { EventEmitter, Inject, Injectable, Optional } from '@angular/core';
2
+ import { BehaviorSubject, merge, Subject } from 'rxjs';
3
+ import { MenuItems } from './menu.model';
4
+ import { APP_MENU_ITEMS } from './menu.component';
5
+ import { NavigationEnd } from '@angular/router';
6
+ import { StartableService } from '../../shared/services/startable-service.class';
7
+ import { ENVIRONMENT } from '../../../environments/environment.class';
8
+ import { DateUtils } from '../../shared/dates';
9
+ import { debounceTime, filter, map, mapTo, mergeMap, tap } from 'rxjs/operators';
10
+ import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
11
+ import { isNotNilOrBlank } from '../../shared/functions';
3
12
  import * as i0 from "@angular/core";
13
+ import * as i1 from "../services/platform.service";
14
+ import * as i2 from "../services/config.service";
15
+ import * as i3 from "../services/account.service";
16
+ import * as i4 from "@angular/router";
17
+ import * as i5 from "../../../environments/environment.class";
4
18
  export const DEFAULT_MENU_SHOW_WHEN = 'lg';
5
- export class MenuService {
6
- constructor() {
7
- this.onMenuComponentReady = new BehaviorSubject(false);
19
+ export class MenuService extends StartableService {
20
+ constructor(platformService, configService, accountService, router, environment, rootItems) {
21
+ super(platformService);
22
+ this.platformService = platformService;
23
+ this.configService = configService;
24
+ this.accountService = accountService;
25
+ this.router = router;
26
+ this.environment = environment;
27
+ this.onLoginChange = new Subject();
28
+ this.onUpdateMenu = new EventEmitter();
29
+ this.$items = new BehaviorSubject(undefined);
30
+ this._logPrefix = '[menu-service]';
8
31
  this._$toggled = new Subject();
9
32
  this._$opened = new Subject();
10
33
  this._$splitPaneWhen = new BehaviorSubject(DEFAULT_MENU_SHOW_WHEN);
11
34
  this._$enabled = new BehaviorSubject(true);
12
- this._$subMenuItem = new Subject();
35
+ this._debug = !environment.production;
36
+ this.$items.next((rootItems || []).map(i => this.prepareItem(i)));
13
37
  }
14
- get subMenuItem() {
15
- return this._$subMenuItem;
38
+ get rootItems() {
39
+ return this.$items.value;
16
40
  }
17
41
  get opened() {
18
42
  return this._$opened.asObservable();
@@ -42,26 +66,233 @@ export class MenuService {
42
66
  this._$splitPaneWhen.next(DEFAULT_MENU_SHOW_WHEN);
43
67
  }
44
68
  }
45
- clearSubMenuItems() {
46
- // TODO
47
- this._$subMenuItem.next(null);
48
- }
49
- addSubMenuItem(value) {
50
- this._$subMenuItem.next(value);
51
- }
52
69
  _markAsOpened() {
53
70
  this._$opened.next(true);
54
71
  }
55
72
  _markAsClosed() {
56
73
  this._$opened.next(false);
57
74
  }
75
+ async addSubMenuItems(newItems, opts) {
76
+ await this.ready();
77
+ newItems.forEach(i => this.addSubMenuItem(i), opts);
78
+ }
79
+ async ngOnStart() {
80
+ console.info(`${this._logPrefix} Starting...`);
81
+ // Update component when refresh is need (=login events or config changed)
82
+ this.registerSubscription(merge(merge(this.accountService.onLogin
83
+ .pipe(
84
+ // Filter on account changes
85
+ filter(account => !DateUtils.isSame(account?.updateDate, this.lastAccountUpdateDate))), this.configService.config
86
+ .pipe(
87
+ // Store the config
88
+ tap(config => this._config = config)))
89
+ .pipe(
90
+ // Add debounce to avoid to trigger twice, at startup
91
+ debounceTime(250),
92
+ // Wait account service ready (can be restarted)
93
+ mergeMap(() => this.accountService.ready()), map(() => this.accountService.account)),
94
+ // Logout
95
+ this.accountService.onLogout.pipe(mapTo(null)))
96
+ .subscribe(async (account) => {
97
+ if (account?.updateDate) {
98
+ this.lastAccountUpdateDate = account.updateDate;
99
+ this.onLoginChange.next(account);
100
+ }
101
+ else {
102
+ this.lastAccountUpdateDate = null;
103
+ this.onLoginChange.next(null);
104
+ }
105
+ this.refreshMenuItems();
106
+ }));
107
+ this.registerSubscription(this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((event) => {
108
+ const pathParam = MenuItems.parsePathWithQuery(event.url);
109
+ const excludedItems = [];
110
+ const items = this.detachSubMenus(pathParam, this.$items.value, excludedItems);
111
+ console.debug(`${this._logPrefix} Detached sub menus: `, excludedItems);
112
+ // this.addSubMenuItems();
113
+ //this.$items.next(items);
114
+ }));
115
+ return this.$items.value;
116
+ }
117
+ refreshMenuItems() {
118
+ if (this._debug)
119
+ console.debug(`${this._logPrefix} Refreshing menu items...`);
120
+ // Insert menu items, from the config
121
+ const configValue = this._config && this._config.getProperty(CORE_CONFIG_OPTIONS.MENU_ITEMS);
122
+ if (isNotNilOrBlank(configValue)) {
123
+ try {
124
+ const configItems = JSON.parse(configValue);
125
+ this._data = (configItems || []).reduce((res, item) => {
126
+ if (item.after) {
127
+ const index = res.findIndex(i => i.title === item.after);
128
+ if (index !== -1) {
129
+ return res.slice(0, index + 1)
130
+ .concat(item)
131
+ .concat(res.slice(index + 1));
132
+ }
133
+ }
134
+ if (item.before) {
135
+ const index = res.findIndex(i => i.title === item.before);
136
+ if (index !== -1) {
137
+ return res.slice(0, index)
138
+ .concat(item)
139
+ .concat(res.slice(index));
140
+ }
141
+ }
142
+ return res.concat(item);
143
+ }, this._data);
144
+ }
145
+ catch (err) {
146
+ console.error(`${this._logPrefix} Invalid value for option '${CORE_CONFIG_OPTIONS.MENU_ITEMS.key}'. Expected an array of menu item`, err);
147
+ }
148
+ }
149
+ // TODO : isLogin is not used in MenuItems.checkIfVisible
150
+ const opts = { debug: this._debug };
151
+ const filteredItems = this._data
152
+ .filter(item => MenuItems.checkIfVisible(item, this.accountService, this._config, opts))
153
+ .map(item => {
154
+ // Replace title using properties
155
+ if (isNotNilOrBlank(item.titleProperty) && this._config) {
156
+ const title = this._config.properties[item.titleProperty];
157
+ if (title)
158
+ return { ...item, title }; // Create a copy, to keep the original item.title
159
+ }
160
+ return item;
161
+ });
162
+ this.$items.next(filteredItems);
163
+ }
164
+ async addSubMenuItem(newItem, opts) {
165
+ opts = {
166
+ skipIfExists: false,
167
+ ...opts,
168
+ };
169
+ // Make sure path (and pathParams) are filled in the same way
170
+ newItem = this.prepareItem(newItem);
171
+ // Find if item already exists
172
+ const existingItem = this.findExistingItem(newItem);
173
+ if (existingItem && opts.skipIfExists) {
174
+ // DEBUG
175
+ console.debug(`${this._logPrefix} Skipping sub item (already exist)`, newItem);
176
+ return; // Already add
177
+ }
178
+ const parent = this.findParent(newItem);
179
+ if (!parent) {
180
+ console.warn(`${this._logPrefix} Unable to add sub item: no parent found`);
181
+ const parentUrlTre = this.router.createUrlTree(newItem.parentPath.split('/'), {
182
+ queryParams: newItem.parentPathParams
183
+ });
184
+ const data = this.router.routerState.root.parent?.data;
185
+ console.log('TODO check parent data', data);
186
+ /*await this.router.navigateByUrl(newItem.parentPath, {
187
+ skipLocationChange: true
188
+ });*/
189
+ }
190
+ else {
191
+ this.addMenuToParent(parent, newItem);
192
+ }
193
+ }
194
+ ;
195
+ prepareItem(item) {
196
+ item = {
197
+ ...item,
198
+ $children: item.$children || new BehaviorSubject([])
199
+ };
200
+ // Clean
201
+ if (item.path) {
202
+ const { path, params } = MenuItems.parsePathWithQuery(item.path);
203
+ item.path = path;
204
+ item.pathParams = { ...item.pathParams, ...params };
205
+ }
206
+ if (item.parentPath) {
207
+ const { path, params } = MenuItems.parsePathWithQuery(item.parentPath);
208
+ item.parentPath = path;
209
+ item.parentPathParams = { ...item.parentPathParams, ...params };
210
+ }
211
+ return item;
212
+ }
213
+ findExistingItem(item, items) {
214
+ items = items || this.$items.value;
215
+ if (!items.length)
216
+ return undefined; // Not found
217
+ return items.find(i => MenuItems.isSame(i, item) || (i.$children && this.findExistingItem(item, i.$children.value)));
218
+ }
219
+ findParent(childItem, parentItems) {
220
+ if (!childItem?.path)
221
+ return undefined;
222
+ parentItems = parentItems || this.$items.value;
223
+ return parentItems.reduce((res, item) => {
224
+ if (!item?.path)
225
+ return res;
226
+ // A found item already match with the menuItem.parentPath : keep it as it
227
+ // There is a found candidate that already match the current candidate : keep it
228
+ if (MenuItems.isParent(childItem, res))
229
+ return res;
230
+ // If the menu item has explicit parentPath and its path and path param are the same as the candidate : use it as parent
231
+ if (MenuItems.isParent(childItem, item))
232
+ return item;
233
+ if (!res && item.$children?.value.length) {
234
+ return this.findParent(childItem, item.$children?.value);
235
+ }
236
+ return res;
237
+ }, undefined);
238
+ }
239
+ ;
240
+ addMenuToParent(parent, child) {
241
+ console.debug(`${this._logPrefix}Adding a sub-menu ${MenuItems.getUrl(child)} to parent menu ${MenuItems.getUrl(parent)}`);
242
+ // Avoid to keep identical menu item (we replace it with the new child menu item)
243
+ //if (!parent?.$children) parent.$children = new BehaviorSubject<MenuItem[]>([]);
244
+ const children = parent.$children.value || [];
245
+ const existingIndex = children.findIndex(item => MenuItems.isSame(child, item));
246
+ if (existingIndex !== -1) {
247
+ children[existingIndex] = child;
248
+ }
249
+ else {
250
+ children.push(child);
251
+ }
252
+ parent.$children.next(children);
253
+ this.onUpdateMenu.emit();
254
+ }
255
+ detachSubMenus(currentPathParam, items, excludedItems) {
256
+ items = items || this.rootItems;
257
+ excludedItems = excludedItems || [];
258
+ items = items.filter(item => {
259
+ if (!item.parentPath)
260
+ return true; // Always keep root items
261
+ // Current route = param: keep it
262
+ // if (MenuItems.isParent(item, currentPathParam)) return true;
263
+ // Item parent path starts with the current path: keep it
264
+ // if (item.path?.startsWith(currentPathParam.path)) return true;
265
+ // Keep each menu items in the scope of the current url path
266
+ if (currentPathParam.path.startsWith(item.path))
267
+ return true;
268
+ // Else, exclude
269
+ excludedItems.push(item);
270
+ return false;
271
+ });
272
+ items.forEach(item => {
273
+ const children = this.detachSubMenus(currentPathParam, item.$children.value || [], excludedItems);
274
+ item.$children.next(children);
275
+ });
276
+ return items;
277
+ }
278
+ isVisibleForRoute(item, currentPathParam) {
279
+ return;
280
+ }
58
281
  }
59
- MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
282
+ MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [{ token: i1.PlatformService }, { token: i2.ConfigService }, { token: i3.AccountService }, { token: i4.Router }, { token: ENVIRONMENT }, { token: APP_MENU_ITEMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
60
283
  MenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, providedIn: 'root' });
61
284
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, decorators: [{
62
285
  type: Injectable,
63
286
  args: [{
64
287
  providedIn: 'root'
65
288
  }]
66
- }] });
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7O0FBTTFELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFzQixJQUFJLENBQUM7QUFLOUQsTUFBTSxPQUFPLFdBQVc7SUFIeEI7UUFLUyx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQWtCeEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDbEMsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBb0Isc0JBQXNCLENBQUMsQ0FBQztRQUNqRixjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDeEQsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBWSxDQUFDO0tBeUNqRDtJQTdEQyxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQVFELE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBYztRQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBd0I7UUFDM0MsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO2FBQ0k7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU87UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsY0FBYyxDQUFDLEtBQWU7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7O3dHQS9EVSxXQUFXOzRHQUFYLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWR9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWVudUl0ZW19IGZyb20gJy4vbWVudS5tb2RlbCc7XG5cblxuZXhwb3J0IHR5cGUgU3BsaXRQYW5lU2hvd1doZW4gPSBib29sZWFufCdsZyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU5VX1NIT1dfV0hFTjogU3BsaXRQYW5lU2hvd1doZW4gPSAnbGcnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSB7XG5cbiAgcHVibGljIG9uTWVudUNvbXBvbmVudFJlYWR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgZ2V0IHN1Yk1lbnVJdGVtKCk6IE9ic2VydmFibGU8TWVudUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5fJHN1Yk1lbnVJdGVtO1xuICB9XG5cbiAgZ2V0IG9wZW5lZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJG9wZW5lZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBzcGxpdFBhbmVXaGVuKCk6IE9ic2VydmFibGU8U3BsaXRQYW5lU2hvd1doZW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJHNwbGl0UGFuZVdoZW4uYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJGVuYWJsZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF8kdG9nZ2xlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRvcGVuZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kc3BsaXRQYW5lV2hlbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3BsaXRQYW5lU2hvd1doZW4+KERFRkFVTFRfTUVOVV9TSE9XX1dIRU4pO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kZW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgXyRzdWJNZW51SXRlbSA9IG5ldyBTdWJqZWN0PE1lbnVJdGVtPigpO1xuXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLl8kdG9nZ2xlZC5uZXh0KCk7XG4gIH1cblxuICBlbmFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl8kZW5hYmxlZC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHNldFNwbGl0UGFuZVNob3dXaGVuKHZhbHVlOiBTcGxpdFBhbmVTaG93V2hlbikge1xuICAgIGlmICh0aGlzLl8kc3BsaXRQYW5lV2hlbi52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVNwbGl0UGFuZVdoZW4oKSB7XG4gICAgaWYgKHRoaXMuXyRzcGxpdFBhbmVXaGVuLnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5fJHNwbGl0UGFuZVdoZW4ubmV4dChmYWxzZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fJHNwbGl0UGFuZVdoZW4ubmV4dChERUZBVUxUX01FTlVfU0hPV19XSEVOKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclN1Yk1lbnVJdGVtcygpIHtcbiAgICAvLyBUT0RPXG4gICAgdGhpcy5fJHN1Yk1lbnVJdGVtLm5leHQobnVsbCk7XG4gIH1cbiAgYWRkU3ViTWVudUl0ZW0odmFsdWU6IE1lbnVJdGVtKSB7XG4gICAgdGhpcy5fJHN1Yk1lbnVJdGVtLm5leHQodmFsdWUpO1xuICB9XG5cbiAgX21hcmtBc09wZW5lZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBfbWFya0FzQ2xvc2VkKCkge1xuICAgIHRoaXMuXyRvcGVuZWQubmV4dChmYWxzZSk7XG4gIH1cblxufVxuIl19
289
+ }], ctorParameters: function () { return [{ type: i1.PlatformService }, { type: i2.ConfigService }, { type: i3.AccountService }, { type: i4.Router }, { type: i5.Environment, decorators: [{
290
+ type: Inject,
291
+ args: [ENVIRONMENT]
292
+ }] }, { type: undefined, decorators: [{
293
+ type: Optional
294
+ }, {
295
+ type: Inject,
296
+ args: [APP_MENU_ITEMS]
297
+ }] }]; } });
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQXlCLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEVBQVcsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDL0UsT0FBTyxFQUFjLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBR2pGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUkvRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFJdkQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQXNCLElBQUksQ0FBQztBQW1COUQsTUFBTSxPQUFPLFdBQVksU0FBUSxnQkFBaUM7SUFrQmhFLFlBQ1ksZUFBZ0MsRUFDaEMsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsTUFBYyxFQUNPLFdBQXdCLEVBQ25CLFNBQXNCO1FBRTFELEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQVBiLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNPLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBckJsRCxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDdkMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pCLFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBYSxTQUFTLENBQUMsQ0FBQztRQUc1RCxlQUFVLEdBQUcsZ0JBQWdCLENBQUM7UUFFckIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDbEMsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBb0Isc0JBQXNCLENBQUMsQ0FBQztRQUNqRixjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFlOUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQWZELElBQVksU0FBUztRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFlRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQXdCO1FBQzNDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRTtZQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUNJO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFvQixFQUFFLElBQTRCO1FBQ3RFLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxLQUFLLENBQUMsU0FBUztRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsY0FBYyxDQUFDLENBQUM7UUFFL0MsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsS0FBSyxDQUNILEtBQUssQ0FDSCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87YUFDeEIsSUFBSTtRQUNILDRCQUE0QjtRQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUN0RixFQUVILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTthQUN0QixJQUFJO1FBQ0gsbUJBQW1CO1FBQ25CLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQ3JDLENBQ0o7YUFDRSxJQUFJO1FBQ0gscURBQXFEO1FBQ3JELFlBQVksQ0FBQyxHQUFHLENBQUM7UUFDakIsZ0RBQWdEO1FBQ2hELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQzNDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUN2QztRQUNILFNBQVM7UUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQy9DO2FBQ0UsU0FBUyxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtZQUN6QixJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNsQztpQkFBTTtnQkFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQjtZQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFUixJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDckIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLGFBQWEsQ0FBQyxDQUVoRCxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztZQUMvRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDeEUsMEJBQTBCO1lBQzFCLDBCQUEwQjtRQUM1QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsMkJBQTJCLENBQUMsQ0FBQztRQUU5RSxxQ0FBcUM7UUFDckMsTUFBTSxXQUFXLEdBQVcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoQyxJQUFJO2dCQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO29CQUNwRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7d0JBQ2QsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6RCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFDaEIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2lDQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDO2lDQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNqQztxQkFDRjtvQkFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ2YsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUMxRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFDaEIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7aUNBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUM7aUNBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0Y7b0JBQ0QsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hCO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLDhCQUE4QixtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxtQ0FBbUMsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUMzSTtTQUNGO1FBRUQseURBQXlEO1FBQ3pELE1BQU0sSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSzthQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDdkYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1YsaUNBQWlDO1lBQ2pDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN2RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFELElBQUksS0FBSztvQkFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxpREFBaUQ7YUFDdEY7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVTLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBaUIsRUFBRSxJQUE0QjtRQUM1RSxJQUFJLEdBQUc7WUFDTCxZQUFZLEVBQUUsS0FBSztZQUNuQixHQUFHLElBQUk7U0FDUixDQUFDO1FBRUYsNkRBQTZEO1FBQzdELE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLDhCQUE4QjtRQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEQsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQyxRQUFRO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLG9DQUFvQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9FLE9BQU8sQ0FBQyxjQUFjO1NBQ3ZCO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLDBDQUEwQyxDQUFDLENBQUM7WUFDM0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVFLFdBQVcsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO2FBQ3RDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFNUM7O2lCQUVLO1NBQ047YUFDSTtZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUFBLENBQUM7SUFFUSxXQUFXLENBQUMsSUFBYztRQUVsQyxJQUFJLEdBQWE7WUFDZixHQUFHLElBQUk7WUFDUCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLGVBQWUsQ0FBYSxFQUFFLENBQUM7U0FDakUsQ0FBQztRQUVGLFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixNQUFNLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBQyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLE1BQU0sRUFBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sRUFBQyxDQUFDO1NBQy9EO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRVMsZ0JBQWdCLENBQUMsSUFBYyxFQUFFLEtBQWtCO1FBQzNELEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxZQUFZO1FBQ2pELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQ2xELENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsVUFBVSxDQUFDLFNBQW1CLEVBQUUsV0FBd0I7UUFDaEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdkMsV0FBVyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUUvQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJO2dCQUFFLE9BQU8sR0FBRyxDQUFDO1lBRTVCLDBFQUEwRTtZQUMxRSxnRkFBZ0Y7WUFDaEYsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7Z0JBQUUsT0FBTyxHQUFHLENBQUM7WUFFbkQseUhBQXlIO1lBQ3pILElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRXJELElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUN4QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDMUQ7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQUEsQ0FBQztJQUVRLGVBQWUsQ0FBQyxNQUFnQixFQUFFLEtBQWU7UUFFekQsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLHFCQUFxQixTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0gsaUZBQWlGO1FBQ2pGLGlGQUFpRjtRQUNqRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDOUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUNqQzthQUNJO1lBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBR2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVTLGNBQWMsQ0FBQyxnQkFBK0IsRUFBRSxLQUFrQixFQUFFLGFBQTBCO1FBQ3RHLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxhQUFhLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyx5QkFBeUI7WUFFNUQsaUNBQWlDO1lBQ2pDLCtEQUErRDtZQUUvRCx5REFBeUQ7WUFDekQsaUVBQWlFO1lBRWpFLDREQUE0RDtZQUM1RCxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUU3RCxnQkFBZ0I7WUFDaEIsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNsRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVTLGlCQUFpQixDQUFDLElBQWMsRUFBRSxnQkFBK0I7UUFDekUsT0FBUTtJQUNWLENBQUM7O3dHQS9UVSxXQUFXLGtJQXVCWixXQUFXLGFBQ0MsY0FBYzs0R0F4QnpCLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3QkksTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBPYnNlcnZhYmxlLCBza2lwV2hpbGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge01lbnVJdGVtLCBNZW51SXRlbXN9IGZyb20gJy4vbWVudS5tb2RlbCc7XG5pbXBvcnQge0FQUF9NRU5VX0lURU1TfSBmcm9tICcuL21lbnUuY29tcG9uZW50JztcbmltcG9ydCB7TmF2aWdhdGlvbkVuZCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtTdGFydGFibGVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge1BsYXRmb3JtU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0uc2VydmljZSc7XG5pbXBvcnQge01vbWVudH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7RGF0ZVV0aWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBtYXBUbywgbWVyZ2VNYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHtpc05vdE5pbE9yQmxhbmt9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtBY2NvdW50fSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9hY2NvdW50Lm1vZGVsJztcblxuZXhwb3J0IHR5cGUgU3BsaXRQYW5lU2hvd1doZW4gPSBib29sZWFufCdsZyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU5VX1NIT1dfV0hFTjogU3BsaXRQYW5lU2hvd1doZW4gPSAnbGcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFkZFN1Yk1lbnVJdGVtc09wdGlvbiB7XG4gIHNraXBJZkV4aXN0czogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGRTdWJNZW51SXRlbXMge1xuICBpdGVtczogTWVudUl0ZW1bXTtcbiAgb3B0cz86IEFkZFN1Yk1lbnVJdGVtc09wdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW51UGF0aFBhcmFtIHtcbiAgcGF0aDogc3RyaW5nO1xuICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2U8TWVudUl0ZW1bXSwgYW55PiB7XG5cbiAgcHVibGljIG9uTG9naW5DaGFuZ2UgPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBwdWJsaWMgb25VcGRhdGVNZW51ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcmVhZG9ubHkgJGl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBsYXN0QWNjb3VudFVwZGF0ZURhdGU6IE1vbWVudCB8IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9nUHJlZml4ID0gJ1ttZW51LXNlcnZpY2VdJztcbiAgcHJpdmF0ZSBfY29uZmlnOiBDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kdG9nZ2xlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRvcGVuZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kc3BsaXRQYW5lV2hlbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3BsaXRQYW5lU2hvd1doZW4+KERFRkFVTFRfTUVOVV9TSE9XX1dIRU4pO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kZW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcHJpdmF0ZSBnZXQgcm9vdEl0ZW1zKCk6IE1lbnVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLiRpdGVtcy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybVNlcnZpY2U6IFBsYXRmb3JtU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX01FTlVfSVRFTVMpIHJvb3RJdGVtcz86IE1lbnVJdGVtW11cbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm1TZXJ2aWNlKTtcbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIHRoaXMuJGl0ZW1zLm5leHQoKHJvb3RJdGVtcyB8fCBbXSkubWFwKGkgPT4gdGhpcy5wcmVwYXJlSXRlbShpKSkpO1xuICB9XG5cbiAgZ2V0IG9wZW5lZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJG9wZW5lZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBzcGxpdFBhbmVXaGVuKCk6IE9ic2VydmFibGU8U3BsaXRQYW5lU2hvd1doZW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJHNwbGl0UGFuZVdoZW4uYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJGVuYWJsZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICB0b2dnbGUoKSB7XG4gICAgdGhpcy5fJHRvZ2dsZWQubmV4dCgpO1xuICB9XG5cbiAgZW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fJGVuYWJsZWQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBzZXRTcGxpdFBhbmVTaG93V2hlbih2YWx1ZTogU3BsaXRQYW5lU2hvd1doZW4pIHtcbiAgICBpZiAodGhpcy5fJHNwbGl0UGFuZVdoZW4udmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTcGxpdFBhbmVXaGVuKCkge1xuICAgIGlmICh0aGlzLl8kc3BsaXRQYW5lV2hlbi52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoREVGQVVMVF9NRU5VX1NIT1dfV0hFTik7XG4gICAgfVxuICB9XG5cbiAgX21hcmtBc09wZW5lZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBfbWFya0FzQ2xvc2VkKCkge1xuICAgIHRoaXMuXyRvcGVuZWQubmV4dChmYWxzZSk7XG4gIH1cblxuICBhc3luYyBhZGRTdWJNZW51SXRlbXMobmV3SXRlbXM6IE1lbnVJdGVtW10sIG9wdHM/OiBBZGRTdWJNZW51SXRlbXNPcHRpb24pIHtcbiAgICBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgbmV3SXRlbXMuZm9yRWFjaChpID0+IHRoaXMuYWRkU3ViTWVudUl0ZW0oaSksIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPE1lbnVJdGVtW10+IHtcbiAgICBjb25zb2xlLmluZm8oYCR7dGhpcy5fbG9nUHJlZml4fSBTdGFydGluZy4uLmApO1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvbmVudCB3aGVuIHJlZnJlc2ggaXMgbmVlZCAoPWxvZ2luIGV2ZW50cyBvciBjb25maWcgY2hhbmdlZClcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpblxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBvbiBhY2NvdW50IGNoYW5nZXNcbiAgICAgICAgICAgICAgZmlsdGVyKGFjY291bnQgPT4gIURhdGVVdGlscy5pc1NhbWUoYWNjb3VudD8udXBkYXRlRGF0ZSwgdGhpcy5sYXN0QWNjb3VudFVwZGF0ZURhdGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGNvbmZpZ1xuICAgICAgICAgICAgICB0YXAoY29uZmlnID0+IHRoaXMuX2NvbmZpZyA9IGNvbmZpZylcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgLy8gQWRkIGRlYm91bmNlIHRvIGF2b2lkIHRvIHRyaWdnZXIgdHdpY2UsIGF0IHN0YXJ0dXBcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgICAgLy8gV2FpdCBhY2NvdW50IHNlcnZpY2UgcmVhZHkgKGNhbiBiZSByZXN0YXJ0ZWQpXG4gICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCkpLFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuYWNjb3VudFNlcnZpY2UuYWNjb3VudClcbiAgICAgICAgICApLFxuICAgICAgICAvLyBMb2dvdXRcbiAgICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ291dC5waXBlKG1hcFRvKG51bGwpKSxcbiAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShhc3luYyBhY2NvdW50ID0+IHtcbiAgICAgICAgICBpZiAoYWNjb3VudD8udXBkYXRlRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNjb3VudFVwZGF0ZURhdGUgPSBhY2NvdW50LnVwZGF0ZURhdGU7XG4gICAgICAgICAgICB0aGlzLm9uTG9naW5DaGFuZ2UubmV4dChhY2NvdW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNjb3VudFVwZGF0ZURhdGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5vbkxvZ2luQ2hhbmdlLm5leHQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVmcmVzaE1lbnVJdGVtcygpO1xuICAgICAgICB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAvLyBmaWx0ZXIoZXZlbnQgPT4gISF0aGlzLiRpdGVtcz8udmFsdWUpLFxuICAgICAgKS5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGhQYXJhbSA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkoZXZlbnQudXJsKTtcbiAgICAgICAgY29uc3QgZXhjbHVkZWRJdGVtcyA9IFtdO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGV0YWNoU3ViTWVudXMocGF0aFBhcmFtLCB0aGlzLiRpdGVtcy52YWx1ZSwgZXhjbHVkZWRJdGVtcyk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fSBEZXRhY2hlZCBzdWIgbWVudXM6IGAsIGV4Y2x1ZGVkSXRlbXMpO1xuICAgICAgICAvLyB0aGlzLmFkZFN1Yk1lbnVJdGVtcygpO1xuICAgICAgICAvL3RoaXMuJGl0ZW1zLm5leHQoaXRlbXMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuJGl0ZW1zLnZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hNZW51SXRlbXMoKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH0gUmVmcmVzaGluZyBtZW51IGl0ZW1zLi4uYCk7XG5cbiAgICAvLyBJbnNlcnQgbWVudSBpdGVtcywgZnJvbSB0aGUgY29uZmlnXG4gICAgY29uc3QgY29uZmlnVmFsdWU6IHN0cmluZyA9IHRoaXMuX2NvbmZpZyAmJiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5NRU5VX0lURU1TKTtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGNvbmZpZ1ZhbHVlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnSXRlbXMgPSBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IChjb25maWdJdGVtcyB8fCBbXSkucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5hZnRlcikge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSByZXMuZmluZEluZGV4KGkgPT4gaS50aXRsZSA9PT0gaXRlbS5hZnRlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuc2xpY2UoMCwgaW5kZXggKyAxKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoaXRlbSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHJlcy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlcy5maW5kSW5kZXgoaSA9PiBpLnRpdGxlID09PSBpdGVtLmJlZm9yZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChpdGVtKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVzLnNsaWNlKGluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICAgICAgICB9LCB0aGlzLl9kYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH0gSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICcke0NPUkVfQ09ORklHX09QVElPTlMuTUVOVV9JVEVNUy5rZXl9Jy4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgbWVudSBpdGVtYCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPIDogaXNMb2dpbiBpcyBub3QgdXNlZCBpbiBNZW51SXRlbXMuY2hlY2tJZlZpc2libGVcbiAgICBjb25zdCBvcHRzID0ge2RlYnVnOiB0aGlzLl9kZWJ1Z307XG4gICAgY29uc3QgZmlsdGVyZWRJdGVtcyA9IHRoaXMuX2RhdGFcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiBNZW51SXRlbXMuY2hlY2tJZlZpc2libGUoaXRlbSwgdGhpcy5hY2NvdW50U2VydmljZSwgdGhpcy5fY29uZmlnLCBvcHRzKSlcbiAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUgdXNpbmcgcHJvcGVydGllc1xuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGl0ZW0udGl0bGVQcm9wZXJ0eSkgJiYgdGhpcy5fY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9jb25maWcucHJvcGVydGllc1tpdGVtLnRpdGxlUHJvcGVydHldO1xuICAgICAgICAgIGlmICh0aXRsZSkgcmV0dXJuIHsuLi5pdGVtLCB0aXRsZX07IC8vIENyZWF0ZSBhIGNvcHksIHRvIGtlZXAgdGhlIG9yaWdpbmFsIGl0ZW0udGl0bGVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy4kaXRlbXMubmV4dChmaWx0ZXJlZEl0ZW1zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRTdWJNZW51SXRlbShuZXdJdGVtOiBNZW51SXRlbSwgb3B0cz86IEFkZFN1Yk1lbnVJdGVtc09wdGlvbikge1xuICAgIG9wdHMgPSB7XG4gICAgICBza2lwSWZFeGlzdHM6IGZhbHNlLFxuICAgICAgLi4ub3B0cyxcbiAgICB9O1xuXG4gICAgLy8gTWFrZSBzdXJlIHBhdGggKGFuZCBwYXRoUGFyYW1zKSBhcmUgZmlsbGVkIGluIHRoZSBzYW1lIHdheVxuICAgIG5ld0l0ZW0gPSB0aGlzLnByZXBhcmVJdGVtKG5ld0l0ZW0pO1xuXG4gICAgLy8gRmluZCBpZiBpdGVtIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgZXhpc3RpbmdJdGVtID0gdGhpcy5maW5kRXhpc3RpbmdJdGVtKG5ld0l0ZW0pO1xuICAgIGlmIChleGlzdGluZ0l0ZW0gJiYgb3B0cy5za2lwSWZFeGlzdHMpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH0gU2tpcHBpbmcgc3ViIGl0ZW0gKGFscmVhZHkgZXhpc3QpYCwgbmV3SXRlbSk7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgYWRkXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50KG5ld0l0ZW0pO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5fbG9nUHJlZml4fSBVbmFibGUgdG8gYWRkIHN1YiBpdGVtOiBubyBwYXJlbnQgZm91bmRgKTtcbiAgICAgIGNvbnN0IHBhcmVudFVybFRyZSA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUobmV3SXRlbS5wYXJlbnRQYXRoLnNwbGl0KCcvJyksIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IG5ld0l0ZW0ucGFyZW50UGF0aFBhcmFtc1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUucm9vdC5wYXJlbnQ/LmRhdGE7XG4gICAgICBjb25zb2xlLmxvZygnVE9ETyBjaGVjayBwYXJlbnQgZGF0YScsIGRhdGEpO1xuXG4gICAgICAvKmF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobmV3SXRlbS5wYXJlbnRQYXRoLCB7XG4gICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZVxuICAgICAgfSk7Ki9cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmFkZE1lbnVUb1BhcmVudChwYXJlbnQsIG5ld0l0ZW0pO1xuICAgIH1cbiAgfTtcblxuICBwcm90ZWN0ZWQgcHJlcGFyZUl0ZW0oaXRlbTogTWVudUl0ZW0pOiBNZW51SXRlbSB7XG5cbiAgICBpdGVtID0gPE1lbnVJdGVtPntcbiAgICAgIC4uLml0ZW0sXG4gICAgICAkY2hpbGRyZW46IGl0ZW0uJGNoaWxkcmVuIHx8IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4oW10pXG4gICAgfTtcblxuICAgIC8vIENsZWFuXG4gICAgaWYgKGl0ZW0ucGF0aCkge1xuICAgICAgY29uc3Qge3BhdGgsIHBhcmFtc30gPSBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGl0ZW0ucGF0aCk7XG4gICAgICBpdGVtLnBhdGggPSBwYXRoO1xuICAgICAgaXRlbS5wYXRoUGFyYW1zID0gey4uLml0ZW0ucGF0aFBhcmFtcywgLi4ucGFyYW1zfTtcbiAgICB9XG4gICAgaWYgKGl0ZW0ucGFyZW50UGF0aCkge1xuICAgICAgY29uc3Qge3BhdGgsIHBhcmFtc30gPSBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGl0ZW0ucGFyZW50UGF0aCk7XG4gICAgICBpdGVtLnBhcmVudFBhdGggPSBwYXRoO1xuICAgICAgaXRlbS5wYXJlbnRQYXRoUGFyYW1zID0gey4uLml0ZW0ucGFyZW50UGF0aFBhcmFtcywgLi4ucGFyYW1zfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kRXhpc3RpbmdJdGVtKGl0ZW06IE1lbnVJdGVtLCBpdGVtcz86IE1lbnVJdGVtW10pOiBNZW51SXRlbSB7XG4gICAgaXRlbXMgPSBpdGVtcyB8fCB0aGlzLiRpdGVtcy52YWx1ZTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm90IGZvdW5kXG4gICAgcmV0dXJuIGl0ZW1zLmZpbmQoaSA9PiBNZW51SXRlbXMuaXNTYW1lKGksIGl0ZW0pIHx8IChcbiAgICAgIGkuJGNoaWxkcmVuICYmIHRoaXMuZmluZEV4aXN0aW5nSXRlbShpdGVtLCBpLiRjaGlsZHJlbi52YWx1ZSlcbiAgICApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kUGFyZW50KGNoaWxkSXRlbTogTWVudUl0ZW0sIHBhcmVudEl0ZW1zPzogTWVudUl0ZW1bXSk6IE1lbnVJdGVtIHtcbiAgICBpZiAoIWNoaWxkSXRlbT8ucGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBwYXJlbnRJdGVtcyA9IHBhcmVudEl0ZW1zIHx8IHRoaXMuJGl0ZW1zLnZhbHVlO1xuXG4gICAgcmV0dXJuIHBhcmVudEl0ZW1zLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0/LnBhdGgpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIEEgZm91bmQgaXRlbSBhbHJlYWR5IG1hdGNoIHdpdGggdGhlIG1lbnVJdGVtLnBhcmVudFBhdGggOiBrZWVwIGl0IGFzIGl0XG4gICAgICAvLyBUaGVyZSBpcyBhIGZvdW5kIGNhbmRpZGF0ZSB0aGF0IGFscmVhZHkgbWF0Y2ggdGhlIGN1cnJlbnQgY2FuZGlkYXRlIDoga2VlcCBpdFxuICAgICAgaWYgKE1lbnVJdGVtcy5pc1BhcmVudChjaGlsZEl0ZW0sIHJlcykpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaGFzIGV4cGxpY2l0IHBhcmVudFBhdGggYW5kIGl0cyBwYXRoIGFuZCBwYXRoIHBhcmFtIGFyZSB0aGUgc2FtZSBhcyB0aGUgY2FuZGlkYXRlICA6IHVzZSBpdCBhcyBwYXJlbnRcbiAgICAgIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoY2hpbGRJdGVtLCBpdGVtKSkgcmV0dXJuIGl0ZW07XG5cbiAgICAgIGlmICghcmVzICYmIGl0ZW0uJGNoaWxkcmVuPy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFBhcmVudChjaGlsZEl0ZW0sIGl0ZW0uJGNoaWxkcmVuPy52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwgdW5kZWZpbmVkKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgYWRkTWVudVRvUGFyZW50KHBhcmVudDogTWVudUl0ZW0sIGNoaWxkOiBNZW51SXRlbSkge1xuXG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9QWRkaW5nIGEgc3ViLW1lbnUgJHtNZW51SXRlbXMuZ2V0VXJsKGNoaWxkKX0gdG8gcGFyZW50IG1lbnUgJHtNZW51SXRlbXMuZ2V0VXJsKHBhcmVudCl9YCk7XG5cbiAgICAvLyBBdm9pZCB0byBrZWVwIGlkZW50aWNhbCBtZW51IGl0ZW0gKHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3IGNoaWxkIG1lbnUgaXRlbSlcbiAgICAvL2lmICghcGFyZW50Py4kY2hpbGRyZW4pIHBhcmVudC4kY2hpbGRyZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+KFtdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC4kY2hpbGRyZW4udmFsdWUgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChpdGVtID0+IE1lbnVJdGVtcy5pc1NhbWUoY2hpbGQsIGl0ZW0pKTtcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNoaWxkcmVuW2V4aXN0aW5nSW5kZXhdID0gY2hpbGQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfVxuICAgIHBhcmVudC4kY2hpbGRyZW4ubmV4dChjaGlsZHJlbik7XG5cblxuICAgIHRoaXMub25VcGRhdGVNZW51LmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRhY2hTdWJNZW51cyhjdXJyZW50UGF0aFBhcmFtOiBNZW51UGF0aFBhcmFtLCBpdGVtcz86IE1lbnVJdGVtW10sIGV4Y2x1ZGVkSXRlbXM/OiBNZW51SXRlbVtdKSB7XG4gICAgaXRlbXMgPSBpdGVtcyB8fCB0aGlzLnJvb3RJdGVtcztcbiAgICBleGNsdWRlZEl0ZW1zID0gZXhjbHVkZWRJdGVtcyB8fCBbXTtcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbS5wYXJlbnRQYXRoKSByZXR1cm4gdHJ1ZTsgLy8gQWx3YXlzIGtlZXAgcm9vdCBpdGVtc1xuXG4gICAgICAvLyBDdXJyZW50IHJvdXRlID0gcGFyYW06IGtlZXAgaXRcbiAgICAgIC8vIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoaXRlbSwgY3VycmVudFBhdGhQYXJhbSkpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBJdGVtIHBhcmVudCBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBjdXJyZW50IHBhdGg6IGtlZXAgaXRcbiAgICAgIC8vIGlmIChpdGVtLnBhdGg/LnN0YXJ0c1dpdGgoY3VycmVudFBhdGhQYXJhbS5wYXRoKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIEtlZXAgZWFjaCBtZW51IGl0ZW1zIGluIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCB1cmwgcGF0aFxuICAgICAgaWYgKGN1cnJlbnRQYXRoUGFyYW0ucGF0aC5zdGFydHNXaXRoKGl0ZW0ucGF0aCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBFbHNlLCBleGNsdWRlXG4gICAgICBleGNsdWRlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kZXRhY2hTdWJNZW51cyhjdXJyZW50UGF0aFBhcmFtLCBpdGVtLiRjaGlsZHJlbi52YWx1ZSB8fCBbXSwgZXhjbHVkZWRJdGVtcyk7XG4gICAgICBpdGVtLiRjaGlsZHJlbi5uZXh0KGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNWaXNpYmxlRm9yUm91dGUoaXRlbTogTWVudUl0ZW0sIGN1cnJlbnRQYXRoUGFyYW06IE1lbnVQYXRoUGFyYW0pIHtcbiAgICByZXR1cm4gO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,52 @@
1
+ import { Component, } from '@angular/core';
2
+ import { MenuItems } from '../menu.model';
3
+ import { MenuTestingPage } from './menu.testing';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/router";
6
+ import * as i2 from "@ionic/angular";
7
+ import * as i3 from "@ngx-translate/core";
8
+ import * as i4 from "../menu.service";
9
+ import * as i5 from "@angular/common";
10
+ import * as i6 from "@angular/material/tabs";
11
+ import * as i7 from "../../../shared/toolbar/toolbar";
12
+ export class OtherMenuTestingPage extends MenuTestingPage {
13
+ constructor(route, // Modal editor give 'null'
14
+ router, navController, alertCtrl, translate, menuService) {
15
+ super(route, router, navController, alertCtrl, translate, menuService);
16
+ this.logPrefix = '[menu-testing-other] ';
17
+ }
18
+ initSubMenu() {
19
+ const pathParam = MenuItems.parsePathWithQuery(this.router.url);
20
+ this.title = 'Other';
21
+ this.secondTabTitle = 'Second';
22
+ this.parentPath = '/testing/shared/menu?tab=1';
23
+ this.childPath = '';
24
+ const path = '/testing/shared/menu/other';
25
+ const parentPath = '/testing/shared/menu?tab=1';
26
+ console.debug(`${this.logPrefix} Setup with`, { path, parentPath });
27
+ this.menuService.addSubMenuItems([
28
+ {
29
+ title: 'Other',
30
+ path,
31
+ parentPath,
32
+ action: null,
33
+ profile: 'GUEST',
34
+ },
35
+ {
36
+ title: this.secondTabTitle,
37
+ path,
38
+ pathParams: { tab: '1' },
39
+ parentPath: path,
40
+ action: null,
41
+ profile: 'GUEST',
42
+ }
43
+ ]);
44
+ }
45
+ }
46
+ OtherMenuTestingPage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtherMenuTestingPage, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.NavController }, { token: i2.AlertController }, { token: i3.TranslateService }, { token: i4.MenuService }], target: i0.ɵɵFactoryTarget.Component });
47
+ OtherMenuTestingPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OtherMenuTestingPage, selector: "app-testing-menu-other", usesInheritance: true, ngImport: i0, template: "<app-toolbar [defaultBackHref]=\"parentPath\">\n <ion-title>{{ title }}</ion-title>\n</app-toolbar>\n\n<ion-content>\n\n <mat-tab-group #tabGroup\n [(selectedIndex)]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n dynamicHeight>\n\n <!-- TAB: 1 -->\n <mat-tab label=\"Details\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>Details</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A first tab<br/>\n\n <ion-button (click)=\"toggleThird()\">\n Third tab ?\n </ion-button>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 2 -->\n <mat-tab [label]=\"secondTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{secondTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A second tab<br/>\n\n <ng-container *ngIf=\"secondTabTitle=== 'Others'\">\n Navigate to : <a [routerLink]=\"childPath\" >\n {{ childPath }}\n </a>\n </ng-container>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 3 -->\n <mat-tab *ngIf=\"thirdTabTitle\"\n [label]=\"thirdTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{thirdTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A third tab\n </div>\n\n </mat-tab>\n </mat-tab-group>\n</ion-content>\n", styles: [".menu-item{padding-left:0 px}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "directive", type: i2.RouterLinkWithHrefDelegate, selector: "a[routerLink],area[routerLink]", inputs: ["routerDirection", "routerAnimation"] }, { kind: "component", type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i6.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i7.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }] });
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtherMenuTestingPage, decorators: [{
49
+ type: Component,
50
+ args: [{ selector: 'app-testing-menu-other', template: "<app-toolbar [defaultBackHref]=\"parentPath\">\n <ion-title>{{ title }}</ion-title>\n</app-toolbar>\n\n<ion-content>\n\n <mat-tab-group #tabGroup\n [(selectedIndex)]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n dynamicHeight>\n\n <!-- TAB: 1 -->\n <mat-tab label=\"Details\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>Details</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A first tab<br/>\n\n <ion-button (click)=\"toggleThird()\">\n Third tab ?\n </ion-button>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 2 -->\n <mat-tab [label]=\"secondTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{secondTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A second tab<br/>\n\n <ng-container *ngIf=\"secondTabTitle=== 'Others'\">\n Navigate to : <a [routerLink]=\"childPath\" >\n {{ childPath }}\n </a>\n </ng-container>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 3 -->\n <mat-tab *ngIf=\"thirdTabTitle\"\n [label]=\"thirdTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{thirdTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A third tab\n </div>\n\n </mat-tab>\n </mat-tab-group>\n</ion-content>\n", styles: [".menu-item{padding-left:0 px}\n"] }]
51
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.NavController }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: i4.MenuService }]; } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1vdGhlci50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvdGVzdGluZy9tZW51LW90aGVyLnRlc3RpbmcudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvbWVudS90ZXN0aW5nL21lbnUudGVzdGluZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEdBQUUsTUFBTSxlQUFlLENBQUM7QUFLekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQU8vQyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsZUFBZTtJQUd2RCxZQUNFLEtBQXFCLEVBQUUsMkJBQTJCO0lBQ2xELE1BQWMsRUFDZCxhQUE0QixFQUM1QixTQUEwQixFQUMxQixTQUEyQixFQUMzQixXQUF3QjtRQUV4QixLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLHVCQUF1QixDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQztRQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsYUFBYSxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCO1lBQ0U7Z0JBQ0UsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSTtnQkFDSixVQUFVO2dCQUNWLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE9BQU8sRUFBRSxPQUFPO2FBQ2pCO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjO2dCQUMxQixJQUFJO2dCQUNKLFVBQVUsRUFBRSxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUM7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixNQUFNLEVBQUUsSUFBSTtnQkFDWixPQUFPLEVBQUUsT0FBTzthQUNqQjtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7O2lIQTNDVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixxRkNiakMsbStDQTJEQTsyRkQ5Q2Esb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01lbnVTZXJ2aWNlfSBmcm9tICcuLi9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtBbGVydENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge01lbnVJdGVtc30gZnJvbSAnLi4vbWVudS5tb2RlbCc7XG5pbXBvcnQge01lbnVUZXN0aW5nUGFnZX0gZnJvbSAnLi9tZW51LnRlc3RpbmcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGVzdGluZy1tZW51LW90aGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUudGVzdGluZy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVudS50ZXN0aW5nLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgT3RoZXJNZW51VGVzdGluZ1BhZ2UgZXh0ZW5kcyBNZW51VGVzdGluZ1BhZ2Uge1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCAvLyBNb2RhbCBlZGl0b3IgZ2l2ZSAnbnVsbCdcbiAgICByb3V0ZXI6IFJvdXRlcixcbiAgICBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBtZW51U2VydmljZTogTWVudVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIocm91dGUsIHJvdXRlciwgbmF2Q29udHJvbGxlciwgYWxlcnRDdHJsLCB0cmFuc2xhdGUsIG1lbnVTZXJ2aWNlKTtcbiAgICB0aGlzLmxvZ1ByZWZpeCA9ICdbbWVudS10ZXN0aW5nLW90aGVyXSAnO1xuICB9XG5cbiAgaW5pdFN1Yk1lbnUoKSB7XG4gICAgY29uc3QgcGF0aFBhcmFtID0gTWVudUl0ZW1zLnBhcnNlUGF0aFdpdGhRdWVyeSh0aGlzLnJvdXRlci51cmwpO1xuICAgIHRoaXMudGl0bGUgPSAnT3RoZXInO1xuICAgIHRoaXMuc2Vjb25kVGFiVGl0bGUgPSAnU2Vjb25kJztcbiAgICB0aGlzLnBhcmVudFBhdGggPSAnL3Rlc3Rpbmcvc2hhcmVkL21lbnU/dGFiPTEnO1xuICAgIHRoaXMuY2hpbGRQYXRoID0gJyc7XG4gICAgY29uc3QgcGF0aCA9ICcvdGVzdGluZy9zaGFyZWQvbWVudS9vdGhlcic7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9ICcvdGVzdGluZy9zaGFyZWQvbWVudT90YWI9MSc7XG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gU2V0dXAgd2l0aGAsIHtwYXRoLCBwYXJlbnRQYXRofSk7XG4gICAgdGhpcy5tZW51U2VydmljZS5hZGRTdWJNZW51SXRlbXMoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogJ090aGVyJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHBhcmVudFBhdGgsXG4gICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgIHByb2ZpbGU6ICdHVUVTVCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5zZWNvbmRUYWJUaXRsZSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHBhdGhQYXJhbXM6IHt0YWI6ICcxJ30sXG4gICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgcHJvZmlsZTogJ0dVRVNUJyxcbiAgICAgICAgfVxuICAgICAgXVxuICAgICk7XG4gIH1cblxufVxuIiwiPGFwcC10b29sYmFyIFtkZWZhdWx0QmFja0hyZWZdPVwicGFyZW50UGF0aFwiPlxuICA8aW9uLXRpdGxlPnt7IHRpdGxlIH19PC9pb24tdGl0bGU+XG48L2FwcC10b29sYmFyPlxuXG48aW9uLWNvbnRlbnQ+XG5cbiAgPG1hdC10YWItZ3JvdXAgI3RhYkdyb3VwXG4gICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRJbmRleCldPVwic2VsZWN0ZWRUYWJJbmRleFwiXG4gICAgICAgICAgICAgICAgIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgZHluYW1pY0hlaWdodD5cblxuICAgIDwhLS0gVEFCOiAxIC0tPlxuICAgIDxtYXQtdGFiIGxhYmVsPVwiRGV0YWlsc1wiIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICA8aW9uLWxhYmVsPkRldGFpbHM8L2lvbi1sYWJlbD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgICBBIGZpcnN0IHRhYjxici8+XG5cbiAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZVRoaXJkKClcIj5cbiAgICAgICAgICBUaGlyZCB0YWIgP1xuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvbWF0LXRhYj5cblxuICAgIDwhLS0gVEFCOiAyIC0tPlxuICAgIDxtYXQtdGFiIFtsYWJlbF09XCJzZWNvbmRUYWJUaXRsZVwiIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICA8aW9uLWxhYmVsPnt7c2Vjb25kVGFiVGl0bGV9fTwvaW9uLWxhYmVsPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGRpdiBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICAgIEEgc2Vjb25kIHRhYjxici8+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY29uZFRhYlRpdGxlPT09ICdPdGhlcnMnXCI+XG4gICAgICAgICAgTmF2aWdhdGUgdG8gOiA8YSBbcm91dGVyTGlua109XCJjaGlsZFBhdGhcIiA+XG4gICAgICAgICAgICB7eyBjaGlsZFBhdGggfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC10YWI+XG5cbiAgICA8IS0tIFRBQjogMyAtLT5cbiAgICA8bWF0LXRhYiAqbmdJZj1cInRoaXJkVGFiVGl0bGVcIlxuICAgICAgICAgICAgIFtsYWJlbF09XCJ0aGlyZFRhYlRpdGxlXCIgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgIDxpb24tbGFiZWw+e3t0aGlyZFRhYlRpdGxlfX08L2lvbi1sYWJlbD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgICBBIHRoaXJkIHRhYlxuICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC10YWI+XG4gIDwvbWF0LXRhYi1ncm91cD5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=