aril 1.2.17 → 2.0.1-dev.0

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 (126) hide show
  1. package/boot/bridge/src/mfe-bridge.d.ts +42 -2
  2. package/boot/config/apps/index.d.ts +7 -1
  3. package/boot/config/apps/src/custom-reuse-outlet.component.d.ts +37 -0
  4. package/boot/config/apps/src/custom-route-reuse-strategy.class.d.ts +156 -0
  5. package/boot/config/apps/src/nav-link-context-menu.service.d.ts +33 -0
  6. package/boot/config/apps/src/nav-link.directive.d.ts +29 -0
  7. package/boot/config/apps/src/nav.service.d.ts +198 -0
  8. package/boot/config/apps/src/route-close.service.d.ts +9 -0
  9. package/boot/config/apps/src/safe-navigate.d.ts +17 -0
  10. package/boot/config/apps/src/tab-aware-url-serializer.d.ts +22 -0
  11. package/boot/config/plugins/src/getNgZone.d.ts +9 -1
  12. package/boot/mfe/src/app.component.d.ts +15 -4
  13. package/boot/mfe/src/isolated-location-strategy.d.ts +57 -0
  14. package/esm2022/boot/bridge/src/mfe-bridge.mjs +36 -5
  15. package/esm2022/boot/config/api/src/api.service.mjs +12 -3
  16. package/esm2022/boot/config/apps/index.mjs +8 -2
  17. package/esm2022/boot/config/apps/src/apps.service.mjs +14 -6
  18. package/esm2022/boot/config/apps/src/custom-reuse-outlet.component.mjs +207 -0
  19. package/esm2022/boot/config/apps/src/custom-route-reuse-strategy.class.mjs +540 -0
  20. package/esm2022/boot/config/apps/src/nav-link-context-menu.service.mjs +105 -0
  21. package/esm2022/boot/config/apps/src/nav-link.directive.mjs +45 -0
  22. package/esm2022/boot/config/apps/src/nav.service.mjs +675 -0
  23. package/esm2022/boot/config/apps/src/route-close.service.mjs +19 -0
  24. package/esm2022/boot/config/apps/src/safe-navigate.mjs +50 -0
  25. package/esm2022/boot/config/apps/src/tab-aware-url-serializer.mjs +50 -0
  26. package/esm2022/boot/config/plugins/src/getNgZone.mjs +13 -5
  27. package/esm2022/boot/host/src/app.component.mjs +1 -2
  28. package/esm2022/boot/host/src/bootstrap.mjs +22 -7
  29. package/esm2022/boot/mfe/src/app.component.mjs +143 -39
  30. package/esm2022/boot/mfe/src/bootstrap.mjs +197 -20
  31. package/esm2022/boot/mfe/src/isolated-location-strategy.mjs +142 -0
  32. package/esm2022/keycloak/src/auth.interceptor.mjs +17 -2
  33. package/esm2022/provider/src/prodiveHost.mjs +3 -5
  34. package/esm2022/provider/src/prodiveHostRouter.mjs +88 -9
  35. package/esm2022/theme/layout/app/expandableMenu/expandable-menu.component.mjs +81 -19
  36. package/esm2022/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.mjs +6 -4
  37. package/esm2022/theme/layout/app/general-search/general-search.component.mjs +4 -4
  38. package/esm2022/theme/layout/app/history/history-sidebar.component.mjs +6 -4
  39. package/esm2022/theme/layout/app/layout/app.layout.component.mjs +422 -20
  40. package/esm2022/theme/layout/app/layout/mfe.layout.component.mjs +24 -35
  41. package/esm2022/theme/layout/app/site-map/site-map-sidebar.component.mjs +6 -4
  42. package/esm2022/theme/layout/app/static-sidebar/static-sidebar.component.mjs +85 -27
  43. package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +3 -3
  44. package/esm2022/theme/layout/service/breadcrumb-publisher.service.mjs +86 -0
  45. package/esm2022/theme/layout/service/tab-session.service.mjs +126 -0
  46. package/esm2022/ui/table/src/table.component.mjs +10 -10
  47. package/esm2022/ui-business/ref-value/src/ref-value.component.mjs +15 -7
  48. package/esm2022/util/sync-active-tab-route/src/sync-active-tab-route.directive.mjs +29 -9
  49. package/fesm2022/aril-app.component-s14ruALV.mjs +183 -0
  50. package/fesm2022/aril-app.component-s14ruALV.mjs.map +1 -0
  51. package/fesm2022/aril-boot-bridge.mjs +35 -4
  52. package/fesm2022/aril-boot-bridge.mjs.map +1 -1
  53. package/fesm2022/aril-boot-config-api.mjs +11 -2
  54. package/fesm2022/aril-boot-config-api.mjs.map +1 -1
  55. package/fesm2022/aril-boot-config-apps.mjs +1678 -10
  56. package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
  57. package/fesm2022/aril-boot-config-plugins.mjs +12 -4
  58. package/fesm2022/aril-boot-config-plugins.mjs.map +1 -1
  59. package/fesm2022/aril-boot-host.mjs +21 -7
  60. package/fesm2022/aril-boot-host.mjs.map +1 -1
  61. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs +183 -0
  62. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs.map +1 -0
  63. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs +631 -0
  64. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs.map +1 -0
  65. package/fesm2022/aril-boot-mfe.mjs +5 -3
  66. package/fesm2022/aril-boot-mfe.mjs.map +1 -1
  67. package/fesm2022/aril-keycloak.mjs +16 -1
  68. package/fesm2022/aril-keycloak.mjs.map +1 -1
  69. package/fesm2022/aril-provider.mjs +90 -12
  70. package/fesm2022/aril-provider.mjs.map +1 -1
  71. package/fesm2022/aril-theme-layout.mjs +2630 -2017
  72. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  73. package/fesm2022/aril-ui-business-ref-value.mjs +14 -6
  74. package/fesm2022/aril-ui-business-ref-value.mjs.map +1 -1
  75. package/fesm2022/aril-ui-table.mjs +9 -9
  76. package/fesm2022/aril-ui-table.mjs.map +1 -1
  77. package/fesm2022/aril-util-sync-active-tab-route.mjs +28 -8
  78. package/fesm2022/aril-util-sync-active-tab-route.mjs.map +1 -1
  79. package/fesm2022/aril.mjs +354 -25
  80. package/fesm2022/aril.mjs.map +1 -1
  81. package/keycloak/src/auth.interceptor.d.ts +7 -0
  82. package/package.json +188 -188
  83. package/provider/src/prodiveHost.d.ts +1 -0
  84. package/theme/layout/app/expandableMenu/expandable-menu.component.d.ts +21 -4
  85. package/theme/layout/app/expandableMenu/expandable-menu.component.html +19 -5
  86. package/theme/layout/app/expandableMenu/expandable-menu.component.ts +69 -9
  87. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +1 -0
  88. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +3 -1
  89. package/theme/layout/app/general-search/general-search.component.html +2 -1
  90. package/theme/layout/app/general-search/general-search.component.ts +2 -2
  91. package/theme/layout/app/history/history-sidebar.component.html +3 -1
  92. package/theme/layout/app/history/history-sidebar.component.ts +3 -1
  93. package/theme/layout/app/layout/app.layout.component.d.ts +105 -5
  94. package/theme/layout/app/layout/app.layout.component.html +102 -1
  95. package/theme/layout/app/layout/app.layout.component.scss +372 -0
  96. package/theme/layout/app/layout/app.layout.component.ts +452 -13
  97. package/theme/layout/app/layout/mfe.layout.component.d.ts +7 -5
  98. package/theme/layout/app/layout/mfe.layout.component.ts +13 -39
  99. package/theme/layout/app/site-map/site-map-sidebar.component.html +1 -0
  100. package/theme/layout/app/site-map/site-map-sidebar.component.ts +3 -1
  101. package/theme/layout/app/static-sidebar/static-sidebar.component.d.ts +26 -5
  102. package/theme/layout/app/static-sidebar/static-sidebar.component.html +11 -5
  103. package/theme/layout/app/static-sidebar/static-sidebar.component.ts +68 -13
  104. package/theme/layout/app/topbar/app.topbar.component.html +0 -1
  105. package/theme/layout/app/topbar/app.topbar.component.scss +1 -1
  106. package/theme/layout/service/breadcrumb-publisher.service.d.ts +24 -0
  107. package/theme/layout/service/breadcrumb-publisher.service.ts +95 -0
  108. package/theme/layout/service/tab-session.service.d.ts +52 -0
  109. package/theme/layout/service/tab-session.service.ts +138 -0
  110. package/theme/styles/layout/_breadcrumb.scss +95 -0
  111. package/theme/styles/layout/_content.scss +2 -2
  112. package/ui/table/src/table.component.d.ts +2 -2
  113. package/ui-business/ref-value/src/ref-value.component.d.ts +4 -2
  114. package/util/sync-active-tab-route/src/sync-active-tab-route.directive.d.ts +15 -2
  115. package/boot/config/apps/src/reuse-strategy.d.ts +0 -4
  116. package/esm2022/boot/config/apps/src/reuse-strategy.mjs +0 -9
  117. package/esm2022/theme/layout/app/breadcrumb/app.breadcrumb.component.mjs +0 -107
  118. package/fesm2022/aril-app.component-wxP3y8dg.mjs +0 -81
  119. package/fesm2022/aril-app.component-wxP3y8dg.mjs.map +0 -1
  120. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs +0 -80
  121. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs.map +0 -1
  122. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs +0 -315
  123. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs.map +0 -1
  124. package/theme/layout/app/breadcrumb/app.breadcrumb.component.d.ts +0 -25
  125. package/theme/layout/app/breadcrumb/app.breadcrumb.component.html +0 -8
  126. package/theme/layout/app/breadcrumb/app.breadcrumb.component.ts +0 -127
@@ -1,13 +1,92 @@
1
- import { Router, provideRouter, withComponentInputBinding, withHashLocation, withViewTransitions } from '@angular/router';
1
+ import { Router, provideRouter, withComponentInputBinding, withHashLocation } from '@angular/router';
2
2
  import { bridge } from 'aril/boot/bridge';
3
+ /**
4
+ * Plugin'lere host Router'ı sağlar — AMA **tab-aware Proxy** ile sarılmış şekilde.
5
+ * Plugin'ler genelde `inject(Router)` ile aldıkları Router üzerinden `router.navigate(...)`
6
+ * çağırır; bu çağrılar `_tab` state/query taşımadığı için Strategy yanlış handle yönetir
7
+ * (tab izolasyonu bozulur, "(pending)" Application boot olur, state kaybolur).
8
+ *
9
+ * Proxy `bridge.activeTabId()` ile aktif tab'ı okuyup `_tab`'i `extras.state`'e ve URL'e
10
+ * (UrlTree.queryParams veya string URL) enjekte eder. Tek noktada düzeltme — plugin
11
+ * koduna dokunmaya gerek yok.
12
+ */
13
+ /** `extras.state._tab` doldurur. Strategy URL queryParams'tan okur (history.state fallback). */
14
+ function injectStateTabId(extras) {
15
+ const tabId = bridge.activeTabId();
16
+ const next = { ...(extras ?? {}) };
17
+ if (!tabId)
18
+ return next;
19
+ const existingState = next.state ?? {};
20
+ if (typeof existingState['_tab'] !== 'string' || !existingState['_tab']) {
21
+ next.state = { ...existingState, _tab: tabId };
22
+ }
23
+ return next;
24
+ }
25
+ /**
26
+ * URL string'ine veya UrlTree'ye `_tab=<tabId>` query param ekler.
27
+ * Plugin'ler genelde `router.navigate(commands)` çağırır → Angular Router internal olarak
28
+ * `createUrlTree(commands)` + `navigateByUrl(urlTree)` yapar — ama internal `this.navigateByUrl`
29
+ * proxy'den geçmez (real Router'ın `this` binding'i). Bu yüzden Plugin code'unda görünen
30
+ * "navigate" çağrıları aslında proxy'ye `navigateByUrl(UrlTree)` olarak ulaşır.
31
+ *
32
+ * UrlTree caller için read-only kabul edilir; in-place mutation Router internal cache'lerini
33
+ * ve plugin tarafının elindeki referansı bozar. Bu yüzden gelen tree'yi serialize edip
34
+ * `_tab`'i string seviyesinde ekledikten sonra `parseUrl` ile **yeni bir UrlTree** üretiriz —
35
+ * orijinal referans dokunulmaz kalır.
36
+ */
37
+ function injectTabIntoUrl(router, url) {
38
+ const tabId = bridge.activeTabId();
39
+ if (!tabId)
40
+ return url;
41
+ if (typeof url === 'string') {
42
+ if (/[?&]_tab=/.test(url))
43
+ return url;
44
+ const sep = url.includes('?') ? '&' : '?';
45
+ return `${url}${sep}_tab=${tabId}`;
46
+ }
47
+ if (typeof url.queryParams?.['_tab'] === 'string' && url.queryParams['_tab'])
48
+ return url;
49
+ const serialized = router.serializeUrl(url);
50
+ const sep = serialized.includes('?') ? '&' : '?';
51
+ return router.parseUrl(`${serialized}${sep}_tab=${tabId}`);
52
+ }
53
+ function createTabAwareRouter(realRouter) {
54
+ console.log('[provideHostRouter] tab-aware Router proxy oluşturuldu');
55
+ return new Proxy(realRouter, {
56
+ get(target, prop, receiver) {
57
+ // `navigate` handler intentionally yok: Angular Router'ın `navigate(commands, extras)`
58
+ // internal `this.navigateByUrl(this.createUrlTree(commands))` çağırır — bu internal
59
+ // `this` real Router (`bind`ı atomik), proxy'den geçmez. Yani plugin'lerin
60
+ // `router.navigate(['/...'])` çağrıları proxy'nin `navigateByUrl` handler'ına ulaşır;
61
+ // `navigate` override etsek de tetiklenmez. Tek noktada `navigateByUrl` patch yeterli.
62
+ if (prop === 'navigateByUrl') {
63
+ return (url, extras) => {
64
+ const tabId = bridge.activeTabId();
65
+ const finalUrl = injectTabIntoUrl(target, url);
66
+ const enhanced = injectStateTabId(extras);
67
+ console.log(`[provideHostRouter] navigateByUrl url="${typeof url === 'string' ? url : '(UrlTree)'}" ` +
68
+ `activeTabId="${tabId}" → finalUrl="${typeof finalUrl === 'string' ? finalUrl : '(UrlTree)'}" ` +
69
+ `extras.state=${JSON.stringify(enhanced.state)}`);
70
+ return target.navigateByUrl(finalUrl, enhanced);
71
+ };
72
+ }
73
+ // receiver=target: getter'lar (Router.url, Router.events vs.) `this`'i gerçek
74
+ // Router instance'ı olarak alır. Proxy üzerinden lookup yapmadığımız için
75
+ // internal `this.foo()` çağrıları doğrudan real Router'a düşer — recursion
76
+ // veya `instanceof Router` kontrolünde sürpriz yok.
77
+ return Reflect.get(target, prop, target);
78
+ }
79
+ });
80
+ }
3
81
  export const provideHostRouter = () => {
4
- const providers = [];
5
- if (bridge.hostRouter) {
6
- return [
7
- provideRouter([], withComponentInputBinding(), withHashLocation(), withViewTransitions()),
8
- { provide: Router, useValue: bridge.hostRouter }
9
- ];
82
+ if (!bridge.hostRouter) {
83
+ throw new Error('[provideHostRouter] bridge.hostRouter henüz set edilmedi. ' +
84
+ 'Host shell bootstrap tamamlanmadan MFE/plugin provideHostRouter() çağıramaz.');
10
85
  }
11
- return providers;
86
+ const tabAwareRouter = createTabAwareRouter(bridge.hostRouter);
87
+ return [
88
+ provideRouter([], withComponentInputBinding(), withHashLocation()),
89
+ { provide: Router, useValue: tabAwareRouter }
90
+ ];
12
91
  };
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZGl2ZUhvc3RSb3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3Byb3ZpZGVyL3NyYy9wcm9kaXZlSG9zdFJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ04sTUFBTSxFQUNOLGFBQWEsRUFDYix5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFhLEVBQUU7SUFDL0MsTUFBTSxTQUFTLEdBQTJDLEVBQUUsQ0FBQztJQUU3RCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixPQUFPO1lBQ04sYUFBYSxDQUFDLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztZQUN6RixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUU7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNsQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuXHRSb3V0ZXIsXHJcblx0cHJvdmlkZVJvdXRlcixcclxuXHR3aXRoQ29tcG9uZW50SW5wdXRCaW5kaW5nLFxyXG5cdHdpdGhIYXNoTG9jYXRpb24sXHJcblx0d2l0aFZpZXdUcmFuc2l0aW9uc1xyXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBicmlkZ2UgfSBmcm9tICdhcmlsL2Jvb3QvYnJpZGdlJztcclxuXHJcbmV4cG9ydCBjb25zdCBwcm92aWRlSG9zdFJvdXRlciA9ICgpOiBQcm92aWRlciA9PiB7XHJcblx0Y29uc3QgcHJvdmlkZXJzOiBBcnJheTxQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzPiA9IFtdO1xyXG5cclxuXHRpZiAoYnJpZGdlLmhvc3RSb3V0ZXIpIHtcclxuXHRcdHJldHVybiBbXHJcblx0XHRcdHByb3ZpZGVSb3V0ZXIoW10sIHdpdGhDb21wb25lbnRJbnB1dEJpbmRpbmcoKSwgd2l0aEhhc2hMb2NhdGlvbigpLCB3aXRoVmlld1RyYW5zaXRpb25zKCkpLFxyXG5cdFx0XHR7IHByb3ZpZGU6IFJvdXRlciwgdXNlVmFsdWU6IGJyaWRnZS5ob3N0Um91dGVyIH1cclxuXHRcdF07XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcHJvdmlkZXJzO1xyXG59O1xyXG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZGl2ZUhvc3RSb3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3Byb3ZpZGVyL3NyYy9wcm9kaXZlSG9zdFJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRU4sTUFBTSxFQUVOLGFBQWEsRUFDYix5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFDOzs7Ozs7Ozs7R0FTRztBQUVILGdHQUFnRztBQUNoRyxTQUFTLGdCQUFnQixDQUFDLE1BQTZDO0lBQ3RFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNuQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hCLE1BQU0sYUFBYSxHQUFJLElBQUksQ0FBQyxLQUE2QyxJQUFJLEVBQUUsQ0FBQztJQUNoRixJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsR0FBcUI7SUFDOUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDdkIsSUFBSSxPQUFP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QUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRTtLQUM3QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuXHROYXZpZ2F0aW9uQmVoYXZpb3JPcHRpb25zLFxyXG5cdFJvdXRlcixcclxuXHRVcmxUcmVlLFxyXG5cdHByb3ZpZGVSb3V0ZXIsXHJcblx0d2l0aENvbXBvbmVudElucHV0QmluZGluZyxcclxuXHR3aXRoSGFzaExvY2F0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IGJyaWRnZSB9IGZyb20gJ2FyaWwvYm9vdC9icmlkZ2UnO1xyXG5cclxuLyoqXHJcbiAqIFBsdWdpbidsZXJlIGhvc3QgUm91dGVyJ8SxIHNhxJ9sYXIg4oCUIEFNQSAqKnRhYi1hd2FyZSBQcm94eSoqIGlsZSBzYXLEsWxtxLHFnyDFn2VraWxkZS5cclxuICogUGx1Z2luJ2xlciBnZW5lbGRlIGBpbmplY3QoUm91dGVyKWAgaWxlIGFsZMSxa2xhcsSxIFJvdXRlciDDvHplcmluZGVuIGByb3V0ZXIubmF2aWdhdGUoLi4uKWBcclxuICogw6dhxJ/EsXLEsXI7IGJ1IMOnYcSfcsSxbGFyIGBfdGFiYCBzdGF0ZS9xdWVyeSB0YcWfxLFtYWTEscSfxLEgacOnaW4gU3RyYXRlZ3kgeWFubMSxxZ8gaGFuZGxlIHnDtm5ldGlyXHJcbiAqICh0YWIgaXpvbGFzeW9udSBib3p1bHVyLCBcIihwZW5kaW5nKVwiIEFwcGxpY2F0aW9uIGJvb3Qgb2x1ciwgc3RhdGUga2F5Ym9sdXIpLlxyXG4gKlxyXG4gKiBQcm94eSBgYnJpZGdlLmFjdGl2ZVRhYklkKClgIGlsZSBha3RpZiB0YWInxLEgb2t1eXVwIGBfdGFiYCdpIGBleHRyYXMuc3RhdGVgJ2UgdmUgVVJMJ2VcclxuICogKFVybFRyZWUucXVlcnlQYXJhbXMgdmV5YSBzdHJpbmcgVVJMKSBlbmpla3RlIGVkZXIuIFRlayBub2t0YWRhIGTDvHplbHRtZSDigJQgcGx1Z2luXHJcbiAqIGtvZHVuYSBkb2t1bm1heWEgZ2VyZWsgeW9rLlxyXG4gKi9cclxuXHJcbi8qKiBgZXh0cmFzLnN0YXRlLl90YWJgIGRvbGR1cnVyLiBTdHJhdGVneSBVUkwgcXVlcnlQYXJhbXMndGFuIG9rdXIgKGhpc3Rvcnkuc3RhdGUgZmFsbGJhY2spLiAqL1xyXG5mdW5jdGlvbiBpbmplY3RTdGF0ZVRhYklkKGV4dHJhczogTmF2aWdhdGlvbkJlaGF2aW9yT3B0aW9ucyB8IHVuZGVmaW5lZCk6IE5hdmlnYXRpb25CZWhhdmlvck9wdGlvbnMge1xyXG5cdGNvbnN0IHRhYklkID0gYnJpZGdlLmFjdGl2ZVRhYklkKCk7XHJcblx0Y29uc3QgbmV4dCA9IHsgLi4uKGV4dHJhcyA/PyB7fSkgfTtcclxuXHRpZiAoIXRhYklkKSByZXR1cm4gbmV4dDtcclxuXHRjb25zdCBleGlzdGluZ1N0YXRlID0gKG5leHQuc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpID8/IHt9O1xyXG5cdGlmICh0eXBlb2YgZXhpc3RpbmdTdGF0ZVsnX3RhYiddICE9PSAnc3RyaW5nJyB8fCAhZXhpc3RpbmdTdGF0ZVsnX3RhYiddKSB7XHJcblx0XHRuZXh0LnN0YXRlID0geyAuLi5leGlzdGluZ1N0YXRlLCBfdGFiOiB0YWJJZCB9O1xyXG5cdH1cclxuXHRyZXR1cm4gbmV4dDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVSTCBzdHJpbmcnaW5lIHZleWEgVXJsVHJlZSd5ZSBgX3RhYj08dGFiSWQ+YCBxdWVyeSBwYXJhbSBla2xlci5cclxuICogUGx1Z2luJ2xlciBnZW5lbGRlIGByb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMpYCDDp2HEn8SxcsSxciDihpIgQW5ndWxhciBSb3V0ZXIgaW50ZXJuYWwgb2xhcmFrXHJcbiAqIGBjcmVhdGVVcmxUcmVlKGNvbW1hbmRzKWAgKyBgbmF2aWdhdGVCeVVybCh1cmxUcmVlKWAgeWFwYXIg4oCUIGFtYSBpbnRlcm5hbCBgdGhpcy5uYXZpZ2F0ZUJ5VXJsYFxyXG4gKiBwcm94eSdkZW4gZ2XDp21leiAocmVhbCBSb3V0ZXInxLFuIGB0aGlzYCBiaW5kaW5nJ2kpLiBCdSB5w7x6ZGVuIFBsdWdpbiBjb2RlJ3VuZGEgZ8O2csO8bmVuXHJcbiAqIFwibmF2aWdhdGVcIiDDp2HEn3LEsWxhcsSxIGFzbMSxbmRhIHByb3h5J3llIGBuYXZpZ2F0ZUJ5VXJsKFVybFRyZWUpYCBvbGFyYWsgdWxhxZ/EsXIuXHJcbiAqXHJcbiAqIFVybFRyZWUgY2FsbGVyIGnDp2luIHJlYWQtb25seSBrYWJ1bCBlZGlsaXI7IGluLXBsYWNlIG11dGF0aW9uIFJvdXRlciBpbnRlcm5hbCBjYWNoZSdsZXJpbmlcclxuICogdmUgcGx1Z2luIHRhcmFmxLFuxLFuIGVsaW5kZWtpIHJlZmVyYW5zxLEgYm96YXIuIEJ1IHnDvHpkZW4gZ2VsZW4gdHJlZSd5aSBzZXJpYWxpemUgZWRpcFxyXG4gKiBgX3RhYmAnaSBzdHJpbmcgc2V2aXllc2luZGUgZWtsZWRpa3RlbiBzb25yYSBgcGFyc2VVcmxgIGlsZSAqKnllbmkgYmlyIFVybFRyZWUqKiDDvHJldGlyaXog4oCUXHJcbiAqIG9yaWppbmFsIHJlZmVyYW5zIGRva3VudWxtYXoga2FsxLFyLlxyXG4gKi9cclxuZnVuY3Rpb24gaW5qZWN0VGFiSW50b1VybChyb3V0ZXI6IFJvdXRlciwgdXJsOiBzdHJpbmcgfCBVcmxUcmVlKTogc3RyaW5nIHwgVXJsVHJlZSB7XHJcblx0Y29uc3QgdGFiSWQgPSBicmlkZ2UuYWN0aXZlVGFiSWQoKTtcclxuXHRpZiAoIXRhYklkKSByZXR1cm4gdXJsO1xyXG5cdGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xyXG5cdFx0aWYgKC9bPyZdX3RhYj0vLnRlc3QodXJsKSkgcmV0dXJuIHVybDtcclxuXHRcdGNvbnN0IHNlcCA9IHVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nO1xyXG5cdFx0cmV0dXJuIGAke3VybH0ke3NlcH1fdGFiPSR7dGFiSWR9YDtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiB1cmwucXVlcnlQYXJhbXM/LlsnX3RhYiddID09PSAnc3RyaW5nJyAmJiB1cmwucXVlcnlQYXJhbXNbJ190YWInXSkgcmV0dXJuIHVybDtcclxuXHRjb25zdCBzZXJpYWxpemVkID0gcm91dGVyLnNlcmlhbGl6ZVVybCh1cmwpO1xyXG5cdGNvbnN0IHNlcCA9IHNlcmlhbGl6ZWQuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcclxuXHRyZXR1cm4gcm91dGVyLnBhcnNlVXJsKGAke3NlcmlhbGl6ZWR9JHtzZXB9X3RhYj0ke3RhYklkfWApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVUYWJBd2FyZVJvdXRlcihyZWFsUm91dGVyOiBSb3V0ZXIpOiBSb3V0ZXIge1xyXG5cdGNvbnNvbGUubG9nKCdbcHJvdmlkZUhvc3RSb3V0ZXJdIHRhYi1hd2FyZSBSb3V0ZXIgcHJveHkgb2x1xZ90dXJ1bGR1Jyk7XHJcblx0cmV0dXJuIG5ldyBQcm94eShyZWFsUm91dGVyLCB7XHJcblx0XHRnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xyXG5cdFx0XHQvLyBgbmF2aWdhdGVgIGhhbmRsZXIgaW50ZW50aW9uYWxseSB5b2s6IEFuZ3VsYXIgUm91dGVyJ8SxbiBgbmF2aWdhdGUoY29tbWFuZHMsIGV4dHJhcylgXHJcblx0XHRcdC8vIGludGVybmFsIGB0aGlzLm5hdmlnYXRlQnlVcmwodGhpcy5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzKSlgIMOnYcSfxLFyxLFyIOKAlCBidSBpbnRlcm5hbFxyXG5cdFx0XHQvLyBgdGhpc2AgcmVhbCBSb3V0ZXIgKGBiaW5kYMSxIGF0b21payksIHByb3h5J2RlbiBnZcOnbWV6LiBZYW5pIHBsdWdpbidsZXJpblxyXG5cdFx0XHQvLyBgcm91dGVyLm5hdmlnYXRlKFsnLy4uLiddKWAgw6dhxJ9yxLFsYXLEsSBwcm94eSduaW4gYG5hdmlnYXRlQnlVcmxgIGhhbmRsZXInxLFuYSB1bGHFn8SxcjtcclxuXHRcdFx0Ly8gYG5hdmlnYXRlYCBvdmVycmlkZSBldHNlayBkZSB0ZXRpa2xlbm1lei4gVGVrIG5va3RhZGEgYG5hdmlnYXRlQnlVcmxgIHBhdGNoIHlldGVybGkuXHJcblx0XHRcdGlmIChwcm9wID09PSAnbmF2aWdhdGVCeVVybCcpIHtcclxuXHRcdFx0XHRyZXR1cm4gKHVybDogc3RyaW5nIHwgVXJsVHJlZSwgZXh0cmFzPzogTmF2aWdhdGlvbkJlaGF2aW9yT3B0aW9ucykgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFiSWQgPSBicmlkZ2UuYWN0aXZlVGFiSWQoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGZpbmFsVXJsID0gaW5qZWN0VGFiSW50b1VybCh0YXJnZXQsIHVybCk7XHJcblx0XHRcdFx0XHRjb25zdCBlbmhhbmNlZCA9IGluamVjdFN0YXRlVGFiSWQoZXh0cmFzKTtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRcdFx0XHRgW3Byb3ZpZGVIb3N0Um91dGVyXSBuYXZpZ2F0ZUJ5VXJsIHVybD1cIiR7dHlwZW9mIHVybCA9PT0gJ3N0cmluZycgPyB1cmwgOiAnKFVybFRyZWUpJ31cIiBgICtcclxuXHRcdFx0XHRcdFx0YGFjdGl2ZVRhYklkPVwiJHt0YWJJZH1cIiDihpIgZmluYWxVcmw9XCIke3R5cGVvZiBmaW5hbFVybCA9PT0gJ3N0cmluZycgPyBmaW5hbFVybCA6ICcoVXJsVHJlZSknfVwiIGAgK1xyXG5cdFx0XHRcdFx0XHRgZXh0cmFzLnN0YXRlPSR7SlNPTi5zdHJpbmdpZnkoZW5oYW5jZWQuc3RhdGUpfWBcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0Lm5hdmlnYXRlQnlVcmwoZmluYWxVcmwsIGVuaGFuY2VkKTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIHJlY2VpdmVyPXRhcmdldDogZ2V0dGVyJ2xhciAoUm91dGVyLnVybCwgUm91dGVyLmV2ZW50cyB2cy4pIGB0aGlzYCdpIGdlcsOnZWtcclxuXHRcdFx0Ly8gUm91dGVyIGluc3RhbmNlJ8SxIG9sYXJhayBhbMSxci4gUHJveHkgw7x6ZXJpbmRlbiBsb29rdXAgeWFwbWFkxLHEn8SxbcSxeiBpw6dpblxyXG5cdFx0XHQvLyBpbnRlcm5hbCBgdGhpcy5mb28oKWAgw6dhxJ9yxLFsYXLEsSBkb8SfcnVkYW4gcmVhbCBSb3V0ZXInYSBkw7zFn2VyIOKAlCByZWN1cnNpb25cclxuXHRcdFx0Ly8gdmV5YSBgaW5zdGFuY2VvZiBSb3V0ZXJgIGtvbnRyb2zDvG5kZSBzw7xycHJpeiB5b2suXHJcblx0XHRcdHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHRhcmdldCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBwcm92aWRlSG9zdFJvdXRlciA9ICgpOiBQcm92aWRlciA9PiB7XHJcblx0aWYgKCFicmlkZ2UuaG9zdFJvdXRlcikge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKFxyXG5cdFx0XHQnW3Byb3ZpZGVIb3N0Um91dGVyXSBicmlkZ2UuaG9zdFJvdXRlciBoZW7DvHogc2V0IGVkaWxtZWRpLiAnICtcclxuXHRcdFx0J0hvc3Qgc2hlbGwgYm9vdHN0cmFwIHRhbWFtbGFubWFkYW4gTUZFL3BsdWdpbiBwcm92aWRlSG9zdFJvdXRlcigpIMOnYcSfxLFyYW1hei4nXHJcblx0XHQpO1xyXG5cdH1cclxuXHRjb25zdCB0YWJBd2FyZVJvdXRlciA9IGNyZWF0ZVRhYkF3YXJlUm91dGVyKGJyaWRnZS5ob3N0Um91dGVyKTtcclxuXHRyZXR1cm4gW1xyXG5cdFx0cHJvdmlkZVJvdXRlcihbXSwgd2l0aENvbXBvbmVudElucHV0QmluZGluZygpLCB3aXRoSGFzaExvY2F0aW9uKCkpLFxyXG5cdFx0eyBwcm92aWRlOiBSb3V0ZXIsIHVzZVZhbHVlOiB0YWJBd2FyZVJvdXRlciB9XHJcblx0XTtcclxufTtcclxuIl19
@@ -1,20 +1,20 @@
1
1
  import { NgClass } from '@angular/common';
2
- import { Component, HostListener } from '@angular/core';
2
+ import { Component, HostListener, inject } from '@angular/core';
3
3
  import { toSignal } from '@angular/core/rxjs-interop';
4
- import { NavigationEnd, RouterLink } from '@angular/router';
4
+ import { NavigationEnd } from '@angular/router';
5
5
  import { TooltipModule } from 'primeng/tooltip';
6
6
  import { filter } from 'rxjs';
7
7
  import { bridge } from 'aril/boot/bridge';
8
+ import { NavLinkDirective, NavService } from 'aril/boot/config/apps';
8
9
  import { TranslateJsonPipe } from 'aril/util/pipes';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "aril/util/pipes";
11
- import * as i2 from "../../service/app.menu.service";
12
- import * as i3 from "@angular/router";
13
- import * as i4 from "keycloak-angular";
14
- import * as i5 from "@ngneat/transloco";
15
- import * as i6 from "../../service/app.layout.service";
16
- import * as i7 from "@angular/common/http";
17
- import * as i8 from "primeng/tooltip";
12
+ import * as i2 from "@angular/router";
13
+ import * as i3 from "keycloak-angular";
14
+ import * as i4 from "@ngneat/transloco";
15
+ import * as i5 from "../../service/app.layout.service";
16
+ import * as i6 from "@angular/common/http";
17
+ import * as i7 from "primeng/tooltip";
18
18
  export class ExpandableMenuComponent {
19
19
  get sidebarExpanded() {
20
20
  return this.layoutService.state.secondarySidebarExpanded;
@@ -22,9 +22,8 @@ export class ExpandableMenuComponent {
22
22
  set sidebarExpanded(value) {
23
23
  this.layoutService.setSecondarySidebarExpanded(value);
24
24
  }
25
- constructor(translateJsonPipe, menuService, router, keycloak, translocoService, layoutService, http) {
25
+ constructor(translateJsonPipe, router, keycloak, translocoService, layoutService, http) {
26
26
  this.translateJsonPipe = translateJsonPipe;
27
- this.menuService = menuService;
28
27
  this.router = router;
29
28
  this.keycloak = keycloak;
30
29
  this.translocoService = translocoService;
@@ -63,6 +62,7 @@ export class ExpandableMenuComponent {
63
62
  };
64
63
  this.actionLoadingItems = new Set();
65
64
  this.actionSubscription = null;
65
+ this.navService = inject(NavService);
66
66
  this.activeLang = toSignal(this.translocoService.langChanges$, { initialValue: 'tr' });
67
67
  this.username = this.keycloak.getUsername().charAt(0).toUpperCase();
68
68
  }
@@ -151,12 +151,12 @@ export class ExpandableMenuComponent {
151
151
  }
152
152
  }
153
153
  updateMenuItems() {
154
- this.cachedMenuItems = bridge.isHostMode() ? bridge.hostMenuItems() : this.menuService.menuItems();
154
+ this.cachedMenuItems = bridge.hostMenuItems();
155
155
  }
156
156
  getMenuItems() {
157
157
  return this.cachedMenuItems;
158
158
  }
159
- selectMainItem(index, item) {
159
+ selectMainItem(event, index, item) {
160
160
  // Handle action items at top level
161
161
  if (item.action && (!item.items || item.items.length === 0)) {
162
162
  this.onActionItemClick(item);
@@ -166,7 +166,12 @@ export class ExpandableMenuComponent {
166
166
  this.layoutService.setSecondarySidebarExpanded(false);
167
167
  this.layoutService.setSelectedMainItem(index);
168
168
  this.selectedMainMenuItem = item;
169
- this.router.navigate([item.routerLink]);
169
+ this.dispatchNavigation(event, {
170
+ tabId: '',
171
+ navLink: item.routerLink,
172
+ navName: this.getLocalText(item.label),
173
+ icon: item.icon
174
+ });
170
175
  return;
171
176
  }
172
177
  // Handle regular menu items with submenu
@@ -237,6 +242,16 @@ export class ExpandableMenuComponent {
237
242
  getLocalText(text) {
238
243
  return this.translateJsonPipe.transform(text);
239
244
  }
245
+ /**
246
+ * Hash strategy için routerLink'i `#`-prefix'li href'e çevirir. routerLink config'te
247
+ * leading slash içerebilir (örn. anasayfa için `'/'`); naive `'#/' + routerLink`
248
+ * concatenation `#//` üretirdi — sağ tık "linki kopyala" UX'inde bu çirkin görünür.
249
+ */
250
+ getHashHref(routerLink) {
251
+ if (!routerLink)
252
+ return '#';
253
+ return routerLink.startsWith('/') ? '#' + routerLink : '#/' + routerLink;
254
+ }
240
255
  getActionItemKey(item) {
241
256
  return item.action?.url + '|' + item.action?.successRoute;
242
257
  }
@@ -292,6 +307,53 @@ export class ExpandableMenuComponent {
292
307
  return current[key];
293
308
  }, obj);
294
309
  }
310
+ /**
311
+ * Chrome-like menü click davranışı (secondary/tertiary/nested seviyeleri için):
312
+ * - Normal click → aktif tab'da navigate
313
+ * - Ctrl/Cmd + Click → arka planda yeni tab
314
+ * - Ctrl/Cmd + Shift + Click → ön planda yeni tab
315
+ */
316
+ onMenuClick(event, item) {
317
+ if (!item.routerLink)
318
+ return;
319
+ event.preventDefault();
320
+ this.dispatchNavigation(event, {
321
+ tabId: '',
322
+ navLink: item.routerLink,
323
+ navName: this.getLocalText(item.label),
324
+ icon: item.icon
325
+ });
326
+ }
327
+ /** Middle click (button 1) → arka planda yeni tab. */
328
+ onMenuAuxClick(event, item) {
329
+ if (event.button !== 1 || !item.routerLink)
330
+ return;
331
+ event.preventDefault();
332
+ this.navService.openInBackgroundTab({
333
+ tabId: '',
334
+ navLink: item.routerLink,
335
+ navName: this.getLocalText(item.label),
336
+ icon: item.icon
337
+ });
338
+ }
339
+ /** Middle click default scroll davranışını engelle. */
340
+ onMenuMousedown(event) {
341
+ if (event.button === 1)
342
+ event.preventDefault();
343
+ }
344
+ dispatchNavigation(event, navItem) {
345
+ if (event.ctrlKey || event.metaKey) {
346
+ if (event.shiftKey) {
347
+ this.navService.openInNewTabAndFocus(navItem);
348
+ }
349
+ else {
350
+ this.navService.openInBackgroundTab(navItem);
351
+ }
352
+ }
353
+ else {
354
+ this.navService.navigateInCurrentTab(navItem);
355
+ }
356
+ }
295
357
  toggleSidebar() {
296
358
  // Eğer seçili bir ana menü öğesi varsa ve alt menüleri varsa toggle yapabiliriz
297
359
  if (this.selectedMainMenuItem && this.selectedMainMenuItem.items && this.selectedMainMenuItem.items.length > 0) {
@@ -301,14 +363,14 @@ export class ExpandableMenuComponent {
301
363
  this.sidebarExpanded = false;
302
364
  }
303
365
  }
304
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ExpandableMenuComponent, deps: [{ token: i1.TranslateJsonPipe }, { token: i2.AppMenuService }, { token: i3.Router }, { token: i4.KeycloakService }, { token: i5.TranslocoService }, { token: i6.LayoutService }, { token: i7.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
305
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: ExpandableMenuComponent, isStandalone: true, selector: "app-expandable-menu", host: { listeners: { "window:resize": "onResize()" } }, providers: [TranslateJsonPipe], ngImport: i0, template: "<div class=\"new-layout-sidebar\" >\r\n\t<!-- Main sidebar (first level) -->\r\n\t<div class=\"main-sidebar\" style=\"position: relative;\">\r\n\t\t<div class=\"main-sidebar-content\">\r\n\t\t\t<ul class=\"main-menu\">\r\n\t\t\t\t@for(item of getMenuItems(); track item; let i = $index){\r\n\t\t\t\t\t@if(!item.separator){\r\n\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(item) || isHaveSelectedChildItem(item)}\"\r\n\t\t\t\t\t\t(click)=\"selectMainItem(i, item)\"\r\n\t\t\t\t\t\t[pTooltip]=\"(item.label && activeLang() ? item.label[activeLang()!] || '' : '')\"\r\n\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t<div class=\"main-menu-item\">\r\n\t\t\t\t\t\t\t<i [ngClass]=\"item.icon\" class=\"menu-icon\"></i>\r\n\t\t\t\t\t\t\t<!-- <small class=\"menu-label\">{{ item.label && activeLang() ? item.label[activeLang()!] || '' : '' }}</small> -->\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t</div>\r\n\t\t @if(selectedMainMenuItem && selectedMainMenuItem.items && selectedMainMenuItem.items.length > 0){\r\n\r\n\t\t\t <div class=\"sidebar-toggle-container\">\r\n\t\t\t\t <button class=\"sidebar-circle-toggle-btn\" (click)=\"toggleSidebar()\">\r\n\t\t\t\t\t <i class=\"pi\" [ngClass]=\"sidebarExpanded ? 'pi-angle-left' : 'pi-angle-right'\"></i>\r\n\t\t\t\t </button>\r\n\t\t\t </div>\r\n\t\t }\r\n\r\n\t<!-- Secondary sidebar (second level) -->\r\n\t<div class=\"secondary-sidebar\" [ngClass]=\"{'expanded': sidebarExpanded}\">\r\n\t\t<div class=\"secondary-content-wrapper\" style=\"position: relative;\">\r\n\t\t\t<!-- Secondary sidebar content -->\r\n\t\t\t<div class=\"secondary-sidebar-content\">\r\n\t\t\t\t@if(selectedMainMenuItem){\r\n\t\t\t\t\t<ul class=\"secondary-menu\">\r\n\t\t\t\t\t\t@for(subItem of selectedMainMenuItem.items; track subItem; let i = $index){\r\n\t\t\t\t\t\t\t\t<!-- Action menu item -->\r\n\t\t\t\t\t\t\t\t@if(subItem.action) {\r\n\t\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t<a class=\"secondary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(subItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(subItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"submenu-icon pi pi-spin pi-spinner\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t<!-- Regular menu item -->\r\n\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'active': isActiveRoute(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t<a [routerLink]=\"subItem.routerLink\" \r\n\t\t\t\t\t\t\t\t\t\tclass=\"secondary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t<!-- Always render submenu if it exists -->\r\n\t\t\t\t\t\t\t\t\t @if(subItem.items && subItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t <ul class=\"tertiary-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t@for(childItem of subItem.items; track childItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- Action item at tertiary level -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"tertiary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(childItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(childItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'active': isActiveRoute(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a [routerLink]=\"childItem.routerLink\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"tertiary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Always render deeper levels if they exist, also visible by default -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.items && childItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ul class=\"nested-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for(nestedItem of childItem.items; track nestedItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(nestedItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"nested-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"nested-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(nestedItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(nestedItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-item\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a [routerLink]=\"nestedItem.routerLink\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t </ul>\r\n\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t\r\n</div>\r\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); }
366
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ExpandableMenuComponent, deps: [{ token: i1.TranslateJsonPipe }, { token: i2.Router }, { token: i3.KeycloakService }, { token: i4.TranslocoService }, { token: i5.LayoutService }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
367
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: ExpandableMenuComponent, isStandalone: true, selector: "app-expandable-menu", host: { listeners: { "window:resize": "onResize()" } }, providers: [TranslateJsonPipe], ngImport: i0, template: "<div class=\"new-layout-sidebar\" >\r\n\t<!-- Main sidebar (first level) -->\r\n\t<div class=\"main-sidebar\" style=\"position: relative;\">\r\n\t\t<div class=\"main-sidebar-content\">\r\n\t\t\t<ul class=\"main-menu\">\r\n\t\t\t\t@for(item of getMenuItems(); track item; let i = $index){\r\n\t\t\t\t\t@if(!item.separator){\r\n\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(item) || isHaveSelectedChildItem(item)}\"\r\n\t\t\t\t\t\t(click)=\"selectMainItem($event, i, item)\"\r\n\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, item)\"\r\n\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t[pTooltip]=\"(item.label && activeLang() ? item.label[activeLang()!] || '' : '')\"\r\n\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t<div class=\"main-menu-item\">\r\n\t\t\t\t\t\t\t<i [ngClass]=\"item.icon\" class=\"menu-icon\"></i>\r\n\t\t\t\t\t\t\t<!-- <small class=\"menu-label\">{{ item.label && activeLang() ? item.label[activeLang()!] || '' : '' }}</small> -->\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t</div>\r\n\t\t @if(selectedMainMenuItem && selectedMainMenuItem.items && selectedMainMenuItem.items.length > 0){\r\n\r\n\t\t\t <div class=\"sidebar-toggle-container\">\r\n\t\t\t\t <button class=\"sidebar-circle-toggle-btn\" (click)=\"toggleSidebar()\">\r\n\t\t\t\t\t <i class=\"pi\" [ngClass]=\"sidebarExpanded ? 'pi-angle-left' : 'pi-angle-right'\"></i>\r\n\t\t\t\t </button>\r\n\t\t\t </div>\r\n\t\t }\r\n\r\n\t<!-- Secondary sidebar (second level) -->\r\n\t<div class=\"secondary-sidebar\" [ngClass]=\"{'expanded': sidebarExpanded}\">\r\n\t\t<div class=\"secondary-content-wrapper\" style=\"position: relative;\">\r\n\t\t\t<!-- Secondary sidebar content -->\r\n\t\t\t<div class=\"secondary-sidebar-content\">\r\n\t\t\t\t@if(selectedMainMenuItem){\r\n\t\t\t\t\t<ul class=\"secondary-menu\">\r\n\t\t\t\t\t\t@for(subItem of selectedMainMenuItem.items; track subItem; let i = $index){\r\n\t\t\t\t\t\t\t\t<!-- Action menu item -->\r\n\t\t\t\t\t\t\t\t@if(subItem.action) {\r\n\t\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t<a class=\"secondary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(subItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(subItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"submenu-icon pi pi-spin pi-spinner\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t<!-- Regular menu item -->\r\n\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'active': isActiveRoute(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t<a [attr.href]=\"subItem.routerLink ? getHashHref(subItem.routerLink) : null\"\r\n\t\t\t\t\t\t\t\t\t\t[arilNavLink]=\"{ tabId: '', navLink: subItem.routerLink || '', navName: getLocalText(subItem.label), icon: subItem.icon }\"\r\n\t\t\t\t\t\t\t\t\t\t(click)=\"onMenuClick($event, subItem)\"\r\n\t\t\t\t\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, subItem)\"\r\n\t\t\t\t\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"secondary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t<!-- Always render submenu if it exists -->\r\n\t\t\t\t\t\t\t\t\t @if(subItem.items && subItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t <ul class=\"tertiary-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t@for(childItem of subItem.items; track childItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- Action item at tertiary level -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"tertiary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(childItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(childItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'active': isActiveRoute(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a [attr.href]=\"childItem.routerLink ? getHashHref(childItem.routerLink) : null\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[arilNavLink]=\"{ tabId: '', navLink: childItem.routerLink || '', navName: getLocalText(childItem.label), icon: childItem.icon }\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onMenuClick($event, childItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, childItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"tertiary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Always render deeper levels if they exist, also visible by default -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.items && childItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ul class=\"nested-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for(nestedItem of childItem.items; track nestedItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(nestedItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"nested-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"nested-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(nestedItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(nestedItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-item\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a [attr.href]=\"nestedItem.routerLink ? getHashHref(nestedItem.routerLink) : null\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[arilNavLink]=\"{ tabId: '', navLink: nestedItem.routerLink || '', navName: getLocalText(nestedItem.label), icon: nestedItem.icon }\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onMenuClick($event, nestedItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, nestedItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t </ul>\r\n\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: NavLinkDirective, selector: "[arilNavLink]", inputs: ["arilNavLink"] }] }); }
306
368
  }
307
369
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ExpandableMenuComponent, decorators: [{
308
370
  type: Component,
309
- args: [{ standalone: true, selector: 'app-expandable-menu', imports: [RouterLink, NgClass, TooltipModule], providers: [TranslateJsonPipe], template: "<div class=\"new-layout-sidebar\" >\r\n\t<!-- Main sidebar (first level) -->\r\n\t<div class=\"main-sidebar\" style=\"position: relative;\">\r\n\t\t<div class=\"main-sidebar-content\">\r\n\t\t\t<ul class=\"main-menu\">\r\n\t\t\t\t@for(item of getMenuItems(); track item; let i = $index){\r\n\t\t\t\t\t@if(!item.separator){\r\n\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(item) || isHaveSelectedChildItem(item)}\"\r\n\t\t\t\t\t\t(click)=\"selectMainItem(i, item)\"\r\n\t\t\t\t\t\t[pTooltip]=\"(item.label && activeLang() ? item.label[activeLang()!] || '' : '')\"\r\n\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t<div class=\"main-menu-item\">\r\n\t\t\t\t\t\t\t<i [ngClass]=\"item.icon\" class=\"menu-icon\"></i>\r\n\t\t\t\t\t\t\t<!-- <small class=\"menu-label\">{{ item.label && activeLang() ? item.label[activeLang()!] || '' : '' }}</small> -->\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t</div>\r\n\t\t @if(selectedMainMenuItem && selectedMainMenuItem.items && selectedMainMenuItem.items.length > 0){\r\n\r\n\t\t\t <div class=\"sidebar-toggle-container\">\r\n\t\t\t\t <button class=\"sidebar-circle-toggle-btn\" (click)=\"toggleSidebar()\">\r\n\t\t\t\t\t <i class=\"pi\" [ngClass]=\"sidebarExpanded ? 'pi-angle-left' : 'pi-angle-right'\"></i>\r\n\t\t\t\t </button>\r\n\t\t\t </div>\r\n\t\t }\r\n\r\n\t<!-- Secondary sidebar (second level) -->\r\n\t<div class=\"secondary-sidebar\" [ngClass]=\"{'expanded': sidebarExpanded}\">\r\n\t\t<div class=\"secondary-content-wrapper\" style=\"position: relative;\">\r\n\t\t\t<!-- Secondary sidebar content -->\r\n\t\t\t<div class=\"secondary-sidebar-content\">\r\n\t\t\t\t@if(selectedMainMenuItem){\r\n\t\t\t\t\t<ul class=\"secondary-menu\">\r\n\t\t\t\t\t\t@for(subItem of selectedMainMenuItem.items; track subItem; let i = $index){\r\n\t\t\t\t\t\t\t\t<!-- Action menu item -->\r\n\t\t\t\t\t\t\t\t@if(subItem.action) {\r\n\t\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t<a class=\"secondary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(subItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(subItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"submenu-icon pi pi-spin pi-spinner\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t<!-- Regular menu item -->\r\n\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'active': isActiveRoute(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t<a [routerLink]=\"subItem.routerLink\" \r\n\t\t\t\t\t\t\t\t\t\tclass=\"secondary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t<!-- Always render submenu if it exists -->\r\n\t\t\t\t\t\t\t\t\t @if(subItem.items && subItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t <ul class=\"tertiary-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t@for(childItem of subItem.items; track childItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- Action item at tertiary level -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"tertiary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(childItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(childItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'active': isActiveRoute(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a [routerLink]=\"childItem.routerLink\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"tertiary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Always render deeper levels if they exist, also visible by default -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.items && childItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ul class=\"nested-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for(nestedItem of childItem.items; track nestedItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(nestedItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"nested-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"nested-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(nestedItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(nestedItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-item\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a [routerLink]=\"nestedItem.routerLink\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t </ul>\r\n\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t\r\n</div>\r\n" }]
310
- }], ctorParameters: () => [{ type: i1.TranslateJsonPipe }, { type: i2.AppMenuService }, { type: i3.Router }, { type: i4.KeycloakService }, { type: i5.TranslocoService }, { type: i6.LayoutService }, { type: i7.HttpClient }], propDecorators: { onResize: [{
371
+ args: [{ standalone: true, selector: 'app-expandable-menu', imports: [NgClass, TooltipModule, NavLinkDirective], providers: [TranslateJsonPipe], template: "<div class=\"new-layout-sidebar\" >\r\n\t<!-- Main sidebar (first level) -->\r\n\t<div class=\"main-sidebar\" style=\"position: relative;\">\r\n\t\t<div class=\"main-sidebar-content\">\r\n\t\t\t<ul class=\"main-menu\">\r\n\t\t\t\t@for(item of getMenuItems(); track item; let i = $index){\r\n\t\t\t\t\t@if(!item.separator){\r\n\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(item) || isHaveSelectedChildItem(item)}\"\r\n\t\t\t\t\t\t(click)=\"selectMainItem($event, i, item)\"\r\n\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, item)\"\r\n\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t[pTooltip]=\"(item.label && activeLang() ? item.label[activeLang()!] || '' : '')\"\r\n\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t<div class=\"main-menu-item\">\r\n\t\t\t\t\t\t\t<i [ngClass]=\"item.icon\" class=\"menu-icon\"></i>\r\n\t\t\t\t\t\t\t<!-- <small class=\"menu-label\">{{ item.label && activeLang() ? item.label[activeLang()!] || '' : '' }}</small> -->\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t</div>\r\n\t\t @if(selectedMainMenuItem && selectedMainMenuItem.items && selectedMainMenuItem.items.length > 0){\r\n\r\n\t\t\t <div class=\"sidebar-toggle-container\">\r\n\t\t\t\t <button class=\"sidebar-circle-toggle-btn\" (click)=\"toggleSidebar()\">\r\n\t\t\t\t\t <i class=\"pi\" [ngClass]=\"sidebarExpanded ? 'pi-angle-left' : 'pi-angle-right'\"></i>\r\n\t\t\t\t </button>\r\n\t\t\t </div>\r\n\t\t }\r\n\r\n\t<!-- Secondary sidebar (second level) -->\r\n\t<div class=\"secondary-sidebar\" [ngClass]=\"{'expanded': sidebarExpanded}\">\r\n\t\t<div class=\"secondary-content-wrapper\" style=\"position: relative;\">\r\n\t\t\t<!-- Secondary sidebar content -->\r\n\t\t\t<div class=\"secondary-sidebar-content\">\r\n\t\t\t\t@if(selectedMainMenuItem){\r\n\t\t\t\t\t<ul class=\"secondary-menu\">\r\n\t\t\t\t\t\t@for(subItem of selectedMainMenuItem.items; track subItem; let i = $index){\r\n\t\t\t\t\t\t\t\t<!-- Action menu item -->\r\n\t\t\t\t\t\t\t\t@if(subItem.action) {\r\n\t\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t<a class=\"secondary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(subItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(subItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"submenu-icon pi pi-spin pi-spinner\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t<!-- Regular menu item -->\r\n\t\t\t\t\t\t\t\t<li class=\"secondary-menu-item\" [ngClass]=\"{'active': isActiveRoute(subItem)}\">\r\n\t\t\t\t\t\t\t\t\t<a [attr.href]=\"subItem.routerLink ? getHashHref(subItem.routerLink) : null\"\r\n\t\t\t\t\t\t\t\t\t\t[arilNavLink]=\"{ tabId: '', navLink: subItem.routerLink || '', navName: getLocalText(subItem.label), icon: subItem.icon }\"\r\n\t\t\t\t\t\t\t\t\t\t(click)=\"onMenuClick($event, subItem)\"\r\n\t\t\t\t\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, subItem)\"\r\n\t\t\t\t\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"secondary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(subItem.label, activeLang(), 'secondary') ? (subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t<i [ngClass]=\"subItem.icon\" class=\"submenu-icon\"></i>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"submenu-label\">{{ subItem.label && activeLang() ? subItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t<!-- Always render submenu if it exists -->\r\n\t\t\t\t\t\t\t\t\t @if(subItem.items && subItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t <ul class=\"tertiary-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t@for(childItem of subItem.items; track childItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- Action item at tertiary level -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"tertiary-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(childItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(childItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"tertiary-menu-item\" [ngClass]=\"{'active': isActiveRoute(childItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a [attr.href]=\"childItem.routerLink ? getHashHref(childItem.routerLink) : null\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[arilNavLink]=\"{ tabId: '', navLink: childItem.routerLink || '', navName: getLocalText(childItem.label), icon: childItem.icon }\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onMenuClick($event, childItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, childItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"tertiary-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(childItem.label, activeLang(), 'tertiary') ? (childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tertiary-label\">{{ childItem.label && activeLang() ? childItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Always render deeper levels if they exist, also visible by default -->\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t@if(childItem.items && childItem.items.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ul class=\"nested-menu always-open\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for(nestedItem of childItem.items; track nestedItem; let i = $index){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(nestedItem.action) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"nested-menu-item\" [ngClass]=\"{'action-loading': isActionLoading(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"nested-menu-link is-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onActionItemClick(nestedItem, $event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if(isActionLoading(nestedItem)){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\"><i class=\"pi pi-spin pi-spinner\"></i> {{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-item\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]=\"{'active': isActiveRoute(nestedItem)}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a [attr.href]=\"nestedItem.routerLink ? getHashHref(nestedItem.routerLink) : null\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[arilNavLink]=\"{ tabId: '', navLink: nestedItem.routerLink || '', navName: getLocalText(nestedItem.label), icon: nestedItem.icon }\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onMenuClick($event, nestedItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(auxclick)=\"onMenuAuxClick($event, nestedItem)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(mousedown)=\"onMenuMousedown($event)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"nested-menu-link\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"!isMobile() && isTextTruncated(nestedItem.label, activeLang(), 'nested') ? (nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '') : ''\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"right\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"nested-label\">{{ nestedItem.label && activeLang() ? nestedItem.label[activeLang()!] || '' : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t </ul>\r\n\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t\r\n</div>\r\n" }]
372
+ }], ctorParameters: () => [{ type: i1.TranslateJsonPipe }, { type: i2.Router }, { type: i3.KeycloakService }, { type: i4.TranslocoService }, { type: i5.LayoutService }, { type: i6.HttpClient }], propDecorators: { onResize: [{
311
373
  type: HostListener,
312
374
  args: ['window:resize']
313
375
  }] } });
314
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kYWJsZS1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdGhlbWUvbGF5b3V0L2FwcC9leHBhbmRhYmxlTWVudS9leHBhbmRhYmxlLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC90aGVtZS9sYXlvdXQvYXBwL2V4cGFuZGFibGVNZW51L2V4cGFuZGFibGUtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQTZCLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFVLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUloRCxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFZcEQsTUFBTSxPQUFPLHVCQUF1QjtJQVVuQyxJQUFJLGVBQWU7UUFDbEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxlQUFlLENBQUMsS0FBYztRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFrQ0QsWUFDUyxpQkFBb0MsRUFDcEMsV0FBMkIsRUFDM0IsTUFBYyxF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LENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQsYUFBYTtRQUNaLGdGQUFnRjtRQUNoRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hILElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzlDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM5QixDQUFDO0lBQ0YsQ0FBQzs4R0F6VlcsdUJBQXVCO2tHQUF2Qix1QkFBdUIsMEhBRnhCLENBQUMsaUJBQWlCLENBQUMsMEJDeEIvQixndVJBeUlBLDRDRG5IVyxVQUFVLG9PQUFFLE9BQU8sbUZBQUUsYUFBYTs7MkZBSWhDLHVCQUF1QjtrQkFQbkMsU0FBUztpQ0FDRyxJQUFJLFlBQ04scUJBQXFCLFdBQ3RCLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsYUFFbEMsQ0FBQyxpQkFBaUIsQ0FBQzswUEFpTzlCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC90cmFuc2xvY28nO1xyXG5pbXBvcnQgeyBLZXljbG9ha1NlcnZpY2UgfSBmcm9tICdrZXljbG9hay1hbmd1bGFyJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmaWx0ZXIgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IGJyaWRnZSB9IGZyb20gJ2FyaWwvYm9vdC9icmlkZ2UnO1xyXG5pbXBvcnQgeyBQbHVnaW5NZW51SXRlbSB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBwcyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZUpzb25QaXBlIH0gZnJvbSAnYXJpbC91dGlsL3BpcGVzJztcclxuXHJcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2FwcC5sYXlvdXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9hcHAubWVudS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0c2VsZWN0b3I6ICdhcHAtZXhwYW5kYWJsZS1tZW51JyxcclxuXHRpbXBvcnRzOiBbUm91dGVyTGluaywgTmdDbGFzcywgVG9vbHRpcE1vZHVsZV0sXHJcblx0dGVtcGxhdGVVcmw6ICdleHBhbmRhYmxlLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHByb3ZpZGVyczogW1RyYW5zbGF0ZUpzb25QaXBlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXhwYW5kYWJsZU1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblx0YWN0aXZlTGFuZzogU2lnbmFsPHN0cmluZz47XHJcblx0b3ZlcmxheU1lbnVPcGVuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHRyb3V0ZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cdHVzZXJuYW1lOiBzdHJpbmc7XHJcblxyXG5cdGNhY2hlZE1lbnVJdGVtczogUGx1Z2luTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuXHRzZWxlY3RlZE1haW5NZW51SXRlbTogUGx1Z2luTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblx0Z2V0IHNpZGViYXJFeHBhbmRlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkO1xyXG5cdH1cclxuXHJcblx0c2V0IHNpZGViYXJFeHBhbmRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZCh2YWx1ZSk7XHJcblx0fVxyXG5cclxuXHR0b29sdGlwVGV4dCA9IHtcclxuXHRcdHRvZ2dsZUJ1dHRvbjoge1xyXG5cdFx0XHRleHBhbmRlZDoge1xyXG5cdFx0XHRcdHRyOiAnTWVuw7x5w7wgR2l6bGUnLFxyXG5cdFx0XHRcdGVuOiAnSGlkZSBNZW51J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRjb2xsYXBzZWQ6IHtcclxuXHRcdFx0XHR0cjogJ01lbsO8ecO8IEfDtnN0ZXInLFxyXG5cdFx0XHRcdGVuOiAnU2hvdyBNZW51J1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0bG9ja0J1dHRvbjoge1xyXG5cdFx0XHRsb2NrZWQ6IHtcclxuXHRcdFx0XHR0cjogJ090b21hdGlrIEthcGFubWF5xLEgQcOnJyxcclxuXHRcdFx0XHRlbjogJ0VuYWJsZSBBdXRvLUNsb3NlJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR1bmxvY2tlZDoge1xyXG5cdFx0XHRcdHRyOiAnTWVuw7x5w7wgS2lsaXRsZScsXHJcblx0XHRcdFx0ZW46ICdMb2NrIE1lbnUnXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IE1BWF9MRU5HVEggPSB7XHJcblx0XHRtYWluOiA4LFxyXG5cdFx0c2Vjb25kYXJ5OiAyMCxcclxuXHRcdHRlcnRpYXJ5OiAyMFxyXG5cdH07XHJcblxyXG5cdGFjdGlvbkxvYWRpbmdJdGVtcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cdHByaXZhdGUgYWN0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIHRyYW5zbGF0ZUpzb25QaXBlOiBUcmFuc2xhdGVKc29uUGlwZSxcclxuXHRcdHByaXZhdGUgbWVudVNlcnZpY2U6IEFwcE1lbnVTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuXHRcdHByaXZhdGUga2V5Y2xvYWs6IEtleWNsb2FrU2VydmljZSxcclxuXHRcdHByaXZhdGUgdHJhbnNsb2NvU2VydmljZTogVHJhbnNsb2NvU2VydmljZSxcclxuXHRcdHByaXZhdGUgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcclxuXHRcdHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG5cdCkge1xyXG5cdFx0dGhpcy5hY3RpdmVMYW5nID0gdG9TaWduYWwodGhpcy50cmFuc2xvY29TZXJ2aWNlLmxhbmdDaGFuZ2VzJCwgeyBpbml0aWFsVmFsdWU6ICd0cicgfSk7XHJcblx0XHR0aGlzLnVzZXJuYW1lID0gdGhpcy5rZXljbG9hay5nZXRVc2VybmFtZSgpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xyXG5cdH1cclxuXHJcblx0Ly8gR2V0dGVyIGZvciBsYXlvdXQgc2VydmljZSBzdGF0ZXNcclxuXHRnZXQgc2VsZWN0ZWRNYWluSXRlbSgpOiBudW1iZXIgfCBudWxsIHtcclxuXHRcdHJldHVybiB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc2VsZWN0ZWRNYWluSXRlbTtcclxuXHR9XHJcblxyXG5cdGdldCBzZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5sYXlvdXRTZXJ2aWNlLnN0YXRlLnNlY29uZGFyeVNpZGViYXJFeHBhbmRlZDtcclxuXHR9XHJcblxyXG5cdC8vIENoZWNrIGlmIHRleHQgaXMgdHJ1bmNhdGVkIGFuZCBuZWVkcyB0b29sdGlwXHJcblx0aXNUZXh0VHJ1bmNhdGVkKFxyXG5cdFx0bGFiZWw6IGFueSxcclxuXHRcdGxhbmc6IHN0cmluZyB8IG51bGwsXHJcblx0XHRtZW51VHlwZTogJ21haW4nIHwgJ3NlY29uZGFyeScgfCAndGVydGlhcnknIHwgJ25lc3RlZCcgPSAnc2Vjb25kYXJ5J1xyXG5cdCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFsYWJlbCB8fCAhbGFuZyB8fCAhbGFiZWxbbGFuZ10pIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRjb25zdCB0ZXh0ID0gbGFiZWxbbGFuZ107XHJcblx0XHRjb25zdCB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcblx0XHRjb25zdCBtYXhMZW5ndGggPSBtZW51VHlwZSA9PT0gJ25lc3RlZCcgPyB0aGlzLk1BWF9MRU5HVEgudGVydGlhcnkgOiB0aGlzLk1BWF9MRU5HVEhbbWVudVR5cGVdO1xyXG5cdFx0cmV0dXJuIHRleHRMZW5ndGggPiBtYXhMZW5ndGg7XHJcblx0fVxyXG5cclxuXHQvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBhIG1lbnUgaXRlbSBvciBpdHMgY2hpbGRyZW4gbWF0Y2ggdGhlIGN1cnJlbnQgcm91dGVcclxuXHRpc0FjdGl2ZVJvdXRlKG1lbnVJdGVtOiBQbHVnaW5NZW51SXRlbSk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFtZW51SXRlbSB8fCAhbWVudUl0ZW0ucm91dGVyTGluaykgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdC8vIEdldCBjdXJyZW50IFVSTCBwYXRoIGFmdGVyIHRoZSBoYXNoXHJcblx0XHRjb25zdCBjdXJyZW50VXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG5cdFx0Y29uc3QgaGFzaFVybCA9IGN1cnJlbnRVcmwuaW5kZXhPZignIycpID4gLTEgPyBjdXJyZW50VXJsLnNwbGl0KCcjJylbMV0gOiBjdXJyZW50VXJsO1xyXG5cclxuXHRcdC8vIENoZWNrIGZvciBleGFjdCBtYXRjaCBmaXJzdFxyXG5cdFx0aWYgKGhhc2hVcmwgPT09IG1lbnVJdGVtLnJvdXRlckxpbmsgfHwgaGFzaFVybCA9PT0gJy8nICsgbWVudUl0ZW0ucm91dGVyTGluaykge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBpZiBjdXJyZW50IFVSTCBzdGFydHMgd2l0aCB0aGUgcm91dGVyTGluayAoaGFuZGxlcyBjaGlsZCByb3V0ZXMpXHJcblx0XHRpZiAoXHJcblx0XHRcdG1lbnVJdGVtLnJvdXRlckxpbmsgIT09ICcvJyAmJlxyXG5cdFx0XHQoaGFzaFVybC5zdGFydHNXaXRoKG1lbnVJdGVtLnJvdXRlckxpbmsgKyAnLycpIHx8IGhhc2hVcmwuc3RhcnRzV2l0aCgnLycgKyBtZW51SXRlbS5yb3V0ZXJMaW5rICsgJy8nKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBjaGlsZCBpdGVtcyBpZiB0aGV5IGV4aXN0XHJcblx0XHRpZiAobWVudUl0ZW0uaXRlbXMgJiYgbWVudUl0ZW0uaXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRyZXR1cm4gbWVudUl0ZW0uaXRlbXMuc29tZSgoY2hpbGRJdGVtKSA9PiB0aGlzLmlzQWN0aXZlUm91dGUoY2hpbGRJdGVtKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnVwZGF0ZU1lbnVJdGVtcygpO1xyXG5cdFx0dGhpcy5pbml0aWFsaXplTWVudSgpO1xyXG5cdFx0dGhpcy51cGRhdGVBY3RpdmVNZW51RnJvbUN1cnJlbnRSb3V0ZSgpO1xyXG5cclxuXHRcdC8vIFN1YnNjcmliZSB0byByb3V0ZSBjaGFuZ2VzIHRvIGhhbmRsZSBzZWNvbmRhcnkgc2lkZWJhciBjbG9zaW5nXHJcblx0XHR0aGlzLnJvdXRlclN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50c1xyXG5cdFx0XHQucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG5cdFx0XHQuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0XHQvLyBVcGRhdGUgYWN0aXZlIG1lbnUgYmFzZWQgb24gdGhlIG5ldyByb3V0ZVxyXG5cdFx0XHRcdHRoaXMudXBkYXRlQWN0aXZlTWVudUZyb21DdXJyZW50Um91dGUoKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0Ly8gU3Vic2NyaWJlIHRvIG92ZXJsYXkgbWVudSBvcGVuIG5vdGlmaWNhdGlvbnNcclxuXHRcdHRoaXMub3ZlcmxheU1lbnVPcGVuU3Vic2NyaXB0aW9uID0gdGhpcy5sYXlvdXRTZXJ2aWNlLm92ZXJsYXlPcGVuJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5sYXlvdXRTZXJ2aWNlLnN0YXRlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmUpIHtcclxuXHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkKHRydWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0aWYgKHRoaXMub3ZlcmxheU1lbnVPcGVuU3Vic2NyaXB0aW9uKSB7XHJcblx0XHRcdHRoaXMub3ZlcmxheU1lbnVPcGVuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMucm91dGVyU3Vic2NyaXB0aW9uKSB7XHJcblx0XHRcdHRoaXMucm91dGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hY3Rpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0fVxyXG5cclxuXHQvLyBJbml0aWFsaXplIHRoZSBtZW51IHdpdGggcHJvcGVyIGFjdGl2ZSBzdGF0ZVxyXG5cdGluaXRpYWxpemVNZW51KCkge1xyXG5cdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlbGVjdGVkTWFpbkl0ZW0obnVsbCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkTWFpbk1lbnVJdGVtID0gbnVsbDtcclxuXHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQoZmFsc2UpO1xyXG5cdFx0dGhpcy51cGRhdGVNZW51SXRlbXMoKTtcclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1lbnVGcm9tUm9vdEtleShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcblx0XHR0aGlzLnVwZGF0ZU1lbnVJdGVtcygpO1xyXG5cdFx0Y29uc3QgbWVudUl0ZW1zID0gdGhpcy5nZXRNZW51SXRlbXMoKTtcclxuXHJcblx0XHRpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG1lbnVJdGVtcy5sZW5ndGgpIHtcclxuXHRcdFx0Y29uc3QgaXRlbSA9IG1lbnVJdGVtc1tpbmRleF07XHJcblx0XHRcdGlmICghaXRlbS5zZXBhcmF0b3IpIHtcclxuXHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2VsZWN0ZWRNYWluSXRlbShpbmRleCk7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZE1haW5NZW51SXRlbSA9IGl0ZW07XHJcblx0XHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZCh0cnVlKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWVudUl0ZW1zKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jYWNoZWRNZW51SXRlbXMgPSBicmlkZ2UuaXNIb3N0TW9kZSgpID8gYnJpZGdlLmhvc3RNZW51SXRlbXMoKSA6IHRoaXMubWVudVNlcnZpY2UubWVudUl0ZW1zKCk7XHJcblx0fVxyXG5cclxuXHRnZXRNZW51SXRlbXMoKTogUGx1Z2luTWVudUl0ZW1bXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWNoZWRNZW51SXRlbXM7XHJcblx0fVxyXG5cclxuXHRzZWxlY3RNYWluSXRlbShpbmRleDogbnVtYmVyLCBpdGVtOiBQbHVnaW5NZW51SXRlbSk6IHZvaWQge1xyXG5cdFx0Ly8gSGFuZGxlIGFjdGlvbiBpdGVtcyBhdCB0b3AgbGV2ZWxcclxuXHRcdGlmIChpdGVtLmFjdGlvbiAmJiAoIWl0ZW0uaXRlbXMgfHwgaXRlbS5pdGVtcy5sZW5ndGggPT09IDApKSB7XHJcblx0XHRcdHRoaXMub25BY3Rpb25JdGVtQ2xpY2soaXRlbSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoaXRlbS5yb3V0ZXJMaW5rICYmICghaXRlbS5pdGVtcyB8fCBpdGVtLml0ZW1zLmxlbmd0aCA9PT0gMCkpIHtcclxuXHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZChmYWxzZSk7XHJcblx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWxlY3RlZE1haW5JdGVtKGluZGV4KTtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZE1haW5NZW51SXRlbSA9IGl0ZW07XHJcblx0XHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtpdGVtLnJvdXRlckxpbmtdKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEhhbmRsZSByZWd1bGFyIG1lbnUgaXRlbXMgd2l0aCBzdWJtZW51XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZE1haW5JdGVtID09PSBpbmRleCkge1xyXG5cdFx0XHR0aGlzLmxheW91dFNlcnZpY2UudG9nZ2xlU2Vjb25kYXJ5U2lkZWJhcigpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlbGVjdGVkTWFpbkl0ZW0oaW5kZXgpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkTWFpbk1lbnVJdGVtID0gaXRlbTtcclxuXHJcblx0XHRcdGlmIChpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZChmYWxzZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBGb3IgbW9iaWxlIGRldmljZXMsIGVuc3VyZSB0aGUgbWVudSBzdGF5cyBvcGVuXHJcblx0XHRpZiAodGhpcy5pc01vYmlsZSgpKSB7XHJcblx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zdGF0ZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHRvZ2dsZVNlY29uZGFyeVNpZGViYXIoKTogdm9pZCB7XHJcblx0XHR0aGlzLmxheW91dFNlcnZpY2UudG9nZ2xlU2Vjb25kYXJ5U2lkZWJhcigpO1xyXG5cdH1cclxuXHJcblx0aXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5sYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCk7XHJcblx0fVxyXG5cclxuXHQvLyBMaXN0ZW4gZm9yIHJlc2l6ZSBldmVudHMgLSBub3cgaGFuZGxlZCBtb3JlIGVmZmljaWVudGx5IGJ5IGxheW91dCBzZXJ2aWNlXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcblx0b25SZXNpemUoKSB7XHJcblx0XHRpZiAoIXRoaXMuaXNNb2JpbGUoKSAmJiB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSkge1xyXG5cdFx0XHR0aGlzLmxheW91dFNlcnZpY2UuY2xvc2VNb2JpbGVNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR1cGRhdGVBY3RpdmVNZW51RnJvbUN1cnJlbnRSb3V0ZSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IG1lbnVJdGVtcyA9IHRoaXMuZ2V0TWVudUl0ZW1zKCk7XHJcblxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtZW51SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgbWVudUl0ZW0gPSBtZW51SXRlbXNbaV07XHJcblx0XHRcdGlmICh0aGlzLmlzQWN0aXZlUm91dGUobWVudUl0ZW0pKSB7XHJcblx0XHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlbGVjdGVkTWFpbkl0ZW0oaSk7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZE1haW5NZW51SXRlbSA9IG1lbnVJdGVtO1xyXG5cclxuXHRcdFx0XHRpZiAobWVudUl0ZW0uaXRlbXMgJiYgbWVudUl0ZW0uaXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLmlzTW9iaWxlKCkgJiYgIXRoaXMuc2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkICYmICF0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkKHRydWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkKGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpc0hhdmVTZWxlY3RlZENoaWxkSXRlbShpdGVtOiBQbHVnaW5NZW51SXRlbSk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFpdGVtIHx8ICFpdGVtLml0ZW1zIHx8IGl0ZW0uaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBpdGVtLml0ZW1zKSB7XHJcblx0XHRcdGlmICh0aGlzLmlzQWN0aXZlUm91dGUoY2hpbGQpKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChjaGlsZC5pdGVtcyAmJiBjaGlsZC5pdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuaXNIYXZlU2VsZWN0ZWRDaGlsZEl0ZW0oY2hpbGQpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRnZXRMb2NhbFRleHQodGV4dDogYW55KTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZUpzb25QaXBlLnRyYW5zZm9ybSh0ZXh0KTtcclxuXHR9XHJcblxyXG5cdGdldEFjdGlvbkl0ZW1LZXkoaXRlbTogUGx1Z2luTWVudUl0ZW0pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0uYWN0aW9uPy51cmwgKyAnfCcgKyBpdGVtLmFjdGlvbj8uc3VjY2Vzc1JvdXRlO1xyXG5cdH1cclxuXHJcblx0aXNBY3Rpb25Mb2FkaW5nKGl0ZW06IFBsdWdpbk1lbnVJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Mb2FkaW5nSXRlbXMuaGFzKHRoaXMuZ2V0QWN0aW9uSXRlbUtleShpdGVtKSk7XHJcblx0fVxyXG5cclxuXHRvbkFjdGlvbkl0ZW1DbGljayhpdGVtOiBQbHVnaW5NZW51SXRlbSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0aWYgKGV2ZW50KSB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghaXRlbS5hY3Rpb24gfHwgdGhpcy5pc0FjdGlvbkxvYWRpbmcoaXRlbSkpIHJldHVybjtcclxuXHJcblx0XHQvLyBDYW5jZWwgYW55IHByZXZpb3VzIGFjdGlvbiByZXF1ZXN0XHJcblx0XHR0aGlzLmFjdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHJcblx0XHRjb25zdCBrZXkgPSB0aGlzLmdldEFjdGlvbkl0ZW1LZXkoaXRlbSk7XHJcblx0XHR0aGlzLmFjdGlvbkxvYWRpbmdJdGVtcy5hZGQoa2V5KTtcclxuXHJcblx0XHRjb25zdCByZXF1ZXN0JCA9XHJcblx0XHRcdGl0ZW0uYWN0aW9uLm1ldGhvZCA9PT0gJ0dFVCdcclxuXHRcdFx0XHQ/IHRoaXMuaHR0cC5nZXQoaXRlbS5hY3Rpb24udXJsKVxyXG5cdFx0XHRcdDogdGhpcy5odHRwLnBvc3QoaXRlbS5hY3Rpb24udXJsLCBpdGVtLmFjdGlvbi5ib2R5ID8/IHt9KTtcclxuXHJcblx0XHR0aGlzLmFjdGlvblN1YnNjcmlwdGlvbiA9IHJlcXVlc3QkLnN1YnNjcmliZSh7XHJcblx0XHRcdG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcblx0XHRcdFx0dGhpcy5hY3Rpb25Mb2FkaW5nSXRlbXMuZGVsZXRlKGtleSk7XHJcblx0XHRcdFx0Y29uc3Qgcm91dGUgPSB0aGlzLmJ1aWxkU3VjY2Vzc1JvdXRlKGl0ZW0uYWN0aW9uISwgcmVzcG9uc2UpO1xyXG5cdFx0XHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRlcnJvcjogKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuYWN0aW9uTG9hZGluZ0l0ZW1zLmRlbGV0ZShrZXkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYnVpbGRTdWNjZXNzUm91dGUoYWN0aW9uOiBQbHVnaW5NZW51SXRlbVsnYWN0aW9uJ10sIHJlc3BvbnNlOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFhY3Rpb24/LnN1Y2Nlc3NSb3V0ZVJlc3BvbnNlS2V5KSByZXR1cm4gYWN0aW9uPy5zdWNjZXNzUm91dGUgPz8gJy8nO1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUJ5UGF0aChyZXNwb25zZSwgYWN0aW9uLnN1Y2Nlc3NSb3V0ZVJlc3BvbnNlS2V5KTtcclxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gYWN0aW9uLnN1Y2Nlc3NSb3V0ZTtcclxuXHJcblx0XHRyZXR1cm4gYCR7YWN0aW9uLnN1Y2Nlc3NSb3V0ZX0vJHt2YWx1ZX1gO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRWYWx1ZUJ5UGF0aChvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcclxuXHRcdGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHRcdHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IHtcclxuXHRcdFx0aWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50ID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHRcdFx0Ly8gSGFuZGxlIGFycmF5IGFjY2VzcyBsaWtlICdyZXN1bHRbMF0nXHJcblx0XHRcdGNvbnN0IGFycmF5TWF0Y2ggPSBrZXkubWF0Y2goL14oLis/KVxcWyhcXGQrKVxcXSQvKTtcclxuXHRcdFx0aWYgKGFycmF5TWF0Y2gpIHtcclxuXHRcdFx0XHRjb25zdCBhcnJheUtleSA9IGFycmF5TWF0Y2hbMV07XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBwYXJzZUludChhcnJheU1hdGNoWzJdLCAxMCk7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRbYXJyYXlLZXldPy5baW5kZXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gY3VycmVudFtrZXldO1xyXG5cdFx0fSwgb2JqKTtcclxuXHR9XHJcblxyXG5cdHRvZ2dsZVNpZGViYXIoKSB7XHJcblx0XHQvLyBFxJ9lciBzZcOnaWxpIGJpciBhbmEgbWVuw7wgw7bEn2VzaSB2YXJzYSB2ZSBhbHQgbWVuw7xsZXJpIHZhcnNhIHRvZ2dsZSB5YXBhYmlsaXJpelxyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRNYWluTWVudUl0ZW0gJiYgdGhpcy5zZWxlY3RlZE1haW5NZW51SXRlbS5pdGVtcyAmJiB0aGlzLnNlbGVjdGVkTWFpbk1lbnVJdGVtLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0dGhpcy5zaWRlYmFyRXhwYW5kZWQgPSAhdGhpcy5zaWRlYmFyRXhwYW5kZWQ7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMuc2lkZWJhckV4cGFuZGVkKSB7XHJcblx0XHRcdHRoaXMuc2lkZWJhckV4cGFuZGVkID0gZmFsc2U7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJuZXctbGF5b3V0LXNpZGViYXJcIiA+XHJcblx0PCEtLSBNYWluIHNpZGViYXIgKGZpcnN0IGxldmVsKSAtLT5cclxuXHQ8ZGl2IGNsYXNzPVwibWFpbi1zaWRlYmFyXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwibWFpbi1zaWRlYmFyLWNvbnRlbnRcIj5cclxuXHRcdFx0PHVsIGNsYXNzPVwibWFpbi1tZW51XCI+XHJcblx0XHRcdFx0QGZvcihpdGVtIG9mIGdldE1lbnVJdGVtcygpOyB0cmFjayBpdGVtOyBsZXQgaSA9ICRpbmRleCl7XHJcblx0XHRcdFx0XHRAaWYoIWl0ZW0uc2VwYXJhdG9yKXtcclxuXHRcdFx0XHRcdFx0PGxpXHJcblx0XHRcdFx0XHRcdFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNBY3RpdmVSb3V0ZShpdGVtKSB8fCBpc0hhdmVTZWxlY3RlZENoaWxkSXRlbShpdGVtKX1cIlxyXG5cdFx0XHRcdFx0XHQoY2xpY2spPVwic2VsZWN0TWFpbkl0ZW0oaSwgaXRlbSlcIlxyXG5cdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiKGl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gaXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKVwiXHJcblx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYWluLW1lbnUtaXRlbVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxpIFtuZ0NsYXNzXT1cIml0ZW0uaWNvblwiIGNsYXNzPVwibWVudS1pY29uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gPHNtYWxsIGNsYXNzPVwibWVudS1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gaXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zbWFsbD4gLS0+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdDwvdWw+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHRcdCBAaWYoc2VsZWN0ZWRNYWluTWVudUl0ZW0gJiYgc2VsZWN0ZWRNYWluTWVudUl0ZW0uaXRlbXMgJiYgc2VsZWN0ZWRNYWluTWVudUl0ZW0uaXRlbXMubGVuZ3RoID4gMCl7XHJcblxyXG5cdFx0XHQgPGRpdiBjbGFzcz1cInNpZGViYXItdG9nZ2xlLWNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdCA8YnV0dG9uIGNsYXNzPVwic2lkZWJhci1jaXJjbGUtdG9nZ2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKClcIj5cclxuXHRcdFx0XHRcdCA8aSBjbGFzcz1cInBpXCIgW25nQ2xhc3NdPVwic2lkZWJhckV4cGFuZGVkID8gJ3BpLWFuZ2xlLWxlZnQnIDogJ3BpLWFuZ2xlLXJpZ2h0J1wiPjwvaT5cclxuXHRcdFx0XHQgPC9idXR0b24+XHJcblx0XHRcdCA8L2Rpdj5cclxuXHRcdCB9XHJcblxyXG5cdDwhLS0gU2Vjb25kYXJ5IHNpZGViYXIgKHNlY29uZCBsZXZlbCkgLS0+XHJcblx0PGRpdiBjbGFzcz1cInNlY29uZGFyeS1zaWRlYmFyXCIgW25nQ2xhc3NdPVwieydleHBhbmRlZCc6IHNpZGViYXJFeHBhbmRlZH1cIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJzZWNvbmRhcnktY29udGVudC13cmFwcGVyXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcblx0XHRcdDwhLS0gU2Vjb25kYXJ5IHNpZGViYXIgY29udGVudCAtLT5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInNlY29uZGFyeS1zaWRlYmFyLWNvbnRlbnRcIj5cclxuXHRcdFx0XHRAaWYoc2VsZWN0ZWRNYWluTWVudUl0ZW0pe1xyXG5cdFx0XHRcdFx0PHVsIGNsYXNzPVwic2Vjb25kYXJ5LW1lbnVcIj5cclxuXHRcdFx0XHRcdFx0QGZvcihzdWJJdGVtIG9mIHNlbGVjdGVkTWFpbk1lbnVJdGVtLml0ZW1zOyB0cmFjayBzdWJJdGVtOyBsZXQgaSA9ICRpbmRleCl7XHJcblx0XHRcdFx0XHRcdFx0XHQ8IS0tIEFjdGlvbiBtZW51IGl0ZW0gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRAaWYoc3ViSXRlbS5hY3Rpb24pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0PGxpIGNsYXNzPVwic2Vjb25kYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWxvYWRpbmcnOiBpc0FjdGlvbkxvYWRpbmcoc3ViSXRlbSl9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJzZWNvbmRhcnktbWVudS1saW5rIGlzLWFjdGlvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoY2xpY2spPVwib25BY3Rpb25JdGVtQ2xpY2soc3ViSXRlbSwgJGV2ZW50KVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKHN1Ykl0ZW0ubGFiZWwsIGFjdGl2ZUxhbmcoKSwgJ3NlY29uZGFyeScpID8gKHN1Ykl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gc3ViSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKSA6ICcnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYoaXNBY3Rpb25Mb2FkaW5nKHN1Ykl0ZW0pKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJzdWJtZW51LWljb24gcGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpIFtuZ0NsYXNzXT1cInN1Ykl0ZW0uaWNvblwiIGNsYXNzPVwic3VibWVudS1pY29uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdWJtZW51LWxhYmVsXCI+e3sgc3ViSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBzdWJJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2xpPlxyXG5cdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQ8IS0tIFJlZ3VsYXIgbWVudSBpdGVtIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGxpIGNsYXNzPVwic2Vjb25kYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNBY3RpdmVSb3V0ZShzdWJJdGVtKX1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGEgW3JvdXRlckxpbmtdPVwic3ViSXRlbS5yb3V0ZXJMaW5rXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJzZWNvbmRhcnktbWVudS1saW5rXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKHN1Ykl0ZW0ubGFiZWwsIGFjdGl2ZUxhbmcoKSwgJ3NlY29uZGFyeScpID8gKHN1Ykl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gc3ViSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKSA6ICcnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpIFtuZ0NsYXNzXT1cInN1Ykl0ZW0uaWNvblwiIGNsYXNzPVwic3VibWVudS1pY29uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3VibWVudS1sYWJlbFwiPnt7IHN1Ykl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gc3ViSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gQWx3YXlzIHJlbmRlciBzdWJtZW51IGlmIGl0IGV4aXN0cyAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0IEBpZihzdWJJdGVtLml0ZW1zICYmIHN1Ykl0ZW0uaXRlbXMubGVuZ3RoID4gMCl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IDx1bCBjbGFzcz1cInRlcnRpYXJ5LW1lbnUgYWx3YXlzLW9wZW5cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBmb3IoY2hpbGRJdGVtIG9mIHN1Ykl0ZW0uaXRlbXM7IHRyYWNrIGNoaWxkSXRlbTsgbGV0IGkgPSAkaW5kZXgpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIEFjdGlvbiBpdGVtIGF0IHRlcnRpYXJ5IGxldmVsIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYoY2hpbGRJdGVtLmFjdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsaSBjbGFzcz1cInRlcnRpYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWxvYWRpbmcnOiBpc0FjdGlvbkxvYWRpbmcoY2hpbGRJdGVtKX1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxhIGNsYXNzPVwidGVydGlhcnktbWVudS1saW5rIGlzLWFjdGlvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJvbkFjdGlvbkl0ZW1DbGljayhjaGlsZEl0ZW0sICRldmVudClcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKGNoaWxkSXRlbS5sYWJlbCwgYWN0aXZlTGFuZygpLCAndGVydGlhcnknKSA/IChjaGlsZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gY2hpbGRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycpIDogJydcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYoaXNBY3Rpb25Mb2FkaW5nKGNoaWxkSXRlbSkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwidGVydGlhcnktbGFiZWxcIj48aSBjbGFzcz1cInBpIHBpLXNwaW4gcGktc3Bpbm5lclwiPjwvaT4ge3sgY2hpbGRJdGVtLmxhYmVsICYmIGFjdGl2ZUxhbmcoKSA/IGNoaWxkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRlcnRpYXJ5LWxhYmVsXCI+e3sgY2hpbGRJdGVtLmxhYmVsICYmIGFjdGl2ZUxhbmcoKSA/IGNoaWxkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsaSBjbGFzcz1cInRlcnRpYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNBY3RpdmVSb3V0ZShjaGlsZEl0ZW0pfVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxhIFtyb3V0ZXJMaW5rXT1cImNoaWxkSXRlbS5yb3V0ZXJMaW5rXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cInRlcnRpYXJ5LW1lbnUtbGlua1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKGNoaWxkSXRlbS5sYWJlbCwgYWN0aXZlTGFuZygpLCAndGVydGlhcnknKSA/IChjaGlsZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gY2hpbGRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycpIDogJydcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwidGVydGlhcnktbGFiZWxcIj57eyBjaGlsZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gY2hpbGRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gQWx3YXlzIHJlbmRlciBkZWVwZXIgbGV2ZWxzIGlmIHRoZXkgZXhpc3QsIGFsc28gdmlzaWJsZSBieSBkZWZhdWx0IC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBpZihjaGlsZEl0ZW0uaXRlbXMgJiYgY2hpbGRJdGVtLml0ZW1zLmxlbmd0aCA+IDApe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHVsIGNsYXNzPVwibmVzdGVkLW1lbnUgYWx3YXlzLW9wZW5cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QGZvcihuZXN0ZWRJdGVtIG9mIGNoaWxkSXRlbS5pdGVtczsgdHJhY2sgbmVzdGVkSXRlbTsgbGV0IGkgPSAkaW5kZXgpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBpZihuZXN0ZWRJdGVtLmFjdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxpIGNsYXNzPVwibmVzdGVkLW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWxvYWRpbmcnOiBpc0FjdGlvbkxvYWRpbmcobmVzdGVkSXRlbSl9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxhIGNsYXNzPVwibmVzdGVkLW1lbnUtbGluayBpcy1hY3Rpb25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJvbkFjdGlvbkl0ZW1DbGljayhuZXN0ZWRJdGVtLCAkZXZlbnQpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKG5lc3RlZEl0ZW0ubGFiZWwsIGFjdGl2ZUxhbmcoKSwgJ25lc3RlZCcpID8gKG5lc3RlZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gbmVzdGVkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKSA6ICcnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBpZihpc0FjdGlvbkxvYWRpbmcobmVzdGVkSXRlbSkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJuZXN0ZWQtbGFiZWxcIj48aSBjbGFzcz1cInBpIHBpLXNwaW4gcGktc3Bpbm5lclwiPjwvaT4ge3sgbmVzdGVkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBuZXN0ZWRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm5lc3RlZC1sYWJlbFwiPnt7IG5lc3RlZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gbmVzdGVkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGkgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cIm5lc3RlZC1tZW51LWl0ZW1cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0W25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc0FjdGl2ZVJvdXRlKG5lc3RlZEl0ZW0pfVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGEgW3JvdXRlckxpbmtdPVwibmVzdGVkSXRlbS5yb3V0ZXJMaW5rXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwibmVzdGVkLW1lbnUtbGlua1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtwVG9vbHRpcF09XCIhaXNNb2JpbGUoKSAmJiBpc1RleHRUcnVuY2F0ZWQobmVzdGVkSXRlbS5sYWJlbCwgYWN0aXZlTGFuZygpLCAnbmVzdGVkJykgPyAobmVzdGVkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBuZXN0ZWRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycpIDogJydcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm5lc3RlZC1sYWJlbFwiPnt7IG5lc3RlZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gbmVzdGVkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbGk+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3VsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCA8L3VsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgfVxyXG5cdFx0XHRcdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0PC91bD5cclxuXHRcdFx0XHR9XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcblx0XHJcbjwvZGl2PlxyXG4iXX0=
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kYWJsZS1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdGhlbWUvbGF5b3V0L2FwcC9leHBhbmRhYmxlTWVudS9leHBhbmRhYmxlLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC90aGVtZS9sYXlvdXQvYXBwL2V4cGFuZGFibGVNZW51L2V4cGFuZGFibGUtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQTZCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUloRCxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFXLGdCQUFnQixFQUFFLFVBQVUsRUFBa0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBV3BELE1BQU0sT0FBTyx1QkFBdUI7SUFVbkMsSUFBSSxlQUFlO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUM7SUFDMUQsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLEtBQWM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FB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Q2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUM7SUFDRixDQUFDOzhHQXRaVyx1QkFBdUI7a0dBQXZCLHVCQUF1QiwwSEFGeEIsQ0FBQyxpQkFBaUIsQ0FBQywwQkN2Qi9CLHVsVUF1SkEsNENEbElXLE9BQU8sbUZBQUUsYUFBYSxzWEFBRSxnQkFBZ0I7OzJGQUl0Qyx1QkFBdUI7a0JBUG5DLFNBQVM7aUNBQ0csSUFBSSxZQUNOLHFCQUFxQixXQUN0QixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsYUFFeEMsQ0FBQyxpQkFBaUIsQ0FBQzs2TkFzTzlCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2lnbmFsLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbG9jb1NlcnZpY2UgfSBmcm9tICdAbmduZWF0L3RyYW5zbG9jbyc7XHJcbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZpbHRlciB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgYnJpZGdlIH0gZnJvbSAnYXJpbC9ib290L2JyaWRnZSc7XHJcbmltcG9ydCB7IE5hdkl0ZW0sIE5hdkxpbmtEaXJlY3RpdmUsIE5hdlNlcnZpY2UsIFBsdWdpbk1lbnVJdGVtIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlSnNvblBpcGUgfSBmcm9tICdhcmlsL3V0aWwvcGlwZXMnO1xyXG5cclxuaW1wb3J0IHsgTGF5b3V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvYXBwLmxheW91dC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0c2VsZWN0b3I6ICdhcHAtZXhwYW5kYWJsZS1tZW51JyxcclxuXHRpbXBvcnRzOiBbTmdDbGFzcywgVG9vbHRpcE1vZHVsZSwgTmF2TGlua0RpcmVjdGl2ZV0sXHJcblx0dGVtcGxhdGVVcmw6ICdleHBhbmRhYmxlLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHByb3ZpZGVyczogW1RyYW5zbGF0ZUpzb25QaXBlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXhwYW5kYWJsZU1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblx0YWN0aXZlTGFuZzogU2lnbmFsPHN0cmluZz47XHJcblx0b3ZlcmxheU1lbnVPcGVuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHRyb3V0ZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cdHVzZXJuYW1lOiBzdHJpbmc7XHJcblxyXG5cdGNhY2hlZE1lbnVJdGVtczogUGx1Z2luTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuXHRzZWxlY3RlZE1haW5NZW51SXRlbTogUGx1Z2luTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblx0Z2V0IHNpZGViYXJFeHBhbmRlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkO1xyXG5cdH1cclxuXHJcblx0c2V0IHNpZGViYXJFeHBhbmRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZCh2YWx1ZSk7XHJcblx0fVxyXG5cclxuXHR0b29sdGlwVGV4dCA9IHtcclxuXHRcdHRvZ2dsZUJ1dHRvbjoge1xyXG5cdFx0XHRleHBhbmRlZDoge1xyXG5cdFx0XHRcdHRyOiAnTWVuw7x5w7wgR2l6bGUnLFxyXG5cdFx0XHRcdGVuOiAnSGlkZSBNZW51J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRjb2xsYXBzZWQ6IHtcclxuXHRcdFx0XHR0cjogJ01lbsO8ecO8IEfDtnN0ZXInLFxyXG5cdFx0XHRcdGVuOiAnU2hvdyBNZW51J1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0bG9ja0J1dHRvbjoge1xyXG5cdFx0XHRsb2NrZWQ6IHtcclxuXHRcdFx0XHR0cjogJ090b21hdGlrIEthcGFubWF5xLEgQcOnJyxcclxuXHRcdFx0XHRlbjogJ0VuYWJsZSBBdXRvLUNsb3NlJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR1bmxvY2tlZDoge1xyXG5cdFx0XHRcdHRyOiAnTWVuw7x5w7wgS2lsaXRsZScsXHJcblx0XHRcdFx0ZW46ICdMb2NrIE1lbnUnXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IE1BWF9MRU5HVEggPSB7XHJcblx0XHRtYWluOiA4LFxyXG5cdFx0c2Vjb25kYXJ5OiAyMCxcclxuXHRcdHRlcnRpYXJ5OiAyMFxyXG5cdH07XHJcblxyXG5cdGFjdGlvbkxvYWRpbmdJdGVtcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cdHByaXZhdGUgYWN0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHJlYWRvbmx5IG5hdlNlcnZpY2UgPSBpbmplY3QoTmF2U2VydmljZSk7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSB0cmFuc2xhdGVKc29uUGlwZTogVHJhbnNsYXRlSnNvblBpcGUsXHJcblx0XHRwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG5cdFx0cHJpdmF0ZSBrZXljbG9hazogS2V5Y2xvYWtTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSB0cmFuc2xvY29TZXJ2aWNlOiBUcmFuc2xvY29TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XHJcblx0KSB7XHJcblx0XHR0aGlzLmFjdGl2ZUxhbmcgPSB0b1NpZ25hbCh0aGlzLnRyYW5zbG9jb1NlcnZpY2UubGFuZ0NoYW5nZXMkLCB7IGluaXRpYWxWYWx1ZTogJ3RyJyB9KTtcclxuXHRcdHRoaXMudXNlcm5hbWUgPSB0aGlzLmtleWNsb2FrLmdldFVzZXJuYW1lKCkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7XHJcblx0fVxyXG5cclxuXHQvLyBHZXR0ZXIgZm9yIGxheW91dCBzZXJ2aWNlIHN0YXRlc1xyXG5cdGdldCBzZWxlY3RlZE1haW5JdGVtKCk6IG51bWJlciB8IG51bGwge1xyXG5cdFx0cmV0dXJuIHRoaXMubGF5b3V0U2VydmljZS5zdGF0ZS5zZWxlY3RlZE1haW5JdGVtO1xyXG5cdH1cclxuXHJcblx0Z2V0IHNlY29uZGFyeVNpZGViYXJFeHBhbmRlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkO1xyXG5cdH1cclxuXHJcblx0Ly8gQ2hlY2sgaWYgdGV4dCBpcyB0cnVuY2F0ZWQgYW5kIG5lZWRzIHRvb2x0aXBcclxuXHRpc1RleHRUcnVuY2F0ZWQoXHJcblx0XHRsYWJlbDogYW55LFxyXG5cdFx0bGFuZzogc3RyaW5nIHwgbnVsbCxcclxuXHRcdG1lbnVUeXBlOiAnbWFpbicgfCAnc2Vjb25kYXJ5JyB8ICd0ZXJ0aWFyeScgfCAnbmVzdGVkJyA9ICdzZWNvbmRhcnknXHJcblx0KTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIWxhYmVsIHx8ICFsYW5nIHx8ICFsYWJlbFtsYW5nXSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IHRleHQgPSBsYWJlbFtsYW5nXTtcclxuXHRcdGNvbnN0IHRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuXHRcdGNvbnN0IG1heExlbmd0aCA9IG1lbnVUeXBlID09PSAnbmVzdGVkJyA/IHRoaXMuTUFYX0xFTkdUSC50ZXJ0aWFyeSA6IHRoaXMuTUFYX0xFTkdUSFttZW51VHlwZV07XHJcblx0XHRyZXR1cm4gdGV4dExlbmd0aCA+IG1heExlbmd0aDtcclxuXHR9XHJcblxyXG5cdC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGEgbWVudSBpdGVtIG9yIGl0cyBjaGlsZHJlbiBtYXRjaCB0aGUgY3VycmVudCByb3V0ZVxyXG5cdGlzQWN0aXZlUm91dGUobWVudUl0ZW06IFBsdWdpbk1lbnVJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIW1lbnVJdGVtIHx8ICFtZW51SXRlbS5yb3V0ZXJMaW5rKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0Ly8gR2V0IGN1cnJlbnQgVVJMIHBhdGggYWZ0ZXIgdGhlIGhhc2hcclxuXHRcdGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcblx0XHRjb25zdCBoYXNoVXJsID0gY3VycmVudFVybC5pbmRleE9mKCcjJykgPiAtMSA/IGN1cnJlbnRVcmwuc3BsaXQoJyMnKVsxXSA6IGN1cnJlbnRVcmw7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoIGZpcnN0XHJcblx0XHRpZiAoaGFzaFVybCA9PT0gbWVudUl0ZW0ucm91dGVyTGluayB8fCBoYXNoVXJsID09PSAnLycgKyBtZW51SXRlbS5yb3V0ZXJMaW5rKSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENoZWNrIGlmIGN1cnJlbnQgVVJMIHN0YXJ0cyB3aXRoIHRoZSByb3V0ZXJMaW5rIChoYW5kbGVzIGNoaWxkIHJvdXRlcylcclxuXHRcdGlmIChcclxuXHRcdFx0bWVudUl0ZW0ucm91dGVyTGluayAhPT0gJy8nICYmXHJcblx0XHRcdChoYXNoVXJsLnN0YXJ0c1dpdGgobWVudUl0ZW0ucm91dGVyTGluayArICcvJykgfHwgaGFzaFVybC5zdGFydHNXaXRoKCcvJyArIG1lbnVJdGVtLnJvdXRlckxpbmsgKyAnLycpKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENoZWNrIGNoaWxkIGl0ZW1zIGlmIHRoZXkgZXhpc3RcclxuXHRcdGlmIChtZW51SXRlbS5pdGVtcyAmJiBtZW51SXRlbS5pdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHJldHVybiBtZW51SXRlbS5pdGVtcy5zb21lKChjaGlsZEl0ZW0pID0+IHRoaXMuaXNBY3RpdmVSb3V0ZShjaGlsZEl0ZW0pKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMudXBkYXRlTWVudUl0ZW1zKCk7XHJcblx0XHR0aGlzLmluaXRpYWxpemVNZW51KCk7XHJcblx0XHR0aGlzLnVwZGF0ZUFjdGl2ZU1lbnVGcm9tQ3VycmVudFJvdXRlKCk7XHJcblxyXG5cdFx0Ly8gU3Vic2NyaWJlIHRvIHJvdXRlIGNoYW5nZXMgdG8gaGFuZGxlIHNlY29uZGFyeSBzaWRlYmFyIGNsb3NpbmdcclxuXHRcdHRoaXMucm91dGVyU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzXHJcblx0XHRcdC5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcblx0XHRcdC5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRcdC8vIFVwZGF0ZSBhY3RpdmUgbWVudSBiYXNlZCBvbiB0aGUgbmV3IHJvdXRlXHJcblx0XHRcdFx0dGhpcy51cGRhdGVBY3RpdmVNZW51RnJvbUN1cnJlbnRSb3V0ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHQvLyBTdWJzY3JpYmUgdG8gb3ZlcmxheSBtZW51IG9wZW4gbm90aWZpY2F0aW9uc1xyXG5cdFx0dGhpcy5vdmVybGF5TWVudU9wZW5TdWJzY3JpcHRpb24gPSB0aGlzLmxheW91dFNlcnZpY2Uub3ZlcmxheU9wZW4kLnN1YnNjcmliZSgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSkge1xyXG5cdFx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHRpZiAodGhpcy5vdmVybGF5TWVudU9wZW5TdWJzY3JpcHRpb24pIHtcclxuXHRcdFx0dGhpcy5vdmVybGF5TWVudU9wZW5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24pIHtcclxuXHRcdFx0dGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFjdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHR9XHJcblxyXG5cdC8vIEluaXRpYWxpemUgdGhlIG1lbnUgd2l0aCBwcm9wZXIgYWN0aXZlIHN0YXRlXHJcblx0aW5pdGlhbGl6ZU1lbnUoKSB7XHJcblx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2VsZWN0ZWRNYWluSXRlbShudWxsKTtcclxuXHRcdHRoaXMuc2VsZWN0ZWRNYWluTWVudUl0ZW0gPSBudWxsO1xyXG5cdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZChmYWxzZSk7XHJcblx0XHR0aGlzLnVwZGF0ZU1lbnVJdGVtcygpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlTWVudUZyb21Sb290S2V5KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuXHRcdHRoaXMudXBkYXRlTWVudUl0ZW1zKCk7XHJcblx0XHRjb25zdCBtZW51SXRlbXMgPSB0aGlzLmdldE1lbnVJdGVtcygpO1xyXG5cclxuXHRcdGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbWVudUl0ZW1zLmxlbmd0aCkge1xyXG5cdFx0XHRjb25zdCBpdGVtID0gbWVudUl0ZW1zW2luZGV4XTtcclxuXHRcdFx0aWYgKCFpdGVtLnNlcGFyYXRvcikge1xyXG5cdFx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWxlY3RlZE1haW5JdGVtKGluZGV4KTtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkTWFpbk1lbnVJdGVtID0gaXRlbTtcclxuXHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkKHRydWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR1cGRhdGVNZW51SXRlbXMoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNhY2hlZE1lbnVJdGVtcyA9IGJyaWRnZS5ob3N0TWVudUl0ZW1zKCk7XHJcblx0fVxyXG5cclxuXHRnZXRNZW51SXRlbXMoKTogUGx1Z2luTWVudUl0ZW1bXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWNoZWRNZW51SXRlbXM7XHJcblx0fVxyXG5cclxuXHRzZWxlY3RNYWluSXRlbShldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgaXRlbTogUGx1Z2luTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdC8vIEhhbmRsZSBhY3Rpb24gaXRlbXMgYXQgdG9wIGxldmVsXHJcblx0XHRpZiAoaXRlbS5hY3Rpb24gJiYgKCFpdGVtLml0ZW1zIHx8IGl0ZW0uaXRlbXMubGVuZ3RoID09PSAwKSkge1xyXG5cdFx0XHR0aGlzLm9uQWN0aW9uSXRlbUNsaWNrKGl0ZW0pO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGl0ZW0ucm91dGVyTGluayAmJiAoIWl0ZW0uaXRlbXMgfHwgaXRlbS5pdGVtcy5sZW5ndGggPT09IDApKSB7XHJcblx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQoZmFsc2UpO1xyXG5cdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2VsZWN0ZWRNYWluSXRlbShpbmRleCk7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRNYWluTWVudUl0ZW0gPSBpdGVtO1xyXG5cdFx0XHR0aGlzLmRpc3BhdGNoTmF2aWdhdGlvbihldmVudCwge1xyXG5cdFx0XHRcdHRhYklkOiAnJyxcclxuXHRcdFx0XHRuYXZMaW5rOiBpdGVtLnJvdXRlckxpbmssXHJcblx0XHRcdFx0bmF2TmFtZTogdGhpcy5nZXRMb2NhbFRleHQoaXRlbS5sYWJlbCksXHJcblx0XHRcdFx0aWNvbjogaXRlbS5pY29uXHJcblx0XHRcdH0pO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSGFuZGxlIHJlZ3VsYXIgbWVudSBpdGVtcyB3aXRoIHN1Ym1lbnVcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkTWFpbkl0ZW0gPT09IGluZGV4KSB7XHJcblx0XHRcdHRoaXMubGF5b3V0U2VydmljZS50b2dnbGVTZWNvbmRhcnlTaWRlYmFyKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2VsZWN0ZWRNYWluSXRlbShpbmRleCk7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRNYWluTWVudUl0ZW0gPSBpdGVtO1xyXG5cclxuXHRcdFx0aWYgKGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnNldFNlY29uZGFyeVNpZGViYXJFeHBhbmRlZCh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2Vjb25kYXJ5U2lkZWJhckV4cGFuZGVkKGZhbHNlKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZvciBtb2JpbGUgZGV2aWNlcywgZW5zdXJlIHRoZSBtZW51IHN0YXlzIG9wZW5cclxuXHRcdGlmICh0aGlzLmlzTW9iaWxlKCkpIHtcclxuXHRcdFx0dGhpcy5sYXlvdXRTZXJ2aWNlLnN0YXRlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmUgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dG9nZ2xlU2Vjb25kYXJ5U2lkZWJhcigpOiB2b2lkIHtcclxuXHRcdHRoaXMubGF5b3V0U2VydmljZS50b2dnbGVTZWNvbmRhcnlTaWRlYmFyKCk7XHJcblx0fVxyXG5cclxuXHRpc01vYmlsZSgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmxheW91dFNlcnZpY2UuaXNNb2JpbGUoKTtcclxuXHR9XHJcblxyXG5cdC8vIExpc3RlbiBmb3IgcmVzaXplIGV2ZW50cyAtIG5vdyBoYW5kbGVkIG1vcmUgZWZmaWNpZW50bHkgYnkgbGF5b3V0IHNlcnZpY2VcclxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuXHRvblJlc2l6ZSgpIHtcclxuXHRcdGlmICghdGhpcy5pc01vYmlsZSgpICYmIHRoaXMubGF5b3V0U2VydmljZS5zdGF0ZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlKSB7XHJcblx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5jbG9zZU1vYmlsZU1lbnUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUFjdGl2ZU1lbnVGcm9tQ3VycmVudFJvdXRlKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgbWVudUl0ZW1zID0gdGhpcy5nZXRNZW51SXRlbXMoKTtcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1lbnVJdGVtcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRjb25zdCBtZW51SXRlbSA9IG1lbnVJdGVtc1tpXTtcclxuXHRcdFx0aWYgKHRoaXMuaXNBY3RpdmVSb3V0ZShtZW51SXRlbSkpIHtcclxuXHRcdFx0XHR0aGlzLmxheW91dFNlcnZpY2Uuc2V0U2VsZWN0ZWRNYWluSXRlbShpKTtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkTWFpbk1lbnVJdGVtID0gbWVudUl0ZW07XHJcblxyXG5cdFx0XHRcdGlmIChtZW51SXRlbS5pdGVtcyAmJiBtZW51SXRlbS5pdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuaXNNb2JpbGUoKSAmJiAhdGhpcy5zZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQgJiYgIXRoaXMubGF5b3V0U2VydmljZS5zdGF0ZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQodHJ1ZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMubGF5b3V0U2VydmljZS5zZXRTZWNvbmRhcnlTaWRlYmFyRXhwYW5kZWQoZmFsc2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGlzSGF2ZVNlbGVjdGVkQ2hpbGRJdGVtKGl0ZW06IFBsdWdpbk1lbnVJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIWl0ZW0gfHwgIWl0ZW0uaXRlbXMgfHwgaXRlbS5pdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW0uaXRlbXMpIHtcclxuXHRcdFx0aWYgKHRoaXMuaXNBY3RpdmVSb3V0ZShjaGlsZCkpIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGNoaWxkLml0ZW1zICYmIGNoaWxkLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRpZiAodGhpcy5pc0hhdmVTZWxlY3RlZENoaWxkSXRlbShjaGlsZCkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGdldExvY2FsVGV4dCh0ZXh0OiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlSnNvblBpcGUudHJhbnNmb3JtKHRleHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFzaCBzdHJhdGVneSBpw6dpbiByb3V0ZXJMaW5rJ2kgYCNgLXByZWZpeCdsaSBocmVmJ2Ugw6dldmlyaXIuIHJvdXRlckxpbmsgY29uZmlnJ3RlXHJcblx0ICogbGVhZGluZyBzbGFzaCBpw6dlcmViaWxpciAow7Zybi4gYW5hc2F5ZmEgacOnaW4gYCcvJ2ApOyBuYWl2ZSBgJyMvJyArIHJvdXRlckxpbmtgXHJcblx0ICogY29uY2F0ZW5hdGlvbiBgIy8vYCDDvHJldGlyZGkg4oCUIHNhxJ8gdMSxayBcImxpbmtpIGtvcHlhbGFcIiBVWCdpbmRlIGJ1IMOnaXJraW4gZ8O2csO8bsO8ci5cclxuXHQgKi9cclxuXHRnZXRIYXNoSHJlZihyb3V0ZXJMaW5rOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuXHRcdGlmICghcm91dGVyTGluaykgcmV0dXJuICcjJztcclxuXHRcdHJldHVybiByb3V0ZXJMaW5rLnN0YXJ0c1dpdGgoJy8nKSA/ICcjJyArIHJvdXRlckxpbmsgOiAnIy8nICsgcm91dGVyTGluaztcclxuXHR9XHJcblxyXG5cdGdldEFjdGlvbkl0ZW1LZXkoaXRlbTogUGx1Z2luTWVudUl0ZW0pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0uYWN0aW9uPy51cmwgKyAnfCcgKyBpdGVtLmFjdGlvbj8uc3VjY2Vzc1JvdXRlO1xyXG5cdH1cclxuXHJcblx0aXNBY3Rpb25Mb2FkaW5nKGl0ZW06IFBsdWdpbk1lbnVJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Mb2FkaW5nSXRlbXMuaGFzKHRoaXMuZ2V0QWN0aW9uSXRlbUtleShpdGVtKSk7XHJcblx0fVxyXG5cclxuXHRvbkFjdGlvbkl0ZW1DbGljayhpdGVtOiBQbHVnaW5NZW51SXRlbSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0aWYgKGV2ZW50KSB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghaXRlbS5hY3Rpb24gfHwgdGhpcy5pc0FjdGlvbkxvYWRpbmcoaXRlbSkpIHJldHVybjtcclxuXHJcblx0XHQvLyBDYW5jZWwgYW55IHByZXZpb3VzIGFjdGlvbiByZXF1ZXN0XHJcblx0XHR0aGlzLmFjdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHJcblx0XHRjb25zdCBrZXkgPSB0aGlzLmdldEFjdGlvbkl0ZW1LZXkoaXRlbSk7XHJcblx0XHR0aGlzLmFjdGlvbkxvYWRpbmdJdGVtcy5hZGQoa2V5KTtcclxuXHJcblx0XHRjb25zdCByZXF1ZXN0JCA9XHJcblx0XHRcdGl0ZW0uYWN0aW9uLm1ldGhvZCA9PT0gJ0dFVCdcclxuXHRcdFx0XHQ/IHRoaXMuaHR0cC5nZXQoaXRlbS5hY3Rpb24udXJsKVxyXG5cdFx0XHRcdDogdGhpcy5odHRwLnBvc3QoaXRlbS5hY3Rpb24udXJsLCBpdGVtLmFjdGlvbi5ib2R5ID8/IHt9KTtcclxuXHJcblx0XHR0aGlzLmFjdGlvblN1YnNjcmlwdGlvbiA9IHJlcXVlc3QkLnN1YnNjcmliZSh7XHJcblx0XHRcdG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcblx0XHRcdFx0dGhpcy5hY3Rpb25Mb2FkaW5nSXRlbXMuZGVsZXRlKGtleSk7XHJcblx0XHRcdFx0Y29uc3Qgcm91dGUgPSB0aGlzLmJ1aWxkU3VjY2Vzc1JvdXRlKGl0ZW0uYWN0aW9uISwgcmVzcG9uc2UpO1xyXG5cdFx0XHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRlcnJvcjogKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuYWN0aW9uTG9hZGluZ0l0ZW1zLmRlbGV0ZShrZXkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYnVpbGRTdWNjZXNzUm91dGUoYWN0aW9uOiBQbHVnaW5NZW51SXRlbVsnYWN0aW9uJ10sIHJlc3BvbnNlOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFhY3Rpb24/LnN1Y2Nlc3NSb3V0ZVJlc3BvbnNlS2V5KSByZXR1cm4gYWN0aW9uPy5zdWNjZXNzUm91dGUgPz8gJy8nO1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUJ5UGF0aChyZXNwb25zZSwgYWN0aW9uLnN1Y2Nlc3NSb3V0ZVJlc3BvbnNlS2V5KTtcclxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gYWN0aW9uLnN1Y2Nlc3NSb3V0ZTtcclxuXHJcblx0XHRyZXR1cm4gYCR7YWN0aW9uLnN1Y2Nlc3NSb3V0ZX0vJHt2YWx1ZX1gO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRWYWx1ZUJ5UGF0aChvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcclxuXHRcdGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHRcdHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IHtcclxuXHRcdFx0aWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50ID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHRcdFx0Ly8gSGFuZGxlIGFycmF5IGFjY2VzcyBsaWtlICdyZXN1bHRbMF0nXHJcblx0XHRcdGNvbnN0IGFycmF5TWF0Y2ggPSBrZXkubWF0Y2goL14oLis/KVxcWyhcXGQrKVxcXSQvKTtcclxuXHRcdFx0aWYgKGFycmF5TWF0Y2gpIHtcclxuXHRcdFx0XHRjb25zdCBhcnJheUtleSA9IGFycmF5TWF0Y2hbMV07XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBwYXJzZUludChhcnJheU1hdGNoWzJdLCAxMCk7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRbYXJyYXlLZXldPy5baW5kZXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gY3VycmVudFtrZXldO1xyXG5cdFx0fSwgb2JqKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENocm9tZS1saWtlIG1lbsO8IGNsaWNrIGRhdnJhbsSxxZ/EsSAoc2Vjb25kYXJ5L3RlcnRpYXJ5L25lc3RlZCBzZXZpeWVsZXJpIGnDp2luKTpcclxuXHQgKiAtIE5vcm1hbCBjbGljayDihpIgYWt0aWYgdGFiJ2RhIG5hdmlnYXRlXHJcblx0ICogLSBDdHJsL0NtZCArIENsaWNrIOKGkiBhcmthIHBsYW5kYSB5ZW5pIHRhYlxyXG5cdCAqIC0gQ3RybC9DbWQgKyBTaGlmdCArIENsaWNrIOKGkiDDtm4gcGxhbmRhIHllbmkgdGFiXHJcblx0ICovXHJcblx0b25NZW51Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IFBsdWdpbk1lbnVJdGVtKTogdm9pZCB7XHJcblx0XHRpZiAoIWl0ZW0ucm91dGVyTGluaykgcmV0dXJuO1xyXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdHRoaXMuZGlzcGF0Y2hOYXZpZ2F0aW9uKGV2ZW50LCB7XHJcblx0XHRcdHRhYklkOiAnJyxcclxuXHRcdFx0bmF2TGluazogaXRlbS5yb3V0ZXJMaW5rLFxyXG5cdFx0XHRuYXZOYW1lOiB0aGlzLmdldExvY2FsVGV4dChpdGVtLmxhYmVsKSxcclxuXHRcdFx0aWNvbjogaXRlbS5pY29uXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBNaWRkbGUgY2xpY2sgKGJ1dHRvbiAxKSDihpIgYXJrYSBwbGFuZGEgeWVuaSB0YWIuICovXHJcblx0b25NZW51QXV4Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IFBsdWdpbk1lbnVJdGVtKTogdm9pZCB7XHJcblx0XHRpZiAoZXZlbnQuYnV0dG9uICE9PSAxIHx8ICFpdGVtLnJvdXRlckxpbmspIHJldHVybjtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHR0aGlzLm5hdlNlcnZpY2Uub3BlbkluQmFja2dyb3VuZFRhYih7XHJcblx0XHRcdHRhYklkOiAnJyxcclxuXHRcdFx0bmF2TGluazogaXRlbS5yb3V0ZXJMaW5rLFxyXG5cdFx0XHRuYXZOYW1lOiB0aGlzLmdldExvY2FsVGV4dChpdGVtLmxhYmVsKSxcclxuXHRcdFx0aWNvbjogaXRlbS5pY29uXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBNaWRkbGUgY2xpY2sgZGVmYXVsdCBzY3JvbGwgZGF2cmFuxLHFn8SxbsSxIGVuZ2VsbGUuICovXHJcblx0b25NZW51TW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAoZXZlbnQuYnV0dG9uID09PSAxKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBkaXNwYXRjaE5hdmlnYXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQsIG5hdkl0ZW06IE5hdkl0ZW0pOiB2b2lkIHtcclxuXHRcdGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcclxuXHRcdFx0aWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0dGhpcy5uYXZTZXJ2aWNlLm9wZW5Jbk5ld1RhYkFuZEZvY3VzKG5hdkl0ZW0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMubmF2U2VydmljZS5vcGVuSW5CYWNrZ3JvdW5kVGFiKG5hdkl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLm5hdlNlcnZpY2UubmF2aWdhdGVJbkN1cnJlbnRUYWIobmF2SXRlbSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR0b2dnbGVTaWRlYmFyKCkge1xyXG5cdFx0Ly8gRcSfZXIgc2XDp2lsaSBiaXIgYW5hIG1lbsO8IMO2xJ9lc2kgdmFyc2EgdmUgYWx0IG1lbsO8bGVyaSB2YXJzYSB0b2dnbGUgeWFwYWJpbGlyaXpcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkTWFpbk1lbnVJdGVtICYmIHRoaXMuc2VsZWN0ZWRNYWluTWVudUl0ZW0uaXRlbXMgJiYgdGhpcy5zZWxlY3RlZE1haW5NZW51SXRlbS5pdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHRoaXMuc2lkZWJhckV4cGFuZGVkID0gIXRoaXMuc2lkZWJhckV4cGFuZGVkO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnNpZGViYXJFeHBhbmRlZCkge1xyXG5cdFx0XHR0aGlzLnNpZGViYXJFeHBhbmRlZCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibmV3LWxheW91dC1zaWRlYmFyXCIgPlxyXG5cdDwhLS0gTWFpbiBzaWRlYmFyIChmaXJzdCBsZXZlbCkgLS0+XHJcblx0PGRpdiBjbGFzcz1cIm1haW4tc2lkZWJhclwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG5cdFx0PGRpdiBjbGFzcz1cIm1haW4tc2lkZWJhci1jb250ZW50XCI+XHJcblx0XHRcdDx1bCBjbGFzcz1cIm1haW4tbWVudVwiPlxyXG5cdFx0XHRcdEBmb3IoaXRlbSBvZiBnZXRNZW51SXRlbXMoKTsgdHJhY2sgaXRlbTsgbGV0IGkgPSAkaW5kZXgpe1xyXG5cdFx0XHRcdFx0QGlmKCFpdGVtLnNlcGFyYXRvcil7XHJcblx0XHRcdFx0XHRcdDxsaVxyXG5cdFx0XHRcdFx0XHRbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGlzQWN0aXZlUm91dGUoaXRlbSkgfHwgaXNIYXZlU2VsZWN0ZWRDaGlsZEl0ZW0oaXRlbSl9XCJcclxuXHRcdFx0XHRcdFx0KGNsaWNrKT1cInNlbGVjdE1haW5JdGVtKCRldmVudCwgaSwgaXRlbSlcIlxyXG5cdFx0XHRcdFx0XHQoYXV4Y2xpY2spPVwib25NZW51QXV4Q2xpY2soJGV2ZW50LCBpdGVtKVwiXHJcblx0XHRcdFx0XHRcdChtb3VzZWRvd24pPVwib25NZW51TW91c2Vkb3duKCRldmVudClcIlxyXG5cdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiKGl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gaXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKVwiXHJcblx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYWluLW1lbnUtaXRlbVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxpIFtuZ0NsYXNzXT1cIml0ZW0uaWNvblwiIGNsYXNzPVwibWVudS1pY29uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gPHNtYWxsIGNsYXNzPVwibWVudS1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gaXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zbWFsbD4gLS0+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdDwvdWw+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHRcdCBAaWYoc2VsZWN0ZWRNYWluTWVudUl0ZW0gJiYgc2VsZWN0ZWRNYWluTWVudUl0ZW0uaXRlbXMgJiYgc2VsZWN0ZWRNYWluTWVudUl0ZW0uaXRlbXMubGVuZ3RoID4gMCl7XHJcblxyXG5cdFx0XHQgPGRpdiBjbGFzcz1cInNpZGViYXItdG9nZ2xlLWNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdCA8YnV0dG9uIGNsYXNzPVwic2lkZWJhci1jaXJjbGUtdG9nZ2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKClcIj5cclxuXHRcdFx0XHRcdCA8aSBjbGFzcz1cInBpXCIgW25nQ2xhc3NdPVwic2lkZWJhckV4cGFuZGVkID8gJ3BpLWFuZ2xlLWxlZnQnIDogJ3BpLWFuZ2xlLXJpZ2h0J1wiPjwvaT5cclxuXHRcdFx0XHQgPC9idXR0b24+XHJcblx0XHRcdCA8L2Rpdj5cclxuXHRcdCB9XHJcblxyXG5cdDwhLS0gU2Vjb25kYXJ5IHNpZGViYXIgKHNlY29uZCBsZXZlbCkgLS0+XHJcblx0PGRpdiBjbGFzcz1cInNlY29uZGFyeS1zaWRlYmFyXCIgW25nQ2xhc3NdPVwieydleHBhbmRlZCc6IHNpZGViYXJFeHBhbmRlZH1cIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJzZWNvbmRhcnktY29udGVudC13cmFwcGVyXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcblx0XHRcdDwhLS0gU2Vjb25kYXJ5IHNpZGViYXIgY29udGVudCAtLT5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInNlY29uZGFyeS1zaWRlYmFyLWNvbnRlbnRcIj5cclxuXHRcdFx0XHRAaWYoc2VsZWN0ZWRNYWluTWVudUl0ZW0pe1xyXG5cdFx0XHRcdFx0PHVsIGNsYXNzPVwic2Vjb25kYXJ5LW1lbnVcIj5cclxuXHRcdFx0XHRcdFx0QGZvcihzdWJJdGVtIG9mIHNlbGVjdGVkTWFpbk1lbnVJdGVtLml0ZW1zOyB0cmFjayBzdWJJdGVtOyBsZXQgaSA9ICRpbmRleCl7XHJcblx0XHRcdFx0XHRcdFx0XHQ8IS0tIEFjdGlvbiBtZW51IGl0ZW0gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRAaWYoc3ViSXRlbS5hY3Rpb24pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0PGxpIGNsYXNzPVwic2Vjb25kYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWxvYWRpbmcnOiBpc0FjdGlvbkxvYWRpbmcoc3ViSXRlbSl9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJzZWNvbmRhcnktbWVudS1saW5rIGlzLWFjdGlvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoY2xpY2spPVwib25BY3Rpb25JdGVtQ2xpY2soc3ViSXRlbSwgJGV2ZW50KVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKHN1Ykl0ZW0ubGFiZWwsIGFjdGl2ZUxhbmcoKSwgJ3NlY29uZGFyeScpID8gKHN1Ykl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gc3ViSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKSA6ICcnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYoaXNBY3Rpb25Mb2FkaW5nKHN1Ykl0ZW0pKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJzdWJtZW51LWljb24gcGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpIFtuZ0NsYXNzXT1cInN1Ykl0ZW0uaWNvblwiIGNsYXNzPVwic3VibWVudS1pY29uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdWJtZW51LWxhYmVsXCI+e3sgc3ViSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBzdWJJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2xpPlxyXG5cdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQ8IS0tIFJlZ3VsYXIgbWVudSBpdGVtIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGxpIGNsYXNzPVwic2Vjb25kYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNBY3RpdmVSb3V0ZShzdWJJdGVtKX1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGEgW2F0dHIuaHJlZl09XCJzdWJJdGVtLnJvdXRlckxpbmsgPyBnZXRIYXNoSHJlZihzdWJJdGVtLnJvdXRlckxpbmspIDogbnVsbFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W2FyaWxOYXZMaW5rXT1cInsgdGFiSWQ6ICcnLCBuYXZMaW5rOiBzdWJJdGVtLnJvdXRlckxpbmsgfHwgJycsIG5hdk5hbWU6IGdldExvY2FsVGV4dChzdWJJdGVtLmxhYmVsKSwgaWNvbjogc3ViSXRlbS5pY29uIH1cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJvbk1lbnVDbGljaygkZXZlbnQsIHN1Ykl0ZW0pXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoYXV4Y2xpY2spPVwib25NZW51QXV4Q2xpY2soJGV2ZW50LCBzdWJJdGVtKVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KG1vdXNlZG93bik9XCJvbk1lbnVNb3VzZWRvd24oJGV2ZW50KVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJzZWNvbmRhcnktbWVudS1saW5rXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKHN1Ykl0ZW0ubGFiZWwsIGFjdGl2ZUxhbmcoKSwgJ3NlY29uZGFyeScpID8gKHN1Ykl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gc3ViSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnKSA6ICcnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpIFtuZ0NsYXNzXT1cInN1Ykl0ZW0uaWNvblwiIGNsYXNzPVwic3VibWVudS1pY29uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3VibWVudS1sYWJlbFwiPnt7IHN1Ykl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gc3ViSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gQWx3YXlzIHJlbmRlciBzdWJtZW51IGlmIGl0IGV4aXN0cyAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0IEBpZihzdWJJdGVtLml0ZW1zICYmIHN1Ykl0ZW0uaXRlbXMubGVuZ3RoID4gMCl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IDx1bCBjbGFzcz1cInRlcnRpYXJ5LW1lbnUgYWx3YXlzLW9wZW5cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBmb3IoY2hpbGRJdGVtIG9mIHN1Ykl0ZW0uaXRlbXM7IHRyYWNrIGNoaWxkSXRlbTsgbGV0IGkgPSAkaW5kZXgpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIEFjdGlvbiBpdGVtIGF0IHRlcnRpYXJ5IGxldmVsIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYoY2hpbGRJdGVtLmFjdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsaSBjbGFzcz1cInRlcnRpYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWxvYWRpbmcnOiBpc0FjdGlvbkxvYWRpbmcoY2hpbGRJdGVtKX1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxhIGNsYXNzPVwidGVydGlhcnktbWVudS1saW5rIGlzLWFjdGlvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJvbkFjdGlvbkl0ZW1DbGljayhjaGlsZEl0ZW0sICRldmVudClcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbcFRvb2x0aXBdPVwiIWlzTW9iaWxlKCkgJiYgaXNUZXh0VHJ1bmNhdGVkKGNoaWxkSXRlbS5sYWJlbCwgYWN0aXZlTGFuZygpLCAndGVydGlhcnknKSA/IChjaGlsZEl0ZW0ubGFiZWwgJiYgYWN0aXZlTGFuZygpID8gY2hpbGRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycpIDogJydcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYoaXNBY3Rpb25Mb2FkaW5nKGNoaWxkSXRlbSkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwidGVydGlhcnktbGFiZWxcIj48aSBjbGFzcz1cInBpIHBpLXNwaW4gcGktc3Bpbm5lclwiPjwvaT4ge3sgY2hpbGRJdGVtLmxhYmVsICYmIGFjdGl2ZUxhbmcoKSA/IGNoaWxkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRlcnRpYXJ5LWxhYmVsXCI+e3sgY2hpbGRJdGVtLmxhYmVsICYmIGFjdGl2ZUxhbmcoKSA/IGNoaWxkSXRlbS5sYWJlbFthY3RpdmVMYW5nKCkhXSB8fCAnJyA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsaSBjbGFzcz1cInRlcnRpYXJ5LW1lbnUtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNBY3RpdmVSb3V0ZShjaGlsZEl0ZW0pfVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxhIFthdHRyLmhyZWZdPVwiY2hpbGRJdGVtLnJvdXRlckxpbmsgPyBnZXRIYXNoSHJlZihjaGlsZEl0ZW0ucm91dGVyTGluaykgOiBudWxsXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFthcmlsTmF2TGlua109XCJ7IHRhYklkOiAnJywgbmF2TGluazogY2hpbGRJdGVtLnJvdXRlckxpbmsgfHwgJycsIG5hdk5hbWU6IGdldExvY2FsVGV4dChjaGlsZEl0ZW0ubGFiZWwpLCBpY29uOiBjaGlsZEl0ZW0uaWNvbiB9XCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJvbk1lbnVDbGljaygkZXZlbnQsIGNoaWxkSXRlbSlcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGF1eGNsaWNrKT1cIm9uTWVudUF1eENsaWNrKCRldmVudCwgY2hpbGRJdGVtKVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQobW91c2Vkb3duKT1cIm9uTWVudU1vdXNlZG93bigkZXZlbnQpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwidGVydGlhcnktbWVudS1saW5rXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtwVG9vbHRpcF09XCIhaXNNb2JpbGUoKSAmJiBpc1RleHRUcnVuY2F0ZWQoY2hpbGRJdGVtLmxhYmVsLCBhY3RpdmVMYW5nKCksICd0ZXJ0aWFyeScpID8gKGNoaWxkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBjaGlsZEl0ZW0ubGFiZWxbYWN0aXZlTGFuZygpIV0gfHwgJycgOiAnJykgOiAnJ1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0b29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXJ0aWFyeS1sYWJlbFwiPnt7IGNoaWxkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBjaGlsZEl0ZW0ubGFiZWxbYWN0aXZlTGFuZygpIV0gfHwgJycgOiAnJyB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBBbHdheXMgcmVuZGVyIGRlZXBlciBsZXZlbHMgaWYgdGhleSBleGlzdCwgYWxzbyB2aXNpYmxlIGJ5IGRlZmF1bHQgLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QGlmKGNoaWxkSXRlbS5pdGVtcyAmJiBjaGlsZEl0ZW0uaXRlbXMubGVuZ3RoID4gMCl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8dWwgY2xhc3M9XCJuZXN0ZWQtbWVudSBhbHdheXMtb3BlblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAZm9yKG5lc3RlZEl0ZW0gb2YgY2hpbGRJdGVtLml0ZW1zOyB0cmFjayBuZXN0ZWRJdGVtOyBsZXQgaSA9ICRpbmRleCl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QGlmKG5lc3RlZEl0ZW0uYWN0aW9uKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGkgY2xhc3M9XCJuZXN0ZWQtbWVudS1pdGVtXCIgW25nQ2xhc3NdPVwieydhY3Rpb24tbG9hZGluZyc6IGlzQWN0aW9uTG9hZGluZyhuZXN0ZWRJdGVtKX1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJuZXN0ZWQtbWVudS1saW5rIGlzLWFjdGlvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGNsaWNrKT1cIm9uQWN0aW9uSXRlbUNsaWNrKG5lc3RlZEl0ZW0sICRldmVudClcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtwVG9vbHRpcF09XCIhaXNNb2JpbGUoKSAmJiBpc1RleHRUcnVuY2F0ZWQobmVzdGVkSXRlbS5sYWJlbCwgYWN0aXZlTGFuZygpLCAnbmVzdGVkJykgPyAobmVzdGVkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBuZXN0ZWRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycpIDogJydcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QGlmKGlzQWN0aW9uTG9hZGluZyhuZXN0ZWRJdGVtKSl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm5lc3RlZC1sYWJlbFwiPjxpIGNsYXNzPVwicGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9pPiB7eyBuZXN0ZWRJdGVtLmxhYmVsICYmIGFjdGl2ZUxhbmcoKSA/IG5lc3RlZEl0ZW0ubGFiZWxbYWN0aXZlTGFuZygpIV0gfHwgJycgOiAnJyB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibmVzdGVkLWxhYmVsXCI+e3sgbmVzdGVkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBuZXN0ZWRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2xpPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gQGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsaVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJuZXN0ZWQtbWVudS1pdGVtXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNBY3RpdmVSb3V0ZShuZXN0ZWRJdGVtKX1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxhIFthdHRyLmhyZWZdPVwibmVzdGVkSXRlbS5yb3V0ZXJMaW5rID8gZ2V0SGFzaEhyZWYobmVzdGVkSXRlbS5yb3V0ZXJMaW5rKSA6IG51bGxcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbYXJpbE5hdkxpbmtdPVwieyB0YWJJZDogJycsIG5hdkxpbms6IG5lc3RlZEl0ZW0ucm91dGVyTGluayB8fCAnJywgbmF2TmFtZTogZ2V0TG9jYWxUZXh0KG5lc3RlZEl0ZW0ubGFiZWwpLCBpY29uOiBuZXN0ZWRJdGVtLmljb24gfVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJvbk1lbnVDbGljaygkZXZlbnQsIG5lc3RlZEl0ZW0pXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGF1eGNsaWNrKT1cIm9uTWVudUF1eENsaWNrKCRldmVudCwgbmVzdGVkSXRlbSlcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQobW91c2Vkb3duKT1cIm9uTWVudU1vdXNlZG93bigkZXZlbnQpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJuZXN0ZWQtbWVudS1saW5rXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0W3BUb29sdGlwXT1cIiFpc01vYmlsZSgpICYmIGlzVGV4dFRydW5jYXRlZChuZXN0ZWRJdGVtLmxhYmVsLCBhY3RpdmVMYW5nKCksICduZXN0ZWQnKSA/IChuZXN0ZWRJdGVtLmxhYmVsICYmIGFjdGl2ZUxhbmcoKSA/IG5lc3RlZEl0ZW0ubGFiZWxbYWN0aXZlTGFuZygpIV0gfHwgJycgOiAnJykgOiAnJ1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibmVzdGVkLWxhYmVsXCI+e3sgbmVzdGVkSXRlbS5sYWJlbCAmJiBhY3RpdmVMYW5nKCkgPyBuZXN0ZWRJdGVtLmxhYmVsW2FjdGl2ZUxhbmcoKSFdIHx8ICcnIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9saT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvdWw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2xpPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IDwvdWw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdCB9XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2xpPlxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQ8L3VsPlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHRcclxuPC9kaXY+XHJcbiJdfQ==